16 #ifndef PSA_CRYPTO_EXTRA_H
17 #define PSA_CRYPTO_EXTRA_H
18 #include "mbedtls/private_access.h"
29 #define PSA_CRYPTO_ITS_RANDOM_SEED_UID 0xFFFFFF52
32 #if !defined(MBEDTLS_PSA_KEY_SLOT_COUNT)
33 #define MBEDTLS_PSA_KEY_SLOT_COUNT 32
40 #if !defined(MBEDTLS_PSA_STATIC_KEY_SLOT_BUFFER_SIZE)
41 #define MBEDTLS_PSA_STATIC_KEY_SLOT_BUFFER_SIZE \
42 ((PSA_EXPORT_KEY_PAIR_OR_PUBLIC_MAX_SIZE > PSA_CIPHER_MAX_KEY_LENGTH) ? \
43 PSA_EXPORT_KEY_PAIR_OR_PUBLIC_MAX_SIZE : PSA_CIPHER_MAX_KEY_LENGTH)
73 attributes->MBEDTLS_PRIVATE(policy).MBEDTLS_PRIVATE(alg2) = alg2;
85 return attributes->MBEDTLS_PRIVATE(policy).MBEDTLS_PRIVATE(alg2);
110 size_t MBEDTLS_PRIVATE(volatile_slots);
113 size_t MBEDTLS_PRIVATE(persistent_slots);
116 size_t MBEDTLS_PRIVATE(external_slots);
119 size_t MBEDTLS_PRIVATE(half_filled_slots);
121 size_t MBEDTLS_PRIVATE(cache_slots);
123 size_t MBEDTLS_PRIVATE(empty_slots);
125 size_t MBEDTLS_PRIVATE(locked_slots);
152 #define PSA_KEY_TYPE_DSA_PUBLIC_KEY ((psa_key_type_t) 0x4002)
170 #define PSA_KEY_TYPE_DSA_KEY_PAIR ((psa_key_type_t) 0x7002)
173 #define PSA_KEY_TYPE_IS_DSA(type) \
174 (PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) == PSA_KEY_TYPE_DSA_PUBLIC_KEY)
176 #define PSA_ALG_DSA_BASE ((psa_algorithm_t) 0x06000400)
191 #define PSA_ALG_DSA(hash_alg) \
192 (PSA_ALG_DSA_BASE | ((hash_alg) & PSA_ALG_HASH_MASK))
193 #define PSA_ALG_DETERMINISTIC_DSA_BASE ((psa_algorithm_t) 0x06000500)
194 #define PSA_ALG_DSA_DETERMINISTIC_FLAG PSA_ALG_ECDSA_DETERMINISTIC_FLAG
209 #define PSA_ALG_DETERMINISTIC_DSA(hash_alg) \
210 (PSA_ALG_DETERMINISTIC_DSA_BASE | ((hash_alg) & PSA_ALG_HASH_MASK))
211 #define PSA_ALG_IS_DSA(alg) \
212 (((alg) & ~PSA_ALG_HASH_MASK & ~PSA_ALG_DSA_DETERMINISTIC_FLAG) == \
214 #define PSA_ALG_DSA_IS_DETERMINISTIC(alg) \
215 (((alg) & PSA_ALG_DSA_DETERMINISTIC_FLAG) != 0)
216 #define PSA_ALG_IS_DETERMINISTIC_DSA(alg) \
217 (PSA_ALG_IS_DSA(alg) && PSA_ALG_DSA_IS_DETERMINISTIC(alg))
218 #define PSA_ALG_IS_RANDOMIZED_DSA(alg) \
219 (PSA_ALG_IS_DSA(alg) && !PSA_ALG_DSA_IS_DETERMINISTIC(alg))
224 #undef PSA_ALG_IS_VENDOR_HASH_AND_SIGN
225 #define PSA_ALG_IS_VENDOR_HASH_AND_SIGN(alg) \
235 #define PSA_PAKE_OPERATION_STAGE_SETUP 0
236 #define PSA_PAKE_OPERATION_STAGE_COLLECT_INPUTS 1
237 #define PSA_PAKE_OPERATION_STAGE_COMPUTATION 2
246 #if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG)
288 uint8_t *output,
size_t output_size,
size_t *output_length);
308 #define MBEDTLS_PSA_KEY_ID_BUILTIN_MIN ((psa_key_id_t) 0x7fff0000)
315 #define MBEDTLS_PSA_KEY_ID_BUILTIN_MAX ((psa_key_id_t) 0x7fffefff)
323 #if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS)
386 psa_drv_slot_number_t *slot_number);
409 #define PSA_ALG_CATEGORY_PAKE ((psa_algorithm_t) 0x0a000000)
420 #define PSA_ALG_IS_PAKE(alg) \
421 (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_PAKE)
423 #define PSA_ALG_JPAKE_BASE ((psa_algorithm_t) 0x0a000100)
550 #define PSA_ALG_JPAKE(hash_alg) \
551 (PSA_ALG_JPAKE_BASE | ((hash_alg) & (PSA_ALG_HASH_MASK)))
562 #define PSA_ALG_IS_JPAKE(alg) \
563 (((alg) & (~(PSA_ALG_HASH_MASK))) == PSA_ALG_JPAKE_BASE)
565 #define PSA_KEY_TYPE_SPAKE2P_PUBLIC_KEY_BASE ((psa_key_type_t) 0x4400)
566 #define PSA_KEY_TYPE_SPAKE2P_KEY_PAIR_BASE ((psa_key_type_t) 0x7400)
572 #define PSA_KEY_TYPE_SPAKE2P_KEY_PAIR(curve) \
573 (PSA_KEY_TYPE_SPAKE2P_KEY_PAIR_BASE | (curve))
579 #define PSA_KEY_TYPE_SPAKE2P_PUBLIC_KEY(curve) \
580 (PSA_KEY_TYPE_SPAKE2P_PUBLIC_KEY_BASE | (curve))
583 #define PSA_KEY_TYPE_IS_SPAKE2P_KEY_PAIR(type) \
584 (((type) & ~PSA_KEY_TYPE_ECC_CURVE_MASK) == \
585 PSA_KEY_TYPE_SPAKE2P_KEY_PAIR_BASE)
588 #define PSA_KEY_TYPE_IS_SPAKE2P_PUBLIC_KEY(type) \
589 (((type) & ~PSA_KEY_TYPE_ECC_CURVE_MASK) == \
590 PSA_KEY_TYPE_SPAKE2P_PUBLIC_KEY_BASE)
593 #define PSA_KEY_TYPE_IS_SPAKE2P(type) \
594 ((PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) & \
595 ~PSA_KEY_TYPE_ECC_CURVE_MASK) == PSA_KEY_TYPE_SPAKE2P_PUBLIC_KEY_BASE)
597 #define PSA_ALG_SPAKE2P_HMAC_BASE ((psa_algorithm_t) 0x0a000400)
603 #define PSA_ALG_SPAKE2P_HMAC(hash_alg) \
604 (PSA_ALG_SPAKE2P_HMAC_BASE | ((hash_alg) & (PSA_ALG_HASH_MASK)))
605 #define PSA_ALG_IS_SPAKE2P_HMAC(alg) \
606 (((alg) & (~(PSA_ALG_HASH_MASK))) == PSA_ALG_SPAKE2P_HMAC_BASE)
612 #define PSA_ALG_SPAKE2P_CMAC_BASE ((psa_algorithm_t) 0x0a000500)
613 #define PSA_ALG_SPAKE2P_CMAC(hash_alg) \
614 (PSA_ALG_SPAKE2P_CMAC_BASE | ((hash_alg) & (PSA_ALG_HASH_MASK)))
615 #define PSA_ALG_IS_SPAKE2P_CMAC(alg) \
616 (((alg) & (~(PSA_ALG_HASH_MASK))) == PSA_ALG_SPAKE2P_CMAC_BASE)
622 #define PSA_ALG_SPAKE2P_MATTER ((psa_algorithm_t) 0x0a000609)
634 #define PSA_ALG_IS_SPAKE2P(alg) \
635 (PSA_ALG_IS_SPAKE2P_HMAC(alg) || \
636 PSA_ALG_IS_SPAKE2P_CMAC(alg) || \
637 (alg) == PSA_ALG_SPAKE2P_MATTER)
696 #define PSA_PAKE_ROLE_NONE ((psa_pake_role_t) 0x00)
705 #define PSA_PAKE_ROLE_FIRST ((psa_pake_role_t) 0x01)
714 #define PSA_PAKE_ROLE_SECOND ((psa_pake_role_t) 0x02)
720 #define PSA_PAKE_ROLE_CLIENT ((psa_pake_role_t) 0x11)
726 #define PSA_PAKE_ROLE_SERVER ((psa_pake_role_t) 0x12)
746 #define PSA_PAKE_PRIMITIVE_TYPE_ECC ((psa_pake_primitive_type_t) 0x01)
766 #define PSA_PAKE_PRIMITIVE_TYPE_DH ((psa_pake_primitive_type_t) 0x02)
787 #define PSA_PAKE_PRIMITIVE(pake_type, pake_family, pake_bits) \
788 (((pake_bits & 0xFFFF) != pake_bits) ? 0 : \
789 ((psa_pake_primitive_t) (((pake_type) << 24 | \
790 (pake_family) << 16) | (pake_bits))))
804 #define PSA_PAKE_STEP_KEY_SHARE ((psa_pake_step_t) 0x01)
821 #define PSA_PAKE_STEP_ZK_PUBLIC ((psa_pake_step_t) 0x02)
842 #define PSA_PAKE_STEP_ZK_PROOF ((psa_pake_step_t) 0x03)
852 #define PSA_PAKE_STEP_CONFIRM ((psa_pake_step_t) 0x04)
876 #define PSA_PAKE_OUTPUT_SIZE(alg, primitive, output_step) \
877 (PSA_ALG_IS_JPAKE(alg) && \
878 primitive == PSA_PAKE_PRIMITIVE(PSA_PAKE_PRIMITIVE_TYPE_ECC, \
879 PSA_ECC_FAMILY_SECP_R1, 256) ? \
881 output_step == PSA_PAKE_STEP_KEY_SHARE ? 65 : \
882 output_step == PSA_PAKE_STEP_ZK_PUBLIC ? 65 : \
906 #define PSA_PAKE_INPUT_SIZE(alg, primitive, input_step) \
907 (PSA_ALG_IS_JPAKE(alg) && \
908 primitive == PSA_PAKE_PRIMITIVE(PSA_PAKE_PRIMITIVE_TYPE_ECC, \
909 PSA_ECC_FAMILY_SECP_R1, 256) ? \
911 input_step == PSA_PAKE_STEP_KEY_SHARE ? 65 : \
912 input_step == PSA_PAKE_STEP_ZK_PUBLIC ? 65 : \
927 #define PSA_PAKE_OUTPUT_MAX_SIZE 65
939 #define PSA_PAKE_INPUT_MAX_SIZE 65
944 #define PSA_PAKE_CIPHER_SUITE_INIT { PSA_ALG_NONE, 0, 0, 0, 0 }
949 #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
950 #define PSA_PAKE_OPERATION_INIT { 0 }
952 #define PSA_PAKE_OPERATION_INIT { 0, PSA_ALG_NONE, 0, PSA_PAKE_OPERATION_STAGE_SETUP, \
965 #define PSA_PAKE_CONFIRMED_KEY 0
979 #define PSA_PAKE_UNCONFIRMED_KEY 1
983 psa_pake_primitive_type_t
type;
990 uint8_t *MBEDTLS_PRIVATE(password);
991 size_t MBEDTLS_PRIVATE(password_len);
992 uint8_t *MBEDTLS_PRIVATE(user);
993 size_t MBEDTLS_PRIVATE(user_len);
994 uint8_t *MBEDTLS_PRIVATE(peer);
995 size_t MBEDTLS_PRIVATE(peer_len);
1033 uint8_t MBEDTLS_PRIVATE(inputs);
1035 uint8_t MBEDTLS_PRIVATE(outputs);
1037 psa_pake_step_t MBEDTLS_PRIVATE(step);
1040 #define PSA_JPAKE_EXPECTED_INPUTS(round) ((round) == PSA_JPAKE_FINISHED ? 0 : \
1041 ((round) == PSA_JPAKE_FIRST ? 2 : 1))
1042 #define PSA_JPAKE_EXPECTED_OUTPUTS(round) ((round) == PSA_JPAKE_FINISHED ? 0 : \
1043 ((round) == PSA_JPAKE_FIRST ? 2 : 1))
1046 #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
1047 mbedtls_psa_client_handle_t handle;
1055 unsigned int MBEDTLS_PRIVATE(
id);
1059 psa_pake_primitive_t MBEDTLS_PRIVATE(primitive);
1062 uint8_t MBEDTLS_PRIVATE(stage);
1065 uint8_t MBEDTLS_PRIVATE(dummy);
1066 #if defined(PSA_WANT_ALG_JPAKE)
1069 } MBEDTLS_PRIVATE(computation_stage);
1073 } MBEDTLS_PRIVATE(data);
1142 psa_pake_primitive_t primitive);
1237 size_t *password_len);
1253 uint8_t *buffer,
size_t buffer_size,
size_t *buffer_length);
1299 uint8_t *user_id,
size_t user_id_size,
size_t *user_id_len);
1317 uint8_t *peer_id,
size_t peer_id_size,
size_t *peer_id_length);
1477 const uint8_t *user_id,
1478 size_t user_id_len);
1523 const uint8_t *peer_id,
1524 size_t peer_id_len);
1565 psa_pake_role_t role);
1599 const uint8_t *context,
1600 size_t context_len);
1658 psa_pake_step_t step,
1661 size_t *output_length);
1713 psa_pake_step_t step,
1714 const uint8_t *input,
1715 size_t input_length);
1895 cipher_suite->
bits);
1900 psa_pake_primitive_t primitive)
1904 cipher_suite->
bits = (uint16_t) (0xFFFF & primitive);
1910 return cipher_suite->
family;
1916 return cipher_suite->
bits;
1926 uint32_t key_confirmation)
uint32_t psa_pake_primitive_t
Encoding of the primitive associated with the PAKE.
static psa_pake_cipher_suite_t psa_pake_cipher_suite_init(void)
psa_status_t psa_pake_output(psa_pake_operation_t *operation, psa_pake_step_t step, uint8_t *output, size_t output_size, size_t *output_length)
psa_status_t psa_pake_set_role(psa_pake_operation_t *operation, psa_pake_role_t role)
static int psa_key_id_is_builtin(psa_key_id_t key_id)
psa_status_t psa_pake_abort(psa_pake_operation_t *operation)
PSA cryptography module: Backward compatibility aliases.
static void psa_set_key_enrollment_algorithm(psa_key_attributes_t *attributes, psa_algorithm_t alg2)
Declare the enrollment algorithm for a key.
#define MBEDTLS_PSA_KEY_ID_BUILTIN_MIN
static psa_algorithm_t psa_pake_cs_get_algorithm(const psa_pake_cipher_suite_t *cipher_suite)
psa_pake_primitive_type_t type
psa_status_t psa_pake_get_shared_key(psa_pake_operation_t *operation, const psa_key_attributes_t *attributes, mbedtls_svc_key_id_t *key)
PSA cryptography module: type aliases.
static uint16_t psa_pake_cs_get_bits(const psa_pake_cipher_suite_t *cipher_suite)
#define PSA_ALG_IS_PAKE(alg)
psa_status_t psa_crypto_driver_pake_get_user(const psa_crypto_driver_pake_inputs_t *inputs, uint8_t *user_id, size_t user_id_size, size_t *user_id_len)
psa_status_t psa_crypto_driver_pake_get_peer_len(const psa_crypto_driver_pake_inputs_t *inputs, size_t *peer_len)
static void psa_pake_cs_set_primitive(psa_pake_cipher_suite_t *cipher_suite, psa_pake_primitive_t primitive)
psa_status_t mbedtls_psa_platform_get_builtin_key(mbedtls_svc_key_id_t key_id, psa_key_lifetime_t *lifetime, psa_drv_slot_number_t *slot_number)
static void psa_pake_cs_set_key_confirmation(psa_pake_cipher_suite_t *cipher_suite, uint32_t key_confirmation)
uint8_t psa_pake_family_t
Encoding of the family of the primitive associated with the PAKE.
PSA cryptography module: macros to build and analyze integer values.
uint64_t psa_drv_slot_number_t
static psa_algorithm_t psa_get_key_enrollment_algorithm(const psa_key_attributes_t *attributes)
psa_status_t psa_crypto_driver_pake_get_password_len(const psa_crypto_driver_pake_inputs_t *inputs, size_t *password_len)
uint32_t psa_algorithm_t
Encoding of a cryptographic algorithm.
static psa_pake_family_t psa_pake_cs_get_family(const psa_pake_cipher_suite_t *cipher_suite)
uint8_t psa_pake_primitive_type_t
psa_status_t psa_crypto_driver_pake_get_password(const psa_crypto_driver_pake_inputs_t *inputs, uint8_t *buffer, size_t buffer_size, size_t *buffer_length)
static uint32_t psa_pake_cs_get_key_confirmation(const psa_pake_cipher_suite_t *cipher_suite)
psa_status_t psa_pake_set_context(psa_pake_operation_t *operation, const uint8_t *context, size_t context_len)
uint32_t key_confirmation
psa_status_t psa_pake_set_user(psa_pake_operation_t *operation, const uint8_t *user_id, size_t user_id_len)
#define PSA_PAKE_PRIMITIVE(pake_type, pake_family, pake_bits)
static void psa_pake_cs_set_algorithm(psa_pake_cipher_suite_t *cipher_suite, psa_algorithm_t algorithm)
#define MBEDTLS_PSA_KEY_ID_BUILTIN_MAX
static psa_pake_primitive_t psa_pake_cs_get_primitive(const psa_pake_cipher_suite_t *cipher_suite)
static psa_pake_operation_t psa_pake_operation_init(void)
psa_status_t psa_pake_input(psa_pake_operation_t *operation, psa_pake_step_t step, const uint8_t *input, size_t input_length)
psa_status_t psa_crypto_driver_pake_get_user_len(const psa_crypto_driver_pake_inputs_t *inputs, size_t *user_len)
uint8_t psa_pake_role_t
Encoding of the application role of PAKE.
psa_status_t psa_pake_setup(psa_pake_operation_t *operation, mbedtls_svc_key_id_t password_key, const psa_pake_cipher_suite_t *cipher_suite)
psa_status_t psa_crypto_driver_pake_get_cipher_suite(const psa_crypto_driver_pake_inputs_t *inputs, psa_pake_cipher_suite_t *cipher_suite)
uint32_t psa_key_lifetime_t
psa_status_t psa_pake_set_peer(psa_pake_operation_t *operation, const uint8_t *peer_id, size_t peer_id_len)
int32_t psa_status_t
Function return status.
psa_algorithm_t algorithm
psa_status_t psa_crypto_driver_pake_get_peer(const psa_crypto_driver_pake_inputs_t *inputs, uint8_t *peer_id, size_t peer_id_size, size_t *peer_id_length)
psa_status_t mbedtls_psa_external_get_random(mbedtls_psa_external_random_context_t *context, uint8_t *output, size_t output_size, size_t *output_length)
Statistics about resource consumption related to the PSA keystore.