blob: 7496190169e44ca5d2105e7764c5ca99e8c769bd [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
Maulik Patel28659c42021-01-06 14:09:22 +0000882psa_status_t psa_asymmetric_sign(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100883 psa_algorithm_t alg,
884 const uint8_t *hash,
885 size_t hash_length,
886 uint8_t *signature,
887 size_t signature_size,
888 size_t *signature_length)
889{
Maulik Patel28659c42021-01-06 14:09:22 +0000890 return psa_sign_hash(key, alg, hash, hash_length, signature, signature_size, signature_length);
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100891}
892
Maulik Patel28659c42021-01-06 14:09:22 +0000893psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100894 psa_algorithm_t alg,
895 const uint8_t *hash,
896 size_t hash_length,
897 uint8_t *signature,
898 size_t signature_size,
899 size_t *signature_length)
900{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100901 psa_status_t status;
902 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100903 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000904 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100905 .alg = alg,
906 };
907
908 psa_invec in_vec[] = {
909 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
910 {.base = hash, .len = hash_length},
911 };
912 psa_outvec out_vec[] = {
913 {.base = signature, .len = signature_size},
914 };
915
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100916 status = API_DISPATCH(tfm_crypto_sign_hash,
917 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100918
919 *signature_length = out_vec[0].len;
920
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100921 return status;
922}
923
Maulik Patel28659c42021-01-06 14:09:22 +0000924psa_status_t psa_asymmetric_verify(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100925 psa_algorithm_t alg,
926 const uint8_t *hash,
927 size_t hash_length,
928 const uint8_t *signature,
929 size_t signature_length)
930{
Maulik Patel28659c42021-01-06 14:09:22 +0000931 return psa_verify_hash(key, alg, hash, hash_length, signature, signature_length);
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100932}
933
Maulik Patel28659c42021-01-06 14:09:22 +0000934psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100935 psa_algorithm_t alg,
936 const uint8_t *hash,
937 size_t hash_length,
938 const uint8_t *signature,
939 size_t signature_length)
940{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100941 psa_status_t status;
942 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100943 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000944 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100945 .alg = alg
946 };
947
948 psa_invec in_vec[] = {
949 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
950 {.base = hash, .len = hash_length},
951 {.base = signature, .len = signature_length}
952 };
953
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100954 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
955 TFM_CRYPTO_VERIFY_HASH);
Kevin Peng9449a362019-07-29 16:05:42 +0800956
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100957 return status;
958}
959
Maulik Patel28659c42021-01-06 14:09:22 +0000960psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100961 psa_algorithm_t alg,
962 const uint8_t *input,
963 size_t input_length,
964 const uint8_t *salt,
965 size_t salt_length,
966 uint8_t *output,
967 size_t output_size,
968 size_t *output_length)
969{
970 psa_status_t status;
971 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800972 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000973 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100974 .alg = alg
975 };
976
977 /* Sanitize the optional input */
978 if ((salt == NULL) && (salt_length != 0)) {
979 return PSA_ERROR_INVALID_ARGUMENT;
980 }
981
982 psa_invec in_vec[] = {
983 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
984 {.base = input, .len = input_length},
985 {.base = salt, .len = salt_length}
986 };
987
988 psa_outvec out_vec[] = {
989 {.base = output, .len = output_size},
990 };
991
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800992 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100993 if (salt == NULL) {
994 in_len--;
995 }
Summer Qinaee07882021-03-29 15:44:27 +0800996 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800997 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100998
999 *output_length = out_vec[0].len;
1000
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001001 return status;
1002}
1003
Maulik Patel28659c42021-01-06 14:09:22 +00001004psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001005 psa_algorithm_t alg,
1006 const uint8_t *input,
1007 size_t input_length,
1008 const uint8_t *salt,
1009 size_t salt_length,
1010 uint8_t *output,
1011 size_t output_size,
1012 size_t *output_length)
1013{
1014 psa_status_t status;
1015 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001016 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001017 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001018 .alg = alg
1019 };
1020
1021 /* Sanitize the optional input */
1022 if ((salt == NULL) && (salt_length != 0)) {
1023 return PSA_ERROR_INVALID_ARGUMENT;
1024 }
1025
1026 psa_invec in_vec[] = {
1027 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1028 {.base = input, .len = input_length},
1029 {.base = salt, .len = salt_length}
1030 };
1031
1032 psa_outvec out_vec[] = {
1033 {.base = output, .len = output_size},
1034 };
1035
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001036 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001037 if (salt == NULL) {
1038 in_len--;
1039 }
Summer Qinaee07882021-03-29 15:44:27 +08001040 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001041 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001042
1043 *output_length = out_vec[0].len;
1044
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001045 return status;
1046}
1047
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001048psa_status_t psa_key_derivation_get_capacity(
1049 const psa_key_derivation_operation_t *operation,
1050 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001051{
1052 psa_status_t status;
1053 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001054 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
1055 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001056 };
1057
1058 psa_invec in_vec[] = {
1059 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1060 };
1061
1062 psa_outvec out_vec[] = {
1063 {.base = capacity, .len = sizeof(size_t)},
1064 };
1065
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001066 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1067 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Kevin Peng9449a362019-07-29 16:05:42 +08001068
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001069 return status;
1070}
1071
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001072psa_status_t psa_key_derivation_output_bytes(
1073 psa_key_derivation_operation_t *operation,
1074 uint8_t *output,
1075 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001076{
1077 psa_status_t status;
1078 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001079 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
1080 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001081 };
1082
1083 psa_invec in_vec[] = {
1084 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1085 };
1086
1087 psa_outvec out_vec[] = {
1088 {.base = output, .len = output_length},
1089 };
1090
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001091 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1092 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Kevin Peng9449a362019-07-29 16:05:42 +08001093
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001094 return status;
1095}
1096
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001097psa_status_t psa_key_derivation_input_key(
1098 psa_key_derivation_operation_t *operation,
1099 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001100 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001101{
1102 psa_status_t status;
1103 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001104 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001105 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001106 .step = step,
1107 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001108 };
1109
1110 psa_invec in_vec[] = {
1111 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001112 };
1113
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001114 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1115 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +08001116
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001117 return status;
1118}
1119
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001120psa_status_t psa_key_derivation_abort(
1121 psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001122{
1123 psa_status_t status;
1124 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001125 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
1126 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001127 };
1128
1129 psa_invec in_vec[] = {
1130 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1131 };
1132
1133 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001134 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001135 };
1136
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001137 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1138 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001139
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001140 return status;
1141}
1142
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001143psa_status_t psa_key_derivation_key_agreement(
1144 psa_key_derivation_operation_t *operation,
1145 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001146 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001147 const uint8_t *peer_key,
1148 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001149{
1150 psa_status_t status;
1151 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001152 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001153 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001154 .step = step,
1155 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001156 };
1157
1158 psa_invec in_vec[] = {
1159 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1160 {.base = peer_key, .len = peer_key_length},
1161 };
1162
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001163 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1164 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001165
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001166 return status;
1167}
1168
1169psa_status_t psa_generate_random(uint8_t *output,
1170 size_t output_size)
1171{
1172 psa_status_t status;
1173 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001174 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001175 };
1176
1177 psa_invec in_vec[] = {
1178 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1179 };
1180
1181 psa_outvec out_vec[] = {
1182 {.base = output, .len = output_size},
1183 };
1184
1185 if (output_size == 0) {
1186 return PSA_SUCCESS;
1187 }
1188
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001189 status = API_DISPATCH(tfm_crypto_generate_random,
1190 TFM_CRYPTO_GENERATE_RANDOM);
1191
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001192 return status;
1193}
1194
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001195psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001196 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001197{
1198 psa_status_t status;
1199 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001200 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001201 };
1202
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001203 psa_invec in_vec[] = {
1204 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001205 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1206 };
1207
1208 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001209 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001210 };
1211
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001212 status = API_DISPATCH(tfm_crypto_generate_key,
1213 TFM_CRYPTO_GENERATE_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001214
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001215 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001216}
1217
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001218psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1219 const uint8_t *input,
1220 size_t input_length)
1221{
1222 psa_status_t status;
1223
1224 status = PSA_ERROR_NOT_SUPPORTED;
1225
1226 return status;
1227}
1228
1229psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1230 uint8_t *ciphertext,
1231 size_t ciphertext_size,
1232 size_t *ciphertext_length,
1233 uint8_t *tag,
1234 size_t tag_size,
1235 size_t *tag_length)
1236{
1237 psa_status_t status;
1238
1239 status = PSA_ERROR_NOT_SUPPORTED;
1240
1241 return status;
1242}
1243
1244psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1245 uint8_t *plaintext,
1246 size_t plaintext_size,
1247 size_t *plaintext_length,
1248 const uint8_t *tag,
1249 size_t tag_length)
1250{
1251 psa_status_t status;
1252
1253 status = PSA_ERROR_NOT_SUPPORTED;
1254
1255 return status;
1256}
1257
1258psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1259{
1260 psa_status_t status;
1261
1262 status = PSA_ERROR_NOT_SUPPORTED;
1263
1264 return status;
1265}
1266
Maulik Patel28659c42021-01-06 14:09:22 +00001267psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001268 psa_algorithm_t alg,
1269 const uint8_t *input,
1270 size_t input_length,
1271 uint8_t *mac,
1272 size_t mac_size,
1273 size_t *mac_length)
1274{
1275 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001276 struct tfm_crypto_pack_iovec iov = {
1277 .sfn_id = TFM_CRYPTO_MAC_COMPUTE_SID,
1278 .alg = alg,
1279 .key_id = key,
1280 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001281
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001282 psa_invec in_vec[] = {
1283 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1284 {.base = input, .len = input_length}
1285 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001286
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001287 psa_outvec out_vec[] = {
1288 {.base = mac, .len = mac_size}
1289 };
1290
1291 status = API_DISPATCH(tfm_crypto_mac_compute,
1292 TFM_CRYPTO_MAC_COMPUTE);
1293
1294 *mac_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001295 return status;
1296}
1297
Maulik Patel28659c42021-01-06 14:09:22 +00001298psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001299 psa_algorithm_t alg,
1300 const uint8_t *input,
1301 size_t input_length,
1302 const uint8_t *mac,
1303 const size_t mac_length)
1304{
1305 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001306 struct tfm_crypto_pack_iovec iov = {
1307 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SID,
1308 .alg = alg,
1309 .key_id = key,
1310 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001311
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001312 psa_invec in_vec[] = {
1313 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1314 {.base = input, .len = input_length},
1315 {.base = mac, .len = mac_length}
1316 };
1317
1318 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_mac_verify,
1319 TFM_CRYPTO_MAC_VERIFY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001320
1321 return status;
1322}
1323
Maulik Patel28659c42021-01-06 14:09:22 +00001324psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001325 psa_algorithm_t alg,
1326 const uint8_t *input,
1327 size_t input_length,
1328 uint8_t *output,
1329 size_t output_size,
1330 size_t *output_length)
1331{
Antonio de Angelis609f0002021-07-06 16:51:28 +02001332#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
1333 return PSA_ERROR_NOT_SUPPORTED;
1334#else
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001335 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001336 struct tfm_crypto_pack_iovec iov = {
1337 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
1338 .alg = alg,
1339 .key_id = key_id
1340 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001341
Antonio de Angelis609f0002021-07-06 16:51:28 +02001342 psa_invec in_vec[] = {
1343 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1344 {.base = input, .len = input_length},
1345 };
1346
1347 psa_outvec out_vec[] = {
1348 {.base = output, .len = output_size},
1349 };
1350
1351 status = API_DISPATCH(tfm_crypto_cipher_encrypt,
1352 TFM_CRYPTO_CIPHER_ENCRYPT);
1353
1354 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001355
1356 return status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001357#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001358}
1359
Maulik Patel28659c42021-01-06 14:09:22 +00001360psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001361 psa_algorithm_t alg,
1362 const uint8_t *input,
1363 size_t input_length,
1364 uint8_t *output,
1365 size_t output_size,
1366 size_t *output_length)
1367{
Antonio de Angelis609f0002021-07-06 16:51:28 +02001368#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
1369 return PSA_ERROR_NOT_SUPPORTED;
1370#else
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001371 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001372 struct tfm_crypto_pack_iovec iov = {
1373 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
1374 .alg = alg,
1375 .key_id = key_id
1376 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001377
Antonio de Angelis609f0002021-07-06 16:51:28 +02001378 psa_invec in_vec[] = {
1379 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1380 {.base = input, .len = input_length},
1381 };
1382
1383 psa_outvec out_vec[] = {
1384 {.base = output, .len = output_size},
1385 };
1386
1387 status = API_DISPATCH(tfm_crypto_cipher_decrypt,
1388 TFM_CRYPTO_CIPHER_DECRYPT);
1389
1390 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001391
1392 return status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001393#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001394}
1395
1396psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001397 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001398 const uint8_t *peer_key,
1399 size_t peer_key_length,
1400 uint8_t *output,
1401 size_t output_size,
1402 size_t *output_length)
1403{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001404 psa_status_t status;
1405 struct tfm_crypto_pack_iovec iov = {
1406 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1407 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001408 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001409 };
1410
1411 psa_invec in_vec[] = {
1412 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1413 {.base = peer_key, .len = peer_key_length},
1414 };
1415
1416 psa_outvec out_vec[] = {
1417 {.base = output, .len = output_size},
1418 };
1419
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001420 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1421 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1422
1423 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001424
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001425 return status;
1426}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001427
1428psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1429 psa_algorithm_t alg)
1430{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001431 psa_status_t status;
1432 struct tfm_crypto_pack_iovec iov = {
1433 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1434 .alg = alg,
1435 .op_handle = operation->handle,
1436 };
1437
1438 psa_invec in_vec[] = {
1439 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1440 };
1441 psa_outvec out_vec[] = {
1442 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1443 };
1444
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001445 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1446 TFM_CRYPTO_KEY_DERIVATION_SETUP);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001447
1448 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001449}
1450
1451psa_status_t psa_key_derivation_set_capacity(
1452 psa_key_derivation_operation_t *operation,
1453 size_t capacity)
1454{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001455 psa_status_t status;
1456 struct tfm_crypto_pack_iovec iov = {
1457 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
1458 .capacity = capacity,
1459 .op_handle = operation->handle,
1460 };
1461
1462 psa_invec in_vec[] = {
1463 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1464 };
1465
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001466 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1467 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001468
1469 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001470}
1471
1472psa_status_t psa_key_derivation_input_bytes(
1473 psa_key_derivation_operation_t *operation,
1474 psa_key_derivation_step_t step,
1475 const uint8_t *data,
1476 size_t data_length)
1477{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001478 psa_status_t status;
1479 struct tfm_crypto_pack_iovec iov = {
1480 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1481 .step = step,
1482 .op_handle = operation->handle,
1483 };
1484
1485 psa_invec in_vec[] = {
1486 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1487 {.base = data, .len = data_length},
1488 };
1489
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001490 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1491 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001492
1493 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001494}
1495
1496psa_status_t psa_key_derivation_output_key(
1497 const psa_key_attributes_t *attributes,
1498 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001499 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001500{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001501 psa_status_t status;
1502 struct tfm_crypto_pack_iovec iov = {
1503 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1504 .op_handle = operation->handle,
1505 };
1506
1507 psa_invec in_vec[] = {
1508 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1509 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1510 };
1511
1512 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001513 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001514 };
1515
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001516 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1517 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001518
1519 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001520}
1521
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001522psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001523 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001524 psa_algorithm_t alg)
1525{
1526 psa_status_t status;
1527
1528 status = PSA_ERROR_NOT_SUPPORTED;
1529
1530 return status;
1531}
1532
1533psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001534 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001535 psa_algorithm_t alg)
1536{
1537 psa_status_t status;
1538
1539 status = PSA_ERROR_NOT_SUPPORTED;
1540
1541 return status;
1542}
1543
1544psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
1545 uint8_t *nonce,
1546 size_t nonce_size,
1547 size_t *nonce_length)
1548{
1549 psa_status_t status;
1550
1551 status = PSA_ERROR_NOT_SUPPORTED;
1552
1553 return status;
1554}
1555
1556psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
1557 const uint8_t *nonce,
1558 size_t nonce_length)
1559{
1560 psa_status_t status;
1561
1562 status = PSA_ERROR_NOT_SUPPORTED;
1563
1564 return status;
1565}
1566
1567psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
1568 size_t ad_length,
1569 size_t plaintext_length)
1570{
1571 psa_status_t status;
1572
1573 status = PSA_ERROR_NOT_SUPPORTED;
1574
1575 return status;
1576}
1577
1578psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1579 const uint8_t *input,
1580 size_t input_length,
1581 uint8_t *output,
1582 size_t output_size,
1583 size_t *output_length)
1584{
1585 psa_status_t status;
1586
1587 status = PSA_ERROR_NOT_SUPPORTED;
1588
1589 return status;
1590}