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#ifndef CONFIG_PSA_MAX_KEY_SIZE
61#if (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_MAC_HMAC_SHA_256) || \
65 IS_USED(MODULE_PSA_SECURE_ELEMENT_ATECCX08A_ECC_P256))
66#define CONFIG_PSA_MAX_KEY_SIZE 32
67#elif (IS_USED(MODULE_PSA_CIPHER_AES_192_CBC) || \
68 IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P192R1))
69#define CONFIG_PSA_MAX_KEY_SIZE 24
70#elif (IS_USED(MODULE_PSA_CIPHER_AES_128_CBC)) || \
71 (IS_USED(MODULE_PSA_CIPHER_AES_128_ECB))
72#define CONFIG_PSA_MAX_KEY_SIZE 16
73#else
74#define CONFIG_PSA_MAX_KEY_SIZE 0
75#endif
76#endif
77
84#ifndef CONFIG_PSA_ASYMMETRIC_KEYPAIR_COUNT
85#define CONFIG_PSA_ASYMMETRIC_KEYPAIR_COUNT 0
86#endif
87
94#ifndef CONFIG_PSA_SINGLE_KEY_COUNT
95#define CONFIG_PSA_SINGLE_KEY_COUNT 0
96#endif
97
104#ifndef CONFIG_PSA_PROTECTED_KEY_COUNT
105#if (IS_USED(MODULE_PSA_SECURE_ELEMENT))
106#define CONFIG_PSA_PROTECTED_KEY_COUNT 5
107#else
108#define CONFIG_PSA_PROTECTED_KEY_COUNT 0
109#endif
110#endif
111
124#define PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE(ciphertext_length) \
125/* implementation-defined value */
126
145#define PSA_AEAD_DECRYPT_OUTPUT_SIZE(key_type, alg, ciphertext_length) \
146/* implementation-defined value */
147
160#define PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE(plaintext_length) \
161/* implementation-defined value */
162
181#define PSA_AEAD_ENCRYPT_OUTPUT_SIZE(key_type, alg, plaintext_length) \
182/* implementation-defined value */
183
193#define PSA_AEAD_FINISH_OUTPUT_MAX_SIZE /* implementation-defined value */
194
213#define PSA_AEAD_FINISH_OUTPUT_SIZE(key_type, alg) \
214/* implementation-defined value */
215
235#define PSA_AEAD_NONCE_LENGTH(key_type, alg) /* implementation-defined value */
236
246#define PSA_AEAD_NONCE_MAX_SIZE /* implementation-defined value */
247
267#define PSA_AEAD_TAG_LENGTH(key_type, key_bits, alg) \
268/* implementation-defined value */
269
279#define PSA_AEAD_TAG_MAX_SIZE /* implementation-defined value */
280
292#define PSA_AEAD_UPDATE_OUTPUT_MAX_SIZE(input_length) \
293/* implementation-defined value */
294
313#define PSA_AEAD_UPDATE_OUTPUT_SIZE(key_type, alg, input_length) \
314/* implementation-defined value */
315
327#define PSA_AEAD_VERIFY_OUTPUT_MAX_SIZE /* implementation-defined value */
328
346#define PSA_AEAD_VERIFY_OUTPUT_SIZE(key_type, alg) \
347/* implementation-defined value */
348
354#define PSA_HASH_MAX_SIZE (64)
355
372#define PSA_HASH_BLOCK_LENGTH(alg) /* implementation-defined value */
373
388#define PSA_HASH_LENGTH(alg) \
389 ( \
390 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD2 ? 16 : \
391 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD4 ? 16 : \
392 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD5 ? 16 : \
393 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_RIPEMD160 ? 20 : \
394 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_1 ? 20 : \
395 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_224 ? 28 : \
396 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_256 ? 32 : \
397 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_384 ? 48 : \
398 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512 ? 64 : \
399 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_224 ? 28 : \
400 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_256 ? 32 : \
401 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_224 ? 28 : \
402 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_256 ? 32 : \
403 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_384 ? 48 : \
404 PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_512 ? 64 : \
405 0)
406
429#define PSA_MAC_LENGTH(key_type, key_bits, alg) \
430 ((PSA_ALG_IS_HMAC(alg)) ? PSA_HASH_LENGTH(PSA_ALG_HMAC_GET_HASH(alg)) : \
431 PSA_ALG_IS_BLOCK_CIPHER_MAC(alg) ? PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) : \
432 ((void)(key_type), (void)(key_bits), 0))
433
444#define PSA_MAC_MAX_SIZE (PSA_HASH_MAX_SIZE)
445
458#define PSA_BLOCK_CIPHER_BLOCK_LENGTH(type) \
459 (1u << (((type) >> 8) & 7))
460
466#define PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE /* implementation-defined value */
467
479#define PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE(input_length) \
480 (input_length)
481
500#define PSA_CIPHER_DECRYPT_OUTPUT_SIZE(key_type, alg, input_length) \
501 (input_length - PSA_CIPHER_IV_LENGTH(key_type, alg))
502
514#define PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE(input_length) \
515 (PSA_CIPHER_ENCRYPT_OUTPUT_SIZE(PSA_KEY_TYPE_AES, PSA_ALG_CBC_NO_PADDING, input_length))
516
535#define PSA_CIPHER_ENCRYPT_OUTPUT_SIZE(key_type, alg, input_length) \
536 (input_length + PSA_CIPHER_IV_LENGTH(key_type, alg))
537
547#define PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE /* implementation-defined value */
548
566#define PSA_CIPHER_FINISH_OUTPUT_SIZE(key_type, alg) \
567/* implementation-defined value */
568
595#define PSA_CIPHER_IV_LENGTH(key_type, alg) \
596 (PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) > 1 && \
597 ((alg) == PSA_ALG_CBC_NO_PADDING) ? 16 : 0)
598
608#define PSA_CIPHER_IV_MAX_SIZE /* implementation-defined value */
609
622#define PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE(input_length) \
623/* implementation-defined value */
624
644#define PSA_CIPHER_UPDATE_OUTPUT_SIZE(key_type, alg, input_length) \
645/* implementation-defined value */
646
654#define PSA_HASH_SUSPEND_ALGORITHM_FIELD_LENGTH ((size_t)4)
655
670#define PSA_HASH_SUSPEND_HASH_STATE_FIELD_LENGTH(alg) \
671/* specification-defined value */
672
687#define PSA_HASH_SUSPEND_INPUT_LENGTH_FIELD_LENGTH(alg) \
688/* specification-defined value */
689
699#define PSA_HASH_SUSPEND_OUTPUT_MAX_SIZE /* implementation-defined value */
700
725#define PSA_HASH_SUSPEND_OUTPUT_SIZE(alg) /* specification-defined value */
726
736#define PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE \
737/* implementation-defined value */
738
758#define PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(key_type, key_bits, alg) \
759/* implementation-defined value */
760
770#define PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE /* implementation-defined value */
771
791#define PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(key_type, key_bits, alg) \
792/* implementation-defined value */
793
804#define PSA_KEY_EXPORT_ECC_KEY_MAX_SIZE(key_type, key_bits) \
805 (size_t)\
806 (PSA_KEY_TYPE_ECC_GET_FAMILY(key_type) == PSA_ECC_FAMILY_TWISTED_EDWARDS ? 32 : \
807 (PSA_KEY_TYPE_ECC_GET_FAMILY(key_type) == PSA_ECC_FAMILY_SECP_R1 ? PSA_BITS_TO_BYTES(key_bits) : \
808 0))
809
846#define PSA_EXPORT_KEY_OUTPUT_SIZE(key_type, key_bits) \
847 (PSA_KEY_TYPE_IS_PUBLIC_KEY(key_type) ? PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(key_type, key_bits) : \
848 (PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_KEY_EXPORT_ECC_KEY_MAX_SIZE(key_type, key_bits) : \
849 0))
850
857#define PSA_ECC_KEY_SIZE_IS_VALID(type, bits) \
858 (PSA_KEY_TYPE_ECC_GET_FAMILY(type) == PSA_ECC_FAMILY_TWISTED_EDWARDS ? \
859 (bits == 255) : \
860 (PSA_KEY_TYPE_ECC_GET_FAMILY(type) == PSA_ECC_FAMILY_SECP_R1 ? \
861 (bits == 128 || \
862 bits == 192 || \
863 bits == 224 || \
864 bits == 256 || \
865 bits == 384) : \
866 0))
867
871#define PSA_MAX_PRIV_KEY_SIZE (PSA_BYTES_TO_BITS(CONFIG_PSA_MAX_KEY_SIZE))
872
882#if (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P256R1) || \
883 IS_USED(MODULE_PSA_SECURE_ELEMENT_ATECCX08A_ECC_P256))
884#define PSA_EXPORT_KEY_PAIR_MAX_SIZE \
885 (PSA_EXPORT_KEY_OUTPUT_SIZE(PSA_ECC_FAMILY_SECT_R1, 256))
886#elif (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_ED25519))
887#define PSA_EXPORT_KEY_PAIR_MAX_SIZE \
888 (PSA_EXPORT_KEY_OUTPUT_SIZE(PSA_ECC_FAMILY_TWISTED_EDWARDS, 255))
889#elif (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P192R1))
890#define PSA_EXPORT_KEY_PAIR_MAX_SIZE \
891 (PSA_EXPORT_KEY_OUTPUT_SIZE(PSA_ECC_FAMILY_SECT_R1, 192))
892#else
893#define PSA_EXPORT_KEY_PAIR_MAX_SIZE 0
894#endif
895
908#define PSA_ECC_KEY_GET_CURVE_FROM_PUBLIC_KEY(key_type, key_bits) \
909 (PSA_KEY_TYPE_ECC_GET_FAMILY(key_type) == PSA_ECC_FAMILY_TWISTED_EDWARDS ? 255 : \
910 ((size_t)((key_bits - 8) / 2)))
911
915#define PSA_ECC_KEY_GET_CURVE(key_type, key_bits) \
916 (PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY(key_type) ? \
917 PSA_ECC_KEY_GET_CURVE_FROM_PUBLIC_KEY(key_type, key_bits) : \
918 (size_t)key_bits)
919
932#define PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(key_type, key_bits) \
933 (PSA_KEY_TYPE_ECC_GET_FAMILY(key_type) == PSA_ECC_FAMILY_TWISTED_EDWARDS ? 32 : \
934 ((size_t)(2 * PSA_BITS_TO_BYTES(key_bits) + 1)))
935
976#define PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(key_type, key_bits) \
977 (PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(key_type, key_bits) : \
978 0)
979
990#if (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P256R1) || \
991 IS_USED(MODULE_PSA_SECURE_ELEMENT_ATECCX08A_ECC_P256))
992#define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE \
993 (PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(PSA_ECC_FAMILY_SECT_R1, 256))
994#elif (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_P192R1))
995#define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE \
996 (PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(PSA_ECC_FAMILY_SECT_R1, 192))
997#elif (IS_USED(MODULE_PSA_ASYMMETRIC_ECC_ED25519))
998#define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE \
999 (PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(PSA_ECC_FAMILY_TWISTED_EDWARDS, 255))
1000#else
1001#define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE 0
1002#endif
1003
1009#define PSA_MAX_PRIV_KEY_BUFFER_SIZE (PSA_BITS_TO_BYTES(PSA_MAX_PRIV_KEY_SIZE))
1010
1014#define PSA_MAX_ASYMMETRIC_KEYPAIR_SIZE (PSA_BITS_TO_BYTES(PSA_MAX_PRIV_KEY_SIZE) + \
1015 PSA_EXPORT_PUBLIC_KEY_MAX_SIZE)
1016
1020#if IS_USED(MODULE_PSA_ASYMMETRIC)
1021#define PSA_MAX_KEY_DATA_SIZE (PSA_EXPORT_PUBLIC_KEY_MAX_SIZE)
1022#else
1023#define PSA_MAX_KEY_DATA_SIZE (CONFIG_PSA_MAX_KEY_SIZE)
1024#endif
1025
1029#define PSA_MAX_UNSTRUCTURED_KEY_SIZE (CONFIG_PSA_MAX_KEY_SIZE)
1030
1040#define PSA_ECDSA_SIGNATURE_SIZE(curve_bits) \
1041 ((size_t)(PSA_BITS_TO_BYTES(curve_bits) * 2))
1042
1061#define PSA_SIGN_OUTPUT_SIZE(key_type, key_bits, alg) \
1062 (PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_ECDSA_SIGNATURE_SIZE(PSA_ECC_KEY_GET_CURVE(key_type, key_bits)) : \
1063 ((void)alg, 0))
1064
1065#ifdef __cplusplus
1066}
1067#endif
1068
1069#endif /* PSA_CRYPTO_PSA_CRYPTO_SIZES_H */
Value definitions for PSA Crypto.
Common macros and compiler attributes/pragmas configuration.