blob: d1ec001e68abf3d84d62e72368f1e90c4d23ed2d [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 Cronc4bc12e2021-04-13 12:41:34 +020040#include "test/drivers/mbedtls_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 */
Ronald Cron9f17aa42020-12-08 17:07:25 +010067psa_status_t psa_driver_wrapper_sign_hash(
68 const psa_key_attributes_t *attributes,
69 const uint8_t *key_buffer, size_t key_buffer_size,
70 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
71 uint8_t *signature, size_t signature_size, size_t *signature_length )
Steven Cooremancd84cb42020-07-16 20:28:36 +020072{
Steven Cooreman7a250572020-07-17 16:43:05 +020073 /* Try dynamically-registered SE interface first */
74#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
75 const psa_drv_se_t *drv;
76 psa_drv_se_context_t *drv_context;
77
Ronald Cron9f17aa42020-12-08 17:07:25 +010078 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman7a250572020-07-17 16:43:05 +020079 {
80 if( drv->asymmetric == NULL ||
81 drv->asymmetric->p_sign == NULL )
82 {
83 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +020084 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman7a250572020-07-17 16:43:05 +020085 }
Ronald Cron9f17aa42020-12-08 17:07:25 +010086 return( drv->asymmetric->p_sign(
87 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
88 alg, hash, hash_length,
89 signature, signature_size, signature_length ) );
Steven Cooreman7a250572020-07-17 16:43:05 +020090 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +020091#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman7a250572020-07-17 16:43:05 +020092
Ronald Cronfce9df22020-12-08 18:06:03 +010093 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +010094 psa_key_location_t location =
95 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooremancd84cb42020-07-16 20:28:36 +020096
97 switch( location )
98 {
99 case PSA_KEY_LOCATION_LOCAL_STORAGE:
100 /* Key is stored in the slot in export representation, so
101 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100102#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200103#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200104 status = mbedtls_test_transparent_signature_sign_hash( attributes,
Ronald Cron9f17aa42020-12-08 17:07:25 +0100105 key_buffer,
106 key_buffer_size,
Steven Cooremancd84cb42020-07-16 20:28:36 +0200107 alg,
108 hash,
109 hash_length,
110 signature,
111 signature_size,
112 signature_length );
113 /* Declared with fallback == true */
114 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200115 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200116#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100117#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200118 /* Fell through, meaning no accelerator supports this operation */
Ronald Cronfce9df22020-12-08 18:06:03 +0100119 return( psa_sign_hash_internal( attributes,
120 key_buffer,
121 key_buffer_size,
122 alg,
123 hash,
124 hash_length,
125 signature,
126 signature_size,
127 signature_length ) );
128
Steven Cooremancd84cb42020-07-16 20:28:36 +0200129 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100130#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200131#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100132 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200133 return( mbedtls_test_opaque_signature_sign_hash( attributes,
134 key_buffer,
135 key_buffer_size,
136 alg,
137 hash,
138 hash_length,
139 signature,
140 signature_size,
141 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200142#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100143#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200144 default:
145 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100146 (void)status;
147 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooremancd84cb42020-07-16 20:28:36 +0200148 }
Steven Cooremancd84cb42020-07-16 20:28:36 +0200149}
150
Ronald Cron9f17aa42020-12-08 17:07:25 +0100151psa_status_t psa_driver_wrapper_verify_hash(
152 const psa_key_attributes_t *attributes,
153 const uint8_t *key_buffer, size_t key_buffer_size,
154 psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
155 const uint8_t *signature, size_t signature_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200156{
Steven Cooreman55ae2172020-07-17 19:46:15 +0200157 /* Try dynamically-registered SE interface first */
158#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
159 const psa_drv_se_t *drv;
160 psa_drv_se_context_t *drv_context;
161
Ronald Cron9f17aa42020-12-08 17:07:25 +0100162 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200163 {
164 if( drv->asymmetric == NULL ||
165 drv->asymmetric->p_verify == NULL )
166 {
167 /* Key is defined in SE, but we have no way to exercise it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200168 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200169 }
Ronald Cron9f17aa42020-12-08 17:07:25 +0100170 return( drv->asymmetric->p_verify(
171 drv_context, *( (psa_key_slot_number_t *)key_buffer ),
172 alg, hash, hash_length,
173 signature, signature_length ) );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200174 }
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200175#endif /* PSA_CRYPTO_SE_C */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200176
Ronald Cronfce9df22020-12-08 18:06:03 +0100177 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100178 psa_key_location_t location =
179 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200180
181 switch( location )
182 {
183 case PSA_KEY_LOCATION_LOCAL_STORAGE:
184 /* Key is stored in the slot in export representation, so
185 * cycle through all known transparent accelerators */
Ronald Cronfce9df22020-12-08 18:06:03 +0100186#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200187#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200188 status = mbedtls_test_transparent_signature_verify_hash(
189 attributes,
190 key_buffer,
191 key_buffer_size,
192 alg,
193 hash,
194 hash_length,
195 signature,
196 signature_length );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200197 /* Declared with fallback == true */
198 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman56250fd2020-09-04 13:07:15 +0200199 return( status );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200200#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100201#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
202
203 return( psa_verify_hash_internal( attributes,
204 key_buffer,
205 key_buffer_size,
206 alg,
207 hash,
208 hash_length,
209 signature,
210 signature_length ) );
211
Steven Cooreman55ae2172020-07-17 19:46:15 +0200212 /* Add cases for opaque driver here */
Ronald Cronfce9df22020-12-08 18:06:03 +0100213#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200214#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100215 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200216 return( mbedtls_test_opaque_signature_verify_hash( attributes,
217 key_buffer,
218 key_buffer_size,
219 alg,
220 hash,
221 hash_length,
222 signature,
223 signature_length ) );
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200224#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cronfce9df22020-12-08 18:06:03 +0100225#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200226 default:
227 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100228 (void)status;
229 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200230 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200231}
232
Steven Cooremanb938b0b2021-04-06 13:08:42 +0200233/** Get the key buffer size required to store the key material of a key
234 * associated with an opaque driver without storage.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200235 *
Ronald Cron31216282020-12-05 18:47:56 +0100236 * \param[in] attributes The key attributes.
237 * \param[out] key_buffer_size Minimum buffer size to contain the key material
Steven Cooreman56250fd2020-09-04 13:07:15 +0200238 *
239 * \retval #PSA_SUCCESS
Ronald Cron31216282020-12-05 18:47:56 +0100240 * The minimum size for a buffer to contain the key material has been
241 * returned successfully.
242 * \retval #PSA_ERROR_INVALID_ARGUMENT
243 * The size in bits of the key is not valid.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200244 * \retval #PSA_ERROR_NOT_SUPPORTED
Ronald Cron31216282020-12-05 18:47:56 +0100245 * The type and/or the size in bits of the key or the combination of
246 * the two is not supported.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200247 */
Ronald Cron9df74be2020-12-05 19:15:23 +0100248psa_status_t psa_driver_wrapper_get_key_buffer_size(
Ronald Cron31216282020-12-05 18:47:56 +0100249 const psa_key_attributes_t *attributes,
250 size_t *key_buffer_size )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200251{
John Durkop2c618352020-09-22 06:54:01 -0700252 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
253 psa_key_type_t key_type = attributes->core.type;
254 size_t key_bits = attributes->core.bits;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200255
Ronald Cron31216282020-12-05 18:47:56 +0100256 *key_buffer_size = 0;
John Durkop2c618352020-09-22 06:54:01 -0700257 switch( location )
258 {
John Durkop2c618352020-09-22 06:54:01 -0700259#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100260 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100261#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS)
262 /* Emulate property 'builtin_key_size' */
263 if( psa_key_id_is_builtin(
264 MBEDTLS_SVC_KEY_ID_GET_KEY_ID(
265 psa_get_key_id( attributes ) ) ) )
266 {
Steven Cooreman203bcbb2021-03-18 17:17:40 +0100267 *key_buffer_size = sizeof( psa_drv_slot_number_t );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100268 return( PSA_SUCCESS );
269 }
270#endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200271#ifdef MBEDTLS_TEST_DRIVER_KEY_CONTEXT_SIZE_FUNCTION
272 *key_buffer_size = mbedtls_test_size_function( key_type, key_bits );
John Durkop2c618352020-09-22 06:54:01 -0700273 return( PSA_SUCCESS );
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200274#else /* MBEDTLS_TEST_DRIVER_KEY_CONTEXT_SIZE_FUNCTION */
John Durkop2c618352020-09-22 06:54:01 -0700275 if( PSA_KEY_TYPE_IS_KEY_PAIR( key_type ) )
276 {
Ronald Cron31216282020-12-05 18:47:56 +0100277 int public_key_overhead =
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200278 ( ( MBEDTLS_TEST_DRIVER_KEY_CONTEXT_STORE_PUBLIC_KEY == 1 )
279 ? PSA_EXPORT_KEY_OUTPUT_SIZE( key_type, key_bits ) : 0 );
280 *key_buffer_size = MBEDTLS_TEST_DRIVER_KEY_CONTEXT_BASE_SIZE +
281 MBEDTLS_TEST_DRIVER_KEY_CONTEXT_PUBLIC_KEY_SIZE +
282 public_key_overhead;
John Durkop135ce692020-10-19 07:12:28 -0700283 }
Ronald Cron31216282020-12-05 18:47:56 +0100284 else if( PSA_KEY_TYPE_IS_PUBLIC_KEY( key_type ) )
John Durkop135ce692020-10-19 07:12:28 -0700285 {
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200286 *key_buffer_size = MBEDTLS_TEST_DRIVER_KEY_CONTEXT_BASE_SIZE +
287 MBEDTLS_TEST_DRIVER_KEY_CONTEXT_PUBLIC_KEY_SIZE;
John Durkop2c618352020-09-22 06:54:01 -0700288 }
John Durkop135ce692020-10-19 07:12:28 -0700289 else if ( !PSA_KEY_TYPE_IS_KEY_PAIR( key_type ) &&
Ronald Cron31216282020-12-05 18:47:56 +0100290 !PSA_KEY_TYPE_IS_PUBLIC_KEY ( key_type ) )
John Durkop2c618352020-09-22 06:54:01 -0700291 {
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200292 *key_buffer_size = MBEDTLS_TEST_DRIVER_KEY_CONTEXT_BASE_SIZE +
293 ( MBEDTLS_TEST_DRIVER_KEY_CONTEXT_SYMMETRIC_FACTOR *
294 ( ( key_bits + 7 ) / 8 ) );
John Durkop2c618352020-09-22 06:54:01 -0700295 }
296 else
297 {
298 return( PSA_ERROR_NOT_SUPPORTED );
299 }
300 return( PSA_SUCCESS );
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200301#endif /* MBEDTLS_TEST_DRIVER_KEY_CONTEXT_SIZE_FUNCTION */
John Durkop2c618352020-09-22 06:54:01 -0700302#endif /* PSA_CRYPTO_DRIVER_TEST */
303
304 default:
Ronald Cron9df74be2020-12-05 19:15:23 +0100305 (void)key_type;
306 (void)key_bits;
Steven Cooreman56250fd2020-09-04 13:07:15 +0200307 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200308 }
309}
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200310
Ronald Cron977c2472020-10-13 08:32:21 +0200311psa_status_t psa_driver_wrapper_generate_key(
312 const psa_key_attributes_t *attributes,
313 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200314{
Ronald Cron977c2472020-10-13 08:32:21 +0200315 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
316 psa_key_location_t location =
317 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
318
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200319 /* Try dynamically-registered SE interface first */
320#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
321 const psa_drv_se_t *drv;
322 psa_drv_se_context_t *drv_context;
323
Ronald Cron977c2472020-10-13 08:32:21 +0200324 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200325 {
326 size_t pubkey_length = 0; /* We don't support this feature yet */
327 if( drv->key_management == NULL ||
328 drv->key_management->p_generate == NULL )
329 {
330 /* Key is defined as being in SE, but we have no way to generate it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200331 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200332 }
333 return( drv->key_management->p_generate(
Ronald Cron977c2472020-10-13 08:32:21 +0200334 drv_context,
335 *( (psa_key_slot_number_t *)key_buffer ),
Ronald Cronea0f8a62020-11-25 17:52:23 +0100336 attributes, NULL, 0, &pubkey_length ) );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200337 }
338#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
339
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200340 switch( location )
341 {
342 case PSA_KEY_LOCATION_LOCAL_STORAGE:
Ronald Cron977c2472020-10-13 08:32:21 +0200343#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200344 /* Transparent drivers are limited to generating asymmetric keys */
Ronald Cron977c2472020-10-13 08:32:21 +0200345 if( PSA_KEY_TYPE_IS_ASYMMETRIC( attributes->core.type ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200346 {
Ronald Cron977c2472020-10-13 08:32:21 +0200347 /* Cycle through all known transparent accelerators */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200348#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200349 status = mbedtls_test_transparent_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200350 attributes, key_buffer, key_buffer_size,
351 key_buffer_length );
352 /* Declared with fallback == true */
353 if( status != PSA_ERROR_NOT_SUPPORTED )
354 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200355#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200356 }
357#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
358
359 /* Software fallback */
360 status = psa_generate_key_internal(
361 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200362 break;
Ronald Cron977c2472020-10-13 08:32:21 +0200363
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200364 /* Add cases for opaque driver here */
Ronald Cron977c2472020-10-13 08:32:21 +0200365#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200366#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100367 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200368 status = mbedtls_test_opaque_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200369 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200370 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200371#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200372#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
373
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200374 default:
375 /* Key is declared with a lifetime not known to us */
376 status = PSA_ERROR_INVALID_ARGUMENT;
377 break;
378 }
379
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200380 return( status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200381}
382
Ronald Cron83282872020-11-22 14:02:39 +0100383psa_status_t psa_driver_wrapper_import_key(
384 const psa_key_attributes_t *attributes,
385 const uint8_t *data,
386 size_t data_length,
387 uint8_t *key_buffer,
388 size_t key_buffer_size,
389 size_t *key_buffer_length,
390 size_t *bits )
Steven Cooreman04524762020-10-13 17:43:44 +0200391{
Steven Cooreman04524762020-10-13 17:43:44 +0200392 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cronbf33c932020-11-28 18:06:53 +0100393 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
394 psa_get_key_lifetime( attributes ) );
Steven Cooreman04524762020-10-13 17:43:44 +0200395
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100396 /* Try dynamically-registered SE interface first */
397#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
398 const psa_drv_se_t *drv;
399 psa_drv_se_context_t *drv_context;
400
401 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
402 {
403 if( drv->key_management == NULL ||
404 drv->key_management->p_import == NULL )
405 return( PSA_ERROR_NOT_SUPPORTED );
406
407 /* The driver should set the number of key bits, however in
408 * case it doesn't, we initialize bits to an invalid value. */
409 *bits = PSA_MAX_KEY_BITS + 1;
410 status = drv->key_management->p_import(
411 drv_context,
412 *( (psa_key_slot_number_t *)key_buffer ),
413 attributes, data, data_length, bits );
414
415 if( status != PSA_SUCCESS )
416 return( status );
417
418 if( (*bits) > PSA_MAX_KEY_BITS )
419 return( PSA_ERROR_NOT_SUPPORTED );
420
421 return( PSA_SUCCESS );
422 }
423#endif /* PSA_CRYPTO_SE_C */
424
Ronald Cronbf33c932020-11-28 18:06:53 +0100425 switch( location )
426 {
427 case PSA_KEY_LOCATION_LOCAL_STORAGE:
428 /* Key is stored in the slot in export representation, so
429 * cycle through all known transparent accelerators */
430#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
431#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200432 status = mbedtls_test_transparent_import_key(
433 attributes,
434 data, data_length,
435 key_buffer, key_buffer_size,
436 key_buffer_length, bits );
Ronald Cronbf33c932020-11-28 18:06:53 +0100437 /* Declared with fallback == true */
438 if( status != PSA_ERROR_NOT_SUPPORTED )
439 return( status );
440#endif /* PSA_CRYPTO_DRIVER_TEST */
441#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
442 /* Fell through, meaning no accelerator supports this operation */
443 return( psa_import_key_into_slot( attributes,
444 data, data_length,
445 key_buffer, key_buffer_size,
446 key_buffer_length, bits ) );
447
448 default:
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100449 /* Importing a key with external storage in not yet supported.
450 * Return in error indicating that the lifetime is not valid. */
Ronald Cronbf33c932020-11-28 18:06:53 +0100451 (void)status;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100452 return( PSA_ERROR_INVALID_ARGUMENT );
Ronald Cronbf33c932020-11-28 18:06:53 +0100453 }
454
Steven Cooreman04524762020-10-13 17:43:44 +0200455}
456
Ronald Cron67227982020-11-26 15:16:05 +0100457psa_status_t psa_driver_wrapper_export_key(
458 const psa_key_attributes_t *attributes,
459 const uint8_t *key_buffer, size_t key_buffer_size,
460 uint8_t *data, size_t data_size, size_t *data_length )
461
462{
463 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
464 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
465 psa_get_key_lifetime( attributes ) );
466
Ronald Cron152e3f82020-11-26 16:06:41 +0100467 /* Try dynamically-registered SE interface first */
468#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
469 const psa_drv_se_t *drv;
470 psa_drv_se_context_t *drv_context;
471
472 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
473 {
474 if( ( drv->key_management == NULL ) ||
475 ( drv->key_management->p_export == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100476 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100477 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100478 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100479
480 return( drv->key_management->p_export(
481 drv_context,
482 *( (psa_key_slot_number_t *)key_buffer ),
483 data, data_size, data_length ) );
484 }
485#endif /* PSA_CRYPTO_SE_C */
486
Ronald Cron67227982020-11-26 15:16:05 +0100487 switch( location )
488 {
489 case PSA_KEY_LOCATION_LOCAL_STORAGE:
490 return( psa_export_key_internal( attributes,
491 key_buffer,
492 key_buffer_size,
493 data,
494 data_size,
495 data_length ) );
496
497 /* Add cases for opaque driver here */
498#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
499#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100500 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200501 return( mbedtls_test_opaque_export_key( attributes,
502 key_buffer,
503 key_buffer_size,
504 data,
505 data_size,
506 data_length ) );
Ronald Cron67227982020-11-26 15:16:05 +0100507#endif /* PSA_CRYPTO_DRIVER_TEST */
508#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
509 default:
510 /* Key is declared with a lifetime not known to us */
511 return( status );
512 }
513}
514
Ronald Cron84cc9942020-11-25 14:30:05 +0100515psa_status_t psa_driver_wrapper_export_public_key(
516 const psa_key_attributes_t *attributes,
517 const uint8_t *key_buffer, size_t key_buffer_size,
518 uint8_t *data, size_t data_size, size_t *data_length )
519
Steven Cooremanb9b84422020-10-14 14:39:20 +0200520{
Steven Cooremanb9b84422020-10-14 14:39:20 +0200521 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Cron84cc9942020-11-25 14:30:05 +0100522 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
523 psa_get_key_lifetime( attributes ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200524
Ronald Cron152e3f82020-11-26 16:06:41 +0100525 /* Try dynamically-registered SE interface first */
526#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
527 const psa_drv_se_t *drv;
528 psa_drv_se_context_t *drv_context;
529
530 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
531 {
532 if( ( drv->key_management == NULL ) ||
533 ( drv->key_management->p_export_public == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100534 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100535 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100536 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100537
538 return( drv->key_management->p_export_public(
539 drv_context,
540 *( (psa_key_slot_number_t *)key_buffer ),
541 data, data_size, data_length ) );
542 }
543#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
544
Steven Cooremanb9b84422020-10-14 14:39:20 +0200545 switch( location )
546 {
547 case PSA_KEY_LOCATION_LOCAL_STORAGE:
548 /* Key is stored in the slot in export representation, so
549 * cycle through all known transparent accelerators */
Ronald Cron67227982020-11-26 15:16:05 +0100550#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200551#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200552 status = mbedtls_test_transparent_export_public_key(
553 attributes,
554 key_buffer,
555 key_buffer_size,
556 data,
557 data_size,
558 data_length );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200559 /* Declared with fallback == true */
560 if( status != PSA_ERROR_NOT_SUPPORTED )
561 return( status );
562#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100563#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200564 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron67227982020-11-26 15:16:05 +0100565 return( psa_export_public_key_internal( attributes,
566 key_buffer,
567 key_buffer_size,
568 data,
569 data_size,
570 data_length ) );
571
Steven Cooremanb9b84422020-10-14 14:39:20 +0200572 /* Add cases for opaque driver here */
Ronald Cron67227982020-11-26 15:16:05 +0100573#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200574#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100575 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200576 return( mbedtls_test_opaque_export_public_key( attributes,
577 key_buffer,
578 key_buffer_size,
579 data,
580 data_size,
581 data_length ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200582#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100583#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200584 default:
585 /* Key is declared with a lifetime not known to us */
586 return( status );
587 }
Steven Cooremanb9b84422020-10-14 14:39:20 +0200588}
589
Steven Cooreman6801f082021-02-19 17:21:22 +0100590psa_status_t psa_driver_wrapper_get_builtin_key(
591 psa_drv_slot_number_t slot_number,
592 psa_key_attributes_t *attributes,
593 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
594{
595 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
596 switch( location )
597 {
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100598#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100599 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200600 return( mbedtls_test_opaque_get_builtin_key(
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100601 slot_number,
602 attributes,
603 key_buffer, key_buffer_size, key_buffer_length ) );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100604#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman6801f082021-02-19 17:21:22 +0100605 default:
606 (void) slot_number;
607 (void) key_buffer;
608 (void) key_buffer_size;
609 (void) key_buffer_length;
610 return( PSA_ERROR_DOES_NOT_EXIST );
611 }
612}
613
Steven Cooreman37941cb2020-07-28 18:49:51 +0200614/*
615 * Cipher functions
616 */
617psa_status_t psa_driver_wrapper_cipher_encrypt(
618 psa_key_slot_t *slot,
619 psa_algorithm_t alg,
620 const uint8_t *input,
621 size_t input_length,
622 uint8_t *output,
623 size_t output_size,
624 size_t *output_length )
625{
626#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
627 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
628 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
629 psa_key_attributes_t attributes = {
630 .core = slot->attr
631 };
632
633 switch( location )
634 {
635 case PSA_KEY_LOCATION_LOCAL_STORAGE:
636 /* Key is stored in the slot in export representation, so
637 * cycle through all known transparent accelerators */
638#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200639 status = mbedtls_test_transparent_cipher_encrypt( &attributes,
640 slot->key.data,
641 slot->key.bytes,
642 alg,
643 input,
644 input_length,
645 output,
646 output_size,
647 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200648 /* Declared with fallback == true */
649 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200650 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200651#endif /* PSA_CRYPTO_DRIVER_TEST */
652 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200653 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200654 /* Add cases for opaque driver here */
655#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100656 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200657 return( mbedtls_test_opaque_cipher_encrypt( &attributes,
658 slot->key.data,
659 slot->key.bytes,
660 alg,
661 input,
662 input_length,
663 output,
664 output_size,
665 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200666#endif /* PSA_CRYPTO_DRIVER_TEST */
667 default:
668 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200669 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200670 }
671#else /* PSA_CRYPTO_DRIVER_PRESENT */
672 (void) slot;
673 (void) alg;
674 (void) input;
675 (void) input_length;
676 (void) output;
677 (void) output_size;
678 (void) output_length;
679
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200680 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200681#endif /* PSA_CRYPTO_DRIVER_PRESENT */
682}
683
684psa_status_t psa_driver_wrapper_cipher_decrypt(
685 psa_key_slot_t *slot,
686 psa_algorithm_t alg,
687 const uint8_t *input,
688 size_t input_length,
689 uint8_t *output,
690 size_t output_size,
691 size_t *output_length )
692{
693#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
694 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
695 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
696 psa_key_attributes_t attributes = {
697 .core = slot->attr
698 };
699
700 switch( location )
701 {
702 case PSA_KEY_LOCATION_LOCAL_STORAGE:
703 /* Key is stored in the slot in export representation, so
704 * cycle through all known transparent accelerators */
705#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200706 status = mbedtls_test_transparent_cipher_decrypt( &attributes,
707 slot->key.data,
708 slot->key.bytes,
709 alg,
710 input,
711 input_length,
712 output,
713 output_size,
714 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200715 /* Declared with fallback == true */
716 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200717 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200718#endif /* PSA_CRYPTO_DRIVER_TEST */
719 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200720 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200721 /* Add cases for opaque driver here */
722#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100723 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200724 return( mbedtls_test_opaque_cipher_decrypt( &attributes,
725 slot->key.data,
726 slot->key.bytes,
727 alg,
728 input,
729 input_length,
730 output,
731 output_size,
732 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200733#endif /* PSA_CRYPTO_DRIVER_TEST */
734 default:
735 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200736 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200737 }
738#else /* PSA_CRYPTO_DRIVER_PRESENT */
739 (void) slot;
740 (void) alg;
741 (void) input;
742 (void) input_length;
743 (void) output;
744 (void) output_size;
745 (void) output_length;
746
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200747 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200748#endif /* PSA_CRYPTO_DRIVER_PRESENT */
749}
750
751psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100752 psa_cipher_operation_t *operation,
753 const psa_key_attributes_t *attributes,
754 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200755 psa_algorithm_t alg )
756{
Ronald Cron0b805592020-12-14 18:08:20 +0100757 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Crona4af55f2020-12-14 14:36:06 +0100758 psa_key_location_t location =
759 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200760
Steven Cooreman37941cb2020-07-28 18:49:51 +0200761 switch( location )
762 {
763 case PSA_KEY_LOCATION_LOCAL_STORAGE:
764 /* Key is stored in the slot in export representation, so
765 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100766#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200767#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200768 status = mbedtls_test_transparent_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100769 &operation->ctx.transparent_test_driver_ctx,
770 attributes,
771 key_buffer,
772 key_buffer_size,
773 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200774 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200775 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100776 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200777
Ronald Cron0b805592020-12-14 18:08:20 +0100778 if( status != PSA_ERROR_NOT_SUPPORTED )
779 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200780#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100781#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100782#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200783 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100784 status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100785 attributes,
786 key_buffer,
787 key_buffer_size,
788 alg );
789 if( status == PSA_SUCCESS )
Ronald Cron6e412a72021-03-10 09:58:47 +0100790 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Ronald Cron49fafa92021-03-10 08:34:23 +0100791
Ronald Cron7b4154d2021-03-19 14:49:41 +0100792 if( status != PSA_ERROR_NOT_SUPPORTED )
793 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100794#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
795 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron0b805592020-12-14 18:08:20 +0100796
Steven Cooreman37941cb2020-07-28 18:49:51 +0200797 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100798#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200799#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100800 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200801 status = mbedtls_test_opaque_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100802 &operation->ctx.opaque_test_driver_ctx,
803 attributes,
804 key_buffer, key_buffer_size,
805 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200806
Steven Cooreman37941cb2020-07-28 18:49:51 +0200807 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100808 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200809
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200810 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200811#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100812#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200813 default:
814 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100815 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100816 (void)key_buffer;
817 (void)key_buffer_size;
818 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +0200819 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200820 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200821}
822
823psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100824 psa_cipher_operation_t *operation,
825 const psa_key_attributes_t *attributes,
826 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200827 psa_algorithm_t alg )
828{
Steven Cooreman37941cb2020-07-28 18:49:51 +0200829 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Crona4af55f2020-12-14 14:36:06 +0100830 psa_key_location_t location =
831 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200832
Steven Cooreman37941cb2020-07-28 18:49:51 +0200833 switch( location )
834 {
835 case PSA_KEY_LOCATION_LOCAL_STORAGE:
836 /* Key is stored in the slot in export representation, so
837 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100838#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200839#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200840 status = mbedtls_test_transparent_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100841 &operation->ctx.transparent_test_driver_ctx,
842 attributes,
843 key_buffer,
844 key_buffer_size,
845 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200846 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200847 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100848 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200849
Ronald Cron0b805592020-12-14 18:08:20 +0100850 if( status != PSA_ERROR_NOT_SUPPORTED )
851 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200852#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100853#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100854#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200855 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100856 status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100857 attributes,
858 key_buffer,
859 key_buffer_size,
860 alg );
861 if( status == PSA_SUCCESS )
862 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
863
864 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100865#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
866 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron49fafa92021-03-10 08:34:23 +0100867
Steven Cooreman37941cb2020-07-28 18:49:51 +0200868 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100869#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200870#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100871 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200872 status = mbedtls_test_opaque_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100873 &operation->ctx.opaque_test_driver_ctx,
874 attributes,
875 key_buffer, key_buffer_size,
876 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200877
Steven Cooreman37941cb2020-07-28 18:49:51 +0200878 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100879 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200880
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200881 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200882#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100883#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200884 default:
885 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100886 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100887 (void)key_buffer;
888 (void)key_buffer_size;
889 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +0200890 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200891 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200892}
893
Steven Cooreman37941cb2020-07-28 18:49:51 +0200894psa_status_t psa_driver_wrapper_cipher_set_iv(
Ronald Cron6056fe82020-12-15 13:58:07 +0100895 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200896 const uint8_t *iv,
897 size_t iv_length )
898{
Ronald Cron49fafa92021-03-10 08:34:23 +0100899 switch( operation->id )
900 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100901#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100902 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100903 return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100904 iv,
905 iv_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100906#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100907
908#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200909#if defined(PSA_CRYPTO_DRIVER_TEST)
910 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200911 return( mbedtls_test_transparent_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100912 &operation->ctx.transparent_test_driver_ctx,
913 iv, iv_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +0100914
Steven Cooreman37941cb2020-07-28 18:49:51 +0200915 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200916 return( mbedtls_test_opaque_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100917 &operation->ctx.opaque_test_driver_ctx,
918 iv, iv_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200919#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100920#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +0100921 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200922
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100923 (void)iv;
924 (void)iv_length;
925
Ronald Crondd24c9b2020-12-15 14:10:01 +0100926 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200927}
928
929psa_status_t psa_driver_wrapper_cipher_update(
Ronald Cron6056fe82020-12-15 13:58:07 +0100930 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200931 const uint8_t *input,
932 size_t input_length,
933 uint8_t *output,
934 size_t output_size,
935 size_t *output_length )
936{
Ronald Cron49fafa92021-03-10 08:34:23 +0100937 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200938 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100939#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100940 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100941 return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100942 input,
943 input_length,
944 output,
945 output_size,
946 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100947#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
948
Ronald Cron49fafa92021-03-10 08:34:23 +0100949#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200950#if defined(PSA_CRYPTO_DRIVER_TEST)
951 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200952 return( mbedtls_test_transparent_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100953 &operation->ctx.transparent_test_driver_ctx,
954 input, input_length,
955 output, output_size, output_length ) );
956
Steven Cooreman37941cb2020-07-28 18:49:51 +0200957 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200958 return( mbedtls_test_opaque_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100959 &operation->ctx.opaque_test_driver_ctx,
960 input, input_length,
961 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200962#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100963#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +0100964 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200965
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100966 (void)input;
967 (void)input_length;
968 (void)output;
969 (void)output_size;
970 (void)output_length;
971
Ronald Crondd24c9b2020-12-15 14:10:01 +0100972 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200973}
974
975psa_status_t psa_driver_wrapper_cipher_finish(
Ronald Cron6056fe82020-12-15 13:58:07 +0100976 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200977 uint8_t *output,
978 size_t output_size,
979 size_t *output_length )
980{
Ronald Cron49fafa92021-03-10 08:34:23 +0100981 switch( operation->id )
982 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100983#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100984 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100985 return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100986 output,
987 output_size,
988 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100989#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100990
991#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200992#if defined(PSA_CRYPTO_DRIVER_TEST)
993 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200994 return( mbedtls_test_transparent_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100995 &operation->ctx.transparent_test_driver_ctx,
996 output, output_size, output_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +0100997
Steven Cooreman37941cb2020-07-28 18:49:51 +0200998 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200999 return( mbedtls_test_opaque_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001000 &operation->ctx.opaque_test_driver_ctx,
1001 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001002#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001003#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001004 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001005
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001006 (void)output;
1007 (void)output_size;
1008 (void)output_length;
1009
Ronald Crondd24c9b2020-12-15 14:10:01 +01001010 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001011}
1012
1013psa_status_t psa_driver_wrapper_cipher_abort(
Ronald Cron6056fe82020-12-15 13:58:07 +01001014 psa_cipher_operation_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001015{
Ronald Crondd24c9b2020-12-15 14:10:01 +01001016 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001017
Ronald Cron49fafa92021-03-10 08:34:23 +01001018 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +02001019 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001020#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001021 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +01001022 return( mbedtls_psa_cipher_abort( &operation->ctx.mbedtls_ctx ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +01001023#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron49fafa92021-03-10 08:34:23 +01001024
1025#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001026#if defined(PSA_CRYPTO_DRIVER_TEST)
1027 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001028 status = mbedtls_test_transparent_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001029 &operation->ctx.transparent_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001030 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001031 &operation->ctx.transparent_test_driver_ctx,
1032 sizeof( operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001033 return( status );
Ronald Cron49fafa92021-03-10 08:34:23 +01001034
Steven Cooreman37941cb2020-07-28 18:49:51 +02001035 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001036 status = mbedtls_test_opaque_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001037 &operation->ctx.opaque_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001038 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001039 &operation->ctx.opaque_test_driver_ctx,
1040 sizeof( operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001041 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001042#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001043#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001044 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001045
Ronald Cron49fafa92021-03-10 08:34:23 +01001046 (void)status;
Ronald Crondd24c9b2020-12-15 14:10:01 +01001047 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001048}
1049
Steven Cooreman1e582352021-02-18 17:24:37 +01001050/*
1051 * Hashing functions
1052 */
1053psa_status_t psa_driver_wrapper_hash_compute(
1054 psa_algorithm_t alg,
1055 const uint8_t *input,
1056 size_t input_length,
1057 uint8_t *hash,
1058 size_t hash_size,
1059 size_t *hash_length)
1060{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001061 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001062
1063 /* Try accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001064#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001065 status = mbedtls_test_transparent_hash_compute(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001066 alg, input, input_length, hash, hash_size, hash_length );
Steven Cooremanf7638102021-03-04 15:14:36 +01001067 if( status != PSA_ERROR_NOT_SUPPORTED )
1068 return( status );
1069#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001070
1071 /* If software fallback is compiled in, try fallback */
1072#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1073 status = mbedtls_psa_hash_compute( alg, input, input_length,
1074 hash, hash_size, hash_length );
1075 if( status != PSA_ERROR_NOT_SUPPORTED )
1076 return( status );
1077#endif
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001078 (void) status;
1079 (void) alg;
1080 (void) input;
1081 (void) input_length;
1082 (void) hash;
1083 (void) hash_size;
1084 (void) hash_length;
Steven Cooreman1e582352021-02-18 17:24:37 +01001085
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001086 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman1e582352021-02-18 17:24:37 +01001087}
1088
1089psa_status_t psa_driver_wrapper_hash_setup(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001090 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001091 psa_algorithm_t alg )
1092{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001093 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001094
Steven Cooreman1e582352021-02-18 17:24:37 +01001095 /* Try setup on accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001096#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001097 status = mbedtls_test_transparent_hash_setup(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001098 &operation->ctx.test_driver_ctx, alg );
Steven Cooremanf7638102021-03-04 15:14:36 +01001099 if( status == PSA_SUCCESS )
1100 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1101
1102 if( status != PSA_ERROR_NOT_SUPPORTED )
1103 return( status );
1104#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001105
1106 /* If software fallback is compiled in, try fallback */
1107#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001108 status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
Steven Cooreman1e582352021-02-18 17:24:37 +01001109 if( status == PSA_SUCCESS )
Steven Cooreman1e582352021-02-18 17:24:37 +01001110 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Steven Cooreman1e582352021-02-18 17:24:37 +01001111
1112 if( status != PSA_ERROR_NOT_SUPPORTED )
1113 return( status );
1114#endif
1115 /* Nothing left to try if we fall through here */
1116 (void) status;
1117 (void) operation;
1118 (void) alg;
1119 return( PSA_ERROR_NOT_SUPPORTED );
1120}
1121
1122psa_status_t psa_driver_wrapper_hash_clone(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001123 const psa_hash_operation_t *source_operation,
1124 psa_hash_operation_t *target_operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001125{
Steven Cooreman1e582352021-02-18 17:24:37 +01001126 switch( source_operation->id )
1127 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001128#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1129 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1130 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1131 return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1132 &target_operation->ctx.mbedtls_ctx ) );
1133#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001134#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001135 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1136 target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001137 return( mbedtls_test_transparent_hash_clone(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001138 &source_operation->ctx.test_driver_ctx,
1139 &target_operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001140#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001141 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001142 (void) target_operation;
1143 return( PSA_ERROR_BAD_STATE );
1144 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001145}
1146
1147psa_status_t psa_driver_wrapper_hash_update(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001148 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001149 const uint8_t *input,
1150 size_t input_length )
1151{
Steven Cooreman1e582352021-02-18 17:24:37 +01001152 switch( operation->id )
1153 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001154#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1155 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1156 return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
1157 input, input_length ) );
1158#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001159#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001160 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001161 return( mbedtls_test_transparent_hash_update(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001162 &operation->ctx.test_driver_ctx,
1163 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001164#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001165 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001166 (void) input;
1167 (void) input_length;
1168 return( PSA_ERROR_BAD_STATE );
1169 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001170}
1171
1172psa_status_t psa_driver_wrapper_hash_finish(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001173 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001174 uint8_t *hash,
1175 size_t hash_size,
1176 size_t *hash_length )
1177{
Steven Cooreman1e582352021-02-18 17:24:37 +01001178 switch( operation->id )
1179 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001180#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1181 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1182 return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1183 hash, hash_size, hash_length ) );
1184#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001185#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001186 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001187 return( mbedtls_test_transparent_hash_finish(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001188 &operation->ctx.test_driver_ctx,
1189 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001190#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001191 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001192 (void) hash;
1193 (void) hash_size;
1194 (void) hash_length;
1195 return( PSA_ERROR_BAD_STATE );
1196 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001197}
1198
1199psa_status_t psa_driver_wrapper_hash_abort(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001200 psa_hash_operation_t *operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001201{
Steven Cooreman1e582352021-02-18 17:24:37 +01001202 switch( operation->id )
1203 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001204#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1205 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1206 return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1207#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001208#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001209 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001210 return( mbedtls_test_transparent_hash_abort(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001211 &operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001212#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001213 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001214 return( PSA_ERROR_BAD_STATE );
1215 }
1216}
1217
Ronald Cronde822812021-03-17 16:08:20 +01001218psa_status_t psa_driver_wrapper_aead_encrypt(
1219 const psa_key_attributes_t *attributes,
1220 const uint8_t *key_buffer, size_t key_buffer_size,
1221 psa_algorithm_t alg,
1222 const uint8_t *nonce, size_t nonce_length,
1223 const uint8_t *additional_data, size_t additional_data_length,
1224 const uint8_t *plaintext, size_t plaintext_length,
1225 uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length )
1226{
1227 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1228 psa_key_location_t location =
1229 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1230
1231 switch( location )
1232 {
1233 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1234 /* Key is stored in the slot in export representation, so
1235 * cycle through all known transparent accelerators */
1236
1237#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1238#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001239 status = mbedtls_test_transparent_aead_encrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001240 attributes, key_buffer, key_buffer_size,
1241 alg,
1242 nonce, nonce_length,
1243 additional_data, additional_data_length,
1244 plaintext, plaintext_length,
1245 ciphertext, ciphertext_size, ciphertext_length );
1246 /* Declared with fallback == true */
1247 if( status != PSA_ERROR_NOT_SUPPORTED )
1248 return( status );
1249#endif /* PSA_CRYPTO_DRIVER_TEST */
1250#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1251
1252 /* Fell through, meaning no accelerator supports this operation */
1253 return( mbedtls_psa_aead_encrypt(
1254 attributes, key_buffer, key_buffer_size,
1255 alg,
1256 nonce, nonce_length,
1257 additional_data, additional_data_length,
1258 plaintext, plaintext_length,
1259 ciphertext, ciphertext_size, ciphertext_length ) );
1260
1261 /* Add cases for opaque driver here */
1262
1263 default:
1264 /* Key is declared with a lifetime not known to us */
1265 (void)status;
1266 return( PSA_ERROR_INVALID_ARGUMENT );
1267 }
1268}
1269
1270psa_status_t psa_driver_wrapper_aead_decrypt(
1271 const psa_key_attributes_t *attributes,
1272 const uint8_t *key_buffer, size_t key_buffer_size,
1273 psa_algorithm_t alg,
1274 const uint8_t *nonce, size_t nonce_length,
1275 const uint8_t *additional_data, size_t additional_data_length,
1276 const uint8_t *ciphertext, size_t ciphertext_length,
1277 uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length )
1278{
1279 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1280 psa_key_location_t location =
1281 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1282
1283 switch( location )
1284 {
1285 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1286 /* Key is stored in the slot in export representation, so
1287 * cycle through all known transparent accelerators */
1288
1289#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1290#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001291 status = mbedtls_test_transparent_aead_decrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001292 attributes, key_buffer, key_buffer_size,
1293 alg,
1294 nonce, nonce_length,
1295 additional_data, additional_data_length,
1296 ciphertext, ciphertext_length,
1297 plaintext, plaintext_size, plaintext_length );
1298 /* Declared with fallback == true */
1299 if( status != PSA_ERROR_NOT_SUPPORTED )
1300 return( status );
1301#endif /* PSA_CRYPTO_DRIVER_TEST */
1302#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1303
1304 /* Fell through, meaning no accelerator supports this operation */
1305 return( mbedtls_psa_aead_decrypt(
1306 attributes, key_buffer, key_buffer_size,
1307 alg,
1308 nonce, nonce_length,
1309 additional_data, additional_data_length,
1310 ciphertext, ciphertext_length,
1311 plaintext, plaintext_size, plaintext_length ) );
1312
1313 /* Add cases for opaque driver here */
1314
1315 default:
1316 /* Key is declared with a lifetime not known to us */
1317 (void)status;
1318 return( PSA_ERROR_INVALID_ARGUMENT );
1319 }
1320}
Steven Cooremancd84cb42020-07-16 20:28:36 +02001321/* End of automatically generated file. */