blob: f0ff7e1322bc474396f2a2672c98529502133660 [file] [log] [blame]
Antonio de Angelis8908f472018-08-31 15:44:25 +01001/*
Antonio de Angelisbd4c1532025-04-11 15:57:03 +01002 * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
Antonio de Angelis8908f472018-08-31 15:44:25 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Antonio de Angelisbd4c1532025-04-11 15:57:03 +01008#include <stdbool.h>
Antonio de Angelis8bb98512024-01-16 14:13:36 +00009#include <stdlib.h>
10#include <string.h>
11
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000012#include "tfm_crypto_defs.h"
Antonio de Angelis8bb98512024-01-16 14:13:36 +000013
Kevin Peng9449a362019-07-29 16:05:42 +080014#include "psa/client.h"
Antonio de Angelis202425a2022-04-06 11:13:15 +010015#include "psa_manifest/sid.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000016
Antonio de Angelis202425a2022-04-06 11:13:15 +010017#define API_DISPATCH(in_vec, out_vec) \
18 psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, \
19 in_vec, IOVEC_LEN(in_vec), \
20 out_vec, IOVEC_LEN(out_vec))
21#define API_DISPATCH_NO_OUTVEC(in_vec) \
22 psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, \
23 in_vec, IOVEC_LEN(in_vec), \
24 (psa_outvec *)NULL, 0)
Antonio de Angelis8908f472018-08-31 15:44:25 +010025
Antonio de Angelis12e21a22023-03-23 16:25:36 +000026/*!
27 * \def CONFIG_TFM_CRYPTO_API_RENAME
28 *
29 * \brief By setting this to 1, system integrators can rename the symbols of the
30 * PSA Crypto APIs available in the TF-M interface. It allows flexibility
31 * for some integration setups where multiple providers of the PSA Crypto
32 * APIs are available at link time. Normally this configuration option
33 * should not be enabled when building the Secure interface because the
34 * secure partitions will just use the standard function names. By default
35 * it prepends the "tfm_crypto__" prefix.
36 *
37 * \note This config option is not available through the TF-M configuration as
38 * it's for NS applications and system integrators to enable.
39 */
40
41/*!
42 * \def TFM_CRYPTO_API(ret, fun)
43 *
44 * \brief Define the function signature of a TF-M Crypto API with return
45 * type \a ret and PSA Crypto API function name \a fun
46 *
47 * \param ret return type associated to the API
48 * \param fun API name (e.g. a PSA Crypto API function name)
49 *
50 * \returns Function signature
51 */
52
53#if CONFIG_TFM_CRYPTO_API_RENAME == 1
54#define TFM_CRYPTO_API(ret, fun) ret tfm_crypto__##fun
55#else
56#define TFM_CRYPTO_API(ret, fun) ret fun
57#endif /* CONFIG_TFM_CRYPTO_API_RENAME */
58
59TFM_CRYPTO_API(psa_status_t, psa_crypto_init)(void)
Antonio de Angelis8908f472018-08-31 15:44:25 +010060{
61 /* Service init is performed during TFM boot up,
62 * so application level initialisation is empty
63 */
64 return PSA_SUCCESS;
65}
66
Antonio de Angelisbd4c1532025-04-11 15:57:03 +010067TFM_CRYPTO_API(int, psa_can_do_hash)(psa_algorithm_t hash_alg)
68{
69 (void)hash_alg;
70 /* There isn't any hashing algorithm that would not be ready
71 * to be used after TF-M has booted up, hence this function
72 * just returns success all the time
73 */
74 return (int)true;
75}
76
Antonio de Angelis7774b082025-04-23 10:25:34 +010077TFM_CRYPTO_API(int, psa_can_do_cipher)(psa_key_type_t key_type, psa_algorithm_t cipher_alg)
78{
79 (void)cipher_alg;
80 (void)key_type;
81 /* There isn't any cipher algorithm that would not be ready
82 * to be used after TF-M has booted up, hence this function
83 * just returns success all the time
84 */
85 return (int)true;
86}
87
Antonio de Angelis12e21a22023-03-23 16:25:36 +000088TFM_CRYPTO_API(psa_status_t, psa_open_key)(psa_key_id_t id,
89 psa_key_id_t *key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010090{
Jamie Foxdadb4e82019-09-03 17:59:41 +010091 const struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010092 .function_id = TFM_CRYPTO_OPEN_KEY_SID,
93 .key_id = id,
Jamie Foxdadb4e82019-09-03 17:59:41 +010094 };
95 psa_invec in_vec[] = {
96 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010097 };
98 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000099 {.base = key, .len = sizeof(psa_key_id_t)},
Jamie Foxdadb4e82019-09-03 17:59:41 +0100100 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100101
Antonio de Angelis202425a2022-04-06 11:13:15 +0100102 return API_DISPATCH(in_vec, out_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100103}
104
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000105TFM_CRYPTO_API(psa_status_t, psa_close_key)(psa_key_id_t key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100106{
Jamie Foxdadb4e82019-09-03 17:59:41 +0100107 const struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100108 .function_id = TFM_CRYPTO_CLOSE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000109 .key_id = key,
Jamie Foxdadb4e82019-09-03 17:59:41 +0100110 };
111 psa_invec in_vec[] = {
112 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
113 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100114
Antonio de Angelis202425a2022-04-06 11:13:15 +0100115 return API_DISPATCH_NO_OUTVEC(in_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100116}
117
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000118TFM_CRYPTO_API(psa_status_t, psa_import_key)(const psa_key_attributes_t *attributes,
119 const uint8_t *data,
120 size_t data_length,
121 psa_key_id_t *key)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100122{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100123 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100124 .function_id = TFM_CRYPTO_IMPORT_KEY_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100125 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000126 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100127 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100128 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000129 {.base = data, .len = data_length}
130 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100131 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000132 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100133 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100134
Antonio de Angelis202425a2022-04-06 11:13:15 +0100135 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100136}
137
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000138TFM_CRYPTO_API(psa_status_t, psa_destroy_key)(psa_key_id_t key)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100139{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100140 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100141 .function_id = TFM_CRYPTO_DESTROY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000142 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100143 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000144 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100145 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000146 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100147
Antonio de Angelis202425a2022-04-06 11:13:15 +0100148 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100149}
150
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000151TFM_CRYPTO_API(psa_status_t, psa_get_key_attributes)(psa_key_id_t key,
152 psa_key_attributes_t *attributes)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100153{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100154 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100155 .function_id = TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000156 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100157 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000158 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100159 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000160 };
161 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100162 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000163 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100164
Antonio de Angelis202425a2022-04-06 11:13:15 +0100165 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100166}
167
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000168TFM_CRYPTO_API(psa_status_t, psa_export_key)(psa_key_id_t key,
169 uint8_t *data,
170 size_t data_size,
171 size_t *data_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100172{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000173 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100174 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100175 .function_id = TFM_CRYPTO_EXPORT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000176 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100177 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000178 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100179 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000180 };
181 psa_outvec out_vec[] = {
182 {.base = data, .len = data_size}
183 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100184
Antonio de Angelis202425a2022-04-06 11:13:15 +0100185 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100186
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000187 *data_length = out_vec[0].len;
188
189 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100190}
191
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000192TFM_CRYPTO_API(psa_status_t, psa_export_public_key)(psa_key_id_t key,
193 uint8_t *data,
194 size_t data_size,
195 size_t *data_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100196{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100197 psa_status_t status;
198 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100199 .function_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000200 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100201 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000202
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100203 psa_invec in_vec[] = {
204 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
205 };
206 psa_outvec out_vec[] = {
207 {.base = data, .len = data_size}
208 };
209
Antonio de Angelis202425a2022-04-06 11:13:15 +0100210 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100211
212 *data_length = out_vec[0].len;
213
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100214 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100215}
216
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000217TFM_CRYPTO_API(psa_status_t, psa_purge_key)(psa_key_id_t key)
Maulik Patel28659c42021-01-06 14:09:22 +0000218{
Maulik Patel28659c42021-01-06 14:09:22 +0000219 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100220 .function_id = TFM_CRYPTO_PURGE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000221 .key_id = key,
222 };
223 psa_invec in_vec[] = {
224 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
225 };
226
Antonio de Angelis202425a2022-04-06 11:13:15 +0100227 return API_DISPATCH_NO_OUTVEC(in_vec);
Maulik Patel28659c42021-01-06 14:09:22 +0000228}
229
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000230TFM_CRYPTO_API(psa_status_t, psa_copy_key)(psa_key_id_t source_key,
231 const psa_key_attributes_t *attributes,
232 psa_key_id_t *target_key)
Jamie Foxefd82732018-11-26 10:34:32 +0000233{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100234 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100235 .function_id = TFM_CRYPTO_COPY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000236 .key_id = source_key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100237 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000238
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100239 psa_invec in_vec[] = {
240 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100241 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100242 };
243
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000244 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000245 {.base = target_key, .len = sizeof(psa_key_id_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000246 };
Jamie Foxefd82732018-11-26 10:34:32 +0000247
Antonio de Angelis202425a2022-04-06 11:13:15 +0100248 return API_DISPATCH(in_vec, out_vec);
Jamie Foxefd82732018-11-26 10:34:32 +0000249}
250
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000251TFM_CRYPTO_API(psa_status_t, psa_cipher_generate_iv)(psa_cipher_operation_t *operation,
252 unsigned char *iv,
253 size_t iv_size,
254 size_t *iv_length)
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100255{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100256 psa_status_t status;
257 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100258 .function_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100259 .op_handle = operation->handle,
260 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100261
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100262 psa_invec in_vec[] = {
263 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
264 };
265 psa_outvec out_vec[] = {
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100266 {.base = iv, .len = iv_size},
267 };
268
Antonio de Angelis202425a2022-04-06 11:13:15 +0100269 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100270
Antonio de Angelis202425a2022-04-06 11:13:15 +0100271 *iv_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100272
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100273 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100274}
275
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000276TFM_CRYPTO_API(psa_status_t, psa_cipher_set_iv)(psa_cipher_operation_t *operation,
277 const unsigned char *iv,
278 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100279{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100280 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100281 .function_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100282 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100283 };
284
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000285 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100286 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000287 {.base = iv, .len = iv_length},
288 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100289
Antonio de Angelis202425a2022-04-06 11:13:15 +0100290 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100291}
292
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000293TFM_CRYPTO_API(psa_status_t, psa_cipher_encrypt_setup)(psa_cipher_operation_t *operation,
294 psa_key_id_t key,
295 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100296{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100297 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100298 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000299 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100300 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100301 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000302 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100303
Antonio de Angelis4743e672019-04-11 11:38:48 +0100304 psa_invec in_vec[] = {
305 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
306 };
307 psa_outvec out_vec[] = {
308 {.base = &(operation->handle), .len = sizeof(uint32_t)},
309 };
310
Antonio de Angelis202425a2022-04-06 11:13:15 +0100311 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100312}
313
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000314TFM_CRYPTO_API(psa_status_t, psa_cipher_decrypt_setup)(psa_cipher_operation_t *operation,
315 psa_key_id_t key,
316 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100317{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100318 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100319 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000320 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100321 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100322 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000323 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100324
Antonio de Angelis4743e672019-04-11 11:38:48 +0100325 psa_invec in_vec[] = {
326 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
327 };
328 psa_outvec out_vec[] = {
329 {.base = &(operation->handle), .len = sizeof(uint32_t)},
330 };
331
Antonio de Angelis202425a2022-04-06 11:13:15 +0100332 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100333}
334
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000335TFM_CRYPTO_API(psa_status_t, psa_cipher_update)(psa_cipher_operation_t *operation,
336 const uint8_t *input,
337 size_t input_length,
338 unsigned char *output,
339 size_t output_size,
340 size_t *output_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100341{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000342 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100343 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100344 .function_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100345 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100346 };
347
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000348 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100349 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000350 {.base = input, .len = input_length},
351 };
352 psa_outvec out_vec[] = {
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000353 {.base = output, .len = output_size}
354 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100355
Antonio de Angelis202425a2022-04-06 11:13:15 +0100356 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100357
Antonio de Angelis202425a2022-04-06 11:13:15 +0100358 *output_length = out_vec[0].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100359
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000360 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100361}
362
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000363TFM_CRYPTO_API(psa_status_t, psa_cipher_abort)(psa_cipher_operation_t *operation)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100364{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100365 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100366 .function_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100367 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000368 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100369
Antonio de Angelis4743e672019-04-11 11:38:48 +0100370 psa_invec in_vec[] = {
371 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
372 };
373 psa_outvec out_vec[] = {
374 {.base = &(operation->handle), .len = sizeof(uint32_t)},
375 };
376
Antonio de Angelis202425a2022-04-06 11:13:15 +0100377 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100378}
379
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000380TFM_CRYPTO_API(psa_status_t, psa_cipher_finish)(psa_cipher_operation_t *operation,
381 uint8_t *output,
382 size_t output_size,
383 size_t *output_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100384{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000385 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100386 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100387 .function_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100388 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100389 };
390
391 psa_invec in_vec[] = {
392 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
393 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000394 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100395 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000396 {.base = output, .len = output_size},
397 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100398
Antonio de Angelis202425a2022-04-06 11:13:15 +0100399 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100400
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000401 *output_length = out_vec[1].len;
402
403 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100404}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100405
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000406TFM_CRYPTO_API(psa_status_t, psa_hash_setup)(psa_hash_operation_t *operation,
407 psa_algorithm_t alg)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100408{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100409 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100410 .function_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100411 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100412 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000413 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100414
Antonio de Angelis4743e672019-04-11 11:38:48 +0100415 psa_invec in_vec[] = {
416 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
417 };
418 psa_outvec out_vec[] = {
419 {.base = &(operation->handle), .len = sizeof(uint32_t)},
420 };
421
Antonio de Angelis202425a2022-04-06 11:13:15 +0100422 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100423}
424
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000425TFM_CRYPTO_API(psa_status_t, psa_hash_update)(psa_hash_operation_t *operation,
426 const uint8_t *input,
427 size_t input_length)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100428{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100429 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100430 .function_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100431 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100432 };
433
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000434 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100435 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000436 {.base = input, .len = input_length},
437 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100438
Antonio de Angelis202425a2022-04-06 11:13:15 +0100439 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100440}
441
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000442TFM_CRYPTO_API(psa_status_t, psa_hash_finish)(psa_hash_operation_t *operation,
443 uint8_t *hash,
444 size_t hash_size,
445 size_t *hash_length)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100446{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000447 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100448 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100449 .function_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100450 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100451 };
452
453 psa_invec in_vec[] = {
454 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
455 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000456 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100457 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000458 {.base = hash, .len = hash_size},
459 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100460
Antonio de Angelis202425a2022-04-06 11:13:15 +0100461 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100462
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000463 *hash_length = out_vec[1].len;
464
465 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100466}
467
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000468TFM_CRYPTO_API(psa_status_t, psa_hash_verify)(psa_hash_operation_t *operation,
469 const uint8_t *hash,
470 size_t hash_length)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100471{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100472 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100473 .function_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100474 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100475 };
476
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000477 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100478 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000479 {.base = hash, .len = hash_length},
480 };
481 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100482 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000483 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100484
Antonio de Angelis202425a2022-04-06 11:13:15 +0100485 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100486}
487
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000488TFM_CRYPTO_API(psa_status_t, psa_hash_abort)(psa_hash_operation_t *operation)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100489{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100490 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100491 .function_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100492 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000493 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100494
Antonio de Angelis4743e672019-04-11 11:38:48 +0100495 psa_invec in_vec[] = {
496 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
497 };
498 psa_outvec out_vec[] = {
499 {.base = &(operation->handle), .len = sizeof(uint32_t)},
500 };
501
Antonio de Angelis202425a2022-04-06 11:13:15 +0100502 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100503}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100504
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000505TFM_CRYPTO_API(psa_status_t, psa_hash_clone)(const psa_hash_operation_t *source_operation,
506 psa_hash_operation_t *target_operation)
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100507{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100508 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100509 .function_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100510 .op_handle = source_operation->handle,
511 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100512
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100513 if (target_operation && (target_operation->handle != 0)) {
514 return PSA_ERROR_BAD_STATE;
515 }
516
David Huc9679cc2022-06-21 13:09:34 +0800517 psa_invec in_vec[] = {
518 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
519 {.base = &(target_operation->handle),
520 .len = sizeof(target_operation->handle)},
521 };
522 psa_outvec out_vec[] = {
523 {.base = &(target_operation->handle),
524 .len = sizeof(target_operation->handle)},
525 };
526
Antonio de Angelis202425a2022-04-06 11:13:15 +0100527 return API_DISPATCH(in_vec, out_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100528}
529
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000530TFM_CRYPTO_API(psa_status_t, psa_hash_compute)(psa_algorithm_t alg,
531 const uint8_t *input,
532 size_t input_length,
533 uint8_t *hash,
534 size_t hash_size,
535 size_t *hash_length)
Soby Mathew07ef6e42020-07-20 21:09:23 +0100536{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100537 psa_status_t status;
538 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100539 .function_id = TFM_CRYPTO_HASH_COMPUTE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100540 .alg = alg,
541 };
542
543 psa_invec in_vec[] = {
544 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
545 {.base = input, .len = input_length},
546 };
547
548 psa_outvec out_vec[] = {
549 {.base = hash, .len = hash_size}
550 };
551
Antonio de Angelis202425a2022-04-06 11:13:15 +0100552 status = API_DISPATCH(in_vec, out_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100553
554 *hash_length = out_vec[0].len;
555
Soby Mathew07ef6e42020-07-20 21:09:23 +0100556 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100557}
558
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000559TFM_CRYPTO_API(psa_status_t, psa_hash_compare)(psa_algorithm_t alg,
560 const uint8_t *input,
561 size_t input_length,
562 const uint8_t *hash,
563 size_t hash_length)
Soby Mathew07ef6e42020-07-20 21:09:23 +0100564{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100565 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100566 .function_id = TFM_CRYPTO_HASH_COMPARE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100567 .alg = alg,
568 };
569
570 psa_invec in_vec[] = {
571 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
572 {.base = input, .len = input_length},
573 {.base = hash, .len = hash_length},
574 };
575
Antonio de Angelis202425a2022-04-06 11:13:15 +0100576 return API_DISPATCH_NO_OUTVEC(in_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100577}
578
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000579TFM_CRYPTO_API(psa_status_t, psa_mac_sign_setup)(psa_mac_operation_t *operation,
580 psa_key_id_t key,
581 psa_algorithm_t alg)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100582{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100583 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100584 .function_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000585 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100586 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100587 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000588 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100589
Antonio de Angelis4743e672019-04-11 11:38:48 +0100590 psa_invec in_vec[] = {
591 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
592 };
593 psa_outvec out_vec[] = {
594 {.base = &(operation->handle), .len = sizeof(uint32_t)},
595 };
596
Antonio de Angelis202425a2022-04-06 11:13:15 +0100597 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100598}
599
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000600TFM_CRYPTO_API(psa_status_t, psa_mac_verify_setup)(psa_mac_operation_t *operation,
601 psa_key_id_t key,
602 psa_algorithm_t alg)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100603{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100604 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100605 .function_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000606 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100607 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100608 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000609 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100610
Antonio de Angelis4743e672019-04-11 11:38:48 +0100611 psa_invec in_vec[] = {
612 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
613 };
614 psa_outvec out_vec[] = {
615 {.base = &(operation->handle), .len = sizeof(uint32_t)},
616 };
617
Antonio de Angelis202425a2022-04-06 11:13:15 +0100618 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100619}
620
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000621TFM_CRYPTO_API(psa_status_t, psa_mac_update)(psa_mac_operation_t *operation,
622 const uint8_t *input,
623 size_t input_length)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100624{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100625 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100626 .function_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100627 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100628 };
629
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000630 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100631 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000632 {.base = input, .len = input_length},
633 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100634
Antonio de Angelis202425a2022-04-06 11:13:15 +0100635 return API_DISPATCH_NO_OUTVEC(in_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100636}
637
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000638TFM_CRYPTO_API(psa_status_t, psa_mac_sign_finish)(psa_mac_operation_t *operation,
639 uint8_t *mac,
640 size_t mac_size,
641 size_t *mac_length)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100642{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000643 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100644 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100645 .function_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100646 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100647 };
648
649 psa_invec in_vec[] = {
650 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
651 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000652 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100653 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000654 {.base = mac, .len = mac_size},
655 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100656
Antonio de Angelis202425a2022-04-06 11:13:15 +0100657 status = API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100658
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000659 *mac_length = out_vec[1].len;
660
661 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100662}
663
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000664TFM_CRYPTO_API(psa_status_t, psa_mac_verify_finish)(psa_mac_operation_t *operation,
665 const uint8_t *mac,
666 size_t mac_length)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100667{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100668 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100669 .function_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100670 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100671 };
672
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000673 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100674 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000675 {.base = mac, .len = mac_length},
676 };
677 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100678 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000679 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100680
Antonio de Angelis202425a2022-04-06 11:13:15 +0100681 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100682}
683
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000684TFM_CRYPTO_API(psa_status_t, psa_mac_abort)(psa_mac_operation_t *operation)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100685{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100686 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100687 .function_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100688 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000689 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100690
Antonio de Angelis4743e672019-04-11 11:38:48 +0100691 psa_invec in_vec[] = {
692 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
693 };
694 psa_outvec out_vec[] = {
695 {.base = &(operation->handle), .len = sizeof(uint32_t)},
696 };
697
Antonio de Angelis202425a2022-04-06 11:13:15 +0100698 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100699}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000700
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000701TFM_CRYPTO_API(psa_status_t, psa_aead_encrypt)(psa_key_id_t key,
702 psa_algorithm_t alg,
703 const uint8_t *nonce,
704 size_t nonce_length,
705 const uint8_t *additional_data,
706 size_t additional_data_length,
707 const uint8_t *plaintext,
708 size_t plaintext_length,
709 uint8_t *ciphertext,
710 size_t ciphertext_size,
711 size_t *ciphertext_length)
Antonio de Angelis3a480992018-11-07 11:53:28 +0000712{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000713 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100714 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100715 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000716 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100717 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000718 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000719 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100720
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100721 /* Sanitize the optional input */
722 if ((additional_data == NULL) && (additional_data_length != 0)) {
723 return PSA_ERROR_INVALID_ARGUMENT;
724 }
725
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000726 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000727 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000728 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100729 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000730 };
731 psa_outvec out_vec[] = {
732 {.base = ciphertext, .len = ciphertext_size},
733 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000734
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000735 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
736 return PSA_ERROR_INVALID_ARGUMENT;
737 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000738
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000739 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000740 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100741 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000742 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000743 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000744 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000745
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000746 in_vec[0].base = &iov;
747 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
748
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800749 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000750
Antonio de Angelis4743e672019-04-11 11:38:48 +0100751 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100752 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100753 }
Summer Qinaee07882021-03-29 15:44:27 +0800754 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800755 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000756
757 *ciphertext_length = out_vec[0].len;
758
759 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000760}
761
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000762TFM_CRYPTO_API(psa_status_t, psa_aead_decrypt)(psa_key_id_t key,
763 psa_algorithm_t alg,
764 const uint8_t *nonce,
765 size_t nonce_length,
766 const uint8_t *additional_data,
767 size_t additional_data_length,
768 const uint8_t *ciphertext,
769 size_t ciphertext_length,
770 uint8_t *plaintext,
771 size_t plaintext_size,
772 size_t *plaintext_length)
Antonio de Angelis3a480992018-11-07 11:53:28 +0000773{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000774 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100775 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100776 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000777 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100778 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000779 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000780 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100781
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100782 /* Sanitize the optional input */
783 if ((additional_data == NULL) && (additional_data_length != 0)) {
784 return PSA_ERROR_INVALID_ARGUMENT;
785 }
786
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000787 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000788 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000789 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100790 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000791 };
792 psa_outvec out_vec[] = {
793 {.base = plaintext, .len = plaintext_size},
794 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000795
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000796 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
797 return PSA_ERROR_INVALID_ARGUMENT;
798 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000799
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000800 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000801 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100802 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000803 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000804 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000805 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000806
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000807 in_vec[0].base = &iov;
808 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
809
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800810 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000811
Antonio de Angelis4743e672019-04-11 11:38:48 +0100812 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100813 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100814 }
Summer Qinaee07882021-03-29 15:44:27 +0800815 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800816 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000817
818 *plaintext_length = out_vec[0].len;
819
820 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000821}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100822
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000823TFM_CRYPTO_API(psa_status_t, psa_aead_encrypt_setup)(psa_aead_operation_t *operation,
824 psa_key_id_t key,
825 psa_algorithm_t alg)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100826{
827 psa_status_t status;
828 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100829 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100830 .key_id = key,
831 .alg = alg,
832 .op_handle = operation->handle,
833 };
834
835 psa_invec in_vec[] = {
836 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
837 };
838 psa_outvec out_vec[] = {
839 {.base = &(operation->handle), .len = sizeof(uint32_t)}
840 };
841
Antonio de Angelis202425a2022-04-06 11:13:15 +0100842 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100843 return status;
844}
845
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000846TFM_CRYPTO_API(psa_status_t, psa_aead_decrypt_setup)(psa_aead_operation_t *operation,
847 psa_key_id_t key,
848 psa_algorithm_t alg)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100849{
850 psa_status_t status;
851 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100852 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100853 .key_id = key,
854 .alg = alg,
855 .op_handle = operation->handle,
856 };
857
858 psa_invec in_vec[] = {
859 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
860 };
861 psa_outvec out_vec[] = {
862 {.base = &(operation->handle), .len = sizeof(uint32_t)}
863 };
864
Antonio de Angelis202425a2022-04-06 11:13:15 +0100865 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100866 return status;
867}
868
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000869TFM_CRYPTO_API(psa_status_t, psa_aead_generate_nonce)(psa_aead_operation_t *operation,
870 uint8_t *nonce,
871 size_t nonce_size,
872 size_t *nonce_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100873{
874 psa_status_t status;
875 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100876 .function_id = TFM_CRYPTO_AEAD_GENERATE_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100877 .op_handle = operation->handle,
878 };
879
880 psa_invec in_vec[] = {
881 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
882 };
883 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +0100884 {.base = nonce, .len = nonce_size}
885 };
886
Antonio de Angelis202425a2022-04-06 11:13:15 +0100887 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100888
Antonio de Angelis202425a2022-04-06 11:13:15 +0100889 *nonce_length = out_vec[0].len;
Antonio de Angelis8d282482021-10-07 15:04:12 +0100890 return status;
891}
892
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000893TFM_CRYPTO_API(psa_status_t, psa_aead_set_nonce)(psa_aead_operation_t *operation,
894 const uint8_t *nonce,
895 size_t nonce_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100896{
897 psa_status_t status;
898 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100899 .function_id = TFM_CRYPTO_AEAD_SET_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100900 .op_handle = operation->handle,
901 };
902
903 psa_invec in_vec[] = {
904 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
905 {.base = nonce, .len = nonce_length}
906 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100907
Antonio de Angelis202425a2022-04-06 11:13:15 +0100908 status = API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100909 return status;
910}
911
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000912TFM_CRYPTO_API(psa_status_t, psa_aead_set_lengths)(psa_aead_operation_t *operation,
913 size_t ad_length,
914 size_t plaintext_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100915{
916 psa_status_t status;
917 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100918 .function_id = TFM_CRYPTO_AEAD_SET_LENGTHS_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100919 .ad_length = ad_length,
920 .plaintext_length = plaintext_length,
921 .op_handle = operation->handle,
922 };
923
924 psa_invec in_vec[] = {
925 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
926 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100927
Antonio de Angelis202425a2022-04-06 11:13:15 +0100928 status = API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100929 return status;
930}
931
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000932TFM_CRYPTO_API(psa_status_t, psa_aead_update_ad)(psa_aead_operation_t *operation,
933 const uint8_t *input,
934 size_t input_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100935{
936 psa_status_t status;
937 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100938 .function_id = TFM_CRYPTO_AEAD_UPDATE_AD_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100939 .op_handle = operation->handle,
940 };
941
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000942 /* Sanitize the optional input */
943 if ((input == NULL) && (input_length != 0)) {
944 return PSA_ERROR_INVALID_ARGUMENT;
945 }
946
Antonio de Angelis8d282482021-10-07 15:04:12 +0100947 psa_invec in_vec[] = {
948 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
949 {.base = input, .len = input_length}
950 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100951
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000952 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000953
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000954 if (input == NULL) {
955 in_len--;
956 }
957 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis202425a2022-04-06 11:13:15 +0100958 NULL, 0);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100959 return status;
960}
961
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000962TFM_CRYPTO_API(psa_status_t, psa_aead_update)(psa_aead_operation_t *operation,
963 const uint8_t *input,
964 size_t input_length,
965 uint8_t *output,
966 size_t output_size,
967 size_t *output_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100968{
969 psa_status_t status;
970 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100971 .function_id = TFM_CRYPTO_AEAD_UPDATE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100972 .op_handle = operation->handle,
973 };
974
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000975 /* Sanitize the optional input */
976 if ((input == NULL) && (input_length != 0)) {
977 return PSA_ERROR_INVALID_ARGUMENT;
978 }
979
Antonio de Angelis8d282482021-10-07 15:04:12 +0100980 psa_invec in_vec[] = {
981 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
982 {.base = input, .len = input_length}
983 };
984 psa_outvec out_vec[] = {
Antonio de Angelisc26af632021-10-07 15:04:12 +0100985 {.base = output, .len = output_size},
Antonio de Angelis8d282482021-10-07 15:04:12 +0100986 };
987
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000988 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000989
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000990 if (input == NULL) {
991 in_len--;
992 }
993 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
994 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis8d282482021-10-07 15:04:12 +0100995
Antonio de Angelis202425a2022-04-06 11:13:15 +0100996 *output_length = out_vec[0].len;
Antonio de Angelis8d282482021-10-07 15:04:12 +0100997 return status;
998}
999
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001000TFM_CRYPTO_API(psa_status_t, psa_aead_finish)(psa_aead_operation_t *operation,
1001 uint8_t *ciphertext,
1002 size_t ciphertext_size,
1003 size_t *ciphertext_length,
1004 uint8_t *tag,
1005 size_t tag_size,
1006 size_t *tag_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +01001007{
1008 psa_status_t status;
1009 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001010 .function_id = TFM_CRYPTO_AEAD_FINISH_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001011 .op_handle = operation->handle,
1012 };
1013
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001014 /* Sanitize the optional output */
1015 if ((ciphertext == NULL) && (ciphertext_size != 0)) {
1016 return PSA_ERROR_INVALID_ARGUMENT;
1017 }
1018
Antonio de Angelis8d282482021-10-07 15:04:12 +01001019 psa_invec in_vec[] = {
1020 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1021 };
1022 psa_outvec out_vec[] = {
1023 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis8d282482021-10-07 15:04:12 +01001024 {.base = tag, .len = tag_size},
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001025 {.base = ciphertext, .len = ciphertext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +01001026 };
1027
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001028 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001029
Elena Uziunaited38e8212024-02-26 17:25:47 +00001030 if ((ciphertext == NULL) || (ciphertext_size == 0)) {
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001031 out_len--;
1032 }
1033 if ((out_len == 3) && (ciphertext_length == NULL)) {
1034 return PSA_ERROR_INVALID_ARGUMENT;
1035 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001036
Antonio de Angelisc26af632021-10-07 15:04:12 +01001037 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
1038 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001039 out_vec, out_len);
1040
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001041 if (out_len == 3) {
1042 *ciphertext_length = out_vec[2].len;
1043 } else {
1044 *ciphertext_length = 0;
1045 }
Antonio de Angelis202425a2022-04-06 11:13:15 +01001046
1047 *tag_length = out_vec[1].len;
1048
Antonio de Angelis8d282482021-10-07 15:04:12 +01001049 return status;
1050}
1051
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001052TFM_CRYPTO_API(psa_status_t, psa_aead_verify)(psa_aead_operation_t *operation,
1053 uint8_t *plaintext,
1054 size_t plaintext_size,
1055 size_t *plaintext_length,
1056 const uint8_t *tag,
1057 size_t tag_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +01001058{
1059 psa_status_t status;
1060 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001061 .function_id = TFM_CRYPTO_AEAD_VERIFY_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001062 .op_handle = operation->handle,
1063 };
1064
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001065 /* Sanitize the optional output */
1066 if ((plaintext == NULL) && (plaintext_size != 0)) {
1067 return PSA_ERROR_INVALID_ARGUMENT;
1068 }
1069
Antonio de Angelis8d282482021-10-07 15:04:12 +01001070 psa_invec in_vec[] = {
1071 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1072 {.base = tag, .len = tag_length}
1073 };
1074 psa_outvec out_vec[] = {
1075 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis202425a2022-04-06 11:13:15 +01001076 {.base = plaintext, .len = plaintext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +01001077 };
1078
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001079 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001080
Elena Uziunaited38e8212024-02-26 17:25:47 +00001081 if ((plaintext == NULL) || (plaintext_size == 0)) {
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001082 out_len--;
1083 }
1084 if ((out_len == 2) && (plaintext_length == NULL)) {
1085 return PSA_ERROR_INVALID_ARGUMENT;
1086 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001087
Antonio de Angelisc26af632021-10-07 15:04:12 +01001088 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
1089 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001090 out_vec, out_len);
1091
1092 if (out_len == 2) {
1093 *plaintext_length = out_vec[1].len;
1094 } else {
1095 *plaintext_length = 0;
1096 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001097 return status;
1098}
1099
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001100TFM_CRYPTO_API(psa_status_t, psa_aead_abort)(psa_aead_operation_t *operation)
Antonio de Angelis8d282482021-10-07 15:04:12 +01001101{
Antonio de Angelis8d282482021-10-07 15:04:12 +01001102 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001103 .function_id = TFM_CRYPTO_AEAD_ABORT_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001104 .op_handle = operation->handle,
1105 };
1106
1107 psa_invec in_vec[] = {
1108 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1109 };
1110 psa_outvec out_vec[] = {
1111 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1112 };
1113
Antonio de Angelis202425a2022-04-06 11:13:15 +01001114 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +01001115}
1116
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001117TFM_CRYPTO_API(psa_status_t, psa_sign_message)(psa_key_id_t key,
1118 psa_algorithm_t alg,
1119 const uint8_t *input,
1120 size_t input_length,
1121 uint8_t *signature,
1122 size_t signature_size,
1123 size_t *signature_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001124{
Summer Qinb9492d22021-06-22 18:00:54 +08001125 psa_status_t status;
1126 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001127 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001128 .key_id = key,
1129 .alg = alg,
1130 };
1131
1132 psa_invec in_vec[] = {
1133 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1134 {.base = input, .len = input_length},
1135 };
1136 psa_outvec out_vec[] = {
1137 {.base = signature, .len = signature_size},
1138 };
1139
Antonio de Angelis202425a2022-04-06 11:13:15 +01001140 status = API_DISPATCH(in_vec, out_vec);
Summer Qinb9492d22021-06-22 18:00:54 +08001141
Antonio de Angelisf83a2082021-08-20 22:13:53 +01001142 *signature_length = out_vec[0].len;
Summer Qinb9492d22021-06-22 18:00:54 +08001143 return status;
1144}
1145
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001146TFM_CRYPTO_API(psa_status_t, psa_verify_message)(psa_key_id_t key,
1147 psa_algorithm_t alg,
1148 const uint8_t *input,
1149 size_t input_length,
1150 const uint8_t *signature,
1151 size_t signature_length)
Summer Qinb9492d22021-06-22 18:00:54 +08001152{
Summer Qinb9492d22021-06-22 18:00:54 +08001153 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001154 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001155 .key_id = key,
1156 .alg = alg
1157 };
1158
1159 psa_invec in_vec[] = {
1160 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1161 {.base = input, .len = input_length},
1162 {.base = signature, .len = signature_length}
1163 };
1164
Antonio de Angelis202425a2022-04-06 11:13:15 +01001165 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001166}
1167
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001168TFM_CRYPTO_API(psa_status_t, psa_sign_hash)(psa_key_id_t key,
1169 psa_algorithm_t alg,
1170 const uint8_t *hash,
1171 size_t hash_length,
1172 uint8_t *signature,
1173 size_t signature_size,
1174 size_t *signature_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001175{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001176 psa_status_t status;
1177 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001178 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001179 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001180 .alg = alg,
1181 };
1182
1183 psa_invec in_vec[] = {
1184 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1185 {.base = hash, .len = hash_length},
1186 };
1187 psa_outvec out_vec[] = {
1188 {.base = signature, .len = signature_size},
1189 };
1190
Antonio de Angelis202425a2022-04-06 11:13:15 +01001191 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001192
1193 *signature_length = out_vec[0].len;
1194
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001195 return status;
1196}
1197
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001198TFM_CRYPTO_API(psa_status_t, psa_verify_hash)(psa_key_id_t key,
1199 psa_algorithm_t alg,
1200 const uint8_t *hash,
1201 size_t hash_length,
1202 const uint8_t *signature,
1203 size_t signature_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001204{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001205 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001206 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001207 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001208 .alg = alg
1209 };
1210
1211 psa_invec in_vec[] = {
1212 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1213 {.base = hash, .len = hash_length},
1214 {.base = signature, .len = signature_length}
1215 };
1216
Antonio de Angelis202425a2022-04-06 11:13:15 +01001217 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001218}
1219
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001220TFM_CRYPTO_API(psa_status_t, psa_asymmetric_encrypt)(psa_key_id_t key,
1221 psa_algorithm_t alg,
1222 const uint8_t *input,
1223 size_t input_length,
1224 const uint8_t *salt,
1225 size_t salt_length,
1226 uint8_t *output,
1227 size_t output_size,
1228 size_t *output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001229{
1230 psa_status_t status;
1231 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001232 .function_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001233 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001234 .alg = alg
1235 };
1236
1237 /* Sanitize the optional input */
1238 if ((salt == NULL) && (salt_length != 0)) {
1239 return PSA_ERROR_INVALID_ARGUMENT;
1240 }
1241
1242 psa_invec in_vec[] = {
1243 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1244 {.base = input, .len = input_length},
1245 {.base = salt, .len = salt_length}
1246 };
1247
1248 psa_outvec out_vec[] = {
1249 {.base = output, .len = output_size},
1250 };
1251
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001252 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001253
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001254 if (salt == NULL) {
1255 in_len--;
1256 }
Summer Qinaee07882021-03-29 15:44:27 +08001257 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001258 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001259
1260 *output_length = out_vec[0].len;
1261
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001262 return status;
1263}
1264
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001265TFM_CRYPTO_API(psa_status_t, psa_asymmetric_decrypt)(psa_key_id_t key,
1266 psa_algorithm_t alg,
1267 const uint8_t *input,
1268 size_t input_length,
1269 const uint8_t *salt,
1270 size_t salt_length,
1271 uint8_t *output,
1272 size_t output_size,
1273 size_t *output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001274{
1275 psa_status_t status;
1276 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001277 .function_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001278 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001279 .alg = alg
1280 };
1281
1282 /* Sanitize the optional input */
1283 if ((salt == NULL) && (salt_length != 0)) {
1284 return PSA_ERROR_INVALID_ARGUMENT;
1285 }
1286
1287 psa_invec in_vec[] = {
1288 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1289 {.base = input, .len = input_length},
1290 {.base = salt, .len = salt_length}
1291 };
1292
1293 psa_outvec out_vec[] = {
1294 {.base = output, .len = output_size},
1295 };
1296
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001297 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001298
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001299 if (salt == NULL) {
1300 in_len--;
1301 }
Summer Qinaee07882021-03-29 15:44:27 +08001302 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001303 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001304
1305 *output_length = out_vec[0].len;
1306
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001307 return status;
1308}
1309
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001310TFM_CRYPTO_API(psa_status_t, psa_key_derivation_get_capacity)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001311 const psa_key_derivation_operation_t *operation,
1312 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001313{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001314 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001315 .function_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001316 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001317 };
1318
1319 psa_invec in_vec[] = {
1320 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1321 };
1322
1323 psa_outvec out_vec[] = {
1324 {.base = capacity, .len = sizeof(size_t)},
1325 };
1326
Antonio de Angelis202425a2022-04-06 11:13:15 +01001327 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001328}
1329
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001330TFM_CRYPTO_API(psa_status_t, psa_key_derivation_output_bytes)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001331 psa_key_derivation_operation_t *operation,
1332 uint8_t *output,
1333 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001334{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001335 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001336 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001337 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001338 };
1339
1340 psa_invec in_vec[] = {
1341 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1342 };
1343
1344 psa_outvec out_vec[] = {
1345 {.base = output, .len = output_length},
1346 };
1347
Antonio de Angelis202425a2022-04-06 11:13:15 +01001348 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001349}
1350
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001351TFM_CRYPTO_API(psa_status_t, psa_key_derivation_input_key)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001352 psa_key_derivation_operation_t *operation,
1353 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001354 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001355{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001356 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001357 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001358 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001359 .step = step,
1360 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001361 };
1362
1363 psa_invec in_vec[] = {
1364 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001365 };
1366
Antonio de Angelis202425a2022-04-06 11:13:15 +01001367 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001368}
1369
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001370TFM_CRYPTO_API(psa_status_t, psa_key_derivation_abort)(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001371{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001372 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001373 .function_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001374 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001375 };
1376
1377 psa_invec in_vec[] = {
1378 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1379 };
1380
1381 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001382 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001383 };
1384
Antonio de Angelis202425a2022-04-06 11:13:15 +01001385 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001386}
1387
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001388TFM_CRYPTO_API(psa_status_t, psa_key_derivation_key_agreement)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001389 psa_key_derivation_operation_t *operation,
1390 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001391 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001392 const uint8_t *peer_key,
1393 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001394{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001395 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001396 .function_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001397 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001398 .step = step,
1399 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001400 };
1401
1402 psa_invec in_vec[] = {
1403 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1404 {.base = peer_key, .len = peer_key_length},
1405 };
1406
Antonio de Angelis202425a2022-04-06 11:13:15 +01001407 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001408}
1409
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001410TFM_CRYPTO_API(psa_status_t, psa_generate_random)(uint8_t *output,
1411 size_t output_size)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001412{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001413 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001414 .function_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001415 };
1416
1417 psa_invec in_vec[] = {
1418 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1419 };
1420
1421 psa_outvec out_vec[] = {
1422 {.base = output, .len = output_size},
1423 };
1424
1425 if (output_size == 0) {
1426 return PSA_SUCCESS;
1427 }
1428
Antonio de Angelis202425a2022-04-06 11:13:15 +01001429 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001430}
1431
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001432TFM_CRYPTO_API(psa_status_t, psa_generate_key)(const psa_key_attributes_t *attributes,
1433 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001434{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001435 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001436 .function_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001437 };
1438
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001439 psa_invec in_vec[] = {
1440 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001441 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1442 };
1443
1444 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001445 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001446 };
1447
Antonio de Angelis202425a2022-04-06 11:13:15 +01001448 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001449}
1450
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001451TFM_CRYPTO_API(psa_status_t, psa_mac_compute)(psa_key_id_t key,
1452 psa_algorithm_t alg,
1453 const uint8_t *input,
1454 size_t input_length,
1455 uint8_t *mac,
1456 size_t mac_size,
1457 size_t *mac_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001458{
1459 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001460 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001461 .function_id = TFM_CRYPTO_MAC_COMPUTE_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001462 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001463 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001464 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001465
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001466 psa_invec in_vec[] = {
1467 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Summer Qin045ec4a2021-07-07 14:28:04 +08001468 {.base = input, .len = input_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001469 };
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001470 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001471 {.base = mac, .len = mac_size},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001472 };
1473
Antonio de Angelis202425a2022-04-06 11:13:15 +01001474 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001475
1476 *mac_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001477 return status;
1478}
1479
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001480TFM_CRYPTO_API(psa_status_t, psa_mac_verify)(psa_key_id_t key,
1481 psa_algorithm_t alg,
1482 const uint8_t *input,
1483 size_t input_length,
1484 const uint8_t *mac,
1485 const size_t mac_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001486{
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001487 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001488 .function_id = TFM_CRYPTO_MAC_VERIFY_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001489 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001490 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001491 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001492
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001493 psa_invec in_vec[] = {
1494 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1495 {.base = input, .len = input_length},
Summer Qin045ec4a2021-07-07 14:28:04 +08001496 {.base = mac, .len = mac_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001497 };
1498
Antonio de Angelis202425a2022-04-06 11:13:15 +01001499 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001500}
1501
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001502TFM_CRYPTO_API(psa_status_t, psa_cipher_encrypt)(psa_key_id_t key,
1503 psa_algorithm_t alg,
1504 const uint8_t *input,
1505 size_t input_length,
1506 uint8_t *output,
1507 size_t output_size,
1508 size_t *output_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001509{
1510 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001511 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001512 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001513 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001514 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001515 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001516
Antonio de Angelis609f0002021-07-06 16:51:28 +02001517 psa_invec in_vec[] = {
1518 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1519 {.base = input, .len = input_length},
1520 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001521 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001522 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001523 };
1524
Antonio de Angelis202425a2022-04-06 11:13:15 +01001525 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001526
1527 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001528 return status;
1529}
1530
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001531TFM_CRYPTO_API(psa_status_t, psa_cipher_decrypt)(psa_key_id_t key,
1532 psa_algorithm_t alg,
1533 const uint8_t *input,
1534 size_t input_length,
1535 uint8_t *output,
1536 size_t output_size,
1537 size_t *output_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001538{
1539 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001540 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001541 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001542 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001543 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001544 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001545
Antonio de Angelis609f0002021-07-06 16:51:28 +02001546 psa_invec in_vec[] = {
1547 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1548 {.base = input, .len = input_length},
1549 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001550 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001551 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001552 };
1553
Antonio de Angelis202425a2022-04-06 11:13:15 +01001554 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001555
1556 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001557 return status;
1558}
1559
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001560TFM_CRYPTO_API(psa_status_t, psa_raw_key_agreement)(psa_algorithm_t alg,
1561 psa_key_id_t private_key,
1562 const uint8_t *peer_key,
1563 size_t peer_key_length,
1564 uint8_t *output,
1565 size_t output_size,
1566 size_t *output_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001567{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001568 psa_status_t status;
1569 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001570 .function_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001571 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001572 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001573 };
1574
1575 psa_invec in_vec[] = {
1576 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1577 {.base = peer_key, .len = peer_key_length},
1578 };
1579
1580 psa_outvec out_vec[] = {
1581 {.base = output, .len = output_size},
1582 };
1583
Antonio de Angelis202425a2022-04-06 11:13:15 +01001584 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001585
1586 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001587
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001588 return status;
1589}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001590
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001591TFM_CRYPTO_API(psa_status_t, psa_key_derivation_setup)(psa_key_derivation_operation_t *operation,
1592 psa_algorithm_t alg)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001593{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001594 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001595 .function_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001596 .alg = alg,
1597 .op_handle = operation->handle,
1598 };
1599
1600 psa_invec in_vec[] = {
1601 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1602 };
1603 psa_outvec out_vec[] = {
1604 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1605 };
1606
Antonio de Angelis202425a2022-04-06 11:13:15 +01001607 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001608}
1609
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001610TFM_CRYPTO_API(psa_status_t, psa_key_derivation_set_capacity)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001611 psa_key_derivation_operation_t *operation,
1612 size_t capacity)
1613{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001614 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001615 .function_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001616 .capacity = capacity,
1617 .op_handle = operation->handle,
1618 };
1619
1620 psa_invec in_vec[] = {
1621 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1622 };
1623
Antonio de Angelis202425a2022-04-06 11:13:15 +01001624 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001625}
1626
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001627TFM_CRYPTO_API(psa_status_t, psa_key_derivation_input_bytes)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001628 psa_key_derivation_operation_t *operation,
1629 psa_key_derivation_step_t step,
1630 const uint8_t *data,
1631 size_t data_length)
1632{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001633 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001634 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001635 .step = step,
1636 .op_handle = operation->handle,
1637 };
1638
1639 psa_invec in_vec[] = {
1640 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1641 {.base = data, .len = data_length},
1642 };
1643
Antonio de Angelis202425a2022-04-06 11:13:15 +01001644 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001645}
1646
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001647TFM_CRYPTO_API(psa_status_t, psa_key_derivation_output_key)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001648 const psa_key_attributes_t *attributes,
1649 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001650 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001651{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001652 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001653 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001654 .op_handle = operation->handle,
1655 };
1656
1657 psa_invec in_vec[] = {
1658 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1659 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1660 };
1661
1662 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001663 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001664 };
1665
Antonio de Angelis202425a2022-04-06 11:13:15 +01001666 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001667}
Summer Qincec79b02023-11-29 11:01:55 +08001668
1669TFM_CRYPTO_API(psa_status_t, psa_key_derivation_input_integer)(
1670 psa_key_derivation_operation_t *operation,
1671 psa_key_derivation_step_t step,
1672 uint64_t value)
1673{
1674 struct tfm_crypto_pack_iovec iov = {
1675 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_INTEGER_SID,
1676 .step = step,
1677 .value = value,
1678 .op_handle = operation->handle,
1679 };
1680
1681 psa_invec in_vec[] = {
1682 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1683 };
1684
1685 return API_DISPATCH_NO_OUTVEC(in_vec);
1686}
1687
1688TFM_CRYPTO_API(psa_status_t, psa_key_derivation_verify_bytes)(
1689 psa_key_derivation_operation_t *operation,
1690 const uint8_t *expected_output,
1691 size_t output_length)
1692{
Gergely Kovacs20006892024-11-29 13:05:30 +00001693 (void)operation;
1694 (void)expected_output;
1695 (void)output_length;
Summer Qincec79b02023-11-29 11:01:55 +08001696 /* To be implemented when the PSA backend supports it */
1697 return PSA_ERROR_NOT_SUPPORTED;
1698}
1699
1700TFM_CRYPTO_API(psa_status_t, psa_key_derivation_verify_key)(
1701 psa_key_derivation_operation_t *operation,
1702 psa_key_id_t expected)
1703{
Gergely Kovacs20006892024-11-29 13:05:30 +00001704 (void)operation;
1705 (void)expected;
Summer Qincec79b02023-11-29 11:01:55 +08001706 /* To be implemented when the PSA backend supports it */
1707 return PSA_ERROR_NOT_SUPPORTED;
1708}
Antonio de Angelis8bb98512024-01-16 14:13:36 +00001709
1710/* The implementation of the following helper function is marked
1711 * weak to allow for those integrations where this is directly
1712 * provided by the psa_crypto_client.c module of Mbed TLS
1713 */
1714__attribute__((weak))
1715TFM_CRYPTO_API(void, psa_reset_key_attributes)(
1716 psa_key_attributes_t *attributes)
1717{
1718 memset(attributes, 0, sizeof(*attributes));
1719}