blob: 56c2b9f65a0d96ecf2ed4f0a8c81c569689659ea [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 */
104 /* Fell through, meaning no accelerator supports this operation */
gabor-mezei-armf3c5c862021-05-05 14:18:36 +0200105 return( psa_sign_message_builtin( attributes,
106 key_buffer,
107 key_buffer_size,
108 alg,
109 input,
110 input_length,
111 signature,
112 signature_size,
113 signature_length ) );
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200114
115 /* Add cases for opaque driver here */
116#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
117#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm77588fb2021-04-27 18:52:51 +0200118 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200119 return( mbedtls_test_opaque_signature_sign_message(
120 attributes,
121 key_buffer,
122 key_buffer_size,
123 alg,
124 input,
125 input_length,
126 signature,
127 signature_size,
128 signature_length ) );
129#endif /* PSA_CRYPTO_DRIVER_TEST */
130#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
131 default:
132 /* Key is declared with a lifetime not known to us */
133 (void)status;
134 return( PSA_ERROR_INVALID_ARGUMENT );
135 }
136}
137
138psa_status_t psa_driver_wrapper_verify_message(
139 const psa_key_attributes_t *attributes,
140 const uint8_t *key_buffer,
141 size_t key_buffer_size,
142 psa_algorithm_t alg,
143 const uint8_t *input,
144 size_t input_length,
145 const uint8_t *signature,
146 size_t signature_length )
147{
148 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200149 psa_key_location_t location =
150 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
151
152 switch( location )
153 {
154 case PSA_KEY_LOCATION_LOCAL_STORAGE:
155 /* Key is stored in the slot in export representation, so
156 * cycle through all known transparent accelerators */
157#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
158#if defined(PSA_CRYPTO_DRIVER_TEST)
159 status = mbedtls_test_transparent_signature_verify_message(
160 attributes,
161 key_buffer,
162 key_buffer_size,
163 alg,
164 input,
165 input_length,
166 signature,
167 signature_length );
168 /* Declared with fallback == true */
169 if( status != PSA_ERROR_NOT_SUPPORTED )
170 return( status );
171#endif /* PSA_CRYPTO_DRIVER_TEST */
172#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
173
gabor-mezei-armf3c5c862021-05-05 14:18:36 +0200174 return( psa_verify_message_builtin( attributes,
175 key_buffer,
176 key_buffer_size,
177 alg,
178 input,
179 input_length,
180 signature,
181 signature_length ) );
gabor-mezei-armc53f4f62021-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-arm77588fb2021-04-27 18:52:51 +0200186 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-armc53f4f62021-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 ) );
196#endif /* PSA_CRYPTO_DRIVER_TEST */
197#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
198 default:
199 /* Key is declared with a lifetime not known to us */
200 (void)status;
201 return( PSA_ERROR_INVALID_ARGUMENT );
202 }
203}
204
Ronald Cron9f17aa42020-12-08 17:07:25 +0100205psa_status_t psa_driver_wrapper_sign_hash(
206 const psa_key_attributes_t *attributes,
207 const uint8_t *key_buffer, size_t key_buffer_size,
208 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
209 uint8_t *signature, size_t signature_size, size_t *signature_length )
Steven Cooremancd84cb42020-07-16 20:28:36 +0200210{
Steven Cooreman7a250572020-07-17 16:43:05 +0200211 /* Try dynamically-registered SE interface first */
212#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
213 const psa_drv_se_t *drv;
214 psa_drv_se_context_t *drv_context;
215
Ronald Cron9f17aa42020-12-08 17:07:25 +0100216 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman7a250572020-07-17 16:43:05 +0200217 {
218 if( drv->asymmetric == NULL ||
219 drv->asymmetric->p_sign == NULL )
220 {
221 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200222 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman7a250572020-07-17 16:43:05 +0200223 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100224 return( drv->asymmetric->p_sign(
225 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
226 alg, hash, hash_length,
227 signature, signature_size, signature_length ) );
Steven Cooreman7a250572020-07-17 16:43:05 +0200228 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200229#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman7a250572020-07-17 16:43:05 +0200230
Ronald Cronfce9df22020-12-08 18:06:03 +0100231 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100232 psa_key_location_t location =
233 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200234
235 switch( location )
236 {
237 case PSA_KEY_LOCATION_LOCAL_STORAGE:
238 /* Key is stored in the slot in export representation, so
239 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100240#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200241#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200242 status = mbedtls_test_transparent_signature_sign_hash( attributes,
Ronald Cron9f17aa42020-12-08 17:07:25 +0100243 key_buffer,
244 key_buffer_size,
Steven Cooremancd84cb42020-07-16 20:28:36 +0200245 alg,
246 hash,
247 hash_length,
248 signature,
249 signature_size,
250 signature_length );
251 /* Declared with fallback == true */
252 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200253 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200254#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100255#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200256 /* Fell through, meaning no accelerator supports this operation */
gabor-mezei-armf3c5c862021-05-05 14:18:36 +0200257 return( psa_sign_hash_builtin( attributes,
258 key_buffer,
259 key_buffer_size,
260 alg,
261 hash,
262 hash_length,
263 signature,
264 signature_size,
265 signature_length ) );
Ronald Cronfce9df22020-12-08 18:06:03 +0100266
Steven Cooremancd84cb42020-07-16 20:28:36 +0200267 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100268#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200269#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100270 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200271 return( mbedtls_test_opaque_signature_sign_hash( attributes,
272 key_buffer,
273 key_buffer_size,
274 alg,
275 hash,
276 hash_length,
277 signature,
278 signature_size,
279 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200280#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100281#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200282 default:
283 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100284 (void)status;
285 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200286 }
Steven Cooremancd84cb42020-07-16 20:28:36 +0200287}
288
Ronald Cron9f17aa42020-12-08 17:07:25 +0100289psa_status_t psa_driver_wrapper_verify_hash(
290 const psa_key_attributes_t *attributes,
291 const uint8_t *key_buffer, size_t key_buffer_size,
292 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
293 const uint8_t *signature, size_t signature_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200294{
Steven Cooreman55ae2172020-07-17 19:46:15 +0200295 /* Try dynamically-registered SE interface first */
296#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
297 const psa_drv_se_t *drv;
298 psa_drv_se_context_t *drv_context;
299
Ronald Cron9f17aa42020-12-08 17:07:25 +0100300 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200301 {
302 if( drv->asymmetric == NULL ||
303 drv->asymmetric->p_verify == NULL )
304 {
305 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200306 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200307 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100308 return( drv->asymmetric->p_verify(
309 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
310 alg, hash, hash_length,
311 signature, signature_length ) );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200312 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200313#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200314
Ronald Cronfce9df22020-12-08 18:06:03 +0100315 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100316 psa_key_location_t location =
317 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200318
319 switch( location )
320 {
321 case PSA_KEY_LOCATION_LOCAL_STORAGE:
322 /* Key is stored in the slot in export representation, so
323 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100324#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200325#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200326 status = mbedtls_test_transparent_signature_verify_hash(
327 attributes,
328 key_buffer,
329 key_buffer_size,
330 alg,
331 hash,
332 hash_length,
333 signature,
334 signature_length );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200335 /* Declared with fallback == true */
336 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200337 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200338#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100339#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
340
gabor-mezei-armf3c5c862021-05-05 14:18:36 +0200341 return( psa_verify_hash_builtin( attributes,
342 key_buffer,
343 key_buffer_size,
344 alg,
345 hash,
346 hash_length,
347 signature,
348 signature_length ) );
Ronald Cronfce9df22020-12-08 18:06:03 +0100349
Steven Cooreman55ae2172020-07-17 19:46:15 +0200350 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100351#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200352#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100353 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200354 return( mbedtls_test_opaque_signature_verify_hash( attributes,
355 key_buffer,
356 key_buffer_size,
357 alg,
358 hash,
359 hash_length,
360 signature,
361 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200362#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100363#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200364 default:
365 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100366 (void)status;
367 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200368 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200369}
370
Steven Cooremanb938b0b2021-04-06 13:08:42 +0200371/** Get the key buffer size required to store the key material of a key
372 * associated with an opaque driver without storage.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200373 *
Ronald Cron31216282020-12-05 18:47:56 +0100374 * \param[in] attributes The key attributes.
375 * \param[out] key_buffer_size Minimum buffer size to contain the key material
Steven Cooreman56250fd2020-09-04 13:07:15 +0200376 *
377 * \retval #PSA_SUCCESS
Ronald Cron31216282020-12-05 18:47:56 +0100378 * The minimum size for a buffer to contain the key material has been
379 * returned successfully.
380 * \retval #PSA_ERROR_INVALID_ARGUMENT
381 * The size in bits of the key is not valid.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200382 * \retval #PSA_ERROR_NOT_SUPPORTED
Ronald Cron31216282020-12-05 18:47:56 +0100383 * The type and/or the size in bits of the key or the combination of
384 * the two is not supported.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200385 */
Ronald Cron9df74be2020-12-05 19:15:23 +0100386psa_status_t psa_driver_wrapper_get_key_buffer_size(
Ronald Cron31216282020-12-05 18:47:56 +0100387 const psa_key_attributes_t *attributes,
388 size_t *key_buffer_size )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200389{
John Durkop2c618352020-09-22 06:54:01 -0700390 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
391 psa_key_type_t key_type = attributes->core.type;
392 size_t key_bits = attributes->core.bits;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200393
Ronald Cron31216282020-12-05 18:47:56 +0100394 *key_buffer_size = 0;
John Durkop2c618352020-09-22 06:54:01 -0700395 switch( location )
396 {
John Durkop2c618352020-09-22 06:54:01 -0700397#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100398 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100399#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS)
400 /* Emulate property 'builtin_key_size' */
401 if( psa_key_id_is_builtin(
402 MBEDTLS_SVC_KEY_ID_GET_KEY_ID(
403 psa_get_key_id( attributes ) ) ) )
404 {
Steven Cooreman203bcbb2021-03-18 17:17:40 +0100405 *key_buffer_size = sizeof( psa_drv_slot_number_t );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100406 return( PSA_SUCCESS );
407 }
408#endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200409 *key_buffer_size = mbedtls_test_size_function( key_type, key_bits );
Ronald Cronb0737da2021-04-14 10:55:34 +0200410 return( ( *key_buffer_size != 0 ) ?
411 PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED );
John Durkop2c618352020-09-22 06:54:01 -0700412#endif /* PSA_CRYPTO_DRIVER_TEST */
413
414 default:
Ronald Cron9df74be2020-12-05 19:15:23 +0100415 (void)key_type;
416 (void)key_bits;
Steven Cooreman56250fd2020-09-04 13:07:15 +0200417 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200418 }
419}
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200420
Ronald Cron977c2472020-10-13 08:32:21 +0200421psa_status_t psa_driver_wrapper_generate_key(
422 const psa_key_attributes_t *attributes,
423 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200424{
Ronald Cron977c2472020-10-13 08:32:21 +0200425 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
426 psa_key_location_t location =
427 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
428
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200429 /* Try dynamically-registered SE interface first */
430#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
431 const psa_drv_se_t *drv;
432 psa_drv_se_context_t *drv_context;
433
Ronald Cron977c2472020-10-13 08:32:21 +0200434 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200435 {
436 size_t pubkey_length = 0; /* We don't support this feature yet */
437 if( drv->key_management == NULL ||
438 drv->key_management->p_generate == NULL )
439 {
440 /* Key is defined as being in SE, but we have no way to generate it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200441 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200442 }
443 return( drv->key_management->p_generate(
Ronald Cron977c2472020-10-13 08:32:21 +0200444 drv_context,
445 *( (psa_key_slot_number_t *)key_buffer ),
Ronald Cronea0f8a62020-11-25 17:52:23 +0100446 attributes, NULL, 0, &pubkey_length ) );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200447 }
448#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
449
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200450 switch( location )
451 {
452 case PSA_KEY_LOCATION_LOCAL_STORAGE:
Ronald Cron977c2472020-10-13 08:32:21 +0200453#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200454 /* Transparent drivers are limited to generating asymmetric keys */
Ronald Cron977c2472020-10-13 08:32:21 +0200455 if( PSA_KEY_TYPE_IS_ASYMMETRIC( attributes->core.type ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200456 {
Ronald Cron977c2472020-10-13 08:32:21 +0200457 /* Cycle through all known transparent accelerators */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200458#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200459 status = mbedtls_test_transparent_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200460 attributes, key_buffer, key_buffer_size,
461 key_buffer_length );
462 /* Declared with fallback == true */
463 if( status != PSA_ERROR_NOT_SUPPORTED )
464 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200465#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200466 }
467#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
468
469 /* Software fallback */
470 status = psa_generate_key_internal(
471 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200472 break;
Ronald Cron977c2472020-10-13 08:32:21 +0200473
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200474 /* Add cases for opaque driver here */
Ronald Cron977c2472020-10-13 08:32:21 +0200475#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200476#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100477 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200478 status = mbedtls_test_opaque_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200479 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200480 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200481#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200482#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
483
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200484 default:
485 /* Key is declared with a lifetime not known to us */
486 status = PSA_ERROR_INVALID_ARGUMENT;
487 break;
488 }
489
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200490 return( status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200491}
492
Ronald Cron83282872020-11-22 14:02:39 +0100493psa_status_t psa_driver_wrapper_import_key(
494 const psa_key_attributes_t *attributes,
495 const uint8_t *data,
496 size_t data_length,
497 uint8_t *key_buffer,
498 size_t key_buffer_size,
499 size_t *key_buffer_length,
500 size_t *bits )
Steven Cooreman04524762020-10-13 17:43:44 +0200501{
Steven Cooreman04524762020-10-13 17:43:44 +0200502 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cronbf33c932020-11-28 18:06:53 +0100503 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
504 psa_get_key_lifetime( attributes ) );
Steven Cooreman04524762020-10-13 17:43:44 +0200505
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100506 /* Try dynamically-registered SE interface first */
507#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
508 const psa_drv_se_t *drv;
509 psa_drv_se_context_t *drv_context;
510
511 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
512 {
513 if( drv->key_management == NULL ||
514 drv->key_management->p_import == NULL )
515 return( PSA_ERROR_NOT_SUPPORTED );
516
517 /* The driver should set the number of key bits, however in
518 * case it doesn't, we initialize bits to an invalid value. */
519 *bits = PSA_MAX_KEY_BITS + 1;
520 status = drv->key_management->p_import(
521 drv_context,
522 *( (psa_key_slot_number_t *)key_buffer ),
523 attributes, data, data_length, bits );
524
525 if( status != PSA_SUCCESS )
526 return( status );
527
528 if( (*bits) > PSA_MAX_KEY_BITS )
529 return( PSA_ERROR_NOT_SUPPORTED );
530
531 return( PSA_SUCCESS );
532 }
533#endif /* PSA_CRYPTO_SE_C */
534
Ronald Cronbf33c932020-11-28 18:06:53 +0100535 switch( location )
536 {
537 case PSA_KEY_LOCATION_LOCAL_STORAGE:
538 /* Key is stored in the slot in export representation, so
539 * cycle through all known transparent accelerators */
540#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
541#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200542 status = mbedtls_test_transparent_import_key(
543 attributes,
544 data, data_length,
545 key_buffer, key_buffer_size,
546 key_buffer_length, bits );
Ronald Cronbf33c932020-11-28 18:06:53 +0100547 /* Declared with fallback == true */
548 if( status != PSA_ERROR_NOT_SUPPORTED )
549 return( status );
550#endif /* PSA_CRYPTO_DRIVER_TEST */
551#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
552 /* Fell through, meaning no accelerator supports this operation */
553 return( psa_import_key_into_slot( attributes,
554 data, data_length,
555 key_buffer, key_buffer_size,
556 key_buffer_length, bits ) );
557
558 default:
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100559 /* Importing a key with external storage in not yet supported.
560 * Return in error indicating that the lifetime is not valid. */
Ronald Cronbf33c932020-11-28 18:06:53 +0100561 (void)status;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100562 return( PSA_ERROR_INVALID_ARGUMENT );
Ronald Cronbf33c932020-11-28 18:06:53 +0100563 }
564
Steven Cooreman04524762020-10-13 17:43:44 +0200565}
566
Ronald Cron67227982020-11-26 15:16:05 +0100567psa_status_t psa_driver_wrapper_export_key(
568 const psa_key_attributes_t *attributes,
569 const uint8_t *key_buffer, size_t key_buffer_size,
570 uint8_t *data, size_t data_size, size_t *data_length )
571
572{
573 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
574 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
575 psa_get_key_lifetime( attributes ) );
576
Ronald Cron152e3f82020-11-26 16:06:41 +0100577 /* Try dynamically-registered SE interface first */
578#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
579 const psa_drv_se_t *drv;
580 psa_drv_se_context_t *drv_context;
581
582 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
583 {
584 if( ( drv->key_management == NULL ) ||
585 ( drv->key_management->p_export == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100586 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100587 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100588 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100589
590 return( drv->key_management->p_export(
591 drv_context,
592 *( (psa_key_slot_number_t *)key_buffer ),
593 data, data_size, data_length ) );
594 }
595#endif /* PSA_CRYPTO_SE_C */
596
Ronald Cron67227982020-11-26 15:16:05 +0100597 switch( location )
598 {
599 case PSA_KEY_LOCATION_LOCAL_STORAGE:
600 return( psa_export_key_internal( attributes,
601 key_buffer,
602 key_buffer_size,
603 data,
604 data_size,
605 data_length ) );
606
607 /* Add cases for opaque driver here */
608#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
609#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100610 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200611 return( mbedtls_test_opaque_export_key( attributes,
612 key_buffer,
613 key_buffer_size,
614 data,
615 data_size,
616 data_length ) );
Ronald Cron67227982020-11-26 15:16:05 +0100617#endif /* PSA_CRYPTO_DRIVER_TEST */
618#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
619 default:
620 /* Key is declared with a lifetime not known to us */
621 return( status );
622 }
623}
624
Ronald Cron84cc9942020-11-25 14:30:05 +0100625psa_status_t psa_driver_wrapper_export_public_key(
626 const psa_key_attributes_t *attributes,
627 const uint8_t *key_buffer, size_t key_buffer_size,
628 uint8_t *data, size_t data_size, size_t *data_length )
629
Steven Cooremanb9b84422020-10-14 14:39:20 +0200630{
Steven Cooremanb9b84422020-10-14 14:39:20 +0200631 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Cron84cc9942020-11-25 14:30:05 +0100632 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
633 psa_get_key_lifetime( attributes ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200634
Ronald Cron152e3f82020-11-26 16:06:41 +0100635 /* Try dynamically-registered SE interface first */
636#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
637 const psa_drv_se_t *drv;
638 psa_drv_se_context_t *drv_context;
639
640 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
641 {
642 if( ( drv->key_management == NULL ) ||
643 ( drv->key_management->p_export_public == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100644 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100645 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100646 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100647
648 return( drv->key_management->p_export_public(
649 drv_context,
650 *( (psa_key_slot_number_t *)key_buffer ),
651 data, data_size, data_length ) );
652 }
653#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
654
Steven Cooremanb9b84422020-10-14 14:39:20 +0200655 switch( location )
656 {
657 case PSA_KEY_LOCATION_LOCAL_STORAGE:
658 /* Key is stored in the slot in export representation, so
659 * cycle through all known transparent accelerators */
Ronald Cron67227982020-11-26 15:16:05 +0100660#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200661#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200662 status = mbedtls_test_transparent_export_public_key(
663 attributes,
664 key_buffer,
665 key_buffer_size,
666 data,
667 data_size,
668 data_length );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200669 /* Declared with fallback == true */
670 if( status != PSA_ERROR_NOT_SUPPORTED )
671 return( status );
672#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100673#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200674 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron67227982020-11-26 15:16:05 +0100675 return( psa_export_public_key_internal( attributes,
676 key_buffer,
677 key_buffer_size,
678 data,
679 data_size,
680 data_length ) );
681
Steven Cooremanb9b84422020-10-14 14:39:20 +0200682 /* Add cases for opaque driver here */
Ronald Cron67227982020-11-26 15:16:05 +0100683#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200684#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100685 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200686 return( mbedtls_test_opaque_export_public_key( attributes,
687 key_buffer,
688 key_buffer_size,
689 data,
690 data_size,
691 data_length ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200692#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100693#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200694 default:
695 /* Key is declared with a lifetime not known to us */
696 return( status );
697 }
Steven Cooremanb9b84422020-10-14 14:39:20 +0200698}
699
Steven Cooreman6801f082021-02-19 17:21:22 +0100700psa_status_t psa_driver_wrapper_get_builtin_key(
701 psa_drv_slot_number_t slot_number,
702 psa_key_attributes_t *attributes,
703 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
704{
705 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
706 switch( location )
707 {
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100708#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100709 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200710 return( mbedtls_test_opaque_get_builtin_key(
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100711 slot_number,
712 attributes,
713 key_buffer, key_buffer_size, key_buffer_length ) );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100714#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman6801f082021-02-19 17:21:22 +0100715 default:
716 (void) slot_number;
717 (void) key_buffer;
718 (void) key_buffer_size;
719 (void) key_buffer_length;
720 return( PSA_ERROR_DOES_NOT_EXIST );
721 }
722}
723
Steven Cooreman37941cb2020-07-28 18:49:51 +0200724/*
725 * Cipher functions
726 */
727psa_status_t psa_driver_wrapper_cipher_encrypt(
728 psa_key_slot_t *slot,
729 psa_algorithm_t alg,
730 const uint8_t *input,
731 size_t input_length,
732 uint8_t *output,
733 size_t output_size,
734 size_t *output_length )
735{
736#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
737 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
738 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
739 psa_key_attributes_t attributes = {
740 .core = slot->attr
741 };
742
743 switch( location )
744 {
745 case PSA_KEY_LOCATION_LOCAL_STORAGE:
746 /* Key is stored in the slot in export representation, so
747 * cycle through all known transparent accelerators */
748#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200749 status = mbedtls_test_transparent_cipher_encrypt( &attributes,
750 slot->key.data,
751 slot->key.bytes,
752 alg,
753 input,
754 input_length,
755 output,
756 output_size,
757 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200758 /* Declared with fallback == true */
759 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200760 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200761#endif /* PSA_CRYPTO_DRIVER_TEST */
762 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200763 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200764 /* Add cases for opaque driver here */
765#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100766 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200767 return( mbedtls_test_opaque_cipher_encrypt( &attributes,
768 slot->key.data,
769 slot->key.bytes,
770 alg,
771 input,
772 input_length,
773 output,
774 output_size,
775 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200776#endif /* PSA_CRYPTO_DRIVER_TEST */
777 default:
778 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200779 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200780 }
781#else /* PSA_CRYPTO_DRIVER_PRESENT */
782 (void) slot;
783 (void) alg;
784 (void) input;
785 (void) input_length;
786 (void) output;
787 (void) output_size;
788 (void) output_length;
789
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200790 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200791#endif /* PSA_CRYPTO_DRIVER_PRESENT */
792}
793
794psa_status_t psa_driver_wrapper_cipher_decrypt(
795 psa_key_slot_t *slot,
796 psa_algorithm_t alg,
797 const uint8_t *input,
798 size_t input_length,
799 uint8_t *output,
800 size_t output_size,
801 size_t *output_length )
802{
803#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
804 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
805 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
806 psa_key_attributes_t attributes = {
807 .core = slot->attr
808 };
809
810 switch( location )
811 {
812 case PSA_KEY_LOCATION_LOCAL_STORAGE:
813 /* Key is stored in the slot in export representation, so
814 * cycle through all known transparent accelerators */
815#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200816 status = mbedtls_test_transparent_cipher_decrypt( &attributes,
817 slot->key.data,
818 slot->key.bytes,
819 alg,
820 input,
821 input_length,
822 output,
823 output_size,
824 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200825 /* Declared with fallback == true */
826 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200827 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200828#endif /* PSA_CRYPTO_DRIVER_TEST */
829 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200830 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200831 /* Add cases for opaque driver here */
832#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100833 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200834 return( mbedtls_test_opaque_cipher_decrypt( &attributes,
835 slot->key.data,
836 slot->key.bytes,
837 alg,
838 input,
839 input_length,
840 output,
841 output_size,
842 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200843#endif /* PSA_CRYPTO_DRIVER_TEST */
844 default:
845 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200846 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200847 }
848#else /* PSA_CRYPTO_DRIVER_PRESENT */
849 (void) slot;
850 (void) alg;
851 (void) input;
852 (void) input_length;
853 (void) output;
854 (void) output_size;
855 (void) output_length;
856
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200857 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200858#endif /* PSA_CRYPTO_DRIVER_PRESENT */
859}
860
861psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100862 psa_cipher_operation_t *operation,
863 const psa_key_attributes_t *attributes,
864 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200865 psa_algorithm_t alg )
866{
Ronald Cron0b805592020-12-14 18:08:20 +0100867 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Crona4af55f2020-12-14 14:36:06 +0100868 psa_key_location_t location =
869 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200870
Steven Cooreman37941cb2020-07-28 18:49:51 +0200871 switch( location )
872 {
873 case PSA_KEY_LOCATION_LOCAL_STORAGE:
874 /* Key is stored in the slot in export representation, so
875 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100876#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200877#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200878 status = mbedtls_test_transparent_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100879 &operation->ctx.transparent_test_driver_ctx,
880 attributes,
881 key_buffer,
882 key_buffer_size,
883 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200884 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200885 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100886 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200887
Ronald Cron0b805592020-12-14 18:08:20 +0100888 if( status != PSA_ERROR_NOT_SUPPORTED )
889 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200890#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100891#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100892#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200893 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100894 status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100895 attributes,
896 key_buffer,
897 key_buffer_size,
898 alg );
899 if( status == PSA_SUCCESS )
Ronald Cron6e412a72021-03-10 09:58:47 +0100900 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Ronald Cron49fafa92021-03-10 08:34:23 +0100901
Ronald Cron7b4154d2021-03-19 14:49:41 +0100902 if( status != PSA_ERROR_NOT_SUPPORTED )
903 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100904#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
905 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron0b805592020-12-14 18:08:20 +0100906
Steven Cooreman37941cb2020-07-28 18:49:51 +0200907 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100908#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200909#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100910 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200911 status = mbedtls_test_opaque_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100912 &operation->ctx.opaque_test_driver_ctx,
913 attributes,
914 key_buffer, key_buffer_size,
915 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200916
Steven Cooreman37941cb2020-07-28 18:49:51 +0200917 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100918 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200919
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200920 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200921#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100922#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200923 default:
924 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100925 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100926 (void)key_buffer;
927 (void)key_buffer_size;
928 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +0200929 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200930 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200931}
932
933psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100934 psa_cipher_operation_t *operation,
935 const psa_key_attributes_t *attributes,
936 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200937 psa_algorithm_t alg )
938{
Steven Cooreman37941cb2020-07-28 18:49:51 +0200939 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Crona4af55f2020-12-14 14:36:06 +0100940 psa_key_location_t location =
941 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200942
Steven Cooreman37941cb2020-07-28 18:49:51 +0200943 switch( location )
944 {
945 case PSA_KEY_LOCATION_LOCAL_STORAGE:
946 /* Key is stored in the slot in export representation, so
947 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100948#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200949#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200950 status = mbedtls_test_transparent_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100951 &operation->ctx.transparent_test_driver_ctx,
952 attributes,
953 key_buffer,
954 key_buffer_size,
955 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200956 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200957 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100958 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200959
Ronald Cron0b805592020-12-14 18:08:20 +0100960 if( status != PSA_ERROR_NOT_SUPPORTED )
961 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200962#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100963#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100964#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200965 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100966 status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100967 attributes,
968 key_buffer,
969 key_buffer_size,
970 alg );
971 if( status == PSA_SUCCESS )
972 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
973
974 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100975#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
976 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron49fafa92021-03-10 08:34:23 +0100977
Steven Cooreman37941cb2020-07-28 18:49:51 +0200978 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100979#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200980#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100981 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200982 status = mbedtls_test_opaque_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100983 &operation->ctx.opaque_test_driver_ctx,
984 attributes,
985 key_buffer, key_buffer_size,
986 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200987
Steven Cooreman37941cb2020-07-28 18:49:51 +0200988 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100989 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200990
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200991 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200992#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100993#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200994 default:
995 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100996 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100997 (void)key_buffer;
998 (void)key_buffer_size;
999 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +02001000 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001001 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001002}
1003
Steven Cooreman37941cb2020-07-28 18:49:51 +02001004psa_status_t psa_driver_wrapper_cipher_set_iv(
Ronald Cron6056fe82020-12-15 13:58:07 +01001005 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001006 const uint8_t *iv,
1007 size_t iv_length )
1008{
Ronald Cron49fafa92021-03-10 08:34:23 +01001009 switch( operation->id )
1010 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001011#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001012 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001013 return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001014 iv,
1015 iv_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001016#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001017
1018#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001019#if defined(PSA_CRYPTO_DRIVER_TEST)
1020 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001021 return( mbedtls_test_transparent_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001022 &operation->ctx.transparent_test_driver_ctx,
1023 iv, iv_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001024
Steven Cooreman37941cb2020-07-28 18:49:51 +02001025 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001026 return( mbedtls_test_opaque_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001027 &operation->ctx.opaque_test_driver_ctx,
1028 iv, iv_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001029#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001030#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001031 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001032
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001033 (void)iv;
1034 (void)iv_length;
1035
Ronald Crondd24c9b2020-12-15 14:10:01 +01001036 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001037}
1038
1039psa_status_t psa_driver_wrapper_cipher_update(
Ronald Cron6056fe82020-12-15 13:58:07 +01001040 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001041 const uint8_t *input,
1042 size_t input_length,
1043 uint8_t *output,
1044 size_t output_size,
1045 size_t *output_length )
1046{
Ronald Cron49fafa92021-03-10 08:34:23 +01001047 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001048 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001049#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001050 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001051 return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001052 input,
1053 input_length,
1054 output,
1055 output_size,
1056 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001057#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1058
Ronald Cron49fafa92021-03-10 08:34:23 +01001059#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001060#if defined(PSA_CRYPTO_DRIVER_TEST)
1061 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001062 return( mbedtls_test_transparent_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001063 &operation->ctx.transparent_test_driver_ctx,
1064 input, input_length,
1065 output, output_size, output_length ) );
1066
Steven Cooreman37941cb2020-07-28 18:49:51 +02001067 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001068 return( mbedtls_test_opaque_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001069 &operation->ctx.opaque_test_driver_ctx,
1070 input, input_length,
1071 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001072#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001073#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001074 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001075
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001076 (void)input;
1077 (void)input_length;
1078 (void)output;
1079 (void)output_size;
1080 (void)output_length;
1081
Ronald Crondd24c9b2020-12-15 14:10:01 +01001082 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001083}
1084
1085psa_status_t psa_driver_wrapper_cipher_finish(
Ronald Cron6056fe82020-12-15 13:58:07 +01001086 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001087 uint8_t *output,
1088 size_t output_size,
1089 size_t *output_length )
1090{
Ronald Cron49fafa92021-03-10 08:34:23 +01001091 switch( operation->id )
1092 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001093#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001094 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001095 return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001096 output,
1097 output_size,
1098 output_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 Cronc4bc12e2021-04-13 12:41:34 +02001104 return( mbedtls_test_transparent_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001105 &operation->ctx.transparent_test_driver_ctx,
1106 output, output_size, output_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 Cronc4bc12e2021-04-13 12:41:34 +02001109 return( mbedtls_test_opaque_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001110 &operation->ctx.opaque_test_driver_ctx,
1111 output, output_size, output_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)output;
1117 (void)output_size;
1118 (void)output_length;
1119
Ronald Crondd24c9b2020-12-15 14:10:01 +01001120 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001121}
1122
1123psa_status_t psa_driver_wrapper_cipher_abort(
Ronald Cron6056fe82020-12-15 13:58:07 +01001124 psa_cipher_operation_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001125{
Ronald Crondd24c9b2020-12-15 14:10:01 +01001126 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001127
Ronald Cron49fafa92021-03-10 08:34:23 +01001128 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001129 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001130#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001131 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001132 return( mbedtls_psa_cipher_abort( &operation->ctx.mbedtls_ctx ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001133#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron49fafa92021-03-10 08:34:23 +01001134
1135#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001136#if defined(PSA_CRYPTO_DRIVER_TEST)
1137 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001138 status = mbedtls_test_transparent_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001139 &operation->ctx.transparent_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001140 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001141 &operation->ctx.transparent_test_driver_ctx,
1142 sizeof( operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001143 return( status );
Ronald Cron49fafa92021-03-10 08:34:23 +01001144
Steven Cooreman37941cb2020-07-28 18:49:51 +02001145 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001146 status = mbedtls_test_opaque_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001147 &operation->ctx.opaque_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001148 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001149 &operation->ctx.opaque_test_driver_ctx,
1150 sizeof( operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001151 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001152#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001153#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001154 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001155
Ronald Cron49fafa92021-03-10 08:34:23 +01001156 (void)status;
Ronald Crondd24c9b2020-12-15 14:10:01 +01001157 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001158}
1159
Steven Cooreman1e582352021-02-18 17:24:37 +01001160/*
1161 * Hashing functions
1162 */
1163psa_status_t psa_driver_wrapper_hash_compute(
1164 psa_algorithm_t alg,
1165 const uint8_t *input,
1166 size_t input_length,
1167 uint8_t *hash,
1168 size_t hash_size,
1169 size_t *hash_length)
1170{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001171 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001172
1173 /* Try accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001174#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001175 status = mbedtls_test_transparent_hash_compute(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001176 alg, input, input_length, hash, hash_size, hash_length );
Steven Cooremanf7638102021-03-04 15:14:36 +01001177 if( status != PSA_ERROR_NOT_SUPPORTED )
1178 return( status );
1179#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001180
1181 /* If software fallback is compiled in, try fallback */
1182#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1183 status = mbedtls_psa_hash_compute( alg, input, input_length,
1184 hash, hash_size, hash_length );
1185 if( status != PSA_ERROR_NOT_SUPPORTED )
1186 return( status );
1187#endif
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001188 (void) status;
1189 (void) alg;
1190 (void) input;
1191 (void) input_length;
1192 (void) hash;
1193 (void) hash_size;
1194 (void) hash_length;
Steven Cooreman1e582352021-02-18 17:24:37 +01001195
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001196 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman1e582352021-02-18 17:24:37 +01001197}
1198
1199psa_status_t psa_driver_wrapper_hash_setup(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001200 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001201 psa_algorithm_t alg )
1202{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001203 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001204
Steven Cooreman1e582352021-02-18 17:24:37 +01001205 /* Try setup on accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001206#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001207 status = mbedtls_test_transparent_hash_setup(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001208 &operation->ctx.test_driver_ctx, alg );
Steven Cooremanf7638102021-03-04 15:14:36 +01001209 if( status == PSA_SUCCESS )
1210 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1211
1212 if( status != PSA_ERROR_NOT_SUPPORTED )
1213 return( status );
1214#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001215
1216 /* If software fallback is compiled in, try fallback */
1217#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001218 status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
Steven Cooreman1e582352021-02-18 17:24:37 +01001219 if( status == PSA_SUCCESS )
Steven Cooreman1e582352021-02-18 17:24:37 +01001220 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Steven Cooreman1e582352021-02-18 17:24:37 +01001221
1222 if( status != PSA_ERROR_NOT_SUPPORTED )
1223 return( status );
1224#endif
1225 /* Nothing left to try if we fall through here */
1226 (void) status;
1227 (void) operation;
1228 (void) alg;
1229 return( PSA_ERROR_NOT_SUPPORTED );
1230}
1231
1232psa_status_t psa_driver_wrapper_hash_clone(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001233 const psa_hash_operation_t *source_operation,
1234 psa_hash_operation_t *target_operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001235{
Steven Cooreman1e582352021-02-18 17:24:37 +01001236 switch( source_operation->id )
1237 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001238#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1239 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1240 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1241 return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1242 &target_operation->ctx.mbedtls_ctx ) );
1243#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001244#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001245 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1246 target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001247 return( mbedtls_test_transparent_hash_clone(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001248 &source_operation->ctx.test_driver_ctx,
1249 &target_operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001250#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001251 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001252 (void) target_operation;
1253 return( PSA_ERROR_BAD_STATE );
1254 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001255}
1256
1257psa_status_t psa_driver_wrapper_hash_update(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001258 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001259 const uint8_t *input,
1260 size_t input_length )
1261{
Steven Cooreman1e582352021-02-18 17:24:37 +01001262 switch( operation->id )
1263 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001264#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1265 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1266 return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
1267 input, input_length ) );
1268#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001269#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001270 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001271 return( mbedtls_test_transparent_hash_update(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001272 &operation->ctx.test_driver_ctx,
1273 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001274#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001275 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001276 (void) input;
1277 (void) input_length;
1278 return( PSA_ERROR_BAD_STATE );
1279 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001280}
1281
1282psa_status_t psa_driver_wrapper_hash_finish(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001283 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001284 uint8_t *hash,
1285 size_t hash_size,
1286 size_t *hash_length )
1287{
Steven Cooreman1e582352021-02-18 17:24:37 +01001288 switch( operation->id )
1289 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001290#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1291 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1292 return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1293 hash, hash_size, hash_length ) );
1294#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001295#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001296 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001297 return( mbedtls_test_transparent_hash_finish(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001298 &operation->ctx.test_driver_ctx,
1299 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001300#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001301 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001302 (void) hash;
1303 (void) hash_size;
1304 (void) hash_length;
1305 return( PSA_ERROR_BAD_STATE );
1306 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001307}
1308
1309psa_status_t psa_driver_wrapper_hash_abort(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001310 psa_hash_operation_t *operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001311{
Steven Cooreman1e582352021-02-18 17:24:37 +01001312 switch( operation->id )
1313 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001314#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1315 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1316 return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1317#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001318#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001319 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001320 return( mbedtls_test_transparent_hash_abort(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001321 &operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001322#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001323 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001324 return( PSA_ERROR_BAD_STATE );
1325 }
1326}
1327
Ronald Cronde822812021-03-17 16:08:20 +01001328psa_status_t psa_driver_wrapper_aead_encrypt(
1329 const psa_key_attributes_t *attributes,
1330 const uint8_t *key_buffer, size_t key_buffer_size,
1331 psa_algorithm_t alg,
1332 const uint8_t *nonce, size_t nonce_length,
1333 const uint8_t *additional_data, size_t additional_data_length,
1334 const uint8_t *plaintext, size_t plaintext_length,
1335 uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length )
1336{
1337 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1338 psa_key_location_t location =
1339 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1340
1341 switch( location )
1342 {
1343 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1344 /* Key is stored in the slot in export representation, so
1345 * cycle through all known transparent accelerators */
1346
1347#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1348#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001349 status = mbedtls_test_transparent_aead_encrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001350 attributes, key_buffer, key_buffer_size,
1351 alg,
1352 nonce, nonce_length,
1353 additional_data, additional_data_length,
1354 plaintext, plaintext_length,
1355 ciphertext, ciphertext_size, ciphertext_length );
1356 /* Declared with fallback == true */
1357 if( status != PSA_ERROR_NOT_SUPPORTED )
1358 return( status );
1359#endif /* PSA_CRYPTO_DRIVER_TEST */
1360#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1361
1362 /* Fell through, meaning no accelerator supports this operation */
1363 return( mbedtls_psa_aead_encrypt(
1364 attributes, key_buffer, key_buffer_size,
1365 alg,
1366 nonce, nonce_length,
1367 additional_data, additional_data_length,
1368 plaintext, plaintext_length,
1369 ciphertext, ciphertext_size, ciphertext_length ) );
1370
1371 /* Add cases for opaque driver here */
1372
1373 default:
1374 /* Key is declared with a lifetime not known to us */
1375 (void)status;
1376 return( PSA_ERROR_INVALID_ARGUMENT );
1377 }
1378}
1379
1380psa_status_t psa_driver_wrapper_aead_decrypt(
1381 const psa_key_attributes_t *attributes,
1382 const uint8_t *key_buffer, size_t key_buffer_size,
1383 psa_algorithm_t alg,
1384 const uint8_t *nonce, size_t nonce_length,
1385 const uint8_t *additional_data, size_t additional_data_length,
1386 const uint8_t *ciphertext, size_t ciphertext_length,
1387 uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length )
1388{
1389 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1390 psa_key_location_t location =
1391 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1392
1393 switch( location )
1394 {
1395 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1396 /* Key is stored in the slot in export representation, so
1397 * cycle through all known transparent accelerators */
1398
1399#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1400#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001401 status = mbedtls_test_transparent_aead_decrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001402 attributes, key_buffer, key_buffer_size,
1403 alg,
1404 nonce, nonce_length,
1405 additional_data, additional_data_length,
1406 ciphertext, ciphertext_length,
1407 plaintext, plaintext_size, plaintext_length );
1408 /* Declared with fallback == true */
1409 if( status != PSA_ERROR_NOT_SUPPORTED )
1410 return( status );
1411#endif /* PSA_CRYPTO_DRIVER_TEST */
1412#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1413
1414 /* Fell through, meaning no accelerator supports this operation */
1415 return( mbedtls_psa_aead_decrypt(
1416 attributes, key_buffer, key_buffer_size,
1417 alg,
1418 nonce, nonce_length,
1419 additional_data, additional_data_length,
1420 ciphertext, ciphertext_length,
1421 plaintext, plaintext_size, plaintext_length ) );
1422
1423 /* Add cases for opaque driver here */
1424
1425 default:
1426 /* Key is declared with a lifetime not known to us */
1427 (void)status;
1428 return( PSA_ERROR_INVALID_ARGUMENT );
1429 }
1430}
Steven Cooremancd84cb42020-07-16 20:28:36 +02001431/* End of automatically generated file. */