blob: 833e9480074f543db8ec2ea1d24a505c7641c967 [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 Angelis04debbd2019-10-14 12:12:52 +0100472 if (target_operation && (target_operation->handle != 0)) {
473 return PSA_ERROR_BAD_STATE;
474 }
475
David Huc9679cc2022-06-21 13:09:34 +0800476 psa_invec in_vec[] = {
477 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
478 {.base = &(target_operation->handle),
479 .len = sizeof(target_operation->handle)},
480 };
481 psa_outvec out_vec[] = {
482 {.base = &(target_operation->handle),
483 .len = sizeof(target_operation->handle)},
484 };
485
Antonio de Angelis202425a2022-04-06 11:13:15 +0100486 return API_DISPATCH(in_vec, out_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100487}
488
Soby Mathew07ef6e42020-07-20 21:09:23 +0100489psa_status_t psa_hash_compute(psa_algorithm_t alg,
490 const uint8_t *input,
491 size_t input_length,
492 uint8_t *hash,
493 size_t hash_size,
494 size_t *hash_length)
495{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100496 psa_status_t status;
497 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100498 .function_id = TFM_CRYPTO_HASH_COMPUTE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100499 .alg = alg,
500 };
501
502 psa_invec in_vec[] = {
503 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
504 {.base = input, .len = input_length},
505 };
506
507 psa_outvec out_vec[] = {
508 {.base = hash, .len = hash_size}
509 };
510
Antonio de Angelis202425a2022-04-06 11:13:15 +0100511 status = API_DISPATCH(in_vec, out_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100512
513 *hash_length = out_vec[0].len;
514
Soby Mathew07ef6e42020-07-20 21:09:23 +0100515 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100516}
517
518psa_status_t psa_hash_compare(psa_algorithm_t alg,
519 const uint8_t *input,
520 size_t input_length,
521 const uint8_t *hash,
522 size_t hash_length)
523{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100524 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100525 .function_id = TFM_CRYPTO_HASH_COMPARE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100526 .alg = alg,
527 };
528
529 psa_invec in_vec[] = {
530 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
531 {.base = input, .len = input_length},
532 {.base = hash, .len = hash_length},
533 };
534
Antonio de Angelis202425a2022-04-06 11:13:15 +0100535 return API_DISPATCH_NO_OUTVEC(in_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100536}
537
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100538psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000539 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100540 psa_algorithm_t alg)
541{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100542 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100543 .function_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000544 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100545 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100546 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000547 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100548
Antonio de Angelis4743e672019-04-11 11:38:48 +0100549 psa_invec in_vec[] = {
550 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
551 };
552 psa_outvec out_vec[] = {
553 {.base = &(operation->handle), .len = sizeof(uint32_t)},
554 };
555
Antonio de Angelis202425a2022-04-06 11:13:15 +0100556 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100557}
558
559psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000560 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100561 psa_algorithm_t alg)
562{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100563 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100564 .function_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000565 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100566 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100567 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000568 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100569
Antonio de Angelis4743e672019-04-11 11:38:48 +0100570 psa_invec in_vec[] = {
571 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
572 };
573 psa_outvec out_vec[] = {
574 {.base = &(operation->handle), .len = sizeof(uint32_t)},
575 };
576
Antonio de Angelis202425a2022-04-06 11:13:15 +0100577 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100578}
579
580psa_status_t psa_mac_update(psa_mac_operation_t *operation,
581 const uint8_t *input,
582 size_t input_length)
583{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100584 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100585 .function_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100586 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100587 };
588
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000589 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100590 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000591 {.base = input, .len = input_length},
592 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100593
Antonio de Angelis202425a2022-04-06 11:13:15 +0100594 return API_DISPATCH_NO_OUTVEC(in_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100595}
596
597psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
598 uint8_t *mac,
599 size_t mac_size,
600 size_t *mac_length)
601{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000602 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100603 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100604 .function_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100605 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100606 };
607
608 psa_invec in_vec[] = {
609 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
610 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000611 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100612 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000613 {.base = mac, .len = mac_size},
614 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100615
Antonio de Angelis202425a2022-04-06 11:13:15 +0100616 status = API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100617
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000618 *mac_length = out_vec[1].len;
619
620 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100621}
622
623psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
624 const uint8_t *mac,
625 size_t mac_length)
626{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100627 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100628 .function_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100629 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100630 };
631
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000632 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100633 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000634 {.base = mac, .len = mac_length},
635 };
636 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100637 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000638 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100639
Antonio de Angelis202425a2022-04-06 11:13:15 +0100640 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100641}
642
643psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
644{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100645 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100646 .function_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100647 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000648 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100649
Antonio de Angelis4743e672019-04-11 11:38:48 +0100650 psa_invec in_vec[] = {
651 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
652 };
653 psa_outvec out_vec[] = {
654 {.base = &(operation->handle), .len = sizeof(uint32_t)},
655 };
656
Antonio de Angelis202425a2022-04-06 11:13:15 +0100657 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100658}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000659
Maulik Patel28659c42021-01-06 14:09:22 +0000660psa_status_t psa_aead_encrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000661 psa_algorithm_t alg,
662 const uint8_t *nonce,
663 size_t nonce_length,
664 const uint8_t *additional_data,
665 size_t additional_data_length,
666 const uint8_t *plaintext,
667 size_t plaintext_length,
668 uint8_t *ciphertext,
669 size_t ciphertext_size,
670 size_t *ciphertext_length)
671{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000672 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100673 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100674 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000675 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100676 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000677 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000678 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100679
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100680 /* Sanitize the optional input */
681 if ((additional_data == NULL) && (additional_data_length != 0)) {
682 return PSA_ERROR_INVALID_ARGUMENT;
683 }
684
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000685 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000686 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000687 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100688 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000689 };
690 psa_outvec out_vec[] = {
691 {.base = ciphertext, .len = ciphertext_size},
692 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000693
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000694 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
695 return PSA_ERROR_INVALID_ARGUMENT;
696 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000697
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000698 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000699 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100700 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000701 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000702 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000703 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000704
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000705 in_vec[0].base = &iov;
706 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
707
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800708 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000709
Antonio de Angelis4743e672019-04-11 11:38:48 +0100710 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100711 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100712 }
Summer Qinaee07882021-03-29 15:44:27 +0800713 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800714 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000715
716 *ciphertext_length = out_vec[0].len;
717
718 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000719}
720
Maulik Patel28659c42021-01-06 14:09:22 +0000721psa_status_t psa_aead_decrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000722 psa_algorithm_t alg,
723 const uint8_t *nonce,
724 size_t nonce_length,
725 const uint8_t *additional_data,
726 size_t additional_data_length,
727 const uint8_t *ciphertext,
728 size_t ciphertext_length,
729 uint8_t *plaintext,
730 size_t plaintext_size,
731 size_t *plaintext_length)
732{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000733 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100734 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100735 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000736 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100737 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000738 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000739 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100740
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100741 /* Sanitize the optional input */
742 if ((additional_data == NULL) && (additional_data_length != 0)) {
743 return PSA_ERROR_INVALID_ARGUMENT;
744 }
745
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000746 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000747 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000748 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100749 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000750 };
751 psa_outvec out_vec[] = {
752 {.base = plaintext, .len = plaintext_size},
753 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000754
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000755 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
756 return PSA_ERROR_INVALID_ARGUMENT;
757 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000758
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000759 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000760 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100761 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000762 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000763 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000764 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000765
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000766 in_vec[0].base = &iov;
767 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
768
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800769 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000770
Antonio de Angelis4743e672019-04-11 11:38:48 +0100771 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100772 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100773 }
Summer Qinaee07882021-03-29 15:44:27 +0800774 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800775 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000776
777 *plaintext_length = out_vec[0].len;
778
779 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000780}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100781
Antonio de Angelis8d282482021-10-07 15:04:12 +0100782psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
783 psa_key_id_t key,
784 psa_algorithm_t alg)
785{
786 psa_status_t status;
787 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100788 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100789 .key_id = key,
790 .alg = alg,
791 .op_handle = operation->handle,
792 };
793
794 psa_invec in_vec[] = {
795 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
796 };
797 psa_outvec out_vec[] = {
798 {.base = &(operation->handle), .len = sizeof(uint32_t)}
799 };
800
Antonio de Angelis202425a2022-04-06 11:13:15 +0100801 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100802 return status;
803}
804
805psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
806 psa_key_id_t key,
807 psa_algorithm_t alg)
808{
809 psa_status_t status;
810 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100811 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100812 .key_id = key,
813 .alg = alg,
814 .op_handle = operation->handle,
815 };
816
817 psa_invec in_vec[] = {
818 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
819 };
820 psa_outvec out_vec[] = {
821 {.base = &(operation->handle), .len = sizeof(uint32_t)}
822 };
823
Antonio de Angelis202425a2022-04-06 11:13:15 +0100824 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100825 return status;
826}
827
828psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
829 uint8_t *nonce,
830 size_t nonce_size,
831 size_t *nonce_length)
832{
833 psa_status_t status;
834 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100835 .function_id = TFM_CRYPTO_AEAD_GENERATE_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100836 .op_handle = operation->handle,
837 };
838
839 psa_invec in_vec[] = {
840 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
841 };
842 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +0100843 {.base = nonce, .len = nonce_size}
844 };
845
Antonio de Angelis202425a2022-04-06 11:13:15 +0100846 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100847
Antonio de Angelis202425a2022-04-06 11:13:15 +0100848 *nonce_length = out_vec[0].len;
Antonio de Angelis8d282482021-10-07 15:04:12 +0100849 return status;
850}
851
852psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
853 const uint8_t *nonce,
854 size_t nonce_length)
855{
856 psa_status_t status;
857 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100858 .function_id = TFM_CRYPTO_AEAD_SET_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100859 .op_handle = operation->handle,
860 };
861
862 psa_invec in_vec[] = {
863 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
864 {.base = nonce, .len = nonce_length}
865 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100866
Antonio de Angelis202425a2022-04-06 11:13:15 +0100867 status = API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100868 return status;
869}
870
871psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
872 size_t ad_length,
873 size_t plaintext_length)
874{
875 psa_status_t status;
876 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100877 .function_id = TFM_CRYPTO_AEAD_SET_LENGTHS_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100878 .ad_length = ad_length,
879 .plaintext_length = plaintext_length,
880 .op_handle = operation->handle,
881 };
882
883 psa_invec in_vec[] = {
884 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
885 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100886
Antonio de Angelis202425a2022-04-06 11:13:15 +0100887 status = API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100888 return status;
889}
890
891psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
892 const uint8_t *input,
893 size_t input_length)
894{
895 psa_status_t status;
896 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100897 .function_id = TFM_CRYPTO_AEAD_UPDATE_AD_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100898 .op_handle = operation->handle,
899 };
900
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000901 /* Sanitize the optional input */
902 if ((input == NULL) && (input_length != 0)) {
903 return PSA_ERROR_INVALID_ARGUMENT;
904 }
905
Antonio de Angelis8d282482021-10-07 15:04:12 +0100906 psa_invec in_vec[] = {
907 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
908 {.base = input, .len = input_length}
909 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100910
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000911 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000912
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000913 if (input == NULL) {
914 in_len--;
915 }
916 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis202425a2022-04-06 11:13:15 +0100917 NULL, 0);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100918 return status;
919}
920
921psa_status_t psa_aead_update(psa_aead_operation_t *operation,
922 const uint8_t *input,
923 size_t input_length,
924 uint8_t *output,
925 size_t output_size,
926 size_t *output_length)
927{
928 psa_status_t status;
929 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100930 .function_id = TFM_CRYPTO_AEAD_UPDATE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100931 .op_handle = operation->handle,
932 };
933
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000934 /* Sanitize the optional input */
935 if ((input == NULL) && (input_length != 0)) {
936 return PSA_ERROR_INVALID_ARGUMENT;
937 }
938
Antonio de Angelis8d282482021-10-07 15:04:12 +0100939 psa_invec in_vec[] = {
940 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
941 {.base = input, .len = input_length}
942 };
943 psa_outvec out_vec[] = {
Antonio de Angelisc26af632021-10-07 15:04:12 +0100944 {.base = output, .len = output_size},
Antonio de Angelis8d282482021-10-07 15:04:12 +0100945 };
946
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000947 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000948
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000949 if (input == NULL) {
950 in_len--;
951 }
952 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
953 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis8d282482021-10-07 15:04:12 +0100954
Antonio de Angelis202425a2022-04-06 11:13:15 +0100955 *output_length = out_vec[0].len;
Antonio de Angelis8d282482021-10-07 15:04:12 +0100956 return status;
957}
958
959psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
960 uint8_t *ciphertext,
961 size_t ciphertext_size,
962 size_t *ciphertext_length,
963 uint8_t *tag,
964 size_t tag_size,
965 size_t *tag_length)
966{
967 psa_status_t status;
968 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100969 .function_id = TFM_CRYPTO_AEAD_FINISH_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100970 .op_handle = operation->handle,
971 };
972
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000973 /* Sanitize the optional output */
974 if ((ciphertext == NULL) && (ciphertext_size != 0)) {
975 return PSA_ERROR_INVALID_ARGUMENT;
976 }
977
Antonio de Angelis8d282482021-10-07 15:04:12 +0100978 psa_invec in_vec[] = {
979 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
980 };
981 psa_outvec out_vec[] = {
982 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis8d282482021-10-07 15:04:12 +0100983 {.base = tag, .len = tag_size},
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000984 {.base = ciphertext, .len = ciphertext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +0100985 };
986
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000987 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000988
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000989 if (ciphertext == NULL || ciphertext_size == 0) {
990 out_len--;
991 }
992 if ((out_len == 3) && (ciphertext_length == NULL)) {
993 return PSA_ERROR_INVALID_ARGUMENT;
994 }
Antonio de Angelis8d282482021-10-07 15:04:12 +0100995
Antonio de Angelisc26af632021-10-07 15:04:12 +0100996 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
997 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000998 out_vec, out_len);
999
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001000 if (out_len == 3) {
1001 *ciphertext_length = out_vec[2].len;
1002 } else {
1003 *ciphertext_length = 0;
1004 }
Antonio de Angelis202425a2022-04-06 11:13:15 +01001005
1006 *tag_length = out_vec[1].len;
1007
Antonio de Angelis8d282482021-10-07 15:04:12 +01001008 return status;
1009}
1010
1011psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1012 uint8_t *plaintext,
1013 size_t plaintext_size,
1014 size_t *plaintext_length,
1015 const uint8_t *tag,
1016 size_t tag_length)
1017{
1018 psa_status_t status;
1019 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001020 .function_id = TFM_CRYPTO_AEAD_VERIFY_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001021 .op_handle = operation->handle,
1022 };
1023
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001024 /* Sanitize the optional output */
1025 if ((plaintext == NULL) && (plaintext_size != 0)) {
1026 return PSA_ERROR_INVALID_ARGUMENT;
1027 }
1028
Antonio de Angelis8d282482021-10-07 15:04:12 +01001029 psa_invec in_vec[] = {
1030 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1031 {.base = tag, .len = tag_length}
1032 };
1033 psa_outvec out_vec[] = {
1034 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis202425a2022-04-06 11:13:15 +01001035 {.base = plaintext, .len = plaintext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +01001036 };
1037
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001038 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001039
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001040 if (plaintext == NULL || plaintext_size == 0) {
1041 out_len--;
1042 }
1043 if ((out_len == 2) && (plaintext_length == NULL)) {
1044 return PSA_ERROR_INVALID_ARGUMENT;
1045 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001046
Antonio de Angelisc26af632021-10-07 15:04:12 +01001047 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
1048 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001049 out_vec, out_len);
1050
1051 if (out_len == 2) {
1052 *plaintext_length = out_vec[1].len;
1053 } else {
1054 *plaintext_length = 0;
1055 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001056 return status;
1057}
1058
1059psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1060{
Antonio de Angelis8d282482021-10-07 15:04:12 +01001061 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001062 .function_id = TFM_CRYPTO_AEAD_ABORT_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001063 .op_handle = operation->handle,
1064 };
1065
1066 psa_invec in_vec[] = {
1067 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1068 };
1069 psa_outvec out_vec[] = {
1070 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1071 };
1072
Antonio de Angelis202425a2022-04-06 11:13:15 +01001073 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +01001074}
1075
Summer Qinb9492d22021-06-22 18:00:54 +08001076psa_status_t psa_sign_message(psa_key_id_t key,
1077 psa_algorithm_t alg,
1078 const uint8_t *input,
1079 size_t input_length,
1080 uint8_t *signature,
1081 size_t signature_size,
1082 size_t *signature_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001083{
Summer Qinb9492d22021-06-22 18:00:54 +08001084 psa_status_t status;
1085 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001086 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001087 .key_id = key,
1088 .alg = alg,
1089 };
1090
1091 psa_invec in_vec[] = {
1092 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1093 {.base = input, .len = input_length},
1094 };
1095 psa_outvec out_vec[] = {
1096 {.base = signature, .len = signature_size},
1097 };
1098
Antonio de Angelis202425a2022-04-06 11:13:15 +01001099 status = API_DISPATCH(in_vec, out_vec);
Summer Qinb9492d22021-06-22 18:00:54 +08001100
Antonio de Angelisf83a2082021-08-20 22:13:53 +01001101 *signature_length = out_vec[0].len;
Summer Qinb9492d22021-06-22 18:00:54 +08001102 return status;
1103}
1104
1105psa_status_t psa_verify_message(psa_key_id_t key,
1106 psa_algorithm_t alg,
1107 const uint8_t *input,
1108 size_t input_length,
1109 const uint8_t *signature,
1110 size_t signature_length)
1111{
Summer Qinb9492d22021-06-22 18:00:54 +08001112 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001113 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001114 .key_id = key,
1115 .alg = alg
1116 };
1117
1118 psa_invec in_vec[] = {
1119 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1120 {.base = input, .len = input_length},
1121 {.base = signature, .len = signature_length}
1122 };
1123
Antonio de Angelis202425a2022-04-06 11:13:15 +01001124 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001125}
1126
Maulik Patel28659c42021-01-06 14:09:22 +00001127psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001128 psa_algorithm_t alg,
1129 const uint8_t *hash,
1130 size_t hash_length,
1131 uint8_t *signature,
1132 size_t signature_size,
1133 size_t *signature_length)
1134{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001135 psa_status_t status;
1136 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001137 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001138 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001139 .alg = alg,
1140 };
1141
1142 psa_invec in_vec[] = {
1143 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1144 {.base = hash, .len = hash_length},
1145 };
1146 psa_outvec out_vec[] = {
1147 {.base = signature, .len = signature_size},
1148 };
1149
Antonio de Angelis202425a2022-04-06 11:13:15 +01001150 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001151
1152 *signature_length = out_vec[0].len;
1153
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001154 return status;
1155}
1156
Maulik Patel28659c42021-01-06 14:09:22 +00001157psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001158 psa_algorithm_t alg,
1159 const uint8_t *hash,
1160 size_t hash_length,
1161 const uint8_t *signature,
1162 size_t signature_length)
1163{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001164 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001165 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001166 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001167 .alg = alg
1168 };
1169
1170 psa_invec in_vec[] = {
1171 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1172 {.base = hash, .len = hash_length},
1173 {.base = signature, .len = signature_length}
1174 };
1175
Antonio de Angelis202425a2022-04-06 11:13:15 +01001176 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001177}
1178
Maulik Patel28659c42021-01-06 14:09:22 +00001179psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001180 psa_algorithm_t alg,
1181 const uint8_t *input,
1182 size_t input_length,
1183 const uint8_t *salt,
1184 size_t salt_length,
1185 uint8_t *output,
1186 size_t output_size,
1187 size_t *output_length)
1188{
1189 psa_status_t status;
1190 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001191 .function_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001192 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001193 .alg = alg
1194 };
1195
1196 /* Sanitize the optional input */
1197 if ((salt == NULL) && (salt_length != 0)) {
1198 return PSA_ERROR_INVALID_ARGUMENT;
1199 }
1200
1201 psa_invec in_vec[] = {
1202 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1203 {.base = input, .len = input_length},
1204 {.base = salt, .len = salt_length}
1205 };
1206
1207 psa_outvec out_vec[] = {
1208 {.base = output, .len = output_size},
1209 };
1210
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001211 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001212
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001213 if (salt == NULL) {
1214 in_len--;
1215 }
Summer Qinaee07882021-03-29 15:44:27 +08001216 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001217 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001218
1219 *output_length = out_vec[0].len;
1220
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001221 return status;
1222}
1223
Maulik Patel28659c42021-01-06 14:09:22 +00001224psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001225 psa_algorithm_t alg,
1226 const uint8_t *input,
1227 size_t input_length,
1228 const uint8_t *salt,
1229 size_t salt_length,
1230 uint8_t *output,
1231 size_t output_size,
1232 size_t *output_length)
1233{
1234 psa_status_t status;
1235 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001236 .function_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001237 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001238 .alg = alg
1239 };
1240
1241 /* Sanitize the optional input */
1242 if ((salt == NULL) && (salt_length != 0)) {
1243 return PSA_ERROR_INVALID_ARGUMENT;
1244 }
1245
1246 psa_invec in_vec[] = {
1247 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1248 {.base = input, .len = input_length},
1249 {.base = salt, .len = salt_length}
1250 };
1251
1252 psa_outvec out_vec[] = {
1253 {.base = output, .len = output_size},
1254 };
1255
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001256 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001257
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001258 if (salt == NULL) {
1259 in_len--;
1260 }
Summer Qinaee07882021-03-29 15:44:27 +08001261 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001262 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001263
1264 *output_length = out_vec[0].len;
1265
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001266 return status;
1267}
1268
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001269psa_status_t psa_key_derivation_get_capacity(
1270 const psa_key_derivation_operation_t *operation,
1271 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001272{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001273 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001274 .function_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001275 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001276 };
1277
1278 psa_invec in_vec[] = {
1279 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1280 };
1281
1282 psa_outvec out_vec[] = {
1283 {.base = capacity, .len = sizeof(size_t)},
1284 };
1285
Antonio de Angelis202425a2022-04-06 11:13:15 +01001286 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001287}
1288
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001289psa_status_t psa_key_derivation_output_bytes(
1290 psa_key_derivation_operation_t *operation,
1291 uint8_t *output,
1292 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001293{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001294 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001295 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001296 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001297 };
1298
1299 psa_invec in_vec[] = {
1300 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1301 };
1302
1303 psa_outvec out_vec[] = {
1304 {.base = output, .len = output_length},
1305 };
1306
Antonio de Angelis202425a2022-04-06 11:13:15 +01001307 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001308}
1309
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001310psa_status_t psa_key_derivation_input_key(
1311 psa_key_derivation_operation_t *operation,
1312 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001313 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001314{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001315 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001316 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001317 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001318 .step = step,
1319 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001320 };
1321
1322 psa_invec in_vec[] = {
1323 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001324 };
1325
Antonio de Angelis202425a2022-04-06 11:13:15 +01001326 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001327}
1328
Antonio de Angelis8d282482021-10-07 15:04:12 +01001329psa_status_t psa_key_derivation_abort(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001330{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001331 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001332 .function_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001333 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001334 };
1335
1336 psa_invec in_vec[] = {
1337 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1338 };
1339
1340 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001341 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001342 };
1343
Antonio de Angelis202425a2022-04-06 11:13:15 +01001344 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001345}
1346
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001347psa_status_t psa_key_derivation_key_agreement(
1348 psa_key_derivation_operation_t *operation,
1349 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001350 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001351 const uint8_t *peer_key,
1352 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001353{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001354 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001355 .function_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001356 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001357 .step = step,
1358 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001359 };
1360
1361 psa_invec in_vec[] = {
1362 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1363 {.base = peer_key, .len = peer_key_length},
1364 };
1365
Antonio de Angelis202425a2022-04-06 11:13:15 +01001366 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001367}
1368
1369psa_status_t psa_generate_random(uint8_t *output,
1370 size_t output_size)
1371{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001372 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001373 .function_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001374 };
1375
1376 psa_invec in_vec[] = {
1377 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1378 };
1379
1380 psa_outvec out_vec[] = {
1381 {.base = output, .len = output_size},
1382 };
1383
1384 if (output_size == 0) {
1385 return PSA_SUCCESS;
1386 }
1387
Antonio de Angelis202425a2022-04-06 11:13:15 +01001388 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001389}
1390
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001391psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001392 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001393{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001394 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001395 .function_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001396 };
1397
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001398 psa_invec in_vec[] = {
1399 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001400 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1401 };
1402
1403 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001404 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001405 };
1406
Antonio de Angelis202425a2022-04-06 11:13:15 +01001407 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001408}
1409
Maulik Patel28659c42021-01-06 14:09:22 +00001410psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001411 psa_algorithm_t alg,
1412 const uint8_t *input,
1413 size_t input_length,
1414 uint8_t *mac,
1415 size_t mac_size,
1416 size_t *mac_length)
1417{
1418 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001419 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001420 .function_id = TFM_CRYPTO_MAC_COMPUTE_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001421 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001422 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001423 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001424
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001425 psa_invec in_vec[] = {
1426 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Summer Qin045ec4a2021-07-07 14:28:04 +08001427 {.base = input, .len = input_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001428 };
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001429 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001430 {.base = mac, .len = mac_size},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001431 };
1432
Antonio de Angelis202425a2022-04-06 11:13:15 +01001433 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001434
1435 *mac_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001436 return status;
1437}
1438
Maulik Patel28659c42021-01-06 14:09:22 +00001439psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001440 psa_algorithm_t alg,
1441 const uint8_t *input,
1442 size_t input_length,
1443 const uint8_t *mac,
1444 const size_t mac_length)
1445{
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001446 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001447 .function_id = TFM_CRYPTO_MAC_VERIFY_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001448 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001449 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001450 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001451
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001452 psa_invec in_vec[] = {
1453 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1454 {.base = input, .len = input_length},
Summer Qin045ec4a2021-07-07 14:28:04 +08001455 {.base = mac, .len = mac_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001456 };
1457
Antonio de Angelis202425a2022-04-06 11:13:15 +01001458 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001459}
1460
Maulik Patel28659c42021-01-06 14:09:22 +00001461psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001462 psa_algorithm_t alg,
1463 const uint8_t *input,
1464 size_t input_length,
1465 uint8_t *output,
1466 size_t output_size,
1467 size_t *output_length)
1468{
1469 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001470 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001471 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001472 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001473 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001474 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001475
Antonio de Angelis609f0002021-07-06 16:51:28 +02001476 psa_invec in_vec[] = {
1477 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1478 {.base = input, .len = input_length},
1479 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001480 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001481 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001482 };
1483
Antonio de Angelis202425a2022-04-06 11:13:15 +01001484 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001485
1486 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001487 return status;
1488}
1489
Maulik Patel28659c42021-01-06 14:09:22 +00001490psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001491 psa_algorithm_t alg,
1492 const uint8_t *input,
1493 size_t input_length,
1494 uint8_t *output,
1495 size_t output_size,
1496 size_t *output_length)
1497{
1498 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001499 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001500 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001501 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001502 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001503 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001504
Antonio de Angelis609f0002021-07-06 16:51:28 +02001505 psa_invec in_vec[] = {
1506 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1507 {.base = input, .len = input_length},
1508 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001509 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001510 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001511 };
1512
Antonio de Angelis202425a2022-04-06 11:13:15 +01001513 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001514
1515 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001516 return status;
1517}
1518
1519psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001520 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001521 const uint8_t *peer_key,
1522 size_t peer_key_length,
1523 uint8_t *output,
1524 size_t output_size,
1525 size_t *output_length)
1526{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001527 psa_status_t status;
1528 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001529 .function_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001530 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001531 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001532 };
1533
1534 psa_invec in_vec[] = {
1535 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1536 {.base = peer_key, .len = peer_key_length},
1537 };
1538
1539 psa_outvec out_vec[] = {
1540 {.base = output, .len = output_size},
1541 };
1542
Antonio de Angelis202425a2022-04-06 11:13:15 +01001543 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001544
1545 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001546
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001547 return status;
1548}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001549
1550psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1551 psa_algorithm_t alg)
1552{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001553 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001554 .function_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001555 .alg = alg,
1556 .op_handle = operation->handle,
1557 };
1558
1559 psa_invec in_vec[] = {
1560 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1561 };
1562 psa_outvec out_vec[] = {
1563 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1564 };
1565
Antonio de Angelis202425a2022-04-06 11:13:15 +01001566 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001567}
1568
1569psa_status_t psa_key_derivation_set_capacity(
1570 psa_key_derivation_operation_t *operation,
1571 size_t capacity)
1572{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001573 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001574 .function_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001575 .capacity = capacity,
1576 .op_handle = operation->handle,
1577 };
1578
1579 psa_invec in_vec[] = {
1580 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1581 };
1582
Antonio de Angelis202425a2022-04-06 11:13:15 +01001583 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001584}
1585
1586psa_status_t psa_key_derivation_input_bytes(
1587 psa_key_derivation_operation_t *operation,
1588 psa_key_derivation_step_t step,
1589 const uint8_t *data,
1590 size_t data_length)
1591{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001592 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001593 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001594 .step = step,
1595 .op_handle = operation->handle,
1596 };
1597
1598 psa_invec in_vec[] = {
1599 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1600 {.base = data, .len = data_length},
1601 };
1602
Antonio de Angelis202425a2022-04-06 11:13:15 +01001603 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001604}
1605
1606psa_status_t psa_key_derivation_output_key(
1607 const psa_key_attributes_t *attributes,
1608 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001609 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001610{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001611 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001612 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001613 .op_handle = operation->handle,
1614 };
1615
1616 psa_invec in_vec[] = {
1617 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1618 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1619 };
1620
1621 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001622 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001623 };
1624
Antonio de Angelis202425a2022-04-06 11:13:15 +01001625 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001626}