1 /**
2  * \file psa/crypto_values.h
3  *
4  * \brief PSA cryptography module: macros to build and analyze integer values.
5  *
6  * \note This file may not be included directly. Applications must
7  * include psa/crypto.h. Drivers must include the appropriate driver
8  * header file.
9  *
10  * This file contains portable definitions of macros to build and analyze
11  * values of integral types that encode properties of cryptographic keys,
12  * designations of cryptographic algorithms, and error codes returned by
13  * the library.
14  *
15  * This header file only defines preprocessor macros.
16  */
17 /*
18  *  Copyright The Mbed TLS Contributors
19  *  SPDX-License-Identifier: Apache-2.0
20  *
21  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
22  *  not use this file except in compliance with the License.
23  *  You may obtain a copy of the License at
24  *
25  *  http://www.apache.org/licenses/LICENSE-2.0
26  *
27  *  Unless required by applicable law or agreed to in writing, software
28  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
29  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
30  *  See the License for the specific language governing permissions and
31  *  limitations under the License.
32  */
33 
34 #ifndef PSA_CRYPTO_VALUES_H
35 #define PSA_CRYPTO_VALUES_H
36 
37 /** \defgroup error Error codes
38  * @{
39  */
40 
41 /* PSA error codes */
42 
43 /** The action was completed successfully. */
44 #define PSA_SUCCESS ((psa_status_t)0)
45 
46 /** An error occurred that does not correspond to any defined
47  * failure cause.
48  *
49  * Implementations may use this error code if none of the other standard
50  * error codes are applicable. */
51 #define PSA_ERROR_GENERIC_ERROR         ((psa_status_t)-132)
52 
53 /** The requested operation or a parameter is not supported
54  * by this implementation.
55  *
56  * Implementations should return this error code when an enumeration
57  * parameter such as a key type, algorithm, etc. is not recognized.
58  * If a combination of parameters is recognized and identified as
59  * not valid, return #PSA_ERROR_INVALID_ARGUMENT instead. */
60 #define PSA_ERROR_NOT_SUPPORTED         ((psa_status_t)-134)
61 
62 /** The requested action is denied by a policy.
63  *
64  * Implementations should return this error code when the parameters
65  * are recognized as valid and supported, and a policy explicitly
66  * denies the requested operation.
67  *
68  * If a subset of the parameters of a function call identify a
69  * forbidden operation, and another subset of the parameters are
70  * not valid or not supported, it is unspecified whether the function
71  * returns #PSA_ERROR_NOT_PERMITTED, #PSA_ERROR_NOT_SUPPORTED or
72  * #PSA_ERROR_INVALID_ARGUMENT. */
73 #define PSA_ERROR_NOT_PERMITTED         ((psa_status_t)-133)
74 
75 /** An output buffer is too small.
76  *
77  * Applications can call the \c PSA_xxx_SIZE macro listed in the function
78  * description to determine a sufficient buffer size.
79  *
80  * Implementations should preferably return this error code only
81  * in cases when performing the operation with a larger output
82  * buffer would succeed. However implementations may return this
83  * error if a function has invalid or unsupported parameters in addition
84  * to the parameters that determine the necessary output buffer size. */
85 #define PSA_ERROR_BUFFER_TOO_SMALL      ((psa_status_t)-138)
86 
87 /** Asking for an item that already exists
88  *
89  * Implementations should return this error, when attempting
90  * to write an item (like a key) that already exists. */
91 #define PSA_ERROR_ALREADY_EXISTS        ((psa_status_t)-139)
92 
93 /** Asking for an item that doesn't exist
94  *
95  * Implementations should return this error, if a requested item (like
96  * a key) does not exist. */
97 #define PSA_ERROR_DOES_NOT_EXIST        ((psa_status_t)-140)
98 
99 /** The requested action cannot be performed in the current state.
100  *
101  * Multipart operations return this error when one of the
102  * functions is called out of sequence. Refer to the function
103  * descriptions for permitted sequencing of functions.
104  *
105  * Implementations shall not return this error code to indicate
106  * that a key either exists or not,
107  * but shall instead return #PSA_ERROR_ALREADY_EXISTS or #PSA_ERROR_DOES_NOT_EXIST
108  * as applicable.
109  *
110  * Implementations shall not return this error code to indicate that a
111  * key identifier is invalid, but shall return #PSA_ERROR_INVALID_HANDLE
112  * instead. */
113 #define PSA_ERROR_BAD_STATE             ((psa_status_t)-137)
114 
115 /** The parameters passed to the function are invalid.
116  *
117  * Implementations may return this error any time a parameter or
118  * combination of parameters are recognized as invalid.
119  *
120  * Implementations shall not return this error code to indicate that a
121  * key identifier is invalid, but shall return #PSA_ERROR_INVALID_HANDLE
122  * instead.
123  */
124 #define PSA_ERROR_INVALID_ARGUMENT      ((psa_status_t)-135)
125 
126 /** There is not enough runtime memory.
127  *
128  * If the action is carried out across multiple security realms, this
129  * error can refer to available memory in any of the security realms. */
130 #define PSA_ERROR_INSUFFICIENT_MEMORY   ((psa_status_t)-141)
131 
132 /** There is not enough persistent storage.
133  *
134  * Functions that modify the key storage return this error code if
135  * there is insufficient storage space on the host media. In addition,
136  * many functions that do not otherwise access storage may return this
137  * error code if the implementation requires a mandatory log entry for
138  * the requested action and the log storage space is full. */
139 #define PSA_ERROR_INSUFFICIENT_STORAGE  ((psa_status_t)-142)
140 
141 /** There was a communication failure inside the implementation.
142  *
143  * This can indicate a communication failure between the application
144  * and an external cryptoprocessor or between the cryptoprocessor and
145  * an external volatile or persistent memory. A communication failure
146  * may be transient or permanent depending on the cause.
147  *
148  * \warning If a function returns this error, it is undetermined
149  * whether the requested action has completed or not. Implementations
150  * should return #PSA_SUCCESS on successful completion whenever
151  * possible, however functions may return #PSA_ERROR_COMMUNICATION_FAILURE
152  * if the requested action was completed successfully in an external
153  * cryptoprocessor but there was a breakdown of communication before
154  * the cryptoprocessor could report the status to the application.
155  */
156 #define PSA_ERROR_COMMUNICATION_FAILURE ((psa_status_t)-145)
157 
158 /** There was a storage failure that may have led to data loss.
159  *
160  * This error indicates that some persistent storage is corrupted.
161  * It should not be used for a corruption of volatile memory
162  * (use #PSA_ERROR_CORRUPTION_DETECTED), for a communication error
163  * between the cryptoprocessor and its external storage (use
164  * #PSA_ERROR_COMMUNICATION_FAILURE), or when the storage is
165  * in a valid state but is full (use #PSA_ERROR_INSUFFICIENT_STORAGE).
166  *
167  * Note that a storage failure does not indicate that any data that was
168  * previously read is invalid. However this previously read data may no
169  * longer be readable from storage.
170  *
171  * When a storage failure occurs, it is no longer possible to ensure
172  * the global integrity of the keystore. Depending on the global
173  * integrity guarantees offered by the implementation, access to other
174  * data may or may not fail even if the data is still readable but
175  * its integrity cannot be guaranteed.
176  *
177  * Implementations should only use this error code to report a
178  * permanent storage corruption. However application writers should
179  * keep in mind that transient errors while reading the storage may be
180  * reported using this error code. */
181 #define PSA_ERROR_STORAGE_FAILURE       ((psa_status_t)-146)
182 
183 /** A hardware failure was detected.
184  *
185  * A hardware failure may be transient or permanent depending on the
186  * cause. */
187 #define PSA_ERROR_HARDWARE_FAILURE      ((psa_status_t)-147)
188 
189 /** A tampering attempt was detected.
190  *
191  * If an application receives this error code, there is no guarantee
192  * that previously accessed or computed data was correct and remains
193  * confidential. Applications should not perform any security function
194  * and should enter a safe failure state.
195  *
196  * Implementations may return this error code if they detect an invalid
197  * state that cannot happen during normal operation and that indicates
198  * that the implementation's security guarantees no longer hold. Depending
199  * on the implementation architecture and on its security and safety goals,
200  * the implementation may forcibly terminate the application.
201  *
202  * This error code is intended as a last resort when a security breach
203  * is detected and it is unsure whether the keystore data is still
204  * protected. Implementations shall only return this error code
205  * to report an alarm from a tampering detector, to indicate that
206  * the confidentiality of stored data can no longer be guaranteed,
207  * or to indicate that the integrity of previously returned data is now
208  * considered compromised. Implementations shall not use this error code
209  * to indicate a hardware failure that merely makes it impossible to
210  * perform the requested operation (use #PSA_ERROR_COMMUNICATION_FAILURE,
211  * #PSA_ERROR_STORAGE_FAILURE, #PSA_ERROR_HARDWARE_FAILURE,
212  * #PSA_ERROR_INSUFFICIENT_ENTROPY or other applicable error code
213  * instead).
214  *
215  * This error indicates an attack against the application. Implementations
216  * shall not return this error code as a consequence of the behavior of
217  * the application itself. */
218 #define PSA_ERROR_CORRUPTION_DETECTED    ((psa_status_t)-151)
219 
220 /** There is not enough entropy to generate random data needed
221  * for the requested action.
222  *
223  * This error indicates a failure of a hardware random generator.
224  * Application writers should note that this error can be returned not
225  * only by functions whose purpose is to generate random data, such
226  * as key, IV or nonce generation, but also by functions that execute
227  * an algorithm with a randomized result, as well as functions that
228  * use randomization of intermediate computations as a countermeasure
229  * to certain attacks.
230  *
231  * Implementations should avoid returning this error after psa_crypto_init()
232  * has succeeded. Implementations should generate sufficient
233  * entropy during initialization and subsequently use a cryptographically
234  * secure pseudorandom generator (PRNG). However implementations may return
235  * this error at any time if a policy requires the PRNG to be reseeded
236  * during normal operation. */
237 #define PSA_ERROR_INSUFFICIENT_ENTROPY  ((psa_status_t)-148)
238 
239 /** The signature, MAC or hash is incorrect.
240  *
241  * Verification functions return this error if the verification
242  * calculations completed successfully, and the value to be verified
243  * was determined to be incorrect.
244  *
245  * If the value to verify has an invalid size, implementations may return
246  * either #PSA_ERROR_INVALID_ARGUMENT or #PSA_ERROR_INVALID_SIGNATURE. */
247 #define PSA_ERROR_INVALID_SIGNATURE     ((psa_status_t)-149)
248 
249 /** The decrypted padding is incorrect.
250  *
251  * \warning In some protocols, when decrypting data, it is essential that
252  * the behavior of the application does not depend on whether the padding
253  * is correct, down to precise timing. Applications should prefer
254  * protocols that use authenticated encryption rather than plain
255  * encryption. If the application must perform a decryption of
256  * unauthenticated data, the application writer should take care not
257  * to reveal whether the padding is invalid.
258  *
259  * Implementations should strive to make valid and invalid padding
260  * as close as possible to indistinguishable to an external observer.
261  * In particular, the timing of a decryption operation should not
262  * depend on the validity of the padding. */
263 #define PSA_ERROR_INVALID_PADDING       ((psa_status_t)-150)
264 
265 /** Return this error when there's insufficient data when attempting
266  * to read from a resource. */
267 #define PSA_ERROR_INSUFFICIENT_DATA     ((psa_status_t)-143)
268 
269 /** The key identifier is not valid. See also :ref:\`key-handles\`.
270  */
271 #define PSA_ERROR_INVALID_HANDLE        ((psa_status_t)-136)
272 
273 /**@}*/
274 
275 /** \defgroup crypto_types Key and algorithm types
276  * @{
277  */
278 
279 /** An invalid key type value.
280  *
281  * Zero is not the encoding of any key type.
282  */
283 #define PSA_KEY_TYPE_NONE                           ((psa_key_type_t)0x0000)
284 
285 /** Vendor-defined key type flag.
286  *
287  * Key types defined by this standard will never have the
288  * #PSA_KEY_TYPE_VENDOR_FLAG bit set. Vendors who define additional key types
289  * must use an encoding with the #PSA_KEY_TYPE_VENDOR_FLAG bit set and should
290  * respect the bitwise structure used by standard encodings whenever practical.
291  */
292 #define PSA_KEY_TYPE_VENDOR_FLAG                    ((psa_key_type_t)0x8000)
293 
294 #define PSA_KEY_TYPE_CATEGORY_MASK                  ((psa_key_type_t)0x7000)
295 #define PSA_KEY_TYPE_CATEGORY_RAW                   ((psa_key_type_t)0x1000)
296 #define PSA_KEY_TYPE_CATEGORY_SYMMETRIC             ((psa_key_type_t)0x2000)
297 #define PSA_KEY_TYPE_CATEGORY_PUBLIC_KEY            ((psa_key_type_t)0x4000)
298 #define PSA_KEY_TYPE_CATEGORY_KEY_PAIR              ((psa_key_type_t)0x7000)
299 
300 #define PSA_KEY_TYPE_CATEGORY_FLAG_PAIR             ((psa_key_type_t)0x3000)
301 
302 /** Whether a key type is vendor-defined.
303  *
304  * See also #PSA_KEY_TYPE_VENDOR_FLAG.
305  */
306 #define PSA_KEY_TYPE_IS_VENDOR_DEFINED(type) \
307     (((type) & PSA_KEY_TYPE_VENDOR_FLAG) != 0)
308 
309 /** Whether a key type is an unstructured array of bytes.
310  *
311  * This encompasses both symmetric keys and non-key data.
312  */
313 #define PSA_KEY_TYPE_IS_UNSTRUCTURED(type) \
314     (((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_RAW || \
315      ((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_SYMMETRIC)
316 
317 /** Whether a key type is asymmetric: either a key pair or a public key. */
318 #define PSA_KEY_TYPE_IS_ASYMMETRIC(type)                                \
319     (((type) & PSA_KEY_TYPE_CATEGORY_MASK                               \
320       & ~PSA_KEY_TYPE_CATEGORY_FLAG_PAIR) ==                            \
321      PSA_KEY_TYPE_CATEGORY_PUBLIC_KEY)
322 /** Whether a key type is the public part of a key pair. */
323 #define PSA_KEY_TYPE_IS_PUBLIC_KEY(type)                                \
324     (((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_PUBLIC_KEY)
325 /** Whether a key type is a key pair containing a private part and a public
326  * part. */
327 #define PSA_KEY_TYPE_IS_KEY_PAIR(type)                                   \
328     (((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_KEY_PAIR)
329 /** The key pair type corresponding to a public key type.
330  *
331  * You may also pass a key pair type as \p type, it will be left unchanged.
332  *
333  * \param type      A public key type or key pair type.
334  *
335  * \return          The corresponding key pair type.
336  *                  If \p type is not a public key or a key pair,
337  *                  the return value is undefined.
338  */
339 #define PSA_KEY_TYPE_KEY_PAIR_OF_PUBLIC_KEY(type)        \
340     ((type) | PSA_KEY_TYPE_CATEGORY_FLAG_PAIR)
341 /** The public key type corresponding to a key pair type.
342  *
343  * You may also pass a key pair type as \p type, it will be left unchanged.
344  *
345  * \param type      A public key type or key pair type.
346  *
347  * \return          The corresponding public key type.
348  *                  If \p type is not a public key or a key pair,
349  *                  the return value is undefined.
350  */
351 #define PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type)        \
352     ((type) & ~PSA_KEY_TYPE_CATEGORY_FLAG_PAIR)
353 
354 /** Raw data.
355  *
356  * A "key" of this type cannot be used for any cryptographic operation.
357  * Applications may use this type to store arbitrary data in the keystore. */
358 #define PSA_KEY_TYPE_RAW_DATA                       ((psa_key_type_t)0x1001)
359 
360 /** HMAC key.
361  *
362  * The key policy determines which underlying hash algorithm the key can be
363  * used for.
364  *
365  * HMAC keys should generally have the same size as the underlying hash.
366  * This size can be calculated with #PSA_HASH_SIZE(\c alg) where
367  * \c alg is the HMAC algorithm or the underlying hash algorithm. */
368 #define PSA_KEY_TYPE_HMAC                           ((psa_key_type_t)0x1100)
369 
370 /** A secret for key derivation.
371  *
372  * The key policy determines which key derivation algorithm the key
373  * can be used for.
374  */
375 #define PSA_KEY_TYPE_DERIVE                         ((psa_key_type_t)0x1200)
376 
377 /** Key for a cipher, AEAD or MAC algorithm based on the AES block cipher.
378  *
379  * The size of the key can be 16 bytes (AES-128), 24 bytes (AES-192) or
380  * 32 bytes (AES-256).
381  */
382 #define PSA_KEY_TYPE_AES                            ((psa_key_type_t)0x2400)
383 
384 /** Key for a cipher or MAC algorithm based on DES or 3DES (Triple-DES).
385  *
386  * The size of the key can be 8 bytes (single DES), 16 bytes (2-key 3DES) or
387  * 24 bytes (3-key 3DES).
388  *
389  * Note that single DES and 2-key 3DES are weak and strongly
390  * deprecated and should only be used to decrypt legacy data. 3-key 3DES
391  * is weak and deprecated and should only be used in legacy protocols.
392  */
393 #define PSA_KEY_TYPE_DES                            ((psa_key_type_t)0x2301)
394 
395 /** Key for a cipher, AEAD or MAC algorithm based on the
396  * Camellia block cipher. */
397 #define PSA_KEY_TYPE_CAMELLIA                       ((psa_key_type_t)0x2403)
398 
399 /** Key for the RC4 stream cipher.
400  *
401  * Note that RC4 is weak and deprecated and should only be used in
402  * legacy protocols. */
403 #define PSA_KEY_TYPE_ARC4                           ((psa_key_type_t)0x2002)
404 
405 /** Key for the ChaCha20 stream cipher or the Chacha20-Poly1305 AEAD algorithm.
406  *
407  * ChaCha20 and the ChaCha20_Poly1305 construction are defined in RFC 7539.
408  *
409  * Implementations must support 12-byte nonces, may support 8-byte nonces,
410  * and should reject other sizes.
411  */
412 #define PSA_KEY_TYPE_CHACHA20                       ((psa_key_type_t)0x2004)
413 
414 /** RSA public key. */
415 #define PSA_KEY_TYPE_RSA_PUBLIC_KEY                 ((psa_key_type_t)0x4001)
416 /** RSA key pair (private and public key). */
417 #define PSA_KEY_TYPE_RSA_KEY_PAIR                   ((psa_key_type_t)0x7001)
418 /** Whether a key type is an RSA key (pair or public-only). */
419 #define PSA_KEY_TYPE_IS_RSA(type)                                       \
420     (PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) == PSA_KEY_TYPE_RSA_PUBLIC_KEY)
421 
422 #define PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE            ((psa_key_type_t)0x4100)
423 #define PSA_KEY_TYPE_ECC_KEY_PAIR_BASE              ((psa_key_type_t)0x7100)
424 #define PSA_KEY_TYPE_ECC_CURVE_MASK                 ((psa_key_type_t)0x00ff)
425 /** Elliptic curve key pair.
426  *
427  * \param curve     A value of type ::psa_ecc_family_t that
428  *                  identifies the ECC curve to be used.
429  */
430 #define PSA_KEY_TYPE_ECC_KEY_PAIR(curve)         \
431     (PSA_KEY_TYPE_ECC_KEY_PAIR_BASE | (curve))
432 /** Elliptic curve public key.
433  *
434  * \param curve     A value of type ::psa_ecc_family_t that
435  *                  identifies the ECC curve to be used.
436  */
437 #define PSA_KEY_TYPE_ECC_PUBLIC_KEY(curve)              \
438     (PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE | (curve))
439 
440 /** Whether a key type is an elliptic curve key (pair or public-only). */
441 #define PSA_KEY_TYPE_IS_ECC(type)                                       \
442     ((PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) &                        \
443       ~PSA_KEY_TYPE_ECC_CURVE_MASK) == PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE)
444 /** Whether a key type is an elliptic curve key pair. */
445 #define PSA_KEY_TYPE_IS_ECC_KEY_PAIR(type)                               \
446     (((type) & ~PSA_KEY_TYPE_ECC_CURVE_MASK) ==                         \
447      PSA_KEY_TYPE_ECC_KEY_PAIR_BASE)
448 /** Whether a key type is an elliptic curve public key. */
449 #define PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY(type)                            \
450     (((type) & ~PSA_KEY_TYPE_ECC_CURVE_MASK) ==                         \
451      PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE)
452 
453 /** Extract the curve from an elliptic curve key type. */
454 #define PSA_KEY_TYPE_ECC_GET_FAMILY(type)                        \
455     ((psa_ecc_family_t) (PSA_KEY_TYPE_IS_ECC(type) ?             \
456                         ((type) & PSA_KEY_TYPE_ECC_CURVE_MASK) : \
457                         0))
458 
459 /** SEC Koblitz curves over prime fields.
460  *
461  * This family comprises the following curves:
462  * secp192k1, secp224k1, secp256k1.
463  * They are defined in _Standards for Efficient Cryptography_,
464  * _SEC 2: Recommended Elliptic Curve Domain Parameters_.
465  * https://www.secg.org/sec2-v2.pdf
466  */
467 #define PSA_ECC_FAMILY_SECP_K1           ((psa_ecc_family_t) 0x17)
468 
469 /** SEC random curves over prime fields.
470  *
471  * This family comprises the following curves:
472  * secp192k1, secp224r1, secp256r1, secp384r1, secp521r1.
473  * They are defined in _Standards for Efficient Cryptography_,
474  * _SEC 2: Recommended Elliptic Curve Domain Parameters_.
475  * https://www.secg.org/sec2-v2.pdf
476  */
477 #define PSA_ECC_FAMILY_SECP_R1           ((psa_ecc_family_t) 0x12)
478 /* SECP160R2 (SEC2 v1, obsolete) */
479 #define PSA_ECC_FAMILY_SECP_R2           ((psa_ecc_family_t) 0x1b)
480 
481 /** SEC Koblitz curves over binary fields.
482  *
483  * This family comprises the following curves:
484  * sect163k1, sect233k1, sect239k1, sect283k1, sect409k1, sect571k1.
485  * They are defined in _Standards for Efficient Cryptography_,
486  * _SEC 2: Recommended Elliptic Curve Domain Parameters_.
487  * https://www.secg.org/sec2-v2.pdf
488  */
489 #define PSA_ECC_FAMILY_SECT_K1           ((psa_ecc_family_t) 0x27)
490 
491 /** SEC random curves over binary fields.
492  *
493  * This family comprises the following curves:
494  * sect163r1, sect233r1, sect283r1, sect409r1, sect571r1.
495  * They are defined in _Standards for Efficient Cryptography_,
496  * _SEC 2: Recommended Elliptic Curve Domain Parameters_.
497  * https://www.secg.org/sec2-v2.pdf
498  */
499 #define PSA_ECC_FAMILY_SECT_R1           ((psa_ecc_family_t) 0x22)
500 
501 /** SEC additional random curves over binary fields.
502  *
503  * This family comprises the following curve:
504  * sect163r2.
505  * It is defined in _Standards for Efficient Cryptography_,
506  * _SEC 2: Recommended Elliptic Curve Domain Parameters_.
507  * https://www.secg.org/sec2-v2.pdf
508  */
509 #define PSA_ECC_FAMILY_SECT_R2           ((psa_ecc_family_t) 0x2b)
510 
511 /** Brainpool P random curves.
512  *
513  * This family comprises the following curves:
514  * brainpoolP160r1, brainpoolP192r1, brainpoolP224r1, brainpoolP256r1,
515  * brainpoolP320r1, brainpoolP384r1, brainpoolP512r1.
516  * It is defined in RFC 5639.
517  */
518 #define PSA_ECC_FAMILY_BRAINPOOL_P_R1    ((psa_ecc_family_t) 0x30)
519 
520 /** Curve25519 and Curve448.
521  *
522  * This family comprises the following Montgomery curves:
523  * - 255-bit: Bernstein et al.,
524  *   _Curve25519: new Diffie-Hellman speed records_, LNCS 3958, 2006.
525  *   The algorithm #PSA_ALG_ECDH performs X25519 when used with this curve.
526  * - 448-bit: Hamburg,
527  *   _Ed448-Goldilocks, a new elliptic curve_, NIST ECC Workshop, 2015.
528  *   The algorithm #PSA_ALG_ECDH performs X448 when used with this curve.
529  */
530 #define PSA_ECC_FAMILY_MONTGOMERY        ((psa_ecc_family_t) 0x41)
531 
532 #define PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE             ((psa_key_type_t)0x4200)
533 #define PSA_KEY_TYPE_DH_KEY_PAIR_BASE               ((psa_key_type_t)0x7200)
534 #define PSA_KEY_TYPE_DH_GROUP_MASK                  ((psa_key_type_t)0x00ff)
535 /** Diffie-Hellman key pair.
536  *
537  * \param group     A value of type ::psa_dh_family_t that identifies the
538  *                  Diffie-Hellman group to be used.
539  */
540 #define PSA_KEY_TYPE_DH_KEY_PAIR(group)          \
541     (PSA_KEY_TYPE_DH_KEY_PAIR_BASE | (group))
542 /** Diffie-Hellman public key.
543  *
544  * \param group     A value of type ::psa_dh_family_t that identifies the
545  *                  Diffie-Hellman group to be used.
546  */
547 #define PSA_KEY_TYPE_DH_PUBLIC_KEY(group)               \
548     (PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE | (group))
549 
550 /** Whether a key type is a Diffie-Hellman key (pair or public-only). */
551 #define PSA_KEY_TYPE_IS_DH(type)                                        \
552     ((PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) &                        \
553       ~PSA_KEY_TYPE_DH_GROUP_MASK) == PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE)
554 /** Whether a key type is a Diffie-Hellman key pair. */
555 #define PSA_KEY_TYPE_IS_DH_KEY_PAIR(type)                               \
556     (((type) & ~PSA_KEY_TYPE_DH_GROUP_MASK) ==                         \
557      PSA_KEY_TYPE_DH_KEY_PAIR_BASE)
558 /** Whether a key type is a Diffie-Hellman public key. */
559 #define PSA_KEY_TYPE_IS_DH_PUBLIC_KEY(type)                            \
560     (((type) & ~PSA_KEY_TYPE_DH_GROUP_MASK) ==                         \
561      PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE)
562 
563 /** Extract the group from a Diffie-Hellman key type. */
564 #define PSA_KEY_TYPE_DH_GET_FAMILY(type)                        \
565     ((psa_dh_family_t) (PSA_KEY_TYPE_IS_DH(type) ?              \
566                        ((type) & PSA_KEY_TYPE_DH_GROUP_MASK) :  \
567                        0))
568 
569 /** Diffie-Hellman groups defined in RFC 7919 Appendix A.
570  *
571  * This family includes groups with the following key sizes (in bits):
572  * 2048, 3072, 4096, 6144, 8192. A given implementation may support
573  * all of these sizes or only a subset.
574  */
575 #define PSA_DH_FAMILY_RFC7919            ((psa_dh_family_t) 0x03)
576 
577 #define PSA_GET_KEY_TYPE_BLOCK_SIZE_EXPONENT(type)      \
578     (((type) >> 8) & 7)
579 /** The block size of a block cipher.
580  *
581  * \param type  A cipher key type (value of type #psa_key_type_t).
582  *
583  * \return      The block size for a block cipher, or 1 for a stream cipher.
584  *              The return value is undefined if \p type is not a supported
585  *              cipher key type.
586  *
587  * \note It is possible to build stream cipher algorithms on top of a block
588  *       cipher, for example CTR mode (#PSA_ALG_CTR).
589  *       This macro only takes the key type into account, so it cannot be
590  *       used to determine the size of the data that #psa_cipher_update()
591  *       might buffer for future processing in general.
592  *
593  * \note This macro returns a compile-time constant if its argument is one.
594  *
595  * \warning This macro may evaluate its argument multiple times.
596  */
597 #define PSA_BLOCK_CIPHER_BLOCK_SIZE(type)            \
598     (((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_SYMMETRIC ? \
599      1u << PSA_GET_KEY_TYPE_BLOCK_SIZE_EXPONENT(type) :                 \
600      0u)
601 
602 /** Vendor-defined algorithm flag.
603  *
604  * Algorithms defined by this standard will never have the #PSA_ALG_VENDOR_FLAG
605  * bit set. Vendors who define additional algorithms must use an encoding with
606  * the #PSA_ALG_VENDOR_FLAG bit set and should respect the bitwise structure
607  * used by standard encodings whenever practical.
608  */
609 #define PSA_ALG_VENDOR_FLAG                     ((psa_algorithm_t)0x80000000)
610 
611 #define PSA_ALG_CATEGORY_MASK                   ((psa_algorithm_t)0x7f000000)
612 #define PSA_ALG_CATEGORY_HASH                   ((psa_algorithm_t)0x02000000)
613 #define PSA_ALG_CATEGORY_MAC                    ((psa_algorithm_t)0x03000000)
614 #define PSA_ALG_CATEGORY_CIPHER                 ((psa_algorithm_t)0x04000000)
615 #define PSA_ALG_CATEGORY_AEAD                   ((psa_algorithm_t)0x05000000)
616 #define PSA_ALG_CATEGORY_SIGN                   ((psa_algorithm_t)0x06000000)
617 #define PSA_ALG_CATEGORY_ASYMMETRIC_ENCRYPTION  ((psa_algorithm_t)0x07000000)
618 #define PSA_ALG_CATEGORY_KEY_DERIVATION         ((psa_algorithm_t)0x08000000)
619 #define PSA_ALG_CATEGORY_KEY_AGREEMENT          ((psa_algorithm_t)0x09000000)
620 
621 /** Whether an algorithm is vendor-defined.
622  *
623  * See also #PSA_ALG_VENDOR_FLAG.
624  */
625 #define PSA_ALG_IS_VENDOR_DEFINED(alg)                                  \
626     (((alg) & PSA_ALG_VENDOR_FLAG) != 0)
627 
628 /** Whether the specified algorithm is a hash algorithm.
629  *
630  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
631  *
632  * \return 1 if \p alg is a hash algorithm, 0 otherwise.
633  *         This macro may return either 0 or 1 if \p alg is not a supported
634  *         algorithm identifier.
635  */
636 #define PSA_ALG_IS_HASH(alg)                                            \
637     (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_HASH)
638 
639 /** Whether the specified algorithm is a MAC algorithm.
640  *
641  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
642  *
643  * \return 1 if \p alg is a MAC algorithm, 0 otherwise.
644  *         This macro may return either 0 or 1 if \p alg is not a supported
645  *         algorithm identifier.
646  */
647 #define PSA_ALG_IS_MAC(alg)                                             \
648     (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_MAC)
649 
650 /** Whether the specified algorithm is a symmetric cipher algorithm.
651  *
652  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
653  *
654  * \return 1 if \p alg is a symmetric cipher algorithm, 0 otherwise.
655  *         This macro may return either 0 or 1 if \p alg is not a supported
656  *         algorithm identifier.
657  */
658 #define PSA_ALG_IS_CIPHER(alg)                                          \
659     (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_CIPHER)
660 
661 /** Whether the specified algorithm is an authenticated encryption
662  * with associated data (AEAD) algorithm.
663  *
664  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
665  *
666  * \return 1 if \p alg is an AEAD algorithm, 0 otherwise.
667  *         This macro may return either 0 or 1 if \p alg is not a supported
668  *         algorithm identifier.
669  */
670 #define PSA_ALG_IS_AEAD(alg)                                            \
671     (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_AEAD)
672 
673 /** Whether the specified algorithm is an asymmetric signature algorithm,
674  * also known as public-key signature algorithm.
675  *
676  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
677  *
678  * \return 1 if \p alg is an asymmetric signature algorithm, 0 otherwise.
679  *         This macro may return either 0 or 1 if \p alg is not a supported
680  *         algorithm identifier.
681  */
682 #define PSA_ALG_IS_SIGN(alg)                                            \
683     (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_SIGN)
684 
685 /** Whether the specified algorithm is an asymmetric encryption algorithm,
686  * also known as public-key encryption algorithm.
687  *
688  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
689  *
690  * \return 1 if \p alg is an asymmetric encryption algorithm, 0 otherwise.
691  *         This macro may return either 0 or 1 if \p alg is not a supported
692  *         algorithm identifier.
693  */
694 #define PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg)                           \
695     (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_ASYMMETRIC_ENCRYPTION)
696 
697 /** Whether the specified algorithm is a key agreement algorithm.
698  *
699  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
700  *
701  * \return 1 if \p alg is a key agreement algorithm, 0 otherwise.
702  *         This macro may return either 0 or 1 if \p alg is not a supported
703  *         algorithm identifier.
704  */
705 #define PSA_ALG_IS_KEY_AGREEMENT(alg)                                   \
706     (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_KEY_AGREEMENT)
707 
708 /** Whether the specified algorithm is a key derivation algorithm.
709  *
710  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
711  *
712  * \return 1 if \p alg is a key derivation algorithm, 0 otherwise.
713  *         This macro may return either 0 or 1 if \p alg is not a supported
714  *         algorithm identifier.
715  */
716 #define PSA_ALG_IS_KEY_DERIVATION(alg)                                  \
717     (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_KEY_DERIVATION)
718 
719 #define PSA_ALG_HASH_MASK                       ((psa_algorithm_t)0x000000ff)
720 /** MD2 */
721 #define PSA_ALG_MD2                             ((psa_algorithm_t)0x02000001)
722 /** MD4 */
723 #define PSA_ALG_MD4                             ((psa_algorithm_t)0x02000002)
724 /** MD5 */
725 #define PSA_ALG_MD5                             ((psa_algorithm_t)0x02000003)
726 /** PSA_ALG_RIPEMD160 */
727 #define PSA_ALG_RIPEMD160                       ((psa_algorithm_t)0x02000004)
728 /** SHA1 */
729 #define PSA_ALG_SHA_1                           ((psa_algorithm_t)0x02000005)
730 /** SHA2-224 */
731 #define PSA_ALG_SHA_224                         ((psa_algorithm_t)0x02000008)
732 /** SHA2-256 */
733 #define PSA_ALG_SHA_256                         ((psa_algorithm_t)0x02000009)
734 /** SHA2-384 */
735 #define PSA_ALG_SHA_384                         ((psa_algorithm_t)0x0200000a)
736 /** SHA2-512 */
737 #define PSA_ALG_SHA_512                         ((psa_algorithm_t)0x0200000b)
738 /** SHA2-512/224 */
739 #define PSA_ALG_SHA_512_224                     ((psa_algorithm_t)0x0200000c)
740 /** SHA2-512/256 */
741 #define PSA_ALG_SHA_512_256                     ((psa_algorithm_t)0x0200000d)
742 /** SHA3-224 */
743 #define PSA_ALG_SHA3_224                        ((psa_algorithm_t)0x02000010)
744 /** SHA3-256 */
745 #define PSA_ALG_SHA3_256                        ((psa_algorithm_t)0x02000011)
746 /** SHA3-384 */
747 #define PSA_ALG_SHA3_384                        ((psa_algorithm_t)0x02000012)
748 /** SHA3-512 */
749 #define PSA_ALG_SHA3_512                        ((psa_algorithm_t)0x02000013)
750 
751 /** In a hash-and-sign algorithm policy, allow any hash algorithm.
752  *
753  * This value may be used to form the algorithm usage field of a policy
754  * for a signature algorithm that is parametrized by a hash. The key
755  * may then be used to perform operations using the same signature
756  * algorithm parametrized with any supported hash.
757  *
758  * That is, suppose that `PSA_xxx_SIGNATURE` is one of the following macros:
759  * - #PSA_ALG_RSA_PKCS1V15_SIGN, #PSA_ALG_RSA_PSS,
760  * - #PSA_ALG_ECDSA, #PSA_ALG_DETERMINISTIC_ECDSA.
761  * Then you may create and use a key as follows:
762  * - Set the key usage field using #PSA_ALG_ANY_HASH, for example:
763  *   ```
764  *   psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH); // or VERIFY
765  *   psa_set_key_algorithm(&attributes, PSA_xxx_SIGNATURE(PSA_ALG_ANY_HASH));
766  *   ```
767  * - Import or generate key material.
768  * - Call psa_sign_hash() or psa_verify_hash(), passing
769  *   an algorithm built from `PSA_xxx_SIGNATURE` and a specific hash. Each
770  *   call to sign or verify a message may use a different hash.
771  *   ```
772  *   psa_sign_hash(key, PSA_xxx_SIGNATURE(PSA_ALG_SHA_256), ...);
773  *   psa_sign_hash(key, PSA_xxx_SIGNATURE(PSA_ALG_SHA_512), ...);
774  *   psa_sign_hash(key, PSA_xxx_SIGNATURE(PSA_ALG_SHA3_256), ...);
775  *   ```
776  *
777  * This value may not be used to build other algorithms that are
778  * parametrized over a hash. For any valid use of this macro to build
779  * an algorithm \c alg, #PSA_ALG_IS_HASH_AND_SIGN(\c alg) is true.
780  *
781  * This value may not be used to build an algorithm specification to
782  * perform an operation. It is only valid to build policies.
783  */
784 #define PSA_ALG_ANY_HASH                        ((psa_algorithm_t)0x020000ff)
785 
786 #define PSA_ALG_MAC_SUBCATEGORY_MASK            ((psa_algorithm_t)0x00c00000)
787 #define PSA_ALG_HMAC_BASE                       ((psa_algorithm_t)0x03800000)
788 /** Macro to build an HMAC algorithm.
789  *
790  * For example, #PSA_ALG_HMAC(#PSA_ALG_SHA_256) is HMAC-SHA-256.
791  *
792  * \param hash_alg      A hash algorithm (\c PSA_ALG_XXX value such that
793  *                      #PSA_ALG_IS_HASH(\p hash_alg) is true).
794  *
795  * \return              The corresponding HMAC algorithm.
796  * \return              Unspecified if \p hash_alg is not a supported
797  *                      hash algorithm.
798  */
799 #define PSA_ALG_HMAC(hash_alg)                                  \
800     (PSA_ALG_HMAC_BASE | ((hash_alg) & PSA_ALG_HASH_MASK))
801 
802 #define PSA_ALG_HMAC_GET_HASH(hmac_alg)                             \
803     (PSA_ALG_CATEGORY_HASH | ((hmac_alg) & PSA_ALG_HASH_MASK))
804 
805 /** Whether the specified algorithm is an HMAC algorithm.
806  *
807  * HMAC is a family of MAC algorithms that are based on a hash function.
808  *
809  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
810  *
811  * \return 1 if \p alg is an HMAC algorithm, 0 otherwise.
812  *         This macro may return either 0 or 1 if \p alg is not a supported
813  *         algorithm identifier.
814  */
815 #define PSA_ALG_IS_HMAC(alg)                                            \
816     (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_MAC_SUBCATEGORY_MASK)) == \
817      PSA_ALG_HMAC_BASE)
818 
819 /* In the encoding of a MAC algorithm, the bits corresponding to
820  * PSA_ALG_MAC_TRUNCATION_MASK encode the length to which the MAC is
821  * truncated. As an exception, the value 0 means the untruncated algorithm,
822  * whatever its length is. The length is encoded in 6 bits, so it can
823  * reach up to 63; the largest MAC is 64 bytes so its trivial truncation
824  * to full length is correctly encoded as 0 and any non-trivial truncation
825  * is correctly encoded as a value between 1 and 63. */
826 #define PSA_ALG_MAC_TRUNCATION_MASK             ((psa_algorithm_t)0x003f0000)
827 #define PSA_MAC_TRUNCATION_OFFSET 16
828 
829 /** Macro to build a truncated MAC algorithm.
830  *
831  * A truncated MAC algorithm is identical to the corresponding MAC
832  * algorithm except that the MAC value for the truncated algorithm
833  * consists of only the first \p mac_length bytes of the MAC value
834  * for the untruncated algorithm.
835  *
836  * \note    This macro may allow constructing algorithm identifiers that
837  *          are not valid, either because the specified length is larger
838  *          than the untruncated MAC or because the specified length is
839  *          smaller than permitted by the implementation.
840  *
841  * \note    It is implementation-defined whether a truncated MAC that
842  *          is truncated to the same length as the MAC of the untruncated
843  *          algorithm is considered identical to the untruncated algorithm
844  *          for policy comparison purposes.
845  *
846  * \param mac_alg       A MAC algorithm identifier (value of type
847  *                      #psa_algorithm_t such that #PSA_ALG_IS_MAC(\p alg)
848  *                      is true). This may be a truncated or untruncated
849  *                      MAC algorithm.
850  * \param mac_length    Desired length of the truncated MAC in bytes.
851  *                      This must be at most the full length of the MAC
852  *                      and must be at least an implementation-specified
853  *                      minimum. The implementation-specified minimum
854  *                      shall not be zero.
855  *
856  * \return              The corresponding MAC algorithm with the specified
857  *                      length.
858  * \return              Unspecified if \p alg is not a supported
859  *                      MAC algorithm or if \p mac_length is too small or
860  *                      too large for the specified MAC algorithm.
861  */
862 #define PSA_ALG_TRUNCATED_MAC(mac_alg, mac_length)                      \
863     (((mac_alg) & ~PSA_ALG_MAC_TRUNCATION_MASK) |                       \
864      ((mac_length) << PSA_MAC_TRUNCATION_OFFSET & PSA_ALG_MAC_TRUNCATION_MASK))
865 
866 /** Macro to build the base MAC algorithm corresponding to a truncated
867  * MAC algorithm.
868  *
869  * \param mac_alg       A MAC algorithm identifier (value of type
870  *                      #psa_algorithm_t such that #PSA_ALG_IS_MAC(\p alg)
871  *                      is true). This may be a truncated or untruncated
872  *                      MAC algorithm.
873  *
874  * \return              The corresponding base MAC algorithm.
875  * \return              Unspecified if \p alg is not a supported
876  *                      MAC algorithm.
877  */
878 #define PSA_ALG_FULL_LENGTH_MAC(mac_alg)        \
879     ((mac_alg) & ~PSA_ALG_MAC_TRUNCATION_MASK)
880 
881 /** Length to which a MAC algorithm is truncated.
882  *
883  * \param mac_alg       A MAC algorithm identifier (value of type
884  *                      #psa_algorithm_t such that #PSA_ALG_IS_MAC(\p alg)
885  *                      is true).
886  *
887  * \return              Length of the truncated MAC in bytes.
888  * \return              0 if \p alg is a non-truncated MAC algorithm.
889  * \return              Unspecified if \p alg is not a supported
890  *                      MAC algorithm.
891  */
892 #define PSA_MAC_TRUNCATED_LENGTH(mac_alg)                               \
893     (((mac_alg) & PSA_ALG_MAC_TRUNCATION_MASK) >> PSA_MAC_TRUNCATION_OFFSET)
894 
895 #define PSA_ALG_CIPHER_MAC_BASE                 ((psa_algorithm_t)0x03c00000)
896 /** The CBC-MAC construction over a block cipher
897  *
898  * \warning CBC-MAC is insecure in many cases.
899  * A more secure mode, such as #PSA_ALG_CMAC, is recommended.
900  */
901 #define PSA_ALG_CBC_MAC                         ((psa_algorithm_t)0x03c00100)
902 /** The CMAC construction over a block cipher */
903 #define PSA_ALG_CMAC                            ((psa_algorithm_t)0x03c00200)
904 
905 /** Whether the specified algorithm is a MAC algorithm based on a block cipher.
906  *
907  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
908  *
909  * \return 1 if \p alg is a MAC algorithm based on a block cipher, 0 otherwise.
910  *         This macro may return either 0 or 1 if \p alg is not a supported
911  *         algorithm identifier.
912  */
913 #define PSA_ALG_IS_BLOCK_CIPHER_MAC(alg)                                \
914     (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_MAC_SUBCATEGORY_MASK)) == \
915      PSA_ALG_CIPHER_MAC_BASE)
916 
917 #define PSA_ALG_CIPHER_STREAM_FLAG              ((psa_algorithm_t)0x00800000)
918 #define PSA_ALG_CIPHER_FROM_BLOCK_FLAG          ((psa_algorithm_t)0x00400000)
919 
920 /** Whether the specified algorithm is a stream cipher.
921  *
922  * A stream cipher is a symmetric cipher that encrypts or decrypts messages
923  * by applying a bitwise-xor with a stream of bytes that is generated
924  * from a key.
925  *
926  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
927  *
928  * \return 1 if \p alg is a stream cipher algorithm, 0 otherwise.
929  *         This macro may return either 0 or 1 if \p alg is not a supported
930  *         algorithm identifier or if it is not a symmetric cipher algorithm.
931  */
932 #define PSA_ALG_IS_STREAM_CIPHER(alg)            \
933     (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_CIPHER_STREAM_FLAG)) == \
934         (PSA_ALG_CATEGORY_CIPHER | PSA_ALG_CIPHER_STREAM_FLAG))
935 
936 /** The stream cipher mode of a stream cipher algorithm.
937  *
938  * The underlying stream cipher is determined by the key type.
939  * - To use ChaCha20, use a key type of #PSA_KEY_TYPE_CHACHA20.
940  * - To use ARC4, use a key type of #PSA_KEY_TYPE_ARC4.
941  */
942 #define PSA_ALG_STREAM_CIPHER                   ((psa_algorithm_t)0x04800100)
943 
944 /** The CTR stream cipher mode.
945  *
946  * CTR is a stream cipher which is built from a block cipher.
947  * The underlying block cipher is determined by the key type.
948  * For example, to use AES-128-CTR, use this algorithm with
949  * a key of type #PSA_KEY_TYPE_AES and a length of 128 bits (16 bytes).
950  */
951 #define PSA_ALG_CTR                             ((psa_algorithm_t)0x04c01000)
952 
953 /** The CFB stream cipher mode.
954  *
955  * The underlying block cipher is determined by the key type.
956  */
957 #define PSA_ALG_CFB                             ((psa_algorithm_t)0x04c01100)
958 
959 /** The OFB stream cipher mode.
960  *
961  * The underlying block cipher is determined by the key type.
962  */
963 #define PSA_ALG_OFB                             ((psa_algorithm_t)0x04c01200)
964 
965 /** The XTS cipher mode.
966  *
967  * XTS is a cipher mode which is built from a block cipher. It requires at
968  * least one full block of input, but beyond this minimum the input
969  * does not need to be a whole number of blocks.
970  */
971 #define PSA_ALG_XTS                             ((psa_algorithm_t)0x0440ff00)
972 
973 /** The Electronic Code Book (ECB) mode of a block cipher, with no padding.
974  *
975  * \warning ECB mode does not protect the confidentiality of the encrypted data
976  * except in extremely narrow circumstances. It is recommended that applications
977  * only use ECB if they need to construct an operating mode that the
978  * implementation does not provide. Implementations are encouraged to provide
979  * the modes that applications need in preference to supporting direct access
980  * to ECB.
981  *
982  * The underlying block cipher is determined by the key type.
983  *
984  * This symmetric cipher mode can only be used with messages whose lengths are a
985  * multiple of the block size of the chosen block cipher.
986  *
987  * ECB mode does not accept an initialization vector (IV). When using a
988  * multi-part cipher operation with this algorithm, psa_cipher_generate_iv()
989  * and psa_cipher_set_iv() must not be called.
990  */
991 #define PSA_ALG_ECB_NO_PADDING                  ((psa_algorithm_t)0x04404400)
992 
993 /** The CBC block cipher chaining mode, with no padding.
994  *
995  * The underlying block cipher is determined by the key type.
996  *
997  * This symmetric cipher mode can only be used with messages whose lengths
998  * are whole number of blocks for the chosen block cipher.
999  */
1000 #define PSA_ALG_CBC_NO_PADDING                  ((psa_algorithm_t)0x04404000)
1001 
1002 /** The CBC block cipher chaining mode with PKCS#7 padding.
1003  *
1004  * The underlying block cipher is determined by the key type.
1005  *
1006  * This is the padding method defined by PKCS#7 (RFC 2315) &sect;10.3.
1007  */
1008 #define PSA_ALG_CBC_PKCS7                       ((psa_algorithm_t)0x04404100)
1009 
1010 #define PSA_ALG_AEAD_FROM_BLOCK_FLAG            ((psa_algorithm_t)0x00400000)
1011 
1012 /** Whether the specified algorithm is an AEAD mode on a block cipher.
1013  *
1014  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
1015  *
1016  * \return 1 if \p alg is an AEAD algorithm which is an AEAD mode based on
1017  *         a block cipher, 0 otherwise.
1018  *         This macro may return either 0 or 1 if \p alg is not a supported
1019  *         algorithm identifier.
1020  */
1021 #define PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg)    \
1022     (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_AEAD_FROM_BLOCK_FLAG)) == \
1023      (PSA_ALG_CATEGORY_AEAD | PSA_ALG_AEAD_FROM_BLOCK_FLAG))
1024 
1025 /** The CCM authenticated encryption algorithm.
1026  *
1027  * The underlying block cipher is determined by the key type.
1028  */
1029 #define PSA_ALG_CCM                             ((psa_algorithm_t)0x05500100)
1030 
1031 /** The GCM authenticated encryption algorithm.
1032  *
1033  * The underlying block cipher is determined by the key type.
1034  */
1035 #define PSA_ALG_GCM                             ((psa_algorithm_t)0x05500200)
1036 
1037 /** The Chacha20-Poly1305 AEAD algorithm.
1038  *
1039  * The ChaCha20_Poly1305 construction is defined in RFC 7539.
1040  *
1041  * Implementations must support 12-byte nonces, may support 8-byte nonces,
1042  * and should reject other sizes.
1043  *
1044  * Implementations must support 16-byte tags and should reject other sizes.
1045  */
1046 #define PSA_ALG_CHACHA20_POLY1305               ((psa_algorithm_t)0x05100500)
1047 
1048 /* In the encoding of a AEAD algorithm, the bits corresponding to
1049  * PSA_ALG_AEAD_TAG_LENGTH_MASK encode the length of the AEAD tag.
1050  * The constants for default lengths follow this encoding.
1051  */
1052 #define PSA_ALG_AEAD_TAG_LENGTH_MASK            ((psa_algorithm_t)0x003f0000)
1053 #define PSA_AEAD_TAG_LENGTH_OFFSET 16
1054 
1055 /** Macro to build a shortened AEAD algorithm.
1056  *
1057  * A shortened AEAD algorithm is similar to the corresponding AEAD
1058  * algorithm, but has an authentication tag that consists of fewer bytes.
1059  * Depending on the algorithm, the tag length may affect the calculation
1060  * of the ciphertext.
1061  *
1062  * \param aead_alg      An AEAD algorithm identifier (value of type
1063  *                      #psa_algorithm_t such that #PSA_ALG_IS_AEAD(\p alg)
1064  *                      is true).
1065  * \param tag_length    Desired length of the authentication tag in bytes.
1066  *
1067  * \return              The corresponding AEAD algorithm with the specified
1068  *                      length.
1069  * \return              Unspecified if \p alg is not a supported
1070  *                      AEAD algorithm or if \p tag_length is not valid
1071  *                      for the specified AEAD algorithm.
1072  */
1073 #define PSA_ALG_AEAD_WITH_TAG_LENGTH(aead_alg, tag_length)              \
1074     (((aead_alg) & ~PSA_ALG_AEAD_TAG_LENGTH_MASK) |                     \
1075      ((tag_length) << PSA_AEAD_TAG_LENGTH_OFFSET &                      \
1076       PSA_ALG_AEAD_TAG_LENGTH_MASK))
1077 
1078 /** Calculate the corresponding AEAD algorithm with the default tag length.
1079  *
1080  * \param aead_alg      An AEAD algorithm (\c PSA_ALG_XXX value such that
1081  *                      #PSA_ALG_IS_AEAD(\p alg) is true).
1082  *
1083  * \return              The corresponding AEAD algorithm with the default
1084  *                      tag length for that algorithm.
1085  */
1086 #define PSA_ALG_AEAD_WITH_DEFAULT_TAG_LENGTH(aead_alg)                   \
1087     (                                                                    \
1088         PSA_ALG_AEAD_WITH_DEFAULT_TAG_LENGTH_CASE(aead_alg, PSA_ALG_CCM) \
1089         PSA_ALG_AEAD_WITH_DEFAULT_TAG_LENGTH_CASE(aead_alg, PSA_ALG_GCM) \
1090         PSA_ALG_AEAD_WITH_DEFAULT_TAG_LENGTH_CASE(aead_alg, PSA_ALG_CHACHA20_POLY1305) \
1091         0)
1092 #define PSA_ALG_AEAD_WITH_DEFAULT_TAG_LENGTH_CASE(aead_alg, ref)         \
1093     PSA_ALG_AEAD_WITH_TAG_LENGTH(aead_alg, 0) ==                         \
1094     PSA_ALG_AEAD_WITH_TAG_LENGTH(ref, 0) ?                               \
1095     ref :
1096 
1097 #define PSA_ALG_RSA_PKCS1V15_SIGN_BASE          ((psa_algorithm_t)0x06000200)
1098 /** RSA PKCS#1 v1.5 signature with hashing.
1099  *
1100  * This is the signature scheme defined by RFC 8017
1101  * (PKCS#1: RSA Cryptography Specifications) under the name
1102  * RSASSA-PKCS1-v1_5.
1103  *
1104  * \param hash_alg      A hash algorithm (\c PSA_ALG_XXX value such that
1105  *                      #PSA_ALG_IS_HASH(\p hash_alg) is true).
1106  *                      This includes #PSA_ALG_ANY_HASH
1107  *                      when specifying the algorithm in a usage policy.
1108  *
1109  * \return              The corresponding RSA PKCS#1 v1.5 signature algorithm.
1110  * \return              Unspecified if \p hash_alg is not a supported
1111  *                      hash algorithm.
1112  */
1113 #define PSA_ALG_RSA_PKCS1V15_SIGN(hash_alg)                             \
1114     (PSA_ALG_RSA_PKCS1V15_SIGN_BASE | ((hash_alg) & PSA_ALG_HASH_MASK))
1115 /** Raw PKCS#1 v1.5 signature.
1116  *
1117  * The input to this algorithm is the DigestInfo structure used by
1118  * RFC 8017 (PKCS#1: RSA Cryptography Specifications), &sect;9.2
1119  * steps 3&ndash;6.
1120  */
1121 #define PSA_ALG_RSA_PKCS1V15_SIGN_RAW PSA_ALG_RSA_PKCS1V15_SIGN_BASE
1122 #define PSA_ALG_IS_RSA_PKCS1V15_SIGN(alg)                               \
1123     (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_RSA_PKCS1V15_SIGN_BASE)
1124 
1125 #define PSA_ALG_RSA_PSS_BASE               ((psa_algorithm_t)0x06000300)
1126 /** RSA PSS signature with hashing.
1127  *
1128  * This is the signature scheme defined by RFC 8017
1129  * (PKCS#1: RSA Cryptography Specifications) under the name
1130  * RSASSA-PSS, with the message generation function MGF1, and with
1131  * a salt length equal to the length of the hash. The specified
1132  * hash algorithm is used to hash the input message, to create the
1133  * salted hash, and for the mask generation.
1134  *
1135  * \param hash_alg      A hash algorithm (\c PSA_ALG_XXX value such that
1136  *                      #PSA_ALG_IS_HASH(\p hash_alg) is true).
1137  *                      This includes #PSA_ALG_ANY_HASH
1138  *                      when specifying the algorithm in a usage policy.
1139  *
1140  * \return              The corresponding RSA PSS signature algorithm.
1141  * \return              Unspecified if \p hash_alg is not a supported
1142  *                      hash algorithm.
1143  */
1144 #define PSA_ALG_RSA_PSS(hash_alg)                               \
1145     (PSA_ALG_RSA_PSS_BASE | ((hash_alg) & PSA_ALG_HASH_MASK))
1146 #define PSA_ALG_IS_RSA_PSS(alg)                                 \
1147     (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_RSA_PSS_BASE)
1148 
1149 #define PSA_ALG_ECDSA_BASE                      ((psa_algorithm_t)0x06000600)
1150 /** ECDSA signature with hashing.
1151  *
1152  * This is the ECDSA signature scheme defined by ANSI X9.62,
1153  * with a random per-message secret number (*k*).
1154  *
1155  * The representation of the signature as a byte string consists of
1156  * the concatentation of the signature values *r* and *s*. Each of
1157  * *r* and *s* is encoded as an *N*-octet string, where *N* is the length
1158  * of the base point of the curve in octets. Each value is represented
1159  * in big-endian order (most significant octet first).
1160  *
1161  * \param hash_alg      A hash algorithm (\c PSA_ALG_XXX value such that
1162  *                      #PSA_ALG_IS_HASH(\p hash_alg) is true).
1163  *                      This includes #PSA_ALG_ANY_HASH
1164  *                      when specifying the algorithm in a usage policy.
1165  *
1166  * \return              The corresponding ECDSA signature algorithm.
1167  * \return              Unspecified if \p hash_alg is not a supported
1168  *                      hash algorithm.
1169  */
1170 #define PSA_ALG_ECDSA(hash_alg)                                 \
1171     (PSA_ALG_ECDSA_BASE | ((hash_alg) & PSA_ALG_HASH_MASK))
1172 /** ECDSA signature without hashing.
1173  *
1174  * This is the same signature scheme as #PSA_ALG_ECDSA(), but
1175  * without specifying a hash algorithm. This algorithm may only be
1176  * used to sign or verify a sequence of bytes that should be an
1177  * already-calculated hash. Note that the input is padded with
1178  * zeros on the left or truncated on the left as required to fit
1179  * the curve size.
1180  */
1181 #define PSA_ALG_ECDSA_ANY PSA_ALG_ECDSA_BASE
1182 #define PSA_ALG_DETERMINISTIC_ECDSA_BASE        ((psa_algorithm_t)0x06000700)
1183 /** Deterministic ECDSA signature with hashing.
1184  *
1185  * This is the deterministic ECDSA signature scheme defined by RFC 6979.
1186  *
1187  * The representation of a signature is the same as with #PSA_ALG_ECDSA().
1188  *
1189  * Note that when this algorithm is used for verification, signatures
1190  * made with randomized ECDSA (#PSA_ALG_ECDSA(\p hash_alg)) with the
1191  * same private key are accepted. In other words,
1192  * #PSA_ALG_DETERMINISTIC_ECDSA(\p hash_alg) differs from
1193  * #PSA_ALG_ECDSA(\p hash_alg) only for signature, not for verification.
1194  *
1195  * \param hash_alg      A hash algorithm (\c PSA_ALG_XXX value such that
1196  *                      #PSA_ALG_IS_HASH(\p hash_alg) is true).
1197  *                      This includes #PSA_ALG_ANY_HASH
1198  *                      when specifying the algorithm in a usage policy.
1199  *
1200  * \return              The corresponding deterministic ECDSA signature
1201  *                      algorithm.
1202  * \return              Unspecified if \p hash_alg is not a supported
1203  *                      hash algorithm.
1204  */
1205 #define PSA_ALG_DETERMINISTIC_ECDSA(hash_alg)                           \
1206     (PSA_ALG_DETERMINISTIC_ECDSA_BASE | ((hash_alg) & PSA_ALG_HASH_MASK))
1207 #define PSA_ALG_ECDSA_DETERMINISTIC_FLAG        ((psa_algorithm_t)0x00000100)
1208 #define PSA_ALG_IS_ECDSA(alg)                                           \
1209     (((alg) & ~PSA_ALG_HASH_MASK & ~PSA_ALG_ECDSA_DETERMINISTIC_FLAG) ==  \
1210      PSA_ALG_ECDSA_BASE)
1211 #define PSA_ALG_ECDSA_IS_DETERMINISTIC(alg)             \
1212     (((alg) & PSA_ALG_ECDSA_DETERMINISTIC_FLAG) != 0)
1213 #define PSA_ALG_IS_DETERMINISTIC_ECDSA(alg)                             \
1214     (PSA_ALG_IS_ECDSA(alg) && PSA_ALG_ECDSA_IS_DETERMINISTIC(alg))
1215 #define PSA_ALG_IS_RANDOMIZED_ECDSA(alg)                                \
1216     (PSA_ALG_IS_ECDSA(alg) && !PSA_ALG_ECDSA_IS_DETERMINISTIC(alg))
1217 
1218 /** Whether the specified algorithm is a hash-and-sign algorithm.
1219  *
1220  * Hash-and-sign algorithms are asymmetric (public-key) signature algorithms
1221  * structured in two parts: first the calculation of a hash in a way that
1222  * does not depend on the key, then the calculation of a signature from the
1223  * hash value and the key.
1224  *
1225  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
1226  *
1227  * \return 1 if \p alg is a hash-and-sign algorithm, 0 otherwise.
1228  *         This macro may return either 0 or 1 if \p alg is not a supported
1229  *         algorithm identifier.
1230  */
1231 #define PSA_ALG_IS_HASH_AND_SIGN(alg)                                   \
1232     (PSA_ALG_IS_RSA_PSS(alg) || PSA_ALG_IS_RSA_PKCS1V15_SIGN(alg) ||    \
1233      PSA_ALG_IS_ECDSA(alg))
1234 
1235 /** Get the hash used by a hash-and-sign signature algorithm.
1236  *
1237  * A hash-and-sign algorithm is a signature algorithm which is
1238  * composed of two phases: first a hashing phase which does not use
1239  * the key and produces a hash of the input message, then a signing
1240  * phase which only uses the hash and the key and not the message
1241  * itself.
1242  *
1243  * \param alg   A signature algorithm (\c PSA_ALG_XXX value such that
1244  *              #PSA_ALG_IS_SIGN(\p alg) is true).
1245  *
1246  * \return      The underlying hash algorithm if \p alg is a hash-and-sign
1247  *              algorithm.
1248  * \return      0 if \p alg is a signature algorithm that does not
1249  *              follow the hash-and-sign structure.
1250  * \return      Unspecified if \p alg is not a signature algorithm or
1251  *              if it is not supported by the implementation.
1252  */
1253 #define PSA_ALG_SIGN_GET_HASH(alg)                                     \
1254     (PSA_ALG_IS_HASH_AND_SIGN(alg) ?                                   \
1255      ((alg) & PSA_ALG_HASH_MASK) == 0 ? /*"raw" algorithm*/ 0 :        \
1256      ((alg) & PSA_ALG_HASH_MASK) | PSA_ALG_CATEGORY_HASH :             \
1257      0)
1258 
1259 /** RSA PKCS#1 v1.5 encryption.
1260  */
1261 #define PSA_ALG_RSA_PKCS1V15_CRYPT              ((psa_algorithm_t)0x07000200)
1262 
1263 #define PSA_ALG_RSA_OAEP_BASE                   ((psa_algorithm_t)0x07000300)
1264 /** RSA OAEP encryption.
1265  *
1266  * This is the encryption scheme defined by RFC 8017
1267  * (PKCS#1: RSA Cryptography Specifications) under the name
1268  * RSAES-OAEP, with the message generation function MGF1.
1269  *
1270  * \param hash_alg      The hash algorithm (\c PSA_ALG_XXX value such that
1271  *                      #PSA_ALG_IS_HASH(\p hash_alg) is true) to use
1272  *                      for MGF1.
1273  *
1274  * \return              The corresponding RSA OAEP encryption algorithm.
1275  * \return              Unspecified if \p hash_alg is not a supported
1276  *                      hash algorithm.
1277  */
1278 #define PSA_ALG_RSA_OAEP(hash_alg)                              \
1279     (PSA_ALG_RSA_OAEP_BASE | ((hash_alg) & PSA_ALG_HASH_MASK))
1280 #define PSA_ALG_IS_RSA_OAEP(alg)                                \
1281     (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_RSA_OAEP_BASE)
1282 #define PSA_ALG_RSA_OAEP_GET_HASH(alg)                          \
1283     (PSA_ALG_IS_RSA_OAEP(alg) ?                                 \
1284      ((alg) & PSA_ALG_HASH_MASK) | PSA_ALG_CATEGORY_HASH :      \
1285      0)
1286 
1287 #define PSA_ALG_HKDF_BASE                       ((psa_algorithm_t)0x08000100)
1288 /** Macro to build an HKDF algorithm.
1289  *
1290  * For example, `PSA_ALG_HKDF(PSA_ALG_SHA256)` is HKDF using HMAC-SHA-256.
1291  *
1292  * This key derivation algorithm uses the following inputs:
1293  * - #PSA_KEY_DERIVATION_INPUT_SALT is the salt used in the "extract" step.
1294  *   It is optional; if omitted, the derivation uses an empty salt.
1295  * - #PSA_KEY_DERIVATION_INPUT_SECRET is the secret key used in the "extract" step.
1296  * - #PSA_KEY_DERIVATION_INPUT_INFO is the info string used in the "expand" step.
1297  * You must pass #PSA_KEY_DERIVATION_INPUT_SALT before #PSA_KEY_DERIVATION_INPUT_SECRET.
1298  * You may pass #PSA_KEY_DERIVATION_INPUT_INFO at any time after steup and before
1299  * starting to generate output.
1300  *
1301  * \param hash_alg      A hash algorithm (\c PSA_ALG_XXX value such that
1302  *                      #PSA_ALG_IS_HASH(\p hash_alg) is true).
1303  *
1304  * \return              The corresponding HKDF algorithm.
1305  * \return              Unspecified if \p hash_alg is not a supported
1306  *                      hash algorithm.
1307  */
1308 #define PSA_ALG_HKDF(hash_alg)                                  \
1309     (PSA_ALG_HKDF_BASE | ((hash_alg) & PSA_ALG_HASH_MASK))
1310 /** Whether the specified algorithm is an HKDF algorithm.
1311  *
1312  * HKDF is a family of key derivation algorithms that are based on a hash
1313  * function and the HMAC construction.
1314  *
1315  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
1316  *
1317  * \return 1 if \c alg is an HKDF algorithm, 0 otherwise.
1318  *         This macro may return either 0 or 1 if \c alg is not a supported
1319  *         key derivation algorithm identifier.
1320  */
1321 #define PSA_ALG_IS_HKDF(alg)                            \
1322     (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_HKDF_BASE)
1323 #define PSA_ALG_HKDF_GET_HASH(hkdf_alg)                         \
1324     (PSA_ALG_CATEGORY_HASH | ((hkdf_alg) & PSA_ALG_HASH_MASK))
1325 
1326 #define PSA_ALG_TLS12_PRF_BASE                  ((psa_algorithm_t)0x08000200)
1327 /** Macro to build a TLS-1.2 PRF algorithm.
1328  *
1329  * TLS 1.2 uses a custom pseudorandom function (PRF) for key schedule,
1330  * specified in Section 5 of RFC 5246. It is based on HMAC and can be
1331  * used with either SHA-256 or SHA-384.
1332  *
1333  * This key derivation algorithm uses the following inputs, which must be
1334  * passed in the order given here:
1335  * - #PSA_KEY_DERIVATION_INPUT_SEED is the seed.
1336  * - #PSA_KEY_DERIVATION_INPUT_SECRET is the secret key.
1337  * - #PSA_KEY_DERIVATION_INPUT_LABEL is the label.
1338  *
1339  * For the application to TLS-1.2 key expansion, the seed is the
1340  * concatenation of ServerHello.Random + ClientHello.Random,
1341  * and the label is "key expansion".
1342  *
1343  * For example, `PSA_ALG_TLS12_PRF(PSA_ALG_SHA256)` represents the
1344  * TLS 1.2 PRF using HMAC-SHA-256.
1345  *
1346  * \param hash_alg      A hash algorithm (\c PSA_ALG_XXX value such that
1347  *                      #PSA_ALG_IS_HASH(\p hash_alg) is true).
1348  *
1349  * \return              The corresponding TLS-1.2 PRF algorithm.
1350  * \return              Unspecified if \p hash_alg is not a supported
1351  *                      hash algorithm.
1352  */
1353 #define PSA_ALG_TLS12_PRF(hash_alg)                                  \
1354     (PSA_ALG_TLS12_PRF_BASE | ((hash_alg) & PSA_ALG_HASH_MASK))
1355 
1356 /** Whether the specified algorithm is a TLS-1.2 PRF algorithm.
1357  *
1358  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
1359  *
1360  * \return 1 if \c alg is a TLS-1.2 PRF algorithm, 0 otherwise.
1361  *         This macro may return either 0 or 1 if \c alg is not a supported
1362  *         key derivation algorithm identifier.
1363  */
1364 #define PSA_ALG_IS_TLS12_PRF(alg)                                    \
1365     (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_TLS12_PRF_BASE)
1366 #define PSA_ALG_TLS12_PRF_GET_HASH(hkdf_alg)                         \
1367     (PSA_ALG_CATEGORY_HASH | ((hkdf_alg) & PSA_ALG_HASH_MASK))
1368 
1369 #define PSA_ALG_TLS12_PSK_TO_MS_BASE            ((psa_algorithm_t)0x08000300)
1370 /** Macro to build a TLS-1.2 PSK-to-MasterSecret algorithm.
1371  *
1372  * In a pure-PSK handshake in TLS 1.2, the master secret is derived
1373  * from the PreSharedKey (PSK) through the application of padding
1374  * (RFC 4279, Section 2) and the TLS-1.2 PRF (RFC 5246, Section 5).
1375  * The latter is based on HMAC and can be used with either SHA-256
1376  * or SHA-384.
1377  *
1378  * This key derivation algorithm uses the following inputs, which must be
1379  * passed in the order given here:
1380  * - #PSA_KEY_DERIVATION_INPUT_SEED is the seed.
1381  * - #PSA_KEY_DERIVATION_INPUT_SECRET is the secret key.
1382  * - #PSA_KEY_DERIVATION_INPUT_LABEL is the label.
1383  *
1384  * For the application to TLS-1.2, the seed (which is
1385  * forwarded to the TLS-1.2 PRF) is the concatenation of the
1386  * ClientHello.Random + ServerHello.Random,
1387  * and the label is "master secret" or "extended master secret".
1388  *
1389  * For example, `PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA256)` represents the
1390  * TLS-1.2 PSK to MasterSecret derivation PRF using HMAC-SHA-256.
1391  *
1392  * \param hash_alg      A hash algorithm (\c PSA_ALG_XXX value such that
1393  *                      #PSA_ALG_IS_HASH(\p hash_alg) is true).
1394  *
1395  * \return              The corresponding TLS-1.2 PSK to MS algorithm.
1396  * \return              Unspecified if \p hash_alg is not a supported
1397  *                      hash algorithm.
1398  */
1399 #define PSA_ALG_TLS12_PSK_TO_MS(hash_alg)                                  \
1400     (PSA_ALG_TLS12_PSK_TO_MS_BASE | ((hash_alg) & PSA_ALG_HASH_MASK))
1401 
1402 /** Whether the specified algorithm is a TLS-1.2 PSK to MS algorithm.
1403  *
1404  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
1405  *
1406  * \return 1 if \c alg is a TLS-1.2 PSK to MS algorithm, 0 otherwise.
1407  *         This macro may return either 0 or 1 if \c alg is not a supported
1408  *         key derivation algorithm identifier.
1409  */
1410 #define PSA_ALG_IS_TLS12_PSK_TO_MS(alg)                                    \
1411     (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_TLS12_PSK_TO_MS_BASE)
1412 #define PSA_ALG_TLS12_PSK_TO_MS_GET_HASH(hkdf_alg)                         \
1413     (PSA_ALG_CATEGORY_HASH | ((hkdf_alg) & PSA_ALG_HASH_MASK))
1414 
1415 #define PSA_ALG_KEY_DERIVATION_MASK             ((psa_algorithm_t)0xfe00ffff)
1416 #define PSA_ALG_KEY_AGREEMENT_MASK              ((psa_algorithm_t)0xffff0000)
1417 
1418 /** Macro to build a combined algorithm that chains a key agreement with
1419  * a key derivation.
1420  *
1421  * \param ka_alg        A key agreement algorithm (\c PSA_ALG_XXX value such
1422  *                      that #PSA_ALG_IS_KEY_AGREEMENT(\p ka_alg) is true).
1423  * \param kdf_alg       A key derivation algorithm (\c PSA_ALG_XXX value such
1424  *                      that #PSA_ALG_IS_KEY_DERIVATION(\p kdf_alg) is true).
1425  *
1426  * \return              The corresponding key agreement and derivation
1427  *                      algorithm.
1428  * \return              Unspecified if \p ka_alg is not a supported
1429  *                      key agreement algorithm or \p kdf_alg is not a
1430  *                      supported key derivation algorithm.
1431  */
1432 #define PSA_ALG_KEY_AGREEMENT(ka_alg, kdf_alg)  \
1433     ((ka_alg) | (kdf_alg))
1434 
1435 #define PSA_ALG_KEY_AGREEMENT_GET_KDF(alg)                              \
1436     (((alg) & PSA_ALG_KEY_DERIVATION_MASK) | PSA_ALG_CATEGORY_KEY_DERIVATION)
1437 
1438 #define PSA_ALG_KEY_AGREEMENT_GET_BASE(alg)                             \
1439     (((alg) & PSA_ALG_KEY_AGREEMENT_MASK) | PSA_ALG_CATEGORY_KEY_AGREEMENT)
1440 
1441 /** Whether the specified algorithm is a raw key agreement algorithm.
1442  *
1443  * A raw key agreement algorithm is one that does not specify
1444  * a key derivation function.
1445  * Usually, raw key agreement algorithms are constructed directly with
1446  * a \c PSA_ALG_xxx macro while non-raw key agreement algorithms are
1447  * constructed with #PSA_ALG_KEY_AGREEMENT().
1448  *
1449  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
1450  *
1451  * \return 1 if \p alg is a raw key agreement algorithm, 0 otherwise.
1452  *         This macro may return either 0 or 1 if \p alg is not a supported
1453  *         algorithm identifier.
1454  */
1455 #define PSA_ALG_IS_RAW_KEY_AGREEMENT(alg)                               \
1456     (PSA_ALG_IS_KEY_AGREEMENT(alg) &&                                   \
1457      PSA_ALG_KEY_AGREEMENT_GET_KDF(alg) == PSA_ALG_CATEGORY_KEY_DERIVATION)
1458 
1459 #define PSA_ALG_IS_KEY_DERIVATION_OR_AGREEMENT(alg)     \
1460     ((PSA_ALG_IS_KEY_DERIVATION(alg) || PSA_ALG_IS_KEY_AGREEMENT(alg)))
1461 
1462 /** The finite-field Diffie-Hellman (DH) key agreement algorithm.
1463  *
1464  * The shared secret produced by key agreement is
1465  * `g^{ab}` in big-endian format.
1466  * It is `ceiling(m / 8)` bytes long where `m` is the size of the prime `p`
1467  * in bits.
1468  */
1469 #define PSA_ALG_FFDH                            ((psa_algorithm_t)0x09010000)
1470 
1471 /** Whether the specified algorithm is a finite field Diffie-Hellman algorithm.
1472  *
1473  * This includes the raw finite field Diffie-Hellman algorithm as well as
1474  * finite-field Diffie-Hellman followed by any supporter key derivation
1475  * algorithm.
1476  *
1477  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
1478  *
1479  * \return 1 if \c alg is a finite field Diffie-Hellman algorithm, 0 otherwise.
1480  *         This macro may return either 0 or 1 if \c alg is not a supported
1481  *         key agreement algorithm identifier.
1482  */
1483 #define PSA_ALG_IS_FFDH(alg) \
1484     (PSA_ALG_KEY_AGREEMENT_GET_BASE(alg) == PSA_ALG_FFDH)
1485 
1486 /** The elliptic curve Diffie-Hellman (ECDH) key agreement algorithm.
1487  *
1488  * The shared secret produced by key agreement is the x-coordinate of
1489  * the shared secret point. It is always `ceiling(m / 8)` bytes long where
1490  * `m` is the bit size associated with the curve, i.e. the bit size of the
1491  * order of the curve's coordinate field. When `m` is not a multiple of 8,
1492  * the byte containing the most significant bit of the shared secret
1493  * is padded with zero bits. The byte order is either little-endian
1494  * or big-endian depending on the curve type.
1495  *
1496  * - For Montgomery curves (curve types `PSA_ECC_FAMILY_CURVEXXX`),
1497  *   the shared secret is the x-coordinate of `d_A Q_B = d_B Q_A`
1498  *   in little-endian byte order.
1499  *   The bit size is 448 for Curve448 and 255 for Curve25519.
1500  * - For Weierstrass curves over prime fields (curve types
1501  *   `PSA_ECC_FAMILY_SECPXXX` and `PSA_ECC_FAMILY_BRAINPOOL_PXXX`),
1502  *   the shared secret is the x-coordinate of `d_A Q_B = d_B Q_A`
1503  *   in big-endian byte order.
1504  *   The bit size is `m = ceiling(log_2(p))` for the field `F_p`.
1505  * - For Weierstrass curves over binary fields (curve types
1506  *   `PSA_ECC_FAMILY_SECTXXX`),
1507  *   the shared secret is the x-coordinate of `d_A Q_B = d_B Q_A`
1508  *   in big-endian byte order.
1509  *   The bit size is `m` for the field `F_{2^m}`.
1510  */
1511 #define PSA_ALG_ECDH                            ((psa_algorithm_t)0x09020000)
1512 
1513 /** Whether the specified algorithm is an elliptic curve Diffie-Hellman
1514  * algorithm.
1515  *
1516  * This includes the raw elliptic curve Diffie-Hellman algorithm as well as
1517  * elliptic curve Diffie-Hellman followed by any supporter key derivation
1518  * algorithm.
1519  *
1520  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
1521  *
1522  * \return 1 if \c alg is an elliptic curve Diffie-Hellman algorithm,
1523  *         0 otherwise.
1524  *         This macro may return either 0 or 1 if \c alg is not a supported
1525  *         key agreement algorithm identifier.
1526  */
1527 #define PSA_ALG_IS_ECDH(alg) \
1528     (PSA_ALG_KEY_AGREEMENT_GET_BASE(alg) == PSA_ALG_ECDH)
1529 
1530 /** Whether the specified algorithm encoding is a wildcard.
1531  *
1532  * Wildcard values may only be used to set the usage algorithm field in
1533  * a policy, not to perform an operation.
1534  *
1535  * \param alg An algorithm identifier (value of type #psa_algorithm_t).
1536  *
1537  * \return 1 if \c alg is a wildcard algorithm encoding.
1538  * \return 0 if \c alg is a non-wildcard algorithm encoding (suitable for
1539  *         an operation).
1540  * \return This macro may return either 0 or 1 if \c alg is not a supported
1541  *         algorithm identifier.
1542  */
1543 #define PSA_ALG_IS_WILDCARD(alg)                        \
1544     (PSA_ALG_IS_HASH_AND_SIGN(alg) ?                    \
1545      PSA_ALG_SIGN_GET_HASH(alg) == PSA_ALG_ANY_HASH :   \
1546      (alg) == PSA_ALG_ANY_HASH)
1547 
1548 /**@}*/
1549 
1550 /** \defgroup key_lifetimes Key lifetimes
1551  * @{
1552  */
1553 
1554 /** The default lifetime for volatile keys.
1555  *
1556  * A volatile key only exists as long as the identifier to it is not destroyed.
1557  * The key material is guaranteed to be erased on a power reset.
1558  *
1559  * A key with this lifetime is typically stored in the RAM area of the
1560  * PSA Crypto subsystem. However this is an implementation choice.
1561  * If an implementation stores data about the key in a non-volatile memory,
1562  * it must release all the resources associated with the key and erase the
1563  * key material if the calling application terminates.
1564  */
1565 #define PSA_KEY_LIFETIME_VOLATILE               ((psa_key_lifetime_t)0x00000000)
1566 
1567 /** The default lifetime for persistent keys.
1568  *
1569  * A persistent key remains in storage until it is explicitly destroyed or
1570  * until the corresponding storage area is wiped. This specification does
1571  * not define any mechanism to wipe a storage area, but implementations may
1572  * provide their own mechanism (for example to perform a factory reset,
1573  * to prepare for device refurbishment, or to uninstall an application).
1574  *
1575  * This lifetime value is the default storage area for the calling
1576  * application. Implementations may offer other storage areas designated
1577  * by other lifetime values as implementation-specific extensions.
1578  * See ::psa_key_lifetime_t for more information.
1579  */
1580 #define PSA_KEY_LIFETIME_PERSISTENT             ((psa_key_lifetime_t)0x00000001)
1581 
1582 /** The persistence level of volatile keys.
1583  *
1584  * See ::psa_key_persistence_t for more information.
1585  */
1586 #define PSA_KEY_PERSISTENCE_VOLATILE            ((psa_key_persistence_t)0x00)
1587 
1588 /** The default persistence level for persistent keys.
1589  *
1590  * See ::psa_key_persistence_t for more information.
1591  */
1592 #define PSA_KEY_PERSISTENCE_DEFAULT             ((psa_key_persistence_t)0x01)
1593 
1594 /** A persistence level indicating that a key is never destroyed.
1595  *
1596  * See ::psa_key_persistence_t for more information.
1597  */
1598 #define PSA_KEY_PERSISTENCE_READ_ONLY           ((psa_key_persistence_t)0xff)
1599 
1600 #define PSA_KEY_LIFETIME_GET_PERSISTENCE(lifetime)      \
1601     ((psa_key_persistence_t)((lifetime) & 0x000000ff))
1602 
1603 #define PSA_KEY_LIFETIME_GET_LOCATION(lifetime)      \
1604     ((psa_key_location_t)((lifetime) >> 8))
1605 
1606 /** Whether a key lifetime indicates that the key is volatile.
1607  *
1608  * A volatile key is automatically destroyed by the implementation when
1609  * the application instance terminates. In particular, a volatile key
1610  * is automatically destroyed on a power reset of the device.
1611  *
1612  * A key that is not volatile is persistent. Persistent keys are
1613  * preserved until the application explicitly destroys them or until an
1614  * implementation-specific device management event occurs (for example,
1615  * a factory reset).
1616  *
1617  * \param lifetime      The lifetime value to query (value of type
1618  *                      ::psa_key_lifetime_t).
1619  *
1620  * \return \c 1 if the key is volatile, otherwise \c 0.
1621  */
1622 #define PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)  \
1623     (PSA_KEY_LIFETIME_GET_PERSISTENCE(lifetime) == \
1624      PSA_KEY_PERSISTENCE_VOLATILE)
1625 
1626 /** Construct a lifetime from a persistence level and a location.
1627  *
1628  * \param persistence   The persistence level
1629  *                      (value of type ::psa_key_persistence_t).
1630  * \param location      The location indicator
1631  *                      (value of type ::psa_key_location_t).
1632  *
1633  * \return The constructed lifetime value.
1634  */
1635 #define PSA_KEY_LIFETIME_FROM_PERSISTENCE_AND_LOCATION(persistence, location) \
1636     ((location) << 8 | (persistence))
1637 
1638 /** The local storage area for persistent keys.
1639  *
1640  * This storage area is available on all systems that can store persistent
1641  * keys without delegating the storage to a third-party cryptoprocessor.
1642  *
1643  * See ::psa_key_location_t for more information.
1644  */
1645 #define PSA_KEY_LOCATION_LOCAL_STORAGE          ((psa_key_location_t)0x000000)
1646 
1647 #define PSA_KEY_LOCATION_VENDOR_FLAG            ((psa_key_location_t)0x800000)
1648 
1649 /** The minimum value for a key identifier chosen by the application.
1650  */
1651 #define PSA_KEY_ID_USER_MIN                     ((psa_key_id_t)0x00000001)
1652 /** The maximum value for a key identifier chosen by the application.
1653  */
1654 #define PSA_KEY_ID_USER_MAX                     ((psa_key_id_t)0x3fffffff)
1655 /** The minimum value for a key identifier chosen by the implementation.
1656  */
1657 #define PSA_KEY_ID_VENDOR_MIN                   ((psa_key_id_t)0x40000000)
1658 /** The maximum value for a key identifier chosen by the implementation.
1659  */
1660 #define PSA_KEY_ID_VENDOR_MAX                   ((psa_key_id_t)0x7fffffff)
1661 
1662 
1663 #if !defined(MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER)
1664 
1665 #define MBEDTLS_SVC_KEY_ID_INIT ( (psa_key_id_t)0 )
1666 #define MBEDTLS_SVC_KEY_ID_GET_KEY_ID( id ) ( id )
1667 #define MBEDTLS_SVC_KEY_ID_GET_OWNER_ID( id ) ( 0 )
1668 
1669 /** Utility to initialize a key identifier at runtime.
1670  *
1671  * \param unused  Unused parameter.
1672  * \param key_id  Identifier of the key.
1673  */
mbedtls_svc_key_id_make(unsigned int unused,psa_key_id_t key_id)1674 static inline mbedtls_svc_key_id_t mbedtls_svc_key_id_make(
1675     unsigned int unused, psa_key_id_t key_id )
1676 {
1677     (void)unused;
1678 
1679     return( key_id );
1680 }
1681 
1682 /** Compare two key identifiers.
1683  *
1684  * \param id1 First key identifier.
1685  * \param id2 Second key identifier.
1686  *
1687  * \return Non-zero if the two key identifier are equal, zero otherwise.
1688  */
mbedtls_svc_key_id_equal(mbedtls_svc_key_id_t id1,mbedtls_svc_key_id_t id2)1689 static inline int mbedtls_svc_key_id_equal( mbedtls_svc_key_id_t id1,
1690                                             mbedtls_svc_key_id_t id2 )
1691 {
1692     return( id1 == id2 );
1693 }
1694 
1695 /** Check whether a key identifier is null.
1696  *
1697  * \param key Key identifier.
1698  *
1699  * \return Non-zero if the key identifier is null, zero otherwise.
1700  */
mbedtls_svc_key_id_is_null(mbedtls_svc_key_id_t key)1701 static inline int mbedtls_svc_key_id_is_null( mbedtls_svc_key_id_t key )
1702 {
1703     return( key == 0 );
1704 }
1705 
1706 #else /* MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER */
1707 
1708 #define MBEDTLS_SVC_KEY_ID_INIT ( (mbedtls_svc_key_id_t){ 0, 0 } )
1709 #define MBEDTLS_SVC_KEY_ID_GET_KEY_ID( id ) ( ( id ).key_id )
1710 #define MBEDTLS_SVC_KEY_ID_GET_OWNER_ID( id ) ( ( id ).owner )
1711 
1712 /** Utility to initialize a key identifier at runtime.
1713  *
1714  * \param owner_id Identifier of the key owner.
1715  * \param key_id   Identifier of the key.
1716  */
mbedtls_svc_key_id_make(mbedtls_key_owner_id_t owner_id,psa_key_id_t key_id)1717 static inline mbedtls_svc_key_id_t mbedtls_svc_key_id_make(
1718     mbedtls_key_owner_id_t owner_id, psa_key_id_t key_id )
1719 {
1720     return( (mbedtls_svc_key_id_t){ .key_id = key_id,
1721                                     .owner = owner_id } );
1722 }
1723 
1724 /** Compare two key identifiers.
1725  *
1726  * \param id1 First key identifier.
1727  * \param id2 Second key identifier.
1728  *
1729  * \return Non-zero if the two key identifier are equal, zero otherwise.
1730  */
mbedtls_svc_key_id_equal(mbedtls_svc_key_id_t id1,mbedtls_svc_key_id_t id2)1731 static inline int mbedtls_svc_key_id_equal( mbedtls_svc_key_id_t id1,
1732                                             mbedtls_svc_key_id_t id2 )
1733 {
1734     return( ( id1.key_id == id2.key_id ) &&
1735             mbedtls_key_owner_id_equal( id1.owner, id2.owner ) );
1736 }
1737 
1738 /** Check whether a key identifier is null.
1739  *
1740  * \param key Key identifier.
1741  *
1742  * \return Non-zero if the key identifier is null, zero otherwise.
1743  */
mbedtls_svc_key_id_is_null(mbedtls_svc_key_id_t key)1744 static inline int mbedtls_svc_key_id_is_null( mbedtls_svc_key_id_t key )
1745 {
1746     return( ( key.key_id == 0 ) && ( key.owner == 0 ) );
1747 }
1748 
1749 #endif /* !MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER */
1750 
1751 /**@}*/
1752 
1753 /** \defgroup policy Key policies
1754  * @{
1755  */
1756 
1757 /** Whether the key may be exported.
1758  *
1759  * A public key or the public part of a key pair may always be exported
1760  * regardless of the value of this permission flag.
1761  *
1762  * If a key does not have export permission, implementations shall not
1763  * allow the key to be exported in plain form from the cryptoprocessor,
1764  * whether through psa_export_key() or through a proprietary interface.
1765  * The key may however be exportable in a wrapped form, i.e. in a form
1766  * where it is encrypted by another key.
1767  */
1768 #define PSA_KEY_USAGE_EXPORT                    ((psa_key_usage_t)0x00000001)
1769 
1770 /** Whether the key may be copied.
1771  *
1772  * This flag allows the use of psa_copy_key() to make a copy of the key
1773  * with the same policy or a more restrictive policy.
1774  *
1775  * For lifetimes for which the key is located in a secure element which
1776  * enforce the non-exportability of keys, copying a key outside the secure
1777  * element also requires the usage flag #PSA_KEY_USAGE_EXPORT.
1778  * Copying the key inside the secure element is permitted with just
1779  * #PSA_KEY_USAGE_COPY if the secure element supports it.
1780  * For keys with the lifetime #PSA_KEY_LIFETIME_VOLATILE or
1781  * #PSA_KEY_LIFETIME_PERSISTENT, the usage flag #PSA_KEY_USAGE_COPY
1782  * is sufficient to permit the copy.
1783  */
1784 #define PSA_KEY_USAGE_COPY                      ((psa_key_usage_t)0x00000002)
1785 
1786 /** Whether the key may be used to encrypt a message.
1787  *
1788  * This flag allows the key to be used for a symmetric encryption operation,
1789  * for an AEAD encryption-and-authentication operation,
1790  * or for an asymmetric encryption operation,
1791  * if otherwise permitted by the key's type and policy.
1792  *
1793  * For a key pair, this concerns the public key.
1794  */
1795 #define PSA_KEY_USAGE_ENCRYPT                   ((psa_key_usage_t)0x00000100)
1796 
1797 /** Whether the key may be used to decrypt a message.
1798  *
1799  * This flag allows the key to be used for a symmetric decryption operation,
1800  * for an AEAD decryption-and-verification operation,
1801  * or for an asymmetric decryption operation,
1802  * if otherwise permitted by the key's type and policy.
1803  *
1804  * For a key pair, this concerns the private key.
1805  */
1806 #define PSA_KEY_USAGE_DECRYPT                   ((psa_key_usage_t)0x00000200)
1807 
1808 /** Whether the key may be used to sign a message.
1809  *
1810  * This flag allows the key to be used for a MAC calculation operation
1811  * or for an asymmetric signature operation,
1812  * if otherwise permitted by the key's type and policy.
1813  *
1814  * For a key pair, this concerns the private key.
1815  */
1816 #define PSA_KEY_USAGE_SIGN_HASH                 ((psa_key_usage_t)0x00001000)
1817 
1818 /** Whether the key may be used to verify a message signature.
1819  *
1820  * This flag allows the key to be used for a MAC verification operation
1821  * or for an asymmetric signature verification operation,
1822  * if otherwise permitted by by the key's type and policy.
1823  *
1824  * For a key pair, this concerns the public key.
1825  */
1826 #define PSA_KEY_USAGE_VERIFY_HASH               ((psa_key_usage_t)0x00002000)
1827 
1828 /** Whether the key may be used to derive other keys.
1829  */
1830 #define PSA_KEY_USAGE_DERIVE                    ((psa_key_usage_t)0x00004000)
1831 
1832 /**@}*/
1833 
1834 /** \defgroup derivation Key derivation
1835  * @{
1836  */
1837 
1838 /** A secret input for key derivation.
1839  *
1840  * This should be a key of type #PSA_KEY_TYPE_DERIVE
1841  * (passed to psa_key_derivation_input_key())
1842  * or the shared secret resulting from a key agreement
1843  * (obtained via psa_key_derivation_key_agreement()).
1844  *
1845  * The secret can also be a direct input (passed to
1846  * key_derivation_input_bytes()). In this case, the derivation operation
1847  * may not be used to derive keys: the operation will only allow
1848  * psa_key_derivation_output_bytes(), not psa_key_derivation_output_key().
1849  */
1850 #define PSA_KEY_DERIVATION_INPUT_SECRET     ((psa_key_derivation_step_t)0x0101)
1851 
1852 /** A label for key derivation.
1853  *
1854  * This should be a direct input.
1855  * It can also be a key of type #PSA_KEY_TYPE_RAW_DATA.
1856  */
1857 #define PSA_KEY_DERIVATION_INPUT_LABEL      ((psa_key_derivation_step_t)0x0201)
1858 
1859 /** A salt for key derivation.
1860  *
1861  * This should be a direct input.
1862  * It can also be a key of type #PSA_KEY_TYPE_RAW_DATA.
1863  */
1864 #define PSA_KEY_DERIVATION_INPUT_SALT       ((psa_key_derivation_step_t)0x0202)
1865 
1866 /** An information string for key derivation.
1867  *
1868  * This should be a direct input.
1869  * It can also be a key of type #PSA_KEY_TYPE_RAW_DATA.
1870  */
1871 #define PSA_KEY_DERIVATION_INPUT_INFO       ((psa_key_derivation_step_t)0x0203)
1872 
1873 /** A seed for key derivation.
1874  *
1875  * This should be a direct input.
1876  * It can also be a key of type #PSA_KEY_TYPE_RAW_DATA.
1877  */
1878 #define PSA_KEY_DERIVATION_INPUT_SEED       ((psa_key_derivation_step_t)0x0204)
1879 
1880 /**@}*/
1881 
1882 #endif /* PSA_CRYPTO_VALUES_H */
1883