Loading...
Searching...
No Matches
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
25#ifndef PSA_CRYPTO_PSA_CRYPTO_SIZES_H
26#define PSA_CRYPTO_PSA_CRYPTO_SIZES_H
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32#include "kernel_defines.h"
33#include "crypto_values.h"
34
42#define PSA_BITS_TO_BYTES(bits) (size_t)(((bits) + 7) / 8)
43
51#define PSA_BYTES_TO_BITS(bytes) ((bytes) * 8)
52
60#if (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P256R1) || \
61 IS_USED(MODULE_PSA_ASYMMETRIC_ECC_ED25519) || \
62 IS_USED(MODULE_PSA_CIPHER_AES_256_CBC) || \
63 IS_USED(MODULE_PSA_MAC_HMAC_SHA_256) || \
64 IS_USED(MODULE_PSA_SECURE_ELEMENT_ATECCX08A_ECC_P256))
65#define CONFIG_PSA_MAX_KEY_SIZE 32
66#elif (IS_USED(MODULE_PSA_CIPHER_AES_192_CBC) || \
67 IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P192R1))
68#define CONFIG_PSA_MAX_KEY_SIZE 24
69#elif (IS_USED(MODULE_PSA_CIPHER_AES_128_CBC)) || \
70 (IS_USED(MODULE_PSA_CIPHER_AES_128_ECB))
71#define CONFIG_PSA_MAX_KEY_SIZE 16
72#else
73#define CONFIG_PSA_MAX_KEY_SIZE 0
74#endif
75
82#ifndef CONFIG_PSA_ASYMMETRIC_KEYPAIR_COUNT
83#define CONFIG_PSA_ASYMMETRIC_KEYPAIR_COUNT 0
84#endif
85
92#ifndef CONFIG_PSA_SINGLE_KEY_COUNT
93#define CONFIG_PSA_SINGLE_KEY_COUNT 0
94#endif
95
102#ifndef CONFIG_PSA_PROTECTED_KEY_COUNT
103#if (IS_USED(MODULE_PSA_SECURE_ELEMENT))
104#define CONFIG_PSA_PROTECTED_KEY_COUNT 5
105#else
106#define CONFIG_PSA_PROTECTED_KEY_COUNT 0
107#endif
108#endif
109
122#define PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE(ciphertext_length) \
123/* implementation-defined value */
124
143#define PSA_AEAD_DECRYPT_OUTPUT_SIZE(key_type, alg, ciphertext_length) \
144/* implementation-defined value */
145
158#define PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE(plaintext_length) \
159/* implementation-defined value */
160
179#define PSA_AEAD_ENCRYPT_OUTPUT_SIZE(key_type, alg, plaintext_length) \
180/* implementation-defined value */
181
191#define PSA_AEAD_FINISH_OUTPUT_MAX_SIZE /* implementation-defined value */
192
211#define PSA_AEAD_FINISH_OUTPUT_SIZE(key_type, alg) \
212/* implementation-defined value */
213
233#define PSA_AEAD_NONCE_LENGTH(key_type, alg) /* implementation-defined value */
234
244#define PSA_AEAD_NONCE_MAX_SIZE /* implementation-defined value */
245
265#define PSA_AEAD_TAG_LENGTH(key_type, key_bits, alg) \
266/* implementation-defined value */
267
277#define PSA_AEAD_TAG_MAX_SIZE /* implementation-defined value */
278
290#define PSA_AEAD_UPDATE_OUTPUT_MAX_SIZE(input_length) \
291/* implementation-defined value */
292
311#define PSA_AEAD_UPDATE_OUTPUT_SIZE(key_type, alg, input_length) \
312/* implementation-defined value */
313
325#define PSA_AEAD_VERIFY_OUTPUT_MAX_SIZE /* implementation-defined value */
326
344#define PSA_AEAD_VERIFY_OUTPUT_SIZE(key_type, alg) \
345/* implementation-defined value */
346
352#define PSA_HASH_MAX_SIZE (64)
353
370#define PSA_HASH_BLOCK_LENGTH(alg) \
371 ( \
372 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD2 ? 16 : \
373 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD4 ? 64 : \
374 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD5 ? 64 : \
375 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_RIPEMD160 ? 64 : \
376 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_1 ? 64 : \
377 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_224 ? 64 : \
378 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_256 ? 64 : \
379 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_384 ? 128 : \
380 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512 ? 128 : \
381 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_224 ? 128 : \
382 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_256 ? 128 : \
383 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_224 ? 144 : \
384 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_256 ? 136 : \
385 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_384 ? 104 : \
386 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_512 ? 72 : \
387 0)
388
403#define PSA_HASH_LENGTH(alg) \
404 ( \
405 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD2 ? 16 : \
406 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD4 ? 16 : \
407 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD5 ? 16 : \
408 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_RIPEMD160 ? 20 : \
409 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_1 ? 20 : \
410 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_224 ? 28 : \
411 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_256 ? 32 : \
412 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_384 ? 48 : \
413 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512 ? 64 : \
414 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_224 ? 28 : \
415 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_256 ? 32 : \
416 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_224 ? 28 : \
417 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_256 ? 32 : \
418 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_384 ? 48 : \
419 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_512 ? 64 : \
420 0)
421
444#define PSA_MAC_LENGTH(key_type, key_bits, alg) \
445 ((PSA_ALG_IS_HMAC(alg)) ? PSA_HASH_LENGTH(PSA_ALG_HMAC_GET_HASH(alg)) : \
446 PSA_ALG_IS_BLOCK_CIPHER_MAC(alg) ? PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) : \
447 ((void)(key_type), (void)(key_bits), 0))
448
459#if (IS_USED(MODULE_PSA_MAC_HMAC_SHA_512) || \
460 IS_USED(MODULE_PSA_MAC_HMAC_SHA3_512))
461#define PSA_MAC_MAX_SIZE (PSA_HASH_LENGTH(PSA_ALG_SHA3_512)) /* 64 */
462#elif (IS_USED(MODULE_PSA_MAC_HMAC_SHA_384) || \
463 IS_USED(MODULE_PSA_MAC_HMAC_SHA3_384))
464#define PSA_MAC_MAX_SIZE (PSA_HASH_LENGTH(PSA_ALG_SHA3_384)) /* 48 */
465#elif (IS_USED(MODULE_PSA_MAC_HMAC_SHA_256) || \
466 IS_USED(MODULE_PSA_MAC_HMAC_SHA_512_256) || \
467 IS_USED(MODULE_PSA_MAC_HMAC_SHA3_256))
468#define PSA_MAC_MAX_SIZE (PSA_HASH_LENGTH(PSA_ALG_SHA3_256)) /* 32 */
469#elif (IS_USED(MODULE_PSA_MAC_HMAC_SHA_224) || \
470 IS_USED(MODULE_PSA_MAC_HMAC_SHA_512_224) || \
471 IS_USED(MODULE_PSA_MAC_HMAC_SHA3_224))
472#define PSA_MAC_MAX_SIZE (PSA_HASH_LENGTH(PSA_ALG_SHA3_224)) /* 28 */
473#elif (IS_USED(MODULE_PSA_MAC_HMAC_RIPEMD160) || \
474 IS_USED(MODULE_PSA_MAC_HMAC_SHA_1))
475#define PSA_MAC_MAX_SIZE (PSA_HASH_LENGTH(PSA_ALG_SHA_1)) /* 20 */
476#elif (IS_USED(MODULE_PSA_MAC_HMAC_MD2) || \
477 IS_USED(MODULE_PSA_MAC_HMAC_MD4) || \
478 IS_USED(MODULE_PSA_MAC_HMAC_MD5))
479#define PSA_MAC_MAX_SIZE (PSA_HASH_LENGTH(PSA_ALG_MD5)) /* 16 */
480#else
481#define PSA_MAC_MAX_SIZE 0
482#endif
483
496#define PSA_BLOCK_CIPHER_BLOCK_LENGTH(type) \
497 (1u << (((type) >> 8) & 7))
498
504#define PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE /* implementation-defined value */
505
517#define PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE(input_length) \
518 (input_length)
519
538#define PSA_CIPHER_DECRYPT_OUTPUT_SIZE(key_type, alg, input_length) \
539 (input_length - PSA_CIPHER_IV_LENGTH(key_type, alg))
540
552#define PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE(input_length) \
553 (PSA_CIPHER_ENCRYPT_OUTPUT_SIZE(PSA_KEY_TYPE_AES, PSA_ALG_CBC_NO_PADDING, input_length))
554
573#define PSA_CIPHER_ENCRYPT_OUTPUT_SIZE(key_type, alg, input_length) \
574 (input_length + PSA_CIPHER_IV_LENGTH(key_type, alg))
575
585#define PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE /* implementation-defined value */
586
604#define PSA_CIPHER_FINISH_OUTPUT_SIZE(key_type, alg) \
605/* implementation-defined value */
606
633#define PSA_CIPHER_IV_LENGTH(key_type, alg) \
634 (PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) > 1 && \
635 ((alg) == PSA_ALG_CBC_NO_PADDING) ? 16 : 0)
636
646#define PSA_CIPHER_IV_MAX_SIZE /* implementation-defined value */
647
660#define PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE(input_length) \
661/* implementation-defined value */
662
682#define PSA_CIPHER_UPDATE_OUTPUT_SIZE(key_type, alg, input_length) \
683/* implementation-defined value */
684
692#define PSA_HASH_SUSPEND_ALGORITHM_FIELD_LENGTH ((size_t)4)
693
708#define PSA_HASH_SUSPEND_HASH_STATE_FIELD_LENGTH(alg) \
709/* specification-defined value */
710
725#define PSA_HASH_SUSPEND_INPUT_LENGTH_FIELD_LENGTH(alg) \
726/* specification-defined value */
727
737#define PSA_HASH_SUSPEND_OUTPUT_MAX_SIZE /* implementation-defined value */
738
763#define PSA_HASH_SUSPEND_OUTPUT_SIZE(alg) /* specification-defined value */
764
774#define PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE \
775/* implementation-defined value */
776
796#define PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(key_type, key_bits, alg) \
797/* implementation-defined value */
798
808#define PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE /* implementation-defined value */
809
829#define PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(key_type, key_bits, alg) \
830/* implementation-defined value */
831
842#define PSA_KEY_EXPORT_ECC_KEY_MAX_SIZE(key_type, key_bits) \
843 (size_t)\
844 (PSA_KEY_TYPE_ECC_GET_FAMILY(key_type) == PSA_ECC_FAMILY_TWISTED_EDWARDS ? 32 : \
845 (PSA_KEY_TYPE_ECC_GET_FAMILY(key_type) == PSA_ECC_FAMILY_SECP_R1 ? PSA_BITS_TO_BYTES(key_bits) : \
846 0))
847
884#define PSA_EXPORT_KEY_OUTPUT_SIZE(key_type, key_bits) \
885 (PSA_KEY_TYPE_IS_PUBLIC_KEY(key_type) ? PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(key_type, key_bits) : \
886 (PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_KEY_EXPORT_ECC_KEY_MAX_SIZE(key_type, key_bits) : \
887 0))
888
895#define PSA_ECC_KEY_SIZE_IS_VALID(type, bits) \
896 (PSA_KEY_TYPE_ECC_GET_FAMILY(type) == PSA_ECC_FAMILY_TWISTED_EDWARDS ? \
897 (bits == 255) : \
898 (PSA_KEY_TYPE_ECC_GET_FAMILY(type) == PSA_ECC_FAMILY_SECP_R1 ? \
899 (bits == 128 || \
900 bits == 192 || \
901 bits == 224 || \
902 bits == 256 || \
903 bits == 384) : \
904 0))
905
909#define PSA_MAX_PRIV_KEY_SIZE (PSA_BYTES_TO_BITS(CONFIG_PSA_MAX_KEY_SIZE))
910
920#if (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P256R1) || \
921 IS_USED(MODULE_PSA_SECURE_ELEMENT_ATECCX08A_ECC_P256))
922#define PSA_EXPORT_KEY_PAIR_MAX_SIZE \
923 (PSA_EXPORT_KEY_OUTPUT_SIZE(PSA_ECC_FAMILY_SECT_R1, 256))
924#elif (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_ED25519))
925#define PSA_EXPORT_KEY_PAIR_MAX_SIZE \
926 (PSA_EXPORT_KEY_OUTPUT_SIZE(PSA_ECC_FAMILY_TWISTED_EDWARDS, 255))
927#elif (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P192R1))
928#define PSA_EXPORT_KEY_PAIR_MAX_SIZE \
929 (PSA_EXPORT_KEY_OUTPUT_SIZE(PSA_ECC_FAMILY_SECT_R1, 192))
930#else
931#define PSA_EXPORT_KEY_PAIR_MAX_SIZE 0
932#endif
933
946#define PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(key_type, key_bits) \
947 (PSA_KEY_TYPE_ECC_GET_FAMILY(key_type) == PSA_ECC_FAMILY_TWISTED_EDWARDS ? 32 : \
948 ((size_t)(2 * PSA_BITS_TO_BYTES(key_bits) + 1)))
949
990#define PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(key_type, key_bits) \
991 (PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(key_type, key_bits) : \
992 0)
993
1004#if (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P256R1) || \
1005 IS_USED(MODULE_PSA_SECURE_ELEMENT_ATECCX08A_ECC_P256))
1006#define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE \
1007 (PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(PSA_ECC_FAMILY_SECT_R1, 256))
1008#elif (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P192R1))
1009#define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE \
1010 (PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(PSA_ECC_FAMILY_SECT_R1, 192))
1011#elif (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_ED25519))
1012#define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE \
1013 (PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(PSA_ECC_FAMILY_TWISTED_EDWARDS, 255))
1014#else
1015#define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE 0
1016#endif
1017
1023#define PSA_MAX_PRIV_KEY_BUFFER_SIZE (PSA_BITS_TO_BYTES(PSA_MAX_PRIV_KEY_SIZE))
1024
1028#define PSA_MAX_ASYMMETRIC_KEYPAIR_SIZE (PSA_BITS_TO_BYTES(PSA_MAX_PRIV_KEY_SIZE) + \
1029 PSA_EXPORT_PUBLIC_KEY_MAX_SIZE)
1030
1034#if IS_USED(MODULE_PSA_ASYMMETRIC)
1035#define PSA_MAX_KEY_DATA_SIZE (PSA_EXPORT_PUBLIC_KEY_MAX_SIZE)
1036#else
1037#define PSA_MAX_KEY_DATA_SIZE (CONFIG_PSA_MAX_KEY_SIZE)
1038#endif
1039
1043#define PSA_MAX_UNSTRUCTURED_KEY_SIZE (CONFIG_PSA_MAX_KEY_SIZE)
1044
1054#define PSA_ECDSA_SIGNATURE_SIZE(curve_bits) \
1055 ((size_t)(PSA_BITS_TO_BYTES(curve_bits) * 2))
1056
1075#define PSA_SIGN_OUTPUT_SIZE(key_type, key_bits, alg) \
1076 (PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_ECDSA_SIGNATURE_SIZE(key_bits) : \
1077 ((void)alg, 0))
1078
1079#ifdef __cplusplus
1080}
1081#endif
1082
1083#endif /* PSA_CRYPTO_PSA_CRYPTO_SIZES_H */
Value definitions for PSA Crypto.
Common macros and compiler attributes/pragmas configuration.