blob: dd99c0d921aa5dedf545fe8109cb70b46f41a8cc [file] [log] [blame]
Gilles Peskine0cad07c2018-06-27 19:49:02 +02001/**
2 * \file psa/crypto_sizes.h
3 *
4 * \brief PSA cryptography module: Mbed TLS buffer size macros
5 *
Gilles Peskine07c91f52018-06-28 18:02:53 +02006 * \note This file may not be included directly. Applications must
7 * include psa/crypto.h.
8 *
Gilles Peskine0cad07c2018-06-27 19:49:02 +02009 * This file contains the definitions of macros that are useful to
10 * compute buffer sizes. The signatures and semantics of these macros
11 * are standardized, but the definitions are not, because they depend on
12 * the available algorithms and, in some cases, on permitted tolerances
13 * on buffer sizes.
Gilles Peskine49cee6c2018-06-27 21:03:58 +020014 *
Gilles Peskine07c91f52018-06-28 18:02:53 +020015 * In implementations with isolation between the application and the
16 * cryptography module, implementers should take care to ensure that
17 * the definitions that are exposed to applications match what the
18 * module implements.
19 *
Gilles Peskine49cee6c2018-06-27 21:03:58 +020020 * Macros that compute sizes whose values do not depend on the
21 * implementation are in crypto.h.
Gilles Peskine0cad07c2018-06-27 19:49:02 +020022 */
23/*
Bence Szépkúti1e148272020-08-07 13:07:28 +020024 * Copyright The Mbed TLS Contributors
Gilles Peskine0cad07c2018-06-27 19:49:02 +020025 * SPDX-License-Identifier: Apache-2.0
26 *
27 * Licensed under the Apache License, Version 2.0 (the "License"); you may
28 * not use this file except in compliance with the License.
29 * You may obtain a copy of the License at
30 *
31 * http://www.apache.org/licenses/LICENSE-2.0
32 *
33 * Unless required by applicable law or agreed to in writing, software
34 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
35 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
36 * See the License for the specific language governing permissions and
37 * limitations under the License.
Gilles Peskine0cad07c2018-06-27 19:49:02 +020038 */
39
40#ifndef PSA_CRYPTO_SIZES_H
41#define PSA_CRYPTO_SIZES_H
42
Ronald Cronf6236f02023-01-26 16:22:25 +010043/*
44 * Include the build-time configuration information file. Here, we do not
45 * include `"mbedtls/build_info.h"` directly but `"psa/build_info.h"`, which
46 * is basically just an alias to it. This is to ease the maintenance of the
47 * PSA cryptography repository which has a different build system and
48 * configuration.
49 */
50#include "psa/build_info.h"
Gilles Peskine0cad07c2018-06-27 19:49:02 +020051
Gilles Peskinea7c26db2018-12-12 13:42:25 +010052#define PSA_BITS_TO_BYTES(bits) (((bits) + 7) / 8)
53#define PSA_BYTES_TO_BITS(bytes) ((bytes) * 8)
Przemek Stekiel654bef02022-12-15 13:28:02 +010054#define PSA_MAX_OF_THREE(a, b, c) ((a) <= (b) ? (b) <= (c) ? \
55 (c) : (b) : (a) <= (c) ? (c) : (a))
Gilles Peskinea7c26db2018-12-12 13:42:25 +010056
Gilles Peskine248010c2019-05-14 16:08:59 +020057#define PSA_ROUND_UP_TO_MULTIPLE(block_size, length) \
58 (((length) + (block_size) - 1) / (block_size) * (block_size))
59
Gilles Peskinea7c26db2018-12-12 13:42:25 +010060/** The size of the output of psa_hash_finish(), in bytes.
61 *
62 * This is also the hash size that psa_hash_verify() expects.
63 *
64 * \param alg A hash algorithm (\c PSA_ALG_XXX value such that
65 * #PSA_ALG_IS_HASH(\p alg) is true), or an HMAC algorithm
66 * (#PSA_ALG_HMAC(\c hash_alg) where \c hash_alg is a
67 * hash algorithm).
68 *
69 * \return The hash size for the specified hash algorithm.
70 * If the hash algorithm is not recognized, return 0.
Gilles Peskinea7c26db2018-12-12 13:42:25 +010071 */
gabor-mezei-armcbcec212020-12-18 14:23:51 +010072#define PSA_HASH_LENGTH(alg) \
73 ( \
Gilles Peskinea7c26db2018-12-12 13:42:25 +010074 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD5 ? 16 : \
75 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_RIPEMD160 ? 20 : \
76 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_1 ? 20 : \
77 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_224 ? 28 : \
78 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_256 ? 32 : \
79 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_384 ? 48 : \
80 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512 ? 64 : \
81 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_224 ? 28 : \
82 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_256 ? 32 : \
83 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_224 ? 28 : \
84 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_256 ? 32 : \
85 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_384 ? 48 : \
86 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_512 ? 64 : \
87 0)
88
Mateusz Starzyk7d262dd2021-08-26 13:28:46 +020089/** The input block size of a hash algorithm, in bytes.
90 *
91 * Hash algorithms process their input data in blocks. Hash operations will
92 * retain any partial blocks until they have enough input to fill the block or
93 * until the operation is finished.
94 * This affects the output from psa_hash_suspend().
95 *
96 * \param alg A hash algorithm (\c PSA_ALG_XXX value such that
97 * PSA_ALG_IS_HASH(\p alg) is true).
98 *
99 * \return The block size in bytes for the specified hash algorithm.
100 * If the hash algorithm is not recognized, return 0.
101 * An implementation can return either 0 or the correct size for a
102 * hash algorithm that it recognizes, but does not support.
103 */
104#define PSA_HASH_BLOCK_LENGTH(alg) \
105 ( \
106 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD5 ? 64 : \
107 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_RIPEMD160 ? 64 : \
108 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_1 ? 64 : \
109 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_224 ? 64 : \
110 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_256 ? 64 : \
111 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_384 ? 128 : \
112 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512 ? 128 : \
113 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_224 ? 128 : \
114 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_256 ? 128 : \
115 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_224 ? 144 : \
116 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_256 ? 136 : \
117 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_384 ? 104 : \
118 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_512 ? 72 : \
119 0)
120
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200121/** \def PSA_HASH_MAX_SIZE
122 *
123 * Maximum size of a hash.
124 *
gabor-mezei-armc6f24802021-02-15 15:56:29 +0100125 * This macro expands to a compile-time constant integer. This value
126 * is the maximum size of a hash in bytes.
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200127 */
Dave Rodgman5734bb92023-06-26 18:23:08 +0100128/* Note: for HMAC-SHA-3, the block size is 144 bytes for HMAC-SHA3-224,
Gilles Peskine3052f532018-09-17 14:13:26 +0200129 * 136 bytes for HMAC-SHA3-256, 104 bytes for SHA3-384, 72 bytes for
130 * HMAC-SHA3-512. */
Manuel Pégourié-Gonnardc9d98292023-05-24 12:28:38 +0200131/* Note: PSA_HASH_MAX_SIZE should be kept in sync with MBEDTLS_MD_MAX_SIZE,
132 * see the note on MBEDTLS_MD_MAX_SIZE for details. */
Dave Rodgman5734bb92023-06-26 18:23:08 +0100133#if defined(PSA_WANT_ALG_SHA3_224)
134#define PSA_HMAC_MAX_HASH_BLOCK_SIZE 144
135#elif defined(PSA_WANT_ALG_SHA3_256)
136#define PSA_HMAC_MAX_HASH_BLOCK_SIZE 136
137#elif defined(PSA_WANT_ALG_SHA_512)
Gilles Peskine0cad07c2018-06-27 19:49:02 +0200138#define PSA_HMAC_MAX_HASH_BLOCK_SIZE 128
Manuel Pégourié-Gonnard45b34512023-03-30 12:19:35 +0200139#elif defined(PSA_WANT_ALG_SHA_384)
Manuel Pégourié-Gonnard45b34512023-03-30 12:19:35 +0200140#define PSA_HMAC_MAX_HASH_BLOCK_SIZE 128
Dave Rodgman5734bb92023-06-26 18:23:08 +0100141#elif defined(PSA_WANT_ALG_SHA3_384)
142#define PSA_HMAC_MAX_HASH_BLOCK_SIZE 104
143#elif defined(PSA_WANT_ALG_SHA3_512)
144#define PSA_HMAC_MAX_HASH_BLOCK_SIZE 72
Manuel Pégourié-Gonnard45b34512023-03-30 12:19:35 +0200145#elif defined(PSA_WANT_ALG_SHA_256)
Gilles Peskine0cad07c2018-06-27 19:49:02 +0200146#define PSA_HMAC_MAX_HASH_BLOCK_SIZE 64
Manuel Pégourié-Gonnard45b34512023-03-30 12:19:35 +0200147#elif defined(PSA_WANT_ALG_SHA_224)
Manuel Pégourié-Gonnard45b34512023-03-30 12:19:35 +0200148#define PSA_HMAC_MAX_HASH_BLOCK_SIZE 64
149#else /* SHA-1 or smaller */
Manuel Pégourié-Gonnard45b34512023-03-30 12:19:35 +0200150#define PSA_HMAC_MAX_HASH_BLOCK_SIZE 64
Gilles Peskine0cad07c2018-06-27 19:49:02 +0200151#endif
152
Dave Rodgman5734bb92023-06-26 18:23:08 +0100153#if defined(PSA_WANT_ALG_SHA_512) || defined(PSA_WANT_ALG_SHA3_512)
154#define PSA_HASH_MAX_SIZE 64
155#elif defined(PSA_WANT_ALG_SHA_384) || defined(PSA_WANT_ALG_SHA3_384)
156#define PSA_HASH_MAX_SIZE 48
157#elif defined(PSA_WANT_ALG_SHA_256) || defined(PSA_WANT_ALG_SHA3_256)
158#define PSA_HASH_MAX_SIZE 32
159#elif defined(PSA_WANT_ALG_SHA_224) || defined(PSA_WANT_ALG_SHA3_224)
160#define PSA_HASH_MAX_SIZE 28
161#else /* SHA-1 or smaller */
162#define PSA_HASH_MAX_SIZE 20
163#endif
164
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200165/** \def PSA_MAC_MAX_SIZE
166 *
167 * Maximum size of a MAC.
168 *
gabor-mezei-armc6f24802021-02-15 15:56:29 +0100169 * This macro expands to a compile-time constant integer. This value
170 * is the maximum size of a MAC in bytes.
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200171 */
172/* All non-HMAC MACs have a maximum size that's smaller than the
173 * minimum possible value of PSA_HASH_MAX_SIZE in this implementation. */
Gilles Peskinee1f2d7d2018-08-21 14:54:54 +0200174/* Note that the encoding of truncated MAC algorithms limits this value
175 * to 64 bytes.
176 */
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200177#define PSA_MAC_MAX_SIZE PSA_HASH_MAX_SIZE
178
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100179/** The length of a tag for an AEAD algorithm, in bytes.
Gilles Peskinea7c26db2018-12-12 13:42:25 +0100180 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100181 * This macro can be used to allocate a buffer of sufficient size to store the
182 * tag output from psa_aead_finish().
183 *
184 * See also #PSA_AEAD_TAG_MAX_SIZE.
185 *
186 * \param key_type The type of the AEAD key.
187 * \param key_bits The size of the AEAD key in bits.
Gilles Peskinea7c26db2018-12-12 13:42:25 +0100188 * \param alg An AEAD algorithm
189 * (\c PSA_ALG_XXX value such that
190 * #PSA_ALG_IS_AEAD(\p alg) is true).
191 *
Bence Szépkútibd98df72021-04-27 04:37:18 +0200192 * \return The tag length for the specified algorithm and key.
Gilles Peskinea7c26db2018-12-12 13:42:25 +0100193 * If the AEAD algorithm does not have an identified
194 * tag that can be distinguished from the rest of
195 * the ciphertext, return 0.
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100196 * If the key type or AEAD algorithm is not
197 * recognized, or the parameters are incompatible,
198 * return 0.
Gilles Peskinea7c26db2018-12-12 13:42:25 +0100199 */
Bence Szépkúti12116bc2021-03-11 15:59:24 +0100200#define PSA_AEAD_TAG_LENGTH(key_type, key_bits, alg) \
Bence Szépkútif5a1fe92021-04-21 10:13:08 +0200201 (PSA_AEAD_NONCE_LENGTH(key_type, alg) != 0 ? \
Bence Szépkúti7e310092021-04-08 12:05:18 +0200202 PSA_ALG_AEAD_GET_TAG_LENGTH(alg) : \
Bence Szépkúti0d8da392021-03-19 19:28:52 +0100203 ((void) (key_bits), 0))
Gilles Peskinea7c26db2018-12-12 13:42:25 +0100204
gabor-mezei-arm0687b2b2020-05-06 16:05:37 +0200205/** The maximum tag size for all supported AEAD algorithms, in bytes.
206 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100207 * See also #PSA_AEAD_TAG_LENGTH(\p key_type, \p key_bits, \p alg).
gabor-mezei-arm0687b2b2020-05-06 16:05:37 +0200208 */
gabor-mezei-arme86bdca2021-01-07 14:26:12 +0100209#define PSA_AEAD_TAG_MAX_SIZE 16
gabor-mezei-arm0687b2b2020-05-06 16:05:37 +0200210
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200211/* The maximum size of an RSA key on this implementation, in bits.
212 * This is a vendor-specific macro.
213 *
214 * Mbed TLS does not set a hard limit on the size of RSA keys: any key
215 * whose parameters fit in a bignum is accepted. However large keys can
216 * induce a large memory usage and long computation times. Unlike other
217 * auxiliary macros in this file and in crypto.h, which reflect how the
218 * library is configured, this macro defines how the library is
219 * configured. This implementation refuses to import or generate an
220 * RSA key whose size is larger than the value defined here.
221 *
222 * Note that an implementation may set different size limits for different
223 * operations, and does not need to accept all key sizes up to the limit. */
224#define PSA_VENDOR_RSA_MAX_KEY_BITS 4096
225
Przemek Stekiel6d85afa2023-04-28 11:42:17 +0200226/* The maximum size of an DH key on this implementation, in bits.
Przemek Stekieled23b612022-12-01 15:00:41 +0100227 *
228 * Note that an implementation may set different size limits for different
229 * operations, and does not need to accept all key sizes up to the limit. */
230#define PSA_VENDOR_FFDH_MAX_KEY_BITS 8192
231
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200232/* The maximum size of an ECC key on this implementation, in bits.
233 * This is a vendor-specific macro. */
Valerio Setti271c12e2023-03-23 16:30:27 +0100234#if defined(PSA_WANT_ECC_SECP_R1_521)
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200235#define PSA_VENDOR_ECC_MAX_CURVE_BITS 521
Valerio Setti271c12e2023-03-23 16:30:27 +0100236#elif defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512)
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200237#define PSA_VENDOR_ECC_MAX_CURVE_BITS 512
Valerio Setti271c12e2023-03-23 16:30:27 +0100238#elif defined(PSA_WANT_ECC_MONTGOMERY_448)
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200239#define PSA_VENDOR_ECC_MAX_CURVE_BITS 448
Valerio Setti271c12e2023-03-23 16:30:27 +0100240#elif defined(PSA_WANT_ECC_SECP_R1_384)
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200241#define PSA_VENDOR_ECC_MAX_CURVE_BITS 384
Valerio Setti271c12e2023-03-23 16:30:27 +0100242#elif defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384)
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200243#define PSA_VENDOR_ECC_MAX_CURVE_BITS 384
Valerio Setti271c12e2023-03-23 16:30:27 +0100244#elif defined(PSA_WANT_ECC_SECP_R1_256)
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200245#define PSA_VENDOR_ECC_MAX_CURVE_BITS 256
Valerio Setti271c12e2023-03-23 16:30:27 +0100246#elif defined(PSA_WANT_ECC_SECP_K1_256)
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200247#define PSA_VENDOR_ECC_MAX_CURVE_BITS 256
Valerio Setti271c12e2023-03-23 16:30:27 +0100248#elif defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256)
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200249#define PSA_VENDOR_ECC_MAX_CURVE_BITS 256
Valerio Setti271c12e2023-03-23 16:30:27 +0100250#elif defined(PSA_WANT_ECC_MONTGOMERY_255)
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200251#define PSA_VENDOR_ECC_MAX_CURVE_BITS 255
Valerio Setti271c12e2023-03-23 16:30:27 +0100252#elif defined(PSA_WANT_ECC_SECP_R1_224)
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200253#define PSA_VENDOR_ECC_MAX_CURVE_BITS 224
Valerio Setti271c12e2023-03-23 16:30:27 +0100254#elif defined(PSA_WANT_ECC_SECP_K1_224)
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200255#define PSA_VENDOR_ECC_MAX_CURVE_BITS 224
Valerio Setti271c12e2023-03-23 16:30:27 +0100256#elif defined(PSA_WANT_ECC_SECP_R1_192)
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200257#define PSA_VENDOR_ECC_MAX_CURVE_BITS 192
Valerio Setti271c12e2023-03-23 16:30:27 +0100258#elif defined(PSA_WANT_ECC_SECP_K1_192)
Gilles Peskineaf3baab2018-06-27 22:55:52 +0200259#define PSA_VENDOR_ECC_MAX_CURVE_BITS 192
260#else
261#define PSA_VENDOR_ECC_MAX_CURVE_BITS 0
262#endif
263
gabor-mezei-armbdae9182021-01-28 14:33:10 +0100264/** This macro returns the maximum supported length of the PSK for the
265 * TLS-1.2 PSK-to-MS key derivation
Gilles Peskine364d12c2021-03-08 17:23:47 +0100266 * (#PSA_ALG_TLS12_PSK_TO_MS(\c hash_alg)).
gabor-mezei-armbdae9182021-01-28 14:33:10 +0100267 *
268 * The maximum supported length does not depend on the chosen hash algorithm.
Hanno Becker8dbfca42018-10-12 11:56:55 +0100269 *
270 * Quoting RFC 4279, Sect 5.3:
271 * TLS implementations supporting these ciphersuites MUST support
272 * arbitrary PSK identities up to 128 octets in length, and arbitrary
273 * PSKs up to 64 octets in length. Supporting longer identities and
274 * keys is RECOMMENDED.
275 *
276 * Therefore, no implementation should define a value smaller than 64
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100277 * for #PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE.
Hanno Becker8dbfca42018-10-12 11:56:55 +0100278 */
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100279#define PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE 128
Hanno Becker8dbfca42018-10-12 11:56:55 +0100280
Andrzej Kurek08d34b82022-07-29 10:00:16 -0400281/* The expected size of input passed to psa_tls12_ecjpake_to_pms_input,
282 * which is expected to work with P-256 curve only. */
283#define PSA_TLS12_ECJPAKE_TO_PMS_INPUT_SIZE 65
284
285/* The size of a serialized K.X coordinate to be used in
286 * psa_tls12_ecjpake_to_pms_input. This function only accepts the P-256
287 * curve. */
288#define PSA_TLS12_ECJPAKE_TO_PMS_DATA_SIZE 32
289
Kusumit Ghoderaoe66a8ad2023-05-24 12:30:43 +0530290/* The maximum number of iterations for PBKDF2 on this implementation, in bits.
291 * This is a vendor-specific macro. This can be configured if necessary */
292#define PSA_VENDOR_PBKDF2_MAX_ITERATIONS 0xffffffff
293
gabor-mezei-armc6f24802021-02-15 15:56:29 +0100294/** The maximum size of a block cipher. */
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100295#define PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE 16
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200296
Gilles Peskineacd4be32018-07-08 19:56:25 +0200297/** The size of the output of psa_mac_sign_finish(), in bytes.
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200298 *
Gilles Peskineacd4be32018-07-08 19:56:25 +0200299 * This is also the MAC size that psa_mac_verify_finish() expects.
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200300 *
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100301 * \warning This macro may evaluate its arguments multiple times or
302 * zero times, so you should not pass arguments that contain
303 * side effects.
304 *
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200305 * \param key_type The type of the MAC key.
306 * \param key_bits The size of the MAC key in bits.
307 * \param alg A MAC algorithm (\c PSA_ALG_XXX value such that
Gilles Peskine63f79302019-02-15 13:01:17 +0100308 * #PSA_ALG_IS_MAC(\p alg) is true).
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200309 *
310 * \return The MAC size for the specified algorithm with
311 * the specified key parameters.
312 * \return 0 if the MAC algorithm is not recognized.
313 * \return Either 0 or the correct size for a MAC algorithm that
314 * the implementation recognizes, but does not support.
315 * \return Unspecified if the key parameters are not consistent
316 * with the algorithm.
317 */
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100318#define PSA_MAC_LENGTH(key_type, key_bits, alg) \
319 ((alg) & PSA_ALG_MAC_TRUNCATION_MASK ? PSA_MAC_TRUNCATED_LENGTH(alg) : \
320 PSA_ALG_IS_HMAC(alg) ? PSA_HASH_LENGTH(PSA_ALG_HMAC_GET_HASH(alg)) : \
321 PSA_ALG_IS_BLOCK_CIPHER_MAC(alg) ? PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) : \
Gilles Peskine449bd832023-01-11 14:50:10 +0100322 ((void) (key_type), (void) (key_bits), 0))
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200323
324/** The maximum size of the output of psa_aead_encrypt(), in bytes.
325 *
326 * If the size of the ciphertext buffer is at least this large, it is
327 * guaranteed that psa_aead_encrypt() will not fail due to an
328 * insufficient buffer size. Depending on the algorithm, the actual size of
329 * the ciphertext may be smaller.
330 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100331 * See also #PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE(\p plaintext_length).
332 *
gabor-mezei-arme86bdca2021-01-07 14:26:12 +0100333 * \warning This macro may evaluate its arguments multiple times or
334 * zero times, so you should not pass arguments that contain
335 * side effects.
336 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100337 * \param key_type A symmetric key type that is
338 * compatible with algorithm \p alg.
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200339 * \param alg An AEAD algorithm
340 * (\c PSA_ALG_XXX value such that
Gilles Peskine63f79302019-02-15 13:01:17 +0100341 * #PSA_ALG_IS_AEAD(\p alg) is true).
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200342 * \param plaintext_length Size of the plaintext in bytes.
343 *
344 * \return The AEAD ciphertext size for the specified
345 * algorithm.
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100346 * If the key type or AEAD algorithm is not
347 * recognized, or the parameters are incompatible,
348 * return 0.
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200349 */
Bence Szépkúti12116bc2021-03-11 15:59:24 +0100350#define PSA_AEAD_ENCRYPT_OUTPUT_SIZE(key_type, alg, plaintext_length) \
Bence Szépkútif5a1fe92021-04-21 10:13:08 +0200351 (PSA_AEAD_NONCE_LENGTH(key_type, alg) != 0 ? \
Bence Szépkúti7e310092021-04-08 12:05:18 +0200352 (plaintext_length) + PSA_ALG_AEAD_GET_TAG_LENGTH(alg) : \
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200353 0)
354
gabor-mezei-arm0687b2b2020-05-06 16:05:37 +0200355/** A sufficient output buffer size for psa_aead_encrypt(), for any of the
356 * supported key types and AEAD algorithms.
357 *
358 * If the size of the ciphertext buffer is at least this large, it is guaranteed
359 * that psa_aead_encrypt() will not fail due to an insufficient buffer size.
360 *
gabor-mezei-arme86bdca2021-01-07 14:26:12 +0100361 * \note This macro returns a compile-time constant if its arguments are
362 * compile-time constants.
363 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100364 * See also #PSA_AEAD_ENCRYPT_OUTPUT_SIZE(\p key_type, \p alg,
365 * \p plaintext_length).
gabor-mezei-arm0687b2b2020-05-06 16:05:37 +0200366 *
367 * \param plaintext_length Size of the plaintext in bytes.
368 *
369 * \return A sufficient output buffer size for any of the
370 * supported key types and AEAD algorithms.
371 *
372 */
373#define PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE(plaintext_length) \
374 ((plaintext_length) + PSA_AEAD_TAG_MAX_SIZE)
375
376
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200377/** The maximum size of the output of psa_aead_decrypt(), in bytes.
378 *
379 * If the size of the plaintext buffer is at least this large, it is
380 * guaranteed that psa_aead_decrypt() will not fail due to an
381 * insufficient buffer size. Depending on the algorithm, the actual size of
382 * the plaintext may be smaller.
383 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100384 * See also #PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE(\p ciphertext_length).
385 *
gabor-mezei-arme86bdca2021-01-07 14:26:12 +0100386 * \warning This macro may evaluate its arguments multiple times or
387 * zero times, so you should not pass arguments that contain
388 * side effects.
389 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100390 * \param key_type A symmetric key type that is
391 * compatible with algorithm \p alg.
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200392 * \param alg An AEAD algorithm
393 * (\c PSA_ALG_XXX value such that
Gilles Peskine63f79302019-02-15 13:01:17 +0100394 * #PSA_ALG_IS_AEAD(\p alg) is true).
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200395 * \param ciphertext_length Size of the plaintext in bytes.
396 *
397 * \return The AEAD ciphertext size for the specified
398 * algorithm.
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100399 * If the key type or AEAD algorithm is not
400 * recognized, or the parameters are incompatible,
401 * return 0.
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200402 */
Bence Szépkúti12116bc2021-03-11 15:59:24 +0100403#define PSA_AEAD_DECRYPT_OUTPUT_SIZE(key_type, alg, ciphertext_length) \
Bence Szépkúti1dda21c2021-04-21 11:09:50 +0200404 (PSA_AEAD_NONCE_LENGTH(key_type, alg) != 0 && \
Gilles Peskine449bd832023-01-11 14:50:10 +0100405 (ciphertext_length) > PSA_ALG_AEAD_GET_TAG_LENGTH(alg) ? \
406 (ciphertext_length) - PSA_ALG_AEAD_GET_TAG_LENGTH(alg) : \
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200407 0)
408
gabor-mezei-arm0687b2b2020-05-06 16:05:37 +0200409/** A sufficient output buffer size for psa_aead_decrypt(), for any of the
410 * supported key types and AEAD algorithms.
411 *
412 * If the size of the plaintext buffer is at least this large, it is guaranteed
413 * that psa_aead_decrypt() will not fail due to an insufficient buffer size.
414 *
gabor-mezei-armc6f24802021-02-15 15:56:29 +0100415 * \note This macro returns a compile-time constant if its arguments are
416 * compile-time constants.
417 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100418 * See also #PSA_AEAD_DECRYPT_OUTPUT_SIZE(\p key_type, \p alg,
419 * \p ciphertext_length).
gabor-mezei-arm0687b2b2020-05-06 16:05:37 +0200420 *
421 * \param ciphertext_length Size of the ciphertext in bytes.
422 *
423 * \return A sufficient output buffer size for any of the
424 * supported key types and AEAD algorithms.
425 *
426 */
427#define PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE(ciphertext_length) \
Gilles Peskine449bd832023-01-11 14:50:10 +0100428 (ciphertext_length)
gabor-mezei-arm0687b2b2020-05-06 16:05:37 +0200429
gabor-mezei-arma200ee62020-12-17 14:09:38 +0100430/** The default nonce size for an AEAD algorithm, in bytes.
431 *
432 * This macro can be used to allocate a buffer of sufficient size to
433 * store the nonce output from #psa_aead_generate_nonce().
434 *
435 * See also #PSA_AEAD_NONCE_MAX_SIZE.
436 *
437 * \note This is not the maximum size of nonce supported as input to
438 * #psa_aead_set_nonce(), #psa_aead_encrypt() or #psa_aead_decrypt(),
439 * just the default size that is generated by #psa_aead_generate_nonce().
440 *
441 * \warning This macro may evaluate its arguments multiple times or
442 * zero times, so you should not pass arguments that contain
443 * side effects.
444 *
445 * \param key_type A symmetric key type that is compatible with
446 * algorithm \p alg.
447 *
448 * \param alg An AEAD algorithm (\c PSA_ALG_XXX value such that
449 * #PSA_ALG_IS_AEAD(\p alg) is true).
450 *
451 * \return The default nonce size for the specified key type and algorithm.
452 * If the key type or AEAD algorithm is not recognized,
453 * or the parameters are incompatible, return 0.
gabor-mezei-arma200ee62020-12-17 14:09:38 +0100454 */
455#define PSA_AEAD_NONCE_LENGTH(key_type, alg) \
Bence Szépkúti0153c942021-03-04 10:32:59 +0100456 (PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) == 16 ? \
Gilles Peskine449bd832023-01-11 14:50:10 +0100457 MBEDTLS_PSA_ALG_AEAD_EQUAL(alg, PSA_ALG_CCM) ? 13 : \
458 MBEDTLS_PSA_ALG_AEAD_EQUAL(alg, PSA_ALG_GCM) ? 12 : \
459 0 : \
gabor-mezei-arma200ee62020-12-17 14:09:38 +0100460 (key_type) == PSA_KEY_TYPE_CHACHA20 && \
Gilles Peskine449bd832023-01-11 14:50:10 +0100461 MBEDTLS_PSA_ALG_AEAD_EQUAL(alg, PSA_ALG_CHACHA20_POLY1305) ? 12 : \
gabor-mezei-arma200ee62020-12-17 14:09:38 +0100462 0)
463
464/** The maximum default nonce size among all supported pairs of key types and
465 * AEAD algorithms, in bytes.
466 *
467 * This is equal to or greater than any value that #PSA_AEAD_NONCE_LENGTH()
468 * may return.
469 *
470 * \note This is not the maximum size of nonce supported as input to
471 * #psa_aead_set_nonce(), #psa_aead_encrypt() or #psa_aead_decrypt(),
472 * just the largest size that may be generated by
473 * #psa_aead_generate_nonce().
474 */
Bence Szépkúti0153c942021-03-04 10:32:59 +0100475#define PSA_AEAD_NONCE_MAX_SIZE 13
gabor-mezei-arma200ee62020-12-17 14:09:38 +0100476
Gilles Peskine49dd8d82019-05-06 15:16:19 +0200477/** A sufficient output buffer size for psa_aead_update().
478 *
479 * If the size of the output buffer is at least this large, it is
Gilles Peskineac99e322019-05-14 16:10:53 +0200480 * guaranteed that psa_aead_update() will not fail due to an
Gilles Peskine49dd8d82019-05-06 15:16:19 +0200481 * insufficient buffer size. The actual size of the output may be smaller
482 * in any given call.
483 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100484 * See also #PSA_AEAD_UPDATE_OUTPUT_MAX_SIZE(\p input_length).
485 *
gabor-mezei-arme86bdca2021-01-07 14:26:12 +0100486 * \warning This macro may evaluate its arguments multiple times or
487 * zero times, so you should not pass arguments that contain
488 * side effects.
489 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100490 * \param key_type A symmetric key type that is
491 * compatible with algorithm \p alg.
Gilles Peskine49dd8d82019-05-06 15:16:19 +0200492 * \param alg An AEAD algorithm
493 * (\c PSA_ALG_XXX value such that
494 * #PSA_ALG_IS_AEAD(\p alg) is true).
495 * \param input_length Size of the input in bytes.
496 *
497 * \return A sufficient output buffer size for the specified
498 * algorithm.
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100499 * If the key type or AEAD algorithm is not
500 * recognized, or the parameters are incompatible,
501 * return 0.
Gilles Peskine49dd8d82019-05-06 15:16:19 +0200502 */
503/* For all the AEAD modes defined in this specification, it is possible
504 * to emit output without delay. However, hardware may not always be
505 * capable of this. So for modes based on a block cipher, allow the
506 * implementation to delay the output until it has a full block. */
Bence Szépkúti12116bc2021-03-11 15:59:24 +0100507#define PSA_AEAD_UPDATE_OUTPUT_SIZE(key_type, alg, input_length) \
Bence Szépkútif5a1fe92021-04-21 10:13:08 +0200508 (PSA_AEAD_NONCE_LENGTH(key_type, alg) != 0 ? \
Gilles Peskine449bd832023-01-11 14:50:10 +0100509 PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg) ? \
510 PSA_ROUND_UP_TO_MULTIPLE(PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type), (input_length)) : \
511 (input_length) : \
Bence Szépkúti12116bc2021-03-11 15:59:24 +0100512 0)
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200513
514/** A sufficient output buffer size for psa_aead_update(), for any of the
515 * supported key types and AEAD algorithms.
516 *
517 * If the size of the output buffer is at least this large, it is guaranteed
518 * that psa_aead_update() will not fail due to an insufficient buffer size.
519 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100520 * See also #PSA_AEAD_UPDATE_OUTPUT_SIZE(\p key_type, \p alg, \p input_length).
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200521 *
522 * \param input_length Size of the input in bytes.
523 */
524#define PSA_AEAD_UPDATE_OUTPUT_MAX_SIZE(input_length) \
525 (PSA_ROUND_UP_TO_MULTIPLE(PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE, (input_length)))
Gilles Peskine49dd8d82019-05-06 15:16:19 +0200526
527/** A sufficient ciphertext buffer size for psa_aead_finish().
Gilles Peskinebdc27862019-05-06 15:45:16 +0200528 *
529 * If the size of the ciphertext buffer is at least this large, it is
530 * guaranteed that psa_aead_finish() will not fail due to an
Gilles Peskine49dd8d82019-05-06 15:16:19 +0200531 * insufficient ciphertext buffer size. The actual size of the output may
532 * be smaller in any given call.
Gilles Peskinebdc27862019-05-06 15:45:16 +0200533 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100534 * See also #PSA_AEAD_FINISH_OUTPUT_MAX_SIZE.
535 *
536 * \param key_type A symmetric key type that is
537 compatible with algorithm \p alg.
Gilles Peskinebdc27862019-05-06 15:45:16 +0200538 * \param alg An AEAD algorithm
539 * (\c PSA_ALG_XXX value such that
540 * #PSA_ALG_IS_AEAD(\p alg) is true).
541 *
Gilles Peskine49dd8d82019-05-06 15:16:19 +0200542 * \return A sufficient ciphertext buffer size for the
Gilles Peskinebdc27862019-05-06 15:45:16 +0200543 * specified algorithm.
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100544 * If the key type or AEAD algorithm is not
545 * recognized, or the parameters are incompatible,
546 * return 0.
Gilles Peskinebdc27862019-05-06 15:45:16 +0200547 */
Bence Szépkútif5a1fe92021-04-21 10:13:08 +0200548#define PSA_AEAD_FINISH_OUTPUT_SIZE(key_type, alg) \
549 (PSA_AEAD_NONCE_LENGTH(key_type, alg) != 0 && \
Gilles Peskine449bd832023-01-11 14:50:10 +0100550 PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg) ? \
551 PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) : \
Gilles Peskine49dd8d82019-05-06 15:16:19 +0200552 0)
553
gabor-mezei-arm0687b2b2020-05-06 16:05:37 +0200554/** A sufficient ciphertext buffer size for psa_aead_finish(), for any of the
555 * supported key types and AEAD algorithms.
556 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100557 * See also #PSA_AEAD_FINISH_OUTPUT_SIZE(\p key_type, \p alg).
gabor-mezei-arm0687b2b2020-05-06 16:05:37 +0200558 */
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200559#define PSA_AEAD_FINISH_OUTPUT_MAX_SIZE (PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE)
gabor-mezei-arm0687b2b2020-05-06 16:05:37 +0200560
Gilles Peskine49dd8d82019-05-06 15:16:19 +0200561/** A sufficient plaintext buffer size for psa_aead_verify().
562 *
563 * If the size of the plaintext buffer is at least this large, it is
564 * guaranteed that psa_aead_verify() will not fail due to an
565 * insufficient plaintext buffer size. The actual size of the output may
566 * be smaller in any given call.
567 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100568 * See also #PSA_AEAD_VERIFY_OUTPUT_MAX_SIZE.
569 *
570 * \param key_type A symmetric key type that is
571 * compatible with algorithm \p alg.
Gilles Peskine49dd8d82019-05-06 15:16:19 +0200572 * \param alg An AEAD algorithm
573 * (\c PSA_ALG_XXX value such that
574 * #PSA_ALG_IS_AEAD(\p alg) is true).
575 *
576 * \return A sufficient plaintext buffer size for the
577 * specified algorithm.
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100578 * If the key type or AEAD algorithm is not
579 * recognized, or the parameters are incompatible,
580 * return 0.
Gilles Peskine49dd8d82019-05-06 15:16:19 +0200581 */
Bence Szépkútif5a1fe92021-04-21 10:13:08 +0200582#define PSA_AEAD_VERIFY_OUTPUT_SIZE(key_type, alg) \
583 (PSA_AEAD_NONCE_LENGTH(key_type, alg) != 0 && \
Gilles Peskine449bd832023-01-11 14:50:10 +0100584 PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg) ? \
585 PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) : \
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200586 0)
587
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200588/** A sufficient plaintext buffer size for psa_aead_verify(), for any of the
589 * supported key types and AEAD algorithms.
590 *
Bence Szépkútieb1a3012021-03-18 10:33:33 +0100591 * See also #PSA_AEAD_VERIFY_OUTPUT_SIZE(\p key_type, \p alg).
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200592 */
593#define PSA_AEAD_VERIFY_OUTPUT_MAX_SIZE (PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE)
594
Jaeden Amero7f042142019-02-07 10:44:38 +0000595#define PSA_RSA_MINIMUM_PADDING_SIZE(alg) \
596 (PSA_ALG_IS_RSA_OAEP(alg) ? \
gabor-mezei-armd25ea722021-01-21 12:20:08 +0100597 2 * PSA_HASH_LENGTH(PSA_ALG_RSA_OAEP_GET_HASH(alg)) + 1 : \
Gilles Peskinea7c26db2018-12-12 13:42:25 +0100598 11 /*PKCS#1v1.5*/)
599
600/**
601 * \brief ECDSA signature size for a given curve bit size
602 *
603 * \param curve_bits Curve size in bits.
604 * \return Signature size in bytes.
605 *
606 * \note This macro returns a compile-time constant if its argument is one.
607 */
608#define PSA_ECDSA_SIGNATURE_SIZE(curve_bits) \
609 (PSA_BITS_TO_BYTES(curve_bits) * 2)
610
Gilles Peskine89d8c5c2019-11-26 17:01:59 +0100611/** Sufficient signature buffer size for psa_sign_hash().
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200612 *
Gilles Peskine56e2dc82019-05-21 15:59:56 +0200613 * This macro returns a sufficient buffer size for a signature using a key
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200614 * of the specified type and size, with the specified algorithm.
615 * Note that the actual size of the signature may be smaller
616 * (some algorithms produce a variable-size signature).
617 *
618 * \warning This function may call its arguments multiple times or
619 * zero times, so you should not pass arguments that contain
620 * side effects.
621 *
622 * \param key_type An asymmetric key type (this may indifferently be a
623 * key pair type or a public key type).
624 * \param key_bits The size of the key in bits.
625 * \param alg The signature algorithm.
626 *
627 * \return If the parameters are valid and supported, return
628 * a buffer size in bytes that guarantees that
Gilles Peskine89d8c5c2019-11-26 17:01:59 +0100629 * psa_sign_hash() will not fail with
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200630 * #PSA_ERROR_BUFFER_TOO_SMALL.
gabor-mezei-armc6f24802021-02-15 15:56:29 +0100631 * If the parameters are a valid combination that is not supported,
632 * return either a sensible size or 0.
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200633 * If the parameters are not valid, the
634 * return value is unspecified.
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200635 */
Gilles Peskine89d8c5c2019-11-26 17:01:59 +0100636#define PSA_SIGN_OUTPUT_SIZE(key_type, key_bits, alg) \
Gilles Peskine449bd832023-01-11 14:50:10 +0100637 (PSA_KEY_TYPE_IS_RSA(key_type) ? ((void) alg, PSA_BITS_TO_BYTES(key_bits)) : \
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200638 PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_ECDSA_SIGNATURE_SIZE(key_bits) : \
Gilles Peskine449bd832023-01-11 14:50:10 +0100639 ((void) alg, 0))
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200640
Gilles Peskine29755712019-11-08 15:49:40 +0100641#define PSA_VENDOR_ECDSA_SIGNATURE_MAX_SIZE \
642 PSA_ECDSA_SIGNATURE_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)
643
Gilles Peskine89d8c5c2019-11-26 17:01:59 +0100644/** \def PSA_SIGNATURE_MAX_SIZE
Gilles Peskine29755712019-11-08 15:49:40 +0100645 *
646 * Maximum size of an asymmetric signature.
647 *
gabor-mezei-armc6f24802021-02-15 15:56:29 +0100648 * This macro expands to a compile-time constant integer. This value
649 * is the maximum size of a signature in bytes.
Gilles Peskine29755712019-11-08 15:49:40 +0100650 */
Gilles Peskine89d8c5c2019-11-26 17:01:59 +0100651#define PSA_SIGNATURE_MAX_SIZE \
Gilles Peskine29755712019-11-08 15:49:40 +0100652 (PSA_BITS_TO_BYTES(PSA_VENDOR_RSA_MAX_KEY_BITS) > PSA_VENDOR_ECDSA_SIGNATURE_MAX_SIZE ? \
653 PSA_BITS_TO_BYTES(PSA_VENDOR_RSA_MAX_KEY_BITS) : \
654 PSA_VENDOR_ECDSA_SIGNATURE_MAX_SIZE)
655
Gilles Peskine56e2dc82019-05-21 15:59:56 +0200656/** Sufficient output buffer size for psa_asymmetric_encrypt().
Gilles Peskinedcd14942018-07-12 00:30:52 +0200657 *
Gilles Peskine56e2dc82019-05-21 15:59:56 +0200658 * This macro returns a sufficient buffer size for a ciphertext produced using
Gilles Peskinedcd14942018-07-12 00:30:52 +0200659 * a key of the specified type and size, with the specified algorithm.
660 * Note that the actual size of the ciphertext may be smaller, depending
661 * on the algorithm.
662 *
663 * \warning This function may call its arguments multiple times or
664 * zero times, so you should not pass arguments that contain
665 * side effects.
666 *
667 * \param key_type An asymmetric key type (this may indifferently be a
668 * key pair type or a public key type).
669 * \param key_bits The size of the key in bits.
Gilles Peskine9ff8d1f2020-05-05 16:00:17 +0200670 * \param alg The asymmetric encryption algorithm.
Gilles Peskinedcd14942018-07-12 00:30:52 +0200671 *
672 * \return If the parameters are valid and supported, return
673 * a buffer size in bytes that guarantees that
674 * psa_asymmetric_encrypt() will not fail with
675 * #PSA_ERROR_BUFFER_TOO_SMALL.
gabor-mezei-armc6f24802021-02-15 15:56:29 +0100676 * If the parameters are a valid combination that is not supported,
677 * return either a sensible size or 0.
Gilles Peskinedcd14942018-07-12 00:30:52 +0200678 * If the parameters are not valid, the
679 * return value is unspecified.
680 */
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200681#define PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(key_type, key_bits, alg) \
682 (PSA_KEY_TYPE_IS_RSA(key_type) ? \
Gilles Peskine449bd832023-01-11 14:50:10 +0100683 ((void) alg, PSA_BITS_TO_BYTES(key_bits)) : \
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200684 0)
Gilles Peskinedcd14942018-07-12 00:30:52 +0200685
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200686/** A sufficient output buffer size for psa_asymmetric_encrypt(), for any
687 * supported asymmetric encryption.
688 *
689 * See also #PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(\p key_type, \p key_bits, \p alg).
690 */
gabor-mezei-armc6f24802021-02-15 15:56:29 +0100691/* This macro assumes that RSA is the only supported asymmetric encryption. */
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200692#define PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE \
gabor-mezei-arme86bdca2021-01-07 14:26:12 +0100693 (PSA_BITS_TO_BYTES(PSA_VENDOR_RSA_MAX_KEY_BITS))
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200694
Gilles Peskine56e2dc82019-05-21 15:59:56 +0200695/** Sufficient output buffer size for psa_asymmetric_decrypt().
Gilles Peskinedcd14942018-07-12 00:30:52 +0200696 *
Gilles Peskine76689602020-05-05 16:01:22 +0200697 * This macro returns a sufficient buffer size for a plaintext produced using
Gilles Peskinedcd14942018-07-12 00:30:52 +0200698 * a key of the specified type and size, with the specified algorithm.
Gilles Peskine76689602020-05-05 16:01:22 +0200699 * Note that the actual size of the plaintext may be smaller, depending
Gilles Peskinedcd14942018-07-12 00:30:52 +0200700 * on the algorithm.
701 *
702 * \warning This function may call its arguments multiple times or
703 * zero times, so you should not pass arguments that contain
704 * side effects.
705 *
706 * \param key_type An asymmetric key type (this may indifferently be a
707 * key pair type or a public key type).
708 * \param key_bits The size of the key in bits.
Gilles Peskine9ff8d1f2020-05-05 16:00:17 +0200709 * \param alg The asymmetric encryption algorithm.
Gilles Peskinedcd14942018-07-12 00:30:52 +0200710 *
711 * \return If the parameters are valid and supported, return
712 * a buffer size in bytes that guarantees that
713 * psa_asymmetric_decrypt() will not fail with
714 * #PSA_ERROR_BUFFER_TOO_SMALL.
gabor-mezei-armc6f24802021-02-15 15:56:29 +0100715 * If the parameters are a valid combination that is not supported,
716 * return either a sensible size or 0.
Gilles Peskinedcd14942018-07-12 00:30:52 +0200717 * If the parameters are not valid, the
718 * return value is unspecified.
719 */
Gilles Peskine49cee6c2018-06-27 21:03:58 +0200720#define PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(key_type, key_bits, alg) \
721 (PSA_KEY_TYPE_IS_RSA(key_type) ? \
722 PSA_BITS_TO_BYTES(key_bits) - PSA_RSA_MINIMUM_PADDING_SIZE(alg) : \
723 0)
724
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200725/** A sufficient output buffer size for psa_asymmetric_decrypt(), for any
726 * supported asymmetric decryption.
727 *
gabor-mezei-arme86bdca2021-01-07 14:26:12 +0100728 * This macro assumes that RSA is the only supported asymmetric encryption.
729 *
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200730 * See also #PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(\p key_type, \p key_bits, \p alg).
731 */
732#define PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE \
gabor-mezei-arme86bdca2021-01-07 14:26:12 +0100733 (PSA_BITS_TO_BYTES(PSA_VENDOR_RSA_MAX_KEY_BITS))
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200734
Gilles Peskine1be949b2018-08-10 19:06:59 +0200735/* Maximum size of the ASN.1 encoding of an INTEGER with the specified
736 * number of bits.
737 *
738 * This definition assumes that bits <= 2^19 - 9 so that the length field
739 * is at most 3 bytes. The length of the encoding is the length of the
740 * bit string padded to a whole number of bytes plus:
741 * - 1 type byte;
742 * - 1 to 3 length bytes;
743 * - 0 to 1 bytes of leading 0 due to the sign bit.
744 */
745#define PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE(bits) \
746 ((bits) / 8 + 5)
747
748/* Maximum size of the export encoding of an RSA public key.
749 * Assumes that the public exponent is less than 2^32.
750 *
Gilles Peskine1be949b2018-08-10 19:06:59 +0200751 * RSAPublicKey ::= SEQUENCE {
752 * modulus INTEGER, -- n
753 * publicExponent INTEGER } -- e
754 *
Jaeden Amero25384a22019-01-10 10:23:21 +0000755 * - 4 bytes of SEQUENCE overhead;
Gilles Peskine1be949b2018-08-10 19:06:59 +0200756 * - n : INTEGER;
757 * - 7 bytes for the public exponent.
758 */
759#define PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(key_bits) \
Jaeden Amero25384a22019-01-10 10:23:21 +0000760 (PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE(key_bits) + 11)
Gilles Peskine1be949b2018-08-10 19:06:59 +0200761
762/* Maximum size of the export encoding of an RSA key pair.
Tom Cosgrove1797b052022-12-04 17:19:59 +0000763 * Assumes that the public exponent is less than 2^32 and that the size
Gilles Peskine1be949b2018-08-10 19:06:59 +0200764 * difference between the two primes is at most 1 bit.
765 *
766 * RSAPrivateKey ::= SEQUENCE {
767 * version Version, -- 0
768 * modulus INTEGER, -- N-bit
769 * publicExponent INTEGER, -- 32-bit
770 * privateExponent INTEGER, -- N-bit
771 * prime1 INTEGER, -- N/2-bit
772 * prime2 INTEGER, -- N/2-bit
773 * exponent1 INTEGER, -- N/2-bit
774 * exponent2 INTEGER, -- N/2-bit
775 * coefficient INTEGER, -- N/2-bit
776 * }
777 *
778 * - 4 bytes of SEQUENCE overhead;
779 * - 3 bytes of version;
780 * - 7 half-size INTEGERs plus 2 full-size INTEGERs,
781 * overapproximated as 9 half-size INTEGERS;
782 * - 7 bytes for the public exponent.
783 */
Gilles Peskinec93b80c2019-05-16 19:39:54 +0200784#define PSA_KEY_EXPORT_RSA_KEY_PAIR_MAX_SIZE(key_bits) \
Gilles Peskine1be949b2018-08-10 19:06:59 +0200785 (9 * PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE((key_bits) / 2 + 1) + 14)
786
787/* Maximum size of the export encoding of a DSA public key.
788 *
789 * SubjectPublicKeyInfo ::= SEQUENCE {
790 * algorithm AlgorithmIdentifier,
791 * subjectPublicKey BIT STRING } -- contains DSAPublicKey
792 * AlgorithmIdentifier ::= SEQUENCE {
793 * algorithm OBJECT IDENTIFIER,
bootstrap-prime6dbbf442022-05-17 19:30:44 -0400794 * parameters Dss-Params } -- SEQUENCE of 3 INTEGERs
Gilles Peskine1be949b2018-08-10 19:06:59 +0200795 * DSAPublicKey ::= INTEGER -- public key, Y
796 *
797 * - 3 * 4 bytes of SEQUENCE overhead;
798 * - 1 + 1 + 7 bytes of algorithm (DSA OID);
799 * - 4 bytes of BIT STRING overhead;
800 * - 3 full-size INTEGERs (p, g, y);
801 * - 1 + 1 + 32 bytes for 1 sub-size INTEGER (q <= 256 bits).
802 */
803#define PSA_KEY_EXPORT_DSA_PUBLIC_KEY_MAX_SIZE(key_bits) \
804 (PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE(key_bits) * 3 + 59)
805
806/* Maximum size of the export encoding of a DSA key pair.
807 *
808 * DSAPrivateKey ::= SEQUENCE {
809 * version Version, -- 0
810 * prime INTEGER, -- p
811 * subprime INTEGER, -- q
812 * generator INTEGER, -- g
813 * public INTEGER, -- y
814 * private INTEGER, -- x
815 * }
816 *
817 * - 4 bytes of SEQUENCE overhead;
818 * - 3 bytes of version;
819 * - 3 full-size INTEGERs (p, g, y);
820 * - 2 * (1 + 1 + 32) bytes for 2 sub-size INTEGERs (q, x <= 256 bits).
821 */
Gilles Peskinec93b80c2019-05-16 19:39:54 +0200822#define PSA_KEY_EXPORT_DSA_KEY_PAIR_MAX_SIZE(key_bits) \
Gilles Peskine1be949b2018-08-10 19:06:59 +0200823 (PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE(key_bits) * 3 + 75)
824
825/* Maximum size of the export encoding of an ECC public key.
826 *
Jaeden Ameroccdce902019-01-10 11:42:27 +0000827 * The representation of an ECC public key is:
828 * - The byte 0x04;
829 * - `x_P` as a `ceiling(m/8)`-byte string, big-endian;
830 * - `y_P` as a `ceiling(m/8)`-byte string, big-endian;
831 * - where m is the bit size associated with the curve.
Gilles Peskine1be949b2018-08-10 19:06:59 +0200832 *
Jaeden Ameroccdce902019-01-10 11:42:27 +0000833 * - 1 byte + 2 * point size.
Gilles Peskine1be949b2018-08-10 19:06:59 +0200834 */
835#define PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(key_bits) \
Jaeden Ameroccdce902019-01-10 11:42:27 +0000836 (2 * PSA_BITS_TO_BYTES(key_bits) + 1)
Gilles Peskine1be949b2018-08-10 19:06:59 +0200837
838/* Maximum size of the export encoding of an ECC key pair.
839 *
Gilles Peskine5eb15212018-10-31 13:24:35 +0100840 * An ECC key pair is represented by the secret value.
Gilles Peskine1be949b2018-08-10 19:06:59 +0200841 */
Gilles Peskinec93b80c2019-05-16 19:39:54 +0200842#define PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(key_bits) \
Gilles Peskine5eb15212018-10-31 13:24:35 +0100843 (PSA_BITS_TO_BYTES(key_bits))
Gilles Peskine1be949b2018-08-10 19:06:59 +0200844
Przemek Stekiel6d85afa2023-04-28 11:42:17 +0200845/* Maximum size of the export encoding of an DH key pair.
Przemek Stekieled23b612022-12-01 15:00:41 +0100846 *
Przemek Stekiel6d85afa2023-04-28 11:42:17 +0200847 * An DH key pair is represented by the secret value.
Przemek Stekieled23b612022-12-01 15:00:41 +0100848 */
849#define PSA_KEY_EXPORT_FFDH_KEY_PAIR_MAX_SIZE(key_bits) \
850 (PSA_BITS_TO_BYTES(key_bits))
851
Przemek Stekiel6d85afa2023-04-28 11:42:17 +0200852/* Maximum size of the export encoding of an DH public key.
Przemek Stekieled23b612022-12-01 15:00:41 +0100853 */
854#define PSA_KEY_EXPORT_FFDH_PUBLIC_KEY_MAX_SIZE(key_bits) \
855 (PSA_BITS_TO_BYTES(key_bits))
856
gabor-mezei-armbdae9182021-01-28 14:33:10 +0100857/** Sufficient output buffer size for psa_export_key() or
858 * psa_export_public_key().
Gilles Peskine1be949b2018-08-10 19:06:59 +0200859 *
860 * This macro returns a compile-time constant if its arguments are
861 * compile-time constants.
862 *
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100863 * \warning This macro may evaluate its arguments multiple times or
Gilles Peskine1be949b2018-08-10 19:06:59 +0200864 * zero times, so you should not pass arguments that contain
865 * side effects.
866 *
867 * The following code illustrates how to allocate enough memory to export
868 * a key by querying the key type and size at runtime.
869 * \code{c}
Gilles Peskined7d43b92019-05-21 15:56:03 +0200870 * psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine1be949b2018-08-10 19:06:59 +0200871 * psa_status_t status;
Gilles Peskined7d43b92019-05-21 15:56:03 +0200872 * status = psa_get_key_attributes(key, &attributes);
Gilles Peskine1be949b2018-08-10 19:06:59 +0200873 * if (status != PSA_SUCCESS) handle_error(...);
Gilles Peskined7d43b92019-05-21 15:56:03 +0200874 * psa_key_type_t key_type = psa_get_key_type(&attributes);
875 * size_t key_bits = psa_get_key_bits(&attributes);
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100876 * size_t buffer_size = PSA_EXPORT_KEY_OUTPUT_SIZE(key_type, key_bits);
Gilles Peskined7d43b92019-05-21 15:56:03 +0200877 * psa_reset_key_attributes(&attributes);
Gilles Peskinef82088a2019-07-15 11:07:38 +0200878 * uint8_t *buffer = malloc(buffer_size);
Gilles Peskined7d43b92019-05-21 15:56:03 +0200879 * if (buffer == NULL) handle_error(...);
Gilles Peskine1be949b2018-08-10 19:06:59 +0200880 * size_t buffer_length;
881 * status = psa_export_key(key, buffer, buffer_size, &buffer_length);
882 * if (status != PSA_SUCCESS) handle_error(...);
883 * \endcode
884 *
Gilles Peskine1be949b2018-08-10 19:06:59 +0200885 * \param key_type A supported key type.
886 * \param key_bits The size of the key in bits.
Gilles Peskine1be949b2018-08-10 19:06:59 +0200887 *
888 * \return If the parameters are valid and supported, return
889 * a buffer size in bytes that guarantees that
gabor-mezei-armbdae9182021-01-28 14:33:10 +0100890 * psa_export_key() or psa_export_public_key() will not fail with
Gilles Peskine1be949b2018-08-10 19:06:59 +0200891 * #PSA_ERROR_BUFFER_TOO_SMALL.
gabor-mezei-armc6f24802021-02-15 15:56:29 +0100892 * If the parameters are a valid combination that is not supported,
893 * return either a sensible size or 0.
894 * If the parameters are not valid, the return value is unspecified.
Gilles Peskine1be949b2018-08-10 19:06:59 +0200895 */
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100896#define PSA_EXPORT_KEY_OUTPUT_SIZE(key_type, key_bits) \
897 (PSA_KEY_TYPE_IS_UNSTRUCTURED(key_type) ? PSA_BITS_TO_BYTES(key_bits) : \
Przemek Stekieled23b612022-12-01 15:00:41 +0100898 PSA_KEY_TYPE_IS_DH(key_type) ? PSA_BITS_TO_BYTES(key_bits) : \
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100899 (key_type) == PSA_KEY_TYPE_RSA_KEY_PAIR ? PSA_KEY_EXPORT_RSA_KEY_PAIR_MAX_SIZE(key_bits) : \
Gilles Peskine1be949b2018-08-10 19:06:59 +0200900 (key_type) == PSA_KEY_TYPE_RSA_PUBLIC_KEY ? PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(key_bits) : \
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100901 (key_type) == PSA_KEY_TYPE_DSA_KEY_PAIR ? PSA_KEY_EXPORT_DSA_KEY_PAIR_MAX_SIZE(key_bits) : \
Gilles Peskine1be949b2018-08-10 19:06:59 +0200902 (key_type) == PSA_KEY_TYPE_DSA_PUBLIC_KEY ? PSA_KEY_EXPORT_DSA_PUBLIC_KEY_MAX_SIZE(key_bits) : \
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100903 PSA_KEY_TYPE_IS_ECC_KEY_PAIR(key_type) ? PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(key_bits) : \
904 PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY(key_type) ? PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(key_bits) : \
Gilles Peskine1be949b2018-08-10 19:06:59 +0200905 0)
906
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200907/** Sufficient output buffer size for psa_export_public_key().
908 *
909 * This macro returns a compile-time constant if its arguments are
910 * compile-time constants.
911 *
gabor-mezei-arme86bdca2021-01-07 14:26:12 +0100912 * \warning This macro may evaluate its arguments multiple times or
913 * zero times, so you should not pass arguments that contain
914 * side effects.
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200915 *
916 * The following code illustrates how to allocate enough memory to export
917 * a public key by querying the key type and size at runtime.
918 * \code{c}
919 * psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
920 * psa_status_t status;
921 * status = psa_get_key_attributes(key, &attributes);
gabor-mezei-arme86bdca2021-01-07 14:26:12 +0100922 * if (status != PSA_SUCCESS) handle_error(...);
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200923 * psa_key_type_t key_type = psa_get_key_type(&attributes);
924 * size_t key_bits = psa_get_key_bits(&attributes);
925 * size_t buffer_size = PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(key_type, key_bits);
926 * psa_reset_key_attributes(&attributes);
927 * uint8_t *buffer = malloc(buffer_size);
gabor-mezei-arme86bdca2021-01-07 14:26:12 +0100928 * if (buffer == NULL) handle_error(...);
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200929 * size_t buffer_length;
930 * status = psa_export_public_key(key, buffer, buffer_size, &buffer_length);
gabor-mezei-arme86bdca2021-01-07 14:26:12 +0100931 * if (status != PSA_SUCCESS) handle_error(...);
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200932 * \endcode
933 *
934 * \param key_type A public key or key pair key type.
935 * \param key_bits The size of the key in bits.
936 *
937 * \return If the parameters are valid and supported, return
938 * a buffer size in bytes that guarantees that
939 * psa_export_public_key() will not fail with
gabor-mezei-armc6f24802021-02-15 15:56:29 +0100940 * #PSA_ERROR_BUFFER_TOO_SMALL.
941 * If the parameters are a valid combination that is not
942 * supported, return either a sensible size or 0.
943 * If the parameters are not valid,
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200944 * the return value is unspecified.
945 *
946 * If the parameters are valid and supported,
gabor-mezei-armc6f24802021-02-15 15:56:29 +0100947 * return the same result as
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200948 * #PSA_EXPORT_KEY_OUTPUT_SIZE(
949 * \p #PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(\p key_type),
950 * \p key_bits).
951 */
gabor-mezei-arme86bdca2021-01-07 14:26:12 +0100952#define PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(key_type, key_bits) \
953 (PSA_KEY_TYPE_IS_RSA(key_type) ? PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(key_bits) : \
954 PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(key_bits) : \
Przemek Stekieled23b612022-12-01 15:00:41 +0100955 PSA_KEY_TYPE_IS_DH(key_type) ? PSA_BITS_TO_BYTES(key_bits) : \
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200956 0)
957
958/** Sufficient buffer size for exporting any asymmetric key pair.
959 *
gabor-mezei-armc6f24802021-02-15 15:56:29 +0100960 * This macro expands to a compile-time constant integer. This value is
961 * a sufficient buffer size when calling psa_export_key() to export any
962 * asymmetric key pair, regardless of the exact key type and key size.
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200963 *
964 * See also #PSA_EXPORT_KEY_OUTPUT_SIZE(\p key_type, \p key_bits).
965 */
Przemek Stekiel5357a7a2023-04-27 11:22:36 +0200966#define PSA_EXPORT_KEY_PAIR_MAX_SIZE \
967 PSA_MAX_OF_THREE(PSA_KEY_EXPORT_RSA_KEY_PAIR_MAX_SIZE(PSA_VENDOR_RSA_MAX_KEY_BITS), \
968 PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS), \
969 PSA_KEY_EXPORT_FFDH_KEY_PAIR_MAX_SIZE(PSA_VENDOR_FFDH_MAX_KEY_BITS))
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200970
971/** Sufficient buffer size for exporting any asymmetric public key.
972 *
gabor-mezei-armc6f24802021-02-15 15:56:29 +0100973 * This macro expands to a compile-time constant integer. This value is
974 * a sufficient buffer size when calling psa_export_key() or
975 * psa_export_public_key() to export any asymmetric public key,
976 * regardless of the exact key type and key size.
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200977 *
978 * See also #PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(\p key_type, \p key_bits).
979 */
Przemek Stekiel5357a7a2023-04-27 11:22:36 +0200980#define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE \
981 PSA_MAX_OF_THREE(PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(PSA_VENDOR_RSA_MAX_KEY_BITS), \
Przemek Stekiel654bef02022-12-15 13:28:02 +0100982 PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS), \
983 PSA_KEY_EXPORT_FFDH_PUBLIC_KEY_MAX_SIZE(PSA_VENDOR_FFDH_MAX_KEY_BITS))
984
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200985
986/** Sufficient output buffer size for psa_raw_key_agreement().
987 *
988 * This macro returns a compile-time constant if its arguments are
989 * compile-time constants.
990 *
gabor-mezei-arme86bdca2021-01-07 14:26:12 +0100991 * \warning This macro may evaluate its arguments multiple times or
992 * zero times, so you should not pass arguments that contain
993 * side effects.
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +0200994 *
995 * See also #PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE.
996 *
997 * \param key_type A supported key type.
998 * \param key_bits The size of the key in bits.
999 *
1000 * \return If the parameters are valid and supported, return
1001 * a buffer size in bytes that guarantees that
1002 * psa_raw_key_agreement() will not fail with
gabor-mezei-armc6f24802021-02-15 15:56:29 +01001003 * #PSA_ERROR_BUFFER_TOO_SMALL.
1004 * If the parameters are a valid combination that
1005 * is not supported, return either a sensible size or 0.
1006 * If the parameters are not valid,
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +02001007 * the return value is unspecified.
1008 */
1009#define PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE(key_type, key_bits) \
Przemek Stekiel654bef02022-12-15 13:28:02 +01001010 ((PSA_KEY_TYPE_IS_ECC_KEY_PAIR(key_type) || \
1011 PSA_KEY_TYPE_IS_DH_KEY_PAIR(key_type)) ? PSA_BITS_TO_BYTES(key_bits) : 0)
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +02001012
1013/** Maximum size of the output from psa_raw_key_agreement().
1014 *
gabor-mezei-armc6f24802021-02-15 15:56:29 +01001015 * This macro expands to a compile-time constant integer. This value is the
1016 * maximum size of the output any raw key agreement algorithm, in bytes.
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +02001017 *
1018 * See also #PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE(\p key_type, \p key_bits).
1019 */
Przemek Stekiel4ce52322023-04-28 13:40:34 +02001020#define PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE \
1021 (PSA_BITS_TO_BYTES(PSA_VENDOR_ECC_MAX_CURVE_BITS) > \
1022 PSA_BITS_TO_BYTES(PSA_VENDOR_FFDH_MAX_KEY_BITS) ? \
1023 PSA_BITS_TO_BYTES(PSA_VENDOR_ECC_MAX_CURVE_BITS) : \
1024 PSA_BITS_TO_BYTES(PSA_VENDOR_FFDH_MAX_KEY_BITS))
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +02001025
Bence Szépkúti423d3e72020-10-29 11:07:39 +01001026/** The default IV size for a cipher algorithm, in bytes.
1027 *
1028 * The IV that is generated as part of a call to #psa_cipher_encrypt() is always
1029 * the default IV length for the algorithm.
1030 *
1031 * This macro can be used to allocate a buffer of sufficient size to
1032 * store the IV output from #psa_cipher_generate_iv() when using
1033 * a multi-part cipher operation.
1034 *
1035 * See also #PSA_CIPHER_IV_MAX_SIZE.
1036 *
1037 * \warning This macro may evaluate its arguments multiple times or
1038 * zero times, so you should not pass arguments that contain
1039 * side effects.
1040 *
1041 * \param key_type A symmetric key type that is compatible with algorithm \p alg.
1042 *
1043 * \param alg A cipher algorithm (\c PSA_ALG_XXX value such that #PSA_ALG_IS_CIPHER(\p alg) is true).
1044 *
1045 * \return The default IV size for the specified key type and algorithm.
1046 * If the algorithm does not use an IV, return 0.
1047 * If the key type or cipher algorithm is not recognized,
1048 * or the parameters are incompatible, return 0.
Bence Szépkúti423d3e72020-10-29 11:07:39 +01001049 */
1050#define PSA_CIPHER_IV_LENGTH(key_type, alg) \
gabor-mezei-armcbcec212020-12-18 14:23:51 +01001051 (PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) > 1 && \
Gilles Peskine449bd832023-01-11 14:50:10 +01001052 ((alg) == PSA_ALG_CTR || \
1053 (alg) == PSA_ALG_CFB || \
1054 (alg) == PSA_ALG_OFB || \
1055 (alg) == PSA_ALG_XTS || \
1056 (alg) == PSA_ALG_CBC_NO_PADDING || \
1057 (alg) == PSA_ALG_CBC_PKCS7) ? PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) : \
Bence Szépkúti423d3e72020-10-29 11:07:39 +01001058 (key_type) == PSA_KEY_TYPE_CHACHA20 && \
Gilles Peskine449bd832023-01-11 14:50:10 +01001059 (alg) == PSA_ALG_STREAM_CIPHER ? 12 : \
1060 (alg) == PSA_ALG_CCM_STAR_NO_TAG ? 13 : \
1061 0)
Bence Szépkúti423d3e72020-10-29 11:07:39 +01001062
1063/** The maximum IV size for all supported cipher algorithms, in bytes.
1064 *
1065 * See also #PSA_CIPHER_IV_LENGTH().
1066 */
1067#define PSA_CIPHER_IV_MAX_SIZE 16
1068
gabor-mezei-arm8809fb62020-06-02 14:27:06 +02001069/** The maximum size of the output of psa_cipher_encrypt(), in bytes.
1070 *
1071 * If the size of the output buffer is at least this large, it is guaranteed
1072 * that psa_cipher_encrypt() will not fail due to an insufficient buffer size.
1073 * Depending on the algorithm, the actual size of the output might be smaller.
1074 *
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +02001075 * See also #PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE(\p input_length).
1076 *
gabor-mezei-arme86bdca2021-01-07 14:26:12 +01001077 * \warning This macro may evaluate its arguments multiple times or
1078 * zero times, so you should not pass arguments that contain
1079 * side effects.
gabor-mezei-arm8809fb62020-06-02 14:27:06 +02001080 *
1081 * \param key_type A symmetric key type that is compatible with algorithm
1082 * alg.
1083 * \param alg A cipher algorithm (\c PSA_ALG_XXX value such that
1084 * #PSA_ALG_IS_CIPHER(\p alg) is true).
1085 * \param input_length Size of the input in bytes.
1086 *
1087 * \return A sufficient output size for the specified key type and
1088 * algorithm. If the key type or cipher algorithm is not
1089 * recognized, or the parameters are incompatible,
gabor-mezei-arme86bdca2021-01-07 14:26:12 +01001090 * return 0.
gabor-mezei-arm8809fb62020-06-02 14:27:06 +02001091 */
gabor-mezei-arme86bdca2021-01-07 14:26:12 +01001092#define PSA_CIPHER_ENCRYPT_OUTPUT_SIZE(key_type, alg, input_length) \
1093 (alg == PSA_ALG_CBC_PKCS7 ? \
Paul Elliottc22950c2021-07-08 16:50:01 +01001094 (PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) != 0 ? \
Gilles Peskine449bd832023-01-11 14:50:10 +01001095 PSA_ROUND_UP_TO_MULTIPLE(PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type), \
1096 (input_length) + 1) + \
1097 PSA_CIPHER_IV_LENGTH((key_type), (alg)) : 0) : \
gabor-mezei-arme86bdca2021-01-07 14:26:12 +01001098 (PSA_ALG_IS_CIPHER(alg) ? \
1099 (input_length) + PSA_CIPHER_IV_LENGTH((key_type), (alg)) : \
Gilles Peskine449bd832023-01-11 14:50:10 +01001100 0))
gabor-mezei-arm8809fb62020-06-02 14:27:06 +02001101
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +02001102/** A sufficient output buffer size for psa_cipher_encrypt(), for any of the
1103 * supported key types and cipher algorithms.
1104 *
1105 * If the size of the output buffer is at least this large, it is guaranteed
1106 * that psa_cipher_encrypt() will not fail due to an insufficient buffer size.
1107 *
1108 * See also #PSA_CIPHER_ENCRYPT_OUTPUT_SIZE(\p key_type, \p alg, \p input_length).
1109 *
1110 * \param input_length Size of the input in bytes.
1111 *
1112 */
1113#define PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE(input_length) \
1114 (PSA_ROUND_UP_TO_MULTIPLE(PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE, \
gabor-mezei-arm56991012021-03-10 16:43:14 +01001115 (input_length) + 1) + \
1116 PSA_CIPHER_IV_MAX_SIZE)
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +02001117
gabor-mezei-arm8809fb62020-06-02 14:27:06 +02001118/** The maximum size of the output of psa_cipher_decrypt(), in bytes.
1119 *
1120 * If the size of the output buffer is at least this large, it is guaranteed
1121 * that psa_cipher_decrypt() will not fail due to an insufficient buffer size.
1122 * Depending on the algorithm, the actual size of the output might be smaller.
1123 *
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +02001124 * See also #PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE(\p input_length).
gabor-mezei-arm8809fb62020-06-02 14:27:06 +02001125 *
1126 * \param key_type A symmetric key type that is compatible with algorithm
1127 * alg.
1128 * \param alg A cipher algorithm (\c PSA_ALG_XXX value such that
1129 * #PSA_ALG_IS_CIPHER(\p alg) is true).
1130 * \param input_length Size of the input in bytes.
1131 *
1132 * \return A sufficient output size for the specified key type and
1133 * algorithm. If the key type or cipher algorithm is not
1134 * recognized, or the parameters are incompatible,
gabor-mezei-armc6f24802021-02-15 15:56:29 +01001135 * return 0.
gabor-mezei-arm8809fb62020-06-02 14:27:06 +02001136 */
gabor-mezei-armee6bb562020-06-17 10:11:11 +02001137#define PSA_CIPHER_DECRYPT_OUTPUT_SIZE(key_type, alg, input_length) \
1138 (PSA_ALG_IS_CIPHER(alg) && \
1139 ((key_type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_SYMMETRIC ? \
1140 (input_length) : \
gabor-mezei-arm8809fb62020-06-02 14:27:06 +02001141 0)
1142
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +02001143/** A sufficient output buffer size for psa_cipher_decrypt(), for any of the
1144 * supported key types and cipher algorithms.
1145 *
1146 * If the size of the output buffer is at least this large, it is guaranteed
1147 * that psa_cipher_decrypt() will not fail due to an insufficient buffer size.
1148 *
1149 * See also #PSA_CIPHER_DECRYPT_OUTPUT_SIZE(\p key_type, \p alg, \p input_length).
1150 *
1151 * \param input_length Size of the input in bytes.
1152 */
1153#define PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE(input_length) \
1154 (input_length)
1155
1156/** A sufficient output buffer size for psa_cipher_update().
1157 *
1158 * If the size of the output buffer is at least this large, it is guaranteed
1159 * that psa_cipher_update() will not fail due to an insufficient buffer size.
1160 * The actual size of the output might be smaller in any given call.
1161 *
1162 * See also #PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE(\p input_length).
1163 *
1164 * \param key_type A symmetric key type that is compatible with algorithm
1165 * alg.
1166 * \param alg A cipher algorithm (PSA_ALG_XXX value such that
1167 * #PSA_ALG_IS_CIPHER(\p alg) is true).
1168 * \param input_length Size of the input in bytes.
1169 *
1170 * \return A sufficient output size for the specified key type and
1171 * algorithm. If the key type or cipher algorithm is not
1172 * recognized, or the parameters are incompatible, return 0.
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +02001173 */
gabor-mezei-arme86bdca2021-01-07 14:26:12 +01001174#define PSA_CIPHER_UPDATE_OUTPUT_SIZE(key_type, alg, input_length) \
1175 (PSA_ALG_IS_CIPHER(alg) ? \
Gilles Peskine449bd832023-01-11 14:50:10 +01001176 (PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) != 0 ? \
1177 (((alg) == PSA_ALG_CBC_PKCS7 || \
1178 (alg) == PSA_ALG_CBC_NO_PADDING || \
1179 (alg) == PSA_ALG_ECB_NO_PADDING) ? \
1180 PSA_ROUND_UP_TO_MULTIPLE(PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type), \
gabor-mezei-arme86bdca2021-01-07 14:26:12 +01001181 input_length) : \
Gilles Peskine449bd832023-01-11 14:50:10 +01001182 (input_length)) : 0) : \
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +02001183 0)
1184
1185/** A sufficient output buffer size for psa_cipher_update(), for any of the
1186 * supported key types and cipher algorithms.
1187 *
1188 * If the size of the output buffer is at least this large, it is guaranteed
1189 * that psa_cipher_update() will not fail due to an insufficient buffer size.
1190 *
1191 * See also #PSA_CIPHER_UPDATE_OUTPUT_SIZE(\p key_type, \p alg, \p input_length).
1192 *
1193 * \param input_length Size of the input in bytes.
1194 */
1195#define PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE(input_length) \
gabor-mezei-arm286a36e2021-03-05 15:54:21 +01001196 (PSA_ROUND_UP_TO_MULTIPLE(PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE, input_length))
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +02001197
1198/** A sufficient ciphertext buffer size for psa_cipher_finish().
1199 *
1200 * If the size of the ciphertext buffer is at least this large, it is
1201 * guaranteed that psa_cipher_finish() will not fail due to an insufficient
1202 * ciphertext buffer size. The actual size of the output might be smaller in
1203 * any given call.
1204 *
1205 * See also #PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE().
1206 *
1207 * \param key_type A symmetric key type that is compatible with algorithm
1208 * alg.
1209 * \param alg A cipher algorithm (PSA_ALG_XXX value such that
1210 * #PSA_ALG_IS_CIPHER(\p alg) is true).
1211 * \return A sufficient output size for the specified key type and
1212 * algorithm. If the key type or cipher algorithm is not
1213 * recognized, or the parameters are incompatible, return 0.
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +02001214 */
gabor-mezei-arme86bdca2021-01-07 14:26:12 +01001215#define PSA_CIPHER_FINISH_OUTPUT_SIZE(key_type, alg) \
1216 (PSA_ALG_IS_CIPHER(alg) ? \
1217 (alg == PSA_ALG_CBC_PKCS7 ? \
1218 PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) : \
1219 0) : \
gabor-mezei-armfbd9f1e2020-06-29 10:38:39 +02001220 0)
1221
1222/** A sufficient ciphertext buffer size for psa_cipher_finish(), for any of the
1223 * supported key types and cipher algorithms.
1224 *
1225 * See also #PSA_CIPHER_FINISH_OUTPUT_SIZE(\p key_type, \p alg).
1226 */
1227#define PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE \
1228 (PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE)
1229
Gilles Peskine0cad07c2018-06-27 19:49:02 +02001230#endif /* PSA_CRYPTO_SIZES_H */