Toggle navigation
Documentation
The friendly Operating System for the Internet of Things
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
crypto_values.h
Value definitions for PSA Crypto.
kernel_defines.h
Common macros and compiler attributes/pragmas configuration.
Generated on Thu Jun 26 2025 14:14:46 by
1.9.1