blob: 5cb22f873b674dffe6ba92d5e00f1ae6e007a7d0 [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"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000012
Antonio de Angelis202425a2022-04-06 11:13:15 +010013#define API_DISPATCH(in_vec, out_vec) \
14 psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, \
15 in_vec, IOVEC_LEN(in_vec), \
16 out_vec, IOVEC_LEN(out_vec))
17#define API_DISPATCH_NO_OUTVEC(in_vec) \
18 psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, \
19 in_vec, IOVEC_LEN(in_vec), \
20 (psa_outvec *)NULL, 0)
Antonio de Angelis8908f472018-08-31 15:44:25 +010021
22psa_status_t psa_crypto_init(void)
23{
24 /* Service init is performed during TFM boot up,
25 * so application level initialisation is empty
26 */
27 return PSA_SUCCESS;
28}
29
Antonio de Angelis04debbd2019-10-14 12:12:52 +010030psa_status_t psa_open_key(psa_key_id_t id,
Maulik Patel28659c42021-01-06 14:09:22 +000031 psa_key_id_t *key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010032{
Jamie Foxdadb4e82019-09-03 17:59:41 +010033 const struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010034 .function_id = TFM_CRYPTO_OPEN_KEY_SID,
35 .key_id = id,
Jamie Foxdadb4e82019-09-03 17:59:41 +010036 };
37 psa_invec in_vec[] = {
38 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010039 };
40 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000041 {.base = key, .len = sizeof(psa_key_id_t)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010042 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010043
Antonio de Angelis202425a2022-04-06 11:13:15 +010044 return API_DISPATCH(in_vec, out_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010045}
46
Maulik Patel28659c42021-01-06 14:09:22 +000047psa_status_t psa_close_key(psa_key_id_t key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010048{
Jamie Foxdadb4e82019-09-03 17:59:41 +010049 const struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010050 .function_id = TFM_CRYPTO_CLOSE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000051 .key_id = key,
Jamie Foxdadb4e82019-09-03 17:59:41 +010052 };
53 psa_invec in_vec[] = {
54 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
55 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010056
Antonio de Angelis202425a2022-04-06 11:13:15 +010057 return API_DISPATCH_NO_OUTVEC(in_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010058}
59
Antonio de Angelis04debbd2019-10-14 12:12:52 +010060psa_status_t psa_import_key(const psa_key_attributes_t *attributes,
Antonio de Angelis8908f472018-08-31 15:44:25 +010061 const uint8_t *data,
Antonio de Angelis04debbd2019-10-14 12:12:52 +010062 size_t data_length,
Maulik Patel28659c42021-01-06 14:09:22 +000063 psa_key_id_t *key)
Antonio de Angelis8908f472018-08-31 15:44:25 +010064{
Antonio de Angelis4743e672019-04-11 11:38:48 +010065 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010066 .function_id = TFM_CRYPTO_IMPORT_KEY_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +010067 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000068 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +010069 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +010070 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000071 {.base = data, .len = data_length}
72 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +010073 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000074 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +010075 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010076
Antonio de Angelis202425a2022-04-06 11:13:15 +010077 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +010078}
79
Maulik Patel28659c42021-01-06 14:09:22 +000080psa_status_t psa_destroy_key(psa_key_id_t key)
Antonio de Angelis8908f472018-08-31 15:44:25 +010081{
Antonio de Angelis4743e672019-04-11 11:38:48 +010082 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010083 .function_id = TFM_CRYPTO_DESTROY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000084 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +010085 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000086 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +010087 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000088 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010089
Antonio de Angelis202425a2022-04-06 11:13:15 +010090 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +010091}
92
Maulik Patel28659c42021-01-06 14:09:22 +000093psa_status_t psa_get_key_attributes(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +010094 psa_key_attributes_t *attributes)
Antonio de Angelis8908f472018-08-31 15:44:25 +010095{
Antonio de Angelis4743e672019-04-11 11:38:48 +010096 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +010097 .function_id = TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000098 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +010099 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000100 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100101 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000102 };
103 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100104 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000105 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100106
Antonio de Angelis202425a2022-04-06 11:13:15 +0100107 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100108}
109
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100110void psa_reset_key_attributes(psa_key_attributes_t *attributes)
111{
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100112 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100113 .function_id = TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100114 };
115 psa_invec in_vec[] = {
116 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
117 };
118 psa_outvec out_vec[] = {
119 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
120 };
121
Antonio de Angelis202425a2022-04-06 11:13:15 +0100122 (void)API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100123 return;
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100124}
125
Maulik Patel28659c42021-01-06 14:09:22 +0000126psa_status_t psa_export_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100127 uint8_t *data,
128 size_t data_size,
129 size_t *data_length)
130{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000131 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100132 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100133 .function_id = TFM_CRYPTO_EXPORT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000134 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100135 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000136 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100137 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000138 };
139 psa_outvec out_vec[] = {
140 {.base = data, .len = data_size}
141 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100142
Antonio de Angelis202425a2022-04-06 11:13:15 +0100143 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100144
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000145 *data_length = out_vec[0].len;
146
147 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100148}
149
Maulik Patel28659c42021-01-06 14:09:22 +0000150psa_status_t psa_export_public_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100151 uint8_t *data,
152 size_t data_size,
153 size_t *data_length)
154{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100155 psa_status_t status;
156 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100157 .function_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000158 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100159 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000160
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100161 psa_invec in_vec[] = {
162 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
163 };
164 psa_outvec out_vec[] = {
165 {.base = data, .len = data_size}
166 };
167
Antonio de Angelis202425a2022-04-06 11:13:15 +0100168 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100169
170 *data_length = out_vec[0].len;
171
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100172 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100173}
174
Maulik Patel28659c42021-01-06 14:09:22 +0000175psa_status_t psa_purge_key(psa_key_id_t key)
176{
Maulik Patel28659c42021-01-06 14:09:22 +0000177 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100178 .function_id = TFM_CRYPTO_PURGE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000179 .key_id = key,
180 };
181 psa_invec in_vec[] = {
182 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
183 };
184
Antonio de Angelis202425a2022-04-06 11:13:15 +0100185 return API_DISPATCH_NO_OUTVEC(in_vec);
Maulik Patel28659c42021-01-06 14:09:22 +0000186}
187
188psa_status_t psa_copy_key(psa_key_id_t source_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100189 const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +0000190 psa_key_id_t *target_key)
Jamie Foxefd82732018-11-26 10:34:32 +0000191{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100192 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100193 .function_id = TFM_CRYPTO_COPY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000194 .key_id = source_key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100195 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000196
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100197 psa_invec in_vec[] = {
198 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100199 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100200 };
201
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000202 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000203 {.base = target_key, .len = sizeof(psa_key_id_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000204 };
Jamie Foxefd82732018-11-26 10:34:32 +0000205
Antonio de Angelis202425a2022-04-06 11:13:15 +0100206 return API_DISPATCH(in_vec, out_vec);
Jamie Foxefd82732018-11-26 10:34:32 +0000207}
208
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100209psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
210 unsigned char *iv,
211 size_t iv_size,
212 size_t *iv_length)
213{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100214 psa_status_t status;
215 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100216 .function_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100217 .op_handle = operation->handle,
218 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100219
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100220 psa_invec in_vec[] = {
221 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
222 };
223 psa_outvec out_vec[] = {
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100224 {.base = iv, .len = iv_size},
225 };
226
Antonio de Angelis202425a2022-04-06 11:13:15 +0100227 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100228
Antonio de Angelis202425a2022-04-06 11:13:15 +0100229 *iv_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100230
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100231 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100232}
233
Antonio de Angelis377a1552018-11-22 17:02:40 +0000234psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
235 const unsigned char *iv,
236 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100237{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100238 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100239 .function_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100240 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100241 };
242
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000243 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100244 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000245 {.base = iv, .len = iv_length},
246 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100247
Antonio de Angelis202425a2022-04-06 11:13:15 +0100248 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100249}
250
Antonio de Angelis377a1552018-11-22 17:02:40 +0000251psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000252 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000253 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100254{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100255 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100256 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000257 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100258 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100259 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000260 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100261
Antonio de Angelis4743e672019-04-11 11:38:48 +0100262 psa_invec in_vec[] = {
263 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
264 };
265 psa_outvec out_vec[] = {
266 {.base = &(operation->handle), .len = sizeof(uint32_t)},
267 };
268
Antonio de Angelis202425a2022-04-06 11:13:15 +0100269 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100270}
271
Antonio de Angelis377a1552018-11-22 17:02:40 +0000272psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000273 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000274 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100275{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100276 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100277 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000278 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100279 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100280 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000281 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100282
Antonio de Angelis4743e672019-04-11 11:38:48 +0100283 psa_invec in_vec[] = {
284 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
285 };
286 psa_outvec out_vec[] = {
287 {.base = &(operation->handle), .len = sizeof(uint32_t)},
288 };
289
Antonio de Angelis202425a2022-04-06 11:13:15 +0100290 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100291}
292
293psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
294 const uint8_t *input,
295 size_t input_length,
296 unsigned char *output,
297 size_t output_size,
298 size_t *output_length)
299{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000300 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100301 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100302 .function_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100303 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100304 };
305
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000306 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100307 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000308 {.base = input, .len = input_length},
309 };
310 psa_outvec out_vec[] = {
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000311 {.base = output, .len = output_size}
312 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100313
Antonio de Angelis202425a2022-04-06 11:13:15 +0100314 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100315
Antonio de Angelis202425a2022-04-06 11:13:15 +0100316 *output_length = out_vec[0].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100317
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000318 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100319}
320
321psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
322{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100323 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100324 .function_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100325 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000326 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100327
Antonio de Angelis4743e672019-04-11 11:38:48 +0100328 psa_invec in_vec[] = {
329 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
330 };
331 psa_outvec out_vec[] = {
332 {.base = &(operation->handle), .len = sizeof(uint32_t)},
333 };
334
Antonio de Angelis202425a2022-04-06 11:13:15 +0100335 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100336}
337
338psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
339 uint8_t *output,
340 size_t output_size,
341 size_t *output_length)
342{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000343 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100344 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100345 .function_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100346 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100347 };
348
349 psa_invec in_vec[] = {
350 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
351 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000352 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100353 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000354 {.base = output, .len = output_size},
355 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100356
Antonio de Angelis202425a2022-04-06 11:13:15 +0100357 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100358
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000359 *output_length = out_vec[1].len;
360
361 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100362}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100363
Antonio de Angelis377a1552018-11-22 17:02:40 +0000364psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100365 psa_algorithm_t alg)
366{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100367 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100368 .function_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100369 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100370 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000371 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100372
Antonio de Angelis4743e672019-04-11 11:38:48 +0100373 psa_invec in_vec[] = {
374 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
375 };
376 psa_outvec out_vec[] = {
377 {.base = &(operation->handle), .len = sizeof(uint32_t)},
378 };
379
Antonio de Angelis202425a2022-04-06 11:13:15 +0100380 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100381}
382
383psa_status_t psa_hash_update(psa_hash_operation_t *operation,
384 const uint8_t *input,
385 size_t input_length)
386{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100387 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100388 .function_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100389 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100390 };
391
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000392 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100393 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000394 {.base = input, .len = input_length},
395 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100396
Antonio de Angelis202425a2022-04-06 11:13:15 +0100397 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100398}
399
400psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
401 uint8_t *hash,
402 size_t hash_size,
403 size_t *hash_length)
404{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000405 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100406 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100407 .function_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100408 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100409 };
410
411 psa_invec in_vec[] = {
412 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
413 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000414 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100415 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000416 {.base = hash, .len = hash_size},
417 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100418
Antonio de Angelis202425a2022-04-06 11:13:15 +0100419 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100420
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000421 *hash_length = out_vec[1].len;
422
423 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100424}
425
426psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
427 const uint8_t *hash,
428 size_t hash_length)
429{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100430 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100431 .function_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100432 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100433 };
434
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000435 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100436 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000437 {.base = hash, .len = hash_length},
438 };
439 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100440 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000441 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100442
Antonio de Angelis202425a2022-04-06 11:13:15 +0100443 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100444}
445
446psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
447{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100448 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100449 .function_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100450 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000451 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100452
Antonio de Angelis4743e672019-04-11 11:38:48 +0100453 psa_invec in_vec[] = {
454 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
455 };
456 psa_outvec out_vec[] = {
457 {.base = &(operation->handle), .len = sizeof(uint32_t)},
458 };
459
Antonio de Angelis202425a2022-04-06 11:13:15 +0100460 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100461}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100462
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100463psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
464 psa_hash_operation_t *target_operation)
465{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100466 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100467 .function_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100468 .op_handle = source_operation->handle,
469 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100470
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100471 if (target_operation && (target_operation->handle != 0)) {
472 return PSA_ERROR_BAD_STATE;
473 }
474
David Huc9679cc2022-06-21 13:09:34 +0800475 psa_invec in_vec[] = {
476 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
477 {.base = &(target_operation->handle),
478 .len = sizeof(target_operation->handle)},
479 };
480 psa_outvec out_vec[] = {
481 {.base = &(target_operation->handle),
482 .len = sizeof(target_operation->handle)},
483 };
484
Antonio de Angelis202425a2022-04-06 11:13:15 +0100485 return API_DISPATCH(in_vec, out_vec);
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100486}
487
Soby Mathew07ef6e42020-07-20 21:09:23 +0100488psa_status_t psa_hash_compute(psa_algorithm_t alg,
489 const uint8_t *input,
490 size_t input_length,
491 uint8_t *hash,
492 size_t hash_size,
493 size_t *hash_length)
494{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100495 psa_status_t status;
496 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100497 .function_id = TFM_CRYPTO_HASH_COMPUTE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100498 .alg = alg,
499 };
500
501 psa_invec in_vec[] = {
502 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
503 {.base = input, .len = input_length},
504 };
505
506 psa_outvec out_vec[] = {
507 {.base = hash, .len = hash_size}
508 };
509
Antonio de Angelis202425a2022-04-06 11:13:15 +0100510 status = API_DISPATCH(in_vec, out_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100511
512 *hash_length = out_vec[0].len;
513
Soby Mathew07ef6e42020-07-20 21:09:23 +0100514 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100515}
516
517psa_status_t psa_hash_compare(psa_algorithm_t alg,
518 const uint8_t *input,
519 size_t input_length,
520 const uint8_t *hash,
521 size_t hash_length)
522{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100523 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100524 .function_id = TFM_CRYPTO_HASH_COMPARE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100525 .alg = alg,
526 };
527
528 psa_invec in_vec[] = {
529 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
530 {.base = input, .len = input_length},
531 {.base = hash, .len = hash_length},
532 };
533
Antonio de Angelis202425a2022-04-06 11:13:15 +0100534 return API_DISPATCH_NO_OUTVEC(in_vec);
Soby Mathew07ef6e42020-07-20 21:09:23 +0100535}
536
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100537psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000538 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100539 psa_algorithm_t alg)
540{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100541 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100542 .function_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000543 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100544 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100545 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000546 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100547
Antonio de Angelis4743e672019-04-11 11:38:48 +0100548 psa_invec in_vec[] = {
549 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
550 };
551 psa_outvec out_vec[] = {
552 {.base = &(operation->handle), .len = sizeof(uint32_t)},
553 };
554
Antonio de Angelis202425a2022-04-06 11:13:15 +0100555 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100556}
557
558psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000559 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100560 psa_algorithm_t alg)
561{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100562 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100563 .function_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000564 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100565 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100566 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000567 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100568
Antonio de Angelis4743e672019-04-11 11:38:48 +0100569 psa_invec in_vec[] = {
570 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
571 };
572 psa_outvec out_vec[] = {
573 {.base = &(operation->handle), .len = sizeof(uint32_t)},
574 };
575
Antonio de Angelis202425a2022-04-06 11:13:15 +0100576 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100577}
578
579psa_status_t psa_mac_update(psa_mac_operation_t *operation,
580 const uint8_t *input,
581 size_t input_length)
582{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100583 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100584 .function_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100585 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100586 };
587
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000588 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100589 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000590 {.base = input, .len = input_length},
591 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100592
Antonio de Angelis202425a2022-04-06 11:13:15 +0100593 return API_DISPATCH_NO_OUTVEC(in_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100594}
595
596psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
597 uint8_t *mac,
598 size_t mac_size,
599 size_t *mac_length)
600{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000601 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100602 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100603 .function_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100604 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100605 };
606
607 psa_invec in_vec[] = {
608 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
609 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000610 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100611 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000612 {.base = mac, .len = mac_size},
613 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100614
Antonio de Angelis202425a2022-04-06 11:13:15 +0100615 status = API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100616
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000617 *mac_length = out_vec[1].len;
618
619 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100620}
621
622psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
623 const uint8_t *mac,
624 size_t mac_length)
625{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100626 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100627 .function_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100628 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100629 };
630
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000631 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100632 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000633 {.base = mac, .len = mac_length},
634 };
635 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100636 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000637 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100638
Antonio de Angelis202425a2022-04-06 11:13:15 +0100639 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100640}
641
642psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
643{
Antonio de Angelis4743e672019-04-11 11:38:48 +0100644 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100645 .function_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100646 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000647 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100648
Antonio de Angelis4743e672019-04-11 11:38:48 +0100649 psa_invec in_vec[] = {
650 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
651 };
652 psa_outvec out_vec[] = {
653 {.base = &(operation->handle), .len = sizeof(uint32_t)},
654 };
655
Antonio de Angelis202425a2022-04-06 11:13:15 +0100656 return API_DISPATCH(in_vec, out_vec);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100657}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000658
Maulik Patel28659c42021-01-06 14:09:22 +0000659psa_status_t psa_aead_encrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000660 psa_algorithm_t alg,
661 const uint8_t *nonce,
662 size_t nonce_length,
663 const uint8_t *additional_data,
664 size_t additional_data_length,
665 const uint8_t *plaintext,
666 size_t plaintext_length,
667 uint8_t *ciphertext,
668 size_t ciphertext_size,
669 size_t *ciphertext_length)
670{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000671 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100672 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100673 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000674 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100675 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000676 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000677 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100678
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100679 /* Sanitize the optional input */
680 if ((additional_data == NULL) && (additional_data_length != 0)) {
681 return PSA_ERROR_INVALID_ARGUMENT;
682 }
683
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000684 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000685 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000686 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100687 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000688 };
689 psa_outvec out_vec[] = {
690 {.base = ciphertext, .len = ciphertext_size},
691 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000692
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000693 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
694 return PSA_ERROR_INVALID_ARGUMENT;
695 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000696
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000697 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000698 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100699 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000700 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000701 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000702 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000703
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000704 in_vec[0].base = &iov;
705 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
706
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800707 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000708
Antonio de Angelis4743e672019-04-11 11:38:48 +0100709 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100710 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100711 }
Summer Qinaee07882021-03-29 15:44:27 +0800712 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800713 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000714
715 *ciphertext_length = out_vec[0].len;
716
717 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000718}
719
Maulik Patel28659c42021-01-06 14:09:22 +0000720psa_status_t psa_aead_decrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000721 psa_algorithm_t alg,
722 const uint8_t *nonce,
723 size_t nonce_length,
724 const uint8_t *additional_data,
725 size_t additional_data_length,
726 const uint8_t *ciphertext,
727 size_t ciphertext_length,
728 uint8_t *plaintext,
729 size_t plaintext_size,
730 size_t *plaintext_length)
731{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000732 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100733 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100734 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000735 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100736 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000737 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000738 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100739
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100740 /* Sanitize the optional input */
741 if ((additional_data == NULL) && (additional_data_length != 0)) {
742 return PSA_ERROR_INVALID_ARGUMENT;
743 }
744
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000745 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000746 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000747 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100748 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000749 };
750 psa_outvec out_vec[] = {
751 {.base = plaintext, .len = plaintext_size},
752 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000753
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000754 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
755 return PSA_ERROR_INVALID_ARGUMENT;
756 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000757
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000758 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000759 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100760 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000761 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000762 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000763 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000764
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000765 in_vec[0].base = &iov;
766 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
767
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800768 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000769
Antonio de Angelis4743e672019-04-11 11:38:48 +0100770 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100771 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100772 }
Summer Qinaee07882021-03-29 15:44:27 +0800773 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800774 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000775
776 *plaintext_length = out_vec[0].len;
777
778 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000779}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100780
Antonio de Angelis8d282482021-10-07 15:04:12 +0100781psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
782 psa_key_id_t key,
783 psa_algorithm_t alg)
784{
785 psa_status_t status;
786 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100787 .function_id = TFM_CRYPTO_AEAD_ENCRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100788 .key_id = key,
789 .alg = alg,
790 .op_handle = operation->handle,
791 };
792
793 psa_invec in_vec[] = {
794 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
795 };
796 psa_outvec out_vec[] = {
797 {.base = &(operation->handle), .len = sizeof(uint32_t)}
798 };
799
Antonio de Angelis202425a2022-04-06 11:13:15 +0100800 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100801 return status;
802}
803
804psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
805 psa_key_id_t key,
806 psa_algorithm_t alg)
807{
808 psa_status_t status;
809 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100810 .function_id = TFM_CRYPTO_AEAD_DECRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100811 .key_id = key,
812 .alg = alg,
813 .op_handle = operation->handle,
814 };
815
816 psa_invec in_vec[] = {
817 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
818 };
819 psa_outvec out_vec[] = {
820 {.base = &(operation->handle), .len = sizeof(uint32_t)}
821 };
822
Antonio de Angelis202425a2022-04-06 11:13:15 +0100823 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100824 return status;
825}
826
827psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
828 uint8_t *nonce,
829 size_t nonce_size,
830 size_t *nonce_length)
831{
832 psa_status_t status;
833 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100834 .function_id = TFM_CRYPTO_AEAD_GENERATE_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100835 .op_handle = operation->handle,
836 };
837
838 psa_invec in_vec[] = {
839 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
840 };
841 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +0100842 {.base = nonce, .len = nonce_size}
843 };
844
Antonio de Angelis202425a2022-04-06 11:13:15 +0100845 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100846
Antonio de Angelis202425a2022-04-06 11:13:15 +0100847 *nonce_length = out_vec[0].len;
Antonio de Angelis8d282482021-10-07 15:04:12 +0100848 return status;
849}
850
851psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
852 const uint8_t *nonce,
853 size_t nonce_length)
854{
855 psa_status_t status;
856 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100857 .function_id = TFM_CRYPTO_AEAD_SET_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100858 .op_handle = operation->handle,
859 };
860
861 psa_invec in_vec[] = {
862 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
863 {.base = nonce, .len = nonce_length}
864 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100865
Antonio de Angelis202425a2022-04-06 11:13:15 +0100866 status = API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100867 return status;
868}
869
870psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
871 size_t ad_length,
872 size_t plaintext_length)
873{
874 psa_status_t status;
875 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100876 .function_id = TFM_CRYPTO_AEAD_SET_LENGTHS_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100877 .ad_length = ad_length,
878 .plaintext_length = plaintext_length,
879 .op_handle = operation->handle,
880 };
881
882 psa_invec in_vec[] = {
883 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
884 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100885
Antonio de Angelis202425a2022-04-06 11:13:15 +0100886 status = API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100887 return status;
888}
889
890psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
891 const uint8_t *input,
892 size_t input_length)
893{
894 psa_status_t status;
895 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100896 .function_id = TFM_CRYPTO_AEAD_UPDATE_AD_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100897 .op_handle = operation->handle,
898 };
899
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000900 /* Sanitize the optional input */
901 if ((input == NULL) && (input_length != 0)) {
902 return PSA_ERROR_INVALID_ARGUMENT;
903 }
904
Antonio de Angelis8d282482021-10-07 15:04:12 +0100905 psa_invec in_vec[] = {
906 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
907 {.base = input, .len = input_length}
908 };
Antonio de Angelis8d282482021-10-07 15:04:12 +0100909
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000910 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000911
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000912 if (input == NULL) {
913 in_len--;
914 }
915 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis202425a2022-04-06 11:13:15 +0100916 NULL, 0);
Antonio de Angelis8d282482021-10-07 15:04:12 +0100917 return status;
918}
919
920psa_status_t psa_aead_update(psa_aead_operation_t *operation,
921 const uint8_t *input,
922 size_t input_length,
923 uint8_t *output,
924 size_t output_size,
925 size_t *output_length)
926{
927 psa_status_t status;
928 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100929 .function_id = TFM_CRYPTO_AEAD_UPDATE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100930 .op_handle = operation->handle,
931 };
932
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000933 /* Sanitize the optional input */
934 if ((input == NULL) && (input_length != 0)) {
935 return PSA_ERROR_INVALID_ARGUMENT;
936 }
937
Antonio de Angelis8d282482021-10-07 15:04:12 +0100938 psa_invec in_vec[] = {
939 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
940 {.base = input, .len = input_length}
941 };
942 psa_outvec out_vec[] = {
Antonio de Angelisc26af632021-10-07 15:04:12 +0100943 {.base = output, .len = output_size},
Antonio de Angelis8d282482021-10-07 15:04:12 +0100944 };
945
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000946 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000947
Antonio de Angelisb15f79b2022-01-11 15:25:35 +0000948 if (input == NULL) {
949 in_len--;
950 }
951 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
952 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis8d282482021-10-07 15:04:12 +0100953
Antonio de Angelis202425a2022-04-06 11:13:15 +0100954 *output_length = out_vec[0].len;
Antonio de Angelis8d282482021-10-07 15:04:12 +0100955 return status;
956}
957
958psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
959 uint8_t *ciphertext,
960 size_t ciphertext_size,
961 size_t *ciphertext_length,
962 uint8_t *tag,
963 size_t tag_size,
964 size_t *tag_length)
965{
966 psa_status_t status;
967 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +0100968 .function_id = TFM_CRYPTO_AEAD_FINISH_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100969 .op_handle = operation->handle,
970 };
971
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000972 /* Sanitize the optional output */
973 if ((ciphertext == NULL) && (ciphertext_size != 0)) {
974 return PSA_ERROR_INVALID_ARGUMENT;
975 }
976
Antonio de Angelis8d282482021-10-07 15:04:12 +0100977 psa_invec in_vec[] = {
978 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
979 };
980 psa_outvec out_vec[] = {
981 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis8d282482021-10-07 15:04:12 +0100982 {.base = tag, .len = tag_size},
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000983 {.base = ciphertext, .len = ciphertext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +0100984 };
985
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000986 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000987
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000988 if (ciphertext == NULL || ciphertext_size == 0) {
989 out_len--;
990 }
991 if ((out_len == 3) && (ciphertext_length == NULL)) {
992 return PSA_ERROR_INVALID_ARGUMENT;
993 }
Antonio de Angelis8d282482021-10-07 15:04:12 +0100994
Antonio de Angelisc26af632021-10-07 15:04:12 +0100995 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
996 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000997 out_vec, out_len);
998
Antonio de Angelis902fdd02022-01-07 13:37:12 +0000999 if (out_len == 3) {
1000 *ciphertext_length = out_vec[2].len;
1001 } else {
1002 *ciphertext_length = 0;
1003 }
Antonio de Angelis202425a2022-04-06 11:13:15 +01001004
1005 *tag_length = out_vec[1].len;
1006
Antonio de Angelis8d282482021-10-07 15:04:12 +01001007 return status;
1008}
1009
1010psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1011 uint8_t *plaintext,
1012 size_t plaintext_size,
1013 size_t *plaintext_length,
1014 const uint8_t *tag,
1015 size_t tag_length)
1016{
1017 psa_status_t status;
1018 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001019 .function_id = TFM_CRYPTO_AEAD_VERIFY_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001020 .op_handle = operation->handle,
1021 };
1022
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001023 /* Sanitize the optional output */
1024 if ((plaintext == NULL) && (plaintext_size != 0)) {
1025 return PSA_ERROR_INVALID_ARGUMENT;
1026 }
1027
Antonio de Angelis8d282482021-10-07 15:04:12 +01001028 psa_invec in_vec[] = {
1029 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1030 {.base = tag, .len = tag_length}
1031 };
1032 psa_outvec out_vec[] = {
1033 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis202425a2022-04-06 11:13:15 +01001034 {.base = plaintext, .len = plaintext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +01001035 };
1036
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001037 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001038
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001039 if (plaintext == NULL || plaintext_size == 0) {
1040 out_len--;
1041 }
1042 if ((out_len == 2) && (plaintext_length == NULL)) {
1043 return PSA_ERROR_INVALID_ARGUMENT;
1044 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001045
Antonio de Angelisc26af632021-10-07 15:04:12 +01001046 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
1047 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001048 out_vec, out_len);
1049
1050 if (out_len == 2) {
1051 *plaintext_length = out_vec[1].len;
1052 } else {
1053 *plaintext_length = 0;
1054 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001055 return status;
1056}
1057
1058psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1059{
Antonio de Angelis8d282482021-10-07 15:04:12 +01001060 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001061 .function_id = TFM_CRYPTO_AEAD_ABORT_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001062 .op_handle = operation->handle,
1063 };
1064
1065 psa_invec in_vec[] = {
1066 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1067 };
1068 psa_outvec out_vec[] = {
1069 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1070 };
1071
Antonio de Angelis202425a2022-04-06 11:13:15 +01001072 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8d282482021-10-07 15:04:12 +01001073}
1074
Summer Qinb9492d22021-06-22 18:00:54 +08001075psa_status_t psa_sign_message(psa_key_id_t key,
1076 psa_algorithm_t alg,
1077 const uint8_t *input,
1078 size_t input_length,
1079 uint8_t *signature,
1080 size_t signature_size,
1081 size_t *signature_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001082{
Summer Qinb9492d22021-06-22 18:00:54 +08001083 psa_status_t status;
1084 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001085 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001086 .key_id = key,
1087 .alg = alg,
1088 };
1089
1090 psa_invec in_vec[] = {
1091 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1092 {.base = input, .len = input_length},
1093 };
1094 psa_outvec out_vec[] = {
1095 {.base = signature, .len = signature_size},
1096 };
1097
Antonio de Angelis202425a2022-04-06 11:13:15 +01001098 status = API_DISPATCH(in_vec, out_vec);
Summer Qinb9492d22021-06-22 18:00:54 +08001099
Antonio de Angelisf83a2082021-08-20 22:13:53 +01001100 *signature_length = out_vec[0].len;
Summer Qinb9492d22021-06-22 18:00:54 +08001101 return status;
1102}
1103
1104psa_status_t psa_verify_message(psa_key_id_t key,
1105 psa_algorithm_t alg,
1106 const uint8_t *input,
1107 size_t input_length,
1108 const uint8_t *signature,
1109 size_t signature_length)
1110{
Summer Qinb9492d22021-06-22 18:00:54 +08001111 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001112 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001113 .key_id = key,
1114 .alg = alg
1115 };
1116
1117 psa_invec in_vec[] = {
1118 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1119 {.base = input, .len = input_length},
1120 {.base = signature, .len = signature_length}
1121 };
1122
Antonio de Angelis202425a2022-04-06 11:13:15 +01001123 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001124}
1125
Maulik Patel28659c42021-01-06 14:09:22 +00001126psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001127 psa_algorithm_t alg,
1128 const uint8_t *hash,
1129 size_t hash_length,
1130 uint8_t *signature,
1131 size_t signature_size,
1132 size_t *signature_length)
1133{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001134 psa_status_t status;
1135 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001136 .function_id = TFM_CRYPTO_ASYMMETRIC_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001137 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001138 .alg = alg,
1139 };
1140
1141 psa_invec in_vec[] = {
1142 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1143 {.base = hash, .len = hash_length},
1144 };
1145 psa_outvec out_vec[] = {
1146 {.base = signature, .len = signature_size},
1147 };
1148
Antonio de Angelis202425a2022-04-06 11:13:15 +01001149 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001150
1151 *signature_length = out_vec[0].len;
1152
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001153 return status;
1154}
1155
Maulik Patel28659c42021-01-06 14:09:22 +00001156psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001157 psa_algorithm_t alg,
1158 const uint8_t *hash,
1159 size_t hash_length,
1160 const uint8_t *signature,
1161 size_t signature_length)
1162{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001163 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001164 .function_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001165 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001166 .alg = alg
1167 };
1168
1169 psa_invec in_vec[] = {
1170 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1171 {.base = hash, .len = hash_length},
1172 {.base = signature, .len = signature_length}
1173 };
1174
Antonio de Angelis202425a2022-04-06 11:13:15 +01001175 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001176}
1177
Maulik Patel28659c42021-01-06 14:09:22 +00001178psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001179 psa_algorithm_t alg,
1180 const uint8_t *input,
1181 size_t input_length,
1182 const uint8_t *salt,
1183 size_t salt_length,
1184 uint8_t *output,
1185 size_t output_size,
1186 size_t *output_length)
1187{
1188 psa_status_t status;
1189 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001190 .function_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001191 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001192 .alg = alg
1193 };
1194
1195 /* Sanitize the optional input */
1196 if ((salt == NULL) && (salt_length != 0)) {
1197 return PSA_ERROR_INVALID_ARGUMENT;
1198 }
1199
1200 psa_invec in_vec[] = {
1201 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1202 {.base = input, .len = input_length},
1203 {.base = salt, .len = salt_length}
1204 };
1205
1206 psa_outvec out_vec[] = {
1207 {.base = output, .len = output_size},
1208 };
1209
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001210 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001211
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001212 if (salt == NULL) {
1213 in_len--;
1214 }
Summer Qinaee07882021-03-29 15:44:27 +08001215 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001216 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001217
1218 *output_length = out_vec[0].len;
1219
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001220 return status;
1221}
1222
Maulik Patel28659c42021-01-06 14:09:22 +00001223psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001224 psa_algorithm_t alg,
1225 const uint8_t *input,
1226 size_t input_length,
1227 const uint8_t *salt,
1228 size_t salt_length,
1229 uint8_t *output,
1230 size_t output_size,
1231 size_t *output_length)
1232{
1233 psa_status_t status;
1234 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001235 .function_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001236 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001237 .alg = alg
1238 };
1239
1240 /* Sanitize the optional input */
1241 if ((salt == NULL) && (salt_length != 0)) {
1242 return PSA_ERROR_INVALID_ARGUMENT;
1243 }
1244
1245 psa_invec in_vec[] = {
1246 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1247 {.base = input, .len = input_length},
1248 {.base = salt, .len = salt_length}
1249 };
1250
1251 psa_outvec out_vec[] = {
1252 {.base = output, .len = output_size},
1253 };
1254
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001255 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001256
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001257 if (salt == NULL) {
1258 in_len--;
1259 }
Summer Qinaee07882021-03-29 15:44:27 +08001260 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001261 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001262
1263 *output_length = out_vec[0].len;
1264
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001265 return status;
1266}
1267
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001268psa_status_t psa_key_derivation_get_capacity(
1269 const psa_key_derivation_operation_t *operation,
1270 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001271{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001272 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001273 .function_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001274 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001275 };
1276
1277 psa_invec in_vec[] = {
1278 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1279 };
1280
1281 psa_outvec out_vec[] = {
1282 {.base = capacity, .len = sizeof(size_t)},
1283 };
1284
Antonio de Angelis202425a2022-04-06 11:13:15 +01001285 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001286}
1287
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001288psa_status_t psa_key_derivation_output_bytes(
1289 psa_key_derivation_operation_t *operation,
1290 uint8_t *output,
1291 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001292{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001293 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001294 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001295 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001296 };
1297
1298 psa_invec in_vec[] = {
1299 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1300 };
1301
1302 psa_outvec out_vec[] = {
1303 {.base = output, .len = output_length},
1304 };
1305
Antonio de Angelis202425a2022-04-06 11:13:15 +01001306 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001307}
1308
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001309psa_status_t psa_key_derivation_input_key(
1310 psa_key_derivation_operation_t *operation,
1311 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001312 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001313{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001314 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001315 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001316 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001317 .step = step,
1318 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001319 };
1320
1321 psa_invec in_vec[] = {
1322 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001323 };
1324
Antonio de Angelis202425a2022-04-06 11:13:15 +01001325 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001326}
1327
Antonio de Angelis8d282482021-10-07 15:04:12 +01001328psa_status_t psa_key_derivation_abort(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001329{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001330 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001331 .function_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001332 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001333 };
1334
1335 psa_invec in_vec[] = {
1336 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1337 };
1338
1339 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001340 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001341 };
1342
Antonio de Angelis202425a2022-04-06 11:13:15 +01001343 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001344}
1345
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001346psa_status_t psa_key_derivation_key_agreement(
1347 psa_key_derivation_operation_t *operation,
1348 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001349 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001350 const uint8_t *peer_key,
1351 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001352{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001353 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001354 .function_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001355 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001356 .step = step,
1357 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001358 };
1359
1360 psa_invec in_vec[] = {
1361 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1362 {.base = peer_key, .len = peer_key_length},
1363 };
1364
Antonio de Angelis202425a2022-04-06 11:13:15 +01001365 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001366}
1367
1368psa_status_t psa_generate_random(uint8_t *output,
1369 size_t output_size)
1370{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001371 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001372 .function_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001373 };
1374
1375 psa_invec in_vec[] = {
1376 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1377 };
1378
1379 psa_outvec out_vec[] = {
1380 {.base = output, .len = output_size},
1381 };
1382
1383 if (output_size == 0) {
1384 return PSA_SUCCESS;
1385 }
1386
Antonio de Angelis202425a2022-04-06 11:13:15 +01001387 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001388}
1389
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001390psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001391 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001392{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001393 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001394 .function_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001395 };
1396
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001397 psa_invec in_vec[] = {
1398 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001399 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1400 };
1401
1402 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001403 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001404 };
1405
Antonio de Angelis202425a2022-04-06 11:13:15 +01001406 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001407}
1408
Maulik Patel28659c42021-01-06 14:09:22 +00001409psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001410 psa_algorithm_t alg,
1411 const uint8_t *input,
1412 size_t input_length,
1413 uint8_t *mac,
1414 size_t mac_size,
1415 size_t *mac_length)
1416{
1417 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001418 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001419 .function_id = TFM_CRYPTO_MAC_COMPUTE_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001420 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001421 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001422 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001423
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001424 psa_invec in_vec[] = {
1425 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Summer Qin045ec4a2021-07-07 14:28:04 +08001426 {.base = input, .len = input_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001427 };
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001428 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001429 {.base = mac, .len = mac_size},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001430 };
1431
Antonio de Angelis202425a2022-04-06 11:13:15 +01001432 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001433
1434 *mac_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001435 return status;
1436}
1437
Maulik Patel28659c42021-01-06 14:09:22 +00001438psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001439 psa_algorithm_t alg,
1440 const uint8_t *input,
1441 size_t input_length,
1442 const uint8_t *mac,
1443 const size_t mac_length)
1444{
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001445 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001446 .function_id = TFM_CRYPTO_MAC_VERIFY_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001447 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001448 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001449 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001450
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001451 psa_invec in_vec[] = {
1452 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1453 {.base = input, .len = input_length},
Summer Qin045ec4a2021-07-07 14:28:04 +08001454 {.base = mac, .len = mac_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001455 };
1456
Antonio de Angelis202425a2022-04-06 11:13:15 +01001457 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001458}
1459
Maulik Patel28659c42021-01-06 14:09:22 +00001460psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001461 psa_algorithm_t alg,
1462 const uint8_t *input,
1463 size_t input_length,
1464 uint8_t *output,
1465 size_t output_size,
1466 size_t *output_length)
1467{
1468 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001469 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001470 .function_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001471 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001472 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001473 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001474
Antonio de Angelis609f0002021-07-06 16:51:28 +02001475 psa_invec in_vec[] = {
1476 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1477 {.base = input, .len = input_length},
1478 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001479 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001480 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001481 };
1482
Antonio de Angelis202425a2022-04-06 11:13:15 +01001483 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001484
1485 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001486 return status;
1487}
1488
Maulik Patel28659c42021-01-06 14:09:22 +00001489psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001490 psa_algorithm_t alg,
1491 const uint8_t *input,
1492 size_t input_length,
1493 uint8_t *output,
1494 size_t output_size,
1495 size_t *output_length)
1496{
1497 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001498 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001499 .function_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001500 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001501 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001502 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001503
Antonio de Angelis609f0002021-07-06 16:51:28 +02001504 psa_invec in_vec[] = {
1505 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1506 {.base = input, .len = input_length},
1507 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001508 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001509 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001510 };
1511
Antonio de Angelis202425a2022-04-06 11:13:15 +01001512 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis609f0002021-07-06 16:51:28 +02001513
1514 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001515 return status;
1516}
1517
1518psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001519 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001520 const uint8_t *peer_key,
1521 size_t peer_key_length,
1522 uint8_t *output,
1523 size_t output_size,
1524 size_t *output_length)
1525{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001526 psa_status_t status;
1527 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001528 .function_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001529 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001530 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001531 };
1532
1533 psa_invec in_vec[] = {
1534 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1535 {.base = peer_key, .len = peer_key_length},
1536 };
1537
1538 psa_outvec out_vec[] = {
1539 {.base = output, .len = output_size},
1540 };
1541
Antonio de Angelis202425a2022-04-06 11:13:15 +01001542 status = API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001543
1544 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001545
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001546 return status;
1547}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001548
1549psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1550 psa_algorithm_t alg)
1551{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001552 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001553 .function_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001554 .alg = alg,
1555 .op_handle = operation->handle,
1556 };
1557
1558 psa_invec in_vec[] = {
1559 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1560 };
1561 psa_outvec out_vec[] = {
1562 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1563 };
1564
Antonio de Angelis202425a2022-04-06 11:13:15 +01001565 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001566}
1567
1568psa_status_t psa_key_derivation_set_capacity(
1569 psa_key_derivation_operation_t *operation,
1570 size_t capacity)
1571{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001572 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001573 .function_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001574 .capacity = capacity,
1575 .op_handle = operation->handle,
1576 };
1577
1578 psa_invec in_vec[] = {
1579 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1580 };
1581
Antonio de Angelis202425a2022-04-06 11:13:15 +01001582 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001583}
1584
1585psa_status_t psa_key_derivation_input_bytes(
1586 psa_key_derivation_operation_t *operation,
1587 psa_key_derivation_step_t step,
1588 const uint8_t *data,
1589 size_t data_length)
1590{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001591 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001592 .function_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001593 .step = step,
1594 .op_handle = operation->handle,
1595 };
1596
1597 psa_invec in_vec[] = {
1598 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1599 {.base = data, .len = data_length},
1600 };
1601
Antonio de Angelis202425a2022-04-06 11:13:15 +01001602 return API_DISPATCH_NO_OUTVEC(in_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001603}
1604
1605psa_status_t psa_key_derivation_output_key(
1606 const psa_key_attributes_t *attributes,
1607 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001608 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001609{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001610 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis202425a2022-04-06 11:13:15 +01001611 .function_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001612 .op_handle = operation->handle,
1613 };
1614
1615 psa_invec in_vec[] = {
1616 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1617 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1618 };
1619
1620 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001621 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001622 };
1623
Antonio de Angelis202425a2022-04-06 11:13:15 +01001624 return API_DISPATCH(in_vec, out_vec);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001625}