blob: c9b86fe81907757618b20cfe33d69bf5119a8577 [file] [log] [blame]
Steven Cooremancd84cb42020-07-16 20:28:36 +02001/*
2 * Functions to delegate cryptographic operations to an available
3 * and appropriate accelerator.
Steven Cooreman56250fd2020-09-04 13:07:15 +02004 * Warning: This file will be auto-generated in the future.
Steven Cooremancd84cb42020-07-16 20:28:36 +02005 */
Steven Cooreman2c7b2f82020-09-02 13:43:46 +02006/* Copyright The Mbed TLS Contributors
Steven Cooremancd84cb42020-07-16 20:28:36 +02007 * SPDX-License-Identifier: Apache-2.0
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
10 * not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
Steven Cooremancd84cb42020-07-16 20:28:36 +020020 */
21
Ronald Cronde822812021-03-17 16:08:20 +010022#include "psa_crypto_aead.h"
Ronald Cron0b805592020-12-14 18:08:20 +010023#include "psa_crypto_cipher.h"
Steven Cooremancd84cb42020-07-16 20:28:36 +020024#include "psa_crypto_core.h"
25#include "psa_crypto_driver_wrappers.h"
Steven Cooreman830aff22021-03-09 09:50:44 +010026#include "psa_crypto_hash.h"
Steven Cooreman896d51e2021-03-19 15:24:23 +010027#include "psa_crypto_mac.h"
Steven Cooreman830aff22021-03-09 09:50:44 +010028
Steven Cooreman2a1664c2020-07-20 15:33:08 +020029#include "mbedtls/platform.h"
30
Gilles Peskinead0e0122021-04-24 13:19:45 +020031#if defined(MBEDTLS_PSA_CRYPTO_C)
32
Steven Cooreman2a1664c2020-07-20 15:33:08 +020033#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS)
Steven Cooremancd84cb42020-07-16 20:28:36 +020034
35/* Include test driver definition when running tests */
Steven Cooremanf1720ea2020-07-24 18:41:58 +020036#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman56250fd2020-09-04 13:07:15 +020037#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020038#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020039#endif
40#ifndef PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020041#define PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020042#endif
Ronald Cron05ee58d2021-04-30 17:00:34 +020043#include "test/drivers/test_driver.h"
Steven Cooremanf1720ea2020-07-24 18:41:58 +020044#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooremancd84cb42020-07-16 20:28:36 +020045
Steven Cooreman56250fd2020-09-04 13:07:15 +020046/* Repeat above block for each JSON-declared driver during autogeneration */
Steven Cooremanaa87fd02021-03-15 18:54:03 +010047#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */
Steven Cooreman56250fd2020-09-04 13:07:15 +020048
Steven Cooreman1e582352021-02-18 17:24:37 +010049/* Auto-generated values depending on which drivers are registered.
50 * ID 0 is reserved for unallocated operations.
51 * ID 1 is reserved for the Mbed TLS software driver. */
Steven Cooreman830aff22021-03-09 09:50:44 +010052#define PSA_CRYPTO_MBED_TLS_DRIVER_ID (1)
53
Steven Cooreman37941cb2020-07-28 18:49:51 +020054#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman1e582352021-02-18 17:24:37 +010055#define PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID (2)
56#define PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID (3)
Steven Cooreman37941cb2020-07-28 18:49:51 +020057#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman2a1664c2020-07-20 15:33:08 +020058
59/* Support the 'old' SE interface when asked to */
Steven Cooreman7a250572020-07-17 16:43:05 +020060#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Steven Cooreman56250fd2020-09-04 13:07:15 +020061/* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style
62 * SE driver is present, to avoid unused argument errors at compile time. */
63#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020064#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020065#endif
Steven Cooreman7a250572020-07-17 16:43:05 +020066#include "psa_crypto_se.h"
67#endif
68
Ronald Cron088d5d02021-04-10 16:57:30 +020069psa_status_t psa_driver_wrapper_init( void )
70{
71 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
72
73#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
74 status = psa_init_all_se_drivers( );
75 if( status != PSA_SUCCESS )
76 return( status );
77#endif
78
79#if defined(PSA_CRYPTO_DRIVER_TEST)
80 status = mbedtls_test_transparent_init( );
81 if( status != PSA_SUCCESS )
82 return( status );
83
84 status = mbedtls_test_opaque_init( );
85 if( status != PSA_SUCCESS )
86 return( status );
87#endif
88
89 (void) status;
90 return( PSA_SUCCESS );
91}
92
93void psa_driver_wrapper_free( void )
94{
95#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
96 /* Unregister all secure element drivers, so that we restart from
97 * a pristine state. */
98 psa_unregister_all_se_drivers( );
99#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
100
101#if defined(PSA_CRYPTO_DRIVER_TEST)
102 mbedtls_test_transparent_free( );
103 mbedtls_test_opaque_free( );
104#endif
105}
106
Steven Cooremancd84cb42020-07-16 20:28:36 +0200107/* Start delegation functions */
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200108psa_status_t psa_driver_wrapper_sign_message(
109 const psa_key_attributes_t *attributes,
110 const uint8_t *key_buffer,
111 size_t key_buffer_size,
112 psa_algorithm_t alg,
113 const uint8_t *input,
114 size_t input_length,
115 uint8_t *signature,
116 size_t signature_size,
117 size_t *signature_length )
118{
119 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200120 psa_key_location_t location =
121 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
122
123 switch( location )
124 {
125 case PSA_KEY_LOCATION_LOCAL_STORAGE:
126 /* Key is stored in the slot in export representation, so
127 * cycle through all known transparent accelerators */
128#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
129#if defined(PSA_CRYPTO_DRIVER_TEST)
130 status = mbedtls_test_transparent_signature_sign_message(
131 attributes,
132 key_buffer,
133 key_buffer_size,
134 alg,
135 input,
136 input_length,
137 signature,
138 signature_size,
139 signature_length );
140 /* Declared with fallback == true */
141 if( status != PSA_ERROR_NOT_SUPPORTED )
142 return( status );
143#endif /* PSA_CRYPTO_DRIVER_TEST */
144#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arma7b9b202021-05-07 15:16:34 +0200145 break;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200146
147 /* Add cases for opaque driver here */
148#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
149#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm77588fb2021-04-27 18:52:51 +0200150 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arma7b9b202021-05-07 15:16:34 +0200151 status = mbedtls_test_opaque_signature_sign_message(
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200152 attributes,
153 key_buffer,
154 key_buffer_size,
155 alg,
156 input,
157 input_length,
158 signature,
159 signature_size,
gabor-mezei-arma7b9b202021-05-07 15:16:34 +0200160 signature_length );
161 if( status != PSA_ERROR_NOT_SUPPORTED )
162 return( status );
163 break;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200164#endif /* PSA_CRYPTO_DRIVER_TEST */
165#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
166 default:
167 /* Key is declared with a lifetime not known to us */
168 (void)status;
gabor-mezei-armf25c9762021-05-12 11:12:25 +0200169 break;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200170 }
gabor-mezei-arma7b9b202021-05-07 15:16:34 +0200171
172 return( psa_sign_message_builtin( attributes,
173 key_buffer,
174 key_buffer_size,
175 alg,
176 input,
177 input_length,
178 signature,
179 signature_size,
180 signature_length ) );
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200181}
182
183psa_status_t psa_driver_wrapper_verify_message(
184 const psa_key_attributes_t *attributes,
185 const uint8_t *key_buffer,
186 size_t key_buffer_size,
187 psa_algorithm_t alg,
188 const uint8_t *input,
189 size_t input_length,
190 const uint8_t *signature,
191 size_t signature_length )
192{
193 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200194 psa_key_location_t location =
195 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
196
197 switch( location )
198 {
199 case PSA_KEY_LOCATION_LOCAL_STORAGE:
200 /* Key is stored in the slot in export representation, so
201 * cycle through all known transparent accelerators */
202#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
203#if defined(PSA_CRYPTO_DRIVER_TEST)
204 status = mbedtls_test_transparent_signature_verify_message(
205 attributes,
206 key_buffer,
207 key_buffer_size,
208 alg,
209 input,
210 input_length,
211 signature,
212 signature_length );
213 /* Declared with fallback == true */
214 if( status != PSA_ERROR_NOT_SUPPORTED )
215 return( status );
216#endif /* PSA_CRYPTO_DRIVER_TEST */
217#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arma7b9b202021-05-07 15:16:34 +0200218 break;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200219
220 /* Add cases for opaque driver here */
221#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
222#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm77588fb2021-04-27 18:52:51 +0200223 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200224 return( mbedtls_test_opaque_signature_verify_message(
225 attributes,
226 key_buffer,
227 key_buffer_size,
228 alg,
229 input,
230 input_length,
231 signature,
232 signature_length ) );
gabor-mezei-arma7b9b202021-05-07 15:16:34 +0200233 if( status != PSA_ERROR_NOT_SUPPORTED )
234 return( status );
235 break;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200236#endif /* PSA_CRYPTO_DRIVER_TEST */
237#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
238 default:
239 /* Key is declared with a lifetime not known to us */
240 (void)status;
gabor-mezei-armf25c9762021-05-12 11:12:25 +0200241 break;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200242 }
gabor-mezei-arma7b9b202021-05-07 15:16:34 +0200243
244 return( psa_verify_message_builtin( attributes,
245 key_buffer,
246 key_buffer_size,
247 alg,
248 input,
249 input_length,
250 signature,
251 signature_length ) );
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200252}
253
Ronald Cron9f17aa42020-12-08 17:07:25 +0100254psa_status_t psa_driver_wrapper_sign_hash(
255 const psa_key_attributes_t *attributes,
256 const uint8_t *key_buffer, size_t key_buffer_size,
257 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
258 uint8_t *signature, size_t signature_size, size_t *signature_length )
Steven Cooremancd84cb42020-07-16 20:28:36 +0200259{
Steven Cooreman7a250572020-07-17 16:43:05 +0200260 /* Try dynamically-registered SE interface first */
261#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
262 const psa_drv_se_t *drv;
263 psa_drv_se_context_t *drv_context;
264
Ronald Cron9f17aa42020-12-08 17:07:25 +0100265 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman7a250572020-07-17 16:43:05 +0200266 {
267 if( drv->asymmetric == NULL ||
268 drv->asymmetric->p_sign == NULL )
269 {
270 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200271 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman7a250572020-07-17 16:43:05 +0200272 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100273 return( drv->asymmetric->p_sign(
274 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
275 alg, hash, hash_length,
276 signature, signature_size, signature_length ) );
Steven Cooreman7a250572020-07-17 16:43:05 +0200277 }
Pengyu Lvf5131972022-11-08 18:17:00 +0800278#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
Steven Cooreman7a250572020-07-17 16:43:05 +0200279
Ronald Cronfce9df22020-12-08 18:06:03 +0100280 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100281 psa_key_location_t location =
282 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200283
284 switch( location )
285 {
286 case PSA_KEY_LOCATION_LOCAL_STORAGE:
287 /* Key is stored in the slot in export representation, so
288 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100289#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200290#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200291 status = mbedtls_test_transparent_signature_sign_hash( attributes,
Ronald Cron9f17aa42020-12-08 17:07:25 +0100292 key_buffer,
293 key_buffer_size,
Steven Cooremancd84cb42020-07-16 20:28:36 +0200294 alg,
295 hash,
296 hash_length,
297 signature,
298 signature_size,
299 signature_length );
300 /* Declared with fallback == true */
301 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200302 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200303#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100304#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200305 /* Fell through, meaning no accelerator supports this operation */
gabor-mezei-armf3c5c862021-05-05 14:18:36 +0200306 return( psa_sign_hash_builtin( attributes,
307 key_buffer,
308 key_buffer_size,
309 alg,
310 hash,
311 hash_length,
312 signature,
313 signature_size,
314 signature_length ) );
Ronald Cronfce9df22020-12-08 18:06:03 +0100315
Steven Cooremancd84cb42020-07-16 20:28:36 +0200316 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100317#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200318#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100319 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200320 return( mbedtls_test_opaque_signature_sign_hash( attributes,
321 key_buffer,
322 key_buffer_size,
323 alg,
324 hash,
325 hash_length,
326 signature,
327 signature_size,
328 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200329#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100330#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200331 default:
332 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100333 (void)status;
334 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200335 }
Steven Cooremancd84cb42020-07-16 20:28:36 +0200336}
337
Ronald Cron9f17aa42020-12-08 17:07:25 +0100338psa_status_t psa_driver_wrapper_verify_hash(
339 const psa_key_attributes_t *attributes,
340 const uint8_t *key_buffer, size_t key_buffer_size,
341 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
342 const uint8_t *signature, size_t signature_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200343{
Steven Cooreman55ae2172020-07-17 19:46:15 +0200344 /* Try dynamically-registered SE interface first */
345#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
346 const psa_drv_se_t *drv;
347 psa_drv_se_context_t *drv_context;
348
Ronald Cron9f17aa42020-12-08 17:07:25 +0100349 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200350 {
351 if( drv->asymmetric == NULL ||
352 drv->asymmetric->p_verify == NULL )
353 {
354 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200355 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200356 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100357 return( drv->asymmetric->p_verify(
358 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
359 alg, hash, hash_length,
360 signature, signature_length ) );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200361 }
Pengyu Lvf5131972022-11-08 18:17:00 +0800362#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200363
Ronald Cronfce9df22020-12-08 18:06:03 +0100364 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100365 psa_key_location_t location =
366 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200367
368 switch( location )
369 {
370 case PSA_KEY_LOCATION_LOCAL_STORAGE:
371 /* Key is stored in the slot in export representation, so
372 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100373#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200374#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200375 status = mbedtls_test_transparent_signature_verify_hash(
376 attributes,
377 key_buffer,
378 key_buffer_size,
379 alg,
380 hash,
381 hash_length,
382 signature,
383 signature_length );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200384 /* Declared with fallback == true */
385 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200386 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200387#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100388#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
389
gabor-mezei-armf3c5c862021-05-05 14:18:36 +0200390 return( psa_verify_hash_builtin( attributes,
391 key_buffer,
392 key_buffer_size,
393 alg,
394 hash,
395 hash_length,
396 signature,
397 signature_length ) );
Ronald Cronfce9df22020-12-08 18:06:03 +0100398
Steven Cooreman55ae2172020-07-17 19:46:15 +0200399 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100400#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200401#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100402 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200403 return( mbedtls_test_opaque_signature_verify_hash( attributes,
404 key_buffer,
405 key_buffer_size,
406 alg,
407 hash,
408 hash_length,
409 signature,
410 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200411#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100412#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200413 default:
414 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100415 (void)status;
416 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200417 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200418}
419
Steven Cooremanb938b0b2021-04-06 13:08:42 +0200420/** Get the key buffer size required to store the key material of a key
421 * associated with an opaque driver without storage.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200422 *
Ronald Cron31216282020-12-05 18:47:56 +0100423 * \param[in] attributes The key attributes.
424 * \param[out] key_buffer_size Minimum buffer size to contain the key material
Steven Cooreman56250fd2020-09-04 13:07:15 +0200425 *
426 * \retval #PSA_SUCCESS
Ronald Cron31216282020-12-05 18:47:56 +0100427 * The minimum size for a buffer to contain the key material has been
428 * returned successfully.
429 * \retval #PSA_ERROR_INVALID_ARGUMENT
430 * The size in bits of the key is not valid.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200431 * \retval #PSA_ERROR_NOT_SUPPORTED
Ronald Cron31216282020-12-05 18:47:56 +0100432 * The type and/or the size in bits of the key or the combination of
433 * the two is not supported.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200434 */
Ronald Cron9df74be2020-12-05 19:15:23 +0100435psa_status_t psa_driver_wrapper_get_key_buffer_size(
Ronald Cron31216282020-12-05 18:47:56 +0100436 const psa_key_attributes_t *attributes,
437 size_t *key_buffer_size )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200438{
John Durkop2c618352020-09-22 06:54:01 -0700439 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
440 psa_key_type_t key_type = attributes->core.type;
441 size_t key_bits = attributes->core.bits;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200442
Ronald Cron31216282020-12-05 18:47:56 +0100443 *key_buffer_size = 0;
John Durkop2c618352020-09-22 06:54:01 -0700444 switch( location )
445 {
John Durkop2c618352020-09-22 06:54:01 -0700446#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100447 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100448#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS)
449 /* Emulate property 'builtin_key_size' */
450 if( psa_key_id_is_builtin(
451 MBEDTLS_SVC_KEY_ID_GET_KEY_ID(
452 psa_get_key_id( attributes ) ) ) )
453 {
Steven Cooreman203bcbb2021-03-18 17:17:40 +0100454 *key_buffer_size = sizeof( psa_drv_slot_number_t );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100455 return( PSA_SUCCESS );
456 }
457#endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200458 *key_buffer_size = mbedtls_test_size_function( key_type, key_bits );
Ronald Cronb0737da2021-04-14 10:55:34 +0200459 return( ( *key_buffer_size != 0 ) ?
460 PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED );
John Durkop2c618352020-09-22 06:54:01 -0700461#endif /* PSA_CRYPTO_DRIVER_TEST */
462
463 default:
Ronald Cron9df74be2020-12-05 19:15:23 +0100464 (void)key_type;
465 (void)key_bits;
Steven Cooreman56250fd2020-09-04 13:07:15 +0200466 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200467 }
468}
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200469
Ronald Cron977c2472020-10-13 08:32:21 +0200470psa_status_t psa_driver_wrapper_generate_key(
471 const psa_key_attributes_t *attributes,
472 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200473{
Ronald Cron977c2472020-10-13 08:32:21 +0200474 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
475 psa_key_location_t location =
476 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
477
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200478 /* Try dynamically-registered SE interface first */
479#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
480 const psa_drv_se_t *drv;
481 psa_drv_se_context_t *drv_context;
482
Ronald Cron977c2472020-10-13 08:32:21 +0200483 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200484 {
485 size_t pubkey_length = 0; /* We don't support this feature yet */
486 if( drv->key_management == NULL ||
487 drv->key_management->p_generate == NULL )
488 {
489 /* Key is defined as being in SE, but we have no way to generate it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200490 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200491 }
492 return( drv->key_management->p_generate(
Ronald Cron977c2472020-10-13 08:32:21 +0200493 drv_context,
494 *( (psa_key_slot_number_t *)key_buffer ),
Ronald Cronea0f8a62020-11-25 17:52:23 +0100495 attributes, NULL, 0, &pubkey_length ) );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200496 }
497#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
498
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200499 switch( location )
500 {
501 case PSA_KEY_LOCATION_LOCAL_STORAGE:
Ronald Cron977c2472020-10-13 08:32:21 +0200502#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200503 /* Transparent drivers are limited to generating asymmetric keys */
Ronald Cron977c2472020-10-13 08:32:21 +0200504 if( PSA_KEY_TYPE_IS_ASYMMETRIC( attributes->core.type ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200505 {
Ronald Cron977c2472020-10-13 08:32:21 +0200506 /* Cycle through all known transparent accelerators */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200507#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200508 status = mbedtls_test_transparent_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200509 attributes, key_buffer, key_buffer_size,
510 key_buffer_length );
511 /* Declared with fallback == true */
512 if( status != PSA_ERROR_NOT_SUPPORTED )
513 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200514#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200515 }
516#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
517
518 /* Software fallback */
519 status = psa_generate_key_internal(
520 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200521 break;
Ronald Cron977c2472020-10-13 08:32:21 +0200522
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200523 /* Add cases for opaque driver here */
Ronald Cron977c2472020-10-13 08:32:21 +0200524#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200525#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100526 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200527 status = mbedtls_test_opaque_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200528 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200529 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200530#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200531#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
532
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200533 default:
534 /* Key is declared with a lifetime not known to us */
535 status = PSA_ERROR_INVALID_ARGUMENT;
536 break;
537 }
538
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200539 return( status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200540}
541
Ronald Cron83282872020-11-22 14:02:39 +0100542psa_status_t psa_driver_wrapper_import_key(
543 const psa_key_attributes_t *attributes,
544 const uint8_t *data,
545 size_t data_length,
546 uint8_t *key_buffer,
547 size_t key_buffer_size,
548 size_t *key_buffer_length,
549 size_t *bits )
Steven Cooreman04524762020-10-13 17:43:44 +0200550{
Steven Cooreman04524762020-10-13 17:43:44 +0200551 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cronbf33c932020-11-28 18:06:53 +0100552 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
553 psa_get_key_lifetime( attributes ) );
Steven Cooreman04524762020-10-13 17:43:44 +0200554
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100555 /* Try dynamically-registered SE interface first */
556#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
557 const psa_drv_se_t *drv;
558 psa_drv_se_context_t *drv_context;
559
560 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
561 {
562 if( drv->key_management == NULL ||
563 drv->key_management->p_import == NULL )
564 return( PSA_ERROR_NOT_SUPPORTED );
565
566 /* The driver should set the number of key bits, however in
567 * case it doesn't, we initialize bits to an invalid value. */
568 *bits = PSA_MAX_KEY_BITS + 1;
569 status = drv->key_management->p_import(
570 drv_context,
571 *( (psa_key_slot_number_t *)key_buffer ),
572 attributes, data, data_length, bits );
573
574 if( status != PSA_SUCCESS )
575 return( status );
576
577 if( (*bits) > PSA_MAX_KEY_BITS )
578 return( PSA_ERROR_NOT_SUPPORTED );
579
580 return( PSA_SUCCESS );
581 }
Pengyu Lvf5131972022-11-08 18:17:00 +0800582#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100583
Ronald Cronbf33c932020-11-28 18:06:53 +0100584 switch( location )
585 {
586 case PSA_KEY_LOCATION_LOCAL_STORAGE:
587 /* Key is stored in the slot in export representation, so
588 * cycle through all known transparent accelerators */
589#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
590#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200591 status = mbedtls_test_transparent_import_key(
592 attributes,
593 data, data_length,
594 key_buffer, key_buffer_size,
595 key_buffer_length, bits );
Ronald Cronbf33c932020-11-28 18:06:53 +0100596 /* Declared with fallback == true */
597 if( status != PSA_ERROR_NOT_SUPPORTED )
598 return( status );
599#endif /* PSA_CRYPTO_DRIVER_TEST */
600#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
601 /* Fell through, meaning no accelerator supports this operation */
602 return( psa_import_key_into_slot( attributes,
603 data, data_length,
604 key_buffer, key_buffer_size,
605 key_buffer_length, bits ) );
606
607 default:
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100608 /* Importing a key with external storage in not yet supported.
609 * Return in error indicating that the lifetime is not valid. */
Ronald Cronbf33c932020-11-28 18:06:53 +0100610 (void)status;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100611 return( PSA_ERROR_INVALID_ARGUMENT );
Ronald Cronbf33c932020-11-28 18:06:53 +0100612 }
613
Steven Cooreman04524762020-10-13 17:43:44 +0200614}
615
Ronald Cron67227982020-11-26 15:16:05 +0100616psa_status_t psa_driver_wrapper_export_key(
617 const psa_key_attributes_t *attributes,
618 const uint8_t *key_buffer, size_t key_buffer_size,
619 uint8_t *data, size_t data_size, size_t *data_length )
620
621{
622 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
623 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
624 psa_get_key_lifetime( attributes ) );
625
Ronald Cron152e3f82020-11-26 16:06:41 +0100626 /* Try dynamically-registered SE interface first */
627#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
628 const psa_drv_se_t *drv;
629 psa_drv_se_context_t *drv_context;
630
631 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
632 {
633 if( ( drv->key_management == NULL ) ||
634 ( drv->key_management->p_export == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100635 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100636 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100637 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100638
639 return( drv->key_management->p_export(
640 drv_context,
641 *( (psa_key_slot_number_t *)key_buffer ),
642 data, data_size, data_length ) );
643 }
Pengyu Lvf5131972022-11-08 18:17:00 +0800644#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
Ronald Cron152e3f82020-11-26 16:06:41 +0100645
Ronald Cron67227982020-11-26 15:16:05 +0100646 switch( location )
647 {
648 case PSA_KEY_LOCATION_LOCAL_STORAGE:
649 return( psa_export_key_internal( attributes,
650 key_buffer,
651 key_buffer_size,
652 data,
653 data_size,
654 data_length ) );
655
656 /* Add cases for opaque driver here */
657#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
658#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100659 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200660 return( mbedtls_test_opaque_export_key( attributes,
661 key_buffer,
662 key_buffer_size,
663 data,
664 data_size,
665 data_length ) );
Ronald Cron67227982020-11-26 15:16:05 +0100666#endif /* PSA_CRYPTO_DRIVER_TEST */
667#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
668 default:
669 /* Key is declared with a lifetime not known to us */
670 return( status );
671 }
672}
673
Ronald Cron84cc9942020-11-25 14:30:05 +0100674psa_status_t psa_driver_wrapper_export_public_key(
675 const psa_key_attributes_t *attributes,
676 const uint8_t *key_buffer, size_t key_buffer_size,
677 uint8_t *data, size_t data_size, size_t *data_length )
678
Steven Cooremanb9b84422020-10-14 14:39:20 +0200679{
Steven Cooremanb9b84422020-10-14 14:39:20 +0200680 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Cron84cc9942020-11-25 14:30:05 +0100681 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
682 psa_get_key_lifetime( attributes ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200683
Ronald Cron152e3f82020-11-26 16:06:41 +0100684 /* Try dynamically-registered SE interface first */
685#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
686 const psa_drv_se_t *drv;
687 psa_drv_se_context_t *drv_context;
688
689 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
690 {
691 if( ( drv->key_management == NULL ) ||
692 ( drv->key_management->p_export_public == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100693 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100694 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100695 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100696
697 return( drv->key_management->p_export_public(
698 drv_context,
699 *( (psa_key_slot_number_t *)key_buffer ),
700 data, data_size, data_length ) );
701 }
702#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
703
Steven Cooremanb9b84422020-10-14 14:39:20 +0200704 switch( location )
705 {
706 case PSA_KEY_LOCATION_LOCAL_STORAGE:
707 /* Key is stored in the slot in export representation, so
708 * cycle through all known transparent accelerators */
Ronald Cron67227982020-11-26 15:16:05 +0100709#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200710#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200711 status = mbedtls_test_transparent_export_public_key(
712 attributes,
713 key_buffer,
714 key_buffer_size,
715 data,
716 data_size,
717 data_length );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200718 /* Declared with fallback == true */
719 if( status != PSA_ERROR_NOT_SUPPORTED )
720 return( status );
721#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100722#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200723 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron67227982020-11-26 15:16:05 +0100724 return( psa_export_public_key_internal( attributes,
725 key_buffer,
726 key_buffer_size,
727 data,
728 data_size,
729 data_length ) );
730
Steven Cooremanb9b84422020-10-14 14:39:20 +0200731 /* Add cases for opaque driver here */
Ronald Cron67227982020-11-26 15:16:05 +0100732#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200733#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100734 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200735 return( mbedtls_test_opaque_export_public_key( attributes,
736 key_buffer,
737 key_buffer_size,
738 data,
739 data_size,
740 data_length ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200741#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100742#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200743 default:
744 /* Key is declared with a lifetime not known to us */
745 return( status );
746 }
Steven Cooremanb9b84422020-10-14 14:39:20 +0200747}
748
Steven Cooreman6801f082021-02-19 17:21:22 +0100749psa_status_t psa_driver_wrapper_get_builtin_key(
750 psa_drv_slot_number_t slot_number,
751 psa_key_attributes_t *attributes,
752 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
753{
754 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
755 switch( location )
756 {
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100757#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100758 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200759 return( mbedtls_test_opaque_get_builtin_key(
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100760 slot_number,
761 attributes,
762 key_buffer, key_buffer_size, key_buffer_length ) );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100763#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman6801f082021-02-19 17:21:22 +0100764 default:
765 (void) slot_number;
766 (void) key_buffer;
767 (void) key_buffer_size;
768 (void) key_buffer_length;
769 return( PSA_ERROR_DOES_NOT_EXIST );
770 }
771}
772
Steven Cooreman37941cb2020-07-28 18:49:51 +0200773/*
774 * Cipher functions
775 */
776psa_status_t psa_driver_wrapper_cipher_encrypt(
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100777 const psa_key_attributes_t *attributes,
778 const uint8_t *key_buffer,
779 size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200780 psa_algorithm_t alg,
Ronald Crona8331692021-07-09 09:19:35 +0200781 const uint8_t *iv,
782 size_t iv_length,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200783 const uint8_t *input,
784 size_t input_length,
785 uint8_t *output,
786 size_t output_size,
787 size_t *output_length )
788{
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100789 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
790 psa_key_location_t location =
791 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200792
793 switch( location )
794 {
795 case PSA_KEY_LOCATION_LOCAL_STORAGE:
796 /* Key is stored in the slot in export representation, so
797 * cycle through all known transparent accelerators */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100798#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200799#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100800 status = mbedtls_test_transparent_cipher_encrypt( attributes,
801 key_buffer,
802 key_buffer_size,
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200803 alg,
Ronald Crona8331692021-07-09 09:19:35 +0200804 iv,
805 iv_length,
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200806 input,
807 input_length,
808 output,
809 output_size,
810 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200811 /* Declared with fallback == true */
812 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200813 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200814#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100815#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
816
817#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
818 return( mbedtls_psa_cipher_encrypt( attributes,
819 key_buffer,
820 key_buffer_size,
821 alg,
Ronald Crona8331692021-07-09 09:19:35 +0200822 iv,
823 iv_length,
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100824 input,
825 input_length,
826 output,
827 output_size,
828 output_length ) );
gabor-mezei-armd52c8dc2021-06-25 15:43:32 +0200829#else
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200830 return( PSA_ERROR_NOT_SUPPORTED );
gabor-mezei-armd52c8dc2021-06-25 15:43:32 +0200831#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100832
Steven Cooreman37941cb2020-07-28 18:49:51 +0200833 /* Add cases for opaque driver here */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100834#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200835#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100836 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100837 return( mbedtls_test_opaque_cipher_encrypt( attributes,
838 key_buffer,
839 key_buffer_size,
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200840 alg,
Ronald Crona8331692021-07-09 09:19:35 +0200841 iv,
842 iv_length,
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200843 input,
844 input_length,
845 output,
846 output_size,
847 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200848#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100849#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
850
Steven Cooreman37941cb2020-07-28 18:49:51 +0200851 default:
852 /* Key is declared with a lifetime not known to us */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100853 (void)status;
854 (void)key_buffer;
855 (void)key_buffer_size;
856 (void)alg;
Gilles Peskine03efa0b2022-04-12 17:08:34 +0200857 (void)iv;
858 (void)iv_length;
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100859 (void)input;
860 (void)input_length;
861 (void)output;
862 (void)output_size;
863 (void)output_length;
864 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200865 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200866}
867
868psa_status_t psa_driver_wrapper_cipher_decrypt(
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100869 const psa_key_attributes_t *attributes,
870 const uint8_t *key_buffer,
871 size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200872 psa_algorithm_t alg,
873 const uint8_t *input,
874 size_t input_length,
875 uint8_t *output,
876 size_t output_size,
877 size_t *output_length )
878{
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100879 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
880 psa_key_location_t location =
881 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200882
883 switch( location )
884 {
885 case PSA_KEY_LOCATION_LOCAL_STORAGE:
886 /* Key is stored in the slot in export representation, so
887 * cycle through all known transparent accelerators */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100888#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200889#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100890 status = mbedtls_test_transparent_cipher_decrypt( attributes,
891 key_buffer,
892 key_buffer_size,
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200893 alg,
894 input,
895 input_length,
896 output,
897 output_size,
898 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200899 /* Declared with fallback == true */
900 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200901 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200902#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100903#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
904
905#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
906 return( mbedtls_psa_cipher_decrypt( attributes,
907 key_buffer,
908 key_buffer_size,
909 alg,
910 input,
911 input_length,
912 output,
913 output_size,
914 output_length ) );
gabor-mezei-armd52c8dc2021-06-25 15:43:32 +0200915#else
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200916 return( PSA_ERROR_NOT_SUPPORTED );
gabor-mezei-armd52c8dc2021-06-25 15:43:32 +0200917#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100918
Steven Cooreman37941cb2020-07-28 18:49:51 +0200919 /* Add cases for opaque driver here */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100920#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200921#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100922 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100923 return( mbedtls_test_opaque_cipher_decrypt( attributes,
924 key_buffer,
925 key_buffer_size,
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200926 alg,
927 input,
928 input_length,
929 output,
930 output_size,
931 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200932#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100933#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
934
Steven Cooreman37941cb2020-07-28 18:49:51 +0200935 default:
936 /* Key is declared with a lifetime not known to us */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100937 (void)status;
938 (void)key_buffer;
939 (void)key_buffer_size;
940 (void)alg;
941 (void)input;
942 (void)input_length;
943 (void)output;
944 (void)output_size;
945 (void)output_length;
946 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200947 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200948}
949
950psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100951 psa_cipher_operation_t *operation,
952 const psa_key_attributes_t *attributes,
953 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200954 psa_algorithm_t alg )
955{
Ronald Cron0b805592020-12-14 18:08:20 +0100956 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Crona4af55f2020-12-14 14:36:06 +0100957 psa_key_location_t location =
958 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200959
Steven Cooreman37941cb2020-07-28 18:49:51 +0200960 switch( location )
961 {
962 case PSA_KEY_LOCATION_LOCAL_STORAGE:
963 /* Key is stored in the slot in export representation, so
964 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100965#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200966#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200967 status = mbedtls_test_transparent_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100968 &operation->ctx.transparent_test_driver_ctx,
969 attributes,
970 key_buffer,
971 key_buffer_size,
972 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200973 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200974 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100975 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200976
Ronald Cron0b805592020-12-14 18:08:20 +0100977 if( status != PSA_ERROR_NOT_SUPPORTED )
978 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200979#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100980#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100981#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200982 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100983 status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100984 attributes,
985 key_buffer,
986 key_buffer_size,
987 alg );
988 if( status == PSA_SUCCESS )
Ronald Cron6e412a72021-03-10 09:58:47 +0100989 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Ronald Cron49fafa92021-03-10 08:34:23 +0100990
Ronald Cron7b4154d2021-03-19 14:49:41 +0100991 if( status != PSA_ERROR_NOT_SUPPORTED )
992 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100993#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
994 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron0b805592020-12-14 18:08:20 +0100995
Steven Cooreman37941cb2020-07-28 18:49:51 +0200996 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100997#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200998#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100999 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001000 status = mbedtls_test_opaque_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001001 &operation->ctx.opaque_test_driver_ctx,
1002 attributes,
1003 key_buffer, key_buffer_size,
1004 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001005
Steven Cooreman37941cb2020-07-28 18:49:51 +02001006 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001007 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001008
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001009 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001010#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001011#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +02001012 default:
1013 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +01001014 (void)status;
Ronald Cron485559e2021-04-28 14:29:00 +02001015 (void)operation;
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001016 (void)key_buffer;
1017 (void)key_buffer_size;
1018 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +02001019 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001020 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001021}
1022
1023psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +01001024 psa_cipher_operation_t *operation,
1025 const psa_key_attributes_t *attributes,
1026 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001027 psa_algorithm_t alg )
1028{
Steven Cooreman37941cb2020-07-28 18:49:51 +02001029 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Crona4af55f2020-12-14 14:36:06 +01001030 psa_key_location_t location =
1031 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001032
Steven Cooreman37941cb2020-07-28 18:49:51 +02001033 switch( location )
1034 {
1035 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1036 /* Key is stored in the slot in export representation, so
1037 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +01001038#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001039#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001040 status = mbedtls_test_transparent_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001041 &operation->ctx.transparent_test_driver_ctx,
1042 attributes,
1043 key_buffer,
1044 key_buffer_size,
1045 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001046 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +02001047 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001048 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +02001049
Ronald Cron0b805592020-12-14 18:08:20 +01001050 if( status != PSA_ERROR_NOT_SUPPORTED )
1051 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001052#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001053#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001054#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001055 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +01001056 status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001057 attributes,
1058 key_buffer,
1059 key_buffer_size,
1060 alg );
1061 if( status == PSA_SUCCESS )
1062 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1063
1064 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001065#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1066 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron49fafa92021-03-10 08:34:23 +01001067
Steven Cooreman37941cb2020-07-28 18:49:51 +02001068 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +01001069#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001070#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +01001071 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001072 status = mbedtls_test_opaque_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001073 &operation->ctx.opaque_test_driver_ctx,
1074 attributes,
1075 key_buffer, key_buffer_size,
1076 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001077
Steven Cooreman37941cb2020-07-28 18:49:51 +02001078 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001079 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001080
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001081 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001082#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001083#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +02001084 default:
1085 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +01001086 (void)status;
Ronald Cron485559e2021-04-28 14:29:00 +02001087 (void)operation;
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001088 (void)key_buffer;
1089 (void)key_buffer_size;
1090 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +02001091 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001092 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001093}
1094
Steven Cooreman37941cb2020-07-28 18:49:51 +02001095psa_status_t psa_driver_wrapper_cipher_set_iv(
Ronald Cron6056fe82020-12-15 13:58:07 +01001096 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001097 const uint8_t *iv,
1098 size_t iv_length )
1099{
Ronald Cron49fafa92021-03-10 08:34:23 +01001100 switch( operation->id )
1101 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001102#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001103 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001104 return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001105 iv,
1106 iv_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001107#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001108
1109#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001110#if defined(PSA_CRYPTO_DRIVER_TEST)
1111 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001112 return( mbedtls_test_transparent_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001113 &operation->ctx.transparent_test_driver_ctx,
1114 iv, iv_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001115
Steven Cooreman37941cb2020-07-28 18:49:51 +02001116 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001117 return( mbedtls_test_opaque_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001118 &operation->ctx.opaque_test_driver_ctx,
1119 iv, iv_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001120#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001121#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001122 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001123
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001124 (void)iv;
1125 (void)iv_length;
1126
Ronald Crondd24c9b2020-12-15 14:10:01 +01001127 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001128}
1129
1130psa_status_t psa_driver_wrapper_cipher_update(
Ronald Cron6056fe82020-12-15 13:58:07 +01001131 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001132 const uint8_t *input,
1133 size_t input_length,
1134 uint8_t *output,
1135 size_t output_size,
1136 size_t *output_length )
1137{
Ronald Cron49fafa92021-03-10 08:34:23 +01001138 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001139 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001140#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001141 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001142 return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001143 input,
1144 input_length,
1145 output,
1146 output_size,
1147 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001148#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1149
Ronald Cron49fafa92021-03-10 08:34:23 +01001150#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001151#if defined(PSA_CRYPTO_DRIVER_TEST)
1152 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001153 return( mbedtls_test_transparent_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001154 &operation->ctx.transparent_test_driver_ctx,
1155 input, input_length,
1156 output, output_size, output_length ) );
1157
Steven Cooreman37941cb2020-07-28 18:49:51 +02001158 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001159 return( mbedtls_test_opaque_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001160 &operation->ctx.opaque_test_driver_ctx,
1161 input, input_length,
1162 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001163#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001164#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001165 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001166
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001167 (void)input;
1168 (void)input_length;
1169 (void)output;
1170 (void)output_size;
1171 (void)output_length;
1172
Ronald Crondd24c9b2020-12-15 14:10:01 +01001173 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001174}
1175
1176psa_status_t psa_driver_wrapper_cipher_finish(
Ronald Cron6056fe82020-12-15 13:58:07 +01001177 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001178 uint8_t *output,
1179 size_t output_size,
1180 size_t *output_length )
1181{
Ronald Cron49fafa92021-03-10 08:34:23 +01001182 switch( operation->id )
1183 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001184#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001185 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001186 return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001187 output,
1188 output_size,
1189 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001190#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001191
1192#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001193#if defined(PSA_CRYPTO_DRIVER_TEST)
1194 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001195 return( mbedtls_test_transparent_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001196 &operation->ctx.transparent_test_driver_ctx,
1197 output, output_size, output_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001198
Steven Cooreman37941cb2020-07-28 18:49:51 +02001199 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001200 return( mbedtls_test_opaque_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001201 &operation->ctx.opaque_test_driver_ctx,
1202 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001203#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001204#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001205 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001206
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001207 (void)output;
1208 (void)output_size;
1209 (void)output_length;
1210
Ronald Crondd24c9b2020-12-15 14:10:01 +01001211 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001212}
1213
1214psa_status_t psa_driver_wrapper_cipher_abort(
Ronald Cron6056fe82020-12-15 13:58:07 +01001215 psa_cipher_operation_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001216{
Ronald Crondd24c9b2020-12-15 14:10:01 +01001217 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001218
Ronald Cron49fafa92021-03-10 08:34:23 +01001219 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001220 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001221#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001222 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001223 return( mbedtls_psa_cipher_abort( &operation->ctx.mbedtls_ctx ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001224#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron49fafa92021-03-10 08:34:23 +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 Cronc4bc12e2021-04-13 12:41:34 +02001229 status = mbedtls_test_transparent_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001230 &operation->ctx.transparent_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001231 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001232 &operation->ctx.transparent_test_driver_ctx,
1233 sizeof( operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001234 return( status );
Ronald Cron49fafa92021-03-10 08:34:23 +01001235
Steven Cooreman37941cb2020-07-28 18:49:51 +02001236 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001237 status = mbedtls_test_opaque_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001238 &operation->ctx.opaque_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001239 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001240 &operation->ctx.opaque_test_driver_ctx,
1241 sizeof( operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001242 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001243#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001244#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001245 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001246
Ronald Cron49fafa92021-03-10 08:34:23 +01001247 (void)status;
Ronald Crondd24c9b2020-12-15 14:10:01 +01001248 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001249}
1250
Steven Cooreman1e582352021-02-18 17:24:37 +01001251/*
1252 * Hashing functions
1253 */
1254psa_status_t psa_driver_wrapper_hash_compute(
1255 psa_algorithm_t alg,
1256 const uint8_t *input,
1257 size_t input_length,
1258 uint8_t *hash,
1259 size_t hash_size,
1260 size_t *hash_length)
1261{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001262 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001263
1264 /* Try accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001265#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001266 status = mbedtls_test_transparent_hash_compute(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001267 alg, input, input_length, hash, hash_size, hash_length );
Steven Cooremanf7638102021-03-04 15:14:36 +01001268 if( status != PSA_ERROR_NOT_SUPPORTED )
1269 return( status );
1270#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001271
1272 /* If software fallback is compiled in, try fallback */
1273#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1274 status = mbedtls_psa_hash_compute( alg, input, input_length,
1275 hash, hash_size, hash_length );
1276 if( status != PSA_ERROR_NOT_SUPPORTED )
1277 return( status );
1278#endif
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001279 (void) status;
1280 (void) alg;
1281 (void) input;
1282 (void) input_length;
1283 (void) hash;
1284 (void) hash_size;
1285 (void) hash_length;
Steven Cooreman1e582352021-02-18 17:24:37 +01001286
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001287 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman1e582352021-02-18 17:24:37 +01001288}
1289
1290psa_status_t psa_driver_wrapper_hash_setup(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001291 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001292 psa_algorithm_t alg )
1293{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001294 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001295
Steven Cooreman1e582352021-02-18 17:24:37 +01001296 /* Try setup on accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001297#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001298 status = mbedtls_test_transparent_hash_setup(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001299 &operation->ctx.test_driver_ctx, alg );
Steven Cooremanf7638102021-03-04 15:14:36 +01001300 if( status == PSA_SUCCESS )
1301 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1302
1303 if( status != PSA_ERROR_NOT_SUPPORTED )
1304 return( status );
1305#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001306
1307 /* If software fallback is compiled in, try fallback */
1308#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001309 status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
Steven Cooreman1e582352021-02-18 17:24:37 +01001310 if( status == PSA_SUCCESS )
Steven Cooreman1e582352021-02-18 17:24:37 +01001311 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Steven Cooreman1e582352021-02-18 17:24:37 +01001312
1313 if( status != PSA_ERROR_NOT_SUPPORTED )
1314 return( status );
1315#endif
1316 /* Nothing left to try if we fall through here */
1317 (void) status;
1318 (void) operation;
1319 (void) alg;
1320 return( PSA_ERROR_NOT_SUPPORTED );
1321}
1322
1323psa_status_t psa_driver_wrapper_hash_clone(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001324 const psa_hash_operation_t *source_operation,
1325 psa_hash_operation_t *target_operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001326{
Steven Cooreman1e582352021-02-18 17:24:37 +01001327 switch( source_operation->id )
1328 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001329#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1330 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1331 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1332 return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1333 &target_operation->ctx.mbedtls_ctx ) );
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:
1337 target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001338 return( mbedtls_test_transparent_hash_clone(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001339 &source_operation->ctx.test_driver_ctx,
1340 &target_operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001341#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001342 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001343 (void) target_operation;
1344 return( PSA_ERROR_BAD_STATE );
1345 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001346}
1347
1348psa_status_t psa_driver_wrapper_hash_update(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001349 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001350 const uint8_t *input,
1351 size_t input_length )
1352{
Steven Cooreman1e582352021-02-18 17:24:37 +01001353 switch( operation->id )
1354 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001355#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1356 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1357 return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
1358 input, input_length ) );
1359#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001360#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001361 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001362 return( mbedtls_test_transparent_hash_update(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001363 &operation->ctx.test_driver_ctx,
1364 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001365#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001366 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001367 (void) input;
1368 (void) input_length;
1369 return( PSA_ERROR_BAD_STATE );
1370 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001371}
1372
1373psa_status_t psa_driver_wrapper_hash_finish(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001374 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001375 uint8_t *hash,
1376 size_t hash_size,
1377 size_t *hash_length )
1378{
Steven Cooreman1e582352021-02-18 17:24:37 +01001379 switch( operation->id )
1380 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001381#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1382 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1383 return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1384 hash, hash_size, hash_length ) );
1385#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001386#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001387 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001388 return( mbedtls_test_transparent_hash_finish(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001389 &operation->ctx.test_driver_ctx,
1390 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001391#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001392 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001393 (void) hash;
1394 (void) hash_size;
1395 (void) hash_length;
1396 return( PSA_ERROR_BAD_STATE );
1397 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001398}
1399
1400psa_status_t psa_driver_wrapper_hash_abort(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001401 psa_hash_operation_t *operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001402{
Steven Cooreman1e582352021-02-18 17:24:37 +01001403 switch( operation->id )
1404 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001405#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1406 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1407 return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1408#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001409#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001410 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001411 return( mbedtls_test_transparent_hash_abort(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001412 &operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001413#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001414 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001415 return( PSA_ERROR_BAD_STATE );
1416 }
1417}
1418
Ronald Cronde822812021-03-17 16:08:20 +01001419psa_status_t psa_driver_wrapper_aead_encrypt(
1420 const psa_key_attributes_t *attributes,
1421 const uint8_t *key_buffer, size_t key_buffer_size,
1422 psa_algorithm_t alg,
1423 const uint8_t *nonce, size_t nonce_length,
1424 const uint8_t *additional_data, size_t additional_data_length,
1425 const uint8_t *plaintext, size_t plaintext_length,
1426 uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length )
1427{
1428 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1429 psa_key_location_t location =
1430 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1431
1432 switch( location )
1433 {
1434 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1435 /* Key is stored in the slot in export representation, so
1436 * cycle through all known transparent accelerators */
1437
1438#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1439#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001440 status = mbedtls_test_transparent_aead_encrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001441 attributes, key_buffer, key_buffer_size,
1442 alg,
1443 nonce, nonce_length,
1444 additional_data, additional_data_length,
1445 plaintext, plaintext_length,
1446 ciphertext, ciphertext_size, ciphertext_length );
1447 /* Declared with fallback == true */
1448 if( status != PSA_ERROR_NOT_SUPPORTED )
1449 return( status );
1450#endif /* PSA_CRYPTO_DRIVER_TEST */
1451#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1452
1453 /* Fell through, meaning no accelerator supports this operation */
1454 return( mbedtls_psa_aead_encrypt(
1455 attributes, key_buffer, key_buffer_size,
1456 alg,
1457 nonce, nonce_length,
1458 additional_data, additional_data_length,
1459 plaintext, plaintext_length,
1460 ciphertext, ciphertext_size, ciphertext_length ) );
1461
1462 /* Add cases for opaque driver here */
1463
1464 default:
1465 /* Key is declared with a lifetime not known to us */
1466 (void)status;
1467 return( PSA_ERROR_INVALID_ARGUMENT );
1468 }
1469}
1470
1471psa_status_t psa_driver_wrapper_aead_decrypt(
1472 const psa_key_attributes_t *attributes,
1473 const uint8_t *key_buffer, size_t key_buffer_size,
1474 psa_algorithm_t alg,
1475 const uint8_t *nonce, size_t nonce_length,
1476 const uint8_t *additional_data, size_t additional_data_length,
1477 const uint8_t *ciphertext, size_t ciphertext_length,
1478 uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length )
1479{
1480 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1481 psa_key_location_t location =
1482 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1483
1484 switch( location )
1485 {
1486 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1487 /* Key is stored in the slot in export representation, so
1488 * cycle through all known transparent accelerators */
1489
1490#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1491#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001492 status = mbedtls_test_transparent_aead_decrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001493 attributes, key_buffer, key_buffer_size,
1494 alg,
1495 nonce, nonce_length,
1496 additional_data, additional_data_length,
1497 ciphertext, ciphertext_length,
1498 plaintext, plaintext_size, plaintext_length );
1499 /* Declared with fallback == true */
1500 if( status != PSA_ERROR_NOT_SUPPORTED )
1501 return( status );
1502#endif /* PSA_CRYPTO_DRIVER_TEST */
1503#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1504
1505 /* Fell through, meaning no accelerator supports this operation */
1506 return( mbedtls_psa_aead_decrypt(
1507 attributes, key_buffer, key_buffer_size,
1508 alg,
1509 nonce, nonce_length,
1510 additional_data, additional_data_length,
1511 ciphertext, ciphertext_length,
1512 plaintext, plaintext_size, plaintext_length ) );
1513
1514 /* Add cases for opaque driver here */
1515
1516 default:
1517 /* Key is declared with a lifetime not known to us */
1518 (void)status;
1519 return( PSA_ERROR_INVALID_ARGUMENT );
1520 }
1521}
Steven Cooreman896d51e2021-03-19 15:24:23 +01001522
1523
1524/*
1525 * MAC functions
1526 */
1527psa_status_t psa_driver_wrapper_mac_compute(
1528 const psa_key_attributes_t *attributes,
1529 const uint8_t *key_buffer,
1530 size_t key_buffer_size,
1531 psa_algorithm_t alg,
1532 const uint8_t *input,
1533 size_t input_length,
1534 uint8_t *mac,
1535 size_t mac_size,
1536 size_t *mac_length )
1537{
1538 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1539 psa_key_location_t location =
1540 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1541
1542 switch( location )
1543 {
1544 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1545 /* Key is stored in the slot in export representation, so
1546 * cycle through all known transparent accelerators */
1547#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1548#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001549 status = mbedtls_test_transparent_mac_compute(
Steven Cooreman896d51e2021-03-19 15:24:23 +01001550 attributes, key_buffer, key_buffer_size, alg,
1551 input, input_length,
1552 mac, mac_size, mac_length );
1553 /* Declared with fallback == true */
1554 if( status != PSA_ERROR_NOT_SUPPORTED )
1555 return( status );
1556#endif /* PSA_CRYPTO_DRIVER_TEST */
1557#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1558#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1559 /* Fell through, meaning no accelerator supports this operation */
1560 status = mbedtls_psa_mac_compute(
1561 attributes, key_buffer, key_buffer_size, alg,
1562 input, input_length,
1563 mac, mac_size, mac_length );
1564 if( status != PSA_ERROR_NOT_SUPPORTED )
1565 return( status );
1566#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1567 return( PSA_ERROR_NOT_SUPPORTED );
1568
1569 /* Add cases for opaque driver here */
1570#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1571#if defined(PSA_CRYPTO_DRIVER_TEST)
1572 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001573 status = mbedtls_test_opaque_mac_compute(
Steven Cooreman896d51e2021-03-19 15:24:23 +01001574 attributes, key_buffer, key_buffer_size, alg,
1575 input, input_length,
1576 mac, mac_size, mac_length );
1577 return( status );
1578#endif /* PSA_CRYPTO_DRIVER_TEST */
1579#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1580 default:
1581 /* Key is declared with a lifetime not known to us */
1582 (void) key_buffer;
1583 (void) key_buffer_size;
1584 (void) alg;
1585 (void) input;
1586 (void) input_length;
1587 (void) mac;
1588 (void) mac_size;
1589 (void) mac_length;
1590 (void) status;
1591 return( PSA_ERROR_INVALID_ARGUMENT );
1592 }
1593}
1594
1595psa_status_t psa_driver_wrapper_mac_sign_setup(
1596 psa_mac_operation_t *operation,
1597 const psa_key_attributes_t *attributes,
1598 const uint8_t *key_buffer,
1599 size_t key_buffer_size,
1600 psa_algorithm_t alg )
1601{
1602 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1603 psa_key_location_t location =
1604 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1605
1606 switch( location )
1607 {
1608 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1609 /* Key is stored in the slot in export representation, so
1610 * cycle through all known transparent accelerators */
1611#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1612#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001613 status = mbedtls_test_transparent_mac_sign_setup(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001614 &operation->ctx.transparent_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001615 attributes,
1616 key_buffer, key_buffer_size,
1617 alg );
1618 /* Declared with fallback == true */
1619 if( status == PSA_SUCCESS )
1620 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1621
1622 if( status != PSA_ERROR_NOT_SUPPORTED )
1623 return( status );
1624#endif /* PSA_CRYPTO_DRIVER_TEST */
1625#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1626#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1627 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001628 status = mbedtls_psa_mac_sign_setup( &operation->ctx.mbedtls_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001629 attributes,
1630 key_buffer, key_buffer_size,
1631 alg );
1632 if( status == PSA_SUCCESS )
1633 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1634
1635 if( status != PSA_ERROR_NOT_SUPPORTED )
1636 return( status );
1637#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1638 return( PSA_ERROR_NOT_SUPPORTED );
1639
1640 /* Add cases for opaque driver here */
1641#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1642#if defined(PSA_CRYPTO_DRIVER_TEST)
1643 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001644 status = mbedtls_test_opaque_mac_sign_setup(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001645 &operation->ctx.opaque_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001646 attributes,
1647 key_buffer, key_buffer_size,
1648 alg );
1649
1650 if( status == PSA_SUCCESS )
1651 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1652
1653 return( status );
1654#endif /* PSA_CRYPTO_DRIVER_TEST */
1655#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1656 default:
1657 /* Key is declared with a lifetime not known to us */
1658 (void) status;
Ronald Cron485559e2021-04-28 14:29:00 +02001659 (void) operation;
Steven Cooreman896d51e2021-03-19 15:24:23 +01001660 (void) key_buffer;
1661 (void) key_buffer_size;
1662 (void) alg;
1663 return( PSA_ERROR_INVALID_ARGUMENT );
1664 }
1665}
1666
1667psa_status_t psa_driver_wrapper_mac_verify_setup(
1668 psa_mac_operation_t *operation,
1669 const psa_key_attributes_t *attributes,
1670 const uint8_t *key_buffer,
1671 size_t key_buffer_size,
1672 psa_algorithm_t alg )
1673{
1674 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1675 psa_key_location_t location =
1676 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1677
1678 switch( location )
1679 {
1680 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1681 /* Key is stored in the slot in export representation, so
1682 * cycle through all known transparent accelerators */
1683#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1684#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001685 status = mbedtls_test_transparent_mac_verify_setup(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001686 &operation->ctx.transparent_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001687 attributes,
1688 key_buffer, key_buffer_size,
1689 alg );
1690 /* Declared with fallback == true */
1691 if( status == PSA_SUCCESS )
1692 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1693
1694 if( status != PSA_ERROR_NOT_SUPPORTED )
1695 return( status );
1696#endif /* PSA_CRYPTO_DRIVER_TEST */
1697#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1698#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1699 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001700 status = mbedtls_psa_mac_verify_setup( &operation->ctx.mbedtls_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001701 attributes,
1702 key_buffer, key_buffer_size,
1703 alg );
1704 if( status == PSA_SUCCESS )
1705 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1706
1707 if( status != PSA_ERROR_NOT_SUPPORTED )
1708 return( status );
1709#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1710 return( PSA_ERROR_NOT_SUPPORTED );
1711
1712 /* Add cases for opaque driver here */
1713#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1714#if defined(PSA_CRYPTO_DRIVER_TEST)
1715 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001716 status = mbedtls_test_opaque_mac_verify_setup(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001717 &operation->ctx.opaque_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001718 attributes,
1719 key_buffer, key_buffer_size,
1720 alg );
1721
1722 if( status == PSA_SUCCESS )
1723 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1724
1725 return( status );
1726#endif /* PSA_CRYPTO_DRIVER_TEST */
1727#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1728 default:
1729 /* Key is declared with a lifetime not known to us */
1730 (void) status;
Ronald Cron485559e2021-04-28 14:29:00 +02001731 (void) operation;
Steven Cooreman896d51e2021-03-19 15:24:23 +01001732 (void) key_buffer;
1733 (void) key_buffer_size;
1734 (void) alg;
1735 return( PSA_ERROR_INVALID_ARGUMENT );
1736 }
1737}
1738
1739psa_status_t psa_driver_wrapper_mac_update(
1740 psa_mac_operation_t *operation,
1741 const uint8_t *input,
1742 size_t input_length )
1743{
1744 switch( operation->id )
1745 {
1746#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1747 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001748 return( mbedtls_psa_mac_update( &operation->ctx.mbedtls_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001749 input, input_length ) );
1750#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1751
1752#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1753#if defined(PSA_CRYPTO_DRIVER_TEST)
1754 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001755 return( mbedtls_test_transparent_mac_update(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001756 &operation->ctx.transparent_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001757 input, input_length ) );
1758
1759 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001760 return( mbedtls_test_opaque_mac_update(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001761 &operation->ctx.opaque_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001762 input, input_length ) );
1763#endif /* PSA_CRYPTO_DRIVER_TEST */
1764#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1765 default:
1766 (void) input;
1767 (void) input_length;
1768 return( PSA_ERROR_INVALID_ARGUMENT );
1769 }
1770}
1771
1772psa_status_t psa_driver_wrapper_mac_sign_finish(
1773 psa_mac_operation_t *operation,
1774 uint8_t *mac,
1775 size_t mac_size,
1776 size_t *mac_length )
1777{
1778 switch( operation->id )
1779 {
1780#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1781 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001782 return( mbedtls_psa_mac_sign_finish( &operation->ctx.mbedtls_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001783 mac, mac_size, mac_length ) );
1784#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1785
1786#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1787#if defined(PSA_CRYPTO_DRIVER_TEST)
1788 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001789 return( mbedtls_test_transparent_mac_sign_finish(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001790 &operation->ctx.transparent_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001791 mac, mac_size, mac_length ) );
1792
1793 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001794 return( mbedtls_test_opaque_mac_sign_finish(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001795 &operation->ctx.opaque_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001796 mac, mac_size, mac_length ) );
1797#endif /* PSA_CRYPTO_DRIVER_TEST */
1798#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1799 default:
1800 (void) mac;
1801 (void) mac_size;
1802 (void) mac_length;
1803 return( PSA_ERROR_INVALID_ARGUMENT );
1804 }
1805}
1806
1807psa_status_t psa_driver_wrapper_mac_verify_finish(
1808 psa_mac_operation_t *operation,
1809 const uint8_t *mac,
1810 size_t mac_length )
1811{
1812 switch( operation->id )
1813 {
1814#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1815 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001816 return( mbedtls_psa_mac_verify_finish( &operation->ctx.mbedtls_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001817 mac, mac_length ) );
1818#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1819
1820#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1821#if defined(PSA_CRYPTO_DRIVER_TEST)
1822 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001823 return( mbedtls_test_transparent_mac_verify_finish(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001824 &operation->ctx.transparent_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001825 mac, mac_length ) );
1826
1827 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001828 return( mbedtls_test_opaque_mac_verify_finish(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001829 &operation->ctx.opaque_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001830 mac, mac_length ) );
1831#endif /* PSA_CRYPTO_DRIVER_TEST */
1832#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1833 default:
1834 (void) mac;
1835 (void) mac_length;
1836 return( PSA_ERROR_INVALID_ARGUMENT );
1837 }
1838}
1839
1840psa_status_t psa_driver_wrapper_mac_abort(
1841 psa_mac_operation_t *operation )
1842{
Steven Cooreman896d51e2021-03-19 15:24:23 +01001843 switch( operation->id )
1844 {
1845#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1846 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman07897832021-03-19 18:28:56 +01001847 return( mbedtls_psa_mac_abort( &operation->ctx.mbedtls_ctx ) );
Steven Cooreman896d51e2021-03-19 15:24:23 +01001848#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1849
1850#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1851#if defined(PSA_CRYPTO_DRIVER_TEST)
1852 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001853 return( mbedtls_test_transparent_mac_abort(
Steven Cooreman07897832021-03-19 18:28:56 +01001854 &operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman896d51e2021-03-19 15:24:23 +01001855 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001856 return( mbedtls_test_opaque_mac_abort(
Steven Cooreman07897832021-03-19 18:28:56 +01001857 &operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman896d51e2021-03-19 15:24:23 +01001858#endif /* PSA_CRYPTO_DRIVER_TEST */
1859#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1860 default:
Steven Cooreman07897832021-03-19 18:28:56 +01001861 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman896d51e2021-03-19 15:24:23 +01001862 }
Steven Cooreman896d51e2021-03-19 15:24:23 +01001863}
Gilles Peskinead0e0122021-04-24 13:19:45 +02001864
1865#endif /* MBEDTLS_PSA_CRYPTO_C */