blob: cd1f7f5228861d285a40c55aae7053590475d280 [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
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00008#include "tfm_crypto_defs.h"
Jamie Foxcc31d402019-01-28 17:13:52 +00009#include "psa/crypto.h"
Kevin Peng9449a362019-07-29 16:05:42 +080010#include "psa/client.h"
Antonio de Angelis202425a2022-04-06 11:13:15 +010011#include "psa_manifest/sid.h"
12#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 psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, \
16 in_vec, IOVEC_LEN(in_vec), \
17 out_vec, IOVEC_LEN(out_vec))
18#define API_DISPATCH_NO_OUTVEC(in_vec) \
19 psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, \
20 in_vec, IOVEC_LEN(in_vec), \
21 (psa_outvec *)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{
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100113 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;
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100125}
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{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100493 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
Soby Mathew07ef6e42020-07-20 21:09:23 +0100512 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100513}
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
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800705 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000706
Antonio de Angelis4743e672019-04-11 11:38:48 +0100707 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100708 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100709 }
Summer Qinaee07882021-03-29 15:44:27 +0800710 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800711 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000712
713 *ciphertext_length = out_vec[0].len;
714
715 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000716}
717
Maulik Patel28659c42021-01-06 14:09:22 +0000718psa_status_t psa_aead_decrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000719 psa_algorithm_t alg,
720 const uint8_t *nonce,
721 size_t nonce_length,
722 const uint8_t *additional_data,
723 size_t additional_data_length,
724 const uint8_t *ciphertext,
725 size_t ciphertext_length,
726 uint8_t *plaintext,
727 size_t plaintext_size,
728 size_t *plaintext_length)
729{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000730 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100731 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100732 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000733 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100734 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000735 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000736 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100737
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100738 /* Sanitize the optional input */
739 if ((additional_data == NULL) && (additional_data_length != 0)) {
740 return PSA_ERROR_INVALID_ARGUMENT;
741 }
742
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000743 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000744 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000745 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100746 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000747 };
748 psa_outvec out_vec[] = {
749 {.base = plaintext, .len = plaintext_size},
750 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000751
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000752 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
753 return PSA_ERROR_INVALID_ARGUMENT;
754 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000755
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000756 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000757 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100758 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000759 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000760 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000761 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000762
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000763 in_vec[0].base = &iov;
764 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
765
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800766 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000767
Antonio de Angelis4743e672019-04-11 11:38:48 +0100768 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100769 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100770 }
Summer Qinaee07882021-03-29 15:44:27 +0800771 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800772 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000773
774 *plaintext_length = out_vec[0].len;
775
776 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000777}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100778
Antonio de Angelis8d282482021-10-07 15:04:12 +0100779psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
780 psa_key_id_t key,
781 psa_algorithm_t alg)
782{
783 psa_status_t status;
784 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100785 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100786 .key_id = key,
787 .alg = alg,
788 .op_handle = operation->handle,
789 };
790
791 psa_invec in_vec[] = {
792 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
793 };
794 psa_outvec out_vec[] = {
795 {.base = &(operation->handle), .len = sizeof(uint32_t)}
796 };
797
Antonio de Angelis202425a2022-04-06 11:13:15 +0100798 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100799 return status;
800}
801
802psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
803 psa_key_id_t key,
804 psa_algorithm_t alg)
805{
806 psa_status_t status;
807 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100808 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100809 .key_id = key,
810 .alg = alg,
811 .op_handle = operation->handle,
812 };
813
814 psa_invec in_vec[] = {
815 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
816 };
817 psa_outvec out_vec[] = {
818 {.base = &(operation->handle), .len = sizeof(uint32_t)}
819 };
820
Antonio de Angelis202425a2022-04-06 11:13:15 +0100821 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100822 return status;
823}
824
825psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
826 uint8_t *nonce,
827 size_t nonce_size,
828 size_t *nonce_length)
829{
830 psa_status_t status;
831 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100832 .function_id = TFM_CRYPTO_AEAD_GENERATE_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100833 .op_handle = operation->handle,
834 };
835
836 psa_invec in_vec[] = {
837 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
838 };
839 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +0100840 {.base = nonce, .len = nonce_size}
841 };
842
Antonio de Angelis202425a2022-04-06 11:13:15 +0100843 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100844
Antonio de Angelis202425a2022-04-06 11:13:15 +0100845 *nonce_length = out_vec[0].len;
Antonio de Angelis8d282482021-10-07 15:04:12 +0100846 return status;
847}
848
849psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
850 const uint8_t *nonce,
851 size_t nonce_length)
852{
853 psa_status_t status;
854 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100855 .function_id = TFM_CRYPTO_AEAD_SET_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100856 .op_handle = operation->handle,
857 };
858
859 psa_invec in_vec[] = {
860 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
861 {.base = nonce, .len = nonce_length}
862 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100863
Antonio de Angelis202425a2022-04-06 11:13:15 +0100864 status = API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100865 return status;
866}
867
868psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
869 size_t ad_length,
870 size_t plaintext_length)
871{
872 psa_status_t status;
873 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100874 .function_id = TFM_CRYPTO_AEAD_SET_LENGTHS_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100875 .ad_length = ad_length,
876 .plaintext_length = plaintext_length,
877 .op_handle = operation->handle,
878 };
879
880 psa_invec in_vec[] = {
881 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
882 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100883
Antonio de Angelis202425a2022-04-06 11:13:15 +0100884 status = API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100885 return status;
886}
887
888psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
889 const uint8_t *input,
890 size_t input_length)
891{
892 psa_status_t status;
893 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100894 .function_id = TFM_CRYPTO_AEAD_UPDATE_AD_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100895 .op_handle = operation->handle,
896 };
897
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000898 /* Sanitize the optional input */
899 if ((input == NULL) && (input_length != 0)) {
900 return PSA_ERROR_INVALID_ARGUMENT;
901 }
902
Antonio de Angelis8d282482021-10-07 15:04:12 +0100903 psa_invec in_vec[] = {
904 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
905 {.base = input, .len = input_length}
906 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100907
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000908 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000909
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000910 if (input == NULL) {
911 in_len--;
912 }
913 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis202425a2022-04-06 11:13:15 +0100914 NULL, 0);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100915 return status;
916}
917
918psa_status_t psa_aead_update(psa_aead_operation_t *operation,
919 const uint8_t *input,
920 size_t input_length,
921 uint8_t *output,
922 size_t output_size,
923 size_t *output_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_UPDATE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100928 .op_handle = operation->handle,
929 };
930
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000931 /* Sanitize the optional input */
932 if ((input == NULL) && (input_length != 0)) {
933 return PSA_ERROR_INVALID_ARGUMENT;
934 }
935
Antonio de Angelis8d282482021-10-07 15:04:12 +0100936 psa_invec in_vec[] = {
937 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
938 {.base = input, .len = input_length}
939 };
940 psa_outvec out_vec[] = {
Antonio de Angelisc26af632021-10-07 15:04:12 +0100941 {.base = output, .len = output_size},
Antonio de Angelis8d282482021-10-07 15:04:12 +0100942 };
943
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000944 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000945
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000946 if (input == NULL) {
947 in_len--;
948 }
949 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
950 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis8d282482021-10-07 15:04:12 +0100951
Antonio de Angelis202425a2022-04-06 11:13:15 +0100952 *output_length = out_vec[0].len;
Antonio de Angelis8d282482021-10-07 15:04:12 +0100953 return status;
954}
955
956psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
957 uint8_t *ciphertext,
958 size_t ciphertext_size,
959 size_t *ciphertext_length,
960 uint8_t *tag,
961 size_t tag_size,
962 size_t *tag_length)
963{
964 psa_status_t status;
965 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100966 .function_id = TFM_CRYPTO_AEAD_FINISH_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100967 .op_handle = operation->handle,
968 };
969
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000970 /* Sanitize the optional output */
971 if ((ciphertext == NULL) && (ciphertext_size != 0)) {
972 return PSA_ERROR_INVALID_ARGUMENT;
973 }
974
Antonio de Angelis8d282482021-10-07 15:04:12 +0100975 psa_invec in_vec[] = {
976 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
977 };
978 psa_outvec out_vec[] = {
979 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis8d282482021-10-07 15:04:12 +0100980 {.base = tag, .len = tag_size},
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000981 {.base = ciphertext, .len = ciphertext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +0100982 };
983
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000984 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000985
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000986 if (ciphertext == NULL || ciphertext_size == 0) {
987 out_len--;
988 }
989 if ((out_len == 3) && (ciphertext_length == NULL)) {
990 return PSA_ERROR_INVALID_ARGUMENT;
991 }
Antonio de Angelis8d282482021-10-07 15:04:12 +0100992
Antonio de Angelisc26af632021-10-07 15:04:12 +0100993 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
994 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000995 out_vec, out_len);
996
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000997 if (out_len == 3) {
998 *ciphertext_length = out_vec[2].len;
999 } else {
1000 *ciphertext_length = 0;
1001 }
Antonio de Angelis202425a2022-04-06 11:13:15 +01001002
1003 *tag_length = out_vec[1].len;
1004
Antonio de Angelis8d282482021-10-07 15:04:12 +01001005 return status;
1006}
1007
1008psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1009 uint8_t *plaintext,
1010 size_t plaintext_size,
1011 size_t *plaintext_length,
1012 const uint8_t *tag,
1013 size_t tag_length)
1014{
1015 psa_status_t status;
1016 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001017 .function_id = TFM_CRYPTO_AEAD_VERIFY_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001018 .op_handle = operation->handle,
1019 };
1020
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001021 /* Sanitize the optional output */
1022 if ((plaintext == NULL) && (plaintext_size != 0)) {
1023 return PSA_ERROR_INVALID_ARGUMENT;
1024 }
1025
Antonio de Angelis8d282482021-10-07 15:04:12 +01001026 psa_invec in_vec[] = {
1027 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1028 {.base = tag, .len = tag_length}
1029 };
1030 psa_outvec out_vec[] = {
1031 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis202425a2022-04-06 11:13:15 +01001032 {.base = plaintext, .len = plaintext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +01001033 };
1034
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001035 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001036
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001037 if (plaintext == NULL || plaintext_size == 0) {
1038 out_len--;
1039 }
1040 if ((out_len == 2) && (plaintext_length == NULL)) {
1041 return PSA_ERROR_INVALID_ARGUMENT;
1042 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001043
Antonio de Angelisc26af632021-10-07 15:04:12 +01001044 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
1045 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001046 out_vec, out_len);
1047
1048 if (out_len == 2) {
1049 *plaintext_length = out_vec[1].len;
1050 } else {
1051 *plaintext_length = 0;
1052 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001053 return status;
1054}
1055
1056psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1057{
Antonio de Angelis8d282482021-10-07 15:04:12 +01001058 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001059 .function_id = TFM_CRYPTO_AEAD_ABORT_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001060 .op_handle = operation->handle,
1061 };
1062
1063 psa_invec in_vec[] = {
1064 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1065 };
1066 psa_outvec out_vec[] = {
1067 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1068 };
1069
Antonio de Angelis202425a2022-04-06 11:13:15 +01001070 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +01001071}
1072
Summer Qinb9492d22021-06-22 18:00:54 +08001073psa_status_t psa_sign_message(psa_key_id_t key,
1074 psa_algorithm_t alg,
1075 const uint8_t *input,
1076 size_t input_length,
1077 uint8_t *signature,
1078 size_t signature_size,
1079 size_t *signature_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001080{
Summer Qinb9492d22021-06-22 18:00:54 +08001081 psa_status_t status;
1082 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001083 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001084 .key_id = key,
1085 .alg = alg,
1086 };
1087
1088 psa_invec in_vec[] = {
1089 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1090 {.base = input, .len = input_length},
1091 };
1092 psa_outvec out_vec[] = {
1093 {.base = signature, .len = signature_size},
1094 };
1095
Antonio de Angelis202425a2022-04-06 11:13:15 +01001096 status = API_DISPATCH(in_vec, out_vec);
Summer Qinb9492d22021-06-22 18:00:54 +08001097
Antonio de Angelisf83a2082021-08-20 22:13:53 +01001098 *signature_length = out_vec[0].len;
Summer Qinb9492d22021-06-22 18:00:54 +08001099 return status;
1100}
1101
1102psa_status_t psa_verify_message(psa_key_id_t key,
1103 psa_algorithm_t alg,
1104 const uint8_t *input,
1105 size_t input_length,
1106 const uint8_t *signature,
1107 size_t signature_length)
1108{
Summer Qinb9492d22021-06-22 18:00:54 +08001109 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001110 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001111 .key_id = key,
1112 .alg = alg
1113 };
1114
1115 psa_invec in_vec[] = {
1116 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1117 {.base = input, .len = input_length},
1118 {.base = signature, .len = signature_length}
1119 };
1120
Antonio de Angelis202425a2022-04-06 11:13:15 +01001121 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001122}
1123
Maulik Patel28659c42021-01-06 14:09:22 +00001124psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001125 psa_algorithm_t alg,
1126 const uint8_t *hash,
1127 size_t hash_length,
1128 uint8_t *signature,
1129 size_t signature_size,
1130 size_t *signature_length)
1131{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001132 psa_status_t status;
1133 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001134 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001135 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001136 .alg = alg,
1137 };
1138
1139 psa_invec in_vec[] = {
1140 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1141 {.base = hash, .len = hash_length},
1142 };
1143 psa_outvec out_vec[] = {
1144 {.base = signature, .len = signature_size},
1145 };
1146
Antonio de Angelis202425a2022-04-06 11:13:15 +01001147 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001148
1149 *signature_length = out_vec[0].len;
1150
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001151 return status;
1152}
1153
Maulik Patel28659c42021-01-06 14:09:22 +00001154psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001155 psa_algorithm_t alg,
1156 const uint8_t *hash,
1157 size_t hash_length,
1158 const uint8_t *signature,
1159 size_t signature_length)
1160{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001161 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001162 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001163 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001164 .alg = alg
1165 };
1166
1167 psa_invec in_vec[] = {
1168 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1169 {.base = hash, .len = hash_length},
1170 {.base = signature, .len = signature_length}
1171 };
1172
Antonio de Angelis202425a2022-04-06 11:13:15 +01001173 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001174}
1175
Maulik Patel28659c42021-01-06 14:09:22 +00001176psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001177 psa_algorithm_t alg,
1178 const uint8_t *input,
1179 size_t input_length,
1180 const uint8_t *salt,
1181 size_t salt_length,
1182 uint8_t *output,
1183 size_t output_size,
1184 size_t *output_length)
1185{
1186 psa_status_t status;
1187 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001188 .function_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001189 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001190 .alg = alg
1191 };
1192
1193 /* Sanitize the optional input */
1194 if ((salt == NULL) && (salt_length != 0)) {
1195 return PSA_ERROR_INVALID_ARGUMENT;
1196 }
1197
1198 psa_invec in_vec[] = {
1199 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1200 {.base = input, .len = input_length},
1201 {.base = salt, .len = salt_length}
1202 };
1203
1204 psa_outvec out_vec[] = {
1205 {.base = output, .len = output_size},
1206 };
1207
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001208 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001209
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001210 if (salt == NULL) {
1211 in_len--;
1212 }
Summer Qinaee07882021-03-29 15:44:27 +08001213 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001214 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001215
1216 *output_length = out_vec[0].len;
1217
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001218 return status;
1219}
1220
Maulik Patel28659c42021-01-06 14:09:22 +00001221psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001222 psa_algorithm_t alg,
1223 const uint8_t *input,
1224 size_t input_length,
1225 const uint8_t *salt,
1226 size_t salt_length,
1227 uint8_t *output,
1228 size_t output_size,
1229 size_t *output_length)
1230{
1231 psa_status_t status;
1232 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001233 .function_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001234 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001235 .alg = alg
1236 };
1237
1238 /* Sanitize the optional input */
1239 if ((salt == NULL) && (salt_length != 0)) {
1240 return PSA_ERROR_INVALID_ARGUMENT;
1241 }
1242
1243 psa_invec in_vec[] = {
1244 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1245 {.base = input, .len = input_length},
1246 {.base = salt, .len = salt_length}
1247 };
1248
1249 psa_outvec out_vec[] = {
1250 {.base = output, .len = output_size},
1251 };
1252
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001253 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001254
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001255 if (salt == NULL) {
1256 in_len--;
1257 }
Summer Qinaee07882021-03-29 15:44:27 +08001258 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001259 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001260
1261 *output_length = out_vec[0].len;
1262
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001263 return status;
1264}
1265
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001266psa_status_t psa_key_derivation_get_capacity(
1267 const psa_key_derivation_operation_t *operation,
1268 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001269{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001270 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001271 .function_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001272 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001273 };
1274
1275 psa_invec in_vec[] = {
1276 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1277 };
1278
1279 psa_outvec out_vec[] = {
1280 {.base = capacity, .len = sizeof(size_t)},
1281 };
1282
Antonio de Angelis202425a2022-04-06 11:13:15 +01001283 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001284}
1285
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001286psa_status_t psa_key_derivation_output_bytes(
1287 psa_key_derivation_operation_t *operation,
1288 uint8_t *output,
1289 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001290{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001291 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001292 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001293 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001294 };
1295
1296 psa_invec in_vec[] = {
1297 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1298 };
1299
1300 psa_outvec out_vec[] = {
1301 {.base = output, .len = output_length},
1302 };
1303
Antonio de Angelis202425a2022-04-06 11:13:15 +01001304 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001305}
1306
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001307psa_status_t psa_key_derivation_input_key(
1308 psa_key_derivation_operation_t *operation,
1309 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001310 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001311{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001312 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001313 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001314 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001315 .step = step,
1316 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001317 };
1318
1319 psa_invec in_vec[] = {
1320 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001321 };
1322
Antonio de Angelis202425a2022-04-06 11:13:15 +01001323 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001324}
1325
Antonio de Angelis8d282482021-10-07 15:04:12 +01001326psa_status_t psa_key_derivation_abort(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001327{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001328 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001329 .function_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001330 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001331 };
1332
1333 psa_invec in_vec[] = {
1334 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1335 };
1336
1337 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001338 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001339 };
1340
Antonio de Angelis202425a2022-04-06 11:13:15 +01001341 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001342}
1343
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001344psa_status_t psa_key_derivation_key_agreement(
1345 psa_key_derivation_operation_t *operation,
1346 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001347 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001348 const uint8_t *peer_key,
1349 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001350{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001351 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001352 .function_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001353 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001354 .step = step,
1355 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001356 };
1357
1358 psa_invec in_vec[] = {
1359 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1360 {.base = peer_key, .len = peer_key_length},
1361 };
1362
Antonio de Angelis202425a2022-04-06 11:13:15 +01001363 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001364}
1365
1366psa_status_t psa_generate_random(uint8_t *output,
1367 size_t output_size)
1368{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001369 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001370 .function_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001371 };
1372
1373 psa_invec in_vec[] = {
1374 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1375 };
1376
1377 psa_outvec out_vec[] = {
1378 {.base = output, .len = output_size},
1379 };
1380
1381 if (output_size == 0) {
1382 return PSA_SUCCESS;
1383 }
1384
Antonio de Angelis202425a2022-04-06 11:13:15 +01001385 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001386}
1387
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001388psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001389 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001390{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001391 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001392 .function_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001393 };
1394
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001395 psa_invec in_vec[] = {
1396 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001397 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1398 };
1399
1400 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001401 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001402 };
1403
Antonio de Angelis202425a2022-04-06 11:13:15 +01001404 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001405}
1406
Maulik Patel28659c42021-01-06 14:09:22 +00001407psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001408 psa_algorithm_t alg,
1409 const uint8_t *input,
1410 size_t input_length,
1411 uint8_t *mac,
1412 size_t mac_size,
1413 size_t *mac_length)
1414{
1415 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001416 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001417 .function_id = TFM_CRYPTO_MAC_COMPUTE_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001418 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001419 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001420 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001421
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001422 psa_invec in_vec[] = {
1423 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Summer Qin045ec4a2021-07-07 14:28:04 +08001424 {.base = input, .len = input_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001425 };
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001426 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001427 {.base = mac, .len = mac_size},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001428 };
1429
Antonio de Angelis202425a2022-04-06 11:13:15 +01001430 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001431
1432 *mac_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001433 return status;
1434}
1435
Maulik Patel28659c42021-01-06 14:09:22 +00001436psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001437 psa_algorithm_t alg,
1438 const uint8_t *input,
1439 size_t input_length,
1440 const uint8_t *mac,
1441 const size_t mac_length)
1442{
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001443 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001444 .function_id = TFM_CRYPTO_MAC_VERIFY_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001445 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001446 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001447 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001448
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001449 psa_invec in_vec[] = {
1450 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1451 {.base = input, .len = input_length},
Summer Qin045ec4a2021-07-07 14:28:04 +08001452 {.base = mac, .len = mac_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001453 };
1454
Antonio de Angelis202425a2022-04-06 11:13:15 +01001455 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001456}
1457
Maulik Patel28659c42021-01-06 14:09:22 +00001458psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001459 psa_algorithm_t alg,
1460 const uint8_t *input,
1461 size_t input_length,
1462 uint8_t *output,
1463 size_t output_size,
1464 size_t *output_length)
1465{
1466 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001467 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001468 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001469 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001470 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001471 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001472
Antonio de Angelis609f0002021-07-06 16:51:28 +02001473 psa_invec in_vec[] = {
1474 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1475 {.base = input, .len = input_length},
1476 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001477 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001478 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001479 };
1480
Antonio de Angelis202425a2022-04-06 11:13:15 +01001481 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001482
1483 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001484 return status;
1485}
1486
Maulik Patel28659c42021-01-06 14:09:22 +00001487psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001488 psa_algorithm_t alg,
1489 const uint8_t *input,
1490 size_t input_length,
1491 uint8_t *output,
1492 size_t output_size,
1493 size_t *output_length)
1494{
1495 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001496 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001497 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001498 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001499 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001500 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001501
Antonio de Angelis609f0002021-07-06 16:51:28 +02001502 psa_invec in_vec[] = {
1503 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1504 {.base = input, .len = input_length},
1505 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001506 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001507 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001508 };
1509
Antonio de Angelis202425a2022-04-06 11:13:15 +01001510 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001511
1512 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001513 return status;
1514}
1515
1516psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001517 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001518 const uint8_t *peer_key,
1519 size_t peer_key_length,
1520 uint8_t *output,
1521 size_t output_size,
1522 size_t *output_length)
1523{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001524 psa_status_t status;
1525 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001526 .function_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001527 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001528 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001529 };
1530
1531 psa_invec in_vec[] = {
1532 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1533 {.base = peer_key, .len = peer_key_length},
1534 };
1535
1536 psa_outvec out_vec[] = {
1537 {.base = output, .len = output_size},
1538 };
1539
Antonio de Angelis202425a2022-04-06 11:13:15 +01001540 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001541
1542 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001543
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001544 return status;
1545}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001546
1547psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1548 psa_algorithm_t alg)
1549{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001550 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001551 .function_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001552 .alg = alg,
1553 .op_handle = operation->handle,
1554 };
1555
1556 psa_invec in_vec[] = {
1557 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1558 };
1559 psa_outvec out_vec[] = {
1560 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1561 };
1562
Antonio de Angelis202425a2022-04-06 11:13:15 +01001563 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001564}
1565
1566psa_status_t psa_key_derivation_set_capacity(
1567 psa_key_derivation_operation_t *operation,
1568 size_t capacity)
1569{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001570 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001571 .function_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001572 .capacity = capacity,
1573 .op_handle = operation->handle,
1574 };
1575
1576 psa_invec in_vec[] = {
1577 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1578 };
1579
Antonio de Angelis202425a2022-04-06 11:13:15 +01001580 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001581}
1582
1583psa_status_t psa_key_derivation_input_bytes(
1584 psa_key_derivation_operation_t *operation,
1585 psa_key_derivation_step_t step,
1586 const uint8_t *data,
1587 size_t data_length)
1588{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001589 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001590 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001591 .step = step,
1592 .op_handle = operation->handle,
1593 };
1594
1595 psa_invec in_vec[] = {
1596 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1597 {.base = data, .len = data_length},
1598 };
1599
Antonio de Angelis202425a2022-04-06 11:13:15 +01001600 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001601}
1602
1603psa_status_t psa_key_derivation_output_key(
1604 const psa_key_attributes_t *attributes,
1605 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001606 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001607{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001608 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001609 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001610 .op_handle = operation->handle,
1611 };
1612
1613 psa_invec in_vec[] = {
1614 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1615 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1616 };
1617
1618 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001619 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001620 };
1621
Antonio de Angelis202425a2022-04-06 11:13:15 +01001622 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001623}