blob: f53fd1abc14fbb5fa29866fb7efb1a80a74f3d9a [file] [log] [blame]
Antonio de Angelis8908f472018-08-31 15:44:25 +01001/*
Gergely Kovacs20006892024-11-29 13:05:30 +00002 * Copyright (c) 2018-2024, 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 Angelis8bb98512024-01-16 14:13:36 +00008#include <stdlib.h>
9#include <string.h>
10
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000011#include "tfm_crypto_defs.h"
Antonio de Angelis8bb98512024-01-16 14:13:36 +000012
Kevin Peng9449a362019-07-29 16:05:42 +080013#include "psa/client.h"
Antonio de Angelis202425a2022-04-06 11:13:15 +010014#include "psa_manifest/sid.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000015
Antonio de Angelis202425a2022-04-06 11:13:15 +010016#define API_DISPATCH(in_vec, out_vec) \
17 psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, \
18 in_vec, IOVEC_LEN(in_vec), \
19 out_vec, IOVEC_LEN(out_vec))
20#define API_DISPATCH_NO_OUTVEC(in_vec) \
21 psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, \
22 in_vec, IOVEC_LEN(in_vec), \
23 (psa_outvec *)NULL, 0)
Antonio de Angelis8908f472018-08-31 15:44:25 +010024
Antonio de Angelis12e21a22023-03-23 16:25:36 +000025/*!
26 * \def CONFIG_TFM_CRYPTO_API_RENAME
27 *
28 * \brief By setting this to 1, system integrators can rename the symbols of the
29 * PSA Crypto APIs available in the TF-M interface. It allows flexibility
30 * for some integration setups where multiple providers of the PSA Crypto
31 * APIs are available at link time. Normally this configuration option
32 * should not be enabled when building the Secure interface because the
33 * secure partitions will just use the standard function names. By default
34 * it prepends the "tfm_crypto__" prefix.
35 *
36 * \note This config option is not available through the TF-M configuration as
37 * it's for NS applications and system integrators to enable.
38 */
39
40/*!
41 * \def TFM_CRYPTO_API(ret, fun)
42 *
43 * \brief Define the function signature of a TF-M Crypto API with return
44 * type \a ret and PSA Crypto API function name \a fun
45 *
46 * \param ret return type associated to the API
47 * \param fun API name (e.g. a PSA Crypto API function name)
48 *
49 * \returns Function signature
50 */
51
52#if CONFIG_TFM_CRYPTO_API_RENAME == 1
53#define TFM_CRYPTO_API(ret, fun) ret tfm_crypto__##fun
54#else
55#define TFM_CRYPTO_API(ret, fun) ret fun
56#endif /* CONFIG_TFM_CRYPTO_API_RENAME */
57
58TFM_CRYPTO_API(psa_status_t, psa_crypto_init)(void)
Antonio de Angelis8908f472018-08-31 15:44:25 +010059{
60 /* Service init is performed during TFM boot up,
61 * so application level initialisation is empty
62 */
63 return PSA_SUCCESS;
64}
65
Antonio de Angelis12e21a22023-03-23 16:25:36 +000066TFM_CRYPTO_API(psa_status_t, psa_open_key)(psa_key_id_t id,
67 psa_key_id_t *key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010068{
Jamie Foxdadb4e82019-09-03 17:59:41 +010069 const struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010070 .function_id = TFM_CRYPTO_OPEN_KEY_SID,
71 .key_id = id,
Jamie Foxdadb4e82019-09-03 17:59:41 +010072 };
73 psa_invec in_vec[] = {
74 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010075 };
76 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000077 {.base = key, .len = sizeof(psa_key_id_t)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010078 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010079
Antonio de Angelis202425a2022-04-06 11:13:15 +010080 return API_DISPATCH(in_vec, out_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010081}
82
Antonio de Angelis12e21a22023-03-23 16:25:36 +000083TFM_CRYPTO_API(psa_status_t, psa_close_key)(psa_key_id_t key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010084{
Jamie Foxdadb4e82019-09-03 17:59:41 +010085 const struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010086 .function_id = TFM_CRYPTO_CLOSE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000087 .key_id = key,
Jamie Foxdadb4e82019-09-03 17:59:41 +010088 };
89 psa_invec in_vec[] = {
90 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
91 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010092
Antonio de Angelis202425a2022-04-06 11:13:15 +010093 return API_DISPATCH_NO_OUTVEC(in_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010094}
95
Antonio de Angelis12e21a22023-03-23 16:25:36 +000096TFM_CRYPTO_API(psa_status_t, psa_import_key)(const psa_key_attributes_t *attributes,
97 const uint8_t *data,
98 size_t data_length,
99 psa_key_id_t *key)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100100{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100101 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100102 .function_id = TFM_CRYPTO_IMPORT_KEY_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100103 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000104 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100105 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100106 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000107 {.base = data, .len = data_length}
108 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100109 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000110 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100111 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100112
Antonio de Angelis202425a2022-04-06 11:13:15 +0100113 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100114}
115
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000116TFM_CRYPTO_API(psa_status_t, psa_destroy_key)(psa_key_id_t key)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100117{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100118 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100119 .function_id = TFM_CRYPTO_DESTROY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000120 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100121 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000122 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100123 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000124 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100125
Antonio de Angelis202425a2022-04-06 11:13:15 +0100126 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100127}
128
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000129TFM_CRYPTO_API(psa_status_t, psa_get_key_attributes)(psa_key_id_t key,
130 psa_key_attributes_t *attributes)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100131{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100132 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100133 .function_id = TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000134 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100135 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000136 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100137 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000138 };
139 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100140 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000141 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100142
Antonio de Angelis202425a2022-04-06 11:13:15 +0100143 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100144}
145
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000146TFM_CRYPTO_API(psa_status_t, psa_export_key)(psa_key_id_t key,
147 uint8_t *data,
148 size_t data_size,
149 size_t *data_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100150{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000151 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100152 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100153 .function_id = TFM_CRYPTO_EXPORT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000154 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100155 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000156 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100157 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000158 };
159 psa_outvec out_vec[] = {
160 {.base = data, .len = data_size}
161 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100162
Antonio de Angelis202425a2022-04-06 11:13:15 +0100163 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100164
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000165 *data_length = out_vec[0].len;
166
167 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100168}
169
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000170TFM_CRYPTO_API(psa_status_t, psa_export_public_key)(psa_key_id_t key,
171 uint8_t *data,
172 size_t data_size,
173 size_t *data_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100174{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100175 psa_status_t status;
176 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100177 .function_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000178 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100179 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000180
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100181 psa_invec in_vec[] = {
182 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
183 };
184 psa_outvec out_vec[] = {
185 {.base = data, .len = data_size}
186 };
187
Antonio de Angelis202425a2022-04-06 11:13:15 +0100188 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100189
190 *data_length = out_vec[0].len;
191
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100192 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100193}
194
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000195TFM_CRYPTO_API(psa_status_t, psa_purge_key)(psa_key_id_t key)
Maulik Patel28659c42021-01-06 14:09:22 +0000196{
Maulik Patel28659c42021-01-06 14:09:22 +0000197 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100198 .function_id = TFM_CRYPTO_PURGE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000199 .key_id = key,
200 };
201 psa_invec in_vec[] = {
202 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
203 };
204
Antonio de Angelis202425a2022-04-06 11:13:15 +0100205 return API_DISPATCH_NO_OUTVEC(in_vec);
Maulik Patel28659c42021-01-06 14:09:22 +0000206}
207
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000208TFM_CRYPTO_API(psa_status_t, psa_copy_key)(psa_key_id_t source_key,
209 const psa_key_attributes_t *attributes,
210 psa_key_id_t *target_key)
Jamie Foxefd82732018-11-26 10:34:32 +0000211{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100212 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100213 .function_id = TFM_CRYPTO_COPY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000214 .key_id = source_key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100215 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000216
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100217 psa_invec in_vec[] = {
218 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100219 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100220 };
221
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000222 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000223 {.base = target_key, .len = sizeof(psa_key_id_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000224 };
Jamie Foxefd82732018-11-26 10:34:32 +0000225
Antonio de Angelis202425a2022-04-06 11:13:15 +0100226 return API_DISPATCH(in_vec, out_vec);
Jamie Foxefd82732018-11-26 10:34:32 +0000227}
228
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000229TFM_CRYPTO_API(psa_status_t, psa_cipher_generate_iv)(psa_cipher_operation_t *operation,
230 unsigned char *iv,
231 size_t iv_size,
232 size_t *iv_length)
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100233{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100234 psa_status_t status;
235 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100236 .function_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100237 .op_handle = operation->handle,
238 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100239
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100240 psa_invec in_vec[] = {
241 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
242 };
243 psa_outvec out_vec[] = {
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100244 {.base = iv, .len = iv_size},
245 };
246
Antonio de Angelis202425a2022-04-06 11:13:15 +0100247 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100248
Antonio de Angelis202425a2022-04-06 11:13:15 +0100249 *iv_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100250
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100251 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100252}
253
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000254TFM_CRYPTO_API(psa_status_t, psa_cipher_set_iv)(psa_cipher_operation_t *operation,
255 const unsigned char *iv,
256 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100257{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100258 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100259 .function_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100260 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100261 };
262
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000263 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100264 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000265 {.base = iv, .len = iv_length},
266 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100267
Antonio de Angelis202425a2022-04-06 11:13:15 +0100268 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100269}
270
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000271TFM_CRYPTO_API(psa_status_t, psa_cipher_encrypt_setup)(psa_cipher_operation_t *operation,
272 psa_key_id_t key,
273 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100274{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100275 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100276 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000277 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100278 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100279 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000280 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100281
Antonio de Angelis4743e672019-04-11 11:38:48 +0100282 psa_invec in_vec[] = {
283 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
284 };
285 psa_outvec out_vec[] = {
286 {.base = &(operation->handle), .len = sizeof(uint32_t)},
287 };
288
Antonio de Angelis202425a2022-04-06 11:13:15 +0100289 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100290}
291
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000292TFM_CRYPTO_API(psa_status_t, psa_cipher_decrypt_setup)(psa_cipher_operation_t *operation,
293 psa_key_id_t key,
294 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100295{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100296 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100297 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000298 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100299 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100300 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000301 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100302
Antonio de Angelis4743e672019-04-11 11:38:48 +0100303 psa_invec in_vec[] = {
304 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
305 };
306 psa_outvec out_vec[] = {
307 {.base = &(operation->handle), .len = sizeof(uint32_t)},
308 };
309
Antonio de Angelis202425a2022-04-06 11:13:15 +0100310 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100311}
312
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000313TFM_CRYPTO_API(psa_status_t, psa_cipher_update)(psa_cipher_operation_t *operation,
314 const uint8_t *input,
315 size_t input_length,
316 unsigned char *output,
317 size_t output_size,
318 size_t *output_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100319{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000320 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100321 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100322 .function_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100323 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100324 };
325
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000326 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100327 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000328 {.base = input, .len = input_length},
329 };
330 psa_outvec out_vec[] = {
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000331 {.base = output, .len = output_size}
332 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100333
Antonio de Angelis202425a2022-04-06 11:13:15 +0100334 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100335
Antonio de Angelis202425a2022-04-06 11:13:15 +0100336 *output_length = out_vec[0].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100337
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000338 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100339}
340
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000341TFM_CRYPTO_API(psa_status_t, psa_cipher_abort)(psa_cipher_operation_t *operation)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100342{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100343 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100344 .function_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100345 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000346 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100347
Antonio de Angelis4743e672019-04-11 11:38:48 +0100348 psa_invec in_vec[] = {
349 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
350 };
351 psa_outvec out_vec[] = {
352 {.base = &(operation->handle), .len = sizeof(uint32_t)},
353 };
354
Antonio de Angelis202425a2022-04-06 11:13:15 +0100355 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100356}
357
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000358TFM_CRYPTO_API(psa_status_t, psa_cipher_finish)(psa_cipher_operation_t *operation,
359 uint8_t *output,
360 size_t output_size,
361 size_t *output_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100362{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000363 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100364 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100365 .function_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100366 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100367 };
368
369 psa_invec in_vec[] = {
370 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
371 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000372 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100373 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000374 {.base = output, .len = output_size},
375 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100376
Antonio de Angelis202425a2022-04-06 11:13:15 +0100377 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100378
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000379 *output_length = out_vec[1].len;
380
381 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100382}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100383
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000384TFM_CRYPTO_API(psa_status_t, psa_hash_setup)(psa_hash_operation_t *operation,
385 psa_algorithm_t alg)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100386{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100387 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100388 .function_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100389 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100390 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000391 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100392
Antonio de Angelis4743e672019-04-11 11:38:48 +0100393 psa_invec in_vec[] = {
394 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
395 };
396 psa_outvec out_vec[] = {
397 {.base = &(operation->handle), .len = sizeof(uint32_t)},
398 };
399
Antonio de Angelis202425a2022-04-06 11:13:15 +0100400 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100401}
402
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000403TFM_CRYPTO_API(psa_status_t, psa_hash_update)(psa_hash_operation_t *operation,
404 const uint8_t *input,
405 size_t input_length)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100406{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100407 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100408 .function_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100409 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100410 };
411
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000412 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100413 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000414 {.base = input, .len = input_length},
415 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100416
Antonio de Angelis202425a2022-04-06 11:13:15 +0100417 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100418}
419
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000420TFM_CRYPTO_API(psa_status_t, psa_hash_finish)(psa_hash_operation_t *operation,
421 uint8_t *hash,
422 size_t hash_size,
423 size_t *hash_length)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100424{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000425 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100426 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100427 .function_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100428 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100429 };
430
431 psa_invec in_vec[] = {
432 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
433 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000434 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100435 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000436 {.base = hash, .len = hash_size},
437 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100438
Antonio de Angelis202425a2022-04-06 11:13:15 +0100439 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100440
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000441 *hash_length = out_vec[1].len;
442
443 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100444}
445
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000446TFM_CRYPTO_API(psa_status_t, psa_hash_verify)(psa_hash_operation_t *operation,
447 const uint8_t *hash,
448 size_t hash_length)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100449{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100450 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100451 .function_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100452 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100453 };
454
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000455 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100456 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000457 {.base = hash, .len = hash_length},
458 };
459 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100460 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000461 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100462
Antonio de Angelis202425a2022-04-06 11:13:15 +0100463 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100464}
465
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000466TFM_CRYPTO_API(psa_status_t, psa_hash_abort)(psa_hash_operation_t *operation)
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100467{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100468 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100469 .function_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100470 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000471 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100472
Antonio de Angelis4743e672019-04-11 11:38:48 +0100473 psa_invec in_vec[] = {
474 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
475 };
476 psa_outvec out_vec[] = {
477 {.base = &(operation->handle), .len = sizeof(uint32_t)},
478 };
479
Antonio de Angelis202425a2022-04-06 11:13:15 +0100480 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100481}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100482
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000483TFM_CRYPTO_API(psa_status_t, psa_hash_clone)(const psa_hash_operation_t *source_operation,
484 psa_hash_operation_t *target_operation)
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100485{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100486 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100487 .function_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100488 .op_handle = source_operation->handle,
489 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100490
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100491 if (target_operation && (target_operation->handle != 0)) {
492 return PSA_ERROR_BAD_STATE;
493 }
494
David Huc9679cc2022-06-21 13:09:34 +0800495 psa_invec in_vec[] = {
496 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
497 {.base = &(target_operation->handle),
498 .len = sizeof(target_operation->handle)},
499 };
500 psa_outvec out_vec[] = {
501 {.base = &(target_operation->handle),
502 .len = sizeof(target_operation->handle)},
503 };
504
Antonio de Angelis202425a2022-04-06 11:13:15 +0100505 return API_DISPATCH(in_vec, out_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100506}
507
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000508TFM_CRYPTO_API(psa_status_t, psa_hash_compute)(psa_algorithm_t alg,
509 const uint8_t *input,
510 size_t input_length,
511 uint8_t *hash,
512 size_t hash_size,
513 size_t *hash_length)
Soby Mathew07ef6e42020-07-20 21:09:23 +0100514{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100515 psa_status_t status;
516 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100517 .function_id = TFM_CRYPTO_HASH_COMPUTE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100518 .alg = alg,
519 };
520
521 psa_invec in_vec[] = {
522 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
523 {.base = input, .len = input_length},
524 };
525
526 psa_outvec out_vec[] = {
527 {.base = hash, .len = hash_size}
528 };
529
Antonio de Angelis202425a2022-04-06 11:13:15 +0100530 status = API_DISPATCH(in_vec, out_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100531
532 *hash_length = out_vec[0].len;
533
Soby Mathew07ef6e42020-07-20 21:09:23 +0100534 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100535}
536
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000537TFM_CRYPTO_API(psa_status_t, psa_hash_compare)(psa_algorithm_t alg,
538 const uint8_t *input,
539 size_t input_length,
540 const uint8_t *hash,
541 size_t hash_length)
Soby Mathew07ef6e42020-07-20 21:09:23 +0100542{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100543 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100544 .function_id = TFM_CRYPTO_HASH_COMPARE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100545 .alg = alg,
546 };
547
548 psa_invec in_vec[] = {
549 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
550 {.base = input, .len = input_length},
551 {.base = hash, .len = hash_length},
552 };
553
Antonio de Angelis202425a2022-04-06 11:13:15 +0100554 return API_DISPATCH_NO_OUTVEC(in_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100555}
556
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000557TFM_CRYPTO_API(psa_status_t, psa_mac_sign_setup)(psa_mac_operation_t *operation,
558 psa_key_id_t key,
559 psa_algorithm_t alg)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100560{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100561 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100562 .function_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000563 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100564 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100565 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000566 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100567
Antonio de Angelis4743e672019-04-11 11:38:48 +0100568 psa_invec in_vec[] = {
569 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
570 };
571 psa_outvec out_vec[] = {
572 {.base = &(operation->handle), .len = sizeof(uint32_t)},
573 };
574
Antonio de Angelis202425a2022-04-06 11:13:15 +0100575 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100576}
577
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000578TFM_CRYPTO_API(psa_status_t, psa_mac_verify_setup)(psa_mac_operation_t *operation,
579 psa_key_id_t key,
580 psa_algorithm_t alg)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100581{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100582 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100583 .function_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000584 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100585 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100586 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000587 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100588
Antonio de Angelis4743e672019-04-11 11:38:48 +0100589 psa_invec in_vec[] = {
590 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
591 };
592 psa_outvec out_vec[] = {
593 {.base = &(operation->handle), .len = sizeof(uint32_t)},
594 };
595
Antonio de Angelis202425a2022-04-06 11:13:15 +0100596 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100597}
598
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000599TFM_CRYPTO_API(psa_status_t, psa_mac_update)(psa_mac_operation_t *operation,
600 const uint8_t *input,
601 size_t input_length)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100602{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100603 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100604 .function_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100605 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100606 };
607
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000608 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100609 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000610 {.base = input, .len = input_length},
611 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100612
Antonio de Angelis202425a2022-04-06 11:13:15 +0100613 return API_DISPATCH_NO_OUTVEC(in_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100614}
615
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000616TFM_CRYPTO_API(psa_status_t, psa_mac_sign_finish)(psa_mac_operation_t *operation,
617 uint8_t *mac,
618 size_t mac_size,
619 size_t *mac_length)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100620{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000621 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100622 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100623 .function_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100624 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100625 };
626
627 psa_invec in_vec[] = {
628 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
629 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000630 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100631 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000632 {.base = mac, .len = mac_size},
633 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100634
Antonio de Angelis202425a2022-04-06 11:13:15 +0100635 status = API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100636
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000637 *mac_length = out_vec[1].len;
638
639 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100640}
641
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000642TFM_CRYPTO_API(psa_status_t, psa_mac_verify_finish)(psa_mac_operation_t *operation,
643 const uint8_t *mac,
644 size_t mac_length)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100645{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100646 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100647 .function_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100648 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100649 };
650
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000651 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100652 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000653 {.base = mac, .len = mac_length},
654 };
655 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100656 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000657 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100658
Antonio de Angelis202425a2022-04-06 11:13:15 +0100659 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100660}
661
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000662TFM_CRYPTO_API(psa_status_t, psa_mac_abort)(psa_mac_operation_t *operation)
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100663{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100664 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100665 .function_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100666 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000667 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100668
Antonio de Angelis4743e672019-04-11 11:38:48 +0100669 psa_invec in_vec[] = {
670 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
671 };
672 psa_outvec out_vec[] = {
673 {.base = &(operation->handle), .len = sizeof(uint32_t)},
674 };
675
Antonio de Angelis202425a2022-04-06 11:13:15 +0100676 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100677}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000678
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000679TFM_CRYPTO_API(psa_status_t, psa_aead_encrypt)(psa_key_id_t key,
680 psa_algorithm_t alg,
681 const uint8_t *nonce,
682 size_t nonce_length,
683 const uint8_t *additional_data,
684 size_t additional_data_length,
685 const uint8_t *plaintext,
686 size_t plaintext_length,
687 uint8_t *ciphertext,
688 size_t ciphertext_size,
689 size_t *ciphertext_length)
Antonio de Angelis3a480992018-11-07 11:53:28 +0000690{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000691 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100692 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100693 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000694 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100695 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000696 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000697 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100698
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100699 /* Sanitize the optional input */
700 if ((additional_data == NULL) && (additional_data_length != 0)) {
701 return PSA_ERROR_INVALID_ARGUMENT;
702 }
703
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000704 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000705 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000706 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100707 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000708 };
709 psa_outvec out_vec[] = {
710 {.base = ciphertext, .len = ciphertext_size},
711 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000712
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000713 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
714 return PSA_ERROR_INVALID_ARGUMENT;
715 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000716
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000717 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000718 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100719 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000720 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000721 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000722 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000723
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000724 in_vec[0].base = &iov;
725 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
726
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800727 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000728
Antonio de Angelis4743e672019-04-11 11:38:48 +0100729 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100730 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100731 }
Summer Qinaee07882021-03-29 15:44:27 +0800732 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800733 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000734
735 *ciphertext_length = out_vec[0].len;
736
737 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000738}
739
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000740TFM_CRYPTO_API(psa_status_t, psa_aead_decrypt)(psa_key_id_t key,
741 psa_algorithm_t alg,
742 const uint8_t *nonce,
743 size_t nonce_length,
744 const uint8_t *additional_data,
745 size_t additional_data_length,
746 const uint8_t *ciphertext,
747 size_t ciphertext_length,
748 uint8_t *plaintext,
749 size_t plaintext_size,
750 size_t *plaintext_length)
Antonio de Angelis3a480992018-11-07 11:53:28 +0000751{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000752 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100753 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100754 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000755 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100756 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000757 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000758 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100759
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100760 /* Sanitize the optional input */
761 if ((additional_data == NULL) && (additional_data_length != 0)) {
762 return PSA_ERROR_INVALID_ARGUMENT;
763 }
764
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000765 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000766 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000767 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100768 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000769 };
770 psa_outvec out_vec[] = {
771 {.base = plaintext, .len = plaintext_size},
772 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000773
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000774 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
775 return PSA_ERROR_INVALID_ARGUMENT;
776 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000777
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000778 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000779 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100780 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000781 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000782 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000783 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000784
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000785 in_vec[0].base = &iov;
786 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
787
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800788 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000789
Antonio de Angelis4743e672019-04-11 11:38:48 +0100790 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100791 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100792 }
Summer Qinaee07882021-03-29 15:44:27 +0800793 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800794 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000795
796 *plaintext_length = out_vec[0].len;
797
798 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000799}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100800
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000801TFM_CRYPTO_API(psa_status_t, psa_aead_encrypt_setup)(psa_aead_operation_t *operation,
802 psa_key_id_t key,
803 psa_algorithm_t alg)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100804{
805 psa_status_t status;
806 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100807 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100808 .key_id = key,
809 .alg = alg,
810 .op_handle = operation->handle,
811 };
812
813 psa_invec in_vec[] = {
814 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
815 };
816 psa_outvec out_vec[] = {
817 {.base = &(operation->handle), .len = sizeof(uint32_t)}
818 };
819
Antonio de Angelis202425a2022-04-06 11:13:15 +0100820 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100821 return status;
822}
823
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000824TFM_CRYPTO_API(psa_status_t, psa_aead_decrypt_setup)(psa_aead_operation_t *operation,
825 psa_key_id_t key,
826 psa_algorithm_t alg)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100827{
828 psa_status_t status;
829 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100830 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100831 .key_id = key,
832 .alg = alg,
833 .op_handle = operation->handle,
834 };
835
836 psa_invec in_vec[] = {
837 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
838 };
839 psa_outvec out_vec[] = {
840 {.base = &(operation->handle), .len = sizeof(uint32_t)}
841 };
842
Antonio de Angelis202425a2022-04-06 11:13:15 +0100843 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100844 return status;
845}
846
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000847TFM_CRYPTO_API(psa_status_t, psa_aead_generate_nonce)(psa_aead_operation_t *operation,
848 uint8_t *nonce,
849 size_t nonce_size,
850 size_t *nonce_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100851{
852 psa_status_t status;
853 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100854 .function_id = TFM_CRYPTO_AEAD_GENERATE_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100855 .op_handle = operation->handle,
856 };
857
858 psa_invec in_vec[] = {
859 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
860 };
861 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +0100862 {.base = nonce, .len = nonce_size}
863 };
864
Antonio de Angelis202425a2022-04-06 11:13:15 +0100865 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100866
Antonio de Angelis202425a2022-04-06 11:13:15 +0100867 *nonce_length = out_vec[0].len;
Antonio de Angelis8d282482021-10-07 15:04:12 +0100868 return status;
869}
870
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000871TFM_CRYPTO_API(psa_status_t, psa_aead_set_nonce)(psa_aead_operation_t *operation,
872 const uint8_t *nonce,
873 size_t nonce_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100874{
875 psa_status_t status;
876 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100877 .function_id = TFM_CRYPTO_AEAD_SET_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100878 .op_handle = operation->handle,
879 };
880
881 psa_invec in_vec[] = {
882 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
883 {.base = nonce, .len = nonce_length}
884 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100885
Antonio de Angelis202425a2022-04-06 11:13:15 +0100886 status = API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100887 return status;
888}
889
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000890TFM_CRYPTO_API(psa_status_t, psa_aead_set_lengths)(psa_aead_operation_t *operation,
891 size_t ad_length,
892 size_t plaintext_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100893{
894 psa_status_t status;
895 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100896 .function_id = TFM_CRYPTO_AEAD_SET_LENGTHS_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100897 .ad_length = ad_length,
898 .plaintext_length = plaintext_length,
899 .op_handle = operation->handle,
900 };
901
902 psa_invec in_vec[] = {
903 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
904 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100905
Antonio de Angelis202425a2022-04-06 11:13:15 +0100906 status = API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100907 return status;
908}
909
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000910TFM_CRYPTO_API(psa_status_t, psa_aead_update_ad)(psa_aead_operation_t *operation,
911 const uint8_t *input,
912 size_t input_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100913{
914 psa_status_t status;
915 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100916 .function_id = TFM_CRYPTO_AEAD_UPDATE_AD_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100917 .op_handle = operation->handle,
918 };
919
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000920 /* Sanitize the optional input */
921 if ((input == NULL) && (input_length != 0)) {
922 return PSA_ERROR_INVALID_ARGUMENT;
923 }
924
Antonio de Angelis8d282482021-10-07 15:04:12 +0100925 psa_invec in_vec[] = {
926 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
927 {.base = input, .len = input_length}
928 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100929
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000930 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000931
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000932 if (input == NULL) {
933 in_len--;
934 }
935 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis202425a2022-04-06 11:13:15 +0100936 NULL, 0);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100937 return status;
938}
939
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000940TFM_CRYPTO_API(psa_status_t, psa_aead_update)(psa_aead_operation_t *operation,
941 const uint8_t *input,
942 size_t input_length,
943 uint8_t *output,
944 size_t output_size,
945 size_t *output_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100946{
947 psa_status_t status;
948 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100949 .function_id = TFM_CRYPTO_AEAD_UPDATE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100950 .op_handle = operation->handle,
951 };
952
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000953 /* Sanitize the optional input */
954 if ((input == NULL) && (input_length != 0)) {
955 return PSA_ERROR_INVALID_ARGUMENT;
956 }
957
Antonio de Angelis8d282482021-10-07 15:04:12 +0100958 psa_invec in_vec[] = {
959 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
960 {.base = input, .len = input_length}
961 };
962 psa_outvec out_vec[] = {
Antonio de Angelisc26af632021-10-07 15:04:12 +0100963 {.base = output, .len = output_size},
Antonio de Angelis8d282482021-10-07 15:04:12 +0100964 };
965
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000966 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000967
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000968 if (input == NULL) {
969 in_len--;
970 }
971 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
972 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis8d282482021-10-07 15:04:12 +0100973
Antonio de Angelis202425a2022-04-06 11:13:15 +0100974 *output_length = out_vec[0].len;
Antonio de Angelis8d282482021-10-07 15:04:12 +0100975 return status;
976}
977
Antonio de Angelis12e21a22023-03-23 16:25:36 +0000978TFM_CRYPTO_API(psa_status_t, psa_aead_finish)(psa_aead_operation_t *operation,
979 uint8_t *ciphertext,
980 size_t ciphertext_size,
981 size_t *ciphertext_length,
982 uint8_t *tag,
983 size_t tag_size,
984 size_t *tag_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +0100985{
986 psa_status_t status;
987 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100988 .function_id = TFM_CRYPTO_AEAD_FINISH_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100989 .op_handle = operation->handle,
990 };
991
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000992 /* Sanitize the optional output */
993 if ((ciphertext == NULL) && (ciphertext_size != 0)) {
994 return PSA_ERROR_INVALID_ARGUMENT;
995 }
996
Antonio de Angelis8d282482021-10-07 15:04:12 +0100997 psa_invec in_vec[] = {
998 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
999 };
1000 psa_outvec out_vec[] = {
1001 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis8d282482021-10-07 15:04:12 +01001002 {.base = tag, .len = tag_size},
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001003 {.base = ciphertext, .len = ciphertext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +01001004 };
1005
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001006 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001007
Elena Uziunaited38e8212024-02-26 17:25:47 +00001008 if ((ciphertext == NULL) || (ciphertext_size == 0)) {
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001009 out_len--;
1010 }
1011 if ((out_len == 3) && (ciphertext_length == NULL)) {
1012 return PSA_ERROR_INVALID_ARGUMENT;
1013 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001014
Antonio de Angelisc26af632021-10-07 15:04:12 +01001015 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
1016 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001017 out_vec, out_len);
1018
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001019 if (out_len == 3) {
1020 *ciphertext_length = out_vec[2].len;
1021 } else {
1022 *ciphertext_length = 0;
1023 }
Antonio de Angelis202425a2022-04-06 11:13:15 +01001024
1025 *tag_length = out_vec[1].len;
1026
Antonio de Angelis8d282482021-10-07 15:04:12 +01001027 return status;
1028}
1029
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001030TFM_CRYPTO_API(psa_status_t, psa_aead_verify)(psa_aead_operation_t *operation,
1031 uint8_t *plaintext,
1032 size_t plaintext_size,
1033 size_t *plaintext_length,
1034 const uint8_t *tag,
1035 size_t tag_length)
Antonio de Angelis8d282482021-10-07 15:04:12 +01001036{
1037 psa_status_t status;
1038 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001039 .function_id = TFM_CRYPTO_AEAD_VERIFY_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001040 .op_handle = operation->handle,
1041 };
1042
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001043 /* Sanitize the optional output */
1044 if ((plaintext == NULL) && (plaintext_size != 0)) {
1045 return PSA_ERROR_INVALID_ARGUMENT;
1046 }
1047
Antonio de Angelis8d282482021-10-07 15:04:12 +01001048 psa_invec in_vec[] = {
1049 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1050 {.base = tag, .len = tag_length}
1051 };
1052 psa_outvec out_vec[] = {
1053 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis202425a2022-04-06 11:13:15 +01001054 {.base = plaintext, .len = plaintext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +01001055 };
1056
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001057 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001058
Elena Uziunaited38e8212024-02-26 17:25:47 +00001059 if ((plaintext == NULL) || (plaintext_size == 0)) {
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001060 out_len--;
1061 }
1062 if ((out_len == 2) && (plaintext_length == NULL)) {
1063 return PSA_ERROR_INVALID_ARGUMENT;
1064 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001065
Antonio de Angelisc26af632021-10-07 15:04:12 +01001066 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
1067 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001068 out_vec, out_len);
1069
1070 if (out_len == 2) {
1071 *plaintext_length = out_vec[1].len;
1072 } else {
1073 *plaintext_length = 0;
1074 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001075 return status;
1076}
1077
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001078TFM_CRYPTO_API(psa_status_t, psa_aead_abort)(psa_aead_operation_t *operation)
Antonio de Angelis8d282482021-10-07 15:04:12 +01001079{
Antonio de Angelis8d282482021-10-07 15:04:12 +01001080 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001081 .function_id = TFM_CRYPTO_AEAD_ABORT_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001082 .op_handle = operation->handle,
1083 };
1084
1085 psa_invec in_vec[] = {
1086 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1087 };
1088 psa_outvec out_vec[] = {
1089 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1090 };
1091
Antonio de Angelis202425a2022-04-06 11:13:15 +01001092 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +01001093}
1094
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001095TFM_CRYPTO_API(psa_status_t, psa_sign_message)(psa_key_id_t key,
1096 psa_algorithm_t alg,
1097 const uint8_t *input,
1098 size_t input_length,
1099 uint8_t *signature,
1100 size_t signature_size,
1101 size_t *signature_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001102{
Summer Qinb9492d22021-06-22 18:00:54 +08001103 psa_status_t status;
1104 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001105 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001106 .key_id = key,
1107 .alg = alg,
1108 };
1109
1110 psa_invec in_vec[] = {
1111 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1112 {.base = input, .len = input_length},
1113 };
1114 psa_outvec out_vec[] = {
1115 {.base = signature, .len = signature_size},
1116 };
1117
Antonio de Angelis202425a2022-04-06 11:13:15 +01001118 status = API_DISPATCH(in_vec, out_vec);
Summer Qinb9492d22021-06-22 18:00:54 +08001119
Antonio de Angelisf83a2082021-08-20 22:13:53 +01001120 *signature_length = out_vec[0].len;
Summer Qinb9492d22021-06-22 18:00:54 +08001121 return status;
1122}
1123
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001124TFM_CRYPTO_API(psa_status_t, psa_verify_message)(psa_key_id_t key,
1125 psa_algorithm_t alg,
1126 const uint8_t *input,
1127 size_t input_length,
1128 const uint8_t *signature,
1129 size_t signature_length)
Summer Qinb9492d22021-06-22 18:00:54 +08001130{
Summer Qinb9492d22021-06-22 18:00:54 +08001131 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001132 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001133 .key_id = key,
1134 .alg = alg
1135 };
1136
1137 psa_invec in_vec[] = {
1138 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1139 {.base = input, .len = input_length},
1140 {.base = signature, .len = signature_length}
1141 };
1142
Antonio de Angelis202425a2022-04-06 11:13:15 +01001143 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001144}
1145
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001146TFM_CRYPTO_API(psa_status_t, psa_sign_hash)(psa_key_id_t key,
1147 psa_algorithm_t alg,
1148 const uint8_t *hash,
1149 size_t hash_length,
1150 uint8_t *signature,
1151 size_t signature_size,
1152 size_t *signature_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001153{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001154 psa_status_t status;
1155 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001156 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001157 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001158 .alg = alg,
1159 };
1160
1161 psa_invec in_vec[] = {
1162 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1163 {.base = hash, .len = hash_length},
1164 };
1165 psa_outvec out_vec[] = {
1166 {.base = signature, .len = signature_size},
1167 };
1168
Antonio de Angelis202425a2022-04-06 11:13:15 +01001169 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001170
1171 *signature_length = out_vec[0].len;
1172
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001173 return status;
1174}
1175
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001176TFM_CRYPTO_API(psa_status_t, psa_verify_hash)(psa_key_id_t key,
1177 psa_algorithm_t alg,
1178 const uint8_t *hash,
1179 size_t hash_length,
1180 const uint8_t *signature,
1181 size_t signature_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001182{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001183 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001184 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001185 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001186 .alg = alg
1187 };
1188
1189 psa_invec in_vec[] = {
1190 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1191 {.base = hash, .len = hash_length},
1192 {.base = signature, .len = signature_length}
1193 };
1194
Antonio de Angelis202425a2022-04-06 11:13:15 +01001195 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001196}
1197
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001198TFM_CRYPTO_API(psa_status_t, psa_asymmetric_encrypt)(psa_key_id_t key,
1199 psa_algorithm_t alg,
1200 const uint8_t *input,
1201 size_t input_length,
1202 const uint8_t *salt,
1203 size_t salt_length,
1204 uint8_t *output,
1205 size_t output_size,
1206 size_t *output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001207{
1208 psa_status_t status;
1209 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001210 .function_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001211 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001212 .alg = alg
1213 };
1214
1215 /* Sanitize the optional input */
1216 if ((salt == NULL) && (salt_length != 0)) {
1217 return PSA_ERROR_INVALID_ARGUMENT;
1218 }
1219
1220 psa_invec in_vec[] = {
1221 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1222 {.base = input, .len = input_length},
1223 {.base = salt, .len = salt_length}
1224 };
1225
1226 psa_outvec out_vec[] = {
1227 {.base = output, .len = output_size},
1228 };
1229
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001230 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001231
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001232 if (salt == NULL) {
1233 in_len--;
1234 }
Summer Qinaee07882021-03-29 15:44:27 +08001235 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001236 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001237
1238 *output_length = out_vec[0].len;
1239
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001240 return status;
1241}
1242
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001243TFM_CRYPTO_API(psa_status_t, psa_asymmetric_decrypt)(psa_key_id_t key,
1244 psa_algorithm_t alg,
1245 const uint8_t *input,
1246 size_t input_length,
1247 const uint8_t *salt,
1248 size_t salt_length,
1249 uint8_t *output,
1250 size_t output_size,
1251 size_t *output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001252{
1253 psa_status_t status;
1254 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001255 .function_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001256 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001257 .alg = alg
1258 };
1259
1260 /* Sanitize the optional input */
1261 if ((salt == NULL) && (salt_length != 0)) {
1262 return PSA_ERROR_INVALID_ARGUMENT;
1263 }
1264
1265 psa_invec in_vec[] = {
1266 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1267 {.base = input, .len = input_length},
1268 {.base = salt, .len = salt_length}
1269 };
1270
1271 psa_outvec out_vec[] = {
1272 {.base = output, .len = output_size},
1273 };
1274
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001275 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001276
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001277 if (salt == NULL) {
1278 in_len--;
1279 }
Summer Qinaee07882021-03-29 15:44:27 +08001280 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001281 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001282
1283 *output_length = out_vec[0].len;
1284
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001285 return status;
1286}
1287
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001288TFM_CRYPTO_API(psa_status_t, psa_key_derivation_get_capacity)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001289 const psa_key_derivation_operation_t *operation,
1290 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001291{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001292 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001293 .function_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001294 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001295 };
1296
1297 psa_invec in_vec[] = {
1298 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1299 };
1300
1301 psa_outvec out_vec[] = {
1302 {.base = capacity, .len = sizeof(size_t)},
1303 };
1304
Antonio de Angelis202425a2022-04-06 11:13:15 +01001305 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001306}
1307
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001308TFM_CRYPTO_API(psa_status_t, psa_key_derivation_output_bytes)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001309 psa_key_derivation_operation_t *operation,
1310 uint8_t *output,
1311 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001312{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001313 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001314 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001315 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001316 };
1317
1318 psa_invec in_vec[] = {
1319 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1320 };
1321
1322 psa_outvec out_vec[] = {
1323 {.base = output, .len = output_length},
1324 };
1325
Antonio de Angelis202425a2022-04-06 11:13:15 +01001326 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001327}
1328
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001329TFM_CRYPTO_API(psa_status_t, psa_key_derivation_input_key)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001330 psa_key_derivation_operation_t *operation,
1331 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001332 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001333{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001334 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001335 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001336 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001337 .step = step,
1338 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001339 };
1340
1341 psa_invec in_vec[] = {
1342 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001343 };
1344
Antonio de Angelis202425a2022-04-06 11:13:15 +01001345 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001346}
1347
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001348TFM_CRYPTO_API(psa_status_t, psa_key_derivation_abort)(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001349{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001350 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001351 .function_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001352 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001353 };
1354
1355 psa_invec in_vec[] = {
1356 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1357 };
1358
1359 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001360 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001361 };
1362
Antonio de Angelis202425a2022-04-06 11:13:15 +01001363 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001364}
1365
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001366TFM_CRYPTO_API(psa_status_t, psa_key_derivation_key_agreement)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001367 psa_key_derivation_operation_t *operation,
1368 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001369 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001370 const uint8_t *peer_key,
1371 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001372{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001373 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001374 .function_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001375 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001376 .step = step,
1377 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001378 };
1379
1380 psa_invec in_vec[] = {
1381 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1382 {.base = peer_key, .len = peer_key_length},
1383 };
1384
Antonio de Angelis202425a2022-04-06 11:13:15 +01001385 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001386}
1387
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001388TFM_CRYPTO_API(psa_status_t, psa_generate_random)(uint8_t *output,
1389 size_t output_size)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001390{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001391 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001392 .function_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001393 };
1394
1395 psa_invec in_vec[] = {
1396 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1397 };
1398
1399 psa_outvec out_vec[] = {
1400 {.base = output, .len = output_size},
1401 };
1402
1403 if (output_size == 0) {
1404 return PSA_SUCCESS;
1405 }
1406
Antonio de Angelis202425a2022-04-06 11:13:15 +01001407 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001408}
1409
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001410TFM_CRYPTO_API(psa_status_t, psa_generate_key)(const psa_key_attributes_t *attributes,
1411 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001412{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001413 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001414 .function_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001415 };
1416
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001417 psa_invec in_vec[] = {
1418 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001419 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1420 };
1421
1422 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001423 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001424 };
1425
Antonio de Angelis202425a2022-04-06 11:13:15 +01001426 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001427}
1428
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001429TFM_CRYPTO_API(psa_status_t, psa_mac_compute)(psa_key_id_t key,
1430 psa_algorithm_t alg,
1431 const uint8_t *input,
1432 size_t input_length,
1433 uint8_t *mac,
1434 size_t mac_size,
1435 size_t *mac_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001436{
1437 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001438 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001439 .function_id = TFM_CRYPTO_MAC_COMPUTE_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001440 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001441 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001442 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001443
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001444 psa_invec in_vec[] = {
1445 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Summer Qin045ec4a2021-07-07 14:28:04 +08001446 {.base = input, .len = input_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001447 };
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001448 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001449 {.base = mac, .len = mac_size},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001450 };
1451
Antonio de Angelis202425a2022-04-06 11:13:15 +01001452 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001453
1454 *mac_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001455 return status;
1456}
1457
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001458TFM_CRYPTO_API(psa_status_t, psa_mac_verify)(psa_key_id_t key,
1459 psa_algorithm_t alg,
1460 const uint8_t *input,
1461 size_t input_length,
1462 const uint8_t *mac,
1463 const size_t mac_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001464{
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001465 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001466 .function_id = TFM_CRYPTO_MAC_VERIFY_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001467 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001468 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001469 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001470
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001471 psa_invec in_vec[] = {
1472 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1473 {.base = input, .len = input_length},
Summer Qin045ec4a2021-07-07 14:28:04 +08001474 {.base = mac, .len = mac_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001475 };
1476
Antonio de Angelis202425a2022-04-06 11:13:15 +01001477 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001478}
1479
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001480TFM_CRYPTO_API(psa_status_t, psa_cipher_encrypt)(psa_key_id_t key,
1481 psa_algorithm_t alg,
1482 const uint8_t *input,
1483 size_t input_length,
1484 uint8_t *output,
1485 size_t output_size,
1486 size_t *output_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001487{
1488 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001489 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001490 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001491 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001492 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001493 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001494
Antonio de Angelis609f0002021-07-06 16:51:28 +02001495 psa_invec in_vec[] = {
1496 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1497 {.base = input, .len = input_length},
1498 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001499 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001500 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001501 };
1502
Antonio de Angelis202425a2022-04-06 11:13:15 +01001503 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001504
1505 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001506 return status;
1507}
1508
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001509TFM_CRYPTO_API(psa_status_t, psa_cipher_decrypt)(psa_key_id_t key,
1510 psa_algorithm_t alg,
1511 const uint8_t *input,
1512 size_t input_length,
1513 uint8_t *output,
1514 size_t output_size,
1515 size_t *output_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001516{
1517 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001518 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001519 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001520 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001521 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001522 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001523
Antonio de Angelis609f0002021-07-06 16:51:28 +02001524 psa_invec in_vec[] = {
1525 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1526 {.base = input, .len = input_length},
1527 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001528 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001529 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001530 };
1531
Antonio de Angelis202425a2022-04-06 11:13:15 +01001532 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001533
1534 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001535 return status;
1536}
1537
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001538TFM_CRYPTO_API(psa_status_t, psa_raw_key_agreement)(psa_algorithm_t alg,
1539 psa_key_id_t private_key,
1540 const uint8_t *peer_key,
1541 size_t peer_key_length,
1542 uint8_t *output,
1543 size_t output_size,
1544 size_t *output_length)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001545{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001546 psa_status_t status;
1547 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001548 .function_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001549 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001550 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001551 };
1552
1553 psa_invec in_vec[] = {
1554 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1555 {.base = peer_key, .len = peer_key_length},
1556 };
1557
1558 psa_outvec out_vec[] = {
1559 {.base = output, .len = output_size},
1560 };
1561
Antonio de Angelis202425a2022-04-06 11:13:15 +01001562 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001563
1564 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001565
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001566 return status;
1567}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001568
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001569TFM_CRYPTO_API(psa_status_t, psa_key_derivation_setup)(psa_key_derivation_operation_t *operation,
1570 psa_algorithm_t alg)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001571{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001572 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001573 .function_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001574 .alg = alg,
1575 .op_handle = operation->handle,
1576 };
1577
1578 psa_invec in_vec[] = {
1579 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1580 };
1581 psa_outvec out_vec[] = {
1582 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1583 };
1584
Antonio de Angelis202425a2022-04-06 11:13:15 +01001585 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001586}
1587
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001588TFM_CRYPTO_API(psa_status_t, psa_key_derivation_set_capacity)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001589 psa_key_derivation_operation_t *operation,
1590 size_t capacity)
1591{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001592 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001593 .function_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001594 .capacity = capacity,
1595 .op_handle = operation->handle,
1596 };
1597
1598 psa_invec in_vec[] = {
1599 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1600 };
1601
Antonio de Angelis202425a2022-04-06 11:13:15 +01001602 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001603}
1604
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001605TFM_CRYPTO_API(psa_status_t, psa_key_derivation_input_bytes)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001606 psa_key_derivation_operation_t *operation,
1607 psa_key_derivation_step_t step,
1608 const uint8_t *data,
1609 size_t data_length)
1610{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001611 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001612 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001613 .step = step,
1614 .op_handle = operation->handle,
1615 };
1616
1617 psa_invec in_vec[] = {
1618 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1619 {.base = data, .len = data_length},
1620 };
1621
Antonio de Angelis202425a2022-04-06 11:13:15 +01001622 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001623}
1624
Antonio de Angelis12e21a22023-03-23 16:25:36 +00001625TFM_CRYPTO_API(psa_status_t, psa_key_derivation_output_key)(
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001626 const psa_key_attributes_t *attributes,
1627 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001628 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001629{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001630 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001631 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001632 .op_handle = operation->handle,
1633 };
1634
1635 psa_invec in_vec[] = {
1636 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1637 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1638 };
1639
1640 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001641 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001642 };
1643
Antonio de Angelis202425a2022-04-06 11:13:15 +01001644 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001645}
Summer Qincec79b02023-11-29 11:01:55 +08001646
1647TFM_CRYPTO_API(psa_status_t, psa_key_derivation_input_integer)(
1648 psa_key_derivation_operation_t *operation,
1649 psa_key_derivation_step_t step,
1650 uint64_t value)
1651{
1652 struct tfm_crypto_pack_iovec iov = {
1653 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_INTEGER_SID,
1654 .step = step,
1655 .value = value,
1656 .op_handle = operation->handle,
1657 };
1658
1659 psa_invec in_vec[] = {
1660 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1661 };
1662
1663 return API_DISPATCH_NO_OUTVEC(in_vec);
1664}
1665
1666TFM_CRYPTO_API(psa_status_t, psa_key_derivation_verify_bytes)(
1667 psa_key_derivation_operation_t *operation,
1668 const uint8_t *expected_output,
1669 size_t output_length)
1670{
Gergely Kovacs20006892024-11-29 13:05:30 +00001671 (void)operation;
1672 (void)expected_output;
1673 (void)output_length;
Summer Qincec79b02023-11-29 11:01:55 +08001674 /* To be implemented when the PSA backend supports it */
1675 return PSA_ERROR_NOT_SUPPORTED;
1676}
1677
1678TFM_CRYPTO_API(psa_status_t, psa_key_derivation_verify_key)(
1679 psa_key_derivation_operation_t *operation,
1680 psa_key_id_t expected)
1681{
Gergely Kovacs20006892024-11-29 13:05:30 +00001682 (void)operation;
1683 (void)expected;
Summer Qincec79b02023-11-29 11:01:55 +08001684 /* To be implemented when the PSA backend supports it */
1685 return PSA_ERROR_NOT_SUPPORTED;
1686}
Antonio de Angelis8bb98512024-01-16 14:13:36 +00001687
1688/* The implementation of the following helper function is marked
1689 * weak to allow for those integrations where this is directly
1690 * provided by the psa_crypto_client.c module of Mbed TLS
1691 */
1692__attribute__((weak))
1693TFM_CRYPTO_API(void, psa_reset_key_attributes)(
1694 psa_key_attributes_t *attributes)
1695{
1696 memset(attributes, 0, sizeof(*attributes));
1697}