blob: 64d56dbfc1a114d4cd4d6597ca36825f5778ae80 [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
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08008#include "psa/client.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00009#include "tfm_veneers.h"
10#include "tfm_crypto_defs.h"
Jamie Foxcc31d402019-01-28 17:13:52 +000011#include "psa/crypto.h"
Antonio de Angelis05b24192019-07-04 15:28:46 +010012#include "tfm_ns_interface.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000013
Antonio de Angelis05b24192019-07-04 15:28:46 +010014#define API_DISPATCH(sfn_name, sfn_id) \
David Hu7c2a7442021-04-01 16:34:30 +080015 tfm_ns_interface_dispatch((veneer_fn)sfn_name##_veneer, \
Xinyu Zhangade2e0a2021-03-18 16:20:54 +080016 (uint32_t)in_vec, IOVEC_LEN(in_vec), \
17 (uint32_t)out_vec, IOVEC_LEN(out_vec))
Antonio de Angelis4743e672019-04-11 11:38:48 +010018
Antonio de Angelis05b24192019-07-04 15:28:46 +010019#define API_DISPATCH_NO_OUTVEC(sfn_name, sfn_id) \
David Hu7c2a7442021-04-01 16:34:30 +080020 tfm_ns_interface_dispatch((veneer_fn)sfn_name##_veneer, \
Xinyu Zhangade2e0a2021-03-18 16:20:54 +080021 (uint32_t)in_vec, IOVEC_LEN(in_vec), \
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000022 (uint32_t)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 const struct tfm_crypto_pack_iovec iov = {
36 .sfn_id = TFM_CRYPTO_OPEN_KEY_SID,
Jamie Foxdadb4e82019-09-03 17:59:41 +010037 };
38 psa_invec in_vec[] = {
39 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
40 {.base = &id, .len = sizeof(psa_key_id_t)},
41 };
42 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000043 {.base = key, .len = sizeof(psa_key_id_t)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010044 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010045
Jamie Foxdadb4e82019-09-03 17:59:41 +010046 return API_DISPATCH(tfm_crypto_open_key,
47 TFM_CRYPTO_OPEN_KEY);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010048}
49
Maulik Patel28659c42021-01-06 14:09:22 +000050psa_status_t psa_close_key(psa_key_id_t key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010051{
Jamie Foxdadb4e82019-09-03 17:59:41 +010052 const struct tfm_crypto_pack_iovec iov = {
53 .sfn_id = TFM_CRYPTO_CLOSE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000054 .key_id = key,
Jamie Foxdadb4e82019-09-03 17:59:41 +010055 };
56 psa_invec in_vec[] = {
57 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
58 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010059
Jamie Foxdadb4e82019-09-03 17:59:41 +010060 return API_DISPATCH_NO_OUTVEC(tfm_crypto_close_key,
61 TFM_CRYPTO_CLOSE_KEY);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010062}
63
Antonio de Angelis04debbd2019-10-14 12:12:52 +010064psa_status_t psa_import_key(const psa_key_attributes_t *attributes,
Antonio de Angelis8908f472018-08-31 15:44:25 +010065 const uint8_t *data,
Antonio de Angelis04debbd2019-10-14 12:12:52 +010066 size_t data_length,
Maulik Patel28659c42021-01-06 14:09:22 +000067 psa_key_id_t *key)
Antonio de Angelis8908f472018-08-31 15:44:25 +010068{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000069 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +010070 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +080071 .sfn_id = TFM_CRYPTO_IMPORT_KEY_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +010072 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000073 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +010074 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +010075 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000076 {.base = data, .len = data_length}
77 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +010078 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000079 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +010080 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010081
Antonio de Angelis04debbd2019-10-14 12:12:52 +010082 status = API_DISPATCH(tfm_crypto_import_key,
83 TFM_CRYPTO_IMPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +010084
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000085 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +010086}
87
Maulik Patel28659c42021-01-06 14:09:22 +000088psa_status_t psa_destroy_key(psa_key_id_t key)
Antonio de Angelis8908f472018-08-31 15:44:25 +010089{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000090 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +010091 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +080092 .sfn_id = TFM_CRYPTO_DESTROY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000093 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +010094 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000095 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +010096 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000097 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010098
Antonio de Angelis4743e672019-04-11 11:38:48 +010099 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_destroy_key,
100 TFM_CRYPTO_DESTROY_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100101
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000102 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100103}
104
Maulik Patel28659c42021-01-06 14:09:22 +0000105psa_status_t psa_get_key_attributes(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100106 psa_key_attributes_t *attributes)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100107{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000108 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100109 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100110 .sfn_id = TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000111 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100112 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000113 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100114 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000115 };
116 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100117 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000118 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100119
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100120 status = API_DISPATCH(tfm_crypto_get_key_attributes,
121 TFM_CRYPTO_GET_KEY_ATTRIBUTES);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000122 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100123}
124
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100125void psa_reset_key_attributes(psa_key_attributes_t *attributes)
126{
127 struct tfm_crypto_pack_iovec iov = {
128 .sfn_id = TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID,
129 };
130 psa_invec in_vec[] = {
131 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
132 };
133 psa_outvec out_vec[] = {
134 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
135 };
136
137 (void)API_DISPATCH(tfm_crypto_reset_key_attributes,
Antonio de Angelis8d282482021-10-07 15:04:12 +0100138 TFM_CRYPTO_RESET_KEY_ATTRIBUTES);
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100139 return;
140}
141
Maulik Patel28659c42021-01-06 14:09:22 +0000142psa_status_t psa_export_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100143 uint8_t *data,
144 size_t data_size,
145 size_t *data_length)
146{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000147 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100148 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800149 .sfn_id = TFM_CRYPTO_EXPORT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000150 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100151 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000152 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100153 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000154 };
155 psa_outvec out_vec[] = {
156 {.base = data, .len = data_size}
157 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100158
Antonio de Angelis4743e672019-04-11 11:38:48 +0100159 status = API_DISPATCH(tfm_crypto_export_key,
160 TFM_CRYPTO_EXPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100161
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000162 *data_length = out_vec[0].len;
163
164 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100165}
166
Maulik Patel28659c42021-01-06 14:09:22 +0000167psa_status_t psa_export_public_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100168 uint8_t *data,
169 size_t data_size,
170 size_t *data_length)
171{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100172 psa_status_t status;
173 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800174 .sfn_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000175 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100176 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000177
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100178 psa_invec in_vec[] = {
179 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
180 };
181 psa_outvec out_vec[] = {
182 {.base = data, .len = data_size}
183 };
184
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100185 status = API_DISPATCH(tfm_crypto_export_public_key,
186 TFM_CRYPTO_EXPORT_PUBLIC_KEY);
187
188 *data_length = out_vec[0].len;
189
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100190 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100191}
192
Maulik Patel28659c42021-01-06 14:09:22 +0000193psa_status_t psa_purge_key(psa_key_id_t key)
194{
195 psa_status_t status;
196 struct tfm_crypto_pack_iovec iov = {
197 .sfn_id = TFM_CRYPTO_PURGE_KEY_SID,
198 .key_id = key,
199 };
200 psa_invec in_vec[] = {
201 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
202 };
203
204 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_purge_key,
205 TFM_CRYPTO_PURGE_KEY);
206 return status;
207}
208
209psa_status_t psa_copy_key(psa_key_id_t source_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100210 const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +0000211 psa_key_id_t *target_key)
Jamie Foxefd82732018-11-26 10:34:32 +0000212{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100213 psa_status_t status;
214 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800215 .sfn_id = TFM_CRYPTO_COPY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000216 .key_id = source_key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100217 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000218
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100219 psa_invec in_vec[] = {
220 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100221 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100222 };
223
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000224 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000225 {.base = target_key, .len = sizeof(psa_key_id_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000226 };
Jamie Foxefd82732018-11-26 10:34:32 +0000227
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100228 status = API_DISPATCH(tfm_crypto_copy_key,
229 TFM_CRYPTO_COPY_KEY);
Jamie Foxefd82732018-11-26 10:34:32 +0000230
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000231 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000232}
233
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100234psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
235 unsigned char *iv,
236 size_t iv_size,
237 size_t *iv_length)
238{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100239 psa_status_t status;
240 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800241 .sfn_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100242 .op_handle = operation->handle,
243 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100244
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100245 psa_invec in_vec[] = {
246 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
247 };
248 psa_outvec out_vec[] = {
249 {.base = &(operation->handle), .len = sizeof(uint32_t)},
250 {.base = iv, .len = iv_size},
251 };
252
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100253 status = API_DISPATCH(tfm_crypto_cipher_generate_iv,
254 TFM_CRYPTO_CIPHER_GENERATE_IV);
255
256 *iv_length = out_vec[1].len;
257
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100258 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100259}
260
Antonio de Angelis377a1552018-11-22 17:02:40 +0000261psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
262 const unsigned char *iv,
263 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100264{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000265 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100266 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800267 .sfn_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100268 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100269 };
270
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000271 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100272 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000273 {.base = iv, .len = iv_length},
274 };
275 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100276 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000277 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100278
Antonio de Angelis4743e672019-04-11 11:38:48 +0100279 status = API_DISPATCH(tfm_crypto_cipher_set_iv,
280 TFM_CRYPTO_CIPHER_SET_IV);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100281
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000282 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100283}
284
Antonio de Angelis377a1552018-11-22 17:02:40 +0000285psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000286 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000287 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100288{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000289 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100290 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800291 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000292 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100293 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100294 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000295 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100296
Antonio de Angelis4743e672019-04-11 11:38:48 +0100297 psa_invec in_vec[] = {
298 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
299 };
300 psa_outvec out_vec[] = {
301 {.base = &(operation->handle), .len = sizeof(uint32_t)},
302 };
303
Antonio de Angelis4743e672019-04-11 11:38:48 +0100304 status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup,
305 TFM_CRYPTO_CIPHER_ENCRYPT_SETUP);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100306
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000307 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100308}
309
Antonio de Angelis377a1552018-11-22 17:02:40 +0000310psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000311 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000312 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100313{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000314 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100315 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800316 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000317 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100318 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100319 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000320 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100321
Antonio de Angelis4743e672019-04-11 11:38:48 +0100322 psa_invec in_vec[] = {
323 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
324 };
325 psa_outvec out_vec[] = {
326 {.base = &(operation->handle), .len = sizeof(uint32_t)},
327 };
328
Antonio de Angelis4743e672019-04-11 11:38:48 +0100329 status = API_DISPATCH(tfm_crypto_cipher_decrypt_setup,
330 TFM_CRYPTO_CIPHER_DECRYPT_SETUP);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100331
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000332 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100333}
334
335psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
336 const uint8_t *input,
337 size_t input_length,
338 unsigned char *output,
339 size_t output_size,
340 size_t *output_length)
341{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000342 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100343 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800344 .sfn_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100345 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100346 };
347
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000348 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100349 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000350 {.base = input, .len = input_length},
351 };
352 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100353 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000354 {.base = output, .len = output_size}
355 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100356
Antonio de Angelis4743e672019-04-11 11:38:48 +0100357 status = API_DISPATCH(tfm_crypto_cipher_update,
358 TFM_CRYPTO_CIPHER_UPDATE);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100359
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000360 *output_length = out_vec[1].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100361
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000362 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100363}
364
365psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
366{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000367 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100368 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800369 .sfn_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100370 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000371 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100372
Antonio de Angelis4743e672019-04-11 11:38:48 +0100373 psa_invec in_vec[] = {
374 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
375 };
376 psa_outvec out_vec[] = {
377 {.base = &(operation->handle), .len = sizeof(uint32_t)},
378 };
379
Antonio de Angelis4743e672019-04-11 11:38:48 +0100380 status = API_DISPATCH(tfm_crypto_cipher_abort,
381 TFM_CRYPTO_CIPHER_ABORT);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100382
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000383 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100384}
385
386psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
387 uint8_t *output,
388 size_t output_size,
389 size_t *output_length)
390{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000391 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100392 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800393 .sfn_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100394 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100395 };
396
397 psa_invec in_vec[] = {
398 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
399 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000400 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100401 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000402 {.base = output, .len = output_size},
403 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100404
Antonio de Angelis4743e672019-04-11 11:38:48 +0100405 status = API_DISPATCH(tfm_crypto_cipher_finish,
406 TFM_CRYPTO_CIPHER_FINISH);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100407
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000408 *output_length = out_vec[1].len;
409
410 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100411}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100412
Antonio de Angelis377a1552018-11-22 17:02:40 +0000413psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100414 psa_algorithm_t alg)
415{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000416 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100417 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800418 .sfn_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100419 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100420 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000421 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100422
Antonio de Angelis4743e672019-04-11 11:38:48 +0100423 psa_invec in_vec[] = {
424 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
425 };
426 psa_outvec out_vec[] = {
427 {.base = &(operation->handle), .len = sizeof(uint32_t)},
428 };
429
Antonio de Angelis4743e672019-04-11 11:38:48 +0100430 status = API_DISPATCH(tfm_crypto_hash_setup,
431 TFM_CRYPTO_HASH_SETUP);
432
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000433 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100434}
435
436psa_status_t psa_hash_update(psa_hash_operation_t *operation,
437 const uint8_t *input,
438 size_t input_length)
439{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000440 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100441 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800442 .sfn_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100443 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100444 };
445
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000446 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100447 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000448 {.base = input, .len = input_length},
449 };
450 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100451 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000452 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100453
Antonio de Angelis4743e672019-04-11 11:38:48 +0100454 status = API_DISPATCH(tfm_crypto_hash_update,
455 TFM_CRYPTO_HASH_UPDATE);
456
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000457 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100458}
459
460psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
461 uint8_t *hash,
462 size_t hash_size,
463 size_t *hash_length)
464{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000465 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100466 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800467 .sfn_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100468 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100469 };
470
471 psa_invec in_vec[] = {
472 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
473 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000474 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100475 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000476 {.base = hash, .len = hash_size},
477 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100478
Antonio de Angelis4743e672019-04-11 11:38:48 +0100479 status = API_DISPATCH(tfm_crypto_hash_finish,
480 TFM_CRYPTO_HASH_FINISH);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100481
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000482 *hash_length = out_vec[1].len;
483
484 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100485}
486
487psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
488 const uint8_t *hash,
489 size_t hash_length)
490{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000491 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100492 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800493 .sfn_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100494 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100495 };
496
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000497 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100498 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000499 {.base = hash, .len = hash_length},
500 };
501 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100502 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000503 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100504
Antonio de Angelis4743e672019-04-11 11:38:48 +0100505 status = API_DISPATCH(tfm_crypto_hash_verify,
506 TFM_CRYPTO_HASH_VERIFY);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100507
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000508 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100509}
510
511psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
512{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000513 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100514 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800515 .sfn_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100516 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000517 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100518
Antonio de Angelis4743e672019-04-11 11:38:48 +0100519 psa_invec in_vec[] = {
520 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
521 };
522 psa_outvec out_vec[] = {
523 {.base = &(operation->handle), .len = sizeof(uint32_t)},
524 };
525
Antonio de Angelis4743e672019-04-11 11:38:48 +0100526 status = API_DISPATCH(tfm_crypto_hash_abort,
527 TFM_CRYPTO_HASH_ABORT);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100528
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000529 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100530}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100531
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100532psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
533 psa_hash_operation_t *target_operation)
534{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100535 psa_status_t status;
536 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800537 .sfn_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100538 .op_handle = source_operation->handle,
539 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100540
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100541 psa_invec in_vec[] = {
542 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
543 };
544 psa_outvec out_vec[] = {
545 {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
546 };
547
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100548 if (target_operation && (target_operation->handle != 0)) {
549 return PSA_ERROR_BAD_STATE;
550 }
551
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100552 status = API_DISPATCH(tfm_crypto_hash_clone,
553 TFM_CRYPTO_HASH_CLONE);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100554
555 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100556}
557
Soby Mathew07ef6e42020-07-20 21:09:23 +0100558psa_status_t psa_hash_compute(psa_algorithm_t alg,
559 const uint8_t *input,
560 size_t input_length,
561 uint8_t *hash,
562 size_t hash_size,
563 size_t *hash_length)
564{
565 psa_status_t status;
566 struct tfm_crypto_pack_iovec iov = {
567 .sfn_id = TFM_CRYPTO_HASH_COMPUTE_SID,
568 .alg = alg,
569 };
570
571 psa_invec in_vec[] = {
572 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
573 {.base = input, .len = input_length},
574 };
575
576 psa_outvec out_vec[] = {
577 {.base = hash, .len = hash_size}
578 };
579
580 status = API_DISPATCH(tfm_crypto_hash_compute,
581 TFM_CRYPTO_HASH_COMPUTE);
582
583 *hash_length = out_vec[0].len;
584
585 return status;
586}
587
588psa_status_t psa_hash_compare(psa_algorithm_t alg,
589 const uint8_t *input,
590 size_t input_length,
591 const uint8_t *hash,
592 size_t hash_length)
593{
594 psa_status_t status;
595 struct tfm_crypto_pack_iovec iov = {
596 .sfn_id = TFM_CRYPTO_HASH_COMPARE_SID,
597 .alg = alg,
598 };
599
600 psa_invec in_vec[] = {
601 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
602 {.base = input, .len = input_length},
603 {.base = hash, .len = hash_length},
604 };
605
606 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_hash_compare,
607 TFM_CRYPTO_HASH_COMPARE);
608
609 return status;
610}
611
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100612psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000613 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100614 psa_algorithm_t alg)
615{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000616 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100617 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800618 .sfn_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000619 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100620 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100621 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000622 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100623
Antonio de Angelis4743e672019-04-11 11:38:48 +0100624 psa_invec in_vec[] = {
625 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
626 };
627 psa_outvec out_vec[] = {
628 {.base = &(operation->handle), .len = sizeof(uint32_t)},
629 };
630
Antonio de Angelis4743e672019-04-11 11:38:48 +0100631 status = API_DISPATCH(tfm_crypto_mac_sign_setup,
632 TFM_CRYPTO_MAC_SIGN_SETUP);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100633
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000634 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100635}
636
637psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000638 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100639 psa_algorithm_t alg)
640{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000641 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100642 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800643 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000644 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100645 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100646 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000647 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100648
Antonio de Angelis4743e672019-04-11 11:38:48 +0100649 psa_invec in_vec[] = {
650 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
651 };
652 psa_outvec out_vec[] = {
653 {.base = &(operation->handle), .len = sizeof(uint32_t)},
654 };
655
Antonio de Angelis4743e672019-04-11 11:38:48 +0100656 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
657 TFM_CRYPTO_MAC_VERIFY_SETUP);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100658
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000659 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100660}
661
662psa_status_t psa_mac_update(psa_mac_operation_t *operation,
663 const uint8_t *input,
664 size_t input_length)
665{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000666 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100667 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800668 .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100669 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100670 };
671
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000672 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100673 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000674 {.base = input, .len = input_length},
675 };
676 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100677 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000678 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100679
Antonio de Angelis4743e672019-04-11 11:38:48 +0100680 status = API_DISPATCH(tfm_crypto_mac_update,
681 TFM_CRYPTO_MAC_UPDATE);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100682
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000683 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100684}
685
686psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
687 uint8_t *mac,
688 size_t mac_size,
689 size_t *mac_length)
690{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000691 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100692 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800693 .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100694 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100695 };
696
697 psa_invec in_vec[] = {
698 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
699 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000700 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100701 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000702 {.base = mac, .len = mac_size},
703 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100704
Antonio de Angelis4743e672019-04-11 11:38:48 +0100705 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
706 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100707
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000708 *mac_length = out_vec[1].len;
709
710 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100711}
712
713psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
714 const uint8_t *mac,
715 size_t mac_length)
716{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000717 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100718 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800719 .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100720 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100721 };
722
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000723 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100724 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000725 {.base = mac, .len = mac_length},
726 };
727 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100728 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000729 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100730
Antonio de Angelis4743e672019-04-11 11:38:48 +0100731 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
732 TFM_CRYPTO_MAC_VERIFY_FINISH);
733
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000734 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100735}
736
737psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
738{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000739 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100740 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800741 .sfn_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100742 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000743 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100744
Antonio de Angelis4743e672019-04-11 11:38:48 +0100745 psa_invec in_vec[] = {
746 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
747 };
748 psa_outvec out_vec[] = {
749 {.base = &(operation->handle), .len = sizeof(uint32_t)},
750 };
751
Antonio de Angelis4743e672019-04-11 11:38:48 +0100752 status = API_DISPATCH(tfm_crypto_mac_abort,
753 TFM_CRYPTO_MAC_ABORT);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100754
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000755 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100756}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000757
Maulik Patel28659c42021-01-06 14:09:22 +0000758psa_status_t psa_aead_encrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000759 psa_algorithm_t alg,
760 const uint8_t *nonce,
761 size_t nonce_length,
762 const uint8_t *additional_data,
763 size_t additional_data_length,
764 const uint8_t *plaintext,
765 size_t plaintext_length,
766 uint8_t *ciphertext,
767 size_t ciphertext_size,
768 size_t *ciphertext_length)
769{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000770 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100771 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800772 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000773 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100774 .alg = alg,
775 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000776 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100777
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100778 /* Sanitize the optional input */
779 if ((additional_data == NULL) && (additional_data_length != 0)) {
780 return PSA_ERROR_INVALID_ARGUMENT;
781 }
782
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000783 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100784 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000785 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100786 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000787 };
788 psa_outvec out_vec[] = {
789 {.base = ciphertext, .len = ciphertext_size},
790 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000791
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000792 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
793 return PSA_ERROR_INVALID_ARGUMENT;
794 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000795
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000796 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000797 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100798 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000799 }
800 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000801
Antonio de Angelis4743e672019-04-11 11:38:48 +0100802 status = API_DISPATCH(tfm_crypto_aead_encrypt,
803 TFM_CRYPTO_AEAD_ENCRYPT);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000804
805 *ciphertext_length = out_vec[0].len;
806
807 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000808}
809
Maulik Patel28659c42021-01-06 14:09:22 +0000810psa_status_t psa_aead_decrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000811 psa_algorithm_t alg,
812 const uint8_t *nonce,
813 size_t nonce_length,
814 const uint8_t *additional_data,
815 size_t additional_data_length,
816 const uint8_t *ciphertext,
817 size_t ciphertext_length,
818 uint8_t *plaintext,
819 size_t plaintext_size,
820 size_t *plaintext_length)
821{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000822 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100823 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800824 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000825 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100826 .alg = alg,
827 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000828 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100829
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100830 /* Sanitize the optional input */
831 if ((additional_data == NULL) && (additional_data_length != 0)) {
832 return PSA_ERROR_INVALID_ARGUMENT;
833 }
834
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000835 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100836 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000837 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100838 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000839 };
840 psa_outvec out_vec[] = {
841 {.base = plaintext, .len = plaintext_size},
842 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000843
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000844 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
845 return PSA_ERROR_INVALID_ARGUMENT;
846 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000847
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000848 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000849 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100850 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000851 }
852 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000853
Antonio de Angelis4743e672019-04-11 11:38:48 +0100854 status = API_DISPATCH(tfm_crypto_aead_decrypt,
855 TFM_CRYPTO_AEAD_DECRYPT);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000856
857 *plaintext_length = out_vec[0].len;
858
859 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000860}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100861
Antonio de Angelis8d282482021-10-07 15:04:12 +0100862psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
863 psa_key_id_t key,
864 psa_algorithm_t alg)
865{
866 psa_status_t status;
867 struct tfm_crypto_pack_iovec iov = {
868 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SETUP_SID,
869 .key_id = key,
870 .alg = alg,
871 .op_handle = operation->handle,
872 };
873
874 psa_invec in_vec[] = {
875 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
876 };
877 psa_outvec out_vec[] = {
878 {.base = &(operation->handle), .len = sizeof(uint32_t)}
879 };
880
881 status = API_DISPATCH(tfm_crypto_aead_encrypt_setup,
882 TFM_CRYPTO_AEAD_ENCRYPT_SETUP);
883 return status;
884}
885
886psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
887 psa_key_id_t key,
888 psa_algorithm_t alg)
889{
890 psa_status_t status;
891 struct tfm_crypto_pack_iovec iov = {
892 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SETUP_SID,
893 .key_id = key,
894 .alg = alg,
895 .op_handle = operation->handle,
896 };
897
898 psa_invec in_vec[] = {
899 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
900 };
901 psa_outvec out_vec[] = {
902 {.base = &(operation->handle), .len = sizeof(uint32_t)}
903 };
904
905 status = API_DISPATCH(tfm_crypto_aead_decrypt_setup,
906 TFM_CRYPTO_AEAD_DECRYPT_SETUP);
907 return status;
908}
909
910psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
911 uint8_t *nonce,
912 size_t nonce_size,
913 size_t *nonce_length)
914{
915 psa_status_t status;
916 struct tfm_crypto_pack_iovec iov = {
917 .sfn_id = TFM_CRYPTO_AEAD_GENERATE_NONCE_SID,
918 .op_handle = operation->handle,
919 };
920
921 psa_invec in_vec[] = {
922 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
923 };
924 psa_outvec out_vec[] = {
925 {.base = &(operation->handle), .len = sizeof(uint32_t)},
926 {.base = nonce, .len = nonce_size}
927 };
928
929 status = API_DISPATCH(tfm_crypto_aead_generate_nonce,
930 TFM_CRYPTO_AEAD_GENERATE_NONCE);
931
932 *nonce_length = out_vec[1].len;
933 return status;
934}
935
936psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
937 const uint8_t *nonce,
938 size_t nonce_length)
939{
940 psa_status_t status;
941 struct tfm_crypto_pack_iovec iov = {
942 .sfn_id = TFM_CRYPTO_AEAD_SET_NONCE_SID,
943 .op_handle = operation->handle,
944 };
945
946 psa_invec in_vec[] = {
947 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
948 {.base = nonce, .len = nonce_length}
949 };
950 psa_outvec out_vec[] = {
951 {.base = &(operation->handle), .len = sizeof(uint32_t)}
952 };
953
954 status = API_DISPATCH(tfm_crypto_aead_set_nonce,
955 TFM_CRYPTO_AEAD_SET_NONCE);
956 return status;
957}
958
959psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
960 size_t ad_length,
961 size_t plaintext_length)
962{
963 psa_status_t status;
964 struct tfm_crypto_pack_iovec iov = {
965 .sfn_id = TFM_CRYPTO_AEAD_SET_LENGTHS_SID,
966 .ad_length = ad_length,
967 .plaintext_length = plaintext_length,
968 .op_handle = operation->handle,
969 };
970
971 psa_invec in_vec[] = {
972 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
973 };
974 psa_outvec out_vec[] = {
975 {.base = &(operation->handle), .len = sizeof(uint32_t)}
976 };
977
978 status = API_DISPATCH(tfm_crypto_aead_set_lengths,
979 TFM_CRYPTO_AEAD_SET_LENGTHS);
980 return status;
981}
982
983psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
984 const uint8_t *input,
985 size_t input_length)
986{
987 psa_status_t status;
988 struct tfm_crypto_pack_iovec iov = {
989 .sfn_id = TFM_CRYPTO_AEAD_UPDATE_AD_SID,
990 .op_handle = operation->handle,
991 };
992
993 psa_invec in_vec[] = {
994 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
995 {.base = input, .len = input_length}
996 };
997 psa_outvec out_vec[] = {
998 {.base = &(operation->handle), .len = sizeof(uint32_t)}
999 };
1000
1001 status = API_DISPATCH(tfm_crypto_aead_update_ad,
1002 TFM_CRYPTO_AEAD_UPDATE_AD);
1003 return status;
1004}
1005
1006psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1007 const uint8_t *input,
1008 size_t input_length,
1009 uint8_t *output,
1010 size_t output_size,
1011 size_t *output_length)
1012{
1013 psa_status_t status;
1014 struct tfm_crypto_pack_iovec iov = {
1015 .sfn_id = TFM_CRYPTO_AEAD_UPDATE_SID,
1016 .op_handle = operation->handle,
1017 };
1018
1019 psa_invec in_vec[] = {
1020 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1021 {.base = input, .len = input_length}
1022 };
1023 psa_outvec out_vec[] = {
1024 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1025 {.base = output, .len = output_size},
1026 };
1027
1028 status = API_DISPATCH(tfm_crypto_aead_update,
1029 TFM_CRYPTO_AEAD_UPDATE);
1030
1031 *output_length = out_vec[1].len;
1032 return status;
1033}
1034
1035psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1036 uint8_t *ciphertext,
1037 size_t ciphertext_size,
1038 size_t *ciphertext_length,
1039 uint8_t *tag,
1040 size_t tag_size,
1041 size_t *tag_length)
1042{
1043 psa_status_t status;
1044 struct tfm_crypto_pack_iovec iov = {
1045 .sfn_id = TFM_CRYPTO_AEAD_FINISH_SID,
1046 .op_handle = operation->handle,
1047 };
1048
1049 psa_invec in_vec[] = {
1050 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1051 };
1052 psa_outvec out_vec[] = {
1053 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1054 {.base = ciphertext, .len = ciphertext_size},
1055 {.base = tag, .len = tag_size},
1056 };
1057
1058 status = API_DISPATCH(tfm_crypto_aead_finish,
1059 TFM_CRYPTO_AEAD_FINISH);
1060
1061 *ciphertext_length = out_vec[1].len;
1062 *tag_length = out_vec[2].len;
1063 return status;
1064}
1065
1066psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1067 uint8_t *plaintext,
1068 size_t plaintext_size,
1069 size_t *plaintext_length,
1070 const uint8_t *tag,
1071 size_t tag_length)
1072{
1073 psa_status_t status;
1074 struct tfm_crypto_pack_iovec iov = {
1075 .sfn_id = TFM_CRYPTO_AEAD_VERIFY_SID,
1076 .op_handle = operation->handle,
1077 };
1078
1079 psa_invec in_vec[] = {
1080 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1081 {.base = tag, .len = tag_length}
1082 };
1083 psa_outvec out_vec[] = {
1084 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1085 {.base = plaintext, .len = plaintext_size},
1086 };
1087
1088 status = API_DISPATCH(tfm_crypto_aead_verify,
1089 TFM_CRYPTO_AEAD_VERIFY);
1090
1091 *plaintext_length = out_vec[1].len;
1092 return status;
1093}
1094
1095psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1096{
1097 psa_status_t status;
1098 struct tfm_crypto_pack_iovec iov = {
1099 .sfn_id = TFM_CRYPTO_AEAD_ABORT_SID,
1100 .op_handle = operation->handle,
1101 };
1102
1103 psa_invec in_vec[] = {
1104 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1105 };
1106 psa_outvec out_vec[] = {
1107 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1108 };
1109
1110 status = API_DISPATCH(tfm_crypto_aead_abort,
1111 TFM_CRYPTO_AEAD_ABORT);
1112 return status;
1113}
1114
Summer Qinb9492d22021-06-22 18:00:54 +08001115psa_status_t psa_sign_message(psa_key_id_t key,
1116 psa_algorithm_t alg,
1117 const uint8_t *input,
1118 size_t input_length,
1119 uint8_t *signature,
1120 size_t signature_size,
1121 size_t *signature_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001122{
Summer Qinb9492d22021-06-22 18:00:54 +08001123 psa_status_t status;
1124 struct tfm_crypto_pack_iovec iov = {
1125 .sfn_id = TFM_CRYPTO_SIGN_MESSAGE_SID,
1126 .key_id = key,
1127 .alg = alg,
1128 };
1129
1130 psa_invec in_vec[] = {
1131 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1132 {.base = input, .len = input_length},
1133 };
1134 psa_outvec out_vec[] = {
1135 {.base = signature, .len = signature_size},
1136 };
1137
1138 status = API_DISPATCH(tfm_crypto_sign_message,
1139 TFM_CRYPTO_SIGN_MESSAGE);
1140
Antonio de Angelisf83a2082021-08-20 22:13:53 +01001141 *signature_length = out_vec[0].len;
Summer Qinb9492d22021-06-22 18:00:54 +08001142 return status;
1143}
1144
1145psa_status_t psa_verify_message(psa_key_id_t key,
1146 psa_algorithm_t alg,
1147 const uint8_t *input,
1148 size_t input_length,
1149 const uint8_t *signature,
1150 size_t signature_length)
1151{
1152 psa_status_t status;
1153 struct tfm_crypto_pack_iovec iov = {
1154 .sfn_id = TFM_CRYPTO_VERIFY_MESSAGE_SID,
1155 .key_id = key,
1156 .alg = alg
1157 };
1158
1159 psa_invec in_vec[] = {
1160 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1161 {.base = input, .len = input_length},
1162 {.base = signature, .len = signature_length}
1163 };
1164
1165 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_message,
1166 TFM_CRYPTO_VERIFY_MESSAGE);
1167
1168 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001169}
1170
Maulik Patel28659c42021-01-06 14:09:22 +00001171psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001172 psa_algorithm_t alg,
1173 const uint8_t *hash,
1174 size_t hash_length,
1175 uint8_t *signature,
1176 size_t signature_size,
1177 size_t *signature_length)
1178{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001179 psa_status_t status;
1180 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001181 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001182 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001183 .alg = alg,
1184 };
1185
1186 psa_invec in_vec[] = {
1187 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1188 {.base = hash, .len = hash_length},
1189 };
1190 psa_outvec out_vec[] = {
1191 {.base = signature, .len = signature_size},
1192 };
1193
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001194 status = API_DISPATCH(tfm_crypto_sign_hash,
1195 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001196
1197 *signature_length = out_vec[0].len;
1198
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001199 return status;
1200}
1201
Maulik Patel28659c42021-01-06 14:09:22 +00001202psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001203 psa_algorithm_t alg,
1204 const uint8_t *hash,
1205 size_t hash_length,
1206 const uint8_t *signature,
1207 size_t signature_length)
1208{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001209 psa_status_t status;
1210 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001211 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001212 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001213 .alg = alg
1214 };
1215
1216 psa_invec in_vec[] = {
1217 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1218 {.base = hash, .len = hash_length},
1219 {.base = signature, .len = signature_length}
1220 };
1221
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001222 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
1223 TFM_CRYPTO_VERIFY_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001224
1225 return status;
1226}
1227
Maulik Patel28659c42021-01-06 14:09:22 +00001228psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001229 psa_algorithm_t alg,
1230 const uint8_t *input,
1231 size_t input_length,
1232 const uint8_t *salt,
1233 size_t salt_length,
1234 uint8_t *output,
1235 size_t output_size,
1236 size_t *output_length)
1237{
1238 psa_status_t status;
1239 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001240 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001241 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001242 .alg = alg
1243 };
1244
1245 /* Sanitize the optional input */
1246 if ((salt == NULL) && (salt_length != 0)) {
1247 return PSA_ERROR_INVALID_ARGUMENT;
1248 }
1249
1250 psa_invec in_vec[] = {
1251 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1252 {.base = input, .len = input_length},
1253 {.base = salt, .len = salt_length}
1254 };
1255
1256 psa_outvec out_vec[] = {
1257 {.base = output, .len = output_size},
1258 };
1259
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001260 status = API_DISPATCH(tfm_crypto_asymmetric_encrypt,
1261 TFM_CRYPTO_ASYMMETRIC_ENCRYPT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001262
1263 *output_length = out_vec[0].len;
1264
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001265 return status;
1266}
1267
Maulik Patel28659c42021-01-06 14:09:22 +00001268psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001269 psa_algorithm_t alg,
1270 const uint8_t *input,
1271 size_t input_length,
1272 const uint8_t *salt,
1273 size_t salt_length,
1274 uint8_t *output,
1275 size_t output_size,
1276 size_t *output_length)
1277{
1278 psa_status_t status;
1279 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001280 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001281 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001282 .alg = alg
1283 };
1284
1285 /* Sanitize the optional input */
1286 if ((salt == NULL) && (salt_length != 0)) {
1287 return PSA_ERROR_INVALID_ARGUMENT;
1288 }
1289
1290 psa_invec in_vec[] = {
1291 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1292 {.base = input, .len = input_length},
1293 {.base = salt, .len = salt_length}
1294 };
1295
1296 psa_outvec out_vec[] = {
1297 {.base = output, .len = output_size},
1298 };
1299
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001300 status = API_DISPATCH(tfm_crypto_asymmetric_decrypt,
1301 TFM_CRYPTO_ASYMMETRIC_DECRYPT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001302
1303 *output_length = out_vec[0].len;
1304
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001305 return status;
1306}
1307
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001308psa_status_t psa_key_derivation_get_capacity(
1309 const psa_key_derivation_operation_t *operation,
1310 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001311{
1312 psa_status_t status;
1313 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001314 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
1315 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001316 };
1317
1318 psa_invec in_vec[] = {
1319 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1320 };
1321
1322 psa_outvec out_vec[] = {
1323 {.base = capacity, .len = sizeof(size_t)},
1324 };
1325
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001326 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1327 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001328
1329 return status;
1330}
1331
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001332psa_status_t psa_key_derivation_output_bytes(
1333 psa_key_derivation_operation_t *operation,
1334 uint8_t *output,
1335 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001336{
1337 psa_status_t status;
1338 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001339 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
1340 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001341 };
1342
1343 psa_invec in_vec[] = {
1344 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1345 };
1346
1347 psa_outvec out_vec[] = {
1348 {.base = output, .len = output_length},
1349 };
1350
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001351 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1352 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001353
1354 return status;
1355}
1356
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001357psa_status_t psa_key_derivation_input_key(
1358 psa_key_derivation_operation_t *operation,
1359 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001360 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001361{
1362 psa_status_t status;
1363 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001364 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001365 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001366 .step = step,
1367 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001368 };
1369
1370 psa_invec in_vec[] = {
1371 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001372 };
1373
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001374 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1375 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001376
1377 return status;
1378}
1379
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001380psa_status_t psa_key_derivation_abort(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001381{
1382 psa_status_t status;
1383 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001384 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
1385 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001386 };
1387
1388 psa_invec in_vec[] = {
1389 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1390 };
1391
1392 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001393 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001394 };
1395
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001396 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1397 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001398
1399 return status;
1400}
1401
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001402psa_status_t psa_key_derivation_key_agreement(
1403 psa_key_derivation_operation_t *operation,
1404 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001405 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001406 const uint8_t *peer_key,
1407 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001408{
1409 psa_status_t status;
1410 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001411 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001412 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001413 .step = step,
1414 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001415 };
1416
1417 psa_invec in_vec[] = {
1418 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1419 {.base = peer_key, .len = peer_key_length},
1420 };
1421
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001422 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1423 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001424
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001425 return status;
1426}
1427
1428psa_status_t psa_generate_random(uint8_t *output,
1429 size_t output_size)
1430{
1431 psa_status_t status;
1432 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001433 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001434 };
1435
1436 psa_invec in_vec[] = {
1437 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1438 };
1439
1440 psa_outvec out_vec[] = {
1441 {.base = output, .len = output_size},
1442 };
1443
1444 if (output_size == 0) {
1445 return PSA_SUCCESS;
1446 }
1447
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001448 status = API_DISPATCH(tfm_crypto_generate_random,
1449 TFM_CRYPTO_GENERATE_RANDOM);
1450
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001451 return status;
1452}
1453
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001454psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001455 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001456{
1457 psa_status_t status;
1458 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001459 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001460 };
1461
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001462 psa_invec in_vec[] = {
1463 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001464 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001465 };
1466
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001467 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001468 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001469 };
1470
1471 status = API_DISPATCH(tfm_crypto_generate_key,
1472 TFM_CRYPTO_GENERATE_KEY);
1473
1474 return status;
1475}
1476
Maulik Patel28659c42021-01-06 14:09:22 +00001477psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001478 psa_algorithm_t alg,
1479 const uint8_t *input,
1480 size_t input_length,
1481 uint8_t *mac,
1482 size_t mac_size,
1483 size_t *mac_length)
1484{
1485 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001486 struct tfm_crypto_pack_iovec iov = {
1487 .sfn_id = TFM_CRYPTO_MAC_COMPUTE_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001488 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001489 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001490 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001491
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001492 psa_invec in_vec[] = {
1493 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Summer Qin045ec4a2021-07-07 14:28:04 +08001494 {.base = input, .len = input_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001495 };
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001496 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001497 {.base = mac, .len = mac_size},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001498 };
1499
1500 status = API_DISPATCH(tfm_crypto_mac_compute,
1501 TFM_CRYPTO_MAC_COMPUTE);
1502
1503 *mac_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001504 return status;
1505}
1506
Maulik Patel28659c42021-01-06 14:09:22 +00001507psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001508 psa_algorithm_t alg,
1509 const uint8_t *input,
1510 size_t input_length,
1511 const uint8_t *mac,
1512 const size_t mac_length)
1513{
1514 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001515 struct tfm_crypto_pack_iovec iov = {
1516 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001517 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001518 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001519 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001520
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001521 psa_invec in_vec[] = {
1522 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1523 {.base = input, .len = input_length},
Summer Qin045ec4a2021-07-07 14:28:04 +08001524 {.base = mac, .len = mac_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001525 };
1526
1527 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_mac_verify,
1528 TFM_CRYPTO_MAC_VERIFY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001529
1530 return status;
1531}
1532
Maulik Patel28659c42021-01-06 14:09:22 +00001533psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001534 psa_algorithm_t alg,
1535 const uint8_t *input,
1536 size_t input_length,
1537 uint8_t *output,
1538 size_t output_size,
1539 size_t *output_length)
1540{
Antonio de Angelis609f0002021-07-06 16:51:28 +02001541#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
1542 return PSA_ERROR_NOT_SUPPORTED;
1543#else
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001544 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001545 struct tfm_crypto_pack_iovec iov = {
1546 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001547 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001548 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001549 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001550
Antonio de Angelis609f0002021-07-06 16:51:28 +02001551 psa_invec in_vec[] = {
1552 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1553 {.base = input, .len = input_length},
1554 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001555 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +01001556 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001557 };
1558
1559 status = API_DISPATCH(tfm_crypto_cipher_encrypt,
1560 TFM_CRYPTO_CIPHER_ENCRYPT);
1561
1562 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001563 return status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001564#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001565}
1566
Maulik Patel28659c42021-01-06 14:09:22 +00001567psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001568 psa_algorithm_t alg,
1569 const uint8_t *input,
1570 size_t input_length,
1571 uint8_t *output,
1572 size_t output_size,
1573 size_t *output_length)
1574{
Antonio de Angelis609f0002021-07-06 16:51:28 +02001575#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
1576 return PSA_ERROR_NOT_SUPPORTED;
1577#else
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001578 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001579 struct tfm_crypto_pack_iovec iov = {
1580 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001581 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001582 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001583 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001584
Antonio de Angelis609f0002021-07-06 16:51:28 +02001585 psa_invec in_vec[] = {
1586 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1587 {.base = input, .len = input_length},
1588 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001589 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +01001590 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001591 };
1592
1593 status = API_DISPATCH(tfm_crypto_cipher_decrypt,
1594 TFM_CRYPTO_CIPHER_DECRYPT);
1595
1596 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001597 return status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001598#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001599}
1600
1601psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001602 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001603 const uint8_t *peer_key,
1604 size_t peer_key_length,
1605 uint8_t *output,
1606 size_t output_size,
1607 size_t *output_length)
1608{
1609 psa_status_t status;
1610 struct tfm_crypto_pack_iovec iov = {
1611 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1612 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001613 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001614 };
1615
1616 psa_invec in_vec[] = {
1617 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1618 {.base = peer_key, .len = peer_key_length},
1619 };
1620
1621 psa_outvec out_vec[] = {
1622 {.base = output, .len = output_size},
1623 };
1624
1625 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1626 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1627
1628 *output_length = out_vec[0].len;
1629
1630 return status;
1631}
1632
1633psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1634 psa_algorithm_t alg)
1635{
1636 psa_status_t status;
1637 struct tfm_crypto_pack_iovec iov = {
1638 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1639 .alg = alg,
1640 .op_handle = operation->handle,
1641 };
1642
1643 psa_invec in_vec[] = {
1644 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1645 };
1646 psa_outvec out_vec[] = {
1647 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1648 };
1649
1650 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1651 TFM_CRYPTO_KEY_DERIVATION_SETUP);
1652 return status;
1653}
1654
1655psa_status_t psa_key_derivation_set_capacity(
1656 psa_key_derivation_operation_t *operation,
1657 size_t capacity)
1658{
1659 psa_status_t status;
1660 struct tfm_crypto_pack_iovec iov = {
1661 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
1662 .capacity = capacity,
1663 .op_handle = operation->handle,
1664 };
1665
1666 psa_invec in_vec[] = {
1667 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1668 };
1669
1670 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1671 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
1672 return status;
1673}
1674
1675psa_status_t psa_key_derivation_input_bytes(
1676 psa_key_derivation_operation_t *operation,
1677 psa_key_derivation_step_t step,
1678 const uint8_t *data,
1679 size_t data_length)
1680{
1681 psa_status_t status;
1682 struct tfm_crypto_pack_iovec iov = {
1683 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1684 .step = step,
1685 .op_handle = operation->handle,
1686 };
1687
1688 psa_invec in_vec[] = {
1689 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1690 {.base = data, .len = data_length},
1691 };
1692
1693 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1694 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
1695 return status;
1696}
1697
1698psa_status_t psa_key_derivation_output_key(
1699 const psa_key_attributes_t *attributes,
1700 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001701 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001702{
1703 psa_status_t status;
1704 struct tfm_crypto_pack_iovec iov = {
1705 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1706 .op_handle = operation->handle,
1707 };
1708
1709 psa_invec in_vec[] = {
1710 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1711 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1712 };
1713
1714 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001715 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001716 };
1717
1718 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1719 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
1720 return status;
1721}