blob: 9bef02cd0029edf19c51d762d30e556da14169ed [file] [log] [blame]
Steven Cooremancd84cb42020-07-16 20:28:36 +02001/*
2 * Functions to delegate cryptographic operations to an available
3 * and appropriate accelerator.
Steven Cooreman56250fd2020-09-04 13:07:15 +02004 * Warning: This file will be auto-generated in the future.
Steven Cooremancd84cb42020-07-16 20:28:36 +02005 */
Steven Cooreman2c7b2f82020-09-02 13:43:46 +02006/* Copyright The Mbed TLS Contributors
Steven Cooremancd84cb42020-07-16 20:28:36 +02007 * SPDX-License-Identifier: Apache-2.0
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
10 * not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
Steven Cooremancd84cb42020-07-16 20:28:36 +020020 */
21
Ronald Cronde822812021-03-17 16:08:20 +010022#include "psa_crypto_aead.h"
Ronald Cron0b805592020-12-14 18:08:20 +010023#include "psa_crypto_cipher.h"
Steven Cooremancd84cb42020-07-16 20:28:36 +020024#include "psa_crypto_core.h"
25#include "psa_crypto_driver_wrappers.h"
Steven Cooreman830aff22021-03-09 09:50:44 +010026#include "psa_crypto_hash.h"
27
Steven Cooreman2a1664c2020-07-20 15:33:08 +020028#include "mbedtls/platform.h"
29
30#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS)
Steven Cooremancd84cb42020-07-16 20:28:36 +020031
32/* Include test driver definition when running tests */
Steven Cooremanf1720ea2020-07-24 18:41:58 +020033#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman56250fd2020-09-04 13:07:15 +020034#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020035#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020036#endif
37#ifndef PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020038#define PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020039#endif
Ronald Cron05ee58d2021-04-30 17:00:34 +020040#include "test/drivers/test_driver.h"
Steven Cooremanf1720ea2020-07-24 18:41:58 +020041#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooremancd84cb42020-07-16 20:28:36 +020042
Steven Cooreman56250fd2020-09-04 13:07:15 +020043/* Repeat above block for each JSON-declared driver during autogeneration */
Steven Cooremanaa87fd02021-03-15 18:54:03 +010044#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */
Steven Cooreman56250fd2020-09-04 13:07:15 +020045
Steven Cooreman1e582352021-02-18 17:24:37 +010046/* Auto-generated values depending on which drivers are registered.
47 * ID 0 is reserved for unallocated operations.
48 * ID 1 is reserved for the Mbed TLS software driver. */
Steven Cooreman830aff22021-03-09 09:50:44 +010049#define PSA_CRYPTO_MBED_TLS_DRIVER_ID (1)
50
Steven Cooreman37941cb2020-07-28 18:49:51 +020051#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman1e582352021-02-18 17:24:37 +010052#define PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID (2)
53#define PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID (3)
Steven Cooreman37941cb2020-07-28 18:49:51 +020054#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman2a1664c2020-07-20 15:33:08 +020055
56/* Support the 'old' SE interface when asked to */
Steven Cooreman7a250572020-07-17 16:43:05 +020057#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Steven Cooreman56250fd2020-09-04 13:07:15 +020058/* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style
59 * SE driver is present, to avoid unused argument errors at compile time. */
60#ifndef PSA_CRYPTO_DRIVER_PRESENT
Steven Cooremanf1720ea2020-07-24 18:41:58 +020061#define PSA_CRYPTO_DRIVER_PRESENT
Steven Cooreman56250fd2020-09-04 13:07:15 +020062#endif
Steven Cooreman7a250572020-07-17 16:43:05 +020063#include "psa_crypto_se.h"
64#endif
65
Steven Cooremancd84cb42020-07-16 20:28:36 +020066/* Start delegation functions */
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 *key_buffer_size = mbedtls_test_size_function( key_type, key_bits );
Ronald Cronb0737da2021-04-14 10:55:34 +0200272 return( ( *key_buffer_size != 0 ) ?
273 PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED );
John Durkop2c618352020-09-22 06:54:01 -0700274#endif /* PSA_CRYPTO_DRIVER_TEST */
275
276 default:
Ronald Cron9df74be2020-12-05 19:15:23 +0100277 (void)key_type;
278 (void)key_bits;
Steven Cooreman56250fd2020-09-04 13:07:15 +0200279 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200280 }
281}
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200282
Ronald Cron977c2472020-10-13 08:32:21 +0200283psa_status_t psa_driver_wrapper_generate_key(
284 const psa_key_attributes_t *attributes,
285 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200286{
Ronald Cron977c2472020-10-13 08:32:21 +0200287 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
288 psa_key_location_t location =
289 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
290
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200291 /* Try dynamically-registered SE interface first */
292#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
293 const psa_drv_se_t *drv;
294 psa_drv_se_context_t *drv_context;
295
Ronald Cron977c2472020-10-13 08:32:21 +0200296 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200297 {
298 size_t pubkey_length = 0; /* We don't support this feature yet */
299 if( drv->key_management == NULL ||
300 drv->key_management->p_generate == NULL )
301 {
302 /* Key is defined as being in SE, but we have no way to generate it */
Steven Cooreman56250fd2020-09-04 13:07:15 +0200303 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200304 }
305 return( drv->key_management->p_generate(
Ronald Cron977c2472020-10-13 08:32:21 +0200306 drv_context,
307 *( (psa_key_slot_number_t *)key_buffer ),
Ronald Cronea0f8a62020-11-25 17:52:23 +0100308 attributes, NULL, 0, &pubkey_length ) );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200309 }
310#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
311
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200312 switch( location )
313 {
314 case PSA_KEY_LOCATION_LOCAL_STORAGE:
Ronald Cron977c2472020-10-13 08:32:21 +0200315#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200316 /* Transparent drivers are limited to generating asymmetric keys */
Ronald Cron977c2472020-10-13 08:32:21 +0200317 if( PSA_KEY_TYPE_IS_ASYMMETRIC( attributes->core.type ) )
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200318 {
Ronald Cron977c2472020-10-13 08:32:21 +0200319 /* Cycle through all known transparent accelerators */
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200320#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200321 status = mbedtls_test_transparent_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200322 attributes, key_buffer, key_buffer_size,
323 key_buffer_length );
324 /* Declared with fallback == true */
325 if( status != PSA_ERROR_NOT_SUPPORTED )
326 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200327#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200328 }
329#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
330
331 /* Software fallback */
332 status = psa_generate_key_internal(
333 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200334 break;
Ronald Cron977c2472020-10-13 08:32:21 +0200335
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200336 /* Add cases for opaque driver here */
Ronald Cron977c2472020-10-13 08:32:21 +0200337#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200338#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100339 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200340 status = mbedtls_test_opaque_generate_key(
Ronald Cron977c2472020-10-13 08:32:21 +0200341 attributes, key_buffer, key_buffer_size, key_buffer_length );
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200342 break;
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200343#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200344#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
345
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200346 default:
347 /* Key is declared with a lifetime not known to us */
348 status = PSA_ERROR_INVALID_ARGUMENT;
349 break;
350 }
351
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200352 return( status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200353}
354
Ronald Cron83282872020-11-22 14:02:39 +0100355psa_status_t psa_driver_wrapper_import_key(
356 const psa_key_attributes_t *attributes,
357 const uint8_t *data,
358 size_t data_length,
359 uint8_t *key_buffer,
360 size_t key_buffer_size,
361 size_t *key_buffer_length,
362 size_t *bits )
Steven Cooreman04524762020-10-13 17:43:44 +0200363{
Steven Cooreman04524762020-10-13 17:43:44 +0200364 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cronbf33c932020-11-28 18:06:53 +0100365 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
366 psa_get_key_lifetime( attributes ) );
Steven Cooreman04524762020-10-13 17:43:44 +0200367
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100368 /* Try dynamically-registered SE interface first */
369#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
370 const psa_drv_se_t *drv;
371 psa_drv_se_context_t *drv_context;
372
373 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
374 {
375 if( drv->key_management == NULL ||
376 drv->key_management->p_import == NULL )
377 return( PSA_ERROR_NOT_SUPPORTED );
378
379 /* The driver should set the number of key bits, however in
380 * case it doesn't, we initialize bits to an invalid value. */
381 *bits = PSA_MAX_KEY_BITS + 1;
382 status = drv->key_management->p_import(
383 drv_context,
384 *( (psa_key_slot_number_t *)key_buffer ),
385 attributes, data, data_length, bits );
386
387 if( status != PSA_SUCCESS )
388 return( status );
389
390 if( (*bits) > PSA_MAX_KEY_BITS )
391 return( PSA_ERROR_NOT_SUPPORTED );
392
393 return( PSA_SUCCESS );
394 }
395#endif /* PSA_CRYPTO_SE_C */
396
Ronald Cronbf33c932020-11-28 18:06:53 +0100397 switch( location )
398 {
399 case PSA_KEY_LOCATION_LOCAL_STORAGE:
400 /* Key is stored in the slot in export representation, so
401 * cycle through all known transparent accelerators */
402#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
403#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200404 status = mbedtls_test_transparent_import_key(
405 attributes,
406 data, data_length,
407 key_buffer, key_buffer_size,
408 key_buffer_length, bits );
Ronald Cronbf33c932020-11-28 18:06:53 +0100409 /* Declared with fallback == true */
410 if( status != PSA_ERROR_NOT_SUPPORTED )
411 return( status );
412#endif /* PSA_CRYPTO_DRIVER_TEST */
413#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
414 /* Fell through, meaning no accelerator supports this operation */
415 return( psa_import_key_into_slot( attributes,
416 data, data_length,
417 key_buffer, key_buffer_size,
418 key_buffer_length, bits ) );
419
420 default:
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100421 /* Importing a key with external storage in not yet supported.
422 * Return in error indicating that the lifetime is not valid. */
Ronald Cronbf33c932020-11-28 18:06:53 +0100423 (void)status;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100424 return( PSA_ERROR_INVALID_ARGUMENT );
Ronald Cronbf33c932020-11-28 18:06:53 +0100425 }
426
Steven Cooreman04524762020-10-13 17:43:44 +0200427}
428
Ronald Cron67227982020-11-26 15:16:05 +0100429psa_status_t psa_driver_wrapper_export_key(
430 const psa_key_attributes_t *attributes,
431 const uint8_t *key_buffer, size_t key_buffer_size,
432 uint8_t *data, size_t data_size, size_t *data_length )
433
434{
435 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
436 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
437 psa_get_key_lifetime( attributes ) );
438
Ronald Cron152e3f82020-11-26 16:06:41 +0100439 /* Try dynamically-registered SE interface first */
440#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
441 const psa_drv_se_t *drv;
442 psa_drv_se_context_t *drv_context;
443
444 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
445 {
446 if( ( drv->key_management == NULL ) ||
447 ( drv->key_management->p_export == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100448 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100449 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100450 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100451
452 return( drv->key_management->p_export(
453 drv_context,
454 *( (psa_key_slot_number_t *)key_buffer ),
455 data, data_size, data_length ) );
456 }
457#endif /* PSA_CRYPTO_SE_C */
458
Ronald Cron67227982020-11-26 15:16:05 +0100459 switch( location )
460 {
461 case PSA_KEY_LOCATION_LOCAL_STORAGE:
462 return( psa_export_key_internal( attributes,
463 key_buffer,
464 key_buffer_size,
465 data,
466 data_size,
467 data_length ) );
468
469 /* Add cases for opaque driver here */
470#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
471#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100472 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200473 return( mbedtls_test_opaque_export_key( attributes,
474 key_buffer,
475 key_buffer_size,
476 data,
477 data_size,
478 data_length ) );
Ronald Cron67227982020-11-26 15:16:05 +0100479#endif /* PSA_CRYPTO_DRIVER_TEST */
480#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
481 default:
482 /* Key is declared with a lifetime not known to us */
483 return( status );
484 }
485}
486
Ronald Cron84cc9942020-11-25 14:30:05 +0100487psa_status_t psa_driver_wrapper_export_public_key(
488 const psa_key_attributes_t *attributes,
489 const uint8_t *key_buffer, size_t key_buffer_size,
490 uint8_t *data, size_t data_size, size_t *data_length )
491
Steven Cooremanb9b84422020-10-14 14:39:20 +0200492{
Steven Cooremanb9b84422020-10-14 14:39:20 +0200493 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Cron84cc9942020-11-25 14:30:05 +0100494 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(
495 psa_get_key_lifetime( attributes ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200496
Ronald Cron152e3f82020-11-26 16:06:41 +0100497 /* Try dynamically-registered SE interface first */
498#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
499 const psa_drv_se_t *drv;
500 psa_drv_se_context_t *drv_context;
501
502 if( psa_get_se_driver( attributes->core.lifetime, &drv, &drv_context ) )
503 {
504 if( ( drv->key_management == NULL ) ||
505 ( drv->key_management->p_export_public == NULL ) )
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100506 {
Ronald Cron152e3f82020-11-26 16:06:41 +0100507 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100508 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100509
510 return( drv->key_management->p_export_public(
511 drv_context,
512 *( (psa_key_slot_number_t *)key_buffer ),
513 data, data_size, data_length ) );
514 }
515#endif /* MBEDTLS_PSA_CRYPTO_SE_C */
516
Steven Cooremanb9b84422020-10-14 14:39:20 +0200517 switch( location )
518 {
519 case PSA_KEY_LOCATION_LOCAL_STORAGE:
520 /* Key is stored in the slot in export representation, so
521 * cycle through all known transparent accelerators */
Ronald Cron67227982020-11-26 15:16:05 +0100522#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200523#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200524 status = mbedtls_test_transparent_export_public_key(
525 attributes,
526 key_buffer,
527 key_buffer_size,
528 data,
529 data_size,
530 data_length );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200531 /* Declared with fallback == true */
532 if( status != PSA_ERROR_NOT_SUPPORTED )
533 return( status );
534#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100535#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200536 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron67227982020-11-26 15:16:05 +0100537 return( psa_export_public_key_internal( attributes,
538 key_buffer,
539 key_buffer_size,
540 data,
541 data_size,
542 data_length ) );
543
Steven Cooremanb9b84422020-10-14 14:39:20 +0200544 /* Add cases for opaque driver here */
Ronald Cron67227982020-11-26 15:16:05 +0100545#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooremanb9b84422020-10-14 14:39:20 +0200546#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100547 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200548 return( mbedtls_test_opaque_export_public_key( attributes,
549 key_buffer,
550 key_buffer_size,
551 data,
552 data_size,
553 data_length ) );
Steven Cooremanb9b84422020-10-14 14:39:20 +0200554#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron67227982020-11-26 15:16:05 +0100555#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200556 default:
557 /* Key is declared with a lifetime not known to us */
558 return( status );
559 }
Steven Cooremanb9b84422020-10-14 14:39:20 +0200560}
561
Steven Cooreman6801f082021-02-19 17:21:22 +0100562psa_status_t psa_driver_wrapper_get_builtin_key(
563 psa_drv_slot_number_t slot_number,
564 psa_key_attributes_t *attributes,
565 uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
566{
567 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
568 switch( location )
569 {
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100570#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100571 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200572 return( mbedtls_test_opaque_get_builtin_key(
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100573 slot_number,
574 attributes,
575 key_buffer, key_buffer_size, key_buffer_length ) );
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100576#endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman6801f082021-02-19 17:21:22 +0100577 default:
578 (void) slot_number;
579 (void) key_buffer;
580 (void) key_buffer_size;
581 (void) key_buffer_length;
582 return( PSA_ERROR_DOES_NOT_EXIST );
583 }
584}
585
Steven Cooreman37941cb2020-07-28 18:49:51 +0200586/*
587 * Cipher functions
588 */
589psa_status_t psa_driver_wrapper_cipher_encrypt(
590 psa_key_slot_t *slot,
591 psa_algorithm_t alg,
592 const uint8_t *input,
593 size_t input_length,
594 uint8_t *output,
595 size_t output_size,
596 size_t *output_length )
597{
598#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
599 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
600 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
601 psa_key_attributes_t attributes = {
602 .core = slot->attr
603 };
604
605 switch( location )
606 {
607 case PSA_KEY_LOCATION_LOCAL_STORAGE:
608 /* Key is stored in the slot in export representation, so
609 * cycle through all known transparent accelerators */
610#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200611 status = mbedtls_test_transparent_cipher_encrypt( &attributes,
612 slot->key.data,
613 slot->key.bytes,
614 alg,
615 input,
616 input_length,
617 output,
618 output_size,
619 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200620 /* Declared with fallback == true */
621 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200622 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200623#endif /* PSA_CRYPTO_DRIVER_TEST */
624 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200625 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200626 /* Add cases for opaque driver here */
627#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100628 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200629 return( mbedtls_test_opaque_cipher_encrypt( &attributes,
630 slot->key.data,
631 slot->key.bytes,
632 alg,
633 input,
634 input_length,
635 output,
636 output_size,
637 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200638#endif /* PSA_CRYPTO_DRIVER_TEST */
639 default:
640 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200641 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200642 }
643#else /* PSA_CRYPTO_DRIVER_PRESENT */
644 (void) slot;
645 (void) alg;
646 (void) input;
647 (void) input_length;
648 (void) output;
649 (void) output_size;
650 (void) output_length;
651
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200652 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200653#endif /* PSA_CRYPTO_DRIVER_PRESENT */
654}
655
656psa_status_t psa_driver_wrapper_cipher_decrypt(
657 psa_key_slot_t *slot,
658 psa_algorithm_t alg,
659 const uint8_t *input,
660 size_t input_length,
661 uint8_t *output,
662 size_t output_size,
663 size_t *output_length )
664{
665#if defined(PSA_CRYPTO_DRIVER_PRESENT) && defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
666 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
667 psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime);
668 psa_key_attributes_t attributes = {
669 .core = slot->attr
670 };
671
672 switch( location )
673 {
674 case PSA_KEY_LOCATION_LOCAL_STORAGE:
675 /* Key is stored in the slot in export representation, so
676 * cycle through all known transparent accelerators */
677#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200678 status = mbedtls_test_transparent_cipher_decrypt( &attributes,
679 slot->key.data,
680 slot->key.bytes,
681 alg,
682 input,
683 input_length,
684 output,
685 output_size,
686 output_length );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200687 /* Declared with fallback == true */
688 if( status != PSA_ERROR_NOT_SUPPORTED )
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200689 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200690#endif /* PSA_CRYPTO_DRIVER_TEST */
691 /* Fell through, meaning no accelerator supports this operation */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200692 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200693 /* Add cases for opaque driver here */
694#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100695 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200696 return( mbedtls_test_opaque_cipher_decrypt( &attributes,
697 slot->key.data,
698 slot->key.bytes,
699 alg,
700 input,
701 input_length,
702 output,
703 output_size,
704 output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200705#endif /* PSA_CRYPTO_DRIVER_TEST */
706 default:
707 /* Key is declared with a lifetime not known to us */
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200708 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200709 }
710#else /* PSA_CRYPTO_DRIVER_PRESENT */
711 (void) slot;
712 (void) alg;
713 (void) input;
714 (void) input_length;
715 (void) output;
716 (void) output_size;
717 (void) output_length;
718
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200719 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200720#endif /* PSA_CRYPTO_DRIVER_PRESENT */
721}
722
723psa_status_t psa_driver_wrapper_cipher_encrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100724 psa_cipher_operation_t *operation,
725 const psa_key_attributes_t *attributes,
726 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200727 psa_algorithm_t alg )
728{
Ronald Cron0b805592020-12-14 18:08:20 +0100729 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Crona4af55f2020-12-14 14:36:06 +0100730 psa_key_location_t location =
731 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200732
Steven Cooreman37941cb2020-07-28 18:49:51 +0200733 switch( location )
734 {
735 case PSA_KEY_LOCATION_LOCAL_STORAGE:
736 /* Key is stored in the slot in export representation, so
737 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100738#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200739#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200740 status = mbedtls_test_transparent_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100741 &operation->ctx.transparent_test_driver_ctx,
742 attributes,
743 key_buffer,
744 key_buffer_size,
745 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200746 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200747 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100748 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200749
Ronald Cron0b805592020-12-14 18:08:20 +0100750 if( status != PSA_ERROR_NOT_SUPPORTED )
751 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200752#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100753#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100754#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200755 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100756 status = mbedtls_psa_cipher_encrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100757 attributes,
758 key_buffer,
759 key_buffer_size,
760 alg );
761 if( status == PSA_SUCCESS )
Ronald Cron6e412a72021-03-10 09:58:47 +0100762 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Ronald Cron49fafa92021-03-10 08:34:23 +0100763
Ronald Cron7b4154d2021-03-19 14:49:41 +0100764 if( status != PSA_ERROR_NOT_SUPPORTED )
765 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100766#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
767 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron0b805592020-12-14 18:08:20 +0100768
Steven Cooreman37941cb2020-07-28 18:49:51 +0200769 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100770#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200771#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100772 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200773 status = mbedtls_test_opaque_cipher_encrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100774 &operation->ctx.opaque_test_driver_ctx,
775 attributes,
776 key_buffer, key_buffer_size,
777 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200778
Steven Cooreman37941cb2020-07-28 18:49:51 +0200779 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100780 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200781
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200782 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200783#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100784#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200785 default:
786 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100787 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100788 (void)key_buffer;
789 (void)key_buffer_size;
790 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +0200791 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200792 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200793}
794
795psa_status_t psa_driver_wrapper_cipher_decrypt_setup(
Ronald Crona4af55f2020-12-14 14:36:06 +0100796 psa_cipher_operation_t *operation,
797 const psa_key_attributes_t *attributes,
798 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200799 psa_algorithm_t alg )
800{
Steven Cooreman37941cb2020-07-28 18:49:51 +0200801 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Crona4af55f2020-12-14 14:36:06 +0100802 psa_key_location_t location =
803 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200804
Steven Cooreman37941cb2020-07-28 18:49:51 +0200805 switch( location )
806 {
807 case PSA_KEY_LOCATION_LOCAL_STORAGE:
808 /* Key is stored in the slot in export representation, so
809 * cycle through all known transparent accelerators */
Ronald Cron0b805592020-12-14 18:08:20 +0100810#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200811#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200812 status = mbedtls_test_transparent_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100813 &operation->ctx.transparent_test_driver_ctx,
814 attributes,
815 key_buffer,
816 key_buffer_size,
817 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200818 /* Declared with fallback == true */
Steven Cooreman150c99b2020-09-09 14:32:44 +0200819 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100820 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200821
Ronald Cron0b805592020-12-14 18:08:20 +0100822 if( status != PSA_ERROR_NOT_SUPPORTED )
823 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200824#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100825#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100826#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200827 /* Fell through, meaning no accelerator supports this operation */
Ronald Cron6e412a72021-03-10 09:58:47 +0100828 status = mbedtls_psa_cipher_decrypt_setup( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100829 attributes,
830 key_buffer,
831 key_buffer_size,
832 alg );
833 if( status == PSA_SUCCESS )
834 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
835
836 return( status );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100837#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
838 return( PSA_ERROR_NOT_SUPPORTED );
Ronald Cron49fafa92021-03-10 08:34:23 +0100839
Steven Cooreman37941cb2020-07-28 18:49:51 +0200840 /* Add cases for opaque driver here */
Ronald Cron0b805592020-12-14 18:08:20 +0100841#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200842#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100843 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200844 status = mbedtls_test_opaque_cipher_decrypt_setup(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100845 &operation->ctx.opaque_test_driver_ctx,
846 attributes,
847 key_buffer, key_buffer_size,
848 alg );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200849
Steven Cooreman37941cb2020-07-28 18:49:51 +0200850 if( status == PSA_SUCCESS )
Ronald Cron49fafa92021-03-10 08:34:23 +0100851 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200852
Steven Cooreman5240e8b2020-09-09 11:51:45 +0200853 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200854#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron0b805592020-12-14 18:08:20 +0100855#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200856 default:
857 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100858 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100859 (void)key_buffer;
860 (void)key_buffer_size;
861 (void)alg;
Ronald Cronc45b4af2020-09-29 16:18:05 +0200862 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200863 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200864}
865
Steven Cooreman37941cb2020-07-28 18:49:51 +0200866psa_status_t psa_driver_wrapper_cipher_set_iv(
Ronald Cron6056fe82020-12-15 13:58:07 +0100867 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200868 const uint8_t *iv,
869 size_t iv_length )
870{
Ronald Cron49fafa92021-03-10 08:34:23 +0100871 switch( operation->id )
872 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100873#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100874 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100875 return( mbedtls_psa_cipher_set_iv( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100876 iv,
877 iv_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100878#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100879
880#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200881#if defined(PSA_CRYPTO_DRIVER_TEST)
882 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200883 return( mbedtls_test_transparent_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100884 &operation->ctx.transparent_test_driver_ctx,
885 iv, iv_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +0100886
Steven Cooreman37941cb2020-07-28 18:49:51 +0200887 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200888 return( mbedtls_test_opaque_cipher_set_iv(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100889 &operation->ctx.opaque_test_driver_ctx,
890 iv, iv_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200891#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100892#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +0100893 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200894
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100895 (void)iv;
896 (void)iv_length;
897
Ronald Crondd24c9b2020-12-15 14:10:01 +0100898 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200899}
900
901psa_status_t psa_driver_wrapper_cipher_update(
Ronald Cron6056fe82020-12-15 13:58:07 +0100902 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200903 const uint8_t *input,
904 size_t input_length,
905 uint8_t *output,
906 size_t output_size,
907 size_t *output_length )
908{
Ronald Cron49fafa92021-03-10 08:34:23 +0100909 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200910 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100911#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100912 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100913 return( mbedtls_psa_cipher_update( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100914 input,
915 input_length,
916 output,
917 output_size,
918 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100919#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
920
Ronald Cron49fafa92021-03-10 08:34:23 +0100921#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200922#if defined(PSA_CRYPTO_DRIVER_TEST)
923 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200924 return( mbedtls_test_transparent_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100925 &operation->ctx.transparent_test_driver_ctx,
926 input, input_length,
927 output, output_size, output_length ) );
928
Steven Cooreman37941cb2020-07-28 18:49:51 +0200929 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200930 return( mbedtls_test_opaque_cipher_update(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100931 &operation->ctx.opaque_test_driver_ctx,
932 input, input_length,
933 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200934#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100935#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +0100936 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200937
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100938 (void)input;
939 (void)input_length;
940 (void)output;
941 (void)output_size;
942 (void)output_length;
943
Ronald Crondd24c9b2020-12-15 14:10:01 +0100944 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200945}
946
947psa_status_t psa_driver_wrapper_cipher_finish(
Ronald Cron6056fe82020-12-15 13:58:07 +0100948 psa_cipher_operation_t *operation,
Steven Cooreman37941cb2020-07-28 18:49:51 +0200949 uint8_t *output,
950 size_t output_size,
951 size_t *output_length )
952{
Ronald Cron49fafa92021-03-10 08:34:23 +0100953 switch( operation->id )
954 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100955#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100956 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100957 return( mbedtls_psa_cipher_finish( &operation->ctx.mbedtls_ctx,
Ronald Cron49fafa92021-03-10 08:34:23 +0100958 output,
959 output_size,
960 output_length ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100961#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100962
963#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200964#if defined(PSA_CRYPTO_DRIVER_TEST)
965 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200966 return( mbedtls_test_transparent_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100967 &operation->ctx.transparent_test_driver_ctx,
968 output, output_size, output_length ) );
Ronald Cron49fafa92021-03-10 08:34:23 +0100969
Steven Cooreman37941cb2020-07-28 18:49:51 +0200970 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200971 return( mbedtls_test_opaque_cipher_finish(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100972 &operation->ctx.opaque_test_driver_ctx,
973 output, output_size, output_length ) );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200974#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100975#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +0100976 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200977
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100978 (void)output;
979 (void)output_size;
980 (void)output_length;
981
Ronald Crondd24c9b2020-12-15 14:10:01 +0100982 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +0200983}
984
985psa_status_t psa_driver_wrapper_cipher_abort(
Ronald Cron6056fe82020-12-15 13:58:07 +0100986 psa_cipher_operation_t *operation )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200987{
Ronald Crondd24c9b2020-12-15 14:10:01 +0100988 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200989
Ronald Cron49fafa92021-03-10 08:34:23 +0100990 switch( operation->id )
Steven Cooreman37941cb2020-07-28 18:49:51 +0200991 {
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100992#if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100993 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Ronald Cron6e412a72021-03-10 09:58:47 +0100994 return( mbedtls_psa_cipher_abort( &operation->ctx.mbedtls_ctx ) );
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100995#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron49fafa92021-03-10 08:34:23 +0100996
997#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200998#if defined(PSA_CRYPTO_DRIVER_TEST)
999 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001000 status = mbedtls_test_transparent_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001001 &operation->ctx.transparent_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001002 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001003 &operation->ctx.transparent_test_driver_ctx,
1004 sizeof( operation->ctx.transparent_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001005 return( status );
Ronald Cron49fafa92021-03-10 08:34:23 +01001006
Steven Cooreman37941cb2020-07-28 18:49:51 +02001007 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001008 status = mbedtls_test_opaque_cipher_abort(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001009 &operation->ctx.opaque_test_driver_ctx );
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001010 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001011 &operation->ctx.opaque_test_driver_ctx,
1012 sizeof( operation->ctx.opaque_test_driver_ctx ) );
Steven Cooreman5240e8b2020-09-09 11:51:45 +02001013 return( status );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001014#endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Crondd24c9b2020-12-15 14:10:01 +01001015#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001016 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001017
Ronald Cron49fafa92021-03-10 08:34:23 +01001018 (void)status;
Ronald Crondd24c9b2020-12-15 14:10:01 +01001019 return( PSA_ERROR_INVALID_ARGUMENT );
Steven Cooreman37941cb2020-07-28 18:49:51 +02001020}
1021
Steven Cooreman1e582352021-02-18 17:24:37 +01001022/*
1023 * Hashing functions
1024 */
1025psa_status_t psa_driver_wrapper_hash_compute(
1026 psa_algorithm_t alg,
1027 const uint8_t *input,
1028 size_t input_length,
1029 uint8_t *hash,
1030 size_t hash_size,
1031 size_t *hash_length)
1032{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001033 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001034
1035 /* Try accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001036#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001037 status = mbedtls_test_transparent_hash_compute(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001038 alg, input, input_length, hash, hash_size, hash_length );
Steven Cooremanf7638102021-03-04 15:14:36 +01001039 if( status != PSA_ERROR_NOT_SUPPORTED )
1040 return( status );
1041#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001042
1043 /* If software fallback is compiled in, try fallback */
1044#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1045 status = mbedtls_psa_hash_compute( alg, input, input_length,
1046 hash, hash_size, hash_length );
1047 if( status != PSA_ERROR_NOT_SUPPORTED )
1048 return( status );
1049#endif
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001050 (void) status;
1051 (void) alg;
1052 (void) input;
1053 (void) input_length;
1054 (void) hash;
1055 (void) hash_size;
1056 (void) hash_length;
Steven Cooreman1e582352021-02-18 17:24:37 +01001057
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001058 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman1e582352021-02-18 17:24:37 +01001059}
1060
1061psa_status_t psa_driver_wrapper_hash_setup(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001062 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001063 psa_algorithm_t alg )
1064{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001065 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001066
Steven Cooreman1e582352021-02-18 17:24:37 +01001067 /* Try setup on accelerators first */
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001068#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001069 status = mbedtls_test_transparent_hash_setup(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001070 &operation->ctx.test_driver_ctx, alg );
Steven Cooremanf7638102021-03-04 15:14:36 +01001071 if( status == PSA_SUCCESS )
1072 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1073
1074 if( status != PSA_ERROR_NOT_SUPPORTED )
1075 return( status );
1076#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001077
1078 /* If software fallback is compiled in, try fallback */
1079#if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001080 status = mbedtls_psa_hash_setup( &operation->ctx.mbedtls_ctx, alg );
Steven Cooreman1e582352021-02-18 17:24:37 +01001081 if( status == PSA_SUCCESS )
Steven Cooreman1e582352021-02-18 17:24:37 +01001082 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Steven Cooreman1e582352021-02-18 17:24:37 +01001083
1084 if( status != PSA_ERROR_NOT_SUPPORTED )
1085 return( status );
1086#endif
1087 /* Nothing left to try if we fall through here */
1088 (void) status;
1089 (void) operation;
1090 (void) alg;
1091 return( PSA_ERROR_NOT_SUPPORTED );
1092}
1093
1094psa_status_t psa_driver_wrapper_hash_clone(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001095 const psa_hash_operation_t *source_operation,
1096 psa_hash_operation_t *target_operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001097{
Steven Cooreman1e582352021-02-18 17:24:37 +01001098 switch( source_operation->id )
1099 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001100#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1101 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1102 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1103 return( mbedtls_psa_hash_clone( &source_operation->ctx.mbedtls_ctx,
1104 &target_operation->ctx.mbedtls_ctx ) );
1105#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001106#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001107 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1108 target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001109 return( mbedtls_test_transparent_hash_clone(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001110 &source_operation->ctx.test_driver_ctx,
1111 &target_operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001112#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001113 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001114 (void) target_operation;
1115 return( PSA_ERROR_BAD_STATE );
1116 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001117}
1118
1119psa_status_t psa_driver_wrapper_hash_update(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001120 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001121 const uint8_t *input,
1122 size_t input_length )
1123{
Steven Cooreman1e582352021-02-18 17:24:37 +01001124 switch( operation->id )
1125 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001126#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1127 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1128 return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
1129 input, input_length ) );
1130#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001131#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001132 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001133 return( mbedtls_test_transparent_hash_update(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001134 &operation->ctx.test_driver_ctx,
1135 input, input_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001136#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001137 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001138 (void) input;
1139 (void) input_length;
1140 return( PSA_ERROR_BAD_STATE );
1141 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001142}
1143
1144psa_status_t psa_driver_wrapper_hash_finish(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001145 psa_hash_operation_t *operation,
Steven Cooreman1e582352021-02-18 17:24:37 +01001146 uint8_t *hash,
1147 size_t hash_size,
1148 size_t *hash_length )
1149{
Steven Cooreman1e582352021-02-18 17:24:37 +01001150 switch( operation->id )
1151 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001152#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1153 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1154 return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
1155 hash, hash_size, hash_length ) );
1156#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001157#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001158 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001159 return( mbedtls_test_transparent_hash_finish(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001160 &operation->ctx.test_driver_ctx,
1161 hash, hash_size, hash_length ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001162#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001163 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001164 (void) hash;
1165 (void) hash_size;
1166 (void) hash_length;
1167 return( PSA_ERROR_BAD_STATE );
1168 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001169}
1170
1171psa_status_t psa_driver_wrapper_hash_abort(
Steven Cooremandbf8ced2021-03-04 13:01:18 +01001172 psa_hash_operation_t *operation )
Steven Cooreman1e582352021-02-18 17:24:37 +01001173{
Steven Cooreman1e582352021-02-18 17:24:37 +01001174 switch( operation->id )
1175 {
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001176#if defined(MBEDTLS_PSA_BUILTIN_HASH)
1177 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1178 return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
1179#endif
Steven Cooremanf8e45a42021-03-16 11:07:55 +01001180#if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001181 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001182 return( mbedtls_test_transparent_hash_abort(
Steven Cooreman0f8ffa82021-03-15 11:56:33 +01001183 &operation->ctx.test_driver_ctx ) );
Steven Cooremanf7638102021-03-04 15:14:36 +01001184#endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001185 default:
Steven Cooreman1e582352021-02-18 17:24:37 +01001186 return( PSA_ERROR_BAD_STATE );
1187 }
1188}
1189
Ronald Cronde822812021-03-17 16:08:20 +01001190psa_status_t psa_driver_wrapper_aead_encrypt(
1191 const psa_key_attributes_t *attributes,
1192 const uint8_t *key_buffer, size_t key_buffer_size,
1193 psa_algorithm_t alg,
1194 const uint8_t *nonce, size_t nonce_length,
1195 const uint8_t *additional_data, size_t additional_data_length,
1196 const uint8_t *plaintext, size_t plaintext_length,
1197 uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length )
1198{
1199 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1200 psa_key_location_t location =
1201 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1202
1203 switch( location )
1204 {
1205 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1206 /* Key is stored in the slot in export representation, so
1207 * cycle through all known transparent accelerators */
1208
1209#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1210#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001211 status = mbedtls_test_transparent_aead_encrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001212 attributes, key_buffer, key_buffer_size,
1213 alg,
1214 nonce, nonce_length,
1215 additional_data, additional_data_length,
1216 plaintext, plaintext_length,
1217 ciphertext, ciphertext_size, ciphertext_length );
1218 /* Declared with fallback == true */
1219 if( status != PSA_ERROR_NOT_SUPPORTED )
1220 return( status );
1221#endif /* PSA_CRYPTO_DRIVER_TEST */
1222#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1223
1224 /* Fell through, meaning no accelerator supports this operation */
1225 return( mbedtls_psa_aead_encrypt(
1226 attributes, key_buffer, key_buffer_size,
1227 alg,
1228 nonce, nonce_length,
1229 additional_data, additional_data_length,
1230 plaintext, plaintext_length,
1231 ciphertext, ciphertext_size, ciphertext_length ) );
1232
1233 /* Add cases for opaque driver here */
1234
1235 default:
1236 /* Key is declared with a lifetime not known to us */
1237 (void)status;
1238 return( PSA_ERROR_INVALID_ARGUMENT );
1239 }
1240}
1241
1242psa_status_t psa_driver_wrapper_aead_decrypt(
1243 const psa_key_attributes_t *attributes,
1244 const uint8_t *key_buffer, size_t key_buffer_size,
1245 psa_algorithm_t alg,
1246 const uint8_t *nonce, size_t nonce_length,
1247 const uint8_t *additional_data, size_t additional_data_length,
1248 const uint8_t *ciphertext, size_t ciphertext_length,
1249 uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length )
1250{
1251 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1252 psa_key_location_t location =
1253 PSA_KEY_LIFETIME_GET_LOCATION( attributes->core.lifetime );
1254
1255 switch( location )
1256 {
1257 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1258 /* Key is stored in the slot in export representation, so
1259 * cycle through all known transparent accelerators */
1260
1261#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1262#if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cronc4bc12e2021-04-13 12:41:34 +02001263 status = mbedtls_test_transparent_aead_decrypt(
Ronald Cronde822812021-03-17 16:08:20 +01001264 attributes, key_buffer, key_buffer_size,
1265 alg,
1266 nonce, nonce_length,
1267 additional_data, additional_data_length,
1268 ciphertext, ciphertext_length,
1269 plaintext, plaintext_size, plaintext_length );
1270 /* Declared with fallback == true */
1271 if( status != PSA_ERROR_NOT_SUPPORTED )
1272 return( status );
1273#endif /* PSA_CRYPTO_DRIVER_TEST */
1274#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1275
1276 /* Fell through, meaning no accelerator supports this operation */
1277 return( mbedtls_psa_aead_decrypt(
1278 attributes, key_buffer, key_buffer_size,
1279 alg,
1280 nonce, nonce_length,
1281 additional_data, additional_data_length,
1282 ciphertext, ciphertext_length,
1283 plaintext, plaintext_size, plaintext_length ) );
1284
1285 /* Add cases for opaque driver here */
1286
1287 default:
1288 /* Key is declared with a lifetime not known to us */
1289 (void)status;
1290 return( PSA_ERROR_INVALID_ARGUMENT );
1291 }
1292}
Steven Cooremancd84cb42020-07-16 20:28:36 +02001293/* End of automatically generated file. */