blob: 12a3ef479988219f9e44d679dcdc7f6e4bf62bb5 [file] [log] [blame]
Antonio de Angelis8908f472018-08-31 15:44:25 +01001/*
Antonio de Angelis902fdd02022-01-07 13:37:12 +00002 * Copyright (c) 2018-2022, Arm Limited. All rights reserved.
Antonio de Angelis8908f472018-08-31 15:44:25 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08008#include "psa/client.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00009#include "tfm_veneers.h"
10#include "tfm_crypto_defs.h"
Jamie Foxcc31d402019-01-28 17:13:52 +000011#include "psa/crypto.h"
Antonio de Angelis05b24192019-07-04 15:28:46 +010012#include "tfm_ns_interface.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000013
Antonio de Angelis202425a2022-04-06 11:13:15 +010014#define API_DISPATCH(in_vec, out_vec) \
15 tfm_crypto_api_dispatcher_veneer( \
16 in_vec, IOVEC_LEN(in_vec), \
17 out_vec, IOVEC_LEN(out_vec))
18#define API_DISPATCH_NO_OUTVEC(in_vec) \
19 tfm_crypto_api_dispatcher_veneer( \
20 in_vec, IOVEC_LEN(in_vec), \
21 NULL, 0)
Antonio de Angelis8908f472018-08-31 15:44:25 +010022
23psa_status_t psa_crypto_init(void)
24{
25 /* Service init is performed during TFM boot up,
26 * so application level initialisation is empty
27 */
28 return PSA_SUCCESS;
29}
30
Antonio de Angelis04debbd2019-10-14 12:12:52 +010031psa_status_t psa_open_key(psa_key_id_t id,
Maulik Patel28659c42021-01-06 14:09:22 +000032 psa_key_id_t *key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010033{
Jamie Foxdadb4e82019-09-03 17:59:41 +010034 const struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010035 .function_id = TFM_CRYPTO_OPEN_KEY_SID,
36 .key_id = id,
Jamie Foxdadb4e82019-09-03 17:59:41 +010037 };
38 psa_invec in_vec[] = {
39 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010040 };
41 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000042 {.base = key, .len = sizeof(psa_key_id_t)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010043 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010044
Antonio de Angelis202425a2022-04-06 11:13:15 +010045 return API_DISPATCH(in_vec, out_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010046}
47
Maulik Patel28659c42021-01-06 14:09:22 +000048psa_status_t psa_close_key(psa_key_id_t key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010049{
Jamie Foxdadb4e82019-09-03 17:59:41 +010050 const struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010051 .function_id = TFM_CRYPTO_CLOSE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000052 .key_id = key,
Jamie Foxdadb4e82019-09-03 17:59:41 +010053 };
54 psa_invec in_vec[] = {
55 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
56 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010057
Antonio de Angelis202425a2022-04-06 11:13:15 +010058 return API_DISPATCH_NO_OUTVEC(in_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010059}
60
Antonio de Angelis04debbd2019-10-14 12:12:52 +010061psa_status_t psa_import_key(const psa_key_attributes_t *attributes,
Antonio de Angelis8908f472018-08-31 15:44:25 +010062 const uint8_t *data,
Antonio de Angelis04debbd2019-10-14 12:12:52 +010063 size_t data_length,
Maulik Patel28659c42021-01-06 14:09:22 +000064 psa_key_id_t *key)
Antonio de Angelis8908f472018-08-31 15:44:25 +010065{
Antonio de Angelis4743e672019-04-11 11:38:48 +010066 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010067 .function_id = TFM_CRYPTO_IMPORT_KEY_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +010068 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000069 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +010070 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +010071 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000072 {.base = data, .len = data_length}
73 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +010074 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000075 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +010076 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010077
Antonio de Angelis202425a2022-04-06 11:13:15 +010078 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +010079}
80
Maulik Patel28659c42021-01-06 14:09:22 +000081psa_status_t psa_destroy_key(psa_key_id_t key)
Antonio de Angelis8908f472018-08-31 15:44:25 +010082{
Antonio de Angelis4743e672019-04-11 11:38:48 +010083 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010084 .function_id = TFM_CRYPTO_DESTROY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000085 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +010086 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000087 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +010088 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000089 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010090
Antonio de Angelis202425a2022-04-06 11:13:15 +010091 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +010092}
93
Maulik Patel28659c42021-01-06 14:09:22 +000094psa_status_t psa_get_key_attributes(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +010095 psa_key_attributes_t *attributes)
Antonio de Angelis8908f472018-08-31 15:44:25 +010096{
Antonio de Angelis4743e672019-04-11 11:38:48 +010097 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010098 .function_id = TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000099 .key_id = key,
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 Angelisab85ccd2019-03-25 15:14:29 +0000103 };
104 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100105 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000106 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100107
Antonio de Angelis202425a2022-04-06 11:13:15 +0100108 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100109}
110
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100111void psa_reset_key_attributes(psa_key_attributes_t *attributes)
112{
113 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100114 .function_id = TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100115 };
116 psa_invec in_vec[] = {
117 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
118 };
119 psa_outvec out_vec[] = {
120 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
121 };
122
Antonio de Angelis202425a2022-04-06 11:13:15 +0100123 (void)API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100124 return;
125}
126
Maulik Patel28659c42021-01-06 14:09:22 +0000127psa_status_t psa_export_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100128 uint8_t *data,
129 size_t data_size,
130 size_t *data_length)
131{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000132 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100133 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100134 .function_id = TFM_CRYPTO_EXPORT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000135 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100136 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000137 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100138 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000139 };
140 psa_outvec out_vec[] = {
141 {.base = data, .len = data_size}
142 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100143
Antonio de Angelis202425a2022-04-06 11:13:15 +0100144 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100145
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000146 *data_length = out_vec[0].len;
147
148 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100149}
150
Maulik Patel28659c42021-01-06 14:09:22 +0000151psa_status_t psa_export_public_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100152 uint8_t *data,
153 size_t data_size,
154 size_t *data_length)
155{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100156 psa_status_t status;
157 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100158 .function_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000159 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100160 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000161
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100162 psa_invec in_vec[] = {
163 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
164 };
165 psa_outvec out_vec[] = {
166 {.base = data, .len = data_size}
167 };
168
Antonio de Angelis202425a2022-04-06 11:13:15 +0100169 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100170
171 *data_length = out_vec[0].len;
172
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100173 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100174}
175
Maulik Patel28659c42021-01-06 14:09:22 +0000176psa_status_t psa_purge_key(psa_key_id_t key)
177{
Maulik Patel28659c42021-01-06 14:09:22 +0000178 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100179 .function_id = TFM_CRYPTO_PURGE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000180 .key_id = key,
181 };
182 psa_invec in_vec[] = {
183 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
184 };
185
Antonio de Angelis202425a2022-04-06 11:13:15 +0100186 return API_DISPATCH_NO_OUTVEC(in_vec);
Maulik Patel28659c42021-01-06 14:09:22 +0000187}
188
189psa_status_t psa_copy_key(psa_key_id_t source_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100190 const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +0000191 psa_key_id_t *target_key)
Jamie Foxefd82732018-11-26 10:34:32 +0000192{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100193 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100194 .function_id = TFM_CRYPTO_COPY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000195 .key_id = source_key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100196 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000197
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100198 psa_invec in_vec[] = {
199 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100200 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100201 };
202
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000203 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000204 {.base = target_key, .len = sizeof(psa_key_id_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000205 };
Jamie Foxefd82732018-11-26 10:34:32 +0000206
Antonio de Angelis202425a2022-04-06 11:13:15 +0100207 return API_DISPATCH(in_vec, out_vec);
Jamie Foxefd82732018-11-26 10:34:32 +0000208}
209
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100210psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
211 unsigned char *iv,
212 size_t iv_size,
213 size_t *iv_length)
214{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100215 psa_status_t status;
216 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100217 .function_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100218 .op_handle = operation->handle,
219 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100220
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100221 psa_invec in_vec[] = {
222 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
223 };
224 psa_outvec out_vec[] = {
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100225 {.base = iv, .len = iv_size},
226 };
227
Antonio de Angelis202425a2022-04-06 11:13:15 +0100228 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100229
Antonio de Angelis202425a2022-04-06 11:13:15 +0100230 *iv_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100231
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100232 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100233}
234
Antonio de Angelis377a1552018-11-22 17:02:40 +0000235psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
236 const unsigned char *iv,
237 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100238{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100239 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100240 .function_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100241 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100242 };
243
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000244 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100245 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000246 {.base = iv, .len = iv_length},
247 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100248
Antonio de Angelis202425a2022-04-06 11:13:15 +0100249 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100250}
251
Antonio de Angelis377a1552018-11-22 17:02:40 +0000252psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000253 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000254 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100255{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100256 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100257 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000258 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100259 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100260 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000261 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100262
Antonio de Angelis4743e672019-04-11 11:38:48 +0100263 psa_invec in_vec[] = {
264 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
265 };
266 psa_outvec out_vec[] = {
267 {.base = &(operation->handle), .len = sizeof(uint32_t)},
268 };
269
Antonio de Angelis202425a2022-04-06 11:13:15 +0100270 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100271}
272
Antonio de Angelis377a1552018-11-22 17:02:40 +0000273psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000274 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000275 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100276{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100277 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100278 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000279 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100280 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100281 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000282 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100283
Antonio de Angelis4743e672019-04-11 11:38:48 +0100284 psa_invec in_vec[] = {
285 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
286 };
287 psa_outvec out_vec[] = {
288 {.base = &(operation->handle), .len = sizeof(uint32_t)},
289 };
290
Antonio de Angelis202425a2022-04-06 11:13:15 +0100291 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100292}
293
294psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
295 const uint8_t *input,
296 size_t input_length,
297 unsigned char *output,
298 size_t output_size,
299 size_t *output_length)
300{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000301 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100302 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100303 .function_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100304 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100305 };
306
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000307 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100308 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000309 {.base = input, .len = input_length},
310 };
311 psa_outvec out_vec[] = {
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000312 {.base = output, .len = output_size}
313 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100314
Antonio de Angelis202425a2022-04-06 11:13:15 +0100315 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100316
Antonio de Angelis202425a2022-04-06 11:13:15 +0100317 *output_length = out_vec[0].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100318
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000319 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100320}
321
322psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
323{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100324 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100325 .function_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100326 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000327 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100328
Antonio de Angelis4743e672019-04-11 11:38:48 +0100329 psa_invec in_vec[] = {
330 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
331 };
332 psa_outvec out_vec[] = {
333 {.base = &(operation->handle), .len = sizeof(uint32_t)},
334 };
335
Antonio de Angelis202425a2022-04-06 11:13:15 +0100336 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100337}
338
339psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
340 uint8_t *output,
341 size_t output_size,
342 size_t *output_length)
343{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000344 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100345 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100346 .function_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100347 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100348 };
349
350 psa_invec in_vec[] = {
351 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
352 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000353 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100354 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000355 {.base = output, .len = output_size},
356 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100357
Antonio de Angelis202425a2022-04-06 11:13:15 +0100358 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100359
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000360 *output_length = out_vec[1].len;
361
362 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100363}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100364
Antonio de Angelis377a1552018-11-22 17:02:40 +0000365psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100366 psa_algorithm_t alg)
367{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100368 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100369 .function_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100370 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100371 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000372 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100373
Antonio de Angelis4743e672019-04-11 11:38:48 +0100374 psa_invec in_vec[] = {
375 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
376 };
377 psa_outvec out_vec[] = {
378 {.base = &(operation->handle), .len = sizeof(uint32_t)},
379 };
380
Antonio de Angelis202425a2022-04-06 11:13:15 +0100381 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100382}
383
384psa_status_t psa_hash_update(psa_hash_operation_t *operation,
385 const uint8_t *input,
386 size_t input_length)
387{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100388 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100389 .function_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100390 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100391 };
392
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000393 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100394 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000395 {.base = input, .len = input_length},
396 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100397
Antonio de Angelis202425a2022-04-06 11:13:15 +0100398 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100399}
400
401psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
402 uint8_t *hash,
403 size_t hash_size,
404 size_t *hash_length)
405{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000406 psa_status_t status;
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_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100409 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100410 };
411
412 psa_invec in_vec[] = {
413 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
414 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000415 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100416 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000417 {.base = hash, .len = hash_size},
418 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100419
Antonio de Angelis202425a2022-04-06 11:13:15 +0100420 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100421
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000422 *hash_length = out_vec[1].len;
423
424 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100425}
426
427psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
428 const uint8_t *hash,
429 size_t hash_length)
430{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100431 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100432 .function_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100433 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100434 };
435
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000436 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100437 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000438 {.base = hash, .len = hash_length},
439 };
440 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100441 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000442 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100443
Antonio de Angelis202425a2022-04-06 11:13:15 +0100444 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100445}
446
447psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
448{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100449 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100450 .function_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100451 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000452 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100453
Antonio de Angelis4743e672019-04-11 11:38:48 +0100454 psa_invec in_vec[] = {
455 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
456 };
457 psa_outvec out_vec[] = {
458 {.base = &(operation->handle), .len = sizeof(uint32_t)},
459 };
460
Antonio de Angelis202425a2022-04-06 11:13:15 +0100461 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100462}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100463
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100464psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
465 psa_hash_operation_t *target_operation)
466{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100467 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100468 .function_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100469 .op_handle = source_operation->handle,
470 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100471
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100472 if (target_operation && (target_operation->handle != 0)) {
473 return PSA_ERROR_BAD_STATE;
474 }
475
David Huc9679cc2022-06-21 13:09:34 +0800476 psa_invec in_vec[] = {
477 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
478 {.base = &(target_operation->handle),
479 .len = sizeof(target_operation->handle)},
480 };
481 psa_outvec out_vec[] = {
482 {.base = &(target_operation->handle),
483 .len = sizeof(target_operation->handle)},
484 };
485
Antonio de Angelis202425a2022-04-06 11:13:15 +0100486 return API_DISPATCH(in_vec, out_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100487}
488
Soby Mathew07ef6e42020-07-20 21:09:23 +0100489psa_status_t psa_hash_compute(psa_algorithm_t alg,
490 const uint8_t *input,
491 size_t input_length,
492 uint8_t *hash,
493 size_t hash_size,
494 size_t *hash_length)
495{
496 psa_status_t status;
497 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100498 .function_id = TFM_CRYPTO_HASH_COMPUTE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100499 .alg = alg,
500 };
501
502 psa_invec in_vec[] = {
503 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
504 {.base = input, .len = input_length},
505 };
506
507 psa_outvec out_vec[] = {
508 {.base = hash, .len = hash_size}
509 };
510
Antonio de Angelis202425a2022-04-06 11:13:15 +0100511 status = API_DISPATCH(in_vec, out_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100512
513 *hash_length = out_vec[0].len;
514
515 return status;
516}
517
518psa_status_t psa_hash_compare(psa_algorithm_t alg,
519 const uint8_t *input,
520 size_t input_length,
521 const uint8_t *hash,
522 size_t hash_length)
523{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100524 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100525 .function_id = TFM_CRYPTO_HASH_COMPARE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100526 .alg = alg,
527 };
528
529 psa_invec in_vec[] = {
530 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
531 {.base = input, .len = input_length},
532 {.base = hash, .len = hash_length},
533 };
534
Antonio de Angelis202425a2022-04-06 11:13:15 +0100535 return API_DISPATCH_NO_OUTVEC(in_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100536}
537
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100538psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000539 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100540 psa_algorithm_t alg)
541{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100542 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100543 .function_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000544 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100545 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100546 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000547 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100548
Antonio de Angelis4743e672019-04-11 11:38:48 +0100549 psa_invec in_vec[] = {
550 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
551 };
552 psa_outvec out_vec[] = {
553 {.base = &(operation->handle), .len = sizeof(uint32_t)},
554 };
555
Antonio de Angelis202425a2022-04-06 11:13:15 +0100556 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100557}
558
559psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000560 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100561 psa_algorithm_t alg)
562{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100563 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100564 .function_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000565 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100566 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100567 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000568 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100569
Antonio de Angelis4743e672019-04-11 11:38:48 +0100570 psa_invec in_vec[] = {
571 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
572 };
573 psa_outvec out_vec[] = {
574 {.base = &(operation->handle), .len = sizeof(uint32_t)},
575 };
576
Antonio de Angelis202425a2022-04-06 11:13:15 +0100577 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100578}
579
580psa_status_t psa_mac_update(psa_mac_operation_t *operation,
581 const uint8_t *input,
582 size_t input_length)
583{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100584 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100585 .function_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100586 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100587 };
588
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000589 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100590 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000591 {.base = input, .len = input_length},
592 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100593
Antonio de Angelis202425a2022-04-06 11:13:15 +0100594 return API_DISPATCH_NO_OUTVEC(in_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100595}
596
597psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
598 uint8_t *mac,
599 size_t mac_size,
600 size_t *mac_length)
601{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000602 psa_status_t status;
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_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100605 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100606 };
607
608 psa_invec in_vec[] = {
609 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
610 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000611 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100612 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000613 {.base = mac, .len = mac_size},
614 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100615
Antonio de Angelis202425a2022-04-06 11:13:15 +0100616 status = API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100617
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000618 *mac_length = out_vec[1].len;
619
620 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100621}
622
623psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
624 const uint8_t *mac,
625 size_t mac_length)
626{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100627 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100628 .function_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100629 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100630 };
631
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000632 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100633 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000634 {.base = mac, .len = mac_length},
635 };
636 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100637 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000638 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100639
Antonio de Angelis202425a2022-04-06 11:13:15 +0100640 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100641}
642
643psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
644{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100645 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100646 .function_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100647 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000648 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100649
Antonio de Angelis4743e672019-04-11 11:38:48 +0100650 psa_invec in_vec[] = {
651 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
652 };
653 psa_outvec out_vec[] = {
654 {.base = &(operation->handle), .len = sizeof(uint32_t)},
655 };
656
Antonio de Angelis202425a2022-04-06 11:13:15 +0100657 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100658}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000659
Maulik Patel28659c42021-01-06 14:09:22 +0000660psa_status_t psa_aead_encrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000661 psa_algorithm_t alg,
662 const uint8_t *nonce,
663 size_t nonce_length,
664 const uint8_t *additional_data,
665 size_t additional_data_length,
666 const uint8_t *plaintext,
667 size_t plaintext_length,
668 uint8_t *ciphertext,
669 size_t ciphertext_size,
670 size_t *ciphertext_length)
671{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000672 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100673 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100674 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000675 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100676 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000677 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000678 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100679
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100680 /* Sanitize the optional input */
681 if ((additional_data == NULL) && (additional_data_length != 0)) {
682 return PSA_ERROR_INVALID_ARGUMENT;
683 }
684
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000685 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000686 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000687 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100688 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000689 };
690 psa_outvec out_vec[] = {
691 {.base = ciphertext, .len = ciphertext_size},
692 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000693
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000694 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
695 return PSA_ERROR_INVALID_ARGUMENT;
696 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000697
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000698 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000699 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100700 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000701 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000702 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000703 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000704
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000705 in_vec[0].base = &iov;
706 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
707
Antonio de Angelis202425a2022-04-06 11:13:15 +0100708 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000709
710 *ciphertext_length = out_vec[0].len;
711
712 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000713}
714
Maulik Patel28659c42021-01-06 14:09:22 +0000715psa_status_t psa_aead_decrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000716 psa_algorithm_t alg,
717 const uint8_t *nonce,
718 size_t nonce_length,
719 const uint8_t *additional_data,
720 size_t additional_data_length,
721 const uint8_t *ciphertext,
722 size_t ciphertext_length,
723 uint8_t *plaintext,
724 size_t plaintext_size,
725 size_t *plaintext_length)
726{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000727 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100728 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100729 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000730 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100731 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000732 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000733 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100734
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100735 /* Sanitize the optional input */
736 if ((additional_data == NULL) && (additional_data_length != 0)) {
737 return PSA_ERROR_INVALID_ARGUMENT;
738 }
739
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000740 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000741 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000742 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100743 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000744 };
745 psa_outvec out_vec[] = {
746 {.base = plaintext, .len = plaintext_size},
747 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000748
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000749 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
750 return PSA_ERROR_INVALID_ARGUMENT;
751 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000752
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000753 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000754 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100755 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000756 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000757 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000758 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000759
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000760 in_vec[0].base = &iov;
761 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
762
Antonio de Angelis202425a2022-04-06 11:13:15 +0100763 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000764
765 *plaintext_length = out_vec[0].len;
766
767 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000768}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100769
Antonio de Angelis8d282482021-10-07 15:04:12 +0100770psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
771 psa_key_id_t key,
772 psa_algorithm_t alg)
773{
Antonio de Angelis8d282482021-10-07 15:04:12 +0100774 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100775 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100776 .key_id = key,
777 .alg = alg,
778 .op_handle = operation->handle,
779 };
780
781 psa_invec in_vec[] = {
782 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
783 };
784 psa_outvec out_vec[] = {
785 {.base = &(operation->handle), .len = sizeof(uint32_t)}
786 };
787
Antonio de Angelis202425a2022-04-06 11:13:15 +0100788 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100789}
790
791psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
792 psa_key_id_t key,
793 psa_algorithm_t alg)
794{
Antonio de Angelis8d282482021-10-07 15:04:12 +0100795 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100796 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100797 .key_id = key,
798 .alg = alg,
799 .op_handle = operation->handle,
800 };
801
802 psa_invec in_vec[] = {
803 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
804 };
805 psa_outvec out_vec[] = {
806 {.base = &(operation->handle), .len = sizeof(uint32_t)}
807 };
808
Antonio de Angelis202425a2022-04-06 11:13:15 +0100809 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100810}
811
812psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
813 uint8_t *nonce,
814 size_t nonce_size,
815 size_t *nonce_length)
816{
817 psa_status_t status;
818 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100819 .function_id = TFM_CRYPTO_AEAD_GENERATE_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100820 .op_handle = operation->handle,
821 };
822
823 psa_invec in_vec[] = {
824 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
825 };
826 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +0100827 {.base = nonce, .len = nonce_size}
828 };
829
Antonio de Angelis202425a2022-04-06 11:13:15 +0100830 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100831
Antonio de Angelis202425a2022-04-06 11:13:15 +0100832 *nonce_length = out_vec[0].len;
833
Antonio de Angelis8d282482021-10-07 15:04:12 +0100834 return status;
835}
836
837psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
838 const uint8_t *nonce,
839 size_t nonce_length)
840{
Antonio de Angelis8d282482021-10-07 15:04:12 +0100841 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100842 .function_id = TFM_CRYPTO_AEAD_SET_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100843 .op_handle = operation->handle,
844 };
845
846 psa_invec in_vec[] = {
847 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
848 {.base = nonce, .len = nonce_length}
849 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100850
Antonio de Angelis202425a2022-04-06 11:13:15 +0100851 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100852}
853
854psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
855 size_t ad_length,
856 size_t plaintext_length)
857{
Antonio de Angelis8d282482021-10-07 15:04:12 +0100858 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100859 .function_id = TFM_CRYPTO_AEAD_SET_LENGTHS_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100860 .ad_length = ad_length,
861 .plaintext_length = plaintext_length,
862 .op_handle = operation->handle,
863 };
864
865 psa_invec in_vec[] = {
866 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
867 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100868
Antonio de Angelis202425a2022-04-06 11:13:15 +0100869 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100870}
871
872psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
873 const uint8_t *input,
874 size_t input_length)
875{
Antonio de Angelis8d282482021-10-07 15:04:12 +0100876 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100877 .function_id = TFM_CRYPTO_AEAD_UPDATE_AD_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 = input, .len = input_length}
884 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100885
Antonio de Angelis202425a2022-04-06 11:13:15 +0100886 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100887}
888
889psa_status_t psa_aead_update(psa_aead_operation_t *operation,
890 const uint8_t *input,
891 size_t input_length,
892 uint8_t *output,
893 size_t output_size,
894 size_t *output_length)
895{
896 psa_status_t status;
897 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100898 .function_id = TFM_CRYPTO_AEAD_UPDATE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100899 .op_handle = operation->handle,
900 };
901
902 psa_invec in_vec[] = {
903 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
904 {.base = input, .len = input_length}
905 };
906 psa_outvec out_vec[] = {
Antonio de Angelisc26af632021-10-07 15:04:12 +0100907 {.base = output, .len = output_size},
Antonio de Angelis8d282482021-10-07 15:04:12 +0100908 };
909
Antonio de Angelis202425a2022-04-06 11:13:15 +0100910 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100911
Antonio de Angelis202425a2022-04-06 11:13:15 +0100912 *output_length = out_vec[0].len;
913
Antonio de Angelis8d282482021-10-07 15:04:12 +0100914 return status;
915}
916
917psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
918 uint8_t *ciphertext,
919 size_t ciphertext_size,
920 size_t *ciphertext_length,
921 uint8_t *tag,
922 size_t tag_size,
923 size_t *tag_length)
924{
925 psa_status_t status;
926 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100927 .function_id = TFM_CRYPTO_AEAD_FINISH_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100928 .op_handle = operation->handle,
929 };
930
931 psa_invec in_vec[] = {
932 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
933 };
934 psa_outvec out_vec[] = {
935 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis8d282482021-10-07 15:04:12 +0100936 {.base = tag, .len = tag_size},
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000937 {.base = ciphertext, .len = ciphertext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +0100938 };
939
Antonio de Angelis202425a2022-04-06 11:13:15 +0100940 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100941
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000942 *ciphertext_length = out_vec[2].len;
943 *tag_length = out_vec[1].len;
Antonio de Angelis202425a2022-04-06 11:13:15 +0100944
Antonio de Angelis8d282482021-10-07 15:04:12 +0100945 return status;
946}
947
948psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
949 uint8_t *plaintext,
950 size_t plaintext_size,
951 size_t *plaintext_length,
952 const uint8_t *tag,
953 size_t tag_length)
954{
955 psa_status_t status;
956 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100957 .function_id = TFM_CRYPTO_AEAD_VERIFY_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100958 .op_handle = operation->handle,
959 };
960
961 psa_invec in_vec[] = {
962 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
963 {.base = tag, .len = tag_length}
964 };
965 psa_outvec out_vec[] = {
966 {.base = &(operation->handle), .len = sizeof(uint32_t)},
967 {.base = plaintext, .len = plaintext_size},
968 };
969
Antonio de Angelis202425a2022-04-06 11:13:15 +0100970 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100971
972 *plaintext_length = out_vec[1].len;
Antonio de Angelis202425a2022-04-06 11:13:15 +0100973
Antonio de Angelis8d282482021-10-07 15:04:12 +0100974 return status;
975}
976
977psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
978{
Antonio de Angelis8d282482021-10-07 15:04:12 +0100979 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100980 .function_id = TFM_CRYPTO_AEAD_ABORT_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100981 .op_handle = operation->handle,
982 };
983
984 psa_invec in_vec[] = {
985 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
986 };
987 psa_outvec out_vec[] = {
988 {.base = &(operation->handle), .len = sizeof(uint32_t)},
989 };
990
Antonio de Angelis202425a2022-04-06 11:13:15 +0100991 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100992}
993
Summer Qinb9492d22021-06-22 18:00:54 +0800994psa_status_t psa_sign_message(psa_key_id_t key,
995 psa_algorithm_t alg,
996 const uint8_t *input,
997 size_t input_length,
998 uint8_t *signature,
999 size_t signature_size,
1000 size_t *signature_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001001{
Summer Qinb9492d22021-06-22 18:00:54 +08001002 psa_status_t status;
1003 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001004 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001005 .key_id = key,
1006 .alg = alg,
1007 };
1008
1009 psa_invec in_vec[] = {
1010 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1011 {.base = input, .len = input_length},
1012 };
1013 psa_outvec out_vec[] = {
1014 {.base = signature, .len = signature_size},
1015 };
1016
Antonio de Angelis202425a2022-04-06 11:13:15 +01001017 status = API_DISPATCH(in_vec, out_vec);
Summer Qinb9492d22021-06-22 18:00:54 +08001018
Antonio de Angelisf83a2082021-08-20 22:13:53 +01001019 *signature_length = out_vec[0].len;
Antonio de Angelis202425a2022-04-06 11:13:15 +01001020
Summer Qinb9492d22021-06-22 18:00:54 +08001021 return status;
1022}
1023
1024psa_status_t psa_verify_message(psa_key_id_t key,
1025 psa_algorithm_t alg,
1026 const uint8_t *input,
1027 size_t input_length,
1028 const uint8_t *signature,
1029 size_t signature_length)
1030{
Summer Qinb9492d22021-06-22 18:00:54 +08001031 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001032 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001033 .key_id = key,
1034 .alg = alg
1035 };
1036
1037 psa_invec in_vec[] = {
1038 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1039 {.base = input, .len = input_length},
1040 {.base = signature, .len = signature_length}
1041 };
1042
Antonio de Angelis202425a2022-04-06 11:13:15 +01001043 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001044}
1045
Maulik Patel28659c42021-01-06 14:09:22 +00001046psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001047 psa_algorithm_t alg,
1048 const uint8_t *hash,
1049 size_t hash_length,
1050 uint8_t *signature,
1051 size_t signature_size,
1052 size_t *signature_length)
1053{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001054 psa_status_t status;
1055 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001056 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001057 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001058 .alg = alg,
1059 };
1060
1061 psa_invec in_vec[] = {
1062 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1063 {.base = hash, .len = hash_length},
1064 };
1065 psa_outvec out_vec[] = {
1066 {.base = signature, .len = signature_size},
1067 };
1068
Antonio de Angelis202425a2022-04-06 11:13:15 +01001069 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001070
1071 *signature_length = out_vec[0].len;
1072
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001073 return status;
1074}
1075
Maulik Patel28659c42021-01-06 14:09:22 +00001076psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001077 psa_algorithm_t alg,
1078 const uint8_t *hash,
1079 size_t hash_length,
1080 const uint8_t *signature,
1081 size_t signature_length)
1082{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001083 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001084 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001085 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001086 .alg = alg
1087 };
1088
1089 psa_invec in_vec[] = {
1090 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1091 {.base = hash, .len = hash_length},
1092 {.base = signature, .len = signature_length}
1093 };
1094
Antonio de Angelis202425a2022-04-06 11:13:15 +01001095 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001096}
1097
Maulik Patel28659c42021-01-06 14:09:22 +00001098psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001099 psa_algorithm_t alg,
1100 const uint8_t *input,
1101 size_t input_length,
1102 const uint8_t *salt,
1103 size_t salt_length,
1104 uint8_t *output,
1105 size_t output_size,
1106 size_t *output_length)
1107{
1108 psa_status_t status;
1109 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001110 .function_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001111 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001112 .alg = alg
1113 };
1114
1115 /* Sanitize the optional input */
1116 if ((salt == NULL) && (salt_length != 0)) {
1117 return PSA_ERROR_INVALID_ARGUMENT;
1118 }
1119
1120 psa_invec in_vec[] = {
1121 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1122 {.base = input, .len = input_length},
1123 {.base = salt, .len = salt_length}
1124 };
1125
1126 psa_outvec out_vec[] = {
1127 {.base = output, .len = output_size},
1128 };
1129
Antonio de Angelis202425a2022-04-06 11:13:15 +01001130 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001131
1132 *output_length = out_vec[0].len;
1133
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001134 return status;
1135}
1136
Maulik Patel28659c42021-01-06 14:09:22 +00001137psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001138 psa_algorithm_t alg,
1139 const uint8_t *input,
1140 size_t input_length,
1141 const uint8_t *salt,
1142 size_t salt_length,
1143 uint8_t *output,
1144 size_t output_size,
1145 size_t *output_length)
1146{
1147 psa_status_t status;
1148 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001149 .function_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001150 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001151 .alg = alg
1152 };
1153
1154 /* Sanitize the optional input */
1155 if ((salt == NULL) && (salt_length != 0)) {
1156 return PSA_ERROR_INVALID_ARGUMENT;
1157 }
1158
1159 psa_invec in_vec[] = {
1160 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1161 {.base = input, .len = input_length},
1162 {.base = salt, .len = salt_length}
1163 };
1164
1165 psa_outvec out_vec[] = {
1166 {.base = output, .len = output_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 *output_length = out_vec[0].len;
1172
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001173 return status;
1174}
1175
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001176psa_status_t psa_key_derivation_get_capacity(
1177 const psa_key_derivation_operation_t *operation,
1178 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001179{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001180 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001181 .function_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001182 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001183 };
1184
1185 psa_invec in_vec[] = {
1186 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1187 };
1188
1189 psa_outvec out_vec[] = {
1190 {.base = capacity, .len = sizeof(size_t)},
1191 };
1192
Antonio de Angelis202425a2022-04-06 11:13:15 +01001193 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001194}
1195
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001196psa_status_t psa_key_derivation_output_bytes(
1197 psa_key_derivation_operation_t *operation,
1198 uint8_t *output,
1199 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001200{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001201 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001202 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001203 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001204 };
1205
1206 psa_invec in_vec[] = {
1207 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1208 };
1209
1210 psa_outvec out_vec[] = {
1211 {.base = output, .len = output_length},
1212 };
1213
Antonio de Angelis202425a2022-04-06 11:13:15 +01001214 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001215}
1216
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001217psa_status_t psa_key_derivation_input_key(
1218 psa_key_derivation_operation_t *operation,
1219 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001220 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001221{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001222 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001223 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001224 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001225 .step = step,
1226 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001227 };
1228
1229 psa_invec in_vec[] = {
1230 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001231 };
1232
Antonio de Angelis202425a2022-04-06 11:13:15 +01001233 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001234}
1235
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001236psa_status_t psa_key_derivation_abort(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001237{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001238 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001239 .function_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001240 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001241 };
1242
1243 psa_invec in_vec[] = {
1244 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1245 };
1246
1247 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001248 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001249 };
1250
Antonio de Angelis202425a2022-04-06 11:13:15 +01001251 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001252}
1253
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001254psa_status_t psa_key_derivation_key_agreement(
1255 psa_key_derivation_operation_t *operation,
1256 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001257 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001258 const uint8_t *peer_key,
1259 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001260{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001261 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001262 .function_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001263 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001264 .step = step,
1265 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001266 };
1267
1268 psa_invec in_vec[] = {
1269 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1270 {.base = peer_key, .len = peer_key_length},
1271 };
1272
Antonio de Angelis202425a2022-04-06 11:13:15 +01001273 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001274}
1275
1276psa_status_t psa_generate_random(uint8_t *output,
1277 size_t output_size)
1278{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001279 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001280 .function_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001281 };
1282
1283 psa_invec in_vec[] = {
1284 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1285 };
1286
1287 psa_outvec out_vec[] = {
1288 {.base = output, .len = output_size},
1289 };
1290
1291 if (output_size == 0) {
1292 return PSA_SUCCESS;
1293 }
1294
Antonio de Angelis202425a2022-04-06 11:13:15 +01001295 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001296}
1297
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001298psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001299 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001300{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001301 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001302 .function_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001303 };
1304
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001305 psa_invec in_vec[] = {
1306 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001307 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001308 };
1309
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001310 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001311 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001312 };
1313
Antonio de Angelis202425a2022-04-06 11:13:15 +01001314 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001315}
1316
Maulik Patel28659c42021-01-06 14:09:22 +00001317psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001318 psa_algorithm_t alg,
1319 const uint8_t *input,
1320 size_t input_length,
1321 uint8_t *mac,
1322 size_t mac_size,
1323 size_t *mac_length)
1324{
1325 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001326 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001327 .function_id = TFM_CRYPTO_MAC_COMPUTE_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001328 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001329 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001330 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001331
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001332 psa_invec in_vec[] = {
1333 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Summer Qin045ec4a2021-07-07 14:28:04 +08001334 {.base = input, .len = input_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001335 };
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001336 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001337 {.base = mac, .len = mac_size},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001338 };
1339
Antonio de Angelis202425a2022-04-06 11:13:15 +01001340 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001341
1342 *mac_length = out_vec[0].len;
Antonio de Angelis202425a2022-04-06 11:13:15 +01001343
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001344 return status;
1345}
1346
Maulik Patel28659c42021-01-06 14:09:22 +00001347psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001348 psa_algorithm_t alg,
1349 const uint8_t *input,
1350 size_t input_length,
1351 const uint8_t *mac,
1352 const size_t mac_length)
1353{
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001354 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001355 .function_id = TFM_CRYPTO_MAC_VERIFY_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001356 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001357 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001358 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001359
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001360 psa_invec in_vec[] = {
1361 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1362 {.base = input, .len = input_length},
Summer Qin045ec4a2021-07-07 14:28:04 +08001363 {.base = mac, .len = mac_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001364 };
1365
Antonio de Angelis202425a2022-04-06 11:13:15 +01001366 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001367}
1368
Maulik Patel28659c42021-01-06 14:09:22 +00001369psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001370 psa_algorithm_t alg,
1371 const uint8_t *input,
1372 size_t input_length,
1373 uint8_t *output,
1374 size_t output_size,
1375 size_t *output_length)
1376{
1377 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001378 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001379 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001380 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001381 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001382 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001383
Antonio de Angelis609f0002021-07-06 16:51:28 +02001384 psa_invec in_vec[] = {
1385 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1386 {.base = input, .len = input_length},
1387 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001388 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +01001389 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001390 };
1391
Antonio de Angelis202425a2022-04-06 11:13:15 +01001392 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001393
1394 *output_length = out_vec[0].len;
Antonio de Angelis202425a2022-04-06 11:13:15 +01001395
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001396 return status;
1397}
1398
Maulik Patel28659c42021-01-06 14:09:22 +00001399psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001400 psa_algorithm_t alg,
1401 const uint8_t *input,
1402 size_t input_length,
1403 uint8_t *output,
1404 size_t output_size,
1405 size_t *output_length)
1406{
1407 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001408 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001409 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001410 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001411 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001412 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001413
Antonio de Angelis609f0002021-07-06 16:51:28 +02001414 psa_invec in_vec[] = {
1415 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1416 {.base = input, .len = input_length},
1417 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001418 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +01001419 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001420 };
1421
Antonio de Angelis202425a2022-04-06 11:13:15 +01001422 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001423
1424 *output_length = out_vec[0].len;
Antonio de Angelis202425a2022-04-06 11:13:15 +01001425
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001426 return status;
1427}
1428
1429psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001430 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001431 const uint8_t *peer_key,
1432 size_t peer_key_length,
1433 uint8_t *output,
1434 size_t output_size,
1435 size_t *output_length)
1436{
1437 psa_status_t status;
1438 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001439 .function_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001440 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001441 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001442 };
1443
1444 psa_invec in_vec[] = {
1445 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1446 {.base = peer_key, .len = peer_key_length},
1447 };
1448
1449 psa_outvec out_vec[] = {
1450 {.base = output, .len = output_size},
1451 };
1452
Antonio de Angelis202425a2022-04-06 11:13:15 +01001453 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001454
1455 *output_length = out_vec[0].len;
1456
1457 return status;
1458}
1459
1460psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1461 psa_algorithm_t alg)
1462{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001463 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001464 .function_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001465 .alg = alg,
1466 .op_handle = operation->handle,
1467 };
1468
1469 psa_invec in_vec[] = {
1470 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1471 };
1472 psa_outvec out_vec[] = {
1473 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1474 };
1475
Antonio de Angelis202425a2022-04-06 11:13:15 +01001476 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001477}
1478
1479psa_status_t psa_key_derivation_set_capacity(
1480 psa_key_derivation_operation_t *operation,
1481 size_t capacity)
1482{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001483 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001484 .function_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001485 .capacity = capacity,
1486 .op_handle = operation->handle,
1487 };
1488
1489 psa_invec in_vec[] = {
1490 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1491 };
1492
Antonio de Angelis202425a2022-04-06 11:13:15 +01001493 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001494}
1495
1496psa_status_t psa_key_derivation_input_bytes(
1497 psa_key_derivation_operation_t *operation,
1498 psa_key_derivation_step_t step,
1499 const uint8_t *data,
1500 size_t data_length)
1501{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001502 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001503 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001504 .step = step,
1505 .op_handle = operation->handle,
1506 };
1507
1508 psa_invec in_vec[] = {
1509 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1510 {.base = data, .len = data_length},
1511 };
1512
Antonio de Angelis202425a2022-04-06 11:13:15 +01001513 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001514}
1515
1516psa_status_t psa_key_derivation_output_key(
1517 const psa_key_attributes_t *attributes,
1518 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001519 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001520{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001521 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001522 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001523 .op_handle = operation->handle,
1524 };
1525
1526 psa_invec in_vec[] = {
1527 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1528 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1529 };
1530
1531 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001532 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001533 };
1534
Antonio de Angelis202425a2022-04-06 11:13:15 +01001535 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001536}