blob: 403a734000bbeda867e054e6e8df662774cd23fa [file] [log] [blame]
Antonio de Angelis377a1552018-11-22 17:02:40 +00001/*
Antonio de Angelis04debbd2019-10-14 12:12:52 +01002 * Copyright (c) 2018-2020, Arm Limited. All rights reserved.
Antonio de Angelis377a1552018-11-22 17:02:40 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7/**
Jamie Foxcc31d402019-01-28 17:13:52 +00008 * \file psa/crypto_struct.h
Antonio de Angelis377a1552018-11-22 17:02:40 +00009 *
10 * \brief PSA cryptography module: structured type implementations
11 *
12 * \note This file may not be included directly. Applications must
Jamie Foxcc31d402019-01-28 17:13:52 +000013 * include psa/crypto.h.
Antonio de Angelis377a1552018-11-22 17:02:40 +000014 *
15 * This file contains the definitions of some data structures with
16 * implementation-specific definitions.
17 *
18 * In implementations with isolation between the application and the
19 * cryptography module, it is expected that the front-end and the back-end
20 * would have different versions of this file.
21 */
22
23#ifndef PSA_CRYPTO_STRUCT_H
24#define PSA_CRYPTO_STRUCT_H
25
Antonio de Angelis04debbd2019-10-14 12:12:52 +010026#ifdef __cplusplus
27extern "C" {
28#endif
29
30/*
31 * Note that the below structures are different from the decalrations in
32 * mbed-crypto. This is because TF-M maintains 'front-end' and 'back-end'
33 * versions of this header. In the front-end version, exported to NS
34 * clients in interface/include/psa, a crypto operation is defined as an
35 * opaque handle to a context in the Crypto service. The back-end
36 * version, directly included from the mbed-crypto repo by the Crypto
37 * service, contains the full definition of the operation structs.
38 *
39 * One of the functions of the Crypto service is to allocate the back-end
40 * operation contexts in its own partition memory (in crypto_alloc.c),
41 * and then do the mapping between front-end operation handles passed by
42 * NS clients and the corresponding back-end operation contexts. The
43 * advantage of doing it this way is that internal mbed-crypto state is never
44 * exposed to the NS client.
45 */
46
Antonio de Angelis377a1552018-11-22 17:02:40 +000047struct psa_hash_operation_s
48{
49 uint32_t handle;
50};
51
Jamie Fox0e54ebc2019-04-09 14:21:04 +010052#define PSA_HASH_OPERATION_INIT {0}
53static inline struct psa_hash_operation_s psa_hash_operation_init( void )
54{
55 const struct psa_hash_operation_s v = PSA_HASH_OPERATION_INIT;
56 return( v );
57}
58
Antonio de Angelis377a1552018-11-22 17:02:40 +000059struct psa_mac_operation_s
60{
61 uint32_t handle;
62};
63
Jamie Fox0e54ebc2019-04-09 14:21:04 +010064#define PSA_MAC_OPERATION_INIT {0}
65static inline struct psa_mac_operation_s psa_mac_operation_init( void )
66{
67 const struct psa_mac_operation_s v = PSA_MAC_OPERATION_INIT;
68 return( v );
69}
70
Antonio de Angelis377a1552018-11-22 17:02:40 +000071struct psa_cipher_operation_s
72{
73 uint32_t handle;
74};
75
Jamie Fox0e54ebc2019-04-09 14:21:04 +010076#define PSA_CIPHER_OPERATION_INIT {0}
77static inline struct psa_cipher_operation_s psa_cipher_operation_init( void )
78{
79 const struct psa_cipher_operation_s v = PSA_CIPHER_OPERATION_INIT;
80 return( v );
81}
82
Antonio de Angelis04debbd2019-10-14 12:12:52 +010083struct psa_aead_operation_s
Jamie Fox0e54ebc2019-04-09 14:21:04 +010084{
85 uint32_t handle;
86};
87
Antonio de Angelis04debbd2019-10-14 12:12:52 +010088#define PSA_AEAD_OPERATION_INIT {0}
89static inline struct psa_aead_operation_s psa_aead_operation_init( void )
Jamie Fox0e54ebc2019-04-09 14:21:04 +010090{
Antonio de Angelis04debbd2019-10-14 12:12:52 +010091 const struct psa_aead_operation_s v = PSA_AEAD_OPERATION_INIT;
92 return( v );
93}
94
95struct psa_key_derivation_s
96{
97 uint32_t handle;
98};
99
100#define PSA_KEY_DERIVATION_OPERATION_INIT {0}
101static inline struct psa_key_derivation_s psa_key_derivation_operation_init( void )
102{
103 const struct psa_key_derivation_s v = PSA_KEY_DERIVATION_OPERATION_INIT;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100104 return( v );
105}
106
Antonio de Angelis377a1552018-11-22 17:02:40 +0000107struct psa_key_policy_s
108{
109 psa_key_usage_t usage;
110 psa_algorithm_t alg;
Antonio de Angelis2e7d2962019-06-27 11:30:04 +0100111 psa_algorithm_t alg2;
Antonio de Angelis377a1552018-11-22 17:02:40 +0000112};
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100113typedef struct psa_key_policy_s psa_key_policy_t;
Antonio de Angelis377a1552018-11-22 17:02:40 +0000114
Antonio de Angelis2e7d2962019-06-27 11:30:04 +0100115#define PSA_KEY_POLICY_INIT {0, 0, 0}
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100116static inline struct psa_key_policy_s psa_key_policy_init( void )
117{
118 const struct psa_key_policy_s v = PSA_KEY_POLICY_INIT;
119 return( v );
120}
121
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100122/* The type used internally for key sizes.
123 * Public interfaces use size_t, but internally we use a smaller type. */
124typedef uint16_t psa_key_bits_t;
125/* The maximum value of the type used to represent bit-sizes.
126 * This is used to mark an invalid key size. */
127#define PSA_KEY_BITS_TOO_LARGE ( (psa_key_bits_t) ( -1 ) )
128/* The maximum size of a key in bits.
129 * Currently defined as the maximum that can be represented, rounded down
130 * to a whole number of bytes.
131 * This is an uncast value so that it can be used in preprocessor
132 * conditionals. */
133#define PSA_MAX_KEY_BITS 0xfff8
134
135/** A mask of flags that can be stored in key attributes.
136 *
137 * This type is also used internally to store flags in slots. Internal
138 * flags are defined in library/psa_crypto_core.h. Internal flags may have
139 * the same value as external flags if they are properly handled during
140 * key creation and in psa_get_key_attributes.
141 */
142typedef uint16_t psa_key_attributes_flag_t;
143
144#define MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER \
145 ( (psa_key_attributes_flag_t) 0x0001 )
146
147/* A mask of key attribute flags used externally only.
148 * Only meant for internal checks inside the library. */
149#define MBEDTLS_PSA_KA_MASK_EXTERNAL_ONLY ( \
150 MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER | \
151 0 )
152
153/* A mask of key attribute flags used both internally and externally.
154 * Currently there aren't any. */
155#define MBEDTLS_PSA_KA_MASK_DUAL_USE ( \
156 0 )
157
158typedef struct
159{
160 psa_key_type_t type;
161 psa_key_lifetime_t lifetime;
162 psa_key_id_t id;
163 psa_key_policy_t policy;
164 psa_key_bits_t bits;
165 psa_key_attributes_flag_t flags;
166} psa_core_key_attributes_t;
167
168#define PSA_CORE_KEY_ATTRIBUTES_INIT {0, 0, PSA_KEY_ID_INIT, PSA_KEY_POLICY_INIT, 0, 0}
169
170struct psa_key_attributes_s
171{
172 psa_core_key_attributes_t core;
173#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
174 psa_key_slot_number_t slot_number;
175#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
176 void *domain_parameters;
177 size_t domain_parameters_size;
178};
179
180#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
181#define PSA_KEY_ATTRIBUTES_INIT {PSA_CORE_KEY_ATTRIBUTES_INIT, 0, NULL, 0}
182#else
183#define PSA_KEY_ATTRIBUTES_INIT {PSA_CORE_KEY_ATTRIBUTES_INIT, NULL, 0}
184#endif
185
186static inline struct psa_key_attributes_s psa_key_attributes_init( void )
187{
188 const struct psa_key_attributes_s v = PSA_KEY_ATTRIBUTES_INIT;
189 return( v );
190}
191
192static inline void psa_set_key_id(psa_key_attributes_t *attributes,
193 psa_key_id_t id)
194{
195 attributes->core.id = id;
196 if( attributes->core.lifetime == PSA_KEY_LIFETIME_VOLATILE )
197 attributes->core.lifetime = PSA_KEY_LIFETIME_PERSISTENT;
198}
199
200static inline psa_key_id_t psa_get_key_id(
201 const psa_key_attributes_t *attributes)
202{
203 return( attributes->core.id );
204}
205
206static inline void psa_set_key_lifetime(psa_key_attributes_t *attributes,
207 psa_key_lifetime_t lifetime)
208{
209 attributes->core.lifetime = lifetime;
210 if( lifetime == PSA_KEY_LIFETIME_VOLATILE )
211 {
212#ifdef MBEDTLS_PSA_CRYPTO_KEY_FILE_ID_ENCODES_OWNER
213 attributes->core.id.key_id = 0;
214 attributes->core.id.owner = 0;
215#else
216 attributes->core.id = 0;
217#endif
218 }
219}
220
221static inline psa_key_lifetime_t psa_get_key_lifetime(
222 const psa_key_attributes_t *attributes)
223{
224 return( attributes->core.lifetime );
225}
226
227static inline void psa_set_key_usage_flags(psa_key_attributes_t *attributes,
228 psa_key_usage_t usage_flags)
229{
230 attributes->core.policy.usage = usage_flags;
231}
232
233static inline psa_key_usage_t psa_get_key_usage_flags(
234 const psa_key_attributes_t *attributes)
235{
236 return( attributes->core.policy.usage );
237}
238
239static inline void psa_set_key_algorithm(psa_key_attributes_t *attributes,
240 psa_algorithm_t alg)
241{
242 attributes->core.policy.alg = alg;
243}
244
245static inline psa_algorithm_t psa_get_key_algorithm(
246 const psa_key_attributes_t *attributes)
247{
248 return( attributes->core.policy.alg );
249}
250
251/* This function is declared in crypto_extra.h, which comes after this
252 * header file, but we need the function here, so repeat the declaration. */
253psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes,
254 psa_key_type_t type,
255 const uint8_t *data,
256 size_t data_length);
257
258static inline void psa_set_key_type(psa_key_attributes_t *attributes,
259 psa_key_type_t type)
260{
261 if( attributes->domain_parameters == NULL )
262 {
263 /* Common case: quick path */
264 attributes->core.type = type;
265 }
266 else
267 {
268 /* Call the bigger function to free the old domain paramteres.
269 * Ignore any errors which may arise due to type requiring
270 * non-default domain parameters, since this function can't
271 * report errors. */
272 (void) psa_set_key_domain_parameters( attributes, type, NULL, 0 );
273 }
274}
275
276static inline psa_key_type_t psa_get_key_type(
277 const psa_key_attributes_t *attributes)
278{
279 return( attributes->core.type );
280}
281
282static inline void psa_set_key_bits(psa_key_attributes_t *attributes,
283 size_t bits)
284{
285 if( bits > PSA_MAX_KEY_BITS )
286 attributes->core.bits = PSA_KEY_BITS_TOO_LARGE;
287 else
288 attributes->core.bits = (psa_key_bits_t) bits;
289}
290
291static inline size_t psa_get_key_bits(
292 const psa_key_attributes_t *attributes)
293{
294 return( attributes->core.bits );
295}
296
297#ifdef __cplusplus
298}
299#endif
300
Antonio de Angelis377a1552018-11-22 17:02:40 +0000301#endif /* PSA_CRYPTO_STRUCT_H */