blob: 8c857324b459bbd6d17e730825593c3935df9efb [file] [log] [blame]
Antonio de Angelis8908f472018-08-31 15:44:25 +01001/*
Antonio de Angelis12e21a22023-03-23 16:25:36 +00002 * Copyright (c) 2018-2023, Arm Limited. All rights reserved.
Antonio de Angelis8908f472018-08-31 15:44:25 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00008#include "tfm_crypto_defs.h"
Jamie Foxcc31d402019-01-28 17:13:52 +00009#include "psa/crypto.h"
Kevin Peng9449a362019-07-29 16:05:42 +080010#include "psa/client.h"
Antonio de Angelis202425a2022-04-06 11:13:15 +010011#include "psa_manifest/sid.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000012
Antonio de Angelis202425a2022-04-06 11:13:15 +010013#define API_DISPATCH(in_vec, out_vec) \
14 psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, \
15 in_vec, IOVEC_LEN(in_vec), \
16 out_vec, IOVEC_LEN(out_vec))
17#define API_DISPATCH_NO_OUTVEC(in_vec) \
18 psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, \
19 in_vec, IOVEC_LEN(in_vec), \
20 (psa_outvec *)NULL, 0)
Antonio de Angelis8908f472018-08-31 15:44:25 +010021
Antonio de Angelis12e21a22023-03-23 16:25:36 +000022/*!
23 * \def CONFIG_TFM_CRYPTO_API_RENAME
24 *
25 * \brief By setting this to 1, system integrators can rename the symbols of the
26 * PSA Crypto APIs available in the TF-M interface. It allows flexibility
27 * for some integration setups where multiple providers of the PSA Crypto
28 * APIs are available at link time. Normally this configuration option
29 * should not be enabled when building the Secure interface because the
30 * secure partitions will just use the standard function names. By default
31 * it prepends the "tfm_crypto__" prefix.
32 *
33 * \note This config option is not available through the TF-M configuration as
34 * it's for NS applications and system integrators to enable.
35 */
36
37/*!
38 * \def TFM_CRYPTO_API(ret, fun)
39 *
40 * \brief Define the function signature of a TF-M Crypto API with return
41 * type \a ret and PSA Crypto API function name \a fun
42 *
43 * \param ret return type associated to the API
44 * \param fun API name (e.g. a PSA Crypto API function name)
45 *
46 * \returns Function signature
47 */
48
49#if CONFIG_TFM_CRYPTO_API_RENAME == 1
50#define TFM_CRYPTO_API(ret, fun) ret tfm_crypto__##fun
51#else
52#define TFM_CRYPTO_API(ret, fun) ret fun
53#endif /* CONFIG_TFM_CRYPTO_API_RENAME */
54
55TFM_CRYPTO_API(psa_status_t, psa_crypto_init)(void)
Antonio de Angelis8908f472018-08-31 15:44:25 +010056{
57 /* Service init is performed during TFM boot up,
58 * so application level initialisation is empty
59 */
60 return PSA_SUCCESS;
61}
62
Antonio de Angelis12e21a22023-03-23 16:25:36 +000063TFM_CRYPTO_API(psa_status_t, psa_open_key)(psa_key_id_t id,
64 psa_key_id_t *key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010065{
Jamie Foxdadb4e82019-09-03 17:59:41 +010066 const struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010067 .function_id = TFM_CRYPTO_OPEN_KEY_SID,
68 .key_id = id,
Jamie Foxdadb4e82019-09-03 17:59:41 +010069 };
70 psa_invec in_vec[] = {
71 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010072 };
73 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000074 {.base = key, .len = sizeof(psa_key_id_t)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010075 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010076
Antonio de Angelis202425a2022-04-06 11:13:15 +010077 return API_DISPATCH(in_vec, out_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010078}
79
Antonio de Angelis12e21a22023-03-23 16:25:36 +000080TFM_CRYPTO_API(psa_status_t, psa_close_key)(psa_key_id_t key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010081{
Jamie Foxdadb4e82019-09-03 17:59:41 +010082 const struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010083 .function_id = TFM_CRYPTO_CLOSE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000084 .key_id = key,
Jamie Foxdadb4e82019-09-03 17:59:41 +010085 };
86 psa_invec in_vec[] = {
87 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
88 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010089
Antonio de Angelis202425a2022-04-06 11:13:15 +010090 return API_DISPATCH_NO_OUTVEC(in_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010091}
92
Antonio de Angelis12e21a22023-03-23 16:25:36 +000093TFM_CRYPTO_API(psa_status_t, psa_import_key)(const psa_key_attributes_t *attributes,
94 const uint8_t *data,
95 size_t data_length,
96 psa_key_id_t *key)
Antonio de Angelis8908f472018-08-31 15:44:25 +010097{
Antonio de Angelis4743e672019-04-11 11:38:48 +010098 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010099 .function_id = TFM_CRYPTO_IMPORT_KEY_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100100 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000101 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100102 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100103 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000104 {.base = data, .len = data_length}
105 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100106 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000107 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100108 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100109
Antonio de Angelis202425a2022-04-06 11:13:15 +0100110 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100111}
112
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000113TFM_CRYPTO_API(psa_status_t, psa_destroy_key)(psa_key_id_t key)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100114{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100115 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100116 .function_id = TFM_CRYPTO_DESTROY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000117 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100118 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000119 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100120 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000121 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100122
Antonio de Angelis202425a2022-04-06 11:13:15 +0100123 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100124}
125
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000126TFM_CRYPTO_API(psa_status_t, psa_get_key_attributes)(psa_key_id_t key,
127 psa_key_attributes_t *attributes)
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_GET_KEY_ATTRIBUTES_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 };
136 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100137 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000138 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100139
Antonio de Angelis202425a2022-04-06 11:13:15 +0100140 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100141}
142
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000143TFM_CRYPTO_API(void, psa_reset_key_attributes)(psa_key_attributes_t *attributes)
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100144{
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100145 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100146 .function_id = TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100147 };
148 psa_invec in_vec[] = {
149 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
150 };
151 psa_outvec out_vec[] = {
152 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
153 };
154
Antonio de Angelis202425a2022-04-06 11:13:15 +0100155 (void)API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100156 return;
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100157}
158
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000159TFM_CRYPTO_API(psa_status_t, psa_export_key)(psa_key_id_t key,
160 uint8_t *data,
161 size_t data_size,
162 size_t *data_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100163{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000164 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100165 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100166 .function_id = TFM_CRYPTO_EXPORT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000167 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100168 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000169 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100170 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000171 };
172 psa_outvec out_vec[] = {
173 {.base = data, .len = data_size}
174 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100175
Antonio de Angelis202425a2022-04-06 11:13:15 +0100176 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100177
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000178 *data_length = out_vec[0].len;
179
180 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100181}
182
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000183TFM_CRYPTO_API(psa_status_t, psa_export_public_key)(psa_key_id_t key,
184 uint8_t *data,
185 size_t data_size,
186 size_t *data_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100187{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100188 psa_status_t status;
189 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100190 .function_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000191 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100192 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000193
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100194 psa_invec in_vec[] = {
195 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
196 };
197 psa_outvec out_vec[] = {
198 {.base = data, .len = data_size}
199 };
200
Antonio de Angelis202425a2022-04-06 11:13:15 +0100201 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100202
203 *data_length = out_vec[0].len;
204
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100205 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100206}
207
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000208TFM_CRYPTO_API(psa_status_t, psa_purge_key)(psa_key_id_t key)
Maulik Patel28659c42021-01-06 14:09:22 +0000209{
Maulik Patel28659c42021-01-06 14:09:22 +0000210 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100211 .function_id = TFM_CRYPTO_PURGE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000212 .key_id = key,
213 };
214 psa_invec in_vec[] = {
215 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
216 };
217
Antonio de Angelis202425a2022-04-06 11:13:15 +0100218 return API_DISPATCH_NO_OUTVEC(in_vec);
Maulik Patel28659c42021-01-06 14:09:22 +0000219}
220
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000221TFM_CRYPTO_API(psa_status_t, psa_copy_key)(psa_key_id_t source_key,
222 const psa_key_attributes_t *attributes,
223 psa_key_id_t *target_key)
Jamie Foxefd82732018-11-26 10:34:32 +0000224{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100225 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100226 .function_id = TFM_CRYPTO_COPY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000227 .key_id = source_key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100228 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000229
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100230 psa_invec in_vec[] = {
231 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100232 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100233 };
234
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000235 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000236 {.base = target_key, .len = sizeof(psa_key_id_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000237 };
Jamie Foxefd82732018-11-26 10:34:32 +0000238
Antonio de Angelis202425a2022-04-06 11:13:15 +0100239 return API_DISPATCH(in_vec, out_vec);
Jamie Foxefd82732018-11-26 10:34:32 +0000240}
241
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000242TFM_CRYPTO_API(psa_status_t, psa_cipher_generate_iv)(psa_cipher_operation_t *operation,
243 unsigned char *iv,
244 size_t iv_size,
245 size_t *iv_length)
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100246{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100247 psa_status_t status;
248 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100249 .function_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100250 .op_handle = operation->handle,
251 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100252
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100253 psa_invec in_vec[] = {
254 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
255 };
256 psa_outvec out_vec[] = {
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100257 {.base = iv, .len = iv_size},
258 };
259
Antonio de Angelis202425a2022-04-06 11:13:15 +0100260 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100261
Antonio de Angelis202425a2022-04-06 11:13:15 +0100262 *iv_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100263
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100264 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100265}
266
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000267TFM_CRYPTO_API(psa_status_t, psa_cipher_set_iv)(psa_cipher_operation_t *operation,
268 const unsigned char *iv,
269 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100270{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100271 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100272 .function_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100273 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100274 };
275
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000276 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100277 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000278 {.base = iv, .len = iv_length},
279 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100280
Antonio de Angelis202425a2022-04-06 11:13:15 +0100281 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100282}
283
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000284TFM_CRYPTO_API(psa_status_t, psa_cipher_encrypt_setup)(psa_cipher_operation_t *operation,
285 psa_key_id_t key,
286 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100287{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100288 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100289 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000290 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100291 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100292 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000293 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100294
Antonio de Angelis4743e672019-04-11 11:38:48 +0100295 psa_invec in_vec[] = {
296 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
297 };
298 psa_outvec out_vec[] = {
299 {.base = &(operation->handle), .len = sizeof(uint32_t)},
300 };
301
Antonio de Angelis202425a2022-04-06 11:13:15 +0100302 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100303}
304
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000305TFM_CRYPTO_API(psa_status_t, psa_cipher_decrypt_setup)(psa_cipher_operation_t *operation,
306 psa_key_id_t key,
307 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100308{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100309 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100310 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000311 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100312 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100313 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000314 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100315
Antonio de Angelis4743e672019-04-11 11:38:48 +0100316 psa_invec in_vec[] = {
317 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
318 };
319 psa_outvec out_vec[] = {
320 {.base = &(operation->handle), .len = sizeof(uint32_t)},
321 };
322
Antonio de Angelis202425a2022-04-06 11:13:15 +0100323 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100324}
325
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000326TFM_CRYPTO_API(psa_status_t, psa_cipher_update)(psa_cipher_operation_t *operation,
327 const uint8_t *input,
328 size_t input_length,
329 unsigned char *output,
330 size_t output_size,
331 size_t *output_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100332{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000333 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100334 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100335 .function_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100336 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100337 };
338
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000339 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100340 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000341 {.base = input, .len = input_length},
342 };
343 psa_outvec out_vec[] = {
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000344 {.base = output, .len = output_size}
345 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100346
Antonio de Angelis202425a2022-04-06 11:13:15 +0100347 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100348
Antonio de Angelis202425a2022-04-06 11:13:15 +0100349 *output_length = out_vec[0].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100350
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000351 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100352}
353
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000354TFM_CRYPTO_API(psa_status_t, psa_cipher_abort)(psa_cipher_operation_t *operation)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100355{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100356 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100357 .function_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100358 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000359 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100360
Antonio de Angelis4743e672019-04-11 11:38:48 +0100361 psa_invec in_vec[] = {
362 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
363 };
364 psa_outvec out_vec[] = {
365 {.base = &(operation->handle), .len = sizeof(uint32_t)},
366 };
367
Antonio de Angelis202425a2022-04-06 11:13:15 +0100368 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100369}
370
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000371TFM_CRYPTO_API(psa_status_t, psa_cipher_finish)(psa_cipher_operation_t *operation,
372 uint8_t *output,
373 size_t output_size,
374 size_t *output_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100375{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000376 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100377 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100378 .function_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100379 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100380 };
381
382 psa_invec in_vec[] = {
383 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
384 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000385 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100386 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000387 {.base = output, .len = output_size},
388 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100389
Antonio de Angelis202425a2022-04-06 11:13:15 +0100390 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100391
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000392 *output_length = out_vec[1].len;
393
394 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100395}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100396
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000397TFM_CRYPTO_API(psa_status_t, psa_hash_setup)(psa_hash_operation_t *operation,
398 psa_algorithm_t alg)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100399{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100400 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100401 .function_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100402 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100403 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000404 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100405
Antonio de Angelis4743e672019-04-11 11:38:48 +0100406 psa_invec in_vec[] = {
407 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
408 };
409 psa_outvec out_vec[] = {
410 {.base = &(operation->handle), .len = sizeof(uint32_t)},
411 };
412
Antonio de Angelis202425a2022-04-06 11:13:15 +0100413 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100414}
415
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000416TFM_CRYPTO_API(psa_status_t, psa_hash_update)(psa_hash_operation_t *operation,
417 const uint8_t *input,
418 size_t input_length)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100419{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100420 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100421 .function_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100422 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100423 };
424
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000425 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100426 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000427 {.base = input, .len = input_length},
428 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100429
Antonio de Angelis202425a2022-04-06 11:13:15 +0100430 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100431}
432
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000433TFM_CRYPTO_API(psa_status_t, psa_hash_finish)(psa_hash_operation_t *operation,
434 uint8_t *hash,
435 size_t hash_size,
436 size_t *hash_length)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100437{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000438 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100439 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100440 .function_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100441 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100442 };
443
444 psa_invec in_vec[] = {
445 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
446 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000447 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100448 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000449 {.base = hash, .len = hash_size},
450 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100451
Antonio de Angelis202425a2022-04-06 11:13:15 +0100452 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100453
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000454 *hash_length = out_vec[1].len;
455
456 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100457}
458
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000459TFM_CRYPTO_API(psa_status_t, psa_hash_verify)(psa_hash_operation_t *operation,
460 const uint8_t *hash,
461 size_t hash_length)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100462{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100463 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100464 .function_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100465 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100466 };
467
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000468 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100469 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000470 {.base = hash, .len = hash_length},
471 };
472 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100473 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000474 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100475
Antonio de Angelis202425a2022-04-06 11:13:15 +0100476 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100477}
478
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000479TFM_CRYPTO_API(psa_status_t, psa_hash_abort)(psa_hash_operation_t *operation)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100480{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100481 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100482 .function_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100483 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000484 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100485
Antonio de Angelis4743e672019-04-11 11:38:48 +0100486 psa_invec in_vec[] = {
487 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
488 };
489 psa_outvec out_vec[] = {
490 {.base = &(operation->handle), .len = sizeof(uint32_t)},
491 };
492
Antonio de Angelis202425a2022-04-06 11:13:15 +0100493 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100494}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100495
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000496TFM_CRYPTO_API(psa_status_t, psa_hash_clone)(const psa_hash_operation_t *source_operation,
497 psa_hash_operation_t *target_operation)
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100498{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100499 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100500 .function_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100501 .op_handle = source_operation->handle,
502 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100503
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100504 if (target_operation && (target_operation->handle != 0)) {
505 return PSA_ERROR_BAD_STATE;
506 }
507
David Huc9679cc2022-06-21 13:09:34 +0800508 psa_invec in_vec[] = {
509 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
510 {.base = &(target_operation->handle),
511 .len = sizeof(target_operation->handle)},
512 };
513 psa_outvec out_vec[] = {
514 {.base = &(target_operation->handle),
515 .len = sizeof(target_operation->handle)},
516 };
517
Antonio de Angelis202425a2022-04-06 11:13:15 +0100518 return API_DISPATCH(in_vec, out_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100519}
520
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000521TFM_CRYPTO_API(psa_status_t, psa_hash_compute)(psa_algorithm_t alg,
522 const uint8_t *input,
523 size_t input_length,
524 uint8_t *hash,
525 size_t hash_size,
526 size_t *hash_length)
Soby Mathew07ef6e42020-07-20 21:09:23 +0100527{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100528 psa_status_t status;
529 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100530 .function_id = TFM_CRYPTO_HASH_COMPUTE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100531 .alg = alg,
532 };
533
534 psa_invec in_vec[] = {
535 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
536 {.base = input, .len = input_length},
537 };
538
539 psa_outvec out_vec[] = {
540 {.base = hash, .len = hash_size}
541 };
542
Antonio de Angelis202425a2022-04-06 11:13:15 +0100543 status = API_DISPATCH(in_vec, out_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100544
545 *hash_length = out_vec[0].len;
546
Soby Mathew07ef6e42020-07-20 21:09:23 +0100547 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100548}
549
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000550TFM_CRYPTO_API(psa_status_t, psa_hash_compare)(psa_algorithm_t alg,
551 const uint8_t *input,
552 size_t input_length,
553 const uint8_t *hash,
554 size_t hash_length)
Soby Mathew07ef6e42020-07-20 21:09:23 +0100555{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100556 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100557 .function_id = TFM_CRYPTO_HASH_COMPARE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100558 .alg = alg,
559 };
560
561 psa_invec in_vec[] = {
562 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
563 {.base = input, .len = input_length},
564 {.base = hash, .len = hash_length},
565 };
566
Antonio de Angelis202425a2022-04-06 11:13:15 +0100567 return API_DISPATCH_NO_OUTVEC(in_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100568}
569
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000570TFM_CRYPTO_API(psa_status_t, psa_mac_sign_setup)(psa_mac_operation_t *operation,
571 psa_key_id_t key,
572 psa_algorithm_t alg)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100573{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100574 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100575 .function_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000576 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100577 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100578 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000579 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100580
Antonio de Angelis4743e672019-04-11 11:38:48 +0100581 psa_invec in_vec[] = {
582 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
583 };
584 psa_outvec out_vec[] = {
585 {.base = &(operation->handle), .len = sizeof(uint32_t)},
586 };
587
Antonio de Angelis202425a2022-04-06 11:13:15 +0100588 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100589}
590
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000591TFM_CRYPTO_API(psa_status_t, psa_mac_verify_setup)(psa_mac_operation_t *operation,
592 psa_key_id_t key,
593 psa_algorithm_t alg)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100594{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100595 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100596 .function_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000597 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100598 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100599 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000600 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100601
Antonio de Angelis4743e672019-04-11 11:38:48 +0100602 psa_invec in_vec[] = {
603 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
604 };
605 psa_outvec out_vec[] = {
606 {.base = &(operation->handle), .len = sizeof(uint32_t)},
607 };
608
Antonio de Angelis202425a2022-04-06 11:13:15 +0100609 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100610}
611
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000612TFM_CRYPTO_API(psa_status_t, psa_mac_update)(psa_mac_operation_t *operation,
613 const uint8_t *input,
614 size_t input_length)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100615{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100616 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100617 .function_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100618 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100619 };
620
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000621 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100622 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000623 {.base = input, .len = input_length},
624 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100625
Antonio de Angelis202425a2022-04-06 11:13:15 +0100626 return API_DISPATCH_NO_OUTVEC(in_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100627}
628
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000629TFM_CRYPTO_API(psa_status_t, psa_mac_sign_finish)(psa_mac_operation_t *operation,
630 uint8_t *mac,
631 size_t mac_size,
632 size_t *mac_length)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100633{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000634 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100635 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100636 .function_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100637 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100638 };
639
640 psa_invec in_vec[] = {
641 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
642 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000643 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100644 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000645 {.base = mac, .len = mac_size},
646 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100647
Antonio de Angelis202425a2022-04-06 11:13:15 +0100648 status = API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100649
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000650 *mac_length = out_vec[1].len;
651
652 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100653}
654
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000655TFM_CRYPTO_API(psa_status_t, psa_mac_verify_finish)(psa_mac_operation_t *operation,
656 const uint8_t *mac,
657 size_t mac_length)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100658{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100659 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100660 .function_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100661 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100662 };
663
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000664 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100665 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000666 {.base = mac, .len = mac_length},
667 };
668 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100669 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000670 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100671
Antonio de Angelis202425a2022-04-06 11:13:15 +0100672 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100673}
674
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000675TFM_CRYPTO_API(psa_status_t, psa_mac_abort)(psa_mac_operation_t *operation)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100676{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100677 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100678 .function_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100679 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000680 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100681
Antonio de Angelis4743e672019-04-11 11:38:48 +0100682 psa_invec in_vec[] = {
683 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
684 };
685 psa_outvec out_vec[] = {
686 {.base = &(operation->handle), .len = sizeof(uint32_t)},
687 };
688
Antonio de Angelis202425a2022-04-06 11:13:15 +0100689 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100690}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000691
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000692TFM_CRYPTO_API(psa_status_t, psa_aead_encrypt)(psa_key_id_t key,
693 psa_algorithm_t alg,
694 const uint8_t *nonce,
695 size_t nonce_length,
696 const uint8_t *additional_data,
697 size_t additional_data_length,
698 const uint8_t *plaintext,
699 size_t plaintext_length,
700 uint8_t *ciphertext,
701 size_t ciphertext_size,
702 size_t *ciphertext_length)
Antonio de Angelis3a480992018-11-07 11:53:28 +0000703{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000704 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100705 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100706 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000707 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100708 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000709 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000710 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100711
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100712 /* Sanitize the optional input */
713 if ((additional_data == NULL) && (additional_data_length != 0)) {
714 return PSA_ERROR_INVALID_ARGUMENT;
715 }
716
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000717 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000718 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000719 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100720 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000721 };
722 psa_outvec out_vec[] = {
723 {.base = ciphertext, .len = ciphertext_size},
724 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000725
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000726 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
727 return PSA_ERROR_INVALID_ARGUMENT;
728 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000729
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000730 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000731 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100732 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000733 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000734 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000735 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000736
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000737 in_vec[0].base = &iov;
738 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
739
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800740 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000741
Antonio de Angelis4743e672019-04-11 11:38:48 +0100742 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100743 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100744 }
Summer Qinaee07882021-03-29 15:44:27 +0800745 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800746 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000747
748 *ciphertext_length = out_vec[0].len;
749
750 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000751}
752
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000753TFM_CRYPTO_API(psa_status_t, psa_aead_decrypt)(psa_key_id_t key,
754 psa_algorithm_t alg,
755 const uint8_t *nonce,
756 size_t nonce_length,
757 const uint8_t *additional_data,
758 size_t additional_data_length,
759 const uint8_t *ciphertext,
760 size_t ciphertext_length,
761 uint8_t *plaintext,
762 size_t plaintext_size,
763 size_t *plaintext_length)
Antonio de Angelis3a480992018-11-07 11:53:28 +0000764{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000765 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100766 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100767 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000768 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100769 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000770 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000771 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100772
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100773 /* Sanitize the optional input */
774 if ((additional_data == NULL) && (additional_data_length != 0)) {
775 return PSA_ERROR_INVALID_ARGUMENT;
776 }
777
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000778 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000779 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000780 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100781 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000782 };
783 psa_outvec out_vec[] = {
784 {.base = plaintext, .len = plaintext_size},
785 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000786
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000787 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
788 return PSA_ERROR_INVALID_ARGUMENT;
789 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000790
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000791 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000792 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100793 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000794 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000795 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000796 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000797
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000798 in_vec[0].base = &iov;
799 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
800
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800801 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000802
Antonio de Angelis4743e672019-04-11 11:38:48 +0100803 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100804 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100805 }
Summer Qinaee07882021-03-29 15:44:27 +0800806 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800807 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000808
809 *plaintext_length = out_vec[0].len;
810
811 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000812}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100813
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000814TFM_CRYPTO_API(psa_status_t, psa_aead_encrypt_setup)(psa_aead_operation_t *operation,
815 psa_key_id_t key,
816 psa_algorithm_t alg)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100817{
818 psa_status_t status;
819 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100820 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100821 .key_id = key,
822 .alg = alg,
823 .op_handle = operation->handle,
824 };
825
826 psa_invec in_vec[] = {
827 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
828 };
829 psa_outvec out_vec[] = {
830 {.base = &(operation->handle), .len = sizeof(uint32_t)}
831 };
832
Antonio de Angelis202425a2022-04-06 11:13:15 +0100833 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100834 return status;
835}
836
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000837TFM_CRYPTO_API(psa_status_t, psa_aead_decrypt_setup)(psa_aead_operation_t *operation,
838 psa_key_id_t key,
839 psa_algorithm_t alg)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100840{
841 psa_status_t status;
842 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100843 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100844 .key_id = key,
845 .alg = alg,
846 .op_handle = operation->handle,
847 };
848
849 psa_invec in_vec[] = {
850 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
851 };
852 psa_outvec out_vec[] = {
853 {.base = &(operation->handle), .len = sizeof(uint32_t)}
854 };
855
Antonio de Angelis202425a2022-04-06 11:13:15 +0100856 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100857 return status;
858}
859
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000860TFM_CRYPTO_API(psa_status_t, psa_aead_generate_nonce)(psa_aead_operation_t *operation,
861 uint8_t *nonce,
862 size_t nonce_size,
863 size_t *nonce_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100864{
865 psa_status_t status;
866 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100867 .function_id = TFM_CRYPTO_AEAD_GENERATE_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100868 .op_handle = operation->handle,
869 };
870
871 psa_invec in_vec[] = {
872 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
873 };
874 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +0100875 {.base = nonce, .len = nonce_size}
876 };
877
Antonio de Angelis202425a2022-04-06 11:13:15 +0100878 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100879
Antonio de Angelis202425a2022-04-06 11:13:15 +0100880 *nonce_length = out_vec[0].len;
Antonio de Angelis8d282482021-10-07 15:04:12 +0100881 return status;
882}
883
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000884TFM_CRYPTO_API(psa_status_t, psa_aead_set_nonce)(psa_aead_operation_t *operation,
885 const uint8_t *nonce,
886 size_t nonce_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100887{
888 psa_status_t status;
889 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100890 .function_id = TFM_CRYPTO_AEAD_SET_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100891 .op_handle = operation->handle,
892 };
893
894 psa_invec in_vec[] = {
895 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
896 {.base = nonce, .len = nonce_length}
897 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100898
Antonio de Angelis202425a2022-04-06 11:13:15 +0100899 status = API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100900 return status;
901}
902
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000903TFM_CRYPTO_API(psa_status_t, psa_aead_set_lengths)(psa_aead_operation_t *operation,
904 size_t ad_length,
905 size_t plaintext_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100906{
907 psa_status_t status;
908 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100909 .function_id = TFM_CRYPTO_AEAD_SET_LENGTHS_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100910 .ad_length = ad_length,
911 .plaintext_length = plaintext_length,
912 .op_handle = operation->handle,
913 };
914
915 psa_invec in_vec[] = {
916 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
917 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100918
Antonio de Angelis202425a2022-04-06 11:13:15 +0100919 status = API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100920 return status;
921}
922
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000923TFM_CRYPTO_API(psa_status_t, psa_aead_update_ad)(psa_aead_operation_t *operation,
924 const uint8_t *input,
925 size_t input_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100926{
927 psa_status_t status;
928 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100929 .function_id = TFM_CRYPTO_AEAD_UPDATE_AD_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100930 .op_handle = operation->handle,
931 };
932
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000933 /* Sanitize the optional input */
934 if ((input == NULL) && (input_length != 0)) {
935 return PSA_ERROR_INVALID_ARGUMENT;
936 }
937
Antonio de Angelis8d282482021-10-07 15:04:12 +0100938 psa_invec in_vec[] = {
939 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
940 {.base = input, .len = input_length}
941 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100942
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000943 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000944
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000945 if (input == NULL) {
946 in_len--;
947 }
948 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis202425a2022-04-06 11:13:15 +0100949 NULL, 0);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100950 return status;
951}
952
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000953TFM_CRYPTO_API(psa_status_t, psa_aead_update)(psa_aead_operation_t *operation,
954 const uint8_t *input,
955 size_t input_length,
956 uint8_t *output,
957 size_t output_size,
958 size_t *output_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100959{
960 psa_status_t status;
961 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100962 .function_id = TFM_CRYPTO_AEAD_UPDATE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100963 .op_handle = operation->handle,
964 };
965
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000966 /* Sanitize the optional input */
967 if ((input == NULL) && (input_length != 0)) {
968 return PSA_ERROR_INVALID_ARGUMENT;
969 }
970
Antonio de Angelis8d282482021-10-07 15:04:12 +0100971 psa_invec in_vec[] = {
972 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
973 {.base = input, .len = input_length}
974 };
975 psa_outvec out_vec[] = {
Antonio de Angelisc26af632021-10-07 15:04:12 +0100976 {.base = output, .len = output_size},
Antonio de Angelis8d282482021-10-07 15:04:12 +0100977 };
978
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000979 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000980
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000981 if (input == NULL) {
982 in_len--;
983 }
984 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
985 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis8d282482021-10-07 15:04:12 +0100986
Antonio de Angelis202425a2022-04-06 11:13:15 +0100987 *output_length = out_vec[0].len;
Antonio de Angelis8d282482021-10-07 15:04:12 +0100988 return status;
989}
990
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000991TFM_CRYPTO_API(psa_status_t, psa_aead_finish)(psa_aead_operation_t *operation,
992 uint8_t *ciphertext,
993 size_t ciphertext_size,
994 size_t *ciphertext_length,
995 uint8_t *tag,
996 size_t tag_size,
997 size_t *tag_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100998{
999 psa_status_t status;
1000 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001001 .function_id = TFM_CRYPTO_AEAD_FINISH_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001002 .op_handle = operation->handle,
1003 };
1004
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001005 /* Sanitize the optional output */
1006 if ((ciphertext == NULL) && (ciphertext_size != 0)) {
1007 return PSA_ERROR_INVALID_ARGUMENT;
1008 }
1009
Antonio de Angelis8d282482021-10-07 15:04:12 +01001010 psa_invec in_vec[] = {
1011 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1012 };
1013 psa_outvec out_vec[] = {
1014 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis8d282482021-10-07 15:04:12 +01001015 {.base = tag, .len = tag_size},
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001016 {.base = ciphertext, .len = ciphertext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +01001017 };
1018
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001019 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001020
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001021 if (ciphertext == NULL || ciphertext_size == 0) {
1022 out_len--;
1023 }
1024 if ((out_len == 3) && (ciphertext_length == NULL)) {
1025 return PSA_ERROR_INVALID_ARGUMENT;
1026 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001027
Antonio de Angelisc26af632021-10-07 15:04:12 +01001028 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
1029 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001030 out_vec, out_len);
1031
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001032 if (out_len == 3) {
1033 *ciphertext_length = out_vec[2].len;
1034 } else {
1035 *ciphertext_length = 0;
1036 }
Antonio de Angelis202425a2022-04-06 11:13:15 +01001037
1038 *tag_length = out_vec[1].len;
1039
Antonio de Angelis8d282482021-10-07 15:04:12 +01001040 return status;
1041}
1042
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001043TFM_CRYPTO_API(psa_status_t, psa_aead_verify)(psa_aead_operation_t *operation,
1044 uint8_t *plaintext,
1045 size_t plaintext_size,
1046 size_t *plaintext_length,
1047 const uint8_t *tag,
1048 size_t tag_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +01001049{
1050 psa_status_t status;
1051 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001052 .function_id = TFM_CRYPTO_AEAD_VERIFY_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001053 .op_handle = operation->handle,
1054 };
1055
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001056 /* Sanitize the optional output */
1057 if ((plaintext == NULL) && (plaintext_size != 0)) {
1058 return PSA_ERROR_INVALID_ARGUMENT;
1059 }
1060
Antonio de Angelis8d282482021-10-07 15:04:12 +01001061 psa_invec in_vec[] = {
1062 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1063 {.base = tag, .len = tag_length}
1064 };
1065 psa_outvec out_vec[] = {
1066 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis202425a2022-04-06 11:13:15 +01001067 {.base = plaintext, .len = plaintext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +01001068 };
1069
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001070 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001071
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001072 if (plaintext == NULL || plaintext_size == 0) {
1073 out_len--;
1074 }
1075 if ((out_len == 2) && (plaintext_length == NULL)) {
1076 return PSA_ERROR_INVALID_ARGUMENT;
1077 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001078
Antonio de Angelisc26af632021-10-07 15:04:12 +01001079 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
1080 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001081 out_vec, out_len);
1082
1083 if (out_len == 2) {
1084 *plaintext_length = out_vec[1].len;
1085 } else {
1086 *plaintext_length = 0;
1087 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001088 return status;
1089}
1090
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001091TFM_CRYPTO_API(psa_status_t, psa_aead_abort)(psa_aead_operation_t *operation)
Antonio de Angelis8d282482021-10-07 15:04:12 +01001092{
Antonio de Angelis8d282482021-10-07 15:04:12 +01001093 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001094 .function_id = TFM_CRYPTO_AEAD_ABORT_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001095 .op_handle = operation->handle,
1096 };
1097
1098 psa_invec in_vec[] = {
1099 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1100 };
1101 psa_outvec out_vec[] = {
1102 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1103 };
1104
Antonio de Angelis202425a2022-04-06 11:13:15 +01001105 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +01001106}
1107
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001108TFM_CRYPTO_API(psa_status_t, psa_sign_message)(psa_key_id_t key,
1109 psa_algorithm_t alg,
1110 const uint8_t *input,
1111 size_t input_length,
1112 uint8_t *signature,
1113 size_t signature_size,
1114 size_t *signature_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001115{
Summer Qinb9492d22021-06-22 18:00:54 +08001116 psa_status_t status;
1117 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001118 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001119 .key_id = key,
1120 .alg = alg,
1121 };
1122
1123 psa_invec in_vec[] = {
1124 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1125 {.base = input, .len = input_length},
1126 };
1127 psa_outvec out_vec[] = {
1128 {.base = signature, .len = signature_size},
1129 };
1130
Antonio de Angelis202425a2022-04-06 11:13:15 +01001131 status = API_DISPATCH(in_vec, out_vec);
Summer Qinb9492d22021-06-22 18:00:54 +08001132
Antonio de Angelisf83a2082021-08-20 22:13:53 +01001133 *signature_length = out_vec[0].len;
Summer Qinb9492d22021-06-22 18:00:54 +08001134 return status;
1135}
1136
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001137TFM_CRYPTO_API(psa_status_t, psa_verify_message)(psa_key_id_t key,
1138 psa_algorithm_t alg,
1139 const uint8_t *input,
1140 size_t input_length,
1141 const uint8_t *signature,
1142 size_t signature_length)
Summer Qinb9492d22021-06-22 18:00:54 +08001143{
Summer Qinb9492d22021-06-22 18:00:54 +08001144 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001145 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001146 .key_id = key,
1147 .alg = alg
1148 };
1149
1150 psa_invec in_vec[] = {
1151 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1152 {.base = input, .len = input_length},
1153 {.base = signature, .len = signature_length}
1154 };
1155
Antonio de Angelis202425a2022-04-06 11:13:15 +01001156 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001157}
1158
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001159TFM_CRYPTO_API(psa_status_t, psa_sign_hash)(psa_key_id_t key,
1160 psa_algorithm_t alg,
1161 const uint8_t *hash,
1162 size_t hash_length,
1163 uint8_t *signature,
1164 size_t signature_size,
1165 size_t *signature_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001166{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001167 psa_status_t status;
1168 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001169 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001170 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001171 .alg = alg,
1172 };
1173
1174 psa_invec in_vec[] = {
1175 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1176 {.base = hash, .len = hash_length},
1177 };
1178 psa_outvec out_vec[] = {
1179 {.base = signature, .len = signature_size},
1180 };
1181
Antonio de Angelis202425a2022-04-06 11:13:15 +01001182 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001183
1184 *signature_length = out_vec[0].len;
1185
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001186 return status;
1187}
1188
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001189TFM_CRYPTO_API(psa_status_t, psa_verify_hash)(psa_key_id_t key,
1190 psa_algorithm_t alg,
1191 const uint8_t *hash,
1192 size_t hash_length,
1193 const uint8_t *signature,
1194 size_t signature_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001195{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001196 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001197 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001198 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001199 .alg = alg
1200 };
1201
1202 psa_invec in_vec[] = {
1203 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1204 {.base = hash, .len = hash_length},
1205 {.base = signature, .len = signature_length}
1206 };
1207
Antonio de Angelis202425a2022-04-06 11:13:15 +01001208 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001209}
1210
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001211TFM_CRYPTO_API(psa_status_t, psa_asymmetric_encrypt)(psa_key_id_t key,
1212 psa_algorithm_t alg,
1213 const uint8_t *input,
1214 size_t input_length,
1215 const uint8_t *salt,
1216 size_t salt_length,
1217 uint8_t *output,
1218 size_t output_size,
1219 size_t *output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001220{
1221 psa_status_t status;
1222 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001223 .function_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001224 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001225 .alg = alg
1226 };
1227
1228 /* Sanitize the optional input */
1229 if ((salt == NULL) && (salt_length != 0)) {
1230 return PSA_ERROR_INVALID_ARGUMENT;
1231 }
1232
1233 psa_invec in_vec[] = {
1234 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1235 {.base = input, .len = input_length},
1236 {.base = salt, .len = salt_length}
1237 };
1238
1239 psa_outvec out_vec[] = {
1240 {.base = output, .len = output_size},
1241 };
1242
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001243 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001244
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001245 if (salt == NULL) {
1246 in_len--;
1247 }
Summer Qinaee07882021-03-29 15:44:27 +08001248 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001249 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001250
1251 *output_length = out_vec[0].len;
1252
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001253 return status;
1254}
1255
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001256TFM_CRYPTO_API(psa_status_t, psa_asymmetric_decrypt)(psa_key_id_t key,
1257 psa_algorithm_t alg,
1258 const uint8_t *input,
1259 size_t input_length,
1260 const uint8_t *salt,
1261 size_t salt_length,
1262 uint8_t *output,
1263 size_t output_size,
1264 size_t *output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001265{
1266 psa_status_t status;
1267 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001268 .function_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001269 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001270 .alg = alg
1271 };
1272
1273 /* Sanitize the optional input */
1274 if ((salt == NULL) && (salt_length != 0)) {
1275 return PSA_ERROR_INVALID_ARGUMENT;
1276 }
1277
1278 psa_invec in_vec[] = {
1279 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1280 {.base = input, .len = input_length},
1281 {.base = salt, .len = salt_length}
1282 };
1283
1284 psa_outvec out_vec[] = {
1285 {.base = output, .len = output_size},
1286 };
1287
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001288 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001289
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001290 if (salt == NULL) {
1291 in_len--;
1292 }
Summer Qinaee07882021-03-29 15:44:27 +08001293 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001294 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001295
1296 *output_length = out_vec[0].len;
1297
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001298 return status;
1299}
1300
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001301TFM_CRYPTO_API(psa_status_t, psa_key_derivation_get_capacity)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001302 const psa_key_derivation_operation_t *operation,
1303 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001304{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001305 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001306 .function_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001307 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001308 };
1309
1310 psa_invec in_vec[] = {
1311 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1312 };
1313
1314 psa_outvec out_vec[] = {
1315 {.base = capacity, .len = sizeof(size_t)},
1316 };
1317
Antonio de Angelis202425a2022-04-06 11:13:15 +01001318 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001319}
1320
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001321TFM_CRYPTO_API(psa_status_t, psa_key_derivation_output_bytes)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001322 psa_key_derivation_operation_t *operation,
1323 uint8_t *output,
1324 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001325{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001326 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001327 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001328 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001329 };
1330
1331 psa_invec in_vec[] = {
1332 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1333 };
1334
1335 psa_outvec out_vec[] = {
1336 {.base = output, .len = output_length},
1337 };
1338
Antonio de Angelis202425a2022-04-06 11:13:15 +01001339 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001340}
1341
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001342TFM_CRYPTO_API(psa_status_t, psa_key_derivation_input_key)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001343 psa_key_derivation_operation_t *operation,
1344 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001345 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001346{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001347 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001348 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001349 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001350 .step = step,
1351 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001352 };
1353
1354 psa_invec in_vec[] = {
1355 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001356 };
1357
Antonio de Angelis202425a2022-04-06 11:13:15 +01001358 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001359}
1360
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001361TFM_CRYPTO_API(psa_status_t, psa_key_derivation_abort)(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001362{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001363 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001364 .function_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001365 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001366 };
1367
1368 psa_invec in_vec[] = {
1369 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1370 };
1371
1372 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001373 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001374 };
1375
Antonio de Angelis202425a2022-04-06 11:13:15 +01001376 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001377}
1378
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001379TFM_CRYPTO_API(psa_status_t, psa_key_derivation_key_agreement)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001380 psa_key_derivation_operation_t *operation,
1381 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001382 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001383 const uint8_t *peer_key,
1384 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001385{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001386 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001387 .function_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001388 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001389 .step = step,
1390 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001391 };
1392
1393 psa_invec in_vec[] = {
1394 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1395 {.base = peer_key, .len = peer_key_length},
1396 };
1397
Antonio de Angelis202425a2022-04-06 11:13:15 +01001398 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001399}
1400
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001401TFM_CRYPTO_API(psa_status_t, psa_generate_random)(uint8_t *output,
1402 size_t output_size)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001403{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001404 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001405 .function_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001406 };
1407
1408 psa_invec in_vec[] = {
1409 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1410 };
1411
1412 psa_outvec out_vec[] = {
1413 {.base = output, .len = output_size},
1414 };
1415
1416 if (output_size == 0) {
1417 return PSA_SUCCESS;
1418 }
1419
Antonio de Angelis202425a2022-04-06 11:13:15 +01001420 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001421}
1422
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001423TFM_CRYPTO_API(psa_status_t, psa_generate_key)(const psa_key_attributes_t *attributes,
1424 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001425{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001426 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001427 .function_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001428 };
1429
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001430 psa_invec in_vec[] = {
1431 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001432 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1433 };
1434
1435 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001436 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001437 };
1438
Antonio de Angelis202425a2022-04-06 11:13:15 +01001439 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001440}
1441
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001442TFM_CRYPTO_API(psa_status_t, psa_mac_compute)(psa_key_id_t key,
1443 psa_algorithm_t alg,
1444 const uint8_t *input,
1445 size_t input_length,
1446 uint8_t *mac,
1447 size_t mac_size,
1448 size_t *mac_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001449{
1450 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001451 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001452 .function_id = TFM_CRYPTO_MAC_COMPUTE_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001453 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001454 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001455 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001456
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001457 psa_invec in_vec[] = {
1458 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Summer Qin045ec4a2021-07-07 14:28:04 +08001459 {.base = input, .len = input_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001460 };
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001461 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001462 {.base = mac, .len = mac_size},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001463 };
1464
Antonio de Angelis202425a2022-04-06 11:13:15 +01001465 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001466
1467 *mac_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001468 return status;
1469}
1470
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001471TFM_CRYPTO_API(psa_status_t, psa_mac_verify)(psa_key_id_t key,
1472 psa_algorithm_t alg,
1473 const uint8_t *input,
1474 size_t input_length,
1475 const uint8_t *mac,
1476 const size_t mac_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001477{
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001478 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001479 .function_id = TFM_CRYPTO_MAC_VERIFY_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001480 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001481 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001482 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001483
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001484 psa_invec in_vec[] = {
1485 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1486 {.base = input, .len = input_length},
Summer Qin045ec4a2021-07-07 14:28:04 +08001487 {.base = mac, .len = mac_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001488 };
1489
Antonio de Angelis202425a2022-04-06 11:13:15 +01001490 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001491}
1492
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001493TFM_CRYPTO_API(psa_status_t, psa_cipher_encrypt)(psa_key_id_t key,
1494 psa_algorithm_t alg,
1495 const uint8_t *input,
1496 size_t input_length,
1497 uint8_t *output,
1498 size_t output_size,
1499 size_t *output_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001500{
1501 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001502 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001503 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001504 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001505 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001506 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001507
Antonio de Angelis609f0002021-07-06 16:51:28 +02001508 psa_invec in_vec[] = {
1509 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1510 {.base = input, .len = input_length},
1511 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001512 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001513 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001514 };
1515
Antonio de Angelis202425a2022-04-06 11:13:15 +01001516 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001517
1518 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001519 return status;
1520}
1521
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001522TFM_CRYPTO_API(psa_status_t, psa_cipher_decrypt)(psa_key_id_t key,
1523 psa_algorithm_t alg,
1524 const uint8_t *input,
1525 size_t input_length,
1526 uint8_t *output,
1527 size_t output_size,
1528 size_t *output_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001529{
1530 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001531 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001532 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001533 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001534 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001535 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001536
Antonio de Angelis609f0002021-07-06 16:51:28 +02001537 psa_invec in_vec[] = {
1538 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1539 {.base = input, .len = input_length},
1540 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001541 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001542 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001543 };
1544
Antonio de Angelis202425a2022-04-06 11:13:15 +01001545 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001546
1547 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001548 return status;
1549}
1550
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001551TFM_CRYPTO_API(psa_status_t, psa_raw_key_agreement)(psa_algorithm_t alg,
1552 psa_key_id_t private_key,
1553 const uint8_t *peer_key,
1554 size_t peer_key_length,
1555 uint8_t *output,
1556 size_t output_size,
1557 size_t *output_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001558{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001559 psa_status_t status;
1560 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001561 .function_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001562 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001563 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001564 };
1565
1566 psa_invec in_vec[] = {
1567 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1568 {.base = peer_key, .len = peer_key_length},
1569 };
1570
1571 psa_outvec out_vec[] = {
1572 {.base = output, .len = output_size},
1573 };
1574
Antonio de Angelis202425a2022-04-06 11:13:15 +01001575 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001576
1577 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001578
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001579 return status;
1580}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001581
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001582TFM_CRYPTO_API(psa_status_t, psa_key_derivation_setup)(psa_key_derivation_operation_t *operation,
1583 psa_algorithm_t alg)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001584{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001585 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001586 .function_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001587 .alg = alg,
1588 .op_handle = operation->handle,
1589 };
1590
1591 psa_invec in_vec[] = {
1592 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1593 };
1594 psa_outvec out_vec[] = {
1595 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1596 };
1597
Antonio de Angelis202425a2022-04-06 11:13:15 +01001598 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001599}
1600
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001601TFM_CRYPTO_API(psa_status_t, psa_key_derivation_set_capacity)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001602 psa_key_derivation_operation_t *operation,
1603 size_t capacity)
1604{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001605 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001606 .function_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001607 .capacity = capacity,
1608 .op_handle = operation->handle,
1609 };
1610
1611 psa_invec in_vec[] = {
1612 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1613 };
1614
Antonio de Angelis202425a2022-04-06 11:13:15 +01001615 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001616}
1617
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001618TFM_CRYPTO_API(psa_status_t, psa_key_derivation_input_bytes)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001619 psa_key_derivation_operation_t *operation,
1620 psa_key_derivation_step_t step,
1621 const uint8_t *data,
1622 size_t data_length)
1623{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001624 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001625 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001626 .step = step,
1627 .op_handle = operation->handle,
1628 };
1629
1630 psa_invec in_vec[] = {
1631 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1632 {.base = data, .len = data_length},
1633 };
1634
Antonio de Angelis202425a2022-04-06 11:13:15 +01001635 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001636}
1637
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001638TFM_CRYPTO_API(psa_status_t, psa_key_derivation_output_key)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001639 const psa_key_attributes_t *attributes,
1640 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001641 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001642{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001643 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001644 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001645 .op_handle = operation->handle,
1646 };
1647
1648 psa_invec in_vec[] = {
1649 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1650 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1651 };
1652
1653 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001654 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001655 };
1656
Antonio de Angelis202425a2022-04-06 11:13:15 +01001657 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001658}