blob: 2974d6f93df52ec23d8f9e5068deb738bb0e91f3 [file] [log] [blame]
Steven Cooremancd84cb42020-07-16 20:28:36 +02001/*
2 * Functions to delegate cryptographic operations to an available
3 * and appropriate accelerator.
Steven Cooreman56250fd2020-09-04 13:07:15 +02004 * Warning: This file will be auto-generated in the future.
Steven Cooremancd84cb42020-07-16 20:28:36 +02005 */
Steven Cooreman2c7b2f82020-09-02 13:43:46 +02006/* Copyright The Mbed TLS Contributors
Steven Cooremancd84cb42020-07-16 20:28:36 +02007 * SPDX-License-Identifier: Apache-2.0
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
10 * not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
Steven Cooremancd84cb42020-07-16 20:28:36 +020020 */
21
Mateusz Starzyk2c09c9b2021-05-14 22:20:10 +020022#include "common.h"
Ronald Cronde822812021-03-17 16:08:20 +010023#include "psa_crypto_aead.h"
Ronald Cron0b805592020-12-14 18:08:20 +010024#include "psa_crypto_cipher.h"
Steven Cooremancd84cb42020-07-16 20:28:36 +020025#include "psa_crypto_core.h"
26#include "psa_crypto_driver_wrappers.h"
Steven Cooreman830aff22021-03-09 09:50:44 +010027#include "psa_crypto_hash.h"
Steven Cooremand13a70f2021-03-19 15:24:23 +010028#include "psa_crypto_mac.h"
Steven Cooreman830aff22021-03-09 09:50:44 +010029
Steven Cooreman2a1664c2020-07-20 15:33:08 +020030#include "mbedtls/platform.h"
31
Gilles Peskine1905a242021-04-24 13:19:45 +020032#if defined(MBEDTLS_PSA_CRYPTO_C)
33
Steven Cooreman2a1664c2020-07-20 15:33:08 +020034#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS)
Steven Cooremancd84cb42020-07-16 20:28:36 +020035
36/* Include test driver definition when running tests */
Steven Cooremanf1720ea2020-07-24 18:41:58 +020037#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman56250fd2020-09-04 13:07:15 +020038#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020039#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020040#endif
41#ifndef PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020042#define PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020043#endif
Ronald Cronce1d8d22021-04-30 17:00:34 +020044#include "test/drivers/test_driver.h"
Steven Cooremanf1720ea2020-07-24 18:41:58 +020045#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooremancd84cb42020-07-16 20:28:36 +020046
Steven Cooreman56250fd2020-09-04 13:07:15 +020047/* Repeat above block for each JSON-declared driver during autogeneration */
Steven Cooremanaa87fd02021-03-15 18:54:03 +010048#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */
Steven Cooreman56250fd2020-09-04 13:07:15 +020049
Steven Cooreman1e582352021-02-18 17:24:37 +010050/* Auto-generated values depending on which drivers are registered.
51 * ID 0 is reserved for unallocated operations.
52 * ID 1 is reserved for the Mbed TLS software driver. */
Steven Cooreman830aff22021-03-09 09:50:44 +010053#define PSA_CRYPTO_MBED_TLS_DRIVER_ID (1)
54
Steven Cooreman37941cb2020-07-28 18:49:51 +020055#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman1e582352021-02-18 17:24:37 +010056#define PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID (2)
57#define PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID (3)
Steven Cooreman37941cb2020-07-28 18:49:51 +020058#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman2a1664c2020-07-20 15:33:08 +020059
60/* Support the 'old' SE interface when asked to */
Steven Cooreman7a250572020-07-17 16:43:05 +020061#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Steven Cooreman56250fd2020-09-04 13:07:15 +020062/* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style
63 * SE driver is present, to avoid unused argument errors at compile time. */
64#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020065#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020066#endif
Steven Cooreman7a250572020-07-17 16:43:05 +020067#include "psa_crypto_se.h"
68#endif
69
Steven Cooremancd84cb42020-07-16 20:28:36 +020070/* Start delegation functions */
gabor-mezei-arm50eac352021-04-22 11:32:19 +020071psa_status_t psa_driver_wrapper_sign_message(
72 const psa_key_attributes_t *attributes,
73 const uint8_t *key_buffer,
74 size_t key_buffer_size,
75 psa_algorithm_t alg,
76 const uint8_t *input,
77 size_t input_length,
78 uint8_t *signature,
79 size_t signature_size,
80 size_t *signature_length )
81{
82 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
gabor-mezei-arm50eac352021-04-22 11:32:19 +020083 psa_key_location_t location =
84 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
85
86 switch( location )
87 {
88 case PSA_KEY_LOCATION_LOCAL_STORAGE:
89 /* Key is stored in the slot in export representation, so
90 * cycle through all known transparent accelerators */
91#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
92#if defined(PSA_CRYPTO_DRIVER_TEST)
93 status = mbedtls_test_transparent_signature_sign_message(
94 attributes,
95 key_buffer,
96 key_buffer_size,
97 alg,
98 input,
99 input_length,
100 signature,
101 signature_size,
102 signature_length );
103 /* Declared with fallback == true */
104 if( status != PSA_ERROR_NOT_SUPPORTED )
105 return( status );
106#endif /* PSA_CRYPTO_DRIVER_TEST */
107#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200108 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200109
110 /* Add cases for opaque driver here */
111#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
112#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm2522c0b2021-04-27 18:52:51 +0200113 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200114 status = mbedtls_test_opaque_signature_sign_message(
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200115 attributes,
116 key_buffer,
117 key_buffer_size,
118 alg,
119 input,
120 input_length,
121 signature,
122 signature_size,
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200123 signature_length );
124 if( status != PSA_ERROR_NOT_SUPPORTED )
125 return( status );
126 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200127#endif /* PSA_CRYPTO_DRIVER_TEST */
128#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
129 default:
130 /* Key is declared with a lifetime not known to us */
131 (void)status;
gabor-mezei-armd5218df2021-05-12 11:12:25 +0200132 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200133 }
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200134
135 return( psa_sign_message_builtin( attributes,
136 key_buffer,
137 key_buffer_size,
138 alg,
139 input,
140 input_length,
141 signature,
142 signature_size,
143 signature_length ) );
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200144}
145
146psa_status_t psa_driver_wrapper_verify_message(
147 const psa_key_attributes_t *attributes,
148 const uint8_t *key_buffer,
149 size_t key_buffer_size,
150 psa_algorithm_t alg,
151 const uint8_t *input,
152 size_t input_length,
153 const uint8_t *signature,
154 size_t signature_length )
155{
156 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200157 psa_key_location_t location =
158 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
159
160 switch( location )
161 {
162 case PSA_KEY_LOCATION_LOCAL_STORAGE:
163 /* Key is stored in the slot in export representation, so
164 * cycle through all known transparent accelerators */
165#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
166#if defined(PSA_CRYPTO_DRIVER_TEST)
167 status = mbedtls_test_transparent_signature_verify_message(
168 attributes,
169 key_buffer,
170 key_buffer_size,
171 alg,
172 input,
173 input_length,
174 signature,
175 signature_length );
176 /* Declared with fallback == true */
177 if( status != PSA_ERROR_NOT_SUPPORTED )
178 return( status );
179#endif /* PSA_CRYPTO_DRIVER_TEST */
180#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200181 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200182
183 /* Add cases for opaque driver here */
184#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
185#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm2522c0b2021-04-27 18:52:51 +0200186 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200187 return( mbedtls_test_opaque_signature_verify_message(
188 attributes,
189 key_buffer,
190 key_buffer_size,
191 alg,
192 input,
193 input_length,
194 signature,
195 signature_length ) );
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200196 if( status != PSA_ERROR_NOT_SUPPORTED )
197 return( status );
198 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200199#endif /* PSA_CRYPTO_DRIVER_TEST */
200#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
201 default:
202 /* Key is declared with a lifetime not known to us */
203 (void)status;
gabor-mezei-armd5218df2021-05-12 11:12:25 +0200204 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200205 }
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200206
207 return( psa_verify_message_builtin( attributes,
208 key_buffer,
209 key_buffer_size,
210 alg,
211 input,
212 input_length,
213 signature,
214 signature_length ) );
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200215}
216
Ronald Cron9f17aa42020-12-08 17:07:25 +0100217psa_status_t psa_driver_wrapper_sign_hash(
218 const psa_key_attributes_t *attributes,
219 const uint8_t *key_buffer, size_t key_buffer_size,
220 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
221 uint8_t *signature, size_t signature_size, size_t *signature_length )
Steven Cooremancd84cb42020-07-16 20:28:36 +0200222{
Steven Cooreman7a250572020-07-17 16:43:05 +0200223 /* Try dynamically-registered SE interface first */
224#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
225 const psa_drv_se_t *drv;
226 psa_drv_se_context_t *drv_context;
227
Ronald Cron9f17aa42020-12-08 17:07:25 +0100228 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman7a250572020-07-17 16:43:05 +0200229 {
230 if( drv->asymmetric == NULL ||
231 drv->asymmetric->p_sign == NULL )
232 {
233 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200234 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman7a250572020-07-17 16:43:05 +0200235 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100236 return( drv->asymmetric->p_sign(
237 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
238 alg, hash, hash_length,
239 signature, signature_size, signature_length ) );
Steven Cooreman7a250572020-07-17 16:43:05 +0200240 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200241#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman7a250572020-07-17 16:43:05 +0200242
Ronald Cronfce9df22020-12-08 18:06:03 +0100243 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100244 psa_key_location_t location =
245 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200246
247 switch( location )
248 {
249 case PSA_KEY_LOCATION_LOCAL_STORAGE:
250 /* Key is stored in the slot in export representation, so
251 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100252#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200253#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200254 status = mbedtls_test_transparent_signature_sign_hash( attributes,
Ronald Cron9f17aa42020-12-08 17:07:25 +0100255 key_buffer,
256 key_buffer_size,
Steven Cooremancd84cb42020-07-16 20:28:36 +0200257 alg,
258 hash,
259 hash_length,
260 signature,
261 signature_size,
262 signature_length );
263 /* Declared with fallback == true */
264 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200265 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200266#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100267#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200268 /* Fell through, meaning no accelerator supports this operation */
gabor-mezei-arm6883fd22021-05-05 14:18:36 +0200269 return( psa_sign_hash_builtin( attributes,
270 key_buffer,
271 key_buffer_size,
272 alg,
273 hash,
274 hash_length,
275 signature,
276 signature_size,
277 signature_length ) );
Ronald Cronfce9df22020-12-08 18:06:03 +0100278
Steven Cooremancd84cb42020-07-16 20:28:36 +0200279 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100280#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200281#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100282 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200283 return( mbedtls_test_opaque_signature_sign_hash( attributes,
284 key_buffer,
285 key_buffer_size,
286 alg,
287 hash,
288 hash_length,
289 signature,
290 signature_size,
291 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200292#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100293#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200294 default:
295 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100296 (void)status;
297 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200298 }
Steven Cooremancd84cb42020-07-16 20:28:36 +0200299}
300
Ronald Cron9f17aa42020-12-08 17:07:25 +0100301psa_status_t psa_driver_wrapper_verify_hash(
302 const psa_key_attributes_t *attributes,
303 const uint8_t *key_buffer, size_t key_buffer_size,
304 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
305 const uint8_t *signature, size_t signature_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200306{
Steven Cooreman55ae2172020-07-17 19:46:15 +0200307 /* Try dynamically-registered SE interface first */
308#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
309 const psa_drv_se_t *drv;
310 psa_drv_se_context_t *drv_context;
311
Ronald Cron9f17aa42020-12-08 17:07:25 +0100312 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200313 {
314 if( drv->asymmetric == NULL ||
315 drv->asymmetric->p_verify == NULL )
316 {
317 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200318 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200319 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100320 return( drv->asymmetric->p_verify(
321 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
322 alg, hash, hash_length,
323 signature, signature_length ) );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200324 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200325#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200326
Ronald Cronfce9df22020-12-08 18:06:03 +0100327 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100328 psa_key_location_t location =
329 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200330
331 switch( location )
332 {
333 case PSA_KEY_LOCATION_LOCAL_STORAGE:
334 /* Key is stored in the slot in export representation, so
335 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100336#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200337#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200338 status = mbedtls_test_transparent_signature_verify_hash(
339 attributes,
340 key_buffer,
341 key_buffer_size,
342 alg,
343 hash,
344 hash_length,
345 signature,
346 signature_length );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200347 /* Declared with fallback == true */
348 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200349 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200350#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100351#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
352
gabor-mezei-arm6883fd22021-05-05 14:18:36 +0200353 return( psa_verify_hash_builtin( attributes,
354 key_buffer,
355 key_buffer_size,
356 alg,
357 hash,
358 hash_length,
359 signature,
360 signature_length ) );
Ronald Cronfce9df22020-12-08 18:06:03 +0100361
Steven Cooreman55ae2172020-07-17 19:46:15 +0200362 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100363#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200364#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100365 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200366 return( mbedtls_test_opaque_signature_verify_hash( attributes,
367 key_buffer,
368 key_buffer_size,
369 alg,
370 hash,
371 hash_length,
372 signature,
373 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200374#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100375#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200376 default:
377 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100378 (void)status;
379 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200380 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200381}
382
Archanad8a83dc2021-06-14 10:04:16 +0530383/** calculate the key buffer size required to store the key material of a key
384 * associated with an opaque driver from input key data.
385 *
386 *
387 * \param[in] attributes The key attributes
388 * \param[in] data The input key data.
389 * \param[in] data_length The input data length.
390 * \param[out] key_buffer_size Minimum buffer size to contain the key material.
391 *
392 * \retval #PSA_SUCCESS
393 * \retval #PSA_ERROR_INVALID_ARGUMENT
394 * \retval #PSA_ERROR_NOT_SUPPORTED
395 */
396psa_status_t psa_driver_wrapper_get_key_buffer_size_from_key_data(
397 const psa_key_attributes_t *attributes,
398 const uint8_t *data,
399 size_t data_length,
400 size_t *key_buffer_size )
401{
402 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
403 psa_key_type_t key_type = attributes->core.type;
404
405 *key_buffer_size = 0;
406 switch( location )
407 {
408#if defined(PSA_CRYPTO_DRIVER_TEST)
409 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
410 *key_buffer_size = mbedtls_test_opaque_size_function( key_type,
411 PSA_BYTES_TO_BITS( data_length ) );
412 return( ( *key_buffer_size != 0 ) ?
413 PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED );
414#endif /* PSA_CRYPTO_DRIVER_TEST */
415
416 default:
417 (void)key_type;
418 (void)data;
419 (void)data_length;
420 return( PSA_ERROR_INVALID_ARGUMENT );
421 }
422}
423
Steven Cooremanb938b0b2021-04-06 13:08:42 +0200424/** Get the key buffer size required to store the key material of a key
Archanad8a83dc2021-06-14 10:04:16 +0530425 * associated with an opaque driver.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200426 *
Ronald Cron31216282020-12-05 18:47:56 +0100427 * \param[in] attributes The key attributes.
428 * \param[out] key_buffer_size Minimum buffer size to contain the key material
Steven Cooreman56250fd2020-09-04 13:07:15 +0200429 *
430 * \retval #PSA_SUCCESS
Ronald Cron31216282020-12-05 18:47:56 +0100431 * The minimum size for a buffer to contain the key material has been
432 * returned successfully.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200433 * \retval #PSA_ERROR_NOT_SUPPORTED
Ronald Cron31216282020-12-05 18:47:56 +0100434 * The type and/or the size in bits of the key or the combination of
435 * the two is not supported.
Archanad8a83dc2021-06-14 10:04:16 +0530436 * \retval #PSA_ERROR_INVALID_ARGUMENT
437 * The key is declared with a lifetime not known to us.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200438 */
Ronald Cron9df74be2020-12-05 19:15:23 +0100439psa_status_t psa_driver_wrapper_get_key_buffer_size(
Ronald Cron31216282020-12-05 18:47:56 +0100440 const psa_key_attributes_t *attributes,
441 size_t *key_buffer_size )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200442{
John Durkop2c618352020-09-22 06:54:01 -0700443 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
444 psa_key_type_t key_type = attributes->core.type;
445 size_t key_bits = attributes->core.bits;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200446
Ronald Cron31216282020-12-05 18:47:56 +0100447 *key_buffer_size = 0;
John Durkop2c618352020-09-22 06:54:01 -0700448 switch( location )
449 {
John Durkop2c618352020-09-22 06:54:01 -0700450#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100451 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100452#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS)
453 /* Emulate property 'builtin_key_size' */
454 if( psa_key_id_is_builtin(
455 MBEDTLS_SVC_KEY_ID_GET_KEY_ID(
456 psa_get_key_id( attributes ) ) ) )
457 {
Steven Cooreman203bcbb2021-03-18 17:17:40 +0100458 *key_buffer_size = sizeof( psa_drv_slot_number_t );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100459 return( PSA_SUCCESS );
460 }
461#endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */
Ronald Cron7f13fa22021-04-13 12:41:34 +0200462 *key_buffer_size = mbedtls_test_size_function( key_type, key_bits );
Ronald Cron4607c822021-04-14 10:55:34 +0200463 return( ( *key_buffer_size != 0 ) ?
464 PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED );
John Durkop2c618352020-09-22 06:54:01 -0700465#endif /* PSA_CRYPTO_DRIVER_TEST */
466
467 default:
Ronald Cron9df74be2020-12-05 19:15:23 +0100468 (void)key_type;
469 (void)key_bits;
Archanad8a83dc2021-06-14 10:04:16 +0530470 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200471 }
472}
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200473
Ronald Cron977c2472020-10-13 08:32:21 +0200474psa_status_t psa_driver_wrapper_generate_key(
475 const psa_key_attributes_t *attributes,
476 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200477{
Ronald Cron977c2472020-10-13 08:32:21 +0200478 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
479 psa_key_location_t location =
480 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
481
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200482 /* Try dynamically-registered SE interface first */
483#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
484 const psa_drv_se_t *drv;
485 psa_drv_se_context_t *drv_context;
486
Ronald Cron977c2472020-10-13 08:32:21 +0200487 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200488 {
489 size_t pubkey_length = 0; /* We don't support this feature yet */
490 if( drv->key_management == NULL ||
491 drv->key_management->p_generate == NULL )
492 {
493 /* Key is defined as being in SE, but we have no way to generate it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200494 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200495 }
496 return( drv->key_management->p_generate(
Ronald Cron977c2472020-10-13 08:32:21 +0200497 drv_context,
498 *( (psa_key_slot_number_t *)key_buffer ),
Ronald Cronea0f8a62020-11-25 17:52:23 +0100499 attributes, NULL, 0, &pubkey_length ) );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200500 }
501#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
502
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200503 switch( location )
504 {
505 case PSA_KEY_LOCATION_LOCAL_STORAGE:
Ronald Cron977c2472020-10-13 08:32:21 +0200506#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200507 /* Transparent drivers are limited to generating asymmetric keys */
Ronald Cron977c2472020-10-13 08:32:21 +0200508 if( PSA_KEY_TYPE_IS_ASYMMETRIC( attributes->core.type ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200509 {
Ronald Cron977c2472020-10-13 08:32:21 +0200510 /* Cycle through all known transparent accelerators */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200511#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200512 status = mbedtls_test_transparent_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200513 attributes, key_buffer, key_buffer_size,
514 key_buffer_length );
515 /* Declared with fallback == true */
516 if( status != PSA_ERROR_NOT_SUPPORTED )
517 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200518#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200519 }
520#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
521
522 /* Software fallback */
523 status = psa_generate_key_internal(
524 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200525 break;
Ronald Cron977c2472020-10-13 08:32:21 +0200526
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200527 /* Add cases for opaque driver here */
Ronald Cron977c2472020-10-13 08:32:21 +0200528#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200529#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100530 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200531 status = mbedtls_test_opaque_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200532 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200533 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200534#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200535#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
536
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200537 default:
538 /* Key is declared with a lifetime not known to us */
539 status = PSA_ERROR_INVALID_ARGUMENT;
540 break;
541 }
542
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200543 return( status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200544}
545
Ronald Cron83282872020-11-22 14:02:39 +0100546psa_status_t psa_driver_wrapper_import_key(
547 const psa_key_attributes_t *attributes,
548 const uint8_t *data,
549 size_t data_length,
550 uint8_t *key_buffer,
551 size_t key_buffer_size,
552 size_t *key_buffer_length,
553 size_t *bits )
Steven Cooreman04524762020-10-13 17:43:44 +0200554{
Steven Cooreman04524762020-10-13 17:43:44 +0200555 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cronbf33c932020-11-28 18:06:53 +0100556 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
557 psa_get_key_lifetime( attributes ) );
Steven Cooreman04524762020-10-13 17:43:44 +0200558
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100559 /* Try dynamically-registered SE interface first */
560#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
561 const psa_drv_se_t *drv;
562 psa_drv_se_context_t *drv_context;
563
564 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
565 {
566 if( drv->key_management == NULL ||
567 drv->key_management->p_import == NULL )
568 return( PSA_ERROR_NOT_SUPPORTED );
569
570 /* The driver should set the number of key bits, however in
571 * case it doesn't, we initialize bits to an invalid value. */
572 *bits = PSA_MAX_KEY_BITS + 1;
573 status = drv->key_management->p_import(
574 drv_context,
575 *( (psa_key_slot_number_t *)key_buffer ),
576 attributes, data, data_length, bits );
577
578 if( status != PSA_SUCCESS )
579 return( status );
580
581 if( (*bits) > PSA_MAX_KEY_BITS )
582 return( PSA_ERROR_NOT_SUPPORTED );
583
584 return( PSA_SUCCESS );
585 }
586#endif /* PSA_CRYPTO_SE_C */
587
Ronald Cronbf33c932020-11-28 18:06:53 +0100588 switch( location )
589 {
590 case PSA_KEY_LOCATION_LOCAL_STORAGE:
591 /* Key is stored in the slot in export representation, so
592 * cycle through all known transparent accelerators */
593#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
594#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200595 status = mbedtls_test_transparent_import_key(
596 attributes,
597 data, data_length,
598 key_buffer, key_buffer_size,
599 key_buffer_length, bits );
Ronald Cronbf33c932020-11-28 18:06:53 +0100600 /* Declared with fallback == true */
601 if( status != PSA_ERROR_NOT_SUPPORTED )
602 return( status );
603#endif /* PSA_CRYPTO_DRIVER_TEST */
604#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
605 /* Fell through, meaning no accelerator supports this operation */
606 return( psa_import_key_into_slot( attributes,
607 data, data_length,
608 key_buffer, key_buffer_size,
609 key_buffer_length, bits ) );
610
611 default:
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100612 /* Importing a key with external storage in not yet supported.
613 * Return in error indicating that the lifetime is not valid. */
Ronald Cronbf33c932020-11-28 18:06:53 +0100614 (void)status;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100615 return( PSA_ERROR_INVALID_ARGUMENT );
Ronald Cronbf33c932020-11-28 18:06:53 +0100616 }
617
Steven Cooreman04524762020-10-13 17:43:44 +0200618}
619
Ronald Cron67227982020-11-26 15:16:05 +0100620psa_status_t psa_driver_wrapper_export_key(
621 const psa_key_attributes_t *attributes,
622 const uint8_t *key_buffer, size_t key_buffer_size,
623 uint8_t *data, size_t data_size, size_t *data_length )
624
625{
626 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
627 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
628 psa_get_key_lifetime( attributes ) );
629
Ronald Cron152e3f82020-11-26 16:06:41 +0100630 /* Try dynamically-registered SE interface first */
631#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
632 const psa_drv_se_t *drv;
633 psa_drv_se_context_t *drv_context;
634
635 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
636 {
637 if( ( drv->key_management == NULL ) ||
638 ( drv->key_management->p_export == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100639 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100640 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100641 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100642
643 return( drv->key_management->p_export(
644 drv_context,
645 *( (psa_key_slot_number_t *)key_buffer ),
646 data, data_size, data_length ) );
647 }
648#endif /* PSA_CRYPTO_SE_C */
649
Ronald Cron67227982020-11-26 15:16:05 +0100650 switch( location )
651 {
652 case PSA_KEY_LOCATION_LOCAL_STORAGE:
653 return( psa_export_key_internal( attributes,
654 key_buffer,
655 key_buffer_size,
656 data,
657 data_size,
658 data_length ) );
659
660 /* Add cases for opaque driver here */
661#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
662#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100663 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200664 return( mbedtls_test_opaque_export_key( attributes,
665 key_buffer,
666 key_buffer_size,
667 data,
668 data_size,
669 data_length ) );
Ronald Cron67227982020-11-26 15:16:05 +0100670#endif /* PSA_CRYPTO_DRIVER_TEST */
671#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
672 default:
673 /* Key is declared with a lifetime not known to us */
674 return( status );
675 }
676}
677
Ronald Cron84cc9942020-11-25 14:30:05 +0100678psa_status_t psa_driver_wrapper_export_public_key(
679 const psa_key_attributes_t *attributes,
680 const uint8_t *key_buffer, size_t key_buffer_size,
681 uint8_t *data, size_t data_size, size_t *data_length )
682
Steven Cooremanb9b84422020-10-14 14:39:20 +0200683{
Steven Cooremanb9b84422020-10-14 14:39:20 +0200684 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Cron84cc9942020-11-25 14:30:05 +0100685 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
686 psa_get_key_lifetime( attributes ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200687
Ronald Cron152e3f82020-11-26 16:06:41 +0100688 /* Try dynamically-registered SE interface first */
689#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
690 const psa_drv_se_t *drv;
691 psa_drv_se_context_t *drv_context;
692
693 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
694 {
695 if( ( drv->key_management == NULL ) ||
696 ( drv->key_management->p_export_public == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100697 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100698 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100699 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100700
701 return( drv->key_management->p_export_public(
702 drv_context,
703 *( (psa_key_slot_number_t *)key_buffer ),
704 data, data_size, data_length ) );
705 }
706#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
707
Steven Cooremanb9b84422020-10-14 14:39:20 +0200708 switch( location )
709 {
710 case PSA_KEY_LOCATION_LOCAL_STORAGE:
711 /* Key is stored in the slot in export representation, so
712 * cycle through all known transparent accelerators */
Ronald Cron67227982020-11-26 15:16:05 +0100713#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200714#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200715 status = mbedtls_test_transparent_export_public_key(
716 attributes,
717 key_buffer,
718 key_buffer_size,
719 data,
720 data_size,
721 data_length );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200722 /* Declared with fallback == true */
723 if( status != PSA_ERROR_NOT_SUPPORTED )
724 return( status );
725#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100726#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200727 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron67227982020-11-26 15:16:05 +0100728 return( psa_export_public_key_internal( attributes,
729 key_buffer,
730 key_buffer_size,
731 data,
732 data_size,
733 data_length ) );
734
Steven Cooremanb9b84422020-10-14 14:39:20 +0200735 /* Add cases for opaque driver here */
Ronald Cron67227982020-11-26 15:16:05 +0100736#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200737#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100738 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200739 return( mbedtls_test_opaque_export_public_key( attributes,
740 key_buffer,
741 key_buffer_size,
742 data,
743 data_size,
744 data_length ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200745#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100746#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200747 default:
748 /* Key is declared with a lifetime not known to us */
749 return( status );
750 }
Steven Cooremanb9b84422020-10-14 14:39:20 +0200751}
752
Steven Cooreman6801f082021-02-19 17:21:22 +0100753psa_status_t psa_driver_wrapper_get_builtin_key(
754 psa_drv_slot_number_t slot_number,
755 psa_key_attributes_t *attributes,
756 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
757{
758 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
759 switch( location )
760 {
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100761#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100762 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200763 return( mbedtls_test_opaque_get_builtin_key(
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100764 slot_number,
765 attributes,
766 key_buffer, key_buffer_size, key_buffer_length ) );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100767#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman6801f082021-02-19 17:21:22 +0100768 default:
769 (void) slot_number;
770 (void) key_buffer;
771 (void) key_buffer_size;
772 (void) key_buffer_length;
773 return( PSA_ERROR_DOES_NOT_EXIST );
774 }
775}
776
Steven Cooreman37941cb2020-07-28 18:49:51 +0200777/*
778 * Cipher functions
779 */
780psa_status_t psa_driver_wrapper_cipher_encrypt(
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100781 const psa_key_attributes_t *attributes,
782 const uint8_t *key_buffer,
783 size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200784 psa_algorithm_t alg,
785 const uint8_t *input,
786 size_t input_length,
787 uint8_t *output,
788 size_t output_size,
789 size_t *output_length )
790{
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100791 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
792 psa_key_location_t location =
793 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200794
795 switch( location )
796 {
797 case PSA_KEY_LOCATION_LOCAL_STORAGE:
798 /* Key is stored in the slot in export representation, so
799 * cycle through all known transparent accelerators */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100800#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200801#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100802 status = mbedtls_test_transparent_cipher_encrypt( attributes,
803 key_buffer,
804 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200805 alg,
806 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-arma9449a02021-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,
822 input,
823 input_length,
824 output,
825 output_size,
826 output_length ) );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200827#else
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200828 return( PSA_ERROR_NOT_SUPPORTED );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200829#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100830
Steven Cooreman37941cb2020-07-28 18:49:51 +0200831 /* Add cases for opaque driver here */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100832#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200833#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100834 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100835 return( mbedtls_test_opaque_cipher_encrypt( attributes,
836 key_buffer,
837 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200838 alg,
839 input,
840 input_length,
841 output,
842 output_size,
843 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200844#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100845#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
846
Steven Cooreman37941cb2020-07-28 18:49:51 +0200847 default:
848 /* Key is declared with a lifetime not known to us */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100849 (void)status;
850 (void)key_buffer;
851 (void)key_buffer_size;
852 (void)alg;
853 (void)input;
854 (void)input_length;
855 (void)output;
856 (void)output_size;
857 (void)output_length;
858 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200859 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200860}
861
862psa_status_t psa_driver_wrapper_cipher_decrypt(
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100863 const psa_key_attributes_t *attributes,
864 const uint8_t *key_buffer,
865 size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200866 psa_algorithm_t alg,
867 const uint8_t *input,
868 size_t input_length,
869 uint8_t *output,
870 size_t output_size,
871 size_t *output_length )
872{
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100873 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
874 psa_key_location_t location =
875 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200876
877 switch( location )
878 {
879 case PSA_KEY_LOCATION_LOCAL_STORAGE:
880 /* Key is stored in the slot in export representation, so
881 * cycle through all known transparent accelerators */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100882#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200883#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100884 status = mbedtls_test_transparent_cipher_decrypt( attributes,
885 key_buffer,
886 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200887 alg,
888 input,
889 input_length,
890 output,
891 output_size,
892 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200893 /* Declared with fallback == true */
894 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200895 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200896#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100897#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
898
899#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
900 return( mbedtls_psa_cipher_decrypt( attributes,
901 key_buffer,
902 key_buffer_size,
903 alg,
904 input,
905 input_length,
906 output,
907 output_size,
908 output_length ) );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200909#else
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200910 return( PSA_ERROR_NOT_SUPPORTED );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200911#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100912
Steven Cooreman37941cb2020-07-28 18:49:51 +0200913 /* Add cases for opaque driver here */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100914#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200915#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100916 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100917 return( mbedtls_test_opaque_cipher_decrypt( attributes,
918 key_buffer,
919 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200920 alg,
921 input,
922 input_length,
923 output,
924 output_size,
925 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200926#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100927#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
928
Steven Cooreman37941cb2020-07-28 18:49:51 +0200929 default:
930 /* Key is declared with a lifetime not known to us */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100931 (void)status;
932 (void)key_buffer;
933 (void)key_buffer_size;
934 (void)alg;
935 (void)input;
936 (void)input_length;
937 (void)output;
938 (void)output_size;
939 (void)output_length;
940 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200941 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200942}
943
944psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100945 psa_cipher_operation_t *operation,
946 const psa_key_attributes_t *attributes,
947 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200948 psa_algorithm_t alg )
949{
Ronald Cron0b805592020-12-14 18:08:20 +0100950 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Crona4af55f2020-12-14 14:36:06 +0100951 psa_key_location_t location =
952 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200953
Steven Cooreman37941cb2020-07-28 18:49:51 +0200954 switch( location )
955 {
956 case PSA_KEY_LOCATION_LOCAL_STORAGE:
957 /* Key is stored in the slot in export representation, so
958 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100959#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200960#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200961 status = mbedtls_test_transparent_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100962 &operation->ctx.transparent_test_driver_ctx,
963 attributes,
964 key_buffer,
965 key_buffer_size,
966 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200967 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200968 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100969 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200970
Ronald Cron0b805592020-12-14 18:08:20 +0100971 if( status != PSA_ERROR_NOT_SUPPORTED )
972 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200973#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100974#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100975#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200976 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100977 status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100978 attributes,
979 key_buffer,
980 key_buffer_size,
981 alg );
982 if( status == PSA_SUCCESS )
Ronald Cron6e412a72021-03-10 09:58:47 +0100983 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Ronald Cron49fafa92021-03-10 08:34:23 +0100984
Ronald Cron7b4154d2021-03-19 14:49:41 +0100985 if( status != PSA_ERROR_NOT_SUPPORTED )
986 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100987#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
988 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron0b805592020-12-14 18:08:20 +0100989
Steven Cooreman37941cb2020-07-28 18:49:51 +0200990 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100991#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200992#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100993 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200994 status = mbedtls_test_opaque_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100995 &operation->ctx.opaque_test_driver_ctx,
996 attributes,
997 key_buffer, key_buffer_size,
998 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200999
Steven Cooreman37941cb2020-07-28 18:49:51 +02001000 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001001 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001002
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001003 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001004#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001005#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +02001006 default:
1007 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +01001008 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001009 (void)key_buffer;
1010 (void)key_buffer_size;
1011 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +02001012 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001013 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001014}
1015
1016psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +01001017 psa_cipher_operation_t *operation,
1018 const psa_key_attributes_t *attributes,
1019 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001020 psa_algorithm_t alg )
1021{
Steven Cooreman37941cb2020-07-28 18:49:51 +02001022 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Crona4af55f2020-12-14 14:36:06 +01001023 psa_key_location_t location =
1024 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001025
Steven Cooreman37941cb2020-07-28 18:49:51 +02001026 switch( location )
1027 {
1028 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1029 /* Key is stored in the slot in export representation, so
1030 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +01001031#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001032#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001033 status = mbedtls_test_transparent_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001034 &operation->ctx.transparent_test_driver_ctx,
1035 attributes,
1036 key_buffer,
1037 key_buffer_size,
1038 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001039 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +02001040 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001041 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +02001042
Ronald Cron0b805592020-12-14 18:08:20 +01001043 if( status != PSA_ERROR_NOT_SUPPORTED )
1044 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001045#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001046#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001047#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001048 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +01001049 status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001050 attributes,
1051 key_buffer,
1052 key_buffer_size,
1053 alg );
1054 if( status == PSA_SUCCESS )
1055 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1056
1057 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001058#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1059 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron49fafa92021-03-10 08:34:23 +01001060
Steven Cooreman37941cb2020-07-28 18:49:51 +02001061 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +01001062#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001063#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +01001064 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001065 status = mbedtls_test_opaque_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001066 &operation->ctx.opaque_test_driver_ctx,
1067 attributes,
1068 key_buffer, key_buffer_size,
1069 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001070
Steven Cooreman37941cb2020-07-28 18:49:51 +02001071 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001072 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001073
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001074 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001075#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001076#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +02001077 default:
1078 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +01001079 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001080 (void)key_buffer;
1081 (void)key_buffer_size;
1082 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +02001083 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001084 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001085}
1086
Steven Cooreman37941cb2020-07-28 18:49:51 +02001087psa_status_t psa_driver_wrapper_cipher_set_iv(
Ronald Cron6056fe82020-12-15 13:58:07 +01001088 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001089 const uint8_t *iv,
1090 size_t iv_length )
1091{
Ronald Cron49fafa92021-03-10 08:34:23 +01001092 switch( operation->id )
1093 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001094#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001095 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001096 return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001097 iv,
1098 iv_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001099#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001100
1101#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001102#if defined(PSA_CRYPTO_DRIVER_TEST)
1103 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001104 return( mbedtls_test_transparent_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001105 &operation->ctx.transparent_test_driver_ctx,
1106 iv, iv_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001107
Steven Cooreman37941cb2020-07-28 18:49:51 +02001108 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001109 return( mbedtls_test_opaque_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001110 &operation->ctx.opaque_test_driver_ctx,
1111 iv, iv_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001112#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001113#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001114 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001115
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001116 (void)iv;
1117 (void)iv_length;
1118
Ronald Crondd24c9b2020-12-15 14:10:01 +01001119 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001120}
1121
1122psa_status_t psa_driver_wrapper_cipher_update(
Ronald Cron6056fe82020-12-15 13:58:07 +01001123 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001124 const uint8_t *input,
1125 size_t input_length,
1126 uint8_t *output,
1127 size_t output_size,
1128 size_t *output_length )
1129{
Ronald Cron49fafa92021-03-10 08:34:23 +01001130 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001131 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001132#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001133 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001134 return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001135 input,
1136 input_length,
1137 output,
1138 output_size,
1139 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001140#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1141
Ronald Cron49fafa92021-03-10 08:34:23 +01001142#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001143#if defined(PSA_CRYPTO_DRIVER_TEST)
1144 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001145 return( mbedtls_test_transparent_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001146 &operation->ctx.transparent_test_driver_ctx,
1147 input, input_length,
1148 output, output_size, output_length ) );
1149
Steven Cooreman37941cb2020-07-28 18:49:51 +02001150 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001151 return( mbedtls_test_opaque_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001152 &operation->ctx.opaque_test_driver_ctx,
1153 input, input_length,
1154 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001155#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001156#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001157 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001158
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001159 (void)input;
1160 (void)input_length;
1161 (void)output;
1162 (void)output_size;
1163 (void)output_length;
1164
Ronald Crondd24c9b2020-12-15 14:10:01 +01001165 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001166}
1167
1168psa_status_t psa_driver_wrapper_cipher_finish(
Ronald Cron6056fe82020-12-15 13:58:07 +01001169 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001170 uint8_t *output,
1171 size_t output_size,
1172 size_t *output_length )
1173{
Ronald Cron49fafa92021-03-10 08:34:23 +01001174 switch( operation->id )
1175 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001176#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001177 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001178 return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001179 output,
1180 output_size,
1181 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001182#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001183
1184#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001185#if defined(PSA_CRYPTO_DRIVER_TEST)
1186 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001187 return( mbedtls_test_transparent_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001188 &operation->ctx.transparent_test_driver_ctx,
1189 output, output_size, output_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001190
Steven Cooreman37941cb2020-07-28 18:49:51 +02001191 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001192 return( mbedtls_test_opaque_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001193 &operation->ctx.opaque_test_driver_ctx,
1194 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001195#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001196#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001197 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001198
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001199 (void)output;
1200 (void)output_size;
1201 (void)output_length;
1202
Ronald Crondd24c9b2020-12-15 14:10:01 +01001203 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001204}
1205
1206psa_status_t psa_driver_wrapper_cipher_abort(
Ronald Cron6056fe82020-12-15 13:58:07 +01001207 psa_cipher_operation_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001208{
Ronald Crondd24c9b2020-12-15 14:10:01 +01001209 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001210
Ronald Cron49fafa92021-03-10 08:34:23 +01001211 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001212 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001213#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001214 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001215 return( mbedtls_psa_cipher_abort( &operation->ctx.mbedtls_ctx ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001216#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron49fafa92021-03-10 08:34:23 +01001217
1218#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001219#if defined(PSA_CRYPTO_DRIVER_TEST)
1220 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001221 status = mbedtls_test_transparent_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001222 &operation->ctx.transparent_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001223 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001224 &operation->ctx.transparent_test_driver_ctx,
1225 sizeof( operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001226 return( status );
Ronald Cron49fafa92021-03-10 08:34:23 +01001227
Steven Cooreman37941cb2020-07-28 18:49:51 +02001228 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001229 status = mbedtls_test_opaque_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001230 &operation->ctx.opaque_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001231 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001232 &operation->ctx.opaque_test_driver_ctx,
1233 sizeof( operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001234 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001235#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001236#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001237 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001238
Ronald Cron49fafa92021-03-10 08:34:23 +01001239 (void)status;
Ronald Crondd24c9b2020-12-15 14:10:01 +01001240 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001241}
1242
Steven Cooreman1e582352021-02-18 17:24:37 +01001243/*
1244 * Hashing functions
1245 */
1246psa_status_t psa_driver_wrapper_hash_compute(
1247 psa_algorithm_t alg,
1248 const uint8_t *input,
1249 size_t input_length,
1250 uint8_t *hash,
1251 size_t hash_size,
1252 size_t *hash_length)
1253{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001254 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001255
1256 /* Try accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001257#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001258 status = mbedtls_test_transparent_hash_compute(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001259 alg, input, input_length, hash, hash_size, hash_length );
Steven Cooremanf7638102021-03-04 15:14:36 +01001260 if( status != PSA_ERROR_NOT_SUPPORTED )
1261 return( status );
1262#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001263
1264 /* If software fallback is compiled in, try fallback */
1265#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1266 status = mbedtls_psa_hash_compute( alg, input, input_length,
1267 hash, hash_size, hash_length );
1268 if( status != PSA_ERROR_NOT_SUPPORTED )
1269 return( status );
1270#endif
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001271 (void) status;
1272 (void) alg;
1273 (void) input;
1274 (void) input_length;
1275 (void) hash;
1276 (void) hash_size;
1277 (void) hash_length;
Steven Cooreman1e582352021-02-18 17:24:37 +01001278
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001279 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman1e582352021-02-18 17:24:37 +01001280}
1281
1282psa_status_t psa_driver_wrapper_hash_setup(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001283 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001284 psa_algorithm_t alg )
1285{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001286 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001287
Steven Cooreman1e582352021-02-18 17:24:37 +01001288 /* Try setup on accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001289#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001290 status = mbedtls_test_transparent_hash_setup(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001291 &operation->ctx.test_driver_ctx, alg );
Steven Cooremanf7638102021-03-04 15:14:36 +01001292 if( status == PSA_SUCCESS )
1293 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1294
1295 if( status != PSA_ERROR_NOT_SUPPORTED )
1296 return( status );
1297#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001298
1299 /* If software fallback is compiled in, try fallback */
1300#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001301 status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
Steven Cooreman1e582352021-02-18 17:24:37 +01001302 if( status == PSA_SUCCESS )
Steven Cooreman1e582352021-02-18 17:24:37 +01001303 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Steven Cooreman1e582352021-02-18 17:24:37 +01001304
1305 if( status != PSA_ERROR_NOT_SUPPORTED )
1306 return( status );
1307#endif
1308 /* Nothing left to try if we fall through here */
1309 (void) status;
1310 (void) operation;
1311 (void) alg;
1312 return( PSA_ERROR_NOT_SUPPORTED );
1313}
1314
1315psa_status_t psa_driver_wrapper_hash_clone(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001316 const psa_hash_operation_t *source_operation,
1317 psa_hash_operation_t *target_operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001318{
Steven Cooreman1e582352021-02-18 17:24:37 +01001319 switch( source_operation->id )
1320 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001321#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1322 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1323 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1324 return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1325 &target_operation->ctx.mbedtls_ctx ) );
1326#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001327#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001328 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1329 target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Ronald Cron7f13fa22021-04-13 12:41:34 +02001330 return( mbedtls_test_transparent_hash_clone(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001331 &source_operation->ctx.test_driver_ctx,
1332 &target_operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001333#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001334 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001335 (void) target_operation;
1336 return( PSA_ERROR_BAD_STATE );
1337 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001338}
1339
1340psa_status_t psa_driver_wrapper_hash_update(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001341 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001342 const uint8_t *input,
1343 size_t input_length )
1344{
Steven Cooreman1e582352021-02-18 17:24:37 +01001345 switch( operation->id )
1346 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001347#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1348 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1349 return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
1350 input, input_length ) );
1351#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001352#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001353 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001354 return( mbedtls_test_transparent_hash_update(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001355 &operation->ctx.test_driver_ctx,
1356 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001357#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001358 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001359 (void) input;
1360 (void) input_length;
1361 return( PSA_ERROR_BAD_STATE );
1362 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001363}
1364
1365psa_status_t psa_driver_wrapper_hash_finish(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001366 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001367 uint8_t *hash,
1368 size_t hash_size,
1369 size_t *hash_length )
1370{
Steven Cooreman1e582352021-02-18 17:24:37 +01001371 switch( operation->id )
1372 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001373#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1374 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1375 return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1376 hash, hash_size, hash_length ) );
1377#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001378#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001379 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001380 return( mbedtls_test_transparent_hash_finish(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001381 &operation->ctx.test_driver_ctx,
1382 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001383#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001384 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001385 (void) hash;
1386 (void) hash_size;
1387 (void) hash_length;
1388 return( PSA_ERROR_BAD_STATE );
1389 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001390}
1391
1392psa_status_t psa_driver_wrapper_hash_abort(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001393 psa_hash_operation_t *operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001394{
Steven Cooreman1e582352021-02-18 17:24:37 +01001395 switch( operation->id )
1396 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001397#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1398 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1399 return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1400#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001401#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001402 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001403 return( mbedtls_test_transparent_hash_abort(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001404 &operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001405#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001406 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001407 return( PSA_ERROR_BAD_STATE );
1408 }
1409}
1410
Ronald Cronde822812021-03-17 16:08:20 +01001411psa_status_t psa_driver_wrapper_aead_encrypt(
1412 const psa_key_attributes_t *attributes,
1413 const uint8_t *key_buffer, size_t key_buffer_size,
1414 psa_algorithm_t alg,
1415 const uint8_t *nonce, size_t nonce_length,
1416 const uint8_t *additional_data, size_t additional_data_length,
1417 const uint8_t *plaintext, size_t plaintext_length,
1418 uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length )
1419{
1420 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1421 psa_key_location_t location =
1422 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1423
1424 switch( location )
1425 {
1426 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1427 /* Key is stored in the slot in export representation, so
1428 * cycle through all known transparent accelerators */
1429
1430#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1431#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001432 status = mbedtls_test_transparent_aead_encrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001433 attributes, key_buffer, key_buffer_size,
1434 alg,
1435 nonce, nonce_length,
1436 additional_data, additional_data_length,
1437 plaintext, plaintext_length,
1438 ciphertext, ciphertext_size, ciphertext_length );
1439 /* Declared with fallback == true */
1440 if( status != PSA_ERROR_NOT_SUPPORTED )
1441 return( status );
1442#endif /* PSA_CRYPTO_DRIVER_TEST */
1443#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1444
1445 /* Fell through, meaning no accelerator supports this operation */
1446 return( mbedtls_psa_aead_encrypt(
1447 attributes, key_buffer, key_buffer_size,
1448 alg,
1449 nonce, nonce_length,
1450 additional_data, additional_data_length,
1451 plaintext, plaintext_length,
1452 ciphertext, ciphertext_size, ciphertext_length ) );
1453
1454 /* Add cases for opaque driver here */
1455
1456 default:
1457 /* Key is declared with a lifetime not known to us */
1458 (void)status;
1459 return( PSA_ERROR_INVALID_ARGUMENT );
1460 }
1461}
1462
1463psa_status_t psa_driver_wrapper_aead_decrypt(
1464 const psa_key_attributes_t *attributes,
1465 const uint8_t *key_buffer, size_t key_buffer_size,
1466 psa_algorithm_t alg,
1467 const uint8_t *nonce, size_t nonce_length,
1468 const uint8_t *additional_data, size_t additional_data_length,
1469 const uint8_t *ciphertext, size_t ciphertext_length,
1470 uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length )
1471{
1472 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1473 psa_key_location_t location =
1474 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1475
1476 switch( location )
1477 {
1478 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1479 /* Key is stored in the slot in export representation, so
1480 * cycle through all known transparent accelerators */
1481
1482#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1483#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001484 status = mbedtls_test_transparent_aead_decrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001485 attributes, key_buffer, key_buffer_size,
1486 alg,
1487 nonce, nonce_length,
1488 additional_data, additional_data_length,
1489 ciphertext, ciphertext_length,
1490 plaintext, plaintext_size, plaintext_length );
1491 /* Declared with fallback == true */
1492 if( status != PSA_ERROR_NOT_SUPPORTED )
1493 return( status );
1494#endif /* PSA_CRYPTO_DRIVER_TEST */
1495#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1496
1497 /* Fell through, meaning no accelerator supports this operation */
1498 return( mbedtls_psa_aead_decrypt(
1499 attributes, key_buffer, key_buffer_size,
1500 alg,
1501 nonce, nonce_length,
1502 additional_data, additional_data_length,
1503 ciphertext, ciphertext_length,
1504 plaintext, plaintext_size, plaintext_length ) );
1505
1506 /* Add cases for opaque driver here */
1507
1508 default:
1509 /* Key is declared with a lifetime not known to us */
1510 (void)status;
1511 return( PSA_ERROR_INVALID_ARGUMENT );
1512 }
1513}
Steven Cooremand13a70f2021-03-19 15:24:23 +01001514
1515
1516/*
1517 * MAC functions
1518 */
1519psa_status_t psa_driver_wrapper_mac_compute(
1520 const psa_key_attributes_t *attributes,
1521 const uint8_t *key_buffer,
1522 size_t key_buffer_size,
1523 psa_algorithm_t alg,
1524 const uint8_t *input,
1525 size_t input_length,
1526 uint8_t *mac,
1527 size_t mac_size,
1528 size_t *mac_length )
1529{
1530 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1531 psa_key_location_t location =
1532 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1533
1534 switch( location )
1535 {
1536 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1537 /* Key is stored in the slot in export representation, so
1538 * cycle through all known transparent accelerators */
1539#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1540#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001541 status = mbedtls_test_transparent_mac_compute(
Steven Cooremand13a70f2021-03-19 15:24:23 +01001542 attributes, key_buffer, key_buffer_size, alg,
1543 input, input_length,
1544 mac, mac_size, mac_length );
1545 /* Declared with fallback == true */
1546 if( status != PSA_ERROR_NOT_SUPPORTED )
1547 return( status );
1548#endif /* PSA_CRYPTO_DRIVER_TEST */
1549#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1550#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1551 /* Fell through, meaning no accelerator supports this operation */
1552 status = mbedtls_psa_mac_compute(
1553 attributes, key_buffer, key_buffer_size, alg,
1554 input, input_length,
1555 mac, mac_size, mac_length );
1556 if( status != PSA_ERROR_NOT_SUPPORTED )
1557 return( status );
1558#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1559 return( PSA_ERROR_NOT_SUPPORTED );
1560
1561 /* Add cases for opaque driver here */
1562#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1563#if defined(PSA_CRYPTO_DRIVER_TEST)
1564 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001565 status = mbedtls_test_opaque_mac_compute(
Steven Cooremand13a70f2021-03-19 15:24:23 +01001566 attributes, key_buffer, key_buffer_size, alg,
1567 input, input_length,
1568 mac, mac_size, mac_length );
1569 return( status );
1570#endif /* PSA_CRYPTO_DRIVER_TEST */
1571#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1572 default:
1573 /* Key is declared with a lifetime not known to us */
1574 (void) key_buffer;
1575 (void) key_buffer_size;
1576 (void) alg;
1577 (void) input;
1578 (void) input_length;
1579 (void) mac;
1580 (void) mac_size;
1581 (void) mac_length;
1582 (void) status;
1583 return( PSA_ERROR_INVALID_ARGUMENT );
1584 }
1585}
1586
1587psa_status_t psa_driver_wrapper_mac_sign_setup(
1588 psa_mac_operation_t *operation,
1589 const psa_key_attributes_t *attributes,
1590 const uint8_t *key_buffer,
1591 size_t key_buffer_size,
1592 psa_algorithm_t alg )
1593{
1594 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1595 psa_key_location_t location =
1596 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1597
1598 switch( location )
1599 {
1600 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1601 /* Key is stored in the slot in export representation, so
1602 * cycle through all known transparent accelerators */
1603#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1604#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001605 status = mbedtls_test_transparent_mac_sign_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001606 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001607 attributes,
1608 key_buffer, key_buffer_size,
1609 alg );
1610 /* Declared with fallback == true */
1611 if( status == PSA_SUCCESS )
1612 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1613
1614 if( status != PSA_ERROR_NOT_SUPPORTED )
1615 return( status );
1616#endif /* PSA_CRYPTO_DRIVER_TEST */
1617#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1618#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1619 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001620 status = mbedtls_psa_mac_sign_setup( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001621 attributes,
1622 key_buffer, key_buffer_size,
1623 alg );
1624 if( status == PSA_SUCCESS )
1625 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1626
1627 if( status != PSA_ERROR_NOT_SUPPORTED )
1628 return( status );
1629#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1630 return( PSA_ERROR_NOT_SUPPORTED );
1631
1632 /* Add cases for opaque driver here */
1633#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1634#if defined(PSA_CRYPTO_DRIVER_TEST)
1635 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001636 status = mbedtls_test_opaque_mac_sign_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001637 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001638 attributes,
1639 key_buffer, key_buffer_size,
1640 alg );
1641
1642 if( status == PSA_SUCCESS )
1643 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1644
1645 return( status );
1646#endif /* PSA_CRYPTO_DRIVER_TEST */
1647#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1648 default:
1649 /* Key is declared with a lifetime not known to us */
1650 (void) status;
1651 (void) key_buffer;
1652 (void) key_buffer_size;
1653 (void) alg;
1654 return( PSA_ERROR_INVALID_ARGUMENT );
1655 }
1656}
1657
1658psa_status_t psa_driver_wrapper_mac_verify_setup(
1659 psa_mac_operation_t *operation,
1660 const psa_key_attributes_t *attributes,
1661 const uint8_t *key_buffer,
1662 size_t key_buffer_size,
1663 psa_algorithm_t alg )
1664{
1665 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1666 psa_key_location_t location =
1667 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1668
1669 switch( location )
1670 {
1671 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1672 /* Key is stored in the slot in export representation, so
1673 * cycle through all known transparent accelerators */
1674#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1675#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001676 status = mbedtls_test_transparent_mac_verify_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001677 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001678 attributes,
1679 key_buffer, key_buffer_size,
1680 alg );
1681 /* Declared with fallback == true */
1682 if( status == PSA_SUCCESS )
1683 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1684
1685 if( status != PSA_ERROR_NOT_SUPPORTED )
1686 return( status );
1687#endif /* PSA_CRYPTO_DRIVER_TEST */
1688#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1689#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1690 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001691 status = mbedtls_psa_mac_verify_setup( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001692 attributes,
1693 key_buffer, key_buffer_size,
1694 alg );
1695 if( status == PSA_SUCCESS )
1696 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1697
1698 if( status != PSA_ERROR_NOT_SUPPORTED )
1699 return( status );
1700#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1701 return( PSA_ERROR_NOT_SUPPORTED );
1702
1703 /* Add cases for opaque driver here */
1704#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1705#if defined(PSA_CRYPTO_DRIVER_TEST)
1706 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001707 status = mbedtls_test_opaque_mac_verify_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001708 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001709 attributes,
1710 key_buffer, key_buffer_size,
1711 alg );
1712
1713 if( status == PSA_SUCCESS )
1714 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1715
1716 return( status );
1717#endif /* PSA_CRYPTO_DRIVER_TEST */
1718#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1719 default:
1720 /* Key is declared with a lifetime not known to us */
1721 (void) status;
1722 (void) key_buffer;
1723 (void) key_buffer_size;
1724 (void) alg;
1725 return( PSA_ERROR_INVALID_ARGUMENT );
1726 }
1727}
1728
1729psa_status_t psa_driver_wrapper_mac_update(
1730 psa_mac_operation_t *operation,
1731 const uint8_t *input,
1732 size_t input_length )
1733{
1734 switch( operation->id )
1735 {
1736#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1737 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001738 return( mbedtls_psa_mac_update( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001739 input, input_length ) );
1740#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1741
1742#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1743#if defined(PSA_CRYPTO_DRIVER_TEST)
1744 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001745 return( mbedtls_test_transparent_mac_update(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001746 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001747 input, input_length ) );
1748
1749 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001750 return( mbedtls_test_opaque_mac_update(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001751 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001752 input, input_length ) );
1753#endif /* PSA_CRYPTO_DRIVER_TEST */
1754#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1755 default:
1756 (void) input;
1757 (void) input_length;
1758 return( PSA_ERROR_INVALID_ARGUMENT );
1759 }
1760}
1761
1762psa_status_t psa_driver_wrapper_mac_sign_finish(
1763 psa_mac_operation_t *operation,
1764 uint8_t *mac,
1765 size_t mac_size,
1766 size_t *mac_length )
1767{
1768 switch( operation->id )
1769 {
1770#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1771 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001772 return( mbedtls_psa_mac_sign_finish( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001773 mac, mac_size, mac_length ) );
1774#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1775
1776#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1777#if defined(PSA_CRYPTO_DRIVER_TEST)
1778 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001779 return( mbedtls_test_transparent_mac_sign_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001780 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001781 mac, mac_size, mac_length ) );
1782
1783 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001784 return( mbedtls_test_opaque_mac_sign_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001785 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001786 mac, mac_size, mac_length ) );
1787#endif /* PSA_CRYPTO_DRIVER_TEST */
1788#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1789 default:
1790 (void) mac;
1791 (void) mac_size;
1792 (void) mac_length;
1793 return( PSA_ERROR_INVALID_ARGUMENT );
1794 }
1795}
1796
1797psa_status_t psa_driver_wrapper_mac_verify_finish(
1798 psa_mac_operation_t *operation,
1799 const uint8_t *mac,
1800 size_t mac_length )
1801{
1802 switch( operation->id )
1803 {
1804#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1805 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001806 return( mbedtls_psa_mac_verify_finish( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001807 mac, mac_length ) );
1808#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1809
1810#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1811#if defined(PSA_CRYPTO_DRIVER_TEST)
1812 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001813 return( mbedtls_test_transparent_mac_verify_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001814 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001815 mac, mac_length ) );
1816
1817 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001818 return( mbedtls_test_opaque_mac_verify_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001819 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001820 mac, mac_length ) );
1821#endif /* PSA_CRYPTO_DRIVER_TEST */
1822#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1823 default:
1824 (void) mac;
1825 (void) mac_length;
1826 return( PSA_ERROR_INVALID_ARGUMENT );
1827 }
1828}
1829
1830psa_status_t psa_driver_wrapper_mac_abort(
1831 psa_mac_operation_t *operation )
1832{
Steven Cooremand13a70f2021-03-19 15:24:23 +01001833 switch( operation->id )
1834 {
1835#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1836 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooremane6804192021-03-19 18:28:56 +01001837 return( mbedtls_psa_mac_abort( &operation->ctx.mbedtls_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001838#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1839
1840#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1841#if defined(PSA_CRYPTO_DRIVER_TEST)
1842 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001843 return( mbedtls_test_transparent_mac_abort(
Steven Cooremane6804192021-03-19 18:28:56 +01001844 &operation->ctx.transparent_test_driver_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001845 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001846 return( mbedtls_test_opaque_mac_abort(
Steven Cooremane6804192021-03-19 18:28:56 +01001847 &operation->ctx.opaque_test_driver_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001848#endif /* PSA_CRYPTO_DRIVER_TEST */
1849#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1850 default:
Steven Cooremane6804192021-03-19 18:28:56 +01001851 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001852 }
Steven Cooremand13a70f2021-03-19 15:24:23 +01001853}
Gilles Peskine1905a242021-04-24 13:19:45 +02001854
1855#endif /* MBEDTLS_PSA_CRYPTO_C */