blob: 72077acd39aa67f5b9f032e6c91271ce456e5ec1 [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 Cooreman1e582352021-02-18 17:24:37 +010041/* Auto-generated values depending on which drivers are registered.
42 * ID 0 is reserved for unallocated operations.
43 * ID 1 is reserved for the Mbed TLS software driver. */
Steven Cooreman37941cb2020-07-28 18:49:51 +020044#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman1e582352021-02-18 17:24:37 +010045#define PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID (2)
46#define PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID (3)
Steven Cooreman37941cb2020-07-28 18:49:51 +020047#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman2a1664c2020-07-20 15:33:08 +020048#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */
49
Steven Cooreman1e582352021-02-18 17:24:37 +010050#define PSA_CRYPTO_MBED_TLS_DRIVER_ID (1)
51
Steven Cooreman2a1664c2020-07-20 15:33:08 +020052/* Support the 'old' SE interface when asked to */
Steven Cooreman7a250572020-07-17 16:43:05 +020053#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Steven Cooreman56250fd2020-09-04 13:07:15 +020054/* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style
55 * SE driver is present, to avoid unused argument errors at compile time. */
56#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020057#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020058#endif
Steven Cooreman7a250572020-07-17 16:43:05 +020059#include "psa_crypto_se.h"
60#endif
61
Steven Cooreman1e582352021-02-18 17:24:37 +010062/* Include software fallback when present */
63#include "psa_crypto_hash.h"
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(
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200714 psa_operation_driver_context_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200715 psa_key_slot_t *slot,
716 psa_algorithm_t alg )
717{
718#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
719 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
720 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
721 psa_key_attributes_t attributes = {
722 .core = slot->attr
723 };
724
Steven Cooreman37941cb2020-07-28 18:49:51 +0200725 switch( location )
726 {
727 case PSA_KEY_LOCATION_LOCAL_STORAGE:
728 /* Key is stored in the slot in export representation, so
729 * cycle through all known transparent accelerators */
730#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200731 operation->ctx = mbedtls_calloc( 1, sizeof(test_transparent_cipher_operation_t) );
732 if( operation->ctx == NULL )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200733 return PSA_ERROR_INSUFFICIENT_MEMORY;
734
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200735 status = test_transparent_cipher_encrypt_setup( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200736 &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100737 slot->key.data,
738 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200739 alg );
740 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200741 if( status == PSA_SUCCESS )
742 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200743 else
744 {
Steven Cooremancfeea8f2020-09-09 15:09:18 +0200745 mbedtls_platform_zeroize(
746 operation->ctx,
747 sizeof( test_transparent_cipher_operation_t ) );
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200748 mbedtls_free( operation->ctx );
749 operation->ctx = NULL;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200750 }
Steven Cooreman150c99b2020-09-09 14:32:44 +0200751
752 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200753#endif /* PSA_CRYPTO_DRIVER_TEST */
754 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200755 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200756 /* Add cases for opaque driver here */
757#if defined(PSA_CRYPTO_DRIVER_TEST)
758 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200759 operation->ctx = mbedtls_calloc( 1, sizeof(test_opaque_cipher_operation_t) );
760 if( operation->ctx == NULL )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200761 return( PSA_ERROR_INSUFFICIENT_MEMORY );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200762
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200763 status = test_opaque_cipher_encrypt_setup( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200764 &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100765 slot->key.data,
766 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200767 alg );
768 if( status == PSA_SUCCESS )
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200769 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200770 else
771 {
Steven Cooremancfeea8f2020-09-09 15:09:18 +0200772 mbedtls_platform_zeroize(
773 operation->ctx,
774 sizeof( test_opaque_cipher_operation_t ) );
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200775 mbedtls_free( operation->ctx );
776 operation->ctx = NULL;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200777 }
778
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200779 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200780#endif /* PSA_CRYPTO_DRIVER_TEST */
781 default:
782 /* Key is declared with a lifetime not known to us */
John Durkop714e3a12020-09-29 22:07:04 -0700783 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200784 }
785#else /* PSA_CRYPTO_DRIVER_PRESENT */
786 (void)slot;
787 (void)alg;
788 (void)operation;
789
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200790 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200791#endif /* PSA_CRYPTO_DRIVER_PRESENT */
792}
793
794psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200795 psa_operation_driver_context_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200796 psa_key_slot_t *slot,
797 psa_algorithm_t alg )
798{
799#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
800 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
801 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
802 psa_key_attributes_t attributes = {
803 .core = slot->attr
804 };
805
Steven Cooreman37941cb2020-07-28 18:49:51 +0200806 switch( location )
807 {
808 case PSA_KEY_LOCATION_LOCAL_STORAGE:
809 /* Key is stored in the slot in export representation, so
810 * cycle through all known transparent accelerators */
811#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200812 operation->ctx = mbedtls_calloc( 1, sizeof(test_transparent_cipher_operation_t) );
813 if( operation->ctx == NULL )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200814 return( PSA_ERROR_INSUFFICIENT_MEMORY );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200815
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200816 status = test_transparent_cipher_decrypt_setup( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200817 &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100818 slot->key.data,
819 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200820 alg );
821 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200822 if( status == PSA_SUCCESS )
823 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200824 else
825 {
Steven Cooremancfeea8f2020-09-09 15:09:18 +0200826 mbedtls_platform_zeroize(
827 operation->ctx,
828 sizeof( test_transparent_cipher_operation_t ) );
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200829 mbedtls_free( operation->ctx );
830 operation->ctx = NULL;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200831 }
Steven Cooreman150c99b2020-09-09 14:32:44 +0200832
833 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200834#endif /* PSA_CRYPTO_DRIVER_TEST */
835 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200836 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200837 /* Add cases for opaque driver here */
838#if defined(PSA_CRYPTO_DRIVER_TEST)
839 case PSA_CRYPTO_TEST_DRIVER_LIFETIME:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200840 operation->ctx = mbedtls_calloc( 1, sizeof(test_opaque_cipher_operation_t) );
841 if( operation->ctx == NULL )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200842 return PSA_ERROR_INSUFFICIENT_MEMORY;
843
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200844 status = test_opaque_cipher_decrypt_setup( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200845 &attributes,
Ronald Cronea0f8a62020-11-25 17:52:23 +0100846 slot->key.data,
847 slot->key.bytes,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200848 alg );
849 if( status == PSA_SUCCESS )
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200850 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200851 else
852 {
Steven Cooremancfeea8f2020-09-09 15:09:18 +0200853 mbedtls_platform_zeroize(
854 operation->ctx,
855 sizeof( test_opaque_cipher_operation_t ) );
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200856 mbedtls_free( operation->ctx );
857 operation->ctx = NULL;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200858 }
859
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200860 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200861#endif /* PSA_CRYPTO_DRIVER_TEST */
862 default:
863 /* Key is declared with a lifetime not known to us */
John Durkop814dca72020-10-05 06:31:12 -0700864 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200865 }
866#else /* PSA_CRYPTO_DRIVER_PRESENT */
867 (void)slot;
868 (void)alg;
869 (void)operation;
870
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200871 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200872#endif /* PSA_CRYPTO_DRIVER_PRESENT */
873}
874
875psa_status_t psa_driver_wrapper_cipher_generate_iv(
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200876 psa_operation_driver_context_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200877 uint8_t *iv,
878 size_t iv_size,
879 size_t *iv_length )
880{
881#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200882 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200883 {
884#if defined(PSA_CRYPTO_DRIVER_TEST)
885 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200886 return( test_transparent_cipher_generate_iv( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200887 iv,
888 iv_size,
889 iv_length ) );
890#endif /* PSA_CRYPTO_DRIVER_TEST */
891#if defined(PSA_CRYPTO_DRIVER_TEST)
892 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200893 return( test_opaque_cipher_generate_iv( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200894 iv,
895 iv_size,
896 iv_length ) );
897#endif /* PSA_CRYPTO_DRIVER_TEST */
898 default:
899 /* Key is attached to a driver not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200900 return( PSA_ERROR_BAD_STATE );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200901 }
902#else /* PSA_CRYPTO_DRIVER_PRESENT */
903 (void) operation;
904 (void) iv;
905 (void) iv_size;
906 (void) iv_length;
907
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200908 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200909#endif /* PSA_CRYPTO_DRIVER_PRESENT */
910}
911
912psa_status_t psa_driver_wrapper_cipher_set_iv(
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200913 psa_operation_driver_context_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200914 const uint8_t *iv,
915 size_t iv_length )
916{
917#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200918 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200919 {
920#if defined(PSA_CRYPTO_DRIVER_TEST)
921 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200922 return( test_transparent_cipher_set_iv( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200923 iv,
924 iv_length ) );
925#endif /* PSA_CRYPTO_DRIVER_TEST */
926#if defined(PSA_CRYPTO_DRIVER_TEST)
927 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200928 return( test_opaque_cipher_set_iv( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200929 iv,
930 iv_length ) );
931#endif /* PSA_CRYPTO_DRIVER_TEST */
932 default:
933 /* Key is attached to a driver not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200934 return( PSA_ERROR_BAD_STATE );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200935 }
936#else /* PSA_CRYPTO_DRIVER_PRESENT */
937 (void) operation;
938 (void) iv;
939 (void) iv_length;
940
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200941 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200942#endif /* PSA_CRYPTO_DRIVER_PRESENT */
943}
944
945psa_status_t psa_driver_wrapper_cipher_update(
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200946 psa_operation_driver_context_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200947 const uint8_t *input,
948 size_t input_length,
949 uint8_t *output,
950 size_t output_size,
951 size_t *output_length )
952{
953#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200954 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200955 {
956#if defined(PSA_CRYPTO_DRIVER_TEST)
957 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200958 return( test_transparent_cipher_update( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200959 input,
960 input_length,
961 output,
962 output_size,
963 output_length ) );
964#endif /* PSA_CRYPTO_DRIVER_TEST */
965#if defined(PSA_CRYPTO_DRIVER_TEST)
966 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200967 return( test_opaque_cipher_update( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200968 input,
969 input_length,
970 output,
971 output_size,
972 output_length ) );
973#endif /* PSA_CRYPTO_DRIVER_TEST */
974 default:
975 /* Key is attached to a driver not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200976 return( PSA_ERROR_BAD_STATE );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200977 }
978#else /* PSA_CRYPTO_DRIVER_PRESENT */
979 (void) operation;
980 (void) input;
981 (void) input_length;
982 (void) output;
983 (void) output_length;
984 (void) output_size;
985
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200986 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200987#endif /* PSA_CRYPTO_DRIVER_PRESENT */
988}
989
990psa_status_t psa_driver_wrapper_cipher_finish(
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200991 psa_operation_driver_context_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200992 uint8_t *output,
993 size_t output_size,
994 size_t *output_length )
995{
996#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanfb81aa52020-09-09 12:01:43 +0200997 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200998 {
999#if defined(PSA_CRYPTO_DRIVER_TEST)
1000 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001001 return( test_transparent_cipher_finish( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001002 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_finish( operation->ctx,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001009 output,
1010 output_size,
1011 output_length ) );
1012#endif /* PSA_CRYPTO_DRIVER_TEST */
1013 default:
1014 /* Key is attached to a driver not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001015 return( PSA_ERROR_BAD_STATE );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001016 }
1017#else /* PSA_CRYPTO_DRIVER_PRESENT */
1018 (void) operation;
1019 (void) output;
1020 (void) output_size;
1021 (void) output_length;
1022
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001023 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001024#endif /* PSA_CRYPTO_DRIVER_PRESENT */
1025}
1026
1027psa_status_t psa_driver_wrapper_cipher_abort(
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001028 psa_operation_driver_context_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001029{
1030#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1031 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001032
1033 /* The object has (apparently) been initialized but it is not in use. It's
1034 * ok to call abort on such an object, and there's nothing to do. */
1035 if( operation->ctx == NULL && operation->id == 0 )
1036 return( PSA_SUCCESS );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001037
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 status = test_transparent_cipher_abort( operation->ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001043 mbedtls_platform_zeroize(
1044 operation->ctx,
1045 sizeof( test_transparent_cipher_operation_t ) );
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001046 mbedtls_free( operation->ctx );
1047 operation->ctx = NULL;
1048 operation->id = 0;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001049
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001050 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001051#endif /* PSA_CRYPTO_DRIVER_TEST */
1052#if defined(PSA_CRYPTO_DRIVER_TEST)
1053 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001054 status = test_opaque_cipher_abort( operation->ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001055 mbedtls_platform_zeroize(
1056 operation->ctx,
1057 sizeof( test_opaque_cipher_operation_t ) );
Steven Cooremanfb81aa52020-09-09 12:01:43 +02001058 mbedtls_free( operation->ctx );
1059 operation->ctx = NULL;
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001060 operation->id = 0;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001061
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001062 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001063#endif /* PSA_CRYPTO_DRIVER_TEST */
1064 default:
1065 /* Operation is attached to a driver not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001066 return( PSA_ERROR_BAD_STATE );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001067 }
1068#else /* PSA_CRYPTO_DRIVER_PRESENT */
1069 (void)operation;
1070
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001071 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001072#endif /* PSA_CRYPTO_DRIVER_PRESENT */
1073}
1074
Steven Cooreman1e582352021-02-18 17:24:37 +01001075/*
1076 * Hashing functions
1077 */
1078psa_status_t psa_driver_wrapper_hash_compute(
1079 psa_algorithm_t alg,
1080 const uint8_t *input,
1081 size_t input_length,
1082 uint8_t *hash,
1083 size_t hash_size,
1084 size_t *hash_length)
1085{
1086 psa_status_t status = PSA_ERROR_NOT_SUPPORTED;
1087
1088 /* Try accelerators first */
1089
1090 /* If software fallback is compiled in, try fallback */
1091#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1092 status = mbedtls_psa_hash_compute( alg, input, input_length,
1093 hash, hash_size, hash_length );
1094 if( status != PSA_ERROR_NOT_SUPPORTED )
1095 return( status );
1096#endif
1097 if( status == PSA_ERROR_NOT_SUPPORTED )
1098 {
1099 (void) alg;
1100 (void) input;
1101 (void) input_length;
1102 (void) hash;
1103 (void) hash_size;
1104 (void) hash_length;
1105
1106 return( PSA_ERROR_NOT_SUPPORTED );
1107 }
1108 return( status );
1109}
1110
1111psa_status_t psa_driver_wrapper_hash_setup(
1112 psa_operation_driver_context_t *operation,
1113 psa_algorithm_t alg )
1114{
1115 psa_status_t status = PSA_ERROR_NOT_SUPPORTED;
1116
1117 /* A context must be freshly initialized before it can be set up. */
1118 if( operation->id != 0 || operation->ctx != NULL )
1119 return( PSA_ERROR_BAD_STATE );
1120
1121 /* Try setup on accelerators first */
1122
1123 /* If software fallback is compiled in, try fallback */
1124#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1125 operation->ctx = mbedtls_calloc( 1, sizeof(mbedtls_psa_hash_operation_t) );
1126 status = mbedtls_psa_hash_setup( operation->ctx, alg );
1127 if( status == PSA_SUCCESS )
1128 {
1129 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1130 }
1131 else
1132 {
1133 mbedtls_free( operation->ctx );
1134 operation->ctx = NULL;
1135 operation->id = 0;
1136 }
1137
1138 if( status != PSA_ERROR_NOT_SUPPORTED )
1139 return( status );
1140#endif
1141 /* Nothing left to try if we fall through here */
1142 (void) status;
1143 (void) operation;
1144 (void) alg;
1145 return( PSA_ERROR_NOT_SUPPORTED );
1146}
1147
1148psa_status_t psa_driver_wrapper_hash_clone(
1149 const psa_operation_driver_context_t *source_operation,
1150 psa_operation_driver_context_t *target_operation )
1151{
1152 psa_status_t status = PSA_ERROR_NOT_SUPPORTED;
1153
1154 if( source_operation->ctx == NULL || source_operation->id == 0 )
1155 return( PSA_ERROR_BAD_STATE );
1156 if( target_operation->ctx != NULL || target_operation->id != 0 )
1157 return( PSA_ERROR_BAD_STATE );
1158
1159 switch( source_operation->id )
1160 {
1161#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1162 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1163 target_operation->ctx = mbedtls_calloc( 1, sizeof(mbedtls_psa_hash_operation_t) );
1164 if( target_operation->ctx == NULL )
1165 {
1166 status = PSA_ERROR_INSUFFICIENT_MEMORY;
1167 break;
1168 }
1169 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1170 status = mbedtls_psa_hash_clone( source_operation->ctx,
1171 target_operation->ctx );
1172 break;
1173#endif
1174 default:
1175 (void) status;
1176 (void) source_operation;
1177 (void) target_operation;
1178 return( PSA_ERROR_BAD_STATE );
1179 }
1180
1181 if( status != PSA_SUCCESS )
1182 psa_driver_wrapper_hash_abort( target_operation );
1183 return( status );
1184}
1185
1186psa_status_t psa_driver_wrapper_hash_update(
1187 psa_operation_driver_context_t *operation,
1188 const uint8_t *input,
1189 size_t input_length )
1190{
1191 psa_status_t status = PSA_ERROR_NOT_SUPPORTED;
1192
1193 if( operation->ctx == NULL || operation->id == 0 )
1194 return( PSA_ERROR_BAD_STATE );
1195
1196 switch( operation->id )
1197 {
1198#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1199 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1200 status = mbedtls_psa_hash_update( operation->ctx,
1201 input, input_length );
1202 break;
1203#endif
1204 default:
1205 (void) status;
1206 (void) operation;
1207 (void) input;
1208 (void) input_length;
1209 return( PSA_ERROR_BAD_STATE );
1210 }
1211
1212 if( status != PSA_SUCCESS )
1213 psa_driver_wrapper_hash_abort( operation );
1214 return( status );
1215}
1216
1217psa_status_t psa_driver_wrapper_hash_finish(
1218 psa_operation_driver_context_t *operation,
1219 uint8_t *hash,
1220 size_t hash_size,
1221 size_t *hash_length )
1222{
1223 psa_status_t status = PSA_ERROR_NOT_SUPPORTED;
1224
1225 if( operation->ctx == NULL || operation->id == 0 )
1226 return( PSA_ERROR_BAD_STATE );
1227
1228 switch( operation->id )
1229 {
1230#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1231 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1232 status = mbedtls_psa_hash_finish( operation->ctx,
1233 hash, hash_size, hash_length );
1234 break;
1235#endif
1236 default:
1237 (void) status;
1238 (void) operation;
1239 (void) hash;
1240 (void) hash_size;
1241 (void) hash_length;
1242 return( PSA_ERROR_BAD_STATE );
1243 }
1244
1245 psa_driver_wrapper_hash_abort( operation );
1246 return( status );
1247}
1248
1249psa_status_t psa_driver_wrapper_hash_abort(
1250 psa_operation_driver_context_t *operation )
1251{
1252 psa_status_t status = PSA_ERROR_NOT_SUPPORTED;
1253
1254 switch( operation->id )
1255 {
1256 case 0:
1257 if( operation->ctx == NULL )
1258 return( PSA_SUCCESS );
1259 else
1260 return( PSA_ERROR_BAD_STATE );
1261#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1262 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1263 if( operation->ctx != NULL )
1264 {
1265 status = mbedtls_psa_hash_abort( operation->ctx );
1266 mbedtls_free( operation->ctx );
1267 operation->ctx = NULL;
1268 }
1269 operation->id = 0;
1270 return( PSA_SUCCESS );
1271#endif
1272 default:
1273 (void) status;
1274 return( PSA_ERROR_BAD_STATE );
1275 }
1276}
1277
Steven Cooremancd84cb42020-07-16 20:28:36 +02001278/* End of automatically generated file. */