blob: 00c17063af2b12f6db988a0394f7bfcc0e7501bf [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
Archana449608b2021-09-08 15:36:05 +0530383/** Calculate the key buffer size required to store the key material of a key
Archanad8a83dc2021-06-14 10:04:16 +0530384 * associated with an opaque driver from input key data.
385 *
Archanad8a83dc2021-06-14 10:04:16 +0530386 * \param[in] attributes The key attributes
387 * \param[in] data The input key data.
388 * \param[in] data_length The input data length.
389 * \param[out] key_buffer_size Minimum buffer size to contain the key material.
390 *
391 * \retval #PSA_SUCCESS
392 * \retval #PSA_ERROR_INVALID_ARGUMENT
393 * \retval #PSA_ERROR_NOT_SUPPORTED
394 */
395psa_status_t psa_driver_wrapper_get_key_buffer_size_from_key_data(
396 const psa_key_attributes_t *attributes,
397 const uint8_t *data,
398 size_t data_length,
399 size_t *key_buffer_size )
400{
Archana449608b2021-09-08 15:36:05 +0530401 psa_key_location_t location =
402 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Archanad8a83dc2021-06-14 10:04:16 +0530403 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 */
Archana449608b2021-09-08 15:36:05 +0530462 *key_buffer_size = mbedtls_test_opaque_size_function( key_type,
463 key_bits );
Ronald Cron4607c822021-04-14 10:55:34 +0200464 return( ( *key_buffer_size != 0 ) ?
465 PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED );
John Durkop2c618352020-09-22 06:54:01 -0700466#endif /* PSA_CRYPTO_DRIVER_TEST */
467
468 default:
Ronald Cron9df74be2020-12-05 19:15:23 +0100469 (void)key_type;
470 (void)key_bits;
Archanad8a83dc2021-06-14 10:04:16 +0530471 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200472 }
473}
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200474
Ronald Cron977c2472020-10-13 08:32:21 +0200475psa_status_t psa_driver_wrapper_generate_key(
476 const psa_key_attributes_t *attributes,
477 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200478{
Ronald Cron977c2472020-10-13 08:32:21 +0200479 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
480 psa_key_location_t location =
481 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
482
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200483 /* Try dynamically-registered SE interface first */
484#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
485 const psa_drv_se_t *drv;
486 psa_drv_se_context_t *drv_context;
487
Ronald Cron977c2472020-10-13 08:32:21 +0200488 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200489 {
490 size_t pubkey_length = 0; /* We don't support this feature yet */
491 if( drv->key_management == NULL ||
492 drv->key_management->p_generate == NULL )
493 {
494 /* Key is defined as being in SE, but we have no way to generate it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200495 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200496 }
497 return( drv->key_management->p_generate(
Ronald Cron977c2472020-10-13 08:32:21 +0200498 drv_context,
499 *( (psa_key_slot_number_t *)key_buffer ),
Ronald Cronea0f8a62020-11-25 17:52:23 +0100500 attributes, NULL, 0, &pubkey_length ) );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200501 }
502#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
503
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200504 switch( location )
505 {
506 case PSA_KEY_LOCATION_LOCAL_STORAGE:
Ronald Cron977c2472020-10-13 08:32:21 +0200507#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200508 /* Transparent drivers are limited to generating asymmetric keys */
Ronald Cron977c2472020-10-13 08:32:21 +0200509 if( PSA_KEY_TYPE_IS_ASYMMETRIC( attributes->core.type ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200510 {
Ronald Cron977c2472020-10-13 08:32:21 +0200511 /* Cycle through all known transparent accelerators */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200512#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200513 status = mbedtls_test_transparent_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200514 attributes, key_buffer, key_buffer_size,
515 key_buffer_length );
516 /* Declared with fallback == true */
517 if( status != PSA_ERROR_NOT_SUPPORTED )
518 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200519#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200520 }
521#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
522
523 /* Software fallback */
524 status = psa_generate_key_internal(
525 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200526 break;
Ronald Cron977c2472020-10-13 08:32:21 +0200527
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200528 /* Add cases for opaque driver here */
Ronald Cron977c2472020-10-13 08:32:21 +0200529#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200530#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100531 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200532 status = mbedtls_test_opaque_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200533 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200534 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200535#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200536#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
537
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200538 default:
539 /* Key is declared with a lifetime not known to us */
540 status = PSA_ERROR_INVALID_ARGUMENT;
541 break;
542 }
543
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200544 return( status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200545}
546
Ronald Cron83282872020-11-22 14:02:39 +0100547psa_status_t psa_driver_wrapper_import_key(
548 const psa_key_attributes_t *attributes,
549 const uint8_t *data,
550 size_t data_length,
551 uint8_t *key_buffer,
552 size_t key_buffer_size,
553 size_t *key_buffer_length,
554 size_t *bits )
Steven Cooreman04524762020-10-13 17:43:44 +0200555{
Steven Cooreman04524762020-10-13 17:43:44 +0200556 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cronbf33c932020-11-28 18:06:53 +0100557 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
558 psa_get_key_lifetime( attributes ) );
Steven Cooreman04524762020-10-13 17:43:44 +0200559
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100560 /* Try dynamically-registered SE interface first */
561#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
562 const psa_drv_se_t *drv;
563 psa_drv_se_context_t *drv_context;
564
565 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
566 {
567 if( drv->key_management == NULL ||
568 drv->key_management->p_import == NULL )
569 return( PSA_ERROR_NOT_SUPPORTED );
570
571 /* The driver should set the number of key bits, however in
572 * case it doesn't, we initialize bits to an invalid value. */
573 *bits = PSA_MAX_KEY_BITS + 1;
574 status = drv->key_management->p_import(
575 drv_context,
576 *( (psa_key_slot_number_t *)key_buffer ),
577 attributes, data, data_length, bits );
578
579 if( status != PSA_SUCCESS )
580 return( status );
581
582 if( (*bits) > PSA_MAX_KEY_BITS )
583 return( PSA_ERROR_NOT_SUPPORTED );
584
585 return( PSA_SUCCESS );
586 }
587#endif /* PSA_CRYPTO_SE_C */
588
Ronald Cronbf33c932020-11-28 18:06:53 +0100589 switch( location )
590 {
591 case PSA_KEY_LOCATION_LOCAL_STORAGE:
592 /* Key is stored in the slot in export representation, so
593 * cycle through all known transparent accelerators */
594#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
595#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200596 status = mbedtls_test_transparent_import_key(
597 attributes,
598 data, data_length,
599 key_buffer, key_buffer_size,
600 key_buffer_length, bits );
Ronald Cronbf33c932020-11-28 18:06:53 +0100601 /* Declared with fallback == true */
602 if( status != PSA_ERROR_NOT_SUPPORTED )
603 return( status );
604#endif /* PSA_CRYPTO_DRIVER_TEST */
605#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
606 /* Fell through, meaning no accelerator supports this operation */
607 return( psa_import_key_into_slot( attributes,
608 data, data_length,
609 key_buffer, key_buffer_size,
610 key_buffer_length, bits ) );
Archana4d7ae1d2021-07-07 02:50:22 +0530611 /* Add cases for opaque driver here */
612#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
613#if defined(PSA_CRYPTO_DRIVER_TEST)
614 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
615 return( mbedtls_test_opaque_import_key(
616 attributes,
617 data, data_length,
618 key_buffer, key_buffer_size,
619 key_buffer_length, bits ) );
620#endif /* PSA_CRYPTO_DRIVER_TEST */
621#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cronbf33c932020-11-28 18:06:53 +0100622 default:
Ronald Cronbf33c932020-11-28 18:06:53 +0100623 (void)status;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100624 return( PSA_ERROR_INVALID_ARGUMENT );
Ronald Cronbf33c932020-11-28 18:06:53 +0100625 }
626
Steven Cooreman04524762020-10-13 17:43:44 +0200627}
628
Ronald Cron67227982020-11-26 15:16:05 +0100629psa_status_t psa_driver_wrapper_export_key(
630 const psa_key_attributes_t *attributes,
631 const uint8_t *key_buffer, size_t key_buffer_size,
632 uint8_t *data, size_t data_size, size_t *data_length )
633
634{
635 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
636 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
637 psa_get_key_lifetime( attributes ) );
638
Ronald Cron152e3f82020-11-26 16:06:41 +0100639 /* Try dynamically-registered SE interface first */
640#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
641 const psa_drv_se_t *drv;
642 psa_drv_se_context_t *drv_context;
643
644 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
645 {
646 if( ( drv->key_management == NULL ) ||
647 ( drv->key_management->p_export == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100648 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100649 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100650 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100651
652 return( drv->key_management->p_export(
653 drv_context,
654 *( (psa_key_slot_number_t *)key_buffer ),
655 data, data_size, data_length ) );
656 }
657#endif /* PSA_CRYPTO_SE_C */
658
Ronald Cron67227982020-11-26 15:16:05 +0100659 switch( location )
660 {
661 case PSA_KEY_LOCATION_LOCAL_STORAGE:
662 return( psa_export_key_internal( attributes,
663 key_buffer,
664 key_buffer_size,
665 data,
666 data_size,
667 data_length ) );
668
669 /* Add cases for opaque driver here */
670#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
671#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100672 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200673 return( mbedtls_test_opaque_export_key( attributes,
674 key_buffer,
675 key_buffer_size,
676 data,
677 data_size,
678 data_length ) );
Ronald Cron67227982020-11-26 15:16:05 +0100679#endif /* PSA_CRYPTO_DRIVER_TEST */
680#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
681 default:
682 /* Key is declared with a lifetime not known to us */
683 return( status );
684 }
685}
686
Ronald Cron84cc9942020-11-25 14:30:05 +0100687psa_status_t psa_driver_wrapper_export_public_key(
688 const psa_key_attributes_t *attributes,
689 const uint8_t *key_buffer, size_t key_buffer_size,
690 uint8_t *data, size_t data_size, size_t *data_length )
691
Steven Cooremanb9b84422020-10-14 14:39:20 +0200692{
Steven Cooremanb9b84422020-10-14 14:39:20 +0200693 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Cron84cc9942020-11-25 14:30:05 +0100694 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
695 psa_get_key_lifetime( attributes ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200696
Ronald Cron152e3f82020-11-26 16:06:41 +0100697 /* Try dynamically-registered SE interface first */
698#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
699 const psa_drv_se_t *drv;
700 psa_drv_se_context_t *drv_context;
701
702 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
703 {
704 if( ( drv->key_management == NULL ) ||
705 ( drv->key_management->p_export_public == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100706 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100707 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100708 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100709
710 return( drv->key_management->p_export_public(
711 drv_context,
712 *( (psa_key_slot_number_t *)key_buffer ),
713 data, data_size, data_length ) );
714 }
715#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
716
Steven Cooremanb9b84422020-10-14 14:39:20 +0200717 switch( location )
718 {
719 case PSA_KEY_LOCATION_LOCAL_STORAGE:
720 /* Key is stored in the slot in export representation, so
721 * cycle through all known transparent accelerators */
Ronald Cron67227982020-11-26 15:16:05 +0100722#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200723#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200724 status = mbedtls_test_transparent_export_public_key(
725 attributes,
726 key_buffer,
727 key_buffer_size,
728 data,
729 data_size,
730 data_length );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200731 /* Declared with fallback == true */
732 if( status != PSA_ERROR_NOT_SUPPORTED )
733 return( status );
734#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100735#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200736 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron67227982020-11-26 15:16:05 +0100737 return( psa_export_public_key_internal( attributes,
738 key_buffer,
739 key_buffer_size,
740 data,
741 data_size,
742 data_length ) );
743
Steven Cooremanb9b84422020-10-14 14:39:20 +0200744 /* Add cases for opaque driver here */
Ronald Cron67227982020-11-26 15:16:05 +0100745#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200746#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100747 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200748 return( mbedtls_test_opaque_export_public_key( attributes,
749 key_buffer,
750 key_buffer_size,
751 data,
752 data_size,
753 data_length ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200754#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100755#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200756 default:
757 /* Key is declared with a lifetime not known to us */
758 return( status );
759 }
Steven Cooremanb9b84422020-10-14 14:39:20 +0200760}
761
Steven Cooreman6801f082021-02-19 17:21:22 +0100762psa_status_t psa_driver_wrapper_get_builtin_key(
763 psa_drv_slot_number_t slot_number,
764 psa_key_attributes_t *attributes,
765 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
766{
767 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
768 switch( location )
769 {
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100770#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100771 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200772 return( mbedtls_test_opaque_get_builtin_key(
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100773 slot_number,
774 attributes,
775 key_buffer, key_buffer_size, key_buffer_length ) );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100776#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman6801f082021-02-19 17:21:22 +0100777 default:
778 (void) slot_number;
779 (void) key_buffer;
780 (void) key_buffer_size;
781 (void) key_buffer_length;
782 return( PSA_ERROR_DOES_NOT_EXIST );
783 }
784}
785
Archana8a180362021-07-05 02:18:48 +0530786psa_status_t psa_driver_wrapper_copy_key(
787 psa_key_attributes_t *attributes,
788 const uint8_t *source_key, size_t source_key_size,
Archana449608b2021-09-08 15:36:05 +0530789 uint8_t *target_key_buffer, size_t target_key_buffer_size,
790 size_t *target_key_buffer_length )
Archana8a180362021-07-05 02:18:48 +0530791{
Archana449608b2021-09-08 15:36:05 +0530792 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
793 psa_key_location_t location =
794 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Archana8a180362021-07-05 02:18:48 +0530795
796 switch( location )
797 {
798#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
799#if defined(PSA_CRYPTO_DRIVER_TEST)
800 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
801 return( mbedtls_test_opaque_copy_key( attributes, source_key,
802 source_key_size,
803 target_key_buffer,
Archana449608b2021-09-08 15:36:05 +0530804 target_key_buffer_size,
805 target_key_buffer_length) );
Archana8a180362021-07-05 02:18:48 +0530806#endif /* PSA_CRYPTO_DRIVER_TEST */
807#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
808 default:
809 (void)source_key;
810 (void)source_key_size;
811 (void)target_key_buffer;
Archana449608b2021-09-08 15:36:05 +0530812 (void)target_key_buffer_size;
813 (void)target_key_buffer_length;
Archana8a180362021-07-05 02:18:48 +0530814 status = PSA_ERROR_INVALID_ARGUMENT;
815 }
816 return( status );
817}
818
Steven Cooreman37941cb2020-07-28 18:49:51 +0200819/*
820 * Cipher functions
821 */
822psa_status_t psa_driver_wrapper_cipher_encrypt(
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100823 const psa_key_attributes_t *attributes,
824 const uint8_t *key_buffer,
825 size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200826 psa_algorithm_t alg,
827 const uint8_t *input,
828 size_t input_length,
829 uint8_t *output,
830 size_t output_size,
831 size_t *output_length )
832{
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100833 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
834 psa_key_location_t location =
835 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200836
837 switch( location )
838 {
839 case PSA_KEY_LOCATION_LOCAL_STORAGE:
840 /* Key is stored in the slot in export representation, so
841 * cycle through all known transparent accelerators */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100842#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200843#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100844 status = mbedtls_test_transparent_cipher_encrypt( attributes,
845 key_buffer,
846 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200847 alg,
848 input,
849 input_length,
850 output,
851 output_size,
852 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200853 /* Declared with fallback == true */
854 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200855 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200856#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100857#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
858
859#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
860 return( mbedtls_psa_cipher_encrypt( attributes,
861 key_buffer,
862 key_buffer_size,
863 alg,
864 input,
865 input_length,
866 output,
867 output_size,
868 output_length ) );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200869#else
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200870 return( PSA_ERROR_NOT_SUPPORTED );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200871#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100872
Steven Cooreman37941cb2020-07-28 18:49:51 +0200873 /* Add cases for opaque driver here */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100874#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200875#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100876 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100877 return( mbedtls_test_opaque_cipher_encrypt( attributes,
878 key_buffer,
879 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200880 alg,
881 input,
882 input_length,
883 output,
884 output_size,
885 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200886#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100887#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
888
Steven Cooreman37941cb2020-07-28 18:49:51 +0200889 default:
890 /* Key is declared with a lifetime not known to us */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100891 (void)status;
892 (void)key_buffer;
893 (void)key_buffer_size;
894 (void)alg;
895 (void)input;
896 (void)input_length;
897 (void)output;
898 (void)output_size;
899 (void)output_length;
900 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200901 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200902}
903
904psa_status_t psa_driver_wrapper_cipher_decrypt(
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100905 const psa_key_attributes_t *attributes,
906 const uint8_t *key_buffer,
907 size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200908 psa_algorithm_t alg,
909 const uint8_t *input,
910 size_t input_length,
911 uint8_t *output,
912 size_t output_size,
913 size_t *output_length )
914{
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100915 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
916 psa_key_location_t location =
917 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200918
919 switch( location )
920 {
921 case PSA_KEY_LOCATION_LOCAL_STORAGE:
922 /* Key is stored in the slot in export representation, so
923 * cycle through all known transparent accelerators */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100924#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200925#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100926 status = mbedtls_test_transparent_cipher_decrypt( attributes,
927 key_buffer,
928 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200929 alg,
930 input,
931 input_length,
932 output,
933 output_size,
934 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200935 /* Declared with fallback == true */
936 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200937 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200938#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100939#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
940
941#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
942 return( mbedtls_psa_cipher_decrypt( attributes,
943 key_buffer,
944 key_buffer_size,
945 alg,
946 input,
947 input_length,
948 output,
949 output_size,
950 output_length ) );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200951#else
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200952 return( PSA_ERROR_NOT_SUPPORTED );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200953#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100954
Steven Cooreman37941cb2020-07-28 18:49:51 +0200955 /* Add cases for opaque driver here */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100956#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200957#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100958 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100959 return( mbedtls_test_opaque_cipher_decrypt( attributes,
960 key_buffer,
961 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200962 alg,
963 input,
964 input_length,
965 output,
966 output_size,
967 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200968#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100969#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
970
Steven Cooreman37941cb2020-07-28 18:49:51 +0200971 default:
972 /* Key is declared with a lifetime not known to us */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100973 (void)status;
974 (void)key_buffer;
975 (void)key_buffer_size;
976 (void)alg;
977 (void)input;
978 (void)input_length;
979 (void)output;
980 (void)output_size;
981 (void)output_length;
982 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200983 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200984}
985
986psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100987 psa_cipher_operation_t *operation,
988 const psa_key_attributes_t *attributes,
989 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200990 psa_algorithm_t alg )
991{
Ronald Cron0b805592020-12-14 18:08:20 +0100992 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Crona4af55f2020-12-14 14:36:06 +0100993 psa_key_location_t location =
994 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200995
Steven Cooreman37941cb2020-07-28 18:49:51 +0200996 switch( location )
997 {
998 case PSA_KEY_LOCATION_LOCAL_STORAGE:
999 /* Key is stored in the slot in export representation, so
1000 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +01001001#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001002#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001003 status = mbedtls_test_transparent_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001004 &operation->ctx.transparent_test_driver_ctx,
1005 attributes,
1006 key_buffer,
1007 key_buffer_size,
1008 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001009 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +02001010 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001011 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +02001012
Ronald Cron0b805592020-12-14 18:08:20 +01001013 if( status != PSA_ERROR_NOT_SUPPORTED )
1014 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001015#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001016#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001017#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001018 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +01001019 status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001020 attributes,
1021 key_buffer,
1022 key_buffer_size,
1023 alg );
1024 if( status == PSA_SUCCESS )
Ronald Cron6e412a72021-03-10 09:58:47 +01001025 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Ronald Cron49fafa92021-03-10 08:34:23 +01001026
Ronald Cron7b4154d2021-03-19 14:49:41 +01001027 if( status != PSA_ERROR_NOT_SUPPORTED )
1028 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001029#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1030 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron0b805592020-12-14 18:08:20 +01001031
Steven Cooreman37941cb2020-07-28 18:49:51 +02001032 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +01001033#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001034#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +01001035 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001036 status = mbedtls_test_opaque_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001037 &operation->ctx.opaque_test_driver_ctx,
1038 attributes,
1039 key_buffer, key_buffer_size,
1040 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001041
Steven Cooreman37941cb2020-07-28 18:49:51 +02001042 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001043 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001044
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001045 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001046#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001047#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +02001048 default:
1049 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +01001050 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001051 (void)key_buffer;
1052 (void)key_buffer_size;
1053 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +02001054 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001055 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001056}
1057
1058psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +01001059 psa_cipher_operation_t *operation,
1060 const psa_key_attributes_t *attributes,
1061 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001062 psa_algorithm_t alg )
1063{
Steven Cooreman37941cb2020-07-28 18:49:51 +02001064 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Crona4af55f2020-12-14 14:36:06 +01001065 psa_key_location_t location =
1066 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001067
Steven Cooreman37941cb2020-07-28 18:49:51 +02001068 switch( location )
1069 {
1070 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1071 /* Key is stored in the slot in export representation, so
1072 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +01001073#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001074#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001075 status = mbedtls_test_transparent_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001076 &operation->ctx.transparent_test_driver_ctx,
1077 attributes,
1078 key_buffer,
1079 key_buffer_size,
1080 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001081 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +02001082 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001083 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +02001084
Ronald Cron0b805592020-12-14 18:08:20 +01001085 if( status != PSA_ERROR_NOT_SUPPORTED )
1086 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001087#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001088#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001089#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001090 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +01001091 status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001092 attributes,
1093 key_buffer,
1094 key_buffer_size,
1095 alg );
1096 if( status == PSA_SUCCESS )
1097 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1098
1099 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001100#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1101 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron49fafa92021-03-10 08:34:23 +01001102
Steven Cooreman37941cb2020-07-28 18:49:51 +02001103 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +01001104#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001105#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +01001106 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001107 status = mbedtls_test_opaque_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001108 &operation->ctx.opaque_test_driver_ctx,
1109 attributes,
1110 key_buffer, key_buffer_size,
1111 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001112
Steven Cooreman37941cb2020-07-28 18:49:51 +02001113 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001114 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001115
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001116 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001117#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001118#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +02001119 default:
1120 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +01001121 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001122 (void)key_buffer;
1123 (void)key_buffer_size;
1124 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +02001125 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001126 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001127}
1128
Steven Cooreman37941cb2020-07-28 18:49:51 +02001129psa_status_t psa_driver_wrapper_cipher_set_iv(
Ronald Cron6056fe82020-12-15 13:58:07 +01001130 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001131 const uint8_t *iv,
1132 size_t iv_length )
1133{
Ronald Cron49fafa92021-03-10 08:34:23 +01001134 switch( operation->id )
1135 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001136#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001137 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001138 return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001139 iv,
1140 iv_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001141#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001142
1143#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001144#if defined(PSA_CRYPTO_DRIVER_TEST)
1145 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001146 return( mbedtls_test_transparent_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001147 &operation->ctx.transparent_test_driver_ctx,
1148 iv, iv_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001149
Steven Cooreman37941cb2020-07-28 18:49:51 +02001150 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001151 return( mbedtls_test_opaque_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001152 &operation->ctx.opaque_test_driver_ctx,
1153 iv, iv_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001154#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001155#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001156 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001157
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001158 (void)iv;
1159 (void)iv_length;
1160
Ronald Crondd24c9b2020-12-15 14:10:01 +01001161 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001162}
1163
1164psa_status_t psa_driver_wrapper_cipher_update(
Ronald Cron6056fe82020-12-15 13:58:07 +01001165 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001166 const uint8_t *input,
1167 size_t input_length,
1168 uint8_t *output,
1169 size_t output_size,
1170 size_t *output_length )
1171{
Ronald Cron49fafa92021-03-10 08:34:23 +01001172 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001173 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001174#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001175 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001176 return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001177 input,
1178 input_length,
1179 output,
1180 output_size,
1181 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001182#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1183
Ronald Cron49fafa92021-03-10 08:34:23 +01001184#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001185#if defined(PSA_CRYPTO_DRIVER_TEST)
1186 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001187 return( mbedtls_test_transparent_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001188 &operation->ctx.transparent_test_driver_ctx,
1189 input, input_length,
1190 output, output_size, output_length ) );
1191
Steven Cooreman37941cb2020-07-28 18:49:51 +02001192 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001193 return( mbedtls_test_opaque_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001194 &operation->ctx.opaque_test_driver_ctx,
1195 input, input_length,
1196 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001197#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001198#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001199 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001200
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001201 (void)input;
1202 (void)input_length;
1203 (void)output;
1204 (void)output_size;
1205 (void)output_length;
1206
Ronald Crondd24c9b2020-12-15 14:10:01 +01001207 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001208}
1209
1210psa_status_t psa_driver_wrapper_cipher_finish(
Ronald Cron6056fe82020-12-15 13:58:07 +01001211 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001212 uint8_t *output,
1213 size_t output_size,
1214 size_t *output_length )
1215{
Ronald Cron49fafa92021-03-10 08:34:23 +01001216 switch( operation->id )
1217 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001218#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001219 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001220 return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001221 output,
1222 output_size,
1223 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001224#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001225
1226#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001227#if defined(PSA_CRYPTO_DRIVER_TEST)
1228 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001229 return( mbedtls_test_transparent_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001230 &operation->ctx.transparent_test_driver_ctx,
1231 output, output_size, output_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001232
Steven Cooreman37941cb2020-07-28 18:49:51 +02001233 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001234 return( mbedtls_test_opaque_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001235 &operation->ctx.opaque_test_driver_ctx,
1236 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001237#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001238#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001239 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001240
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001241 (void)output;
1242 (void)output_size;
1243 (void)output_length;
1244
Ronald Crondd24c9b2020-12-15 14:10:01 +01001245 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001246}
1247
1248psa_status_t psa_driver_wrapper_cipher_abort(
Ronald Cron6056fe82020-12-15 13:58:07 +01001249 psa_cipher_operation_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001250{
Ronald Crondd24c9b2020-12-15 14:10:01 +01001251 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001252
Ronald Cron49fafa92021-03-10 08:34:23 +01001253 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001254 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001255#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001256 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001257 return( mbedtls_psa_cipher_abort( &operation->ctx.mbedtls_ctx ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001258#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron49fafa92021-03-10 08:34:23 +01001259
1260#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001261#if defined(PSA_CRYPTO_DRIVER_TEST)
1262 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001263 status = mbedtls_test_transparent_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001264 &operation->ctx.transparent_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001265 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001266 &operation->ctx.transparent_test_driver_ctx,
1267 sizeof( operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001268 return( status );
Ronald Cron49fafa92021-03-10 08:34:23 +01001269
Steven Cooreman37941cb2020-07-28 18:49:51 +02001270 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001271 status = mbedtls_test_opaque_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001272 &operation->ctx.opaque_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001273 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001274 &operation->ctx.opaque_test_driver_ctx,
1275 sizeof( operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001276 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001277#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001278#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001279 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001280
Ronald Cron49fafa92021-03-10 08:34:23 +01001281 (void)status;
Ronald Crondd24c9b2020-12-15 14:10:01 +01001282 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001283}
1284
Steven Cooreman1e582352021-02-18 17:24:37 +01001285/*
1286 * Hashing functions
1287 */
1288psa_status_t psa_driver_wrapper_hash_compute(
1289 psa_algorithm_t alg,
1290 const uint8_t *input,
1291 size_t input_length,
1292 uint8_t *hash,
1293 size_t hash_size,
1294 size_t *hash_length)
1295{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001296 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001297
1298 /* Try accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001299#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001300 status = mbedtls_test_transparent_hash_compute(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001301 alg, input, input_length, hash, hash_size, hash_length );
Steven Cooremanf7638102021-03-04 15:14:36 +01001302 if( status != PSA_ERROR_NOT_SUPPORTED )
1303 return( status );
1304#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001305
1306 /* If software fallback is compiled in, try fallback */
1307#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1308 status = mbedtls_psa_hash_compute( alg, input, input_length,
1309 hash, hash_size, hash_length );
1310 if( status != PSA_ERROR_NOT_SUPPORTED )
1311 return( status );
1312#endif
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001313 (void) status;
1314 (void) alg;
1315 (void) input;
1316 (void) input_length;
1317 (void) hash;
1318 (void) hash_size;
1319 (void) hash_length;
Steven Cooreman1e582352021-02-18 17:24:37 +01001320
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001321 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman1e582352021-02-18 17:24:37 +01001322}
1323
1324psa_status_t psa_driver_wrapper_hash_setup(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001325 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001326 psa_algorithm_t alg )
1327{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001328 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001329
Steven Cooreman1e582352021-02-18 17:24:37 +01001330 /* Try setup on accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001331#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001332 status = mbedtls_test_transparent_hash_setup(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001333 &operation->ctx.test_driver_ctx, alg );
Steven Cooremanf7638102021-03-04 15:14:36 +01001334 if( status == PSA_SUCCESS )
1335 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1336
1337 if( status != PSA_ERROR_NOT_SUPPORTED )
1338 return( status );
1339#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001340
1341 /* If software fallback is compiled in, try fallback */
1342#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001343 status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
Steven Cooreman1e582352021-02-18 17:24:37 +01001344 if( status == PSA_SUCCESS )
Steven Cooreman1e582352021-02-18 17:24:37 +01001345 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Steven Cooreman1e582352021-02-18 17:24:37 +01001346
1347 if( status != PSA_ERROR_NOT_SUPPORTED )
1348 return( status );
1349#endif
1350 /* Nothing left to try if we fall through here */
1351 (void) status;
1352 (void) operation;
1353 (void) alg;
1354 return( PSA_ERROR_NOT_SUPPORTED );
1355}
1356
1357psa_status_t psa_driver_wrapper_hash_clone(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001358 const psa_hash_operation_t *source_operation,
1359 psa_hash_operation_t *target_operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001360{
Steven Cooreman1e582352021-02-18 17:24:37 +01001361 switch( source_operation->id )
1362 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001363#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1364 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1365 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1366 return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1367 &target_operation->ctx.mbedtls_ctx ) );
1368#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001369#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001370 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1371 target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Ronald Cron7f13fa22021-04-13 12:41:34 +02001372 return( mbedtls_test_transparent_hash_clone(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001373 &source_operation->ctx.test_driver_ctx,
1374 &target_operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001375#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001376 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001377 (void) target_operation;
1378 return( PSA_ERROR_BAD_STATE );
1379 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001380}
1381
1382psa_status_t psa_driver_wrapper_hash_update(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001383 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001384 const uint8_t *input,
1385 size_t input_length )
1386{
Steven Cooreman1e582352021-02-18 17:24:37 +01001387 switch( operation->id )
1388 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001389#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1390 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1391 return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
1392 input, input_length ) );
1393#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001394#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001395 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001396 return( mbedtls_test_transparent_hash_update(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001397 &operation->ctx.test_driver_ctx,
1398 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001399#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001400 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001401 (void) input;
1402 (void) input_length;
1403 return( PSA_ERROR_BAD_STATE );
1404 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001405}
1406
1407psa_status_t psa_driver_wrapper_hash_finish(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001408 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001409 uint8_t *hash,
1410 size_t hash_size,
1411 size_t *hash_length )
1412{
Steven Cooreman1e582352021-02-18 17:24:37 +01001413 switch( operation->id )
1414 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001415#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1416 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1417 return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1418 hash, hash_size, hash_length ) );
1419#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001420#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001421 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001422 return( mbedtls_test_transparent_hash_finish(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001423 &operation->ctx.test_driver_ctx,
1424 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001425#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001426 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001427 (void) hash;
1428 (void) hash_size;
1429 (void) hash_length;
1430 return( PSA_ERROR_BAD_STATE );
1431 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001432}
1433
1434psa_status_t psa_driver_wrapper_hash_abort(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001435 psa_hash_operation_t *operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001436{
Steven Cooreman1e582352021-02-18 17:24:37 +01001437 switch( operation->id )
1438 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001439#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1440 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1441 return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1442#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001443#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001444 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001445 return( mbedtls_test_transparent_hash_abort(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001446 &operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001447#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001448 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001449 return( PSA_ERROR_BAD_STATE );
1450 }
1451}
1452
Ronald Cronde822812021-03-17 16:08:20 +01001453psa_status_t psa_driver_wrapper_aead_encrypt(
1454 const psa_key_attributes_t *attributes,
1455 const uint8_t *key_buffer, size_t key_buffer_size,
1456 psa_algorithm_t alg,
1457 const uint8_t *nonce, size_t nonce_length,
1458 const uint8_t *additional_data, size_t additional_data_length,
1459 const uint8_t *plaintext, size_t plaintext_length,
1460 uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length )
1461{
1462 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1463 psa_key_location_t location =
1464 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1465
1466 switch( location )
1467 {
1468 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1469 /* Key is stored in the slot in export representation, so
1470 * cycle through all known transparent accelerators */
1471
1472#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1473#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001474 status = mbedtls_test_transparent_aead_encrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001475 attributes, key_buffer, key_buffer_size,
1476 alg,
1477 nonce, nonce_length,
1478 additional_data, additional_data_length,
1479 plaintext, plaintext_length,
1480 ciphertext, ciphertext_size, ciphertext_length );
1481 /* Declared with fallback == true */
1482 if( status != PSA_ERROR_NOT_SUPPORTED )
1483 return( status );
1484#endif /* PSA_CRYPTO_DRIVER_TEST */
1485#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1486
1487 /* Fell through, meaning no accelerator supports this operation */
1488 return( mbedtls_psa_aead_encrypt(
1489 attributes, key_buffer, key_buffer_size,
1490 alg,
1491 nonce, nonce_length,
1492 additional_data, additional_data_length,
1493 plaintext, plaintext_length,
1494 ciphertext, ciphertext_size, ciphertext_length ) );
1495
1496 /* Add cases for opaque driver here */
1497
1498 default:
1499 /* Key is declared with a lifetime not known to us */
1500 (void)status;
1501 return( PSA_ERROR_INVALID_ARGUMENT );
1502 }
1503}
1504
1505psa_status_t psa_driver_wrapper_aead_decrypt(
1506 const psa_key_attributes_t *attributes,
1507 const uint8_t *key_buffer, size_t key_buffer_size,
1508 psa_algorithm_t alg,
1509 const uint8_t *nonce, size_t nonce_length,
1510 const uint8_t *additional_data, size_t additional_data_length,
1511 const uint8_t *ciphertext, size_t ciphertext_length,
1512 uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length )
1513{
1514 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1515 psa_key_location_t location =
1516 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1517
1518 switch( location )
1519 {
1520 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1521 /* Key is stored in the slot in export representation, so
1522 * cycle through all known transparent accelerators */
1523
1524#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1525#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001526 status = mbedtls_test_transparent_aead_decrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001527 attributes, key_buffer, key_buffer_size,
1528 alg,
1529 nonce, nonce_length,
1530 additional_data, additional_data_length,
1531 ciphertext, ciphertext_length,
1532 plaintext, plaintext_size, plaintext_length );
1533 /* Declared with fallback == true */
1534 if( status != PSA_ERROR_NOT_SUPPORTED )
1535 return( status );
1536#endif /* PSA_CRYPTO_DRIVER_TEST */
1537#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1538
1539 /* Fell through, meaning no accelerator supports this operation */
1540 return( mbedtls_psa_aead_decrypt(
1541 attributes, key_buffer, key_buffer_size,
1542 alg,
1543 nonce, nonce_length,
1544 additional_data, additional_data_length,
1545 ciphertext, ciphertext_length,
1546 plaintext, plaintext_size, plaintext_length ) );
1547
1548 /* Add cases for opaque driver here */
1549
1550 default:
1551 /* Key is declared with a lifetime not known to us */
1552 (void)status;
1553 return( PSA_ERROR_INVALID_ARGUMENT );
1554 }
1555}
Steven Cooremand13a70f2021-03-19 15:24:23 +01001556
1557
1558/*
1559 * MAC functions
1560 */
1561psa_status_t psa_driver_wrapper_mac_compute(
1562 const psa_key_attributes_t *attributes,
1563 const uint8_t *key_buffer,
1564 size_t key_buffer_size,
1565 psa_algorithm_t alg,
1566 const uint8_t *input,
1567 size_t input_length,
1568 uint8_t *mac,
1569 size_t mac_size,
1570 size_t *mac_length )
1571{
1572 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1573 psa_key_location_t location =
1574 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1575
1576 switch( location )
1577 {
1578 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1579 /* Key is stored in the slot in export representation, so
1580 * cycle through all known transparent accelerators */
1581#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1582#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001583 status = mbedtls_test_transparent_mac_compute(
Steven Cooremand13a70f2021-03-19 15:24:23 +01001584 attributes, key_buffer, key_buffer_size, alg,
1585 input, input_length,
1586 mac, mac_size, mac_length );
1587 /* Declared with fallback == true */
1588 if( status != PSA_ERROR_NOT_SUPPORTED )
1589 return( status );
1590#endif /* PSA_CRYPTO_DRIVER_TEST */
1591#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1592#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1593 /* Fell through, meaning no accelerator supports this operation */
1594 status = mbedtls_psa_mac_compute(
1595 attributes, key_buffer, key_buffer_size, alg,
1596 input, input_length,
1597 mac, mac_size, mac_length );
1598 if( status != PSA_ERROR_NOT_SUPPORTED )
1599 return( status );
1600#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1601 return( PSA_ERROR_NOT_SUPPORTED );
1602
1603 /* Add cases for opaque driver here */
1604#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1605#if defined(PSA_CRYPTO_DRIVER_TEST)
1606 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001607 status = mbedtls_test_opaque_mac_compute(
Steven Cooremand13a70f2021-03-19 15:24:23 +01001608 attributes, key_buffer, key_buffer_size, alg,
1609 input, input_length,
1610 mac, mac_size, mac_length );
1611 return( status );
1612#endif /* PSA_CRYPTO_DRIVER_TEST */
1613#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1614 default:
1615 /* Key is declared with a lifetime not known to us */
1616 (void) key_buffer;
1617 (void) key_buffer_size;
1618 (void) alg;
1619 (void) input;
1620 (void) input_length;
1621 (void) mac;
1622 (void) mac_size;
1623 (void) mac_length;
1624 (void) status;
1625 return( PSA_ERROR_INVALID_ARGUMENT );
1626 }
1627}
1628
1629psa_status_t psa_driver_wrapper_mac_sign_setup(
1630 psa_mac_operation_t *operation,
1631 const psa_key_attributes_t *attributes,
1632 const uint8_t *key_buffer,
1633 size_t key_buffer_size,
1634 psa_algorithm_t alg )
1635{
1636 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1637 psa_key_location_t location =
1638 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1639
1640 switch( location )
1641 {
1642 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1643 /* Key is stored in the slot in export representation, so
1644 * cycle through all known transparent accelerators */
1645#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1646#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001647 status = mbedtls_test_transparent_mac_sign_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001648 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001649 attributes,
1650 key_buffer, key_buffer_size,
1651 alg );
1652 /* Declared with fallback == true */
1653 if( status == PSA_SUCCESS )
1654 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1655
1656 if( status != PSA_ERROR_NOT_SUPPORTED )
1657 return( status );
1658#endif /* PSA_CRYPTO_DRIVER_TEST */
1659#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1660#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1661 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001662 status = mbedtls_psa_mac_sign_setup( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001663 attributes,
1664 key_buffer, key_buffer_size,
1665 alg );
1666 if( status == PSA_SUCCESS )
1667 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1668
1669 if( status != PSA_ERROR_NOT_SUPPORTED )
1670 return( status );
1671#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1672 return( PSA_ERROR_NOT_SUPPORTED );
1673
1674 /* Add cases for opaque driver here */
1675#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1676#if defined(PSA_CRYPTO_DRIVER_TEST)
1677 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001678 status = mbedtls_test_opaque_mac_sign_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001679 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001680 attributes,
1681 key_buffer, key_buffer_size,
1682 alg );
1683
1684 if( status == PSA_SUCCESS )
1685 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1686
1687 return( status );
1688#endif /* PSA_CRYPTO_DRIVER_TEST */
1689#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1690 default:
1691 /* Key is declared with a lifetime not known to us */
1692 (void) status;
1693 (void) key_buffer;
1694 (void) key_buffer_size;
1695 (void) alg;
1696 return( PSA_ERROR_INVALID_ARGUMENT );
1697 }
1698}
1699
1700psa_status_t psa_driver_wrapper_mac_verify_setup(
1701 psa_mac_operation_t *operation,
1702 const psa_key_attributes_t *attributes,
1703 const uint8_t *key_buffer,
1704 size_t key_buffer_size,
1705 psa_algorithm_t alg )
1706{
1707 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1708 psa_key_location_t location =
1709 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1710
1711 switch( location )
1712 {
1713 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1714 /* Key is stored in the slot in export representation, so
1715 * cycle through all known transparent accelerators */
1716#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1717#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001718 status = mbedtls_test_transparent_mac_verify_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001719 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001720 attributes,
1721 key_buffer, key_buffer_size,
1722 alg );
1723 /* Declared with fallback == true */
1724 if( status == PSA_SUCCESS )
1725 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1726
1727 if( status != PSA_ERROR_NOT_SUPPORTED )
1728 return( status );
1729#endif /* PSA_CRYPTO_DRIVER_TEST */
1730#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1731#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1732 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001733 status = mbedtls_psa_mac_verify_setup( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001734 attributes,
1735 key_buffer, key_buffer_size,
1736 alg );
1737 if( status == PSA_SUCCESS )
1738 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1739
1740 if( status != PSA_ERROR_NOT_SUPPORTED )
1741 return( status );
1742#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1743 return( PSA_ERROR_NOT_SUPPORTED );
1744
1745 /* Add cases for opaque driver here */
1746#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1747#if defined(PSA_CRYPTO_DRIVER_TEST)
1748 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001749 status = mbedtls_test_opaque_mac_verify_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001750 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001751 attributes,
1752 key_buffer, key_buffer_size,
1753 alg );
1754
1755 if( status == PSA_SUCCESS )
1756 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1757
1758 return( status );
1759#endif /* PSA_CRYPTO_DRIVER_TEST */
1760#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1761 default:
1762 /* Key is declared with a lifetime not known to us */
1763 (void) status;
1764 (void) key_buffer;
1765 (void) key_buffer_size;
1766 (void) alg;
1767 return( PSA_ERROR_INVALID_ARGUMENT );
1768 }
1769}
1770
1771psa_status_t psa_driver_wrapper_mac_update(
1772 psa_mac_operation_t *operation,
1773 const uint8_t *input,
1774 size_t input_length )
1775{
1776 switch( operation->id )
1777 {
1778#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1779 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001780 return( mbedtls_psa_mac_update( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001781 input, input_length ) );
1782#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1783
1784#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1785#if defined(PSA_CRYPTO_DRIVER_TEST)
1786 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001787 return( mbedtls_test_transparent_mac_update(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001788 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001789 input, input_length ) );
1790
1791 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001792 return( mbedtls_test_opaque_mac_update(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001793 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001794 input, input_length ) );
1795#endif /* PSA_CRYPTO_DRIVER_TEST */
1796#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1797 default:
1798 (void) input;
1799 (void) input_length;
1800 return( PSA_ERROR_INVALID_ARGUMENT );
1801 }
1802}
1803
1804psa_status_t psa_driver_wrapper_mac_sign_finish(
1805 psa_mac_operation_t *operation,
1806 uint8_t *mac,
1807 size_t mac_size,
1808 size_t *mac_length )
1809{
1810 switch( operation->id )
1811 {
1812#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1813 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001814 return( mbedtls_psa_mac_sign_finish( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001815 mac, mac_size, mac_length ) );
1816#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1817
1818#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1819#if defined(PSA_CRYPTO_DRIVER_TEST)
1820 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001821 return( mbedtls_test_transparent_mac_sign_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001822 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001823 mac, mac_size, mac_length ) );
1824
1825 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001826 return( mbedtls_test_opaque_mac_sign_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001827 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001828 mac, mac_size, mac_length ) );
1829#endif /* PSA_CRYPTO_DRIVER_TEST */
1830#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1831 default:
1832 (void) mac;
1833 (void) mac_size;
1834 (void) mac_length;
1835 return( PSA_ERROR_INVALID_ARGUMENT );
1836 }
1837}
1838
1839psa_status_t psa_driver_wrapper_mac_verify_finish(
1840 psa_mac_operation_t *operation,
1841 const uint8_t *mac,
1842 size_t mac_length )
1843{
1844 switch( operation->id )
1845 {
1846#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1847 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001848 return( mbedtls_psa_mac_verify_finish( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001849 mac, mac_length ) );
1850#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1851
1852#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1853#if defined(PSA_CRYPTO_DRIVER_TEST)
1854 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001855 return( mbedtls_test_transparent_mac_verify_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001856 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001857 mac, mac_length ) );
1858
1859 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001860 return( mbedtls_test_opaque_mac_verify_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001861 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001862 mac, mac_length ) );
1863#endif /* PSA_CRYPTO_DRIVER_TEST */
1864#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1865 default:
1866 (void) mac;
1867 (void) mac_length;
1868 return( PSA_ERROR_INVALID_ARGUMENT );
1869 }
1870}
1871
1872psa_status_t psa_driver_wrapper_mac_abort(
1873 psa_mac_operation_t *operation )
1874{
Steven Cooremand13a70f2021-03-19 15:24:23 +01001875 switch( operation->id )
1876 {
1877#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1878 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooremane6804192021-03-19 18:28:56 +01001879 return( mbedtls_psa_mac_abort( &operation->ctx.mbedtls_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001880#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1881
1882#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1883#if defined(PSA_CRYPTO_DRIVER_TEST)
1884 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001885 return( mbedtls_test_transparent_mac_abort(
Steven Cooremane6804192021-03-19 18:28:56 +01001886 &operation->ctx.transparent_test_driver_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001887 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001888 return( mbedtls_test_opaque_mac_abort(
Steven Cooremane6804192021-03-19 18:28:56 +01001889 &operation->ctx.opaque_test_driver_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001890#endif /* PSA_CRYPTO_DRIVER_TEST */
1891#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1892 default:
Steven Cooremane6804192021-03-19 18:28:56 +01001893 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001894 }
Steven Cooremand13a70f2021-03-19 15:24:23 +01001895}
Gilles Peskine1905a242021-04-24 13:19:45 +02001896
1897#endif /* MBEDTLS_PSA_CRYPTO_C */