blob: 96095995f76fba87b0ef8eb9fc3b1b6d8406a368 [file] [log] [blame]
Steven Cooremancd84cb42020-07-16 20:28:36 +02001/*
2 * Functions to delegate cryptographic operations to an available
3 * and appropriate accelerator.
Steven Cooreman56250fd2020-09-04 13:07:15 +02004 * Warning: This file will be auto-generated in the future.
Steven Cooremancd84cb42020-07-16 20:28:36 +02005 */
Steven Cooreman2c7b2f82020-09-02 13:43:46 +02006/* Copyright The Mbed TLS Contributors
Steven Cooremancd84cb42020-07-16 20:28:36 +02007 * SPDX-License-Identifier: Apache-2.0
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
10 * not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
Steven Cooremancd84cb42020-07-16 20:28:36 +020020 */
21
Mateusz Starzyk2c09c9b2021-05-14 22:20:10 +020022#include "common.h"
Ronald Cronde822812021-03-17 16:08:20 +010023#include "psa_crypto_aead.h"
Ronald Cron0b805592020-12-14 18:08:20 +010024#include "psa_crypto_cipher.h"
Steven Cooremancd84cb42020-07-16 20:28:36 +020025#include "psa_crypto_core.h"
26#include "psa_crypto_driver_wrappers.h"
Steven Cooreman830aff22021-03-09 09:50:44 +010027#include "psa_crypto_hash.h"
Steven Cooremand13a70f2021-03-19 15:24:23 +010028#include "psa_crypto_mac.h"
Steven Cooreman830aff22021-03-09 09:50:44 +010029
Steven Cooreman2a1664c2020-07-20 15:33:08 +020030#include "mbedtls/platform.h"
31
Gilles Peskine1905a242021-04-24 13:19:45 +020032#if defined(MBEDTLS_PSA_CRYPTO_C)
33
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020034# if defined(MBEDTLS_PSA_CRYPTO_DRIVERS)
Steven Cooremancd84cb42020-07-16 20:28:36 +020035
36/* Include test driver definition when running tests */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020037# if defined(PSA_CRYPTO_DRIVER_TEST)
38# ifndef PSA_CRYPTO_DRIVER_PRESENT
39# define PSA_CRYPTO_DRIVER_PRESENT
40# endif
41# ifndef PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
42# define PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT
43# endif
44# include "test/drivers/test_driver.h"
45# endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooremancd84cb42020-07-16 20:28:36 +020046
Steven Cooreman56250fd2020-09-04 13:07:15 +020047/* Repeat above block for each JSON-declared driver during autogeneration */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020048# endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */
Steven Cooreman56250fd2020-09-04 13:07:15 +020049
Steven Cooreman1e582352021-02-18 17:24:37 +010050/* Auto-generated values depending on which drivers are registered.
51 * ID 0 is reserved for unallocated operations.
52 * ID 1 is reserved for the Mbed TLS software driver. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020053# define PSA_CRYPTO_MBED_TLS_DRIVER_ID (1)
Steven Cooreman830aff22021-03-09 09:50:44 +010054
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020055# if defined(PSA_CRYPTO_DRIVER_TEST)
56# define PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID (2)
57# define PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID (3)
58# endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman2a1664c2020-07-20 15:33:08 +020059
60/* Support the 'old' SE interface when asked to */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020061# if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Steven Cooreman56250fd2020-09-04 13:07:15 +020062/* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style
63 * SE driver is present, to avoid unused argument errors at compile time. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020064# ifndef PSA_CRYPTO_DRIVER_PRESENT
65# define PSA_CRYPTO_DRIVER_PRESENT
66# endif
67# include "psa_crypto_se.h"
68# endif
Steven Cooreman7a250572020-07-17 16:43:05 +020069
Steven Cooremancd84cb42020-07-16 20:28:36 +020070/* Start delegation functions */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020071psa_status_t
72psa_driver_wrapper_sign_message(const psa_key_attributes_t *attributes,
73 const uint8_t *key_buffer,
74 size_t key_buffer_size,
75 psa_algorithm_t alg,
76 const uint8_t *input,
77 size_t input_length,
78 uint8_t *signature,
79 size_t signature_size,
80 size_t *signature_length)
gabor-mezei-arm50eac352021-04-22 11:32:19 +020081{
82 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
gabor-mezei-arm50eac352021-04-22 11:32:19 +020083 psa_key_location_t location =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020084 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
gabor-mezei-arm50eac352021-04-22 11:32:19 +020085
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020086 switch (location) {
gabor-mezei-arm50eac352021-04-22 11:32:19 +020087 case PSA_KEY_LOCATION_LOCAL_STORAGE:
88 /* Key is stored in the slot in export representation, so
89 * cycle through all known transparent accelerators */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020090# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
91# if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm50eac352021-04-22 11:32:19 +020092 status = mbedtls_test_transparent_signature_sign_message(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020093 attributes, key_buffer, key_buffer_size, alg, input,
94 input_length, signature, signature_size, signature_length);
gabor-mezei-arm50eac352021-04-22 11:32:19 +020095 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020096 if (status != PSA_ERROR_NOT_SUPPORTED)
97 return status;
98# endif /* PSA_CRYPTO_DRIVER_TEST */
99# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200100 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200101
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200102 /* Add cases for opaque driver here */
103# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
104# if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm2522c0b2021-04-27 18:52:51 +0200105 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200106 status = mbedtls_test_opaque_signature_sign_message(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200107 attributes, key_buffer, key_buffer_size, alg, input,
108 input_length, signature, signature_size, signature_length);
109 if (status != PSA_ERROR_NOT_SUPPORTED)
110 return status;
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200111 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200112# endif /* PSA_CRYPTO_DRIVER_TEST */
113# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200114 default:
115 /* Key is declared with a lifetime not known to us */
116 (void)status;
gabor-mezei-armd5218df2021-05-12 11:12:25 +0200117 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200118 }
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200119
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200120 return (psa_sign_message_builtin(attributes, key_buffer, key_buffer_size,
121 alg, input, input_length, signature,
122 signature_size, signature_length));
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200123}
124
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200125psa_status_t
126psa_driver_wrapper_verify_message(const psa_key_attributes_t *attributes,
127 const uint8_t *key_buffer,
128 size_t key_buffer_size,
129 psa_algorithm_t alg,
130 const uint8_t *input,
131 size_t input_length,
132 const uint8_t *signature,
133 size_t signature_length)
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200134{
135 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200136 psa_key_location_t location =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200137 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200138
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200139 switch (location) {
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200140 case PSA_KEY_LOCATION_LOCAL_STORAGE:
141 /* Key is stored in the slot in export representation, so
142 * cycle through all known transparent accelerators */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200143# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
144# if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200145 status = mbedtls_test_transparent_signature_verify_message(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200146 attributes, key_buffer, key_buffer_size, alg, input,
147 input_length, signature, signature_length);
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200148 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200149 if (status != PSA_ERROR_NOT_SUPPORTED)
150 return status;
151# endif /* PSA_CRYPTO_DRIVER_TEST */
152# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200153 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200154
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200155 /* Add cases for opaque driver here */
156# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
157# if defined(PSA_CRYPTO_DRIVER_TEST)
gabor-mezei-arm2522c0b2021-04-27 18:52:51 +0200158 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200159 return (mbedtls_test_opaque_signature_verify_message(
160 attributes, key_buffer, key_buffer_size, alg, input,
161 input_length, signature, signature_length));
162 if (status != PSA_ERROR_NOT_SUPPORTED)
163 return status;
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200164 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200165# endif /* PSA_CRYPTO_DRIVER_TEST */
166# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200167 default:
168 /* Key is declared with a lifetime not known to us */
169 (void)status;
gabor-mezei-armd5218df2021-05-12 11:12:25 +0200170 break;
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200171 }
gabor-mezei-arm256443e2021-05-07 15:16:34 +0200172
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200173 return (psa_verify_message_builtin(attributes, key_buffer, key_buffer_size,
174 alg, input, input_length, signature,
175 signature_length));
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200176}
177
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200178psa_status_t
179psa_driver_wrapper_sign_hash(const psa_key_attributes_t *attributes,
180 const uint8_t *key_buffer,
181 size_t key_buffer_size,
182 psa_algorithm_t alg,
183 const uint8_t *hash,
184 size_t hash_length,
185 uint8_t *signature,
186 size_t signature_size,
187 size_t *signature_length)
Steven Cooremancd84cb42020-07-16 20:28:36 +0200188{
Steven Cooreman7a250572020-07-17 16:43:05 +0200189 /* Try dynamically-registered SE interface first */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200190# if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Steven Cooreman7a250572020-07-17 16:43:05 +0200191 const psa_drv_se_t *drv;
192 psa_drv_se_context_t *drv_context;
193
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200194 if (psa_get_se_driver(attributes->core.lifetime, &drv, &drv_context)) {
195 if (drv->asymmetric == NULL || drv->asymmetric->p_sign == NULL) {
Steven Cooreman7a250572020-07-17 16:43:05 +0200196 /* Key is defined in SE, but we have no way to exercise it */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200197 return PSA_ERROR_NOT_SUPPORTED;
Steven Cooreman7a250572020-07-17 16:43:05 +0200198 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200199 return (drv->asymmetric->p_sign(
200 drv_context, *((psa_key_slot_number_t *)key_buffer), alg, hash,
201 hash_length, signature, signature_size, signature_length));
Steven Cooreman7a250572020-07-17 16:43:05 +0200202 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200203# endif /* PSA_CRYPTO_SE_C */
Steven Cooreman7a250572020-07-17 16:43:05 +0200204
Ronald Cronfce9df22020-12-08 18:06:03 +0100205 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100206 psa_key_location_t location =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200207 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
Steven Cooremancd84cb42020-07-16 20:28:36 +0200208
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200209 switch (location) {
Steven Cooremancd84cb42020-07-16 20:28:36 +0200210 case PSA_KEY_LOCATION_LOCAL_STORAGE:
211 /* Key is stored in the slot in export representation, so
212 * cycle through all known transparent accelerators */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200213# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
214# if defined(PSA_CRYPTO_DRIVER_TEST)
215 status = mbedtls_test_transparent_signature_sign_hash(
216 attributes, key_buffer, key_buffer_size, alg, hash, hash_length,
217 signature, signature_size, signature_length);
Steven Cooremancd84cb42020-07-16 20:28:36 +0200218 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200219 if (status != PSA_ERROR_NOT_SUPPORTED)
220 return status;
221# endif /* PSA_CRYPTO_DRIVER_TEST */
222# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200223 /* Fell through, meaning no accelerator supports this operation */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200224 return (psa_sign_hash_builtin(
225 attributes, key_buffer, key_buffer_size, alg, hash, hash_length,
226 signature, signature_size, signature_length));
Ronald Cronfce9df22020-12-08 18:06:03 +0100227
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200228 /* Add cases for opaque driver here */
229# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
230# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100231 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200232 return (mbedtls_test_opaque_signature_sign_hash(
233 attributes, key_buffer, key_buffer_size, alg, hash, hash_length,
234 signature, signature_size, signature_length));
235# endif /* PSA_CRYPTO_DRIVER_TEST */
236# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremancd84cb42020-07-16 20:28:36 +0200237 default:
238 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100239 (void)status;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200240 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooremancd84cb42020-07-16 20:28:36 +0200241 }
Steven Cooremancd84cb42020-07-16 20:28:36 +0200242}
243
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200244psa_status_t
245psa_driver_wrapper_verify_hash(const psa_key_attributes_t *attributes,
246 const uint8_t *key_buffer,
247 size_t key_buffer_size,
248 psa_algorithm_t alg,
249 const uint8_t *hash,
250 size_t hash_length,
251 const uint8_t *signature,
252 size_t signature_length)
Steven Cooreman55ae2172020-07-17 19:46:15 +0200253{
Steven Cooreman55ae2172020-07-17 19:46:15 +0200254 /* Try dynamically-registered SE interface first */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200255# if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Steven Cooreman55ae2172020-07-17 19:46:15 +0200256 const psa_drv_se_t *drv;
257 psa_drv_se_context_t *drv_context;
258
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200259 if (psa_get_se_driver(attributes->core.lifetime, &drv, &drv_context)) {
260 if (drv->asymmetric == NULL || drv->asymmetric->p_verify == NULL) {
Steven Cooreman55ae2172020-07-17 19:46:15 +0200261 /* Key is defined in SE, but we have no way to exercise it */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200262 return PSA_ERROR_NOT_SUPPORTED;
Steven Cooreman55ae2172020-07-17 19:46:15 +0200263 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200264 return (drv->asymmetric->p_verify(
265 drv_context, *((psa_key_slot_number_t *)key_buffer), alg, hash,
266 hash_length, signature, signature_length));
Steven Cooreman55ae2172020-07-17 19:46:15 +0200267 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200268# endif /* PSA_CRYPTO_SE_C */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200269
Ronald Cronfce9df22020-12-08 18:06:03 +0100270 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Cron9f17aa42020-12-08 17:07:25 +0100271 psa_key_location_t location =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200272 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
Steven Cooreman55ae2172020-07-17 19:46:15 +0200273
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200274 switch (location) {
Steven Cooreman55ae2172020-07-17 19:46:15 +0200275 case PSA_KEY_LOCATION_LOCAL_STORAGE:
276 /* Key is stored in the slot in export representation, so
277 * cycle through all known transparent accelerators */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200278# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
279# if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200280 status = mbedtls_test_transparent_signature_verify_hash(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200281 attributes, key_buffer, key_buffer_size, alg, hash, hash_length,
282 signature, signature_length);
Steven Cooreman55ae2172020-07-17 19:46:15 +0200283 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200284 if (status != PSA_ERROR_NOT_SUPPORTED)
285 return status;
286# endif /* PSA_CRYPTO_DRIVER_TEST */
287# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cronfce9df22020-12-08 18:06:03 +0100288
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200289 return (psa_verify_hash_builtin(
290 attributes, key_buffer, key_buffer_size, alg, hash, hash_length,
291 signature, signature_length));
Ronald Cronfce9df22020-12-08 18:06:03 +0100292
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200293 /* Add cases for opaque driver here */
294# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
295# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100296 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200297 return (mbedtls_test_opaque_signature_verify_hash(
298 attributes, key_buffer, key_buffer_size, alg, hash, hash_length,
299 signature, signature_length));
300# endif /* PSA_CRYPTO_DRIVER_TEST */
301# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200302 default:
303 /* Key is declared with a lifetime not known to us */
Ronald Cronfce9df22020-12-08 18:06:03 +0100304 (void)status;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200305 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooreman55ae2172020-07-17 19:46:15 +0200306 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200307}
308
Steven Cooremanb938b0b2021-04-06 13:08:42 +0200309/** Get the key buffer size required to store the key material of a key
310 * associated with an opaque driver without storage.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200311 *
Ronald Cron31216282020-12-05 18:47:56 +0100312 * \param[in] attributes The key attributes.
313 * \param[out] key_buffer_size Minimum buffer size to contain the key material
Steven Cooreman56250fd2020-09-04 13:07:15 +0200314 *
315 * \retval #PSA_SUCCESS
Ronald Cron31216282020-12-05 18:47:56 +0100316 * The minimum size for a buffer to contain the key material has been
317 * returned successfully.
318 * \retval #PSA_ERROR_INVALID_ARGUMENT
319 * The size in bits of the key is not valid.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200320 * \retval #PSA_ERROR_NOT_SUPPORTED
Ronald Cron31216282020-12-05 18:47:56 +0100321 * The type and/or the size in bits of the key or the combination of
322 * the two is not supported.
Steven Cooreman56250fd2020-09-04 13:07:15 +0200323 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200324psa_status_t
325psa_driver_wrapper_get_key_buffer_size(const psa_key_attributes_t *attributes,
326 size_t *key_buffer_size)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200327{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200328 psa_key_location_t location =
329 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
John Durkop2c618352020-09-22 06:54:01 -0700330 psa_key_type_t key_type = attributes->core.type;
331 size_t key_bits = attributes->core.bits;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200332
Ronald Cron31216282020-12-05 18:47:56 +0100333 *key_buffer_size = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200334 switch (location) {
335# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100336 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200337# if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS)
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100338 /* Emulate property 'builtin_key_size' */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200339 if (psa_key_id_is_builtin(MBEDTLS_SVC_KEY_ID_GET_KEY_ID(
340 psa_get_key_id(attributes)))) {
341 *key_buffer_size = sizeof(psa_drv_slot_number_t);
342 return PSA_SUCCESS;
Steven Cooremanf9a55ff2021-02-19 18:04:59 +0100343 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200344# endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */
345 *key_buffer_size = mbedtls_test_size_function(key_type, key_bits);
346 return ((*key_buffer_size != 0) ? PSA_SUCCESS :
347 PSA_ERROR_NOT_SUPPORTED);
348# endif /* PSA_CRYPTO_DRIVER_TEST */
John Durkop2c618352020-09-22 06:54:01 -0700349
350 default:
Ronald Cron9df74be2020-12-05 19:15:23 +0100351 (void)key_type;
352 (void)key_bits;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200353 return PSA_ERROR_NOT_SUPPORTED;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200354 }
355}
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200356
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200357psa_status_t
358psa_driver_wrapper_generate_key(const psa_key_attributes_t *attributes,
359 uint8_t *key_buffer,
360 size_t key_buffer_size,
361 size_t *key_buffer_length)
Steven Cooreman55ae2172020-07-17 19:46:15 +0200362{
Ronald Cron977c2472020-10-13 08:32:21 +0200363 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
364 psa_key_location_t location =
365 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
366
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200367 /* Try dynamically-registered SE interface first */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200368# if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200369 const psa_drv_se_t *drv;
370 psa_drv_se_context_t *drv_context;
371
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200372 if (psa_get_se_driver(attributes->core.lifetime, &drv, &drv_context)) {
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200373 size_t pubkey_length = 0; /* We don't support this feature yet */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200374 if (drv->key_management == NULL ||
375 drv->key_management->p_generate == NULL) {
376 /* Key is defined as being in SE, but we have no way to generate it
377 */
378 return PSA_ERROR_NOT_SUPPORTED;
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200379 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200380 return (drv->key_management->p_generate(
381 drv_context, *((psa_key_slot_number_t *)key_buffer), attributes,
382 NULL, 0, &pubkey_length));
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200383 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200384# endif /* MBEDTLS_PSA_CRYPTO_SE_C */
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200385
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200386 switch (location) {
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200387 case PSA_KEY_LOCATION_LOCAL_STORAGE:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200388# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200389 /* Transparent drivers are limited to generating asymmetric keys */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200390 if (PSA_KEY_TYPE_IS_ASYMMETRIC(attributes->core.type)) {
391 /* Cycle through all known transparent accelerators */
392# if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200393 status = mbedtls_test_transparent_generate_key(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200394 attributes, key_buffer, key_buffer_size, key_buffer_length);
Ronald Cron977c2472020-10-13 08:32:21 +0200395 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200396 if (status != PSA_ERROR_NOT_SUPPORTED)
Ronald Cron977c2472020-10-13 08:32:21 +0200397 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200398# endif /* PSA_CRYPTO_DRIVER_TEST */
Ronald Cron977c2472020-10-13 08:32:21 +0200399 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200400# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron977c2472020-10-13 08:32:21 +0200401
402 /* Software fallback */
403 status = psa_generate_key_internal(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200404 attributes, key_buffer, key_buffer_size, key_buffer_length);
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200405 break;
Ronald Cron977c2472020-10-13 08:32:21 +0200406
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200407 /* Add cases for opaque driver here */
408# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
409# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100410 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200411 status = mbedtls_test_opaque_generate_key(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200412 attributes, key_buffer, key_buffer_size, key_buffer_length);
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200413 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200414# endif /* PSA_CRYPTO_DRIVER_TEST */
415# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron977c2472020-10-13 08:32:21 +0200416
Steven Cooreman2a1664c2020-07-20 15:33:08 +0200417 default:
418 /* Key is declared with a lifetime not known to us */
419 status = PSA_ERROR_INVALID_ARGUMENT;
420 break;
421 }
422
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200423 return status;
Steven Cooreman55ae2172020-07-17 19:46:15 +0200424}
425
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200426psa_status_t
427psa_driver_wrapper_import_key(const psa_key_attributes_t *attributes,
428 const uint8_t *data,
429 size_t data_length,
430 uint8_t *key_buffer,
431 size_t key_buffer_size,
432 size_t *key_buffer_length,
433 size_t *bits)
Steven Cooreman04524762020-10-13 17:43:44 +0200434{
Steven Cooreman04524762020-10-13 17:43:44 +0200435 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200436 psa_key_location_t location =
437 PSA_KEY_LIFETIME_GET_LOCATION(psa_get_key_lifetime(attributes));
Steven Cooreman04524762020-10-13 17:43:44 +0200438
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100439 /* Try dynamically-registered SE interface first */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200440# if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100441 const psa_drv_se_t *drv;
442 psa_drv_se_context_t *drv_context;
443
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200444 if (psa_get_se_driver(attributes->core.lifetime, &drv, &drv_context)) {
445 if (drv->key_management == NULL ||
446 drv->key_management->p_import == NULL)
447 return PSA_ERROR_NOT_SUPPORTED;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100448
449 /* The driver should set the number of key bits, however in
450 * case it doesn't, we initialize bits to an invalid value. */
451 *bits = PSA_MAX_KEY_BITS + 1;
452 status = drv->key_management->p_import(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200453 drv_context, *((psa_key_slot_number_t *)key_buffer), attributes,
454 data, data_length, bits);
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100455
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200456 if (status != PSA_SUCCESS)
457 return status;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100458
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200459 if ((*bits) > PSA_MAX_KEY_BITS)
460 return PSA_ERROR_NOT_SUPPORTED;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100461
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200462 return PSA_SUCCESS;
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100463 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200464# endif /* PSA_CRYPTO_SE_C */
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100465
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200466 switch (location) {
Ronald Cronbf33c932020-11-28 18:06:53 +0100467 case PSA_KEY_LOCATION_LOCAL_STORAGE:
468 /* Key is stored in the slot in export representation, so
469 * cycle through all known transparent accelerators */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200470# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
471# if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200472 status = mbedtls_test_transparent_import_key(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200473 attributes, data, data_length, key_buffer, key_buffer_size,
474 key_buffer_length, bits);
Ronald Cronbf33c932020-11-28 18:06:53 +0100475 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200476 if (status != PSA_ERROR_NOT_SUPPORTED)
477 return status;
478# endif /* PSA_CRYPTO_DRIVER_TEST */
479# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cronbf33c932020-11-28 18:06:53 +0100480 /* Fell through, meaning no accelerator supports this operation */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200481 return (psa_import_key_into_slot(attributes, data, data_length,
482 key_buffer, key_buffer_size,
483 key_buffer_length, bits));
Ronald Cronbf33c932020-11-28 18:06:53 +0100484
485 default:
Ronald Cronfb2ed5b2020-11-30 12:11:01 +0100486 /* Importing a key with external storage in not yet supported.
487 * Return in error indicating that the lifetime is not valid. */
Ronald Cronbf33c932020-11-28 18:06:53 +0100488 (void)status;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200489 return PSA_ERROR_INVALID_ARGUMENT;
Ronald Cronbf33c932020-11-28 18:06:53 +0100490 }
Steven Cooreman04524762020-10-13 17:43:44 +0200491}
492
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200493psa_status_t
494psa_driver_wrapper_export_key(const psa_key_attributes_t *attributes,
495 const uint8_t *key_buffer,
496 size_t key_buffer_size,
497 uint8_t *data,
498 size_t data_size,
499 size_t *data_length)
Ronald Cron67227982020-11-26 15:16:05 +0100500
501{
502 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200503 psa_key_location_t location =
504 PSA_KEY_LIFETIME_GET_LOCATION(psa_get_key_lifetime(attributes));
Ronald Cron67227982020-11-26 15:16:05 +0100505
Ronald Cron152e3f82020-11-26 16:06:41 +0100506 /* Try dynamically-registered SE interface first */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200507# if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Ronald Cron152e3f82020-11-26 16:06:41 +0100508 const psa_drv_se_t *drv;
509 psa_drv_se_context_t *drv_context;
510
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200511 if (psa_get_se_driver(attributes->core.lifetime, &drv, &drv_context)) {
512 if ((drv->key_management == NULL) ||
513 (drv->key_management->p_export == NULL)) {
514 return PSA_ERROR_NOT_SUPPORTED;
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100515 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100516
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200517 return (drv->key_management->p_export(
518 drv_context, *((psa_key_slot_number_t *)key_buffer), data,
519 data_size, data_length));
Ronald Cron152e3f82020-11-26 16:06:41 +0100520 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200521# endif /* PSA_CRYPTO_SE_C */
Ronald Cron152e3f82020-11-26 16:06:41 +0100522
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200523 switch (location) {
Ronald Cron67227982020-11-26 15:16:05 +0100524 case PSA_KEY_LOCATION_LOCAL_STORAGE:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200525 return (psa_export_key_internal(attributes, key_buffer,
526 key_buffer_size, data, data_size,
527 data_length));
Ronald Cron67227982020-11-26 15:16:05 +0100528
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200529 /* Add cases for opaque driver here */
530# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
531# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100532 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200533 return (mbedtls_test_opaque_export_key(attributes, key_buffer,
534 key_buffer_size, data,
535 data_size, data_length));
536# endif /* PSA_CRYPTO_DRIVER_TEST */
537# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron67227982020-11-26 15:16:05 +0100538 default:
539 /* Key is declared with a lifetime not known to us */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200540 return status;
Ronald Cron67227982020-11-26 15:16:05 +0100541 }
542}
543
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200544psa_status_t
545psa_driver_wrapper_export_public_key(const psa_key_attributes_t *attributes,
546 const uint8_t *key_buffer,
547 size_t key_buffer_size,
548 uint8_t *data,
549 size_t data_size,
550 size_t *data_length)
Ronald Cron84cc9942020-11-25 14:30:05 +0100551
Steven Cooremanb9b84422020-10-14 14:39:20 +0200552{
Steven Cooremanb9b84422020-10-14 14:39:20 +0200553 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200554 psa_key_location_t location =
555 PSA_KEY_LIFETIME_GET_LOCATION(psa_get_key_lifetime(attributes));
Steven Cooremanb9b84422020-10-14 14:39:20 +0200556
Ronald Cron152e3f82020-11-26 16:06:41 +0100557 /* Try dynamically-registered SE interface first */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200558# if defined(MBEDTLS_PSA_CRYPTO_SE_C)
Ronald Cron152e3f82020-11-26 16:06:41 +0100559 const psa_drv_se_t *drv;
560 psa_drv_se_context_t *drv_context;
561
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200562 if (psa_get_se_driver(attributes->core.lifetime, &drv, &drv_context)) {
563 if ((drv->key_management == NULL) ||
564 (drv->key_management->p_export_public == NULL)) {
565 return PSA_ERROR_NOT_SUPPORTED;
Ronald Cron9cfdf6e2021-01-18 11:58:39 +0100566 }
Ronald Cron152e3f82020-11-26 16:06:41 +0100567
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200568 return (drv->key_management->p_export_public(
569 drv_context, *((psa_key_slot_number_t *)key_buffer), data,
570 data_size, data_length));
Ronald Cron152e3f82020-11-26 16:06:41 +0100571 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200572# endif /* MBEDTLS_PSA_CRYPTO_SE_C */
Ronald Cron152e3f82020-11-26 16:06:41 +0100573
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200574 switch (location) {
Steven Cooremanb9b84422020-10-14 14:39:20 +0200575 case PSA_KEY_LOCATION_LOCAL_STORAGE:
576 /* Key is stored in the slot in export representation, so
577 * cycle through all known transparent accelerators */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200578# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
579# if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200580 status = mbedtls_test_transparent_export_public_key(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200581 attributes, key_buffer, key_buffer_size, data, data_size,
582 data_length);
Steven Cooremanb9b84422020-10-14 14:39:20 +0200583 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200584 if (status != PSA_ERROR_NOT_SUPPORTED)
585 return status;
586# endif /* PSA_CRYPTO_DRIVER_TEST */
587# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200588 /* Fell through, meaning no accelerator supports this operation */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200589 return (psa_export_public_key_internal(attributes, key_buffer,
590 key_buffer_size, data,
591 data_size, data_length));
Ronald Cron67227982020-11-26 15:16:05 +0100592
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200593 /* Add cases for opaque driver here */
594# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
595# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100596 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200597 return (mbedtls_test_opaque_export_public_key(
598 attributes, key_buffer, key_buffer_size, data, data_size,
599 data_length));
600# endif /* PSA_CRYPTO_DRIVER_TEST */
601# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremanb9b84422020-10-14 14:39:20 +0200602 default:
603 /* Key is declared with a lifetime not known to us */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200604 return status;
Steven Cooremanb9b84422020-10-14 14:39:20 +0200605 }
Steven Cooremanb9b84422020-10-14 14:39:20 +0200606}
607
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200608psa_status_t
609psa_driver_wrapper_get_builtin_key(psa_drv_slot_number_t slot_number,
610 psa_key_attributes_t *attributes,
611 uint8_t *key_buffer,
612 size_t key_buffer_size,
613 size_t *key_buffer_length)
Steven Cooreman6801f082021-02-19 17:21:22 +0100614{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200615 psa_key_location_t location =
616 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
617 switch (location) {
618# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100619 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200620 return (mbedtls_test_opaque_get_builtin_key(
621 slot_number, attributes, key_buffer, key_buffer_size,
622 key_buffer_length));
623# endif /* PSA_CRYPTO_DRIVER_TEST */
Steven Cooreman6801f082021-02-19 17:21:22 +0100624 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200625 (void)slot_number;
626 (void)key_buffer;
627 (void)key_buffer_size;
628 (void)key_buffer_length;
629 return PSA_ERROR_DOES_NOT_EXIST;
Steven Cooreman6801f082021-02-19 17:21:22 +0100630 }
631}
632
Steven Cooreman37941cb2020-07-28 18:49:51 +0200633/*
634 * Cipher functions
635 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200636psa_status_t
637psa_driver_wrapper_cipher_encrypt(const psa_key_attributes_t *attributes,
638 const uint8_t *key_buffer,
639 size_t key_buffer_size,
640 psa_algorithm_t alg,
641 const uint8_t *input,
642 size_t input_length,
643 uint8_t *output,
644 size_t output_size,
645 size_t *output_length)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200646{
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100647 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
648 psa_key_location_t location =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200649 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
Steven Cooreman37941cb2020-07-28 18:49:51 +0200650
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200651 switch (location) {
Steven Cooreman37941cb2020-07-28 18:49:51 +0200652 case PSA_KEY_LOCATION_LOCAL_STORAGE:
653 /* Key is stored in the slot in export representation, so
654 * cycle through all known transparent accelerators */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200655# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
656# if defined(PSA_CRYPTO_DRIVER_TEST)
657 status = mbedtls_test_transparent_cipher_encrypt(
658 attributes, key_buffer, key_buffer_size, alg, input,
659 input_length, output, output_size, output_length);
Steven Cooreman37941cb2020-07-28 18:49:51 +0200660 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200661 if (status != PSA_ERROR_NOT_SUPPORTED)
662 return status;
663# endif /* PSA_CRYPTO_DRIVER_TEST */
664# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100665
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200666# if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
667 return (mbedtls_psa_cipher_encrypt(
668 attributes, key_buffer, key_buffer_size, alg, input,
669 input_length, output, output_size, output_length));
670# else
671 return PSA_ERROR_NOT_SUPPORTED;
672# endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100673
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200674 /* Add cases for opaque driver here */
675# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
676# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100677 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200678 return (mbedtls_test_opaque_cipher_encrypt(
679 attributes, key_buffer, key_buffer_size, alg, input,
680 input_length, output, output_size, output_length));
681# endif /* PSA_CRYPTO_DRIVER_TEST */
682# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100683
Steven Cooreman37941cb2020-07-28 18:49:51 +0200684 default:
685 /* Key is declared with a lifetime not known to us */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100686 (void)status;
687 (void)key_buffer;
688 (void)key_buffer_size;
689 (void)alg;
690 (void)input;
691 (void)input_length;
692 (void)output;
693 (void)output_size;
694 (void)output_length;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200695 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200696 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200697}
698
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200699psa_status_t
700psa_driver_wrapper_cipher_decrypt(const psa_key_attributes_t *attributes,
701 const uint8_t *key_buffer,
702 size_t key_buffer_size,
703 psa_algorithm_t alg,
704 const uint8_t *input,
705 size_t input_length,
706 uint8_t *output,
707 size_t output_size,
708 size_t *output_length)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200709{
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100710 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
711 psa_key_location_t location =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200712 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
Steven Cooreman37941cb2020-07-28 18:49:51 +0200713
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200714 switch (location) {
Steven Cooreman37941cb2020-07-28 18:49:51 +0200715 case PSA_KEY_LOCATION_LOCAL_STORAGE:
716 /* Key is stored in the slot in export representation, so
717 * cycle through all known transparent accelerators */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200718# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
719# if defined(PSA_CRYPTO_DRIVER_TEST)
720 status = mbedtls_test_transparent_cipher_decrypt(
721 attributes, key_buffer, key_buffer_size, alg, input,
722 input_length, output, output_size, output_length);
Steven Cooreman37941cb2020-07-28 18:49:51 +0200723 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200724 if (status != PSA_ERROR_NOT_SUPPORTED)
725 return status;
726# endif /* PSA_CRYPTO_DRIVER_TEST */
727# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100728
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200729# if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
730 return (mbedtls_psa_cipher_decrypt(
731 attributes, key_buffer, key_buffer_size, alg, input,
732 input_length, output, output_size, output_length));
733# else
734 return PSA_ERROR_NOT_SUPPORTED;
735# endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100736
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200737 /* Add cases for opaque driver here */
738# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
739# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100740 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200741 return (mbedtls_test_opaque_cipher_decrypt(
742 attributes, key_buffer, key_buffer_size, alg, input,
743 input_length, output, output_size, output_length));
744# endif /* PSA_CRYPTO_DRIVER_TEST */
745# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100746
Steven Cooreman37941cb2020-07-28 18:49:51 +0200747 default:
748 /* Key is declared with a lifetime not known to us */
gabor-mezei-arma9449a02021-03-25 11:17:10 +0100749 (void)status;
750 (void)key_buffer;
751 (void)key_buffer_size;
752 (void)alg;
753 (void)input;
754 (void)input_length;
755 (void)output;
756 (void)output_size;
757 (void)output_length;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200758 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200759 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200760}
761
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200762psa_status_t
763psa_driver_wrapper_cipher_encrypt_setup(psa_cipher_operation_t *operation,
764 const psa_key_attributes_t *attributes,
765 const uint8_t *key_buffer,
766 size_t key_buffer_size,
767 psa_algorithm_t alg)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200768{
Ronald Cron0b805592020-12-14 18:08:20 +0100769 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Ronald Crona4af55f2020-12-14 14:36:06 +0100770 psa_key_location_t location =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200771 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
Steven Cooreman37941cb2020-07-28 18:49:51 +0200772
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200773 switch (location) {
Steven Cooreman37941cb2020-07-28 18:49:51 +0200774 case PSA_KEY_LOCATION_LOCAL_STORAGE:
775 /* Key is stored in the slot in export representation, so
776 * cycle through all known transparent accelerators */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200777# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
778# if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200779 status = mbedtls_test_transparent_cipher_encrypt_setup(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200780 &operation->ctx.transparent_test_driver_ctx, attributes,
781 key_buffer, key_buffer_size, alg);
Steven Cooreman37941cb2020-07-28 18:49:51 +0200782 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200783 if (status == PSA_SUCCESS)
Ronald Cron49fafa92021-03-10 08:34:23 +0100784 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200785
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200786 if (status != PSA_ERROR_NOT_SUPPORTED)
787 return status;
788# endif /* PSA_CRYPTO_DRIVER_TEST */
789# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
790# if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200791 /* Fell through, meaning no accelerator supports this operation */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200792 status = mbedtls_psa_cipher_encrypt_setup(
793 &operation->ctx.mbedtls_ctx, attributes, key_buffer,
794 key_buffer_size, alg);
795 if (status == PSA_SUCCESS)
Ronald Cron6e412a72021-03-10 09:58:47 +0100796 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Ronald Cron49fafa92021-03-10 08:34:23 +0100797
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200798 if (status != PSA_ERROR_NOT_SUPPORTED)
799 return status;
800# endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
801 return PSA_ERROR_NOT_SUPPORTED;
Ronald Cron0b805592020-12-14 18:08:20 +0100802
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200803 /* Add cases for opaque driver here */
804# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
805# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100806 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200807 status = mbedtls_test_opaque_cipher_encrypt_setup(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200808 &operation->ctx.opaque_test_driver_ctx, attributes, key_buffer,
809 key_buffer_size, alg);
Steven Cooreman37941cb2020-07-28 18:49:51 +0200810
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200811 if (status == PSA_SUCCESS)
Ronald Cron49fafa92021-03-10 08:34:23 +0100812 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200813
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200814 return status;
815# endif /* PSA_CRYPTO_DRIVER_TEST */
816# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200817 default:
818 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100819 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100820 (void)key_buffer;
821 (void)key_buffer_size;
822 (void)alg;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200823 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200824 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200825}
826
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200827psa_status_t
828psa_driver_wrapper_cipher_decrypt_setup(psa_cipher_operation_t *operation,
829 const psa_key_attributes_t *attributes,
830 const uint8_t *key_buffer,
831 size_t key_buffer_size,
832 psa_algorithm_t alg)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200833{
Steven Cooreman37941cb2020-07-28 18:49:51 +0200834 psa_status_t status = PSA_ERROR_INVALID_ARGUMENT;
Ronald Crona4af55f2020-12-14 14:36:06 +0100835 psa_key_location_t location =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200836 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
Steven Cooreman37941cb2020-07-28 18:49:51 +0200837
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200838 switch (location) {
Steven Cooreman37941cb2020-07-28 18:49:51 +0200839 case PSA_KEY_LOCATION_LOCAL_STORAGE:
840 /* Key is stored in the slot in export representation, so
841 * cycle through all known transparent accelerators */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200842# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
843# if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +0200844 status = mbedtls_test_transparent_cipher_decrypt_setup(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200845 &operation->ctx.transparent_test_driver_ctx, attributes,
846 key_buffer, key_buffer_size, alg);
Steven Cooreman37941cb2020-07-28 18:49:51 +0200847 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200848 if (status == PSA_SUCCESS)
Ronald Cron49fafa92021-03-10 08:34:23 +0100849 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Steven Cooreman150c99b2020-09-09 14:32:44 +0200850
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200851 if (status != PSA_ERROR_NOT_SUPPORTED)
852 return status;
853# endif /* PSA_CRYPTO_DRIVER_TEST */
854# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
855# if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200856 /* Fell through, meaning no accelerator supports this operation */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200857 status = mbedtls_psa_cipher_decrypt_setup(
858 &operation->ctx.mbedtls_ctx, attributes, key_buffer,
859 key_buffer_size, alg);
860 if (status == PSA_SUCCESS)
Ronald Cron49fafa92021-03-10 08:34:23 +0100861 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
862
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200863 return status;
864# endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
865 return PSA_ERROR_NOT_SUPPORTED;
Ronald Cron49fafa92021-03-10 08:34:23 +0100866
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200867 /* Add cases for opaque driver here */
868# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
869# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana1ce2f22021-03-18 20:49:29 +0100870 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Ronald Cron7f13fa22021-04-13 12:41:34 +0200871 status = mbedtls_test_opaque_cipher_decrypt_setup(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200872 &operation->ctx.opaque_test_driver_ctx, attributes, key_buffer,
873 key_buffer_size, alg);
Steven Cooreman37941cb2020-07-28 18:49:51 +0200874
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200875 if (status == PSA_SUCCESS)
Ronald Cron49fafa92021-03-10 08:34:23 +0100876 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200877
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200878 return status;
879# endif /* PSA_CRYPTO_DRIVER_TEST */
880# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooreman37941cb2020-07-28 18:49:51 +0200881 default:
882 /* Key is declared with a lifetime not known to us */
Ronald Cron0b805592020-12-14 18:08:20 +0100883 (void)status;
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100884 (void)key_buffer;
885 (void)key_buffer_size;
886 (void)alg;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200887 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200888 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200889}
890
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200891psa_status_t psa_driver_wrapper_cipher_set_iv(psa_cipher_operation_t *operation,
892 const uint8_t *iv,
893 size_t iv_length)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200894{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200895 switch (operation->id) {
896# if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100897 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200898 return (mbedtls_psa_cipher_set_iv(&operation->ctx.mbedtls_ctx, iv,
899 iv_length));
900# endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100901
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200902# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
903# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200904 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200905 return (mbedtls_test_transparent_cipher_set_iv(
906 &operation->ctx.transparent_test_driver_ctx, iv, iv_length));
Ronald Cron49fafa92021-03-10 08:34:23 +0100907
Steven Cooreman37941cb2020-07-28 18:49:51 +0200908 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200909 return (mbedtls_test_opaque_cipher_set_iv(
910 &operation->ctx.opaque_test_driver_ctx, iv, iv_length));
911# endif /* PSA_CRYPTO_DRIVER_TEST */
912# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +0100913 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200914
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100915 (void)iv;
916 (void)iv_length;
917
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200918 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200919}
920
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200921psa_status_t psa_driver_wrapper_cipher_update(psa_cipher_operation_t *operation,
922 const uint8_t *input,
923 size_t input_length,
924 uint8_t *output,
925 size_t output_size,
926 size_t *output_length)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200927{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200928 switch (operation->id) {
929# if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100930 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200931 return (mbedtls_psa_cipher_update(&operation->ctx.mbedtls_ctx,
932 input, input_length, output,
933 output_size, output_length));
934# endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100935
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200936# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
937# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200938 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200939 return (mbedtls_test_transparent_cipher_update(
940 &operation->ctx.transparent_test_driver_ctx, input,
941 input_length, output, output_size, output_length));
Ronald Cron7cb9c3d2021-03-10 12:21:48 +0100942
Steven Cooreman37941cb2020-07-28 18:49:51 +0200943 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200944 return (mbedtls_test_opaque_cipher_update(
945 &operation->ctx.opaque_test_driver_ctx, input, input_length,
946 output, output_size, output_length));
947# endif /* PSA_CRYPTO_DRIVER_TEST */
948# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +0100949 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200950
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100951 (void)input;
952 (void)input_length;
953 (void)output;
954 (void)output_size;
955 (void)output_length;
956
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200957 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200958}
959
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200960psa_status_t psa_driver_wrapper_cipher_finish(psa_cipher_operation_t *operation,
961 uint8_t *output,
962 size_t output_size,
963 size_t *output_length)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200964{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200965 switch (operation->id) {
966# if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +0100967 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200968 return (mbedtls_psa_cipher_finish(&operation->ctx.mbedtls_ctx,
969 output, output_size,
970 output_length));
971# endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Crondd24c9b2020-12-15 14:10:01 +0100972
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200973# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
974# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200975 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200976 return (mbedtls_test_transparent_cipher_finish(
977 &operation->ctx.transparent_test_driver_ctx, output,
978 output_size, output_length));
Ronald Cron49fafa92021-03-10 08:34:23 +0100979
Steven Cooreman37941cb2020-07-28 18:49:51 +0200980 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200981 return (mbedtls_test_opaque_cipher_finish(
982 &operation->ctx.opaque_test_driver_ctx, output, output_size,
983 output_length));
984# endif /* PSA_CRYPTO_DRIVER_TEST */
985# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +0100986 }
Steven Cooreman37941cb2020-07-28 18:49:51 +0200987
Ronald Cron5d9b00d2021-03-10 14:43:20 +0100988 (void)output;
989 (void)output_size;
990 (void)output_length;
991
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200992 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200993}
994
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200995psa_status_t psa_driver_wrapper_cipher_abort(psa_cipher_operation_t *operation)
Steven Cooreman37941cb2020-07-28 18:49:51 +0200996{
Ronald Crondd24c9b2020-12-15 14:10:01 +0100997 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman37941cb2020-07-28 18:49:51 +0200998
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200999 switch (operation->id) {
1000# if defined(MBEDTLS_PSA_BUILTIN_CIPHER)
Ronald Cron49fafa92021-03-10 08:34:23 +01001001 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001002 return mbedtls_psa_cipher_abort(&operation->ctx.mbedtls_ctx);
1003# endif /* MBEDTLS_PSA_BUILTIN_CIPHER */
Ronald Cron49fafa92021-03-10 08:34:23 +01001004
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001005# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1006# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooreman37941cb2020-07-28 18:49:51 +02001007 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001008 status = mbedtls_test_transparent_cipher_abort(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001009 &operation->ctx.transparent_test_driver_ctx);
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001010 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001011 &operation->ctx.transparent_test_driver_ctx,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001012 sizeof(operation->ctx.transparent_test_driver_ctx));
1013 return status;
Ronald Cron49fafa92021-03-10 08:34:23 +01001014
Steven Cooreman37941cb2020-07-28 18:49:51 +02001015 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Ronald Cron7f13fa22021-04-13 12:41:34 +02001016 status = mbedtls_test_opaque_cipher_abort(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001017 &operation->ctx.opaque_test_driver_ctx);
Steven Cooremancfeea8f2020-09-09 15:09:18 +02001018 mbedtls_platform_zeroize(
Ronald Cron7cb9c3d2021-03-10 12:21:48 +01001019 &operation->ctx.opaque_test_driver_ctx,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001020 sizeof(operation->ctx.opaque_test_driver_ctx));
1021 return status;
1022# endif /* PSA_CRYPTO_DRIVER_TEST */
1023# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cron49fafa92021-03-10 08:34:23 +01001024 }
Steven Cooreman37941cb2020-07-28 18:49:51 +02001025
Ronald Cron49fafa92021-03-10 08:34:23 +01001026 (void)status;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001027 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooreman37941cb2020-07-28 18:49:51 +02001028}
1029
Steven Cooreman1e582352021-02-18 17:24:37 +01001030/*
1031 * Hashing functions
1032 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001033psa_status_t psa_driver_wrapper_hash_compute(psa_algorithm_t alg,
1034 const uint8_t *input,
1035 size_t input_length,
1036 uint8_t *hash,
1037 size_t hash_size,
1038 size_t *hash_length)
Steven Cooreman1e582352021-02-18 17:24:37 +01001039{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001040 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001041
1042 /* Try accelerators first */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001043# if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001044 status = mbedtls_test_transparent_hash_compute(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001045 alg, input, input_length, hash, hash_size, hash_length);
1046 if (status != PSA_ERROR_NOT_SUPPORTED)
1047 return status;
1048# endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001049
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001050 /* If software fallback is compiled in, try fallback */
1051# if defined(MBEDTLS_PSA_BUILTIN_HASH)
1052 status = mbedtls_psa_hash_compute(alg, input, input_length, hash, hash_size,
1053 hash_length);
1054 if (status != PSA_ERROR_NOT_SUPPORTED)
1055 return status;
1056# endif
1057 (void)status;
1058 (void)alg;
1059 (void)input;
1060 (void)input_length;
1061 (void)hash;
1062 (void)hash_size;
1063 (void)hash_length;
Steven Cooreman1e582352021-02-18 17:24:37 +01001064
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001065 return PSA_ERROR_NOT_SUPPORTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001066}
1067
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001068psa_status_t psa_driver_wrapper_hash_setup(psa_hash_operation_t *operation,
1069 psa_algorithm_t alg)
Steven Cooreman1e582352021-02-18 17:24:37 +01001070{
Steven Cooreman0eeb7942021-03-08 12:13:21 +01001071 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001072
Steven Cooreman1e582352021-02-18 17:24:37 +01001073 /* Try setup on accelerators first */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001074# if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001075 status = mbedtls_test_transparent_hash_setup(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001076 &operation->ctx.test_driver_ctx, alg);
1077 if (status == PSA_SUCCESS)
Steven Cooremanf7638102021-03-04 15:14:36 +01001078 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1079
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001080 if (status != PSA_ERROR_NOT_SUPPORTED)
1081 return status;
1082# endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001083
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001084 /* If software fallback is compiled in, try fallback */
1085# if defined(MBEDTLS_PSA_BUILTIN_HASH)
1086 status = mbedtls_psa_hash_setup(&operation->ctx.mbedtls_ctx, alg);
1087 if (status == PSA_SUCCESS)
Steven Cooreman1e582352021-02-18 17:24:37 +01001088 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Steven Cooreman1e582352021-02-18 17:24:37 +01001089
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001090 if (status != PSA_ERROR_NOT_SUPPORTED)
1091 return status;
1092# endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001093 /* Nothing left to try if we fall through here */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001094 (void)status;
1095 (void)operation;
1096 (void)alg;
1097 return PSA_ERROR_NOT_SUPPORTED;
Steven Cooreman1e582352021-02-18 17:24:37 +01001098}
1099
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001100psa_status_t
1101psa_driver_wrapper_hash_clone(const psa_hash_operation_t *source_operation,
1102 psa_hash_operation_t *target_operation)
Steven Cooreman1e582352021-02-18 17:24:37 +01001103{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001104 switch (source_operation->id) {
1105# if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001106 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
1107 target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001108 return (mbedtls_psa_hash_clone(&source_operation->ctx.mbedtls_ctx,
1109 &target_operation->ctx.mbedtls_ctx));
1110# endif
1111# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001112 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
1113 target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001114 return (mbedtls_test_transparent_hash_clone(
1115 &source_operation->ctx.test_driver_ctx,
1116 &target_operation->ctx.test_driver_ctx));
1117# endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001118 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001119 (void)target_operation;
1120 return PSA_ERROR_BAD_STATE;
Steven Cooreman1e582352021-02-18 17:24:37 +01001121 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001122}
1123
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001124psa_status_t psa_driver_wrapper_hash_update(psa_hash_operation_t *operation,
1125 const uint8_t *input,
1126 size_t input_length)
Steven Cooreman1e582352021-02-18 17:24:37 +01001127{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001128 switch (operation->id) {
1129# if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001130 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001131 return (mbedtls_psa_hash_update(&operation->ctx.mbedtls_ctx, input,
1132 input_length));
1133# endif
1134# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001135 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001136 return (mbedtls_test_transparent_hash_update(
1137 &operation->ctx.test_driver_ctx, input, input_length));
1138# endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001139 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001140 (void)input;
1141 (void)input_length;
1142 return PSA_ERROR_BAD_STATE;
Steven Cooreman1e582352021-02-18 17:24:37 +01001143 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001144}
1145
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001146psa_status_t psa_driver_wrapper_hash_finish(psa_hash_operation_t *operation,
1147 uint8_t *hash,
1148 size_t hash_size,
1149 size_t *hash_length)
Steven Cooreman1e582352021-02-18 17:24:37 +01001150{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001151 switch (operation->id) {
1152# if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001153 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001154 return (mbedtls_psa_hash_finish(&operation->ctx.mbedtls_ctx, hash,
1155 hash_size, hash_length));
1156# endif
1157# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001158 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001159 return (mbedtls_test_transparent_hash_finish(
1160 &operation->ctx.test_driver_ctx, hash, hash_size, hash_length));
1161# endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001162 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001163 (void)hash;
1164 (void)hash_size;
1165 (void)hash_length;
1166 return PSA_ERROR_BAD_STATE;
Steven Cooreman1e582352021-02-18 17:24:37 +01001167 }
Steven Cooreman1e582352021-02-18 17:24:37 +01001168}
1169
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001170psa_status_t psa_driver_wrapper_hash_abort(psa_hash_operation_t *operation)
Steven Cooreman1e582352021-02-18 17:24:37 +01001171{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001172 switch (operation->id) {
1173# if defined(MBEDTLS_PSA_BUILTIN_HASH)
Steven Cooreman5e4c18f2021-03-15 12:26:07 +01001174 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001175 return mbedtls_psa_hash_abort(&operation->ctx.mbedtls_ctx);
1176# endif
1177# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanf7638102021-03-04 15:14:36 +01001178 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001179 return (mbedtls_test_transparent_hash_abort(
1180 &operation->ctx.test_driver_ctx));
1181# endif
Steven Cooreman1e582352021-02-18 17:24:37 +01001182 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001183 return PSA_ERROR_BAD_STATE;
Steven Cooreman1e582352021-02-18 17:24:37 +01001184 }
1185}
1186
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001187psa_status_t
1188psa_driver_wrapper_aead_encrypt(const psa_key_attributes_t *attributes,
1189 const uint8_t *key_buffer,
1190 size_t key_buffer_size,
1191 psa_algorithm_t alg,
1192 const uint8_t *nonce,
1193 size_t nonce_length,
1194 const uint8_t *additional_data,
1195 size_t additional_data_length,
1196 const uint8_t *plaintext,
1197 size_t plaintext_length,
1198 uint8_t *ciphertext,
1199 size_t ciphertext_size,
1200 size_t *ciphertext_length)
Ronald Cronde822812021-03-17 16:08:20 +01001201{
1202 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1203 psa_key_location_t location =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001204 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
Ronald Cronde822812021-03-17 16:08:20 +01001205
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001206 switch (location) {
Ronald Cronde822812021-03-17 16:08:20 +01001207 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1208 /* Key is stored in the slot in export representation, so
1209 * cycle through all known transparent accelerators */
1210
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001211# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1212# if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001213 status = mbedtls_test_transparent_aead_encrypt(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001214 attributes, key_buffer, key_buffer_size, alg, nonce,
1215 nonce_length, additional_data, additional_data_length,
1216 plaintext, plaintext_length, ciphertext, ciphertext_size,
1217 ciphertext_length);
Ronald Cronde822812021-03-17 16:08:20 +01001218 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001219 if (status != PSA_ERROR_NOT_SUPPORTED)
1220 return status;
1221# endif /* PSA_CRYPTO_DRIVER_TEST */
1222# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cronde822812021-03-17 16:08:20 +01001223
1224 /* Fell through, meaning no accelerator supports this operation */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001225 return (mbedtls_psa_aead_encrypt(
1226 attributes, key_buffer, key_buffer_size, alg, nonce,
1227 nonce_length, additional_data, additional_data_length,
1228 plaintext, plaintext_length, ciphertext, ciphertext_size,
1229 ciphertext_length));
Ronald Cronde822812021-03-17 16:08:20 +01001230
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001231 /* Add cases for opaque driver here */
Ronald Cronde822812021-03-17 16:08:20 +01001232
1233 default:
1234 /* Key is declared with a lifetime not known to us */
1235 (void)status;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001236 return PSA_ERROR_INVALID_ARGUMENT;
Ronald Cronde822812021-03-17 16:08:20 +01001237 }
1238}
1239
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001240psa_status_t
1241psa_driver_wrapper_aead_decrypt(const psa_key_attributes_t *attributes,
1242 const uint8_t *key_buffer,
1243 size_t key_buffer_size,
1244 psa_algorithm_t alg,
1245 const uint8_t *nonce,
1246 size_t nonce_length,
1247 const uint8_t *additional_data,
1248 size_t additional_data_length,
1249 const uint8_t *ciphertext,
1250 size_t ciphertext_length,
1251 uint8_t *plaintext,
1252 size_t plaintext_size,
1253 size_t *plaintext_length)
Ronald Cronde822812021-03-17 16:08:20 +01001254{
1255 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1256 psa_key_location_t location =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001257 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
Ronald Cronde822812021-03-17 16:08:20 +01001258
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001259 switch (location) {
Ronald Cronde822812021-03-17 16:08:20 +01001260 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1261 /* Key is stored in the slot in export representation, so
1262 * cycle through all known transparent accelerators */
1263
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001264# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1265# if defined(PSA_CRYPTO_DRIVER_TEST)
Ronald Cron7f13fa22021-04-13 12:41:34 +02001266 status = mbedtls_test_transparent_aead_decrypt(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001267 attributes, key_buffer, key_buffer_size, alg, nonce,
1268 nonce_length, additional_data, additional_data_length,
1269 ciphertext, ciphertext_length, plaintext, plaintext_size,
1270 plaintext_length);
Ronald Cronde822812021-03-17 16:08:20 +01001271 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001272 if (status != PSA_ERROR_NOT_SUPPORTED)
1273 return status;
1274# endif /* PSA_CRYPTO_DRIVER_TEST */
1275# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Ronald Cronde822812021-03-17 16:08:20 +01001276
1277 /* Fell through, meaning no accelerator supports this operation */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001278 return (mbedtls_psa_aead_decrypt(
1279 attributes, key_buffer, key_buffer_size, alg, nonce,
1280 nonce_length, additional_data, additional_data_length,
1281 ciphertext, ciphertext_length, plaintext, plaintext_size,
1282 plaintext_length));
Ronald Cronde822812021-03-17 16:08:20 +01001283
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001284 /* Add cases for opaque driver here */
Ronald Cronde822812021-03-17 16:08:20 +01001285
1286 default:
1287 /* Key is declared with a lifetime not known to us */
1288 (void)status;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001289 return PSA_ERROR_INVALID_ARGUMENT;
Ronald Cronde822812021-03-17 16:08:20 +01001290 }
1291}
Steven Cooremand13a70f2021-03-19 15:24:23 +01001292
Steven Cooremand13a70f2021-03-19 15:24:23 +01001293/*
1294 * MAC functions
1295 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001296psa_status_t
1297psa_driver_wrapper_mac_compute(const psa_key_attributes_t *attributes,
1298 const uint8_t *key_buffer,
1299 size_t key_buffer_size,
1300 psa_algorithm_t alg,
1301 const uint8_t *input,
1302 size_t input_length,
1303 uint8_t *mac,
1304 size_t mac_size,
1305 size_t *mac_length)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001306{
1307 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1308 psa_key_location_t location =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001309 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
Steven Cooremand13a70f2021-03-19 15:24:23 +01001310
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001311 switch (location) {
Steven Cooremand13a70f2021-03-19 15:24:23 +01001312 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1313 /* Key is stored in the slot in export representation, so
1314 * cycle through all known transparent accelerators */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001315# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1316# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001317 status = mbedtls_test_transparent_mac_compute(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001318 attributes, key_buffer, key_buffer_size, alg, input,
1319 input_length, mac, mac_size, mac_length);
Steven Cooremand13a70f2021-03-19 15:24:23 +01001320 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001321 if (status != PSA_ERROR_NOT_SUPPORTED)
1322 return status;
1323# endif /* PSA_CRYPTO_DRIVER_TEST */
1324# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1325# if defined(MBEDTLS_PSA_BUILTIN_MAC)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001326 /* Fell through, meaning no accelerator supports this operation */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001327 status = mbedtls_psa_mac_compute(attributes, key_buffer,
1328 key_buffer_size, alg, input,
1329 input_length, mac, mac_size,
1330 mac_length);
1331 if (status != PSA_ERROR_NOT_SUPPORTED)
1332 return status;
1333# endif /* MBEDTLS_PSA_BUILTIN_MAC */
1334 return PSA_ERROR_NOT_SUPPORTED;
Steven Cooremand13a70f2021-03-19 15:24:23 +01001335
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001336 /* Add cases for opaque driver here */
1337# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1338# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001339 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001340 status = mbedtls_test_opaque_mac_compute(attributes, key_buffer,
1341 key_buffer_size, alg,
1342 input, input_length, mac,
1343 mac_size, mac_length);
1344 return status;
1345# endif /* PSA_CRYPTO_DRIVER_TEST */
1346# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremand13a70f2021-03-19 15:24:23 +01001347 default:
1348 /* Key is declared with a lifetime not known to us */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001349 (void)key_buffer;
1350 (void)key_buffer_size;
1351 (void)alg;
1352 (void)input;
1353 (void)input_length;
1354 (void)mac;
1355 (void)mac_size;
1356 (void)mac_length;
1357 (void)status;
1358 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooremand13a70f2021-03-19 15:24:23 +01001359 }
1360}
1361
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001362psa_status_t
1363psa_driver_wrapper_mac_sign_setup(psa_mac_operation_t *operation,
1364 const psa_key_attributes_t *attributes,
1365 const uint8_t *key_buffer,
1366 size_t key_buffer_size,
1367 psa_algorithm_t alg)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001368{
1369 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1370 psa_key_location_t location =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001371 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
Steven Cooremand13a70f2021-03-19 15:24:23 +01001372
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001373 switch (location) {
Steven Cooremand13a70f2021-03-19 15:24:23 +01001374 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1375 /* Key is stored in the slot in export representation, so
1376 * cycle through all known transparent accelerators */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001377# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1378# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001379 status = mbedtls_test_transparent_mac_sign_setup(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001380 &operation->ctx.transparent_test_driver_ctx, attributes,
1381 key_buffer, key_buffer_size, alg);
Steven Cooremand13a70f2021-03-19 15:24:23 +01001382 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001383 if (status == PSA_SUCCESS)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001384 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1385
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001386 if (status != PSA_ERROR_NOT_SUPPORTED)
1387 return status;
1388# endif /* PSA_CRYPTO_DRIVER_TEST */
1389# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1390# if defined(MBEDTLS_PSA_BUILTIN_MAC)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001391 /* Fell through, meaning no accelerator supports this operation */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001392 status = mbedtls_psa_mac_sign_setup(&operation->ctx.mbedtls_ctx,
1393 attributes, key_buffer,
1394 key_buffer_size, alg);
1395 if (status == PSA_SUCCESS)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001396 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1397
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001398 if (status != PSA_ERROR_NOT_SUPPORTED)
1399 return status;
1400# endif /* MBEDTLS_PSA_BUILTIN_MAC */
1401 return PSA_ERROR_NOT_SUPPORTED;
Steven Cooremand13a70f2021-03-19 15:24:23 +01001402
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001403 /* Add cases for opaque driver here */
1404# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1405# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001406 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001407 status = mbedtls_test_opaque_mac_sign_setup(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001408 &operation->ctx.opaque_test_driver_ctx, attributes, key_buffer,
1409 key_buffer_size, alg);
Steven Cooremand13a70f2021-03-19 15:24:23 +01001410
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001411 if (status == PSA_SUCCESS)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001412 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1413
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001414 return status;
1415# endif /* PSA_CRYPTO_DRIVER_TEST */
1416# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremand13a70f2021-03-19 15:24:23 +01001417 default:
1418 /* Key is declared with a lifetime not known to us */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001419 (void)status;
1420 (void)key_buffer;
1421 (void)key_buffer_size;
1422 (void)alg;
1423 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooremand13a70f2021-03-19 15:24:23 +01001424 }
1425}
1426
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001427psa_status_t
1428psa_driver_wrapper_mac_verify_setup(psa_mac_operation_t *operation,
1429 const psa_key_attributes_t *attributes,
1430 const uint8_t *key_buffer,
1431 size_t key_buffer_size,
1432 psa_algorithm_t alg)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001433{
1434 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1435 psa_key_location_t location =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001436 PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime);
Steven Cooremand13a70f2021-03-19 15:24:23 +01001437
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001438 switch (location) {
Steven Cooremand13a70f2021-03-19 15:24:23 +01001439 case PSA_KEY_LOCATION_LOCAL_STORAGE:
1440 /* Key is stored in the slot in export representation, so
1441 * cycle through all known transparent accelerators */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001442# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1443# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001444 status = mbedtls_test_transparent_mac_verify_setup(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001445 &operation->ctx.transparent_test_driver_ctx, attributes,
1446 key_buffer, key_buffer_size, alg);
Steven Cooremand13a70f2021-03-19 15:24:23 +01001447 /* Declared with fallback == true */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001448 if (status == PSA_SUCCESS)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001449 operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
1450
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001451 if (status != PSA_ERROR_NOT_SUPPORTED)
1452 return status;
1453# endif /* PSA_CRYPTO_DRIVER_TEST */
1454# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
1455# if defined(MBEDTLS_PSA_BUILTIN_MAC)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001456 /* Fell through, meaning no accelerator supports this operation */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001457 status = mbedtls_psa_mac_verify_setup(&operation->ctx.mbedtls_ctx,
1458 attributes, key_buffer,
1459 key_buffer_size, alg);
1460 if (status == PSA_SUCCESS)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001461 operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
1462
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001463 if (status != PSA_ERROR_NOT_SUPPORTED)
1464 return status;
1465# endif /* MBEDTLS_PSA_BUILTIN_MAC */
1466 return PSA_ERROR_NOT_SUPPORTED;
Steven Cooremand13a70f2021-03-19 15:24:23 +01001467
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001468 /* Add cases for opaque driver here */
1469# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1470# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001471 case PSA_CRYPTO_TEST_DRIVER_LOCATION:
Steven Cooremanc7f0a572021-04-29 21:10:11 +02001472 status = mbedtls_test_opaque_mac_verify_setup(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001473 &operation->ctx.opaque_test_driver_ctx, attributes, key_buffer,
1474 key_buffer_size, alg);
Steven Cooremand13a70f2021-03-19 15:24:23 +01001475
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001476 if (status == PSA_SUCCESS)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001477 operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID;
1478
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001479 return status;
1480# endif /* PSA_CRYPTO_DRIVER_TEST */
1481# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremand13a70f2021-03-19 15:24:23 +01001482 default:
1483 /* Key is declared with a lifetime not known to us */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001484 (void)status;
1485 (void)key_buffer;
1486 (void)key_buffer_size;
1487 (void)alg;
1488 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooremand13a70f2021-03-19 15:24:23 +01001489 }
1490}
1491
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001492psa_status_t psa_driver_wrapper_mac_update(psa_mac_operation_t *operation,
1493 const uint8_t *input,
1494 size_t input_length)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001495{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001496 switch (operation->id) {
1497# if defined(MBEDTLS_PSA_BUILTIN_MAC)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001498 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001499 return (mbedtls_psa_mac_update(&operation->ctx.mbedtls_ctx, input,
1500 input_length));
1501# endif /* MBEDTLS_PSA_BUILTIN_MAC */
Steven Cooremand13a70f2021-03-19 15:24:23 +01001502
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001503# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1504# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001505 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001506 return (mbedtls_test_transparent_mac_update(
1507 &operation->ctx.transparent_test_driver_ctx, input,
1508 input_length));
Steven Cooremand13a70f2021-03-19 15:24:23 +01001509
1510 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001511 return (mbedtls_test_opaque_mac_update(
1512 &operation->ctx.opaque_test_driver_ctx, input, input_length));
1513# endif /* PSA_CRYPTO_DRIVER_TEST */
1514# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremand13a70f2021-03-19 15:24:23 +01001515 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001516 (void)input;
1517 (void)input_length;
1518 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooremand13a70f2021-03-19 15:24:23 +01001519 }
1520}
1521
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001522psa_status_t psa_driver_wrapper_mac_sign_finish(psa_mac_operation_t *operation,
1523 uint8_t *mac,
1524 size_t mac_size,
1525 size_t *mac_length)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001526{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001527 switch (operation->id) {
1528# if defined(MBEDTLS_PSA_BUILTIN_MAC)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001529 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001530 return (mbedtls_psa_mac_sign_finish(&operation->ctx.mbedtls_ctx,
1531 mac, mac_size, mac_length));
1532# endif /* MBEDTLS_PSA_BUILTIN_MAC */
Steven Cooremand13a70f2021-03-19 15:24:23 +01001533
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001534# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1535# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001536 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001537 return (mbedtls_test_transparent_mac_sign_finish(
1538 &operation->ctx.transparent_test_driver_ctx, mac, mac_size,
1539 mac_length));
Steven Cooremand13a70f2021-03-19 15:24:23 +01001540
1541 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001542 return (mbedtls_test_opaque_mac_sign_finish(
1543 &operation->ctx.opaque_test_driver_ctx, mac, mac_size,
1544 mac_length));
1545# endif /* PSA_CRYPTO_DRIVER_TEST */
1546# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremand13a70f2021-03-19 15:24:23 +01001547 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001548 (void)mac;
1549 (void)mac_size;
1550 (void)mac_length;
1551 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooremand13a70f2021-03-19 15:24:23 +01001552 }
1553}
1554
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001555psa_status_t
1556psa_driver_wrapper_mac_verify_finish(psa_mac_operation_t *operation,
1557 const uint8_t *mac,
1558 size_t mac_length)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001559{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001560 switch (operation->id) {
1561# if defined(MBEDTLS_PSA_BUILTIN_MAC)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001562 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001563 return (mbedtls_psa_mac_verify_finish(&operation->ctx.mbedtls_ctx,
1564 mac, mac_length));
1565# endif /* MBEDTLS_PSA_BUILTIN_MAC */
Steven Cooremand13a70f2021-03-19 15:24:23 +01001566
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001567# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1568# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001569 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001570 return (mbedtls_test_transparent_mac_verify_finish(
1571 &operation->ctx.transparent_test_driver_ctx, mac, mac_length));
Steven Cooremand13a70f2021-03-19 15:24:23 +01001572
1573 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001574 return (mbedtls_test_opaque_mac_verify_finish(
1575 &operation->ctx.opaque_test_driver_ctx, mac, mac_length));
1576# endif /* PSA_CRYPTO_DRIVER_TEST */
1577# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremand13a70f2021-03-19 15:24:23 +01001578 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001579 (void)mac;
1580 (void)mac_length;
1581 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooremand13a70f2021-03-19 15:24:23 +01001582 }
1583}
1584
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001585psa_status_t psa_driver_wrapper_mac_abort(psa_mac_operation_t *operation)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001586{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001587 switch (operation->id) {
1588# if defined(MBEDTLS_PSA_BUILTIN_MAC)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001589 case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001590 return mbedtls_psa_mac_abort(&operation->ctx.mbedtls_ctx);
1591# endif /* MBEDTLS_PSA_BUILTIN_MAC */
Steven Cooremand13a70f2021-03-19 15:24:23 +01001592
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001593# if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT)
1594# if defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremand13a70f2021-03-19 15:24:23 +01001595 case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001596 return (mbedtls_test_transparent_mac_abort(
1597 &operation->ctx.transparent_test_driver_ctx));
Steven Cooremand13a70f2021-03-19 15:24:23 +01001598 case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001599 return (mbedtls_test_opaque_mac_abort(
1600 &operation->ctx.opaque_test_driver_ctx));
1601# endif /* PSA_CRYPTO_DRIVER_TEST */
1602# endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */
Steven Cooremand13a70f2021-03-19 15:24:23 +01001603 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001604 return PSA_ERROR_INVALID_ARGUMENT;
Steven Cooremand13a70f2021-03-19 15:24:23 +01001605 }
Steven Cooremand13a70f2021-03-19 15:24:23 +01001606}
Gilles Peskine1905a242021-04-24 13:19:45 +02001607
1608#endif /* MBEDTLS_PSA_CRYPTO_C */