blob: da5358a8f0522a60236dd52aee2a60dda28be716 [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"
Antonio de Angelis05b24192019-07-04 15:28:46 +010010#include "tfm_ns_interface.h"
Edison Aicc4c6162019-06-21 13:52:49 +080011#include "psa_manifest/sid.h"
Kevin Peng9449a362019-07-29 16:05:42 +080012#include "psa/client.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000013
Kevin Peng6aa48952022-01-28 15:40:46 +080014#define API_DISPATCH(srv_name, srv_id) \
Summer Qinaee07882021-03-29 15:44:27 +080015 psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, \
Xinyu Zhangade2e0a2021-03-18 16:20:54 +080016 in_vec, IOVEC_LEN(in_vec), \
17 out_vec, IOVEC_LEN(out_vec))
Antonio de Angelis4743e672019-04-11 11:38:48 +010018
Kevin Peng6aa48952022-01-28 15:40:46 +080019#define API_DISPATCH_NO_OUTVEC(srv_name, srv_id) \
Summer Qinaee07882021-03-29 15:44:27 +080020 psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, \
Xinyu Zhangade2e0a2021-03-18 16:20:54 +080021 in_vec, IOVEC_LEN(in_vec), \
Antonio de Angelis4743e672019-04-11 11:38:48 +010022 (psa_outvec *)NULL, 0)
Antonio de Angelis8908f472018-08-31 15:44:25 +010023
24psa_status_t psa_crypto_init(void)
25{
26 /* Service init is performed during TFM boot up,
27 * so application level initialisation is empty
28 */
29 return PSA_SUCCESS;
30}
31
Antonio de Angelis04debbd2019-10-14 12:12:52 +010032psa_status_t psa_open_key(psa_key_id_t id,
Maulik Patel28659c42021-01-06 14:09:22 +000033 psa_key_id_t *key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010034{
Jamie Foxdadb4e82019-09-03 17:59:41 +010035 psa_status_t status;
36 const struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +080037 .srv_id = TFM_CRYPTO_OPEN_KEY_SID,
Jamie Foxdadb4e82019-09-03 17:59:41 +010038 };
39 psa_invec in_vec[] = {
40 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
41 {.base = &id, .len = sizeof(psa_key_id_t)},
42 };
43 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000044 {.base = key, .len = sizeof(psa_key_id_t)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010045 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010046
Jamie Foxdadb4e82019-09-03 17:59:41 +010047 status = API_DISPATCH(tfm_crypto_open_key,
48 TFM_CRYPTO_OPEN_KEY);
49
Jamie Foxdadb4e82019-09-03 17:59:41 +010050 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +010051}
52
Maulik Patel28659c42021-01-06 14:09:22 +000053psa_status_t psa_close_key(psa_key_id_t key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010054{
Jamie Foxdadb4e82019-09-03 17:59:41 +010055 psa_status_t status;
56 const struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +080057 .srv_id = TFM_CRYPTO_CLOSE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000058 .key_id = key,
Jamie Foxdadb4e82019-09-03 17:59:41 +010059 };
60 psa_invec in_vec[] = {
61 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
62 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010063
Jamie Foxdadb4e82019-09-03 17:59:41 +010064 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_close_key,
65 TFM_CRYPTO_CLOSE_KEY);;
66
Jamie Foxdadb4e82019-09-03 17:59:41 +010067 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +010068}
69
Antonio de Angelis04debbd2019-10-14 12:12:52 +010070psa_status_t psa_import_key(const psa_key_attributes_t *attributes,
Antonio de Angelis8908f472018-08-31 15:44:25 +010071 const uint8_t *data,
Antonio de Angelis04debbd2019-10-14 12:12:52 +010072 size_t data_length,
Maulik Patel28659c42021-01-06 14:09:22 +000073 psa_key_id_t *key)
Antonio de Angelis8908f472018-08-31 15:44:25 +010074{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000075 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +010076 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +080077 .srv_id = TFM_CRYPTO_IMPORT_KEY_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +010078 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000079 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +010080 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +010081 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000082 {.base = data, .len = data_length}
83 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +010084 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000085 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +010086 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010087
Antonio de Angelis04debbd2019-10-14 12:12:52 +010088 status = API_DISPATCH(tfm_crypto_import_key,
89 TFM_CRYPTO_IMPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +010090
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000091 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +010092}
93
Maulik Patel28659c42021-01-06 14:09:22 +000094psa_status_t psa_destroy_key(psa_key_id_t key)
Antonio de Angelis8908f472018-08-31 15:44:25 +010095{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000096 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +010097 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +080098 .srv_id = TFM_CRYPTO_DESTROY_KEY_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 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100104
Antonio de Angelis4743e672019-04-11 11:38:48 +0100105 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_destroy_key,
106 TFM_CRYPTO_DESTROY_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100107
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000108 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100109}
110
Maulik Patel28659c42021-01-06 14:09:22 +0000111psa_status_t psa_get_key_attributes(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100112 psa_key_attributes_t *attributes)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100113{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000114 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100115 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800116 .srv_id = TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000117 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100118 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000119 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100120 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000121 };
122 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100123 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000124 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100125
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100126 status = API_DISPATCH(tfm_crypto_get_key_attributes,
127 TFM_CRYPTO_GET_KEY_ATTRIBUTES);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000128 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100129}
130
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100131void psa_reset_key_attributes(psa_key_attributes_t *attributes)
132{
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100133 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800134 .srv_id = TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100135 };
136 psa_invec in_vec[] = {
137 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
138 };
139 psa_outvec out_vec[] = {
140 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
141 };
142
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100143 (void)API_DISPATCH(tfm_crypto_reset_key_attributes,
Summer Qinaee07882021-03-29 15:44:27 +0800144 TFM_CRYPTO_RESET_KEY_ATTRIBUTES);
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100145 return;
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100146}
147
Maulik Patel28659c42021-01-06 14:09:22 +0000148psa_status_t psa_export_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100149 uint8_t *data,
150 size_t data_size,
151 size_t *data_length)
152{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000153 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100154 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800155 .srv_id = TFM_CRYPTO_EXPORT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000156 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100157 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000158 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100159 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000160 };
161 psa_outvec out_vec[] = {
162 {.base = data, .len = data_size}
163 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100164
Antonio de Angelis4743e672019-04-11 11:38:48 +0100165 status = API_DISPATCH(tfm_crypto_export_key,
166 TFM_CRYPTO_EXPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100167
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000168 *data_length = out_vec[0].len;
169
170 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100171}
172
Maulik Patel28659c42021-01-06 14:09:22 +0000173psa_status_t psa_export_public_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100174 uint8_t *data,
175 size_t data_size,
176 size_t *data_length)
177{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100178 psa_status_t status;
179 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800180 .srv_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000181 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100182 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000183
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100184 psa_invec in_vec[] = {
185 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
186 };
187 psa_outvec out_vec[] = {
188 {.base = data, .len = data_size}
189 };
190
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100191 status = API_DISPATCH(tfm_crypto_export_public_key,
192 TFM_CRYPTO_EXPORT_PUBLIC_KEY);
193
194 *data_length = out_vec[0].len;
195
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100196 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100197}
198
Maulik Patel28659c42021-01-06 14:09:22 +0000199psa_status_t psa_purge_key(psa_key_id_t key)
200{
201 psa_status_t status;
202 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800203 .srv_id = TFM_CRYPTO_PURGE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000204 .key_id = key,
205 };
206 psa_invec in_vec[] = {
207 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
208 };
209
Maulik Patel28659c42021-01-06 14:09:22 +0000210 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_purge_key,
211 TFM_CRYPTO_PURGE_KEY);
Maulik Patel28659c42021-01-06 14:09:22 +0000212 return status;
213}
214
215psa_status_t psa_copy_key(psa_key_id_t source_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100216 const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +0000217 psa_key_id_t *target_key)
Jamie Foxefd82732018-11-26 10:34:32 +0000218{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100219 psa_status_t status;
220 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800221 .srv_id = TFM_CRYPTO_COPY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000222 .key_id = source_key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100223 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000224
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100225 psa_invec in_vec[] = {
226 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100227 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100228 };
229
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000230 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000231 {.base = target_key, .len = sizeof(psa_key_id_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000232 };
Jamie Foxefd82732018-11-26 10:34:32 +0000233
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100234 status = API_DISPATCH(tfm_crypto_copy_key,
235 TFM_CRYPTO_COPY_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +0800236
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000237 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000238}
239
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100240psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
241 unsigned char *iv,
242 size_t iv_size,
243 size_t *iv_length)
244{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100245 psa_status_t status;
246 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800247 .srv_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100248 .op_handle = operation->handle,
249 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100250
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100251 psa_invec in_vec[] = {
252 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
253 };
254 psa_outvec out_vec[] = {
255 {.base = &(operation->handle), .len = sizeof(uint32_t)},
256 {.base = iv, .len = iv_size},
257 };
258
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100259 status = API_DISPATCH(tfm_crypto_cipher_generate_iv,
260 TFM_CRYPTO_CIPHER_GENERATE_IV);
261
262 *iv_length = out_vec[1].len;
263
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100264 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100265}
266
Antonio de Angelis377a1552018-11-22 17:02:40 +0000267psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
268 const unsigned char *iv,
269 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100270{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000271 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100272 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800273 .srv_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100274 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100275 };
276
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000277 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100278 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000279 {.base = iv, .len = iv_length},
280 };
281 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100282 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000283 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100284
Antonio de Angelis4743e672019-04-11 11:38:48 +0100285 status = API_DISPATCH(tfm_crypto_cipher_set_iv,
286 TFM_CRYPTO_CIPHER_SET_IV);
Kevin Peng9449a362019-07-29 16:05:42 +0800287
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000288 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100289}
290
Antonio de Angelis377a1552018-11-22 17:02:40 +0000291psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000292 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000293 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100294{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000295 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100296 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800297 .srv_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000298 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100299 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100300 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000301 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100302
Antonio de Angelis4743e672019-04-11 11:38:48 +0100303 psa_invec in_vec[] = {
304 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
305 };
306 psa_outvec out_vec[] = {
307 {.base = &(operation->handle), .len = sizeof(uint32_t)},
308 };
309
Antonio de Angelis4743e672019-04-11 11:38:48 +0100310 status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup,
311 TFM_CRYPTO_CIPHER_ENCRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800312
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000313 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100314}
315
Antonio de Angelis377a1552018-11-22 17:02:40 +0000316psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000317 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000318 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100319{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000320 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100321 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800322 .srv_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000323 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100324 .alg = alg,
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 Angelis4743e672019-04-11 11:38:48 +0100335 status = API_DISPATCH(tfm_crypto_cipher_decrypt_setup,
336 TFM_CRYPTO_CIPHER_DECRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800337
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000338 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100339}
340
341psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
342 const uint8_t *input,
343 size_t input_length,
344 unsigned char *output,
345 size_t output_size,
346 size_t *output_length)
347{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000348 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100349 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800350 .srv_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100351 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100352 };
353
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000354 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100355 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000356 {.base = input, .len = input_length},
357 };
358 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100359 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000360 {.base = output, .len = output_size}
361 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100362
Antonio de Angelis4743e672019-04-11 11:38:48 +0100363 status = API_DISPATCH(tfm_crypto_cipher_update,
364 TFM_CRYPTO_CIPHER_UPDATE);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100365
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000366 *output_length = out_vec[1].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100367
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000368 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100369}
370
371psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
372{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000373 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100374 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800375 .srv_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100376 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000377 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100378
Antonio de Angelis4743e672019-04-11 11:38:48 +0100379 psa_invec in_vec[] = {
380 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
381 };
382 psa_outvec out_vec[] = {
383 {.base = &(operation->handle), .len = sizeof(uint32_t)},
384 };
385
Antonio de Angelis4743e672019-04-11 11:38:48 +0100386 status = API_DISPATCH(tfm_crypto_cipher_abort,
387 TFM_CRYPTO_CIPHER_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800388
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000389 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100390}
391
392psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
393 uint8_t *output,
394 size_t output_size,
395 size_t *output_length)
396{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000397 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100398 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800399 .srv_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100400 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100401 };
402
403 psa_invec in_vec[] = {
404 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
405 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000406 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100407 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000408 {.base = output, .len = output_size},
409 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100410
Antonio de Angelis4743e672019-04-11 11:38:48 +0100411 status = API_DISPATCH(tfm_crypto_cipher_finish,
412 TFM_CRYPTO_CIPHER_FINISH);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100413
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000414 *output_length = out_vec[1].len;
415
416 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100417}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100418
Antonio de Angelis377a1552018-11-22 17:02:40 +0000419psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100420 psa_algorithm_t alg)
421{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000422 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100423 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800424 .srv_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100425 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100426 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000427 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100428
Antonio de Angelis4743e672019-04-11 11:38:48 +0100429 psa_invec in_vec[] = {
430 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
431 };
432 psa_outvec out_vec[] = {
433 {.base = &(operation->handle), .len = sizeof(uint32_t)},
434 };
435
Antonio de Angelis4743e672019-04-11 11:38:48 +0100436 status = API_DISPATCH(tfm_crypto_hash_setup,
437 TFM_CRYPTO_HASH_SETUP);
438
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000439 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100440}
441
442psa_status_t psa_hash_update(psa_hash_operation_t *operation,
443 const uint8_t *input,
444 size_t input_length)
445{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000446 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100447 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800448 .srv_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100449 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100450 };
451
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000452 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100453 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000454 {.base = input, .len = input_length},
455 };
456 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100457 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000458 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100459
Antonio de Angelis4743e672019-04-11 11:38:48 +0100460 status = API_DISPATCH(tfm_crypto_hash_update,
461 TFM_CRYPTO_HASH_UPDATE);
462
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000463 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100464}
465
466psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
467 uint8_t *hash,
468 size_t hash_size,
469 size_t *hash_length)
470{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000471 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100472 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800473 .srv_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100474 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100475 };
476
477 psa_invec in_vec[] = {
478 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
479 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000480 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100481 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000482 {.base = hash, .len = hash_size},
483 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100484
Antonio de Angelis4743e672019-04-11 11:38:48 +0100485 status = API_DISPATCH(tfm_crypto_hash_finish,
486 TFM_CRYPTO_HASH_FINISH);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100487
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000488 *hash_length = out_vec[1].len;
489
490 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100491}
492
493psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
494 const uint8_t *hash,
495 size_t hash_length)
496{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000497 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100498 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800499 .srv_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100500 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100501 };
502
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000503 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100504 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000505 {.base = hash, .len = hash_length},
506 };
507 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100508 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000509 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100510
Antonio de Angelis4743e672019-04-11 11:38:48 +0100511 status = API_DISPATCH(tfm_crypto_hash_verify,
512 TFM_CRYPTO_HASH_VERIFY);
Kevin Peng9449a362019-07-29 16:05:42 +0800513
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000514 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100515}
516
517psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
518{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000519 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100520 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800521 .srv_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100522 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000523 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100524
Antonio de Angelis4743e672019-04-11 11:38:48 +0100525 psa_invec in_vec[] = {
526 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
527 };
528 psa_outvec out_vec[] = {
529 {.base = &(operation->handle), .len = sizeof(uint32_t)},
530 };
531
Antonio de Angelis4743e672019-04-11 11:38:48 +0100532 status = API_DISPATCH(tfm_crypto_hash_abort,
533 TFM_CRYPTO_HASH_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800534
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000535 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100536}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100537
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100538psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
539 psa_hash_operation_t *target_operation)
540{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100541 psa_status_t status;
542 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800543 .srv_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100544 .op_handle = source_operation->handle,
545 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100546
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100547 psa_invec in_vec[] = {
548 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
549 };
550 psa_outvec out_vec[] = {
551 {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
552 };
553
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100554 if (target_operation && (target_operation->handle != 0)) {
555 return PSA_ERROR_BAD_STATE;
556 }
557
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100558 status = API_DISPATCH(tfm_crypto_hash_clone,
559 TFM_CRYPTO_HASH_CLONE);
Kevin Peng9449a362019-07-29 16:05:42 +0800560
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100561 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100562}
563
Soby Mathew07ef6e42020-07-20 21:09:23 +0100564psa_status_t psa_hash_compute(psa_algorithm_t alg,
565 const uint8_t *input,
566 size_t input_length,
567 uint8_t *hash,
568 size_t hash_size,
569 size_t *hash_length)
570{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100571 psa_status_t status;
572 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800573 .srv_id = TFM_CRYPTO_HASH_COMPUTE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100574 .alg = alg,
575 };
576
577 psa_invec in_vec[] = {
578 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
579 {.base = input, .len = input_length},
580 };
581
582 psa_outvec out_vec[] = {
583 {.base = hash, .len = hash_size}
584 };
585
Soby Mathew07ef6e42020-07-20 21:09:23 +0100586 status = API_DISPATCH(tfm_crypto_hash_compute,
587 TFM_CRYPTO_HASH_COMPUTE);
588
589 *hash_length = out_vec[0].len;
590
Soby Mathew07ef6e42020-07-20 21:09:23 +0100591 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100592}
593
594psa_status_t psa_hash_compare(psa_algorithm_t alg,
595 const uint8_t *input,
596 size_t input_length,
597 const uint8_t *hash,
598 size_t hash_length)
599{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100600 psa_status_t status;
601 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800602 .srv_id = TFM_CRYPTO_HASH_COMPARE_SID,
Soby Mathew07ef6e42020-07-20 21:09:23 +0100603 .alg = alg,
604 };
605
606 psa_invec in_vec[] = {
607 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
608 {.base = input, .len = input_length},
609 {.base = hash, .len = hash_length},
610 };
611
Soby Mathew07ef6e42020-07-20 21:09:23 +0100612 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_hash_compare,
613 TFM_CRYPTO_HASH_COMPARE);
614
Soby Mathew07ef6e42020-07-20 21:09:23 +0100615 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100616}
617
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100618psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000619 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100620 psa_algorithm_t alg)
621{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000622 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100623 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800624 .srv_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000625 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100626 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100627 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000628 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100629
Antonio de Angelis4743e672019-04-11 11:38:48 +0100630 psa_invec in_vec[] = {
631 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
632 };
633 psa_outvec out_vec[] = {
634 {.base = &(operation->handle), .len = sizeof(uint32_t)},
635 };
636
Antonio de Angelis4743e672019-04-11 11:38:48 +0100637 status = API_DISPATCH(tfm_crypto_mac_sign_setup,
638 TFM_CRYPTO_MAC_SIGN_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800639
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000640 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100641}
642
643psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000644 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100645 psa_algorithm_t alg)
646{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000647 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100648 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800649 .srv_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000650 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100651 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100652 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000653 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100654
Antonio de Angelis4743e672019-04-11 11:38:48 +0100655 psa_invec in_vec[] = {
656 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
657 };
658 psa_outvec out_vec[] = {
659 {.base = &(operation->handle), .len = sizeof(uint32_t)},
660 };
661
Antonio de Angelis4743e672019-04-11 11:38:48 +0100662 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
663 TFM_CRYPTO_MAC_VERIFY_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800664
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000665 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100666}
667
668psa_status_t psa_mac_update(psa_mac_operation_t *operation,
669 const uint8_t *input,
670 size_t input_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 = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800674 .srv_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100675 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100676 };
677
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000678 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100679 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000680 {.base = input, .len = input_length},
681 };
682 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100683 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000684 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100685
Antonio de Angelis4743e672019-04-11 11:38:48 +0100686 status = API_DISPATCH(tfm_crypto_mac_update,
687 TFM_CRYPTO_MAC_UPDATE);
Kevin Peng9449a362019-07-29 16:05:42 +0800688
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000689 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100690}
691
692psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
693 uint8_t *mac,
694 size_t mac_size,
695 size_t *mac_length)
696{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000697 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100698 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800699 .srv_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100700 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100701 };
702
703 psa_invec in_vec[] = {
704 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
705 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000706 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100707 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000708 {.base = mac, .len = mac_size},
709 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100710
Antonio de Angelis4743e672019-04-11 11:38:48 +0100711 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
712 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100713
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000714 *mac_length = out_vec[1].len;
715
716 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100717}
718
719psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
720 const uint8_t *mac,
721 size_t mac_length)
722{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000723 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100724 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800725 .srv_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100726 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100727 };
728
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000729 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100730 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000731 {.base = mac, .len = mac_length},
732 };
733 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100734 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000735 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100736
Antonio de Angelis4743e672019-04-11 11:38:48 +0100737 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
738 TFM_CRYPTO_MAC_VERIFY_FINISH);
739
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000740 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100741}
742
743psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
744{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000745 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100746 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800747 .srv_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100748 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000749 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100750
Antonio de Angelis4743e672019-04-11 11:38:48 +0100751 psa_invec in_vec[] = {
752 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
753 };
754 psa_outvec out_vec[] = {
755 {.base = &(operation->handle), .len = sizeof(uint32_t)},
756 };
757
Antonio de Angelis4743e672019-04-11 11:38:48 +0100758 status = API_DISPATCH(tfm_crypto_mac_abort,
759 TFM_CRYPTO_MAC_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800760
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000761 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100762}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000763
Maulik Patel28659c42021-01-06 14:09:22 +0000764psa_status_t psa_aead_encrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000765 psa_algorithm_t alg,
766 const uint8_t *nonce,
767 size_t nonce_length,
768 const uint8_t *additional_data,
769 size_t additional_data_length,
770 const uint8_t *plaintext,
771 size_t plaintext_length,
772 uint8_t *ciphertext,
773 size_t ciphertext_size,
774 size_t *ciphertext_length)
775{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000776 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100777 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800778 .srv_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000779 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100780 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000781 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000782 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100783
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100784 /* Sanitize the optional input */
785 if ((additional_data == NULL) && (additional_data_length != 0)) {
786 return PSA_ERROR_INVALID_ARGUMENT;
787 }
788
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000789 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000790 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000791 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100792 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000793 };
794 psa_outvec out_vec[] = {
795 {.base = ciphertext, .len = ciphertext_size},
796 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000797
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000798 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
799 return PSA_ERROR_INVALID_ARGUMENT;
800 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000801
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000802 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000803 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100804 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000805 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000806 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000807 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000808
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000809 in_vec[0].base = &iov;
810 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
811
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800812 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000813
Antonio de Angelis4743e672019-04-11 11:38:48 +0100814 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100815 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100816 }
Summer Qinaee07882021-03-29 15:44:27 +0800817 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800818 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000819
820 *ciphertext_length = out_vec[0].len;
821
822 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000823}
824
Maulik Patel28659c42021-01-06 14:09:22 +0000825psa_status_t psa_aead_decrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000826 psa_algorithm_t alg,
827 const uint8_t *nonce,
828 size_t nonce_length,
829 const uint8_t *additional_data,
830 size_t additional_data_length,
831 const uint8_t *ciphertext,
832 size_t ciphertext_length,
833 uint8_t *plaintext,
834 size_t plaintext_size,
835 size_t *plaintext_length)
836{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000837 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100838 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800839 .srv_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000840 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100841 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000842 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000843 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100844
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100845 /* Sanitize the optional input */
846 if ((additional_data == NULL) && (additional_data_length != 0)) {
847 return PSA_ERROR_INVALID_ARGUMENT;
848 }
849
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000850 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000851 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000852 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100853 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000854 };
855 psa_outvec out_vec[] = {
856 {.base = plaintext, .len = plaintext_size},
857 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000858
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000859 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
860 return PSA_ERROR_INVALID_ARGUMENT;
861 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000862
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000863 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000864 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100865 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000866 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000867 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000868 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000869
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000870 in_vec[0].base = &iov;
871 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
872
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800873 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +0000874
Antonio de Angelis4743e672019-04-11 11:38:48 +0100875 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100876 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100877 }
Summer Qinaee07882021-03-29 15:44:27 +0800878 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800879 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000880
881 *plaintext_length = out_vec[0].len;
882
883 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000884}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100885
Antonio de Angelis8d282482021-10-07 15:04:12 +0100886psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
887 psa_key_id_t key,
888 psa_algorithm_t alg)
889{
890 psa_status_t status;
891 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800892 .srv_id = TFM_CRYPTO_AEAD_ENCRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100893 .key_id = key,
894 .alg = alg,
895 .op_handle = operation->handle,
896 };
897
898 psa_invec in_vec[] = {
899 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
900 };
901 psa_outvec out_vec[] = {
902 {.base = &(operation->handle), .len = sizeof(uint32_t)}
903 };
904
905 status = API_DISPATCH(tfm_crypto_aead_encrypt_setup,
906 TFM_CRYPTO_AEAD_ENCRYPT_SETUP);
907 return status;
908}
909
910psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
911 psa_key_id_t key,
912 psa_algorithm_t alg)
913{
914 psa_status_t status;
915 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800916 .srv_id = TFM_CRYPTO_AEAD_DECRYPT_SETUP_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100917 .key_id = key,
918 .alg = alg,
919 .op_handle = operation->handle,
920 };
921
922 psa_invec in_vec[] = {
923 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
924 };
925 psa_outvec out_vec[] = {
926 {.base = &(operation->handle), .len = sizeof(uint32_t)}
927 };
928
929 status = API_DISPATCH(tfm_crypto_aead_decrypt_setup,
930 TFM_CRYPTO_AEAD_DECRYPT_SETUP);
931 return status;
932}
933
934psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
935 uint8_t *nonce,
936 size_t nonce_size,
937 size_t *nonce_length)
938{
939 psa_status_t status;
940 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800941 .srv_id = TFM_CRYPTO_AEAD_GENERATE_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100942 .op_handle = operation->handle,
943 };
944
945 psa_invec in_vec[] = {
946 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
947 };
948 psa_outvec out_vec[] = {
949 {.base = &(operation->handle), .len = sizeof(uint32_t)},
950 {.base = nonce, .len = nonce_size}
951 };
952
953 status = API_DISPATCH(tfm_crypto_aead_generate_nonce,
954 TFM_CRYPTO_AEAD_GENERATE_NONCE);
955
956 *nonce_length = out_vec[1].len;
957 return status;
958}
959
960psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
961 const uint8_t *nonce,
962 size_t nonce_length)
963{
964 psa_status_t status;
965 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800966 .srv_id = TFM_CRYPTO_AEAD_SET_NONCE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100967 .op_handle = operation->handle,
968 };
969
970 psa_invec in_vec[] = {
971 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
972 {.base = nonce, .len = nonce_length}
973 };
974 psa_outvec out_vec[] = {
975 {.base = &(operation->handle), .len = sizeof(uint32_t)}
976 };
977
978 status = API_DISPATCH(tfm_crypto_aead_set_nonce,
979 TFM_CRYPTO_AEAD_SET_NONCE);
980 return status;
981}
982
983psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
984 size_t ad_length,
985 size_t plaintext_length)
986{
987 psa_status_t status;
988 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +0800989 .srv_id = TFM_CRYPTO_AEAD_SET_LENGTHS_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100990 .ad_length = ad_length,
991 .plaintext_length = plaintext_length,
992 .op_handle = operation->handle,
993 };
994
995 psa_invec in_vec[] = {
996 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
997 };
998 psa_outvec out_vec[] = {
999 {.base = &(operation->handle), .len = sizeof(uint32_t)}
1000 };
1001
1002 status = API_DISPATCH(tfm_crypto_aead_set_lengths,
1003 TFM_CRYPTO_AEAD_SET_LENGTHS);
1004 return status;
1005}
1006
1007psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1008 const uint8_t *input,
1009 size_t input_length)
1010{
1011 psa_status_t status;
1012 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001013 .srv_id = TFM_CRYPTO_AEAD_UPDATE_AD_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001014 .op_handle = operation->handle,
1015 };
1016
Antonio de Angelisb15f79b2022-01-11 15:25:35 +00001017 /* Sanitize the optional input */
1018 if ((input == NULL) && (input_length != 0)) {
1019 return PSA_ERROR_INVALID_ARGUMENT;
1020 }
1021
Antonio de Angelis8d282482021-10-07 15:04:12 +01001022 psa_invec in_vec[] = {
1023 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1024 {.base = input, .len = input_length}
1025 };
1026 psa_outvec out_vec[] = {
1027 {.base = &(operation->handle), .len = sizeof(uint32_t)}
1028 };
1029
Antonio de Angelisb15f79b2022-01-11 15:25:35 +00001030 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001031
Antonio de Angelisb15f79b2022-01-11 15:25:35 +00001032 if (input == NULL) {
1033 in_len--;
1034 }
1035 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
1036 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis8d282482021-10-07 15:04:12 +01001037 return status;
1038}
1039
1040psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1041 const uint8_t *input,
1042 size_t input_length,
1043 uint8_t *output,
1044 size_t output_size,
1045 size_t *output_length)
1046{
1047 psa_status_t status;
1048 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001049 .srv_id = TFM_CRYPTO_AEAD_UPDATE_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001050 .op_handle = operation->handle,
1051 };
1052
Antonio de Angelisb15f79b2022-01-11 15:25:35 +00001053 /* Sanitize the optional input */
1054 if ((input == NULL) && (input_length != 0)) {
1055 return PSA_ERROR_INVALID_ARGUMENT;
1056 }
1057
Antonio de Angelis8d282482021-10-07 15:04:12 +01001058 psa_invec in_vec[] = {
1059 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1060 {.base = input, .len = input_length}
1061 };
1062 psa_outvec out_vec[] = {
1063 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisc26af632021-10-07 15:04:12 +01001064 {.base = output, .len = output_size},
Antonio de Angelis8d282482021-10-07 15:04:12 +01001065 };
1066
Antonio de Angelisb15f79b2022-01-11 15:25:35 +00001067 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001068
Antonio de Angelisb15f79b2022-01-11 15:25:35 +00001069 if (input == NULL) {
1070 in_len--;
1071 }
1072 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
1073 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis8d282482021-10-07 15:04:12 +01001074
1075 *output_length = out_vec[1].len;
1076 return status;
1077}
1078
1079psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1080 uint8_t *ciphertext,
1081 size_t ciphertext_size,
1082 size_t *ciphertext_length,
1083 uint8_t *tag,
1084 size_t tag_size,
1085 size_t *tag_length)
1086{
1087 psa_status_t status;
1088 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001089 .srv_id = TFM_CRYPTO_AEAD_FINISH_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001090 .op_handle = operation->handle,
1091 };
1092
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001093 /* Sanitize the optional output */
1094 if ((ciphertext == NULL) && (ciphertext_size != 0)) {
1095 return PSA_ERROR_INVALID_ARGUMENT;
1096 }
1097
Antonio de Angelis8d282482021-10-07 15:04:12 +01001098 psa_invec in_vec[] = {
1099 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1100 };
1101 psa_outvec out_vec[] = {
1102 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis8d282482021-10-07 15:04:12 +01001103 {.base = tag, .len = tag_size},
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001104 {.base = ciphertext, .len = ciphertext_size}
Antonio de Angelis8d282482021-10-07 15:04:12 +01001105 };
1106
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001107 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001108
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001109 if (ciphertext == NULL || ciphertext_size == 0) {
1110 out_len--;
1111 }
1112 if ((out_len == 3) && (ciphertext_length == NULL)) {
1113 return PSA_ERROR_INVALID_ARGUMENT;
1114 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001115
Antonio de Angelisc26af632021-10-07 15:04:12 +01001116 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
1117 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001118 out_vec, out_len);
1119
1120 *tag_length = out_vec[1].len;
1121
1122 if (out_len == 3) {
1123 *ciphertext_length = out_vec[2].len;
1124 } else {
1125 *ciphertext_length = 0;
1126 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001127 return status;
1128}
1129
1130psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1131 uint8_t *plaintext,
1132 size_t plaintext_size,
1133 size_t *plaintext_length,
1134 const uint8_t *tag,
1135 size_t tag_length)
1136{
1137 psa_status_t status;
1138 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001139 .srv_id = TFM_CRYPTO_AEAD_VERIFY_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001140 .op_handle = operation->handle,
1141 };
1142
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001143 /* Sanitize the optional output */
1144 if ((plaintext == NULL) && (plaintext_size != 0)) {
1145 return PSA_ERROR_INVALID_ARGUMENT;
1146 }
1147
Antonio de Angelis8d282482021-10-07 15:04:12 +01001148 psa_invec in_vec[] = {
1149 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1150 {.base = tag, .len = tag_length}
1151 };
1152 psa_outvec out_vec[] = {
1153 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1154 {.base = plaintext, .len = plaintext_size},
1155 };
1156
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001157 size_t out_len = IOVEC_LEN(out_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001158
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001159 if (plaintext == NULL || plaintext_size == 0) {
1160 out_len--;
1161 }
1162 if ((out_len == 2) && (plaintext_length == NULL)) {
1163 return PSA_ERROR_INVALID_ARGUMENT;
1164 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001165
Antonio de Angelisc26af632021-10-07 15:04:12 +01001166 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL,
1167 in_vec, IOVEC_LEN(in_vec),
Antonio de Angelis902fdd02022-01-07 13:37:12 +00001168 out_vec, out_len);
1169
1170 if (out_len == 2) {
1171 *plaintext_length = out_vec[1].len;
1172 } else {
1173 *plaintext_length = 0;
1174 }
Antonio de Angelis8d282482021-10-07 15:04:12 +01001175 return status;
1176}
1177
1178psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1179{
1180 psa_status_t status;
1181 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001182 .srv_id = TFM_CRYPTO_AEAD_ABORT_SID,
Antonio de Angelis8d282482021-10-07 15:04:12 +01001183 .op_handle = operation->handle,
1184 };
1185
1186 psa_invec in_vec[] = {
1187 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1188 };
1189 psa_outvec out_vec[] = {
1190 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1191 };
1192
1193 status = API_DISPATCH(tfm_crypto_aead_abort,
1194 TFM_CRYPTO_AEAD_ABORT);
1195 return status;
1196}
1197
Summer Qinb9492d22021-06-22 18:00:54 +08001198psa_status_t psa_sign_message(psa_key_id_t key,
1199 psa_algorithm_t alg,
1200 const uint8_t *input,
1201 size_t input_length,
1202 uint8_t *signature,
1203 size_t signature_size,
1204 size_t *signature_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001205{
Summer Qinb9492d22021-06-22 18:00:54 +08001206 psa_status_t status;
1207 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001208 .srv_id = TFM_CRYPTO_SIGN_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001209 .key_id = key,
1210 .alg = alg,
1211 };
1212
1213 psa_invec in_vec[] = {
1214 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1215 {.base = input, .len = input_length},
1216 };
1217 psa_outvec out_vec[] = {
1218 {.base = signature, .len = signature_size},
1219 };
1220
1221 status = API_DISPATCH(tfm_crypto_sign_message,
1222 TFM_CRYPTO_SIGN_MESSAGE);
1223
Antonio de Angelisf83a2082021-08-20 22:13:53 +01001224 *signature_length = out_vec[0].len;
Summer Qinb9492d22021-06-22 18:00:54 +08001225 return status;
1226}
1227
1228psa_status_t psa_verify_message(psa_key_id_t key,
1229 psa_algorithm_t alg,
1230 const uint8_t *input,
1231 size_t input_length,
1232 const uint8_t *signature,
1233 size_t signature_length)
1234{
1235 psa_status_t status;
1236 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001237 .srv_id = TFM_CRYPTO_VERIFY_MESSAGE_SID,
Summer Qinb9492d22021-06-22 18:00:54 +08001238 .key_id = key,
1239 .alg = alg
1240 };
1241
1242 psa_invec in_vec[] = {
1243 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1244 {.base = input, .len = input_length},
1245 {.base = signature, .len = signature_length}
1246 };
1247
1248 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_message,
1249 TFM_CRYPTO_VERIFY_MESSAGE);
1250
1251 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001252}
1253
Maulik Patel28659c42021-01-06 14:09:22 +00001254psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001255 psa_algorithm_t alg,
1256 const uint8_t *hash,
1257 size_t hash_length,
1258 uint8_t *signature,
1259 size_t signature_size,
1260 size_t *signature_length)
1261{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001262 psa_status_t status;
1263 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001264 .srv_id = TFM_CRYPTO_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001265 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001266 .alg = alg,
1267 };
1268
1269 psa_invec in_vec[] = {
1270 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1271 {.base = hash, .len = hash_length},
1272 };
1273 psa_outvec out_vec[] = {
1274 {.base = signature, .len = signature_size},
1275 };
1276
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001277 status = API_DISPATCH(tfm_crypto_sign_hash,
1278 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001279
1280 *signature_length = out_vec[0].len;
1281
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001282 return status;
1283}
1284
Maulik Patel28659c42021-01-06 14:09:22 +00001285psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001286 psa_algorithm_t alg,
1287 const uint8_t *hash,
1288 size_t hash_length,
1289 const uint8_t *signature,
1290 size_t signature_length)
1291{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001292 psa_status_t status;
1293 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001294 .srv_id = TFM_CRYPTO_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001295 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001296 .alg = alg
1297 };
1298
1299 psa_invec in_vec[] = {
1300 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1301 {.base = hash, .len = hash_length},
1302 {.base = signature, .len = signature_length}
1303 };
1304
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001305 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
1306 TFM_CRYPTO_VERIFY_HASH);
Kevin Peng9449a362019-07-29 16:05:42 +08001307
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001308 return status;
1309}
1310
Maulik Patel28659c42021-01-06 14:09:22 +00001311psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001312 psa_algorithm_t alg,
1313 const uint8_t *input,
1314 size_t input_length,
1315 const uint8_t *salt,
1316 size_t salt_length,
1317 uint8_t *output,
1318 size_t output_size,
1319 size_t *output_length)
1320{
1321 psa_status_t status;
1322 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001323 .srv_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001324 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001325 .alg = alg
1326 };
1327
1328 /* Sanitize the optional input */
1329 if ((salt == NULL) && (salt_length != 0)) {
1330 return PSA_ERROR_INVALID_ARGUMENT;
1331 }
1332
1333 psa_invec in_vec[] = {
1334 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1335 {.base = input, .len = input_length},
1336 {.base = salt, .len = salt_length}
1337 };
1338
1339 psa_outvec out_vec[] = {
1340 {.base = output, .len = output_size},
1341 };
1342
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001343 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001344
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001345 if (salt == NULL) {
1346 in_len--;
1347 }
Summer Qinaee07882021-03-29 15:44:27 +08001348 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001349 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001350
1351 *output_length = out_vec[0].len;
1352
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001353 return status;
1354}
1355
Maulik Patel28659c42021-01-06 14:09:22 +00001356psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001357 psa_algorithm_t alg,
1358 const uint8_t *input,
1359 size_t input_length,
1360 const uint8_t *salt,
1361 size_t salt_length,
1362 uint8_t *output,
1363 size_t output_size,
1364 size_t *output_length)
1365{
1366 psa_status_t status;
1367 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001368 .srv_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001369 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001370 .alg = alg
1371 };
1372
1373 /* Sanitize the optional input */
1374 if ((salt == NULL) && (salt_length != 0)) {
1375 return PSA_ERROR_INVALID_ARGUMENT;
1376 }
1377
1378 psa_invec in_vec[] = {
1379 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1380 {.base = input, .len = input_length},
1381 {.base = salt, .len = salt_length}
1382 };
1383
1384 psa_outvec out_vec[] = {
1385 {.base = output, .len = output_size},
1386 };
1387
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001388 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelisbd2d4622022-01-12 14:09:30 +00001389
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001390 if (salt == NULL) {
1391 in_len--;
1392 }
Summer Qinaee07882021-03-29 15:44:27 +08001393 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001394 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001395
1396 *output_length = out_vec[0].len;
1397
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001398 return status;
1399}
1400
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001401psa_status_t psa_key_derivation_get_capacity(
1402 const psa_key_derivation_operation_t *operation,
1403 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001404{
1405 psa_status_t status;
1406 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001407 .srv_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001408 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001409 };
1410
1411 psa_invec in_vec[] = {
1412 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1413 };
1414
1415 psa_outvec out_vec[] = {
1416 {.base = capacity, .len = sizeof(size_t)},
1417 };
1418
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001419 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1420 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Kevin Peng9449a362019-07-29 16:05:42 +08001421
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001422 return status;
1423}
1424
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001425psa_status_t psa_key_derivation_output_bytes(
1426 psa_key_derivation_operation_t *operation,
1427 uint8_t *output,
1428 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001429{
1430 psa_status_t status;
1431 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001432 .srv_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001433 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001434 };
1435
1436 psa_invec in_vec[] = {
1437 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1438 };
1439
1440 psa_outvec out_vec[] = {
1441 {.base = output, .len = output_length},
1442 };
1443
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001444 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1445 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Kevin Peng9449a362019-07-29 16:05:42 +08001446
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001447 return status;
1448}
1449
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001450psa_status_t psa_key_derivation_input_key(
1451 psa_key_derivation_operation_t *operation,
1452 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001453 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001454{
1455 psa_status_t status;
1456 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001457 .srv_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001458 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001459 .step = step,
1460 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001461 };
1462
1463 psa_invec in_vec[] = {
1464 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001465 };
1466
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001467 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1468 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +08001469
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001470 return status;
1471}
1472
Antonio de Angelis8d282482021-10-07 15:04:12 +01001473psa_status_t psa_key_derivation_abort(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001474{
1475 psa_status_t status;
1476 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001477 .srv_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001478 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001479 };
1480
1481 psa_invec in_vec[] = {
1482 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1483 };
1484
1485 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001486 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001487 };
1488
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001489 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1490 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001491
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001492 return status;
1493}
1494
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001495psa_status_t psa_key_derivation_key_agreement(
1496 psa_key_derivation_operation_t *operation,
1497 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001498 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001499 const uint8_t *peer_key,
1500 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001501{
1502 psa_status_t status;
1503 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001504 .srv_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001505 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001506 .step = step,
1507 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001508 };
1509
1510 psa_invec in_vec[] = {
1511 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1512 {.base = peer_key, .len = peer_key_length},
1513 };
1514
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001515 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1516 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001517
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001518 return status;
1519}
1520
1521psa_status_t psa_generate_random(uint8_t *output,
1522 size_t output_size)
1523{
1524 psa_status_t status;
1525 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001526 .srv_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001527 };
1528
1529 psa_invec in_vec[] = {
1530 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1531 };
1532
1533 psa_outvec out_vec[] = {
1534 {.base = output, .len = output_size},
1535 };
1536
1537 if (output_size == 0) {
1538 return PSA_SUCCESS;
1539 }
1540
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001541 status = API_DISPATCH(tfm_crypto_generate_random,
1542 TFM_CRYPTO_GENERATE_RANDOM);
1543
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001544 return status;
1545}
1546
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001547psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001548 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001549{
1550 psa_status_t status;
1551 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001552 .srv_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001553 };
1554
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001555 psa_invec in_vec[] = {
1556 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001557 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1558 };
1559
1560 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001561 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001562 };
1563
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001564 status = API_DISPATCH(tfm_crypto_generate_key,
1565 TFM_CRYPTO_GENERATE_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001566
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001567 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001568}
1569
Maulik Patel28659c42021-01-06 14:09:22 +00001570psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001571 psa_algorithm_t alg,
1572 const uint8_t *input,
1573 size_t input_length,
1574 uint8_t *mac,
1575 size_t mac_size,
1576 size_t *mac_length)
1577{
1578 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001579 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001580 .srv_id = TFM_CRYPTO_MAC_COMPUTE_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001581 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001582 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001583 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001584
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001585 psa_invec in_vec[] = {
1586 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Summer Qin045ec4a2021-07-07 14:28:04 +08001587 {.base = input, .len = input_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001588 };
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001589 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001590 {.base = mac, .len = mac_size},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001591 };
1592
1593 status = API_DISPATCH(tfm_crypto_mac_compute,
1594 TFM_CRYPTO_MAC_COMPUTE);
1595
1596 *mac_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001597 return status;
1598}
1599
Maulik Patel28659c42021-01-06 14:09:22 +00001600psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001601 psa_algorithm_t alg,
1602 const uint8_t *input,
1603 size_t input_length,
1604 const uint8_t *mac,
1605 const size_t mac_length)
1606{
1607 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001608 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001609 .srv_id = TFM_CRYPTO_MAC_VERIFY_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001610 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001611 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001612 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001613
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001614 psa_invec in_vec[] = {
1615 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1616 {.base = input, .len = input_length},
Summer Qin045ec4a2021-07-07 14:28:04 +08001617 {.base = mac, .len = mac_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001618 };
1619
1620 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_mac_verify,
1621 TFM_CRYPTO_MAC_VERIFY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001622
1623 return status;
1624}
1625
Maulik Patel28659c42021-01-06 14:09:22 +00001626psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001627 psa_algorithm_t alg,
1628 const uint8_t *input,
1629 size_t input_length,
1630 uint8_t *output,
1631 size_t output_size,
1632 size_t *output_length)
1633{
1634 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001635 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001636 .srv_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001637 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001638 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001639 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001640
Antonio de Angelis609f0002021-07-06 16:51:28 +02001641 psa_invec in_vec[] = {
1642 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1643 {.base = input, .len = input_length},
1644 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001645 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001646 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001647 };
1648
1649 status = API_DISPATCH(tfm_crypto_cipher_encrypt,
1650 TFM_CRYPTO_CIPHER_ENCRYPT);
1651
1652 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001653 return status;
1654}
1655
Maulik Patel28659c42021-01-06 14:09:22 +00001656psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001657 psa_algorithm_t alg,
1658 const uint8_t *input,
1659 size_t input_length,
1660 uint8_t *output,
1661 size_t output_size,
1662 size_t *output_length)
1663{
1664 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001665 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001666 .srv_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001667 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001668 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001669 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001670
Antonio de Angelis609f0002021-07-06 16:51:28 +02001671 psa_invec in_vec[] = {
1672 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1673 {.base = input, .len = input_length},
1674 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001675 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001676 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001677 };
1678
1679 status = API_DISPATCH(tfm_crypto_cipher_decrypt,
1680 TFM_CRYPTO_CIPHER_DECRYPT);
1681
1682 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001683 return status;
1684}
1685
1686psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001687 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001688 const uint8_t *peer_key,
1689 size_t peer_key_length,
1690 uint8_t *output,
1691 size_t output_size,
1692 size_t *output_length)
1693{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001694 psa_status_t status;
1695 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001696 .srv_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001697 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001698 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001699 };
1700
1701 psa_invec in_vec[] = {
1702 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1703 {.base = peer_key, .len = peer_key_length},
1704 };
1705
1706 psa_outvec out_vec[] = {
1707 {.base = output, .len = output_size},
1708 };
1709
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001710 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1711 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1712
1713 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001714
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001715 return status;
1716}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001717
1718psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1719 psa_algorithm_t alg)
1720{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001721 psa_status_t status;
1722 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001723 .srv_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001724 .alg = alg,
1725 .op_handle = operation->handle,
1726 };
1727
1728 psa_invec in_vec[] = {
1729 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1730 };
1731 psa_outvec out_vec[] = {
1732 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1733 };
1734
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001735 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1736 TFM_CRYPTO_KEY_DERIVATION_SETUP);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001737 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001738}
1739
1740psa_status_t psa_key_derivation_set_capacity(
1741 psa_key_derivation_operation_t *operation,
1742 size_t capacity)
1743{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001744 psa_status_t status;
1745 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001746 .srv_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001747 .capacity = capacity,
1748 .op_handle = operation->handle,
1749 };
1750
1751 psa_invec in_vec[] = {
1752 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1753 };
1754
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001755 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1756 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001757 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001758}
1759
1760psa_status_t psa_key_derivation_input_bytes(
1761 psa_key_derivation_operation_t *operation,
1762 psa_key_derivation_step_t step,
1763 const uint8_t *data,
1764 size_t data_length)
1765{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001766 psa_status_t status;
1767 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001768 .srv_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001769 .step = step,
1770 .op_handle = operation->handle,
1771 };
1772
1773 psa_invec in_vec[] = {
1774 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1775 {.base = data, .len = data_length},
1776 };
1777
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001778 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1779 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001780 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001781}
1782
1783psa_status_t psa_key_derivation_output_key(
1784 const psa_key_attributes_t *attributes,
1785 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001786 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001787{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001788 psa_status_t status;
1789 struct tfm_crypto_pack_iovec iov = {
Kevin Peng6aa48952022-01-28 15:40:46 +08001790 .srv_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001791 .op_handle = operation->handle,
1792 };
1793
1794 psa_invec in_vec[] = {
1795 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1796 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1797 };
1798
1799 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001800 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001801 };
1802
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001803 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1804 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001805 return status;
1806}