blob: 59daee9654ee38811cea35c6ad9e35591ba016f8 [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
Steven Cooremanb938b0b2021-04-06 13:08:42 +0200383/** Get the key buffer size required to store the key material of a key
384 * associated with an opaque driver without storage.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200385 *
Ronald Cron31216282020-12-05 18:47:56 +0100386 * \param[in] attributes The key attributes.
387 * \param[out] key_buffer_size Minimum buffer size to contain the key material
Steven Cooreman56250fd2020-09-04 13:07:15 +0200388 *
389 * \retval #PSA_SUCCESS
Ronald Cron31216282020-12-05 18:47:56 +0100390 * The minimum size for a buffer to contain the key material has been
391 * returned successfully.
392 * \retval #PSA_ERROR_INVALID_ARGUMENT
393 * The size in bits of the key is not valid.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200394 * \retval #PSA_ERROR_NOT_SUPPORTED
Ronald Cron31216282020-12-05 18:47:56 +0100395 * The type and/or the size in bits of the key or the combination of
396 * the two is not supported.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200397 */
Ronald Cron9df74be2020-12-05 19:15:23 +0100398psa_status_t psa_driver_wrapper_get_key_buffer_size(
Ronald Cron31216282020-12-05 18:47:56 +0100399 const psa_key_attributes_t *attributes,
400 size_t *key_buffer_size )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200401{
John Durkop2c618352020-09-22 06:54:01 -0700402 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
403 psa_key_type_t key_type = attributes->core.type;
404 size_t key_bits = attributes->core.bits;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200405
Ronald Cron31216282020-12-05 18:47:56 +0100406 *key_buffer_size = 0;
John Durkop2c618352020-09-22 06:54:01 -0700407 switch( location )
408 {
John Durkop2c618352020-09-22 06:54:01 -0700409#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100410 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100411#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS)
412 /* Emulate property 'builtin_key_size' */
413 if( psa_key_id_is_builtin(
414 MBEDTLS_SVC_KEY_ID_GET_KEY_ID(
415 psa_get_key_id( attributes ) ) ) )
416 {
Steven Cooreman203bcbb2021-03-18 17:17:40 +0100417 *key_buffer_size = sizeof( psa_drv_slot_number_t );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100418 return( PSA_SUCCESS );
419 }
420#endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */
Ronald Cron7f13fa22021-04-13 12:41:34 +0200421 *key_buffer_size = mbedtls_test_size_function( key_type, key_bits );
Ronald Cron4607c822021-04-14 10:55:34 +0200422 return( ( *key_buffer_size != 0 ) ?
423 PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED );
John Durkop2c618352020-09-22 06:54:01 -0700424#endif /* PSA_CRYPTO_DRIVER_TEST */
425
426 default:
Ronald Cron9df74be2020-12-05 19:15:23 +0100427 (void)key_type;
428 (void)key_bits;
Steven Cooreman56250fd2020-09-04 13:07:15 +0200429 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200430 }
431}
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200432
Ronald Cron977c2472020-10-13 08:32:21 +0200433psa_status_t psa_driver_wrapper_generate_key(
434 const psa_key_attributes_t *attributes,
435 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200436{
Ronald Cron977c2472020-10-13 08:32:21 +0200437 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
438 psa_key_location_t location =
439 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
440
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200441 /* Try dynamically-registered SE interface first */
442#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
443 const psa_drv_se_t *drv;
444 psa_drv_se_context_t *drv_context;
445
Ronald Cron977c2472020-10-13 08:32:21 +0200446 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200447 {
448 size_t pubkey_length = 0; /* We don't support this feature yet */
449 if( drv->key_management == NULL ||
450 drv->key_management->p_generate == NULL )
451 {
452 /* Key is defined as being in SE, but we have no way to generate it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200453 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200454 }
455 return( drv->key_management->p_generate(
Ronald Cron977c2472020-10-13 08:32:21 +0200456 drv_context,
457 *( (psa_key_slot_number_t *)key_buffer ),
Ronald Cronea0f8a62020-11-25 17:52:23 +0100458 attributes, NULL, 0, &pubkey_length ) );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200459 }
460#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
461
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200462 switch( location )
463 {
464 case PSA_KEY_LOCATION_LOCAL_STORAGE:
Ronald Cron977c2472020-10-13 08:32:21 +0200465#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200466 /* Transparent drivers are limited to generating asymmetric keys */
Ronald Cron977c2472020-10-13 08:32:21 +0200467 if( PSA_KEY_TYPE_IS_ASYMMETRIC( attributes->core.type ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200468 {
Ronald Cron977c2472020-10-13 08:32:21 +0200469 /* Cycle through all known transparent accelerators */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200470#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200471 status = mbedtls_test_transparent_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200472 attributes, key_buffer, key_buffer_size,
473 key_buffer_length );
474 /* Declared with fallback == true */
475 if( status != PSA_ERROR_NOT_SUPPORTED )
476 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200477#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200478 }
479#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
480
481 /* Software fallback */
482 status = psa_generate_key_internal(
483 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200484 break;
Ronald Cron977c2472020-10-13 08:32:21 +0200485
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200486 /* Add cases for opaque driver here */
Ronald Cron977c2472020-10-13 08:32:21 +0200487#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200488#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100489 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200490 status = mbedtls_test_opaque_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200491 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200492 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200493#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200494#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
495
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200496 default:
497 /* Key is declared with a lifetime not known to us */
498 status = PSA_ERROR_INVALID_ARGUMENT;
499 break;
500 }
501
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200502 return( status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200503}
504
Ronald Cron83282872020-11-22 14:02:39 +0100505psa_status_t psa_driver_wrapper_import_key(
506 const psa_key_attributes_t *attributes,
507 const uint8_t *data,
508 size_t data_length,
509 uint8_t *key_buffer,
510 size_t key_buffer_size,
511 size_t *key_buffer_length,
512 size_t *bits )
Steven Cooreman04524762020-10-13 17:43:44 +0200513{
Steven Cooreman04524762020-10-13 17:43:44 +0200514 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cronbf33c932020-11-28 18:06:53 +0100515 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
516 psa_get_key_lifetime( attributes ) );
Steven Cooreman04524762020-10-13 17:43:44 +0200517
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100518 /* Try dynamically-registered SE interface first */
519#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
520 const psa_drv_se_t *drv;
521 psa_drv_se_context_t *drv_context;
522
523 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
524 {
525 if( drv->key_management == NULL ||
526 drv->key_management->p_import == NULL )
527 return( PSA_ERROR_NOT_SUPPORTED );
528
529 /* The driver should set the number of key bits, however in
530 * case it doesn't, we initialize bits to an invalid value. */
531 *bits = PSA_MAX_KEY_BITS + 1;
532 status = drv->key_management->p_import(
533 drv_context,
534 *( (psa_key_slot_number_t *)key_buffer ),
535 attributes, data, data_length, bits );
536
537 if( status != PSA_SUCCESS )
538 return( status );
539
540 if( (*bits) > PSA_MAX_KEY_BITS )
541 return( PSA_ERROR_NOT_SUPPORTED );
542
543 return( PSA_SUCCESS );
544 }
545#endif /* PSA_CRYPTO_SE_C */
546
Ronald Cronbf33c932020-11-28 18:06:53 +0100547 switch( location )
548 {
549 case PSA_KEY_LOCATION_LOCAL_STORAGE:
550 /* Key is stored in the slot in export representation, so
551 * cycle through all known transparent accelerators */
552#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
553#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200554 status = mbedtls_test_transparent_import_key(
555 attributes,
556 data, data_length,
557 key_buffer, key_buffer_size,
558 key_buffer_length, bits );
Ronald Cronbf33c932020-11-28 18:06:53 +0100559 /* Declared with fallback == true */
560 if( status != PSA_ERROR_NOT_SUPPORTED )
561 return( status );
562#endif /* PSA_CRYPTO_DRIVER_TEST */
563#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
564 /* Fell through, meaning no accelerator supports this operation */
565 return( psa_import_key_into_slot( attributes,
566 data, data_length,
567 key_buffer, key_buffer_size,
568 key_buffer_length, bits ) );
569
570 default:
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100571 /* Importing a key with external storage in not yet supported.
572 * Return in error indicating that the lifetime is not valid. */
Ronald Cronbf33c932020-11-28 18:06:53 +0100573 (void)status;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100574 return( PSA_ERROR_INVALID_ARGUMENT );
Ronald Cronbf33c932020-11-28 18:06:53 +0100575 }
576
Steven Cooreman04524762020-10-13 17:43:44 +0200577}
578
Ronald Cron67227982020-11-26 15:16:05 +0100579psa_status_t psa_driver_wrapper_export_key(
580 const psa_key_attributes_t *attributes,
581 const uint8_t *key_buffer, size_t key_buffer_size,
582 uint8_t *data, size_t data_size, size_t *data_length )
583
584{
585 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
586 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
587 psa_get_key_lifetime( attributes ) );
588
Ronald Cron152e3f82020-11-26 16:06:41 +0100589 /* Try dynamically-registered SE interface first */
590#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
591 const psa_drv_se_t *drv;
592 psa_drv_se_context_t *drv_context;
593
594 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
595 {
596 if( ( drv->key_management == NULL ) ||
597 ( drv->key_management->p_export == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100598 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100599 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100600 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100601
602 return( drv->key_management->p_export(
603 drv_context,
604 *( (psa_key_slot_number_t *)key_buffer ),
605 data, data_size, data_length ) );
606 }
607#endif /* PSA_CRYPTO_SE_C */
608
Ronald Cron67227982020-11-26 15:16:05 +0100609 switch( location )
610 {
611 case PSA_KEY_LOCATION_LOCAL_STORAGE:
612 return( psa_export_key_internal( attributes,
613 key_buffer,
614 key_buffer_size,
615 data,
616 data_size,
617 data_length ) );
618
619 /* Add cases for opaque driver here */
620#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
621#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100622 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200623 return( mbedtls_test_opaque_export_key( attributes,
624 key_buffer,
625 key_buffer_size,
626 data,
627 data_size,
628 data_length ) );
Ronald Cron67227982020-11-26 15:16:05 +0100629#endif /* PSA_CRYPTO_DRIVER_TEST */
630#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
631 default:
632 /* Key is declared with a lifetime not known to us */
633 return( status );
634 }
635}
636
Ronald Cron84cc9942020-11-25 14:30:05 +0100637psa_status_t psa_driver_wrapper_export_public_key(
638 const psa_key_attributes_t *attributes,
639 const uint8_t *key_buffer, size_t key_buffer_size,
640 uint8_t *data, size_t data_size, size_t *data_length )
641
Steven Cooremanb9b84422020-10-14 14:39:20 +0200642{
Steven Cooremanb9b84422020-10-14 14:39:20 +0200643 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Cron84cc9942020-11-25 14:30:05 +0100644 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
645 psa_get_key_lifetime( attributes ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200646
Ronald Cron152e3f82020-11-26 16:06:41 +0100647 /* Try dynamically-registered SE interface first */
648#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
649 const psa_drv_se_t *drv;
650 psa_drv_se_context_t *drv_context;
651
652 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
653 {
654 if( ( drv->key_management == NULL ) ||
655 ( drv->key_management->p_export_public == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100656 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100657 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100658 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100659
660 return( drv->key_management->p_export_public(
661 drv_context,
662 *( (psa_key_slot_number_t *)key_buffer ),
663 data, data_size, data_length ) );
664 }
665#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
666
Steven Cooremanb9b84422020-10-14 14:39:20 +0200667 switch( location )
668 {
669 case PSA_KEY_LOCATION_LOCAL_STORAGE:
670 /* Key is stored in the slot in export representation, so
671 * cycle through all known transparent accelerators */
Ronald Cron67227982020-11-26 15:16:05 +0100672#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200673#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200674 status = mbedtls_test_transparent_export_public_key(
675 attributes,
676 key_buffer,
677 key_buffer_size,
678 data,
679 data_size,
680 data_length );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200681 /* Declared with fallback == true */
682 if( status != PSA_ERROR_NOT_SUPPORTED )
683 return( status );
684#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100685#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200686 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron67227982020-11-26 15:16:05 +0100687 return( psa_export_public_key_internal( attributes,
688 key_buffer,
689 key_buffer_size,
690 data,
691 data_size,
692 data_length ) );
693
Steven Cooremanb9b84422020-10-14 14:39:20 +0200694 /* Add cases for opaque driver here */
Ronald Cron67227982020-11-26 15:16:05 +0100695#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200696#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100697 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200698 return( mbedtls_test_opaque_export_public_key( attributes,
699 key_buffer,
700 key_buffer_size,
701 data,
702 data_size,
703 data_length ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200704#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100705#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200706 default:
707 /* Key is declared with a lifetime not known to us */
708 return( status );
709 }
Steven Cooremanb9b84422020-10-14 14:39:20 +0200710}
711
Steven Cooreman6801f082021-02-19 17:21:22 +0100712psa_status_t psa_driver_wrapper_get_builtin_key(
713 psa_drv_slot_number_t slot_number,
714 psa_key_attributes_t *attributes,
715 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
716{
717 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
718 switch( location )
719 {
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100720#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100721 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200722 return( mbedtls_test_opaque_get_builtin_key(
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100723 slot_number,
724 attributes,
725 key_buffer, key_buffer_size, key_buffer_length ) );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100726#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman6801f082021-02-19 17:21:22 +0100727 default:
728 (void) slot_number;
729 (void) key_buffer;
730 (void) key_buffer_size;
731 (void) key_buffer_length;
732 return( PSA_ERROR_DOES_NOT_EXIST );
733 }
734}
735
Steven Cooreman37941cb2020-07-28 18:49:51 +0200736/*
737 * Cipher functions
738 */
739psa_status_t psa_driver_wrapper_cipher_encrypt(
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100740 const psa_key_attributes_t *attributes,
741 const uint8_t *key_buffer,
742 size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200743 psa_algorithm_t alg,
Ronald Cron9b674282021-07-09 09:19:35 +0200744 const uint8_t *iv,
745 size_t iv_length,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200746 const uint8_t *input,
747 size_t input_length,
748 uint8_t *output,
749 size_t output_size,
750 size_t *output_length )
751{
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100752 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
753 psa_key_location_t location =
754 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200755
756 switch( location )
757 {
758 case PSA_KEY_LOCATION_LOCAL_STORAGE:
759 /* Key is stored in the slot in export representation, so
760 * cycle through all known transparent accelerators */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100761#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200762#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100763 status = mbedtls_test_transparent_cipher_encrypt( attributes,
764 key_buffer,
765 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200766 alg,
Ronald Cron9b674282021-07-09 09:19:35 +0200767 iv,
768 iv_length,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200769 input,
770 input_length,
771 output,
772 output_size,
773 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200774 /* Declared with fallback == true */
775 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200776 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200777#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100778#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
779
780#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
781 return( mbedtls_psa_cipher_encrypt( attributes,
782 key_buffer,
783 key_buffer_size,
784 alg,
Ronald Cron9b674282021-07-09 09:19:35 +0200785 iv,
786 iv_length,
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100787 input,
788 input_length,
789 output,
790 output_size,
791 output_length ) );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200792#else
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200793 return( PSA_ERROR_NOT_SUPPORTED );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200794#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100795
Steven Cooreman37941cb2020-07-28 18:49:51 +0200796 /* Add cases for opaque driver here */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100797#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200798#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100799 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100800 return( mbedtls_test_opaque_cipher_encrypt( attributes,
801 key_buffer,
802 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200803 alg,
Ronald Cron9b674282021-07-09 09:19:35 +0200804 iv,
805 iv_length,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200806 input,
807 input_length,
808 output,
809 output_size,
810 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200811#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100812#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
813
Steven Cooreman37941cb2020-07-28 18:49:51 +0200814 default:
815 /* Key is declared with a lifetime not known to us */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100816 (void)status;
817 (void)key_buffer;
818 (void)key_buffer_size;
819 (void)alg;
820 (void)input;
821 (void)input_length;
822 (void)output;
823 (void)output_size;
824 (void)output_length;
825 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200826 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200827}
828
829psa_status_t psa_driver_wrapper_cipher_decrypt(
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100830 const psa_key_attributes_t *attributes,
831 const uint8_t *key_buffer,
832 size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200833 psa_algorithm_t alg,
834 const uint8_t *input,
835 size_t input_length,
836 uint8_t *output,
837 size_t output_size,
838 size_t *output_length )
839{
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100840 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
841 psa_key_location_t location =
842 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200843
844 switch( location )
845 {
846 case PSA_KEY_LOCATION_LOCAL_STORAGE:
847 /* Key is stored in the slot in export representation, so
848 * cycle through all known transparent accelerators */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100849#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200850#if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100851 status = mbedtls_test_transparent_cipher_decrypt( attributes,
852 key_buffer,
853 key_buffer_size,
Ronald Cron7f13fa22021-04-13 12:41:34 +0200854 alg,
855 input,
856 input_length,
857 output,
858 output_size,
859 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200860 /* Declared with fallback == true */
861 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200862 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200863#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100864#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
865
866#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
867 return( mbedtls_psa_cipher_decrypt( attributes,
868 key_buffer,
869 key_buffer_size,
870 alg,
871 input,
872 input_length,
873 output,
874 output_size,
875 output_length ) );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200876#else
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200877 return( PSA_ERROR_NOT_SUPPORTED );
gabor-mezei-arm0a93b662021-06-25 15:43:32 +0200878#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100879
Steven Cooreman37941cb2020-07-28 18:49:51 +0200880 /* Add cases for opaque driver here */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100881#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200882#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100883 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100884 return( mbedtls_test_opaque_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#endif /* PSA_CRYPTO_DRIVER_TEST */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100894#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
895
Steven Cooreman37941cb2020-07-28 18:49:51 +0200896 default:
897 /* Key is declared with a lifetime not known to us */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100898 (void)status;
899 (void)key_buffer;
900 (void)key_buffer_size;
901 (void)alg;
902 (void)input;
903 (void)input_length;
904 (void)output;
905 (void)output_size;
906 (void)output_length;
907 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200908 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200909}
910
911psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100912 psa_cipher_operation_t *operation,
913 const psa_key_attributes_t *attributes,
914 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200915 psa_algorithm_t alg )
916{
Ronald Cron0b805592020-12-14 18:08:20 +0100917 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Crona4af55f2020-12-14 14:36:06 +0100918 psa_key_location_t location =
919 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200920
Steven Cooreman37941cb2020-07-28 18:49:51 +0200921 switch( location )
922 {
923 case PSA_KEY_LOCATION_LOCAL_STORAGE:
924 /* Key is stored in the slot in export representation, so
925 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100926#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200927#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200928 status = mbedtls_test_transparent_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100929 &operation->ctx.transparent_test_driver_ctx,
930 attributes,
931 key_buffer,
932 key_buffer_size,
933 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200934 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200935 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100936 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200937
Ronald Cron0b805592020-12-14 18:08:20 +0100938 if( status != PSA_ERROR_NOT_SUPPORTED )
939 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200940#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100941#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100942#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200943 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100944 status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100945 attributes,
946 key_buffer,
947 key_buffer_size,
948 alg );
949 if( status == PSA_SUCCESS )
Ronald Cron6e412a72021-03-10 09:58:47 +0100950 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Ronald Cron49fafa92021-03-10 08:34:23 +0100951
Ronald Cron7b4154d2021-03-19 14:49:41 +0100952 if( status != PSA_ERROR_NOT_SUPPORTED )
953 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100954#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
955 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron0b805592020-12-14 18:08:20 +0100956
Steven Cooreman37941cb2020-07-28 18:49:51 +0200957 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100958#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200959#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100960 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200961 status = mbedtls_test_opaque_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100962 &operation->ctx.opaque_test_driver_ctx,
963 attributes,
964 key_buffer, key_buffer_size,
965 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200966
Steven Cooreman37941cb2020-07-28 18:49:51 +0200967 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100968 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200969
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200970 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200971#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100972#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200973 default:
974 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100975 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100976 (void)key_buffer;
977 (void)key_buffer_size;
978 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +0200979 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200980 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200981}
982
983psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100984 psa_cipher_operation_t *operation,
985 const psa_key_attributes_t *attributes,
986 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200987 psa_algorithm_t alg )
988{
Steven Cooreman37941cb2020-07-28 18:49:51 +0200989 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Crona4af55f2020-12-14 14:36:06 +0100990 psa_key_location_t location =
991 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200992
Steven Cooreman37941cb2020-07-28 18:49:51 +0200993 switch( location )
994 {
995 case PSA_KEY_LOCATION_LOCAL_STORAGE:
996 /* Key is stored in the slot in export representation, so
997 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100998#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200999#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001000 status = mbedtls_test_transparent_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001001 &operation->ctx.transparent_test_driver_ctx,
1002 attributes,
1003 key_buffer,
1004 key_buffer_size,
1005 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001006 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +02001007 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001008 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +02001009
Ronald Cron0b805592020-12-14 18:08:20 +01001010 if( status != PSA_ERROR_NOT_SUPPORTED )
1011 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001012#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001013#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001014#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001015 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +01001016 status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001017 attributes,
1018 key_buffer,
1019 key_buffer_size,
1020 alg );
1021 if( status == PSA_SUCCESS )
1022 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1023
1024 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001025#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1026 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron49fafa92021-03-10 08:34:23 +01001027
Steven Cooreman37941cb2020-07-28 18:49:51 +02001028 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +01001029#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001030#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +01001031 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001032 status = mbedtls_test_opaque_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001033 &operation->ctx.opaque_test_driver_ctx,
1034 attributes,
1035 key_buffer, key_buffer_size,
1036 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001037
Steven Cooreman37941cb2020-07-28 18:49:51 +02001038 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +01001039 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001040
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001041 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001042#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +01001043#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +02001044 default:
1045 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +01001046 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001047 (void)key_buffer;
1048 (void)key_buffer_size;
1049 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +02001050 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001051 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001052}
1053
Steven Cooreman37941cb2020-07-28 18:49:51 +02001054psa_status_t psa_driver_wrapper_cipher_set_iv(
Ronald Cron6056fe82020-12-15 13:58:07 +01001055 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001056 const uint8_t *iv,
1057 size_t iv_length )
1058{
Ronald Cron49fafa92021-03-10 08:34:23 +01001059 switch( operation->id )
1060 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001061#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001062 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001063 return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001064 iv,
1065 iv_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001066#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001067
1068#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001069#if defined(PSA_CRYPTO_DRIVER_TEST)
1070 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001071 return( mbedtls_test_transparent_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001072 &operation->ctx.transparent_test_driver_ctx,
1073 iv, iv_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001074
Steven Cooreman37941cb2020-07-28 18:49:51 +02001075 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001076 return( mbedtls_test_opaque_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001077 &operation->ctx.opaque_test_driver_ctx,
1078 iv, iv_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001079#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001080#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001081 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001082
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001083 (void)iv;
1084 (void)iv_length;
1085
Ronald Crondd24c9b2020-12-15 14:10:01 +01001086 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001087}
1088
1089psa_status_t psa_driver_wrapper_cipher_update(
Ronald Cron6056fe82020-12-15 13:58:07 +01001090 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001091 const uint8_t *input,
1092 size_t input_length,
1093 uint8_t *output,
1094 size_t output_size,
1095 size_t *output_length )
1096{
Ronald Cron49fafa92021-03-10 08:34:23 +01001097 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001098 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001099#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001100 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001101 return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001102 input,
1103 input_length,
1104 output,
1105 output_size,
1106 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001107#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
1108
Ronald Cron49fafa92021-03-10 08:34:23 +01001109#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001110#if defined(PSA_CRYPTO_DRIVER_TEST)
1111 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001112 return( mbedtls_test_transparent_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001113 &operation->ctx.transparent_test_driver_ctx,
1114 input, input_length,
1115 output, output_size, output_length ) );
1116
Steven Cooreman37941cb2020-07-28 18:49:51 +02001117 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001118 return( mbedtls_test_opaque_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001119 &operation->ctx.opaque_test_driver_ctx,
1120 input, input_length,
1121 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001122#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001123#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001124 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001125
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001126 (void)input;
1127 (void)input_length;
1128 (void)output;
1129 (void)output_size;
1130 (void)output_length;
1131
Ronald Crondd24c9b2020-12-15 14:10:01 +01001132 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001133}
1134
1135psa_status_t psa_driver_wrapper_cipher_finish(
Ronald Cron6056fe82020-12-15 13:58:07 +01001136 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +02001137 uint8_t *output,
1138 size_t output_size,
1139 size_t *output_length )
1140{
Ronald Cron49fafa92021-03-10 08:34:23 +01001141 switch( operation->id )
1142 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001143#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001144 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001145 return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +01001146 output,
1147 output_size,
1148 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001149#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001150
1151#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001152#if defined(PSA_CRYPTO_DRIVER_TEST)
1153 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001154 return( mbedtls_test_transparent_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001155 &operation->ctx.transparent_test_driver_ctx,
1156 output, output_size, output_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +01001157
Steven Cooreman37941cb2020-07-28 18:49:51 +02001158 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001159 return( mbedtls_test_opaque_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001160 &operation->ctx.opaque_test_driver_ctx,
1161 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001162#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001163#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001164 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001165
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001166 (void)output;
1167 (void)output_size;
1168 (void)output_length;
1169
Ronald Crondd24c9b2020-12-15 14:10:01 +01001170 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001171}
1172
1173psa_status_t psa_driver_wrapper_cipher_abort(
Ronald Cron6056fe82020-12-15 13:58:07 +01001174 psa_cipher_operation_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001175{
Ronald Crondd24c9b2020-12-15 14:10:01 +01001176 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001177
Ronald Cron49fafa92021-03-10 08:34:23 +01001178 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001179 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001180#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001181 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001182 return( mbedtls_psa_cipher_abort( &operation->ctx.mbedtls_ctx ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001183#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron49fafa92021-03-10 08:34:23 +01001184
1185#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001186#if defined(PSA_CRYPTO_DRIVER_TEST)
1187 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001188 status = mbedtls_test_transparent_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001189 &operation->ctx.transparent_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001190 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001191 &operation->ctx.transparent_test_driver_ctx,
1192 sizeof( operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001193 return( status );
Ronald Cron49fafa92021-03-10 08:34:23 +01001194
Steven Cooreman37941cb2020-07-28 18:49:51 +02001195 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001196 status = mbedtls_test_opaque_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001197 &operation->ctx.opaque_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001198 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001199 &operation->ctx.opaque_test_driver_ctx,
1200 sizeof( operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001201 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001202#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001203#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001204 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001205
Ronald Cron49fafa92021-03-10 08:34:23 +01001206 (void)status;
Ronald Crondd24c9b2020-12-15 14:10:01 +01001207 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001208}
1209
Steven Cooreman1e582352021-02-18 17:24:37 +01001210/*
1211 * Hashing functions
1212 */
1213psa_status_t psa_driver_wrapper_hash_compute(
1214 psa_algorithm_t alg,
1215 const uint8_t *input,
1216 size_t input_length,
1217 uint8_t *hash,
1218 size_t hash_size,
1219 size_t *hash_length)
1220{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001221 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001222
1223 /* Try accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001224#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001225 status = mbedtls_test_transparent_hash_compute(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001226 alg, input, input_length, hash, hash_size, hash_length );
Steven Cooremanf7638102021-03-04 15:14:36 +01001227 if( status != PSA_ERROR_NOT_SUPPORTED )
1228 return( status );
1229#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001230
1231 /* If software fallback is compiled in, try fallback */
1232#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1233 status = mbedtls_psa_hash_compute( alg, input, input_length,
1234 hash, hash_size, hash_length );
1235 if( status != PSA_ERROR_NOT_SUPPORTED )
1236 return( status );
1237#endif
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001238 (void) status;
1239 (void) alg;
1240 (void) input;
1241 (void) input_length;
1242 (void) hash;
1243 (void) hash_size;
1244 (void) hash_length;
Steven Cooreman1e582352021-02-18 17:24:37 +01001245
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001246 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman1e582352021-02-18 17:24:37 +01001247}
1248
1249psa_status_t psa_driver_wrapper_hash_setup(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001250 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001251 psa_algorithm_t alg )
1252{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001253 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001254
Steven Cooreman1e582352021-02-18 17:24:37 +01001255 /* Try setup on accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001256#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001257 status = mbedtls_test_transparent_hash_setup(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001258 &operation->ctx.test_driver_ctx, alg );
Steven Cooremanf7638102021-03-04 15:14:36 +01001259 if( status == PSA_SUCCESS )
1260 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1261
1262 if( status != PSA_ERROR_NOT_SUPPORTED )
1263 return( status );
1264#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001265
1266 /* If software fallback is compiled in, try fallback */
1267#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001268 status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
Steven Cooreman1e582352021-02-18 17:24:37 +01001269 if( status == PSA_SUCCESS )
Steven Cooreman1e582352021-02-18 17:24:37 +01001270 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Steven Cooreman1e582352021-02-18 17:24:37 +01001271
1272 if( status != PSA_ERROR_NOT_SUPPORTED )
1273 return( status );
1274#endif
1275 /* Nothing left to try if we fall through here */
1276 (void) status;
1277 (void) operation;
1278 (void) alg;
1279 return( PSA_ERROR_NOT_SUPPORTED );
1280}
1281
1282psa_status_t psa_driver_wrapper_hash_clone(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001283 const psa_hash_operation_t *source_operation,
1284 psa_hash_operation_t *target_operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001285{
Steven Cooreman1e582352021-02-18 17:24:37 +01001286 switch( source_operation->id )
1287 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001288#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1289 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1290 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1291 return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1292 &target_operation->ctx.mbedtls_ctx ) );
1293#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001294#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001295 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1296 target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Ronald Cron7f13fa22021-04-13 12:41:34 +02001297 return( mbedtls_test_transparent_hash_clone(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001298 &source_operation->ctx.test_driver_ctx,
1299 &target_operation->ctx.test_driver_ctx ) );
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) target_operation;
1303 return( PSA_ERROR_BAD_STATE );
1304 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001305}
1306
1307psa_status_t psa_driver_wrapper_hash_update(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001308 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001309 const uint8_t *input,
1310 size_t input_length )
1311{
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_update( &operation->ctx.mbedtls_ctx,
1317 input, input_length ) );
1318#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001319#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001320 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001321 return( mbedtls_test_transparent_hash_update(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001322 &operation->ctx.test_driver_ctx,
1323 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001324#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001325 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001326 (void) input;
1327 (void) input_length;
1328 return( PSA_ERROR_BAD_STATE );
1329 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001330}
1331
1332psa_status_t psa_driver_wrapper_hash_finish(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001333 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001334 uint8_t *hash,
1335 size_t hash_size,
1336 size_t *hash_length )
1337{
Steven Cooreman1e582352021-02-18 17:24:37 +01001338 switch( operation->id )
1339 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001340#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1341 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1342 return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1343 hash, hash_size, hash_length ) );
1344#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001345#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001346 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001347 return( mbedtls_test_transparent_hash_finish(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001348 &operation->ctx.test_driver_ctx,
1349 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001350#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001351 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001352 (void) hash;
1353 (void) hash_size;
1354 (void) hash_length;
1355 return( PSA_ERROR_BAD_STATE );
1356 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001357}
1358
1359psa_status_t psa_driver_wrapper_hash_abort(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001360 psa_hash_operation_t *operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001361{
Steven Cooreman1e582352021-02-18 17:24:37 +01001362 switch( operation->id )
1363 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001364#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1365 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1366 return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1367#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001368#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001369 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001370 return( mbedtls_test_transparent_hash_abort(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001371 &operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001372#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001373 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001374 return( PSA_ERROR_BAD_STATE );
1375 }
1376}
1377
Ronald Cronde822812021-03-17 16:08:20 +01001378psa_status_t psa_driver_wrapper_aead_encrypt(
1379 const psa_key_attributes_t *attributes,
1380 const uint8_t *key_buffer, size_t key_buffer_size,
1381 psa_algorithm_t alg,
1382 const uint8_t *nonce, size_t nonce_length,
1383 const uint8_t *additional_data, size_t additional_data_length,
1384 const uint8_t *plaintext, size_t plaintext_length,
1385 uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length )
1386{
1387 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1388 psa_key_location_t location =
1389 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1390
1391 switch( location )
1392 {
1393 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1394 /* Key is stored in the slot in export representation, so
1395 * cycle through all known transparent accelerators */
1396
1397#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1398#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001399 status = mbedtls_test_transparent_aead_encrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001400 attributes, key_buffer, key_buffer_size,
1401 alg,
1402 nonce, nonce_length,
1403 additional_data, additional_data_length,
1404 plaintext, plaintext_length,
1405 ciphertext, ciphertext_size, ciphertext_length );
1406 /* Declared with fallback == true */
1407 if( status != PSA_ERROR_NOT_SUPPORTED )
1408 return( status );
1409#endif /* PSA_CRYPTO_DRIVER_TEST */
1410#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1411
1412 /* Fell through, meaning no accelerator supports this operation */
1413 return( mbedtls_psa_aead_encrypt(
1414 attributes, key_buffer, key_buffer_size,
1415 alg,
1416 nonce, nonce_length,
1417 additional_data, additional_data_length,
1418 plaintext, plaintext_length,
1419 ciphertext, ciphertext_size, ciphertext_length ) );
1420
1421 /* Add cases for opaque driver here */
1422
1423 default:
1424 /* Key is declared with a lifetime not known to us */
1425 (void)status;
1426 return( PSA_ERROR_INVALID_ARGUMENT );
1427 }
1428}
1429
1430psa_status_t psa_driver_wrapper_aead_decrypt(
1431 const psa_key_attributes_t *attributes,
1432 const uint8_t *key_buffer, size_t key_buffer_size,
1433 psa_algorithm_t alg,
1434 const uint8_t *nonce, size_t nonce_length,
1435 const uint8_t *additional_data, size_t additional_data_length,
1436 const uint8_t *ciphertext, size_t ciphertext_length,
1437 uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length )
1438{
1439 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1440 psa_key_location_t location =
1441 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1442
1443 switch( location )
1444 {
1445 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1446 /* Key is stored in the slot in export representation, so
1447 * cycle through all known transparent accelerators */
1448
1449#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1450#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001451 status = mbedtls_test_transparent_aead_decrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001452 attributes, key_buffer, key_buffer_size,
1453 alg,
1454 nonce, nonce_length,
1455 additional_data, additional_data_length,
1456 ciphertext, ciphertext_length,
1457 plaintext, plaintext_size, plaintext_length );
1458 /* Declared with fallback == true */
1459 if( status != PSA_ERROR_NOT_SUPPORTED )
1460 return( status );
1461#endif /* PSA_CRYPTO_DRIVER_TEST */
1462#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1463
1464 /* Fell through, meaning no accelerator supports this operation */
1465 return( mbedtls_psa_aead_decrypt(
1466 attributes, key_buffer, key_buffer_size,
1467 alg,
1468 nonce, nonce_length,
1469 additional_data, additional_data_length,
1470 ciphertext, ciphertext_length,
1471 plaintext, plaintext_size, plaintext_length ) );
1472
1473 /* Add cases for opaque driver here */
1474
1475 default:
1476 /* Key is declared with a lifetime not known to us */
1477 (void)status;
1478 return( PSA_ERROR_INVALID_ARGUMENT );
1479 }
1480}
Steven Cooremand13a70f2021-03-19 15:24:23 +01001481
1482
1483/*
1484 * MAC functions
1485 */
1486psa_status_t psa_driver_wrapper_mac_compute(
1487 const psa_key_attributes_t *attributes,
1488 const uint8_t *key_buffer,
1489 size_t key_buffer_size,
1490 psa_algorithm_t alg,
1491 const uint8_t *input,
1492 size_t input_length,
1493 uint8_t *mac,
1494 size_t mac_size,
1495 size_t *mac_length )
1496{
1497 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1498 psa_key_location_t location =
1499 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1500
1501 switch( location )
1502 {
1503 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1504 /* Key is stored in the slot in export representation, so
1505 * cycle through all known transparent accelerators */
1506#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1507#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001508 status = mbedtls_test_transparent_mac_compute(
Steven Cooremand13a70f2021-03-19 15:24:23 +01001509 attributes, key_buffer, key_buffer_size, alg,
1510 input, input_length,
1511 mac, mac_size, mac_length );
1512 /* Declared with fallback == true */
1513 if( status != PSA_ERROR_NOT_SUPPORTED )
1514 return( status );
1515#endif /* PSA_CRYPTO_DRIVER_TEST */
1516#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1517#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1518 /* Fell through, meaning no accelerator supports this operation */
1519 status = mbedtls_psa_mac_compute(
1520 attributes, key_buffer, key_buffer_size, alg,
1521 input, input_length,
1522 mac, mac_size, mac_length );
1523 if( status != PSA_ERROR_NOT_SUPPORTED )
1524 return( status );
1525#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1526 return( PSA_ERROR_NOT_SUPPORTED );
1527
1528 /* Add cases for opaque driver here */
1529#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1530#if defined(PSA_CRYPTO_DRIVER_TEST)
1531 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001532 status = mbedtls_test_opaque_mac_compute(
Steven Cooremand13a70f2021-03-19 15:24:23 +01001533 attributes, key_buffer, key_buffer_size, alg,
1534 input, input_length,
1535 mac, mac_size, mac_length );
1536 return( status );
1537#endif /* PSA_CRYPTO_DRIVER_TEST */
1538#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1539 default:
1540 /* Key is declared with a lifetime not known to us */
1541 (void) key_buffer;
1542 (void) key_buffer_size;
1543 (void) alg;
1544 (void) input;
1545 (void) input_length;
1546 (void) mac;
1547 (void) mac_size;
1548 (void) mac_length;
1549 (void) status;
1550 return( PSA_ERROR_INVALID_ARGUMENT );
1551 }
1552}
1553
1554psa_status_t psa_driver_wrapper_mac_sign_setup(
1555 psa_mac_operation_t *operation,
1556 const psa_key_attributes_t *attributes,
1557 const uint8_t *key_buffer,
1558 size_t key_buffer_size,
1559 psa_algorithm_t alg )
1560{
1561 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1562 psa_key_location_t location =
1563 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1564
1565 switch( location )
1566 {
1567 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1568 /* Key is stored in the slot in export representation, so
1569 * cycle through all known transparent accelerators */
1570#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1571#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001572 status = mbedtls_test_transparent_mac_sign_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001573 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001574 attributes,
1575 key_buffer, key_buffer_size,
1576 alg );
1577 /* Declared with fallback == true */
1578 if( status == PSA_SUCCESS )
1579 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1580
1581 if( status != PSA_ERROR_NOT_SUPPORTED )
1582 return( status );
1583#endif /* PSA_CRYPTO_DRIVER_TEST */
1584#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1585#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1586 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001587 status = mbedtls_psa_mac_sign_setup( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001588 attributes,
1589 key_buffer, key_buffer_size,
1590 alg );
1591 if( status == PSA_SUCCESS )
1592 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1593
1594 if( status != PSA_ERROR_NOT_SUPPORTED )
1595 return( status );
1596#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1597 return( PSA_ERROR_NOT_SUPPORTED );
1598
1599 /* Add cases for opaque driver here */
1600#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1601#if defined(PSA_CRYPTO_DRIVER_TEST)
1602 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001603 status = mbedtls_test_opaque_mac_sign_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001604 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001605 attributes,
1606 key_buffer, key_buffer_size,
1607 alg );
1608
1609 if( status == PSA_SUCCESS )
1610 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1611
1612 return( status );
1613#endif /* PSA_CRYPTO_DRIVER_TEST */
1614#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1615 default:
1616 /* Key is declared with a lifetime not known to us */
1617 (void) status;
1618 (void) key_buffer;
1619 (void) key_buffer_size;
1620 (void) alg;
1621 return( PSA_ERROR_INVALID_ARGUMENT );
1622 }
1623}
1624
1625psa_status_t psa_driver_wrapper_mac_verify_setup(
1626 psa_mac_operation_t *operation,
1627 const psa_key_attributes_t *attributes,
1628 const uint8_t *key_buffer,
1629 size_t key_buffer_size,
1630 psa_algorithm_t alg )
1631{
1632 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1633 psa_key_location_t location =
1634 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1635
1636 switch( location )
1637 {
1638 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1639 /* Key is stored in the slot in export representation, so
1640 * cycle through all known transparent accelerators */
1641#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1642#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001643 status = mbedtls_test_transparent_mac_verify_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001644 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001645 attributes,
1646 key_buffer, key_buffer_size,
1647 alg );
1648 /* Declared with fallback == true */
1649 if( status == PSA_SUCCESS )
1650 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1651
1652 if( status != PSA_ERROR_NOT_SUPPORTED )
1653 return( status );
1654#endif /* PSA_CRYPTO_DRIVER_TEST */
1655#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1656#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1657 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001658 status = mbedtls_psa_mac_verify_setup( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001659 attributes,
1660 key_buffer, key_buffer_size,
1661 alg );
1662 if( status == PSA_SUCCESS )
1663 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1664
1665 if( status != PSA_ERROR_NOT_SUPPORTED )
1666 return( status );
1667#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1668 return( PSA_ERROR_NOT_SUPPORTED );
1669
1670 /* Add cases for opaque driver here */
1671#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1672#if defined(PSA_CRYPTO_DRIVER_TEST)
1673 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001674 status = mbedtls_test_opaque_mac_verify_setup(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001675 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001676 attributes,
1677 key_buffer, key_buffer_size,
1678 alg );
1679
1680 if( status == PSA_SUCCESS )
1681 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1682
1683 return( status );
1684#endif /* PSA_CRYPTO_DRIVER_TEST */
1685#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1686 default:
1687 /* Key is declared with a lifetime not known to us */
1688 (void) status;
1689 (void) key_buffer;
1690 (void) key_buffer_size;
1691 (void) alg;
1692 return( PSA_ERROR_INVALID_ARGUMENT );
1693 }
1694}
1695
1696psa_status_t psa_driver_wrapper_mac_update(
1697 psa_mac_operation_t *operation,
1698 const uint8_t *input,
1699 size_t input_length )
1700{
1701 switch( operation->id )
1702 {
1703#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1704 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001705 return( mbedtls_psa_mac_update( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001706 input, input_length ) );
1707#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1708
1709#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1710#if defined(PSA_CRYPTO_DRIVER_TEST)
1711 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001712 return( mbedtls_test_transparent_mac_update(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001713 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001714 input, input_length ) );
1715
1716 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001717 return( mbedtls_test_opaque_mac_update(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001718 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001719 input, input_length ) );
1720#endif /* PSA_CRYPTO_DRIVER_TEST */
1721#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1722 default:
1723 (void) input;
1724 (void) input_length;
1725 return( PSA_ERROR_INVALID_ARGUMENT );
1726 }
1727}
1728
1729psa_status_t psa_driver_wrapper_mac_sign_finish(
1730 psa_mac_operation_t *operation,
1731 uint8_t *mac,
1732 size_t mac_size,
1733 size_t *mac_length )
1734{
1735 switch( operation->id )
1736 {
1737#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1738 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001739 return( mbedtls_psa_mac_sign_finish( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001740 mac, mac_size, mac_length ) );
1741#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1742
1743#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1744#if defined(PSA_CRYPTO_DRIVER_TEST)
1745 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001746 return( mbedtls_test_transparent_mac_sign_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001747 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001748 mac, mac_size, mac_length ) );
1749
1750 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001751 return( mbedtls_test_opaque_mac_sign_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001752 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001753 mac, mac_size, mac_length ) );
1754#endif /* PSA_CRYPTO_DRIVER_TEST */
1755#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1756 default:
1757 (void) mac;
1758 (void) mac_size;
1759 (void) mac_length;
1760 return( PSA_ERROR_INVALID_ARGUMENT );
1761 }
1762}
1763
1764psa_status_t psa_driver_wrapper_mac_verify_finish(
1765 psa_mac_operation_t *operation,
1766 const uint8_t *mac,
1767 size_t mac_length )
1768{
1769 switch( operation->id )
1770 {
1771#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1772 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001773 return( mbedtls_psa_mac_verify_finish( &operation->ctx.mbedtls_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001774 mac, mac_length ) );
1775#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1776
1777#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1778#if defined(PSA_CRYPTO_DRIVER_TEST)
1779 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001780 return( mbedtls_test_transparent_mac_verify_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001781 &operation->ctx.transparent_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001782 mac, mac_length ) );
1783
1784 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001785 return( mbedtls_test_opaque_mac_verify_finish(
Steven Cooreman77e2cc52021-03-19 17:05:52 +01001786 &operation->ctx.opaque_test_driver_ctx,
Steven Cooremand13a70f2021-03-19 15:24:23 +01001787 mac, mac_length ) );
1788#endif /* PSA_CRYPTO_DRIVER_TEST */
1789#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1790 default:
1791 (void) mac;
1792 (void) mac_length;
1793 return( PSA_ERROR_INVALID_ARGUMENT );
1794 }
1795}
1796
1797psa_status_t psa_driver_wrapper_mac_abort(
1798 psa_mac_operation_t *operation )
1799{
Steven Cooremand13a70f2021-03-19 15:24:23 +01001800 switch( operation->id )
1801 {
1802#if defined(MBEDTLS_PSA_BUILTIN_MAC)
1803 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Steven Cooremane6804192021-03-19 18:28:56 +01001804 return( mbedtls_psa_mac_abort( &operation->ctx.mbedtls_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001805#endif /* MBEDTLS_PSA_BUILTIN_MAC */
1806
1807#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1808#if defined(PSA_CRYPTO_DRIVER_TEST)
1809 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001810 return( mbedtls_test_transparent_mac_abort(
Steven Cooremane6804192021-03-19 18:28:56 +01001811 &operation->ctx.transparent_test_driver_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001812 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001813 return( mbedtls_test_opaque_mac_abort(
Steven Cooremane6804192021-03-19 18:28:56 +01001814 &operation->ctx.opaque_test_driver_ctx ) );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001815#endif /* PSA_CRYPTO_DRIVER_TEST */
1816#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1817 default:
Steven Cooremane6804192021-03-19 18:28:56 +01001818 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooremand13a70f2021-03-19 15:24:23 +01001819 }
Steven Cooremand13a70f2021-03-19 15:24:23 +01001820}
Gilles Peskine1905a242021-04-24 13:19:45 +02001821
1822#endif /* MBEDTLS_PSA_CRYPTO_C */