blob: d2c2b782c0c902a536227e105f0b03b963f762a0 [file] [log] [blame]
Steven Cooremancd84cb42020-07-16 20:28:36 +02001/*
2 * Functions to delegate cryptographic operations to an available
3 * and appropriate accelerator.
Steven Cooreman56250fd2020-09-04 13:07:15 +02004 * Warning: This file will be auto-generated in the future.
Steven Cooremancd84cb42020-07-16 20:28:36 +02005 */
Steven Cooreman2c7b2f82020-09-02 13:43:46 +02006/* Copyright The Mbed TLS Contributors
Steven Cooremancd84cb42020-07-16 20:28:36 +02007 * SPDX-License-Identifier: Apache-2.0
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
10 * not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
Steven Cooremancd84cb42020-07-16 20:28:36 +020020 */
21
Ronald Cronde822812021-03-17 16:08:20 +010022#include "psa_crypto_aead.h"
Ronald Cron0b805592020-12-14 18:08:20 +010023#include "psa_crypto_cipher.h"
Steven Cooremancd84cb42020-07-16 20:28:36 +020024#include "psa_crypto_core.h"
25#include "psa_crypto_driver_wrappers.h"
Steven Cooreman830aff22021-03-09 09:50:44 +010026#include "psa_crypto_hash.h"
27
Steven Cooreman2a1664c2020-07-20 15:33:08 +020028#include "mbedtls/platform.h"
29
30#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS)
Steven Cooremancd84cb42020-07-16 20:28:36 +020031
32/* Include test driver definition when running tests */
Steven Cooremanf1720ea2020-07-24 18:41:58 +020033#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman56250fd2020-09-04 13:07:15 +020034#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020035#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020036#endif
37#ifndef PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020038#define PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020039#endif
Ronald Cron05ee58d2021-04-30 17:00:34 +020040#include "test/drivers/test_driver.h"
Steven Cooremanf1720ea2020-07-24 18:41:58 +020041#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooremancd84cb42020-07-16 20:28:36 +020042
Steven Cooreman56250fd2020-09-04 13:07:15 +020043/* Repeat above block for each JSON-declared driver during autogeneration */
Steven Cooremanaa87fd02021-03-15 18:54:03 +010044#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */
Steven Cooreman56250fd2020-09-04 13:07:15 +020045
Steven Cooreman1e582352021-02-18 17:24:37 +010046/* Auto-generated values depending on which drivers are registered.
47 * ID 0 is reserved for unallocated operations.
48 * ID 1 is reserved for the Mbed TLS software driver. */
Steven Cooreman830aff22021-03-09 09:50:44 +010049#define PSA_CRYPTO_MBED_TLS_DRIVER_ID (1)
50
Steven Cooreman37941cb2020-07-28 18:49:51 +020051#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman1e582352021-02-18 17:24:37 +010052#define PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID (2)
53#define PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID (3)
Steven Cooreman37941cb2020-07-28 18:49:51 +020054#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman2a1664c2020-07-20 15:33:08 +020055
56/* Support the 'old' SE interface when asked to */
Steven Cooreman7a250572020-07-17 16:43:05 +020057#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Steven Cooreman56250fd2020-09-04 13:07:15 +020058/* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style
59 * SE driver is present, to avoid unused argument errors at compile time. */
60#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020061#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020062#endif
Steven Cooreman7a250572020-07-17 16:43:05 +020063#include "psa_crypto_se.h"
64#endif
65
Steven Cooremancd84cb42020-07-16 20:28:36 +020066/* Start delegation functions */
gabor-mezei-armc53f4f62021-04-22 11:32:19 +020067psa_status_t psa_driver_wrapper_sign_message(
68 const psa_key_attributes_t *attributes,
69 const uint8_t *key_buffer,
70 size_t key_buffer_size,
71 psa_algorithm_t alg,
72 const uint8_t *input,
73 size_t input_length,
74 uint8_t *signature,
75 size_t signature_size,
76 size_t *signature_length )
77{
78 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +020079 psa_key_location_t location =
80 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
81
82 switch( location )
83 {
84 case PSA_KEY_LOCATION_LOCAL_STORAGE:
85 /* Key is stored in the slot in export representation, so
86 * cycle through all known transparent accelerators */
87#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
88#if defined(PSA_CRYPTO_DRIVER_TEST)
89 status = mbedtls_test_transparent_signature_sign_message(
90 attributes,
91 key_buffer,
92 key_buffer_size,
93 alg,
94 input,
95 input_length,
96 signature,
97 signature_size,
98 signature_length );
99 /* Declared with fallback == true */
100 if( status != PSA_ERROR_NOT_SUPPORTED )
101 return( status );
102#endif /* PSA_CRYPTO_DRIVER_TEST */
103#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arma7b9b202021-05-07 15:16:34 +0200104 break;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200105
106 /* Add cases for opaque driver here */
107#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
108#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm77588fb2021-04-27 18:52:51 +0200109 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arma7b9b202021-05-07 15:16:34 +0200110 status = mbedtls_test_opaque_signature_sign_message(
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200111 attributes,
112 key_buffer,
113 key_buffer_size,
114 alg,
115 input,
116 input_length,
117 signature,
118 signature_size,
gabor-mezei-arma7b9b202021-05-07 15:16:34 +0200119 signature_length );
120 if( status != PSA_ERROR_NOT_SUPPORTED )
121 return( status );
122 break;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200123#endif /* PSA_CRYPTO_DRIVER_TEST */
124#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
125 default:
126 /* Key is declared with a lifetime not known to us */
127 (void)status;
128 return( PSA_ERROR_INVALID_ARGUMENT );
129 }
gabor-mezei-arma7b9b202021-05-07 15:16:34 +0200130
131 return( psa_sign_message_builtin( attributes,
132 key_buffer,
133 key_buffer_size,
134 alg,
135 input,
136 input_length,
137 signature,
138 signature_size,
139 signature_length ) );
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200140}
141
142psa_status_t psa_driver_wrapper_verify_message(
143 const psa_key_attributes_t *attributes,
144 const uint8_t *key_buffer,
145 size_t key_buffer_size,
146 psa_algorithm_t alg,
147 const uint8_t *input,
148 size_t input_length,
149 const uint8_t *signature,
150 size_t signature_length )
151{
152 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200153 psa_key_location_t location =
154 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
155
156 switch( location )
157 {
158 case PSA_KEY_LOCATION_LOCAL_STORAGE:
159 /* Key is stored in the slot in export representation, so
160 * cycle through all known transparent accelerators */
161#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
162#if defined(PSA_CRYPTO_DRIVER_TEST)
163 status = mbedtls_test_transparent_signature_verify_message(
164 attributes,
165 key_buffer,
166 key_buffer_size,
167 alg,
168 input,
169 input_length,
170 signature,
171 signature_length );
172 /* Declared with fallback == true */
173 if( status != PSA_ERROR_NOT_SUPPORTED )
174 return( status );
175#endif /* PSA_CRYPTO_DRIVER_TEST */
176#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arma7b9b202021-05-07 15:16:34 +0200177 break;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200178
179 /* Add cases for opaque driver here */
180#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
181#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm77588fb2021-04-27 18:52:51 +0200182 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200183 return( mbedtls_test_opaque_signature_verify_message(
184 attributes,
185 key_buffer,
186 key_buffer_size,
187 alg,
188 input,
189 input_length,
190 signature,
191 signature_length ) );
gabor-mezei-arma7b9b202021-05-07 15:16:34 +0200192 if( status != PSA_ERROR_NOT_SUPPORTED )
193 return( status );
194 break;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200195#endif /* PSA_CRYPTO_DRIVER_TEST */
196#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
197 default:
198 /* Key is declared with a lifetime not known to us */
199 (void)status;
200 return( PSA_ERROR_INVALID_ARGUMENT );
201 }
gabor-mezei-arma7b9b202021-05-07 15:16:34 +0200202
203 return( psa_verify_message_builtin( attributes,
204 key_buffer,
205 key_buffer_size,
206 alg,
207 input,
208 input_length,
209 signature,
210 signature_length ) );
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200211}
212
Ronald Cron9f17aa42020-12-08 17:07:25 +0100213psa_status_t psa_driver_wrapper_sign_hash(
214 const psa_key_attributes_t *attributes,
215 const uint8_t *key_buffer, size_t key_buffer_size,
216 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
217 uint8_t *signature, size_t signature_size, size_t *signature_length )
Steven Cooremancd84cb42020-07-16 20:28:36 +0200218{
Steven Cooreman7a250572020-07-17 16:43:05 +0200219 /* Try dynamically-registered SE interface first */
220#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
221 const psa_drv_se_t *drv;
222 psa_drv_se_context_t *drv_context;
223
Ronald Cron9f17aa42020-12-08 17:07:25 +0100224 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman7a250572020-07-17 16:43:05 +0200225 {
226 if( drv->asymmetric == NULL ||
227 drv->asymmetric->p_sign == NULL )
228 {
229 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200230 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman7a250572020-07-17 16:43:05 +0200231 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100232 return( drv->asymmetric->p_sign(
233 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
234 alg, hash, hash_length,
235 signature, signature_size, signature_length ) );
Steven Cooreman7a250572020-07-17 16:43:05 +0200236 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200237#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman7a250572020-07-17 16:43:05 +0200238
Ronald Cronfce9df22020-12-08 18:06:03 +0100239 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100240 psa_key_location_t location =
241 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200242
243 switch( location )
244 {
245 case PSA_KEY_LOCATION_LOCAL_STORAGE:
246 /* Key is stored in the slot in export representation, so
247 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100248#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200249#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200250 status = mbedtls_test_transparent_signature_sign_hash( attributes,
Ronald Cron9f17aa42020-12-08 17:07:25 +0100251 key_buffer,
252 key_buffer_size,
Steven Cooremancd84cb42020-07-16 20:28:36 +0200253 alg,
254 hash,
255 hash_length,
256 signature,
257 signature_size,
258 signature_length );
259 /* Declared with fallback == true */
260 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200261 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200262#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100263#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200264 /* Fell through, meaning no accelerator supports this operation */
gabor-mezei-armf3c5c862021-05-05 14:18:36 +0200265 return( psa_sign_hash_builtin( attributes,
266 key_buffer,
267 key_buffer_size,
268 alg,
269 hash,
270 hash_length,
271 signature,
272 signature_size,
273 signature_length ) );
Ronald Cronfce9df22020-12-08 18:06:03 +0100274
Steven Cooremancd84cb42020-07-16 20:28:36 +0200275 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100276#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200277#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100278 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200279 return( mbedtls_test_opaque_signature_sign_hash( attributes,
280 key_buffer,
281 key_buffer_size,
282 alg,
283 hash,
284 hash_length,
285 signature,
286 signature_size,
287 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200288#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100289#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200290 default:
291 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100292 (void)status;
293 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200294 }
Steven Cooremancd84cb42020-07-16 20:28:36 +0200295}
296
Ronald Cron9f17aa42020-12-08 17:07:25 +0100297psa_status_t psa_driver_wrapper_verify_hash(
298 const psa_key_attributes_t *attributes,
299 const uint8_t *key_buffer, size_t key_buffer_size,
300 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
301 const uint8_t *signature, size_t signature_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200302{
Steven Cooreman55ae2172020-07-17 19:46:15 +0200303 /* Try dynamically-registered SE interface first */
304#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
305 const psa_drv_se_t *drv;
306 psa_drv_se_context_t *drv_context;
307
Ronald Cron9f17aa42020-12-08 17:07:25 +0100308 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200309 {
310 if( drv->asymmetric == NULL ||
311 drv->asymmetric->p_verify == NULL )
312 {
313 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200314 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200315 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100316 return( drv->asymmetric->p_verify(
317 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
318 alg, hash, hash_length,
319 signature, signature_length ) );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200320 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200321#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200322
Ronald Cronfce9df22020-12-08 18:06:03 +0100323 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100324 psa_key_location_t location =
325 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200326
327 switch( location )
328 {
329 case PSA_KEY_LOCATION_LOCAL_STORAGE:
330 /* Key is stored in the slot in export representation, so
331 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100332#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200333#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200334 status = mbedtls_test_transparent_signature_verify_hash(
335 attributes,
336 key_buffer,
337 key_buffer_size,
338 alg,
339 hash,
340 hash_length,
341 signature,
342 signature_length );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200343 /* Declared with fallback == true */
344 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200345 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200346#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100347#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
348
gabor-mezei-armf3c5c862021-05-05 14:18:36 +0200349 return( psa_verify_hash_builtin( attributes,
350 key_buffer,
351 key_buffer_size,
352 alg,
353 hash,
354 hash_length,
355 signature,
356 signature_length ) );
Ronald Cronfce9df22020-12-08 18:06:03 +0100357
Steven Cooreman55ae2172020-07-17 19:46:15 +0200358 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100359#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200360#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100361 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200362 return( mbedtls_test_opaque_signature_verify_hash( attributes,
363 key_buffer,
364 key_buffer_size,
365 alg,
366 hash,
367 hash_length,
368 signature,
369 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200370#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100371#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200372 default:
373 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100374 (void)status;
375 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200376 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200377}
378
Steven Cooremanb938b0b2021-04-06 13:08:42 +0200379/** Get the key buffer size required to store the key material of a key
380 * associated with an opaque driver without storage.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200381 *
Ronald Cron31216282020-12-05 18:47:56 +0100382 * \param[in] attributes The key attributes.
383 * \param[out] key_buffer_size Minimum buffer size to contain the key material
Steven Cooreman56250fd2020-09-04 13:07:15 +0200384 *
385 * \retval #PSA_SUCCESS
Ronald Cron31216282020-12-05 18:47:56 +0100386 * The minimum size for a buffer to contain the key material has been
387 * returned successfully.
388 * \retval #PSA_ERROR_INVALID_ARGUMENT
389 * The size in bits of the key is not valid.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200390 * \retval #PSA_ERROR_NOT_SUPPORTED
Ronald Cron31216282020-12-05 18:47:56 +0100391 * The type and/or the size in bits of the key or the combination of
392 * the two is not supported.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200393 */
Ronald Cron9df74be2020-12-05 19:15:23 +0100394psa_status_t psa_driver_wrapper_get_key_buffer_size(
Ronald Cron31216282020-12-05 18:47:56 +0100395 const psa_key_attributes_t *attributes,
396 size_t *key_buffer_size )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200397{
John Durkop2c618352020-09-22 06:54:01 -0700398 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
399 psa_key_type_t key_type = attributes->core.type;
400 size_t key_bits = attributes->core.bits;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200401
Ronald Cron31216282020-12-05 18:47:56 +0100402 *key_buffer_size = 0;
John Durkop2c618352020-09-22 06:54:01 -0700403 switch( location )
404 {
John Durkop2c618352020-09-22 06:54:01 -0700405#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100406 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100407#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS)
408 /* Emulate property 'builtin_key_size' */
409 if( psa_key_id_is_builtin(
410 MBEDTLS_SVC_KEY_ID_GET_KEY_ID(
411 psa_get_key_id( attributes ) ) ) )
412 {
Steven Cooreman203bcbb2021-03-18 17:17:40 +0100413 *key_buffer_size = sizeof( psa_drv_slot_number_t );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100414 return( PSA_SUCCESS );
415 }
416#endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200417 *key_buffer_size = mbedtls_test_size_function( key_type, key_bits );
Ronald Cronb0737da2021-04-14 10:55:34 +0200418 return( ( *key_buffer_size != 0 ) ?
419 PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED );
John Durkop2c618352020-09-22 06:54:01 -0700420#endif /* PSA_CRYPTO_DRIVER_TEST */
421
422 default:
Ronald Cron9df74be2020-12-05 19:15:23 +0100423 (void)key_type;
424 (void)key_bits;
Steven Cooreman56250fd2020-09-04 13:07:15 +0200425 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200426 }
427}
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200428
Ronald Cron977c2472020-10-13 08:32:21 +0200429psa_status_t psa_driver_wrapper_generate_key(
430 const psa_key_attributes_t *attributes,
431 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200432{
Ronald Cron977c2472020-10-13 08:32:21 +0200433 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
434 psa_key_location_t location =
435 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
436
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200437 /* Try dynamically-registered SE interface first */
438#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
439 const psa_drv_se_t *drv;
440 psa_drv_se_context_t *drv_context;
441
Ronald Cron977c2472020-10-13 08:32:21 +0200442 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200443 {
444 size_t pubkey_length = 0; /* We don't support this feature yet */
445 if( drv->key_management == NULL ||
446 drv->key_management->p_generate == NULL )
447 {
448 /* Key is defined as being in SE, but we have no way to generate it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200449 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200450 }
451 return( drv->key_management->p_generate(
Ronald Cron977c2472020-10-13 08:32:21 +0200452 drv_context,
453 *( (psa_key_slot_number_t *)key_buffer ),
Ronald Cronea0f8a62020-11-25 17:52:23 +0100454 attributes, NULL, 0, &pubkey_length ) );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200455 }
456#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
457
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200458 switch( location )
459 {
460 case PSA_KEY_LOCATION_LOCAL_STORAGE:
Ronald Cron977c2472020-10-13 08:32:21 +0200461#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200462 /* Transparent drivers are limited to generating asymmetric keys */
Ronald Cron977c2472020-10-13 08:32:21 +0200463 if( PSA_KEY_TYPE_IS_ASYMMETRIC( attributes->core.type ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200464 {
Ronald Cron977c2472020-10-13 08:32:21 +0200465 /* Cycle through all known transparent accelerators */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200466#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200467 status = mbedtls_test_transparent_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200468 attributes, key_buffer, key_buffer_size,
469 key_buffer_length );
470 /* Declared with fallback == true */
471 if( status != PSA_ERROR_NOT_SUPPORTED )
472 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200473#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200474 }
475#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
476
477 /* Software fallback */
478 status = psa_generate_key_internal(
479 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200480 break;
Ronald Cron977c2472020-10-13 08:32:21 +0200481
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200482 /* Add cases for opaque driver here */
Ronald Cron977c2472020-10-13 08:32:21 +0200483#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200484#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100485 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200486 status = mbedtls_test_opaque_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200487 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200488 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200489#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200490#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
491
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200492 default:
493 /* Key is declared with a lifetime not known to us */
494 status = PSA_ERROR_INVALID_ARGUMENT;
495 break;
496 }
497
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200498 return( status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200499}
500
Ronald Cron83282872020-11-22 14:02:39 +0100501psa_status_t psa_driver_wrapper_import_key(
502 const psa_key_attributes_t *attributes,
503 const uint8_t *data,
504 size_t data_length,
505 uint8_t *key_buffer,
506 size_t key_buffer_size,
507 size_t *key_buffer_length,
508 size_t *bits )
Steven Cooreman04524762020-10-13 17:43:44 +0200509{
Steven Cooreman04524762020-10-13 17:43:44 +0200510 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cronbf33c932020-11-28 18:06:53 +0100511 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
512 psa_get_key_lifetime( attributes ) );
Steven Cooreman04524762020-10-13 17:43:44 +0200513
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100514 /* Try dynamically-registered SE interface first */
515#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
516 const psa_drv_se_t *drv;
517 psa_drv_se_context_t *drv_context;
518
519 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
520 {
521 if( drv->key_management == NULL ||
522 drv->key_management->p_import == NULL )
523 return( PSA_ERROR_NOT_SUPPORTED );
524
525 /* The driver should set the number of key bits, however in
526 * case it doesn't, we initialize bits to an invalid value. */
527 *bits = PSA_MAX_KEY_BITS + 1;
528 status = drv->key_management->p_import(
529 drv_context,
530 *( (psa_key_slot_number_t *)key_buffer ),
531 attributes, data, data_length, bits );
532
533 if( status != PSA_SUCCESS )
534 return( status );
535
536 if( (*bits) > PSA_MAX_KEY_BITS )
537 return( PSA_ERROR_NOT_SUPPORTED );
538
539 return( PSA_SUCCESS );
540 }
541#endif /* PSA_CRYPTO_SE_C */
542
Ronald Cronbf33c932020-11-28 18:06:53 +0100543 switch( location )
544 {
545 case PSA_KEY_LOCATION_LOCAL_STORAGE:
546 /* Key is stored in the slot in export representation, so
547 * cycle through all known transparent accelerators */
548#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
549#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200550 status = mbedtls_test_transparent_import_key(
551 attributes,
552 data, data_length,
553 key_buffer, key_buffer_size,
554 key_buffer_length, bits );
Ronald Cronbf33c932020-11-28 18:06:53 +0100555 /* Declared with fallback == true */
556 if( status != PSA_ERROR_NOT_SUPPORTED )
557 return( status );
558#endif /* PSA_CRYPTO_DRIVER_TEST */
559#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
560 /* Fell through, meaning no accelerator supports this operation */
561 return( psa_import_key_into_slot( attributes,
562 data, data_length,
563 key_buffer, key_buffer_size,
564 key_buffer_length, bits ) );
565
566 default:
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100567 /* Importing a key with external storage in not yet supported.
568 * Return in error indicating that the lifetime is not valid. */
Ronald Cronbf33c932020-11-28 18:06:53 +0100569 (void)status;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100570 return( PSA_ERROR_INVALID_ARGUMENT );
Ronald Cronbf33c932020-11-28 18:06:53 +0100571 }
572
Steven Cooreman04524762020-10-13 17:43:44 +0200573}
574
Ronald Cron67227982020-11-26 15:16:05 +0100575psa_status_t psa_driver_wrapper_export_key(
576 const psa_key_attributes_t *attributes,
577 const uint8_t *key_buffer, size_t key_buffer_size,
578 uint8_t *data, size_t data_size, size_t *data_length )
579
580{
581 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
582 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
583 psa_get_key_lifetime( attributes ) );
584
Ronald Cron152e3f82020-11-26 16:06:41 +0100585 /* Try dynamically-registered SE interface first */
586#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
587 const psa_drv_se_t *drv;
588 psa_drv_se_context_t *drv_context;
589
590 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
591 {
592 if( ( drv->key_management == NULL ) ||
593 ( drv->key_management->p_export == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100594 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100595 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100596 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100597
598 return( drv->key_management->p_export(
599 drv_context,
600 *( (psa_key_slot_number_t *)key_buffer ),
601 data, data_size, data_length ) );
602 }
603#endif /* PSA_CRYPTO_SE_C */
604
Ronald Cron67227982020-11-26 15:16:05 +0100605 switch( location )
606 {
607 case PSA_KEY_LOCATION_LOCAL_STORAGE:
608 return( psa_export_key_internal( attributes,
609 key_buffer,
610 key_buffer_size,
611 data,
612 data_size,
613 data_length ) );
614
615 /* Add cases for opaque driver here */
616#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
617#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100618 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200619 return( mbedtls_test_opaque_export_key( attributes,
620 key_buffer,
621 key_buffer_size,
622 data,
623 data_size,
624 data_length ) );
Ronald Cron67227982020-11-26 15:16:05 +0100625#endif /* PSA_CRYPTO_DRIVER_TEST */
626#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
627 default:
628 /* Key is declared with a lifetime not known to us */
629 return( status );
630 }
631}
632
Ronald Cron84cc9942020-11-25 14:30:05 +0100633psa_status_t psa_driver_wrapper_export_public_key(
634 const psa_key_attributes_t *attributes,
635 const uint8_t *key_buffer, size_t key_buffer_size,
636 uint8_t *data, size_t data_size, size_t *data_length )
637
Steven Cooremanb9b84422020-10-14 14:39:20 +0200638{
Steven Cooremanb9b84422020-10-14 14:39:20 +0200639 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Cron84cc9942020-11-25 14:30:05 +0100640 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
641 psa_get_key_lifetime( attributes ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200642
Ronald Cron152e3f82020-11-26 16:06:41 +0100643 /* Try dynamically-registered SE interface first */
644#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
645 const psa_drv_se_t *drv;
646 psa_drv_se_context_t *drv_context;
647
648 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
649 {
650 if( ( drv->key_management == NULL ) ||
651 ( drv->key_management->p_export_public == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100652 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100653 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100654 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100655
656 return( drv->key_management->p_export_public(
657 drv_context,
658 *( (psa_key_slot_number_t *)key_buffer ),
659 data, data_size, data_length ) );
660 }
661#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
662
Steven Cooremanb9b84422020-10-14 14:39:20 +0200663 switch( location )
664 {
665 case PSA_KEY_LOCATION_LOCAL_STORAGE:
666 /* Key is stored in the slot in export representation, so
667 * cycle through all known transparent accelerators */
Ronald Cron67227982020-11-26 15:16:05 +0100668#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200669#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200670 status = mbedtls_test_transparent_export_public_key(
671 attributes,
672 key_buffer,
673 key_buffer_size,
674 data,
675 data_size,
676 data_length );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200677 /* Declared with fallback == true */
678 if( status != PSA_ERROR_NOT_SUPPORTED )
679 return( status );
680#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100681#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200682 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron67227982020-11-26 15:16:05 +0100683 return( psa_export_public_key_internal( attributes,
684 key_buffer,
685 key_buffer_size,
686 data,
687 data_size,
688 data_length ) );
689
Steven Cooremanb9b84422020-10-14 14:39:20 +0200690 /* Add cases for opaque driver here */
Ronald Cron67227982020-11-26 15:16:05 +0100691#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200692#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100693 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200694 return( mbedtls_test_opaque_export_public_key( attributes,
695 key_buffer,
696 key_buffer_size,
697 data,
698 data_size,
699 data_length ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200700#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100701#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200702 default:
703 /* Key is declared with a lifetime not known to us */
704 return( status );
705 }
Steven Cooremanb9b84422020-10-14 14:39:20 +0200706}
707
Steven Cooreman6801f082021-02-19 17:21:22 +0100708psa_status_t psa_driver_wrapper_get_builtin_key(
709 psa_drv_slot_number_t slot_number,
710 psa_key_attributes_t *attributes,
711 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
712{
713 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
714 switch( location )
715 {
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100716#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100717 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200718 return( mbedtls_test_opaque_get_builtin_key(
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100719 slot_number,
720 attributes,
721 key_buffer, key_buffer_size, key_buffer_length ) );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100722#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman6801f082021-02-19 17:21:22 +0100723 default:
724 (void) slot_number;
725 (void) key_buffer;
726 (void) key_buffer_size;
727 (void) key_buffer_length;
728 return( PSA_ERROR_DOES_NOT_EXIST );
729 }
730}
731
Steven Cooreman37941cb2020-07-28 18:49:51 +0200732/*
733 * Cipher functions
734 */
735psa_status_t psa_driver_wrapper_cipher_encrypt(
736 psa_key_slot_t *slot,
737 psa_algorithm_t alg,
738 const uint8_t *input,
739 size_t input_length,
740 uint8_t *output,
741 size_t output_size,
742 size_t *output_length )
743{
744#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
745 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
746 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
747 psa_key_attributes_t attributes = {
748 .core = slot->attr
749 };
750
751 switch( location )
752 {
753 case PSA_KEY_LOCATION_LOCAL_STORAGE:
754 /* Key is stored in the slot in export representation, so
755 * cycle through all known transparent accelerators */
756#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200757 status = mbedtls_test_transparent_cipher_encrypt( &attributes,
758 slot->key.data,
759 slot->key.bytes,
760 alg,
761 input,
762 input_length,
763 output,
764 output_size,
765 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200766 /* Declared with fallback == true */
767 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200768 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200769#endif /* PSA_CRYPTO_DRIVER_TEST */
770 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200771 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200772 /* Add cases for opaque driver here */
773#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100774 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200775 return( mbedtls_test_opaque_cipher_encrypt( &attributes,
776 slot->key.data,
777 slot->key.bytes,
778 alg,
779 input,
780 input_length,
781 output,
782 output_size,
783 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200784#endif /* PSA_CRYPTO_DRIVER_TEST */
785 default:
786 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200787 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200788 }
789#else /* PSA_CRYPTO_DRIVER_PRESENT */
790 (void) slot;
791 (void) alg;
792 (void) input;
793 (void) input_length;
794 (void) output;
795 (void) output_size;
796 (void) output_length;
797
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200798 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200799#endif /* PSA_CRYPTO_DRIVER_PRESENT */
800}
801
802psa_status_t psa_driver_wrapper_cipher_decrypt(
803 psa_key_slot_t *slot,
804 psa_algorithm_t alg,
805 const uint8_t *input,
806 size_t input_length,
807 uint8_t *output,
808 size_t output_size,
809 size_t *output_length )
810{
811#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
812 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
813 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
814 psa_key_attributes_t attributes = {
815 .core = slot->attr
816 };
817
818 switch( location )
819 {
820 case PSA_KEY_LOCATION_LOCAL_STORAGE:
821 /* Key is stored in the slot in export representation, so
822 * cycle through all known transparent accelerators */
823#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200824 status = mbedtls_test_transparent_cipher_decrypt( &attributes,
825 slot->key.data,
826 slot->key.bytes,
827 alg,
828 input,
829 input_length,
830 output,
831 output_size,
832 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200833 /* Declared with fallback == true */
834 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200835 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200836#endif /* PSA_CRYPTO_DRIVER_TEST */
837 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200838 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200839 /* Add cases for opaque driver here */
840#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100841 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200842 return( mbedtls_test_opaque_cipher_decrypt( &attributes,
843 slot->key.data,
844 slot->key.bytes,
845 alg,
846 input,
847 input_length,
848 output,
849 output_size,
850 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200851#endif /* PSA_CRYPTO_DRIVER_TEST */
852 default:
853 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200854 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200855 }
856#else /* PSA_CRYPTO_DRIVER_PRESENT */
857 (void) slot;
858 (void) alg;
859 (void) input;
860 (void) input_length;
861 (void) output;
862 (void) output_size;
863 (void) output_length;
864
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200865 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200866#endif /* PSA_CRYPTO_DRIVER_PRESENT */
867}
868
869psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100870 psa_cipher_operation_t *operation,
871 const psa_key_attributes_t *attributes,
872 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200873 psa_algorithm_t alg )
874{
Ronald Cron0b805592020-12-14 18:08:20 +0100875 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Crona4af55f2020-12-14 14:36:06 +0100876 psa_key_location_t location =
877 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200878
Steven Cooreman37941cb2020-07-28 18:49:51 +0200879 switch( location )
880 {
881 case PSA_KEY_LOCATION_LOCAL_STORAGE:
882 /* Key is stored in the slot in export representation, so
883 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100884#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200885#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200886 status = mbedtls_test_transparent_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100887 &operation->ctx.transparent_test_driver_ctx,
888 attributes,
889 key_buffer,
890 key_buffer_size,
891 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200892 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200893 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100894 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200895
Ronald Cron0b805592020-12-14 18:08:20 +0100896 if( status != PSA_ERROR_NOT_SUPPORTED )
897 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200898#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100899#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100900#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200901 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100902 status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100903 attributes,
904 key_buffer,
905 key_buffer_size,
906 alg );
907 if( status == PSA_SUCCESS )
Ronald Cron6e412a72021-03-10 09:58:47 +0100908 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Ronald Cron49fafa92021-03-10 08:34:23 +0100909
Ronald Cron7b4154d2021-03-19 14:49:41 +0100910 if( status != PSA_ERROR_NOT_SUPPORTED )
911 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100912#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
913 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron0b805592020-12-14 18:08:20 +0100914
Steven Cooreman37941cb2020-07-28 18:49:51 +0200915 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100916#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200917#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100918 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200919 status = mbedtls_test_opaque_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100920 &operation->ctx.opaque_test_driver_ctx,
921 attributes,
922 key_buffer, key_buffer_size,
923 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200924
Steven Cooreman37941cb2020-07-28 18:49:51 +0200925 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100926 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200927
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200928 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200929#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100930#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200931 default:
932 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100933 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100934 (void)key_buffer;
935 (void)key_buffer_size;
936 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +0200937 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200938 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200939}
940
941psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100942 psa_cipher_operation_t *operation,
943 const psa_key_attributes_t *attributes,
944 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200945 psa_algorithm_t alg )
946{
Steven Cooreman37941cb2020-07-28 18:49:51 +0200947 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Crona4af55f2020-12-14 14:36:06 +0100948 psa_key_location_t location =
949 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200950
Steven Cooreman37941cb2020-07-28 18:49:51 +0200951 switch( location )
952 {
953 case PSA_KEY_LOCATION_LOCAL_STORAGE:
954 /* Key is stored in the slot in export representation, so
955 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100956#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200957#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200958 status = mbedtls_test_transparent_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100959 &operation->ctx.transparent_test_driver_ctx,
960 attributes,
961 key_buffer,
962 key_buffer_size,
963 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200964 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200965 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100966 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200967
Ronald Cron0b805592020-12-14 18:08:20 +0100968 if( status != PSA_ERROR_NOT_SUPPORTED )
969 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200970#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100971#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100972#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200973 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100974 status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100975 attributes,
976 key_buffer,
977 key_buffer_size,
978 alg );
979 if( status == PSA_SUCCESS )
980 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
981
982 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100983#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
984 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron49fafa92021-03-10 08:34:23 +0100985
Steven Cooreman37941cb2020-07-28 18:49:51 +0200986 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100987#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200988#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100989 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200990 status = mbedtls_test_opaque_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100991 &operation->ctx.opaque_test_driver_ctx,
992 attributes,
993 key_buffer, key_buffer_size,
994 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200995
Steven Cooreman37941cb2020-07-28 18:49:51 +0200996 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100997 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200998
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200999 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001000#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001001#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +02001002 default:
1003 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +01001004 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001005 (void)key_buffer;
1006 (void)key_buffer_size;
1007 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +02001008 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001009 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001010}
1011
Steven Cooreman37941cb2020-07-28 18:49:51 +02001012psa_status_t psa_driver_wrapper_cipher_set_iv(
Ronald Cron6056fe82020-12-15 13:58:07 +01001013 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001014 const uint8_t *iv,
1015 size_t iv_length )
1016{
Ronald Cron49fafa92021-03-10 08:34:23 +01001017 switch( operation->id )
1018 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001019#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001020 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001021 return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001022 iv,
1023 iv_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001024#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001025
1026#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001027#if defined(PSA_CRYPTO_DRIVER_TEST)
1028 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001029 return( mbedtls_test_transparent_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001030 &operation->ctx.transparent_test_driver_ctx,
1031 iv, iv_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001032
Steven Cooreman37941cb2020-07-28 18:49:51 +02001033 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001034 return( mbedtls_test_opaque_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001035 &operation->ctx.opaque_test_driver_ctx,
1036 iv, iv_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001037#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001038#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001039 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001040
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001041 (void)iv;
1042 (void)iv_length;
1043
Ronald Crondd24c9b2020-12-15 14:10:01 +01001044 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001045}
1046
1047psa_status_t psa_driver_wrapper_cipher_update(
Ronald Cron6056fe82020-12-15 13:58:07 +01001048 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001049 const uint8_t *input,
1050 size_t input_length,
1051 uint8_t *output,
1052 size_t output_size,
1053 size_t *output_length )
1054{
Ronald Cron49fafa92021-03-10 08:34:23 +01001055 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001056 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001057#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001058 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001059 return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001060 input,
1061 input_length,
1062 output,
1063 output_size,
1064 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001065#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1066
Ronald Cron49fafa92021-03-10 08:34:23 +01001067#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001068#if defined(PSA_CRYPTO_DRIVER_TEST)
1069 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001070 return( mbedtls_test_transparent_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001071 &operation->ctx.transparent_test_driver_ctx,
1072 input, input_length,
1073 output, output_size, output_length ) );
1074
Steven Cooreman37941cb2020-07-28 18:49:51 +02001075 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001076 return( mbedtls_test_opaque_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001077 &operation->ctx.opaque_test_driver_ctx,
1078 input, input_length,
1079 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001080#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001081#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001082 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001083
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001084 (void)input;
1085 (void)input_length;
1086 (void)output;
1087 (void)output_size;
1088 (void)output_length;
1089
Ronald Crondd24c9b2020-12-15 14:10:01 +01001090 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001091}
1092
1093psa_status_t psa_driver_wrapper_cipher_finish(
Ronald Cron6056fe82020-12-15 13:58:07 +01001094 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001095 uint8_t *output,
1096 size_t output_size,
1097 size_t *output_length )
1098{
Ronald Cron49fafa92021-03-10 08:34:23 +01001099 switch( operation->id )
1100 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001101#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001102 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001103 return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001104 output,
1105 output_size,
1106 output_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_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001113 &operation->ctx.transparent_test_driver_ctx,
1114 output, output_size, output_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_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001118 &operation->ctx.opaque_test_driver_ctx,
1119 output, output_size, output_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)output;
1125 (void)output_size;
1126 (void)output_length;
1127
Ronald Crondd24c9b2020-12-15 14:10:01 +01001128 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001129}
1130
1131psa_status_t psa_driver_wrapper_cipher_abort(
Ronald Cron6056fe82020-12-15 13:58:07 +01001132 psa_cipher_operation_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001133{
Ronald Crondd24c9b2020-12-15 14:10:01 +01001134 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001135
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_abort( &operation->ctx.mbedtls_ctx ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001141#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron49fafa92021-03-10 08:34:23 +01001142
1143#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001144#if defined(PSA_CRYPTO_DRIVER_TEST)
1145 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001146 status = mbedtls_test_transparent_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001147 &operation->ctx.transparent_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001148 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001149 &operation->ctx.transparent_test_driver_ctx,
1150 sizeof( operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001151 return( status );
Ronald Cron49fafa92021-03-10 08:34:23 +01001152
Steven Cooreman37941cb2020-07-28 18:49:51 +02001153 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001154 status = mbedtls_test_opaque_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001155 &operation->ctx.opaque_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001156 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001157 &operation->ctx.opaque_test_driver_ctx,
1158 sizeof( operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001159 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001160#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001161#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001162 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001163
Ronald Cron49fafa92021-03-10 08:34:23 +01001164 (void)status;
Ronald Crondd24c9b2020-12-15 14:10:01 +01001165 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001166}
1167
Steven Cooreman1e582352021-02-18 17:24:37 +01001168/*
1169 * Hashing functions
1170 */
1171psa_status_t psa_driver_wrapper_hash_compute(
1172 psa_algorithm_t alg,
1173 const uint8_t *input,
1174 size_t input_length,
1175 uint8_t *hash,
1176 size_t hash_size,
1177 size_t *hash_length)
1178{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001179 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001180
1181 /* Try accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001182#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001183 status = mbedtls_test_transparent_hash_compute(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001184 alg, input, input_length, hash, hash_size, hash_length );
Steven Cooremanf7638102021-03-04 15:14:36 +01001185 if( status != PSA_ERROR_NOT_SUPPORTED )
1186 return( status );
1187#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001188
1189 /* If software fallback is compiled in, try fallback */
1190#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1191 status = mbedtls_psa_hash_compute( alg, input, input_length,
1192 hash, hash_size, hash_length );
1193 if( status != PSA_ERROR_NOT_SUPPORTED )
1194 return( status );
1195#endif
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001196 (void) status;
1197 (void) alg;
1198 (void) input;
1199 (void) input_length;
1200 (void) hash;
1201 (void) hash_size;
1202 (void) hash_length;
Steven Cooreman1e582352021-02-18 17:24:37 +01001203
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001204 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman1e582352021-02-18 17:24:37 +01001205}
1206
1207psa_status_t psa_driver_wrapper_hash_setup(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001208 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001209 psa_algorithm_t alg )
1210{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001211 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001212
Steven Cooreman1e582352021-02-18 17:24:37 +01001213 /* Try setup on accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001214#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001215 status = mbedtls_test_transparent_hash_setup(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001216 &operation->ctx.test_driver_ctx, alg );
Steven Cooremanf7638102021-03-04 15:14:36 +01001217 if( status == PSA_SUCCESS )
1218 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1219
1220 if( status != PSA_ERROR_NOT_SUPPORTED )
1221 return( status );
1222#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001223
1224 /* If software fallback is compiled in, try fallback */
1225#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001226 status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
Steven Cooreman1e582352021-02-18 17:24:37 +01001227 if( status == PSA_SUCCESS )
Steven Cooreman1e582352021-02-18 17:24:37 +01001228 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Steven Cooreman1e582352021-02-18 17:24:37 +01001229
1230 if( status != PSA_ERROR_NOT_SUPPORTED )
1231 return( status );
1232#endif
1233 /* Nothing left to try if we fall through here */
1234 (void) status;
1235 (void) operation;
1236 (void) alg;
1237 return( PSA_ERROR_NOT_SUPPORTED );
1238}
1239
1240psa_status_t psa_driver_wrapper_hash_clone(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001241 const psa_hash_operation_t *source_operation,
1242 psa_hash_operation_t *target_operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001243{
Steven Cooreman1e582352021-02-18 17:24:37 +01001244 switch( source_operation->id )
1245 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001246#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1247 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1248 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1249 return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1250 &target_operation->ctx.mbedtls_ctx ) );
1251#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001252#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001253 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1254 target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001255 return( mbedtls_test_transparent_hash_clone(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001256 &source_operation->ctx.test_driver_ctx,
1257 &target_operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001258#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001259 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001260 (void) target_operation;
1261 return( PSA_ERROR_BAD_STATE );
1262 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001263}
1264
1265psa_status_t psa_driver_wrapper_hash_update(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001266 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001267 const uint8_t *input,
1268 size_t input_length )
1269{
Steven Cooreman1e582352021-02-18 17:24:37 +01001270 switch( operation->id )
1271 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001272#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1273 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1274 return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
1275 input, input_length ) );
1276#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001277#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001278 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001279 return( mbedtls_test_transparent_hash_update(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001280 &operation->ctx.test_driver_ctx,
1281 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001282#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001283 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001284 (void) input;
1285 (void) input_length;
1286 return( PSA_ERROR_BAD_STATE );
1287 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001288}
1289
1290psa_status_t psa_driver_wrapper_hash_finish(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001291 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001292 uint8_t *hash,
1293 size_t hash_size,
1294 size_t *hash_length )
1295{
Steven Cooreman1e582352021-02-18 17:24:37 +01001296 switch( operation->id )
1297 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001298#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1299 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1300 return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1301 hash, hash_size, hash_length ) );
1302#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001303#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001304 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001305 return( mbedtls_test_transparent_hash_finish(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001306 &operation->ctx.test_driver_ctx,
1307 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001308#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001309 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001310 (void) hash;
1311 (void) hash_size;
1312 (void) hash_length;
1313 return( PSA_ERROR_BAD_STATE );
1314 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001315}
1316
1317psa_status_t psa_driver_wrapper_hash_abort(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001318 psa_hash_operation_t *operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001319{
Steven Cooreman1e582352021-02-18 17:24:37 +01001320 switch( operation->id )
1321 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001322#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1323 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1324 return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1325#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001326#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001327 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001328 return( mbedtls_test_transparent_hash_abort(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001329 &operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001330#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001331 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001332 return( PSA_ERROR_BAD_STATE );
1333 }
1334}
1335
Ronald Cronde822812021-03-17 16:08:20 +01001336psa_status_t psa_driver_wrapper_aead_encrypt(
1337 const psa_key_attributes_t *attributes,
1338 const uint8_t *key_buffer, size_t key_buffer_size,
1339 psa_algorithm_t alg,
1340 const uint8_t *nonce, size_t nonce_length,
1341 const uint8_t *additional_data, size_t additional_data_length,
1342 const uint8_t *plaintext, size_t plaintext_length,
1343 uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length )
1344{
1345 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1346 psa_key_location_t location =
1347 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1348
1349 switch( location )
1350 {
1351 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1352 /* Key is stored in the slot in export representation, so
1353 * cycle through all known transparent accelerators */
1354
1355#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1356#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001357 status = mbedtls_test_transparent_aead_encrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001358 attributes, key_buffer, key_buffer_size,
1359 alg,
1360 nonce, nonce_length,
1361 additional_data, additional_data_length,
1362 plaintext, plaintext_length,
1363 ciphertext, ciphertext_size, ciphertext_length );
1364 /* Declared with fallback == true */
1365 if( status != PSA_ERROR_NOT_SUPPORTED )
1366 return( status );
1367#endif /* PSA_CRYPTO_DRIVER_TEST */
1368#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1369
1370 /* Fell through, meaning no accelerator supports this operation */
1371 return( mbedtls_psa_aead_encrypt(
1372 attributes, key_buffer, key_buffer_size,
1373 alg,
1374 nonce, nonce_length,
1375 additional_data, additional_data_length,
1376 plaintext, plaintext_length,
1377 ciphertext, ciphertext_size, ciphertext_length ) );
1378
1379 /* Add cases for opaque driver here */
1380
1381 default:
1382 /* Key is declared with a lifetime not known to us */
1383 (void)status;
1384 return( PSA_ERROR_INVALID_ARGUMENT );
1385 }
1386}
1387
1388psa_status_t psa_driver_wrapper_aead_decrypt(
1389 const psa_key_attributes_t *attributes,
1390 const uint8_t *key_buffer, size_t key_buffer_size,
1391 psa_algorithm_t alg,
1392 const uint8_t *nonce, size_t nonce_length,
1393 const uint8_t *additional_data, size_t additional_data_length,
1394 const uint8_t *ciphertext, size_t ciphertext_length,
1395 uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length )
1396{
1397 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1398 psa_key_location_t location =
1399 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1400
1401 switch( location )
1402 {
1403 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1404 /* Key is stored in the slot in export representation, so
1405 * cycle through all known transparent accelerators */
1406
1407#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1408#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001409 status = mbedtls_test_transparent_aead_decrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001410 attributes, key_buffer, key_buffer_size,
1411 alg,
1412 nonce, nonce_length,
1413 additional_data, additional_data_length,
1414 ciphertext, ciphertext_length,
1415 plaintext, plaintext_size, plaintext_length );
1416 /* Declared with fallback == true */
1417 if( status != PSA_ERROR_NOT_SUPPORTED )
1418 return( status );
1419#endif /* PSA_CRYPTO_DRIVER_TEST */
1420#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1421
1422 /* Fell through, meaning no accelerator supports this operation */
1423 return( mbedtls_psa_aead_decrypt(
1424 attributes, key_buffer, key_buffer_size,
1425 alg,
1426 nonce, nonce_length,
1427 additional_data, additional_data_length,
1428 ciphertext, ciphertext_length,
1429 plaintext, plaintext_size, plaintext_length ) );
1430
1431 /* Add cases for opaque driver here */
1432
1433 default:
1434 /* Key is declared with a lifetime not known to us */
1435 (void)status;
1436 return( PSA_ERROR_INVALID_ARGUMENT );
1437 }
1438}
Steven Cooremancd84cb42020-07-16 20:28:36 +02001439/* End of automatically generated file. */