crypto_struct.h
mbedtls/private_access.h
psa/build_info.h
psa/crypto_driver_contexts_primitives.h
psa/crypto_driver_contexts_composites.h
psa/crypto_driver_contexts_key_derivation.h
crypto.h
mbedtls/bignum.h
mbedtls/build_info.h
mbedtls/ccm.h
mbedtls/chacha20.h
mbedtls/chachapoly.h
mbedtls/check_config.h
mbedtls/cipher.h
mbedtls/cmac.h
mbedtls/config_adjust_legacy_crypto.h
mbedtls/config_adjust_psa_from_legacy.h
mbedtls/config_adjust_psa_superset_legacy.h
mbedtls/config_adjust_ssl.h
mbedtls/config_adjust_x509.h
mbedtls/config_psa.h
mbedtls/ecdsa.h
mbedtls/ecjpake.h
mbedtls/ecp.h
mbedtls/gcm.h
mbedtls/mbedtls_config.h
mbedtls/md.h
mbedtls/md5.h
mbedtls/platform_time.h
mbedtls/platform_util.h
mbedtls/poly1305.h
mbedtls/private_access.h
mbedtls/ripemd160.h
mbedtls/sha1.h
mbedtls/sha256.h
mbedtls/sha3.h
mbedtls/sha512.h
psa/build_info.h
psa/crypto_adjust_auto_enabled.h
psa/crypto_adjust_config_dependencies.h
psa/crypto_adjust_config_key_pair_types.h
psa/crypto_adjust_config_synonyms.h
psa/crypto_builtin_composites.h
psa/crypto_builtin_key_derivation.h
psa/crypto_builtin_primitives.h
psa/crypto_driver_common.h
psa/crypto_driver_contexts_composites.h
psa/crypto_driver_contexts_key_derivation.h
psa/crypto_driver_contexts_primitives.h
psa/crypto_legacy.h
crypto_platform.h
psa/crypto_sizes.h
crypto_struct.h
crypto_types.h
crypto_values.h
inttypes.h
limits.h
stddef.h
stdint.h
stdio.h
time.h
debug.h
net_sockets.h
oid.h
pk.h
pkcs7.h
psa_util.h
ssl.h
ssl_cache.h
ssl_ciphersuites.h
ssl_cookie.h
ssl_ticket.h
x509.h
x509_crl.h
x509_crt.h
x509_csr.h
crypto.h
crypto_struct.h
psa_hash_operation_s
psa_cipher_operation_s
psa_mac_operation_s
psa_aead_operation_s
psa_key_derivation_s
psa_custom_key_parameters_s
psa_key_production_parameters_s
psa_key_policy_s
psa_key_attributes_s
psa_sign_hash_interruptible_operation_s
psa_verify_hash_interruptible_operation_s
- PSA_HASH_OPERATION_INIT
- PSA_CIPHER_OPERATION_INIT
- PSA_MAC_OPERATION_INIT
- PSA_AEAD_OPERATION_INIT
- PSA_KEY_DERIVATION_OPERATION_INIT
PSA_CUSTOM_KEY_PARAMETERS_INIT
{ 0 }

The default production parameters for key generation or key derivation.

Calling psa_generate_key_custom() or psa_key_derivation_output_key_custom() with `custom=PSA_CUSTOM_KEY_PARAMETERS_INIT` and `custom_data_length=0` is equivalent to calling psa_generate_key() or psa_key_derivation_output_key() respectively.

PSA_KEY_PRODUCTION_PARAMETERS_INIT
{ 0 }

The default production parameters for key generation or key derivation.

Calling psa_generate_key_ext() or psa_key_derivation_output_key_ext() with `params=PSA_KEY_PRODUCTION_PARAMETERS_INIT` and `params_data_length == 0` is equivalent to calling psa_generate_key() or psa_key_derivation_output_key() respectively.

PSA_KEY_POLICY_INIT
{ 0, 0, 0 }
psa_key_policy_init
PSA_KEY_BITS_TOO_LARGE
((psa_key_bits_t) -1)
psa_set_key_bits
PSA_MAX_KEY_BITS
0xfff8
psa_set_key_bits
PSA_KEY_ATTRIBUTES_MAYBE_SLOT_NUMBER
- PSA_KEY_ATTRIBUTES_INIT
PSA_SIGN_HASH_INTERRUPTIBLE_OPERATION_INIT
{ 0, { 0 }, 0, 0 }
psa_sign_hash_interruptible_operation_init
PSA_VERIFY_HASH_INTERRUPTIBLE_OPERATION_INIT
{ 0, { 0 }, 0, 0 }
psa_verify_hash_interruptible_operation_init
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
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 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 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 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 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 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 psa_key_policy_init 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 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_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
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_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
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_extend_key_usage_flags
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
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_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
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_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
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_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
struct psa_sign_hash_interruptible_operation_s static struct psa_sign_hash_interruptible_operation_s psa_sign_hash_interruptible_operation_init (void) psa_sign_hash_interruptible_operation_init void PSA_SIGN_HASH_INTERRUPTIBLE_OPERATION_INIT psa_sign_hash_interruptible_operation_init psa_sign_hash_interruptible_operation_init
struct psa_verify_hash_interruptible_operation_s static struct psa_verify_hash_interruptible_operation_s psa_verify_hash_interruptible_operation_init (void) psa_verify_hash_interruptible_operation_init void PSA_VERIFY_HASH_INTERRUPTIBLE_OPERATION_INIT psa_verify_hash_interruptible_operation_init psa_verify_hash_interruptible_operation_init

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
    #include"mbedtls/private_access.h"

    #ifdef__cplusplus
    extern"C"{
    #endif

    /*
    *Includethebuild-timeconfigurationinformationheader.Here,wedonot
    *include`"mbedtls/build_info.h"`directlybut`"psa/build_info.h"`,which
    *isbasicallyjustanaliastoit.Thisistoeasethemaintenanceofthe
    *TF-PSA-Cryptorepositorywhichhasadifferentbuildsystemand
    *configuration.
    */
    #include"psa/build_info.h"

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

    structpsa_hash_operation_s{
    #ifdefined(MBEDTLS_PSA_CRYPTO_CLIENT)&&!defined(MBEDTLS_PSA_CRYPTO_C)
    mbedtls_psa_client_handle_thandle;
    #else
    unsignedintMBEDTLS_PRIVATE(id);
    psa_driver_hash_context_tMBEDTLS_PRIVATE(ctx);
    #endif
    };
    #ifdefined(MBEDTLS_PSA_CRYPTO_CLIENT)&&!defined(MBEDTLS_PSA_CRYPTO_C)
    #definePSA_HASH_OPERATION_INIT{0}
    #else
    #definePSA_HASH_OPERATION_INIT{0,{0}}
    #endif
    staticinlinestructpsa_hash_operation_spsa_hash_operation_init(void)
    {
    conststructpsa_hash_operation_sv=PSA_HASH_OPERATION_INIT;
    returnv;
    }

    structpsa_cipher_operation_s{
    #ifdefined(MBEDTLS_PSA_CRYPTO_CLIENT)&&!defined(MBEDTLS_PSA_CRYPTO_C)
    mbedtls_psa_client_handle_thandle;
    #else
    unsignedintMBEDTLS_PRIVATE(id);

    unsignedintMBEDTLS_PRIVATE(iv_required):1;
    unsignedintMBEDTLS_PRIVATE(iv_set):1;

    uint8_tMBEDTLS_PRIVATE(default_iv_length);

    psa_driver_cipher_context_tMBEDTLS_PRIVATE(ctx);
    #endif
    };

    #ifdefined(MBEDTLS_PSA_CRYPTO_CLIENT)&&!defined(MBEDTLS_PSA_CRYPTO_C)
    #definePSA_CIPHER_OPERATION_INIT{0}
    #else
    #definePSA_CIPHER_OPERATION_INIT{0,0,0,0,{0}}
    #endif
    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{
    #ifdefined(MBEDTLS_PSA_CRYPTO_CLIENT)&&!defined(MBEDTLS_PSA_CRYPTO_C)
    mbedtls_psa_client_handle_thandle;
    #else
    unsignedintMBEDTLS_PRIVATE(id);
    uint8_tMBEDTLS_PRIVATE(mac_size);
    unsignedintMBEDTLS_PRIVATE(is_sign):1;
    psa_driver_mac_context_tMBEDTLS_PRIVATE(ctx);
    #endif
    };

    #ifdefined(MBEDTLS_PSA_CRYPTO_CLIENT)&&!defined(MBEDTLS_PSA_CRYPTO_C)
    #definePSA_MAC_OPERATION_INIT{0}
    #else
    #definePSA_MAC_OPERATION_INIT{0,0,0,{0}}
    #endif
    staticinlinestructpsa_mac_operation_spsa_mac_operation_init(void)
    {
    conststructpsa_mac_operation_sv=PSA_MAC_OPERATION_INIT;
    returnv;
    }

    structpsa_aead_operation_s{
    #ifdefined(MBEDTLS_PSA_CRYPTO_CLIENT)&&!defined(MBEDTLS_PSA_CRYPTO_C)
    mbedtls_psa_client_handle_thandle;
    #else
    unsignedintMBEDTLS_PRIVATE(id);

    psa_algorithm_tMBEDTLS_PRIVATE(alg);
    psa_key_type_tMBEDTLS_PRIVATE(key_type);

    size_tMBEDTLS_PRIVATE(ad_remaining);
    size_tMBEDTLS_PRIVATE(body_remaining);

    unsignedintMBEDTLS_PRIVATE(nonce_set):1;
    unsignedintMBEDTLS_PRIVATE(lengths_set):1;
    unsignedintMBEDTLS_PRIVATE(ad_started):1;
    unsignedintMBEDTLS_PRIVATE(body_started):1;
    unsignedintMBEDTLS_PRIVATE(is_encrypt):1;

    psa_driver_aead_context_tMBEDTLS_PRIVATE(ctx);
    #endif
    };

    #ifdefined(MBEDTLS_PSA_CRYPTO_CLIENT)&&!defined(MBEDTLS_PSA_CRYPTO_C)
    #definePSA_AEAD_OPERATION_INIT{0}
    #else
    #definePSA_AEAD_OPERATION_INIT{0,0,0,0,0,0,0,0,0,0,{0}}
    #endif
    staticinlinestructpsa_aead_operation_spsa_aead_operation_init(void)
    {
    conststructpsa_aead_operation_sv=PSA_AEAD_OPERATION_INIT;
    returnv;
    }

    /*Includethecontextdefinitionforthecompiled-indriversforthekey
    *derivationalgorithms.*/
    #include"psa/crypto_driver_contexts_key_derivation.h"

    structpsa_key_derivation_s{
    #ifdefined(MBEDTLS_PSA_CRYPTO_CLIENT)&&!defined(MBEDTLS_PSA_CRYPTO_C)
    mbedtls_psa_client_handle_thandle;
    #else
    psa_algorithm_tMBEDTLS_PRIVATE(alg);
    unsignedintMBEDTLS_PRIVATE(can_output_key):1;
    size_tMBEDTLS_PRIVATE(capacity);
    psa_driver_key_derivation_context_tMBEDTLS_PRIVATE(ctx);
    #endif
    };

    #ifdefined(MBEDTLS_PSA_CRYPTO_CLIENT)&&!defined(MBEDTLS_PSA_CRYPTO_C)
    #definePSA_KEY_DERIVATION_OPERATION_INIT{0}
    #else
    /*Thisonlyzeroesoutthefirstbyteintheunion,therestisunspecified.*/
    #definePSA_KEY_DERIVATION_OPERATION_INIT{0,0,0,{0}}
    #endif
    staticinlinestructpsa_key_derivation_spsa_key_derivation_operation_init(
    void)
    {
    conststructpsa_key_derivation_sv=PSA_KEY_DERIVATION_OPERATION_INIT;
    returnv;
    }

    structpsa_custom_key_parameters_s{
    /*Futureversionsmayaddotherfieldsinthisstructure.*/
    uint32_tflags;
    };

    #definePSA_CUSTOM_KEY_PARAMETERS_INIT{0}

    #ifndef__cplusplus
    /*OmittedwhencompilinginC++,becauseoneoftheparametersisa
    *pointertoastructwithaflexiblearraymember,andthatisnot
    *standardC++.
    *https://github.com/Mbed-TLS/mbedtls/issues/9020
    */
    /*Thisisadeprecatedvariantof`structpsa_custom_key_parameters_s`.
    *Ithasexactlythesamelayout,plusanextrafieldwhichisaflexible
    *arraymember.Thusa`conststructpsa_key_production_parameters_s*`
    *canbepassedtoanyfunctionthatreadsa
    *`conststructpsa_custom_key_parameters_s*`.
    */
    structpsa_key_production_parameters_s{
    uint32_tflags;
    uint8_tdata[];
    };

    #definePSA_KEY_PRODUCTION_PARAMETERS_INIT{0}
    #endif/*!__cplusplus*/

    structpsa_key_policy_s{
    psa_key_usage_tMBEDTLS_PRIVATE(usage);
    psa_algorithm_tMBEDTLS_PRIVATE(alg);
    psa_algorithm_tMBEDTLS_PRIVATE(alg2);
    };
    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

    structpsa_key_attributes_s{
    #ifdefined(MBEDTLS_PSA_CRYPTO_SE_C)
    psa_key_slot_number_tMBEDTLS_PRIVATE(slot_number);
    intMBEDTLS_PRIVATE(has_slot_number);
    #endif/*MBEDTLS_PSA_CRYPTO_SE_C*/
    psa_key_type_tMBEDTLS_PRIVATE(type);
    psa_key_bits_tMBEDTLS_PRIVATE(bits);
    psa_key_lifetime_tMBEDTLS_PRIVATE(lifetime);
    psa_key_policy_tMBEDTLS_PRIVATE(policy);
    /*Thistypehasadifferentlayoutintheclientviewwrtthe
    *serviceviewofthekeyid,i.e.inserviceviewusuallyis
    *expectedtohaveMBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNERdefined
    *thusaddinganownerfieldtothestandardpsa_key_id_t.For
    *implementationswithclient/serviceseparation,thismeansthe
    *objectwillbemarshalledthroughatransportchanneland
    *interpreteddifferentlyateachsideofthetransport.Placing
    *itattheendofstructuresallowstointerpretthestructure
    *attheclientwithoutreorganizingthememorylayoutofthe
    *struct
    */
    mbedtls_svc_key_id_tMBEDTLS_PRIVATE(id);
    };

    #ifdefined(MBEDTLS_PSA_CRYPTO_SE_C)
    #definePSA_KEY_ATTRIBUTES_MAYBE_SLOT_NUMBER0,0,
    #else
    #definePSA_KEY_ATTRIBUTES_MAYBE_SLOT_NUMBER
    #endif
    #definePSA_KEY_ATTRIBUTES_INIT{PSA_KEY_ATTRIBUTES_MAYBE_SLOT_NUMBER\
    PSA_KEY_TYPE_NONE,0,\
    PSA_KEY_LIFETIME_VOLATILE,\
    PSA_KEY_POLICY_INIT,\
    MBEDTLS_SVC_KEY_ID_INIT}

    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->MBEDTLS_PRIVATE(lifetime);

    attributes->MBEDTLS_PRIVATE(id)=key;

    if(PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)){
    attributes->MBEDTLS_PRIVATE(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->MBEDTLS_PRIVATE(id);
    }

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

    staticinlinevoidpsa_set_key_lifetime(psa_key_attributes_t*attributes,
    psa_key_lifetime_tlifetime)
    {
    attributes->MBEDTLS_PRIVATE(lifetime)=lifetime;
    if(PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)){
    #ifdefMBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER
    attributes->MBEDTLS_PRIVATE(id).MBEDTLS_PRIVATE(key_id)=0;
    #else
    attributes->MBEDTLS_PRIVATE(id)=0;
    #endif
    }
    }

    staticinlinepsa_key_lifetime_tpsa_get_key_lifetime(
    constpsa_key_attributes_t*attributes)
    {
    returnattributes->MBEDTLS_PRIVATE(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->MBEDTLS_PRIVATE(policy).MBEDTLS_PRIVATE(usage)=usage_flags;
    }

    staticinlinepsa_key_usage_tpsa_get_key_usage_flags(
    constpsa_key_attributes_t*attributes)
    {
    returnattributes->MBEDTLS_PRIVATE(policy).MBEDTLS_PRIVATE(usage);
    }

    staticinlinevoidpsa_set_key_algorithm(psa_key_attributes_t*attributes,
    psa_algorithm_talg)
    {
    attributes->MBEDTLS_PRIVATE(policy).MBEDTLS_PRIVATE(alg)=alg;
    }

    staticinlinepsa_algorithm_tpsa_get_key_algorithm(
    constpsa_key_attributes_t*attributes)
    {
    returnattributes->MBEDTLS_PRIVATE(policy).MBEDTLS_PRIVATE(alg);
    }

    staticinlinevoidpsa_set_key_type(psa_key_attributes_t*attributes,
    psa_key_type_ttype)
    {
    attributes->MBEDTLS_PRIVATE(type)=type;
    }

    staticinlinepsa_key_type_tpsa_get_key_type(
    constpsa_key_attributes_t*attributes)
    {
    returnattributes->MBEDTLS_PRIVATE(type);
    }

    staticinlinevoidpsa_set_key_bits(psa_key_attributes_t*attributes,
    size_tbits)
    {
    if(bits>PSA_MAX_KEY_BITS){
    attributes->MBEDTLS_PRIVATE(bits)=PSA_KEY_BITS_TOO_LARGE;
    }else{
    attributes->MBEDTLS_PRIVATE(bits)=(psa_key_bits_t)bits;
    }
    }

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

    structpsa_sign_hash_interruptible_operation_s{
    #ifdefined(MBEDTLS_PSA_CRYPTO_CLIENT)&&!defined(MBEDTLS_PSA_CRYPTO_C)
    mbedtls_psa_client_handle_thandle;
    #else
    unsignedintMBEDTLS_PRIVATE(id);

    psa_driver_sign_hash_interruptible_context_tMBEDTLS_PRIVATE(ctx);

    unsignedintMBEDTLS_PRIVATE(error_occurred):1;

    uint32_tMBEDTLS_PRIVATE(num_ops);
    #endif
    };

    #ifdefined(MBEDTLS_PSA_CRYPTO_CLIENT)&&!defined(MBEDTLS_PSA_CRYPTO_C)
    #definePSA_SIGN_HASH_INTERRUPTIBLE_OPERATION_INIT{0}
    #else
    #definePSA_SIGN_HASH_INTERRUPTIBLE_OPERATION_INIT{0,{0},0,0}
    #endif

    staticinlinestructpsa_sign_hash_interruptible_operation_s
    psa_sign_hash_interruptible_operation_init(void)
    {
    conststructpsa_sign_hash_interruptible_operation_sv=
    PSA_SIGN_HASH_INTERRUPTIBLE_OPERATION_INIT;

    returnv;
    }

    structpsa_verify_hash_interruptible_operation_s{
    #ifdefined(MBEDTLS_PSA_CRYPTO_CLIENT)&&!defined(MBEDTLS_PSA_CRYPTO_C)
    mbedtls_psa_client_handle_thandle;
    #else
    unsignedintMBEDTLS_PRIVATE(id);

    psa_driver_verify_hash_interruptible_context_tMBEDTLS_PRIVATE(ctx);

    unsignedintMBEDTLS_PRIVATE(error_occurred):1;

    uint32_tMBEDTLS_PRIVATE(num_ops);
    #endif
    };

    #ifdefined(MBEDTLS_PSA_CRYPTO_CLIENT)&&!defined(MBEDTLS_PSA_CRYPTO_C)
    #definePSA_VERIFY_HASH_INTERRUPTIBLE_OPERATION_INIT{0}
    #else
    #definePSA_VERIFY_HASH_INTERRUPTIBLE_OPERATION_INIT{0,{0},0,0}
    #endif

    staticinlinestructpsa_verify_hash_interruptible_operation_s
    psa_verify_hash_interruptible_operation_init(void)
    {
    conststructpsa_verify_hash_interruptible_operation_sv=
    PSA_VERIFY_HASH_INTERRUPTIBLE_OPERATION_INIT;

    returnv;
    }

    #ifdef__cplusplus
    }
    #endif

    #endif/*PSA_CRYPTO_STRUCT_H*/