| Gilles Peskine | 9ef733f | 2018-02-07 21:05:37 +0100 | [diff] [blame] | 1 | /** | 
|  | 2 | * \file psa/crypto_struct.h | 
|  | 3 | * | 
|  | 4 | * \brief PSA cryptography module: Mbed TLS structured type implementations | 
| Gilles Peskine | 07c91f5 | 2018-06-28 18:02:53 +0200 | [diff] [blame] | 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. | 
| Gilles Peskine | b4e73e9 | 2019-08-13 15:00:57 +0200 | [diff] [blame] | 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. | 
| Gilles Peskine | 9ef733f | 2018-02-07 21:05:37 +0100 | [diff] [blame] | 35 | */ | 
|  | 36 | /* | 
| Bence Szépkúti | 1e14827 | 2020-08-07 13:07:28 +0200 | [diff] [blame] | 37 | *  Copyright The Mbed TLS Contributors | 
| Gilles Peskine | 9ef733f | 2018-02-07 21:05:37 +0100 | [diff] [blame] | 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. | 
| Gilles Peskine | 9ef733f | 2018-02-07 21:05:37 +0100 | [diff] [blame] | 51 | */ | 
|  | 52 |  | 
|  | 53 | #ifndef PSA_CRYPTO_STRUCT_H | 
|  | 54 | #define PSA_CRYPTO_STRUCT_H | 
|  | 55 |  | 
| Jaeden Amero | 8013f44 | 2019-08-16 16:13:51 +0100 | [diff] [blame] | 56 | #ifdef __cplusplus | 
|  | 57 | extern "C" { | 
|  | 58 | #endif | 
|  | 59 |  | 
| Gilles Peskine | 9ef733f | 2018-02-07 21:05:37 +0100 | [diff] [blame] | 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) | 
| Jaeden Amero | d58a00d | 2019-06-07 11:49:59 +0100 | [diff] [blame] | 63 | #include "mbedtls/config.h" | 
| Gilles Peskine | 9ef733f | 2018-02-07 21:05:37 +0100 | [diff] [blame] | 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 |  | 
| Steven Cooreman | fb81aa5 | 2020-09-09 12:01:43 +0200 | [diff] [blame] | 80 | typedef struct { | 
|  | 81 | /** Unique ID indicating which driver got assigned to do the | 
|  | 82 | * operation. Since driver contexts are driver-specific, swapping | 
|  | 83 | * drivers halfway through the operation is not supported. | 
|  | 84 | * ID values are auto-generated in psa_driver_wrappers.h */ | 
|  | 85 | unsigned int id; | 
|  | 86 | /** Context structure for the assigned driver, when id is not zero. */ | 
|  | 87 | void* ctx; | 
|  | 88 | } psa_operation_driver_context_t; | 
|  | 89 |  | 
| Gilles Peskine | 9ef733f | 2018-02-07 21:05:37 +0100 | [diff] [blame] | 90 | struct psa_hash_operation_s | 
|  | 91 | { | 
|  | 92 | psa_algorithm_t alg; | 
|  | 93 | union | 
|  | 94 | { | 
| Gilles Peskine | 058e0b9 | 2018-03-22 16:20:19 +0100 | [diff] [blame] | 95 | unsigned dummy; /* Make the union non-empty even with no supported algorithms. */ | 
| Gilles Peskine | 9ef733f | 2018-02-07 21:05:37 +0100 | [diff] [blame] | 96 | #if defined(MBEDTLS_MD2_C) | 
|  | 97 | mbedtls_md2_context md2; | 
|  | 98 | #endif | 
|  | 99 | #if defined(MBEDTLS_MD4_C) | 
|  | 100 | mbedtls_md4_context md4; | 
|  | 101 | #endif | 
|  | 102 | #if defined(MBEDTLS_MD5_C) | 
|  | 103 | mbedtls_md5_context md5; | 
|  | 104 | #endif | 
|  | 105 | #if defined(MBEDTLS_RIPEMD160_C) | 
|  | 106 | mbedtls_ripemd160_context ripemd160; | 
|  | 107 | #endif | 
|  | 108 | #if defined(MBEDTLS_SHA1_C) | 
|  | 109 | mbedtls_sha1_context sha1; | 
|  | 110 | #endif | 
|  | 111 | #if defined(MBEDTLS_SHA256_C) | 
|  | 112 | mbedtls_sha256_context sha256; | 
|  | 113 | #endif | 
|  | 114 | #if defined(MBEDTLS_SHA512_C) | 
|  | 115 | mbedtls_sha512_context sha512; | 
|  | 116 | #endif | 
|  | 117 | } ctx; | 
|  | 118 | }; | 
|  | 119 |  | 
| Jaeden Amero | 6a25b41 | 2019-01-04 11:47:44 +0000 | [diff] [blame] | 120 | #define PSA_HASH_OPERATION_INIT {0, {0}} | 
|  | 121 | static inline struct psa_hash_operation_s psa_hash_operation_init( void ) | 
|  | 122 | { | 
|  | 123 | const struct psa_hash_operation_s v = PSA_HASH_OPERATION_INIT; | 
|  | 124 | return( v ); | 
|  | 125 | } | 
|  | 126 |  | 
| Gilles Peskine | a05219c | 2018-11-16 16:02:56 +0100 | [diff] [blame] | 127 | #if defined(MBEDTLS_MD_C) | 
| Gilles Peskine | 2d27786 | 2018-06-18 15:41:12 +0200 | [diff] [blame] | 128 | typedef struct | 
|  | 129 | { | 
| Nir Sonnenschein | dcd636a | 2018-06-04 16:03:32 +0300 | [diff] [blame] | 130 | /** The hash context. */ | 
|  | 131 | struct psa_hash_operation_s hash_ctx; | 
|  | 132 | /** The HMAC part of the context. */ | 
| Gilles Peskine | b3e6e5d | 2018-06-18 22:16:43 +0200 | [diff] [blame] | 133 | uint8_t opad[PSA_HMAC_MAX_HASH_BLOCK_SIZE]; | 
| Nir Sonnenschein | dcd636a | 2018-06-04 16:03:32 +0300 | [diff] [blame] | 134 | } psa_hmac_internal_data; | 
| Gilles Peskine | a05219c | 2018-11-16 16:02:56 +0100 | [diff] [blame] | 135 | #endif /* MBEDTLS_MD_C */ | 
| Nir Sonnenschein | dcd636a | 2018-06-04 16:03:32 +0300 | [diff] [blame] | 136 |  | 
| Gilles Peskine | 9ef733f | 2018-02-07 21:05:37 +0100 | [diff] [blame] | 137 | struct psa_mac_operation_s | 
|  | 138 | { | 
|  | 139 | psa_algorithm_t alg; | 
| Darryl Green | 80bed23 | 2018-07-26 13:03:38 +0100 | [diff] [blame] | 140 | unsigned int key_set : 1; | 
|  | 141 | unsigned int iv_required : 1; | 
|  | 142 | unsigned int iv_set : 1; | 
|  | 143 | unsigned int has_input : 1; | 
|  | 144 | unsigned int is_sign : 1; | 
| Gilles Peskine | 9ef733f | 2018-02-07 21:05:37 +0100 | [diff] [blame] | 145 | uint8_t mac_size; | 
|  | 146 | union | 
|  | 147 | { | 
| Gilles Peskine | 058e0b9 | 2018-03-22 16:20:19 +0100 | [diff] [blame] | 148 | unsigned dummy; /* Make the union non-empty even with no supported algorithms. */ | 
| Gilles Peskine | 9ef733f | 2018-02-07 21:05:37 +0100 | [diff] [blame] | 149 | #if defined(MBEDTLS_MD_C) | 
| Nir Sonnenschein | dcd636a | 2018-06-04 16:03:32 +0300 | [diff] [blame] | 150 | psa_hmac_internal_data hmac; | 
| Gilles Peskine | 9ef733f | 2018-02-07 21:05:37 +0100 | [diff] [blame] | 151 | #endif | 
|  | 152 | #if defined(MBEDTLS_CMAC_C) | 
|  | 153 | mbedtls_cipher_context_t cmac; | 
|  | 154 | #endif | 
|  | 155 | } ctx; | 
|  | 156 | }; | 
|  | 157 |  | 
| Jaeden Amero | 769ce27 | 2019-01-04 11:48:03 +0000 | [diff] [blame] | 158 | #define PSA_MAC_OPERATION_INIT {0, 0, 0, 0, 0, 0, 0, {0}} | 
|  | 159 | static inline struct psa_mac_operation_s psa_mac_operation_init( void ) | 
|  | 160 | { | 
|  | 161 | const struct psa_mac_operation_s v = PSA_MAC_OPERATION_INIT; | 
|  | 162 | return( v ); | 
|  | 163 | } | 
|  | 164 |  | 
| Gilles Peskine | 428dc5a | 2018-03-03 21:27:18 +0100 | [diff] [blame] | 165 | struct psa_cipher_operation_s | 
|  | 166 | { | 
|  | 167 | psa_algorithm_t alg; | 
| Darryl Green | 80bed23 | 2018-07-26 13:03:38 +0100 | [diff] [blame] | 168 | unsigned int key_set : 1; | 
|  | 169 | unsigned int iv_required : 1; | 
|  | 170 | unsigned int iv_set : 1; | 
| Steven Cooreman | ef8575e | 2020-09-11 11:44:50 +0200 | [diff] [blame] | 171 | unsigned int mbedtls_in_use : 1; /* Indicates mbed TLS is handling the operation. */ | 
| Gilles Peskine | 428dc5a | 2018-03-03 21:27:18 +0100 | [diff] [blame] | 172 | uint8_t iv_size; | 
|  | 173 | uint8_t block_size; | 
|  | 174 | union | 
|  | 175 | { | 
| Jaeden Amero | 5a5dc77 | 2019-01-04 15:33:37 +0000 | [diff] [blame] | 176 | unsigned dummy; /* Enable easier initializing of the union. */ | 
| mohammad1603 | 503973b | 2018-03-12 15:59:30 +0200 | [diff] [blame] | 177 | mbedtls_cipher_context_t cipher; | 
| Steven Cooreman | fb81aa5 | 2020-09-09 12:01:43 +0200 | [diff] [blame] | 178 | psa_operation_driver_context_t driver; | 
| Gilles Peskine | 428dc5a | 2018-03-03 21:27:18 +0100 | [diff] [blame] | 179 | } ctx; | 
|  | 180 | }; | 
|  | 181 |  | 
| Steven Cooreman | d3feccd | 2020-09-01 15:56:14 +0200 | [diff] [blame] | 182 | #define PSA_CIPHER_OPERATION_INIT {0, 0, 0, 0, 0, 0, 0, {0}} | 
| Jaeden Amero | 5bae227 | 2019-01-04 11:48:27 +0000 | [diff] [blame] | 183 | static inline struct psa_cipher_operation_s psa_cipher_operation_init( void ) | 
|  | 184 | { | 
|  | 185 | const struct psa_cipher_operation_s v = PSA_CIPHER_OPERATION_INIT; | 
|  | 186 | return( v ); | 
|  | 187 | } | 
|  | 188 |  | 
| Gilles Peskine | 30a9e41 | 2019-01-14 18:36:12 +0100 | [diff] [blame] | 189 | struct psa_aead_operation_s | 
|  | 190 | { | 
|  | 191 | psa_algorithm_t alg; | 
|  | 192 | unsigned int key_set : 1; | 
|  | 193 | unsigned int iv_set : 1; | 
|  | 194 | uint8_t iv_size; | 
|  | 195 | uint8_t block_size; | 
|  | 196 | union | 
|  | 197 | { | 
|  | 198 | unsigned dummy; /* Enable easier initializing of the union. */ | 
|  | 199 | mbedtls_cipher_context_t cipher; | 
|  | 200 | } ctx; | 
|  | 201 | }; | 
|  | 202 |  | 
|  | 203 | #define PSA_AEAD_OPERATION_INIT {0, 0, 0, 0, 0, {0}} | 
|  | 204 | static inline struct psa_aead_operation_s psa_aead_operation_init( void ) | 
|  | 205 | { | 
|  | 206 | const struct psa_aead_operation_s v = PSA_AEAD_OPERATION_INIT; | 
|  | 207 | return( v ); | 
|  | 208 | } | 
|  | 209 |  | 
| Gilles Peskine | a05219c | 2018-11-16 16:02:56 +0100 | [diff] [blame] | 210 | #if defined(MBEDTLS_MD_C) | 
| Gilles Peskine | bef7f14 | 2018-07-12 17:22:21 +0200 | [diff] [blame] | 211 | typedef struct | 
|  | 212 | { | 
|  | 213 | uint8_t *info; | 
|  | 214 | size_t info_length; | 
|  | 215 | psa_hmac_internal_data hmac; | 
|  | 216 | uint8_t prk[PSA_HASH_MAX_SIZE]; | 
|  | 217 | uint8_t output_block[PSA_HASH_MAX_SIZE]; | 
|  | 218 | #if PSA_HASH_MAX_SIZE > 0xff | 
|  | 219 | #error "PSA_HASH_MAX_SIZE does not fit in uint8_t" | 
|  | 220 | #endif | 
|  | 221 | uint8_t offset_in_block; | 
|  | 222 | uint8_t block_number; | 
| Gilles Peskine | 22c5151 | 2019-04-12 15:07:32 +0200 | [diff] [blame] | 223 | unsigned int state : 2; | 
|  | 224 | unsigned int info_set : 1; | 
| Gilles Peskine | cbe6650 | 2019-05-16 16:59:18 +0200 | [diff] [blame] | 225 | } psa_hkdf_key_derivation_t; | 
| Gilles Peskine | a05219c | 2018-11-16 16:02:56 +0100 | [diff] [blame] | 226 | #endif /* MBEDTLS_MD_C */ | 
| Gilles Peskine | bef7f14 | 2018-07-12 17:22:21 +0200 | [diff] [blame] | 227 |  | 
| Gilles Peskine | a05219c | 2018-11-16 16:02:56 +0100 | [diff] [blame] | 228 | #if defined(MBEDTLS_MD_C) | 
| Janos Follath | 999f648 | 2019-06-11 12:04:10 +0100 | [diff] [blame] | 229 | typedef enum | 
|  | 230 | { | 
|  | 231 | TLS12_PRF_STATE_INIT,       /* no input provided */ | 
|  | 232 | TLS12_PRF_STATE_SEED_SET,   /* seed has been set */ | 
|  | 233 | TLS12_PRF_STATE_KEY_SET,    /* key has been set */ | 
|  | 234 | TLS12_PRF_STATE_LABEL_SET,  /* label has been set */ | 
|  | 235 | TLS12_PRF_STATE_OUTPUT      /* output has been started */ | 
|  | 236 | } psa_tls12_prf_key_derivation_state_t; | 
|  | 237 |  | 
|  | 238 | typedef struct psa_tls12_prf_key_derivation_s | 
|  | 239 | { | 
|  | 240 | #if PSA_HASH_MAX_SIZE > 0xff | 
|  | 241 | #error "PSA_HASH_MAX_SIZE does not fit in uint8_t" | 
|  | 242 | #endif | 
|  | 243 |  | 
|  | 244 | /* Indicates how many bytes in the current HMAC block have | 
| Janos Follath | 844eb0e | 2019-06-19 12:10:49 +0100 | [diff] [blame] | 245 | * not yet been read by the user. */ | 
|  | 246 | uint8_t left_in_block; | 
| Janos Follath | 999f648 | 2019-06-11 12:04:10 +0100 | [diff] [blame] | 247 |  | 
|  | 248 | /* The 1-based number of the block. */ | 
|  | 249 | uint8_t block_number; | 
|  | 250 |  | 
|  | 251 | psa_tls12_prf_key_derivation_state_t state; | 
|  | 252 |  | 
|  | 253 | uint8_t *seed; | 
|  | 254 | size_t seed_length; | 
|  | 255 | uint8_t *label; | 
|  | 256 | size_t label_length; | 
|  | 257 | psa_hmac_internal_data hmac; | 
|  | 258 | uint8_t Ai[PSA_HASH_MAX_SIZE]; | 
|  | 259 |  | 
|  | 260 | /* `HMAC_hash( prk, A(i) + seed )` in the notation of RFC 5246, Sect. 5. */ | 
|  | 261 | uint8_t output_block[PSA_HASH_MAX_SIZE]; | 
|  | 262 | } psa_tls12_prf_key_derivation_t; | 
| Gilles Peskine | a05219c | 2018-11-16 16:02:56 +0100 | [diff] [blame] | 263 | #endif /* MBEDTLS_MD_C */ | 
| Hanno Becker | c8a41d7 | 2018-10-09 17:33:01 +0100 | [diff] [blame] | 264 |  | 
| Gilles Peskine | cbe6650 | 2019-05-16 16:59:18 +0200 | [diff] [blame] | 265 | struct psa_key_derivation_s | 
| Gilles Peskine | eab56e4 | 2018-07-12 17:12:33 +0200 | [diff] [blame] | 266 | { | 
|  | 267 | psa_algorithm_t alg; | 
| Gilles Peskine | 178c9aa | 2019-09-24 18:21:06 +0200 | [diff] [blame] | 268 | unsigned int can_output_key : 1; | 
| Gilles Peskine | eab56e4 | 2018-07-12 17:12:33 +0200 | [diff] [blame] | 269 | size_t capacity; | 
|  | 270 | union | 
|  | 271 | { | 
| Janos Follath | adbec81 | 2019-06-14 11:05:39 +0100 | [diff] [blame] | 272 | /* Make the union non-empty even with no supported algorithms. */ | 
|  | 273 | uint8_t dummy; | 
| Gilles Peskine | bef7f14 | 2018-07-12 17:22:21 +0200 | [diff] [blame] | 274 | #if defined(MBEDTLS_MD_C) | 
| Gilles Peskine | cbe6650 | 2019-05-16 16:59:18 +0200 | [diff] [blame] | 275 | psa_hkdf_key_derivation_t hkdf; | 
|  | 276 | psa_tls12_prf_key_derivation_t tls12_prf; | 
| Gilles Peskine | bef7f14 | 2018-07-12 17:22:21 +0200 | [diff] [blame] | 277 | #endif | 
| Gilles Peskine | eab56e4 | 2018-07-12 17:12:33 +0200 | [diff] [blame] | 278 | } ctx; | 
|  | 279 | }; | 
|  | 280 |  | 
| Janos Follath | adbec81 | 2019-06-14 11:05:39 +0100 | [diff] [blame] | 281 | /* This only zeroes out the first byte in the union, the rest is unspecified. */ | 
| Gilles Peskine | 178c9aa | 2019-09-24 18:21:06 +0200 | [diff] [blame] | 282 | #define PSA_KEY_DERIVATION_OPERATION_INIT {0, 0, 0, {0}} | 
| Gilles Peskine | cbe6650 | 2019-05-16 16:59:18 +0200 | [diff] [blame] | 283 | static inline struct psa_key_derivation_s psa_key_derivation_operation_init( void ) | 
| Gilles Peskine | eab56e4 | 2018-07-12 17:12:33 +0200 | [diff] [blame] | 284 | { | 
| Gilles Peskine | cbe6650 | 2019-05-16 16:59:18 +0200 | [diff] [blame] | 285 | const struct psa_key_derivation_s v = PSA_KEY_DERIVATION_OPERATION_INIT; | 
| Gilles Peskine | eab56e4 | 2018-07-12 17:12:33 +0200 | [diff] [blame] | 286 | return( v ); | 
|  | 287 | } | 
|  | 288 |  | 
| Gilles Peskine | 7698bcf | 2018-03-03 21:30:44 +0100 | [diff] [blame] | 289 | struct psa_key_policy_s | 
|  | 290 | { | 
|  | 291 | psa_key_usage_t usage; | 
|  | 292 | psa_algorithm_t alg; | 
| Gilles Peskine | 96f0b3b | 2019-05-10 19:33:38 +0200 | [diff] [blame] | 293 | psa_algorithm_t alg2; | 
| Gilles Peskine | 7698bcf | 2018-03-03 21:30:44 +0100 | [diff] [blame] | 294 | }; | 
| Gilles Peskine | a3dd737 | 2019-04-19 19:42:26 +0200 | [diff] [blame] | 295 | typedef struct psa_key_policy_s psa_key_policy_t; | 
| Gilles Peskine | 7698bcf | 2018-03-03 21:30:44 +0100 | [diff] [blame] | 296 |  | 
| Gilles Peskine | 96f0b3b | 2019-05-10 19:33:38 +0200 | [diff] [blame] | 297 | #define PSA_KEY_POLICY_INIT {0, 0, 0} | 
| Jaeden Amero | 70261c5 | 2019-01-04 11:47:20 +0000 | [diff] [blame] | 298 | static inline struct psa_key_policy_s psa_key_policy_init( void ) | 
|  | 299 | { | 
|  | 300 | const struct psa_key_policy_s v = PSA_KEY_POLICY_INIT; | 
|  | 301 | return( v ); | 
|  | 302 | } | 
|  | 303 |  | 
| Gilles Peskine | 68cc433b | 2019-07-30 17:42:47 +0200 | [diff] [blame] | 304 | /* The type used internally for key sizes. | 
|  | 305 | * Public interfaces use size_t, but internally we use a smaller type. */ | 
|  | 306 | typedef uint16_t psa_key_bits_t; | 
|  | 307 | /* The maximum value of the type used to represent bit-sizes. | 
|  | 308 | * This is used to mark an invalid key size. */ | 
|  | 309 | #define PSA_KEY_BITS_TOO_LARGE ( (psa_key_bits_t) ( -1 ) ) | 
| Gilles Peskine | c744d99 | 2019-07-30 17:26:54 +0200 | [diff] [blame] | 310 | /* The maximum size of a key in bits. | 
| Gilles Peskine | 68cc433b | 2019-07-30 17:42:47 +0200 | [diff] [blame] | 311 | * Currently defined as the maximum that can be represented, rounded down | 
|  | 312 | * to a whole number of bytes. | 
|  | 313 | * This is an uncast value so that it can be used in preprocessor | 
|  | 314 | * conditionals. */ | 
| Gilles Peskine | c744d99 | 2019-07-30 17:26:54 +0200 | [diff] [blame] | 315 | #define PSA_MAX_KEY_BITS 0xfff8 | 
|  | 316 |  | 
| Gilles Peskine | 91e8c33 | 2019-08-02 19:19:39 +0200 | [diff] [blame] | 317 | /** A mask of flags that can be stored in key attributes. | 
|  | 318 | * | 
|  | 319 | * This type is also used internally to store flags in slots. Internal | 
|  | 320 | * flags are defined in library/psa_crypto_core.h. Internal flags may have | 
|  | 321 | * the same value as external flags if they are properly handled during | 
|  | 322 | * key creation and in psa_get_key_attributes. | 
|  | 323 | */ | 
|  | 324 | typedef uint16_t psa_key_attributes_flag_t; | 
|  | 325 |  | 
| Gilles Peskine | c8000c0 | 2019-08-02 20:15:51 +0200 | [diff] [blame] | 326 | #define MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER     \ | 
|  | 327 | ( (psa_key_attributes_flag_t) 0x0001 ) | 
| Gilles Peskine | 91e8c33 | 2019-08-02 19:19:39 +0200 | [diff] [blame] | 328 |  | 
|  | 329 | /* A mask of key attribute flags used externally only. | 
|  | 330 | * Only meant for internal checks inside the library. */ | 
|  | 331 | #define MBEDTLS_PSA_KA_MASK_EXTERNAL_ONLY (      \ | 
| Gilles Peskine | c8000c0 | 2019-08-02 20:15:51 +0200 | [diff] [blame] | 332 | MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER |    \ | 
| Gilles Peskine | 91e8c33 | 2019-08-02 19:19:39 +0200 | [diff] [blame] | 333 | 0 ) | 
|  | 334 |  | 
|  | 335 | /* A mask of key attribute flags used both internally and externally. | 
|  | 336 | * Currently there aren't any. */ | 
|  | 337 | #define MBEDTLS_PSA_KA_MASK_DUAL_USE (          \ | 
|  | 338 | 0 ) | 
|  | 339 |  | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 340 | typedef struct | 
|  | 341 | { | 
|  | 342 | psa_key_type_t type; | 
| Gilles Peskine | f65ed6f | 2019-12-04 17:18:41 +0100 | [diff] [blame] | 343 | psa_key_bits_t bits; | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 344 | psa_key_lifetime_t lifetime; | 
| Ronald Cron | 71016a9 | 2020-08-28 19:01:50 +0200 | [diff] [blame] | 345 | mbedtls_svc_key_id_t id; | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 346 | psa_key_policy_t policy; | 
| Gilles Peskine | 91e8c33 | 2019-08-02 19:19:39 +0200 | [diff] [blame] | 347 | psa_key_attributes_flag_t flags; | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 348 | } psa_core_key_attributes_t; | 
|  | 349 |  | 
| Ronald Cron | 71016a9 | 2020-08-28 19:01:50 +0200 | [diff] [blame] | 350 | #define PSA_CORE_KEY_ATTRIBUTES_INIT {PSA_KEY_TYPE_NONE, 0, PSA_KEY_LIFETIME_VOLATILE, MBEDTLS_SVC_KEY_ID_INIT, PSA_KEY_POLICY_INIT, 0} | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 351 |  | 
| Gilles Peskine | 4747d19 | 2019-04-17 15:05:45 +0200 | [diff] [blame] | 352 | struct psa_key_attributes_s | 
|  | 353 | { | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 354 | psa_core_key_attributes_t core; | 
| Gilles Peskine | c8000c0 | 2019-08-02 20:15:51 +0200 | [diff] [blame] | 355 | #if defined(MBEDTLS_PSA_CRYPTO_SE_C) | 
|  | 356 | psa_key_slot_number_t slot_number; | 
|  | 357 | #endif /* MBEDTLS_PSA_CRYPTO_SE_C */ | 
| Gilles Peskine | b699f07 | 2019-04-26 16:06:02 +0200 | [diff] [blame] | 358 | void *domain_parameters; | 
|  | 359 | size_t domain_parameters_size; | 
| Gilles Peskine | 4747d19 | 2019-04-17 15:05:45 +0200 | [diff] [blame] | 360 | }; | 
|  | 361 |  | 
| Gilles Peskine | c8000c0 | 2019-08-02 20:15:51 +0200 | [diff] [blame] | 362 | #if defined(MBEDTLS_PSA_CRYPTO_SE_C) | 
|  | 363 | #define PSA_KEY_ATTRIBUTES_INIT {PSA_CORE_KEY_ATTRIBUTES_INIT, 0, NULL, 0} | 
|  | 364 | #else | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 365 | #define PSA_KEY_ATTRIBUTES_INIT {PSA_CORE_KEY_ATTRIBUTES_INIT, NULL, 0} | 
| Gilles Peskine | c8000c0 | 2019-08-02 20:15:51 +0200 | [diff] [blame] | 366 | #endif | 
|  | 367 |  | 
| Gilles Peskine | 4747d19 | 2019-04-17 15:05:45 +0200 | [diff] [blame] | 368 | static inline struct psa_key_attributes_s psa_key_attributes_init( void ) | 
|  | 369 | { | 
|  | 370 | const struct psa_key_attributes_s v = PSA_KEY_ATTRIBUTES_INIT; | 
|  | 371 | return( v ); | 
|  | 372 | } | 
|  | 373 |  | 
| Ronald Cron | 71016a9 | 2020-08-28 19:01:50 +0200 | [diff] [blame] | 374 | static inline void psa_set_key_id( psa_key_attributes_t *attributes, | 
|  | 375 | mbedtls_svc_key_id_t key ) | 
| Gilles Peskine | dc8219a | 2019-05-15 16:11:15 +0200 | [diff] [blame] | 376 | { | 
| Ronald Cron | 27238fc | 2020-07-23 12:30:41 +0200 | [diff] [blame] | 377 | attributes->core.id = key; | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 378 | if( attributes->core.lifetime == PSA_KEY_LIFETIME_VOLATILE ) | 
|  | 379 | attributes->core.lifetime = PSA_KEY_LIFETIME_PERSISTENT; | 
| Gilles Peskine | dc8219a | 2019-05-15 16:11:15 +0200 | [diff] [blame] | 380 | } | 
|  | 381 |  | 
| Ronald Cron | 71016a9 | 2020-08-28 19:01:50 +0200 | [diff] [blame] | 382 | static inline mbedtls_svc_key_id_t psa_get_key_id( | 
| Gilles Peskine | db4b3ab | 2019-04-18 12:53:01 +0200 | [diff] [blame] | 383 | const psa_key_attributes_t *attributes) | 
|  | 384 | { | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 385 | return( attributes->core.id ); | 
| Gilles Peskine | db4b3ab | 2019-04-18 12:53:01 +0200 | [diff] [blame] | 386 | } | 
|  | 387 |  | 
| Gilles Peskine | dc8219a | 2019-05-15 16:11:15 +0200 | [diff] [blame] | 388 | static inline void psa_set_key_lifetime(psa_key_attributes_t *attributes, | 
|  | 389 | psa_key_lifetime_t lifetime) | 
|  | 390 | { | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 391 | attributes->core.lifetime = lifetime; | 
| Gilles Peskine | dc8219a | 2019-05-15 16:11:15 +0200 | [diff] [blame] | 392 | if( lifetime == PSA_KEY_LIFETIME_VOLATILE ) | 
| Jaeden Amero | e3cdf28 | 2019-08-20 12:58:20 +0100 | [diff] [blame] | 393 | { | 
| Ronald Cron | 71016a9 | 2020-08-28 19:01:50 +0200 | [diff] [blame] | 394 | #ifdef MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER | 
| Jaeden Amero | e3cdf28 | 2019-08-20 12:58:20 +0100 | [diff] [blame] | 395 | attributes->core.id.key_id = 0; | 
| Jaeden Amero | e3cdf28 | 2019-08-20 12:58:20 +0100 | [diff] [blame] | 396 | #else | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 397 | attributes->core.id = 0; | 
| Jaeden Amero | e3cdf28 | 2019-08-20 12:58:20 +0100 | [diff] [blame] | 398 | #endif | 
|  | 399 | } | 
| Gilles Peskine | dc8219a | 2019-05-15 16:11:15 +0200 | [diff] [blame] | 400 | } | 
|  | 401 |  | 
| Gilles Peskine | db4b3ab | 2019-04-18 12:53:01 +0200 | [diff] [blame] | 402 | static inline psa_key_lifetime_t psa_get_key_lifetime( | 
|  | 403 | const psa_key_attributes_t *attributes) | 
|  | 404 | { | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 405 | return( attributes->core.lifetime ); | 
| Gilles Peskine | db4b3ab | 2019-04-18 12:53:01 +0200 | [diff] [blame] | 406 | } | 
|  | 407 |  | 
| Gilles Peskine | 4747d19 | 2019-04-17 15:05:45 +0200 | [diff] [blame] | 408 | static inline void psa_set_key_usage_flags(psa_key_attributes_t *attributes, | 
|  | 409 | psa_key_usage_t usage_flags) | 
|  | 410 | { | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 411 | attributes->core.policy.usage = usage_flags; | 
| Gilles Peskine | 4747d19 | 2019-04-17 15:05:45 +0200 | [diff] [blame] | 412 | } | 
|  | 413 |  | 
|  | 414 | static inline psa_key_usage_t psa_get_key_usage_flags( | 
|  | 415 | const psa_key_attributes_t *attributes) | 
|  | 416 | { | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 417 | return( attributes->core.policy.usage ); | 
| Gilles Peskine | 4747d19 | 2019-04-17 15:05:45 +0200 | [diff] [blame] | 418 | } | 
|  | 419 |  | 
|  | 420 | static inline void psa_set_key_algorithm(psa_key_attributes_t *attributes, | 
|  | 421 | psa_algorithm_t alg) | 
|  | 422 | { | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 423 | attributes->core.policy.alg = alg; | 
| Gilles Peskine | 4747d19 | 2019-04-17 15:05:45 +0200 | [diff] [blame] | 424 | } | 
|  | 425 |  | 
|  | 426 | static inline psa_algorithm_t psa_get_key_algorithm( | 
|  | 427 | const psa_key_attributes_t *attributes) | 
|  | 428 | { | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 429 | return( attributes->core.policy.alg ); | 
| Gilles Peskine | 4747d19 | 2019-04-17 15:05:45 +0200 | [diff] [blame] | 430 | } | 
|  | 431 |  | 
| Gilles Peskine | 24f10f8 | 2019-05-16 12:18:32 +0200 | [diff] [blame] | 432 | /* This function is declared in crypto_extra.h, which comes after this | 
|  | 433 | * header file, but we need the function here, so repeat the declaration. */ | 
|  | 434 | psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes, | 
|  | 435 | psa_key_type_t type, | 
|  | 436 | const uint8_t *data, | 
|  | 437 | size_t data_length); | 
|  | 438 |  | 
| Gilles Peskine | 4747d19 | 2019-04-17 15:05:45 +0200 | [diff] [blame] | 439 | static inline void psa_set_key_type(psa_key_attributes_t *attributes, | 
|  | 440 | psa_key_type_t type) | 
|  | 441 | { | 
| Gilles Peskine | b699f07 | 2019-04-26 16:06:02 +0200 | [diff] [blame] | 442 | if( attributes->domain_parameters == NULL ) | 
|  | 443 | { | 
|  | 444 | /* Common case: quick path */ | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 445 | attributes->core.type = type; | 
| Gilles Peskine | b699f07 | 2019-04-26 16:06:02 +0200 | [diff] [blame] | 446 | } | 
|  | 447 | else | 
|  | 448 | { | 
|  | 449 | /* Call the bigger function to free the old domain paramteres. | 
|  | 450 | * Ignore any errors which may arise due to type requiring | 
|  | 451 | * non-default domain parameters, since this function can't | 
|  | 452 | * report errors. */ | 
|  | 453 | (void) psa_set_key_domain_parameters( attributes, type, NULL, 0 ); | 
|  | 454 | } | 
| Gilles Peskine | 4747d19 | 2019-04-17 15:05:45 +0200 | [diff] [blame] | 455 | } | 
|  | 456 |  | 
|  | 457 | static inline psa_key_type_t psa_get_key_type( | 
|  | 458 | const psa_key_attributes_t *attributes) | 
|  | 459 | { | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 460 | return( attributes->core.type ); | 
| Gilles Peskine | 4747d19 | 2019-04-17 15:05:45 +0200 | [diff] [blame] | 461 | } | 
|  | 462 |  | 
| Gilles Peskine | 3a4f1f8 | 2019-04-26 13:49:28 +0200 | [diff] [blame] | 463 | static inline void psa_set_key_bits(psa_key_attributes_t *attributes, | 
|  | 464 | size_t bits) | 
|  | 465 | { | 
| Gilles Peskine | 68cc433b | 2019-07-30 17:42:47 +0200 | [diff] [blame] | 466 | if( bits > PSA_MAX_KEY_BITS ) | 
|  | 467 | attributes->core.bits = PSA_KEY_BITS_TOO_LARGE; | 
|  | 468 | else | 
|  | 469 | attributes->core.bits = (psa_key_bits_t) bits; | 
| Gilles Peskine | 3a4f1f8 | 2019-04-26 13:49:28 +0200 | [diff] [blame] | 470 | } | 
|  | 471 |  | 
| Gilles Peskine | db4b3ab | 2019-04-18 12:53:01 +0200 | [diff] [blame] | 472 | static inline size_t psa_get_key_bits( | 
|  | 473 | const psa_key_attributes_t *attributes) | 
|  | 474 | { | 
| Gilles Peskine | 7e0cff9 | 2019-07-30 13:48:52 +0200 | [diff] [blame] | 475 | return( attributes->core.bits ); | 
| Gilles Peskine | db4b3ab | 2019-04-18 12:53:01 +0200 | [diff] [blame] | 476 | } | 
|  | 477 |  | 
| Jaeden Amero | 8013f44 | 2019-08-16 16:13:51 +0100 | [diff] [blame] | 478 | #ifdef __cplusplus | 
|  | 479 | } | 
|  | 480 | #endif | 
|  | 481 |  | 
| Gilles Peskine | 9ef733f | 2018-02-07 21:05:37 +0100 | [diff] [blame] | 482 | #endif /* PSA_CRYPTO_STRUCT_H */ |