blob: 16166fc5a5aee8c7a20a9684c0e3dbb6be00abfe [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 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200278#endif /* 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 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200362#endif /* 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 }
582#endif /* PSA_CRYPTO_SE_C */
583
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 }
644#endif /* PSA_CRYPTO_SE_C */
645
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;
857 (void)input;
858 (void)input_length;
859 (void)output;
860 (void)output_size;
861 (void)output_length;
862 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200863 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200864}
865
866psa_status_t psa_driver_wrapper_cipher_decrypt(
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100867 const psa_key_attributes_t *attributes,
868 const uint8_t *key_buffer,
869 size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200870 psa_algorithm_t alg,
871 const uint8_t *input,
872 size_t input_length,
873 uint8_t *output,
874 size_t output_size,
875 size_t *output_length )
876{
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100877 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
878 psa_key_location_t location =
879 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200880
881 switch( location )
882 {
883 case PSA_KEY_LOCATION_LOCAL_STORAGE:
884 /* Key is stored in the slot in export representation, so
885 * cycle through all known transparent accelerators */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100886#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200887#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100888 status = mbedtls_test_transparent_cipher_decrypt( attributes,
889 key_buffer,
890 key_buffer_size,
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200891 alg,
892 input,
893 input_length,
894 output,
895 output_size,
896 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200897 /* Declared with fallback == true */
898 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200899 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200900#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100901#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
902
903#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
904 return( mbedtls_psa_cipher_decrypt( attributes,
905 key_buffer,
906 key_buffer_size,
907 alg,
908 input,
909 input_length,
910 output,
911 output_size,
912 output_length ) );
gabor-mezei-armd52c8dc2021-06-25 15:43:32 +0200913#else
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200914 return( PSA_ERROR_NOT_SUPPORTED );
gabor-mezei-armd52c8dc2021-06-25 15:43:32 +0200915#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100916
Steven Cooreman37941cb2020-07-28 18:49:51 +0200917 /* Add cases for opaque driver here */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100918#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200919#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100920 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100921 return( mbedtls_test_opaque_cipher_decrypt( attributes,
922 key_buffer,
923 key_buffer_size,
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200924 alg,
925 input,
926 input_length,
927 output,
928 output_size,
929 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200930#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100931#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
932
Steven Cooreman37941cb2020-07-28 18:49:51 +0200933 default:
934 /* Key is declared with a lifetime not known to us */
gabor-mezei-armfa990b52021-03-25 11:17:10 +0100935 (void)status;
936 (void)key_buffer;
937 (void)key_buffer_size;
938 (void)alg;
939 (void)input;
940 (void)input_length;
941 (void)output;
942 (void)output_size;
943 (void)output_length;
944 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200945 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200946}
947
948psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100949 psa_cipher_operation_t *operation,
950 const psa_key_attributes_t *attributes,
951 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200952 psa_algorithm_t alg )
953{
Ronald Cron0b805592020-12-14 18:08:20 +0100954 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Crona4af55f2020-12-14 14:36:06 +0100955 psa_key_location_t location =
956 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200957
Steven Cooreman37941cb2020-07-28 18:49:51 +0200958 switch( location )
959 {
960 case PSA_KEY_LOCATION_LOCAL_STORAGE:
961 /* Key is stored in the slot in export representation, so
962 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100963#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200964#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200965 status = mbedtls_test_transparent_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100966 &operation->ctx.transparent_test_driver_ctx,
967 attributes,
968 key_buffer,
969 key_buffer_size,
970 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200971 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200972 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100973 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200974
Ronald Cron0b805592020-12-14 18:08:20 +0100975 if( status != PSA_ERROR_NOT_SUPPORTED )
976 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200977#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100978#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100979#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200980 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100981 status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100982 attributes,
983 key_buffer,
984 key_buffer_size,
985 alg );
986 if( status == PSA_SUCCESS )
Ronald Cron6e412a72021-03-10 09:58:47 +0100987 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Ronald Cron49fafa92021-03-10 08:34:23 +0100988
Ronald Cron7b4154d2021-03-19 14:49:41 +0100989 if( status != PSA_ERROR_NOT_SUPPORTED )
990 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100991#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
992 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron0b805592020-12-14 18:08:20 +0100993
Steven Cooreman37941cb2020-07-28 18:49:51 +0200994 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100995#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200996#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100997 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200998 status = mbedtls_test_opaque_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100999 &operation->ctx.opaque_test_driver_ctx,
1000 attributes,
1001 key_buffer, key_buffer_size,
1002 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001003
Steven Cooreman37941cb2020-07-28 18:49:51 +02001004 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001005 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001006
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001007 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001008#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001009#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +02001010 default:
1011 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +01001012 (void)status;
Ronald Cron485559e2021-04-28 14:29:00 +02001013 (void)operation;
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001014 (void)key_buffer;
1015 (void)key_buffer_size;
1016 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +02001017 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001018 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001019}
1020
1021psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +01001022 psa_cipher_operation_t *operation,
1023 const psa_key_attributes_t *attributes,
1024 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001025 psa_algorithm_t alg )
1026{
Steven Cooreman37941cb2020-07-28 18:49:51 +02001027 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Crona4af55f2020-12-14 14:36:06 +01001028 psa_key_location_t location =
1029 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001030
Steven Cooreman37941cb2020-07-28 18:49:51 +02001031 switch( location )
1032 {
1033 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1034 /* Key is stored in the slot in export representation, so
1035 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +01001036#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001037#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001038 status = mbedtls_test_transparent_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001039 &operation->ctx.transparent_test_driver_ctx,
1040 attributes,
1041 key_buffer,
1042 key_buffer_size,
1043 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001044 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +02001045 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001046 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +02001047
Ronald Cron0b805592020-12-14 18:08:20 +01001048 if( status != PSA_ERROR_NOT_SUPPORTED )
1049 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001050#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001051#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001052#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001053 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +01001054 status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001055 attributes,
1056 key_buffer,
1057 key_buffer_size,
1058 alg );
1059 if( status == PSA_SUCCESS )
1060 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1061
1062 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001063#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1064 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron49fafa92021-03-10 08:34:23 +01001065
Steven Cooreman37941cb2020-07-28 18:49:51 +02001066 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +01001067#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001068#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +01001069 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001070 status = mbedtls_test_opaque_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001071 &operation->ctx.opaque_test_driver_ctx,
1072 attributes,
1073 key_buffer, key_buffer_size,
1074 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001075
Steven Cooreman37941cb2020-07-28 18:49:51 +02001076 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001077 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001078
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001079 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001080#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001081#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +02001082 default:
1083 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +01001084 (void)status;
Ronald Cron485559e2021-04-28 14:29:00 +02001085 (void)operation;
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001086 (void)key_buffer;
1087 (void)key_buffer_size;
1088 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +02001089 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001090 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001091}
1092
Steven Cooreman37941cb2020-07-28 18:49:51 +02001093psa_status_t psa_driver_wrapper_cipher_set_iv(
Ronald Cron6056fe82020-12-15 13:58:07 +01001094 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001095 const uint8_t *iv,
1096 size_t iv_length )
1097{
Ronald Cron49fafa92021-03-10 08:34:23 +01001098 switch( operation->id )
1099 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001100#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001101 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001102 return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001103 iv,
1104 iv_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001105#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001106
1107#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001108#if defined(PSA_CRYPTO_DRIVER_TEST)
1109 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001110 return( mbedtls_test_transparent_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001111 &operation->ctx.transparent_test_driver_ctx,
1112 iv, iv_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001113
Steven Cooreman37941cb2020-07-28 18:49:51 +02001114 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001115 return( mbedtls_test_opaque_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001116 &operation->ctx.opaque_test_driver_ctx,
1117 iv, iv_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001118#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001119#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001120 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001121
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001122 (void)iv;
1123 (void)iv_length;
1124
Ronald Crondd24c9b2020-12-15 14:10:01 +01001125 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001126}
1127
1128psa_status_t psa_driver_wrapper_cipher_update(
Ronald Cron6056fe82020-12-15 13:58:07 +01001129 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001130 const uint8_t *input,
1131 size_t input_length,
1132 uint8_t *output,
1133 size_t output_size,
1134 size_t *output_length )
1135{
Ronald Cron49fafa92021-03-10 08:34:23 +01001136 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001137 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001138#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001139 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001140 return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001141 input,
1142 input_length,
1143 output,
1144 output_size,
1145 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001146#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1147
Ronald Cron49fafa92021-03-10 08:34:23 +01001148#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001149#if defined(PSA_CRYPTO_DRIVER_TEST)
1150 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001151 return( mbedtls_test_transparent_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001152 &operation->ctx.transparent_test_driver_ctx,
1153 input, input_length,
1154 output, output_size, output_length ) );
1155
Steven Cooreman37941cb2020-07-28 18:49:51 +02001156 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001157 return( mbedtls_test_opaque_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001158 &operation->ctx.opaque_test_driver_ctx,
1159 input, input_length,
1160 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001161#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001162#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001163 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001164
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001165 (void)input;
1166 (void)input_length;
1167 (void)output;
1168 (void)output_size;
1169 (void)output_length;
1170
Ronald Crondd24c9b2020-12-15 14:10:01 +01001171 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001172}
1173
1174psa_status_t psa_driver_wrapper_cipher_finish(
Ronald Cron6056fe82020-12-15 13:58:07 +01001175 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001176 uint8_t *output,
1177 size_t output_size,
1178 size_t *output_length )
1179{
Ronald Cron49fafa92021-03-10 08:34:23 +01001180 switch( operation->id )
1181 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001182#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001183 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001184 return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001185 output,
1186 output_size,
1187 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001188#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001189
1190#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001191#if defined(PSA_CRYPTO_DRIVER_TEST)
1192 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001193 return( mbedtls_test_transparent_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001194 &operation->ctx.transparent_test_driver_ctx,
1195 output, output_size, output_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001196
Steven Cooreman37941cb2020-07-28 18:49:51 +02001197 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001198 return( mbedtls_test_opaque_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001199 &operation->ctx.opaque_test_driver_ctx,
1200 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001201#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001202#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001203 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001204
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001205 (void)output;
1206 (void)output_size;
1207 (void)output_length;
1208
Ronald Crondd24c9b2020-12-15 14:10:01 +01001209 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001210}
1211
1212psa_status_t psa_driver_wrapper_cipher_abort(
Ronald Cron6056fe82020-12-15 13:58:07 +01001213 psa_cipher_operation_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001214{
Ronald Crondd24c9b2020-12-15 14:10:01 +01001215 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001216
Ronald Cron49fafa92021-03-10 08:34:23 +01001217 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001218 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001219#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001220 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001221 return( mbedtls_psa_cipher_abort( &operation->ctx.mbedtls_ctx ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001222#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron49fafa92021-03-10 08:34:23 +01001223
1224#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001225#if defined(PSA_CRYPTO_DRIVER_TEST)
1226 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001227 status = mbedtls_test_transparent_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001228 &operation->ctx.transparent_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001229 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001230 &operation->ctx.transparent_test_driver_ctx,
1231 sizeof( operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001232 return( status );
Ronald Cron49fafa92021-03-10 08:34:23 +01001233
Steven Cooreman37941cb2020-07-28 18:49:51 +02001234 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001235 status = mbedtls_test_opaque_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001236 &operation->ctx.opaque_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001237 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001238 &operation->ctx.opaque_test_driver_ctx,
1239 sizeof( operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001240 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001241#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001242#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001243 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001244
Ronald Cron49fafa92021-03-10 08:34:23 +01001245 (void)status;
Ronald Crondd24c9b2020-12-15 14:10:01 +01001246 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001247}
1248
Steven Cooreman1e582352021-02-18 17:24:37 +01001249/*
1250 * Hashing functions
1251 */
1252psa_status_t psa_driver_wrapper_hash_compute(
1253 psa_algorithm_t alg,
1254 const uint8_t *input,
1255 size_t input_length,
1256 uint8_t *hash,
1257 size_t hash_size,
1258 size_t *hash_length)
1259{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001260 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001261
1262 /* Try accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001263#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001264 status = mbedtls_test_transparent_hash_compute(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001265 alg, input, input_length, hash, hash_size, hash_length );
Steven Cooremanf7638102021-03-04 15:14:36 +01001266 if( status != PSA_ERROR_NOT_SUPPORTED )
1267 return( status );
1268#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001269
1270 /* If software fallback is compiled in, try fallback */
1271#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1272 status = mbedtls_psa_hash_compute( alg, input, input_length,
1273 hash, hash_size, hash_length );
1274 if( status != PSA_ERROR_NOT_SUPPORTED )
1275 return( status );
1276#endif
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001277 (void) status;
1278 (void) alg;
1279 (void) input;
1280 (void) input_length;
1281 (void) hash;
1282 (void) hash_size;
1283 (void) hash_length;
Steven Cooreman1e582352021-02-18 17:24:37 +01001284
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001285 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman1e582352021-02-18 17:24:37 +01001286}
1287
1288psa_status_t psa_driver_wrapper_hash_setup(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001289 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001290 psa_algorithm_t alg )
1291{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001292 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001293
Steven Cooreman1e582352021-02-18 17:24:37 +01001294 /* Try setup on accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001295#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001296 status = mbedtls_test_transparent_hash_setup(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001297 &operation->ctx.test_driver_ctx, alg );
Steven Cooremanf7638102021-03-04 15:14:36 +01001298 if( status == PSA_SUCCESS )
1299 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1300
1301 if( status != PSA_ERROR_NOT_SUPPORTED )
1302 return( status );
1303#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001304
1305 /* If software fallback is compiled in, try fallback */
1306#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001307 status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
Steven Cooreman1e582352021-02-18 17:24:37 +01001308 if( status == PSA_SUCCESS )
Steven Cooreman1e582352021-02-18 17:24:37 +01001309 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Steven Cooreman1e582352021-02-18 17:24:37 +01001310
1311 if( status != PSA_ERROR_NOT_SUPPORTED )
1312 return( status );
1313#endif
1314 /* Nothing left to try if we fall through here */
1315 (void) status;
1316 (void) operation;
1317 (void) alg;
1318 return( PSA_ERROR_NOT_SUPPORTED );
1319}
1320
1321psa_status_t psa_driver_wrapper_hash_clone(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001322 const psa_hash_operation_t *source_operation,
1323 psa_hash_operation_t *target_operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001324{
Steven Cooreman1e582352021-02-18 17:24:37 +01001325 switch( source_operation->id )
1326 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001327#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1328 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1329 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1330 return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1331 &target_operation->ctx.mbedtls_ctx ) );
1332#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001333#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001334 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1335 target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001336 return( mbedtls_test_transparent_hash_clone(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001337 &source_operation->ctx.test_driver_ctx,
1338 &target_operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001339#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001340 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001341 (void) target_operation;
1342 return( PSA_ERROR_BAD_STATE );
1343 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001344}
1345
1346psa_status_t psa_driver_wrapper_hash_update(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001347 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001348 const uint8_t *input,
1349 size_t input_length )
1350{
Steven Cooreman1e582352021-02-18 17:24:37 +01001351 switch( operation->id )
1352 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001353#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1354 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1355 return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
1356 input, input_length ) );
1357#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001358#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001359 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001360 return( mbedtls_test_transparent_hash_update(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001361 &operation->ctx.test_driver_ctx,
1362 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001363#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001364 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001365 (void) input;
1366 (void) input_length;
1367 return( PSA_ERROR_BAD_STATE );
1368 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001369}
1370
1371psa_status_t psa_driver_wrapper_hash_finish(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001372 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001373 uint8_t *hash,
1374 size_t hash_size,
1375 size_t *hash_length )
1376{
Steven Cooreman1e582352021-02-18 17:24:37 +01001377 switch( operation->id )
1378 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001379#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1380 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1381 return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1382 hash, hash_size, hash_length ) );
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_finish(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001387 &operation->ctx.test_driver_ctx,
1388 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001389#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001390 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001391 (void) hash;
1392 (void) hash_size;
1393 (void) hash_length;
1394 return( PSA_ERROR_BAD_STATE );
1395 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001396}
1397
1398psa_status_t psa_driver_wrapper_hash_abort(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001399 psa_hash_operation_t *operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001400{
Steven Cooreman1e582352021-02-18 17:24:37 +01001401 switch( operation->id )
1402 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001403#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1404 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1405 return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1406#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001407#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001408 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001409 return( mbedtls_test_transparent_hash_abort(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001410 &operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001411#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001412 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001413 return( PSA_ERROR_BAD_STATE );
1414 }
1415}
1416
Ronald Cronde822812021-03-17 16:08:20 +01001417psa_status_t psa_driver_wrapper_aead_encrypt(
1418 const psa_key_attributes_t *attributes,
1419 const uint8_t *key_buffer, size_t key_buffer_size,
1420 psa_algorithm_t alg,
1421 const uint8_t *nonce, size_t nonce_length,
1422 const uint8_t *additional_data, size_t additional_data_length,
1423 const uint8_t *plaintext, size_t plaintext_length,
1424 uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length )
1425{
1426 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1427 psa_key_location_t location =
1428 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1429
1430 switch( location )
1431 {
1432 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1433 /* Key is stored in the slot in export representation, so
1434 * cycle through all known transparent accelerators */
1435
1436#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1437#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001438 status = mbedtls_test_transparent_aead_encrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001439 attributes, key_buffer, key_buffer_size,
1440 alg,
1441 nonce, nonce_length,
1442 additional_data, additional_data_length,
1443 plaintext, plaintext_length,
1444 ciphertext, ciphertext_size, ciphertext_length );
1445 /* Declared with fallback == true */
1446 if( status != PSA_ERROR_NOT_SUPPORTED )
1447 return( status );
1448#endif /* PSA_CRYPTO_DRIVER_TEST */
1449#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1450
1451 /* Fell through, meaning no accelerator supports this operation */
1452 return( mbedtls_psa_aead_encrypt(
1453 attributes, key_buffer, key_buffer_size,
1454 alg,
1455 nonce, nonce_length,
1456 additional_data, additional_data_length,
1457 plaintext, plaintext_length,
1458 ciphertext, ciphertext_size, ciphertext_length ) );
1459
1460 /* Add cases for opaque driver here */
1461
1462 default:
1463 /* Key is declared with a lifetime not known to us */
1464 (void)status;
1465 return( PSA_ERROR_INVALID_ARGUMENT );
1466 }
1467}
1468
1469psa_status_t psa_driver_wrapper_aead_decrypt(
1470 const psa_key_attributes_t *attributes,
1471 const uint8_t *key_buffer, size_t key_buffer_size,
1472 psa_algorithm_t alg,
1473 const uint8_t *nonce, size_t nonce_length,
1474 const uint8_t *additional_data, size_t additional_data_length,
1475 const uint8_t *ciphertext, size_t ciphertext_length,
1476 uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length )
1477{
1478 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1479 psa_key_location_t location =
1480 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1481
1482 switch( location )
1483 {
1484 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1485 /* Key is stored in the slot in export representation, so
1486 * cycle through all known transparent accelerators */
1487
1488#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1489#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001490 status = mbedtls_test_transparent_aead_decrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001491 attributes, key_buffer, key_buffer_size,
1492 alg,
1493 nonce, nonce_length,
1494 additional_data, additional_data_length,
1495 ciphertext, ciphertext_length,
1496 plaintext, plaintext_size, plaintext_length );
1497 /* Declared with fallback == true */
1498 if( status != PSA_ERROR_NOT_SUPPORTED )
1499 return( status );
1500#endif /* PSA_CRYPTO_DRIVER_TEST */
1501#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1502
1503 /* Fell through, meaning no accelerator supports this operation */
1504 return( mbedtls_psa_aead_decrypt(
1505 attributes, key_buffer, key_buffer_size,
1506 alg,
1507 nonce, nonce_length,
1508 additional_data, additional_data_length,
1509 ciphertext, ciphertext_length,
1510 plaintext, plaintext_size, plaintext_length ) );
1511
1512 /* Add cases for opaque driver here */
1513
1514 default:
1515 /* Key is declared with a lifetime not known to us */
1516 (void)status;
1517 return( PSA_ERROR_INVALID_ARGUMENT );
1518 }
1519}
Steven Cooreman896d51e2021-03-19 15:24:23 +01001520
1521
1522/*
1523 * MAC functions
1524 */
1525psa_status_t psa_driver_wrapper_mac_compute(
1526 const psa_key_attributes_t *attributes,
1527 const uint8_t *key_buffer,
1528 size_t key_buffer_size,
1529 psa_algorithm_t alg,
1530 const uint8_t *input,
1531 size_t input_length,
1532 uint8_t *mac,
1533 size_t mac_size,
1534 size_t *mac_length )
1535{
1536 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1537 psa_key_location_t location =
1538 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1539
1540 switch( location )
1541 {
1542 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1543 /* Key is stored in the slot in export representation, so
1544 * cycle through all known transparent accelerators */
1545#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1546#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001547 status = mbedtls_test_transparent_mac_compute(
Steven Cooreman896d51e2021-03-19 15:24:23 +01001548 attributes, key_buffer, key_buffer_size, alg,
1549 input, input_length,
1550 mac, mac_size, mac_length );
1551 /* Declared with fallback == true */
1552 if( status != PSA_ERROR_NOT_SUPPORTED )
1553 return( status );
1554#endif /* PSA_CRYPTO_DRIVER_TEST */
1555#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1556#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1557 /* Fell through, meaning no accelerator supports this operation */
1558 status = mbedtls_psa_mac_compute(
1559 attributes, key_buffer, key_buffer_size, alg,
1560 input, input_length,
1561 mac, mac_size, mac_length );
1562 if( status != PSA_ERROR_NOT_SUPPORTED )
1563 return( status );
1564#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1565 return( PSA_ERROR_NOT_SUPPORTED );
1566
1567 /* Add cases for opaque driver here */
1568#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1569#if defined(PSA_CRYPTO_DRIVER_TEST)
1570 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001571 status = mbedtls_test_opaque_mac_compute(
Steven Cooreman896d51e2021-03-19 15:24:23 +01001572 attributes, key_buffer, key_buffer_size, alg,
1573 input, input_length,
1574 mac, mac_size, mac_length );
1575 return( status );
1576#endif /* PSA_CRYPTO_DRIVER_TEST */
1577#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1578 default:
1579 /* Key is declared with a lifetime not known to us */
1580 (void) key_buffer;
1581 (void) key_buffer_size;
1582 (void) alg;
1583 (void) input;
1584 (void) input_length;
1585 (void) mac;
1586 (void) mac_size;
1587 (void) mac_length;
1588 (void) status;
1589 return( PSA_ERROR_INVALID_ARGUMENT );
1590 }
1591}
1592
1593psa_status_t psa_driver_wrapper_mac_sign_setup(
1594 psa_mac_operation_t *operation,
1595 const psa_key_attributes_t *attributes,
1596 const uint8_t *key_buffer,
1597 size_t key_buffer_size,
1598 psa_algorithm_t alg )
1599{
1600 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1601 psa_key_location_t location =
1602 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1603
1604 switch( location )
1605 {
1606 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1607 /* Key is stored in the slot in export representation, so
1608 * cycle through all known transparent accelerators */
1609#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1610#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001611 status = mbedtls_test_transparent_mac_sign_setup(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001612 &operation->ctx.transparent_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001613 attributes,
1614 key_buffer, key_buffer_size,
1615 alg );
1616 /* Declared with fallback == true */
1617 if( status == PSA_SUCCESS )
1618 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1619
1620 if( status != PSA_ERROR_NOT_SUPPORTED )
1621 return( status );
1622#endif /* PSA_CRYPTO_DRIVER_TEST */
1623#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1624#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1625 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001626 status = mbedtls_psa_mac_sign_setup( &operation->ctx.mbedtls_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001627 attributes,
1628 key_buffer, key_buffer_size,
1629 alg );
1630 if( status == PSA_SUCCESS )
1631 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1632
1633 if( status != PSA_ERROR_NOT_SUPPORTED )
1634 return( status );
1635#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1636 return( PSA_ERROR_NOT_SUPPORTED );
1637
1638 /* Add cases for opaque driver here */
1639#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1640#if defined(PSA_CRYPTO_DRIVER_TEST)
1641 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001642 status = mbedtls_test_opaque_mac_sign_setup(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001643 &operation->ctx.opaque_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001644 attributes,
1645 key_buffer, key_buffer_size,
1646 alg );
1647
1648 if( status == PSA_SUCCESS )
1649 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1650
1651 return( status );
1652#endif /* PSA_CRYPTO_DRIVER_TEST */
1653#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1654 default:
1655 /* Key is declared with a lifetime not known to us */
1656 (void) status;
Ronald Cron485559e2021-04-28 14:29:00 +02001657 (void) operation;
Steven Cooreman896d51e2021-03-19 15:24:23 +01001658 (void) key_buffer;
1659 (void) key_buffer_size;
1660 (void) alg;
1661 return( PSA_ERROR_INVALID_ARGUMENT );
1662 }
1663}
1664
1665psa_status_t psa_driver_wrapper_mac_verify_setup(
1666 psa_mac_operation_t *operation,
1667 const psa_key_attributes_t *attributes,
1668 const uint8_t *key_buffer,
1669 size_t key_buffer_size,
1670 psa_algorithm_t alg )
1671{
1672 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1673 psa_key_location_t location =
1674 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1675
1676 switch( location )
1677 {
1678 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1679 /* Key is stored in the slot in export representation, so
1680 * cycle through all known transparent accelerators */
1681#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1682#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001683 status = mbedtls_test_transparent_mac_verify_setup(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001684 &operation->ctx.transparent_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001685 attributes,
1686 key_buffer, key_buffer_size,
1687 alg );
1688 /* Declared with fallback == true */
1689 if( status == PSA_SUCCESS )
1690 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1691
1692 if( status != PSA_ERROR_NOT_SUPPORTED )
1693 return( status );
1694#endif /* PSA_CRYPTO_DRIVER_TEST */
1695#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1696#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1697 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001698 status = mbedtls_psa_mac_verify_setup( &operation->ctx.mbedtls_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001699 attributes,
1700 key_buffer, key_buffer_size,
1701 alg );
1702 if( status == PSA_SUCCESS )
1703 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1704
1705 if( status != PSA_ERROR_NOT_SUPPORTED )
1706 return( status );
1707#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1708 return( PSA_ERROR_NOT_SUPPORTED );
1709
1710 /* Add cases for opaque driver here */
1711#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1712#if defined(PSA_CRYPTO_DRIVER_TEST)
1713 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001714 status = mbedtls_test_opaque_mac_verify_setup(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001715 &operation->ctx.opaque_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001716 attributes,
1717 key_buffer, key_buffer_size,
1718 alg );
1719
1720 if( status == PSA_SUCCESS )
1721 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1722
1723 return( status );
1724#endif /* PSA_CRYPTO_DRIVER_TEST */
1725#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1726 default:
1727 /* Key is declared with a lifetime not known to us */
1728 (void) status;
Ronald Cron485559e2021-04-28 14:29:00 +02001729 (void) operation;
Steven Cooreman896d51e2021-03-19 15:24:23 +01001730 (void) key_buffer;
1731 (void) key_buffer_size;
1732 (void) alg;
1733 return( PSA_ERROR_INVALID_ARGUMENT );
1734 }
1735}
1736
1737psa_status_t psa_driver_wrapper_mac_update(
1738 psa_mac_operation_t *operation,
1739 const uint8_t *input,
1740 size_t input_length )
1741{
1742 switch( operation->id )
1743 {
1744#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1745 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001746 return( mbedtls_psa_mac_update( &operation->ctx.mbedtls_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001747 input, input_length ) );
1748#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1749
1750#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1751#if defined(PSA_CRYPTO_DRIVER_TEST)
1752 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001753 return( mbedtls_test_transparent_mac_update(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001754 &operation->ctx.transparent_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001755 input, input_length ) );
1756
1757 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001758 return( mbedtls_test_opaque_mac_update(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001759 &operation->ctx.opaque_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001760 input, input_length ) );
1761#endif /* PSA_CRYPTO_DRIVER_TEST */
1762#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1763 default:
1764 (void) input;
1765 (void) input_length;
1766 return( PSA_ERROR_INVALID_ARGUMENT );
1767 }
1768}
1769
1770psa_status_t psa_driver_wrapper_mac_sign_finish(
1771 psa_mac_operation_t *operation,
1772 uint8_t *mac,
1773 size_t mac_size,
1774 size_t *mac_length )
1775{
1776 switch( operation->id )
1777 {
1778#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1779 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001780 return( mbedtls_psa_mac_sign_finish( &operation->ctx.mbedtls_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001781 mac, mac_size, mac_length ) );
1782#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1783
1784#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1785#if defined(PSA_CRYPTO_DRIVER_TEST)
1786 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001787 return( mbedtls_test_transparent_mac_sign_finish(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001788 &operation->ctx.transparent_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001789 mac, mac_size, mac_length ) );
1790
1791 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001792 return( mbedtls_test_opaque_mac_sign_finish(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001793 &operation->ctx.opaque_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001794 mac, mac_size, mac_length ) );
1795#endif /* PSA_CRYPTO_DRIVER_TEST */
1796#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1797 default:
1798 (void) mac;
1799 (void) mac_size;
1800 (void) mac_length;
1801 return( PSA_ERROR_INVALID_ARGUMENT );
1802 }
1803}
1804
1805psa_status_t psa_driver_wrapper_mac_verify_finish(
1806 psa_mac_operation_t *operation,
1807 const uint8_t *mac,
1808 size_t mac_length )
1809{
1810 switch( operation->id )
1811 {
1812#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1813 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001814 return( mbedtls_psa_mac_verify_finish( &operation->ctx.mbedtls_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001815 mac, mac_length ) );
1816#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1817
1818#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1819#if defined(PSA_CRYPTO_DRIVER_TEST)
1820 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001821 return( mbedtls_test_transparent_mac_verify_finish(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001822 &operation->ctx.transparent_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001823 mac, mac_length ) );
1824
1825 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001826 return( mbedtls_test_opaque_mac_verify_finish(
Steven Cooreman6e3c2cb2021-03-19 17:05:52 +01001827 &operation->ctx.opaque_test_driver_ctx,
Steven Cooreman896d51e2021-03-19 15:24:23 +01001828 mac, mac_length ) );
1829#endif /* PSA_CRYPTO_DRIVER_TEST */
1830#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1831 default:
1832 (void) mac;
1833 (void) mac_length;
1834 return( PSA_ERROR_INVALID_ARGUMENT );
1835 }
1836}
1837
1838psa_status_t psa_driver_wrapper_mac_abort(
1839 psa_mac_operation_t *operation )
1840{
Steven Cooreman896d51e2021-03-19 15:24:23 +01001841 switch( operation->id )
1842 {
1843#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1844 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman07897832021-03-19 18:28:56 +01001845 return( mbedtls_psa_mac_abort( &operation->ctx.mbedtls_ctx ) );
Steven Cooreman896d51e2021-03-19 15:24:23 +01001846#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1847
1848#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1849#if defined(PSA_CRYPTO_DRIVER_TEST)
1850 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001851 return( mbedtls_test_transparent_mac_abort(
Steven Cooreman07897832021-03-19 18:28:56 +01001852 &operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman896d51e2021-03-19 15:24:23 +01001853 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooreman2d9a3f92021-04-29 21:10:11 +02001854 return( mbedtls_test_opaque_mac_abort(
Steven Cooreman07897832021-03-19 18:28:56 +01001855 &operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman896d51e2021-03-19 15:24:23 +01001856#endif /* PSA_CRYPTO_DRIVER_TEST */
1857#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1858 default:
Steven Cooreman07897832021-03-19 18:28:56 +01001859 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman896d51e2021-03-19 15:24:23 +01001860 }
Steven Cooreman896d51e2021-03-19 15:24:23 +01001861}
Gilles Peskinead0e0122021-04-24 13:19:45 +02001862
1863#endif /* MBEDTLS_PSA_CRYPTO_C */