| 1 | /* |
| 2 | * Functions to delegate cryptographic operations to an available |
| 3 | * and appropriate accelerator. |
| 4 | * Warning: This file is now auto-generated. |
| 5 | */ |
| 6 | /* Copyright The Mbed TLS Contributors |
| 7 | * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later |
| 8 | */ |
| 9 | |
| 10 | |
| 11 | /* BEGIN-common headers */ |
| 12 | #include "common.h" |
| 13 | #include "psa_crypto_aead.h" |
| 14 | #include "psa_crypto_cipher.h" |
| 15 | #include "psa_crypto_core.h" |
| 16 | #include "psa_crypto_driver_wrappers_no_static.h" |
| 17 | #include "psa_crypto_hash.h" |
| 18 | #include "psa_crypto_mac.h" |
| 19 | #include "psa_crypto_pake.h" |
| 20 | #include "psa_crypto_rsa.h" |
| 21 | |
| 22 | #include "mbedtls/platform.h" |
| 23 | /* END-common headers */ |
| 24 | |
| 25 | #if defined(MBEDTLS_PSA_CRYPTO_C) |
| 26 | |
| 27 | /* BEGIN-driver headers */ |
| 28 | /* Headers for mbedtls_test opaque driver */ |
| 29 | #if defined(PSA_CRYPTO_DRIVER_TEST) |
| 30 | #include "test/drivers/test_driver.h" |
| 31 | |
| 32 | #endif |
| 33 | /* Headers for mbedtls_test transparent driver */ |
| 34 | #if defined(PSA_CRYPTO_DRIVER_TEST) |
| 35 | #include "test/drivers/test_driver.h" |
| 36 | |
| 37 | #endif |
| 38 | /* Headers for p256 transparent driver */ |
| 39 | #if defined(MBEDTLS_PSA_P256M_DRIVER_ENABLED) |
| 40 | #include "../3rdparty/p256-m/p256-m_driver_entrypoints.h" |
| 41 | |
| 42 | #endif |
| 43 | |
| 44 | /* END-driver headers */ |
| 45 | |
| 46 | /* Auto-generated values depending on which drivers are registered. |
| 47 | * ID 0 is reserved for unallocated operations. |
| 48 | * ID 1 is reserved for the Mbed TLS software driver. */ |
| 49 | /* BEGIN-driver id definition */ |
| 50 | #define PSA_CRYPTO_MBED_TLS_DRIVER_ID (1) |
| 51 | #define MBEDTLS_TEST_OPAQUE_DRIVER_ID (2) |
| 52 | #define MBEDTLS_TEST_TRANSPARENT_DRIVER_ID (3) |
| 53 | #define P256_TRANSPARENT_DRIVER_ID (4) |
| 54 | |
| 55 | /* END-driver id */ |
| 56 | |
| 57 | /* BEGIN-Common Macro definitions */ |
| 58 | |
| 59 | /* END-Common Macro definitions */ |
| 60 | |
| 61 | /* Support the 'old' SE interface when asked to */ |
| 62 | #if defined(MBEDTLS_PSA_CRYPTO_SE_C) |
| 63 | /* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style |
| 64 | * SE driver is present, to avoid unused argument errors at compile time. */ |
| 65 | #ifndef PSA_CRYPTO_DRIVER_PRESENT |
| 66 | #define PSA_CRYPTO_DRIVER_PRESENT |
| 67 | #endif |
| 68 | #include "psa_crypto_se.h" |
| 69 | #endif |
| 70 | |
| 71 | /** Get the key buffer size required to store the key material of a key |
| 72 | * associated with an opaque driver. |
| 73 | * |
| 74 | * \param[in] attributes The key attributes. |
| 75 | * \param[out] key_buffer_size Minimum buffer size to contain the key material |
| 76 | * |
| 77 | * \retval #PSA_SUCCESS |
| 78 | * The minimum size for a buffer to contain the key material has been |
| 79 | * returned successfully. |
| 80 | * \retval #PSA_ERROR_NOT_SUPPORTED |
| 81 | * The type and/or the size in bits of the key or the combination of |
| 82 | * the two is not supported. |
| 83 | * \retval #PSA_ERROR_INVALID_ARGUMENT |
| 84 | * The key is declared with a lifetime not known to us. |
| 85 | */ |
| 86 | psa_status_t psa_driver_wrapper_get_key_buffer_size( |
| 87 | const psa_key_attributes_t *attributes, |
| 88 | size_t *key_buffer_size ) |
| 89 | { |
| 90 | psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( psa_get_key_lifetime(attributes) ); |
| 91 | psa_key_type_t key_type = psa_get_key_type(attributes); |
| 92 | size_t key_bits = psa_get_key_bits(attributes); |
| 93 | |
| 94 | *key_buffer_size = 0; |
| 95 | switch( location ) |
| 96 | { |
| 97 | #if defined(PSA_CRYPTO_DRIVER_TEST) |
| 98 | case PSA_CRYPTO_TEST_DRIVER_LOCATION: |
| 99 | #if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS) |
| 100 | /* Emulate property 'builtin_key_size' */ |
| 101 | if( psa_key_id_is_builtin( |
| 102 | MBEDTLS_SVC_KEY_ID_GET_KEY_ID( |
| 103 | psa_get_key_id( attributes ) ) ) ) |
| 104 | { |
| 105 | *key_buffer_size = sizeof( psa_drv_slot_number_t ); |
| 106 | return( PSA_SUCCESS ); |
| 107 | } |
| 108 | #endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */ |
| 109 | *key_buffer_size = mbedtls_test_opaque_size_function( key_type, |
| 110 | key_bits ); |
| 111 | return( ( *key_buffer_size != 0 ) ? |
| 112 | PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED ); |
| 113 | #endif /* PSA_CRYPTO_DRIVER_TEST */ |
| 114 | |
| 115 | default: |
| 116 | (void)key_type; |
| 117 | (void)key_bits; |
| 118 | return( PSA_ERROR_INVALID_ARGUMENT ); |
| 119 | } |
| 120 | } |
| 121 | |
| 122 | psa_status_t psa_driver_wrapper_export_public_key( |
| 123 | const psa_key_attributes_t *attributes, |
| 124 | const uint8_t *key_buffer, size_t key_buffer_size, |
| 125 | uint8_t *data, size_t data_size, size_t *data_length ) |
| 126 | |
| 127 | { |
| 128 | |
| 129 | psa_status_t status = PSA_ERROR_INVALID_ARGUMENT; |
| 130 | psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( |
| 131 | psa_get_key_lifetime( attributes ) ); |
| 132 | |
| 133 | /* Try dynamically-registered SE interface first */ |
| 134 | #if defined(MBEDTLS_PSA_CRYPTO_SE_C) |
| 135 | const psa_drv_se_t *drv; |
| 136 | psa_drv_se_context_t *drv_context; |
| 137 | |
| 138 | if( psa_get_se_driver( psa_get_key_lifetime(attributes), &drv, &drv_context ) ) |
| 139 | { |
| 140 | if( ( drv->key_management == NULL ) || |
| 141 | ( drv->key_management->p_export_public == NULL ) ) |
| 142 | { |
| 143 | return( PSA_ERROR_NOT_SUPPORTED ); |
| 144 | } |
| 145 | |
| 146 | return( drv->key_management->p_export_public( |
| 147 | drv_context, |
| 148 | *( (psa_key_slot_number_t *)key_buffer ), |
| 149 | data, data_size, data_length ) ); |
| 150 | } |
| 151 | #endif /* MBEDTLS_PSA_CRYPTO_SE_C */ |
| 152 | |
| 153 | switch( location ) |
| 154 | { |
| 155 | case PSA_KEY_LOCATION_LOCAL_STORAGE: |
| 156 | /* Key is stored in the slot in export representation, so |
| 157 | * cycle through all known transparent accelerators */ |
| 158 | #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) |
| 159 | |
| 160 | #if (defined(PSA_CRYPTO_DRIVER_TEST) ) |
| 161 | status = mbedtls_test_transparent_export_public_key |
| 162 | (attributes, |
| 163 | key_buffer, |
| 164 | key_buffer_size, |
| 165 | data, |
| 166 | data_size, |
| 167 | data_length |
| 168 | ); |
| 169 | |
| 170 | if( status != PSA_ERROR_NOT_SUPPORTED ) |
| 171 | return( status ); |
| 172 | #endif |
| 173 | |
| 174 | #if (defined(MBEDTLS_PSA_P256M_DRIVER_ENABLED) ) |
| 175 | status = p256_transparent_export_public_key |
| 176 | (attributes, |
| 177 | key_buffer, |
| 178 | key_buffer_size, |
| 179 | data, |
| 180 | data_size, |
| 181 | data_length |
| 182 | ); |
| 183 | |
| 184 | if( status != PSA_ERROR_NOT_SUPPORTED ) |
| 185 | return( status ); |
| 186 | #endif |
| 187 | |
| 188 | |
| 189 | #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ |
| 190 | /* Fell through, meaning no accelerator supports this operation */ |
| 191 | return( psa_export_public_key_internal( attributes, |
| 192 | key_buffer, |
| 193 | key_buffer_size, |
| 194 | data, |
| 195 | data_size, |
| 196 | data_length ) ); |
| 197 | |
| 198 | /* Add cases for opaque driver here */ |
| 199 | #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) |
| 200 | |
| 201 | #if (defined(PSA_CRYPTO_DRIVER_TEST) ) |
| 202 | case 0x7fffff: |
| 203 | return( mbedtls_test_opaque_export_public_key |
| 204 | (attributes, |
| 205 | key_buffer, |
| 206 | key_buffer_size, |
| 207 | data, |
| 208 | data_size, |
| 209 | data_length |
| 210 | )); |
| 211 | #endif |
| 212 | |
| 213 | |
| 214 | #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ |
| 215 | default: |
| 216 | /* Key is declared with a lifetime not known to us */ |
| 217 | return( status ); |
| 218 | } |
| 219 | |
| 220 | } |
| 221 | |
| 222 | psa_status_t psa_driver_wrapper_get_builtin_key( |
| 223 | psa_drv_slot_number_t slot_number, |
| 224 | psa_key_attributes_t *attributes, |
| 225 | uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length ) |
| 226 | { |
| 227 | |
| 228 | psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( psa_get_key_lifetime(attributes) ); |
| 229 | switch( location ) |
| 230 | { |
| 231 | #if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) |
| 232 | |
| 233 | #if (defined(PSA_CRYPTO_DRIVER_TEST) ) |
| 234 | case 0x7fffff: |
| 235 | return( mbedtls_test_opaque_get_builtin_key |
| 236 | (slot_number, |
| 237 | attributes, |
| 238 | key_buffer, |
| 239 | key_buffer_size, |
| 240 | key_buffer_length |
| 241 | )); |
| 242 | #endif |
| 243 | |
| 244 | |
| 245 | #endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ |
| 246 | default: |
| 247 | (void) slot_number; |
| 248 | (void) key_buffer; |
| 249 | (void) key_buffer_size; |
| 250 | (void) key_buffer_length; |
| 251 | return( PSA_ERROR_DOES_NOT_EXIST ); |
| 252 | } |
| 253 | |
| 254 | } |
| 255 | |
| 256 | #endif /* MBEDTLS_PSA_CRYPTO_C */ |
| 257 | |