blob: d101144d4883f12f43eda5a4a198083a0d02f96d [file] [log] [blame]
Steven Cooremancd84cb42020-07-16 20:28:36 +02001/*
2 * Functions to delegate cryptographic operations to an available
3 * and appropriate accelerator.
Steven Cooreman56250fd2020-09-04 13:07:15 +02004 * Warning: This file will be auto-generated in the future.
Steven Cooremancd84cb42020-07-16 20:28:36 +02005 */
Steven Cooreman2c7b2f82020-09-02 13:43:46 +02006/* Copyright The Mbed TLS Contributors
Steven Cooremancd84cb42020-07-16 20:28:36 +02007 * SPDX-License-Identifier: Apache-2.0
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
10 * not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
Steven Cooremancd84cb42020-07-16 20:28:36 +020020 */
21
Ronald Cronde822812021-03-17 16:08:20 +010022#include "psa_crypto_aead.h"
Ronald Cron0b805592020-12-14 18:08:20 +010023#include "psa_crypto_cipher.h"
Steven Cooremancd84cb42020-07-16 20:28:36 +020024#include "psa_crypto_core.h"
25#include "psa_crypto_driver_wrappers.h"
Steven Cooreman830aff22021-03-09 09:50:44 +010026#include "psa_crypto_hash.h"
27
Steven Cooreman2a1664c2020-07-20 15:33:08 +020028#include "mbedtls/platform.h"
29
30#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS)
Steven Cooremancd84cb42020-07-16 20:28:36 +020031
32/* Include test driver definition when running tests */
Steven Cooremanf1720ea2020-07-24 18:41:58 +020033#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman56250fd2020-09-04 13:07:15 +020034#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020035#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020036#endif
37#ifndef PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020038#define PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020039#endif
Ronald Cron05ee58d2021-04-30 17:00:34 +020040#include "test/drivers/test_driver.h"
Steven Cooremanf1720ea2020-07-24 18:41:58 +020041#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooremancd84cb42020-07-16 20:28:36 +020042
Steven Cooreman56250fd2020-09-04 13:07:15 +020043/* Repeat above block for each JSON-declared driver during autogeneration */
Steven Cooremanaa87fd02021-03-15 18:54:03 +010044#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */
Steven Cooreman56250fd2020-09-04 13:07:15 +020045
Steven Cooreman1e582352021-02-18 17:24:37 +010046/* Auto-generated values depending on which drivers are registered.
47 * ID 0 is reserved for unallocated operations.
48 * ID 1 is reserved for the Mbed TLS software driver. */
Steven Cooreman830aff22021-03-09 09:50:44 +010049#define PSA_CRYPTO_MBED_TLS_DRIVER_ID (1)
50
Steven Cooreman37941cb2020-07-28 18:49:51 +020051#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman1e582352021-02-18 17:24:37 +010052#define PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID (2)
53#define PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID (3)
Steven Cooreman37941cb2020-07-28 18:49:51 +020054#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman2a1664c2020-07-20 15:33:08 +020055
56/* Support the 'old' SE interface when asked to */
Steven Cooreman7a250572020-07-17 16:43:05 +020057#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Steven Cooreman56250fd2020-09-04 13:07:15 +020058/* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style
59 * SE driver is present, to avoid unused argument errors at compile time. */
60#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020061#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020062#endif
Steven Cooreman7a250572020-07-17 16:43:05 +020063#include "psa_crypto_se.h"
64#endif
65
Steven Cooremancd84cb42020-07-16 20:28:36 +020066/* Start delegation functions */
gabor-mezei-armc53f4f62021-04-22 11:32:19 +020067psa_status_t psa_driver_wrapper_sign_message(
68 const psa_key_attributes_t *attributes,
69 const uint8_t *key_buffer,
70 size_t key_buffer_size,
71 psa_algorithm_t alg,
72 const uint8_t *input,
73 size_t input_length,
74 uint8_t *signature,
75 size_t signature_size,
76 size_t *signature_length )
77{
78 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
79
80 /* Try dynamically-registered SE interface first */
81#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
82 const psa_drv_se_t *drv;
83 psa_drv_se_context_t *drv_context;
84
85 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
86 {
87 if( drv->asymmetric == NULL ||
88 drv->asymmetric->p_sign == NULL )
89 {
90 /* Key is defined in SE, but we have no way to exercise it */
91 return( PSA_ERROR_NOT_SUPPORTED );
92 }
93
94 size_t hash_length;
95 uint8_t hash[PSA_HASH_MAX_SIZE];
96
97 status = psa_driver_wrapper_hash_compute( PSA_ALG_SIGN_GET_HASH( alg ),
98 input, input_length,
99 hash, sizeof( hash ),
100 &hash_length );
101
102 if( status != PSA_ERROR_NOT_SUPPORTED )
103 return( status );
104
105 return( drv->asymmetric->p_sign(
106 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
107 alg, hash, hash_length,
108 signature, signature_size, signature_length ) );
109 }
110#endif /* PSA_CRYPTO_SE_C */
111
112 psa_key_location_t location =
113 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
114
115 switch( location )
116 {
117 case PSA_KEY_LOCATION_LOCAL_STORAGE:
118 /* Key is stored in the slot in export representation, so
119 * cycle through all known transparent accelerators */
120#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
121#if defined(PSA_CRYPTO_DRIVER_TEST)
122 status = mbedtls_test_transparent_signature_sign_message(
123 attributes,
124 key_buffer,
125 key_buffer_size,
126 alg,
127 input,
128 input_length,
129 signature,
130 signature_size,
131 signature_length );
132 /* Declared with fallback == true */
133 if( status != PSA_ERROR_NOT_SUPPORTED )
134 return( status );
135#endif /* PSA_CRYPTO_DRIVER_TEST */
136#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
137 /* Fell through, meaning no accelerator supports this operation */
138 return( psa_sign_message_internal( attributes,
139 key_buffer,
140 key_buffer_size,
141 alg,
142 input,
143 input_length,
144 signature,
145 signature_size,
146 signature_length ) );
147
148 /* Add cases for opaque driver here */
149#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
150#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm77588fb2021-04-27 18:52:51 +0200151 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200152 return( mbedtls_test_opaque_signature_sign_message(
153 attributes,
154 key_buffer,
155 key_buffer_size,
156 alg,
157 input,
158 input_length,
159 signature,
160 signature_size,
161 signature_length ) );
162#endif /* PSA_CRYPTO_DRIVER_TEST */
163#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
164 default:
165 /* Key is declared with a lifetime not known to us */
166 (void)status;
167 return( PSA_ERROR_INVALID_ARGUMENT );
168 }
169}
170
171psa_status_t psa_driver_wrapper_verify_message(
172 const psa_key_attributes_t *attributes,
173 const uint8_t *key_buffer,
174 size_t key_buffer_size,
175 psa_algorithm_t alg,
176 const uint8_t *input,
177 size_t input_length,
178 const uint8_t *signature,
179 size_t signature_length )
180{
181 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
182
183 /* Try dynamically-registered SE interface first */
184#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
185 const psa_drv_se_t *drv;
186 psa_drv_se_context_t *drv_context;
187
188 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
189 {
190 if( drv->asymmetric == NULL ||
191 drv->asymmetric->p_verify == NULL )
192 {
193 /* Key is defined in SE, but we have no way to exercise it */
194 return( PSA_ERROR_NOT_SUPPORTED );
195 }
196
197 size_t hash_length;
198 uint8_t hash[PSA_HASH_MAX_SIZE];
199
200 status = psa_driver_wrapper_hash_compute( PSA_ALG_SIGN_GET_HASH( alg ),
201 input, input_length,
202 hash, sizeof( hash ),
203 &hash_length );
204
205 if( status != PSA_ERROR_NOT_SUPPORTED )
206 return( status );
207
208 return( drv->asymmetric->p_verify(
209 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
210 alg, hash, hash_length,
211 signature, signature_length ) );
212 }
213#endif /* PSA_CRYPTO_SE_C */
214
215 psa_key_location_t location =
216 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
217
218 switch( location )
219 {
220 case PSA_KEY_LOCATION_LOCAL_STORAGE:
221 /* Key is stored in the slot in export representation, so
222 * cycle through all known transparent accelerators */
223#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
224#if defined(PSA_CRYPTO_DRIVER_TEST)
225 status = mbedtls_test_transparent_signature_verify_message(
226 attributes,
227 key_buffer,
228 key_buffer_size,
229 alg,
230 input,
231 input_length,
232 signature,
233 signature_length );
234 /* Declared with fallback == true */
235 if( status != PSA_ERROR_NOT_SUPPORTED )
236 return( status );
237#endif /* PSA_CRYPTO_DRIVER_TEST */
238#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
239
240 return( psa_verify_message_internal( attributes,
241 key_buffer,
242 key_buffer_size,
243 alg,
244 input,
245 input_length,
246 signature,
247 signature_length ) );
248
249 /* Add cases for opaque driver here */
250#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
251#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm77588fb2021-04-27 18:52:51 +0200252 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200253 return( mbedtls_test_opaque_signature_verify_message(
254 attributes,
255 key_buffer,
256 key_buffer_size,
257 alg,
258 input,
259 input_length,
260 signature,
261 signature_length ) );
262#endif /* PSA_CRYPTO_DRIVER_TEST */
263#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
264 default:
265 /* Key is declared with a lifetime not known to us */
266 (void)status;
267 return( PSA_ERROR_INVALID_ARGUMENT );
268 }
269}
270
Ronald Cron9f17aa42020-12-08 17:07:25 +0100271psa_status_t psa_driver_wrapper_sign_hash(
272 const psa_key_attributes_t *attributes,
273 const uint8_t *key_buffer, size_t key_buffer_size,
274 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
275 uint8_t *signature, size_t signature_size, size_t *signature_length )
Steven Cooremancd84cb42020-07-16 20:28:36 +0200276{
Steven Cooreman7a250572020-07-17 16:43:05 +0200277 /* Try dynamically-registered SE interface first */
278#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
279 const psa_drv_se_t *drv;
280 psa_drv_se_context_t *drv_context;
281
Ronald Cron9f17aa42020-12-08 17:07:25 +0100282 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman7a250572020-07-17 16:43:05 +0200283 {
284 if( drv->asymmetric == NULL ||
285 drv->asymmetric->p_sign == NULL )
286 {
287 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200288 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman7a250572020-07-17 16:43:05 +0200289 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100290 return( drv->asymmetric->p_sign(
291 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
292 alg, hash, hash_length,
293 signature, signature_size, signature_length ) );
Steven Cooreman7a250572020-07-17 16:43:05 +0200294 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200295#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman7a250572020-07-17 16:43:05 +0200296
Ronald Cronfce9df22020-12-08 18:06:03 +0100297 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100298 psa_key_location_t location =
299 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200300
301 switch( location )
302 {
303 case PSA_KEY_LOCATION_LOCAL_STORAGE:
304 /* Key is stored in the slot in export representation, so
305 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100306#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200307#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200308 status = mbedtls_test_transparent_signature_sign_hash( attributes,
Ronald Cron9f17aa42020-12-08 17:07:25 +0100309 key_buffer,
310 key_buffer_size,
Steven Cooremancd84cb42020-07-16 20:28:36 +0200311 alg,
312 hash,
313 hash_length,
314 signature,
315 signature_size,
316 signature_length );
317 /* Declared with fallback == true */
318 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200319 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200320#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100321#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200322 /* Fell through, meaning no accelerator supports this operation */
Ronald Cronfce9df22020-12-08 18:06:03 +0100323 return( psa_sign_hash_internal( attributes,
324 key_buffer,
325 key_buffer_size,
326 alg,
327 hash,
328 hash_length,
329 signature,
330 signature_size,
331 signature_length ) );
332
Steven Cooremancd84cb42020-07-16 20:28:36 +0200333 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100334#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200335#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100336 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200337 return( mbedtls_test_opaque_signature_sign_hash( attributes,
338 key_buffer,
339 key_buffer_size,
340 alg,
341 hash,
342 hash_length,
343 signature,
344 signature_size,
345 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200346#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100347#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200348 default:
349 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100350 (void)status;
351 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200352 }
Steven Cooremancd84cb42020-07-16 20:28:36 +0200353}
354
Ronald Cron9f17aa42020-12-08 17:07:25 +0100355psa_status_t psa_driver_wrapper_verify_hash(
356 const psa_key_attributes_t *attributes,
357 const uint8_t *key_buffer, size_t key_buffer_size,
358 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
359 const uint8_t *signature, size_t signature_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200360{
Steven Cooreman55ae2172020-07-17 19:46:15 +0200361 /* Try dynamically-registered SE interface first */
362#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
363 const psa_drv_se_t *drv;
364 psa_drv_se_context_t *drv_context;
365
Ronald Cron9f17aa42020-12-08 17:07:25 +0100366 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200367 {
368 if( drv->asymmetric == NULL ||
369 drv->asymmetric->p_verify == NULL )
370 {
371 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200372 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200373 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100374 return( drv->asymmetric->p_verify(
375 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
376 alg, hash, hash_length,
377 signature, signature_length ) );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200378 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200379#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200380
Ronald Cronfce9df22020-12-08 18:06:03 +0100381 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100382 psa_key_location_t location =
383 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200384
385 switch( location )
386 {
387 case PSA_KEY_LOCATION_LOCAL_STORAGE:
388 /* Key is stored in the slot in export representation, so
389 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100390#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200391#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200392 status = mbedtls_test_transparent_signature_verify_hash(
393 attributes,
394 key_buffer,
395 key_buffer_size,
396 alg,
397 hash,
398 hash_length,
399 signature,
400 signature_length );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200401 /* Declared with fallback == true */
402 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200403 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200404#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100405#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
406
407 return( psa_verify_hash_internal( attributes,
408 key_buffer,
409 key_buffer_size,
410 alg,
411 hash,
412 hash_length,
413 signature,
414 signature_length ) );
415
Steven Cooreman55ae2172020-07-17 19:46:15 +0200416 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100417#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200418#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100419 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200420 return( mbedtls_test_opaque_signature_verify_hash( attributes,
421 key_buffer,
422 key_buffer_size,
423 alg,
424 hash,
425 hash_length,
426 signature,
427 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200428#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100429#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200430 default:
431 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100432 (void)status;
433 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200434 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200435}
436
Steven Cooremanb938b0b2021-04-06 13:08:42 +0200437/** Get the key buffer size required to store the key material of a key
438 * associated with an opaque driver without storage.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200439 *
Ronald Cron31216282020-12-05 18:47:56 +0100440 * \param[in] attributes The key attributes.
441 * \param[out] key_buffer_size Minimum buffer size to contain the key material
Steven Cooreman56250fd2020-09-04 13:07:15 +0200442 *
443 * \retval #PSA_SUCCESS
Ronald Cron31216282020-12-05 18:47:56 +0100444 * The minimum size for a buffer to contain the key material has been
445 * returned successfully.
446 * \retval #PSA_ERROR_INVALID_ARGUMENT
447 * The size in bits of the key is not valid.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200448 * \retval #PSA_ERROR_NOT_SUPPORTED
Ronald Cron31216282020-12-05 18:47:56 +0100449 * The type and/or the size in bits of the key or the combination of
450 * the two is not supported.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200451 */
Ronald Cron9df74be2020-12-05 19:15:23 +0100452psa_status_t psa_driver_wrapper_get_key_buffer_size(
Ronald Cron31216282020-12-05 18:47:56 +0100453 const psa_key_attributes_t *attributes,
454 size_t *key_buffer_size )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200455{
John Durkop2c618352020-09-22 06:54:01 -0700456 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
457 psa_key_type_t key_type = attributes->core.type;
458 size_t key_bits = attributes->core.bits;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200459
Ronald Cron31216282020-12-05 18:47:56 +0100460 *key_buffer_size = 0;
John Durkop2c618352020-09-22 06:54:01 -0700461 switch( location )
462 {
John Durkop2c618352020-09-22 06:54:01 -0700463#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100464 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100465#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS)
466 /* Emulate property 'builtin_key_size' */
467 if( psa_key_id_is_builtin(
468 MBEDTLS_SVC_KEY_ID_GET_KEY_ID(
469 psa_get_key_id( attributes ) ) ) )
470 {
Steven Cooreman203bcbb2021-03-18 17:17:40 +0100471 *key_buffer_size = sizeof( psa_drv_slot_number_t );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100472 return( PSA_SUCCESS );
473 }
474#endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200475 *key_buffer_size = mbedtls_test_size_function( key_type, key_bits );
Ronald Cronb0737da2021-04-14 10:55:34 +0200476 return( ( *key_buffer_size != 0 ) ?
477 PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED );
John Durkop2c618352020-09-22 06:54:01 -0700478#endif /* PSA_CRYPTO_DRIVER_TEST */
479
480 default:
Ronald Cron9df74be2020-12-05 19:15:23 +0100481 (void)key_type;
482 (void)key_bits;
Steven Cooreman56250fd2020-09-04 13:07:15 +0200483 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200484 }
485}
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200486
Ronald Cron977c2472020-10-13 08:32:21 +0200487psa_status_t psa_driver_wrapper_generate_key(
488 const psa_key_attributes_t *attributes,
489 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200490{
Ronald Cron977c2472020-10-13 08:32:21 +0200491 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
492 psa_key_location_t location =
493 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
494
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200495 /* Try dynamically-registered SE interface first */
496#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
497 const psa_drv_se_t *drv;
498 psa_drv_se_context_t *drv_context;
499
Ronald Cron977c2472020-10-13 08:32:21 +0200500 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200501 {
502 size_t pubkey_length = 0; /* We don't support this feature yet */
503 if( drv->key_management == NULL ||
504 drv->key_management->p_generate == NULL )
505 {
506 /* Key is defined as being in SE, but we have no way to generate it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200507 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200508 }
509 return( drv->key_management->p_generate(
Ronald Cron977c2472020-10-13 08:32:21 +0200510 drv_context,
511 *( (psa_key_slot_number_t *)key_buffer ),
Ronald Cronea0f8a62020-11-25 17:52:23 +0100512 attributes, NULL, 0, &pubkey_length ) );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200513 }
514#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
515
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200516 switch( location )
517 {
518 case PSA_KEY_LOCATION_LOCAL_STORAGE:
Ronald Cron977c2472020-10-13 08:32:21 +0200519#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200520 /* Transparent drivers are limited to generating asymmetric keys */
Ronald Cron977c2472020-10-13 08:32:21 +0200521 if( PSA_KEY_TYPE_IS_ASYMMETRIC( attributes->core.type ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200522 {
Ronald Cron977c2472020-10-13 08:32:21 +0200523 /* Cycle through all known transparent accelerators */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200524#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200525 status = mbedtls_test_transparent_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200526 attributes, key_buffer, key_buffer_size,
527 key_buffer_length );
528 /* Declared with fallback == true */
529 if( status != PSA_ERROR_NOT_SUPPORTED )
530 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200531#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200532 }
533#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
534
535 /* Software fallback */
536 status = psa_generate_key_internal(
537 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200538 break;
Ronald Cron977c2472020-10-13 08:32:21 +0200539
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200540 /* Add cases for opaque driver here */
Ronald Cron977c2472020-10-13 08:32:21 +0200541#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200542#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100543 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200544 status = mbedtls_test_opaque_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200545 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200546 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200547#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200548#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
549
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200550 default:
551 /* Key is declared with a lifetime not known to us */
552 status = PSA_ERROR_INVALID_ARGUMENT;
553 break;
554 }
555
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200556 return( status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200557}
558
Ronald Cron83282872020-11-22 14:02:39 +0100559psa_status_t psa_driver_wrapper_import_key(
560 const psa_key_attributes_t *attributes,
561 const uint8_t *data,
562 size_t data_length,
563 uint8_t *key_buffer,
564 size_t key_buffer_size,
565 size_t *key_buffer_length,
566 size_t *bits )
Steven Cooreman04524762020-10-13 17:43:44 +0200567{
Steven Cooreman04524762020-10-13 17:43:44 +0200568 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cronbf33c932020-11-28 18:06:53 +0100569 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
570 psa_get_key_lifetime( attributes ) );
Steven Cooreman04524762020-10-13 17:43:44 +0200571
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100572 /* Try dynamically-registered SE interface first */
573#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
574 const psa_drv_se_t *drv;
575 psa_drv_se_context_t *drv_context;
576
577 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
578 {
579 if( drv->key_management == NULL ||
580 drv->key_management->p_import == NULL )
581 return( PSA_ERROR_NOT_SUPPORTED );
582
583 /* The driver should set the number of key bits, however in
584 * case it doesn't, we initialize bits to an invalid value. */
585 *bits = PSA_MAX_KEY_BITS + 1;
586 status = drv->key_management->p_import(
587 drv_context,
588 *( (psa_key_slot_number_t *)key_buffer ),
589 attributes, data, data_length, bits );
590
591 if( status != PSA_SUCCESS )
592 return( status );
593
594 if( (*bits) > PSA_MAX_KEY_BITS )
595 return( PSA_ERROR_NOT_SUPPORTED );
596
597 return( PSA_SUCCESS );
598 }
599#endif /* PSA_CRYPTO_SE_C */
600
Ronald Cronbf33c932020-11-28 18:06:53 +0100601 switch( location )
602 {
603 case PSA_KEY_LOCATION_LOCAL_STORAGE:
604 /* Key is stored in the slot in export representation, so
605 * cycle through all known transparent accelerators */
606#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
607#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200608 status = mbedtls_test_transparent_import_key(
609 attributes,
610 data, data_length,
611 key_buffer, key_buffer_size,
612 key_buffer_length, bits );
Ronald Cronbf33c932020-11-28 18:06:53 +0100613 /* Declared with fallback == true */
614 if( status != PSA_ERROR_NOT_SUPPORTED )
615 return( status );
616#endif /* PSA_CRYPTO_DRIVER_TEST */
617#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
618 /* Fell through, meaning no accelerator supports this operation */
619 return( psa_import_key_into_slot( attributes,
620 data, data_length,
621 key_buffer, key_buffer_size,
622 key_buffer_length, bits ) );
623
624 default:
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100625 /* Importing a key with external storage in not yet supported.
626 * Return in error indicating that the lifetime is not valid. */
Ronald Cronbf33c932020-11-28 18:06:53 +0100627 (void)status;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100628 return( PSA_ERROR_INVALID_ARGUMENT );
Ronald Cronbf33c932020-11-28 18:06:53 +0100629 }
630
Steven Cooreman04524762020-10-13 17:43:44 +0200631}
632
Ronald Cron67227982020-11-26 15:16:05 +0100633psa_status_t psa_driver_wrapper_export_key(
634 const psa_key_attributes_t *attributes,
635 const uint8_t *key_buffer, size_t key_buffer_size,
636 uint8_t *data, size_t data_size, size_t *data_length )
637
638{
639 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
640 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
641 psa_get_key_lifetime( attributes ) );
642
Ronald Cron152e3f82020-11-26 16:06:41 +0100643 /* Try dynamically-registered SE interface first */
644#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
645 const psa_drv_se_t *drv;
646 psa_drv_se_context_t *drv_context;
647
648 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
649 {
650 if( ( drv->key_management == NULL ) ||
651 ( drv->key_management->p_export == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100652 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100653 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100654 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100655
656 return( drv->key_management->p_export(
657 drv_context,
658 *( (psa_key_slot_number_t *)key_buffer ),
659 data, data_size, data_length ) );
660 }
661#endif /* PSA_CRYPTO_SE_C */
662
Ronald Cron67227982020-11-26 15:16:05 +0100663 switch( location )
664 {
665 case PSA_KEY_LOCATION_LOCAL_STORAGE:
666 return( psa_export_key_internal( attributes,
667 key_buffer,
668 key_buffer_size,
669 data,
670 data_size,
671 data_length ) );
672
673 /* Add cases for opaque driver here */
674#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
675#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100676 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200677 return( mbedtls_test_opaque_export_key( attributes,
678 key_buffer,
679 key_buffer_size,
680 data,
681 data_size,
682 data_length ) );
Ronald Cron67227982020-11-26 15:16:05 +0100683#endif /* PSA_CRYPTO_DRIVER_TEST */
684#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
685 default:
686 /* Key is declared with a lifetime not known to us */
687 return( status );
688 }
689}
690
Ronald Cron84cc9942020-11-25 14:30:05 +0100691psa_status_t psa_driver_wrapper_export_public_key(
692 const psa_key_attributes_t *attributes,
693 const uint8_t *key_buffer, size_t key_buffer_size,
694 uint8_t *data, size_t data_size, size_t *data_length )
695
Steven Cooremanb9b84422020-10-14 14:39:20 +0200696{
Steven Cooremanb9b84422020-10-14 14:39:20 +0200697 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Cron84cc9942020-11-25 14:30:05 +0100698 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
699 psa_get_key_lifetime( attributes ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200700
Ronald Cron152e3f82020-11-26 16:06:41 +0100701 /* Try dynamically-registered SE interface first */
702#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
703 const psa_drv_se_t *drv;
704 psa_drv_se_context_t *drv_context;
705
706 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
707 {
708 if( ( drv->key_management == NULL ) ||
709 ( drv->key_management->p_export_public == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100710 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100711 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100712 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100713
714 return( drv->key_management->p_export_public(
715 drv_context,
716 *( (psa_key_slot_number_t *)key_buffer ),
717 data, data_size, data_length ) );
718 }
719#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
720
Steven Cooremanb9b84422020-10-14 14:39:20 +0200721 switch( location )
722 {
723 case PSA_KEY_LOCATION_LOCAL_STORAGE:
724 /* Key is stored in the slot in export representation, so
725 * cycle through all known transparent accelerators */
Ronald Cron67227982020-11-26 15:16:05 +0100726#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200727#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200728 status = mbedtls_test_transparent_export_public_key(
729 attributes,
730 key_buffer,
731 key_buffer_size,
732 data,
733 data_size,
734 data_length );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200735 /* Declared with fallback == true */
736 if( status != PSA_ERROR_NOT_SUPPORTED )
737 return( status );
738#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100739#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200740 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron67227982020-11-26 15:16:05 +0100741 return( psa_export_public_key_internal( attributes,
742 key_buffer,
743 key_buffer_size,
744 data,
745 data_size,
746 data_length ) );
747
Steven Cooremanb9b84422020-10-14 14:39:20 +0200748 /* Add cases for opaque driver here */
Ronald Cron67227982020-11-26 15:16:05 +0100749#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200750#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100751 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200752 return( mbedtls_test_opaque_export_public_key( attributes,
753 key_buffer,
754 key_buffer_size,
755 data,
756 data_size,
757 data_length ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200758#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100759#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200760 default:
761 /* Key is declared with a lifetime not known to us */
762 return( status );
763 }
Steven Cooremanb9b84422020-10-14 14:39:20 +0200764}
765
Steven Cooreman6801f082021-02-19 17:21:22 +0100766psa_status_t psa_driver_wrapper_get_builtin_key(
767 psa_drv_slot_number_t slot_number,
768 psa_key_attributes_t *attributes,
769 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
770{
771 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
772 switch( location )
773 {
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100774#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100775 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200776 return( mbedtls_test_opaque_get_builtin_key(
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100777 slot_number,
778 attributes,
779 key_buffer, key_buffer_size, key_buffer_length ) );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100780#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman6801f082021-02-19 17:21:22 +0100781 default:
782 (void) slot_number;
783 (void) key_buffer;
784 (void) key_buffer_size;
785 (void) key_buffer_length;
786 return( PSA_ERROR_DOES_NOT_EXIST );
787 }
788}
789
Steven Cooreman37941cb2020-07-28 18:49:51 +0200790/*
791 * Cipher functions
792 */
793psa_status_t psa_driver_wrapper_cipher_encrypt(
794 psa_key_slot_t *slot,
795 psa_algorithm_t alg,
796 const uint8_t *input,
797 size_t input_length,
798 uint8_t *output,
799 size_t output_size,
800 size_t *output_length )
801{
802#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
803 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
804 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
805 psa_key_attributes_t attributes = {
806 .core = slot->attr
807 };
808
809 switch( location )
810 {
811 case PSA_KEY_LOCATION_LOCAL_STORAGE:
812 /* Key is stored in the slot in export representation, so
813 * cycle through all known transparent accelerators */
814#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200815 status = mbedtls_test_transparent_cipher_encrypt( &attributes,
816 slot->key.data,
817 slot->key.bytes,
818 alg,
819 input,
820 input_length,
821 output,
822 output_size,
823 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200824 /* Declared with fallback == true */
825 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200826 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200827#endif /* PSA_CRYPTO_DRIVER_TEST */
828 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200829 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200830 /* Add cases for opaque driver here */
831#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100832 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200833 return( mbedtls_test_opaque_cipher_encrypt( &attributes,
834 slot->key.data,
835 slot->key.bytes,
836 alg,
837 input,
838 input_length,
839 output,
840 output_size,
841 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200842#endif /* PSA_CRYPTO_DRIVER_TEST */
843 default:
844 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200845 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200846 }
847#else /* PSA_CRYPTO_DRIVER_PRESENT */
848 (void) slot;
849 (void) alg;
850 (void) input;
851 (void) input_length;
852 (void) output;
853 (void) output_size;
854 (void) output_length;
855
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200856 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200857#endif /* PSA_CRYPTO_DRIVER_PRESENT */
858}
859
860psa_status_t psa_driver_wrapper_cipher_decrypt(
861 psa_key_slot_t *slot,
862 psa_algorithm_t alg,
863 const uint8_t *input,
864 size_t input_length,
865 uint8_t *output,
866 size_t output_size,
867 size_t *output_length )
868{
869#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
870 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
871 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
872 psa_key_attributes_t attributes = {
873 .core = slot->attr
874 };
875
876 switch( location )
877 {
878 case PSA_KEY_LOCATION_LOCAL_STORAGE:
879 /* Key is stored in the slot in export representation, so
880 * cycle through all known transparent accelerators */
881#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200882 status = mbedtls_test_transparent_cipher_decrypt( &attributes,
883 slot->key.data,
884 slot->key.bytes,
885 alg,
886 input,
887 input_length,
888 output,
889 output_size,
890 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200891 /* Declared with fallback == true */
892 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200893 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200894#endif /* PSA_CRYPTO_DRIVER_TEST */
895 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200896 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200897 /* Add cases for opaque driver here */
898#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100899 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200900 return( mbedtls_test_opaque_cipher_decrypt( &attributes,
901 slot->key.data,
902 slot->key.bytes,
903 alg,
904 input,
905 input_length,
906 output,
907 output_size,
908 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200909#endif /* PSA_CRYPTO_DRIVER_TEST */
910 default:
911 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200912 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200913 }
914#else /* PSA_CRYPTO_DRIVER_PRESENT */
915 (void) slot;
916 (void) alg;
917 (void) input;
918 (void) input_length;
919 (void) output;
920 (void) output_size;
921 (void) output_length;
922
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200923 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200924#endif /* PSA_CRYPTO_DRIVER_PRESENT */
925}
926
927psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100928 psa_cipher_operation_t *operation,
929 const psa_key_attributes_t *attributes,
930 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200931 psa_algorithm_t alg )
932{
Ronald Cron0b805592020-12-14 18:08:20 +0100933 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Crona4af55f2020-12-14 14:36:06 +0100934 psa_key_location_t location =
935 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200936
Steven Cooreman37941cb2020-07-28 18:49:51 +0200937 switch( location )
938 {
939 case PSA_KEY_LOCATION_LOCAL_STORAGE:
940 /* Key is stored in the slot in export representation, so
941 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100942#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200943#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200944 status = mbedtls_test_transparent_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100945 &operation->ctx.transparent_test_driver_ctx,
946 attributes,
947 key_buffer,
948 key_buffer_size,
949 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200950 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200951 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100952 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200953
Ronald Cron0b805592020-12-14 18:08:20 +0100954 if( status != PSA_ERROR_NOT_SUPPORTED )
955 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200956#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100957#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100958#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200959 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100960 status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100961 attributes,
962 key_buffer,
963 key_buffer_size,
964 alg );
965 if( status == PSA_SUCCESS )
Ronald Cron6e412a72021-03-10 09:58:47 +0100966 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Ronald Cron49fafa92021-03-10 08:34:23 +0100967
Ronald Cron7b4154d2021-03-19 14:49:41 +0100968 if( status != PSA_ERROR_NOT_SUPPORTED )
969 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100970#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
971 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron0b805592020-12-14 18:08:20 +0100972
Steven Cooreman37941cb2020-07-28 18:49:51 +0200973 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100974#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200975#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100976 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200977 status = mbedtls_test_opaque_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100978 &operation->ctx.opaque_test_driver_ctx,
979 attributes,
980 key_buffer, key_buffer_size,
981 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200982
Steven Cooreman37941cb2020-07-28 18:49:51 +0200983 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100984 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200985
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200986 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200987#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100988#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200989 default:
990 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100991 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100992 (void)key_buffer;
993 (void)key_buffer_size;
994 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +0200995 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200996 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200997}
998
999psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +01001000 psa_cipher_operation_t *operation,
1001 const psa_key_attributes_t *attributes,
1002 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001003 psa_algorithm_t alg )
1004{
Steven Cooreman37941cb2020-07-28 18:49:51 +02001005 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Crona4af55f2020-12-14 14:36:06 +01001006 psa_key_location_t location =
1007 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001008
Steven Cooreman37941cb2020-07-28 18:49:51 +02001009 switch( location )
1010 {
1011 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1012 /* Key is stored in the slot in export representation, so
1013 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +01001014#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001015#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001016 status = mbedtls_test_transparent_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001017 &operation->ctx.transparent_test_driver_ctx,
1018 attributes,
1019 key_buffer,
1020 key_buffer_size,
1021 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001022 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +02001023 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001024 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +02001025
Ronald Cron0b805592020-12-14 18:08:20 +01001026 if( status != PSA_ERROR_NOT_SUPPORTED )
1027 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001028#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001029#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001030#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001031 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +01001032 status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001033 attributes,
1034 key_buffer,
1035 key_buffer_size,
1036 alg );
1037 if( status == PSA_SUCCESS )
1038 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1039
1040 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001041#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1042 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron49fafa92021-03-10 08:34:23 +01001043
Steven Cooreman37941cb2020-07-28 18:49:51 +02001044 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +01001045#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001046#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +01001047 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001048 status = mbedtls_test_opaque_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001049 &operation->ctx.opaque_test_driver_ctx,
1050 attributes,
1051 key_buffer, key_buffer_size,
1052 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001053
Steven Cooreman37941cb2020-07-28 18:49:51 +02001054 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001055 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001056
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001057 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001058#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001059#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +02001060 default:
1061 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +01001062 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001063 (void)key_buffer;
1064 (void)key_buffer_size;
1065 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +02001066 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001067 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001068}
1069
Steven Cooreman37941cb2020-07-28 18:49:51 +02001070psa_status_t psa_driver_wrapper_cipher_set_iv(
Ronald Cron6056fe82020-12-15 13:58:07 +01001071 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001072 const uint8_t *iv,
1073 size_t iv_length )
1074{
Ronald Cron49fafa92021-03-10 08:34:23 +01001075 switch( operation->id )
1076 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001077#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001078 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001079 return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001080 iv,
1081 iv_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001082#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001083
1084#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001085#if defined(PSA_CRYPTO_DRIVER_TEST)
1086 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001087 return( mbedtls_test_transparent_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001088 &operation->ctx.transparent_test_driver_ctx,
1089 iv, iv_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001090
Steven Cooreman37941cb2020-07-28 18:49:51 +02001091 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001092 return( mbedtls_test_opaque_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001093 &operation->ctx.opaque_test_driver_ctx,
1094 iv, iv_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001095#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001096#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001097 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001098
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001099 (void)iv;
1100 (void)iv_length;
1101
Ronald Crondd24c9b2020-12-15 14:10:01 +01001102 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001103}
1104
1105psa_status_t psa_driver_wrapper_cipher_update(
Ronald Cron6056fe82020-12-15 13:58:07 +01001106 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001107 const uint8_t *input,
1108 size_t input_length,
1109 uint8_t *output,
1110 size_t output_size,
1111 size_t *output_length )
1112{
Ronald Cron49fafa92021-03-10 08:34:23 +01001113 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001114 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001115#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001116 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001117 return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001118 input,
1119 input_length,
1120 output,
1121 output_size,
1122 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001123#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1124
Ronald Cron49fafa92021-03-10 08:34:23 +01001125#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001126#if defined(PSA_CRYPTO_DRIVER_TEST)
1127 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001128 return( mbedtls_test_transparent_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001129 &operation->ctx.transparent_test_driver_ctx,
1130 input, input_length,
1131 output, output_size, output_length ) );
1132
Steven Cooreman37941cb2020-07-28 18:49:51 +02001133 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001134 return( mbedtls_test_opaque_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001135 &operation->ctx.opaque_test_driver_ctx,
1136 input, input_length,
1137 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001138#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001139#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001140 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001141
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001142 (void)input;
1143 (void)input_length;
1144 (void)output;
1145 (void)output_size;
1146 (void)output_length;
1147
Ronald Crondd24c9b2020-12-15 14:10:01 +01001148 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001149}
1150
1151psa_status_t psa_driver_wrapper_cipher_finish(
Ronald Cron6056fe82020-12-15 13:58:07 +01001152 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001153 uint8_t *output,
1154 size_t output_size,
1155 size_t *output_length )
1156{
Ronald Cron49fafa92021-03-10 08:34:23 +01001157 switch( operation->id )
1158 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001159#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001160 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001161 return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001162 output,
1163 output_size,
1164 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001165#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001166
1167#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001168#if defined(PSA_CRYPTO_DRIVER_TEST)
1169 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001170 return( mbedtls_test_transparent_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001171 &operation->ctx.transparent_test_driver_ctx,
1172 output, output_size, output_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001173
Steven Cooreman37941cb2020-07-28 18:49:51 +02001174 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001175 return( mbedtls_test_opaque_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001176 &operation->ctx.opaque_test_driver_ctx,
1177 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001178#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001179#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001180 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001181
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001182 (void)output;
1183 (void)output_size;
1184 (void)output_length;
1185
Ronald Crondd24c9b2020-12-15 14:10:01 +01001186 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001187}
1188
1189psa_status_t psa_driver_wrapper_cipher_abort(
Ronald Cron6056fe82020-12-15 13:58:07 +01001190 psa_cipher_operation_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001191{
Ronald Crondd24c9b2020-12-15 14:10:01 +01001192 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001193
Ronald Cron49fafa92021-03-10 08:34:23 +01001194 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001195 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001196#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001197 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001198 return( mbedtls_psa_cipher_abort( &operation->ctx.mbedtls_ctx ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001199#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron49fafa92021-03-10 08:34:23 +01001200
1201#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001202#if defined(PSA_CRYPTO_DRIVER_TEST)
1203 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001204 status = mbedtls_test_transparent_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001205 &operation->ctx.transparent_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001206 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001207 &operation->ctx.transparent_test_driver_ctx,
1208 sizeof( operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001209 return( status );
Ronald Cron49fafa92021-03-10 08:34:23 +01001210
Steven Cooreman37941cb2020-07-28 18:49:51 +02001211 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001212 status = mbedtls_test_opaque_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001213 &operation->ctx.opaque_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001214 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001215 &operation->ctx.opaque_test_driver_ctx,
1216 sizeof( operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001217 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001218#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001219#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001220 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001221
Ronald Cron49fafa92021-03-10 08:34:23 +01001222 (void)status;
Ronald Crondd24c9b2020-12-15 14:10:01 +01001223 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001224}
1225
Steven Cooreman1e582352021-02-18 17:24:37 +01001226/*
1227 * Hashing functions
1228 */
1229psa_status_t psa_driver_wrapper_hash_compute(
1230 psa_algorithm_t alg,
1231 const uint8_t *input,
1232 size_t input_length,
1233 uint8_t *hash,
1234 size_t hash_size,
1235 size_t *hash_length)
1236{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001237 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001238
1239 /* Try accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001240#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001241 status = mbedtls_test_transparent_hash_compute(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001242 alg, input, input_length, hash, hash_size, hash_length );
Steven Cooremanf7638102021-03-04 15:14:36 +01001243 if( status != PSA_ERROR_NOT_SUPPORTED )
1244 return( status );
1245#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001246
1247 /* If software fallback is compiled in, try fallback */
1248#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1249 status = mbedtls_psa_hash_compute( alg, input, input_length,
1250 hash, hash_size, hash_length );
1251 if( status != PSA_ERROR_NOT_SUPPORTED )
1252 return( status );
1253#endif
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001254 (void) status;
1255 (void) alg;
1256 (void) input;
1257 (void) input_length;
1258 (void) hash;
1259 (void) hash_size;
1260 (void) hash_length;
Steven Cooreman1e582352021-02-18 17:24:37 +01001261
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001262 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman1e582352021-02-18 17:24:37 +01001263}
1264
1265psa_status_t psa_driver_wrapper_hash_setup(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001266 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001267 psa_algorithm_t alg )
1268{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001269 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001270
Steven Cooreman1e582352021-02-18 17:24:37 +01001271 /* Try setup on accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001272#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001273 status = mbedtls_test_transparent_hash_setup(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001274 &operation->ctx.test_driver_ctx, alg );
Steven Cooremanf7638102021-03-04 15:14:36 +01001275 if( status == PSA_SUCCESS )
1276 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1277
1278 if( status != PSA_ERROR_NOT_SUPPORTED )
1279 return( status );
1280#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001281
1282 /* If software fallback is compiled in, try fallback */
1283#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001284 status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
Steven Cooreman1e582352021-02-18 17:24:37 +01001285 if( status == PSA_SUCCESS )
Steven Cooreman1e582352021-02-18 17:24:37 +01001286 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Steven Cooreman1e582352021-02-18 17:24:37 +01001287
1288 if( status != PSA_ERROR_NOT_SUPPORTED )
1289 return( status );
1290#endif
1291 /* Nothing left to try if we fall through here */
1292 (void) status;
1293 (void) operation;
1294 (void) alg;
1295 return( PSA_ERROR_NOT_SUPPORTED );
1296}
1297
1298psa_status_t psa_driver_wrapper_hash_clone(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001299 const psa_hash_operation_t *source_operation,
1300 psa_hash_operation_t *target_operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001301{
Steven Cooreman1e582352021-02-18 17:24:37 +01001302 switch( source_operation->id )
1303 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001304#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1305 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1306 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1307 return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1308 &target_operation->ctx.mbedtls_ctx ) );
1309#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001310#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001311 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1312 target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001313 return( mbedtls_test_transparent_hash_clone(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001314 &source_operation->ctx.test_driver_ctx,
1315 &target_operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001316#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001317 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001318 (void) target_operation;
1319 return( PSA_ERROR_BAD_STATE );
1320 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001321}
1322
1323psa_status_t psa_driver_wrapper_hash_update(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001324 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001325 const uint8_t *input,
1326 size_t input_length )
1327{
Steven Cooreman1e582352021-02-18 17:24:37 +01001328 switch( operation->id )
1329 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001330#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1331 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1332 return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
1333 input, input_length ) );
1334#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001335#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001336 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001337 return( mbedtls_test_transparent_hash_update(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001338 &operation->ctx.test_driver_ctx,
1339 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001340#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001341 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001342 (void) input;
1343 (void) input_length;
1344 return( PSA_ERROR_BAD_STATE );
1345 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001346}
1347
1348psa_status_t psa_driver_wrapper_hash_finish(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001349 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001350 uint8_t *hash,
1351 size_t hash_size,
1352 size_t *hash_length )
1353{
Steven Cooreman1e582352021-02-18 17:24:37 +01001354 switch( operation->id )
1355 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001356#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1357 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1358 return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1359 hash, hash_size, hash_length ) );
1360#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001361#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001362 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001363 return( mbedtls_test_transparent_hash_finish(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001364 &operation->ctx.test_driver_ctx,
1365 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001366#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001367 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001368 (void) hash;
1369 (void) hash_size;
1370 (void) hash_length;
1371 return( PSA_ERROR_BAD_STATE );
1372 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001373}
1374
1375psa_status_t psa_driver_wrapper_hash_abort(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001376 psa_hash_operation_t *operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001377{
Steven Cooreman1e582352021-02-18 17:24:37 +01001378 switch( operation->id )
1379 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001380#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1381 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1382 return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1383#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001384#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001385 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001386 return( mbedtls_test_transparent_hash_abort(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001387 &operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001388#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001389 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001390 return( PSA_ERROR_BAD_STATE );
1391 }
1392}
1393
Ronald Cronde822812021-03-17 16:08:20 +01001394psa_status_t psa_driver_wrapper_aead_encrypt(
1395 const psa_key_attributes_t *attributes,
1396 const uint8_t *key_buffer, size_t key_buffer_size,
1397 psa_algorithm_t alg,
1398 const uint8_t *nonce, size_t nonce_length,
1399 const uint8_t *additional_data, size_t additional_data_length,
1400 const uint8_t *plaintext, size_t plaintext_length,
1401 uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length )
1402{
1403 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1404 psa_key_location_t location =
1405 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1406
1407 switch( location )
1408 {
1409 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1410 /* Key is stored in the slot in export representation, so
1411 * cycle through all known transparent accelerators */
1412
1413#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1414#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001415 status = mbedtls_test_transparent_aead_encrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001416 attributes, key_buffer, key_buffer_size,
1417 alg,
1418 nonce, nonce_length,
1419 additional_data, additional_data_length,
1420 plaintext, plaintext_length,
1421 ciphertext, ciphertext_size, ciphertext_length );
1422 /* Declared with fallback == true */
1423 if( status != PSA_ERROR_NOT_SUPPORTED )
1424 return( status );
1425#endif /* PSA_CRYPTO_DRIVER_TEST */
1426#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1427
1428 /* Fell through, meaning no accelerator supports this operation */
1429 return( mbedtls_psa_aead_encrypt(
1430 attributes, key_buffer, key_buffer_size,
1431 alg,
1432 nonce, nonce_length,
1433 additional_data, additional_data_length,
1434 plaintext, plaintext_length,
1435 ciphertext, ciphertext_size, ciphertext_length ) );
1436
1437 /* Add cases for opaque driver here */
1438
1439 default:
1440 /* Key is declared with a lifetime not known to us */
1441 (void)status;
1442 return( PSA_ERROR_INVALID_ARGUMENT );
1443 }
1444}
1445
1446psa_status_t psa_driver_wrapper_aead_decrypt(
1447 const psa_key_attributes_t *attributes,
1448 const uint8_t *key_buffer, size_t key_buffer_size,
1449 psa_algorithm_t alg,
1450 const uint8_t *nonce, size_t nonce_length,
1451 const uint8_t *additional_data, size_t additional_data_length,
1452 const uint8_t *ciphertext, size_t ciphertext_length,
1453 uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length )
1454{
1455 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1456 psa_key_location_t location =
1457 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1458
1459 switch( location )
1460 {
1461 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1462 /* Key is stored in the slot in export representation, so
1463 * cycle through all known transparent accelerators */
1464
1465#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1466#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001467 status = mbedtls_test_transparent_aead_decrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001468 attributes, key_buffer, key_buffer_size,
1469 alg,
1470 nonce, nonce_length,
1471 additional_data, additional_data_length,
1472 ciphertext, ciphertext_length,
1473 plaintext, plaintext_size, plaintext_length );
1474 /* Declared with fallback == true */
1475 if( status != PSA_ERROR_NOT_SUPPORTED )
1476 return( status );
1477#endif /* PSA_CRYPTO_DRIVER_TEST */
1478#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1479
1480 /* Fell through, meaning no accelerator supports this operation */
1481 return( mbedtls_psa_aead_decrypt(
1482 attributes, key_buffer, key_buffer_size,
1483 alg,
1484 nonce, nonce_length,
1485 additional_data, additional_data_length,
1486 ciphertext, ciphertext_length,
1487 plaintext, plaintext_size, plaintext_length ) );
1488
1489 /* Add cases for opaque driver here */
1490
1491 default:
1492 /* Key is declared with a lifetime not known to us */
1493 (void)status;
1494 return( PSA_ERROR_INVALID_ARGUMENT );
1495 }
1496}
Steven Cooremancd84cb42020-07-16 20:28:36 +02001497/* End of automatically generated file. */