xref: /optee_os/lib/libmbedtls/mbedtls/include/psa/crypto_struct.h (revision b0563631928755fe864b97785160fb3088e9efdc)
132b31808SJens Wiklander /**
232b31808SJens Wiklander  * \file psa/crypto_struct.h
332b31808SJens Wiklander  *
432b31808SJens Wiklander  * \brief PSA cryptography module: Mbed TLS structured type implementations
532b31808SJens Wiklander  *
632b31808SJens Wiklander  * \note This file may not be included directly. Applications must
732b31808SJens Wiklander  * include psa/crypto.h.
832b31808SJens Wiklander  *
932b31808SJens Wiklander  * This file contains the definitions of some data structures with
1032b31808SJens Wiklander  * implementation-specific definitions.
1132b31808SJens Wiklander  *
1232b31808SJens Wiklander  * In implementations with isolation between the application and the
1332b31808SJens Wiklander  * cryptography module, it is expected that the front-end and the back-end
1432b31808SJens Wiklander  * would have different versions of this file.
1532b31808SJens Wiklander  *
1632b31808SJens Wiklander  * <h3>Design notes about multipart operation structures</h3>
1732b31808SJens Wiklander  *
1832b31808SJens Wiklander  * For multipart operations without driver delegation support, each multipart
1932b31808SJens Wiklander  * operation structure contains a `psa_algorithm_t alg` field which indicates
2032b31808SJens Wiklander  * which specific algorithm the structure is for. When the structure is not in
2132b31808SJens Wiklander  * use, `alg` is 0. Most of the structure consists of a union which is
2232b31808SJens Wiklander  * discriminated by `alg`.
2332b31808SJens Wiklander  *
2432b31808SJens Wiklander  * For multipart operations with driver delegation support, each multipart
2532b31808SJens Wiklander  * operation structure contains an `unsigned int id` field indicating which
2632b31808SJens Wiklander  * driver got assigned to do the operation. When the structure is not in use,
2732b31808SJens Wiklander  * 'id' is 0. The structure contains also a driver context which is the union
2832b31808SJens Wiklander  * of the contexts of all drivers able to handle the type of multipart
2932b31808SJens Wiklander  * operation.
3032b31808SJens Wiklander  *
3132b31808SJens Wiklander  * Note that when `alg` or `id` is 0, the content of other fields is undefined.
3232b31808SJens Wiklander  * In particular, it is not guaranteed that a freshly-initialized structure
3332b31808SJens Wiklander  * is all-zero: we initialize structures to something like `{0, 0}`, which
3432b31808SJens Wiklander  * is only guaranteed to initializes the first member of the union;
3532b31808SJens Wiklander  * GCC and Clang initialize the whole structure to 0 (at the time of writing),
3632b31808SJens Wiklander  * but MSVC and CompCert don't.
3732b31808SJens Wiklander  *
38*b0563631STom Van Eyck  * In Mbed TLS, multipart operation structures live independently from
39*b0563631STom Van Eyck  * the key. This allows Mbed TLS to free the key objects when destroying
4032b31808SJens Wiklander  * a key slot. If a multipart operation needs to remember the key after
4132b31808SJens Wiklander  * the setup function returns, the operation structure needs to contain a
4232b31808SJens Wiklander  * copy of the key.
4332b31808SJens Wiklander  */
4432b31808SJens Wiklander /*
4532b31808SJens Wiklander  *  Copyright The Mbed TLS Contributors
46*b0563631STom Van Eyck  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
4732b31808SJens Wiklander  */
4832b31808SJens Wiklander 
4932b31808SJens Wiklander #ifndef PSA_CRYPTO_STRUCT_H
5032b31808SJens Wiklander #define PSA_CRYPTO_STRUCT_H
5132b31808SJens Wiklander #include "mbedtls/private_access.h"
5232b31808SJens Wiklander 
5332b31808SJens Wiklander #ifdef __cplusplus
5432b31808SJens Wiklander extern "C" {
5532b31808SJens Wiklander #endif
5632b31808SJens Wiklander 
57*b0563631STom Van Eyck /*
58*b0563631STom Van Eyck  * Include the build-time configuration information header. Here, we do not
59*b0563631STom Van Eyck  * include `"mbedtls/build_info.h"` directly but `"psa/build_info.h"`, which
60*b0563631STom Van Eyck  * is basically just an alias to it. This is to ease the maintenance of the
61*b0563631STom Van Eyck  * TF-PSA-Crypto repository which has a different build system and
62*b0563631STom Van Eyck  * configuration.
63*b0563631STom Van Eyck  */
64*b0563631STom Van Eyck #include "psa/build_info.h"
6532b31808SJens Wiklander 
6632b31808SJens Wiklander /* Include the context definition for the compiled-in drivers for the primitive
6732b31808SJens Wiklander  * algorithms. */
6832b31808SJens Wiklander #include "psa/crypto_driver_contexts_primitives.h"
6932b31808SJens Wiklander 
7032b31808SJens Wiklander struct psa_hash_operation_s {
71*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
72*b0563631STom Van Eyck     mbedtls_psa_client_handle_t handle;
73*b0563631STom Van Eyck #else
7432b31808SJens Wiklander     /** Unique ID indicating which driver got assigned to do the
7532b31808SJens Wiklander      * operation. Since driver contexts are driver-specific, swapping
7632b31808SJens Wiklander      * drivers halfway through the operation is not supported.
7732b31808SJens Wiklander      * ID values are auto-generated in psa_driver_wrappers.h.
7832b31808SJens Wiklander      * ID value zero means the context is not valid or not assigned to
7932b31808SJens Wiklander      * any driver (i.e. the driver context is not active, in use). */
8032b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(id);
8132b31808SJens Wiklander     psa_driver_hash_context_t MBEDTLS_PRIVATE(ctx);
82*b0563631STom Van Eyck #endif
8332b31808SJens Wiklander };
84*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
85*b0563631STom Van Eyck #define PSA_HASH_OPERATION_INIT { 0 }
86*b0563631STom Van Eyck #else
8732b31808SJens Wiklander #define PSA_HASH_OPERATION_INIT { 0, { 0 } }
88*b0563631STom Van Eyck #endif
8932b31808SJens Wiklander static inline struct psa_hash_operation_s psa_hash_operation_init(void)
9032b31808SJens Wiklander {
9132b31808SJens Wiklander     const struct psa_hash_operation_s v = PSA_HASH_OPERATION_INIT;
9232b31808SJens Wiklander     return v;
9332b31808SJens Wiklander }
9432b31808SJens Wiklander 
9532b31808SJens Wiklander struct psa_cipher_operation_s {
96*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
97*b0563631STom Van Eyck     mbedtls_psa_client_handle_t handle;
98*b0563631STom Van Eyck #else
9932b31808SJens Wiklander     /** Unique ID indicating which driver got assigned to do the
10032b31808SJens Wiklander      * operation. Since driver contexts are driver-specific, swapping
10132b31808SJens Wiklander      * drivers halfway through the operation is not supported.
10232b31808SJens Wiklander      * ID values are auto-generated in psa_crypto_driver_wrappers.h
10332b31808SJens Wiklander      * ID value zero means the context is not valid or not assigned to
10432b31808SJens Wiklander      * any driver (i.e. none of the driver contexts are active). */
10532b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(id);
10632b31808SJens Wiklander 
10732b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(iv_required) : 1;
10832b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(iv_set) : 1;
10932b31808SJens Wiklander 
11032b31808SJens Wiklander     uint8_t MBEDTLS_PRIVATE(default_iv_length);
11132b31808SJens Wiklander 
11232b31808SJens Wiklander     psa_driver_cipher_context_t MBEDTLS_PRIVATE(ctx);
113*b0563631STom Van Eyck #endif
11432b31808SJens Wiklander };
11532b31808SJens Wiklander 
116*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
117*b0563631STom Van Eyck #define PSA_CIPHER_OPERATION_INIT { 0 }
118*b0563631STom Van Eyck #else
11932b31808SJens Wiklander #define PSA_CIPHER_OPERATION_INIT { 0, 0, 0, 0, { 0 } }
120*b0563631STom Van Eyck #endif
12132b31808SJens Wiklander static inline struct psa_cipher_operation_s psa_cipher_operation_init(void)
12232b31808SJens Wiklander {
12332b31808SJens Wiklander     const struct psa_cipher_operation_s v = PSA_CIPHER_OPERATION_INIT;
12432b31808SJens Wiklander     return v;
12532b31808SJens Wiklander }
12632b31808SJens Wiklander 
12732b31808SJens Wiklander /* Include the context definition for the compiled-in drivers for the composite
12832b31808SJens Wiklander  * algorithms. */
12932b31808SJens Wiklander #include "psa/crypto_driver_contexts_composites.h"
13032b31808SJens Wiklander 
13132b31808SJens Wiklander struct psa_mac_operation_s {
132*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
133*b0563631STom Van Eyck     mbedtls_psa_client_handle_t handle;
134*b0563631STom Van Eyck #else
13532b31808SJens Wiklander     /** Unique ID indicating which driver got assigned to do the
13632b31808SJens Wiklander      * operation. Since driver contexts are driver-specific, swapping
13732b31808SJens Wiklander      * drivers halfway through the operation is not supported.
13832b31808SJens Wiklander      * ID values are auto-generated in psa_driver_wrappers.h
13932b31808SJens Wiklander      * ID value zero means the context is not valid or not assigned to
14032b31808SJens Wiklander      * any driver (i.e. none of the driver contexts are active). */
14132b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(id);
14232b31808SJens Wiklander     uint8_t MBEDTLS_PRIVATE(mac_size);
14332b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(is_sign) : 1;
14432b31808SJens Wiklander     psa_driver_mac_context_t MBEDTLS_PRIVATE(ctx);
145*b0563631STom Van Eyck #endif
14632b31808SJens Wiklander };
14732b31808SJens Wiklander 
148*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
149*b0563631STom Van Eyck #define PSA_MAC_OPERATION_INIT { 0 }
150*b0563631STom Van Eyck #else
15132b31808SJens Wiklander #define PSA_MAC_OPERATION_INIT { 0, 0, 0, { 0 } }
152*b0563631STom Van Eyck #endif
15332b31808SJens Wiklander static inline struct psa_mac_operation_s psa_mac_operation_init(void)
15432b31808SJens Wiklander {
15532b31808SJens Wiklander     const struct psa_mac_operation_s v = PSA_MAC_OPERATION_INIT;
15632b31808SJens Wiklander     return v;
15732b31808SJens Wiklander }
15832b31808SJens Wiklander 
15932b31808SJens Wiklander struct psa_aead_operation_s {
160*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
161*b0563631STom Van Eyck     mbedtls_psa_client_handle_t handle;
162*b0563631STom Van Eyck #else
16332b31808SJens Wiklander     /** Unique ID indicating which driver got assigned to do the
16432b31808SJens Wiklander      * operation. Since driver contexts are driver-specific, swapping
16532b31808SJens Wiklander      * drivers halfway through the operation is not supported.
16632b31808SJens Wiklander      * ID values are auto-generated in psa_crypto_driver_wrappers.h
16732b31808SJens Wiklander      * ID value zero means the context is not valid or not assigned to
16832b31808SJens Wiklander      * any driver (i.e. none of the driver contexts are active). */
16932b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(id);
17032b31808SJens Wiklander 
17132b31808SJens Wiklander     psa_algorithm_t MBEDTLS_PRIVATE(alg);
17232b31808SJens Wiklander     psa_key_type_t MBEDTLS_PRIVATE(key_type);
17332b31808SJens Wiklander 
17432b31808SJens Wiklander     size_t MBEDTLS_PRIVATE(ad_remaining);
17532b31808SJens Wiklander     size_t MBEDTLS_PRIVATE(body_remaining);
17632b31808SJens Wiklander 
17732b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(nonce_set) : 1;
17832b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(lengths_set) : 1;
17932b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(ad_started) : 1;
18032b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(body_started) : 1;
18132b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(is_encrypt) : 1;
18232b31808SJens Wiklander 
18332b31808SJens Wiklander     psa_driver_aead_context_t MBEDTLS_PRIVATE(ctx);
184*b0563631STom Van Eyck #endif
18532b31808SJens Wiklander };
18632b31808SJens Wiklander 
187*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
188*b0563631STom Van Eyck #define PSA_AEAD_OPERATION_INIT { 0 }
189*b0563631STom Van Eyck #else
19032b31808SJens Wiklander #define PSA_AEAD_OPERATION_INIT { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, { 0 } }
191*b0563631STom Van Eyck #endif
19232b31808SJens Wiklander static inline struct psa_aead_operation_s psa_aead_operation_init(void)
19332b31808SJens Wiklander {
19432b31808SJens Wiklander     const struct psa_aead_operation_s v = PSA_AEAD_OPERATION_INIT;
19532b31808SJens Wiklander     return v;
19632b31808SJens Wiklander }
19732b31808SJens Wiklander 
198*b0563631STom Van Eyck /* Include the context definition for the compiled-in drivers for the key
199*b0563631STom Van Eyck  * derivation algorithms. */
200*b0563631STom Van Eyck #include "psa/crypto_driver_contexts_key_derivation.h"
20132b31808SJens Wiklander 
20232b31808SJens Wiklander struct psa_key_derivation_s {
203*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
204*b0563631STom Van Eyck     mbedtls_psa_client_handle_t handle;
205*b0563631STom Van Eyck #else
20632b31808SJens Wiklander     psa_algorithm_t MBEDTLS_PRIVATE(alg);
20732b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(can_output_key) : 1;
20832b31808SJens Wiklander     size_t MBEDTLS_PRIVATE(capacity);
209*b0563631STom Van Eyck     psa_driver_key_derivation_context_t MBEDTLS_PRIVATE(ctx);
21032b31808SJens Wiklander #endif
21132b31808SJens Wiklander };
21232b31808SJens Wiklander 
213*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
214*b0563631STom Van Eyck #define PSA_KEY_DERIVATION_OPERATION_INIT { 0 }
215*b0563631STom Van Eyck #else
21632b31808SJens Wiklander /* This only zeroes out the first byte in the union, the rest is unspecified. */
21732b31808SJens Wiklander #define PSA_KEY_DERIVATION_OPERATION_INIT { 0, 0, 0, { 0 } }
218*b0563631STom Van Eyck #endif
21932b31808SJens Wiklander static inline struct psa_key_derivation_s psa_key_derivation_operation_init(
22032b31808SJens Wiklander     void)
22132b31808SJens Wiklander {
22232b31808SJens Wiklander     const struct psa_key_derivation_s v = PSA_KEY_DERIVATION_OPERATION_INIT;
22332b31808SJens Wiklander     return v;
22432b31808SJens Wiklander }
22532b31808SJens Wiklander 
226*b0563631STom Van Eyck struct psa_key_production_parameters_s {
227*b0563631STom Van Eyck     /* Future versions may add other fields in this structure. */
228*b0563631STom Van Eyck     uint32_t flags;
229*b0563631STom Van Eyck     uint8_t data[];
230*b0563631STom Van Eyck };
231*b0563631STom Van Eyck 
232*b0563631STom Van Eyck /** The default production parameters for key generation or key derivation.
233*b0563631STom Van Eyck  *
234*b0563631STom Van Eyck  * Calling psa_generate_key_ext() or psa_key_derivation_output_key_ext()
235*b0563631STom Van Eyck  * with `params=PSA_KEY_PRODUCTION_PARAMETERS_INIT` and
236*b0563631STom Van Eyck  * `params_data_length == 0` is equivalent to
237*b0563631STom Van Eyck  * calling psa_generate_key() or psa_key_derivation_output_key()
238*b0563631STom Van Eyck  * respectively.
239*b0563631STom Van Eyck  */
240*b0563631STom Van Eyck #define PSA_KEY_PRODUCTION_PARAMETERS_INIT { 0 }
241*b0563631STom Van Eyck 
24232b31808SJens Wiklander struct psa_key_policy_s {
24332b31808SJens Wiklander     psa_key_usage_t MBEDTLS_PRIVATE(usage);
24432b31808SJens Wiklander     psa_algorithm_t MBEDTLS_PRIVATE(alg);
24532b31808SJens Wiklander     psa_algorithm_t MBEDTLS_PRIVATE(alg2);
24632b31808SJens Wiklander };
24732b31808SJens Wiklander typedef struct psa_key_policy_s psa_key_policy_t;
24832b31808SJens Wiklander 
24932b31808SJens Wiklander #define PSA_KEY_POLICY_INIT { 0, 0, 0 }
25032b31808SJens Wiklander static inline struct psa_key_policy_s psa_key_policy_init(void)
25132b31808SJens Wiklander {
25232b31808SJens Wiklander     const struct psa_key_policy_s v = PSA_KEY_POLICY_INIT;
25332b31808SJens Wiklander     return v;
25432b31808SJens Wiklander }
25532b31808SJens Wiklander 
25632b31808SJens Wiklander /* The type used internally for key sizes.
25732b31808SJens Wiklander  * Public interfaces use size_t, but internally we use a smaller type. */
25832b31808SJens Wiklander typedef uint16_t psa_key_bits_t;
25932b31808SJens Wiklander /* The maximum value of the type used to represent bit-sizes.
26032b31808SJens Wiklander  * This is used to mark an invalid key size. */
26132b31808SJens Wiklander #define PSA_KEY_BITS_TOO_LARGE          ((psa_key_bits_t) -1)
26232b31808SJens Wiklander /* The maximum size of a key in bits.
26332b31808SJens Wiklander  * Currently defined as the maximum that can be represented, rounded down
26432b31808SJens Wiklander  * to a whole number of bytes.
26532b31808SJens Wiklander  * This is an uncast value so that it can be used in preprocessor
26632b31808SJens Wiklander  * conditionals. */
26732b31808SJens Wiklander #define PSA_MAX_KEY_BITS 0xfff8
26832b31808SJens Wiklander 
269*b0563631STom Van Eyck struct psa_key_attributes_s {
270*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
271*b0563631STom Van Eyck     psa_key_slot_number_t MBEDTLS_PRIVATE(slot_number);
272*b0563631STom Van Eyck     int MBEDTLS_PRIVATE(has_slot_number);
273*b0563631STom Van Eyck #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
27432b31808SJens Wiklander     psa_key_type_t MBEDTLS_PRIVATE(type);
27532b31808SJens Wiklander     psa_key_bits_t MBEDTLS_PRIVATE(bits);
27632b31808SJens Wiklander     psa_key_lifetime_t MBEDTLS_PRIVATE(lifetime);
27732b31808SJens Wiklander     psa_key_policy_t MBEDTLS_PRIVATE(policy);
278*b0563631STom Van Eyck     /* This type has a different layout in the client view wrt the
279*b0563631STom Van Eyck      * service view of the key id, i.e. in service view usually is
280*b0563631STom Van Eyck      * expected to have MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER defined
281*b0563631STom Van Eyck      * thus adding an owner field to the standard psa_key_id_t. For
282*b0563631STom Van Eyck      * implementations with client/service separation, this means the
283*b0563631STom Van Eyck      * object will be marshalled through a transport channel and
284*b0563631STom Van Eyck      * interpreted differently at each side of the transport. Placing
285*b0563631STom Van Eyck      * it at the end of structures allows to interpret the structure
286*b0563631STom Van Eyck      * at the client without reorganizing the memory layout of the
287*b0563631STom Van Eyck      * struct
288*b0563631STom Van Eyck      */
289*b0563631STom Van Eyck     mbedtls_svc_key_id_t MBEDTLS_PRIVATE(id);
29032b31808SJens Wiklander };
29132b31808SJens Wiklander 
29232b31808SJens Wiklander #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
293*b0563631STom Van Eyck #define PSA_KEY_ATTRIBUTES_MAYBE_SLOT_NUMBER 0, 0,
29432b31808SJens Wiklander #else
295*b0563631STom Van Eyck #define PSA_KEY_ATTRIBUTES_MAYBE_SLOT_NUMBER
29632b31808SJens Wiklander #endif
297*b0563631STom Van Eyck #define PSA_KEY_ATTRIBUTES_INIT { PSA_KEY_ATTRIBUTES_MAYBE_SLOT_NUMBER \
298*b0563631STom Van Eyck                                       PSA_KEY_TYPE_NONE, 0,            \
299*b0563631STom Van Eyck                                       PSA_KEY_LIFETIME_VOLATILE,       \
300*b0563631STom Van Eyck                                       PSA_KEY_POLICY_INIT,             \
301*b0563631STom Van Eyck                                       MBEDTLS_SVC_KEY_ID_INIT }
30232b31808SJens Wiklander 
30332b31808SJens Wiklander static inline struct psa_key_attributes_s psa_key_attributes_init(void)
30432b31808SJens Wiklander {
30532b31808SJens Wiklander     const struct psa_key_attributes_s v = PSA_KEY_ATTRIBUTES_INIT;
30632b31808SJens Wiklander     return v;
30732b31808SJens Wiklander }
30832b31808SJens Wiklander 
30932b31808SJens Wiklander static inline void psa_set_key_id(psa_key_attributes_t *attributes,
31032b31808SJens Wiklander                                   mbedtls_svc_key_id_t key)
31132b31808SJens Wiklander {
312*b0563631STom Van Eyck     psa_key_lifetime_t lifetime = attributes->MBEDTLS_PRIVATE(lifetime);
31332b31808SJens Wiklander 
314*b0563631STom Van Eyck     attributes->MBEDTLS_PRIVATE(id) = key;
31532b31808SJens Wiklander 
31632b31808SJens Wiklander     if (PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)) {
317*b0563631STom Van Eyck         attributes->MBEDTLS_PRIVATE(lifetime) =
31832b31808SJens Wiklander             PSA_KEY_LIFETIME_FROM_PERSISTENCE_AND_LOCATION(
31932b31808SJens Wiklander                 PSA_KEY_LIFETIME_PERSISTENT,
32032b31808SJens Wiklander                 PSA_KEY_LIFETIME_GET_LOCATION(lifetime));
32132b31808SJens Wiklander     }
32232b31808SJens Wiklander }
32332b31808SJens Wiklander 
32432b31808SJens Wiklander static inline mbedtls_svc_key_id_t psa_get_key_id(
32532b31808SJens Wiklander     const psa_key_attributes_t *attributes)
32632b31808SJens Wiklander {
327*b0563631STom Van Eyck     return attributes->MBEDTLS_PRIVATE(id);
32832b31808SJens Wiklander }
32932b31808SJens Wiklander 
33032b31808SJens Wiklander #ifdef MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER
33132b31808SJens Wiklander static inline void mbedtls_set_key_owner_id(psa_key_attributes_t *attributes,
33232b31808SJens Wiklander                                             mbedtls_key_owner_id_t owner)
33332b31808SJens Wiklander {
334*b0563631STom Van Eyck     attributes->MBEDTLS_PRIVATE(id).MBEDTLS_PRIVATE(owner) = owner;
33532b31808SJens Wiklander }
33632b31808SJens Wiklander #endif
33732b31808SJens Wiklander 
33832b31808SJens Wiklander static inline void psa_set_key_lifetime(psa_key_attributes_t *attributes,
33932b31808SJens Wiklander                                         psa_key_lifetime_t lifetime)
34032b31808SJens Wiklander {
341*b0563631STom Van Eyck     attributes->MBEDTLS_PRIVATE(lifetime) = lifetime;
34232b31808SJens Wiklander     if (PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)) {
34332b31808SJens Wiklander #ifdef MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER
344*b0563631STom Van Eyck         attributes->MBEDTLS_PRIVATE(id).MBEDTLS_PRIVATE(key_id) = 0;
34532b31808SJens Wiklander #else
346*b0563631STom Van Eyck         attributes->MBEDTLS_PRIVATE(id) = 0;
34732b31808SJens Wiklander #endif
34832b31808SJens Wiklander     }
34932b31808SJens Wiklander }
35032b31808SJens Wiklander 
35132b31808SJens Wiklander static inline psa_key_lifetime_t psa_get_key_lifetime(
35232b31808SJens Wiklander     const psa_key_attributes_t *attributes)
35332b31808SJens Wiklander {
354*b0563631STom Van Eyck     return attributes->MBEDTLS_PRIVATE(lifetime);
35532b31808SJens Wiklander }
35632b31808SJens Wiklander 
35732b31808SJens Wiklander static inline void psa_extend_key_usage_flags(psa_key_usage_t *usage_flags)
35832b31808SJens Wiklander {
35932b31808SJens Wiklander     if (*usage_flags & PSA_KEY_USAGE_SIGN_HASH) {
36032b31808SJens Wiklander         *usage_flags |= PSA_KEY_USAGE_SIGN_MESSAGE;
36132b31808SJens Wiklander     }
36232b31808SJens Wiklander 
36332b31808SJens Wiklander     if (*usage_flags & PSA_KEY_USAGE_VERIFY_HASH) {
36432b31808SJens Wiklander         *usage_flags |= PSA_KEY_USAGE_VERIFY_MESSAGE;
36532b31808SJens Wiklander     }
36632b31808SJens Wiklander }
36732b31808SJens Wiklander 
36832b31808SJens Wiklander static inline void psa_set_key_usage_flags(psa_key_attributes_t *attributes,
36932b31808SJens Wiklander                                            psa_key_usage_t usage_flags)
37032b31808SJens Wiklander {
37132b31808SJens Wiklander     psa_extend_key_usage_flags(&usage_flags);
372*b0563631STom Van Eyck     attributes->MBEDTLS_PRIVATE(policy).MBEDTLS_PRIVATE(usage) = usage_flags;
37332b31808SJens Wiklander }
37432b31808SJens Wiklander 
37532b31808SJens Wiklander static inline psa_key_usage_t psa_get_key_usage_flags(
37632b31808SJens Wiklander     const psa_key_attributes_t *attributes)
37732b31808SJens Wiklander {
378*b0563631STom Van Eyck     return attributes->MBEDTLS_PRIVATE(policy).MBEDTLS_PRIVATE(usage);
37932b31808SJens Wiklander }
38032b31808SJens Wiklander 
38132b31808SJens Wiklander static inline void psa_set_key_algorithm(psa_key_attributes_t *attributes,
38232b31808SJens Wiklander                                          psa_algorithm_t alg)
38332b31808SJens Wiklander {
384*b0563631STom Van Eyck     attributes->MBEDTLS_PRIVATE(policy).MBEDTLS_PRIVATE(alg) = alg;
38532b31808SJens Wiklander }
38632b31808SJens Wiklander 
38732b31808SJens Wiklander static inline psa_algorithm_t psa_get_key_algorithm(
38832b31808SJens Wiklander     const psa_key_attributes_t *attributes)
38932b31808SJens Wiklander {
390*b0563631STom Van Eyck     return attributes->MBEDTLS_PRIVATE(policy).MBEDTLS_PRIVATE(alg);
39132b31808SJens Wiklander }
39232b31808SJens Wiklander 
39332b31808SJens Wiklander static inline void psa_set_key_type(psa_key_attributes_t *attributes,
39432b31808SJens Wiklander                                     psa_key_type_t type)
39532b31808SJens Wiklander {
396*b0563631STom Van Eyck     attributes->MBEDTLS_PRIVATE(type) = type;
39732b31808SJens Wiklander }
39832b31808SJens Wiklander 
39932b31808SJens Wiklander static inline psa_key_type_t psa_get_key_type(
40032b31808SJens Wiklander     const psa_key_attributes_t *attributes)
40132b31808SJens Wiklander {
402*b0563631STom Van Eyck     return attributes->MBEDTLS_PRIVATE(type);
40332b31808SJens Wiklander }
40432b31808SJens Wiklander 
40532b31808SJens Wiklander static inline void psa_set_key_bits(psa_key_attributes_t *attributes,
40632b31808SJens Wiklander                                     size_t bits)
40732b31808SJens Wiklander {
40832b31808SJens Wiklander     if (bits > PSA_MAX_KEY_BITS) {
409*b0563631STom Van Eyck         attributes->MBEDTLS_PRIVATE(bits) = PSA_KEY_BITS_TOO_LARGE;
41032b31808SJens Wiklander     } else {
411*b0563631STom Van Eyck         attributes->MBEDTLS_PRIVATE(bits) = (psa_key_bits_t) bits;
41232b31808SJens Wiklander     }
41332b31808SJens Wiklander }
41432b31808SJens Wiklander 
41532b31808SJens Wiklander static inline size_t psa_get_key_bits(
41632b31808SJens Wiklander     const psa_key_attributes_t *attributes)
41732b31808SJens Wiklander {
418*b0563631STom Van Eyck     return attributes->MBEDTLS_PRIVATE(bits);
41932b31808SJens Wiklander }
42032b31808SJens Wiklander 
42132b31808SJens Wiklander /**
42232b31808SJens Wiklander  * \brief The context for PSA interruptible hash signing.
42332b31808SJens Wiklander  */
42432b31808SJens Wiklander struct psa_sign_hash_interruptible_operation_s {
425*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
426*b0563631STom Van Eyck     mbedtls_psa_client_handle_t handle;
427*b0563631STom Van Eyck #else
42832b31808SJens Wiklander     /** Unique ID indicating which driver got assigned to do the
42932b31808SJens Wiklander      * operation. Since driver contexts are driver-specific, swapping
43032b31808SJens Wiklander      * drivers halfway through the operation is not supported.
43132b31808SJens Wiklander      * ID values are auto-generated in psa_crypto_driver_wrappers.h
43232b31808SJens Wiklander      * ID value zero means the context is not valid or not assigned to
43332b31808SJens Wiklander      * any driver (i.e. none of the driver contexts are active). */
43432b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(id);
43532b31808SJens Wiklander 
43632b31808SJens Wiklander     psa_driver_sign_hash_interruptible_context_t MBEDTLS_PRIVATE(ctx);
43732b31808SJens Wiklander 
43832b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(error_occurred) : 1;
43932b31808SJens Wiklander 
44032b31808SJens Wiklander     uint32_t MBEDTLS_PRIVATE(num_ops);
441*b0563631STom Van Eyck #endif
44232b31808SJens Wiklander };
44332b31808SJens Wiklander 
444*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
445*b0563631STom Van Eyck #define PSA_SIGN_HASH_INTERRUPTIBLE_OPERATION_INIT { 0 }
446*b0563631STom Van Eyck #else
44732b31808SJens Wiklander #define PSA_SIGN_HASH_INTERRUPTIBLE_OPERATION_INIT { 0, { 0 }, 0, 0 }
448*b0563631STom Van Eyck #endif
44932b31808SJens Wiklander 
45032b31808SJens Wiklander static inline struct psa_sign_hash_interruptible_operation_s
45132b31808SJens Wiklander psa_sign_hash_interruptible_operation_init(void)
45232b31808SJens Wiklander {
45332b31808SJens Wiklander     const struct psa_sign_hash_interruptible_operation_s v =
45432b31808SJens Wiklander         PSA_SIGN_HASH_INTERRUPTIBLE_OPERATION_INIT;
45532b31808SJens Wiklander 
45632b31808SJens Wiklander     return v;
45732b31808SJens Wiklander }
45832b31808SJens Wiklander 
45932b31808SJens Wiklander /**
46032b31808SJens Wiklander  * \brief The context for PSA interruptible hash verification.
46132b31808SJens Wiklander  */
46232b31808SJens Wiklander struct psa_verify_hash_interruptible_operation_s {
463*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
464*b0563631STom Van Eyck     mbedtls_psa_client_handle_t handle;
465*b0563631STom Van Eyck #else
46632b31808SJens Wiklander     /** Unique ID indicating which driver got assigned to do the
46732b31808SJens Wiklander      * operation. Since driver contexts are driver-specific, swapping
46832b31808SJens Wiklander      * drivers halfway through the operation is not supported.
46932b31808SJens Wiklander      * ID values are auto-generated in psa_crypto_driver_wrappers.h
47032b31808SJens Wiklander      * ID value zero means the context is not valid or not assigned to
47132b31808SJens Wiklander      * any driver (i.e. none of the driver contexts are active). */
47232b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(id);
47332b31808SJens Wiklander 
47432b31808SJens Wiklander     psa_driver_verify_hash_interruptible_context_t MBEDTLS_PRIVATE(ctx);
47532b31808SJens Wiklander 
47632b31808SJens Wiklander     unsigned int MBEDTLS_PRIVATE(error_occurred) : 1;
47732b31808SJens Wiklander 
47832b31808SJens Wiklander     uint32_t MBEDTLS_PRIVATE(num_ops);
479*b0563631STom Van Eyck #endif
48032b31808SJens Wiklander };
48132b31808SJens Wiklander 
482*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) && !defined(MBEDTLS_PSA_CRYPTO_C)
483*b0563631STom Van Eyck #define PSA_VERIFY_HASH_INTERRUPTIBLE_OPERATION_INIT { 0 }
484*b0563631STom Van Eyck #else
48532b31808SJens Wiklander #define PSA_VERIFY_HASH_INTERRUPTIBLE_OPERATION_INIT { 0, { 0 }, 0, 0 }
486*b0563631STom Van Eyck #endif
48732b31808SJens Wiklander 
48832b31808SJens Wiklander static inline struct psa_verify_hash_interruptible_operation_s
48932b31808SJens Wiklander psa_verify_hash_interruptible_operation_init(void)
49032b31808SJens Wiklander {
49132b31808SJens Wiklander     const struct psa_verify_hash_interruptible_operation_s v =
49232b31808SJens Wiklander         PSA_VERIFY_HASH_INTERRUPTIBLE_OPERATION_INIT;
49332b31808SJens Wiklander 
49432b31808SJens Wiklander     return v;
49532b31808SJens Wiklander }
49632b31808SJens Wiklander 
49732b31808SJens Wiklander #ifdef __cplusplus
49832b31808SJens Wiklander }
49932b31808SJens Wiklander #endif
50032b31808SJens Wiklander 
50132b31808SJens Wiklander #endif /* PSA_CRYPTO_STRUCT_H */
502