/** * \file psa/crypto_struct.h * * \brief PSA cryptography module: Mbed TLS structured type implementations * * \note This file may not be included directly. Applications must * include psa/crypto.h. * * This file contains the definitions of some data structures with * implementation-specific definitions. * * In implementations with isolation between the application and the * cryptography module, it is expected that the front-end and the back-end * would have different versions of this file. * * <h3>Design notes about multipart operation structures</h3> * * For multipart operations without driver delegation support, each multipart * operation structure contains a `psa_algorithm_t alg` field which indicates * which specific algorithm the structure is for. When the structure is not in * use, `alg` is 0. Most of the structure consists of a union which is * discriminated by `alg`. * * For multipart operations with driver delegation support, each multipart * operation structure contains an `unsigned int id` field indicating which * driver got assigned to do the operation. When the structure is not in use, * 'id' is 0. The structure contains also a driver context which is the union * of the contexts of all drivers able to handle the type of multipart * operation. * * Note that when `alg` or `id` is 0, the content of other fields is undefined. * In particular, it is not guaranteed that a freshly-initialized structure * is all-zero: we initialize structures to something like `{0, 0}`, which * is only guaranteed to initializes the first member of the union; * GCC and Clang initialize the whole structure to 0 (at the time of writing), * but MSVC and CompCert don't. * * In Mbed TLS, multipart operation structures live independently from * the key. This allows Mbed TLS to free the key objects when destroying * a key slot. If a multipart operation needs to remember the key after * the setup function returns, the operation structure needs to contain a * copy of the key. *//* ... *//* * Copyright The Mbed TLS Contributors * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later *//* ... */#ifndefPSA_CRYPTO_STRUCT_H#definePSA_CRYPTO_STRUCT_H#ifdef__cplusplusextern"C"{#endif/* Include the Mbed TLS configuration file, the way Mbed TLS does it * in each of its header files. *//* ... */#if!defined(MBEDTLS_CONFIG_FILE)#include"mbedtls/config.h"#else#includeMBEDTLS_CONFIG_FILE#endif#include"mbedtls/cmac.h"#include"mbedtls/gcm.h"/* Include the context definition for the compiled-in drivers for the primitive * algorithms. *//* ... */#include"psa/crypto_driver_contexts_primitives.h"structpsa_hash_operation_s{/** Unique ID indicating which driver got assigned to do the * operation. Since driver contexts are driver-specific, swapping * drivers halfway through the operation is not supported. * ID values are auto-generated in psa_driver_wrappers.h. * ID value zero means the context is not valid or not assigned to * any driver (i.e. the driver context is not active, in use). *//* ... */unsignedintid;psa_driver_hash_context_tctx;...};#definePSA_HASH_OPERATION_INIT{0,{0}}staticinlinestructpsa_hash_operation_spsa_hash_operation_init(void){conststructpsa_hash_operation_sv=PSA_HASH_OPERATION_INIT;returnv;}{ ... }structpsa_cipher_operation_s{/** Unique ID indicating which driver got assigned to do the * operation. Since driver contexts are driver-specific, swapping * drivers halfway through the operation is not supported. * ID values are auto-generated in psa_crypto_driver_wrappers.h * ID value zero means the context is not valid or not assigned to * any driver (i.e. none of the driver contexts are active). *//* ... */unsignedintid;unsignedintiv_required:1;unsignedintiv_set:1;uint8_tdefault_iv_length;psa_driver_cipher_context_tctx;...};#definePSA_CIPHER_OPERATION_INIT{0,0,0,0,{0}}staticinlinestructpsa_cipher_operation_spsa_cipher_operation_init(void){conststructpsa_cipher_operation_sv=PSA_CIPHER_OPERATION_INIT;returnv;}{ ... }/* Include the context definition for the compiled-in drivers for the composite * algorithms. *//* ... */#include"psa/crypto_driver_contexts_composites.h"structpsa_mac_operation_s{/** Unique ID indicating which driver got assigned to do the * operation. Since driver contexts are driver-specific, swapping * drivers halfway through the operation is not supported. * ID values are auto-generated in psa_driver_wrappers.h * ID value zero means the context is not valid or not assigned to * any driver (i.e. none of the driver contexts are active). *//* ... */unsignedintid;uint8_tmac_size;unsignedintis_sign:1;psa_driver_mac_context_tctx;...};#definePSA_MAC_OPERATION_INIT{0,0,0,{0}}staticinlinestructpsa_mac_operation_spsa_mac_operation_init(void){conststructpsa_mac_operation_sv=PSA_MAC_OPERATION_INIT;returnv;}{ ... }structpsa_aead_operation_s{psa_algorithm_talg;unsignedintkey_set:1;unsignedintiv_set:1;uint8_tiv_size;uint8_tblock_size;union{unsigneddummy;/* Enable easier initializing of the union. */mbedtls_cipher_context_tcipher;...}ctx;...};#definePSA_AEAD_OPERATION_INIT{0,0,0,0,0,{0}}staticinlinestructpsa_aead_operation_spsa_aead_operation_init(void){conststructpsa_aead_operation_sv=PSA_AEAD_OPERATION_INIT;returnv;}{ ... }#ifdefined(MBEDTLS_PSA_BUILTIN_ALG_HKDF)typedefstruct{uint8_t*info;size_tinfo_length;#ifPSA_HASH_MAX_SIZE>0xff#error"PSA_HASH_MAX_SIZE does not fit in uint8_t"#endifuint8_toffset_in_block;uint8_tblock_number;unsignedintstate:2;unsignedintinfo_set:1;uint8_toutput_block[PSA_HASH_MAX_SIZE];uint8_tprk[PSA_HASH_MAX_SIZE];structpsa_mac_operation_shmac;...}psa_hkdf_key_derivation_t;/* ... */#endif/* MBEDTLS_PSA_BUILTIN_ALG_HKDF */#ifdefined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF)||\defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS)typedefenum{PSA_TLS12_PRF_STATE_INIT,/* no input provided */PSA_TLS12_PRF_STATE_SEED_SET,/* seed has been set */PSA_TLS12_PRF_STATE_KEY_SET,/* key has been set */PSA_TLS12_PRF_STATE_LABEL_SET,/* label has been set */PSA_TLS12_PRF_STATE_OUTPUT/* output has been started */...}psa_tls12_prf_key_derivation_state_t;typedefstructpsa_tls12_prf_key_derivation_s{#ifPSA_HASH_MAX_SIZE>0xff#error"PSA_HASH_MAX_SIZE does not fit in uint8_t"#endif/* Indicates how many bytes in the current HMAC block have * not yet been read by the user. *//* ... */uint8_tleft_in_block;/* The 1-based number of the block. */uint8_tblock_number;psa_tls12_prf_key_derivation_state_tstate;uint8_t*secret;size_tsecret_length;uint8_t*seed;size_tseed_length;uint8_t*label;size_tlabel_length;uint8_tAi[PSA_HASH_MAX_SIZE];/* `HMAC_hash( prk, A(i) + seed )` in the notation of RFC 5246, Sect. 5. */uint8_toutput_block[PSA_HASH_MAX_SIZE];...}psa_tls12_prf_key_derivation_t;/* ... */#endif/* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || * MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS *//* ... */structpsa_key_derivation_s{psa_algorithm_talg;unsignedintcan_output_key:1;size_tcapacity;union{/* Make the union non-empty even with no supported algorithms. */uint8_tdummy;#ifdefined(MBEDTLS_PSA_BUILTIN_ALG_HKDF)psa_hkdf_key_derivation_thkdf;#endif#ifdefined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF)||\defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS)psa_tls12_prf_key_derivation_ttls12_prf;#endif...}ctx;...};/* This only zeroes out the first byte in the union, the rest is unspecified. */#definePSA_KEY_DERIVATION_OPERATION_INIT{0,0,0,{0}}staticinlinestructpsa_key_derivation_spsa_key_derivation_operation_init(void){conststructpsa_key_derivation_sv=PSA_KEY_DERIVATION_OPERATION_INIT;returnv;}{ ... }structpsa_key_policy_s{psa_key_usage_tusage;psa_algorithm_talg;psa_algorithm_talg2;...};typedefstructpsa_key_policy_spsa_key_policy_t;#definePSA_KEY_POLICY_INIT{0,0,0}staticinlinestructpsa_key_policy_spsa_key_policy_init(void){conststructpsa_key_policy_sv=PSA_KEY_POLICY_INIT;returnv;}{ ... }/* The type used internally for key sizes. * Public interfaces use size_t, but internally we use a smaller type. *//* ... */typedefuint16_tpsa_key_bits_t;/* The maximum value of the type used to represent bit-sizes. * This is used to mark an invalid key size. *//* ... */#definePSA_KEY_BITS_TOO_LARGE((psa_key_bits_t)(-1))/* The maximum size of a key in bits. * Currently defined as the maximum that can be represented, rounded down * to a whole number of bytes. * This is an uncast value so that it can be used in preprocessor * conditionals. *//* ... */#definePSA_MAX_KEY_BITS0xfff8/** A mask of flags that can be stored in key attributes. * * This type is also used internally to store flags in slots. Internal * flags are defined in library/psa_crypto_core.h. Internal flags may have * the same value as external flags if they are properly handled during * key creation and in psa_get_key_attributes. *//* ... */typedefuint16_tpsa_key_attributes_flag_t;#defineMBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER\((psa_key_attributes_flag_t)0x0001).../* A mask of key attribute flags used externally only. * Only meant for internal checks inside the library. *//* ... */#defineMBEDTLS_PSA_KA_MASK_EXTERNAL_ONLY(\MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER|\0).../* A mask of key attribute flags used both internally and externally. * Currently there aren't any. *//* ... */#defineMBEDTLS_PSA_KA_MASK_DUAL_USE(\0)...typedefstruct{psa_key_type_ttype;psa_key_bits_tbits;psa_key_lifetime_tlifetime;mbedtls_svc_key_id_tid;psa_key_policy_tpolicy;psa_key_attributes_flag_tflags;...}psa_core_key_attributes_t;#definePSA_CORE_KEY_ATTRIBUTES_INIT{PSA_KEY_TYPE_NONE,0,PSA_KEY_LIFETIME_VOLATILE,\MBEDTLS_SVC_KEY_ID_INIT,PSA_KEY_POLICY_INIT,0...}...structpsa_key_attributes_s{psa_core_key_attributes_tcore;#ifdefined(MBEDTLS_PSA_CRYPTO_SE_C)psa_key_slot_number_tslot_number;#endif/* MBEDTLS_PSA_CRYPTO_SE_C */void*domain_parameters;size_tdomain_parameters_size;...};#ifdefined(MBEDTLS_PSA_CRYPTO_SE_C)#definePSA_KEY_ATTRIBUTES_INIT{PSA_CORE_KEY_ATTRIBUTES_INIT,0,NULL,0}#else#definePSA_KEY_ATTRIBUTES_INIT{PSA_CORE_KEY_ATTRIBUTES_INIT,NULL,0}#endifstaticinlinestructpsa_key_attributes_spsa_key_attributes_init(void){conststructpsa_key_attributes_sv=PSA_KEY_ATTRIBUTES_INIT;returnv;}{ ... }staticinlinevoidpsa_set_key_id(psa_key_attributes_t*attributes,mbedtls_svc_key_id_tkey){psa_key_lifetime_tlifetime=attributes->core.lifetime;attributes->core.id=key;if(PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)){attributes->core.lifetime=PSA_KEY_LIFETIME_FROM_PERSISTENCE_AND_LOCATION(PSA_KEY_LIFETIME_PERSISTENT,PSA_KEY_LIFETIME_GET_LOCATION(lifetime));}if (PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)) { ... }}{ ... }staticinlinembedtls_svc_key_id_tpsa_get_key_id(constpsa_key_attributes_t*attributes){returnattributes->core.id;}{ ... }#ifdefMBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNERstaticinlinevoidmbedtls_set_key_owner_id(psa_key_attributes_t*attributes,mbedtls_key_owner_id_towner){attributes->core.id.owner=owner;}mbedtls_set_key_owner_id (psa_key_attributes_t *attributes, mbedtls_key_owner_id_t owner) { ... }/* ... */#endifstaticinlinevoidpsa_set_key_lifetime(psa_key_attributes_t*attributes,psa_key_lifetime_tlifetime){attributes->core.lifetime=lifetime;if(PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)){#ifdefMBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNERattributes->core.id.key_id=0;#elseattributes->core.id=0;#endif}if (PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)) { ... }}{ ... }staticinlinepsa_key_lifetime_tpsa_get_key_lifetime(constpsa_key_attributes_t*attributes){returnattributes->core.lifetime;}{ ... }staticinlinevoidpsa_extend_key_usage_flags(psa_key_usage_t*usage_flags){if(*usage_flags&PSA_KEY_USAGE_SIGN_HASH){*usage_flags|=PSA_KEY_USAGE_SIGN_MESSAGE;}if (*usage_flags & PSA_KEY_USAGE_SIGN_HASH) { ... }if(*usage_flags&PSA_KEY_USAGE_VERIFY_HASH){*usage_flags|=PSA_KEY_USAGE_VERIFY_MESSAGE;}if (*usage_flags & PSA_KEY_USAGE_VERIFY_HASH) { ... }}{ ... }staticinlinevoidpsa_set_key_usage_flags(psa_key_attributes_t*attributes,psa_key_usage_tusage_flags){psa_extend_key_usage_flags(&usage_flags);attributes->core.policy.usage=usage_flags;}{ ... }staticinlinepsa_key_usage_tpsa_get_key_usage_flags(constpsa_key_attributes_t*attributes){returnattributes->core.policy.usage;}{ ... }staticinlinevoidpsa_set_key_algorithm(psa_key_attributes_t*attributes,psa_algorithm_talg){attributes->core.policy.alg=alg;}{ ... }staticinlinepsa_algorithm_tpsa_get_key_algorithm(constpsa_key_attributes_t*attributes){returnattributes->core.policy.alg;}{ ... }/* This function is declared in crypto_extra.h, which comes after this * header file, but we need the function here, so repeat the declaration. *//* ... */psa_status_tpsa_set_key_domain_parameters(psa_key_attributes_t*attributes,psa_key_type_ttype,constuint8_t*data,size_tdata_length);staticinlinevoidpsa_set_key_type(psa_key_attributes_t*attributes,psa_key_type_ttype){if(attributes->domain_parameters==NULL){/* Common case: quick path */attributes->core.type=type;}if (attributes->domain_parameters == NULL) { ... }else{/* Call the bigger function to free the old domain parameters. * Ignore any errors which may arise due to type requiring * non-default domain parameters, since this function can't * report errors. *//* ... */(void)psa_set_key_domain_parameters(attributes,type,NULL,0);}else { ... }}{ ... }staticinlinepsa_key_type_tpsa_get_key_type(constpsa_key_attributes_t*attributes){returnattributes->core.type;}{ ... }staticinlinevoidpsa_set_key_bits(psa_key_attributes_t*attributes,size_tbits){if(bits>PSA_MAX_KEY_BITS){attributes->core.bits=PSA_KEY_BITS_TOO_LARGE;}if (bits > PSA_MAX_KEY_BITS) { ... }else{attributes->core.bits=(psa_key_bits_t)bits;}else { ... }}{ ... }staticinlinesize_tpsa_get_key_bits(constpsa_key_attributes_t*attributes){returnattributes->core.bits;}{ ... }#ifdef__cplusplus}extern "C" { ... }#endif/* ... */#endif/* PSA_CRYPTO_STRUCT_H */
Details
Show: from
Types: Columns:
All items filtered out
All items filtered out
This file uses the notable symbols shown below. Click anywhere in the file to view more details.