mbed TLS v2.24.0
crypto_struct.h
Go to the documentation of this file.
1 
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 {
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 {
114  return( v );
115 }
116 
117 #if defined(MBEDTLS_MD_C)
118 typedef struct
119 {
121  struct psa_hash_operation_s hash_ctx;
125 #endif /* MBEDTLS_MD_C */
126 
128 {
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)
141 #endif
142 #if defined(MBEDTLS_CMAC_C)
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 {
152  return( v );
153 }
154 
156 {
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. */
167  } ctx;
168 };
169 
170 #define PSA_CIPHER_OPERATION_INIT {0, 0, 0, 0, 0, 0, {0}}
172 {
174  return( v );
175 }
176 
178 {
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. */
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 {
195  return( v );
196 }
197 
198 #if defined(MBEDTLS_MD_C)
199 typedef struct
200 {
201  uint8_t *info;
202  size_t info_length;
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
210  uint8_t block_number;
211  unsigned int state : 2;
212  unsigned int info_set : 1;
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 */
225 
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 
240 
241  uint8_t *seed;
242  size_t seed_length;
243  uint8_t *label;
244  size_t label_length;
247 
248  /* `HMAC_hash( prk, A(i) + seed )` in the notation of RFC 5246, Sect. 5. */
251 #endif /* MBEDTLS_MD_C */
252 
254 {
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)
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}}
272 {
274  return( v );
275 }
276 
278 {
282 };
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 
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 {
331  psa_key_bits_t bits;
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)
345 #endif /* MBEDTLS_PSA_CRYPTO_SE_C */
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 {
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 )
368 }
369 
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 
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 */
unsigned int is_sign
unsigned int key_set
psa_key_lifetime_t lifetime
psa_tls12_prf_key_derivation_t tls12_prf
uint8_t Ai[PSA_HASH_MAX_SIZE]
mbedtls_cipher_context_t cipher
union psa_key_derivation_s::@4 ctx
mbedtls_sha1_context sha1
Definition: crypto_struct.h:99
static void psa_set_key_usage_flags(psa_key_attributes_t *attributes, psa_key_usage_t usage_flags)
#define PSA_MAX_KEY_BITS
union psa_cipher_operation_s::@2 ctx
static psa_key_lifetime_t psa_get_key_lifetime(const psa_key_attributes_t *attributes)
psa_algorithm_t alg
#define PSA_MAC_OPERATION_INIT
static struct psa_aead_operation_s psa_aead_operation_init(void)
mbedtls_sha256_context sha256
#define PSA_HMAC_MAX_HASH_BLOCK_SIZE
Definition: crypto_sizes.h:103
psa_key_usage_t usage
uint16_t psa_key_bits_t
psa_algorithm_t alg2
psa_tls12_prf_key_derivation_state_t
psa_key_attributes_flag_t flags
psa_algorithm_t alg
#define PSA_KEY_LIFETIME_VOLATILE
mbedtls_md4_context md4
Definition: crypto_struct.h:90
Configuration options (set of defines)
psa_core_key_attributes_t core
unsigned int iv_required
#define PSA_CIPHER_OPERATION_INIT
union psa_hash_operation_s::@0 ctx
This file contains CMAC definitions and functions.
#define PSA_KEY_ATTRIBUTES_INIT
mbedtls_ripemd160_context ripemd160
Definition: crypto_struct.h:96
RIPE MD-160 message digest.
static psa_key_id_t psa_get_key_id(const psa_key_attributes_t *attributes)
psa_key_owner_id_t owner
mbedtls_md5_context md5
Definition: crypto_struct.h:93
union psa_aead_operation_s::@3 ctx
static struct psa_key_derivation_s psa_key_derivation_operation_init(void)
psa_key_slot_number_t slot_number
psa_algorithm_t alg
psa_algorithm_t alg
uint64_t psa_key_slot_number_t
uint16_t psa_key_attributes_flag_t
mbedtls_md2_context md2
Definition: crypto_struct.h:87
#define PSA_HASH_MAX_SIZE
Definition: crypto_sizes.h:102
psa_tls12_prf_key_derivation_state_t state
uint32_t psa_algorithm_t
Encoding of a cryptographic algorithm.
Definition: crypto_types.h:96
mbedtls_sha512_context sha512
psa_algorithm_t alg
unsigned int iv_set
#define PSA_KEY_LIFETIME_PERSISTENT
psa_hmac_internal_data hmac
uint32_t psa_key_usage_t
Encoding of permitted usage on a key.
Definition: crypto_types.h:246
This file contains an abstraction interface for use with the cipher primitives provided by the librar...
mbedtls_cipher_context_t cipher
uint16_t psa_key_type_t
Encoding of a key type.
Definition: crypto_types.h:64
#define PSA_KEY_POLICY_INIT
#define PSA_KEY_DERIVATION_OPERATION_INIT
psa_hkdf_key_derivation_t hkdf
static psa_algorithm_t psa_get_key_algorithm(const psa_key_attributes_t *attributes)
#define PSA_AEAD_OPERATION_INIT
unsigned int key_set
#define PSA_KEY_BITS_TOO_LARGE
static psa_key_usage_t psa_get_key_usage_flags(const psa_key_attributes_t *attributes)
This file contains the generic message-digest wrapper.
#define PSA_HASH_OPERATION_INIT
static struct psa_mac_operation_s psa_mac_operation_init(void)
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)
mbedtls_cipher_context_t cmac
This file contains SHA-1 definitions and functions.
psa_key_policy_t policy
This file contains GCM definitions and functions.
unsigned int can_output_key
static struct psa_key_attributes_s psa_key_attributes_init(void)
This file contains SHA-384 and SHA-512 definitions and functions.
uint8_t output_block[PSA_HASH_MAX_SIZE]
struct psa_tls12_prf_key_derivation_s psa_tls12_prf_key_derivation_t
static size_t psa_get_key_bits(const psa_key_attributes_t *attributes)
psa_hmac_internal_data hmac
static struct psa_cipher_operation_s psa_cipher_operation_init(void)
static void psa_set_key_bits(psa_key_attributes_t *attributes, size_t bits)
static void psa_set_key_lifetime(psa_key_attributes_t *attributes, psa_key_lifetime_t lifetime)
uint32_t psa_key_lifetime_t
Definition: crypto_types.h:139
psa_hmac_internal_data hmac
MD4 message digest algorithm (hash function)
psa_algorithm_t alg
Definition: crypto_struct.h:82
union psa_mac_operation_s::@1 ctx
unsigned int has_input
int32_t psa_status_t
Function return status.
Definition: crypto_types.h:53
static void psa_set_key_algorithm(psa_key_attributes_t *attributes, psa_algorithm_t alg)
MD5 message digest algorithm (hash function)
This file contains SHA-224 and SHA-256 definitions and functions.
unsigned int iv_required
static void psa_set_key_id(psa_key_attributes_t *attributes, psa_key_id_t id)
static psa_key_type_t psa_get_key_type(const psa_key_attributes_t *attributes)
static void psa_set_key_type(psa_key_attributes_t *attributes, psa_key_type_t type)
MD2 message digest algorithm (hash function)
static struct psa_key_policy_s psa_key_policy_init(void)
static struct psa_hash_operation_s psa_hash_operation_init(void)