blob: 8dc2584968dc4e42cafeb74ea5b97f7eedad7d04 [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_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +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{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100890 psa_status_t status;
891 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100892 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000893 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100894 .alg = alg,
895 };
896
897 psa_invec in_vec[] = {
898 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
899 {.base = hash, .len = hash_length},
900 };
901 psa_outvec out_vec[] = {
902 {.base = signature, .len = signature_size},
903 };
904
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100905 status = API_DISPATCH(tfm_crypto_sign_hash,
906 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100907
908 *signature_length = out_vec[0].len;
909
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100910 return status;
911}
912
Maulik Patel28659c42021-01-06 14:09:22 +0000913psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100914 psa_algorithm_t alg,
915 const uint8_t *hash,
916 size_t hash_length,
917 const uint8_t *signature,
918 size_t signature_length)
919{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100920 psa_status_t status;
921 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100922 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000923 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100924 .alg = alg
925 };
926
927 psa_invec in_vec[] = {
928 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
929 {.base = hash, .len = hash_length},
930 {.base = signature, .len = signature_length}
931 };
932
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100933 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
934 TFM_CRYPTO_VERIFY_HASH);
Kevin Peng9449a362019-07-29 16:05:42 +0800935
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100936 return status;
937}
938
Maulik Patel28659c42021-01-06 14:09:22 +0000939psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100940 psa_algorithm_t alg,
941 const uint8_t *input,
942 size_t input_length,
943 const uint8_t *salt,
944 size_t salt_length,
945 uint8_t *output,
946 size_t output_size,
947 size_t *output_length)
948{
949 psa_status_t status;
950 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800951 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000952 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100953 .alg = alg
954 };
955
956 /* Sanitize the optional input */
957 if ((salt == NULL) && (salt_length != 0)) {
958 return PSA_ERROR_INVALID_ARGUMENT;
959 }
960
961 psa_invec in_vec[] = {
962 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
963 {.base = input, .len = input_length},
964 {.base = salt, .len = salt_length}
965 };
966
967 psa_outvec out_vec[] = {
968 {.base = output, .len = output_size},
969 };
970
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800971 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100972 if (salt == NULL) {
973 in_len--;
974 }
Summer Qinaee07882021-03-29 15:44:27 +0800975 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800976 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100977
978 *output_length = out_vec[0].len;
979
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100980 return status;
981}
982
Maulik Patel28659c42021-01-06 14:09:22 +0000983psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100984 psa_algorithm_t alg,
985 const uint8_t *input,
986 size_t input_length,
987 const uint8_t *salt,
988 size_t salt_length,
989 uint8_t *output,
990 size_t output_size,
991 size_t *output_length)
992{
993 psa_status_t status;
994 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800995 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000996 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100997 .alg = alg
998 };
999
1000 /* Sanitize the optional input */
1001 if ((salt == NULL) && (salt_length != 0)) {
1002 return PSA_ERROR_INVALID_ARGUMENT;
1003 }
1004
1005 psa_invec in_vec[] = {
1006 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1007 {.base = input, .len = input_length},
1008 {.base = salt, .len = salt_length}
1009 };
1010
1011 psa_outvec out_vec[] = {
1012 {.base = output, .len = output_size},
1013 };
1014
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001015 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001016 if (salt == NULL) {
1017 in_len--;
1018 }
Summer Qinaee07882021-03-29 15:44:27 +08001019 status = psa_call(TFM_CRYPTO_HANDLE, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001020 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001021
1022 *output_length = out_vec[0].len;
1023
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001024 return status;
1025}
1026
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001027psa_status_t psa_key_derivation_get_capacity(
1028 const psa_key_derivation_operation_t *operation,
1029 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001030{
1031 psa_status_t status;
1032 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001033 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
1034 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001035 };
1036
1037 psa_invec in_vec[] = {
1038 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1039 };
1040
1041 psa_outvec out_vec[] = {
1042 {.base = capacity, .len = sizeof(size_t)},
1043 };
1044
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001045 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1046 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Kevin Peng9449a362019-07-29 16:05:42 +08001047
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001048 return status;
1049}
1050
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001051psa_status_t psa_key_derivation_output_bytes(
1052 psa_key_derivation_operation_t *operation,
1053 uint8_t *output,
1054 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001055{
1056 psa_status_t status;
1057 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001058 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
1059 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001060 };
1061
1062 psa_invec in_vec[] = {
1063 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1064 };
1065
1066 psa_outvec out_vec[] = {
1067 {.base = output, .len = output_length},
1068 };
1069
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001070 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1071 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Kevin Peng9449a362019-07-29 16:05:42 +08001072
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001073 return status;
1074}
1075
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001076psa_status_t psa_key_derivation_input_key(
1077 psa_key_derivation_operation_t *operation,
1078 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001079 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001080{
1081 psa_status_t status;
1082 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001083 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001084 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001085 .step = step,
1086 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001087 };
1088
1089 psa_invec in_vec[] = {
1090 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001091 };
1092
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001093 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1094 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +08001095
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001096 return status;
1097}
1098
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001099psa_status_t psa_key_derivation_abort(
1100 psa_key_derivation_operation_t *operation)
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_ABORT_SID,
1105 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001106 };
1107
1108 psa_invec in_vec[] = {
1109 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1110 };
1111
1112 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001113 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001114 };
1115
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001116 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1117 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001118
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001119 return status;
1120}
1121
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001122psa_status_t psa_key_derivation_key_agreement(
1123 psa_key_derivation_operation_t *operation,
1124 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001125 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001126 const uint8_t *peer_key,
1127 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001128{
1129 psa_status_t status;
1130 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001131 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001132 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001133 .step = step,
1134 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001135 };
1136
1137 psa_invec in_vec[] = {
1138 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1139 {.base = peer_key, .len = peer_key_length},
1140 };
1141
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001142 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1143 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001144
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001145 return status;
1146}
1147
1148psa_status_t psa_generate_random(uint8_t *output,
1149 size_t output_size)
1150{
1151 psa_status_t status;
1152 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001153 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001154 };
1155
1156 psa_invec in_vec[] = {
1157 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1158 };
1159
1160 psa_outvec out_vec[] = {
1161 {.base = output, .len = output_size},
1162 };
1163
1164 if (output_size == 0) {
1165 return PSA_SUCCESS;
1166 }
1167
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001168 status = API_DISPATCH(tfm_crypto_generate_random,
1169 TFM_CRYPTO_GENERATE_RANDOM);
1170
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001171 return status;
1172}
1173
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001174psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001175 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001176{
1177 psa_status_t status;
1178 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001179 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001180 };
1181
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001182 psa_invec in_vec[] = {
1183 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001184 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1185 };
1186
1187 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001188 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001189 };
1190
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001191 status = API_DISPATCH(tfm_crypto_generate_key,
1192 TFM_CRYPTO_GENERATE_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001193
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001194 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001195}
1196
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001197psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1198 const uint8_t *input,
1199 size_t input_length)
1200{
1201 psa_status_t status;
1202
1203 status = PSA_ERROR_NOT_SUPPORTED;
1204
1205 return status;
1206}
1207
1208psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1209 uint8_t *ciphertext,
1210 size_t ciphertext_size,
1211 size_t *ciphertext_length,
1212 uint8_t *tag,
1213 size_t tag_size,
1214 size_t *tag_length)
1215{
1216 psa_status_t status;
1217
1218 status = PSA_ERROR_NOT_SUPPORTED;
1219
1220 return status;
1221}
1222
1223psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1224 uint8_t *plaintext,
1225 size_t plaintext_size,
1226 size_t *plaintext_length,
1227 const uint8_t *tag,
1228 size_t tag_length)
1229{
1230 psa_status_t status;
1231
1232 status = PSA_ERROR_NOT_SUPPORTED;
1233
1234 return status;
1235}
1236
1237psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1238{
1239 psa_status_t status;
1240
1241 status = PSA_ERROR_NOT_SUPPORTED;
1242
1243 return status;
1244}
1245
Maulik Patel28659c42021-01-06 14:09:22 +00001246psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001247 psa_algorithm_t alg,
1248 const uint8_t *input,
1249 size_t input_length,
1250 uint8_t *mac,
1251 size_t mac_size,
1252 size_t *mac_length)
1253{
1254 psa_status_t status;
Summer Qin045ec4a2021-07-07 14:28:04 +08001255 struct tfm_crypto_pack_iovec iov = {
1256 .sfn_id = TFM_CRYPTO_MAC_COMPUTE_SID,
1257 .key_id = key,
1258 .alg = alg,
1259 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001260
Summer Qin045ec4a2021-07-07 14:28:04 +08001261 psa_invec in_vec[] = {
1262 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1263 {.base = input, .len = input_length},
1264 };
1265 psa_outvec out_vec[] = {
1266 {.base = mac, .len = mac_size},
1267 };
1268
1269 status = API_DISPATCH(tfm_crypto_mac_compute,
1270 TFM_CRYPTO_MAC_COMPUTE);
1271
1272 if (status == PSA_SUCCESS) {
1273 *mac_length = out_vec[0].len;
1274 }
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001275
1276 return status;
1277}
1278
Maulik Patel28659c42021-01-06 14:09:22 +00001279psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001280 psa_algorithm_t alg,
1281 const uint8_t *input,
1282 size_t input_length,
1283 const uint8_t *mac,
1284 const size_t mac_length)
1285{
1286 psa_status_t status;
Summer Qin045ec4a2021-07-07 14:28:04 +08001287 struct tfm_crypto_pack_iovec iov = {
1288 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SID,
1289 .key_id = key,
1290 .alg = alg,
1291 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001292
Summer Qin045ec4a2021-07-07 14:28:04 +08001293 psa_invec in_vec[] = {
1294 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1295 {.base = input, .len = input_length},
1296 {.base = mac, .len = mac_length},
1297 };
1298
1299 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_mac_verify,
1300 TFM_CRYPTO_MAC_VERIFY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001301
1302 return status;
1303}
1304
Maulik Patel28659c42021-01-06 14:09:22 +00001305psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001306 psa_algorithm_t alg,
1307 const uint8_t *input,
1308 size_t input_length,
1309 uint8_t *output,
1310 size_t output_size,
1311 size_t *output_length)
1312{
1313 psa_status_t status;
Summer Qin045ec4a2021-07-07 14:28:04 +08001314 struct tfm_crypto_pack_iovec iov = {
1315 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
1316 .key_id = key,
1317 .alg = alg,
1318 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001319
Summer Qin045ec4a2021-07-07 14:28:04 +08001320 psa_invec in_vec[] = {
1321 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1322 {.base = input, .len = input_length},
1323 };
1324 psa_outvec out_vec[] = {
1325 {.base = output, .len = output_size}
1326 };
1327
1328 status = API_DISPATCH(tfm_crypto_cipher_encrypt,
1329 TFM_CRYPTO_CIPHER_ENCRYPT);
1330
1331 if (status == PSA_SUCCESS) {
1332 *output_length = out_vec[0].len;
1333 }
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001334
1335 return status;
1336}
1337
Maulik Patel28659c42021-01-06 14:09:22 +00001338psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001339 psa_algorithm_t alg,
1340 const uint8_t *input,
1341 size_t input_length,
1342 uint8_t *output,
1343 size_t output_size,
1344 size_t *output_length)
1345{
1346 psa_status_t status;
Summer Qin045ec4a2021-07-07 14:28:04 +08001347 struct tfm_crypto_pack_iovec iov = {
1348 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
1349 .key_id = key,
1350 .alg = alg,
1351 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001352
Summer Qin045ec4a2021-07-07 14:28:04 +08001353 psa_invec in_vec[] = {
1354 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1355 {.base = input, .len = input_length},
1356 };
1357 psa_outvec out_vec[] = {
1358 {.base = output, .len = output_size}
1359 };
1360
1361 status = API_DISPATCH(tfm_crypto_cipher_decrypt,
1362 TFM_CRYPTO_CIPHER_DECRYPT);
1363
1364 if (status == PSA_SUCCESS) {
1365 *output_length = out_vec[0].len;
1366 }
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001367
1368 return status;
1369}
1370
1371psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001372 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001373 const uint8_t *peer_key,
1374 size_t peer_key_length,
1375 uint8_t *output,
1376 size_t output_size,
1377 size_t *output_length)
1378{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001379 psa_status_t status;
1380 struct tfm_crypto_pack_iovec iov = {
1381 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1382 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001383 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001384 };
1385
1386 psa_invec in_vec[] = {
1387 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1388 {.base = peer_key, .len = peer_key_length},
1389 };
1390
1391 psa_outvec out_vec[] = {
1392 {.base = output, .len = output_size},
1393 };
1394
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001395 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1396 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1397
1398 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001399
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001400 return status;
1401}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001402
1403psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1404 psa_algorithm_t alg)
1405{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001406 psa_status_t status;
1407 struct tfm_crypto_pack_iovec iov = {
1408 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1409 .alg = alg,
1410 .op_handle = operation->handle,
1411 };
1412
1413 psa_invec in_vec[] = {
1414 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1415 };
1416 psa_outvec out_vec[] = {
1417 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1418 };
1419
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001420 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1421 TFM_CRYPTO_KEY_DERIVATION_SETUP);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001422
1423 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001424}
1425
1426psa_status_t psa_key_derivation_set_capacity(
1427 psa_key_derivation_operation_t *operation,
1428 size_t capacity)
1429{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001430 psa_status_t status;
1431 struct tfm_crypto_pack_iovec iov = {
1432 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
1433 .capacity = capacity,
1434 .op_handle = operation->handle,
1435 };
1436
1437 psa_invec in_vec[] = {
1438 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1439 };
1440
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001441 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1442 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001443
1444 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001445}
1446
1447psa_status_t psa_key_derivation_input_bytes(
1448 psa_key_derivation_operation_t *operation,
1449 psa_key_derivation_step_t step,
1450 const uint8_t *data,
1451 size_t data_length)
1452{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001453 psa_status_t status;
1454 struct tfm_crypto_pack_iovec iov = {
1455 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1456 .step = step,
1457 .op_handle = operation->handle,
1458 };
1459
1460 psa_invec in_vec[] = {
1461 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1462 {.base = data, .len = data_length},
1463 };
1464
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001465 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1466 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001467
1468 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001469}
1470
1471psa_status_t psa_key_derivation_output_key(
1472 const psa_key_attributes_t *attributes,
1473 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001474 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001475{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001476 psa_status_t status;
1477 struct tfm_crypto_pack_iovec iov = {
1478 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1479 .op_handle = operation->handle,
1480 };
1481
1482 psa_invec in_vec[] = {
1483 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1484 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1485 };
1486
1487 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001488 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001489 };
1490
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001491 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1492 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001493
1494 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001495}
1496
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001497psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001498 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001499 psa_algorithm_t alg)
1500{
1501 psa_status_t status;
1502
1503 status = PSA_ERROR_NOT_SUPPORTED;
1504
1505 return status;
1506}
1507
1508psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001509 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001510 psa_algorithm_t alg)
1511{
1512 psa_status_t status;
1513
1514 status = PSA_ERROR_NOT_SUPPORTED;
1515
1516 return status;
1517}
1518
1519psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
1520 uint8_t *nonce,
1521 size_t nonce_size,
1522 size_t *nonce_length)
1523{
1524 psa_status_t status;
1525
1526 status = PSA_ERROR_NOT_SUPPORTED;
1527
1528 return status;
1529}
1530
1531psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
1532 const uint8_t *nonce,
1533 size_t nonce_length)
1534{
1535 psa_status_t status;
1536
1537 status = PSA_ERROR_NOT_SUPPORTED;
1538
1539 return status;
1540}
1541
1542psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
1543 size_t ad_length,
1544 size_t plaintext_length)
1545{
1546 psa_status_t status;
1547
1548 status = PSA_ERROR_NOT_SUPPORTED;
1549
1550 return status;
1551}
1552
1553psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1554 const uint8_t *input,
1555 size_t input_length,
1556 uint8_t *output,
1557 size_t output_size,
1558 size_t *output_length)
1559{
1560 psa_status_t status;
1561
1562 status = PSA_ERROR_NOT_SUPPORTED;
1563
1564 return status;
1565}