crypto_struct.h
mbedtls/config.h
mbedtls/cmac.h
mbedtls/gcm.h
psa/crypto_driver_contexts_primitives.h
psa/crypto_driver_contexts_composites.h
crypto.h
mbedtls/check_config.h
mbedtls/cipher.h
mbedtls/cmac.h
mbedtls/config.h
mbedtls/config_psa.h
mbedtls/gcm.h
mbedtls/md2.h
mbedtls/md4.h
mbedtls/md5.h
mbedtls/platform_time.h
mbedtls/platform_util.h
mbedtls/ripemd160.h
mbedtls/sha1.h
mbedtls/sha256.h
mbedtls/sha512.h
psa/crypto_builtin_composites.h
psa/crypto_builtin_primitives.h
psa/crypto_driver_common.h
psa/crypto_driver_contexts_composites.h
psa/crypto_driver_contexts_primitives.h
crypto_platform.h
psa/crypto_sizes.h
crypto_struct.h
crypto_types.h
crypto_values.h
limits.h
stddef.h
stdint.h
time.h
crypto.h
crypto_struct.h
psa_hash_operation_s
psa_cipher_operation_s
psa_mac_operation_s
psa_aead_operation_s
psa_hkdf_key_derivation_t
psa_tls12_prf_key_derivation_s
psa_key_derivation_s
psa_key_policy_s
psa_core_key_attributes_t
psa_key_attributes_s
- PSA_HASH_OPERATION_INIT
- PSA_CIPHER_OPERATION_INIT
- PSA_MAC_OPERATION_INIT
- PSA_AEAD_OPERATION_INIT
- PSA_KEY_DERIVATION_OPERATION_INIT
PSA_KEY_POLICY_INIT
{ 0, 0, 0 }
PSA_KEY_BITS_TOO_LARGE
((psa_key_bits_t) (-1))
PSA_MAX_KEY_BITS
0xfff8
MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER
((psa_key_attributes_flag_t) 0x0001)
MBEDTLS_PSA_KA_MASK_EXTERNAL_ONLY
( \ MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER | \ 0)
MBEDTLS_PSA_KA_MASK_DUAL_USE
( \ 0)
PSA_CORE_KEY_ATTRIBUTES_INIT
{ PSA_KEY_TYPE_NONE, 0, PSA_KEY_LIFETIME_VOLATILE, \ MBEDTLS_SVC_KEY_ID_INIT, PSA_KEY_POLICY_INIT, 0 }
- PSA_KEY_ATTRIBUTES_INIT
psa_tls12_prf_key_derivation_state_t
PSA_TLS12_PRF_STATE_INIT
PSA_TLS12_PRF_STATE_SEED_SET
PSA_TLS12_PRF_STATE_KEY_SET
PSA_TLS12_PRF_STATE_LABEL_SET
PSA_TLS12_PRF_STATE_OUTPUT
struct psa_tls12_prf_key_derivation_s typedef struct psa_tls12_prf_key_derivation_s psa_tls12_prf_key_derivation_t psa_tls12_prf_key_derivation_t
struct psa_key_policy_s typedef struct psa_key_policy_s psa_key_policy_t psa_key_policy_t
uint16_t typedef uint16_t psa_key_bits_t psa_key_bits_t
uint16_t typedef uint16_t psa_key_attributes_flag_t psa_key_attributes_flag_t

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.

struct psa_hash_operation_s static struct psa_hash_operation_s psa_hash_operation_init (void) psa_hash_operation_init void PSA_HASH_OPERATION_INIT
struct psa_cipher_operation_s static struct psa_cipher_operation_s psa_cipher_operation_init (void) psa_cipher_operation_init void PSA_CIPHER_OPERATION_INIT
struct psa_mac_operation_s static struct psa_mac_operation_s psa_mac_operation_init (void) psa_mac_operation_init void PSA_MAC_OPERATION_INIT
struct psa_aead_operation_s static struct psa_aead_operation_s psa_aead_operation_init (void) psa_aead_operation_init void PSA_AEAD_OPERATION_INIT
struct psa_key_derivation_s static struct psa_key_derivation_s psa_key_derivation_operation_init (void) psa_key_derivation_operation_init void PSA_KEY_DERIVATION_OPERATION_INIT
struct psa_key_policy_s static struct psa_key_policy_s psa_key_policy_init (void) psa_key_policy_init void PSA_KEY_POLICY_INIT
struct psa_key_attributes_s static struct psa_key_attributes_s psa_key_attributes_init (void) psa_key_attributes_init void PSA_KEY_ATTRIBUTES_INIT
void static void psa_set_key_id (psa_key_attributes_t *attributes, mbedtls_svc_key_id_t key) psa_set_key_id psa_key_attributes_t * attributes mbedtls_svc_key_id_t key psa_key_attributes_s::core psa_core_key_attributes_t::id psa_core_key_attributes_t::lifetime PSA_KEY_LIFETIME_FROM_PERSISTENCE_AND_LOCATION PSA_KEY_LIFETIME_GET_LOCATION PSA_KEY_LIFETIME_IS_VOLATILE PSA_KEY_LIFETIME_PERSISTENT
mbedtls_svc_key_id_t static mbedtls_svc_key_id_t psa_get_key_id (const psa_key_attributes_t *attributes) psa_get_key_id const psa_key_attributes_t * attributes psa_key_attributes_s::core psa_core_key_attributes_t::id
void static void psa_set_key_lifetime (psa_key_attributes_t *attributes, psa_key_lifetime_t lifetime) psa_set_key_lifetime psa_key_attributes_t * attributes psa_key_lifetime_t lifetime psa_key_attributes_s::core psa_core_key_attributes_t::id psa_core_key_attributes_t::lifetime PSA_KEY_LIFETIME_IS_VOLATILE
psa_key_lifetime_t static psa_key_lifetime_t psa_get_key_lifetime (const psa_key_attributes_t *attributes) psa_get_key_lifetime const psa_key_attributes_t * attributes psa_key_attributes_s::core psa_core_key_attributes_t::lifetime
void static void psa_extend_key_usage_flags (psa_key_usage_t *usage_flags) psa_extend_key_usage_flags psa_key_usage_t * usage_flags PSA_KEY_USAGE_SIGN_HASH PSA_KEY_USAGE_SIGN_MESSAGE PSA_KEY_USAGE_VERIFY_HASH PSA_KEY_USAGE_VERIFY_MESSAGE psa_set_key_usage_flags
void static void psa_set_key_usage_flags (psa_key_attributes_t *attributes, psa_key_usage_t usage_flags) psa_set_key_usage_flags psa_key_attributes_t * attributes psa_key_usage_t usage_flags psa_key_attributes_s::core psa_core_key_attributes_t::policy psa_extend_key_usage_flags psa_key_policy_s::usage
psa_key_usage_t static psa_key_usage_t psa_get_key_usage_flags (const psa_key_attributes_t *attributes) psa_get_key_usage_flags const psa_key_attributes_t * attributes psa_key_attributes_s::core psa_core_key_attributes_t::policy psa_key_policy_s::usage
void static void psa_set_key_algorithm (psa_key_attributes_t *attributes, psa_algorithm_t alg) psa_set_key_algorithm psa_key_attributes_t * attributes psa_algorithm_t alg psa_key_policy_s::alg psa_key_attributes_s::core psa_core_key_attributes_t::policy
psa_algorithm_t static psa_algorithm_t psa_get_key_algorithm (const psa_key_attributes_t *attributes) psa_get_key_algorithm const psa_key_attributes_t * attributes psa_key_policy_s::alg psa_key_attributes_s::core psa_core_key_attributes_t::policy
psa_status_t psa_status_t psa_set_key_domain_parameters (psa_key_attributes_t *attributes, psa_key_type_t type, const uint8_t *data, size_t data_length) psa_set_key_domain_parameters psa_key_attributes_t * attributes psa_key_type_t type const uint8_t * data size_t data_length psa_set_key_type
void static void psa_set_key_type (psa_key_attributes_t *attributes, psa_key_type_t type) psa_set_key_type psa_key_attributes_t * attributes psa_key_type_t type psa_key_attributes_s::core psa_key_attributes_s::domain_parameters psa_set_key_domain_parameters psa_core_key_attributes_t::type
psa_key_type_t static psa_key_type_t psa_get_key_type (const psa_key_attributes_t *attributes) psa_get_key_type const psa_key_attributes_t * attributes psa_key_attributes_s::core psa_core_key_attributes_t::type
void static void psa_set_key_bits (psa_key_attributes_t *attributes, size_t bits) psa_set_key_bits psa_key_attributes_t * attributes size_t bits psa_core_key_attributes_t::bits psa_key_attributes_s::core PSA_KEY_BITS_TOO_LARGE PSA_MAX_KEY_BITS
size_t static size_t psa_get_key_bits (const psa_key_attributes_t *attributes) psa_get_key_bits const psa_key_attributes_t * attributes psa_core_key_attributes_t::bits psa_key_attributes_s::core

PSA cryptography module: Mbed TLS structured type implementations.

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.

Design notes about multipart operation structures

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.

    /*
    *CopyrightTheMbedTLSContributors
    *SPDX-License-Identifier:Apache-2.0ORGPL-2.0-or-later
    */

    #ifndefPSA_CRYPTO_STRUCT_H
    #definePSA_CRYPTO_STRUCT_H

    #ifdef__cplusplus
    extern"C"{
    #endif

    /*IncludetheMbedTLSconfigurationfile,thewayMbedTLSdoesit
    *ineachofitsheaderfiles.*/
    #if!defined(MBEDTLS_CONFIG_FILE)
    #include"mbedtls/config.h"
    #else
    #includeMBEDTLS_CONFIG_FILE
    #endif

    #include"mbedtls/cmac.h"
    #include"mbedtls/gcm.h"

    /*Includethecontextdefinitionforthecompiled-indriversfortheprimitive
    *algorithms.*/
    #include"psa/crypto_driver_contexts_primitives.h"

    structpsa_hash_operation_s{
    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{
    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;
    }

    /*Includethecontextdefinitionforthecompiled-indriversforthecomposite
    *algorithms.*/
    #include"psa/crypto_driver_contexts_composites.h"

    structpsa_mac_operation_s{
    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;/*Enableeasierinitializingoftheunion.*/
    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_SIZEdoesnotfitinuint8_t"
    #endif
    uint8_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,/*noinputprovided*/
    PSA_TLS12_PRF_STATE_SEED_SET,/*seedhasbeenset*/
    PSA_TLS12_PRF_STATE_KEY_SET,/*keyhasbeenset*/
    PSA_TLS12_PRF_STATE_LABEL_SET,/*labelhasbeenset*/
    PSA_TLS12_PRF_STATE_OUTPUT/*outputhasbeenstarted*/
    }psa_tls12_prf_key_derivation_state_t;

    typedefstructpsa_tls12_prf_key_derivation_s{
    #ifPSA_HASH_MAX_SIZE>0xff
    #error"PSA_HASH_MAX_SIZEdoesnotfitinuint8_t"
    #endif

    /*IndicateshowmanybytesinthecurrentHMACblockhave
    *notyetbeenreadbytheuser.*/
    uint8_tleft_in_block;

    /*The1-basednumberoftheblock.*/
    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)`inthenotationofRFC5246,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{
    /*Maketheunionnon-emptyevenwithnosupportedalgorithms.*/
    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;
    };

    /*Thisonlyzeroesoutthefirstbyteintheunion,therestisunspecified.*/
    #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;
    }

    /*Thetypeusedinternallyforkeysizes.
    *Publicinterfacesusesize_t,butinternallyweuseasmallertype.*/
    typedefuint16_tpsa_key_bits_t;
    /*Themaximumvalueofthetypeusedtorepresentbit-sizes.
    *Thisisusedtomarkaninvalidkeysize.*/
    #definePSA_KEY_BITS_TOO_LARGE((psa_key_bits_t)(-1))
    /*Themaximumsizeofakeyinbits.
    *Currentlydefinedasthemaximumthatcanberepresented,roundeddown
    *toawholenumberofbytes.
    *Thisisanuncastvaluesothatitcanbeusedinpreprocessor
    *conditionals.*/
    #definePSA_MAX_KEY_BITS0xfff8

    typedefuint16_tpsa_key_attributes_flag_t;

    #defineMBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER\
    ((psa_key_attributes_flag_t)0x0001)

    /*Amaskofkeyattributeflagsusedexternallyonly.
    *Onlymeantforinternalchecksinsidethelibrary.*/
    #defineMBEDTLS_PSA_KA_MASK_EXTERNAL_ONLY(\
    MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER|\
    0)

    /*Amaskofkeyattributeflagsusedbothinternallyandexternally.
    *Currentlytherearen'tany.*/
    #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}
    #endif

    staticinlinestructpsa_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));
    }
    }

    staticinlinembedtls_svc_key_id_tpsa_get_key_id(
    constpsa_key_attributes_t*attributes)
    {
    returnattributes->core.id;
    }

    #ifdefMBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER
    staticinlinevoidmbedtls_set_key_owner_id(psa_key_attributes_t*attributes,
    mbedtls_key_owner_id_towner)
    {
    attributes->core.id.owner=owner;
    }
    #endif

    staticinlinevoidpsa_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_OWNER
    attributes->core.id.key_id=0;
    #else
    attributes->core.id=0;
    #endif
    }
    }

    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_VERIFY_HASH){
    *usage_flags|=PSA_KEY_USAGE_VERIFY_MESSAGE;
    }
    }

    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;
    }

    /*Thisfunctionisdeclaredincrypto_extra.h,whichcomesafterthis
    *headerfile,butweneedthefunctionhere,sorepeatthedeclaration.*/
    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){
    /*Commoncase:quickpath*/
    attributes->core.type=type;
    }else{
    /*Callthebiggerfunctiontofreetheolddomainparameters.
    *Ignoreanyerrorswhichmayariseduetotyperequiring
    *non-defaultdomainparameters,sincethisfunctioncan't
    *reporterrors.*/
    (void)psa_set_key_domain_parameters(attributes,type,NULL,0);
    }
    }

    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;
    }else{
    attributes->core.bits=(psa_key_bits_t)bits;
    }
    }

    staticinlinesize_tpsa_get_key_bits(
    constpsa_key_attributes_t*attributes)
    {
    returnattributes->core.bits;
    }

    #ifdef__cplusplus
    }
    #endif

    #endif/*PSA_CRYPTO_STRUCT_H*/