blob: 9dfa4737ecfde4969f83ba700ed6462e9bad3f49 [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)
889{
890 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
908 if (status == PSA_SUCCESS) {
909 *signature_length = out_vec[0].len;
910 }
911
912 return status;
913}
914
915psa_status_t psa_verify_message(psa_key_id_t key,
916 psa_algorithm_t alg,
917 const uint8_t *input,
918 size_t input_length,
919 const uint8_t *signature,
920 size_t signature_length)
921{
922 psa_status_t status;
923 struct tfm_crypto_pack_iovec iov = {
924 .sfn_id = TFM_CRYPTO_VERIFY_MESSAGE_SID,
925 .key_id = key,
926 .alg = alg
927 };
928
929 psa_invec in_vec[] = {
930 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
931 {.base = input, .len = input_length},
932 {.base = signature, .len = signature_length}
933 };
934
935 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_message,
936 TFM_CRYPTO_VERIFY_MESSAGE);
937
938 return status;
939}
940
Maulik Patel28659c42021-01-06 14:09:22 +0000941psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100942 psa_algorithm_t alg,
943 const uint8_t *hash,
944 size_t hash_length,
945 uint8_t *signature,
946 size_t signature_size,
947 size_t *signature_length)
948{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100949 psa_status_t status;
950 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100951 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000952 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100953 .alg = alg,
954 };
955
956 psa_invec in_vec[] = {
957 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
958 {.base = hash, .len = hash_length},
959 };
960 psa_outvec out_vec[] = {
961 {.base = signature, .len = signature_size},
962 };
963
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100964 status = API_DISPATCH(tfm_crypto_sign_hash,
965 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100966
967 *signature_length = out_vec[0].len;
968
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100969 return status;
970}
971
Maulik Patel28659c42021-01-06 14:09:22 +0000972psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100973 psa_algorithm_t alg,
974 const uint8_t *hash,
975 size_t hash_length,
976 const uint8_t *signature,
977 size_t signature_length)
978{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100979 psa_status_t status;
980 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100981 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000982 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100983 .alg = alg
984 };
985
986 psa_invec in_vec[] = {
987 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
988 {.base = hash, .len = hash_length},
989 {.base = signature, .len = signature_length}
990 };
991
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100992 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
993 TFM_CRYPTO_VERIFY_HASH);
Kevin Peng9449a362019-07-29 16:05:42 +0800994
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100995 return status;
996}
997
Maulik Patel28659c42021-01-06 14:09:22 +0000998psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100999 psa_algorithm_t alg,
1000 const uint8_t *input,
1001 size_t input_length,
1002 const uint8_t *salt,
1003 size_t salt_length,
1004 uint8_t *output,
1005 size_t output_size,
1006 size_t *output_length)
1007{
1008 psa_status_t status;
1009 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001010 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001011 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001012 .alg = alg
1013 };
1014
1015 /* Sanitize the optional input */
1016 if ((salt == NULL) && (salt_length != 0)) {
1017 return PSA_ERROR_INVALID_ARGUMENT;
1018 }
1019
1020 psa_invec in_vec[] = {
1021 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1022 {.base = input, .len = input_length},
1023 {.base = salt, .len = salt_length}
1024 };
1025
1026 psa_outvec out_vec[] = {
1027 {.base = output, .len = output_size},
1028 };
1029
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001030 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001031 if (salt == NULL) {
1032 in_len--;
1033 }
Summer Qinaee07882021-03-29 15:44:27 +08001034 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001035 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001036
1037 *output_length = out_vec[0].len;
1038
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001039 return status;
1040}
1041
Maulik Patel28659c42021-01-06 14:09:22 +00001042psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001043 psa_algorithm_t alg,
1044 const uint8_t *input,
1045 size_t input_length,
1046 const uint8_t *salt,
1047 size_t salt_length,
1048 uint8_t *output,
1049 size_t output_size,
1050 size_t *output_length)
1051{
1052 psa_status_t status;
1053 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001054 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001055 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001056 .alg = alg
1057 };
1058
1059 /* Sanitize the optional input */
1060 if ((salt == NULL) && (salt_length != 0)) {
1061 return PSA_ERROR_INVALID_ARGUMENT;
1062 }
1063
1064 psa_invec in_vec[] = {
1065 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1066 {.base = input, .len = input_length},
1067 {.base = salt, .len = salt_length}
1068 };
1069
1070 psa_outvec out_vec[] = {
1071 {.base = output, .len = output_size},
1072 };
1073
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001074 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001075 if (salt == NULL) {
1076 in_len--;
1077 }
Summer Qinaee07882021-03-29 15:44:27 +08001078 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001079 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001080
1081 *output_length = out_vec[0].len;
1082
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001083 return status;
1084}
1085
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001086psa_status_t psa_key_derivation_get_capacity(
1087 const psa_key_derivation_operation_t *operation,
1088 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001089{
1090 psa_status_t status;
1091 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001092 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
1093 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001094 };
1095
1096 psa_invec in_vec[] = {
1097 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1098 };
1099
1100 psa_outvec out_vec[] = {
1101 {.base = capacity, .len = sizeof(size_t)},
1102 };
1103
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001104 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1105 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Kevin Peng9449a362019-07-29 16:05:42 +08001106
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001107 return status;
1108}
1109
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001110psa_status_t psa_key_derivation_output_bytes(
1111 psa_key_derivation_operation_t *operation,
1112 uint8_t *output,
1113 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001114{
1115 psa_status_t status;
1116 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001117 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
1118 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001119 };
1120
1121 psa_invec in_vec[] = {
1122 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1123 };
1124
1125 psa_outvec out_vec[] = {
1126 {.base = output, .len = output_length},
1127 };
1128
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001129 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1130 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Kevin Peng9449a362019-07-29 16:05:42 +08001131
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001132 return status;
1133}
1134
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001135psa_status_t psa_key_derivation_input_key(
1136 psa_key_derivation_operation_t *operation,
1137 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001138 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001139{
1140 psa_status_t status;
1141 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001142 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001143 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001144 .step = step,
1145 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001146 };
1147
1148 psa_invec in_vec[] = {
1149 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001150 };
1151
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001152 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1153 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +08001154
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001155 return status;
1156}
1157
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001158psa_status_t psa_key_derivation_abort(
1159 psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001160{
1161 psa_status_t status;
1162 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001163 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
1164 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001165 };
1166
1167 psa_invec in_vec[] = {
1168 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1169 };
1170
1171 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001172 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001173 };
1174
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001175 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1176 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001177
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001178 return status;
1179}
1180
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001181psa_status_t psa_key_derivation_key_agreement(
1182 psa_key_derivation_operation_t *operation,
1183 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001184 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001185 const uint8_t *peer_key,
1186 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001187{
1188 psa_status_t status;
1189 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001190 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001191 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001192 .step = step,
1193 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001194 };
1195
1196 psa_invec in_vec[] = {
1197 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1198 {.base = peer_key, .len = peer_key_length},
1199 };
1200
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001201 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1202 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001203
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001204 return status;
1205}
1206
1207psa_status_t psa_generate_random(uint8_t *output,
1208 size_t output_size)
1209{
1210 psa_status_t status;
1211 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001212 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001213 };
1214
1215 psa_invec in_vec[] = {
1216 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1217 };
1218
1219 psa_outvec out_vec[] = {
1220 {.base = output, .len = output_size},
1221 };
1222
1223 if (output_size == 0) {
1224 return PSA_SUCCESS;
1225 }
1226
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001227 status = API_DISPATCH(tfm_crypto_generate_random,
1228 TFM_CRYPTO_GENERATE_RANDOM);
1229
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001230 return status;
1231}
1232
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001233psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001234 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001235{
1236 psa_status_t status;
1237 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001238 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001239 };
1240
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001241 psa_invec in_vec[] = {
1242 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001243 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1244 };
1245
1246 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001247 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001248 };
1249
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001250 status = API_DISPATCH(tfm_crypto_generate_key,
1251 TFM_CRYPTO_GENERATE_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001252
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001253 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001254}
1255
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001256psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1257 const uint8_t *input,
1258 size_t input_length)
1259{
1260 psa_status_t status;
1261
1262 status = PSA_ERROR_NOT_SUPPORTED;
1263
1264 return status;
1265}
1266
1267psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1268 uint8_t *ciphertext,
1269 size_t ciphertext_size,
1270 size_t *ciphertext_length,
1271 uint8_t *tag,
1272 size_t tag_size,
1273 size_t *tag_length)
1274{
1275 psa_status_t status;
1276
1277 status = PSA_ERROR_NOT_SUPPORTED;
1278
1279 return status;
1280}
1281
1282psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1283 uint8_t *plaintext,
1284 size_t plaintext_size,
1285 size_t *plaintext_length,
1286 const uint8_t *tag,
1287 size_t tag_length)
1288{
1289 psa_status_t status;
1290
1291 status = PSA_ERROR_NOT_SUPPORTED;
1292
1293 return status;
1294}
1295
1296psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1297{
1298 psa_status_t status;
1299
1300 status = PSA_ERROR_NOT_SUPPORTED;
1301
1302 return status;
1303}
1304
Maulik Patel28659c42021-01-06 14:09:22 +00001305psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001306 psa_algorithm_t alg,
1307 const uint8_t *input,
1308 size_t input_length,
1309 uint8_t *mac,
1310 size_t mac_size,
1311 size_t *mac_length)
1312{
1313 psa_status_t status;
Summer Qin045ec4a2021-07-07 14:28:04 +08001314 struct tfm_crypto_pack_iovec iov = {
1315 .sfn_id = TFM_CRYPTO_MAC_COMPUTE_SID,
1316 .key_id = key,
1317 .alg = alg,
1318 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001319
Summer Qin045ec4a2021-07-07 14:28:04 +08001320 psa_invec in_vec[] = {
1321 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1322 {.base = input, .len = input_length},
1323 };
1324 psa_outvec out_vec[] = {
1325 {.base = mac, .len = mac_size},
1326 };
1327
1328 status = API_DISPATCH(tfm_crypto_mac_compute,
1329 TFM_CRYPTO_MAC_COMPUTE);
1330
1331 if (status == PSA_SUCCESS) {
1332 *mac_length = out_vec[0].len;
1333 }
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001334
1335 return status;
1336}
1337
Maulik Patel28659c42021-01-06 14:09:22 +00001338psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001339 psa_algorithm_t alg,
1340 const uint8_t *input,
1341 size_t input_length,
1342 const uint8_t *mac,
1343 const size_t mac_length)
1344{
1345 psa_status_t status;
Summer Qin045ec4a2021-07-07 14:28:04 +08001346 struct tfm_crypto_pack_iovec iov = {
1347 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SID,
1348 .key_id = key,
1349 .alg = alg,
1350 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001351
Summer Qin045ec4a2021-07-07 14:28:04 +08001352 psa_invec in_vec[] = {
1353 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1354 {.base = input, .len = input_length},
1355 {.base = mac, .len = mac_length},
1356 };
1357
1358 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_mac_verify,
1359 TFM_CRYPTO_MAC_VERIFY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001360
1361 return status;
1362}
1363
Maulik Patel28659c42021-01-06 14:09:22 +00001364psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001365 psa_algorithm_t alg,
1366 const uint8_t *input,
1367 size_t input_length,
1368 uint8_t *output,
1369 size_t output_size,
1370 size_t *output_length)
1371{
1372 psa_status_t status;
Summer Qin045ec4a2021-07-07 14:28:04 +08001373 struct tfm_crypto_pack_iovec iov = {
1374 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
1375 .key_id = key,
1376 .alg = alg,
1377 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001378
Summer Qin045ec4a2021-07-07 14:28:04 +08001379 psa_invec in_vec[] = {
1380 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1381 {.base = input, .len = input_length},
1382 };
1383 psa_outvec out_vec[] = {
1384 {.base = output, .len = output_size}
1385 };
1386
1387 status = API_DISPATCH(tfm_crypto_cipher_encrypt,
1388 TFM_CRYPTO_CIPHER_ENCRYPT);
1389
1390 if (status == PSA_SUCCESS) {
1391 *output_length = out_vec[0].len;
1392 }
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001393
1394 return status;
1395}
1396
Maulik Patel28659c42021-01-06 14:09:22 +00001397psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001398 psa_algorithm_t alg,
1399 const uint8_t *input,
1400 size_t input_length,
1401 uint8_t *output,
1402 size_t output_size,
1403 size_t *output_length)
1404{
1405 psa_status_t status;
Summer Qin045ec4a2021-07-07 14:28:04 +08001406 struct tfm_crypto_pack_iovec iov = {
1407 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
1408 .key_id = key,
1409 .alg = alg,
1410 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001411
Summer Qin045ec4a2021-07-07 14:28:04 +08001412 psa_invec in_vec[] = {
1413 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1414 {.base = input, .len = input_length},
1415 };
1416 psa_outvec out_vec[] = {
1417 {.base = output, .len = output_size}
1418 };
1419
1420 status = API_DISPATCH(tfm_crypto_cipher_decrypt,
1421 TFM_CRYPTO_CIPHER_DECRYPT);
1422
1423 if (status == PSA_SUCCESS) {
1424 *output_length = out_vec[0].len;
1425 }
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001426
1427 return status;
1428}
1429
1430psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001431 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001432 const uint8_t *peer_key,
1433 size_t peer_key_length,
1434 uint8_t *output,
1435 size_t output_size,
1436 size_t *output_length)
1437{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001438 psa_status_t status;
1439 struct tfm_crypto_pack_iovec iov = {
1440 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1441 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001442 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001443 };
1444
1445 psa_invec in_vec[] = {
1446 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1447 {.base = peer_key, .len = peer_key_length},
1448 };
1449
1450 psa_outvec out_vec[] = {
1451 {.base = output, .len = output_size},
1452 };
1453
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001454 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1455 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1456
1457 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001458
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001459 return status;
1460}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001461
1462psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1463 psa_algorithm_t alg)
1464{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001465 psa_status_t status;
1466 struct tfm_crypto_pack_iovec iov = {
1467 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1468 .alg = alg,
1469 .op_handle = operation->handle,
1470 };
1471
1472 psa_invec in_vec[] = {
1473 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1474 };
1475 psa_outvec out_vec[] = {
1476 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1477 };
1478
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001479 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1480 TFM_CRYPTO_KEY_DERIVATION_SETUP);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001481
1482 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001483}
1484
1485psa_status_t psa_key_derivation_set_capacity(
1486 psa_key_derivation_operation_t *operation,
1487 size_t capacity)
1488{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001489 psa_status_t status;
1490 struct tfm_crypto_pack_iovec iov = {
1491 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
1492 .capacity = capacity,
1493 .op_handle = operation->handle,
1494 };
1495
1496 psa_invec in_vec[] = {
1497 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1498 };
1499
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001500 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1501 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001502
1503 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001504}
1505
1506psa_status_t psa_key_derivation_input_bytes(
1507 psa_key_derivation_operation_t *operation,
1508 psa_key_derivation_step_t step,
1509 const uint8_t *data,
1510 size_t data_length)
1511{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001512 psa_status_t status;
1513 struct tfm_crypto_pack_iovec iov = {
1514 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1515 .step = step,
1516 .op_handle = operation->handle,
1517 };
1518
1519 psa_invec in_vec[] = {
1520 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1521 {.base = data, .len = data_length},
1522 };
1523
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001524 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1525 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001526
1527 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001528}
1529
1530psa_status_t psa_key_derivation_output_key(
1531 const psa_key_attributes_t *attributes,
1532 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001533 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001534{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001535 psa_status_t status;
1536 struct tfm_crypto_pack_iovec iov = {
1537 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1538 .op_handle = operation->handle,
1539 };
1540
1541 psa_invec in_vec[] = {
1542 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1543 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1544 };
1545
1546 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001547 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001548 };
1549
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001550 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1551 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001552
1553 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001554}
1555
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001556psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001557 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001558 psa_algorithm_t alg)
1559{
1560 psa_status_t status;
1561
1562 status = PSA_ERROR_NOT_SUPPORTED;
1563
1564 return status;
1565}
1566
1567psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001568 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001569 psa_algorithm_t alg)
1570{
1571 psa_status_t status;
1572
1573 status = PSA_ERROR_NOT_SUPPORTED;
1574
1575 return status;
1576}
1577
1578psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
1579 uint8_t *nonce,
1580 size_t nonce_size,
1581 size_t *nonce_length)
1582{
1583 psa_status_t status;
1584
1585 status = PSA_ERROR_NOT_SUPPORTED;
1586
1587 return status;
1588}
1589
1590psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
1591 const uint8_t *nonce,
1592 size_t nonce_length)
1593{
1594 psa_status_t status;
1595
1596 status = PSA_ERROR_NOT_SUPPORTED;
1597
1598 return status;
1599}
1600
1601psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
1602 size_t ad_length,
1603 size_t plaintext_length)
1604{
1605 psa_status_t status;
1606
1607 status = PSA_ERROR_NOT_SUPPORTED;
1608
1609 return status;
1610}
1611
1612psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1613 const uint8_t *input,
1614 size_t input_length,
1615 uint8_t *output,
1616 size_t output_size,
1617 size_t *output_length)
1618{
1619 psa_status_t status;
1620
1621 status = PSA_ERROR_NOT_SUPPORTED;
1622
1623 return status;
1624}