Mistake on this page?
Report an issue in GitHub or email us
TARGET_MBED_PSA_SRV/mbedtls/crypto_struct.h
1 /**
2  * \file psa/crypto_struct.h
3  *
4  * \brief PSA cryptography module: Mbed TLS structured type implementations
5  *
6  * \note This file may not be included directly. Applications must
7  * include psa/crypto.h.
8  *
9  * This file contains the definitions of some data structures with
10  * implementation-specific definitions.
11  *
12  * In implementations with isolation between the application and the
13  * cryptography module, it is expected that the front-end and the back-end
14  * would have different versions of this file.
15  *
16  * <h3>Design notes about multipart operation structures</h3>
17  *
18  * Each multipart operation structure contains a `psa_algorithm_t alg`
19  * field which indicates which specific algorithm the structure is for.
20  * When the structure is not in use, `alg` is 0. Most of the structure
21  * consists of a union which is discriminated by `alg`.
22  *
23  * Note that when `alg` is 0, the content of other fields is undefined.
24  * In particular, it is not guaranteed that a freshly-initialized structure
25  * is all-zero: we initialize structures to something like `{0, 0}`, which
26  * is only guaranteed to initializes the first member of the union;
27  * GCC and Clang initialize the whole structure to 0 (at the time of writing),
28  * but MSVC and CompCert don't.
29  *
30  * In Mbed Crypto, multipart operation structures live independently from
31  * the key. This allows Mbed Crypto to free the key objects when destroying
32  * a key slot. If a multipart operation needs to remember the key after
33  * the setup function returns, the operation structure needs to contain a
34  * copy of the key.
35  */
36 /*
37  * Copyright The Mbed TLS Contributors
38  * SPDX-License-Identifier: Apache-2.0
39  *
40  * Licensed under the Apache License, Version 2.0 (the "License"); you may
41  * not use this file except in compliance with the License.
42  * You may obtain a copy of the License at
43  *
44  * http://www.apache.org/licenses/LICENSE-2.0
45  *
46  * Unless required by applicable law or agreed to in writing, software
47  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
48  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
49  * See the License for the specific language governing permissions and
50  * limitations under the License.
51  */
52 
53 #ifndef PSA_CRYPTO_STRUCT_H
54 #define PSA_CRYPTO_STRUCT_H
55 
56 #ifdef __cplusplus
57 extern "C" {
58 #endif
59 
60 /* Include the Mbed TLS configuration file, the way Mbed TLS does it
61  * in each of its header files. */
62 #if !defined(MBEDTLS_CONFIG_FILE)
63 #include "mbedtls/config.h"
64 #else
65 #include MBEDTLS_CONFIG_FILE
66 #endif
67 
68 #include "mbedtls/cipher.h"
69 #include "mbedtls/cmac.h"
70 #include "mbedtls/gcm.h"
71 #include "mbedtls/md.h"
72 #include "mbedtls/md2.h"
73 #include "mbedtls/md4.h"
74 #include "mbedtls/md5.h"
75 #include "mbedtls/ripemd160.h"
76 #include "mbedtls/sha1.h"
77 #include "mbedtls/sha256.h"
78 #include "mbedtls/sha512.h"
79 
81 {
82  psa_algorithm_t alg;
83  union
84  {
85  unsigned dummy; /* Make the union non-empty even with no supported algorithms. */
86 #if defined(MBEDTLS_MD2_C)
87  mbedtls_md2_context md2;
88 #endif
89 #if defined(MBEDTLS_MD4_C)
90  mbedtls_md4_context md4;
91 #endif
92 #if defined(MBEDTLS_MD5_C)
93  mbedtls_md5_context md5;
94 #endif
95 #if defined(MBEDTLS_RIPEMD160_C)
96  mbedtls_ripemd160_context ripemd160;
97 #endif
98 #if defined(MBEDTLS_SHA1_C)
99  mbedtls_sha1_context sha1;
100 #endif
101 #if defined(MBEDTLS_SHA256_C)
102  mbedtls_sha256_context sha256;
103 #endif
104 #if defined(MBEDTLS_SHA512_C)
105  mbedtls_sha512_context sha512;
106 #endif
107  } ctx;
108 };
109 
110 #define PSA_HASH_OPERATION_INIT {0, {0}}
111 static inline struct psa_hash_operation_s psa_hash_operation_init( void )
112 {
113  const struct psa_hash_operation_s v = PSA_HASH_OPERATION_INIT;
114  return( v );
115 }
116 
117 #if defined(MBEDTLS_MD_C)
118 typedef struct
119 {
120  /** The hash context. */
121  struct psa_hash_operation_s hash_ctx;
122  /** The HMAC part of the context. */
123  uint8_t opad[PSA_HMAC_MAX_HASH_BLOCK_SIZE];
124 } psa_hmac_internal_data;
125 #endif /* MBEDTLS_MD_C */
126 
128 {
129  psa_algorithm_t alg;
130  unsigned int key_set : 1;
131  unsigned int iv_required : 1;
132  unsigned int iv_set : 1;
133  unsigned int has_input : 1;
134  unsigned int is_sign : 1;
135  uint8_t mac_size;
136  union
137  {
138  unsigned dummy; /* Make the union non-empty even with no supported algorithms. */
139 #if defined(MBEDTLS_MD_C)
140  psa_hmac_internal_data hmac;
141 #endif
142 #if defined(MBEDTLS_CMAC_C)
143  mbedtls_cipher_context_t cmac;
144 #endif
145  } ctx;
146 };
147 
148 #define PSA_MAC_OPERATION_INIT {0, 0, 0, 0, 0, 0, 0, {0}}
149 static inline struct psa_mac_operation_s psa_mac_operation_init( void )
150 {
151  const struct psa_mac_operation_s v = PSA_MAC_OPERATION_INIT;
152  return( v );
153 }
154 
156 {
157  psa_algorithm_t alg;
158  unsigned int key_set : 1;
159  unsigned int iv_required : 1;
160  unsigned int iv_set : 1;
161  uint8_t iv_size;
162  uint8_t block_size;
163  union
164  {
165  unsigned dummy; /* Enable easier initializing of the union. */
166  mbedtls_cipher_context_t cipher;
167  } ctx;
168 };
169 
170 #define PSA_CIPHER_OPERATION_INIT {0, 0, 0, 0, 0, 0, {0}}
171 static inline struct psa_cipher_operation_s psa_cipher_operation_init( void )
172 {
173  const struct psa_cipher_operation_s v = PSA_CIPHER_OPERATION_INIT;
174  return( v );
175 }
176 
178 {
179  psa_algorithm_t alg;
180  unsigned int key_set : 1;
181  unsigned int iv_set : 1;
182  uint8_t iv_size;
183  uint8_t block_size;
184  union
185  {
186  unsigned dummy; /* Enable easier initializing of the union. */
187  mbedtls_cipher_context_t cipher;
188  } ctx;
189 };
190 
191 #define PSA_AEAD_OPERATION_INIT {0, 0, 0, 0, 0, {0}}
192 static inline struct psa_aead_operation_s psa_aead_operation_init( void )
193 {
194  const struct psa_aead_operation_s v = PSA_AEAD_OPERATION_INIT;
195  return( v );
196 }
197 
198 #if defined(MBEDTLS_MD_C)
199 typedef struct
200 {
201  uint8_t *info;
202  size_t info_length;
203  psa_hmac_internal_data hmac;
204  uint8_t prk[PSA_HASH_MAX_SIZE];
205  uint8_t output_block[PSA_HASH_MAX_SIZE];
206 #if PSA_HASH_MAX_SIZE > 0xff
207 #error "PSA_HASH_MAX_SIZE does not fit in uint8_t"
208 #endif
209  uint8_t offset_in_block;
210  uint8_t block_number;
211  unsigned int state : 2;
212  unsigned int info_set : 1;
213 } psa_hkdf_key_derivation_t;
214 #endif /* MBEDTLS_MD_C */
215 
216 #if defined(MBEDTLS_MD_C)
217 typedef enum
218 {
219  TLS12_PRF_STATE_INIT, /* no input provided */
220  TLS12_PRF_STATE_SEED_SET, /* seed has been set */
221  TLS12_PRF_STATE_KEY_SET, /* key has been set */
222  TLS12_PRF_STATE_LABEL_SET, /* label has been set */
223  TLS12_PRF_STATE_OUTPUT /* output has been started */
224 } psa_tls12_prf_key_derivation_state_t;
225 
226 typedef struct psa_tls12_prf_key_derivation_s
227 {
228 #if PSA_HASH_MAX_SIZE > 0xff
229 #error "PSA_HASH_MAX_SIZE does not fit in uint8_t"
230 #endif
231 
232  /* Indicates how many bytes in the current HMAC block have
233  * not yet been read by the user. */
234  uint8_t left_in_block;
235 
236  /* The 1-based number of the block. */
237  uint8_t block_number;
238 
239  psa_tls12_prf_key_derivation_state_t state;
240 
241  uint8_t *seed;
242  size_t seed_length;
243  uint8_t *label;
244  size_t label_length;
245  psa_hmac_internal_data hmac;
246  uint8_t Ai[PSA_HASH_MAX_SIZE];
247 
248  /* `HMAC_hash( prk, A(i) + seed )` in the notation of RFC 5246, Sect. 5. */
249  uint8_t output_block[PSA_HASH_MAX_SIZE];
250 } psa_tls12_prf_key_derivation_t;
251 #endif /* MBEDTLS_MD_C */
252 
254 {
255  psa_algorithm_t alg;
256  unsigned int can_output_key : 1;
257  size_t capacity;
258  union
259  {
260  /* Make the union non-empty even with no supported algorithms. */
261  uint8_t dummy;
262 #if defined(MBEDTLS_MD_C)
263  psa_hkdf_key_derivation_t hkdf;
264  psa_tls12_prf_key_derivation_t tls12_prf;
265 #endif
266  } ctx;
267 };
268 
269 /* This only zeroes out the first byte in the union, the rest is unspecified. */
270 #define PSA_KEY_DERIVATION_OPERATION_INIT {0, 0, 0, {0}}
271 static inline struct psa_key_derivation_s psa_key_derivation_operation_init( void )
272 {
273  const struct psa_key_derivation_s v = PSA_KEY_DERIVATION_OPERATION_INIT;
274  return( v );
275 }
276 
278 {
279  psa_key_usage_t usage;
280  psa_algorithm_t alg;
281  psa_algorithm_t alg2;
282 };
283 typedef struct psa_key_policy_s psa_key_policy_t;
284 
285 #define PSA_KEY_POLICY_INIT {0, 0, 0}
286 static inline struct psa_key_policy_s psa_key_policy_init( void )
287 {
288  const struct psa_key_policy_s v = PSA_KEY_POLICY_INIT;
289  return( v );
290 }
291 
292 /* The type used internally for key sizes.
293  * Public interfaces use size_t, but internally we use a smaller type. */
294 typedef uint16_t psa_key_bits_t;
295 /* The maximum value of the type used to represent bit-sizes.
296  * This is used to mark an invalid key size. */
297 #define PSA_KEY_BITS_TOO_LARGE ( (psa_key_bits_t) ( -1 ) )
298 /* The maximum size of a key in bits.
299  * Currently defined as the maximum that can be represented, rounded down
300  * to a whole number of bytes.
301  * This is an uncast value so that it can be used in preprocessor
302  * conditionals. */
303 #define PSA_MAX_KEY_BITS 0xfff8
304 
305 /** A mask of flags that can be stored in key attributes.
306  *
307  * This type is also used internally to store flags in slots. Internal
308  * flags are defined in library/psa_crypto_core.h. Internal flags may have
309  * the same value as external flags if they are properly handled during
310  * key creation and in psa_get_key_attributes.
311  */
312 typedef uint16_t psa_key_attributes_flag_t;
313 
314 #define MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER \
315  ( (psa_key_attributes_flag_t) 0x0001 )
316 
317 /* A mask of key attribute flags used externally only.
318  * Only meant for internal checks inside the library. */
319 #define MBEDTLS_PSA_KA_MASK_EXTERNAL_ONLY ( \
320  MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER | \
321  0 )
322 
323 /* A mask of key attribute flags used both internally and externally.
324  * Currently there aren't any. */
325 #define MBEDTLS_PSA_KA_MASK_DUAL_USE ( \
326  0 )
327 
328 typedef struct
329 {
330  psa_key_type_t type;
331  psa_key_bits_t bits;
332  psa_key_lifetime_t lifetime;
333  psa_key_id_t id;
334  psa_key_policy_t policy;
335  psa_key_attributes_flag_t flags;
337 
338 #define PSA_CORE_KEY_ATTRIBUTES_INIT {PSA_KEY_TYPE_NONE, 0, PSA_KEY_LIFETIME_VOLATILE, PSA_KEY_ID_INIT, PSA_KEY_POLICY_INIT, 0}
339 
341 {
343 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
344  psa_key_slot_number_t slot_number;
345 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
346  void *domain_parameters;
347  size_t domain_parameters_size;
348 };
349 
350 #if defined(MBEDTLS_PSA_CRYPTO_SE_C)
351 #define PSA_KEY_ATTRIBUTES_INIT {PSA_CORE_KEY_ATTRIBUTES_INIT, 0, NULL, 0}
352 #else
353 #define PSA_KEY_ATTRIBUTES_INIT {PSA_CORE_KEY_ATTRIBUTES_INIT, NULL, 0}
354 #endif
355 
356 static inline struct psa_key_attributes_s psa_key_attributes_init( void )
357 {
358  const struct psa_key_attributes_s v = PSA_KEY_ATTRIBUTES_INIT;
359  return( v );
360 }
361 
362 static inline void psa_set_key_id(psa_key_attributes_t *attributes,
363  psa_key_id_t id)
364 {
365  attributes->core.id = id;
366  if( attributes->core.lifetime == PSA_KEY_LIFETIME_VOLATILE )
367  attributes->core.lifetime = PSA_KEY_LIFETIME_PERSISTENT;
368 }
369 
370 static inline psa_key_id_t psa_get_key_id(
371  const psa_key_attributes_t *attributes)
372 {
373  return( attributes->core.id );
374 }
375 
376 static inline void psa_set_key_lifetime(psa_key_attributes_t *attributes,
377  psa_key_lifetime_t lifetime)
378 {
379  attributes->core.lifetime = lifetime;
380  if( lifetime == PSA_KEY_LIFETIME_VOLATILE )
381  {
382 #ifdef MBEDTLS_PSA_CRYPTO_KEY_FILE_ID_ENCODES_OWNER
383  attributes->core.id.key_id = 0;
384  attributes->core.id.owner = 0;
385 #else
386  attributes->core.id = 0;
387 #endif
388  }
389 }
390 
392  const psa_key_attributes_t *attributes)
393 {
394  return( attributes->core.lifetime );
395 }
396 
397 static inline void psa_set_key_usage_flags(psa_key_attributes_t *attributes,
398  psa_key_usage_t usage_flags)
399 {
400  attributes->core.policy.usage = usage_flags;
401 }
402 
404  const psa_key_attributes_t *attributes)
405 {
406  return( attributes->core.policy.usage );
407 }
408 
409 static inline void psa_set_key_algorithm(psa_key_attributes_t *attributes,
410  psa_algorithm_t alg)
411 {
412  attributes->core.policy.alg = alg;
413 }
414 
416  const psa_key_attributes_t *attributes)
417 {
418  return( attributes->core.policy.alg );
419 }
420 
421 /* This function is declared in crypto_extra.h, which comes after this
422  * header file, but we need the function here, so repeat the declaration. */
424  psa_key_type_t type,
425  const uint8_t *data,
426  size_t data_length);
427 
428 static inline void psa_set_key_type(psa_key_attributes_t *attributes,
429  psa_key_type_t type)
430 {
431  if( attributes->domain_parameters == NULL )
432  {
433  /* Common case: quick path */
434  attributes->core.type = type;
435  }
436  else
437  {
438  /* Call the bigger function to free the old domain paramteres.
439  * Ignore any errors which may arise due to type requiring
440  * non-default domain parameters, since this function can't
441  * report errors. */
442  (void) psa_set_key_domain_parameters( attributes, type, NULL, 0 );
443  }
444 }
445 
446 static inline psa_key_type_t psa_get_key_type(
447  const psa_key_attributes_t *attributes)
448 {
449  return( attributes->core.type );
450 }
451 
452 static inline void psa_set_key_bits(psa_key_attributes_t *attributes,
453  size_t bits)
454 {
455  if( bits > PSA_MAX_KEY_BITS )
456  attributes->core.bits = PSA_KEY_BITS_TOO_LARGE;
457  else
458  attributes->core.bits = (psa_key_bits_t) bits;
459 }
460 
461 static inline size_t psa_get_key_bits(
462  const psa_key_attributes_t *attributes)
463 {
464  return( attributes->core.bits );
465 }
466 
467 #ifdef __cplusplus
468 }
469 #endif
470 
471 #endif /* PSA_CRYPTO_STRUCT_H */
static void psa_set_key_id(psa_key_attributes_t *attributes, psa_key_id_t id)
Declare a key as persistent and set its key identifier.
static void psa_set_key_bits(psa_key_attributes_t *attributes, size_t bits)
Declare the size of a key.
void md5(unsigned char *input, int ilen, unsigned char output[16])
Output = MD5( input buffer )
#define PSA_KEY_LIFETIME_VOLATILE
The default lifetime for volatile keys.
uint32_t psa_key_id_t
Encoding of identifiers of persistent keys.
The key size.
static psa_algorithm_t psa_get_key_algorithm(const psa_key_attributes_t *attributes)
Retrieve the algorithm policy from key attributes.
static void psa_set_key_usage_flags(psa_key_attributes_t *attributes, psa_key_usage_t usage_flags)
Declare usage flags for a key.
static void psa_set_key_lifetime(psa_key_attributes_t *attributes, psa_key_lifetime_t lifetime)
Set the location of a persistent key.
static psa_key_lifetime_t psa_get_key_lifetime(const psa_key_attributes_t *attributes)
Retrieve the lifetime from key attributes.
static void psa_set_key_type(psa_key_attributes_t *attributes, psa_key_type_t type)
Declare the type of a key.
static psa_key_id_t psa_get_key_id(const psa_key_attributes_t *attributes)
Retrieve the key identifier from key attributes.
static size_t psa_get_key_bits(const psa_key_attributes_t *attributes)
Retrieve the key size from key attributes.
psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes, psa_key_type_t type, const uint8_t *data, size_t data_length)
Set domain parameters for a key.
uint64_t psa_key_slot_number_t
An internal designation of a key slot between the core part of the PSA Crypto implementation and the ...
uint32_t psa_algorithm_t
Encoding of a cryptographic algorithm.
#define PSA_KEY_LIFETIME_PERSISTENT
The default lifetime for persistent keys.
uint32_t psa_key_usage_t
Encoding of permitted usage on a key.
static void psa_set_key_algorithm(psa_key_attributes_t *attributes, psa_algorithm_t alg)
Declare the permitted algorithm policy for a key.
uint16_t psa_key_type_t
Encoding of a key type.
static psa_key_type_t psa_get_key_type(const psa_key_attributes_t *attributes)
Retrieve the key type from key attributes.
static psa_key_usage_t psa_get_key_usage_flags(const psa_key_attributes_t *attributes)
Retrieve the usage flags from key attributes.
uint32_t psa_key_lifetime_t
Encoding of key lifetimes.
int32_t psa_status_t
Function return status.
Important Information for this Arm website

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies. If you are not happy with the use of these cookies, please review our Cookie Policy to learn how they can be disabled. By disabling cookies, some features of the site will not work.