blob: 59a00a6cfd8591333fa092968b2b341b85498533 [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 Cronde822812021-03-17 16:08:20 +010022#include "psa_crypto_aead.h"
Ronald Cron0b805592020-12-14 18:08:20 +010023#include "psa_crypto_cipher.h"
Steven Cooremancd84cb42020-07-16 20:28:36 +020024#include "psa_crypto_core.h"
25#include "psa_crypto_driver_wrappers.h"
Steven Cooreman830aff22021-03-09 09:50:44 +010026#include "psa_crypto_hash.h"
Steven Cooremand13a70f2021-03-19 15:24:23 +010027#include "psa_crypto_mac.h"
Steven Cooreman830aff22021-03-09 09:50:44 +010028
Steven Cooreman2a1664c2020-07-20 15:33:08 +020029#include "mbedtls/platform.h"
30
31#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS)
Steven Cooremancd84cb42020-07-16 20:28:36 +020032
33/* Include test driver definition when running tests */
Steven Cooremanf1720ea2020-07-24 18:41:58 +020034#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman56250fd2020-09-04 13:07:15 +020035#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020036#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020037#endif
38#ifndef PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020039#define PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020040#endif
Ronald Cronce1d8d22021-04-30 17:00:34 +020041#include "test/drivers/test_driver.h"
Steven Cooremanf1720ea2020-07-24 18:41:58 +020042#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooremancd84cb42020-07-16 20:28:36 +020043
Steven Cooreman56250fd2020-09-04 13:07:15 +020044/* Repeat above block for each JSON-declared driver during autogeneration */
Steven Cooremanaa87fd02021-03-15 18:54:03 +010045#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */
Steven Cooreman56250fd2020-09-04 13:07:15 +020046
Steven Cooreman1e582352021-02-18 17:24:37 +010047/* Auto-generated values depending on which drivers are registered.
48 * ID 0 is reserved for unallocated operations.
49 * ID 1 is reserved for the Mbed TLS software driver. */
Steven Cooreman830aff22021-03-09 09:50:44 +010050#define PSA_CRYPTO_MBED_TLS_DRIVER_ID (1)
51
Steven Cooreman37941cb2020-07-28 18:49:51 +020052#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman1e582352021-02-18 17:24:37 +010053#define PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID (2)
54#define PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID (3)
Steven Cooreman37941cb2020-07-28 18:49:51 +020055#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman2a1664c2020-07-20 15:33:08 +020056
57/* Support the 'old' SE interface when asked to */
Steven Cooreman7a250572020-07-17 16:43:05 +020058#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Steven Cooreman56250fd2020-09-04 13:07:15 +020059/* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style
60 * SE driver is present, to avoid unused argument errors at compile time. */
61#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020062#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020063#endif
Steven Cooreman7a250572020-07-17 16:43:05 +020064#include "psa_crypto_se.h"
65#endif
66
Steven Cooremancd84cb42020-07-16 20:28:36 +020067/* Start delegation functions */
Ronald Cron9f17aa42020-12-08 17:07:25 +010068psa_status_t psa_driver_wrapper_sign_hash(
69 const psa_key_attributes_t *attributes,
70 const uint8_t *key_buffer, size_t key_buffer_size,
71 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
72 uint8_t *signature, size_t signature_size, size_t *signature_length )
Steven Cooremancd84cb42020-07-16 20:28:36 +020073{
Steven Cooreman7a250572020-07-17 16:43:05 +020074 /* Try dynamically-registered SE interface first */
75#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
76 const psa_drv_se_t *drv;
77 psa_drv_se_context_t *drv_context;
78
Ronald Cron9f17aa42020-12-08 17:07:25 +010079 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman7a250572020-07-17 16:43:05 +020080 {
81 if( drv->asymmetric == NULL ||
82 drv->asymmetric->p_sign == NULL )
83 {
84 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +020085 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman7a250572020-07-17 16:43:05 +020086 }
Ronald Cron9f17aa42020-12-08 17:07:25 +010087 return( drv->asymmetric->p_sign(
88 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
89 alg, hash, hash_length,
90 signature, signature_size, signature_length ) );
Steven Cooreman7a250572020-07-17 16:43:05 +020091 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +020092#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman7a250572020-07-17 16:43:05 +020093
Ronald Cronfce9df22020-12-08 18:06:03 +010094 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +010095 psa_key_location_t location =
96 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooremancd84cb42020-07-16 20:28:36 +020097
98 switch( location )
99 {
100 case PSA_KEY_LOCATION_LOCAL_STORAGE:
101 /* Key is stored in the slot in export representation, so
102 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100103#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200104#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200105 status = mbedtls_test_transparent_signature_sign_hash( attributes,
Ronald Cron9f17aa42020-12-08 17:07:25 +0100106 key_buffer,
107 key_buffer_size,
Steven Cooremancd84cb42020-07-16 20:28:36 +0200108 alg,
109 hash,
110 hash_length,
111 signature,
112 signature_size,
113 signature_length );
114 /* Declared with fallback == true */
115 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200116 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200117#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100118#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200119 /* Fell through, meaning no accelerator supports this operation */
Ronald Cronfce9df22020-12-08 18:06:03 +0100120 return( psa_sign_hash_internal( attributes,
121 key_buffer,
122 key_buffer_size,
123 alg,
124 hash,
125 hash_length,
126 signature,
127 signature_size,
128 signature_length ) );
129
Steven Cooremancd84cb42020-07-16 20:28:36 +0200130 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100131#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200132#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100133 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200134 return( mbedtls_test_opaque_signature_sign_hash( attributes,
135 key_buffer,
136 key_buffer_size,
137 alg,
138 hash,
139 hash_length,
140 signature,
141 signature_size,
142 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200143#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100144#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200145 default:
146 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100147 (void)status;
148 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200149 }
Steven Cooremancd84cb42020-07-16 20:28:36 +0200150}
151
Ronald Cron9f17aa42020-12-08 17:07:25 +0100152psa_status_t psa_driver_wrapper_verify_hash(
153 const psa_key_attributes_t *attributes,
154 const uint8_t *key_buffer, size_t key_buffer_size,
155 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
156 const uint8_t *signature, size_t signature_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200157{
Steven Cooreman55ae2172020-07-17 19:46:15 +0200158 /* Try dynamically-registered SE interface first */
159#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
160 const psa_drv_se_t *drv;
161 psa_drv_se_context_t *drv_context;
162
Ronald Cron9f17aa42020-12-08 17:07:25 +0100163 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200164 {
165 if( drv->asymmetric == NULL ||
166 drv->asymmetric->p_verify == NULL )
167 {
168 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200169 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200170 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100171 return( drv->asymmetric->p_verify(
172 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
173 alg, hash, hash_length,
174 signature, signature_length ) );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200175 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200176#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200177
Ronald Cronfce9df22020-12-08 18:06:03 +0100178 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100179 psa_key_location_t location =
180 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200181
182 switch( location )
183 {
184 case PSA_KEY_LOCATION_LOCAL_STORAGE:
185 /* Key is stored in the slot in export representation, so
186 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100187#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200188#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200189 status = mbedtls_test_transparent_signature_verify_hash(
190 attributes,
191 key_buffer,
192 key_buffer_size,
193 alg,
194 hash,
195 hash_length,
196 signature,
197 signature_length );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200198 /* Declared with fallback == true */
199 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200200 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200201#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100202#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
203
204 return( psa_verify_hash_internal( attributes,
205 key_buffer,
206 key_buffer_size,
207 alg,
208 hash,
209 hash_length,
210 signature,
211 signature_length ) );
212
Steven Cooreman55ae2172020-07-17 19:46:15 +0200213 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100214#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200215#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100216 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200217 return( mbedtls_test_opaque_signature_verify_hash( attributes,
218 key_buffer,
219 key_buffer_size,
220 alg,
221 hash,
222 hash_length,
223 signature,
224 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200225#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100226#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200227 default:
228 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100229 (void)status;
230 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200231 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200232}
233
Steven Cooremanb938b0b2021-04-06 13:08:42 +0200234/** Get the key buffer size required to store the key material of a key
235 * associated with an opaque driver without storage.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200236 *
Ronald Cron31216282020-12-05 18:47:56 +0100237 * \param[in] attributes The key attributes.
238 * \param[out] key_buffer_size Minimum buffer size to contain the key material
Steven Cooreman56250fd2020-09-04 13:07:15 +0200239 *
240 * \retval #PSA_SUCCESS
Ronald Cron31216282020-12-05 18:47:56 +0100241 * The minimum size for a buffer to contain the key material has been
242 * returned successfully.
243 * \retval #PSA_ERROR_INVALID_ARGUMENT
244 * The size in bits of the key is not valid.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200245 * \retval #PSA_ERROR_NOT_SUPPORTED
Ronald Cron31216282020-12-05 18:47:56 +0100246 * The type and/or the size in bits of the key or the combination of
247 * the two is not supported.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200248 */
Ronald Cron9df74be2020-12-05 19:15:23 +0100249psa_status_t psa_driver_wrapper_get_key_buffer_size(
Ronald Cron31216282020-12-05 18:47:56 +0100250 const psa_key_attributes_t *attributes,
251 size_t *key_buffer_size )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200252{
John Durkop2c618352020-09-22 06:54:01 -0700253 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
254 psa_key_type_t key_type = attributes->core.type;
255 size_t key_bits = attributes->core.bits;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200256
Ronald Cron31216282020-12-05 18:47:56 +0100257 *key_buffer_size = 0;
John Durkop2c618352020-09-22 06:54:01 -0700258 switch( location )
259 {
John Durkop2c618352020-09-22 06:54:01 -0700260#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100261 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100262#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS)
263 /* Emulate property 'builtin_key_size' */
264 if( psa_key_id_is_builtin(
265 MBEDTLS_SVC_KEY_ID_GET_KEY_ID(
266 psa_get_key_id( attributes ) ) ) )
267 {
Steven Cooreman203bcbb2021-03-18 17:17:40 +0100268 *key_buffer_size = sizeof( psa_drv_slot_number_t );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100269 return( PSA_SUCCESS );
270 }
271#endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */
Ronald Cron7f13fa22021-04-13 12:41:34 +0200272 *key_buffer_size = mbedtls_test_size_function( key_type, key_bits );
Ronald Cron4607c822021-04-14 10:55:34 +0200273 return( ( *key_buffer_size != 0 ) ?
274 PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED );
John Durkop2c618352020-09-22 06:54:01 -0700275#endif /* PSA_CRYPTO_DRIVER_TEST */
276
277 default:
Ronald Cron9df74be2020-12-05 19:15:23 +0100278 (void)key_type;
279 (void)key_bits;
Steven Cooreman56250fd2020-09-04 13:07:15 +0200280 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200281 }
282}
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200283
Ronald Cron977c2472020-10-13 08:32:21 +0200284psa_status_t psa_driver_wrapper_generate_key(
285 const psa_key_attributes_t *attributes,
286 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200287{
Ronald Cron977c2472020-10-13 08:32:21 +0200288 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
289 psa_key_location_t location =
290 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
291
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200292 /* Try dynamically-registered SE interface first */
293#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
294 const psa_drv_se_t *drv;
295 psa_drv_se_context_t *drv_context;
296
Ronald Cron977c2472020-10-13 08:32:21 +0200297 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200298 {
299 size_t pubkey_length = 0; /* We don't support this feature yet */
300 if( drv->key_management == NULL ||
301 drv->key_management->p_generate == NULL )
302 {
303 /* Key is defined as being in SE, but we have no way to generate it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200304 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200305 }
306 return( drv->key_management->p_generate(
Ronald Cron977c2472020-10-13 08:32:21 +0200307 drv_context,
308 *( (psa_key_slot_number_t *)key_buffer ),
Ronald Cronea0f8a62020-11-25 17:52:23 +0100309 attributes, NULL, 0, &pubkey_length ) );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200310 }
311#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
312
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200313 switch( location )
314 {
315 case PSA_KEY_LOCATION_LOCAL_STORAGE:
Ronald Cron977c2472020-10-13 08:32:21 +0200316#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200317 /* Transparent drivers are limited to generating asymmetric keys */
Ronald Cron977c2472020-10-13 08:32:21 +0200318 if( PSA_KEY_TYPE_IS_ASYMMETRIC( attributes->core.type ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200319 {
Ronald Cron977c2472020-10-13 08:32:21 +0200320 /* Cycle through all known transparent accelerators */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200321#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200322 status = mbedtls_test_transparent_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200323 attributes, key_buffer, key_buffer_size,
324 key_buffer_length );
325 /* Declared with fallback == true */
326 if( status != PSA_ERROR_NOT_SUPPORTED )
327 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200328#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200329 }
330#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
331
332 /* Software fallback */
333 status = psa_generate_key_internal(
334 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200335 break;
Ronald Cron977c2472020-10-13 08:32:21 +0200336
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200337 /* Add cases for opaque driver here */
Ronald Cron977c2472020-10-13 08:32:21 +0200338#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200339#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100340 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200341 status = mbedtls_test_opaque_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200342 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200343 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200344#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200345#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
346
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200347 default:
348 /* Key is declared with a lifetime not known to us */
349 status = PSA_ERROR_INVALID_ARGUMENT;
350 break;
351 }
352
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200353 return( status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200354}
355
Ronald Cron83282872020-11-22 14:02:39 +0100356psa_status_t psa_driver_wrapper_import_key(
357 const psa_key_attributes_t *attributes,
358 const uint8_t *data,
359 size_t data_length,
360 uint8_t *key_buffer,
361 size_t key_buffer_size,
362 size_t *key_buffer_length,
363 size_t *bits )
Steven Cooreman04524762020-10-13 17:43:44 +0200364{
Steven Cooreman04524762020-10-13 17:43:44 +0200365 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cronbf33c932020-11-28 18:06:53 +0100366 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
367 psa_get_key_lifetime( attributes ) );
Steven Cooreman04524762020-10-13 17:43:44 +0200368
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100369 /* Try dynamically-registered SE interface first */
370#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
371 const psa_drv_se_t *drv;
372 psa_drv_se_context_t *drv_context;
373
374 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
375 {
376 if( drv->key_management == NULL ||
377 drv->key_management->p_import == NULL )
378 return( PSA_ERROR_NOT_SUPPORTED );
379
380 /* The driver should set the number of key bits, however in
381 * case it doesn't, we initialize bits to an invalid value. */
382 *bits = PSA_MAX_KEY_BITS + 1;
383 status = drv->key_management->p_import(
384 drv_context,
385 *( (psa_key_slot_number_t *)key_buffer ),
386 attributes, data, data_length, bits );
387
388 if( status != PSA_SUCCESS )
389 return( status );
390
391 if( (*bits) > PSA_MAX_KEY_BITS )
392 return( PSA_ERROR_NOT_SUPPORTED );
393
394 return( PSA_SUCCESS );
395 }
396#endif /* PSA_CRYPTO_SE_C */
397
Ronald Cronbf33c932020-11-28 18:06:53 +0100398 switch( location )
399 {
400 case PSA_KEY_LOCATION_LOCAL_STORAGE:
401 /* Key is stored in the slot in export representation, so
402 * cycle through all known transparent accelerators */
403#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
404#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200405 status = mbedtls_test_transparent_import_key(
406 attributes,
407 data, data_length,
408 key_buffer, key_buffer_size,
409 key_buffer_length, bits );
Ronald Cronbf33c932020-11-28 18:06:53 +0100410 /* Declared with fallback == true */
411 if( status != PSA_ERROR_NOT_SUPPORTED )
412 return( status );
413#endif /* PSA_CRYPTO_DRIVER_TEST */
414#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
415 /* Fell through, meaning no accelerator supports this operation */
416 return( psa_import_key_into_slot( attributes,
417 data, data_length,
418 key_buffer, key_buffer_size,
419 key_buffer_length, bits ) );
420
421 default:
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100422 /* Importing a key with external storage in not yet supported.
423 * Return in error indicating that the lifetime is not valid. */
Ronald Cronbf33c932020-11-28 18:06:53 +0100424 (void)status;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100425 return( PSA_ERROR_INVALID_ARGUMENT );
Ronald Cronbf33c932020-11-28 18:06:53 +0100426 }
427
Steven Cooreman04524762020-10-13 17:43:44 +0200428}
429
Ronald Cron67227982020-11-26 15:16:05 +0100430psa_status_t psa_driver_wrapper_export_key(
431 const psa_key_attributes_t *attributes,
432 const uint8_t *key_buffer, size_t key_buffer_size,
433 uint8_t *data, size_t data_size, size_t *data_length )
434
435{
436 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
437 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
438 psa_get_key_lifetime( attributes ) );
439
Ronald Cron152e3f82020-11-26 16:06:41 +0100440 /* Try dynamically-registered SE interface first */
441#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
442 const psa_drv_se_t *drv;
443 psa_drv_se_context_t *drv_context;
444
445 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
446 {
447 if( ( drv->key_management == NULL ) ||
448 ( drv->key_management->p_export == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100449 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100450 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100451 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100452
453 return( drv->key_management->p_export(
454 drv_context,
455 *( (psa_key_slot_number_t *)key_buffer ),
456 data, data_size, data_length ) );
457 }
458#endif /* PSA_CRYPTO_SE_C */
459
Ronald Cron67227982020-11-26 15:16:05 +0100460 switch( location )
461 {
462 case PSA_KEY_LOCATION_LOCAL_STORAGE:
463 return( psa_export_key_internal( attributes,
464 key_buffer,
465 key_buffer_size,
466 data,
467 data_size,
468 data_length ) );
469
470 /* Add cases for opaque driver here */
471#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
472#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100473 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200474 return( mbedtls_test_opaque_export_key( attributes,
475 key_buffer,
476 key_buffer_size,
477 data,
478 data_size,
479 data_length ) );
Ronald Cron67227982020-11-26 15:16:05 +0100480#endif /* PSA_CRYPTO_DRIVER_TEST */
481#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
482 default:
483 /* Key is declared with a lifetime not known to us */
484 return( status );
485 }
486}
487
Ronald Cron84cc9942020-11-25 14:30:05 +0100488psa_status_t psa_driver_wrapper_export_public_key(
489 const psa_key_attributes_t *attributes,
490 const uint8_t *key_buffer, size_t key_buffer_size,
491 uint8_t *data, size_t data_size, size_t *data_length )
492
Steven Cooremanb9b84422020-10-14 14:39:20 +0200493{
Steven Cooremanb9b84422020-10-14 14:39:20 +0200494 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Cron84cc9942020-11-25 14:30:05 +0100495 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
496 psa_get_key_lifetime( attributes ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200497
Ronald Cron152e3f82020-11-26 16:06:41 +0100498 /* Try dynamically-registered SE interface first */
499#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
500 const psa_drv_se_t *drv;
501 psa_drv_se_context_t *drv_context;
502
503 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
504 {
505 if( ( drv->key_management == NULL ) ||
506 ( drv->key_management->p_export_public == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100507 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100508 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100509 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100510
511 return( drv->key_management->p_export_public(
512 drv_context,
513 *( (psa_key_slot_number_t *)key_buffer ),
514 data, data_size, data_length ) );
515 }
516#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
517
Steven Cooremanb9b84422020-10-14 14:39:20 +0200518 switch( location )
519 {
520 case PSA_KEY_LOCATION_LOCAL_STORAGE:
521 /* Key is stored in the slot in export representation, so
522 * cycle through all known transparent accelerators */
Ronald Cron67227982020-11-26 15:16:05 +0100523#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200524#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200525 status = mbedtls_test_transparent_export_public_key(
526 attributes,
527 key_buffer,
528 key_buffer_size,
529 data,
530 data_size,
531 data_length );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200532 /* Declared with fallback == true */
533 if( status != PSA_ERROR_NOT_SUPPORTED )
534 return( status );
535#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100536#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200537 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron67227982020-11-26 15:16:05 +0100538 return( psa_export_public_key_internal( attributes,
539 key_buffer,
540 key_buffer_size,
541 data,
542 data_size,
543 data_length ) );
544
Steven Cooremanb9b84422020-10-14 14:39:20 +0200545 /* Add cases for opaque driver here */
Ronald Cron67227982020-11-26 15:16:05 +0100546#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200547#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100548 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200549 return( mbedtls_test_opaque_export_public_key( attributes,
550 key_buffer,
551 key_buffer_size,
552 data,
553 data_size,
554 data_length ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200555#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100556#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200557 default:
558 /* Key is declared with a lifetime not known to us */
559 return( status );
560 }
Steven Cooremanb9b84422020-10-14 14:39:20 +0200561}
562
Steven Cooreman6801f082021-02-19 17:21:22 +0100563psa_status_t psa_driver_wrapper_get_builtin_key(
564 psa_drv_slot_number_t slot_number,
565 psa_key_attributes_t *attributes,
566 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
567{
568 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
569 switch( location )
570 {
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100571#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100572 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200573 return( mbedtls_test_opaque_get_builtin_key(
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100574 slot_number,
575 attributes,
576 key_buffer, key_buffer_size, key_buffer_length ) );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100577#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman6801f082021-02-19 17:21:22 +0100578 default:
579 (void) slot_number;
580 (void) key_buffer;
581 (void) key_buffer_size;
582 (void) key_buffer_length;
583 return( PSA_ERROR_DOES_NOT_EXIST );
584 }
585}
586
Steven Cooreman37941cb2020-07-28 18:49:51 +0200587/*
588 * Cipher functions
589 */
590psa_status_t psa_driver_wrapper_cipher_encrypt(
591 psa_key_slot_t *slot,
592 psa_algorithm_t alg,
593 const uint8_t *input,
594 size_t input_length,
595 uint8_t *output,
596 size_t output_size,
597 size_t *output_length )
598{
599#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
600 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
601 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
602 psa_key_attributes_t attributes = {
603 .core = slot->attr
604 };
605
606 switch( location )
607 {
608 case PSA_KEY_LOCATION_LOCAL_STORAGE:
609 /* Key is stored in the slot in export representation, so
610 * cycle through all known transparent accelerators */
611#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200612 status = mbedtls_test_transparent_cipher_encrypt( &attributes,
613 slot->key.data,
614 slot->key.bytes,
615 alg,
616 input,
617 input_length,
618 output,
619 output_size,
620 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200621 /* Declared with fallback == true */
622 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200623 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200624#endif /* PSA_CRYPTO_DRIVER_TEST */
625 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200626 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200627 /* Add cases for opaque driver here */
628#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100629 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200630 return( mbedtls_test_opaque_cipher_encrypt( &attributes,
631 slot->key.data,
632 slot->key.bytes,
633 alg,
634 input,
635 input_length,
636 output,
637 output_size,
638 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200639#endif /* PSA_CRYPTO_DRIVER_TEST */
640 default:
641 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200642 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200643 }
644#else /* PSA_CRYPTO_DRIVER_PRESENT */
645 (void) slot;
646 (void) alg;
647 (void) input;
648 (void) input_length;
649 (void) output;
650 (void) output_size;
651 (void) output_length;
652
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200653 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200654#endif /* PSA_CRYPTO_DRIVER_PRESENT */
655}
656
657psa_status_t psa_driver_wrapper_cipher_decrypt(
658 psa_key_slot_t *slot,
659 psa_algorithm_t alg,
660 const uint8_t *input,
661 size_t input_length,
662 uint8_t *output,
663 size_t output_size,
664 size_t *output_length )
665{
666#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
667 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
668 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
669 psa_key_attributes_t attributes = {
670 .core = slot->attr
671 };
672
673 switch( location )
674 {
675 case PSA_KEY_LOCATION_LOCAL_STORAGE:
676 /* Key is stored in the slot in export representation, so
677 * cycle through all known transparent accelerators */
678#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200679 status = mbedtls_test_transparent_cipher_decrypt( &attributes,
680 slot->key.data,
681 slot->key.bytes,
682 alg,
683 input,
684 input_length,
685 output,
686 output_size,
687 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200688 /* Declared with fallback == true */
689 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200690 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200691#endif /* PSA_CRYPTO_DRIVER_TEST */
692 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200693 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200694 /* Add cases for opaque driver here */
695#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100696 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200697 return( mbedtls_test_opaque_cipher_decrypt( &attributes,
698 slot->key.data,
699 slot->key.bytes,
700 alg,
701 input,
702 input_length,
703 output,
704 output_size,
705 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200706#endif /* PSA_CRYPTO_DRIVER_TEST */
707 default:
708 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200709 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200710 }
711#else /* PSA_CRYPTO_DRIVER_PRESENT */
712 (void) slot;
713 (void) alg;
714 (void) input;
715 (void) input_length;
716 (void) output;
717 (void) output_size;
718 (void) output_length;
719
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200720 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200721#endif /* PSA_CRYPTO_DRIVER_PRESENT */
722}
723
724psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100725 psa_cipher_operation_t *operation,
726 const psa_key_attributes_t *attributes,
727 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200728 psa_algorithm_t alg )
729{
Ronald Cron0b805592020-12-14 18:08:20 +0100730 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Crona4af55f2020-12-14 14:36:06 +0100731 psa_key_location_t location =
732 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200733
Steven Cooreman37941cb2020-07-28 18:49:51 +0200734 switch( location )
735 {
736 case PSA_KEY_LOCATION_LOCAL_STORAGE:
737 /* Key is stored in the slot in export representation, so
738 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100739#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200740#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200741 status = mbedtls_test_transparent_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100742 &operation->ctx.transparent_test_driver_ctx,
743 attributes,
744 key_buffer,
745 key_buffer_size,
746 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200747 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200748 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100749 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200750
Ronald Cron0b805592020-12-14 18:08:20 +0100751 if( status != PSA_ERROR_NOT_SUPPORTED )
752 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200753#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100754#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100755#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200756 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100757 status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100758 attributes,
759 key_buffer,
760 key_buffer_size,
761 alg );
762 if( status == PSA_SUCCESS )
Ronald Cron6e412a72021-03-10 09:58:47 +0100763 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Ronald Cron49fafa92021-03-10 08:34:23 +0100764
Ronald Cron7b4154d2021-03-19 14:49:41 +0100765 if( status != PSA_ERROR_NOT_SUPPORTED )
766 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100767#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
768 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron0b805592020-12-14 18:08:20 +0100769
Steven Cooreman37941cb2020-07-28 18:49:51 +0200770 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100771#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200772#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100773 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200774 status = mbedtls_test_opaque_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100775 &operation->ctx.opaque_test_driver_ctx,
776 attributes,
777 key_buffer, key_buffer_size,
778 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200779
Steven Cooreman37941cb2020-07-28 18:49:51 +0200780 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100781 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200782
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200783 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200784#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100785#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200786 default:
787 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100788 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100789 (void)key_buffer;
790 (void)key_buffer_size;
791 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +0200792 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200793 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200794}
795
796psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100797 psa_cipher_operation_t *operation,
798 const psa_key_attributes_t *attributes,
799 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200800 psa_algorithm_t alg )
801{
Steven Cooreman37941cb2020-07-28 18:49:51 +0200802 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Crona4af55f2020-12-14 14:36:06 +0100803 psa_key_location_t location =
804 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200805
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 */
Ronald Cron0b805592020-12-14 18:08:20 +0100811#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200812#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200813 status = mbedtls_test_transparent_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100814 &operation->ctx.transparent_test_driver_ctx,
815 attributes,
816 key_buffer,
817 key_buffer_size,
818 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200819 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200820 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100821 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200822
Ronald Cron0b805592020-12-14 18:08:20 +0100823 if( status != PSA_ERROR_NOT_SUPPORTED )
824 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200825#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100826#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100827#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200828 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100829 status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100830 attributes,
831 key_buffer,
832 key_buffer_size,
833 alg );
834 if( status == PSA_SUCCESS )
835 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
836
837 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100838#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
839 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron49fafa92021-03-10 08:34:23 +0100840
Steven Cooreman37941cb2020-07-28 18:49:51 +0200841 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100842#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200843#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100844 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200845 status = mbedtls_test_opaque_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100846 &operation->ctx.opaque_test_driver_ctx,
847 attributes,
848 key_buffer, key_buffer_size,
849 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200850
Steven Cooreman37941cb2020-07-28 18:49:51 +0200851 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100852 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200853
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200854 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200855#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100856#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200857 default:
858 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100859 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100860 (void)key_buffer;
861 (void)key_buffer_size;
862 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +0200863 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200864 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200865}
866
Steven Cooreman37941cb2020-07-28 18:49:51 +0200867psa_status_t psa_driver_wrapper_cipher_set_iv(
Ronald Cron6056fe82020-12-15 13:58:07 +0100868 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200869 const uint8_t *iv,
870 size_t iv_length )
871{
Ronald Cron49fafa92021-03-10 08:34:23 +0100872 switch( operation->id )
873 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100874#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100875 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100876 return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100877 iv,
878 iv_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100879#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100880
881#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200882#if defined(PSA_CRYPTO_DRIVER_TEST)
883 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200884 return( mbedtls_test_transparent_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100885 &operation->ctx.transparent_test_driver_ctx,
886 iv, iv_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +0100887
Steven Cooreman37941cb2020-07-28 18:49:51 +0200888 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200889 return( mbedtls_test_opaque_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100890 &operation->ctx.opaque_test_driver_ctx,
891 iv, iv_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200892#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100893#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +0100894 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200895
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100896 (void)iv;
897 (void)iv_length;
898
Ronald Crondd24c9b2020-12-15 14:10:01 +0100899 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200900}
901
902psa_status_t psa_driver_wrapper_cipher_update(
Ronald Cron6056fe82020-12-15 13:58:07 +0100903 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200904 const uint8_t *input,
905 size_t input_length,
906 uint8_t *output,
907 size_t output_size,
908 size_t *output_length )
909{
Ronald Cron49fafa92021-03-10 08:34:23 +0100910 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200911 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100912#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100913 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100914 return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100915 input,
916 input_length,
917 output,
918 output_size,
919 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100920#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
921
Ronald Cron49fafa92021-03-10 08:34:23 +0100922#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200923#if defined(PSA_CRYPTO_DRIVER_TEST)
924 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200925 return( mbedtls_test_transparent_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100926 &operation->ctx.transparent_test_driver_ctx,
927 input, input_length,
928 output, output_size, output_length ) );
929
Steven Cooreman37941cb2020-07-28 18:49:51 +0200930 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200931 return( mbedtls_test_opaque_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100932 &operation->ctx.opaque_test_driver_ctx,
933 input, input_length,
934 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200935#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100936#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +0100937 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200938
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100939 (void)input;
940 (void)input_length;
941 (void)output;
942 (void)output_size;
943 (void)output_length;
944
Ronald Crondd24c9b2020-12-15 14:10:01 +0100945 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200946}
947
948psa_status_t psa_driver_wrapper_cipher_finish(
Ronald Cron6056fe82020-12-15 13:58:07 +0100949 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200950 uint8_t *output,
951 size_t output_size,
952 size_t *output_length )
953{
Ronald Cron49fafa92021-03-10 08:34:23 +0100954 switch( operation->id )
955 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100956#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100957 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100958 return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100959 output,
960 output_size,
961 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100962#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100963
964#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200965#if defined(PSA_CRYPTO_DRIVER_TEST)
966 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200967 return( mbedtls_test_transparent_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100968 &operation->ctx.transparent_test_driver_ctx,
969 output, output_size, output_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +0100970
Steven Cooreman37941cb2020-07-28 18:49:51 +0200971 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200972 return( mbedtls_test_opaque_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100973 &operation->ctx.opaque_test_driver_ctx,
974 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200975#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100976#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +0100977 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200978
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100979 (void)output;
980 (void)output_size;
981 (void)output_length;
982
Ronald Crondd24c9b2020-12-15 14:10:01 +0100983 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200984}
985
986psa_status_t psa_driver_wrapper_cipher_abort(
Ronald Cron6056fe82020-12-15 13:58:07 +0100987 psa_cipher_operation_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200988{
Ronald Crondd24c9b2020-12-15 14:10:01 +0100989 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200990
Ronald Cron49fafa92021-03-10 08:34:23 +0100991 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200992 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100993#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100994 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100995 return( mbedtls_psa_cipher_abort( &operation->ctx.mbedtls_ctx ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100996#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron49fafa92021-03-10 08:34:23 +0100997
998#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200999#if defined(PSA_CRYPTO_DRIVER_TEST)
1000 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001001 status = mbedtls_test_transparent_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001002 &operation->ctx.transparent_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001003 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001004 &operation->ctx.transparent_test_driver_ctx,
1005 sizeof( operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001006 return( status );
Ronald Cron49fafa92021-03-10 08:34:23 +01001007
Steven Cooreman37941cb2020-07-28 18:49:51 +02001008 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001009 status = mbedtls_test_opaque_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001010 &operation->ctx.opaque_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001011 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001012 &operation->ctx.opaque_test_driver_ctx,
1013 sizeof( operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001014 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001015#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001016#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001017 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001018
Ronald Cron49fafa92021-03-10 08:34:23 +01001019 (void)status;
Ronald Crondd24c9b2020-12-15 14:10:01 +01001020 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001021}
1022
Steven Cooreman1e582352021-02-18 17:24:37 +01001023/*
1024 * Hashing functions
1025 */
1026psa_status_t psa_driver_wrapper_hash_compute(
1027 psa_algorithm_t alg,
1028 const uint8_t *input,
1029 size_t input_length,
1030 uint8_t *hash,
1031 size_t hash_size,
1032 size_t *hash_length)
1033{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001034 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001035
1036 /* Try accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001037#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001038 status = mbedtls_test_transparent_hash_compute(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001039 alg, input, input_length, hash, hash_size, hash_length );
Steven Cooremanf7638102021-03-04 15:14:36 +01001040 if( status != PSA_ERROR_NOT_SUPPORTED )
1041 return( status );
1042#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001043
1044 /* If software fallback is compiled in, try fallback */
1045#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1046 status = mbedtls_psa_hash_compute( alg, input, input_length,
1047 hash, hash_size, hash_length );
1048 if( status != PSA_ERROR_NOT_SUPPORTED )
1049 return( status );
1050#endif
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001051 (void) status;
1052 (void) alg;
1053 (void) input;
1054 (void) input_length;
1055 (void) hash;
1056 (void) hash_size;
1057 (void) hash_length;
Steven Cooreman1e582352021-02-18 17:24:37 +01001058
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001059 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman1e582352021-02-18 17:24:37 +01001060}
1061
1062psa_status_t psa_driver_wrapper_hash_setup(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001063 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001064 psa_algorithm_t alg )
1065{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001066 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001067
Steven Cooreman1e582352021-02-18 17:24:37 +01001068 /* Try setup on accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001069#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001070 status = mbedtls_test_transparent_hash_setup(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001071 &operation->ctx.test_driver_ctx, alg );
Steven Cooremanf7638102021-03-04 15:14:36 +01001072 if( status == PSA_SUCCESS )
1073 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1074
1075 if( status != PSA_ERROR_NOT_SUPPORTED )
1076 return( status );
1077#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001078
1079 /* If software fallback is compiled in, try fallback */
1080#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001081 status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
Steven Cooreman1e582352021-02-18 17:24:37 +01001082 if( status == PSA_SUCCESS )
Steven Cooreman1e582352021-02-18 17:24:37 +01001083 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Steven Cooreman1e582352021-02-18 17:24:37 +01001084
1085 if( status != PSA_ERROR_NOT_SUPPORTED )
1086 return( status );
1087#endif
1088 /* Nothing left to try if we fall through here */
1089 (void) status;
1090 (void) operation;
1091 (void) alg;
1092 return( PSA_ERROR_NOT_SUPPORTED );
1093}
1094
1095psa_status_t psa_driver_wrapper_hash_clone(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001096 const psa_hash_operation_t *source_operation,
1097 psa_hash_operation_t *target_operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001098{
Steven Cooreman1e582352021-02-18 17:24:37 +01001099 switch( source_operation->id )
1100 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001101#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1102 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1103 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1104 return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1105 &target_operation->ctx.mbedtls_ctx ) );
1106#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001107#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001108 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1109 target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Ronald Cron7f13fa22021-04-13 12:41:34 +02001110 return( mbedtls_test_transparent_hash_clone(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001111 &source_operation->ctx.test_driver_ctx,
1112 &target_operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001113#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001114 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001115 (void) target_operation;
1116 return( PSA_ERROR_BAD_STATE );
1117 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001118}
1119
1120psa_status_t psa_driver_wrapper_hash_update(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001121 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001122 const uint8_t *input,
1123 size_t input_length )
1124{
Steven Cooreman1e582352021-02-18 17:24:37 +01001125 switch( operation->id )
1126 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001127#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1128 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1129 return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
1130 input, input_length ) );
1131#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001132#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001133 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001134 return( mbedtls_test_transparent_hash_update(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001135 &operation->ctx.test_driver_ctx,
1136 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001137#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001138 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001139 (void) input;
1140 (void) input_length;
1141 return( PSA_ERROR_BAD_STATE );
1142 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001143}
1144
1145psa_status_t psa_driver_wrapper_hash_finish(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001146 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001147 uint8_t *hash,
1148 size_t hash_size,
1149 size_t *hash_length )
1150{
Steven Cooreman1e582352021-02-18 17:24:37 +01001151 switch( operation->id )
1152 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001153#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1154 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1155 return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1156 hash, hash_size, hash_length ) );
1157#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001158#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001159 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001160 return( mbedtls_test_transparent_hash_finish(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001161 &operation->ctx.test_driver_ctx,
1162 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001163#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001164 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001165 (void) hash;
1166 (void) hash_size;
1167 (void) hash_length;
1168 return( PSA_ERROR_BAD_STATE );
1169 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001170}
1171
1172psa_status_t psa_driver_wrapper_hash_abort(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001173 psa_hash_operation_t *operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001174{
Steven Cooreman1e582352021-02-18 17:24:37 +01001175 switch( operation->id )
1176 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001177#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1178 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1179 return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1180#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001181#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001182 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001183 return( mbedtls_test_transparent_hash_abort(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001184 &operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001185#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001186 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001187 return( PSA_ERROR_BAD_STATE );
1188 }
1189}
1190
Ronald Cronde822812021-03-17 16:08:20 +01001191psa_status_t psa_driver_wrapper_aead_encrypt(
1192 const psa_key_attributes_t *attributes,
1193 const uint8_t *key_buffer, size_t key_buffer_size,
1194 psa_algorithm_t alg,
1195 const uint8_t *nonce, size_t nonce_length,
1196 const uint8_t *additional_data, size_t additional_data_length,
1197 const uint8_t *plaintext, size_t plaintext_length,
1198 uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length )
1199{
1200 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1201 psa_key_location_t location =
1202 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1203
1204 switch( location )
1205 {
1206 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1207 /* Key is stored in the slot in export representation, so
1208 * cycle through all known transparent accelerators */
1209
1210#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1211#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001212 status = mbedtls_test_transparent_aead_encrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001213 attributes, key_buffer, key_buffer_size,
1214 alg,
1215 nonce, nonce_length,
1216 additional_data, additional_data_length,
1217 plaintext, plaintext_length,
1218 ciphertext, ciphertext_size, ciphertext_length );
1219 /* Declared with fallback == true */
1220 if( status != PSA_ERROR_NOT_SUPPORTED )
1221 return( status );
1222#endif /* PSA_CRYPTO_DRIVER_TEST */
1223#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1224
1225 /* Fell through, meaning no accelerator supports this operation */
1226 return( mbedtls_psa_aead_encrypt(
1227 attributes, key_buffer, key_buffer_size,
1228 alg,
1229 nonce, nonce_length,
1230 additional_data, additional_data_length,
1231 plaintext, plaintext_length,
1232 ciphertext, ciphertext_size, ciphertext_length ) );
1233
1234 /* Add cases for opaque driver here */
1235
1236 default:
1237 /* Key is declared with a lifetime not known to us */
1238 (void)status;
1239 return( PSA_ERROR_INVALID_ARGUMENT );
1240 }
1241}
1242
1243psa_status_t psa_driver_wrapper_aead_decrypt(
1244 const psa_key_attributes_t *attributes,
1245 const uint8_t *key_buffer, size_t key_buffer_size,
1246 psa_algorithm_t alg,
1247 const uint8_t *nonce, size_t nonce_length,
1248 const uint8_t *additional_data, size_t additional_data_length,
1249 const uint8_t *ciphertext, size_t ciphertext_length,
1250 uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length )
1251{
1252 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1253 psa_key_location_t location =
1254 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1255
1256 switch( location )
1257 {
1258 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1259 /* Key is stored in the slot in export representation, so
1260 * cycle through all known transparent accelerators */
1261
1262#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1263#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001264 status = mbedtls_test_transparent_aead_decrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001265 attributes, key_buffer, key_buffer_size,
1266 alg,
1267 nonce, nonce_length,
1268 additional_data, additional_data_length,
1269 ciphertext, ciphertext_length,
1270 plaintext, plaintext_size, plaintext_length );
1271 /* Declared with fallback == true */
1272 if( status != PSA_ERROR_NOT_SUPPORTED )
1273 return( status );
1274#endif /* PSA_CRYPTO_DRIVER_TEST */
1275#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1276
1277 /* Fell through, meaning no accelerator supports this operation */
1278 return( mbedtls_psa_aead_decrypt(
1279 attributes, key_buffer, key_buffer_size,
1280 alg,
1281 nonce, nonce_length,
1282 additional_data, additional_data_length,
1283 ciphertext, ciphertext_length,
1284 plaintext, plaintext_size, plaintext_length ) );
1285
1286 /* Add cases for opaque driver here */
1287
1288 default:
1289 /* Key is declared with a lifetime not known to us */
1290 (void)status;
1291 return( PSA_ERROR_INVALID_ARGUMENT );
1292 }
1293}
Steven Cooremand13a70f2021-03-19 15:24:23 +01001294
Paul Elliott6504aa62021-04-20 17:09:36 +01001295psa_status_t psa_driver_wrapper_aead_encrypt_setup(
1296 psa_aead_operation_t *operation,
1297 const psa_key_attributes_t *attributes,
1298 const uint8_t *key_buffer, size_t key_buffer_size,
1299 psa_algorithm_t alg )
1300{
1301 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1302 psa_key_location_t location =
1303 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1304
1305 switch( location )
1306 {
1307 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1308 /* Key is stored in the slot in export representation, so
1309 * cycle through all known transparent accelerators */
1310
1311#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1312#if defined(PSA_CRYPTO_DRIVER_TEST)
1313// status = test_transparent_aead_encrypt_setup(
1314// operation, attributes,
1315// key_buffer, key_buffer_size,
1316// alg );
1317 /* Declared with fallback == true */
1318 if( status == PSA_SUCCESS )
1319 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1320
1321 if( status != PSA_ERROR_NOT_SUPPORTED )
1322 return( status );
1323#endif /* PSA_CRYPTO_DRIVER_TEST */
1324#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1325
1326 /* Fell through, meaning no accelerator supports this operation */
1327 status = mbedtls_psa_aead_encrypt_setup(
1328 operation, attributes,
1329 key_buffer, key_buffer_size,
1330 alg );
1331
1332 if( status == PSA_SUCCESS )
1333 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1334
1335 return( status );
1336
1337 /* Add cases for opaque driver here */
1338
1339 default:
1340 /* Key is declared with a lifetime not known to us */
1341 (void)status;
1342 return( PSA_ERROR_INVALID_ARGUMENT );
1343 }
1344}
1345
1346psa_status_t psa_driver_wrapper_aead_decrypt_setup(
1347 psa_aead_operation_t *operation,
1348 const psa_key_attributes_t *attributes,
1349 const uint8_t *key_buffer, size_t key_buffer_size,
1350 psa_algorithm_t alg )
1351{
1352 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1353 psa_key_location_t location =
1354 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1355
1356 switch( location )
1357 {
1358 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1359 /* Key is stored in the slot in export representation, so
1360 * cycle through all known transparent accelerators */
1361
1362#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1363#if defined(PSA_CRYPTO_DRIVER_TEST)
1364// status = test_transparent_aead_decrypt_setup(
1365// operation, attributes,
1366// key_buffer, key_buffer_size,
1367// alg );
1368 /* Declared with fallback == true */
1369 if( status == PSA_SUCCESS )
1370 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1371
1372 if( status != PSA_ERROR_NOT_SUPPORTED )
1373 return( status );
1374#endif /* PSA_CRYPTO_DRIVER_TEST */
1375#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1376
1377 /* Fell through, meaning no accelerator supports this operation */
1378 status = mbedtls_psa_aead_decrypt_setup(
1379 operation, attributes,
1380 key_buffer, key_buffer_size,
1381 alg );
1382
1383 if( status == PSA_SUCCESS )
1384 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1385
1386 return( status );
1387
1388 /* Add cases for opaque driver here */
1389
1390 default:
1391 /* Key is declared with a lifetime not known to us */
1392 (void)status;
1393 return( PSA_ERROR_INVALID_ARGUMENT );
1394 }
1395}
1396
1397psa_status_t psa_driver_wrapper_aead_generate_nonce(
1398 psa_aead_operation_t *operation,
1399 uint8_t *nonce,
1400 size_t nonce_size,
1401 size_t *nonce_length )
1402{
1403 switch( operation->id )
1404 {
1405#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1406 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1407 return( mbedtls_psa_aead_generate_nonce( operation, nonce, nonce_size,
1408 nonce_length ) );
1409#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1410
1411#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1412#if defined(PSA_CRYPTO_DRIVER_TEST)
1413 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1414// return( test_transparent_aead_generate_nonce(
1415// operation, nonce, nonce_size, nonce_length ) );
1416
1417 /* Add cases for opaque driver here */
1418
1419#endif /* PSA_CRYPTO_DRIVER_TEST */
1420#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1421 }
1422
1423 (void)nonce;
1424 (void)nonce_size;
1425 (void)nonce_length;
1426
1427 return( PSA_ERROR_INVALID_ARGUMENT );
1428}
1429
1430psa_status_t psa_driver_wrapper_aead_set_nonce(
1431 psa_aead_operation_t *operation,
1432 const uint8_t *nonce,
1433 size_t nonce_length )
1434{
1435 switch( operation->id )
1436 {
1437#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1438 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1439 return( mbedtls_psa_aead_set_nonce( operation, nonce, nonce_length ) );
1440
1441#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1442
1443#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1444#if defined(PSA_CRYPTO_DRIVER_TEST)
1445 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1446// return( test_transparent_aead_set_nonce(
1447// operation, nonce, nonce_length ) );
1448
1449 /* Add cases for opaque driver here */
1450
1451#endif /* PSA_CRYPTO_DRIVER_TEST */
1452#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1453 }
1454
1455 (void)nonce;
1456 (void)nonce_length;
1457
1458 return( PSA_ERROR_INVALID_ARGUMENT );
1459}
1460
1461psa_status_t psa_driver_wrapper_aead_set_lengths(
1462 psa_aead_operation_t *operation,
1463 size_t ad_length,
1464 size_t plaintext_length )
1465{
1466 switch( operation->id )
1467 {
1468#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1469 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1470 return( mbedtls_psa_aead_set_lengths( operation, ad_length, plaintext_length ) );
1471
1472#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1473
1474#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1475#if defined(PSA_CRYPTO_DRIVER_TEST)
1476 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1477// return( test_transparent_aead_set_lengths(
1478// operation, ad_length, plaintext_length ) );
1479
1480 /* Add cases for opaque driver here */
1481
1482#endif /* PSA_CRYPTO_DRIVER_TEST */
1483#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1484 }
1485
1486 (void)ad_length;
1487 (void)plaintext_length;
1488
1489 return( PSA_ERROR_INVALID_ARGUMENT );
1490}
1491
1492psa_status_t psa_driver_wrapper_aead_update_ad(
1493 psa_aead_operation_t *operation,
1494 const uint8_t *input,
1495 size_t input_length )
1496{
1497 switch( operation->id )
1498 {
1499#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1500 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1501 return( mbedtls_psa_aead_update_ad( operation, input, input_length ) );
1502
1503#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1504
1505#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1506#if defined(PSA_CRYPTO_DRIVER_TEST)
1507 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1508// return( test_transparent_aead_update_ad(
1509// operation, input, input_length ) );
1510
1511 /* Add cases for opaque driver here */
1512
1513#endif /* PSA_CRYPTO_DRIVER_TEST */
1514#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1515 }
1516
1517 (void)input;
1518 (void)input_length;
1519
1520 return( PSA_ERROR_INVALID_ARGUMENT );
1521}
1522
1523psa_status_t psa_driver_wrapper_aead_update(
1524 psa_aead_operation_t *operation,
1525 const uint8_t *input,
1526 size_t input_length,
1527 uint8_t *output,
1528 size_t output_size,
1529 size_t *output_length )
1530{
1531 switch( operation->id )
1532 {
1533#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1534 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1535 return( mbedtls_psa_aead_update( operation, input, input_length, output,
1536 output_size, output_length ) );
1537
1538#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1539
1540#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1541#if defined(PSA_CRYPTO_DRIVER_TEST)
1542 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1543// return( test_transparent_aead_update(
1544// operation, input, input_length, ouput, output_size,
1545// output_length ) );
1546
1547 /* Add cases for opaque driver here */
1548
1549#endif /* PSA_CRYPTO_DRIVER_TEST */
1550#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1551 }
1552
1553 (void)input;
1554 (void)input_length;
1555 (void)output;
1556 (void)output_size;
1557 (void)output_length;
1558
1559 return( PSA_ERROR_INVALID_ARGUMENT );
1560}
1561
1562psa_status_t psa_driver_wrapper_aead_finish(
1563 psa_aead_operation_t *operation,
1564 uint8_t *ciphertext,
1565 size_t ciphertext_size,
1566 size_t *ciphertext_length,
1567 uint8_t *tag,
1568 size_t tag_size,
1569 size_t *tag_length )
1570{
1571 switch( operation->id )
1572 {
1573#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1574 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1575 return( mbedtls_psa_aead_finish( operation, ciphertext, ciphertext_size,
1576 ciphertext_length, tag, tag_size, tag_length ) );
1577
1578#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1579
1580#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1581#if defined(PSA_CRYPTO_DRIVER_TEST)
1582 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1583// return( test_transparent_aead_finish(
1584// operation, ciphertext, ciphertext_size,
1585// ciphertext_length, tag, tag_size, tag_length ) );
1586
1587 /* Add cases for opaque driver here */
1588
1589#endif /* PSA_CRYPTO_DRIVER_TEST */
1590#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1591 }
1592
1593 (void)ciphertext;
1594 (void)ciphertext_size;
1595 (void)ciphertext_length;
1596 (void)tag;
1597 (void)tag_size;
1598 (void)tag_length;
1599
1600 return( PSA_ERROR_INVALID_ARGUMENT );
1601}
1602
1603psa_status_t psa_driver_wrapper_aead_verify(
1604 psa_aead_operation_t *operation,
1605 uint8_t *plaintext,
1606 size_t plaintext_size,
1607 size_t *plaintext_length,
1608 const uint8_t *tag,
1609 size_t tag_length )
1610{
1611 switch( operation->id )
1612 {
1613#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1614 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1615 return( mbedtls_psa_aead_verify( operation, plaintext, plaintext_size,
1616 plaintext_length, tag, tag_length ) );
1617
1618#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1619
1620#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1621#if defined(PSA_CRYPTO_DRIVER_TEST)
1622 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1623// return( test_transparent_aead_verify(
1624// operation, ciphertext, ciphertext_size,
1625// ciphertext_length, tag, tag_length ) );
1626
1627 /* Add cases for opaque driver here */
1628
1629#endif /* PSA_CRYPTO_DRIVER_TEST */
1630#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1631 }
1632
1633 (void)plaintext;
1634 (void)plaintext_size;
1635 (void)plaintext_length;
1636 (void)tag;
1637 (void)tag_length;
1638
1639 return( PSA_ERROR_INVALID_ARGUMENT );
1640}
1641
1642psa_status_t psa_driver_wrapper_aead_abort(
1643 psa_aead_operation_t *operation )
1644{
1645 switch( operation->id )
1646 {
1647#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
1648 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1649 return( mbedtls_psa_aead_abort( operation ) );
1650
1651#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1652
1653#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1654#if defined(PSA_CRYPTO_DRIVER_TEST)
1655 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1656// return( test_transparent_aead_abort( operation ) );
1657
1658 /* Add cases for opaque driver here */
1659
1660#endif /* PSA_CRYPTO_DRIVER_TEST */
1661#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1662 }
1663
1664 return( PSA_ERROR_INVALID_ARGUMENT );
1665}
Steven Cooremand13a70f2021-03-19 15:24:23 +01001666
1667/*
1668 * MAC functions
1669 */
1670psa_status_t psa_driver_wrapper_mac_compute(
1671 const psa_key_attributes_t *attributes,
1672 const uint8_t *key_buffer,
1673 size_t key_buffer_size,
1674 psa_algorithm_t alg,
1675 const uint8_t *input,
1676 size_t input_length,
1677 uint8_t *mac,
1678 size_t mac_size,
1679 size_t *mac_length )
1680{
1681 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1682 psa_key_location_t location =
1683 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1684
1685 switch( location )
1686 {
1687 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1688 /* Key is stored in the slot in export representation, so
1689 * cycle through all known transparent accelerators */
1690#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1691#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001692 status = mbedtls_test_transparent_mac_compute(
Steven Cooremand13a70f2021-03-19 15:24:23 +01001693 attributes, key_buffer, key_buffer_size, alg,
1694 input, input_length,
1695 mac, mac_size, mac_length );
1696 /* Declared with fallback == true */
1697 if( status != PSA_ERROR_NOT_SUPPORTED )
1698 return( status );
1699#endif /* PSA_CRYPTO_DRIVER_TEST */
1700#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1701#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1702 /* Fell through, meaning no accelerator supports this operation */
1703 status = mbedtls_psa_mac_compute(
1704 attributes, key_buffer, key_buffer_size, alg,
1705 input, input_length,
1706 mac, mac_size, mac_length );
1707 if( status != PSA_ERROR_NOT_SUPPORTED )
1708 return( status );
1709#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1710 return( PSA_ERROR_NOT_SUPPORTED );
1711
1712 /* Add cases for opaque driver here */
1713#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1714#if defined(PSA_CRYPTO_DRIVER_TEST)
1715 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001716 status = mbedtls_test_opaque_mac_compute(
Steven Cooremand13a70f2021-03-19 15:24:23 +01001717 attributes, key_buffer, key_buffer_size, alg,
1718 input, input_length,
1719 mac, mac_size, mac_length );
1720 return( status );
1721#endif /* PSA_CRYPTO_DRIVER_TEST */
1722#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1723 default:
1724 /* Key is declared with a lifetime not known to us */
1725 (void) key_buffer;
1726 (void) key_buffer_size;
1727 (void) alg;
1728 (void) input;
1729 (void) input_length;
1730 (void) mac;
1731 (void) mac_size;
1732 (void) mac_length;
1733 (void) status;
1734 return( PSA_ERROR_INVALID_ARGUMENT );
1735 }
1736}
1737
1738psa_status_t psa_driver_wrapper_mac_sign_setup(
1739 psa_mac_operation_t *operation,
1740 const psa_key_attributes_t *attributes,
1741 const uint8_t *key_buffer,
1742 size_t key_buffer_size,
1743 psa_algorithm_t alg )
1744{
1745 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1746 psa_key_location_t location =
1747 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1748
1749 switch( location )
1750 {
1751 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1752 /* Key is stored in the slot in export representation, so
1753 * cycle through all known transparent accelerators */
1754#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1755#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001756 status = mbedtls_test_transparent_mac_sign_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001757 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001758 attributes,
1759 key_buffer, key_buffer_size,
1760 alg );
1761 /* Declared with fallback == true */
1762 if( status == PSA_SUCCESS )
1763 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1764
1765 if( status != PSA_ERROR_NOT_SUPPORTED )
1766 return( status );
1767#endif /* PSA_CRYPTO_DRIVER_TEST */
1768#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1769#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1770 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001771 status = mbedtls_psa_mac_sign_setup( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001772 attributes,
1773 key_buffer, key_buffer_size,
1774 alg );
1775 if( status == PSA_SUCCESS )
1776 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1777
1778 if( status != PSA_ERROR_NOT_SUPPORTED )
1779 return( status );
1780#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1781 return( PSA_ERROR_NOT_SUPPORTED );
1782
1783 /* Add cases for opaque driver here */
1784#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1785#if defined(PSA_CRYPTO_DRIVER_TEST)
1786 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001787 status = mbedtls_test_opaque_mac_sign_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001788 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001789 attributes,
1790 key_buffer, key_buffer_size,
1791 alg );
1792
1793 if( status == PSA_SUCCESS )
1794 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1795
1796 return( status );
1797#endif /* PSA_CRYPTO_DRIVER_TEST */
1798#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1799 default:
1800 /* Key is declared with a lifetime not known to us */
1801 (void) status;
1802 (void) key_buffer;
1803 (void) key_buffer_size;
1804 (void) alg;
1805 return( PSA_ERROR_INVALID_ARGUMENT );
1806 }
1807}
1808
1809psa_status_t psa_driver_wrapper_mac_verify_setup(
1810 psa_mac_operation_t *operation,
1811 const psa_key_attributes_t *attributes,
1812 const uint8_t *key_buffer,
1813 size_t key_buffer_size,
1814 psa_algorithm_t alg )
1815{
1816 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1817 psa_key_location_t location =
1818 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1819
1820 switch( location )
1821 {
1822 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1823 /* Key is stored in the slot in export representation, so
1824 * cycle through all known transparent accelerators */
1825#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1826#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001827 status = mbedtls_test_transparent_mac_verify_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001828 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001829 attributes,
1830 key_buffer, key_buffer_size,
1831 alg );
1832 /* Declared with fallback == true */
1833 if( status == PSA_SUCCESS )
1834 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1835
1836 if( status != PSA_ERROR_NOT_SUPPORTED )
1837 return( status );
1838#endif /* PSA_CRYPTO_DRIVER_TEST */
1839#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1840#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1841 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001842 status = mbedtls_psa_mac_verify_setup( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001843 attributes,
1844 key_buffer, key_buffer_size,
1845 alg );
1846 if( status == PSA_SUCCESS )
1847 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1848
1849 if( status != PSA_ERROR_NOT_SUPPORTED )
1850 return( status );
1851#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1852 return( PSA_ERROR_NOT_SUPPORTED );
1853
1854 /* Add cases for opaque driver here */
1855#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1856#if defined(PSA_CRYPTO_DRIVER_TEST)
1857 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001858 status = mbedtls_test_opaque_mac_verify_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001859 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001860 attributes,
1861 key_buffer, key_buffer_size,
1862 alg );
1863
1864 if( status == PSA_SUCCESS )
1865 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1866
1867 return( status );
1868#endif /* PSA_CRYPTO_DRIVER_TEST */
1869#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1870 default:
1871 /* Key is declared with a lifetime not known to us */
1872 (void) status;
1873 (void) key_buffer;
1874 (void) key_buffer_size;
1875 (void) alg;
1876 return( PSA_ERROR_INVALID_ARGUMENT );
1877 }
1878}
1879
1880psa_status_t psa_driver_wrapper_mac_update(
1881 psa_mac_operation_t *operation,
1882 const uint8_t *input,
1883 size_t input_length )
1884{
1885 switch( operation->id )
1886 {
1887#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1888 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001889 return( mbedtls_psa_mac_update( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001890 input, input_length ) );
1891#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1892
1893#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1894#if defined(PSA_CRYPTO_DRIVER_TEST)
1895 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001896 return( mbedtls_test_transparent_mac_update(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001897 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001898 input, input_length ) );
1899
1900 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001901 return( mbedtls_test_opaque_mac_update(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001902 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001903 input, input_length ) );
1904#endif /* PSA_CRYPTO_DRIVER_TEST */
1905#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1906 default:
1907 (void) input;
1908 (void) input_length;
1909 return( PSA_ERROR_INVALID_ARGUMENT );
1910 }
1911}
1912
1913psa_status_t psa_driver_wrapper_mac_sign_finish(
1914 psa_mac_operation_t *operation,
1915 uint8_t *mac,
1916 size_t mac_size,
1917 size_t *mac_length )
1918{
1919 switch( operation->id )
1920 {
1921#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1922 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001923 return( mbedtls_psa_mac_sign_finish( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001924 mac, mac_size, mac_length ) );
1925#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1926
1927#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1928#if defined(PSA_CRYPTO_DRIVER_TEST)
1929 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001930 return( mbedtls_test_transparent_mac_sign_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001931 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001932 mac, mac_size, mac_length ) );
1933
1934 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001935 return( mbedtls_test_opaque_mac_sign_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001936 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001937 mac, mac_size, mac_length ) );
1938#endif /* PSA_CRYPTO_DRIVER_TEST */
1939#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1940 default:
1941 (void) mac;
1942 (void) mac_size;
1943 (void) mac_length;
1944 return( PSA_ERROR_INVALID_ARGUMENT );
1945 }
1946}
1947
1948psa_status_t psa_driver_wrapper_mac_verify_finish(
1949 psa_mac_operation_t *operation,
1950 const uint8_t *mac,
1951 size_t mac_length )
1952{
1953 switch( operation->id )
1954 {
1955#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1956 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001957 return( mbedtls_psa_mac_verify_finish( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001958 mac, mac_length ) );
1959#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1960
1961#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1962#if defined(PSA_CRYPTO_DRIVER_TEST)
1963 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001964 return( mbedtls_test_transparent_mac_verify_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001965 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001966 mac, mac_length ) );
1967
1968 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001969 return( mbedtls_test_opaque_mac_verify_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001970 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001971 mac, mac_length ) );
1972#endif /* PSA_CRYPTO_DRIVER_TEST */
1973#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1974 default:
1975 (void) mac;
1976 (void) mac_length;
1977 return( PSA_ERROR_INVALID_ARGUMENT );
1978 }
1979}
1980
1981psa_status_t psa_driver_wrapper_mac_abort(
1982 psa_mac_operation_t *operation )
1983{
Steven Cooremand13a70f2021-03-19 15:24:23 +01001984 switch( operation->id )
1985 {
1986#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1987 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooremane6804192021-03-19 18:28:56 +01001988 return( mbedtls_psa_mac_abort( &operation->ctx.mbedtls_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001989#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1990
1991#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1992#if defined(PSA_CRYPTO_DRIVER_TEST)
1993 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001994 return( mbedtls_test_transparent_mac_abort(
Steven Cooremane6804192021-03-19 18:28:56 +01001995 &operation->ctx.transparent_test_driver_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001996 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001997 return( mbedtls_test_opaque_mac_abort(
Steven Cooremane6804192021-03-19 18:28:56 +01001998 &operation->ctx.opaque_test_driver_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001999#endif /* PSA_CRYPTO_DRIVER_TEST */
2000#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
2001 default:
Steven Cooremane6804192021-03-19 18:28:56 +01002002 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooremand13a70f2021-03-19 15:24:23 +01002003 }
Steven Cooremand13a70f2021-03-19 15:24:23 +01002004}
Steven Cooremancd84cb42020-07-16 20:28:36 +02002005/* End of automatically generated file. */