blob: c11fba00eda87ac86ff659a2cbf50a3ae461faa8 [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,
Antonio de Angelis1ba9ff02021-12-02 15:49:44 +0000785 .aead_in = {.nonce = {0}, .nonce_length = 0}
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 psa_invec in_vec[] = {
Antonio de Angelis1ba9ff02021-12-02 15:49:44 +0000794 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000795 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100796 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000797 };
798 psa_outvec out_vec[] = {
799 {.base = ciphertext, .len = ciphertext_size},
800 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000801
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000802 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
803 return PSA_ERROR_INVALID_ARGUMENT;
804 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000805
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000806 if (nonce != NULL) {
Antonio de Angelis1ba9ff02021-12-02 15:49:44 +0000807 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100808 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000809 }
Antonio de Angelis1ba9ff02021-12-02 15:49:44 +0000810 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000811 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000812
Antonio de Angelis1ba9ff02021-12-02 15:49:44 +0000813 in_vec[0].base = &iov;
814 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
815
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800816 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100817 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100818 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100819 }
Summer Qinaee07882021-03-29 15:44:27 +0800820 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800821 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000822
823 *ciphertext_length = out_vec[0].len;
824
825 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000826}
827
Maulik Patel28659c42021-01-06 14:09:22 +0000828psa_status_t psa_aead_decrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000829 psa_algorithm_t alg,
830 const uint8_t *nonce,
831 size_t nonce_length,
832 const uint8_t *additional_data,
833 size_t additional_data_length,
834 const uint8_t *ciphertext,
835 size_t ciphertext_length,
836 uint8_t *plaintext,
837 size_t plaintext_size,
838 size_t *plaintext_length)
839{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000840 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100841 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800842 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000843 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100844 .alg = alg,
Antonio de Angelis1ba9ff02021-12-02 15:49:44 +0000845 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000846 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100847
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100848 /* Sanitize the optional input */
849 if ((additional_data == NULL) && (additional_data_length != 0)) {
850 return PSA_ERROR_INVALID_ARGUMENT;
851 }
852
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000853 psa_invec in_vec[] = {
Antonio de Angelis1ba9ff02021-12-02 15:49:44 +0000854 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000855 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100856 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000857 };
858 psa_outvec out_vec[] = {
859 {.base = plaintext, .len = plaintext_size},
860 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000861
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000862 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
863 return PSA_ERROR_INVALID_ARGUMENT;
864 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000865
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000866 if (nonce != NULL) {
Antonio de Angelis1ba9ff02021-12-02 15:49:44 +0000867 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100868 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000869 }
Antonio de Angelis1ba9ff02021-12-02 15:49:44 +0000870 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000871 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000872
Antonio de Angelis1ba9ff02021-12-02 15:49:44 +0000873 in_vec[0].base = &iov;
874 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
875
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800876 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100877 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100878 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100879 }
Summer Qinaee07882021-03-29 15:44:27 +0800880 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800881 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000882
883 *plaintext_length = out_vec[0].len;
884
885 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000886}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100887
Summer Qinb9492d22021-06-22 18:00:54 +0800888psa_status_t psa_sign_message(psa_key_id_t key,
889 psa_algorithm_t alg,
890 const uint8_t *input,
891 size_t input_length,
892 uint8_t *signature,
893 size_t signature_size,
894 size_t *signature_length)
895{
896 psa_status_t status;
897 struct tfm_crypto_pack_iovec iov = {
898 .sfn_id = TFM_CRYPTO_SIGN_MESSAGE_SID,
899 .key_id = key,
900 .alg = alg,
901 };
902
903 psa_invec in_vec[] = {
904 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
905 {.base = input, .len = input_length},
906 };
907 psa_outvec out_vec[] = {
908 {.base = signature, .len = signature_size},
909 };
910
911 status = API_DISPATCH(tfm_crypto_sign_message,
912 TFM_CRYPTO_SIGN_MESSAGE);
913
914 if (status == PSA_SUCCESS) {
915 *signature_length = out_vec[0].len;
916 }
917
918 return status;
919}
920
921psa_status_t psa_verify_message(psa_key_id_t key,
922 psa_algorithm_t alg,
923 const uint8_t *input,
924 size_t input_length,
925 const uint8_t *signature,
926 size_t signature_length)
927{
928 psa_status_t status;
929 struct tfm_crypto_pack_iovec iov = {
930 .sfn_id = TFM_CRYPTO_VERIFY_MESSAGE_SID,
931 .key_id = key,
932 .alg = alg
933 };
934
935 psa_invec in_vec[] = {
936 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
937 {.base = input, .len = input_length},
938 {.base = signature, .len = signature_length}
939 };
940
941 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_message,
942 TFM_CRYPTO_VERIFY_MESSAGE);
943
944 return status;
945}
946
Maulik Patel28659c42021-01-06 14:09:22 +0000947psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100948 psa_algorithm_t alg,
949 const uint8_t *hash,
950 size_t hash_length,
951 uint8_t *signature,
952 size_t signature_size,
953 size_t *signature_length)
954{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100955 psa_status_t status;
956 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100957 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000958 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100959 .alg = alg,
960 };
961
962 psa_invec in_vec[] = {
963 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
964 {.base = hash, .len = hash_length},
965 };
966 psa_outvec out_vec[] = {
967 {.base = signature, .len = signature_size},
968 };
969
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100970 status = API_DISPATCH(tfm_crypto_sign_hash,
971 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100972
973 *signature_length = out_vec[0].len;
974
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100975 return status;
976}
977
Maulik Patel28659c42021-01-06 14:09:22 +0000978psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100979 psa_algorithm_t alg,
980 const uint8_t *hash,
981 size_t hash_length,
982 const uint8_t *signature,
983 size_t signature_length)
984{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100985 psa_status_t status;
986 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100987 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000988 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100989 .alg = alg
990 };
991
992 psa_invec in_vec[] = {
993 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
994 {.base = hash, .len = hash_length},
995 {.base = signature, .len = signature_length}
996 };
997
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100998 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
999 TFM_CRYPTO_VERIFY_HASH);
Kevin Peng9449a362019-07-29 16:05:42 +08001000
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_encrypt(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_ENCRYPT_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
Maulik Patel28659c42021-01-06 14:09:22 +00001048psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001049 psa_algorithm_t alg,
1050 const uint8_t *input,
1051 size_t input_length,
1052 const uint8_t *salt,
1053 size_t salt_length,
1054 uint8_t *output,
1055 size_t output_size,
1056 size_t *output_length)
1057{
1058 psa_status_t status;
1059 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001060 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001061 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001062 .alg = alg
1063 };
1064
1065 /* Sanitize the optional input */
1066 if ((salt == NULL) && (salt_length != 0)) {
1067 return PSA_ERROR_INVALID_ARGUMENT;
1068 }
1069
1070 psa_invec in_vec[] = {
1071 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1072 {.base = input, .len = input_length},
1073 {.base = salt, .len = salt_length}
1074 };
1075
1076 psa_outvec out_vec[] = {
1077 {.base = output, .len = output_size},
1078 };
1079
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001080 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001081 if (salt == NULL) {
1082 in_len--;
1083 }
Summer Qinaee07882021-03-29 15:44:27 +08001084 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001085 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001086
1087 *output_length = out_vec[0].len;
1088
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001089 return status;
1090}
1091
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001092psa_status_t psa_key_derivation_get_capacity(
1093 const psa_key_derivation_operation_t *operation,
1094 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001095{
1096 psa_status_t status;
1097 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001098 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
1099 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001100 };
1101
1102 psa_invec in_vec[] = {
1103 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1104 };
1105
1106 psa_outvec out_vec[] = {
1107 {.base = capacity, .len = sizeof(size_t)},
1108 };
1109
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001110 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1111 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Kevin Peng9449a362019-07-29 16:05:42 +08001112
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001113 return status;
1114}
1115
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001116psa_status_t psa_key_derivation_output_bytes(
1117 psa_key_derivation_operation_t *operation,
1118 uint8_t *output,
1119 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001120{
1121 psa_status_t status;
1122 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001123 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
1124 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001125 };
1126
1127 psa_invec in_vec[] = {
1128 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1129 };
1130
1131 psa_outvec out_vec[] = {
1132 {.base = output, .len = output_length},
1133 };
1134
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001135 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1136 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Kevin Peng9449a362019-07-29 16:05:42 +08001137
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001138 return status;
1139}
1140
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001141psa_status_t psa_key_derivation_input_key(
1142 psa_key_derivation_operation_t *operation,
1143 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001144 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001145{
1146 psa_status_t status;
1147 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001148 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001149 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001150 .step = step,
1151 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001152 };
1153
1154 psa_invec in_vec[] = {
1155 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001156 };
1157
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001158 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1159 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +08001160
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001161 return status;
1162}
1163
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001164psa_status_t psa_key_derivation_abort(
1165 psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001166{
1167 psa_status_t status;
1168 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001169 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
1170 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001171 };
1172
1173 psa_invec in_vec[] = {
1174 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1175 };
1176
1177 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001178 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001179 };
1180
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001181 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1182 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001183
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001184 return status;
1185}
1186
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001187psa_status_t psa_key_derivation_key_agreement(
1188 psa_key_derivation_operation_t *operation,
1189 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001190 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001191 const uint8_t *peer_key,
1192 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001193{
1194 psa_status_t status;
1195 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001196 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001197 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001198 .step = step,
1199 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001200 };
1201
1202 psa_invec in_vec[] = {
1203 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1204 {.base = peer_key, .len = peer_key_length},
1205 };
1206
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001207 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1208 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001209
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001210 return status;
1211}
1212
1213psa_status_t psa_generate_random(uint8_t *output,
1214 size_t output_size)
1215{
1216 psa_status_t status;
1217 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001218 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001219 };
1220
1221 psa_invec in_vec[] = {
1222 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1223 };
1224
1225 psa_outvec out_vec[] = {
1226 {.base = output, .len = output_size},
1227 };
1228
1229 if (output_size == 0) {
1230 return PSA_SUCCESS;
1231 }
1232
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001233 status = API_DISPATCH(tfm_crypto_generate_random,
1234 TFM_CRYPTO_GENERATE_RANDOM);
1235
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001236 return status;
1237}
1238
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001239psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001240 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001241{
1242 psa_status_t status;
1243 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001244 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001245 };
1246
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001247 psa_invec in_vec[] = {
1248 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001249 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1250 };
1251
1252 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001253 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001254 };
1255
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001256 status = API_DISPATCH(tfm_crypto_generate_key,
1257 TFM_CRYPTO_GENERATE_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001258
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001259 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001260}
1261
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001262psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1263 const uint8_t *input,
1264 size_t input_length)
1265{
1266 psa_status_t status;
1267
1268 status = PSA_ERROR_NOT_SUPPORTED;
1269
1270 return status;
1271}
1272
1273psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1274 uint8_t *ciphertext,
1275 size_t ciphertext_size,
1276 size_t *ciphertext_length,
1277 uint8_t *tag,
1278 size_t tag_size,
1279 size_t *tag_length)
1280{
1281 psa_status_t status;
1282
1283 status = PSA_ERROR_NOT_SUPPORTED;
1284
1285 return status;
1286}
1287
1288psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1289 uint8_t *plaintext,
1290 size_t plaintext_size,
1291 size_t *plaintext_length,
1292 const uint8_t *tag,
1293 size_t tag_length)
1294{
1295 psa_status_t status;
1296
1297 status = PSA_ERROR_NOT_SUPPORTED;
1298
1299 return status;
1300}
1301
1302psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1303{
1304 psa_status_t status;
1305
1306 status = PSA_ERROR_NOT_SUPPORTED;
1307
1308 return status;
1309}
1310
Maulik Patel28659c42021-01-06 14:09:22 +00001311psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001312 psa_algorithm_t alg,
1313 const uint8_t *input,
1314 size_t input_length,
1315 uint8_t *mac,
1316 size_t mac_size,
1317 size_t *mac_length)
1318{
1319 psa_status_t status;
Summer Qin045ec4a2021-07-07 14:28:04 +08001320 struct tfm_crypto_pack_iovec iov = {
1321 .sfn_id = TFM_CRYPTO_MAC_COMPUTE_SID,
1322 .key_id = key,
1323 .alg = alg,
1324 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001325
Summer Qin045ec4a2021-07-07 14:28:04 +08001326 psa_invec in_vec[] = {
1327 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1328 {.base = input, .len = input_length},
1329 };
1330 psa_outvec out_vec[] = {
1331 {.base = mac, .len = mac_size},
1332 };
1333
1334 status = API_DISPATCH(tfm_crypto_mac_compute,
1335 TFM_CRYPTO_MAC_COMPUTE);
1336
1337 if (status == PSA_SUCCESS) {
1338 *mac_length = out_vec[0].len;
1339 }
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001340
1341 return status;
1342}
1343
Maulik Patel28659c42021-01-06 14:09:22 +00001344psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001345 psa_algorithm_t alg,
1346 const uint8_t *input,
1347 size_t input_length,
1348 const uint8_t *mac,
1349 const size_t mac_length)
1350{
1351 psa_status_t status;
Summer Qin045ec4a2021-07-07 14:28:04 +08001352 struct tfm_crypto_pack_iovec iov = {
1353 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SID,
1354 .key_id = key,
1355 .alg = alg,
1356 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001357
Summer Qin045ec4a2021-07-07 14:28:04 +08001358 psa_invec in_vec[] = {
1359 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1360 {.base = input, .len = input_length},
1361 {.base = mac, .len = mac_length},
1362 };
1363
1364 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_mac_verify,
1365 TFM_CRYPTO_MAC_VERIFY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001366
1367 return status;
1368}
1369
Maulik Patel28659c42021-01-06 14:09:22 +00001370psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001371 psa_algorithm_t alg,
1372 const uint8_t *input,
1373 size_t input_length,
1374 uint8_t *output,
1375 size_t output_size,
1376 size_t *output_length)
1377{
1378 psa_status_t status;
Summer Qin045ec4a2021-07-07 14:28:04 +08001379 struct tfm_crypto_pack_iovec iov = {
1380 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
1381 .key_id = key,
1382 .alg = alg,
1383 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001384
Summer Qin045ec4a2021-07-07 14:28:04 +08001385 psa_invec in_vec[] = {
1386 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1387 {.base = input, .len = input_length},
1388 };
1389 psa_outvec out_vec[] = {
1390 {.base = output, .len = output_size}
1391 };
1392
1393 status = API_DISPATCH(tfm_crypto_cipher_encrypt,
1394 TFM_CRYPTO_CIPHER_ENCRYPT);
1395
1396 if (status == PSA_SUCCESS) {
1397 *output_length = out_vec[0].len;
1398 }
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001399
1400 return status;
1401}
1402
Maulik Patel28659c42021-01-06 14:09:22 +00001403psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001404 psa_algorithm_t alg,
1405 const uint8_t *input,
1406 size_t input_length,
1407 uint8_t *output,
1408 size_t output_size,
1409 size_t *output_length)
1410{
1411 psa_status_t status;
Summer Qin045ec4a2021-07-07 14:28:04 +08001412 struct tfm_crypto_pack_iovec iov = {
1413 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
1414 .key_id = key,
1415 .alg = alg,
1416 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001417
Summer Qin045ec4a2021-07-07 14:28:04 +08001418 psa_invec in_vec[] = {
1419 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1420 {.base = input, .len = input_length},
1421 };
1422 psa_outvec out_vec[] = {
1423 {.base = output, .len = output_size}
1424 };
1425
1426 status = API_DISPATCH(tfm_crypto_cipher_decrypt,
1427 TFM_CRYPTO_CIPHER_DECRYPT);
1428
1429 if (status == PSA_SUCCESS) {
1430 *output_length = out_vec[0].len;
1431 }
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001432
1433 return status;
1434}
1435
1436psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001437 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001438 const uint8_t *peer_key,
1439 size_t peer_key_length,
1440 uint8_t *output,
1441 size_t output_size,
1442 size_t *output_length)
1443{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001444 psa_status_t status;
1445 struct tfm_crypto_pack_iovec iov = {
1446 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1447 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001448 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001449 };
1450
1451 psa_invec in_vec[] = {
1452 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1453 {.base = peer_key, .len = peer_key_length},
1454 };
1455
1456 psa_outvec out_vec[] = {
1457 {.base = output, .len = output_size},
1458 };
1459
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001460 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1461 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1462
1463 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001464
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001465 return status;
1466}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001467
1468psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1469 psa_algorithm_t alg)
1470{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001471 psa_status_t status;
1472 struct tfm_crypto_pack_iovec iov = {
1473 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1474 .alg = alg,
1475 .op_handle = operation->handle,
1476 };
1477
1478 psa_invec in_vec[] = {
1479 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1480 };
1481 psa_outvec out_vec[] = {
1482 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1483 };
1484
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001485 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1486 TFM_CRYPTO_KEY_DERIVATION_SETUP);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001487
1488 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001489}
1490
1491psa_status_t psa_key_derivation_set_capacity(
1492 psa_key_derivation_operation_t *operation,
1493 size_t capacity)
1494{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001495 psa_status_t status;
1496 struct tfm_crypto_pack_iovec iov = {
1497 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
1498 .capacity = capacity,
1499 .op_handle = operation->handle,
1500 };
1501
1502 psa_invec in_vec[] = {
1503 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1504 };
1505
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001506 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1507 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001508
1509 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001510}
1511
1512psa_status_t psa_key_derivation_input_bytes(
1513 psa_key_derivation_operation_t *operation,
1514 psa_key_derivation_step_t step,
1515 const uint8_t *data,
1516 size_t data_length)
1517{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001518 psa_status_t status;
1519 struct tfm_crypto_pack_iovec iov = {
1520 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1521 .step = step,
1522 .op_handle = operation->handle,
1523 };
1524
1525 psa_invec in_vec[] = {
1526 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1527 {.base = data, .len = data_length},
1528 };
1529
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001530 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1531 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001532
1533 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001534}
1535
1536psa_status_t psa_key_derivation_output_key(
1537 const psa_key_attributes_t *attributes,
1538 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001539 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001540{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001541 psa_status_t status;
1542 struct tfm_crypto_pack_iovec iov = {
1543 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1544 .op_handle = operation->handle,
1545 };
1546
1547 psa_invec in_vec[] = {
1548 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1549 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1550 };
1551
1552 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001553 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001554 };
1555
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001556 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1557 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001558
1559 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001560}
1561
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001562psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001563 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001564 psa_algorithm_t alg)
1565{
1566 psa_status_t status;
1567
1568 status = PSA_ERROR_NOT_SUPPORTED;
1569
1570 return status;
1571}
1572
1573psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001574 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001575 psa_algorithm_t alg)
1576{
1577 psa_status_t status;
1578
1579 status = PSA_ERROR_NOT_SUPPORTED;
1580
1581 return status;
1582}
1583
1584psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
1585 uint8_t *nonce,
1586 size_t nonce_size,
1587 size_t *nonce_length)
1588{
1589 psa_status_t status;
1590
1591 status = PSA_ERROR_NOT_SUPPORTED;
1592
1593 return status;
1594}
1595
1596psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
1597 const uint8_t *nonce,
1598 size_t nonce_length)
1599{
1600 psa_status_t status;
1601
1602 status = PSA_ERROR_NOT_SUPPORTED;
1603
1604 return status;
1605}
1606
1607psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
1608 size_t ad_length,
1609 size_t plaintext_length)
1610{
1611 psa_status_t status;
1612
1613 status = PSA_ERROR_NOT_SUPPORTED;
1614
1615 return status;
1616}
1617
1618psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1619 const uint8_t *input,
1620 size_t input_length,
1621 uint8_t *output,
1622 size_t output_size,
1623 size_t *output_length)
1624{
1625 psa_status_t status;
1626
1627 status = PSA_ERROR_NOT_SUPPORTED;
1628
1629 return status;
1630}