blob: 1597b00d0fc691ac7134950241b4e6488fbc4664 [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
Mateusz Starzyk2c09c9b2021-05-14 22:20:10 +020022#include "common.h"
Ronald Cronde822812021-03-17 16:08:20 +010023#include "psa_crypto_aead.h"
Ronald Cron0b805592020-12-14 18:08:20 +010024#include "psa_crypto_cipher.h"
Steven Cooremancd84cb42020-07-16 20:28:36 +020025#include "psa_crypto_core.h"
26#include "psa_crypto_driver_wrappers.h"
Steven Cooreman830aff22021-03-09 09:50:44 +010027#include "psa_crypto_hash.h"
Steven Cooremand13a70f2021-03-19 15:24:23 +010028#include "psa_crypto_mac.h"
Steven Cooreman830aff22021-03-09 09:50:44 +010029
Steven Cooreman2a1664c2020-07-20 15:33:08 +020030#include "mbedtls/platform.h"
31
Gilles Peskine1905a242021-04-24 13:19:45 +020032#if defined(MBEDTLS_PSA_CRYPTO_C)
33
Steven Cooreman2a1664c2020-07-20 15:33:08 +020034#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS)
Steven Cooremancd84cb42020-07-16 20:28:36 +020035
36/* Include test driver definition when running tests */
Steven Cooremanf1720ea2020-07-24 18:41:58 +020037#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman56250fd2020-09-04 13:07:15 +020038#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020039#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020040#endif
41#ifndef PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020042#define PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020043#endif
Ronald Cronce1d8d22021-04-30 17:00:34 +020044#include "test/drivers/test_driver.h"
Steven Cooremanf1720ea2020-07-24 18:41:58 +020045#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooremancd84cb42020-07-16 20:28:36 +020046
Steven Cooreman56250fd2020-09-04 13:07:15 +020047/* Repeat above block for each JSON-declared driver during autogeneration */
Steven Cooremanaa87fd02021-03-15 18:54:03 +010048#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */
Steven Cooreman56250fd2020-09-04 13:07:15 +020049
Steven Cooreman1e582352021-02-18 17:24:37 +010050/* Auto-generated values depending on which drivers are registered.
51 * ID 0 is reserved for unallocated operations.
52 * ID 1 is reserved for the Mbed TLS software driver. */
Steven Cooreman830aff22021-03-09 09:50:44 +010053#define PSA_CRYPTO_MBED_TLS_DRIVER_ID (1)
54
Steven Cooreman37941cb2020-07-28 18:49:51 +020055#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman1e582352021-02-18 17:24:37 +010056#define PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID (2)
57#define PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID (3)
Steven Cooreman37941cb2020-07-28 18:49:51 +020058#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman2a1664c2020-07-20 15:33:08 +020059
60/* Support the 'old' SE interface when asked to */
Steven Cooreman7a250572020-07-17 16:43:05 +020061#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Steven Cooreman56250fd2020-09-04 13:07:15 +020062/* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style
63 * SE driver is present, to avoid unused argument errors at compile time. */
64#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020065#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020066#endif
Steven Cooreman7a250572020-07-17 16:43:05 +020067#include "psa_crypto_se.h"
68#endif
69
Steven Cooremancd84cb42020-07-16 20:28:36 +020070/* Start delegation functions */
gabor-mezei-arm50eac352021-04-22 11:32:19 +020071psa_status_t psa_driver_wrapper_sign_message(
72 const psa_key_attributes_t *attributes,
73 const uint8_t *key_buffer,
74 size_t key_buffer_size,
75 psa_algorithm_t alg,
76 const uint8_t *input,
77 size_t input_length,
78 uint8_t *signature,
79 size_t signature_size,
80 size_t *signature_length )
81{
82 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
gabor-mezei-arm50eac352021-04-22 11:32:19 +020083 psa_key_location_t location =
84 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
85
86 switch( location )
87 {
88 case PSA_KEY_LOCATION_LOCAL_STORAGE:
89 /* Key is stored in the slot in export representation, so
90 * cycle through all known transparent accelerators */
91#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
92#if defined(PSA_CRYPTO_DRIVER_TEST)
93 status = mbedtls_test_transparent_signature_sign_message(
94 attributes,
95 key_buffer,
96 key_buffer_size,
97 alg,
98 input,
99 input_length,
100 signature,
101 signature_size,
102 signature_length );
103 /* Declared with fallback == true */
104 if( status != PSA_ERROR_NOT_SUPPORTED )
105 return( status );
106#endif /* PSA_CRYPTO_DRIVER_TEST */
107#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200108 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200109
110 /* Add cases for opaque driver here */
111#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
112#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm2522c0b2021-04-27 18:52:51 +0200113 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200114 status = mbedtls_test_opaque_signature_sign_message(
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200115 attributes,
116 key_buffer,
117 key_buffer_size,
118 alg,
119 input,
120 input_length,
121 signature,
122 signature_size,
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200123 signature_length );
124 if( status != PSA_ERROR_NOT_SUPPORTED )
125 return( status );
126 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200127#endif /* PSA_CRYPTO_DRIVER_TEST */
128#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
129 default:
130 /* Key is declared with a lifetime not known to us */
131 (void)status;
gabor-mezei-armd5218df2021-05-12 11:12:25 +0200132 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200133 }
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200134
135 return( psa_sign_message_builtin( attributes,
136 key_buffer,
137 key_buffer_size,
138 alg,
139 input,
140 input_length,
141 signature,
142 signature_size,
143 signature_length ) );
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200144}
145
146psa_status_t psa_driver_wrapper_verify_message(
147 const psa_key_attributes_t *attributes,
148 const uint8_t *key_buffer,
149 size_t key_buffer_size,
150 psa_algorithm_t alg,
151 const uint8_t *input,
152 size_t input_length,
153 const uint8_t *signature,
154 size_t signature_length )
155{
156 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200157 psa_key_location_t location =
158 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
159
160 switch( location )
161 {
162 case PSA_KEY_LOCATION_LOCAL_STORAGE:
163 /* Key is stored in the slot in export representation, so
164 * cycle through all known transparent accelerators */
165#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
166#if defined(PSA_CRYPTO_DRIVER_TEST)
167 status = mbedtls_test_transparent_signature_verify_message(
168 attributes,
169 key_buffer,
170 key_buffer_size,
171 alg,
172 input,
173 input_length,
174 signature,
175 signature_length );
176 /* Declared with fallback == true */
177 if( status != PSA_ERROR_NOT_SUPPORTED )
178 return( status );
179#endif /* PSA_CRYPTO_DRIVER_TEST */
180#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200181 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200182
183 /* Add cases for opaque driver here */
184#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
185#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm2522c0b2021-04-27 18:52:51 +0200186 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200187 return( mbedtls_test_opaque_signature_verify_message(
188 attributes,
189 key_buffer,
190 key_buffer_size,
191 alg,
192 input,
193 input_length,
194 signature,
195 signature_length ) );
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200196 if( status != PSA_ERROR_NOT_SUPPORTED )
197 return( status );
198 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200199#endif /* PSA_CRYPTO_DRIVER_TEST */
200#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
201 default:
202 /* Key is declared with a lifetime not known to us */
203 (void)status;
gabor-mezei-armd5218df2021-05-12 11:12:25 +0200204 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200205 }
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200206
207 return( psa_verify_message_builtin( attributes,
208 key_buffer,
209 key_buffer_size,
210 alg,
211 input,
212 input_length,
213 signature,
214 signature_length ) );
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200215}
216
Ronald Cron9f17aa42020-12-08 17:07:25 +0100217psa_status_t psa_driver_wrapper_sign_hash(
218 const psa_key_attributes_t *attributes,
219 const uint8_t *key_buffer, size_t key_buffer_size,
220 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
221 uint8_t *signature, size_t signature_size, size_t *signature_length )
Steven Cooremancd84cb42020-07-16 20:28:36 +0200222{
Steven Cooreman7a250572020-07-17 16:43:05 +0200223 /* Try dynamically-registered SE interface first */
224#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
225 const psa_drv_se_t *drv;
226 psa_drv_se_context_t *drv_context;
227
Ronald Cron9f17aa42020-12-08 17:07:25 +0100228 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman7a250572020-07-17 16:43:05 +0200229 {
230 if( drv->asymmetric == NULL ||
231 drv->asymmetric->p_sign == NULL )
232 {
233 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200234 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman7a250572020-07-17 16:43:05 +0200235 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100236 return( drv->asymmetric->p_sign(
237 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
238 alg, hash, hash_length,
239 signature, signature_size, signature_length ) );
Steven Cooreman7a250572020-07-17 16:43:05 +0200240 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200241#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman7a250572020-07-17 16:43:05 +0200242
Ronald Cronfce9df22020-12-08 18:06:03 +0100243 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100244 psa_key_location_t location =
245 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200246
247 switch( location )
248 {
249 case PSA_KEY_LOCATION_LOCAL_STORAGE:
250 /* Key is stored in the slot in export representation, so
251 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100252#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200253#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200254 status = mbedtls_test_transparent_signature_sign_hash( attributes,
Ronald Cron9f17aa42020-12-08 17:07:25 +0100255 key_buffer,
256 key_buffer_size,
Steven Cooremancd84cb42020-07-16 20:28:36 +0200257 alg,
258 hash,
259 hash_length,
260 signature,
261 signature_size,
262 signature_length );
263 /* Declared with fallback == true */
264 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200265 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200266#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100267#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200268 /* Fell through, meaning no accelerator supports this operation */
gabor-mezei-arm6883fd22021-05-05 14:18:36 +0200269 return( psa_sign_hash_builtin( attributes,
270 key_buffer,
271 key_buffer_size,
272 alg,
273 hash,
274 hash_length,
275 signature,
276 signature_size,
277 signature_length ) );
Ronald Cronfce9df22020-12-08 18:06:03 +0100278
Steven Cooremancd84cb42020-07-16 20:28:36 +0200279 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100280#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200281#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100282 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200283 return( mbedtls_test_opaque_signature_sign_hash( attributes,
284 key_buffer,
285 key_buffer_size,
286 alg,
287 hash,
288 hash_length,
289 signature,
290 signature_size,
291 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200292#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100293#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200294 default:
295 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100296 (void)status;
297 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200298 }
Steven Cooremancd84cb42020-07-16 20:28:36 +0200299}
300
Ronald Cron9f17aa42020-12-08 17:07:25 +0100301psa_status_t psa_driver_wrapper_verify_hash(
302 const psa_key_attributes_t *attributes,
303 const uint8_t *key_buffer, size_t key_buffer_size,
304 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
305 const uint8_t *signature, size_t signature_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200306{
Steven Cooreman55ae2172020-07-17 19:46:15 +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 Cron9f17aa42020-12-08 17:07:25 +0100312 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200313 {
314 if( drv->asymmetric == NULL ||
315 drv->asymmetric->p_verify == NULL )
316 {
317 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200318 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200319 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100320 return( drv->asymmetric->p_verify(
321 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
322 alg, hash, hash_length,
323 signature, signature_length ) );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200324 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200325#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200326
Ronald Cronfce9df22020-12-08 18:06:03 +0100327 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100328 psa_key_location_t location =
329 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200330
331 switch( location )
332 {
333 case PSA_KEY_LOCATION_LOCAL_STORAGE:
334 /* Key is stored in the slot in export representation, so
335 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100336#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200337#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200338 status = mbedtls_test_transparent_signature_verify_hash(
339 attributes,
340 key_buffer,
341 key_buffer_size,
342 alg,
343 hash,
344 hash_length,
345 signature,
346 signature_length );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200347 /* Declared with fallback == true */
348 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200349 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200350#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100351#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
352
gabor-mezei-arm6883fd22021-05-05 14:18:36 +0200353 return( psa_verify_hash_builtin( attributes,
354 key_buffer,
355 key_buffer_size,
356 alg,
357 hash,
358 hash_length,
359 signature,
360 signature_length ) );
Ronald Cronfce9df22020-12-08 18:06:03 +0100361
Steven Cooreman55ae2172020-07-17 19:46:15 +0200362 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100363#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200364#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100365 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200366 return( mbedtls_test_opaque_signature_verify_hash( attributes,
367 key_buffer,
368 key_buffer_size,
369 alg,
370 hash,
371 hash_length,
372 signature,
373 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200374#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100375#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200376 default:
377 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100378 (void)status;
379 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200380 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200381}
382
Archanad8a83dc2021-06-14 10:04:16 +0530383/** calculate the key buffer size required to store the key material of a key
384 * associated with an opaque driver from input key data.
385 *
386 *
387 * \param[in] attributes The key attributes
388 * \param[in] data The input key data.
389 * \param[in] data_length The input data length.
390 * \param[out] key_buffer_size Minimum buffer size to contain the key material.
391 *
392 * \retval #PSA_SUCCESS
393 * \retval #PSA_ERROR_INVALID_ARGUMENT
394 * \retval #PSA_ERROR_NOT_SUPPORTED
395 */
396psa_status_t psa_driver_wrapper_get_key_buffer_size_from_key_data(
397 const psa_key_attributes_t *attributes,
398 const uint8_t *data,
399 size_t data_length,
400 size_t *key_buffer_size )
401{
402 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
403 psa_key_type_t key_type = attributes->core.type;
404
405 *key_buffer_size = 0;
406 switch( location )
407 {
408#if defined(PSA_CRYPTO_DRIVER_TEST)
409 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
410 *key_buffer_size = mbedtls_test_opaque_size_function( key_type,
411 PSA_BYTES_TO_BITS( data_length ) );
412 return( ( *key_buffer_size != 0 ) ?
413 PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED );
414#endif /* PSA_CRYPTO_DRIVER_TEST */
415
416 default:
417 (void)key_type;
418 (void)data;
419 (void)data_length;
420 return( PSA_ERROR_INVALID_ARGUMENT );
421 }
422}
423
Steven Cooremanb938b0b2021-04-06 13:08:42 +0200424/** Get the key buffer size required to store the key material of a key
Archanad8a83dc2021-06-14 10:04:16 +0530425 * associated with an opaque driver.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200426 *
Ronald Cron31216282020-12-05 18:47:56 +0100427 * \param[in] attributes The key attributes.
428 * \param[out] key_buffer_size Minimum buffer size to contain the key material
Steven Cooreman56250fd2020-09-04 13:07:15 +0200429 *
430 * \retval #PSA_SUCCESS
Ronald Cron31216282020-12-05 18:47:56 +0100431 * The minimum size for a buffer to contain the key material has been
432 * returned successfully.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200433 * \retval #PSA_ERROR_NOT_SUPPORTED
Ronald Cron31216282020-12-05 18:47:56 +0100434 * The type and/or the size in bits of the key or the combination of
435 * the two is not supported.
Archanad8a83dc2021-06-14 10:04:16 +0530436 * \retval #PSA_ERROR_INVALID_ARGUMENT
437 * The key is declared with a lifetime not known to us.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200438 */
Ronald Cron9df74be2020-12-05 19:15:23 +0100439psa_status_t psa_driver_wrapper_get_key_buffer_size(
Ronald Cron31216282020-12-05 18:47:56 +0100440 const psa_key_attributes_t *attributes,
441 size_t *key_buffer_size )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200442{
John Durkop2c618352020-09-22 06:54:01 -0700443 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
444 psa_key_type_t key_type = attributes->core.type;
445 size_t key_bits = attributes->core.bits;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200446
Ronald Cron31216282020-12-05 18:47:56 +0100447 *key_buffer_size = 0;
John Durkop2c618352020-09-22 06:54:01 -0700448 switch( location )
449 {
John Durkop2c618352020-09-22 06:54:01 -0700450#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100451 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100452#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS)
453 /* Emulate property 'builtin_key_size' */
454 if( psa_key_id_is_builtin(
455 MBEDTLS_SVC_KEY_ID_GET_KEY_ID(
456 psa_get_key_id( attributes ) ) ) )
457 {
Steven Cooreman203bcbb2021-03-18 17:17:40 +0100458 *key_buffer_size = sizeof( psa_drv_slot_number_t );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100459 return( PSA_SUCCESS );
460 }
461#endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */
Archana4d7ae1d2021-07-07 02:50:22 +0530462 *key_buffer_size = mbedtls_test_opaque_size_function( key_type, key_bits );
Ronald Cron4607c822021-04-14 10:55:34 +0200463 return( ( *key_buffer_size != 0 ) ?
464 PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED );
John Durkop2c618352020-09-22 06:54:01 -0700465#endif /* PSA_CRYPTO_DRIVER_TEST */
466
467 default:
Ronald Cron9df74be2020-12-05 19:15:23 +0100468 (void)key_type;
469 (void)key_bits;
Archanad8a83dc2021-06-14 10:04:16 +0530470 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200471 }
472}
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200473
Ronald Cron977c2472020-10-13 08:32:21 +0200474psa_status_t psa_driver_wrapper_generate_key(
475 const psa_key_attributes_t *attributes,
476 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200477{
Ronald Cron977c2472020-10-13 08:32:21 +0200478 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
479 psa_key_location_t location =
480 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
481
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200482 /* Try dynamically-registered SE interface first */
483#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
484 const psa_drv_se_t *drv;
485 psa_drv_se_context_t *drv_context;
486
Ronald Cron977c2472020-10-13 08:32:21 +0200487 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200488 {
489 size_t pubkey_length = 0; /* We don't support this feature yet */
490 if( drv->key_management == NULL ||
491 drv->key_management->p_generate == NULL )
492 {
493 /* Key is defined as being in SE, but we have no way to generate it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200494 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200495 }
496 return( drv->key_management->p_generate(
Ronald Cron977c2472020-10-13 08:32:21 +0200497 drv_context,
498 *( (psa_key_slot_number_t *)key_buffer ),
Ronald Cronea0f8a62020-11-25 17:52:23 +0100499 attributes, NULL, 0, &pubkey_length ) );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200500 }
501#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
502
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200503 switch( location )
504 {
505 case PSA_KEY_LOCATION_LOCAL_STORAGE:
Ronald Cron977c2472020-10-13 08:32:21 +0200506#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200507 /* Transparent drivers are limited to generating asymmetric keys */
Ronald Cron977c2472020-10-13 08:32:21 +0200508 if( PSA_KEY_TYPE_IS_ASYMMETRIC( attributes->core.type ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200509 {
Ronald Cron977c2472020-10-13 08:32:21 +0200510 /* Cycle through all known transparent accelerators */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200511#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200512 status = mbedtls_test_transparent_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200513 attributes, key_buffer, key_buffer_size,
514 key_buffer_length );
515 /* Declared with fallback == true */
516 if( status != PSA_ERROR_NOT_SUPPORTED )
517 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200518#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200519 }
520#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
521
522 /* Software fallback */
523 status = psa_generate_key_internal(
524 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200525 break;
Ronald Cron977c2472020-10-13 08:32:21 +0200526
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200527 /* Add cases for opaque driver here */
Ronald Cron977c2472020-10-13 08:32:21 +0200528#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200529#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100530 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200531 status = mbedtls_test_opaque_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200532 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200533 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200534#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200535#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
536
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200537 default:
538 /* Key is declared with a lifetime not known to us */
539 status = PSA_ERROR_INVALID_ARGUMENT;
540 break;
541 }
542
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200543 return( status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200544}
545
Ronald Cron83282872020-11-22 14:02:39 +0100546psa_status_t psa_driver_wrapper_import_key(
547 const psa_key_attributes_t *attributes,
548 const uint8_t *data,
549 size_t data_length,
550 uint8_t *key_buffer,
551 size_t key_buffer_size,
552 size_t *key_buffer_length,
553 size_t *bits )
Steven Cooreman04524762020-10-13 17:43:44 +0200554{
Steven Cooreman04524762020-10-13 17:43:44 +0200555 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cronbf33c932020-11-28 18:06:53 +0100556 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
557 psa_get_key_lifetime( attributes ) );
Steven Cooreman04524762020-10-13 17:43:44 +0200558
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100559 /* Try dynamically-registered SE interface first */
560#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
561 const psa_drv_se_t *drv;
562 psa_drv_se_context_t *drv_context;
563
564 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
565 {
566 if( drv->key_management == NULL ||
567 drv->key_management->p_import == NULL )
568 return( PSA_ERROR_NOT_SUPPORTED );
569
570 /* The driver should set the number of key bits, however in
571 * case it doesn't, we initialize bits to an invalid value. */
572 *bits = PSA_MAX_KEY_BITS + 1;
573 status = drv->key_management->p_import(
574 drv_context,
575 *( (psa_key_slot_number_t *)key_buffer ),
576 attributes, data, data_length, bits );
577
578 if( status != PSA_SUCCESS )
579 return( status );
580
581 if( (*bits) > PSA_MAX_KEY_BITS )
582 return( PSA_ERROR_NOT_SUPPORTED );
583
584 return( PSA_SUCCESS );
585 }
586#endif /* PSA_CRYPTO_SE_C */
587
Ronald Cronbf33c932020-11-28 18:06:53 +0100588 switch( location )
589 {
590 case PSA_KEY_LOCATION_LOCAL_STORAGE:
591 /* Key is stored in the slot in export representation, so
592 * cycle through all known transparent accelerators */
593#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
594#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200595 status = mbedtls_test_transparent_import_key(
596 attributes,
597 data, data_length,
598 key_buffer, key_buffer_size,
599 key_buffer_length, bits );
Ronald Cronbf33c932020-11-28 18:06:53 +0100600 /* Declared with fallback == true */
601 if( status != PSA_ERROR_NOT_SUPPORTED )
602 return( status );
603#endif /* PSA_CRYPTO_DRIVER_TEST */
604#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
605 /* Fell through, meaning no accelerator supports this operation */
606 return( psa_import_key_into_slot( attributes,
607 data, data_length,
608 key_buffer, key_buffer_size,
609 key_buffer_length, bits ) );
Archana4d7ae1d2021-07-07 02:50:22 +0530610 /* Add cases for opaque driver here */
611#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
612#if defined(PSA_CRYPTO_DRIVER_TEST)
613 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
614 return( mbedtls_test_opaque_import_key(
615 attributes,
616 data, data_length,
617 key_buffer, key_buffer_size,
618 key_buffer_length, bits ) );
619#endif /* PSA_CRYPTO_DRIVER_TEST */
620#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cronbf33c932020-11-28 18:06:53 +0100621 default:
Ronald Cronbf33c932020-11-28 18:06:53 +0100622 (void)status;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100623 return( PSA_ERROR_INVALID_ARGUMENT );
Ronald Cronbf33c932020-11-28 18:06:53 +0100624 }
625
Steven Cooreman04524762020-10-13 17:43:44 +0200626}
627
Ronald Cron67227982020-11-26 15:16:05 +0100628psa_status_t psa_driver_wrapper_export_key(
629 const psa_key_attributes_t *attributes,
630 const uint8_t *key_buffer, size_t key_buffer_size,
631 uint8_t *data, size_t data_size, size_t *data_length )
632
633{
634 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
635 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
636 psa_get_key_lifetime( attributes ) );
637
Ronald Cron152e3f82020-11-26 16:06:41 +0100638 /* Try dynamically-registered SE interface first */
639#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
640 const psa_drv_se_t *drv;
641 psa_drv_se_context_t *drv_context;
642
643 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
644 {
645 if( ( drv->key_management == NULL ) ||
646 ( drv->key_management->p_export == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100647 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100648 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100649 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100650
651 return( drv->key_management->p_export(
652 drv_context,
653 *( (psa_key_slot_number_t *)key_buffer ),
654 data, data_size, data_length ) );
655 }
656#endif /* PSA_CRYPTO_SE_C */
657
Ronald Cron67227982020-11-26 15:16:05 +0100658 switch( location )
659 {
660 case PSA_KEY_LOCATION_LOCAL_STORAGE:
661 return( psa_export_key_internal( attributes,
662 key_buffer,
663 key_buffer_size,
664 data,
665 data_size,
666 data_length ) );
667
668 /* Add cases for opaque driver here */
669#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
670#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100671 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200672 return( mbedtls_test_opaque_export_key( attributes,
673 key_buffer,
674 key_buffer_size,
675 data,
676 data_size,
677 data_length ) );
Ronald Cron67227982020-11-26 15:16:05 +0100678#endif /* PSA_CRYPTO_DRIVER_TEST */
679#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
680 default:
681 /* Key is declared with a lifetime not known to us */
682 return( status );
683 }
684}
685
Ronald Cron84cc9942020-11-25 14:30:05 +0100686psa_status_t psa_driver_wrapper_export_public_key(
687 const psa_key_attributes_t *attributes,
688 const uint8_t *key_buffer, size_t key_buffer_size,
689 uint8_t *data, size_t data_size, size_t *data_length )
690
Steven Cooremanb9b84422020-10-14 14:39:20 +0200691{
Steven Cooremanb9b84422020-10-14 14:39:20 +0200692 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Cron84cc9942020-11-25 14:30:05 +0100693 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
694 psa_get_key_lifetime( attributes ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200695
Ronald Cron152e3f82020-11-26 16:06:41 +0100696 /* Try dynamically-registered SE interface first */
697#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
698 const psa_drv_se_t *drv;
699 psa_drv_se_context_t *drv_context;
700
701 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
702 {
703 if( ( drv->key_management == NULL ) ||
704 ( drv->key_management->p_export_public == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100705 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100706 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100707 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100708
709 return( drv->key_management->p_export_public(
710 drv_context,
711 *( (psa_key_slot_number_t *)key_buffer ),
712 data, data_size, data_length ) );
713 }
714#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
715
Steven Cooremanb9b84422020-10-14 14:39:20 +0200716 switch( location )
717 {
718 case PSA_KEY_LOCATION_LOCAL_STORAGE:
719 /* Key is stored in the slot in export representation, so
720 * cycle through all known transparent accelerators */
Ronald Cron67227982020-11-26 15:16:05 +0100721#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200722#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200723 status = mbedtls_test_transparent_export_public_key(
724 attributes,
725 key_buffer,
726 key_buffer_size,
727 data,
728 data_size,
729 data_length );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200730 /* Declared with fallback == true */
731 if( status != PSA_ERROR_NOT_SUPPORTED )
732 return( status );
733#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100734#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200735 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron67227982020-11-26 15:16:05 +0100736 return( psa_export_public_key_internal( attributes,
737 key_buffer,
738 key_buffer_size,
739 data,
740 data_size,
741 data_length ) );
742
Steven Cooremanb9b84422020-10-14 14:39:20 +0200743 /* Add cases for opaque driver here */
Ronald Cron67227982020-11-26 15:16:05 +0100744#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200745#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100746 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200747 return( mbedtls_test_opaque_export_public_key( attributes,
748 key_buffer,
749 key_buffer_size,
750 data,
751 data_size,
752 data_length ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200753#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100754#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200755 default:
756 /* Key is declared with a lifetime not known to us */
757 return( status );
758 }
Steven Cooremanb9b84422020-10-14 14:39:20 +0200759}
760
Steven Cooreman6801f082021-02-19 17:21:22 +0100761psa_status_t psa_driver_wrapper_get_builtin_key(
762 psa_drv_slot_number_t slot_number,
763 psa_key_attributes_t *attributes,
764 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
765{
766 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
767 switch( location )
768 {
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100769#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100770 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200771 return( mbedtls_test_opaque_get_builtin_key(
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100772 slot_number,
773 attributes,
774 key_buffer, key_buffer_size, key_buffer_length ) );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100775#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman6801f082021-02-19 17:21:22 +0100776 default:
777 (void) slot_number;
778 (void) key_buffer;
779 (void) key_buffer_size;
780 (void) key_buffer_length;
781 return( PSA_ERROR_DOES_NOT_EXIST );
782 }
783}
784
Archana8a180362021-07-05 02:18:48 +0530785psa_status_t psa_driver_wrapper_copy_key(
786 psa_key_attributes_t *attributes,
787 const uint8_t *source_key, size_t source_key_size,
788 uint8_t *target_key_buffer, size_t target_buffer_size, size_t *key_length )
789{
790 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
791 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
792#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
793 const psa_drv_se_t *drv;
794 psa_drv_se_context_t *drv_context;
795
796 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
797 {
798 /* Copying to a secure element is not implemented yet. */
799 return( PSA_ERROR_NOT_SUPPORTED );
800 }
801#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
802
803 switch( location )
804 {
805#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
806#if defined(PSA_CRYPTO_DRIVER_TEST)
807 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
808 return( mbedtls_test_opaque_copy_key( attributes, source_key,
809 source_key_size,
810 target_key_buffer,
811 target_buffer_size,
812 key_length ) );
813#endif /* PSA_CRYPTO_DRIVER_TEST */
814#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
815 default:
816 (void)source_key;
817 (void)source_key_size;
818 (void)target_key_buffer;
819 (void)target_buffer_size;
820 (void)key_length;
821 status = PSA_ERROR_INVALID_ARGUMENT;
822 }
823 return( status );
824}
825
Steven Cooreman37941cb2020-07-28 18:49:51 +0200826/*
827 * Cipher functions
828 */
829psa_status_t psa_driver_wrapper_cipher_encrypt(
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100830 const psa_key_attributes_t *attributes,
831 const uint8_t *key_buffer,
832 size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200833 psa_algorithm_t alg,
834 const uint8_t *input,
835 size_t input_length,
836 uint8_t *output,
837 size_t output_size,
838 size_t *output_length )
839{
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100840 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
841 psa_key_location_t location =
842 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200843
844 switch( location )
845 {
846 case PSA_KEY_LOCATION_LOCAL_STORAGE:
847 /* Key is stored in the slot in export representation, so
848 * cycle through all known transparent accelerators */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100849#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200850#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100851 status = mbedtls_test_transparent_cipher_encrypt( attributes,
852 key_buffer,
853 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200854 alg,
855 input,
856 input_length,
857 output,
858 output_size,
859 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200860 /* Declared with fallback == true */
861 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200862 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200863#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100864#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
865
866#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
867 return( mbedtls_psa_cipher_encrypt( attributes,
868 key_buffer,
869 key_buffer_size,
870 alg,
871 input,
872 input_length,
873 output,
874 output_size,
875 output_length ) );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200876#else
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200877 return( PSA_ERROR_NOT_SUPPORTED );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200878#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100879
Steven Cooreman37941cb2020-07-28 18:49:51 +0200880 /* Add cases for opaque driver here */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100881#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200882#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100883 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100884 return( mbedtls_test_opaque_cipher_encrypt( attributes,
885 key_buffer,
886 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200887 alg,
888 input,
889 input_length,
890 output,
891 output_size,
892 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200893#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100894#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
895
Steven Cooreman37941cb2020-07-28 18:49:51 +0200896 default:
897 /* Key is declared with a lifetime not known to us */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100898 (void)status;
899 (void)key_buffer;
900 (void)key_buffer_size;
901 (void)alg;
902 (void)input;
903 (void)input_length;
904 (void)output;
905 (void)output_size;
906 (void)output_length;
907 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200908 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200909}
910
911psa_status_t psa_driver_wrapper_cipher_decrypt(
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100912 const psa_key_attributes_t *attributes,
913 const uint8_t *key_buffer,
914 size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200915 psa_algorithm_t alg,
916 const uint8_t *input,
917 size_t input_length,
918 uint8_t *output,
919 size_t output_size,
920 size_t *output_length )
921{
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100922 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
923 psa_key_location_t location =
924 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200925
926 switch( location )
927 {
928 case PSA_KEY_LOCATION_LOCAL_STORAGE:
929 /* Key is stored in the slot in export representation, so
930 * cycle through all known transparent accelerators */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100931#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200932#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100933 status = mbedtls_test_transparent_cipher_decrypt( attributes,
934 key_buffer,
935 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200936 alg,
937 input,
938 input_length,
939 output,
940 output_size,
941 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200942 /* Declared with fallback == true */
943 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200944 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200945#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100946#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
947
948#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
949 return( mbedtls_psa_cipher_decrypt( attributes,
950 key_buffer,
951 key_buffer_size,
952 alg,
953 input,
954 input_length,
955 output,
956 output_size,
957 output_length ) );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200958#else
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200959 return( PSA_ERROR_NOT_SUPPORTED );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200960#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100961
Steven Cooreman37941cb2020-07-28 18:49:51 +0200962 /* Add cases for opaque driver here */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100963#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200964#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100965 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100966 return( mbedtls_test_opaque_cipher_decrypt( attributes,
967 key_buffer,
968 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200969 alg,
970 input,
971 input_length,
972 output,
973 output_size,
974 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200975#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100976#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
977
Steven Cooreman37941cb2020-07-28 18:49:51 +0200978 default:
979 /* Key is declared with a lifetime not known to us */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100980 (void)status;
981 (void)key_buffer;
982 (void)key_buffer_size;
983 (void)alg;
984 (void)input;
985 (void)input_length;
986 (void)output;
987 (void)output_size;
988 (void)output_length;
989 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200990 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200991}
992
993psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100994 psa_cipher_operation_t *operation,
995 const psa_key_attributes_t *attributes,
996 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200997 psa_algorithm_t alg )
998{
Ronald Cron0b805592020-12-14 18:08:20 +0100999 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Crona4af55f2020-12-14 14:36:06 +01001000 psa_key_location_t location =
1001 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001002
Steven Cooreman37941cb2020-07-28 18:49:51 +02001003 switch( location )
1004 {
1005 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1006 /* Key is stored in the slot in export representation, so
1007 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +01001008#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001009#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001010 status = mbedtls_test_transparent_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001011 &operation->ctx.transparent_test_driver_ctx,
1012 attributes,
1013 key_buffer,
1014 key_buffer_size,
1015 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001016 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +02001017 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001018 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +02001019
Ronald Cron0b805592020-12-14 18:08:20 +01001020 if( status != PSA_ERROR_NOT_SUPPORTED )
1021 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001022#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001023#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001024#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001025 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +01001026 status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001027 attributes,
1028 key_buffer,
1029 key_buffer_size,
1030 alg );
1031 if( status == PSA_SUCCESS )
Ronald Cron6e412a72021-03-10 09:58:47 +01001032 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Ronald Cron49fafa92021-03-10 08:34:23 +01001033
Ronald Cron7b4154d2021-03-19 14:49:41 +01001034 if( status != PSA_ERROR_NOT_SUPPORTED )
1035 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001036#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1037 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron0b805592020-12-14 18:08:20 +01001038
Steven Cooreman37941cb2020-07-28 18:49:51 +02001039 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +01001040#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001041#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +01001042 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001043 status = mbedtls_test_opaque_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001044 &operation->ctx.opaque_test_driver_ctx,
1045 attributes,
1046 key_buffer, key_buffer_size,
1047 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001048
Steven Cooreman37941cb2020-07-28 18:49:51 +02001049 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001050 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001051
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001052 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001053#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001054#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +02001055 default:
1056 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +01001057 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001058 (void)key_buffer;
1059 (void)key_buffer_size;
1060 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +02001061 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001062 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001063}
1064
1065psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +01001066 psa_cipher_operation_t *operation,
1067 const psa_key_attributes_t *attributes,
1068 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001069 psa_algorithm_t alg )
1070{
Steven Cooreman37941cb2020-07-28 18:49:51 +02001071 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Crona4af55f2020-12-14 14:36:06 +01001072 psa_key_location_t location =
1073 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001074
Steven Cooreman37941cb2020-07-28 18:49:51 +02001075 switch( location )
1076 {
1077 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1078 /* Key is stored in the slot in export representation, so
1079 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +01001080#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001081#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001082 status = mbedtls_test_transparent_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001083 &operation->ctx.transparent_test_driver_ctx,
1084 attributes,
1085 key_buffer,
1086 key_buffer_size,
1087 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001088 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +02001089 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001090 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +02001091
Ronald Cron0b805592020-12-14 18:08:20 +01001092 if( status != PSA_ERROR_NOT_SUPPORTED )
1093 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001094#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001095#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001096#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001097 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +01001098 status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001099 attributes,
1100 key_buffer,
1101 key_buffer_size,
1102 alg );
1103 if( status == PSA_SUCCESS )
1104 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1105
1106 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001107#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1108 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron49fafa92021-03-10 08:34:23 +01001109
Steven Cooreman37941cb2020-07-28 18:49:51 +02001110 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +01001111#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001112#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +01001113 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001114 status = mbedtls_test_opaque_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001115 &operation->ctx.opaque_test_driver_ctx,
1116 attributes,
1117 key_buffer, key_buffer_size,
1118 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001119
Steven Cooreman37941cb2020-07-28 18:49:51 +02001120 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001121 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001122
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001123 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001124#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001125#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +02001126 default:
1127 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +01001128 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001129 (void)key_buffer;
1130 (void)key_buffer_size;
1131 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +02001132 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001133 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001134}
1135
Steven Cooreman37941cb2020-07-28 18:49:51 +02001136psa_status_t psa_driver_wrapper_cipher_set_iv(
Ronald Cron6056fe82020-12-15 13:58:07 +01001137 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001138 const uint8_t *iv,
1139 size_t iv_length )
1140{
Ronald Cron49fafa92021-03-10 08:34:23 +01001141 switch( operation->id )
1142 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001143#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001144 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001145 return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001146 iv,
1147 iv_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001148#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001149
1150#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001151#if defined(PSA_CRYPTO_DRIVER_TEST)
1152 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001153 return( mbedtls_test_transparent_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001154 &operation->ctx.transparent_test_driver_ctx,
1155 iv, iv_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001156
Steven Cooreman37941cb2020-07-28 18:49:51 +02001157 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001158 return( mbedtls_test_opaque_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001159 &operation->ctx.opaque_test_driver_ctx,
1160 iv, iv_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001161#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001162#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001163 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001164
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001165 (void)iv;
1166 (void)iv_length;
1167
Ronald Crondd24c9b2020-12-15 14:10:01 +01001168 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001169}
1170
1171psa_status_t psa_driver_wrapper_cipher_update(
Ronald Cron6056fe82020-12-15 13:58:07 +01001172 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001173 const uint8_t *input,
1174 size_t input_length,
1175 uint8_t *output,
1176 size_t output_size,
1177 size_t *output_length )
1178{
Ronald Cron49fafa92021-03-10 08:34:23 +01001179 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001180 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001181#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001182 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001183 return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001184 input,
1185 input_length,
1186 output,
1187 output_size,
1188 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001189#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1190
Ronald Cron49fafa92021-03-10 08:34:23 +01001191#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001192#if defined(PSA_CRYPTO_DRIVER_TEST)
1193 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001194 return( mbedtls_test_transparent_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001195 &operation->ctx.transparent_test_driver_ctx,
1196 input, input_length,
1197 output, output_size, output_length ) );
1198
Steven Cooreman37941cb2020-07-28 18:49:51 +02001199 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001200 return( mbedtls_test_opaque_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001201 &operation->ctx.opaque_test_driver_ctx,
1202 input, input_length,
1203 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001204#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001205#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001206 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001207
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001208 (void)input;
1209 (void)input_length;
1210 (void)output;
1211 (void)output_size;
1212 (void)output_length;
1213
Ronald Crondd24c9b2020-12-15 14:10:01 +01001214 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001215}
1216
1217psa_status_t psa_driver_wrapper_cipher_finish(
Ronald Cron6056fe82020-12-15 13:58:07 +01001218 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001219 uint8_t *output,
1220 size_t output_size,
1221 size_t *output_length )
1222{
Ronald Cron49fafa92021-03-10 08:34:23 +01001223 switch( operation->id )
1224 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001225#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001226 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001227 return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001228 output,
1229 output_size,
1230 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001231#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001232
1233#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001234#if defined(PSA_CRYPTO_DRIVER_TEST)
1235 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001236 return( mbedtls_test_transparent_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001237 &operation->ctx.transparent_test_driver_ctx,
1238 output, output_size, output_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001239
Steven Cooreman37941cb2020-07-28 18:49:51 +02001240 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001241 return( mbedtls_test_opaque_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001242 &operation->ctx.opaque_test_driver_ctx,
1243 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001244#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001245#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001246 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001247
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001248 (void)output;
1249 (void)output_size;
1250 (void)output_length;
1251
Ronald Crondd24c9b2020-12-15 14:10:01 +01001252 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001253}
1254
1255psa_status_t psa_driver_wrapper_cipher_abort(
Ronald Cron6056fe82020-12-15 13:58:07 +01001256 psa_cipher_operation_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001257{
Ronald Crondd24c9b2020-12-15 14:10:01 +01001258 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001259
Ronald Cron49fafa92021-03-10 08:34:23 +01001260 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001261 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001262#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001263 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001264 return( mbedtls_psa_cipher_abort( &operation->ctx.mbedtls_ctx ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001265#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron49fafa92021-03-10 08:34:23 +01001266
1267#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001268#if defined(PSA_CRYPTO_DRIVER_TEST)
1269 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001270 status = mbedtls_test_transparent_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001271 &operation->ctx.transparent_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001272 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001273 &operation->ctx.transparent_test_driver_ctx,
1274 sizeof( operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001275 return( status );
Ronald Cron49fafa92021-03-10 08:34:23 +01001276
Steven Cooreman37941cb2020-07-28 18:49:51 +02001277 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001278 status = mbedtls_test_opaque_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001279 &operation->ctx.opaque_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001280 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001281 &operation->ctx.opaque_test_driver_ctx,
1282 sizeof( operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001283 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001284#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001285#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001286 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001287
Ronald Cron49fafa92021-03-10 08:34:23 +01001288 (void)status;
Ronald Crondd24c9b2020-12-15 14:10:01 +01001289 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001290}
1291
Steven Cooreman1e582352021-02-18 17:24:37 +01001292/*
1293 * Hashing functions
1294 */
1295psa_status_t psa_driver_wrapper_hash_compute(
1296 psa_algorithm_t alg,
1297 const uint8_t *input,
1298 size_t input_length,
1299 uint8_t *hash,
1300 size_t hash_size,
1301 size_t *hash_length)
1302{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001303 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001304
1305 /* Try accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001306#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001307 status = mbedtls_test_transparent_hash_compute(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001308 alg, input, input_length, hash, hash_size, hash_length );
Steven Cooremanf7638102021-03-04 15:14:36 +01001309 if( status != PSA_ERROR_NOT_SUPPORTED )
1310 return( status );
1311#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001312
1313 /* If software fallback is compiled in, try fallback */
1314#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1315 status = mbedtls_psa_hash_compute( alg, input, input_length,
1316 hash, hash_size, hash_length );
1317 if( status != PSA_ERROR_NOT_SUPPORTED )
1318 return( status );
1319#endif
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001320 (void) status;
1321 (void) alg;
1322 (void) input;
1323 (void) input_length;
1324 (void) hash;
1325 (void) hash_size;
1326 (void) hash_length;
Steven Cooreman1e582352021-02-18 17:24:37 +01001327
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001328 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman1e582352021-02-18 17:24:37 +01001329}
1330
1331psa_status_t psa_driver_wrapper_hash_setup(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001332 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001333 psa_algorithm_t alg )
1334{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001335 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001336
Steven Cooreman1e582352021-02-18 17:24:37 +01001337 /* Try setup on accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001338#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001339 status = mbedtls_test_transparent_hash_setup(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001340 &operation->ctx.test_driver_ctx, alg );
Steven Cooremanf7638102021-03-04 15:14:36 +01001341 if( status == PSA_SUCCESS )
1342 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1343
1344 if( status != PSA_ERROR_NOT_SUPPORTED )
1345 return( status );
1346#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001347
1348 /* If software fallback is compiled in, try fallback */
1349#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001350 status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
Steven Cooreman1e582352021-02-18 17:24:37 +01001351 if( status == PSA_SUCCESS )
Steven Cooreman1e582352021-02-18 17:24:37 +01001352 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Steven Cooreman1e582352021-02-18 17:24:37 +01001353
1354 if( status != PSA_ERROR_NOT_SUPPORTED )
1355 return( status );
1356#endif
1357 /* Nothing left to try if we fall through here */
1358 (void) status;
1359 (void) operation;
1360 (void) alg;
1361 return( PSA_ERROR_NOT_SUPPORTED );
1362}
1363
1364psa_status_t psa_driver_wrapper_hash_clone(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001365 const psa_hash_operation_t *source_operation,
1366 psa_hash_operation_t *target_operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001367{
Steven Cooreman1e582352021-02-18 17:24:37 +01001368 switch( source_operation->id )
1369 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001370#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1371 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1372 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1373 return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1374 &target_operation->ctx.mbedtls_ctx ) );
1375#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001376#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001377 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1378 target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Ronald Cron7f13fa22021-04-13 12:41:34 +02001379 return( mbedtls_test_transparent_hash_clone(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001380 &source_operation->ctx.test_driver_ctx,
1381 &target_operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001382#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001383 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001384 (void) target_operation;
1385 return( PSA_ERROR_BAD_STATE );
1386 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001387}
1388
1389psa_status_t psa_driver_wrapper_hash_update(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001390 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001391 const uint8_t *input,
1392 size_t input_length )
1393{
Steven Cooreman1e582352021-02-18 17:24:37 +01001394 switch( operation->id )
1395 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001396#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1397 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1398 return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
1399 input, input_length ) );
1400#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001401#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001402 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001403 return( mbedtls_test_transparent_hash_update(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001404 &operation->ctx.test_driver_ctx,
1405 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001406#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001407 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001408 (void) input;
1409 (void) input_length;
1410 return( PSA_ERROR_BAD_STATE );
1411 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001412}
1413
1414psa_status_t psa_driver_wrapper_hash_finish(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001415 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001416 uint8_t *hash,
1417 size_t hash_size,
1418 size_t *hash_length )
1419{
Steven Cooreman1e582352021-02-18 17:24:37 +01001420 switch( operation->id )
1421 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001422#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1423 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1424 return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1425 hash, hash_size, hash_length ) );
1426#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001427#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001428 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001429 return( mbedtls_test_transparent_hash_finish(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001430 &operation->ctx.test_driver_ctx,
1431 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001432#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001433 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001434 (void) hash;
1435 (void) hash_size;
1436 (void) hash_length;
1437 return( PSA_ERROR_BAD_STATE );
1438 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001439}
1440
1441psa_status_t psa_driver_wrapper_hash_abort(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001442 psa_hash_operation_t *operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001443{
Steven Cooreman1e582352021-02-18 17:24:37 +01001444 switch( operation->id )
1445 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001446#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1447 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1448 return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1449#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001450#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001451 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001452 return( mbedtls_test_transparent_hash_abort(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001453 &operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001454#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001455 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001456 return( PSA_ERROR_BAD_STATE );
1457 }
1458}
1459
Ronald Cronde822812021-03-17 16:08:20 +01001460psa_status_t psa_driver_wrapper_aead_encrypt(
1461 const psa_key_attributes_t *attributes,
1462 const uint8_t *key_buffer, size_t key_buffer_size,
1463 psa_algorithm_t alg,
1464 const uint8_t *nonce, size_t nonce_length,
1465 const uint8_t *additional_data, size_t additional_data_length,
1466 const uint8_t *plaintext, size_t plaintext_length,
1467 uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length )
1468{
1469 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1470 psa_key_location_t location =
1471 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1472
1473 switch( location )
1474 {
1475 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1476 /* Key is stored in the slot in export representation, so
1477 * cycle through all known transparent accelerators */
1478
1479#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1480#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001481 status = mbedtls_test_transparent_aead_encrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001482 attributes, key_buffer, key_buffer_size,
1483 alg,
1484 nonce, nonce_length,
1485 additional_data, additional_data_length,
1486 plaintext, plaintext_length,
1487 ciphertext, ciphertext_size, ciphertext_length );
1488 /* Declared with fallback == true */
1489 if( status != PSA_ERROR_NOT_SUPPORTED )
1490 return( status );
1491#endif /* PSA_CRYPTO_DRIVER_TEST */
1492#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1493
1494 /* Fell through, meaning no accelerator supports this operation */
1495 return( mbedtls_psa_aead_encrypt(
1496 attributes, key_buffer, key_buffer_size,
1497 alg,
1498 nonce, nonce_length,
1499 additional_data, additional_data_length,
1500 plaintext, plaintext_length,
1501 ciphertext, ciphertext_size, ciphertext_length ) );
1502
1503 /* Add cases for opaque driver here */
1504
1505 default:
1506 /* Key is declared with a lifetime not known to us */
1507 (void)status;
1508 return( PSA_ERROR_INVALID_ARGUMENT );
1509 }
1510}
1511
1512psa_status_t psa_driver_wrapper_aead_decrypt(
1513 const psa_key_attributes_t *attributes,
1514 const uint8_t *key_buffer, size_t key_buffer_size,
1515 psa_algorithm_t alg,
1516 const uint8_t *nonce, size_t nonce_length,
1517 const uint8_t *additional_data, size_t additional_data_length,
1518 const uint8_t *ciphertext, size_t ciphertext_length,
1519 uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length )
1520{
1521 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1522 psa_key_location_t location =
1523 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1524
1525 switch( location )
1526 {
1527 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1528 /* Key is stored in the slot in export representation, so
1529 * cycle through all known transparent accelerators */
1530
1531#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1532#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001533 status = mbedtls_test_transparent_aead_decrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001534 attributes, key_buffer, key_buffer_size,
1535 alg,
1536 nonce, nonce_length,
1537 additional_data, additional_data_length,
1538 ciphertext, ciphertext_length,
1539 plaintext, plaintext_size, plaintext_length );
1540 /* Declared with fallback == true */
1541 if( status != PSA_ERROR_NOT_SUPPORTED )
1542 return( status );
1543#endif /* PSA_CRYPTO_DRIVER_TEST */
1544#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1545
1546 /* Fell through, meaning no accelerator supports this operation */
1547 return( mbedtls_psa_aead_decrypt(
1548 attributes, key_buffer, key_buffer_size,
1549 alg,
1550 nonce, nonce_length,
1551 additional_data, additional_data_length,
1552 ciphertext, ciphertext_length,
1553 plaintext, plaintext_size, plaintext_length ) );
1554
1555 /* Add cases for opaque driver here */
1556
1557 default:
1558 /* Key is declared with a lifetime not known to us */
1559 (void)status;
1560 return( PSA_ERROR_INVALID_ARGUMENT );
1561 }
1562}
Steven Cooremand13a70f2021-03-19 15:24:23 +01001563
1564
1565/*
1566 * MAC functions
1567 */
1568psa_status_t psa_driver_wrapper_mac_compute(
1569 const psa_key_attributes_t *attributes,
1570 const uint8_t *key_buffer,
1571 size_t key_buffer_size,
1572 psa_algorithm_t alg,
1573 const uint8_t *input,
1574 size_t input_length,
1575 uint8_t *mac,
1576 size_t mac_size,
1577 size_t *mac_length )
1578{
1579 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1580 psa_key_location_t location =
1581 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1582
1583 switch( location )
1584 {
1585 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1586 /* Key is stored in the slot in export representation, so
1587 * cycle through all known transparent accelerators */
1588#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1589#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001590 status = mbedtls_test_transparent_mac_compute(
Steven Cooremand13a70f2021-03-19 15:24:23 +01001591 attributes, key_buffer, key_buffer_size, alg,
1592 input, input_length,
1593 mac, mac_size, mac_length );
1594 /* Declared with fallback == true */
1595 if( status != PSA_ERROR_NOT_SUPPORTED )
1596 return( status );
1597#endif /* PSA_CRYPTO_DRIVER_TEST */
1598#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1599#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1600 /* Fell through, meaning no accelerator supports this operation */
1601 status = mbedtls_psa_mac_compute(
1602 attributes, key_buffer, key_buffer_size, alg,
1603 input, input_length,
1604 mac, mac_size, mac_length );
1605 if( status != PSA_ERROR_NOT_SUPPORTED )
1606 return( status );
1607#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1608 return( PSA_ERROR_NOT_SUPPORTED );
1609
1610 /* Add cases for opaque driver here */
1611#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1612#if defined(PSA_CRYPTO_DRIVER_TEST)
1613 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001614 status = mbedtls_test_opaque_mac_compute(
Steven Cooremand13a70f2021-03-19 15:24:23 +01001615 attributes, key_buffer, key_buffer_size, alg,
1616 input, input_length,
1617 mac, mac_size, mac_length );
1618 return( status );
1619#endif /* PSA_CRYPTO_DRIVER_TEST */
1620#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1621 default:
1622 /* Key is declared with a lifetime not known to us */
1623 (void) key_buffer;
1624 (void) key_buffer_size;
1625 (void) alg;
1626 (void) input;
1627 (void) input_length;
1628 (void) mac;
1629 (void) mac_size;
1630 (void) mac_length;
1631 (void) status;
1632 return( PSA_ERROR_INVALID_ARGUMENT );
1633 }
1634}
1635
1636psa_status_t psa_driver_wrapper_mac_sign_setup(
1637 psa_mac_operation_t *operation,
1638 const psa_key_attributes_t *attributes,
1639 const uint8_t *key_buffer,
1640 size_t key_buffer_size,
1641 psa_algorithm_t alg )
1642{
1643 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1644 psa_key_location_t location =
1645 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1646
1647 switch( location )
1648 {
1649 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1650 /* Key is stored in the slot in export representation, so
1651 * cycle through all known transparent accelerators */
1652#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1653#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001654 status = mbedtls_test_transparent_mac_sign_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001655 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001656 attributes,
1657 key_buffer, key_buffer_size,
1658 alg );
1659 /* Declared with fallback == true */
1660 if( status == PSA_SUCCESS )
1661 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1662
1663 if( status != PSA_ERROR_NOT_SUPPORTED )
1664 return( status );
1665#endif /* PSA_CRYPTO_DRIVER_TEST */
1666#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1667#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1668 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001669 status = mbedtls_psa_mac_sign_setup( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001670 attributes,
1671 key_buffer, key_buffer_size,
1672 alg );
1673 if( status == PSA_SUCCESS )
1674 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1675
1676 if( status != PSA_ERROR_NOT_SUPPORTED )
1677 return( status );
1678#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1679 return( PSA_ERROR_NOT_SUPPORTED );
1680
1681 /* Add cases for opaque driver here */
1682#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1683#if defined(PSA_CRYPTO_DRIVER_TEST)
1684 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001685 status = mbedtls_test_opaque_mac_sign_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001686 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001687 attributes,
1688 key_buffer, key_buffer_size,
1689 alg );
1690
1691 if( status == PSA_SUCCESS )
1692 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1693
1694 return( status );
1695#endif /* PSA_CRYPTO_DRIVER_TEST */
1696#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1697 default:
1698 /* Key is declared with a lifetime not known to us */
1699 (void) status;
1700 (void) key_buffer;
1701 (void) key_buffer_size;
1702 (void) alg;
1703 return( PSA_ERROR_INVALID_ARGUMENT );
1704 }
1705}
1706
1707psa_status_t psa_driver_wrapper_mac_verify_setup(
1708 psa_mac_operation_t *operation,
1709 const psa_key_attributes_t *attributes,
1710 const uint8_t *key_buffer,
1711 size_t key_buffer_size,
1712 psa_algorithm_t alg )
1713{
1714 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1715 psa_key_location_t location =
1716 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1717
1718 switch( location )
1719 {
1720 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1721 /* Key is stored in the slot in export representation, so
1722 * cycle through all known transparent accelerators */
1723#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1724#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001725 status = mbedtls_test_transparent_mac_verify_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001726 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001727 attributes,
1728 key_buffer, key_buffer_size,
1729 alg );
1730 /* Declared with fallback == true */
1731 if( status == PSA_SUCCESS )
1732 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1733
1734 if( status != PSA_ERROR_NOT_SUPPORTED )
1735 return( status );
1736#endif /* PSA_CRYPTO_DRIVER_TEST */
1737#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1738#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1739 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001740 status = mbedtls_psa_mac_verify_setup( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001741 attributes,
1742 key_buffer, key_buffer_size,
1743 alg );
1744 if( status == PSA_SUCCESS )
1745 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1746
1747 if( status != PSA_ERROR_NOT_SUPPORTED )
1748 return( status );
1749#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1750 return( PSA_ERROR_NOT_SUPPORTED );
1751
1752 /* Add cases for opaque driver here */
1753#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1754#if defined(PSA_CRYPTO_DRIVER_TEST)
1755 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001756 status = mbedtls_test_opaque_mac_verify_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001757 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001758 attributes,
1759 key_buffer, key_buffer_size,
1760 alg );
1761
1762 if( status == PSA_SUCCESS )
1763 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1764
1765 return( status );
1766#endif /* PSA_CRYPTO_DRIVER_TEST */
1767#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1768 default:
1769 /* Key is declared with a lifetime not known to us */
1770 (void) status;
1771 (void) key_buffer;
1772 (void) key_buffer_size;
1773 (void) alg;
1774 return( PSA_ERROR_INVALID_ARGUMENT );
1775 }
1776}
1777
1778psa_status_t psa_driver_wrapper_mac_update(
1779 psa_mac_operation_t *operation,
1780 const uint8_t *input,
1781 size_t input_length )
1782{
1783 switch( operation->id )
1784 {
1785#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1786 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001787 return( mbedtls_psa_mac_update( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001788 input, input_length ) );
1789#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1790
1791#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1792#if defined(PSA_CRYPTO_DRIVER_TEST)
1793 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001794 return( mbedtls_test_transparent_mac_update(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001795 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001796 input, input_length ) );
1797
1798 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001799 return( mbedtls_test_opaque_mac_update(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001800 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001801 input, input_length ) );
1802#endif /* PSA_CRYPTO_DRIVER_TEST */
1803#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1804 default:
1805 (void) input;
1806 (void) input_length;
1807 return( PSA_ERROR_INVALID_ARGUMENT );
1808 }
1809}
1810
1811psa_status_t psa_driver_wrapper_mac_sign_finish(
1812 psa_mac_operation_t *operation,
1813 uint8_t *mac,
1814 size_t mac_size,
1815 size_t *mac_length )
1816{
1817 switch( operation->id )
1818 {
1819#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1820 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001821 return( mbedtls_psa_mac_sign_finish( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001822 mac, mac_size, mac_length ) );
1823#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1824
1825#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1826#if defined(PSA_CRYPTO_DRIVER_TEST)
1827 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001828 return( mbedtls_test_transparent_mac_sign_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001829 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001830 mac, mac_size, mac_length ) );
1831
1832 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001833 return( mbedtls_test_opaque_mac_sign_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001834 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001835 mac, mac_size, mac_length ) );
1836#endif /* PSA_CRYPTO_DRIVER_TEST */
1837#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1838 default:
1839 (void) mac;
1840 (void) mac_size;
1841 (void) mac_length;
1842 return( PSA_ERROR_INVALID_ARGUMENT );
1843 }
1844}
1845
1846psa_status_t psa_driver_wrapper_mac_verify_finish(
1847 psa_mac_operation_t *operation,
1848 const uint8_t *mac,
1849 size_t mac_length )
1850{
1851 switch( operation->id )
1852 {
1853#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1854 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001855 return( mbedtls_psa_mac_verify_finish( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001856 mac, mac_length ) );
1857#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1858
1859#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1860#if defined(PSA_CRYPTO_DRIVER_TEST)
1861 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001862 return( mbedtls_test_transparent_mac_verify_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001863 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001864 mac, mac_length ) );
1865
1866 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001867 return( mbedtls_test_opaque_mac_verify_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001868 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001869 mac, mac_length ) );
1870#endif /* PSA_CRYPTO_DRIVER_TEST */
1871#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1872 default:
1873 (void) mac;
1874 (void) mac_length;
1875 return( PSA_ERROR_INVALID_ARGUMENT );
1876 }
1877}
1878
1879psa_status_t psa_driver_wrapper_mac_abort(
1880 psa_mac_operation_t *operation )
1881{
Steven Cooremand13a70f2021-03-19 15:24:23 +01001882 switch( operation->id )
1883 {
1884#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1885 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooremane6804192021-03-19 18:28:56 +01001886 return( mbedtls_psa_mac_abort( &operation->ctx.mbedtls_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001887#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1888
1889#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1890#if defined(PSA_CRYPTO_DRIVER_TEST)
1891 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001892 return( mbedtls_test_transparent_mac_abort(
Steven Cooremane6804192021-03-19 18:28:56 +01001893 &operation->ctx.transparent_test_driver_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001894 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001895 return( mbedtls_test_opaque_mac_abort(
Steven Cooremane6804192021-03-19 18:28:56 +01001896 &operation->ctx.opaque_test_driver_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001897#endif /* PSA_CRYPTO_DRIVER_TEST */
1898#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1899 default:
Steven Cooremane6804192021-03-19 18:28:56 +01001900 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001901 }
Steven Cooremand13a70f2021-03-19 15:24:23 +01001902}
Gilles Peskine1905a242021-04-24 13:19:45 +02001903
1904#endif /* MBEDTLS_PSA_CRYPTO_C */