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 */
psa_driver_wrapper_get_key_buffer_size(const psa_key_attributes_t * attributes,size_t * key_buffer_size)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
psa_driver_wrapper_export_public_key(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,uint8_t * data,size_t data_size,size_t * data_length)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
psa_driver_wrapper_get_builtin_key(psa_drv_slot_number_t slot_number,psa_key_attributes_t * attributes,uint8_t * key_buffer,size_t key_buffer_size,size_t * key_buffer_length)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