crypto_sizes.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2021 HAW Hamburg
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser
5  * General Public License v2.1. See the file LICENSE in the top level
6  * directory for more details.
7  */
8 
9 #pragma once
10 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
31 #include "kernel_defines.h"
32 #include "crypto_values.h"
33 
41 #define PSA_BITS_TO_BYTES(bits) (size_t)(((bits) + 7) / 8)
42 
50 #define PSA_BYTES_TO_BITS(bytes) ((bytes) * 8)
51 
59 #if (IS_USED(MODULE_PSA_MAC_HMAC_SHA_256))
60 #define CONFIG_PSA_MAX_KEY_SIZE 64
61 #elif (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P256R1) || \
62  IS_USED(MODULE_PSA_ASYMMETRIC_ECC_ED25519) || \
63  IS_USED(MODULE_PSA_CIPHER_AES_256_CBC) || \
64  IS_USED(MODULE_PSA_AEAD_AES_256_CCM) || \
65  IS_USED(MODULE_PSA_SECURE_ELEMENT_ATECCX08A_ECC_P256) || \
66  IS_USED(MODULE_PSA_CIPHER_CHACHA20))
67 #define CONFIG_PSA_MAX_KEY_SIZE 32
68 #elif (IS_USED(MODULE_PSA_CIPHER_AES_192_CBC) || \
69  IS_USED(MODULE_PSA_AEAD_AES_192_CCM) || \
70  IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P192R1))
71 #define CONFIG_PSA_MAX_KEY_SIZE 24
72 #elif (IS_USED(MODULE_PSA_CIPHER_AES_128_CBC)) || \
73  (IS_USED(MODULE_PSA_AEAD_AES_128_CCM)) || \
74  (IS_USED(MODULE_PSA_CIPHER_AES_128_ECB))
75 #define CONFIG_PSA_MAX_KEY_SIZE 16
76 #else
77 #define CONFIG_PSA_MAX_KEY_SIZE 0
78 #endif
79 
86 #ifndef CONFIG_PSA_ASYMMETRIC_KEYPAIR_COUNT
87 #define CONFIG_PSA_ASYMMETRIC_KEYPAIR_COUNT 0
88 #endif
89 
96 #ifndef CONFIG_PSA_SINGLE_KEY_COUNT
97 #define CONFIG_PSA_SINGLE_KEY_COUNT 0
98 #endif
99 
106 #ifndef CONFIG_PSA_PROTECTED_KEY_COUNT
107 #if (IS_USED(MODULE_PSA_SECURE_ELEMENT))
108 #define CONFIG_PSA_PROTECTED_KEY_COUNT 5
109 #else
110 #define CONFIG_PSA_PROTECTED_KEY_COUNT 0
111 #endif
112 #endif
113 
126 #define PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE(ciphertext_length) \
127 /* implementation-defined value */
128 
148 #define PSA_AEAD_TAG_LENGTH(key_type, key_bits, alg) \
149  (PSA_ALG_IS_AEAD(alg) ? \
150  (((alg) & 0x003f0000) >> 16) : \
151  ((void) (key_type), (void) (key_bits), 0))
152 
162 #define PSA_AEAD_TAG_MAX_SIZE (16)
163 
173 #define PSA_AES_CCM_TAG_MAX_SIZE (16)
174 
193 #define PSA_AEAD_DECRYPT_OUTPUT_SIZE(key_type, alg, ciphertext_length) \
194  (PSA_AEAD_NONCE_LENGTH(key_type, alg) != 0 && \
195  ((ciphertext_length) > PSA_AEAD_TAG_LENGTH(key_type, 0, alg)) ? \
196  (ciphertext_length) - PSA_AEAD_TAG_LENGTH(key_type, 0, alg) : 0)
197 
210 #define PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE(plaintext_length) \
211  ((plaintext_length) + PSA_AEAD_TAG_MAX_SIZE)
212 
231 #define PSA_AEAD_ENCRYPT_OUTPUT_SIZE(key_type, alg, plaintext_length) \
232  (PSA_AEAD_NONCE_LENGTH(key_type, alg) != 0 ? \
233  (plaintext_length) + PSA_AEAD_TAG_LENGTH(key_type, 0, alg) : 0)
234 
244 #define PSA_AEAD_FINISH_OUTPUT_MAX_SIZE /* implementation-defined value */
245 
264 #define PSA_AEAD_FINISH_OUTPUT_SIZE(key_type, alg) \
265 /* implementation-defined value */
266 
286 #define PSA_AEAD_NONCE_LENGTH(key_type, alg) \
287  ((PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) == 16 && \
288  ((PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG(alg) == PSA_ALG_CCM) || \
289  (PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG(alg) == PSA_ALG_CCM))) || \
290  (key_type == PSA_KEY_TYPE_CHACHA20 && \
291  PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG(alg) == PSA_ALG_CHACHA20_POLY1305) ? \
292  12 : 0)
293 
303 #define PSA_AEAD_NONCE_MAX_SIZE (13)
304 
316 #define PSA_AEAD_UPDATE_OUTPUT_MAX_SIZE(input_length) \
317 /* implementation-defined value */
318 
337 #define PSA_AEAD_UPDATE_OUTPUT_SIZE(key_type, alg, input_length) \
338 /* implementation-defined value */
339 
351 #define PSA_AEAD_VERIFY_OUTPUT_MAX_SIZE /* implementation-defined value */
352 
370 #define PSA_AEAD_VERIFY_OUTPUT_SIZE(key_type, alg) \
371 /* implementation-defined value */
372 
378 #define PSA_HASH_MAX_SIZE (64)
379 
385 #if (IS_USED(MODULE_PSA_HASH_SHA3_256))
386 #define PSA_HASH_MAX_BLOCK_SIZE 136
387 #elif (IS_USED(MODULE_PSA_HASH_SHA_512) || \
388  IS_USED(MODULE_PSA_HASH_SHA_384) || \
389  IS_USED(MODULE_PSA_HASH_SHA_512_224) || \
390  IS_USED(MODULE_PSA_HASH_SHA_512_256))
391 #define PSA_HASH_MAX_BLOCK_SIZE 128
392 #elif (IS_USED(MODULE_PSA_HASH_SHA3_384))
393 #define PSA_HASH_MAX_BLOCK_SIZE 104
394 #elif (IS_USED(MODULE_PSA_HASH_SHA3_512))
395 #define PSA_HASH_MAX_BLOCK_SIZE 72
396 #elif (IS_USED(MODULE_PSA_HASH_MD5) || \
397  IS_USED(MODULE_PSA_HASH_SHA_1) || \
398  IS_USED(MODULE_PSA_HASH_SHA_224) || \
399  IS_USED(MODULE_PSA_HASH_SHA_256))
400 #define PSA_HASH_MAX_BLOCK_SIZE 64
401 #else
402 #define PSA_HASH_MAX_BLOCK_SIZE 0
403 #endif
404 
421 #define PSA_HASH_BLOCK_LENGTH(alg) \
422  ( \
423  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD2 ? 16 : \
424  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD4 ? 64 : \
425  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD5 ? 64 : \
426  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_RIPEMD160 ? 64 : \
427  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_1 ? 64 : \
428  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_224 ? 64 : \
429  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_256 ? 64 : \
430  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_384 ? 128 : \
431  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512 ? 128 : \
432  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_224 ? 128 : \
433  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_256 ? 128 : \
434  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_224 ? 144 : \
435  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_256 ? 136 : \
436  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_384 ? 104 : \
437  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_512 ? 72 : \
438  0)
439 
454 #define PSA_HASH_LENGTH(alg) \
455  ( \
456  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD2 ? 16 : \
457  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD4 ? 16 : \
458  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD5 ? 16 : \
459  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_RIPEMD160 ? 20 : \
460  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_1 ? 20 : \
461  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_224 ? 28 : \
462  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_256 ? 32 : \
463  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_384 ? 48 : \
464  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512 ? 64 : \
465  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_224 ? 28 : \
466  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_256 ? 32 : \
467  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_224 ? 28 : \
468  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_256 ? 32 : \
469  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_384 ? 48 : \
470  PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_512 ? 64 : \
471  0)
472 
495 #define PSA_MAC_LENGTH(key_type, key_bits, alg) \
496  ((PSA_ALG_IS_HMAC(alg)) ? PSA_HASH_LENGTH(PSA_ALG_HMAC_GET_HASH(alg)) : \
497  PSA_ALG_IS_BLOCK_CIPHER_MAC(alg) ? PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) : \
498  ((void)(key_type), (void)(key_bits), 0))
499 
510 #if (IS_USED(MODULE_PSA_MAC_HMAC_SHA_512) || \
511  IS_USED(MODULE_PSA_MAC_HMAC_SHA3_512))
512 #define PSA_MAC_MAX_SIZE (PSA_HASH_LENGTH(PSA_ALG_SHA3_512)) /* 64 */
513 #elif (IS_USED(MODULE_PSA_MAC_HMAC_SHA_384) || \
514  IS_USED(MODULE_PSA_MAC_HMAC_SHA3_384))
515 #define PSA_MAC_MAX_SIZE (PSA_HASH_LENGTH(PSA_ALG_SHA3_384)) /* 48 */
516 #elif (IS_USED(MODULE_PSA_MAC_HMAC_SHA_256) || \
517  IS_USED(MODULE_PSA_MAC_HMAC_SHA_512_256) || \
518  IS_USED(MODULE_PSA_MAC_HMAC_SHA3_256))
519 #define PSA_MAC_MAX_SIZE (PSA_HASH_LENGTH(PSA_ALG_SHA3_256)) /* 32 */
520 #elif (IS_USED(MODULE_PSA_MAC_HMAC_SHA_224) || \
521  IS_USED(MODULE_PSA_MAC_HMAC_SHA_512_224) || \
522  IS_USED(MODULE_PSA_MAC_HMAC_SHA3_224))
523 #define PSA_MAC_MAX_SIZE (PSA_HASH_LENGTH(PSA_ALG_SHA3_224)) /* 28 */
524 #elif (IS_USED(MODULE_PSA_MAC_HMAC_RIPEMD160) || \
525  IS_USED(MODULE_PSA_MAC_HMAC_SHA_1))
526 #define PSA_MAC_MAX_SIZE (PSA_HASH_LENGTH(PSA_ALG_SHA_1)) /* 20 */
527 #elif (IS_USED(MODULE_PSA_MAC_HMAC_MD2) || \
528  IS_USED(MODULE_PSA_MAC_HMAC_MD4) || \
529  IS_USED(MODULE_PSA_MAC_HMAC_MD5))
530 #define PSA_MAC_MAX_SIZE (PSA_HASH_LENGTH(PSA_ALG_MD5)) /* 16 */
531 #else
532 #define PSA_MAC_MAX_SIZE 0
533 #endif
534 
547 #define PSA_BLOCK_CIPHER_BLOCK_LENGTH(type) \
548  (1u << (((type) >> 8) & 7))
549 
555 #define PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE /* implementation-defined value */
556 
568 #define PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE(input_length) \
569  (input_length)
570 
589 #define PSA_CIPHER_DECRYPT_OUTPUT_SIZE(key_type, alg, input_length) \
590  (input_length - PSA_CIPHER_IV_LENGTH(key_type, alg))
591 
603 #define PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE(input_length) \
604  (PSA_CIPHER_ENCRYPT_OUTPUT_SIZE(PSA_KEY_TYPE_AES, PSA_ALG_CBC_NO_PADDING, input_length))
605 
624 #define PSA_CIPHER_ENCRYPT_OUTPUT_SIZE(key_type, alg, input_length) \
625  (input_length + PSA_CIPHER_IV_LENGTH(key_type, alg))
626 
636 #define PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE /* implementation-defined value */
637 
655 #define PSA_CIPHER_FINISH_OUTPUT_SIZE(key_type, alg) \
656 /* implementation-defined value */
657 
684 #define PSA_CIPHER_IV_LENGTH(key_type, alg) \
685  ((PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) > 1 && \
686  ((alg) == PSA_ALG_CBC_NO_PADDING)) ? 16 : \
687  (key_type == PSA_KEY_TYPE_CHACHA20) ? 12 : 0)
688 
698 #define PSA_CIPHER_IV_MAX_SIZE /* implementation-defined value */
699 
712 #define PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE(input_length) \
713 /* implementation-defined value */
714 
734 #define PSA_CIPHER_UPDATE_OUTPUT_SIZE(key_type, alg, input_length) \
735 /* implementation-defined value */
736 
744 #define PSA_HASH_SUSPEND_ALGORITHM_FIELD_LENGTH ((size_t)4)
745 
760 #define PSA_HASH_SUSPEND_HASH_STATE_FIELD_LENGTH(alg) \
761 /* specification-defined value */
762 
777 #define PSA_HASH_SUSPEND_INPUT_LENGTH_FIELD_LENGTH(alg) \
778 /* specification-defined value */
779 
789 #define PSA_HASH_SUSPEND_OUTPUT_MAX_SIZE /* implementation-defined value */
790 
815 #define PSA_HASH_SUSPEND_OUTPUT_SIZE(alg) /* specification-defined value */
816 
826 #define PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE \
827 /* implementation-defined value */
828 
848 #define PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(key_type, key_bits, alg) \
849 /* implementation-defined value */
850 
860 #define PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE /* implementation-defined value */
861 
881 #define PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(key_type, key_bits, alg) \
882 /* implementation-defined value */
883 
894 #define PSA_KEY_EXPORT_ECC_KEY_MAX_SIZE(key_type, key_bits) \
895  (size_t)\
896  (PSA_KEY_TYPE_ECC_GET_FAMILY(key_type) == PSA_ECC_FAMILY_TWISTED_EDWARDS ? 32 : \
897  (PSA_KEY_TYPE_ECC_GET_FAMILY(key_type) == PSA_ECC_FAMILY_SECP_R1 ? \
898  PSA_BITS_TO_BYTES(key_bits) : \
899  0))
900 
937 #define PSA_EXPORT_KEY_OUTPUT_SIZE(key_type, key_bits) \
938  (PSA_KEY_TYPE_IS_PUBLIC_KEY(key_type) ? \
939  PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(key_type, key_bits) : \
940  (PSA_KEY_TYPE_IS_ECC(key_type) ? \
941  PSA_KEY_EXPORT_ECC_KEY_MAX_SIZE(key_type, key_bits) : \
942  0))
943 
950 #define PSA_ECC_KEY_SIZE_IS_VALID(type, bits) \
951  (PSA_KEY_TYPE_ECC_GET_FAMILY(type) == PSA_ECC_FAMILY_TWISTED_EDWARDS ? \
952  (bits == 255) : \
953  (PSA_KEY_TYPE_ECC_GET_FAMILY(type) == PSA_ECC_FAMILY_SECP_R1 ? \
954  (bits == 128 || \
955  bits == 192 || \
956  bits == 224 || \
957  bits == 256 || \
958  bits == 384) : \
959  0))
960 
964 #define PSA_MAX_PRIV_KEY_SIZE (PSA_BYTES_TO_BITS(CONFIG_PSA_MAX_KEY_SIZE))
965 
975 #if (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P256R1) || \
976  IS_USED(MODULE_PSA_SECURE_ELEMENT_ATECCX08A_ECC_P256))
977 #define PSA_EXPORT_KEY_PAIR_MAX_SIZE \
978  (PSA_EXPORT_KEY_OUTPUT_SIZE(PSA_ECC_FAMILY_SECT_R1, 256))
979 #elif (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_ED25519))
980 #define PSA_EXPORT_KEY_PAIR_MAX_SIZE \
981  (PSA_EXPORT_KEY_OUTPUT_SIZE(PSA_ECC_FAMILY_TWISTED_EDWARDS, 255))
982 #elif (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P192R1))
983 #define PSA_EXPORT_KEY_PAIR_MAX_SIZE \
984  (PSA_EXPORT_KEY_OUTPUT_SIZE(PSA_ECC_FAMILY_SECT_R1, 192))
985 #else
986 #define PSA_EXPORT_KEY_PAIR_MAX_SIZE 0
987 #endif
988 
1001 #define PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(key_type, key_bits) \
1002  (PSA_KEY_TYPE_ECC_GET_FAMILY(key_type) == PSA_ECC_FAMILY_TWISTED_EDWARDS ? 32 : \
1003  ((size_t)(2 * PSA_BITS_TO_BYTES(key_bits) + 1)))
1004 
1045 #define PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(key_type, key_bits) \
1046  (PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(key_type, key_bits) : \
1047  0)
1048 
1059 #if (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P256R1) || \
1060  IS_USED(MODULE_PSA_SECURE_ELEMENT_ATECCX08A_ECC_P256))
1061 #define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE \
1062  (PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(PSA_ECC_FAMILY_SECT_R1, 256))
1063 #elif (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P192R1))
1064 #define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE \
1065  (PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(PSA_ECC_FAMILY_SECT_R1, 192))
1066 #elif (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_ED25519))
1067 #define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE \
1068  (PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(PSA_ECC_FAMILY_TWISTED_EDWARDS, 255))
1069 #else
1070 #define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE 0
1071 #endif
1072 
1078 #define PSA_MAX_PRIV_KEY_BUFFER_SIZE (PSA_BITS_TO_BYTES(PSA_MAX_PRIV_KEY_SIZE))
1079 
1083 #define PSA_MAX_ASYMMETRIC_KEYPAIR_SIZE (PSA_BITS_TO_BYTES(PSA_MAX_PRIV_KEY_SIZE) + \
1084  PSA_EXPORT_PUBLIC_KEY_MAX_SIZE)
1085 
1089 #if IS_USED(MODULE_PSA_ASYMMETRIC)
1090 #define PSA_MAX_KEY_DATA_SIZE (PSA_EXPORT_PUBLIC_KEY_MAX_SIZE)
1091 #else
1092 #define PSA_MAX_KEY_DATA_SIZE (CONFIG_PSA_MAX_KEY_SIZE)
1093 #endif
1094 
1098 #define PSA_MAX_UNSTRUCTURED_KEY_SIZE (CONFIG_PSA_MAX_KEY_SIZE)
1099 
1109 #define PSA_ECDSA_SIGNATURE_SIZE(curve_bits) \
1110  ((size_t)(PSA_BITS_TO_BYTES(curve_bits) * 2))
1111 
1130 #define PSA_SIGN_OUTPUT_SIZE(key_type, key_bits, alg) \
1131  (PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_ECDSA_SIGNATURE_SIZE(key_bits) : \
1132  ((void)alg, 0))
1133 
1134 #ifdef __cplusplus
1135 }
1136 #endif
1137 
Value definitions for PSA Crypto.
Common macros and compiler attributes/pragmas configuration.