blob: 66615fd405ffe16a51336a273d31eff9a3d60d23 [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 Angelis25e2b2d2019-04-25 14:49:50 +0100472 psa_invec in_vec[] = {
473 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
474 };
475 psa_outvec out_vec[] = {
476 {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
477 };
478
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100479 if (target_operation && (target_operation->handle != 0)) {
480 return PSA_ERROR_BAD_STATE;
481 }
482
Antonio de Angelis202425a2022-04-06 11:13:15 +0100483 return API_DISPATCH(in_vec, out_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100484}
485
Soby Mathew07ef6e42020-07-20 21:09:23 +0100486psa_status_t psa_hash_compute(psa_algorithm_t alg,
487 const uint8_t *input,
488 size_t input_length,
489 uint8_t *hash,
490 size_t hash_size,
491 size_t *hash_length)
492{
493 psa_status_t status;
494 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100495 .function_id = TFM_CRYPTO_HASH_COMPUTE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100496 .alg = alg,
497 };
498
499 psa_invec in_vec[] = {
500 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
501 {.base = input, .len = input_length},
502 };
503
504 psa_outvec out_vec[] = {
505 {.base = hash, .len = hash_size}
506 };
507
Antonio de Angelis202425a2022-04-06 11:13:15 +0100508 status = API_DISPATCH(in_vec, out_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100509
510 *hash_length = out_vec[0].len;
511
512 return status;
513}
514
515psa_status_t psa_hash_compare(psa_algorithm_t alg,
516 const uint8_t *input,
517 size_t input_length,
518 const uint8_t *hash,
519 size_t hash_length)
520{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100521 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100522 .function_id = TFM_CRYPTO_HASH_COMPARE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100523 .alg = alg,
524 };
525
526 psa_invec in_vec[] = {
527 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
528 {.base = input, .len = input_length},
529 {.base = hash, .len = hash_length},
530 };
531
Antonio de Angelis202425a2022-04-06 11:13:15 +0100532 return API_DISPATCH_NO_OUTVEC(in_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100533}
534
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100535psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000536 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100537 psa_algorithm_t alg)
538{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100539 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100540 .function_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000541 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100542 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100543 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000544 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100545
Antonio de Angelis4743e672019-04-11 11:38:48 +0100546 psa_invec in_vec[] = {
547 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
548 };
549 psa_outvec out_vec[] = {
550 {.base = &(operation->handle), .len = sizeof(uint32_t)},
551 };
552
Antonio de Angelis202425a2022-04-06 11:13:15 +0100553 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100554}
555
556psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000557 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100558 psa_algorithm_t alg)
559{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100560 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100561 .function_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000562 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100563 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100564 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000565 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100566
Antonio de Angelis4743e672019-04-11 11:38:48 +0100567 psa_invec in_vec[] = {
568 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
569 };
570 psa_outvec out_vec[] = {
571 {.base = &(operation->handle), .len = sizeof(uint32_t)},
572 };
573
Antonio de Angelis202425a2022-04-06 11:13:15 +0100574 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100575}
576
577psa_status_t psa_mac_update(psa_mac_operation_t *operation,
578 const uint8_t *input,
579 size_t input_length)
580{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100581 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100582 .function_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100583 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100584 };
585
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000586 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100587 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000588 {.base = input, .len = input_length},
589 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100590
Antonio de Angelis202425a2022-04-06 11:13:15 +0100591 return API_DISPATCH_NO_OUTVEC(in_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100592}
593
594psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
595 uint8_t *mac,
596 size_t mac_size,
597 size_t *mac_length)
598{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000599 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100600 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100601 .function_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100602 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100603 };
604
605 psa_invec in_vec[] = {
606 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
607 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000608 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100609 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000610 {.base = mac, .len = mac_size},
611 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100612
Antonio de Angelis202425a2022-04-06 11:13:15 +0100613 status = API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100614
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000615 *mac_length = out_vec[1].len;
616
617 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100618}
619
620psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
621 const uint8_t *mac,
622 size_t mac_length)
623{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100624 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100625 .function_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100626 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100627 };
628
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000629 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100630 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000631 {.base = mac, .len = mac_length},
632 };
633 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100634 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000635 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100636
Antonio de Angelis202425a2022-04-06 11:13:15 +0100637 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100638}
639
640psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
641{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100642 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100643 .function_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100644 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000645 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100646
Antonio de Angelis4743e672019-04-11 11:38:48 +0100647 psa_invec in_vec[] = {
648 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
649 };
650 psa_outvec out_vec[] = {
651 {.base = &(operation->handle), .len = sizeof(uint32_t)},
652 };
653
Antonio de Angelis202425a2022-04-06 11:13:15 +0100654 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100655}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000656
Maulik Patel28659c42021-01-06 14:09:22 +0000657psa_status_t psa_aead_encrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000658 psa_algorithm_t alg,
659 const uint8_t *nonce,
660 size_t nonce_length,
661 const uint8_t *additional_data,
662 size_t additional_data_length,
663 const uint8_t *plaintext,
664 size_t plaintext_length,
665 uint8_t *ciphertext,
666 size_t ciphertext_size,
667 size_t *ciphertext_length)
668{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000669 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100670 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100671 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000672 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100673 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000674 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000675 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100676
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100677 /* Sanitize the optional input */
678 if ((additional_data == NULL) && (additional_data_length != 0)) {
679 return PSA_ERROR_INVALID_ARGUMENT;
680 }
681
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000682 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000683 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000684 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100685 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000686 };
687 psa_outvec out_vec[] = {
688 {.base = ciphertext, .len = ciphertext_size},
689 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000690
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000691 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
692 return PSA_ERROR_INVALID_ARGUMENT;
693 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000694
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000695 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000696 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100697 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000698 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000699 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000700 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000701
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000702 in_vec[0].base = &iov;
703 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
704
Antonio de Angelis202425a2022-04-06 11:13:15 +0100705 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000706
707 *ciphertext_length = out_vec[0].len;
708
709 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000710}
711
Maulik Patel28659c42021-01-06 14:09:22 +0000712psa_status_t psa_aead_decrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000713 psa_algorithm_t alg,
714 const uint8_t *nonce,
715 size_t nonce_length,
716 const uint8_t *additional_data,
717 size_t additional_data_length,
718 const uint8_t *ciphertext,
719 size_t ciphertext_length,
720 uint8_t *plaintext,
721 size_t plaintext_size,
722 size_t *plaintext_length)
723{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000724 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100725 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100726 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000727 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100728 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000729 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000730 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100731
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100732 /* Sanitize the optional input */
733 if ((additional_data == NULL) && (additional_data_length != 0)) {
734 return PSA_ERROR_INVALID_ARGUMENT;
735 }
736
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000737 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000738 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000739 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100740 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000741 };
742 psa_outvec out_vec[] = {
743 {.base = plaintext, .len = plaintext_size},
744 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000745
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000746 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
747 return PSA_ERROR_INVALID_ARGUMENT;
748 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000749
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000750 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000751 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100752 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000753 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000754 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000755 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000756
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000757 in_vec[0].base = &iov;
758 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
759
Antonio de Angelis202425a2022-04-06 11:13:15 +0100760 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000761
762 *plaintext_length = out_vec[0].len;
763
764 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000765}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100766
Antonio de Angelis8d282482021-10-07 15:04:12 +0100767psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
768 psa_key_id_t key,
769 psa_algorithm_t alg)
770{
Antonio de Angelis8d282482021-10-07 15:04:12 +0100771 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100772 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100773 .key_id = key,
774 .alg = alg,
775 .op_handle = operation->handle,
776 };
777
778 psa_invec in_vec[] = {
779 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
780 };
781 psa_outvec out_vec[] = {
782 {.base = &(operation->handle), .len = sizeof(uint32_t)}
783 };
784
Antonio de Angelis202425a2022-04-06 11:13:15 +0100785 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100786}
787
788psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
789 psa_key_id_t key,
790 psa_algorithm_t alg)
791{
Antonio de Angelis8d282482021-10-07 15:04:12 +0100792 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100793 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100794 .key_id = key,
795 .alg = alg,
796 .op_handle = operation->handle,
797 };
798
799 psa_invec in_vec[] = {
800 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
801 };
802 psa_outvec out_vec[] = {
803 {.base = &(operation->handle), .len = sizeof(uint32_t)}
804 };
805
Antonio de Angelis202425a2022-04-06 11:13:15 +0100806 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100807}
808
809psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
810 uint8_t *nonce,
811 size_t nonce_size,
812 size_t *nonce_length)
813{
814 psa_status_t status;
815 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100816 .function_id = TFM_CRYPTO_AEAD_GENERATE_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100817 .op_handle = operation->handle,
818 };
819
820 psa_invec in_vec[] = {
821 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
822 };
823 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +0100824 {.base = nonce, .len = nonce_size}
825 };
826
Antonio de Angelis202425a2022-04-06 11:13:15 +0100827 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100828
Antonio de Angelis202425a2022-04-06 11:13:15 +0100829 *nonce_length = out_vec[0].len;
830
Antonio de Angelis8d282482021-10-07 15:04:12 +0100831 return status;
832}
833
834psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
835 const uint8_t *nonce,
836 size_t nonce_length)
837{
Antonio de Angelis8d282482021-10-07 15:04:12 +0100838 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100839 .function_id = TFM_CRYPTO_AEAD_SET_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100840 .op_handle = operation->handle,
841 };
842
843 psa_invec in_vec[] = {
844 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
845 {.base = nonce, .len = nonce_length}
846 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100847
Antonio de Angelis202425a2022-04-06 11:13:15 +0100848 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100849}
850
851psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
852 size_t ad_length,
853 size_t plaintext_length)
854{
Antonio de Angelis8d282482021-10-07 15:04:12 +0100855 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100856 .function_id = TFM_CRYPTO_AEAD_SET_LENGTHS_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100857 .ad_length = ad_length,
858 .plaintext_length = plaintext_length,
859 .op_handle = operation->handle,
860 };
861
862 psa_invec in_vec[] = {
863 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
864 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100865
Antonio de Angelis202425a2022-04-06 11:13:15 +0100866 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100867}
868
869psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
870 const uint8_t *input,
871 size_t input_length)
872{
Antonio de Angelis8d282482021-10-07 15:04:12 +0100873 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100874 .function_id = TFM_CRYPTO_AEAD_UPDATE_AD_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100875 .op_handle = operation->handle,
876 };
877
878 psa_invec in_vec[] = {
879 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
880 {.base = input, .len = input_length}
881 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100882
Antonio de Angelis202425a2022-04-06 11:13:15 +0100883 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100884}
885
886psa_status_t psa_aead_update(psa_aead_operation_t *operation,
887 const uint8_t *input,
888 size_t input_length,
889 uint8_t *output,
890 size_t output_size,
891 size_t *output_length)
892{
893 psa_status_t status;
894 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100895 .function_id = TFM_CRYPTO_AEAD_UPDATE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100896 .op_handle = operation->handle,
897 };
898
899 psa_invec in_vec[] = {
900 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
901 {.base = input, .len = input_length}
902 };
903 psa_outvec out_vec[] = {
Antonio de Angelisc26af632021-10-07 15:04:12 +0100904 {.base = output, .len = output_size},
Antonio de Angelis8d282482021-10-07 15:04:12 +0100905 };
906
Antonio de Angelis202425a2022-04-06 11:13:15 +0100907 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100908
Antonio de Angelis202425a2022-04-06 11:13:15 +0100909 *output_length = out_vec[0].len;
910
Antonio de Angelis8d282482021-10-07 15:04:12 +0100911 return status;
912}
913
914psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
915 uint8_t *ciphertext,
916 size_t ciphertext_size,
917 size_t *ciphertext_length,
918 uint8_t *tag,
919 size_t tag_size,
920 size_t *tag_length)
921{
922 psa_status_t status;
923 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100924 .function_id = TFM_CRYPTO_AEAD_FINISH_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100925 .op_handle = operation->handle,
926 };
927
928 psa_invec in_vec[] = {
929 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
930 };
931 psa_outvec out_vec[] = {
932 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis8d282482021-10-07 15:04:12 +0100933 {.base = tag, .len = tag_size},
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000934 {.base = ciphertext, .len = ciphertext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +0100935 };
936
Antonio de Angelis202425a2022-04-06 11:13:15 +0100937 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100938
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000939 *ciphertext_length = out_vec[2].len;
940 *tag_length = out_vec[1].len;
Antonio de Angelis202425a2022-04-06 11:13:15 +0100941
Antonio de Angelis8d282482021-10-07 15:04:12 +0100942 return status;
943}
944
945psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
946 uint8_t *plaintext,
947 size_t plaintext_size,
948 size_t *plaintext_length,
949 const uint8_t *tag,
950 size_t tag_length)
951{
952 psa_status_t status;
953 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100954 .function_id = TFM_CRYPTO_AEAD_VERIFY_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100955 .op_handle = operation->handle,
956 };
957
958 psa_invec in_vec[] = {
959 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
960 {.base = tag, .len = tag_length}
961 };
962 psa_outvec out_vec[] = {
963 {.base = &(operation->handle), .len = sizeof(uint32_t)},
964 {.base = plaintext, .len = plaintext_size},
965 };
966
Antonio de Angelis202425a2022-04-06 11:13:15 +0100967 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100968
969 *plaintext_length = out_vec[1].len;
Antonio de Angelis202425a2022-04-06 11:13:15 +0100970
Antonio de Angelis8d282482021-10-07 15:04:12 +0100971 return status;
972}
973
974psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
975{
Antonio de Angelis8d282482021-10-07 15:04:12 +0100976 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100977 .function_id = TFM_CRYPTO_AEAD_ABORT_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100978 .op_handle = operation->handle,
979 };
980
981 psa_invec in_vec[] = {
982 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
983 };
984 psa_outvec out_vec[] = {
985 {.base = &(operation->handle), .len = sizeof(uint32_t)},
986 };
987
Antonio de Angelis202425a2022-04-06 11:13:15 +0100988 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100989}
990
Summer Qinb9492d22021-06-22 18:00:54 +0800991psa_status_t psa_sign_message(psa_key_id_t key,
992 psa_algorithm_t alg,
993 const uint8_t *input,
994 size_t input_length,
995 uint8_t *signature,
996 size_t signature_size,
997 size_t *signature_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100998{
Summer Qinb9492d22021-06-22 18:00:54 +0800999 psa_status_t status;
1000 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001001 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001002 .key_id = key,
1003 .alg = alg,
1004 };
1005
1006 psa_invec in_vec[] = {
1007 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1008 {.base = input, .len = input_length},
1009 };
1010 psa_outvec out_vec[] = {
1011 {.base = signature, .len = signature_size},
1012 };
1013
Antonio de Angelis202425a2022-04-06 11:13:15 +01001014 status = API_DISPATCH(in_vec, out_vec);
Summer Qinb9492d22021-06-22 18:00:54 +08001015
Antonio de Angelisf83a2082021-08-20 22:13:53 +01001016 *signature_length = out_vec[0].len;
Antonio de Angelis202425a2022-04-06 11:13:15 +01001017
Summer Qinb9492d22021-06-22 18:00:54 +08001018 return status;
1019}
1020
1021psa_status_t psa_verify_message(psa_key_id_t key,
1022 psa_algorithm_t alg,
1023 const uint8_t *input,
1024 size_t input_length,
1025 const uint8_t *signature,
1026 size_t signature_length)
1027{
Summer Qinb9492d22021-06-22 18:00:54 +08001028 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001029 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001030 .key_id = key,
1031 .alg = alg
1032 };
1033
1034 psa_invec in_vec[] = {
1035 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1036 {.base = input, .len = input_length},
1037 {.base = signature, .len = signature_length}
1038 };
1039
Antonio de Angelis202425a2022-04-06 11:13:15 +01001040 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001041}
1042
Maulik Patel28659c42021-01-06 14:09:22 +00001043psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001044 psa_algorithm_t alg,
1045 const uint8_t *hash,
1046 size_t hash_length,
1047 uint8_t *signature,
1048 size_t signature_size,
1049 size_t *signature_length)
1050{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001051 psa_status_t status;
1052 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001053 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001054 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001055 .alg = alg,
1056 };
1057
1058 psa_invec in_vec[] = {
1059 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1060 {.base = hash, .len = hash_length},
1061 };
1062 psa_outvec out_vec[] = {
1063 {.base = signature, .len = signature_size},
1064 };
1065
Antonio de Angelis202425a2022-04-06 11:13:15 +01001066 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001067
1068 *signature_length = out_vec[0].len;
1069
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001070 return status;
1071}
1072
Maulik Patel28659c42021-01-06 14:09:22 +00001073psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001074 psa_algorithm_t alg,
1075 const uint8_t *hash,
1076 size_t hash_length,
1077 const uint8_t *signature,
1078 size_t signature_length)
1079{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001080 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001081 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001082 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001083 .alg = alg
1084 };
1085
1086 psa_invec in_vec[] = {
1087 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1088 {.base = hash, .len = hash_length},
1089 {.base = signature, .len = signature_length}
1090 };
1091
Antonio de Angelis202425a2022-04-06 11:13:15 +01001092 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001093}
1094
Maulik Patel28659c42021-01-06 14:09:22 +00001095psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001096 psa_algorithm_t alg,
1097 const uint8_t *input,
1098 size_t input_length,
1099 const uint8_t *salt,
1100 size_t salt_length,
1101 uint8_t *output,
1102 size_t output_size,
1103 size_t *output_length)
1104{
1105 psa_status_t status;
1106 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001107 .function_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001108 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001109 .alg = alg
1110 };
1111
1112 /* Sanitize the optional input */
1113 if ((salt == NULL) && (salt_length != 0)) {
1114 return PSA_ERROR_INVALID_ARGUMENT;
1115 }
1116
1117 psa_invec in_vec[] = {
1118 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1119 {.base = input, .len = input_length},
1120 {.base = salt, .len = salt_length}
1121 };
1122
1123 psa_outvec out_vec[] = {
1124 {.base = output, .len = output_size},
1125 };
1126
Antonio de Angelis202425a2022-04-06 11:13:15 +01001127 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001128
1129 *output_length = out_vec[0].len;
1130
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001131 return status;
1132}
1133
Maulik Patel28659c42021-01-06 14:09:22 +00001134psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001135 psa_algorithm_t alg,
1136 const uint8_t *input,
1137 size_t input_length,
1138 const uint8_t *salt,
1139 size_t salt_length,
1140 uint8_t *output,
1141 size_t output_size,
1142 size_t *output_length)
1143{
1144 psa_status_t status;
1145 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001146 .function_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001147 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001148 .alg = alg
1149 };
1150
1151 /* Sanitize the optional input */
1152 if ((salt == NULL) && (salt_length != 0)) {
1153 return PSA_ERROR_INVALID_ARGUMENT;
1154 }
1155
1156 psa_invec in_vec[] = {
1157 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1158 {.base = input, .len = input_length},
1159 {.base = salt, .len = salt_length}
1160 };
1161
1162 psa_outvec out_vec[] = {
1163 {.base = output, .len = output_size},
1164 };
1165
Antonio de Angelis202425a2022-04-06 11:13:15 +01001166 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001167
1168 *output_length = out_vec[0].len;
1169
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001170 return status;
1171}
1172
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001173psa_status_t psa_key_derivation_get_capacity(
1174 const psa_key_derivation_operation_t *operation,
1175 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001176{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001177 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001178 .function_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001179 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001180 };
1181
1182 psa_invec in_vec[] = {
1183 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1184 };
1185
1186 psa_outvec out_vec[] = {
1187 {.base = capacity, .len = sizeof(size_t)},
1188 };
1189
Antonio de Angelis202425a2022-04-06 11:13:15 +01001190 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001191}
1192
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001193psa_status_t psa_key_derivation_output_bytes(
1194 psa_key_derivation_operation_t *operation,
1195 uint8_t *output,
1196 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001197{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001198 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001199 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001200 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001201 };
1202
1203 psa_invec in_vec[] = {
1204 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1205 };
1206
1207 psa_outvec out_vec[] = {
1208 {.base = output, .len = output_length},
1209 };
1210
Antonio de Angelis202425a2022-04-06 11:13:15 +01001211 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001212}
1213
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001214psa_status_t psa_key_derivation_input_key(
1215 psa_key_derivation_operation_t *operation,
1216 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001217 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001218{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001219 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001220 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001221 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001222 .step = step,
1223 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001224 };
1225
1226 psa_invec in_vec[] = {
1227 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001228 };
1229
Antonio de Angelis202425a2022-04-06 11:13:15 +01001230 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001231}
1232
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001233psa_status_t psa_key_derivation_abort(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001234{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001235 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001236 .function_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001237 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001238 };
1239
1240 psa_invec in_vec[] = {
1241 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1242 };
1243
1244 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001245 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001246 };
1247
Antonio de Angelis202425a2022-04-06 11:13:15 +01001248 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001249}
1250
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001251psa_status_t psa_key_derivation_key_agreement(
1252 psa_key_derivation_operation_t *operation,
1253 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001254 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001255 const uint8_t *peer_key,
1256 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001257{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001258 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001259 .function_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001260 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001261 .step = step,
1262 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001263 };
1264
1265 psa_invec in_vec[] = {
1266 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1267 {.base = peer_key, .len = peer_key_length},
1268 };
1269
Antonio de Angelis202425a2022-04-06 11:13:15 +01001270 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001271}
1272
1273psa_status_t psa_generate_random(uint8_t *output,
1274 size_t output_size)
1275{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001276 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001277 .function_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001278 };
1279
1280 psa_invec in_vec[] = {
1281 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1282 };
1283
1284 psa_outvec out_vec[] = {
1285 {.base = output, .len = output_size},
1286 };
1287
1288 if (output_size == 0) {
1289 return PSA_SUCCESS;
1290 }
1291
Antonio de Angelis202425a2022-04-06 11:13:15 +01001292 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001293}
1294
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001295psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001296 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001297{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001298 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001299 .function_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001300 };
1301
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001302 psa_invec in_vec[] = {
1303 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001304 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001305 };
1306
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001307 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001308 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001309 };
1310
Antonio de Angelis202425a2022-04-06 11:13:15 +01001311 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001312}
1313
Maulik Patel28659c42021-01-06 14:09:22 +00001314psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001315 psa_algorithm_t alg,
1316 const uint8_t *input,
1317 size_t input_length,
1318 uint8_t *mac,
1319 size_t mac_size,
1320 size_t *mac_length)
1321{
1322 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001323 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001324 .function_id = TFM_CRYPTO_MAC_COMPUTE_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001325 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001326 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001327 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001328
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001329 psa_invec in_vec[] = {
1330 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Summer Qin045ec4a2021-07-07 14:28:04 +08001331 {.base = input, .len = input_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001332 };
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001333 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001334 {.base = mac, .len = mac_size},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001335 };
1336
Antonio de Angelis202425a2022-04-06 11:13:15 +01001337 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001338
1339 *mac_length = out_vec[0].len;
Antonio de Angelis202425a2022-04-06 11:13:15 +01001340
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001341 return status;
1342}
1343
Maulik Patel28659c42021-01-06 14:09:22 +00001344psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001345 psa_algorithm_t alg,
1346 const uint8_t *input,
1347 size_t input_length,
1348 const uint8_t *mac,
1349 const size_t mac_length)
1350{
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001351 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001352 .function_id = TFM_CRYPTO_MAC_VERIFY_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001353 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001354 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001355 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001356
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001357 psa_invec in_vec[] = {
1358 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1359 {.base = input, .len = input_length},
Summer Qin045ec4a2021-07-07 14:28:04 +08001360 {.base = mac, .len = mac_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001361 };
1362
Antonio de Angelis202425a2022-04-06 11:13:15 +01001363 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001364}
1365
Maulik Patel28659c42021-01-06 14:09:22 +00001366psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001367 psa_algorithm_t alg,
1368 const uint8_t *input,
1369 size_t input_length,
1370 uint8_t *output,
1371 size_t output_size,
1372 size_t *output_length)
1373{
1374 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001375 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001376 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001377 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001378 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001379 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001380
Antonio de Angelis609f0002021-07-06 16:51:28 +02001381 psa_invec in_vec[] = {
1382 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1383 {.base = input, .len = input_length},
1384 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001385 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +01001386 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001387 };
1388
Antonio de Angelis202425a2022-04-06 11:13:15 +01001389 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001390
1391 *output_length = out_vec[0].len;
Antonio de Angelis202425a2022-04-06 11:13:15 +01001392
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001393 return status;
1394}
1395
Maulik Patel28659c42021-01-06 14:09:22 +00001396psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001397 psa_algorithm_t alg,
1398 const uint8_t *input,
1399 size_t input_length,
1400 uint8_t *output,
1401 size_t output_size,
1402 size_t *output_length)
1403{
1404 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001405 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001406 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001407 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001408 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001409 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001410
Antonio de Angelis609f0002021-07-06 16:51:28 +02001411 psa_invec in_vec[] = {
1412 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1413 {.base = input, .len = input_length},
1414 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001415 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +01001416 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001417 };
1418
Antonio de Angelis202425a2022-04-06 11:13:15 +01001419 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001420
1421 *output_length = out_vec[0].len;
Antonio de Angelis202425a2022-04-06 11:13:15 +01001422
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001423 return status;
1424}
1425
1426psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001427 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001428 const uint8_t *peer_key,
1429 size_t peer_key_length,
1430 uint8_t *output,
1431 size_t output_size,
1432 size_t *output_length)
1433{
1434 psa_status_t status;
1435 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001436 .function_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001437 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001438 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001439 };
1440
1441 psa_invec in_vec[] = {
1442 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1443 {.base = peer_key, .len = peer_key_length},
1444 };
1445
1446 psa_outvec out_vec[] = {
1447 {.base = output, .len = output_size},
1448 };
1449
Antonio de Angelis202425a2022-04-06 11:13:15 +01001450 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001451
1452 *output_length = out_vec[0].len;
1453
1454 return status;
1455}
1456
1457psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1458 psa_algorithm_t alg)
1459{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001460 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001461 .function_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001462 .alg = alg,
1463 .op_handle = operation->handle,
1464 };
1465
1466 psa_invec in_vec[] = {
1467 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1468 };
1469 psa_outvec out_vec[] = {
1470 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1471 };
1472
Antonio de Angelis202425a2022-04-06 11:13:15 +01001473 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001474}
1475
1476psa_status_t psa_key_derivation_set_capacity(
1477 psa_key_derivation_operation_t *operation,
1478 size_t capacity)
1479{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001480 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001481 .function_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001482 .capacity = capacity,
1483 .op_handle = operation->handle,
1484 };
1485
1486 psa_invec in_vec[] = {
1487 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1488 };
1489
Antonio de Angelis202425a2022-04-06 11:13:15 +01001490 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001491}
1492
1493psa_status_t psa_key_derivation_input_bytes(
1494 psa_key_derivation_operation_t *operation,
1495 psa_key_derivation_step_t step,
1496 const uint8_t *data,
1497 size_t data_length)
1498{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001499 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001500 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001501 .step = step,
1502 .op_handle = operation->handle,
1503 };
1504
1505 psa_invec in_vec[] = {
1506 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1507 {.base = data, .len = data_length},
1508 };
1509
Antonio de Angelis202425a2022-04-06 11:13:15 +01001510 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001511}
1512
1513psa_status_t psa_key_derivation_output_key(
1514 const psa_key_attributes_t *attributes,
1515 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001516 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001517{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001518 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001519 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001520 .op_handle = operation->handle,
1521 };
1522
1523 psa_invec in_vec[] = {
1524 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1525 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1526 };
1527
1528 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001529 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001530 };
1531
Antonio de Angelis202425a2022-04-06 11:13:15 +01001532 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001533}