blob: 765920fc8b78beb7bdf0ab91ac7ec1b5123e5b79 [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
Ronald Cron0b805592020-12-14 18:08:20 +010022#include "psa_crypto_cipher.h"
Steven Cooremancd84cb42020-07-16 20:28:36 +020023#include "psa_crypto_core.h"
24#include "psa_crypto_driver_wrappers.h"
Steven Cooreman830aff22021-03-09 09:50:44 +010025#include "psa_crypto_hash.h"
26
Steven Cooreman2a1664c2020-07-20 15:33:08 +020027#include "mbedtls/platform.h"
28
29#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS)
Steven Cooremancd84cb42020-07-16 20:28:36 +020030
31/* Include test driver definition when running tests */
Steven Cooremanf1720ea2020-07-24 18:41:58 +020032#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman56250fd2020-09-04 13:07:15 +020033#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020034#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020035#endif
36#ifndef PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020037#define PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020038#endif
Steven Cooreman0d7c64d2020-09-07 16:17:55 +020039#include "test/drivers/test_driver.h"
Steven Cooremanf1720ea2020-07-24 18:41:58 +020040#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooremancd84cb42020-07-16 20:28:36 +020041
Steven Cooreman56250fd2020-09-04 13:07:15 +020042/* Repeat above block for each JSON-declared driver during autogeneration */
Steven Cooremanaa87fd02021-03-15 18:54:03 +010043#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */
Steven Cooreman56250fd2020-09-04 13:07:15 +020044
Steven Cooreman1e582352021-02-18 17:24:37 +010045/* Auto-generated values depending on which drivers are registered.
46 * ID 0 is reserved for unallocated operations.
47 * ID 1 is reserved for the Mbed TLS software driver. */
Steven Cooreman830aff22021-03-09 09:50:44 +010048#define PSA_CRYPTO_MBED_TLS_DRIVER_ID (1)
49
Steven Cooreman37941cb2020-07-28 18:49:51 +020050#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman1e582352021-02-18 17:24:37 +010051#define PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID (2)
52#define PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID (3)
Steven Cooreman37941cb2020-07-28 18:49:51 +020053#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman2a1664c2020-07-20 15:33:08 +020054
55/* Support the 'old' SE interface when asked to */
Steven Cooreman7a250572020-07-17 16:43:05 +020056#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Steven Cooreman56250fd2020-09-04 13:07:15 +020057/* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style
58 * SE driver is present, to avoid unused argument errors at compile time. */
59#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020060#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020061#endif
Steven Cooreman7a250572020-07-17 16:43:05 +020062#include "psa_crypto_se.h"
63#endif
64
Steven Cooremancd84cb42020-07-16 20:28:36 +020065/* Start delegation functions */
Ronald Cron9f17aa42020-12-08 17:07:25 +010066psa_status_t psa_driver_wrapper_sign_hash(
67 const psa_key_attributes_t *attributes,
68 const uint8_t *key_buffer, size_t key_buffer_size,
69 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
70 uint8_t *signature, size_t signature_size, size_t *signature_length )
Steven Cooremancd84cb42020-07-16 20:28:36 +020071{
Steven Cooreman7a250572020-07-17 16:43:05 +020072 /* Try dynamically-registered SE interface first */
73#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
74 const psa_drv_se_t *drv;
75 psa_drv_se_context_t *drv_context;
76
Ronald Cron9f17aa42020-12-08 17:07:25 +010077 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman7a250572020-07-17 16:43:05 +020078 {
79 if( drv->asymmetric == NULL ||
80 drv->asymmetric->p_sign == NULL )
81 {
82 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +020083 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman7a250572020-07-17 16:43:05 +020084 }
Ronald Cron9f17aa42020-12-08 17:07:25 +010085 return( drv->asymmetric->p_sign(
86 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
87 alg, hash, hash_length,
88 signature, signature_size, signature_length ) );
Steven Cooreman7a250572020-07-17 16:43:05 +020089 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +020090#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman7a250572020-07-17 16:43:05 +020091
Ronald Cronfce9df22020-12-08 18:06:03 +010092 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +010093 psa_key_location_t location =
94 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooremancd84cb42020-07-16 20:28:36 +020095
96 switch( location )
97 {
98 case PSA_KEY_LOCATION_LOCAL_STORAGE:
99 /* Key is stored in the slot in export representation, so
100 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100101#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200102#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron9f17aa42020-12-08 17:07:25 +0100103 status = test_transparent_signature_sign_hash( attributes,
104 key_buffer,
105 key_buffer_size,
Steven Cooremancd84cb42020-07-16 20:28:36 +0200106 alg,
107 hash,
108 hash_length,
109 signature,
110 signature_size,
111 signature_length );
112 /* Declared with fallback == true */
113 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200114 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200115#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100116#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200117 /* Fell through, meaning no accelerator supports this operation */
Ronald Cronfce9df22020-12-08 18:06:03 +0100118 return( psa_sign_hash_internal( attributes,
119 key_buffer,
120 key_buffer_size,
121 alg,
122 hash,
123 hash_length,
124 signature,
125 signature_size,
126 signature_length ) );
127
Steven Cooremancd84cb42020-07-16 20:28:36 +0200128 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100129#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200130#if defined(PSA_CRYPTO_DRIVER_TEST)
131 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
Ronald Cron9f17aa42020-12-08 17:07:25 +0100132 return( test_opaque_signature_sign_hash( attributes,
133 key_buffer,
134 key_buffer_size,
Steven Cooremancd84cb42020-07-16 20:28:36 +0200135 alg,
136 hash,
137 hash_length,
138 signature,
139 signature_size,
140 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200141#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100142#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200143 default:
144 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100145 (void)status;
146 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200147 }
Steven Cooremancd84cb42020-07-16 20:28:36 +0200148}
149
Ronald Cron9f17aa42020-12-08 17:07:25 +0100150psa_status_t psa_driver_wrapper_verify_hash(
151 const psa_key_attributes_t *attributes,
152 const uint8_t *key_buffer, size_t key_buffer_size,
153 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
154 const uint8_t *signature, size_t signature_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200155{
Steven Cooreman55ae2172020-07-17 19:46:15 +0200156 /* Try dynamically-registered SE interface first */
157#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
158 const psa_drv_se_t *drv;
159 psa_drv_se_context_t *drv_context;
160
Ronald Cron9f17aa42020-12-08 17:07:25 +0100161 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200162 {
163 if( drv->asymmetric == NULL ||
164 drv->asymmetric->p_verify == NULL )
165 {
166 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200167 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200168 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100169 return( drv->asymmetric->p_verify(
170 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
171 alg, hash, hash_length,
172 signature, signature_length ) );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200173 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200174#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200175
Ronald Cronfce9df22020-12-08 18:06:03 +0100176 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100177 psa_key_location_t location =
178 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200179
180 switch( location )
181 {
182 case PSA_KEY_LOCATION_LOCAL_STORAGE:
183 /* Key is stored in the slot in export representation, so
184 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100185#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200186#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron9f17aa42020-12-08 17:07:25 +0100187 status = test_transparent_signature_verify_hash( attributes,
188 key_buffer,
189 key_buffer_size,
Steven Cooreman55ae2172020-07-17 19:46:15 +0200190 alg,
191 hash,
192 hash_length,
193 signature,
194 signature_length );
195 /* Declared with fallback == true */
196 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200197 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200198#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100199#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
200
201 return( psa_verify_hash_internal( attributes,
202 key_buffer,
203 key_buffer_size,
204 alg,
205 hash,
206 hash_length,
207 signature,
208 signature_length ) );
209
Steven Cooreman55ae2172020-07-17 19:46:15 +0200210 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100211#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200212#if defined(PSA_CRYPTO_DRIVER_TEST)
213 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
Ronald Cron9f17aa42020-12-08 17:07:25 +0100214 return( test_opaque_signature_verify_hash( attributes,
215 key_buffer,
216 key_buffer_size,
Steven Cooreman55ae2172020-07-17 19:46:15 +0200217 alg,
218 hash,
219 hash_length,
220 signature,
221 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200222#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100223#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200224 default:
225 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100226 (void)status;
227 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200228 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200229}
230
Ronald Cron31216282020-12-05 18:47:56 +0100231/** Get the key buffer size for the key material of a generated key in the
232 * case of an opaque driver without storage.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200233 *
Ronald Cron31216282020-12-05 18:47:56 +0100234 * \param[in] attributes The key attributes.
235 * \param[out] key_buffer_size Minimum buffer size to contain the key material
Steven Cooreman56250fd2020-09-04 13:07:15 +0200236 *
237 * \retval #PSA_SUCCESS
Ronald Cron31216282020-12-05 18:47:56 +0100238 * The minimum size for a buffer to contain the key material has been
239 * returned successfully.
240 * \retval #PSA_ERROR_INVALID_ARGUMENT
241 * The size in bits of the key is not valid.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200242 * \retval #PSA_ERROR_NOT_SUPPORTED
Ronald Cron31216282020-12-05 18:47:56 +0100243 * The type and/or the size in bits of the key or the combination of
244 * the two is not supported.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200245 */
Ronald Cron9df74be2020-12-05 19:15:23 +0100246psa_status_t psa_driver_wrapper_get_key_buffer_size(
Ronald Cron31216282020-12-05 18:47:56 +0100247 const psa_key_attributes_t *attributes,
248 size_t *key_buffer_size )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200249{
John Durkop2c618352020-09-22 06:54:01 -0700250 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
251 psa_key_type_t key_type = attributes->core.type;
252 size_t key_bits = attributes->core.bits;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200253
Ronald Cron31216282020-12-05 18:47:56 +0100254 *key_buffer_size = 0;
John Durkop2c618352020-09-22 06:54:01 -0700255 switch( location )
256 {
John Durkop2c618352020-09-22 06:54:01 -0700257#if defined(PSA_CRYPTO_DRIVER_TEST)
258 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
John Durkopac93e3b2020-10-16 06:48:55 -0700259#ifdef TEST_DRIVER_KEY_CONTEXT_SIZE_FUNCTION
Ronald Cron31216282020-12-05 18:47:56 +0100260 *key_buffer_size = test_size_function( key_type, key_bits );
John Durkop2c618352020-09-22 06:54:01 -0700261 return( PSA_SUCCESS );
262#else /* TEST_DRIVER_KEY_CONTEXT_SIZE_FUNCTION */
263 if( PSA_KEY_TYPE_IS_KEY_PAIR( key_type ) )
264 {
Ronald Cron31216282020-12-05 18:47:56 +0100265 int public_key_overhead =
266 ( ( TEST_DRIVER_KEY_CONTEXT_STORE_PUBLIC_KEY == 1 ) ?
267 PSA_EXPORT_KEY_OUTPUT_SIZE( key_type, key_bits ) : 0 );
268 *key_buffer_size = TEST_DRIVER_KEY_CONTEXT_BASE_SIZE
John Durkop135ce692020-10-19 07:12:28 -0700269 + TEST_DRIVER_KEY_CONTEXT_PUBLIC_KEY_SIZE
270 + public_key_overhead;
271 }
Ronald Cron31216282020-12-05 18:47:56 +0100272 else if( PSA_KEY_TYPE_IS_PUBLIC_KEY( key_type ) )
John Durkop135ce692020-10-19 07:12:28 -0700273 {
Ronald Cron31216282020-12-05 18:47:56 +0100274 *key_buffer_size = TEST_DRIVER_KEY_CONTEXT_BASE_SIZE
John Durkop2c618352020-09-22 06:54:01 -0700275 + TEST_DRIVER_KEY_CONTEXT_PUBLIC_KEY_SIZE;
276 }
John Durkop135ce692020-10-19 07:12:28 -0700277 else if ( !PSA_KEY_TYPE_IS_KEY_PAIR( key_type ) &&
Ronald Cron31216282020-12-05 18:47:56 +0100278 !PSA_KEY_TYPE_IS_PUBLIC_KEY ( key_type ) )
John Durkop2c618352020-09-22 06:54:01 -0700279 {
Ronald Cron31216282020-12-05 18:47:56 +0100280 *key_buffer_size = TEST_DRIVER_KEY_CONTEXT_BASE_SIZE
John Durkop2c618352020-09-22 06:54:01 -0700281 + TEST_DRIVER_KEY_CONTEXT_SYMMETRIC_FACTOR
282 * ( ( key_bits + 7 ) / 8 );
283 }
284 else
285 {
286 return( PSA_ERROR_NOT_SUPPORTED );
287 }
288 return( PSA_SUCCESS );
289#endif /* TEST_DRIVER_KEY_CONTEXT_SIZE_FUNCTION */
290#endif /* PSA_CRYPTO_DRIVER_TEST */
291
292 default:
Ronald Cron9df74be2020-12-05 19:15:23 +0100293 (void)key_type;
294 (void)key_bits;
Steven Cooreman56250fd2020-09-04 13:07:15 +0200295 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200296 }
297}
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200298
Ronald Cron977c2472020-10-13 08:32:21 +0200299psa_status_t psa_driver_wrapper_generate_key(
300 const psa_key_attributes_t *attributes,
301 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200302{
Ronald Cron977c2472020-10-13 08:32:21 +0200303 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
304 psa_key_location_t location =
305 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
306
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200307 /* Try dynamically-registered SE interface first */
308#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
309 const psa_drv_se_t *drv;
310 psa_drv_se_context_t *drv_context;
311
Ronald Cron977c2472020-10-13 08:32:21 +0200312 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200313 {
314 size_t pubkey_length = 0; /* We don't support this feature yet */
315 if( drv->key_management == NULL ||
316 drv->key_management->p_generate == NULL )
317 {
318 /* Key is defined as being in SE, but we have no way to generate it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200319 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200320 }
321 return( drv->key_management->p_generate(
Ronald Cron977c2472020-10-13 08:32:21 +0200322 drv_context,
323 *( (psa_key_slot_number_t *)key_buffer ),
Ronald Cronea0f8a62020-11-25 17:52:23 +0100324 attributes, NULL, 0, &pubkey_length ) );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200325 }
326#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
327
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200328 switch( location )
329 {
330 case PSA_KEY_LOCATION_LOCAL_STORAGE:
Ronald Cron977c2472020-10-13 08:32:21 +0200331#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200332 /* Transparent drivers are limited to generating asymmetric keys */
Ronald Cron977c2472020-10-13 08:32:21 +0200333 if( PSA_KEY_TYPE_IS_ASYMMETRIC( attributes->core.type ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200334 {
Ronald Cron977c2472020-10-13 08:32:21 +0200335 /* Cycle through all known transparent accelerators */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200336#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron977c2472020-10-13 08:32:21 +0200337 status = test_transparent_generate_key(
338 attributes, key_buffer, key_buffer_size,
339 key_buffer_length );
340 /* Declared with fallback == true */
341 if( status != PSA_ERROR_NOT_SUPPORTED )
342 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200343#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200344 }
345#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
346
347 /* Software fallback */
348 status = psa_generate_key_internal(
349 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200350 break;
Ronald Cron977c2472020-10-13 08:32:21 +0200351
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200352 /* Add cases for opaque driver here */
Ronald Cron977c2472020-10-13 08:32:21 +0200353#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200354#if defined(PSA_CRYPTO_DRIVER_TEST)
355 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
Ronald Cron977c2472020-10-13 08:32:21 +0200356 status = test_opaque_generate_key(
357 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200358 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200359#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200360#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
361
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200362 default:
363 /* Key is declared with a lifetime not known to us */
364 status = PSA_ERROR_INVALID_ARGUMENT;
365 break;
366 }
367
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200368 return( status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200369}
370
Ronald Cron83282872020-11-22 14:02:39 +0100371psa_status_t psa_driver_wrapper_import_key(
372 const psa_key_attributes_t *attributes,
373 const uint8_t *data,
374 size_t data_length,
375 uint8_t *key_buffer,
376 size_t key_buffer_size,
377 size_t *key_buffer_length,
378 size_t *bits )
Steven Cooreman04524762020-10-13 17:43:44 +0200379{
Steven Cooreman04524762020-10-13 17:43:44 +0200380 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cronbf33c932020-11-28 18:06:53 +0100381 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
382 psa_get_key_lifetime( attributes ) );
Steven Cooreman04524762020-10-13 17:43:44 +0200383
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100384 /* Try dynamically-registered SE interface first */
385#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
386 const psa_drv_se_t *drv;
387 psa_drv_se_context_t *drv_context;
388
389 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
390 {
391 if( drv->key_management == NULL ||
392 drv->key_management->p_import == NULL )
393 return( PSA_ERROR_NOT_SUPPORTED );
394
395 /* The driver should set the number of key bits, however in
396 * case it doesn't, we initialize bits to an invalid value. */
397 *bits = PSA_MAX_KEY_BITS + 1;
398 status = drv->key_management->p_import(
399 drv_context,
400 *( (psa_key_slot_number_t *)key_buffer ),
401 attributes, data, data_length, bits );
402
403 if( status != PSA_SUCCESS )
404 return( status );
405
406 if( (*bits) > PSA_MAX_KEY_BITS )
407 return( PSA_ERROR_NOT_SUPPORTED );
408
409 return( PSA_SUCCESS );
410 }
411#endif /* PSA_CRYPTO_SE_C */
412
Ronald Cronbf33c932020-11-28 18:06:53 +0100413 switch( location )
414 {
415 case PSA_KEY_LOCATION_LOCAL_STORAGE:
416 /* Key is stored in the slot in export representation, so
417 * cycle through all known transparent accelerators */
418#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
419#if defined(PSA_CRYPTO_DRIVER_TEST)
420 status = test_transparent_import_key( attributes,
421 data, data_length,
422 key_buffer, key_buffer_size,
423 key_buffer_length, bits );
424 /* Declared with fallback == true */
425 if( status != PSA_ERROR_NOT_SUPPORTED )
426 return( status );
427#endif /* PSA_CRYPTO_DRIVER_TEST */
428#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
429 /* Fell through, meaning no accelerator supports this operation */
430 return( psa_import_key_into_slot( attributes,
431 data, data_length,
432 key_buffer, key_buffer_size,
433 key_buffer_length, bits ) );
434
435 default:
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100436 /* Importing a key with external storage in not yet supported.
437 * Return in error indicating that the lifetime is not valid. */
Ronald Cronbf33c932020-11-28 18:06:53 +0100438 (void)status;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100439 return( PSA_ERROR_INVALID_ARGUMENT );
Ronald Cronbf33c932020-11-28 18:06:53 +0100440 }
441
Steven Cooreman04524762020-10-13 17:43:44 +0200442}
443
Ronald Cron67227982020-11-26 15:16:05 +0100444psa_status_t psa_driver_wrapper_export_key(
445 const psa_key_attributes_t *attributes,
446 const uint8_t *key_buffer, size_t key_buffer_size,
447 uint8_t *data, size_t data_size, size_t *data_length )
448
449{
450 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
451 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
452 psa_get_key_lifetime( attributes ) );
453
Ronald Cron152e3f82020-11-26 16:06:41 +0100454 /* Try dynamically-registered SE interface first */
455#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
456 const psa_drv_se_t *drv;
457 psa_drv_se_context_t *drv_context;
458
459 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
460 {
461 if( ( drv->key_management == NULL ) ||
462 ( drv->key_management->p_export == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100463 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100464 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100465 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100466
467 return( drv->key_management->p_export(
468 drv_context,
469 *( (psa_key_slot_number_t *)key_buffer ),
470 data, data_size, data_length ) );
471 }
472#endif /* PSA_CRYPTO_SE_C */
473
Ronald Cron67227982020-11-26 15:16:05 +0100474 switch( location )
475 {
476 case PSA_KEY_LOCATION_LOCAL_STORAGE:
477 return( psa_export_key_internal( attributes,
478 key_buffer,
479 key_buffer_size,
480 data,
481 data_size,
482 data_length ) );
483
484 /* Add cases for opaque driver here */
485#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
486#if defined(PSA_CRYPTO_DRIVER_TEST)
487 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
488 return( test_opaque_export_key( attributes,
489 key_buffer,
490 key_buffer_size,
491 data,
492 data_size,
493 data_length ) );
494#endif /* PSA_CRYPTO_DRIVER_TEST */
495#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
496 default:
497 /* Key is declared with a lifetime not known to us */
498 return( status );
499 }
500}
501
Ronald Cron84cc9942020-11-25 14:30:05 +0100502psa_status_t psa_driver_wrapper_export_public_key(
503 const psa_key_attributes_t *attributes,
504 const uint8_t *key_buffer, size_t key_buffer_size,
505 uint8_t *data, size_t data_size, size_t *data_length )
506
Steven Cooremanb9b84422020-10-14 14:39:20 +0200507{
Steven Cooremanb9b84422020-10-14 14:39:20 +0200508 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Cron84cc9942020-11-25 14:30:05 +0100509 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
510 psa_get_key_lifetime( attributes ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200511
Ronald Cron152e3f82020-11-26 16:06:41 +0100512 /* Try dynamically-registered SE interface first */
513#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
514 const psa_drv_se_t *drv;
515 psa_drv_se_context_t *drv_context;
516
517 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
518 {
519 if( ( drv->key_management == NULL ) ||
520 ( drv->key_management->p_export_public == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100521 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100522 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100523 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100524
525 return( drv->key_management->p_export_public(
526 drv_context,
527 *( (psa_key_slot_number_t *)key_buffer ),
528 data, data_size, data_length ) );
529 }
530#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
531
Steven Cooremanb9b84422020-10-14 14:39:20 +0200532 switch( location )
533 {
534 case PSA_KEY_LOCATION_LOCAL_STORAGE:
535 /* Key is stored in the slot in export representation, so
536 * cycle through all known transparent accelerators */
Ronald Cron67227982020-11-26 15:16:05 +0100537#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200538#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron84cc9942020-11-25 14:30:05 +0100539 status = test_transparent_export_public_key( attributes,
540 key_buffer,
541 key_buffer_size,
Steven Cooremanb9b84422020-10-14 14:39:20 +0200542 data,
543 data_size,
544 data_length );
545 /* Declared with fallback == true */
546 if( status != PSA_ERROR_NOT_SUPPORTED )
547 return( status );
548#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100549#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200550 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron67227982020-11-26 15:16:05 +0100551 return( psa_export_public_key_internal( attributes,
552 key_buffer,
553 key_buffer_size,
554 data,
555 data_size,
556 data_length ) );
557
Steven Cooremanb9b84422020-10-14 14:39:20 +0200558 /* Add cases for opaque driver here */
Ronald Cron67227982020-11-26 15:16:05 +0100559#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200560#if defined(PSA_CRYPTO_DRIVER_TEST)
561 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
Ronald Cron84cc9942020-11-25 14:30:05 +0100562 return( test_opaque_export_public_key( attributes,
563 key_buffer,
564 key_buffer_size,
Steven Cooremanb9b84422020-10-14 14:39:20 +0200565 data,
566 data_size,
567 data_length ) );
568#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100569#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200570 default:
571 /* Key is declared with a lifetime not known to us */
572 return( status );
573 }
Steven Cooremanb9b84422020-10-14 14:39:20 +0200574}
575
Steven Cooreman37941cb2020-07-28 18:49:51 +0200576/*
577 * Cipher functions
578 */
579psa_status_t psa_driver_wrapper_cipher_encrypt(
580 psa_key_slot_t *slot,
581 psa_algorithm_t alg,
582 const uint8_t *input,
583 size_t input_length,
584 uint8_t *output,
585 size_t output_size,
586 size_t *output_length )
587{
588#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
589 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
590 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
591 psa_key_attributes_t attributes = {
592 .core = slot->attr
593 };
594
595 switch( location )
596 {
597 case PSA_KEY_LOCATION_LOCAL_STORAGE:
598 /* Key is stored in the slot in export representation, so
599 * cycle through all known transparent accelerators */
600#if defined(PSA_CRYPTO_DRIVER_TEST)
601 status = test_transparent_cipher_encrypt( &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100602 slot->key.data,
603 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200604 alg,
605 input,
606 input_length,
607 output,
608 output_size,
609 output_length );
610 /* Declared with fallback == true */
611 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200612 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200613#endif /* PSA_CRYPTO_DRIVER_TEST */
614 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200615 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200616 /* Add cases for opaque driver here */
617#if defined(PSA_CRYPTO_DRIVER_TEST)
618 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
619 return( test_opaque_cipher_encrypt( &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100620 slot->key.data,
621 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200622 alg,
623 input,
624 input_length,
625 output,
626 output_size,
627 output_length ) );
628#endif /* PSA_CRYPTO_DRIVER_TEST */
629 default:
630 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200631 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200632 }
633#else /* PSA_CRYPTO_DRIVER_PRESENT */
634 (void) slot;
635 (void) alg;
636 (void) input;
637 (void) input_length;
638 (void) output;
639 (void) output_size;
640 (void) output_length;
641
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200642 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200643#endif /* PSA_CRYPTO_DRIVER_PRESENT */
644}
645
646psa_status_t psa_driver_wrapper_cipher_decrypt(
647 psa_key_slot_t *slot,
648 psa_algorithm_t alg,
649 const uint8_t *input,
650 size_t input_length,
651 uint8_t *output,
652 size_t output_size,
653 size_t *output_length )
654{
655#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
656 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
657 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
658 psa_key_attributes_t attributes = {
659 .core = slot->attr
660 };
661
662 switch( location )
663 {
664 case PSA_KEY_LOCATION_LOCAL_STORAGE:
665 /* Key is stored in the slot in export representation, so
666 * cycle through all known transparent accelerators */
667#if defined(PSA_CRYPTO_DRIVER_TEST)
668 status = test_transparent_cipher_decrypt( &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100669 slot->key.data,
670 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200671 alg,
672 input,
673 input_length,
674 output,
675 output_size,
676 output_length );
677 /* Declared with fallback == true */
678 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200679 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200680#endif /* PSA_CRYPTO_DRIVER_TEST */
681 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200682 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200683 /* Add cases for opaque driver here */
684#if defined(PSA_CRYPTO_DRIVER_TEST)
685 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
686 return( test_opaque_cipher_decrypt( &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100687 slot->key.data,
688 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200689 alg,
690 input,
691 input_length,
692 output,
693 output_size,
694 output_length ) );
695#endif /* PSA_CRYPTO_DRIVER_TEST */
696 default:
697 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200698 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200699 }
700#else /* PSA_CRYPTO_DRIVER_PRESENT */
701 (void) slot;
702 (void) alg;
703 (void) input;
704 (void) input_length;
705 (void) output;
706 (void) output_size;
707 (void) output_length;
708
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200709 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200710#endif /* PSA_CRYPTO_DRIVER_PRESENT */
711}
712
713psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100714 psa_cipher_operation_t *operation,
715 const psa_key_attributes_t *attributes,
716 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200717 psa_algorithm_t alg )
718{
Ronald Cron0b805592020-12-14 18:08:20 +0100719 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Crona4af55f2020-12-14 14:36:06 +0100720 psa_key_location_t location =
721 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200722
Steven Cooreman37941cb2020-07-28 18:49:51 +0200723 switch( location )
724 {
725 case PSA_KEY_LOCATION_LOCAL_STORAGE:
726 /* Key is stored in the slot in export representation, so
727 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100728#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200729#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100730 status = test_transparent_cipher_encrypt_setup(
731 &operation->ctx.transparent_test_driver_ctx,
732 attributes,
733 key_buffer,
734 key_buffer_size,
735 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200736 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200737 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100738 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200739
Ronald Cron0b805592020-12-14 18:08:20 +0100740 if( status != PSA_ERROR_NOT_SUPPORTED )
741 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200742#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100743#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100744#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200745 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100746 status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100747 attributes,
748 key_buffer,
749 key_buffer_size,
750 alg );
751 if( status == PSA_SUCCESS )
Ronald Cron6e412a72021-03-10 09:58:47 +0100752 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Ronald Cron49fafa92021-03-10 08:34:23 +0100753
754 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100755#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
756 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron0b805592020-12-14 18:08:20 +0100757
Steven Cooreman37941cb2020-07-28 18:49:51 +0200758 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100759#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200760#if defined(PSA_CRYPTO_DRIVER_TEST)
761 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100762 status = test_opaque_cipher_encrypt_setup(
763 &operation->ctx.opaque_test_driver_ctx,
764 attributes,
765 key_buffer, key_buffer_size,
766 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200767
Steven Cooreman37941cb2020-07-28 18:49:51 +0200768 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100769 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200770
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200771 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200772#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100773#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200774 default:
775 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100776 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100777 (void)key_buffer;
778 (void)key_buffer_size;
779 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +0200780 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200781 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200782}
783
784psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100785 psa_cipher_operation_t *operation,
786 const psa_key_attributes_t *attributes,
787 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200788 psa_algorithm_t alg )
789{
Steven Cooreman37941cb2020-07-28 18:49:51 +0200790 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Crona4af55f2020-12-14 14:36:06 +0100791 psa_key_location_t location =
792 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200793
Steven Cooreman37941cb2020-07-28 18:49:51 +0200794 switch( location )
795 {
796 case PSA_KEY_LOCATION_LOCAL_STORAGE:
797 /* Key is stored in the slot in export representation, so
798 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100799#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200800#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100801 status = test_transparent_cipher_decrypt_setup(
802 &operation->ctx.transparent_test_driver_ctx,
803 attributes,
804 key_buffer,
805 key_buffer_size,
806 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200807 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200808 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100809 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200810
Ronald Cron0b805592020-12-14 18:08:20 +0100811 if( status != PSA_ERROR_NOT_SUPPORTED )
812 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200813#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100814#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100815#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200816 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100817 status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100818 attributes,
819 key_buffer,
820 key_buffer_size,
821 alg );
822 if( status == PSA_SUCCESS )
823 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
824
825 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100826#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
827 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron49fafa92021-03-10 08:34:23 +0100828
Steven Cooreman37941cb2020-07-28 18:49:51 +0200829 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100830#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200831#if defined(PSA_CRYPTO_DRIVER_TEST)
832 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100833 status = test_opaque_cipher_decrypt_setup(
834 &operation->ctx.opaque_test_driver_ctx,
835 attributes,
836 key_buffer, key_buffer_size,
837 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200838
Steven Cooreman37941cb2020-07-28 18:49:51 +0200839 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100840 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200841
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200842 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200843#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100844#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200845 default:
846 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100847 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100848 (void)key_buffer;
849 (void)key_buffer_size;
850 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +0200851 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200852 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200853}
854
855psa_status_t psa_driver_wrapper_cipher_generate_iv(
Ronald Cron6056fe82020-12-15 13:58:07 +0100856 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200857 uint8_t *iv,
858 size_t iv_size,
859 size_t *iv_length )
860{
Ronald Cron49fafa92021-03-10 08:34:23 +0100861 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200862 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100863#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100864 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100865 return( mbedtls_psa_cipher_generate_iv( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100866 iv,
867 iv_size,
868 iv_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100869#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
870
Ronald Cron49fafa92021-03-10 08:34:23 +0100871#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200872#if defined(PSA_CRYPTO_DRIVER_TEST)
873 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron6056fe82020-12-15 13:58:07 +0100874 return( test_transparent_cipher_generate_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100875 &operation->ctx.transparent_test_driver_ctx,
876 iv, iv_size, iv_length ) );
Ronald Crondd24c9b2020-12-15 14:10:01 +0100877
Steven Cooreman37941cb2020-07-28 18:49:51 +0200878 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron6056fe82020-12-15 13:58:07 +0100879 return( test_opaque_cipher_generate_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100880 &operation->ctx.opaque_test_driver_ctx,
Ronald Cron6056fe82020-12-15 13:58:07 +0100881 iv,
882 iv_size,
883 iv_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200884#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100885#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +0100886 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200887
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100888 (void)iv;
889 (void)iv_size;
890 (void)iv_length;
891
Ronald Crondd24c9b2020-12-15 14:10:01 +0100892 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200893}
894
895psa_status_t psa_driver_wrapper_cipher_set_iv(
Ronald Cron6056fe82020-12-15 13:58:07 +0100896 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200897 const uint8_t *iv,
898 size_t iv_length )
899{
Ronald Cron49fafa92021-03-10 08:34:23 +0100900 switch( operation->id )
901 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100902#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100903 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100904 return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100905 iv,
906 iv_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100907#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100908
909#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200910#if defined(PSA_CRYPTO_DRIVER_TEST)
911 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100912 return( test_transparent_cipher_set_iv(
913 &operation->ctx.transparent_test_driver_ctx,
914 iv, iv_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +0100915
Steven Cooreman37941cb2020-07-28 18:49:51 +0200916 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100917 return( test_opaque_cipher_set_iv(
918 &operation->ctx.opaque_test_driver_ctx,
919 iv, iv_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200920#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100921#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +0100922 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200923
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100924 (void)iv;
925 (void)iv_length;
926
Ronald Crondd24c9b2020-12-15 14:10:01 +0100927 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200928}
929
930psa_status_t psa_driver_wrapper_cipher_update(
Ronald Cron6056fe82020-12-15 13:58:07 +0100931 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200932 const uint8_t *input,
933 size_t input_length,
934 uint8_t *output,
935 size_t output_size,
936 size_t *output_length )
937{
Ronald Cron49fafa92021-03-10 08:34:23 +0100938 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200939 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100940#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100941 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100942 return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100943 input,
944 input_length,
945 output,
946 output_size,
947 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100948#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
949
Ronald Cron49fafa92021-03-10 08:34:23 +0100950#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200951#if defined(PSA_CRYPTO_DRIVER_TEST)
952 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100953 return( test_transparent_cipher_update(
954 &operation->ctx.transparent_test_driver_ctx,
955 input, input_length,
956 output, output_size, output_length ) );
957
Steven Cooreman37941cb2020-07-28 18:49:51 +0200958 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100959 return( test_opaque_cipher_update(
960 &operation->ctx.opaque_test_driver_ctx,
961 input, input_length,
962 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200963#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100964#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +0100965 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200966
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100967 (void)input;
968 (void)input_length;
969 (void)output;
970 (void)output_size;
971 (void)output_length;
972
Ronald Crondd24c9b2020-12-15 14:10:01 +0100973 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200974}
975
976psa_status_t psa_driver_wrapper_cipher_finish(
Ronald Cron6056fe82020-12-15 13:58:07 +0100977 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200978 uint8_t *output,
979 size_t output_size,
980 size_t *output_length )
981{
Ronald Cron49fafa92021-03-10 08:34:23 +0100982 switch( operation->id )
983 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100984#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100985 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100986 return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100987 output,
988 output_size,
989 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100990#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100991
992#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200993#if defined(PSA_CRYPTO_DRIVER_TEST)
994 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100995 return( test_transparent_cipher_finish(
996 &operation->ctx.transparent_test_driver_ctx,
997 output, output_size, output_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +0100998
Steven Cooreman37941cb2020-07-28 18:49:51 +0200999 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001000 return( test_opaque_cipher_finish(
1001 &operation->ctx.opaque_test_driver_ctx,
1002 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001003#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001004#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001005 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001006
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001007 (void)output;
1008 (void)output_size;
1009 (void)output_length;
1010
Ronald Crondd24c9b2020-12-15 14:10:01 +01001011 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001012}
1013
1014psa_status_t psa_driver_wrapper_cipher_abort(
Ronald Cron6056fe82020-12-15 13:58:07 +01001015 psa_cipher_operation_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001016{
Ronald Crondd24c9b2020-12-15 14:10:01 +01001017 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001018
Ronald Cron49fafa92021-03-10 08:34:23 +01001019 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001020 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001021#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001022 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001023 return( mbedtls_psa_cipher_abort( &operation->ctx.mbedtls_ctx ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001024#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron49fafa92021-03-10 08:34:23 +01001025
1026#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001027#if defined(PSA_CRYPTO_DRIVER_TEST)
1028 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001029 status = test_transparent_cipher_abort(
1030 &operation->ctx.transparent_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001031 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001032 &operation->ctx.transparent_test_driver_ctx,
1033 sizeof( operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001034 return( status );
Ronald Cron49fafa92021-03-10 08:34:23 +01001035
Steven Cooreman37941cb2020-07-28 18:49:51 +02001036 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001037 status = test_opaque_cipher_abort(
1038 &operation->ctx.opaque_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001039 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001040 &operation->ctx.opaque_test_driver_ctx,
1041 sizeof( operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001042 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001043#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001044#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001045 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001046
Ronald Cron49fafa92021-03-10 08:34:23 +01001047 (void)status;
Ronald Crondd24c9b2020-12-15 14:10:01 +01001048 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001049}
1050
Steven Cooreman1e582352021-02-18 17:24:37 +01001051/*
1052 * Hashing functions
1053 */
1054psa_status_t psa_driver_wrapper_hash_compute(
1055 psa_algorithm_t alg,
1056 const uint8_t *input,
1057 size_t input_length,
1058 uint8_t *hash,
1059 size_t hash_size,
1060 size_t *hash_length)
1061{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001062 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001063
1064 /* Try accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001065#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001066 status = mbedtls_transparent_test_driver_hash_compute(
1067 alg, input, input_length, hash, hash_size, hash_length );
Steven Cooremanf7638102021-03-04 15:14:36 +01001068 if( status != PSA_ERROR_NOT_SUPPORTED )
1069 return( status );
1070#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001071
1072 /* If software fallback is compiled in, try fallback */
1073#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1074 status = mbedtls_psa_hash_compute( alg, input, input_length,
1075 hash, hash_size, hash_length );
1076 if( status != PSA_ERROR_NOT_SUPPORTED )
1077 return( status );
1078#endif
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001079 (void) status;
1080 (void) alg;
1081 (void) input;
1082 (void) input_length;
1083 (void) hash;
1084 (void) hash_size;
1085 (void) hash_length;
Steven Cooreman1e582352021-02-18 17:24:37 +01001086
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001087 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman1e582352021-02-18 17:24:37 +01001088}
1089
1090psa_status_t psa_driver_wrapper_hash_setup(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001091 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001092 psa_algorithm_t alg )
1093{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001094 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001095
Steven Cooreman1e582352021-02-18 17:24:37 +01001096 /* Try setup on accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001097#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001098 status = mbedtls_transparent_test_driver_hash_setup(
1099 &operation->ctx.test_driver_ctx, alg );
Steven Cooremanf7638102021-03-04 15:14:36 +01001100 if( status == PSA_SUCCESS )
1101 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1102
1103 if( status != PSA_ERROR_NOT_SUPPORTED )
1104 return( status );
1105#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001106
1107 /* If software fallback is compiled in, try fallback */
1108#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001109 status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
Steven Cooreman1e582352021-02-18 17:24:37 +01001110 if( status == PSA_SUCCESS )
Steven Cooreman1e582352021-02-18 17:24:37 +01001111 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Steven Cooreman1e582352021-02-18 17:24:37 +01001112
1113 if( status != PSA_ERROR_NOT_SUPPORTED )
1114 return( status );
1115#endif
1116 /* Nothing left to try if we fall through here */
1117 (void) status;
1118 (void) operation;
1119 (void) alg;
1120 return( PSA_ERROR_NOT_SUPPORTED );
1121}
1122
1123psa_status_t psa_driver_wrapper_hash_clone(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001124 const psa_hash_operation_t *source_operation,
1125 psa_hash_operation_t *target_operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001126{
Steven Cooreman1e582352021-02-18 17:24:37 +01001127 switch( source_operation->id )
1128 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001129#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1130 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1131 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1132 return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1133 &target_operation->ctx.mbedtls_ctx ) );
1134#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001135#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001136 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1137 target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001138 return( mbedtls_transparent_test_driver_hash_clone(
1139 &source_operation->ctx.test_driver_ctx,
1140 &target_operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001141#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001142 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001143 (void) target_operation;
1144 return( PSA_ERROR_BAD_STATE );
1145 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001146}
1147
1148psa_status_t psa_driver_wrapper_hash_update(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001149 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001150 const uint8_t *input,
1151 size_t input_length )
1152{
Steven Cooreman1e582352021-02-18 17:24:37 +01001153 switch( operation->id )
1154 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001155#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1156 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1157 return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
1158 input, input_length ) );
1159#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001160#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001161 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001162 return( mbedtls_transparent_test_driver_hash_update(
1163 &operation->ctx.test_driver_ctx,
1164 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001165#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001166 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001167 (void) input;
1168 (void) input_length;
1169 return( PSA_ERROR_BAD_STATE );
1170 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001171}
1172
1173psa_status_t psa_driver_wrapper_hash_finish(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001174 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001175 uint8_t *hash,
1176 size_t hash_size,
1177 size_t *hash_length )
1178{
Steven Cooreman1e582352021-02-18 17:24:37 +01001179 switch( operation->id )
1180 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001181#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1182 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1183 return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1184 hash, hash_size, hash_length ) );
1185#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001186#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001187 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001188 return( mbedtls_transparent_test_driver_hash_finish(
1189 &operation->ctx.test_driver_ctx,
1190 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001191#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001192 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001193 (void) hash;
1194 (void) hash_size;
1195 (void) hash_length;
1196 return( PSA_ERROR_BAD_STATE );
1197 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001198}
1199
1200psa_status_t psa_driver_wrapper_hash_abort(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001201 psa_hash_operation_t *operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001202{
Steven Cooreman1e582352021-02-18 17:24:37 +01001203 switch( operation->id )
1204 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001205#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1206 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1207 return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1208#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001209#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001210 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001211 return( mbedtls_transparent_test_driver_hash_abort(
1212 &operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001213#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001214 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001215 return( PSA_ERROR_BAD_STATE );
1216 }
1217}
1218
Steven Cooremancd84cb42020-07-16 20:28:36 +02001219/* End of automatically generated file. */