blob: bd13bd1af953c7504cd2092fa7c3e38330abc62a [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 Angelis12e21a22023-03-23 16:25:36 +000077TFM_CRYPTO_API(psa_status_t, psa_open_key)(psa_key_id_t id,
78 psa_key_id_t *key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010079{
Jamie Foxdadb4e82019-09-03 17:59:41 +010080 const struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010081 .function_id = TFM_CRYPTO_OPEN_KEY_SID,
82 .key_id = id,
Jamie Foxdadb4e82019-09-03 17:59:41 +010083 };
84 psa_invec in_vec[] = {
85 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010086 };
87 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000088 {.base = key, .len = sizeof(psa_key_id_t)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010089 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010090
Antonio de Angelis202425a2022-04-06 11:13:15 +010091 return API_DISPATCH(in_vec, out_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010092}
93
Antonio de Angelis12e21a22023-03-23 16:25:36 +000094TFM_CRYPTO_API(psa_status_t, psa_close_key)(psa_key_id_t key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010095{
Jamie Foxdadb4e82019-09-03 17:59:41 +010096 const struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010097 .function_id = TFM_CRYPTO_CLOSE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000098 .key_id = key,
Jamie Foxdadb4e82019-09-03 17:59:41 +010099 };
100 psa_invec in_vec[] = {
101 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
102 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100103
Antonio de Angelis202425a2022-04-06 11:13:15 +0100104 return API_DISPATCH_NO_OUTVEC(in_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100105}
106
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000107TFM_CRYPTO_API(psa_status_t, psa_import_key)(const psa_key_attributes_t *attributes,
108 const uint8_t *data,
109 size_t data_length,
110 psa_key_id_t *key)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100111{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100112 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100113 .function_id = TFM_CRYPTO_IMPORT_KEY_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100114 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000115 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100116 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100117 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000118 {.base = data, .len = data_length}
119 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100120 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000121 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100122 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100123
Antonio de Angelis202425a2022-04-06 11:13:15 +0100124 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100125}
126
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000127TFM_CRYPTO_API(psa_status_t, psa_destroy_key)(psa_key_id_t key)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100128{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100129 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100130 .function_id = TFM_CRYPTO_DESTROY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000131 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100132 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000133 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100134 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000135 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100136
Antonio de Angelis202425a2022-04-06 11:13:15 +0100137 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100138}
139
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000140TFM_CRYPTO_API(psa_status_t, psa_get_key_attributes)(psa_key_id_t key,
141 psa_key_attributes_t *attributes)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100142{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100143 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100144 .function_id = TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000145 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100146 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000147 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100148 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000149 };
150 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100151 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000152 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100153
Antonio de Angelis202425a2022-04-06 11:13:15 +0100154 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100155}
156
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000157TFM_CRYPTO_API(psa_status_t, psa_export_key)(psa_key_id_t key,
158 uint8_t *data,
159 size_t data_size,
160 size_t *data_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100161{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000162 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100163 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100164 .function_id = TFM_CRYPTO_EXPORT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000165 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100166 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000167 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100168 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000169 };
170 psa_outvec out_vec[] = {
171 {.base = data, .len = data_size}
172 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100173
Antonio de Angelis202425a2022-04-06 11:13:15 +0100174 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100175
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000176 *data_length = out_vec[0].len;
177
178 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100179}
180
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000181TFM_CRYPTO_API(psa_status_t, psa_export_public_key)(psa_key_id_t key,
182 uint8_t *data,
183 size_t data_size,
184 size_t *data_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100185{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100186 psa_status_t status;
187 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100188 .function_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000189 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100190 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000191
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100192 psa_invec in_vec[] = {
193 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
194 };
195 psa_outvec out_vec[] = {
196 {.base = data, .len = data_size}
197 };
198
Antonio de Angelis202425a2022-04-06 11:13:15 +0100199 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100200
201 *data_length = out_vec[0].len;
202
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100203 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100204}
205
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000206TFM_CRYPTO_API(psa_status_t, psa_purge_key)(psa_key_id_t key)
Maulik Patel28659c42021-01-06 14:09:22 +0000207{
Maulik Patel28659c42021-01-06 14:09:22 +0000208 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100209 .function_id = TFM_CRYPTO_PURGE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000210 .key_id = key,
211 };
212 psa_invec in_vec[] = {
213 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
214 };
215
Antonio de Angelis202425a2022-04-06 11:13:15 +0100216 return API_DISPATCH_NO_OUTVEC(in_vec);
Maulik Patel28659c42021-01-06 14:09:22 +0000217}
218
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000219TFM_CRYPTO_API(psa_status_t, psa_copy_key)(psa_key_id_t source_key,
220 const psa_key_attributes_t *attributes,
221 psa_key_id_t *target_key)
Jamie Foxefd82732018-11-26 10:34:32 +0000222{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100223 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100224 .function_id = TFM_CRYPTO_COPY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000225 .key_id = source_key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100226 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000227
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100228 psa_invec in_vec[] = {
229 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100230 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100231 };
232
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000233 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000234 {.base = target_key, .len = sizeof(psa_key_id_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000235 };
Jamie Foxefd82732018-11-26 10:34:32 +0000236
Antonio de Angelis202425a2022-04-06 11:13:15 +0100237 return API_DISPATCH(in_vec, out_vec);
Jamie Foxefd82732018-11-26 10:34:32 +0000238}
239
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000240TFM_CRYPTO_API(psa_status_t, psa_cipher_generate_iv)(psa_cipher_operation_t *operation,
241 unsigned char *iv,
242 size_t iv_size,
243 size_t *iv_length)
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100244{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100245 psa_status_t status;
246 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100247 .function_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100248 .op_handle = operation->handle,
249 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100250
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100251 psa_invec in_vec[] = {
252 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
253 };
254 psa_outvec out_vec[] = {
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100255 {.base = iv, .len = iv_size},
256 };
257
Antonio de Angelis202425a2022-04-06 11:13:15 +0100258 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100259
Antonio de Angelis202425a2022-04-06 11:13:15 +0100260 *iv_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100261
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100262 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100263}
264
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000265TFM_CRYPTO_API(psa_status_t, psa_cipher_set_iv)(psa_cipher_operation_t *operation,
266 const unsigned char *iv,
267 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100268{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100269 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100270 .function_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100271 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100272 };
273
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000274 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100275 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000276 {.base = iv, .len = iv_length},
277 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100278
Antonio de Angelis202425a2022-04-06 11:13:15 +0100279 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100280}
281
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000282TFM_CRYPTO_API(psa_status_t, psa_cipher_encrypt_setup)(psa_cipher_operation_t *operation,
283 psa_key_id_t key,
284 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100285{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100286 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100287 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000288 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100289 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100290 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000291 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100292
Antonio de Angelis4743e672019-04-11 11:38:48 +0100293 psa_invec in_vec[] = {
294 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
295 };
296 psa_outvec out_vec[] = {
297 {.base = &(operation->handle), .len = sizeof(uint32_t)},
298 };
299
Antonio de Angelis202425a2022-04-06 11:13:15 +0100300 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100301}
302
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000303TFM_CRYPTO_API(psa_status_t, psa_cipher_decrypt_setup)(psa_cipher_operation_t *operation,
304 psa_key_id_t key,
305 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100306{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100307 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100308 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000309 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100310 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100311 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000312 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100313
Antonio de Angelis4743e672019-04-11 11:38:48 +0100314 psa_invec in_vec[] = {
315 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
316 };
317 psa_outvec out_vec[] = {
318 {.base = &(operation->handle), .len = sizeof(uint32_t)},
319 };
320
Antonio de Angelis202425a2022-04-06 11:13:15 +0100321 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100322}
323
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000324TFM_CRYPTO_API(psa_status_t, psa_cipher_update)(psa_cipher_operation_t *operation,
325 const uint8_t *input,
326 size_t input_length,
327 unsigned char *output,
328 size_t output_size,
329 size_t *output_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100330{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000331 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100332 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100333 .function_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100334 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100335 };
336
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000337 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100338 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000339 {.base = input, .len = input_length},
340 };
341 psa_outvec out_vec[] = {
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000342 {.base = output, .len = output_size}
343 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100344
Antonio de Angelis202425a2022-04-06 11:13:15 +0100345 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100346
Antonio de Angelis202425a2022-04-06 11:13:15 +0100347 *output_length = out_vec[0].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100348
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000349 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100350}
351
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000352TFM_CRYPTO_API(psa_status_t, psa_cipher_abort)(psa_cipher_operation_t *operation)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100353{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100354 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100355 .function_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100356 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000357 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100358
Antonio de Angelis4743e672019-04-11 11:38:48 +0100359 psa_invec in_vec[] = {
360 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
361 };
362 psa_outvec out_vec[] = {
363 {.base = &(operation->handle), .len = sizeof(uint32_t)},
364 };
365
Antonio de Angelis202425a2022-04-06 11:13:15 +0100366 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100367}
368
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000369TFM_CRYPTO_API(psa_status_t, psa_cipher_finish)(psa_cipher_operation_t *operation,
370 uint8_t *output,
371 size_t output_size,
372 size_t *output_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100373{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000374 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100375 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100376 .function_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100377 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100378 };
379
380 psa_invec in_vec[] = {
381 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
382 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000383 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100384 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000385 {.base = output, .len = output_size},
386 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100387
Antonio de Angelis202425a2022-04-06 11:13:15 +0100388 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100389
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000390 *output_length = out_vec[1].len;
391
392 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100393}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100394
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000395TFM_CRYPTO_API(psa_status_t, psa_hash_setup)(psa_hash_operation_t *operation,
396 psa_algorithm_t alg)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100397{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100398 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100399 .function_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100400 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100401 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000402 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100403
Antonio de Angelis4743e672019-04-11 11:38:48 +0100404 psa_invec in_vec[] = {
405 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
406 };
407 psa_outvec out_vec[] = {
408 {.base = &(operation->handle), .len = sizeof(uint32_t)},
409 };
410
Antonio de Angelis202425a2022-04-06 11:13:15 +0100411 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100412}
413
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000414TFM_CRYPTO_API(psa_status_t, psa_hash_update)(psa_hash_operation_t *operation,
415 const uint8_t *input,
416 size_t input_length)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100417{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100418 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100419 .function_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100420 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100421 };
422
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000423 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100424 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000425 {.base = input, .len = input_length},
426 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100427
Antonio de Angelis202425a2022-04-06 11:13:15 +0100428 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100429}
430
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000431TFM_CRYPTO_API(psa_status_t, psa_hash_finish)(psa_hash_operation_t *operation,
432 uint8_t *hash,
433 size_t hash_size,
434 size_t *hash_length)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100435{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000436 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100437 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100438 .function_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100439 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100440 };
441
442 psa_invec in_vec[] = {
443 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
444 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000445 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100446 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000447 {.base = hash, .len = hash_size},
448 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100449
Antonio de Angelis202425a2022-04-06 11:13:15 +0100450 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100451
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000452 *hash_length = out_vec[1].len;
453
454 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100455}
456
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000457TFM_CRYPTO_API(psa_status_t, psa_hash_verify)(psa_hash_operation_t *operation,
458 const uint8_t *hash,
459 size_t hash_length)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100460{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100461 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100462 .function_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100463 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100464 };
465
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000466 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100467 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000468 {.base = hash, .len = hash_length},
469 };
470 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100471 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000472 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100473
Antonio de Angelis202425a2022-04-06 11:13:15 +0100474 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100475}
476
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000477TFM_CRYPTO_API(psa_status_t, psa_hash_abort)(psa_hash_operation_t *operation)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100478{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100479 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100480 .function_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100481 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000482 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100483
Antonio de Angelis4743e672019-04-11 11:38:48 +0100484 psa_invec in_vec[] = {
485 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
486 };
487 psa_outvec out_vec[] = {
488 {.base = &(operation->handle), .len = sizeof(uint32_t)},
489 };
490
Antonio de Angelis202425a2022-04-06 11:13:15 +0100491 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100492}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100493
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000494TFM_CRYPTO_API(psa_status_t, psa_hash_clone)(const psa_hash_operation_t *source_operation,
495 psa_hash_operation_t *target_operation)
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100496{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100497 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100498 .function_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100499 .op_handle = source_operation->handle,
500 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100501
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100502 if (target_operation && (target_operation->handle != 0)) {
503 return PSA_ERROR_BAD_STATE;
504 }
505
David Huc9679cc2022-06-21 13:09:34 +0800506 psa_invec in_vec[] = {
507 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
508 {.base = &(target_operation->handle),
509 .len = sizeof(target_operation->handle)},
510 };
511 psa_outvec out_vec[] = {
512 {.base = &(target_operation->handle),
513 .len = sizeof(target_operation->handle)},
514 };
515
Antonio de Angelis202425a2022-04-06 11:13:15 +0100516 return API_DISPATCH(in_vec, out_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100517}
518
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000519TFM_CRYPTO_API(psa_status_t, psa_hash_compute)(psa_algorithm_t alg,
520 const uint8_t *input,
521 size_t input_length,
522 uint8_t *hash,
523 size_t hash_size,
524 size_t *hash_length)
Soby Mathew07ef6e42020-07-20 21:09:23 +0100525{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100526 psa_status_t status;
527 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100528 .function_id = TFM_CRYPTO_HASH_COMPUTE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100529 .alg = alg,
530 };
531
532 psa_invec in_vec[] = {
533 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
534 {.base = input, .len = input_length},
535 };
536
537 psa_outvec out_vec[] = {
538 {.base = hash, .len = hash_size}
539 };
540
Antonio de Angelis202425a2022-04-06 11:13:15 +0100541 status = API_DISPATCH(in_vec, out_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100542
543 *hash_length = out_vec[0].len;
544
Soby Mathew07ef6e42020-07-20 21:09:23 +0100545 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100546}
547
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000548TFM_CRYPTO_API(psa_status_t, psa_hash_compare)(psa_algorithm_t alg,
549 const uint8_t *input,
550 size_t input_length,
551 const uint8_t *hash,
552 size_t hash_length)
Soby Mathew07ef6e42020-07-20 21:09:23 +0100553{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100554 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100555 .function_id = TFM_CRYPTO_HASH_COMPARE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100556 .alg = alg,
557 };
558
559 psa_invec in_vec[] = {
560 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
561 {.base = input, .len = input_length},
562 {.base = hash, .len = hash_length},
563 };
564
Antonio de Angelis202425a2022-04-06 11:13:15 +0100565 return API_DISPATCH_NO_OUTVEC(in_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100566}
567
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000568TFM_CRYPTO_API(psa_status_t, psa_mac_sign_setup)(psa_mac_operation_t *operation,
569 psa_key_id_t key,
570 psa_algorithm_t alg)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100571{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100572 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100573 .function_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000574 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100575 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100576 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000577 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100578
Antonio de Angelis4743e672019-04-11 11:38:48 +0100579 psa_invec in_vec[] = {
580 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
581 };
582 psa_outvec out_vec[] = {
583 {.base = &(operation->handle), .len = sizeof(uint32_t)},
584 };
585
Antonio de Angelis202425a2022-04-06 11:13:15 +0100586 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100587}
588
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000589TFM_CRYPTO_API(psa_status_t, psa_mac_verify_setup)(psa_mac_operation_t *operation,
590 psa_key_id_t key,
591 psa_algorithm_t alg)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100592{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100593 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100594 .function_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000595 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100596 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100597 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000598 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100599
Antonio de Angelis4743e672019-04-11 11:38:48 +0100600 psa_invec in_vec[] = {
601 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
602 };
603 psa_outvec out_vec[] = {
604 {.base = &(operation->handle), .len = sizeof(uint32_t)},
605 };
606
Antonio de Angelis202425a2022-04-06 11:13:15 +0100607 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100608}
609
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000610TFM_CRYPTO_API(psa_status_t, psa_mac_update)(psa_mac_operation_t *operation,
611 const uint8_t *input,
612 size_t input_length)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100613{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100614 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100615 .function_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100616 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100617 };
618
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000619 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100620 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000621 {.base = input, .len = input_length},
622 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100623
Antonio de Angelis202425a2022-04-06 11:13:15 +0100624 return API_DISPATCH_NO_OUTVEC(in_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100625}
626
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000627TFM_CRYPTO_API(psa_status_t, psa_mac_sign_finish)(psa_mac_operation_t *operation,
628 uint8_t *mac,
629 size_t mac_size,
630 size_t *mac_length)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100631{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000632 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100633 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100634 .function_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100635 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100636 };
637
638 psa_invec in_vec[] = {
639 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
640 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000641 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100642 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000643 {.base = mac, .len = mac_size},
644 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100645
Antonio de Angelis202425a2022-04-06 11:13:15 +0100646 status = API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100647
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000648 *mac_length = out_vec[1].len;
649
650 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100651}
652
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000653TFM_CRYPTO_API(psa_status_t, psa_mac_verify_finish)(psa_mac_operation_t *operation,
654 const uint8_t *mac,
655 size_t mac_length)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100656{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100657 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100658 .function_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100659 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100660 };
661
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000662 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100663 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000664 {.base = mac, .len = mac_length},
665 };
666 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100667 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000668 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100669
Antonio de Angelis202425a2022-04-06 11:13:15 +0100670 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100671}
672
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000673TFM_CRYPTO_API(psa_status_t, psa_mac_abort)(psa_mac_operation_t *operation)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100674{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100675 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100676 .function_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100677 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000678 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100679
Antonio de Angelis4743e672019-04-11 11:38:48 +0100680 psa_invec in_vec[] = {
681 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
682 };
683 psa_outvec out_vec[] = {
684 {.base = &(operation->handle), .len = sizeof(uint32_t)},
685 };
686
Antonio de Angelis202425a2022-04-06 11:13:15 +0100687 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100688}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000689
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000690TFM_CRYPTO_API(psa_status_t, psa_aead_encrypt)(psa_key_id_t key,
691 psa_algorithm_t alg,
692 const uint8_t *nonce,
693 size_t nonce_length,
694 const uint8_t *additional_data,
695 size_t additional_data_length,
696 const uint8_t *plaintext,
697 size_t plaintext_length,
698 uint8_t *ciphertext,
699 size_t ciphertext_size,
700 size_t *ciphertext_length)
Antonio de Angelis3a480992018-11-07 11:53:28 +0000701{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000702 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100703 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100704 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000705 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100706 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000707 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000708 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100709
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100710 /* Sanitize the optional input */
711 if ((additional_data == NULL) && (additional_data_length != 0)) {
712 return PSA_ERROR_INVALID_ARGUMENT;
713 }
714
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000715 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000716 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000717 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100718 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000719 };
720 psa_outvec out_vec[] = {
721 {.base = ciphertext, .len = ciphertext_size},
722 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000723
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000724 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
725 return PSA_ERROR_INVALID_ARGUMENT;
726 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000727
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000728 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000729 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100730 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000731 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000732 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000733 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000734
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000735 in_vec[0].base = &iov;
736 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
737
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800738 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000739
Antonio de Angelis4743e672019-04-11 11:38:48 +0100740 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100741 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100742 }
Summer Qinaee07882021-03-29 15:44:27 +0800743 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800744 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000745
746 *ciphertext_length = out_vec[0].len;
747
748 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000749}
750
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000751TFM_CRYPTO_API(psa_status_t, psa_aead_decrypt)(psa_key_id_t key,
752 psa_algorithm_t alg,
753 const uint8_t *nonce,
754 size_t nonce_length,
755 const uint8_t *additional_data,
756 size_t additional_data_length,
757 const uint8_t *ciphertext,
758 size_t ciphertext_length,
759 uint8_t *plaintext,
760 size_t plaintext_size,
761 size_t *plaintext_length)
Antonio de Angelis3a480992018-11-07 11:53:28 +0000762{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000763 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100764 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100765 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000766 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100767 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000768 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000769 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100770
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100771 /* Sanitize the optional input */
772 if ((additional_data == NULL) && (additional_data_length != 0)) {
773 return PSA_ERROR_INVALID_ARGUMENT;
774 }
775
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000776 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000777 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000778 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100779 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000780 };
781 psa_outvec out_vec[] = {
782 {.base = plaintext, .len = plaintext_size},
783 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000784
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000785 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
786 return PSA_ERROR_INVALID_ARGUMENT;
787 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000788
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000789 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000790 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100791 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000792 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000793 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000794 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000795
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000796 in_vec[0].base = &iov;
797 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
798
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800799 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000800
Antonio de Angelis4743e672019-04-11 11:38:48 +0100801 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100802 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100803 }
Summer Qinaee07882021-03-29 15:44:27 +0800804 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800805 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000806
807 *plaintext_length = out_vec[0].len;
808
809 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000810}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100811
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000812TFM_CRYPTO_API(psa_status_t, psa_aead_encrypt_setup)(psa_aead_operation_t *operation,
813 psa_key_id_t key,
814 psa_algorithm_t alg)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100815{
816 psa_status_t status;
817 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100818 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100819 .key_id = key,
820 .alg = alg,
821 .op_handle = operation->handle,
822 };
823
824 psa_invec in_vec[] = {
825 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
826 };
827 psa_outvec out_vec[] = {
828 {.base = &(operation->handle), .len = sizeof(uint32_t)}
829 };
830
Antonio de Angelis202425a2022-04-06 11:13:15 +0100831 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100832 return status;
833}
834
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000835TFM_CRYPTO_API(psa_status_t, psa_aead_decrypt_setup)(psa_aead_operation_t *operation,
836 psa_key_id_t key,
837 psa_algorithm_t alg)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100838{
839 psa_status_t status;
840 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100841 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100842 .key_id = key,
843 .alg = alg,
844 .op_handle = operation->handle,
845 };
846
847 psa_invec in_vec[] = {
848 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
849 };
850 psa_outvec out_vec[] = {
851 {.base = &(operation->handle), .len = sizeof(uint32_t)}
852 };
853
Antonio de Angelis202425a2022-04-06 11:13:15 +0100854 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100855 return status;
856}
857
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000858TFM_CRYPTO_API(psa_status_t, psa_aead_generate_nonce)(psa_aead_operation_t *operation,
859 uint8_t *nonce,
860 size_t nonce_size,
861 size_t *nonce_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100862{
863 psa_status_t status;
864 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100865 .function_id = TFM_CRYPTO_AEAD_GENERATE_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100866 .op_handle = operation->handle,
867 };
868
869 psa_invec in_vec[] = {
870 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
871 };
872 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +0100873 {.base = nonce, .len = nonce_size}
874 };
875
Antonio de Angelis202425a2022-04-06 11:13:15 +0100876 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100877
Antonio de Angelis202425a2022-04-06 11:13:15 +0100878 *nonce_length = out_vec[0].len;
Antonio de Angelis8d282482021-10-07 15:04:12 +0100879 return status;
880}
881
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000882TFM_CRYPTO_API(psa_status_t, psa_aead_set_nonce)(psa_aead_operation_t *operation,
883 const uint8_t *nonce,
884 size_t nonce_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100885{
886 psa_status_t status;
887 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100888 .function_id = TFM_CRYPTO_AEAD_SET_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100889 .op_handle = operation->handle,
890 };
891
892 psa_invec in_vec[] = {
893 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
894 {.base = nonce, .len = nonce_length}
895 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100896
Antonio de Angelis202425a2022-04-06 11:13:15 +0100897 status = API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100898 return status;
899}
900
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000901TFM_CRYPTO_API(psa_status_t, psa_aead_set_lengths)(psa_aead_operation_t *operation,
902 size_t ad_length,
903 size_t plaintext_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100904{
905 psa_status_t status;
906 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100907 .function_id = TFM_CRYPTO_AEAD_SET_LENGTHS_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100908 .ad_length = ad_length,
909 .plaintext_length = plaintext_length,
910 .op_handle = operation->handle,
911 };
912
913 psa_invec in_vec[] = {
914 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
915 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100916
Antonio de Angelis202425a2022-04-06 11:13:15 +0100917 status = API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100918 return status;
919}
920
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000921TFM_CRYPTO_API(psa_status_t, psa_aead_update_ad)(psa_aead_operation_t *operation,
922 const uint8_t *input,
923 size_t input_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100924{
925 psa_status_t status;
926 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100927 .function_id = TFM_CRYPTO_AEAD_UPDATE_AD_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100928 .op_handle = operation->handle,
929 };
930
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000931 /* Sanitize the optional input */
932 if ((input == NULL) && (input_length != 0)) {
933 return PSA_ERROR_INVALID_ARGUMENT;
934 }
935
Antonio de Angelis8d282482021-10-07 15:04:12 +0100936 psa_invec in_vec[] = {
937 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
938 {.base = input, .len = input_length}
939 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100940
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000941 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000942
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000943 if (input == NULL) {
944 in_len--;
945 }
946 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis202425a2022-04-06 11:13:15 +0100947 NULL, 0);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100948 return status;
949}
950
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000951TFM_CRYPTO_API(psa_status_t, psa_aead_update)(psa_aead_operation_t *operation,
952 const uint8_t *input,
953 size_t input_length,
954 uint8_t *output,
955 size_t output_size,
956 size_t *output_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100957{
958 psa_status_t status;
959 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100960 .function_id = TFM_CRYPTO_AEAD_UPDATE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100961 .op_handle = operation->handle,
962 };
963
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000964 /* Sanitize the optional input */
965 if ((input == NULL) && (input_length != 0)) {
966 return PSA_ERROR_INVALID_ARGUMENT;
967 }
968
Antonio de Angelis8d282482021-10-07 15:04:12 +0100969 psa_invec in_vec[] = {
970 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
971 {.base = input, .len = input_length}
972 };
973 psa_outvec out_vec[] = {
Antonio de Angelisc26af632021-10-07 15:04:12 +0100974 {.base = output, .len = output_size},
Antonio de Angelis8d282482021-10-07 15:04:12 +0100975 };
976
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000977 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000978
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000979 if (input == NULL) {
980 in_len--;
981 }
982 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
983 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis8d282482021-10-07 15:04:12 +0100984
Antonio de Angelis202425a2022-04-06 11:13:15 +0100985 *output_length = out_vec[0].len;
Antonio de Angelis8d282482021-10-07 15:04:12 +0100986 return status;
987}
988
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000989TFM_CRYPTO_API(psa_status_t, psa_aead_finish)(psa_aead_operation_t *operation,
990 uint8_t *ciphertext,
991 size_t ciphertext_size,
992 size_t *ciphertext_length,
993 uint8_t *tag,
994 size_t tag_size,
995 size_t *tag_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100996{
997 psa_status_t status;
998 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100999 .function_id = TFM_CRYPTO_AEAD_FINISH_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001000 .op_handle = operation->handle,
1001 };
1002
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001003 /* Sanitize the optional output */
1004 if ((ciphertext == NULL) && (ciphertext_size != 0)) {
1005 return PSA_ERROR_INVALID_ARGUMENT;
1006 }
1007
Antonio de Angelis8d282482021-10-07 15:04:12 +01001008 psa_invec in_vec[] = {
1009 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1010 };
1011 psa_outvec out_vec[] = {
1012 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis8d282482021-10-07 15:04:12 +01001013 {.base = tag, .len = tag_size},
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001014 {.base = ciphertext, .len = ciphertext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +01001015 };
1016
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001017 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001018
Elena Uziunaited38e8212024-02-26 17:25:47 +00001019 if ((ciphertext == NULL) || (ciphertext_size == 0)) {
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001020 out_len--;
1021 }
1022 if ((out_len == 3) && (ciphertext_length == NULL)) {
1023 return PSA_ERROR_INVALID_ARGUMENT;
1024 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001025
Antonio de Angelisc26af632021-10-07 15:04:12 +01001026 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
1027 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001028 out_vec, out_len);
1029
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001030 if (out_len == 3) {
1031 *ciphertext_length = out_vec[2].len;
1032 } else {
1033 *ciphertext_length = 0;
1034 }
Antonio de Angelis202425a2022-04-06 11:13:15 +01001035
1036 *tag_length = out_vec[1].len;
1037
Antonio de Angelis8d282482021-10-07 15:04:12 +01001038 return status;
1039}
1040
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001041TFM_CRYPTO_API(psa_status_t, psa_aead_verify)(psa_aead_operation_t *operation,
1042 uint8_t *plaintext,
1043 size_t plaintext_size,
1044 size_t *plaintext_length,
1045 const uint8_t *tag,
1046 size_t tag_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +01001047{
1048 psa_status_t status;
1049 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001050 .function_id = TFM_CRYPTO_AEAD_VERIFY_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001051 .op_handle = operation->handle,
1052 };
1053
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001054 /* Sanitize the optional output */
1055 if ((plaintext == NULL) && (plaintext_size != 0)) {
1056 return PSA_ERROR_INVALID_ARGUMENT;
1057 }
1058
Antonio de Angelis8d282482021-10-07 15:04:12 +01001059 psa_invec in_vec[] = {
1060 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1061 {.base = tag, .len = tag_length}
1062 };
1063 psa_outvec out_vec[] = {
1064 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis202425a2022-04-06 11:13:15 +01001065 {.base = plaintext, .len = plaintext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +01001066 };
1067
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001068 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001069
Elena Uziunaited38e8212024-02-26 17:25:47 +00001070 if ((plaintext == NULL) || (plaintext_size == 0)) {
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001071 out_len--;
1072 }
1073 if ((out_len == 2) && (plaintext_length == NULL)) {
1074 return PSA_ERROR_INVALID_ARGUMENT;
1075 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001076
Antonio de Angelisc26af632021-10-07 15:04:12 +01001077 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
1078 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001079 out_vec, out_len);
1080
1081 if (out_len == 2) {
1082 *plaintext_length = out_vec[1].len;
1083 } else {
1084 *plaintext_length = 0;
1085 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001086 return status;
1087}
1088
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001089TFM_CRYPTO_API(psa_status_t, psa_aead_abort)(psa_aead_operation_t *operation)
Antonio de Angelis8d282482021-10-07 15:04:12 +01001090{
Antonio de Angelis8d282482021-10-07 15:04:12 +01001091 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001092 .function_id = TFM_CRYPTO_AEAD_ABORT_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001093 .op_handle = operation->handle,
1094 };
1095
1096 psa_invec in_vec[] = {
1097 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1098 };
1099 psa_outvec out_vec[] = {
1100 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1101 };
1102
Antonio de Angelis202425a2022-04-06 11:13:15 +01001103 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +01001104}
1105
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001106TFM_CRYPTO_API(psa_status_t, psa_sign_message)(psa_key_id_t key,
1107 psa_algorithm_t alg,
1108 const uint8_t *input,
1109 size_t input_length,
1110 uint8_t *signature,
1111 size_t signature_size,
1112 size_t *signature_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001113{
Summer Qinb9492d22021-06-22 18:00:54 +08001114 psa_status_t status;
1115 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001116 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001117 .key_id = key,
1118 .alg = alg,
1119 };
1120
1121 psa_invec in_vec[] = {
1122 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1123 {.base = input, .len = input_length},
1124 };
1125 psa_outvec out_vec[] = {
1126 {.base = signature, .len = signature_size},
1127 };
1128
Antonio de Angelis202425a2022-04-06 11:13:15 +01001129 status = API_DISPATCH(in_vec, out_vec);
Summer Qinb9492d22021-06-22 18:00:54 +08001130
Antonio de Angelisf83a2082021-08-20 22:13:53 +01001131 *signature_length = out_vec[0].len;
Summer Qinb9492d22021-06-22 18:00:54 +08001132 return status;
1133}
1134
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001135TFM_CRYPTO_API(psa_status_t, psa_verify_message)(psa_key_id_t key,
1136 psa_algorithm_t alg,
1137 const uint8_t *input,
1138 size_t input_length,
1139 const uint8_t *signature,
1140 size_t signature_length)
Summer Qinb9492d22021-06-22 18:00:54 +08001141{
Summer Qinb9492d22021-06-22 18:00:54 +08001142 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001143 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001144 .key_id = key,
1145 .alg = alg
1146 };
1147
1148 psa_invec in_vec[] = {
1149 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1150 {.base = input, .len = input_length},
1151 {.base = signature, .len = signature_length}
1152 };
1153
Antonio de Angelis202425a2022-04-06 11:13:15 +01001154 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001155}
1156
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001157TFM_CRYPTO_API(psa_status_t, psa_sign_hash)(psa_key_id_t key,
1158 psa_algorithm_t alg,
1159 const uint8_t *hash,
1160 size_t hash_length,
1161 uint8_t *signature,
1162 size_t signature_size,
1163 size_t *signature_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001164{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001165 psa_status_t status;
1166 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001167 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001168 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001169 .alg = alg,
1170 };
1171
1172 psa_invec in_vec[] = {
1173 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1174 {.base = hash, .len = hash_length},
1175 };
1176 psa_outvec out_vec[] = {
1177 {.base = signature, .len = signature_size},
1178 };
1179
Antonio de Angelis202425a2022-04-06 11:13:15 +01001180 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001181
1182 *signature_length = out_vec[0].len;
1183
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001184 return status;
1185}
1186
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001187TFM_CRYPTO_API(psa_status_t, psa_verify_hash)(psa_key_id_t key,
1188 psa_algorithm_t alg,
1189 const uint8_t *hash,
1190 size_t hash_length,
1191 const uint8_t *signature,
1192 size_t signature_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001193{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001194 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001195 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001196 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001197 .alg = alg
1198 };
1199
1200 psa_invec in_vec[] = {
1201 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1202 {.base = hash, .len = hash_length},
1203 {.base = signature, .len = signature_length}
1204 };
1205
Antonio de Angelis202425a2022-04-06 11:13:15 +01001206 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001207}
1208
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001209TFM_CRYPTO_API(psa_status_t, psa_asymmetric_encrypt)(psa_key_id_t key,
1210 psa_algorithm_t alg,
1211 const uint8_t *input,
1212 size_t input_length,
1213 const uint8_t *salt,
1214 size_t salt_length,
1215 uint8_t *output,
1216 size_t output_size,
1217 size_t *output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001218{
1219 psa_status_t status;
1220 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001221 .function_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001222 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001223 .alg = alg
1224 };
1225
1226 /* Sanitize the optional input */
1227 if ((salt == NULL) && (salt_length != 0)) {
1228 return PSA_ERROR_INVALID_ARGUMENT;
1229 }
1230
1231 psa_invec in_vec[] = {
1232 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1233 {.base = input, .len = input_length},
1234 {.base = salt, .len = salt_length}
1235 };
1236
1237 psa_outvec out_vec[] = {
1238 {.base = output, .len = output_size},
1239 };
1240
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001241 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001242
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001243 if (salt == NULL) {
1244 in_len--;
1245 }
Summer Qinaee07882021-03-29 15:44:27 +08001246 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001247 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001248
1249 *output_length = out_vec[0].len;
1250
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001251 return status;
1252}
1253
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001254TFM_CRYPTO_API(psa_status_t, psa_asymmetric_decrypt)(psa_key_id_t key,
1255 psa_algorithm_t alg,
1256 const uint8_t *input,
1257 size_t input_length,
1258 const uint8_t *salt,
1259 size_t salt_length,
1260 uint8_t *output,
1261 size_t output_size,
1262 size_t *output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001263{
1264 psa_status_t status;
1265 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001266 .function_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001267 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001268 .alg = alg
1269 };
1270
1271 /* Sanitize the optional input */
1272 if ((salt == NULL) && (salt_length != 0)) {
1273 return PSA_ERROR_INVALID_ARGUMENT;
1274 }
1275
1276 psa_invec in_vec[] = {
1277 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1278 {.base = input, .len = input_length},
1279 {.base = salt, .len = salt_length}
1280 };
1281
1282 psa_outvec out_vec[] = {
1283 {.base = output, .len = output_size},
1284 };
1285
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001286 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001287
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001288 if (salt == NULL) {
1289 in_len--;
1290 }
Summer Qinaee07882021-03-29 15:44:27 +08001291 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001292 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001293
1294 *output_length = out_vec[0].len;
1295
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001296 return status;
1297}
1298
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001299TFM_CRYPTO_API(psa_status_t, psa_key_derivation_get_capacity)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001300 const psa_key_derivation_operation_t *operation,
1301 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001302{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001303 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001304 .function_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001305 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001306 };
1307
1308 psa_invec in_vec[] = {
1309 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1310 };
1311
1312 psa_outvec out_vec[] = {
1313 {.base = capacity, .len = sizeof(size_t)},
1314 };
1315
Antonio de Angelis202425a2022-04-06 11:13:15 +01001316 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001317}
1318
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001319TFM_CRYPTO_API(psa_status_t, psa_key_derivation_output_bytes)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001320 psa_key_derivation_operation_t *operation,
1321 uint8_t *output,
1322 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001323{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001324 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001325 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001326 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001327 };
1328
1329 psa_invec in_vec[] = {
1330 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1331 };
1332
1333 psa_outvec out_vec[] = {
1334 {.base = output, .len = output_length},
1335 };
1336
Antonio de Angelis202425a2022-04-06 11:13:15 +01001337 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001338}
1339
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001340TFM_CRYPTO_API(psa_status_t, psa_key_derivation_input_key)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001341 psa_key_derivation_operation_t *operation,
1342 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001343 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001344{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001345 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001346 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001347 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001348 .step = step,
1349 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001350 };
1351
1352 psa_invec in_vec[] = {
1353 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001354 };
1355
Antonio de Angelis202425a2022-04-06 11:13:15 +01001356 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001357}
1358
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001359TFM_CRYPTO_API(psa_status_t, psa_key_derivation_abort)(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001360{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001361 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001362 .function_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001363 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001364 };
1365
1366 psa_invec in_vec[] = {
1367 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1368 };
1369
1370 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001371 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001372 };
1373
Antonio de Angelis202425a2022-04-06 11:13:15 +01001374 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001375}
1376
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001377TFM_CRYPTO_API(psa_status_t, psa_key_derivation_key_agreement)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001378 psa_key_derivation_operation_t *operation,
1379 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001380 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001381 const uint8_t *peer_key,
1382 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001383{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001384 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001385 .function_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001386 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001387 .step = step,
1388 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001389 };
1390
1391 psa_invec in_vec[] = {
1392 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1393 {.base = peer_key, .len = peer_key_length},
1394 };
1395
Antonio de Angelis202425a2022-04-06 11:13:15 +01001396 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001397}
1398
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001399TFM_CRYPTO_API(psa_status_t, psa_generate_random)(uint8_t *output,
1400 size_t output_size)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001401{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001402 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001403 .function_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001404 };
1405
1406 psa_invec in_vec[] = {
1407 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1408 };
1409
1410 psa_outvec out_vec[] = {
1411 {.base = output, .len = output_size},
1412 };
1413
1414 if (output_size == 0) {
1415 return PSA_SUCCESS;
1416 }
1417
Antonio de Angelis202425a2022-04-06 11:13:15 +01001418 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001419}
1420
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001421TFM_CRYPTO_API(psa_status_t, psa_generate_key)(const psa_key_attributes_t *attributes,
1422 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001423{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001424 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001425 .function_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001426 };
1427
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001428 psa_invec in_vec[] = {
1429 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001430 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1431 };
1432
1433 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001434 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001435 };
1436
Antonio de Angelis202425a2022-04-06 11:13:15 +01001437 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001438}
1439
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001440TFM_CRYPTO_API(psa_status_t, psa_mac_compute)(psa_key_id_t key,
1441 psa_algorithm_t alg,
1442 const uint8_t *input,
1443 size_t input_length,
1444 uint8_t *mac,
1445 size_t mac_size,
1446 size_t *mac_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001447{
1448 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001449 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001450 .function_id = TFM_CRYPTO_MAC_COMPUTE_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001451 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001452 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001453 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001454
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001455 psa_invec in_vec[] = {
1456 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Summer Qin045ec4a2021-07-07 14:28:04 +08001457 {.base = input, .len = input_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001458 };
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001459 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001460 {.base = mac, .len = mac_size},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001461 };
1462
Antonio de Angelis202425a2022-04-06 11:13:15 +01001463 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001464
1465 *mac_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001466 return status;
1467}
1468
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001469TFM_CRYPTO_API(psa_status_t, psa_mac_verify)(psa_key_id_t key,
1470 psa_algorithm_t alg,
1471 const uint8_t *input,
1472 size_t input_length,
1473 const uint8_t *mac,
1474 const size_t mac_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001475{
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001476 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001477 .function_id = TFM_CRYPTO_MAC_VERIFY_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001478 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001479 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001480 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001481
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001482 psa_invec in_vec[] = {
1483 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1484 {.base = input, .len = input_length},
Summer Qin045ec4a2021-07-07 14:28:04 +08001485 {.base = mac, .len = mac_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001486 };
1487
Antonio de Angelis202425a2022-04-06 11:13:15 +01001488 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001489}
1490
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001491TFM_CRYPTO_API(psa_status_t, psa_cipher_encrypt)(psa_key_id_t key,
1492 psa_algorithm_t alg,
1493 const uint8_t *input,
1494 size_t input_length,
1495 uint8_t *output,
1496 size_t output_size,
1497 size_t *output_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001498{
1499 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001500 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001501 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001502 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001503 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001504 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001505
Antonio de Angelis609f0002021-07-06 16:51:28 +02001506 psa_invec in_vec[] = {
1507 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1508 {.base = input, .len = input_length},
1509 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001510 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001511 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001512 };
1513
Antonio de Angelis202425a2022-04-06 11:13:15 +01001514 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001515
1516 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001517 return status;
1518}
1519
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001520TFM_CRYPTO_API(psa_status_t, psa_cipher_decrypt)(psa_key_id_t key,
1521 psa_algorithm_t alg,
1522 const uint8_t *input,
1523 size_t input_length,
1524 uint8_t *output,
1525 size_t output_size,
1526 size_t *output_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001527{
1528 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001529 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001530 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001531 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001532 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001533 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001534
Antonio de Angelis609f0002021-07-06 16:51:28 +02001535 psa_invec in_vec[] = {
1536 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1537 {.base = input, .len = input_length},
1538 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001539 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001540 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001541 };
1542
Antonio de Angelis202425a2022-04-06 11:13:15 +01001543 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001544
1545 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001546 return status;
1547}
1548
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001549TFM_CRYPTO_API(psa_status_t, psa_raw_key_agreement)(psa_algorithm_t alg,
1550 psa_key_id_t private_key,
1551 const uint8_t *peer_key,
1552 size_t peer_key_length,
1553 uint8_t *output,
1554 size_t output_size,
1555 size_t *output_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001556{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001557 psa_status_t status;
1558 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001559 .function_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001560 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001561 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001562 };
1563
1564 psa_invec in_vec[] = {
1565 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1566 {.base = peer_key, .len = peer_key_length},
1567 };
1568
1569 psa_outvec out_vec[] = {
1570 {.base = output, .len = output_size},
1571 };
1572
Antonio de Angelis202425a2022-04-06 11:13:15 +01001573 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001574
1575 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001576
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001577 return status;
1578}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001579
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001580TFM_CRYPTO_API(psa_status_t, psa_key_derivation_setup)(psa_key_derivation_operation_t *operation,
1581 psa_algorithm_t alg)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001582{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001583 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001584 .function_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001585 .alg = alg,
1586 .op_handle = operation->handle,
1587 };
1588
1589 psa_invec in_vec[] = {
1590 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1591 };
1592 psa_outvec out_vec[] = {
1593 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1594 };
1595
Antonio de Angelis202425a2022-04-06 11:13:15 +01001596 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001597}
1598
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001599TFM_CRYPTO_API(psa_status_t, psa_key_derivation_set_capacity)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001600 psa_key_derivation_operation_t *operation,
1601 size_t capacity)
1602{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001603 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001604 .function_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001605 .capacity = capacity,
1606 .op_handle = operation->handle,
1607 };
1608
1609 psa_invec in_vec[] = {
1610 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1611 };
1612
Antonio de Angelis202425a2022-04-06 11:13:15 +01001613 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001614}
1615
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001616TFM_CRYPTO_API(psa_status_t, psa_key_derivation_input_bytes)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001617 psa_key_derivation_operation_t *operation,
1618 psa_key_derivation_step_t step,
1619 const uint8_t *data,
1620 size_t data_length)
1621{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001622 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001623 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001624 .step = step,
1625 .op_handle = operation->handle,
1626 };
1627
1628 psa_invec in_vec[] = {
1629 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1630 {.base = data, .len = data_length},
1631 };
1632
Antonio de Angelis202425a2022-04-06 11:13:15 +01001633 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001634}
1635
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001636TFM_CRYPTO_API(psa_status_t, psa_key_derivation_output_key)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001637 const psa_key_attributes_t *attributes,
1638 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001639 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001640{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001641 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001642 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001643 .op_handle = operation->handle,
1644 };
1645
1646 psa_invec in_vec[] = {
1647 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1648 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1649 };
1650
1651 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001652 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001653 };
1654
Antonio de Angelis202425a2022-04-06 11:13:15 +01001655 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001656}
Summer Qincec79b02023-11-29 11:01:55 +08001657
1658TFM_CRYPTO_API(psa_status_t, psa_key_derivation_input_integer)(
1659 psa_key_derivation_operation_t *operation,
1660 psa_key_derivation_step_t step,
1661 uint64_t value)
1662{
1663 struct tfm_crypto_pack_iovec iov = {
1664 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_INTEGER_SID,
1665 .step = step,
1666 .value = value,
1667 .op_handle = operation->handle,
1668 };
1669
1670 psa_invec in_vec[] = {
1671 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1672 };
1673
1674 return API_DISPATCH_NO_OUTVEC(in_vec);
1675}
1676
1677TFM_CRYPTO_API(psa_status_t, psa_key_derivation_verify_bytes)(
1678 psa_key_derivation_operation_t *operation,
1679 const uint8_t *expected_output,
1680 size_t output_length)
1681{
Gergely Kovacs20006892024-11-29 13:05:30 +00001682 (void)operation;
1683 (void)expected_output;
1684 (void)output_length;
Summer Qincec79b02023-11-29 11:01:55 +08001685 /* To be implemented when the PSA backend supports it */
1686 return PSA_ERROR_NOT_SUPPORTED;
1687}
1688
1689TFM_CRYPTO_API(psa_status_t, psa_key_derivation_verify_key)(
1690 psa_key_derivation_operation_t *operation,
1691 psa_key_id_t expected)
1692{
Gergely Kovacs20006892024-11-29 13:05:30 +00001693 (void)operation;
1694 (void)expected;
Summer Qincec79b02023-11-29 11:01:55 +08001695 /* To be implemented when the PSA backend supports it */
1696 return PSA_ERROR_NOT_SUPPORTED;
1697}
Antonio de Angelis8bb98512024-01-16 14:13:36 +00001698
1699/* The implementation of the following helper function is marked
1700 * weak to allow for those integrations where this is directly
1701 * provided by the psa_crypto_client.c module of Mbed TLS
1702 */
1703__attribute__((weak))
1704TFM_CRYPTO_API(void, psa_reset_key_attributes)(
1705 psa_key_attributes_t *attributes)
1706{
1707 memset(attributes, 0, sizeof(*attributes));
1708}