1*62c56f98SSadaf Ebrahimi /**
2*62c56f98SSadaf Ebrahimi * \file psa/crypto_struct.h
3*62c56f98SSadaf Ebrahimi *
4*62c56f98SSadaf Ebrahimi * \brief PSA cryptography module: Mbed TLS structured type implementations
5*62c56f98SSadaf Ebrahimi *
6*62c56f98SSadaf Ebrahimi * \note This file may not be included directly. Applications must
7*62c56f98SSadaf Ebrahimi * include psa/crypto.h.
8*62c56f98SSadaf Ebrahimi *
9*62c56f98SSadaf Ebrahimi * This file contains the definitions of some data structures with
10*62c56f98SSadaf Ebrahimi * implementation-specific definitions.
11*62c56f98SSadaf Ebrahimi *
12*62c56f98SSadaf Ebrahimi * In implementations with isolation between the application and the
13*62c56f98SSadaf Ebrahimi * cryptography module, it is expected that the front-end and the back-end
14*62c56f98SSadaf Ebrahimi * would have different versions of this file.
15*62c56f98SSadaf Ebrahimi *
16*62c56f98SSadaf Ebrahimi * <h3>Design notes about multipart operation structures</h3>
17*62c56f98SSadaf Ebrahimi *
18*62c56f98SSadaf Ebrahimi * For multipart operations without driver delegation support, each multipart
19*62c56f98SSadaf Ebrahimi * operation structure contains a `psa_algorithm_t alg` field which indicates
20*62c56f98SSadaf Ebrahimi * which specific algorithm the structure is for. When the structure is not in
21*62c56f98SSadaf Ebrahimi * use, `alg` is 0. Most of the structure consists of a union which is
22*62c56f98SSadaf Ebrahimi * discriminated by `alg`.
23*62c56f98SSadaf Ebrahimi *
24*62c56f98SSadaf Ebrahimi * For multipart operations with driver delegation support, each multipart
25*62c56f98SSadaf Ebrahimi * operation structure contains an `unsigned int id` field indicating which
26*62c56f98SSadaf Ebrahimi * driver got assigned to do the operation. When the structure is not in use,
27*62c56f98SSadaf Ebrahimi * 'id' is 0. The structure contains also a driver context which is the union
28*62c56f98SSadaf Ebrahimi * of the contexts of all drivers able to handle the type of multipart
29*62c56f98SSadaf Ebrahimi * operation.
30*62c56f98SSadaf Ebrahimi *
31*62c56f98SSadaf Ebrahimi * Note that when `alg` or `id` is 0, the content of other fields is undefined.
32*62c56f98SSadaf Ebrahimi * In particular, it is not guaranteed that a freshly-initialized structure
33*62c56f98SSadaf Ebrahimi * is all-zero: we initialize structures to something like `{0, 0}`, which
34*62c56f98SSadaf Ebrahimi * is only guaranteed to initializes the first member of the union;
35*62c56f98SSadaf Ebrahimi * GCC and Clang initialize the whole structure to 0 (at the time of writing),
36*62c56f98SSadaf Ebrahimi * but MSVC and CompCert don't.
37*62c56f98SSadaf Ebrahimi *
38*62c56f98SSadaf Ebrahimi * In Mbed TLS, multipart operation structures live independently from
39*62c56f98SSadaf Ebrahimi * the key. This allows Mbed TLS to free the key objects when destroying
40*62c56f98SSadaf Ebrahimi * a key slot. If a multipart operation needs to remember the key after
41*62c56f98SSadaf Ebrahimi * the setup function returns, the operation structure needs to contain a
42*62c56f98SSadaf Ebrahimi * copy of the key.
43*62c56f98SSadaf Ebrahimi */
44*62c56f98SSadaf Ebrahimi /*
45*62c56f98SSadaf Ebrahimi * Copyright The Mbed TLS Contributors
46*62c56f98SSadaf Ebrahimi * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
47*62c56f98SSadaf Ebrahimi */
48*62c56f98SSadaf Ebrahimi
49*62c56f98SSadaf Ebrahimi #ifndef PSA_CRYPTO_STRUCT_H
50*62c56f98SSadaf Ebrahimi #define PSA_CRYPTO_STRUCT_H
51*62c56f98SSadaf Ebrahimi #include "mbedtls/private_access.h"
52*62c56f98SSadaf Ebrahimi
53*62c56f98SSadaf Ebrahimi #ifdef __cplusplus
54*62c56f98SSadaf Ebrahimi extern "C" {
55*62c56f98SSadaf Ebrahimi #endif
56*62c56f98SSadaf Ebrahimi
57*62c56f98SSadaf Ebrahimi /* Include the Mbed TLS configuration file, the way Mbed TLS does it
58*62c56f98SSadaf Ebrahimi * in each of its header files. */
59*62c56f98SSadaf Ebrahimi #include "mbedtls/build_info.h"
60*62c56f98SSadaf Ebrahimi
61*62c56f98SSadaf Ebrahimi /* Include the context definition for the compiled-in drivers for the primitive
62*62c56f98SSadaf Ebrahimi * algorithms. */
63*62c56f98SSadaf Ebrahimi #include "psa/crypto_driver_contexts_primitives.h"
64*62c56f98SSadaf Ebrahimi
65*62c56f98SSadaf Ebrahimi struct psa_hash_operation_s {
66*62c56f98SSadaf Ebrahimi /** Unique ID indicating which driver got assigned to do the
67*62c56f98SSadaf Ebrahimi * operation. Since driver contexts are driver-specific, swapping
68*62c56f98SSadaf Ebrahimi * drivers halfway through the operation is not supported.
69*62c56f98SSadaf Ebrahimi * ID values are auto-generated in psa_driver_wrappers.h.
70*62c56f98SSadaf Ebrahimi * ID value zero means the context is not valid or not assigned to
71*62c56f98SSadaf Ebrahimi * any driver (i.e. the driver context is not active, in use). */
72*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(id);
73*62c56f98SSadaf Ebrahimi psa_driver_hash_context_t MBEDTLS_PRIVATE(ctx);
74*62c56f98SSadaf Ebrahimi };
75*62c56f98SSadaf Ebrahimi
76*62c56f98SSadaf Ebrahimi #define PSA_HASH_OPERATION_INIT { 0, { 0 } }
psa_hash_operation_init(void)77*62c56f98SSadaf Ebrahimi static inline struct psa_hash_operation_s psa_hash_operation_init(void)
78*62c56f98SSadaf Ebrahimi {
79*62c56f98SSadaf Ebrahimi const struct psa_hash_operation_s v = PSA_HASH_OPERATION_INIT;
80*62c56f98SSadaf Ebrahimi return v;
81*62c56f98SSadaf Ebrahimi }
82*62c56f98SSadaf Ebrahimi
83*62c56f98SSadaf Ebrahimi struct psa_cipher_operation_s {
84*62c56f98SSadaf Ebrahimi /** Unique ID indicating which driver got assigned to do the
85*62c56f98SSadaf Ebrahimi * operation. Since driver contexts are driver-specific, swapping
86*62c56f98SSadaf Ebrahimi * drivers halfway through the operation is not supported.
87*62c56f98SSadaf Ebrahimi * ID values are auto-generated in psa_crypto_driver_wrappers.h
88*62c56f98SSadaf Ebrahimi * ID value zero means the context is not valid or not assigned to
89*62c56f98SSadaf Ebrahimi * any driver (i.e. none of the driver contexts are active). */
90*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(id);
91*62c56f98SSadaf Ebrahimi
92*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(iv_required) : 1;
93*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(iv_set) : 1;
94*62c56f98SSadaf Ebrahimi
95*62c56f98SSadaf Ebrahimi uint8_t MBEDTLS_PRIVATE(default_iv_length);
96*62c56f98SSadaf Ebrahimi
97*62c56f98SSadaf Ebrahimi psa_driver_cipher_context_t MBEDTLS_PRIVATE(ctx);
98*62c56f98SSadaf Ebrahimi };
99*62c56f98SSadaf Ebrahimi
100*62c56f98SSadaf Ebrahimi #define PSA_CIPHER_OPERATION_INIT { 0, 0, 0, 0, { 0 } }
psa_cipher_operation_init(void)101*62c56f98SSadaf Ebrahimi static inline struct psa_cipher_operation_s psa_cipher_operation_init(void)
102*62c56f98SSadaf Ebrahimi {
103*62c56f98SSadaf Ebrahimi const struct psa_cipher_operation_s v = PSA_CIPHER_OPERATION_INIT;
104*62c56f98SSadaf Ebrahimi return v;
105*62c56f98SSadaf Ebrahimi }
106*62c56f98SSadaf Ebrahimi
107*62c56f98SSadaf Ebrahimi /* Include the context definition for the compiled-in drivers for the composite
108*62c56f98SSadaf Ebrahimi * algorithms. */
109*62c56f98SSadaf Ebrahimi #include "psa/crypto_driver_contexts_composites.h"
110*62c56f98SSadaf Ebrahimi
111*62c56f98SSadaf Ebrahimi struct psa_mac_operation_s {
112*62c56f98SSadaf Ebrahimi /** Unique ID indicating which driver got assigned to do the
113*62c56f98SSadaf Ebrahimi * operation. Since driver contexts are driver-specific, swapping
114*62c56f98SSadaf Ebrahimi * drivers halfway through the operation is not supported.
115*62c56f98SSadaf Ebrahimi * ID values are auto-generated in psa_driver_wrappers.h
116*62c56f98SSadaf Ebrahimi * ID value zero means the context is not valid or not assigned to
117*62c56f98SSadaf Ebrahimi * any driver (i.e. none of the driver contexts are active). */
118*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(id);
119*62c56f98SSadaf Ebrahimi uint8_t MBEDTLS_PRIVATE(mac_size);
120*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(is_sign) : 1;
121*62c56f98SSadaf Ebrahimi psa_driver_mac_context_t MBEDTLS_PRIVATE(ctx);
122*62c56f98SSadaf Ebrahimi };
123*62c56f98SSadaf Ebrahimi
124*62c56f98SSadaf Ebrahimi #define PSA_MAC_OPERATION_INIT { 0, 0, 0, { 0 } }
psa_mac_operation_init(void)125*62c56f98SSadaf Ebrahimi static inline struct psa_mac_operation_s psa_mac_operation_init(void)
126*62c56f98SSadaf Ebrahimi {
127*62c56f98SSadaf Ebrahimi const struct psa_mac_operation_s v = PSA_MAC_OPERATION_INIT;
128*62c56f98SSadaf Ebrahimi return v;
129*62c56f98SSadaf Ebrahimi }
130*62c56f98SSadaf Ebrahimi
131*62c56f98SSadaf Ebrahimi struct psa_aead_operation_s {
132*62c56f98SSadaf Ebrahimi
133*62c56f98SSadaf Ebrahimi /** Unique ID indicating which driver got assigned to do the
134*62c56f98SSadaf Ebrahimi * operation. Since driver contexts are driver-specific, swapping
135*62c56f98SSadaf Ebrahimi * drivers halfway through the operation is not supported.
136*62c56f98SSadaf Ebrahimi * ID values are auto-generated in psa_crypto_driver_wrappers.h
137*62c56f98SSadaf Ebrahimi * ID value zero means the context is not valid or not assigned to
138*62c56f98SSadaf Ebrahimi * any driver (i.e. none of the driver contexts are active). */
139*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(id);
140*62c56f98SSadaf Ebrahimi
141*62c56f98SSadaf Ebrahimi psa_algorithm_t MBEDTLS_PRIVATE(alg);
142*62c56f98SSadaf Ebrahimi psa_key_type_t MBEDTLS_PRIVATE(key_type);
143*62c56f98SSadaf Ebrahimi
144*62c56f98SSadaf Ebrahimi size_t MBEDTLS_PRIVATE(ad_remaining);
145*62c56f98SSadaf Ebrahimi size_t MBEDTLS_PRIVATE(body_remaining);
146*62c56f98SSadaf Ebrahimi
147*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(nonce_set) : 1;
148*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(lengths_set) : 1;
149*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(ad_started) : 1;
150*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(body_started) : 1;
151*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(is_encrypt) : 1;
152*62c56f98SSadaf Ebrahimi
153*62c56f98SSadaf Ebrahimi psa_driver_aead_context_t MBEDTLS_PRIVATE(ctx);
154*62c56f98SSadaf Ebrahimi };
155*62c56f98SSadaf Ebrahimi
156*62c56f98SSadaf Ebrahimi #define PSA_AEAD_OPERATION_INIT { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, { 0 } }
psa_aead_operation_init(void)157*62c56f98SSadaf Ebrahimi static inline struct psa_aead_operation_s psa_aead_operation_init(void)
158*62c56f98SSadaf Ebrahimi {
159*62c56f98SSadaf Ebrahimi const struct psa_aead_operation_s v = PSA_AEAD_OPERATION_INIT;
160*62c56f98SSadaf Ebrahimi return v;
161*62c56f98SSadaf Ebrahimi }
162*62c56f98SSadaf Ebrahimi
163*62c56f98SSadaf Ebrahimi /* Include the context definition for the compiled-in drivers for the key
164*62c56f98SSadaf Ebrahimi * derivation algorithms. */
165*62c56f98SSadaf Ebrahimi #include "psa/crypto_driver_contexts_key_derivation.h"
166*62c56f98SSadaf Ebrahimi
167*62c56f98SSadaf Ebrahimi struct psa_key_derivation_s {
168*62c56f98SSadaf Ebrahimi psa_algorithm_t MBEDTLS_PRIVATE(alg);
169*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(can_output_key) : 1;
170*62c56f98SSadaf Ebrahimi size_t MBEDTLS_PRIVATE(capacity);
171*62c56f98SSadaf Ebrahimi psa_driver_key_derivation_context_t MBEDTLS_PRIVATE(ctx);
172*62c56f98SSadaf Ebrahimi };
173*62c56f98SSadaf Ebrahimi
174*62c56f98SSadaf Ebrahimi /* This only zeroes out the first byte in the union, the rest is unspecified. */
175*62c56f98SSadaf Ebrahimi #define PSA_KEY_DERIVATION_OPERATION_INIT { 0, 0, 0, { 0 } }
psa_key_derivation_operation_init(void)176*62c56f98SSadaf Ebrahimi static inline struct psa_key_derivation_s psa_key_derivation_operation_init(
177*62c56f98SSadaf Ebrahimi void)
178*62c56f98SSadaf Ebrahimi {
179*62c56f98SSadaf Ebrahimi const struct psa_key_derivation_s v = PSA_KEY_DERIVATION_OPERATION_INIT;
180*62c56f98SSadaf Ebrahimi return v;
181*62c56f98SSadaf Ebrahimi }
182*62c56f98SSadaf Ebrahimi
183*62c56f98SSadaf Ebrahimi struct psa_key_policy_s {
184*62c56f98SSadaf Ebrahimi psa_key_usage_t MBEDTLS_PRIVATE(usage);
185*62c56f98SSadaf Ebrahimi psa_algorithm_t MBEDTLS_PRIVATE(alg);
186*62c56f98SSadaf Ebrahimi psa_algorithm_t MBEDTLS_PRIVATE(alg2);
187*62c56f98SSadaf Ebrahimi };
188*62c56f98SSadaf Ebrahimi typedef struct psa_key_policy_s psa_key_policy_t;
189*62c56f98SSadaf Ebrahimi
190*62c56f98SSadaf Ebrahimi #define PSA_KEY_POLICY_INIT { 0, 0, 0 }
psa_key_policy_init(void)191*62c56f98SSadaf Ebrahimi static inline struct psa_key_policy_s psa_key_policy_init(void)
192*62c56f98SSadaf Ebrahimi {
193*62c56f98SSadaf Ebrahimi const struct psa_key_policy_s v = PSA_KEY_POLICY_INIT;
194*62c56f98SSadaf Ebrahimi return v;
195*62c56f98SSadaf Ebrahimi }
196*62c56f98SSadaf Ebrahimi
197*62c56f98SSadaf Ebrahimi /* The type used internally for key sizes.
198*62c56f98SSadaf Ebrahimi * Public interfaces use size_t, but internally we use a smaller type. */
199*62c56f98SSadaf Ebrahimi typedef uint16_t psa_key_bits_t;
200*62c56f98SSadaf Ebrahimi /* The maximum value of the type used to represent bit-sizes.
201*62c56f98SSadaf Ebrahimi * This is used to mark an invalid key size. */
202*62c56f98SSadaf Ebrahimi #define PSA_KEY_BITS_TOO_LARGE ((psa_key_bits_t) -1)
203*62c56f98SSadaf Ebrahimi /* The maximum size of a key in bits.
204*62c56f98SSadaf Ebrahimi * Currently defined as the maximum that can be represented, rounded down
205*62c56f98SSadaf Ebrahimi * to a whole number of bytes.
206*62c56f98SSadaf Ebrahimi * This is an uncast value so that it can be used in preprocessor
207*62c56f98SSadaf Ebrahimi * conditionals. */
208*62c56f98SSadaf Ebrahimi #define PSA_MAX_KEY_BITS 0xfff8
209*62c56f98SSadaf Ebrahimi
210*62c56f98SSadaf Ebrahimi /** A mask of flags that can be stored in key attributes.
211*62c56f98SSadaf Ebrahimi *
212*62c56f98SSadaf Ebrahimi * This type is also used internally to store flags in slots. Internal
213*62c56f98SSadaf Ebrahimi * flags are defined in library/psa_crypto_core.h. Internal flags may have
214*62c56f98SSadaf Ebrahimi * the same value as external flags if they are properly handled during
215*62c56f98SSadaf Ebrahimi * key creation and in psa_get_key_attributes.
216*62c56f98SSadaf Ebrahimi */
217*62c56f98SSadaf Ebrahimi typedef uint16_t psa_key_attributes_flag_t;
218*62c56f98SSadaf Ebrahimi
219*62c56f98SSadaf Ebrahimi #define MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER \
220*62c56f98SSadaf Ebrahimi ((psa_key_attributes_flag_t) 0x0001)
221*62c56f98SSadaf Ebrahimi
222*62c56f98SSadaf Ebrahimi /* A mask of key attribute flags used externally only.
223*62c56f98SSadaf Ebrahimi * Only meant for internal checks inside the library. */
224*62c56f98SSadaf Ebrahimi #define MBEDTLS_PSA_KA_MASK_EXTERNAL_ONLY ( \
225*62c56f98SSadaf Ebrahimi MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER | \
226*62c56f98SSadaf Ebrahimi 0)
227*62c56f98SSadaf Ebrahimi
228*62c56f98SSadaf Ebrahimi /* A mask of key attribute flags used both internally and externally.
229*62c56f98SSadaf Ebrahimi * Currently there aren't any. */
230*62c56f98SSadaf Ebrahimi #define MBEDTLS_PSA_KA_MASK_DUAL_USE ( \
231*62c56f98SSadaf Ebrahimi 0)
232*62c56f98SSadaf Ebrahimi
233*62c56f98SSadaf Ebrahimi typedef struct {
234*62c56f98SSadaf Ebrahimi psa_key_type_t MBEDTLS_PRIVATE(type);
235*62c56f98SSadaf Ebrahimi psa_key_bits_t MBEDTLS_PRIVATE(bits);
236*62c56f98SSadaf Ebrahimi psa_key_lifetime_t MBEDTLS_PRIVATE(lifetime);
237*62c56f98SSadaf Ebrahimi mbedtls_svc_key_id_t MBEDTLS_PRIVATE(id);
238*62c56f98SSadaf Ebrahimi psa_key_policy_t MBEDTLS_PRIVATE(policy);
239*62c56f98SSadaf Ebrahimi psa_key_attributes_flag_t MBEDTLS_PRIVATE(flags);
240*62c56f98SSadaf Ebrahimi } psa_core_key_attributes_t;
241*62c56f98SSadaf Ebrahimi
242*62c56f98SSadaf Ebrahimi #define PSA_CORE_KEY_ATTRIBUTES_INIT { PSA_KEY_TYPE_NONE, 0, \
243*62c56f98SSadaf Ebrahimi PSA_KEY_LIFETIME_VOLATILE, \
244*62c56f98SSadaf Ebrahimi MBEDTLS_SVC_KEY_ID_INIT, \
245*62c56f98SSadaf Ebrahimi PSA_KEY_POLICY_INIT, 0 }
246*62c56f98SSadaf Ebrahimi
247*62c56f98SSadaf Ebrahimi struct psa_key_attributes_s {
248*62c56f98SSadaf Ebrahimi psa_core_key_attributes_t MBEDTLS_PRIVATE(core);
249*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
250*62c56f98SSadaf Ebrahimi psa_key_slot_number_t MBEDTLS_PRIVATE(slot_number);
251*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
252*62c56f98SSadaf Ebrahimi void *MBEDTLS_PRIVATE(domain_parameters);
253*62c56f98SSadaf Ebrahimi size_t MBEDTLS_PRIVATE(domain_parameters_size);
254*62c56f98SSadaf Ebrahimi };
255*62c56f98SSadaf Ebrahimi
256*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
257*62c56f98SSadaf Ebrahimi #define PSA_KEY_ATTRIBUTES_INIT { PSA_CORE_KEY_ATTRIBUTES_INIT, 0, NULL, 0 }
258*62c56f98SSadaf Ebrahimi #else
259*62c56f98SSadaf Ebrahimi #define PSA_KEY_ATTRIBUTES_INIT { PSA_CORE_KEY_ATTRIBUTES_INIT, NULL, 0 }
260*62c56f98SSadaf Ebrahimi #endif
261*62c56f98SSadaf Ebrahimi
psa_key_attributes_init(void)262*62c56f98SSadaf Ebrahimi static inline struct psa_key_attributes_s psa_key_attributes_init(void)
263*62c56f98SSadaf Ebrahimi {
264*62c56f98SSadaf Ebrahimi const struct psa_key_attributes_s v = PSA_KEY_ATTRIBUTES_INIT;
265*62c56f98SSadaf Ebrahimi return v;
266*62c56f98SSadaf Ebrahimi }
267*62c56f98SSadaf Ebrahimi
psa_set_key_id(psa_key_attributes_t * attributes,mbedtls_svc_key_id_t key)268*62c56f98SSadaf Ebrahimi static inline void psa_set_key_id(psa_key_attributes_t *attributes,
269*62c56f98SSadaf Ebrahimi mbedtls_svc_key_id_t key)
270*62c56f98SSadaf Ebrahimi {
271*62c56f98SSadaf Ebrahimi psa_key_lifetime_t lifetime = attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(lifetime);
272*62c56f98SSadaf Ebrahimi
273*62c56f98SSadaf Ebrahimi attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(id) = key;
274*62c56f98SSadaf Ebrahimi
275*62c56f98SSadaf Ebrahimi if (PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)) {
276*62c56f98SSadaf Ebrahimi attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(lifetime) =
277*62c56f98SSadaf Ebrahimi PSA_KEY_LIFETIME_FROM_PERSISTENCE_AND_LOCATION(
278*62c56f98SSadaf Ebrahimi PSA_KEY_LIFETIME_PERSISTENT,
279*62c56f98SSadaf Ebrahimi PSA_KEY_LIFETIME_GET_LOCATION(lifetime));
280*62c56f98SSadaf Ebrahimi }
281*62c56f98SSadaf Ebrahimi }
282*62c56f98SSadaf Ebrahimi
psa_get_key_id(const psa_key_attributes_t * attributes)283*62c56f98SSadaf Ebrahimi static inline mbedtls_svc_key_id_t psa_get_key_id(
284*62c56f98SSadaf Ebrahimi const psa_key_attributes_t *attributes)
285*62c56f98SSadaf Ebrahimi {
286*62c56f98SSadaf Ebrahimi return attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(id);
287*62c56f98SSadaf Ebrahimi }
288*62c56f98SSadaf Ebrahimi
289*62c56f98SSadaf Ebrahimi #ifdef MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER
mbedtls_set_key_owner_id(psa_key_attributes_t * attributes,mbedtls_key_owner_id_t owner)290*62c56f98SSadaf Ebrahimi static inline void mbedtls_set_key_owner_id(psa_key_attributes_t *attributes,
291*62c56f98SSadaf Ebrahimi mbedtls_key_owner_id_t owner)
292*62c56f98SSadaf Ebrahimi {
293*62c56f98SSadaf Ebrahimi attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(id).MBEDTLS_PRIVATE(owner) = owner;
294*62c56f98SSadaf Ebrahimi }
295*62c56f98SSadaf Ebrahimi #endif
296*62c56f98SSadaf Ebrahimi
psa_set_key_lifetime(psa_key_attributes_t * attributes,psa_key_lifetime_t lifetime)297*62c56f98SSadaf Ebrahimi static inline void psa_set_key_lifetime(psa_key_attributes_t *attributes,
298*62c56f98SSadaf Ebrahimi psa_key_lifetime_t lifetime)
299*62c56f98SSadaf Ebrahimi {
300*62c56f98SSadaf Ebrahimi attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(lifetime) = lifetime;
301*62c56f98SSadaf Ebrahimi if (PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)) {
302*62c56f98SSadaf Ebrahimi #ifdef MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER
303*62c56f98SSadaf Ebrahimi attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(id).MBEDTLS_PRIVATE(key_id) = 0;
304*62c56f98SSadaf Ebrahimi #else
305*62c56f98SSadaf Ebrahimi attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(id) = 0;
306*62c56f98SSadaf Ebrahimi #endif
307*62c56f98SSadaf Ebrahimi }
308*62c56f98SSadaf Ebrahimi }
309*62c56f98SSadaf Ebrahimi
psa_get_key_lifetime(const psa_key_attributes_t * attributes)310*62c56f98SSadaf Ebrahimi static inline psa_key_lifetime_t psa_get_key_lifetime(
311*62c56f98SSadaf Ebrahimi const psa_key_attributes_t *attributes)
312*62c56f98SSadaf Ebrahimi {
313*62c56f98SSadaf Ebrahimi return attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(lifetime);
314*62c56f98SSadaf Ebrahimi }
315*62c56f98SSadaf Ebrahimi
psa_extend_key_usage_flags(psa_key_usage_t * usage_flags)316*62c56f98SSadaf Ebrahimi static inline void psa_extend_key_usage_flags(psa_key_usage_t *usage_flags)
317*62c56f98SSadaf Ebrahimi {
318*62c56f98SSadaf Ebrahimi if (*usage_flags & PSA_KEY_USAGE_SIGN_HASH) {
319*62c56f98SSadaf Ebrahimi *usage_flags |= PSA_KEY_USAGE_SIGN_MESSAGE;
320*62c56f98SSadaf Ebrahimi }
321*62c56f98SSadaf Ebrahimi
322*62c56f98SSadaf Ebrahimi if (*usage_flags & PSA_KEY_USAGE_VERIFY_HASH) {
323*62c56f98SSadaf Ebrahimi *usage_flags |= PSA_KEY_USAGE_VERIFY_MESSAGE;
324*62c56f98SSadaf Ebrahimi }
325*62c56f98SSadaf Ebrahimi }
326*62c56f98SSadaf Ebrahimi
psa_set_key_usage_flags(psa_key_attributes_t * attributes,psa_key_usage_t usage_flags)327*62c56f98SSadaf Ebrahimi static inline void psa_set_key_usage_flags(psa_key_attributes_t *attributes,
328*62c56f98SSadaf Ebrahimi psa_key_usage_t usage_flags)
329*62c56f98SSadaf Ebrahimi {
330*62c56f98SSadaf Ebrahimi psa_extend_key_usage_flags(&usage_flags);
331*62c56f98SSadaf Ebrahimi attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(policy).MBEDTLS_PRIVATE(usage) = usage_flags;
332*62c56f98SSadaf Ebrahimi }
333*62c56f98SSadaf Ebrahimi
psa_get_key_usage_flags(const psa_key_attributes_t * attributes)334*62c56f98SSadaf Ebrahimi static inline psa_key_usage_t psa_get_key_usage_flags(
335*62c56f98SSadaf Ebrahimi const psa_key_attributes_t *attributes)
336*62c56f98SSadaf Ebrahimi {
337*62c56f98SSadaf Ebrahimi return attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(policy).MBEDTLS_PRIVATE(usage);
338*62c56f98SSadaf Ebrahimi }
339*62c56f98SSadaf Ebrahimi
psa_set_key_algorithm(psa_key_attributes_t * attributes,psa_algorithm_t alg)340*62c56f98SSadaf Ebrahimi static inline void psa_set_key_algorithm(psa_key_attributes_t *attributes,
341*62c56f98SSadaf Ebrahimi psa_algorithm_t alg)
342*62c56f98SSadaf Ebrahimi {
343*62c56f98SSadaf Ebrahimi attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(policy).MBEDTLS_PRIVATE(alg) = alg;
344*62c56f98SSadaf Ebrahimi }
345*62c56f98SSadaf Ebrahimi
psa_get_key_algorithm(const psa_key_attributes_t * attributes)346*62c56f98SSadaf Ebrahimi static inline psa_algorithm_t psa_get_key_algorithm(
347*62c56f98SSadaf Ebrahimi const psa_key_attributes_t *attributes)
348*62c56f98SSadaf Ebrahimi {
349*62c56f98SSadaf Ebrahimi return attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(policy).MBEDTLS_PRIVATE(alg);
350*62c56f98SSadaf Ebrahimi }
351*62c56f98SSadaf Ebrahimi
352*62c56f98SSadaf Ebrahimi /* This function is declared in crypto_extra.h, which comes after this
353*62c56f98SSadaf Ebrahimi * header file, but we need the function here, so repeat the declaration. */
354*62c56f98SSadaf Ebrahimi psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes,
355*62c56f98SSadaf Ebrahimi psa_key_type_t type,
356*62c56f98SSadaf Ebrahimi const uint8_t *data,
357*62c56f98SSadaf Ebrahimi size_t data_length);
358*62c56f98SSadaf Ebrahimi
psa_set_key_type(psa_key_attributes_t * attributes,psa_key_type_t type)359*62c56f98SSadaf Ebrahimi static inline void psa_set_key_type(psa_key_attributes_t *attributes,
360*62c56f98SSadaf Ebrahimi psa_key_type_t type)
361*62c56f98SSadaf Ebrahimi {
362*62c56f98SSadaf Ebrahimi if (attributes->MBEDTLS_PRIVATE(domain_parameters) == NULL) {
363*62c56f98SSadaf Ebrahimi /* Common case: quick path */
364*62c56f98SSadaf Ebrahimi attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(type) = type;
365*62c56f98SSadaf Ebrahimi } else {
366*62c56f98SSadaf Ebrahimi /* Call the bigger function to free the old domain parameters.
367*62c56f98SSadaf Ebrahimi * Ignore any errors which may arise due to type requiring
368*62c56f98SSadaf Ebrahimi * non-default domain parameters, since this function can't
369*62c56f98SSadaf Ebrahimi * report errors. */
370*62c56f98SSadaf Ebrahimi (void) psa_set_key_domain_parameters(attributes, type, NULL, 0);
371*62c56f98SSadaf Ebrahimi }
372*62c56f98SSadaf Ebrahimi }
373*62c56f98SSadaf Ebrahimi
psa_get_key_type(const psa_key_attributes_t * attributes)374*62c56f98SSadaf Ebrahimi static inline psa_key_type_t psa_get_key_type(
375*62c56f98SSadaf Ebrahimi const psa_key_attributes_t *attributes)
376*62c56f98SSadaf Ebrahimi {
377*62c56f98SSadaf Ebrahimi return attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(type);
378*62c56f98SSadaf Ebrahimi }
379*62c56f98SSadaf Ebrahimi
psa_set_key_bits(psa_key_attributes_t * attributes,size_t bits)380*62c56f98SSadaf Ebrahimi static inline void psa_set_key_bits(psa_key_attributes_t *attributes,
381*62c56f98SSadaf Ebrahimi size_t bits)
382*62c56f98SSadaf Ebrahimi {
383*62c56f98SSadaf Ebrahimi if (bits > PSA_MAX_KEY_BITS) {
384*62c56f98SSadaf Ebrahimi attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(bits) = PSA_KEY_BITS_TOO_LARGE;
385*62c56f98SSadaf Ebrahimi } else {
386*62c56f98SSadaf Ebrahimi attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(bits) = (psa_key_bits_t) bits;
387*62c56f98SSadaf Ebrahimi }
388*62c56f98SSadaf Ebrahimi }
389*62c56f98SSadaf Ebrahimi
psa_get_key_bits(const psa_key_attributes_t * attributes)390*62c56f98SSadaf Ebrahimi static inline size_t psa_get_key_bits(
391*62c56f98SSadaf Ebrahimi const psa_key_attributes_t *attributes)
392*62c56f98SSadaf Ebrahimi {
393*62c56f98SSadaf Ebrahimi return attributes->MBEDTLS_PRIVATE(core).MBEDTLS_PRIVATE(bits);
394*62c56f98SSadaf Ebrahimi }
395*62c56f98SSadaf Ebrahimi
396*62c56f98SSadaf Ebrahimi /**
397*62c56f98SSadaf Ebrahimi * \brief The context for PSA interruptible hash signing.
398*62c56f98SSadaf Ebrahimi */
399*62c56f98SSadaf Ebrahimi struct psa_sign_hash_interruptible_operation_s {
400*62c56f98SSadaf Ebrahimi /** Unique ID indicating which driver got assigned to do the
401*62c56f98SSadaf Ebrahimi * operation. Since driver contexts are driver-specific, swapping
402*62c56f98SSadaf Ebrahimi * drivers halfway through the operation is not supported.
403*62c56f98SSadaf Ebrahimi * ID values are auto-generated in psa_crypto_driver_wrappers.h
404*62c56f98SSadaf Ebrahimi * ID value zero means the context is not valid or not assigned to
405*62c56f98SSadaf Ebrahimi * any driver (i.e. none of the driver contexts are active). */
406*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(id);
407*62c56f98SSadaf Ebrahimi
408*62c56f98SSadaf Ebrahimi psa_driver_sign_hash_interruptible_context_t MBEDTLS_PRIVATE(ctx);
409*62c56f98SSadaf Ebrahimi
410*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(error_occurred) : 1;
411*62c56f98SSadaf Ebrahimi
412*62c56f98SSadaf Ebrahimi uint32_t MBEDTLS_PRIVATE(num_ops);
413*62c56f98SSadaf Ebrahimi };
414*62c56f98SSadaf Ebrahimi
415*62c56f98SSadaf Ebrahimi #define PSA_SIGN_HASH_INTERRUPTIBLE_OPERATION_INIT { 0, { 0 }, 0, 0 }
416*62c56f98SSadaf Ebrahimi
417*62c56f98SSadaf Ebrahimi static inline struct psa_sign_hash_interruptible_operation_s
psa_sign_hash_interruptible_operation_init(void)418*62c56f98SSadaf Ebrahimi psa_sign_hash_interruptible_operation_init(void)
419*62c56f98SSadaf Ebrahimi {
420*62c56f98SSadaf Ebrahimi const struct psa_sign_hash_interruptible_operation_s v =
421*62c56f98SSadaf Ebrahimi PSA_SIGN_HASH_INTERRUPTIBLE_OPERATION_INIT;
422*62c56f98SSadaf Ebrahimi
423*62c56f98SSadaf Ebrahimi return v;
424*62c56f98SSadaf Ebrahimi }
425*62c56f98SSadaf Ebrahimi
426*62c56f98SSadaf Ebrahimi /**
427*62c56f98SSadaf Ebrahimi * \brief The context for PSA interruptible hash verification.
428*62c56f98SSadaf Ebrahimi */
429*62c56f98SSadaf Ebrahimi struct psa_verify_hash_interruptible_operation_s {
430*62c56f98SSadaf Ebrahimi /** Unique ID indicating which driver got assigned to do the
431*62c56f98SSadaf Ebrahimi * operation. Since driver contexts are driver-specific, swapping
432*62c56f98SSadaf Ebrahimi * drivers halfway through the operation is not supported.
433*62c56f98SSadaf Ebrahimi * ID values are auto-generated in psa_crypto_driver_wrappers.h
434*62c56f98SSadaf Ebrahimi * ID value zero means the context is not valid or not assigned to
435*62c56f98SSadaf Ebrahimi * any driver (i.e. none of the driver contexts are active). */
436*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(id);
437*62c56f98SSadaf Ebrahimi
438*62c56f98SSadaf Ebrahimi psa_driver_verify_hash_interruptible_context_t MBEDTLS_PRIVATE(ctx);
439*62c56f98SSadaf Ebrahimi
440*62c56f98SSadaf Ebrahimi unsigned int MBEDTLS_PRIVATE(error_occurred) : 1;
441*62c56f98SSadaf Ebrahimi
442*62c56f98SSadaf Ebrahimi uint32_t MBEDTLS_PRIVATE(num_ops);
443*62c56f98SSadaf Ebrahimi };
444*62c56f98SSadaf Ebrahimi
445*62c56f98SSadaf Ebrahimi #define PSA_VERIFY_HASH_INTERRUPTIBLE_OPERATION_INIT { 0, { 0 }, 0, 0 }
446*62c56f98SSadaf Ebrahimi
447*62c56f98SSadaf Ebrahimi static inline struct psa_verify_hash_interruptible_operation_s
psa_verify_hash_interruptible_operation_init(void)448*62c56f98SSadaf Ebrahimi psa_verify_hash_interruptible_operation_init(void)
449*62c56f98SSadaf Ebrahimi {
450*62c56f98SSadaf Ebrahimi const struct psa_verify_hash_interruptible_operation_s v =
451*62c56f98SSadaf Ebrahimi PSA_VERIFY_HASH_INTERRUPTIBLE_OPERATION_INIT;
452*62c56f98SSadaf Ebrahimi
453*62c56f98SSadaf Ebrahimi return v;
454*62c56f98SSadaf Ebrahimi }
455*62c56f98SSadaf Ebrahimi
456*62c56f98SSadaf Ebrahimi #ifdef __cplusplus
457*62c56f98SSadaf Ebrahimi }
458*62c56f98SSadaf Ebrahimi #endif
459*62c56f98SSadaf Ebrahimi
460*62c56f98SSadaf Ebrahimi #endif /* PSA_CRYPTO_STRUCT_H */
461