blob: a396a27c1c517cab9a5573a2e4e1ccbf1cb12109 [file] [log] [blame]
Antonio de Angelis8908f472018-08-31 15:44:25 +01001/*
Maulik Patel28659c42021-01-06 14:09:22 +00002 * Copyright (c) 2018-2021, 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
Jamie Fox0e54ebc2019-04-09 14:21:04 +010014#define API_DISPATCH(sfn_name, sfn_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
Jamie Fox0e54ebc2019-04-09 14:21:04 +010019#define API_DISPATCH_NO_OUTVEC(sfn_name, sfn_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 = {
37 .sfn_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 = {
57 .sfn_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 = {
Edison Ai080b2e22019-04-17 16:27:21 +080077 .sfn_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 = {
Edison Ai080b2e22019-04-17 16:27:21 +080098 .sfn_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 = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100116 .sfn_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 Angelis8908f472018-08-31 15:44:25 +0100128
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000129 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100130}
131
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100132void psa_reset_key_attributes(psa_key_attributes_t *attributes)
133{
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100134 struct tfm_crypto_pack_iovec iov = {
135 .sfn_id = TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID,
136 };
137 psa_invec in_vec[] = {
138 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
139 };
140 psa_outvec out_vec[] = {
141 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
142 };
143
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100144 (void)API_DISPATCH(tfm_crypto_reset_key_attributes,
Summer Qinaee07882021-03-29 15:44:27 +0800145 TFM_CRYPTO_RESET_KEY_ATTRIBUTES);
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100146
147 return;
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100148}
149
Maulik Patel28659c42021-01-06 14:09:22 +0000150psa_status_t psa_export_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 Angelisab85ccd2019-03-25 15:14:29 +0000155 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100156 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800157 .sfn_id = TFM_CRYPTO_EXPORT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000158 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100159 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000160 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100161 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000162 };
163 psa_outvec out_vec[] = {
164 {.base = data, .len = data_size}
165 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100166
Antonio de Angelis4743e672019-04-11 11:38:48 +0100167 status = API_DISPATCH(tfm_crypto_export_key,
168 TFM_CRYPTO_EXPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100169
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000170 *data_length = out_vec[0].len;
171
172 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100173}
174
Maulik Patel28659c42021-01-06 14:09:22 +0000175psa_status_t psa_export_public_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100176 uint8_t *data,
177 size_t data_size,
178 size_t *data_length)
179{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100180 psa_status_t status;
181 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800182 .sfn_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000183 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100184 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000185
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100186 psa_invec in_vec[] = {
187 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
188 };
189 psa_outvec out_vec[] = {
190 {.base = data, .len = data_size}
191 };
192
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100193 status = API_DISPATCH(tfm_crypto_export_public_key,
194 TFM_CRYPTO_EXPORT_PUBLIC_KEY);
195
196 *data_length = out_vec[0].len;
197
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100198 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100199}
200
Maulik Patel28659c42021-01-06 14:09:22 +0000201psa_status_t psa_purge_key(psa_key_id_t key)
202{
203 psa_status_t status;
204 struct tfm_crypto_pack_iovec iov = {
205 .sfn_id = TFM_CRYPTO_PURGE_KEY_SID,
206 .key_id = key,
207 };
208 psa_invec in_vec[] = {
209 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
210 };
211
Maulik Patel28659c42021-01-06 14:09:22 +0000212 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_purge_key,
213 TFM_CRYPTO_PURGE_KEY);
214
Maulik Patel28659c42021-01-06 14:09:22 +0000215 return status;
216}
217
218psa_status_t psa_copy_key(psa_key_id_t source_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100219 const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +0000220 psa_key_id_t *target_key)
Jamie Foxefd82732018-11-26 10:34:32 +0000221{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100222 psa_status_t status;
223 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800224 .sfn_id = TFM_CRYPTO_COPY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000225 .key_id = source_key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100226 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000227
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100228 psa_invec in_vec[] = {
229 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100230 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
231
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100232 };
233
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000234 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000235 {.base = target_key, .len = sizeof(psa_key_id_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000236 };
Jamie Foxefd82732018-11-26 10:34:32 +0000237
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100238 status = API_DISPATCH(tfm_crypto_copy_key,
239 TFM_CRYPTO_COPY_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +0800240
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000241 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000242}
243
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100244psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
245 unsigned char *iv,
246 size_t iv_size,
247 size_t *iv_length)
248{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100249 psa_status_t status;
250 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800251 .sfn_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100252 .op_handle = operation->handle,
253 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100254
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100255 psa_invec in_vec[] = {
256 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
257 };
258 psa_outvec out_vec[] = {
259 {.base = &(operation->handle), .len = sizeof(uint32_t)},
260 {.base = iv, .len = iv_size},
261 };
262
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100263 status = API_DISPATCH(tfm_crypto_cipher_generate_iv,
264 TFM_CRYPTO_CIPHER_GENERATE_IV);
265
266 *iv_length = out_vec[1].len;
267
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100268 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100269}
270
Antonio de Angelis377a1552018-11-22 17:02:40 +0000271psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
272 const unsigned char *iv,
273 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100274{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000275 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100276 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800277 .sfn_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100278 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100279 };
280
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000281 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100282 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000283 {.base = iv, .len = iv_length},
284 };
285 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100286 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000287 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100288
Antonio de Angelis4743e672019-04-11 11:38:48 +0100289 status = API_DISPATCH(tfm_crypto_cipher_set_iv,
290 TFM_CRYPTO_CIPHER_SET_IV);
Kevin Peng9449a362019-07-29 16:05:42 +0800291
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000292 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100293}
294
Antonio de Angelis377a1552018-11-22 17:02:40 +0000295psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000296 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000297 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100298{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000299 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100300 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800301 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000302 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100303 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100304 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000305 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100306
Antonio de Angelis4743e672019-04-11 11:38:48 +0100307 psa_invec in_vec[] = {
308 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
309 };
310 psa_outvec out_vec[] = {
311 {.base = &(operation->handle), .len = sizeof(uint32_t)},
312 };
313
Antonio de Angelis4743e672019-04-11 11:38:48 +0100314 status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup,
315 TFM_CRYPTO_CIPHER_ENCRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800316
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000317 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100318}
319
Antonio de Angelis377a1552018-11-22 17:02:40 +0000320psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000321 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000322 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100323{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000324 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100325 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800326 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000327 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100328 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100329 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000330 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100331
Antonio de Angelis4743e672019-04-11 11:38:48 +0100332 psa_invec in_vec[] = {
333 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
334 };
335 psa_outvec out_vec[] = {
336 {.base = &(operation->handle), .len = sizeof(uint32_t)},
337 };
338
Antonio de Angelis4743e672019-04-11 11:38:48 +0100339 status = API_DISPATCH(tfm_crypto_cipher_decrypt_setup,
340 TFM_CRYPTO_CIPHER_DECRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800341
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000342 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100343}
344
345psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
346 const uint8_t *input,
347 size_t input_length,
348 unsigned char *output,
349 size_t output_size,
350 size_t *output_length)
351{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000352 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100353 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800354 .sfn_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100355 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100356 };
357
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000358 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100359 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000360 {.base = input, .len = input_length},
361 };
362 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100363 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000364 {.base = output, .len = output_size}
365 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100366
Antonio de Angelis4743e672019-04-11 11:38:48 +0100367 status = API_DISPATCH(tfm_crypto_cipher_update,
368 TFM_CRYPTO_CIPHER_UPDATE);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100369
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000370 *output_length = out_vec[1].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100371
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000372 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100373}
374
375psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
376{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000377 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100378 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800379 .sfn_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100380 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000381 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100382
Antonio de Angelis4743e672019-04-11 11:38:48 +0100383 psa_invec in_vec[] = {
384 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
385 };
386 psa_outvec out_vec[] = {
387 {.base = &(operation->handle), .len = sizeof(uint32_t)},
388 };
389
Antonio de Angelis4743e672019-04-11 11:38:48 +0100390 status = API_DISPATCH(tfm_crypto_cipher_abort,
391 TFM_CRYPTO_CIPHER_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800392
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000393 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100394}
395
396psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
397 uint8_t *output,
398 size_t output_size,
399 size_t *output_length)
400{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000401 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100402 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800403 .sfn_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100404 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100405 };
406
407 psa_invec in_vec[] = {
408 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
409 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000410 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100411 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000412 {.base = output, .len = output_size},
413 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100414
Antonio de Angelis4743e672019-04-11 11:38:48 +0100415 status = API_DISPATCH(tfm_crypto_cipher_finish,
416 TFM_CRYPTO_CIPHER_FINISH);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100417
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000418 *output_length = out_vec[1].len;
419
420 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100421}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100422
Antonio de Angelis377a1552018-11-22 17:02:40 +0000423psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100424 psa_algorithm_t alg)
425{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000426 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100427 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800428 .sfn_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100429 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100430 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000431 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100432
Antonio de Angelis4743e672019-04-11 11:38:48 +0100433 psa_invec in_vec[] = {
434 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
435 };
436 psa_outvec out_vec[] = {
437 {.base = &(operation->handle), .len = sizeof(uint32_t)},
438 };
439
Antonio de Angelis4743e672019-04-11 11:38:48 +0100440 status = API_DISPATCH(tfm_crypto_hash_setup,
441 TFM_CRYPTO_HASH_SETUP);
442
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000443 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100444}
445
446psa_status_t psa_hash_update(psa_hash_operation_t *operation,
447 const uint8_t *input,
448 size_t input_length)
449{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000450 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100451 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800452 .sfn_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100453 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100454 };
455
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000456 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100457 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000458 {.base = input, .len = input_length},
459 };
460 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100461 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000462 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100463
Antonio de Angelis4743e672019-04-11 11:38:48 +0100464 status = API_DISPATCH(tfm_crypto_hash_update,
465 TFM_CRYPTO_HASH_UPDATE);
466
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000467 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100468}
469
470psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
471 uint8_t *hash,
472 size_t hash_size,
473 size_t *hash_length)
474{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000475 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100476 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800477 .sfn_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100478 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100479 };
480
481 psa_invec in_vec[] = {
482 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
483 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000484 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100485 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000486 {.base = hash, .len = hash_size},
487 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100488
Antonio de Angelis4743e672019-04-11 11:38:48 +0100489 status = API_DISPATCH(tfm_crypto_hash_finish,
490 TFM_CRYPTO_HASH_FINISH);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100491
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000492 *hash_length = out_vec[1].len;
493
494 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100495}
496
497psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
498 const uint8_t *hash,
499 size_t hash_length)
500{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000501 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100502 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800503 .sfn_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100504 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100505 };
506
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000507 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100508 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000509 {.base = hash, .len = hash_length},
510 };
511 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100512 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000513 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100514
Antonio de Angelis4743e672019-04-11 11:38:48 +0100515 status = API_DISPATCH(tfm_crypto_hash_verify,
516 TFM_CRYPTO_HASH_VERIFY);
Kevin Peng9449a362019-07-29 16:05:42 +0800517
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000518 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100519}
520
521psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
522{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000523 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100524 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800525 .sfn_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100526 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000527 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100528
Antonio de Angelis4743e672019-04-11 11:38:48 +0100529 psa_invec in_vec[] = {
530 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
531 };
532 psa_outvec out_vec[] = {
533 {.base = &(operation->handle), .len = sizeof(uint32_t)},
534 };
535
Antonio de Angelis4743e672019-04-11 11:38:48 +0100536 status = API_DISPATCH(tfm_crypto_hash_abort,
537 TFM_CRYPTO_HASH_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800538
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000539 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100540}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100541
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100542psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
543 psa_hash_operation_t *target_operation)
544{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100545 psa_status_t status;
546 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800547 .sfn_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100548 .op_handle = source_operation->handle,
549 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100550
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100551 psa_invec in_vec[] = {
552 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
553 };
554 psa_outvec out_vec[] = {
555 {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
556 };
557
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100558 if (target_operation && (target_operation->handle != 0)) {
559 return PSA_ERROR_BAD_STATE;
560 }
561
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100562 status = API_DISPATCH(tfm_crypto_hash_clone,
563 TFM_CRYPTO_HASH_CLONE);
Kevin Peng9449a362019-07-29 16:05:42 +0800564
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100565 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100566}
567
Soby Mathew07ef6e42020-07-20 21:09:23 +0100568psa_status_t psa_hash_compute(psa_algorithm_t alg,
569 const uint8_t *input,
570 size_t input_length,
571 uint8_t *hash,
572 size_t hash_size,
573 size_t *hash_length)
574{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100575 psa_status_t status;
576 struct tfm_crypto_pack_iovec iov = {
577 .sfn_id = TFM_CRYPTO_HASH_COMPUTE_SID,
578 .alg = alg,
579 };
580
581 psa_invec in_vec[] = {
582 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
583 {.base = input, .len = input_length},
584 };
585
586 psa_outvec out_vec[] = {
587 {.base = hash, .len = hash_size}
588 };
589
Soby Mathew07ef6e42020-07-20 21:09:23 +0100590 status = API_DISPATCH(tfm_crypto_hash_compute,
591 TFM_CRYPTO_HASH_COMPUTE);
592
593 *hash_length = out_vec[0].len;
594
Soby Mathew07ef6e42020-07-20 21:09:23 +0100595 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100596}
597
598psa_status_t psa_hash_compare(psa_algorithm_t alg,
599 const uint8_t *input,
600 size_t input_length,
601 const uint8_t *hash,
602 size_t hash_length)
603{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100604 psa_status_t status;
605 struct tfm_crypto_pack_iovec iov = {
606 .sfn_id = TFM_CRYPTO_HASH_COMPARE_SID,
607 .alg = alg,
608 };
609
610 psa_invec in_vec[] = {
611 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
612 {.base = input, .len = input_length},
613 {.base = hash, .len = hash_length},
614 };
615
Soby Mathew07ef6e42020-07-20 21:09:23 +0100616 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_hash_compare,
617 TFM_CRYPTO_HASH_COMPARE);
618
Soby Mathew07ef6e42020-07-20 21:09:23 +0100619 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100620}
621
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100622psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000623 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100624 psa_algorithm_t alg)
625{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000626 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100627 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800628 .sfn_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000629 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100630 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100631 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000632 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100633
Antonio de Angelis4743e672019-04-11 11:38:48 +0100634 psa_invec in_vec[] = {
635 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
636 };
637 psa_outvec out_vec[] = {
638 {.base = &(operation->handle), .len = sizeof(uint32_t)},
639 };
640
Antonio de Angelis4743e672019-04-11 11:38:48 +0100641 status = API_DISPATCH(tfm_crypto_mac_sign_setup,
642 TFM_CRYPTO_MAC_SIGN_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800643
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000644 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100645}
646
647psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000648 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100649 psa_algorithm_t alg)
650{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000651 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100652 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800653 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000654 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100655 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100656 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000657 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100658
Antonio de Angelis4743e672019-04-11 11:38:48 +0100659 psa_invec in_vec[] = {
660 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
661 };
662 psa_outvec out_vec[] = {
663 {.base = &(operation->handle), .len = sizeof(uint32_t)},
664 };
665
Antonio de Angelis4743e672019-04-11 11:38:48 +0100666 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
667 TFM_CRYPTO_MAC_VERIFY_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800668
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000669 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100670}
671
672psa_status_t psa_mac_update(psa_mac_operation_t *operation,
673 const uint8_t *input,
674 size_t input_length)
675{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000676 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100677 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800678 .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100679 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100680 };
681
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000682 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100683 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000684 {.base = input, .len = input_length},
685 };
686 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100687 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000688 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100689
Antonio de Angelis4743e672019-04-11 11:38:48 +0100690 status = API_DISPATCH(tfm_crypto_mac_update,
691 TFM_CRYPTO_MAC_UPDATE);
Kevin Peng9449a362019-07-29 16:05:42 +0800692
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000693 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100694}
695
696psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
697 uint8_t *mac,
698 size_t mac_size,
699 size_t *mac_length)
700{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000701 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100702 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800703 .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100704 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100705 };
706
707 psa_invec in_vec[] = {
708 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
709 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000710 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100711 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000712 {.base = mac, .len = mac_size},
713 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100714
Antonio de Angelis4743e672019-04-11 11:38:48 +0100715 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
716 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100717
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000718 *mac_length = out_vec[1].len;
719
720 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100721}
722
723psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
724 const uint8_t *mac,
725 size_t mac_length)
726{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000727 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100728 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800729 .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100730 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100731 };
732
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000733 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100734 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000735 {.base = mac, .len = mac_length},
736 };
737 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100738 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000739 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100740
Antonio de Angelis4743e672019-04-11 11:38:48 +0100741 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
742 TFM_CRYPTO_MAC_VERIFY_FINISH);
743
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000744 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100745}
746
747psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
748{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000749 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100750 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800751 .sfn_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100752 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000753 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100754
Antonio de Angelis4743e672019-04-11 11:38:48 +0100755 psa_invec in_vec[] = {
756 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
757 };
758 psa_outvec out_vec[] = {
759 {.base = &(operation->handle), .len = sizeof(uint32_t)},
760 };
761
Antonio de Angelis4743e672019-04-11 11:38:48 +0100762 status = API_DISPATCH(tfm_crypto_mac_abort,
763 TFM_CRYPTO_MAC_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800764
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000765 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100766}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000767
Maulik Patel28659c42021-01-06 14:09:22 +0000768psa_status_t psa_aead_encrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000769 psa_algorithm_t alg,
770 const uint8_t *nonce,
771 size_t nonce_length,
772 const uint8_t *additional_data,
773 size_t additional_data_length,
774 const uint8_t *plaintext,
775 size_t plaintext_length,
776 uint8_t *ciphertext,
777 size_t ciphertext_size,
778 size_t *ciphertext_length)
779{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000780 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100781 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800782 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000783 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100784 .alg = alg,
785 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000786 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100787
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100788 /* Sanitize the optional input */
789 if ((additional_data == NULL) && (additional_data_length != 0)) {
790 return PSA_ERROR_INVALID_ARGUMENT;
791 }
792
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000793 size_t idx = 0;
794 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100795 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000796 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100797 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000798 };
799 psa_outvec out_vec[] = {
800 {.base = ciphertext, .len = ciphertext_size},
801 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000802
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000803 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
804 return PSA_ERROR_INVALID_ARGUMENT;
805 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000806
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000807 if (nonce != NULL) {
808 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100809 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000810 }
811 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000812
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800813 size_t in_len = IOVEC_LEN(in_vec);
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 = {
Edison Ai080b2e22019-04-17 16:27:21 +0800839 .sfn_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,
842 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
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 size_t idx = 0;
851 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100852 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000853 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100854 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000855 };
856 psa_outvec out_vec[] = {
857 {.base = plaintext, .len = plaintext_size},
858 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000859
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000860 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
861 return PSA_ERROR_INVALID_ARGUMENT;
862 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000863
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000864 if (nonce != NULL) {
865 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100866 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000867 }
868 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000869
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800870 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100871 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100872 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100873 }
Summer Qinaee07882021-03-29 15:44:27 +0800874 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800875 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000876
877 *plaintext_length = out_vec[0].len;
878
879 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000880}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100881
Summer Qinb9492d22021-06-22 18:00:54 +0800882psa_status_t psa_sign_message(psa_key_id_t key,
883 psa_algorithm_t alg,
884 const uint8_t *input,
885 size_t input_length,
886 uint8_t *signature,
887 size_t signature_size,
888 size_t *signature_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100889{
Summer Qinb9492d22021-06-22 18:00:54 +0800890 psa_status_t status;
891 struct tfm_crypto_pack_iovec iov = {
892 .sfn_id = TFM_CRYPTO_SIGN_MESSAGE_SID,
893 .key_id = key,
894 .alg = alg,
895 };
896
897 psa_invec in_vec[] = {
898 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
899 {.base = input, .len = input_length},
900 };
901 psa_outvec out_vec[] = {
902 {.base = signature, .len = signature_size},
903 };
904
905 status = API_DISPATCH(tfm_crypto_sign_message,
906 TFM_CRYPTO_SIGN_MESSAGE);
907
Antonio de Angelisf83a2082021-08-20 22:13:53 +0100908 *signature_length = out_vec[0].len;
Summer Qinb9492d22021-06-22 18:00:54 +0800909 return status;
910}
911
912psa_status_t psa_verify_message(psa_key_id_t key,
913 psa_algorithm_t alg,
914 const uint8_t *input,
915 size_t input_length,
916 const uint8_t *signature,
917 size_t signature_length)
918{
919 psa_status_t status;
920 struct tfm_crypto_pack_iovec iov = {
921 .sfn_id = TFM_CRYPTO_VERIFY_MESSAGE_SID,
922 .key_id = key,
923 .alg = alg
924 };
925
926 psa_invec in_vec[] = {
927 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
928 {.base = input, .len = input_length},
929 {.base = signature, .len = signature_length}
930 };
931
932 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_message,
933 TFM_CRYPTO_VERIFY_MESSAGE);
934
935 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100936}
937
Maulik Patel28659c42021-01-06 14:09:22 +0000938psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100939 psa_algorithm_t alg,
940 const uint8_t *hash,
941 size_t hash_length,
942 uint8_t *signature,
943 size_t signature_size,
944 size_t *signature_length)
945{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100946 psa_status_t status;
947 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100948 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000949 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100950 .alg = alg,
951 };
952
953 psa_invec in_vec[] = {
954 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
955 {.base = hash, .len = hash_length},
956 };
957 psa_outvec out_vec[] = {
958 {.base = signature, .len = signature_size},
959 };
960
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100961 status = API_DISPATCH(tfm_crypto_sign_hash,
962 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100963
964 *signature_length = out_vec[0].len;
965
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100966 return status;
967}
968
Maulik Patel28659c42021-01-06 14:09:22 +0000969psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100970 psa_algorithm_t alg,
971 const uint8_t *hash,
972 size_t hash_length,
973 const uint8_t *signature,
974 size_t signature_length)
975{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100976 psa_status_t status;
977 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100978 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000979 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100980 .alg = alg
981 };
982
983 psa_invec in_vec[] = {
984 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
985 {.base = hash, .len = hash_length},
986 {.base = signature, .len = signature_length}
987 };
988
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100989 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
990 TFM_CRYPTO_VERIFY_HASH);
Kevin Peng9449a362019-07-29 16:05:42 +0800991
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100992 return status;
993}
994
Maulik Patel28659c42021-01-06 14:09:22 +0000995psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100996 psa_algorithm_t alg,
997 const uint8_t *input,
998 size_t input_length,
999 const uint8_t *salt,
1000 size_t salt_length,
1001 uint8_t *output,
1002 size_t output_size,
1003 size_t *output_length)
1004{
1005 psa_status_t status;
1006 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001007 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001008 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001009 .alg = alg
1010 };
1011
1012 /* Sanitize the optional input */
1013 if ((salt == NULL) && (salt_length != 0)) {
1014 return PSA_ERROR_INVALID_ARGUMENT;
1015 }
1016
1017 psa_invec in_vec[] = {
1018 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1019 {.base = input, .len = input_length},
1020 {.base = salt, .len = salt_length}
1021 };
1022
1023 psa_outvec out_vec[] = {
1024 {.base = output, .len = output_size},
1025 };
1026
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001027 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001028 if (salt == NULL) {
1029 in_len--;
1030 }
Summer Qinaee07882021-03-29 15:44:27 +08001031 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001032 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001033
1034 *output_length = out_vec[0].len;
1035
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001036 return status;
1037}
1038
Maulik Patel28659c42021-01-06 14:09:22 +00001039psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001040 psa_algorithm_t alg,
1041 const uint8_t *input,
1042 size_t input_length,
1043 const uint8_t *salt,
1044 size_t salt_length,
1045 uint8_t *output,
1046 size_t output_size,
1047 size_t *output_length)
1048{
1049 psa_status_t status;
1050 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001051 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001052 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001053 .alg = alg
1054 };
1055
1056 /* Sanitize the optional input */
1057 if ((salt == NULL) && (salt_length != 0)) {
1058 return PSA_ERROR_INVALID_ARGUMENT;
1059 }
1060
1061 psa_invec in_vec[] = {
1062 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1063 {.base = input, .len = input_length},
1064 {.base = salt, .len = salt_length}
1065 };
1066
1067 psa_outvec out_vec[] = {
1068 {.base = output, .len = output_size},
1069 };
1070
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001071 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001072 if (salt == NULL) {
1073 in_len--;
1074 }
Summer Qinaee07882021-03-29 15:44:27 +08001075 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001076 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001077
1078 *output_length = out_vec[0].len;
1079
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001080 return status;
1081}
1082
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001083psa_status_t psa_key_derivation_get_capacity(
1084 const psa_key_derivation_operation_t *operation,
1085 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001086{
1087 psa_status_t status;
1088 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001089 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
1090 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001091 };
1092
1093 psa_invec in_vec[] = {
1094 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1095 };
1096
1097 psa_outvec out_vec[] = {
1098 {.base = capacity, .len = sizeof(size_t)},
1099 };
1100
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001101 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1102 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Kevin Peng9449a362019-07-29 16:05:42 +08001103
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001104 return status;
1105}
1106
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001107psa_status_t psa_key_derivation_output_bytes(
1108 psa_key_derivation_operation_t *operation,
1109 uint8_t *output,
1110 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001111{
1112 psa_status_t status;
1113 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001114 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
1115 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001116 };
1117
1118 psa_invec in_vec[] = {
1119 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1120 };
1121
1122 psa_outvec out_vec[] = {
1123 {.base = output, .len = output_length},
1124 };
1125
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001126 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1127 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Kevin Peng9449a362019-07-29 16:05:42 +08001128
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001129 return status;
1130}
1131
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001132psa_status_t psa_key_derivation_input_key(
1133 psa_key_derivation_operation_t *operation,
1134 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001135 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001136{
1137 psa_status_t status;
1138 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001139 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001140 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001141 .step = step,
1142 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001143 };
1144
1145 psa_invec in_vec[] = {
1146 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001147 };
1148
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001149 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1150 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +08001151
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001152 return status;
1153}
1154
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001155psa_status_t psa_key_derivation_abort(
1156 psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001157{
1158 psa_status_t status;
1159 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001160 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
1161 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001162 };
1163
1164 psa_invec in_vec[] = {
1165 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1166 };
1167
1168 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001169 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001170 };
1171
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001172 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1173 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001174
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001175 return status;
1176}
1177
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001178psa_status_t psa_key_derivation_key_agreement(
1179 psa_key_derivation_operation_t *operation,
1180 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001181 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001182 const uint8_t *peer_key,
1183 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001184{
1185 psa_status_t status;
1186 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001187 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001188 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001189 .step = step,
1190 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001191 };
1192
1193 psa_invec in_vec[] = {
1194 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1195 {.base = peer_key, .len = peer_key_length},
1196 };
1197
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001198 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1199 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001200
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001201 return status;
1202}
1203
1204psa_status_t psa_generate_random(uint8_t *output,
1205 size_t output_size)
1206{
1207 psa_status_t status;
1208 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001209 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001210 };
1211
1212 psa_invec in_vec[] = {
1213 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1214 };
1215
1216 psa_outvec out_vec[] = {
1217 {.base = output, .len = output_size},
1218 };
1219
1220 if (output_size == 0) {
1221 return PSA_SUCCESS;
1222 }
1223
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001224 status = API_DISPATCH(tfm_crypto_generate_random,
1225 TFM_CRYPTO_GENERATE_RANDOM);
1226
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001227 return status;
1228}
1229
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001230psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001231 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001232{
1233 psa_status_t status;
1234 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001235 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001236 };
1237
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001238 psa_invec in_vec[] = {
1239 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001240 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1241 };
1242
1243 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001244 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001245 };
1246
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001247 status = API_DISPATCH(tfm_crypto_generate_key,
1248 TFM_CRYPTO_GENERATE_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001249
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001250 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001251}
1252
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001253psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1254 const uint8_t *input,
1255 size_t input_length)
1256{
1257 psa_status_t status;
1258
1259 status = PSA_ERROR_NOT_SUPPORTED;
1260
1261 return status;
1262}
1263
1264psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1265 uint8_t *ciphertext,
1266 size_t ciphertext_size,
1267 size_t *ciphertext_length,
1268 uint8_t *tag,
1269 size_t tag_size,
1270 size_t *tag_length)
1271{
1272 psa_status_t status;
1273
1274 status = PSA_ERROR_NOT_SUPPORTED;
1275
1276 return status;
1277}
1278
1279psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1280 uint8_t *plaintext,
1281 size_t plaintext_size,
1282 size_t *plaintext_length,
1283 const uint8_t *tag,
1284 size_t tag_length)
1285{
1286 psa_status_t status;
1287
1288 status = PSA_ERROR_NOT_SUPPORTED;
1289
1290 return status;
1291}
1292
1293psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1294{
1295 psa_status_t status;
1296
1297 status = PSA_ERROR_NOT_SUPPORTED;
1298
1299 return status;
1300}
1301
Maulik Patel28659c42021-01-06 14:09:22 +00001302psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001303 psa_algorithm_t alg,
1304 const uint8_t *input,
1305 size_t input_length,
1306 uint8_t *mac,
1307 size_t mac_size,
1308 size_t *mac_length)
1309{
1310 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001311 struct tfm_crypto_pack_iovec iov = {
1312 .sfn_id = TFM_CRYPTO_MAC_COMPUTE_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001313 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001314 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001315 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001316
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001317 psa_invec in_vec[] = {
1318 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Summer Qin045ec4a2021-07-07 14:28:04 +08001319 {.base = input, .len = input_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001320 };
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001321 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001322 {.base = mac, .len = mac_size},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001323 };
1324
1325 status = API_DISPATCH(tfm_crypto_mac_compute,
1326 TFM_CRYPTO_MAC_COMPUTE);
1327
1328 *mac_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001329 return status;
1330}
1331
Maulik Patel28659c42021-01-06 14:09:22 +00001332psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001333 psa_algorithm_t alg,
1334 const uint8_t *input,
1335 size_t input_length,
1336 const uint8_t *mac,
1337 const size_t mac_length)
1338{
1339 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001340 struct tfm_crypto_pack_iovec iov = {
1341 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001342 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001343 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001344 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001345
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001346 psa_invec in_vec[] = {
1347 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1348 {.base = input, .len = input_length},
Summer Qin045ec4a2021-07-07 14:28:04 +08001349 {.base = mac, .len = mac_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001350 };
1351
1352 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_mac_verify,
1353 TFM_CRYPTO_MAC_VERIFY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001354
1355 return status;
1356}
1357
Maulik Patel28659c42021-01-06 14:09:22 +00001358psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001359 psa_algorithm_t alg,
1360 const uint8_t *input,
1361 size_t input_length,
1362 uint8_t *output,
1363 size_t output_size,
1364 size_t *output_length)
1365{
Antonio de Angelis609f0002021-07-06 16:51:28 +02001366#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
1367 return PSA_ERROR_NOT_SUPPORTED;
1368#else
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001369 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001370 struct tfm_crypto_pack_iovec iov = {
1371 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001372 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001373 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001374 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001375
Antonio de Angelis609f0002021-07-06 16:51:28 +02001376 psa_invec in_vec[] = {
1377 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1378 {.base = input, .len = input_length},
1379 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001380 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001381 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001382 };
1383
1384 status = API_DISPATCH(tfm_crypto_cipher_encrypt,
1385 TFM_CRYPTO_CIPHER_ENCRYPT);
1386
1387 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001388 return status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001389#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001390}
1391
Maulik Patel28659c42021-01-06 14:09:22 +00001392psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001393 psa_algorithm_t alg,
1394 const uint8_t *input,
1395 size_t input_length,
1396 uint8_t *output,
1397 size_t output_size,
1398 size_t *output_length)
1399{
Antonio de Angelis609f0002021-07-06 16:51:28 +02001400#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
1401 return PSA_ERROR_NOT_SUPPORTED;
1402#else
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001403 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001404 struct tfm_crypto_pack_iovec iov = {
1405 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001406 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001407 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001408 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001409
Antonio de Angelis609f0002021-07-06 16:51:28 +02001410 psa_invec in_vec[] = {
1411 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1412 {.base = input, .len = input_length},
1413 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001414 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001415 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001416 };
1417
1418 status = API_DISPATCH(tfm_crypto_cipher_decrypt,
1419 TFM_CRYPTO_CIPHER_DECRYPT);
1420
1421 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001422 return status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001423#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001424}
1425
1426psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001427 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001428 const uint8_t *peer_key,
1429 size_t peer_key_length,
1430 uint8_t *output,
1431 size_t output_size,
1432 size_t *output_length)
1433{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001434 psa_status_t status;
1435 struct tfm_crypto_pack_iovec iov = {
1436 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1437 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001438 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001439 };
1440
1441 psa_invec in_vec[] = {
1442 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1443 {.base = peer_key, .len = peer_key_length},
1444 };
1445
1446 psa_outvec out_vec[] = {
1447 {.base = output, .len = output_size},
1448 };
1449
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001450 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1451 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1452
1453 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001454
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001455 return status;
1456}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001457
1458psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1459 psa_algorithm_t alg)
1460{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001461 psa_status_t status;
1462 struct tfm_crypto_pack_iovec iov = {
1463 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1464 .alg = alg,
1465 .op_handle = operation->handle,
1466 };
1467
1468 psa_invec in_vec[] = {
1469 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1470 };
1471 psa_outvec out_vec[] = {
1472 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1473 };
1474
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001475 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1476 TFM_CRYPTO_KEY_DERIVATION_SETUP);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001477
1478 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001479}
1480
1481psa_status_t psa_key_derivation_set_capacity(
1482 psa_key_derivation_operation_t *operation,
1483 size_t capacity)
1484{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001485 psa_status_t status;
1486 struct tfm_crypto_pack_iovec iov = {
1487 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
1488 .capacity = capacity,
1489 .op_handle = operation->handle,
1490 };
1491
1492 psa_invec in_vec[] = {
1493 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1494 };
1495
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001496 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1497 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001498
1499 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001500}
1501
1502psa_status_t psa_key_derivation_input_bytes(
1503 psa_key_derivation_operation_t *operation,
1504 psa_key_derivation_step_t step,
1505 const uint8_t *data,
1506 size_t data_length)
1507{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001508 psa_status_t status;
1509 struct tfm_crypto_pack_iovec iov = {
1510 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1511 .step = step,
1512 .op_handle = operation->handle,
1513 };
1514
1515 psa_invec in_vec[] = {
1516 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1517 {.base = data, .len = data_length},
1518 };
1519
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001520 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1521 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001522
1523 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001524}
1525
1526psa_status_t psa_key_derivation_output_key(
1527 const psa_key_attributes_t *attributes,
1528 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001529 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001530{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001531 psa_status_t status;
1532 struct tfm_crypto_pack_iovec iov = {
1533 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1534 .op_handle = operation->handle,
1535 };
1536
1537 psa_invec in_vec[] = {
1538 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1539 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1540 };
1541
1542 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001543 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001544 };
1545
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001546 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1547 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001548
1549 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001550}
1551
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001552psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001553 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001554 psa_algorithm_t alg)
1555{
1556 psa_status_t status;
1557
1558 status = PSA_ERROR_NOT_SUPPORTED;
1559
1560 return status;
1561}
1562
1563psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001564 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001565 psa_algorithm_t alg)
1566{
1567 psa_status_t status;
1568
1569 status = PSA_ERROR_NOT_SUPPORTED;
1570
1571 return status;
1572}
1573
1574psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
1575 uint8_t *nonce,
1576 size_t nonce_size,
1577 size_t *nonce_length)
1578{
1579 psa_status_t status;
1580
1581 status = PSA_ERROR_NOT_SUPPORTED;
1582
1583 return status;
1584}
1585
1586psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
1587 const uint8_t *nonce,
1588 size_t nonce_length)
1589{
1590 psa_status_t status;
1591
1592 status = PSA_ERROR_NOT_SUPPORTED;
1593
1594 return status;
1595}
1596
1597psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
1598 size_t ad_length,
1599 size_t plaintext_length)
1600{
1601 psa_status_t status;
1602
1603 status = PSA_ERROR_NOT_SUPPORTED;
1604
1605 return status;
1606}
1607
1608psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1609 const uint8_t *input,
1610 size_t input_length,
1611 uint8_t *output,
1612 size_t output_size,
1613 size_t *output_length)
1614{
1615 psa_status_t status;
1616
1617 status = PSA_ERROR_NOT_SUPPORTED;
1618
1619 return status;
1620}