blob: 1eb9ebe8070247f515d7f65380f99598353424db [file] [log] [blame]
Steven Cooremancd84cb42020-07-16 20:28:36 +02001/*
2 * Functions to delegate cryptographic operations to an available
3 * and appropriate accelerator.
Steven Cooreman56250fd2020-09-04 13:07:15 +02004 * Warning: This file will be auto-generated in the future.
Steven Cooremancd84cb42020-07-16 20:28:36 +02005 */
Steven Cooreman2c7b2f82020-09-02 13:43:46 +02006/* Copyright The Mbed TLS Contributors
Steven Cooremancd84cb42020-07-16 20:28:36 +02007 * SPDX-License-Identifier: Apache-2.0
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
10 * not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
Steven Cooremancd84cb42020-07-16 20:28:36 +020020 */
21
22#include "psa_crypto_core.h"
23#include "psa_crypto_driver_wrappers.h"
Steven Cooreman2a1664c2020-07-20 15:33:08 +020024#include "mbedtls/platform.h"
25
26#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS)
Steven Cooremancd84cb42020-07-16 20:28:36 +020027
28/* Include test driver definition when running tests */
Steven Cooremanf1720ea2020-07-24 18:41:58 +020029#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman56250fd2020-09-04 13:07:15 +020030#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020031#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020032#endif
33#ifndef PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020034#define PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020035#endif
Steven Cooreman0d7c64d2020-09-07 16:17:55 +020036#include "test/drivers/test_driver.h"
Steven Cooremanf1720ea2020-07-24 18:41:58 +020037#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooremancd84cb42020-07-16 20:28:36 +020038
Steven Cooreman56250fd2020-09-04 13:07:15 +020039/* Repeat above block for each JSON-declared driver during autogeneration */
40
Steven Cooremanfb81aa52020-09-09 12:01:43 +020041/* Auto-generated values depending on which drivers are registered. ID 0 is
42 * reserved for unallocated operations. */
Steven Cooreman37941cb2020-07-28 18:49:51 +020043#if defined(PSA_CRYPTO_DRIVER_TEST)
44#define PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID (1)
45#define PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID (2)
46#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman2a1664c2020-07-20 15:33:08 +020047#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */
48
49/* Support the 'old' SE interface when asked to */
Steven Cooreman7a250572020-07-17 16:43:05 +020050#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Steven Cooreman56250fd2020-09-04 13:07:15 +020051/* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style
52 * SE driver is present, to avoid unused argument errors at compile time. */
53#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020054#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020055#endif
Steven Cooreman7a250572020-07-17 16:43:05 +020056#include "psa_crypto_se.h"
57#endif
58
Steven Cooremancd84cb42020-07-16 20:28:36 +020059/* Start delegation functions */
60psa_status_t psa_driver_wrapper_sign_hash( psa_key_slot_t *slot,
61 psa_algorithm_t alg,
62 const uint8_t *hash,
63 size_t hash_length,
64 uint8_t *signature,
65 size_t signature_size,
66 size_t *signature_length )
67{
Steven Cooremanf1720ea2020-07-24 18:41:58 +020068#if defined(PSA_CRYPTO_DRIVER_PRESENT)
Steven Cooreman7a250572020-07-17 16:43:05 +020069 /* Try dynamically-registered SE interface first */
70#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
71 const psa_drv_se_t *drv;
72 psa_drv_se_context_t *drv_context;
73
74 if( psa_get_se_driver( slot->attr.lifetime, &drv, &drv_context ) )
75 {
76 if( drv->asymmetric == NULL ||
77 drv->asymmetric->p_sign == NULL )
78 {
79 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +020080 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman7a250572020-07-17 16:43:05 +020081 }
82 return( drv->asymmetric->p_sign( drv_context,
Ronald Cronea0f8a62020-11-25 17:52:23 +010083 psa_key_slot_get_slot_number( slot ),
Steven Cooreman7a250572020-07-17 16:43:05 +020084 alg,
85 hash, hash_length,
86 signature, signature_size,
87 signature_length ) );
88 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +020089#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman7a250572020-07-17 16:43:05 +020090
91 /* Then try accelerator API */
Steven Cooremanf1720ea2020-07-24 18:41:58 +020092#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremancd84cb42020-07-16 20:28:36 +020093 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
94 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
95 psa_key_attributes_t attributes = {
96 .core = slot->attr
97 };
98
99 switch( location )
100 {
101 case PSA_KEY_LOCATION_LOCAL_STORAGE:
102 /* Key is stored in the slot in export representation, so
103 * cycle through all known transparent accelerators */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200104#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremancd84cb42020-07-16 20:28:36 +0200105 status = test_transparent_signature_sign_hash( &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100106 slot->key.data,
107 slot->key.bytes,
Steven Cooremancd84cb42020-07-16 20:28:36 +0200108 alg,
109 hash,
110 hash_length,
111 signature,
112 signature_size,
113 signature_length );
114 /* Declared with fallback == true */
115 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200116 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200117#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200118 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200119 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200120 /* Add cases for opaque driver here */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200121#if defined(PSA_CRYPTO_DRIVER_TEST)
122 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
Steven Cooremancd84cb42020-07-16 20:28:36 +0200123 return( test_opaque_signature_sign_hash( &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100124 slot->key.data,
125 slot->key.bytes,
Steven Cooremancd84cb42020-07-16 20:28:36 +0200126 alg,
127 hash,
128 hash_length,
129 signature,
130 signature_size,
131 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200132#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200133 default:
134 /* Key is declared with a lifetime not known to us */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200135 return( status );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200136 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200137#else /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200138 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200139#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
140#else /* PSA_CRYPTO_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200141 (void)slot;
142 (void)alg;
143 (void)hash;
144 (void)hash_length;
145 (void)signature;
146 (void)signature_size;
147 (void)signature_length;
148
Steven Cooreman56250fd2020-09-04 13:07:15 +0200149 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200150#endif /* PSA_CRYPTO_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200151}
152
Steven Cooreman55ae2172020-07-17 19:46:15 +0200153psa_status_t psa_driver_wrapper_verify_hash( psa_key_slot_t *slot,
154 psa_algorithm_t alg,
155 const uint8_t *hash,
156 size_t hash_length,
157 const uint8_t *signature,
158 size_t signature_length )
159{
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200160#if defined(PSA_CRYPTO_DRIVER_PRESENT)
Steven Cooreman55ae2172020-07-17 19:46:15 +0200161 /* Try dynamically-registered SE interface first */
162#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
163 const psa_drv_se_t *drv;
164 psa_drv_se_context_t *drv_context;
165
166 if( psa_get_se_driver( slot->attr.lifetime, &drv, &drv_context ) )
167 {
168 if( drv->asymmetric == NULL ||
169 drv->asymmetric->p_verify == NULL )
170 {
171 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200172 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200173 }
174 return( drv->asymmetric->p_verify( drv_context,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100175 psa_key_slot_get_slot_number( slot ),
Steven Cooreman55ae2172020-07-17 19:46:15 +0200176 alg,
177 hash, hash_length,
178 signature, signature_length ) );
179 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200180#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200181
182 /* Then try accelerator API */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200183#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman55ae2172020-07-17 19:46:15 +0200184 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
185 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
186 psa_key_attributes_t attributes = {
187 .core = slot->attr
188 };
189
190 switch( location )
191 {
192 case PSA_KEY_LOCATION_LOCAL_STORAGE:
193 /* Key is stored in the slot in export representation, so
194 * cycle through all known transparent accelerators */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200195#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman55ae2172020-07-17 19:46:15 +0200196 status = test_transparent_signature_verify_hash( &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100197 slot->key.data,
198 slot->key.bytes,
Steven Cooreman55ae2172020-07-17 19:46:15 +0200199 alg,
200 hash,
201 hash_length,
202 signature,
203 signature_length );
204 /* Declared with fallback == true */
205 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200206 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200207#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200208 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200209 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200210 /* Add cases for opaque driver here */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200211#if defined(PSA_CRYPTO_DRIVER_TEST)
212 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
Steven Cooreman55ae2172020-07-17 19:46:15 +0200213 return( test_opaque_signature_verify_hash( &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100214 slot->key.data,
215 slot->key.bytes,
Steven Cooreman55ae2172020-07-17 19:46:15 +0200216 alg,
217 hash,
218 hash_length,
219 signature,
220 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200221#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200222 default:
223 /* Key is declared with a lifetime not known to us */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200224 return( status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200225 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200226#else /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200227 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200228#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
229#else /* PSA_CRYPTO_DRIVER_PRESENT */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200230 (void)slot;
231 (void)alg;
232 (void)hash;
233 (void)hash_length;
234 (void)signature;
235 (void)signature_length;
236
Steven Cooreman56250fd2020-09-04 13:07:15 +0200237 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200238#endif /* PSA_CRYPTO_DRIVER_PRESENT */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200239}
240
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200241#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman56250fd2020-09-04 13:07:15 +0200242/** Calculate the size to allocate for buffering a key with given attributes.
243 *
244 * This function provides a way to get the expected size for storing a key with
245 * the given attributes. This will be the size of the export representation for
246 * cleartext keys, and a driver-defined size for keys stored by opaque drivers.
247 *
248 * \param[in] attributes The key attribute structure of the key to store.
249 * \param[out] expected_size On success, a byte size large enough to contain
250 * the declared key.
251 *
252 * \retval #PSA_SUCCESS
253 * \retval #PSA_ERROR_NOT_SUPPORTED
254 */
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200255static psa_status_t get_expected_key_size( const psa_key_attributes_t *attributes,
256 size_t *expected_size )
257{
Steven Cooreman56250fd2020-09-04 13:07:15 +0200258 size_t buffer_size = 0;
John Durkop2c618352020-09-22 06:54:01 -0700259 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
260 psa_key_type_t key_type = attributes->core.type;
261 size_t key_bits = attributes->core.bits;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200262
John Durkop2c618352020-09-22 06:54:01 -0700263 switch( location )
264 {
265 case PSA_KEY_LOCATION_LOCAL_STORAGE:
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100266 buffer_size = PSA_EXPORT_KEY_OUTPUT_SIZE( key_type, key_bits );
John Durkop2c618352020-09-22 06:54:01 -0700267
268 if( buffer_size == 0 )
269 return( PSA_ERROR_NOT_SUPPORTED );
270
271 *expected_size = buffer_size;
272 return( PSA_SUCCESS );
273
274#if defined(PSA_CRYPTO_DRIVER_TEST)
275 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
John Durkopac93e3b2020-10-16 06:48:55 -0700276#ifdef TEST_DRIVER_KEY_CONTEXT_SIZE_FUNCTION
John Durkop2c618352020-09-22 06:54:01 -0700277 *expected_size = test_size_function( key_type, key_bits );
278 return( PSA_SUCCESS );
279#else /* TEST_DRIVER_KEY_CONTEXT_SIZE_FUNCTION */
280 if( PSA_KEY_TYPE_IS_KEY_PAIR( key_type ) )
281 {
John Durkop135ce692020-10-19 07:12:28 -0700282 int public_key_overhead = ( ( TEST_DRIVER_KEY_CONTEXT_STORE_PUBLIC_KEY == 1 ) ?
gabor-mezei-armcbcec212020-12-18 14:23:51 +0100283 PSA_EXPORT_KEY_OUTPUT_SIZE( key_type, key_bits ) : 0 );
John Durkop135ce692020-10-19 07:12:28 -0700284 *expected_size = TEST_DRIVER_KEY_CONTEXT_BASE_SIZE
285 + TEST_DRIVER_KEY_CONTEXT_PUBLIC_KEY_SIZE
286 + public_key_overhead;
287 }
288 else if( PSA_KEY_TYPE_IS_PUBLIC_KEY( attributes->core.type ) )
289 {
John Durkop2c618352020-09-22 06:54:01 -0700290 *expected_size = TEST_DRIVER_KEY_CONTEXT_BASE_SIZE
291 + TEST_DRIVER_KEY_CONTEXT_PUBLIC_KEY_SIZE;
292 }
John Durkop135ce692020-10-19 07:12:28 -0700293 else if ( !PSA_KEY_TYPE_IS_KEY_PAIR( key_type ) &&
294 !PSA_KEY_TYPE_IS_PUBLIC_KEY ( attributes->core.type ) )
John Durkop2c618352020-09-22 06:54:01 -0700295 {
296 *expected_size = TEST_DRIVER_KEY_CONTEXT_BASE_SIZE
297 + TEST_DRIVER_KEY_CONTEXT_SYMMETRIC_FACTOR
298 * ( ( key_bits + 7 ) / 8 );
299 }
300 else
301 {
302 return( PSA_ERROR_NOT_SUPPORTED );
303 }
304 return( PSA_SUCCESS );
305#endif /* TEST_DRIVER_KEY_CONTEXT_SIZE_FUNCTION */
306#endif /* PSA_CRYPTO_DRIVER_TEST */
307
308 default:
Steven Cooreman56250fd2020-09-04 13:07:15 +0200309 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200310 }
311}
John Durkop135ce692020-10-19 07:12:28 -0700312#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200313
Steven Cooreman55ae2172020-07-17 19:46:15 +0200314psa_status_t psa_driver_wrapper_generate_key( const psa_key_attributes_t *attributes,
315 psa_key_slot_t *slot )
316{
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200317#if defined(PSA_CRYPTO_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200318 /* Try dynamically-registered SE interface first */
319#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
320 const psa_drv_se_t *drv;
321 psa_drv_se_context_t *drv_context;
322
323 if( psa_get_se_driver( slot->attr.lifetime, &drv, &drv_context ) )
324 {
325 size_t pubkey_length = 0; /* We don't support this feature yet */
326 if( drv->key_management == NULL ||
327 drv->key_management->p_generate == NULL )
328 {
329 /* Key is defined as being in SE, but we have no way to generate it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200330 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200331 }
332 return( drv->key_management->p_generate(
Ronald Cronea0f8a62020-11-25 17:52:23 +0100333 drv_context, psa_key_slot_get_slot_number( slot ),
334 attributes, NULL, 0, &pubkey_length ) );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200335 }
336#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
337
338 /* Then try accelerator API */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200339#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200340 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
341 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
342 size_t export_size = 0;
343
344 status = get_expected_key_size( attributes, &export_size );
345 if( status != PSA_SUCCESS )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200346 return( status );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200347
Ronald Cronea0f8a62020-11-25 17:52:23 +0100348 slot->key.data = mbedtls_calloc(1, export_size);
349 if( slot->key.data == NULL )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200350 return( PSA_ERROR_INSUFFICIENT_MEMORY );
Ronald Cronea0f8a62020-11-25 17:52:23 +0100351 slot->key.bytes = export_size;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200352
353 switch( location )
354 {
355 case PSA_KEY_LOCATION_LOCAL_STORAGE:
356 /* Key is stored in the slot in export representation, so
357 * cycle through all known transparent accelerators */
358
359 /* Transparent drivers are limited to generating asymmetric keys */
360 if( ! PSA_KEY_TYPE_IS_ASYMMETRIC( slot->attr.type ) )
361 {
362 status = PSA_ERROR_NOT_SUPPORTED;
363 break;
364 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200365#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200366 status = test_transparent_generate_key( attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100367 slot->key.data,
368 slot->key.bytes,
369 &slot->key.bytes );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200370 /* Declared with fallback == true */
371 if( status != PSA_ERROR_NOT_SUPPORTED )
372 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200373#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200374 /* Fell through, meaning no accelerator supports this operation */
375 status = PSA_ERROR_NOT_SUPPORTED;
376 break;
377 /* Add cases for opaque driver here */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200378#if defined(PSA_CRYPTO_DRIVER_TEST)
379 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200380 status = test_opaque_generate_key( attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100381 slot->key.data,
382 slot->key.bytes,
383 &slot->key.bytes );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200384 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200385#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200386 default:
387 /* Key is declared with a lifetime not known to us */
388 status = PSA_ERROR_INVALID_ARGUMENT;
389 break;
390 }
391
392 if( status != PSA_SUCCESS )
393 {
394 /* free allocated buffer */
Ronald Cronea0f8a62020-11-25 17:52:23 +0100395 mbedtls_free( slot->key.data );
396 slot->key.data = NULL;
397 slot->key.bytes = 0;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200398 }
399
400 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200401#else /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200402 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200403#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
404#else /* PSA_CRYPTO_DRIVER_PRESENT */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200405 (void) attributes;
406 (void) slot;
407
Steven Cooreman56250fd2020-09-04 13:07:15 +0200408 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200409#endif /* PSA_CRYPTO_DRIVER_PRESENT */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200410}
411
Ronald Cron83282872020-11-22 14:02:39 +0100412psa_status_t psa_driver_wrapper_import_key(
413 const psa_key_attributes_t *attributes,
414 const uint8_t *data,
415 size_t data_length,
416 uint8_t *key_buffer,
417 size_t key_buffer_size,
418 size_t *key_buffer_length,
419 size_t *bits )
Steven Cooreman04524762020-10-13 17:43:44 +0200420{
Steven Cooreman04524762020-10-13 17:43:44 +0200421 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cronbf33c932020-11-28 18:06:53 +0100422 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
423 psa_get_key_lifetime( attributes ) );
Steven Cooreman04524762020-10-13 17:43:44 +0200424
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100425 /* Try dynamically-registered SE interface first */
426#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
427 const psa_drv_se_t *drv;
428 psa_drv_se_context_t *drv_context;
429
430 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
431 {
432 if( drv->key_management == NULL ||
433 drv->key_management->p_import == NULL )
434 return( PSA_ERROR_NOT_SUPPORTED );
435
436 /* The driver should set the number of key bits, however in
437 * case it doesn't, we initialize bits to an invalid value. */
438 *bits = PSA_MAX_KEY_BITS + 1;
439 status = drv->key_management->p_import(
440 drv_context,
441 *( (psa_key_slot_number_t *)key_buffer ),
442 attributes, data, data_length, bits );
443
444 if( status != PSA_SUCCESS )
445 return( status );
446
447 if( (*bits) > PSA_MAX_KEY_BITS )
448 return( PSA_ERROR_NOT_SUPPORTED );
449
450 return( PSA_SUCCESS );
451 }
452#endif /* PSA_CRYPTO_SE_C */
453
Ronald Cronbf33c932020-11-28 18:06:53 +0100454 switch( location )
455 {
456 case PSA_KEY_LOCATION_LOCAL_STORAGE:
457 /* Key is stored in the slot in export representation, so
458 * cycle through all known transparent accelerators */
459#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
460#if defined(PSA_CRYPTO_DRIVER_TEST)
461 status = test_transparent_import_key( attributes,
462 data, data_length,
463 key_buffer, key_buffer_size,
464 key_buffer_length, bits );
465 /* Declared with fallback == true */
466 if( status != PSA_ERROR_NOT_SUPPORTED )
467 return( status );
468#endif /* PSA_CRYPTO_DRIVER_TEST */
469#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
470 /* Fell through, meaning no accelerator supports this operation */
471 return( psa_import_key_into_slot( attributes,
472 data, data_length,
473 key_buffer, key_buffer_size,
474 key_buffer_length, bits ) );
475
476 default:
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100477 /* Importing a key with external storage in not yet supported.
478 * Return in error indicating that the lifetime is not valid. */
Ronald Cronbf33c932020-11-28 18:06:53 +0100479 (void)status;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100480 return( PSA_ERROR_INVALID_ARGUMENT );
Ronald Cronbf33c932020-11-28 18:06:53 +0100481 }
482
Steven Cooreman04524762020-10-13 17:43:44 +0200483}
484
Ronald Cron67227982020-11-26 15:16:05 +0100485psa_status_t psa_driver_wrapper_export_key(
486 const psa_key_attributes_t *attributes,
487 const uint8_t *key_buffer, size_t key_buffer_size,
488 uint8_t *data, size_t data_size, size_t *data_length )
489
490{
491 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
492 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
493 psa_get_key_lifetime( attributes ) );
494
Ronald Cron152e3f82020-11-26 16:06:41 +0100495 /* Try dynamically-registered SE interface first */
496#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
497 const psa_drv_se_t *drv;
498 psa_drv_se_context_t *drv_context;
499
500 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
501 {
502 if( ( drv->key_management == NULL ) ||
503 ( drv->key_management->p_export == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100504 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100505 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100506 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100507
508 return( drv->key_management->p_export(
509 drv_context,
510 *( (psa_key_slot_number_t *)key_buffer ),
511 data, data_size, data_length ) );
512 }
513#endif /* PSA_CRYPTO_SE_C */
514
Ronald Cron67227982020-11-26 15:16:05 +0100515 switch( location )
516 {
517 case PSA_KEY_LOCATION_LOCAL_STORAGE:
518 return( psa_export_key_internal( attributes,
519 key_buffer,
520 key_buffer_size,
521 data,
522 data_size,
523 data_length ) );
524
525 /* Add cases for opaque driver here */
526#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
527#if defined(PSA_CRYPTO_DRIVER_TEST)
528 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
529 return( test_opaque_export_key( attributes,
530 key_buffer,
531 key_buffer_size,
532 data,
533 data_size,
534 data_length ) );
535#endif /* PSA_CRYPTO_DRIVER_TEST */
536#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
537 default:
538 /* Key is declared with a lifetime not known to us */
539 return( status );
540 }
541}
542
Ronald Cron84cc9942020-11-25 14:30:05 +0100543psa_status_t psa_driver_wrapper_export_public_key(
544 const psa_key_attributes_t *attributes,
545 const uint8_t *key_buffer, size_t key_buffer_size,
546 uint8_t *data, size_t data_size, size_t *data_length )
547
Steven Cooremanb9b84422020-10-14 14:39:20 +0200548{
Steven Cooremanb9b84422020-10-14 14:39:20 +0200549 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Cron84cc9942020-11-25 14:30:05 +0100550 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
551 psa_get_key_lifetime( attributes ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200552
Ronald Cron152e3f82020-11-26 16:06:41 +0100553 /* Try dynamically-registered SE interface first */
554#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
555 const psa_drv_se_t *drv;
556 psa_drv_se_context_t *drv_context;
557
558 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
559 {
560 if( ( drv->key_management == NULL ) ||
561 ( drv->key_management->p_export_public == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100562 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100563 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100564 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100565
566 return( drv->key_management->p_export_public(
567 drv_context,
568 *( (psa_key_slot_number_t *)key_buffer ),
569 data, data_size, data_length ) );
570 }
571#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
572
Steven Cooremanb9b84422020-10-14 14:39:20 +0200573 switch( location )
574 {
575 case PSA_KEY_LOCATION_LOCAL_STORAGE:
576 /* Key is stored in the slot in export representation, so
577 * cycle through all known transparent accelerators */
Ronald Cron67227982020-11-26 15:16:05 +0100578#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200579#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron84cc9942020-11-25 14:30:05 +0100580 status = test_transparent_export_public_key( attributes,
581 key_buffer,
582 key_buffer_size,
Steven Cooremanb9b84422020-10-14 14:39:20 +0200583 data,
584 data_size,
585 data_length );
586 /* Declared with fallback == true */
587 if( status != PSA_ERROR_NOT_SUPPORTED )
588 return( status );
589#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100590#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200591 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron67227982020-11-26 15:16:05 +0100592 return( psa_export_public_key_internal( attributes,
593 key_buffer,
594 key_buffer_size,
595 data,
596 data_size,
597 data_length ) );
598
Steven Cooremanb9b84422020-10-14 14:39:20 +0200599 /* Add cases for opaque driver here */
Ronald Cron67227982020-11-26 15:16:05 +0100600#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200601#if defined(PSA_CRYPTO_DRIVER_TEST)
602 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
Ronald Cron84cc9942020-11-25 14:30:05 +0100603 return( test_opaque_export_public_key( attributes,
604 key_buffer,
605 key_buffer_size,
Steven Cooremanb9b84422020-10-14 14:39:20 +0200606 data,
607 data_size,
608 data_length ) );
609#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100610#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200611 default:
612 /* Key is declared with a lifetime not known to us */
613 return( status );
614 }
Steven Cooremanb9b84422020-10-14 14:39:20 +0200615}
616
Steven Cooreman37941cb2020-07-28 18:49:51 +0200617/*
618 * Cipher functions
619 */
620psa_status_t psa_driver_wrapper_cipher_encrypt(
621 psa_key_slot_t *slot,
622 psa_algorithm_t alg,
623 const uint8_t *input,
624 size_t input_length,
625 uint8_t *output,
626 size_t output_size,
627 size_t *output_length )
628{
629#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
630 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
631 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
632 psa_key_attributes_t attributes = {
633 .core = slot->attr
634 };
635
636 switch( location )
637 {
638 case PSA_KEY_LOCATION_LOCAL_STORAGE:
639 /* Key is stored in the slot in export representation, so
640 * cycle through all known transparent accelerators */
641#if defined(PSA_CRYPTO_DRIVER_TEST)
642 status = test_transparent_cipher_encrypt( &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100643 slot->key.data,
644 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200645 alg,
646 input,
647 input_length,
648 output,
649 output_size,
650 output_length );
651 /* Declared with fallback == true */
652 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200653 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200654#endif /* PSA_CRYPTO_DRIVER_TEST */
655 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200656 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200657 /* Add cases for opaque driver here */
658#if defined(PSA_CRYPTO_DRIVER_TEST)
659 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
660 return( test_opaque_cipher_encrypt( &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100661 slot->key.data,
662 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200663 alg,
664 input,
665 input_length,
666 output,
667 output_size,
668 output_length ) );
669#endif /* PSA_CRYPTO_DRIVER_TEST */
670 default:
671 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200672 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200673 }
674#else /* PSA_CRYPTO_DRIVER_PRESENT */
675 (void) slot;
676 (void) alg;
677 (void) input;
678 (void) input_length;
679 (void) output;
680 (void) output_size;
681 (void) output_length;
682
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200683 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200684#endif /* PSA_CRYPTO_DRIVER_PRESENT */
685}
686
687psa_status_t psa_driver_wrapper_cipher_decrypt(
688 psa_key_slot_t *slot,
689 psa_algorithm_t alg,
690 const uint8_t *input,
691 size_t input_length,
692 uint8_t *output,
693 size_t output_size,
694 size_t *output_length )
695{
696#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
697 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
698 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
699 psa_key_attributes_t attributes = {
700 .core = slot->attr
701 };
702
703 switch( location )
704 {
705 case PSA_KEY_LOCATION_LOCAL_STORAGE:
706 /* Key is stored in the slot in export representation, so
707 * cycle through all known transparent accelerators */
708#if defined(PSA_CRYPTO_DRIVER_TEST)
709 status = test_transparent_cipher_decrypt( &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100710 slot->key.data,
711 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200712 alg,
713 input,
714 input_length,
715 output,
716 output_size,
717 output_length );
718 /* Declared with fallback == true */
719 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200720 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200721#endif /* PSA_CRYPTO_DRIVER_TEST */
722 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200723 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200724 /* Add cases for opaque driver here */
725#if defined(PSA_CRYPTO_DRIVER_TEST)
726 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
727 return( test_opaque_cipher_decrypt( &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100728 slot->key.data,
729 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200730 alg,
731 input,
732 input_length,
733 output,
734 output_size,
735 output_length ) );
736#endif /* PSA_CRYPTO_DRIVER_TEST */
737 default:
738 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200739 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200740 }
741#else /* PSA_CRYPTO_DRIVER_PRESENT */
742 (void) slot;
743 (void) alg;
744 (void) input;
745 (void) input_length;
746 (void) output;
747 (void) output_size;
748 (void) output_length;
749
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200750 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200751#endif /* PSA_CRYPTO_DRIVER_PRESENT */
752}
753
754psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200755 psa_operation_driver_context_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200756 psa_key_slot_t *slot,
757 psa_algorithm_t alg )
758{
759#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
760 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
761 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
762 psa_key_attributes_t attributes = {
763 .core = slot->attr
764 };
765
Steven Cooreman37941cb2020-07-28 18:49:51 +0200766 switch( location )
767 {
768 case PSA_KEY_LOCATION_LOCAL_STORAGE:
769 /* Key is stored in the slot in export representation, so
770 * cycle through all known transparent accelerators */
771#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200772 operation->ctx = mbedtls_calloc( 1, sizeof(test_transparent_cipher_operation_t) );
773 if( operation->ctx == NULL )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200774 return PSA_ERROR_INSUFFICIENT_MEMORY;
775
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200776 status = test_transparent_cipher_encrypt_setup( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200777 &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100778 slot->key.data,
779 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200780 alg );
781 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200782 if( status == PSA_SUCCESS )
783 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200784 else
785 {
Steven Cooremancfeea8f2020-09-09 15:09:18 +0200786 mbedtls_platform_zeroize(
787 operation->ctx,
788 sizeof( test_transparent_cipher_operation_t ) );
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200789 mbedtls_free( operation->ctx );
790 operation->ctx = NULL;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200791 }
Steven Cooreman150c99b2020-09-09 14:32:44 +0200792
793 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200794#endif /* PSA_CRYPTO_DRIVER_TEST */
795 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200796 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200797 /* Add cases for opaque driver here */
798#if defined(PSA_CRYPTO_DRIVER_TEST)
799 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200800 operation->ctx = mbedtls_calloc( 1, sizeof(test_opaque_cipher_operation_t) );
801 if( operation->ctx == NULL )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200802 return( PSA_ERROR_INSUFFICIENT_MEMORY );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200803
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200804 status = test_opaque_cipher_encrypt_setup( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200805 &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100806 slot->key.data,
807 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200808 alg );
809 if( status == PSA_SUCCESS )
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200810 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200811 else
812 {
Steven Cooremancfeea8f2020-09-09 15:09:18 +0200813 mbedtls_platform_zeroize(
814 operation->ctx,
815 sizeof( test_opaque_cipher_operation_t ) );
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200816 mbedtls_free( operation->ctx );
817 operation->ctx = NULL;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200818 }
819
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200820 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200821#endif /* PSA_CRYPTO_DRIVER_TEST */
822 default:
823 /* Key is declared with a lifetime not known to us */
John Durkop714e3a12020-09-29 22:07:04 -0700824 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200825 }
826#else /* PSA_CRYPTO_DRIVER_PRESENT */
827 (void)slot;
828 (void)alg;
829 (void)operation;
830
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200831 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200832#endif /* PSA_CRYPTO_DRIVER_PRESENT */
833}
834
835psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200836 psa_operation_driver_context_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200837 psa_key_slot_t *slot,
838 psa_algorithm_t alg )
839{
840#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
841 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
842 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
843 psa_key_attributes_t attributes = {
844 .core = slot->attr
845 };
846
Steven Cooreman37941cb2020-07-28 18:49:51 +0200847 switch( location )
848 {
849 case PSA_KEY_LOCATION_LOCAL_STORAGE:
850 /* Key is stored in the slot in export representation, so
851 * cycle through all known transparent accelerators */
852#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200853 operation->ctx = mbedtls_calloc( 1, sizeof(test_transparent_cipher_operation_t) );
854 if( operation->ctx == NULL )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200855 return( PSA_ERROR_INSUFFICIENT_MEMORY );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200856
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200857 status = test_transparent_cipher_decrypt_setup( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200858 &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100859 slot->key.data,
860 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200861 alg );
862 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200863 if( status == PSA_SUCCESS )
864 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200865 else
866 {
Steven Cooremancfeea8f2020-09-09 15:09:18 +0200867 mbedtls_platform_zeroize(
868 operation->ctx,
869 sizeof( test_transparent_cipher_operation_t ) );
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200870 mbedtls_free( operation->ctx );
871 operation->ctx = NULL;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200872 }
Steven Cooreman150c99b2020-09-09 14:32:44 +0200873
874 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200875#endif /* PSA_CRYPTO_DRIVER_TEST */
876 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200877 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200878 /* Add cases for opaque driver here */
879#if defined(PSA_CRYPTO_DRIVER_TEST)
880 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200881 operation->ctx = mbedtls_calloc( 1, sizeof(test_opaque_cipher_operation_t) );
882 if( operation->ctx == NULL )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200883 return PSA_ERROR_INSUFFICIENT_MEMORY;
884
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200885 status = test_opaque_cipher_decrypt_setup( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200886 &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100887 slot->key.data,
888 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200889 alg );
890 if( status == PSA_SUCCESS )
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200891 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200892 else
893 {
Steven Cooremancfeea8f2020-09-09 15:09:18 +0200894 mbedtls_platform_zeroize(
895 operation->ctx,
896 sizeof( test_opaque_cipher_operation_t ) );
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200897 mbedtls_free( operation->ctx );
898 operation->ctx = NULL;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200899 }
900
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200901 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200902#endif /* PSA_CRYPTO_DRIVER_TEST */
903 default:
904 /* Key is declared with a lifetime not known to us */
John Durkop814dca72020-10-05 06:31:12 -0700905 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200906 }
907#else /* PSA_CRYPTO_DRIVER_PRESENT */
908 (void)slot;
909 (void)alg;
910 (void)operation;
911
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200912 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200913#endif /* PSA_CRYPTO_DRIVER_PRESENT */
914}
915
916psa_status_t psa_driver_wrapper_cipher_generate_iv(
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200917 psa_operation_driver_context_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200918 uint8_t *iv,
919 size_t iv_size,
920 size_t *iv_length )
921{
922#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200923 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200924 {
925#if defined(PSA_CRYPTO_DRIVER_TEST)
926 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200927 return( test_transparent_cipher_generate_iv( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200928 iv,
929 iv_size,
930 iv_length ) );
931#endif /* PSA_CRYPTO_DRIVER_TEST */
932#if defined(PSA_CRYPTO_DRIVER_TEST)
933 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200934 return( test_opaque_cipher_generate_iv( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200935 iv,
936 iv_size,
937 iv_length ) );
938#endif /* PSA_CRYPTO_DRIVER_TEST */
939 default:
940 /* Key is attached to a driver not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200941 return( PSA_ERROR_BAD_STATE );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200942 }
943#else /* PSA_CRYPTO_DRIVER_PRESENT */
944 (void) operation;
945 (void) iv;
946 (void) iv_size;
947 (void) iv_length;
948
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200949 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200950#endif /* PSA_CRYPTO_DRIVER_PRESENT */
951}
952
953psa_status_t psa_driver_wrapper_cipher_set_iv(
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200954 psa_operation_driver_context_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200955 const uint8_t *iv,
956 size_t iv_length )
957{
958#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200959 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200960 {
961#if defined(PSA_CRYPTO_DRIVER_TEST)
962 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200963 return( test_transparent_cipher_set_iv( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200964 iv,
965 iv_length ) );
966#endif /* PSA_CRYPTO_DRIVER_TEST */
967#if defined(PSA_CRYPTO_DRIVER_TEST)
968 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200969 return( test_opaque_cipher_set_iv( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200970 iv,
971 iv_length ) );
972#endif /* PSA_CRYPTO_DRIVER_TEST */
973 default:
974 /* Key is attached to a driver not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200975 return( PSA_ERROR_BAD_STATE );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200976 }
977#else /* PSA_CRYPTO_DRIVER_PRESENT */
978 (void) operation;
979 (void) iv;
980 (void) iv_length;
981
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200982 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200983#endif /* PSA_CRYPTO_DRIVER_PRESENT */
984}
985
986psa_status_t psa_driver_wrapper_cipher_update(
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200987 psa_operation_driver_context_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200988 const uint8_t *input,
989 size_t input_length,
990 uint8_t *output,
991 size_t output_size,
992 size_t *output_length )
993{
994#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200995 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200996 {
997#if defined(PSA_CRYPTO_DRIVER_TEST)
998 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200999 return( test_transparent_cipher_update( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001000 input,
1001 input_length,
1002 output,
1003 output_size,
1004 output_length ) );
1005#endif /* PSA_CRYPTO_DRIVER_TEST */
1006#if defined(PSA_CRYPTO_DRIVER_TEST)
1007 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001008 return( test_opaque_cipher_update( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001009 input,
1010 input_length,
1011 output,
1012 output_size,
1013 output_length ) );
1014#endif /* PSA_CRYPTO_DRIVER_TEST */
1015 default:
1016 /* Key is attached to a driver not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001017 return( PSA_ERROR_BAD_STATE );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001018 }
1019#else /* PSA_CRYPTO_DRIVER_PRESENT */
1020 (void) operation;
1021 (void) input;
1022 (void) input_length;
1023 (void) output;
1024 (void) output_length;
1025 (void) output_size;
1026
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001027 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001028#endif /* PSA_CRYPTO_DRIVER_PRESENT */
1029}
1030
1031psa_status_t psa_driver_wrapper_cipher_finish(
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001032 psa_operation_driver_context_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001033 uint8_t *output,
1034 size_t output_size,
1035 size_t *output_length )
1036{
1037#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001038 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001039 {
1040#if defined(PSA_CRYPTO_DRIVER_TEST)
1041 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001042 return( test_transparent_cipher_finish( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001043 output,
1044 output_size,
1045 output_length ) );
1046#endif /* PSA_CRYPTO_DRIVER_TEST */
1047#if defined(PSA_CRYPTO_DRIVER_TEST)
1048 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001049 return( test_opaque_cipher_finish( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001050 output,
1051 output_size,
1052 output_length ) );
1053#endif /* PSA_CRYPTO_DRIVER_TEST */
1054 default:
1055 /* Key is attached to a driver not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001056 return( PSA_ERROR_BAD_STATE );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001057 }
1058#else /* PSA_CRYPTO_DRIVER_PRESENT */
1059 (void) operation;
1060 (void) output;
1061 (void) output_size;
1062 (void) output_length;
1063
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001064 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001065#endif /* PSA_CRYPTO_DRIVER_PRESENT */
1066}
1067
1068psa_status_t psa_driver_wrapper_cipher_abort(
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001069 psa_operation_driver_context_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001070{
1071#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1072 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001073
1074 /* The object has (apparently) been initialized but it is not in use. It's
1075 * ok to call abort on such an object, and there's nothing to do. */
1076 if( operation->ctx == NULL && operation->id == 0 )
1077 return( PSA_SUCCESS );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001078
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001079 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001080 {
1081#if defined(PSA_CRYPTO_DRIVER_TEST)
1082 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001083 status = test_transparent_cipher_abort( operation->ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001084 mbedtls_platform_zeroize(
1085 operation->ctx,
1086 sizeof( test_transparent_cipher_operation_t ) );
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001087 mbedtls_free( operation->ctx );
1088 operation->ctx = NULL;
1089 operation->id = 0;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001090
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001091 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001092#endif /* PSA_CRYPTO_DRIVER_TEST */
1093#if defined(PSA_CRYPTO_DRIVER_TEST)
1094 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001095 status = test_opaque_cipher_abort( operation->ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001096 mbedtls_platform_zeroize(
1097 operation->ctx,
1098 sizeof( test_opaque_cipher_operation_t ) );
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001099 mbedtls_free( operation->ctx );
1100 operation->ctx = NULL;
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001101 operation->id = 0;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001102
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001103 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001104#endif /* PSA_CRYPTO_DRIVER_TEST */
1105 default:
1106 /* Operation is attached to a driver not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001107 return( PSA_ERROR_BAD_STATE );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001108 }
1109#else /* PSA_CRYPTO_DRIVER_PRESENT */
1110 (void)operation;
1111
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001112 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001113#endif /* PSA_CRYPTO_DRIVER_PRESENT */
1114}
1115
Steven Cooremancd84cb42020-07-16 20:28:36 +02001116/* End of automatically generated file. */