blob: 2b033d4bf8c0c0dd7af2411bff86d2c9662a897f [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,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000775 .aead_in = {.nonce = {0}, .nonce_length = 0}
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 Angelis341f52a2021-12-02 15:49:44 +0000784 {.base = NULL, .len = 0},
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 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000800 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000801 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000802
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000803 in_vec[0].base = &iov;
804 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
805
Antonio de Angelis4743e672019-04-11 11:38:48 +0100806 status = API_DISPATCH(tfm_crypto_aead_encrypt,
807 TFM_CRYPTO_AEAD_ENCRYPT);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000808
809 *ciphertext_length = out_vec[0].len;
810
811 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000812}
813
Maulik Patel28659c42021-01-06 14:09:22 +0000814psa_status_t psa_aead_decrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000815 psa_algorithm_t alg,
816 const uint8_t *nonce,
817 size_t nonce_length,
818 const uint8_t *additional_data,
819 size_t additional_data_length,
820 const uint8_t *ciphertext,
821 size_t ciphertext_length,
822 uint8_t *plaintext,
823 size_t plaintext_size,
824 size_t *plaintext_length)
825{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000826 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100827 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800828 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000829 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100830 .alg = alg,
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000831 .aead_in = {.nonce = {0}, .nonce_length = 0}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000832 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100833
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100834 /* Sanitize the optional input */
835 if ((additional_data == NULL) && (additional_data_length != 0)) {
836 return PSA_ERROR_INVALID_ARGUMENT;
837 }
838
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000839 psa_invec in_vec[] = {
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000840 {.base = NULL, .len = 0},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000841 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100842 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000843 };
844 psa_outvec out_vec[] = {
845 {.base = plaintext, .len = plaintext_size},
846 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000847
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000848 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
849 return PSA_ERROR_INVALID_ARGUMENT;
850 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000851
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000852 if (nonce != NULL) {
Antonio de Angelisa80e7842021-11-25 13:16:02 +0000853 for (size_t idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100854 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000855 }
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000856 iov.aead_in.nonce_length = nonce_length;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000857 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000858
Antonio de Angelis341f52a2021-12-02 15:49:44 +0000859 in_vec[0].base = &iov;
860 in_vec[0].len = sizeof(struct tfm_crypto_pack_iovec);
861
Antonio de Angelis4743e672019-04-11 11:38:48 +0100862 status = API_DISPATCH(tfm_crypto_aead_decrypt,
863 TFM_CRYPTO_AEAD_DECRYPT);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000864
865 *plaintext_length = out_vec[0].len;
866
867 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000868}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100869
Antonio de Angelis8d282482021-10-07 15:04:12 +0100870psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
871 psa_key_id_t key,
872 psa_algorithm_t alg)
873{
874 psa_status_t status;
875 struct tfm_crypto_pack_iovec iov = {
876 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SETUP_SID,
877 .key_id = key,
878 .alg = alg,
879 .op_handle = operation->handle,
880 };
881
882 psa_invec in_vec[] = {
883 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
884 };
885 psa_outvec out_vec[] = {
886 {.base = &(operation->handle), .len = sizeof(uint32_t)}
887 };
888
889 status = API_DISPATCH(tfm_crypto_aead_encrypt_setup,
890 TFM_CRYPTO_AEAD_ENCRYPT_SETUP);
891 return status;
892}
893
894psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
895 psa_key_id_t key,
896 psa_algorithm_t alg)
897{
898 psa_status_t status;
899 struct tfm_crypto_pack_iovec iov = {
900 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SETUP_SID,
901 .key_id = key,
902 .alg = alg,
903 .op_handle = operation->handle,
904 };
905
906 psa_invec in_vec[] = {
907 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}
908 };
909 psa_outvec out_vec[] = {
910 {.base = &(operation->handle), .len = sizeof(uint32_t)}
911 };
912
913 status = API_DISPATCH(tfm_crypto_aead_decrypt_setup,
914 TFM_CRYPTO_AEAD_DECRYPT_SETUP);
915 return status;
916}
917
918psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
919 uint8_t *nonce,
920 size_t nonce_size,
921 size_t *nonce_length)
922{
923 psa_status_t status;
924 struct tfm_crypto_pack_iovec iov = {
925 .sfn_id = TFM_CRYPTO_AEAD_GENERATE_NONCE_SID,
926 .op_handle = operation->handle,
927 };
928
929 psa_invec in_vec[] = {
930 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
931 };
932 psa_outvec out_vec[] = {
933 {.base = &(operation->handle), .len = sizeof(uint32_t)},
934 {.base = nonce, .len = nonce_size}
935 };
936
937 status = API_DISPATCH(tfm_crypto_aead_generate_nonce,
938 TFM_CRYPTO_AEAD_GENERATE_NONCE);
939
940 *nonce_length = out_vec[1].len;
941 return status;
942}
943
944psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
945 const uint8_t *nonce,
946 size_t nonce_length)
947{
948 psa_status_t status;
949 struct tfm_crypto_pack_iovec iov = {
950 .sfn_id = TFM_CRYPTO_AEAD_SET_NONCE_SID,
951 .op_handle = operation->handle,
952 };
953
954 psa_invec in_vec[] = {
955 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
956 {.base = nonce, .len = nonce_length}
957 };
958 psa_outvec out_vec[] = {
959 {.base = &(operation->handle), .len = sizeof(uint32_t)}
960 };
961
962 status = API_DISPATCH(tfm_crypto_aead_set_nonce,
963 TFM_CRYPTO_AEAD_SET_NONCE);
964 return status;
965}
966
967psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
968 size_t ad_length,
969 size_t plaintext_length)
970{
971 psa_status_t status;
972 struct tfm_crypto_pack_iovec iov = {
973 .sfn_id = TFM_CRYPTO_AEAD_SET_LENGTHS_SID,
974 .ad_length = ad_length,
975 .plaintext_length = plaintext_length,
976 .op_handle = operation->handle,
977 };
978
979 psa_invec in_vec[] = {
980 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
981 };
982 psa_outvec out_vec[] = {
983 {.base = &(operation->handle), .len = sizeof(uint32_t)}
984 };
985
986 status = API_DISPATCH(tfm_crypto_aead_set_lengths,
987 TFM_CRYPTO_AEAD_SET_LENGTHS);
988 return status;
989}
990
991psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
992 const uint8_t *input,
993 size_t input_length)
994{
995 psa_status_t status;
996 struct tfm_crypto_pack_iovec iov = {
997 .sfn_id = TFM_CRYPTO_AEAD_UPDATE_AD_SID,
998 .op_handle = operation->handle,
999 };
1000
1001 psa_invec in_vec[] = {
1002 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1003 {.base = input, .len = input_length}
1004 };
1005 psa_outvec out_vec[] = {
1006 {.base = &(operation->handle), .len = sizeof(uint32_t)}
1007 };
1008
1009 status = API_DISPATCH(tfm_crypto_aead_update_ad,
1010 TFM_CRYPTO_AEAD_UPDATE_AD);
1011 return status;
1012}
1013
1014psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1015 const uint8_t *input,
1016 size_t input_length,
1017 uint8_t *output,
1018 size_t output_size,
1019 size_t *output_length)
1020{
1021 psa_status_t status;
1022 struct tfm_crypto_pack_iovec iov = {
1023 .sfn_id = TFM_CRYPTO_AEAD_UPDATE_SID,
1024 .op_handle = operation->handle,
1025 };
1026
1027 psa_invec in_vec[] = {
1028 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1029 {.base = input, .len = input_length}
1030 };
1031 psa_outvec out_vec[] = {
1032 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1033 {.base = output, .len = output_size},
1034 };
1035
1036 status = API_DISPATCH(tfm_crypto_aead_update,
1037 TFM_CRYPTO_AEAD_UPDATE);
1038
1039 *output_length = out_vec[1].len;
1040 return status;
1041}
1042
1043psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1044 uint8_t *ciphertext,
1045 size_t ciphertext_size,
1046 size_t *ciphertext_length,
1047 uint8_t *tag,
1048 size_t tag_size,
1049 size_t *tag_length)
1050{
1051 psa_status_t status;
1052 struct tfm_crypto_pack_iovec iov = {
1053 .sfn_id = TFM_CRYPTO_AEAD_FINISH_SID,
1054 .op_handle = operation->handle,
1055 };
1056
1057 psa_invec in_vec[] = {
1058 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1059 };
1060 psa_outvec out_vec[] = {
1061 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1062 {.base = ciphertext, .len = ciphertext_size},
1063 {.base = tag, .len = tag_size},
1064 };
1065
1066 status = API_DISPATCH(tfm_crypto_aead_finish,
1067 TFM_CRYPTO_AEAD_FINISH);
1068
1069 *ciphertext_length = out_vec[1].len;
1070 *tag_length = out_vec[2].len;
1071 return status;
1072}
1073
1074psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1075 uint8_t *plaintext,
1076 size_t plaintext_size,
1077 size_t *plaintext_length,
1078 const uint8_t *tag,
1079 size_t tag_length)
1080{
1081 psa_status_t status;
1082 struct tfm_crypto_pack_iovec iov = {
1083 .sfn_id = TFM_CRYPTO_AEAD_VERIFY_SID,
1084 .op_handle = operation->handle,
1085 };
1086
1087 psa_invec in_vec[] = {
1088 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1089 {.base = tag, .len = tag_length}
1090 };
1091 psa_outvec out_vec[] = {
1092 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1093 {.base = plaintext, .len = plaintext_size},
1094 };
1095
1096 status = API_DISPATCH(tfm_crypto_aead_verify,
1097 TFM_CRYPTO_AEAD_VERIFY);
1098
1099 *plaintext_length = out_vec[1].len;
1100 return status;
1101}
1102
1103psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1104{
1105 psa_status_t status;
1106 struct tfm_crypto_pack_iovec iov = {
1107 .sfn_id = TFM_CRYPTO_AEAD_ABORT_SID,
1108 .op_handle = operation->handle,
1109 };
1110
1111 psa_invec in_vec[] = {
1112 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1113 };
1114 psa_outvec out_vec[] = {
1115 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1116 };
1117
1118 status = API_DISPATCH(tfm_crypto_aead_abort,
1119 TFM_CRYPTO_AEAD_ABORT);
1120 return status;
1121}
1122
Summer Qinb9492d22021-06-22 18:00:54 +08001123psa_status_t psa_sign_message(psa_key_id_t key,
1124 psa_algorithm_t alg,
1125 const uint8_t *input,
1126 size_t input_length,
1127 uint8_t *signature,
1128 size_t signature_size,
1129 size_t *signature_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001130{
Summer Qinb9492d22021-06-22 18:00:54 +08001131 psa_status_t status;
1132 struct tfm_crypto_pack_iovec iov = {
1133 .sfn_id = TFM_CRYPTO_SIGN_MESSAGE_SID,
1134 .key_id = key,
1135 .alg = alg,
1136 };
1137
1138 psa_invec in_vec[] = {
1139 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1140 {.base = input, .len = input_length},
1141 };
1142 psa_outvec out_vec[] = {
1143 {.base = signature, .len = signature_size},
1144 };
1145
1146 status = API_DISPATCH(tfm_crypto_sign_message,
1147 TFM_CRYPTO_SIGN_MESSAGE);
1148
Antonio de Angelisf83a2082021-08-20 22:13:53 +01001149 *signature_length = out_vec[0].len;
Summer Qinb9492d22021-06-22 18:00:54 +08001150 return status;
1151}
1152
1153psa_status_t psa_verify_message(psa_key_id_t key,
1154 psa_algorithm_t alg,
1155 const uint8_t *input,
1156 size_t input_length,
1157 const uint8_t *signature,
1158 size_t signature_length)
1159{
1160 psa_status_t status;
1161 struct tfm_crypto_pack_iovec iov = {
1162 .sfn_id = TFM_CRYPTO_VERIFY_MESSAGE_SID,
1163 .key_id = key,
1164 .alg = alg
1165 };
1166
1167 psa_invec in_vec[] = {
1168 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1169 {.base = input, .len = input_length},
1170 {.base = signature, .len = signature_length}
1171 };
1172
1173 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_message,
1174 TFM_CRYPTO_VERIFY_MESSAGE);
1175
1176 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001177}
1178
Maulik Patel28659c42021-01-06 14:09:22 +00001179psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001180 psa_algorithm_t alg,
1181 const uint8_t *hash,
1182 size_t hash_length,
1183 uint8_t *signature,
1184 size_t signature_size,
1185 size_t *signature_length)
1186{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001187 psa_status_t status;
1188 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001189 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001190 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001191 .alg = alg,
1192 };
1193
1194 psa_invec in_vec[] = {
1195 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1196 {.base = hash, .len = hash_length},
1197 };
1198 psa_outvec out_vec[] = {
1199 {.base = signature, .len = signature_size},
1200 };
1201
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001202 status = API_DISPATCH(tfm_crypto_sign_hash,
1203 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001204
1205 *signature_length = out_vec[0].len;
1206
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001207 return status;
1208}
1209
Maulik Patel28659c42021-01-06 14:09:22 +00001210psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001211 psa_algorithm_t alg,
1212 const uint8_t *hash,
1213 size_t hash_length,
1214 const uint8_t *signature,
1215 size_t signature_length)
1216{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001217 psa_status_t status;
1218 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001219 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001220 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001221 .alg = alg
1222 };
1223
1224 psa_invec in_vec[] = {
1225 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1226 {.base = hash, .len = hash_length},
1227 {.base = signature, .len = signature_length}
1228 };
1229
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001230 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
1231 TFM_CRYPTO_VERIFY_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001232
1233 return status;
1234}
1235
Maulik Patel28659c42021-01-06 14:09:22 +00001236psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001237 psa_algorithm_t alg,
1238 const uint8_t *input,
1239 size_t input_length,
1240 const uint8_t *salt,
1241 size_t salt_length,
1242 uint8_t *output,
1243 size_t output_size,
1244 size_t *output_length)
1245{
1246 psa_status_t status;
1247 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001248 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001249 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001250 .alg = alg
1251 };
1252
1253 /* Sanitize the optional input */
1254 if ((salt == NULL) && (salt_length != 0)) {
1255 return PSA_ERROR_INVALID_ARGUMENT;
1256 }
1257
1258 psa_invec in_vec[] = {
1259 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1260 {.base = input, .len = input_length},
1261 {.base = salt, .len = salt_length}
1262 };
1263
1264 psa_outvec out_vec[] = {
1265 {.base = output, .len = output_size},
1266 };
1267
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001268 status = API_DISPATCH(tfm_crypto_asymmetric_encrypt,
1269 TFM_CRYPTO_ASYMMETRIC_ENCRYPT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001270
1271 *output_length = out_vec[0].len;
1272
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001273 return status;
1274}
1275
Maulik Patel28659c42021-01-06 14:09:22 +00001276psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001277 psa_algorithm_t alg,
1278 const uint8_t *input,
1279 size_t input_length,
1280 const uint8_t *salt,
1281 size_t salt_length,
1282 uint8_t *output,
1283 size_t output_size,
1284 size_t *output_length)
1285{
1286 psa_status_t status;
1287 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001288 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001289 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001290 .alg = alg
1291 };
1292
1293 /* Sanitize the optional input */
1294 if ((salt == NULL) && (salt_length != 0)) {
1295 return PSA_ERROR_INVALID_ARGUMENT;
1296 }
1297
1298 psa_invec in_vec[] = {
1299 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1300 {.base = input, .len = input_length},
1301 {.base = salt, .len = salt_length}
1302 };
1303
1304 psa_outvec out_vec[] = {
1305 {.base = output, .len = output_size},
1306 };
1307
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001308 status = API_DISPATCH(tfm_crypto_asymmetric_decrypt,
1309 TFM_CRYPTO_ASYMMETRIC_DECRYPT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001310
1311 *output_length = out_vec[0].len;
1312
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001313 return status;
1314}
1315
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001316psa_status_t psa_key_derivation_get_capacity(
1317 const psa_key_derivation_operation_t *operation,
1318 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001319{
1320 psa_status_t status;
1321 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001322 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
1323 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001324 };
1325
1326 psa_invec in_vec[] = {
1327 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1328 };
1329
1330 psa_outvec out_vec[] = {
1331 {.base = capacity, .len = sizeof(size_t)},
1332 };
1333
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001334 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1335 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001336
1337 return status;
1338}
1339
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001340psa_status_t psa_key_derivation_output_bytes(
1341 psa_key_derivation_operation_t *operation,
1342 uint8_t *output,
1343 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001344{
1345 psa_status_t status;
1346 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001347 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
1348 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001349 };
1350
1351 psa_invec in_vec[] = {
1352 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1353 };
1354
1355 psa_outvec out_vec[] = {
1356 {.base = output, .len = output_length},
1357 };
1358
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001359 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1360 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001361
1362 return status;
1363}
1364
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001365psa_status_t psa_key_derivation_input_key(
1366 psa_key_derivation_operation_t *operation,
1367 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001368 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001369{
1370 psa_status_t status;
1371 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001372 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001373 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001374 .step = step,
1375 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001376 };
1377
1378 psa_invec in_vec[] = {
1379 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001380 };
1381
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001382 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1383 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001384
1385 return status;
1386}
1387
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001388psa_status_t psa_key_derivation_abort(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001389{
1390 psa_status_t status;
1391 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001392 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
1393 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001394 };
1395
1396 psa_invec in_vec[] = {
1397 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1398 };
1399
1400 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001401 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001402 };
1403
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001404 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1405 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001406
1407 return status;
1408}
1409
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001410psa_status_t psa_key_derivation_key_agreement(
1411 psa_key_derivation_operation_t *operation,
1412 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001413 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001414 const uint8_t *peer_key,
1415 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001416{
1417 psa_status_t status;
1418 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001419 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001420 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001421 .step = step,
1422 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001423 };
1424
1425 psa_invec in_vec[] = {
1426 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1427 {.base = peer_key, .len = peer_key_length},
1428 };
1429
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001430 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1431 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001432
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001433 return status;
1434}
1435
1436psa_status_t psa_generate_random(uint8_t *output,
1437 size_t output_size)
1438{
1439 psa_status_t status;
1440 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001441 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001442 };
1443
1444 psa_invec in_vec[] = {
1445 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1446 };
1447
1448 psa_outvec out_vec[] = {
1449 {.base = output, .len = output_size},
1450 };
1451
1452 if (output_size == 0) {
1453 return PSA_SUCCESS;
1454 }
1455
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001456 status = API_DISPATCH(tfm_crypto_generate_random,
1457 TFM_CRYPTO_GENERATE_RANDOM);
1458
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001459 return status;
1460}
1461
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001462psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001463 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001464{
1465 psa_status_t status;
1466 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001467 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001468 };
1469
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001470 psa_invec in_vec[] = {
1471 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001472 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001473 };
1474
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001475 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001476 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001477 };
1478
1479 status = API_DISPATCH(tfm_crypto_generate_key,
1480 TFM_CRYPTO_GENERATE_KEY);
1481
1482 return status;
1483}
1484
Maulik Patel28659c42021-01-06 14:09:22 +00001485psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001486 psa_algorithm_t alg,
1487 const uint8_t *input,
1488 size_t input_length,
1489 uint8_t *mac,
1490 size_t mac_size,
1491 size_t *mac_length)
1492{
1493 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001494 struct tfm_crypto_pack_iovec iov = {
1495 .sfn_id = TFM_CRYPTO_MAC_COMPUTE_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001496 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001497 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001498 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001499
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001500 psa_invec in_vec[] = {
1501 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Summer Qin045ec4a2021-07-07 14:28:04 +08001502 {.base = input, .len = input_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001503 };
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001504 psa_outvec out_vec[] = {
Summer Qin045ec4a2021-07-07 14:28:04 +08001505 {.base = mac, .len = mac_size},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001506 };
1507
1508 status = API_DISPATCH(tfm_crypto_mac_compute,
1509 TFM_CRYPTO_MAC_COMPUTE);
1510
1511 *mac_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001512 return status;
1513}
1514
Maulik Patel28659c42021-01-06 14:09:22 +00001515psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001516 psa_algorithm_t alg,
1517 const uint8_t *input,
1518 size_t input_length,
1519 const uint8_t *mac,
1520 const size_t mac_length)
1521{
1522 psa_status_t status;
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001523 struct tfm_crypto_pack_iovec iov = {
1524 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SID,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001525 .key_id = key,
Summer Qin045ec4a2021-07-07 14:28:04 +08001526 .alg = alg,
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001527 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001528
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001529 psa_invec in_vec[] = {
1530 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1531 {.base = input, .len = input_length},
Summer Qin045ec4a2021-07-07 14:28:04 +08001532 {.base = mac, .len = mac_length},
Antonio de Angelis8f4db962021-07-05 13:58:43 +02001533 };
1534
1535 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_mac_verify,
1536 TFM_CRYPTO_MAC_VERIFY);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001537
1538 return status;
1539}
1540
Maulik Patel28659c42021-01-06 14:09:22 +00001541psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001542 psa_algorithm_t alg,
1543 const uint8_t *input,
1544 size_t input_length,
1545 uint8_t *output,
1546 size_t output_size,
1547 size_t *output_length)
1548{
Antonio de Angelis609f0002021-07-06 16:51:28 +02001549#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
1550 return PSA_ERROR_NOT_SUPPORTED;
1551#else
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001552 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001553 struct tfm_crypto_pack_iovec iov = {
1554 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001555 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001556 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001557 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001558
Antonio de Angelis609f0002021-07-06 16:51:28 +02001559 psa_invec in_vec[] = {
1560 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1561 {.base = input, .len = input_length},
1562 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001563 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +01001564 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001565 };
1566
1567 status = API_DISPATCH(tfm_crypto_cipher_encrypt,
1568 TFM_CRYPTO_CIPHER_ENCRYPT);
1569
1570 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001571 return status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001572#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001573}
1574
Maulik Patel28659c42021-01-06 14:09:22 +00001575psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001576 psa_algorithm_t alg,
1577 const uint8_t *input,
1578 size_t input_length,
1579 uint8_t *output,
1580 size_t output_size,
1581 size_t *output_length)
1582{
Antonio de Angelis609f0002021-07-06 16:51:28 +02001583#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
1584 return PSA_ERROR_NOT_SUPPORTED;
1585#else
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001586 psa_status_t status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001587 struct tfm_crypto_pack_iovec iov = {
1588 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SID,
Summer Qin045ec4a2021-07-07 14:28:04 +08001589 .key_id = key,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001590 .alg = alg,
Antonio de Angelis609f0002021-07-06 16:51:28 +02001591 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001592
Antonio de Angelis609f0002021-07-06 16:51:28 +02001593 psa_invec in_vec[] = {
1594 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1595 {.base = input, .len = input_length},
1596 };
Antonio de Angelis609f0002021-07-06 16:51:28 +02001597 psa_outvec out_vec[] = {
Antonio de Angelis8d282482021-10-07 15:04:12 +01001598 {.base = output, .len = output_size}
Antonio de Angelis609f0002021-07-06 16:51:28 +02001599 };
1600
1601 status = API_DISPATCH(tfm_crypto_cipher_decrypt,
1602 TFM_CRYPTO_CIPHER_DECRYPT);
1603
1604 *output_length = out_vec[0].len;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001605 return status;
Antonio de Angelis609f0002021-07-06 16:51:28 +02001606#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001607}
1608
1609psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001610 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001611 const uint8_t *peer_key,
1612 size_t peer_key_length,
1613 uint8_t *output,
1614 size_t output_size,
1615 size_t *output_length)
1616{
1617 psa_status_t status;
1618 struct tfm_crypto_pack_iovec iov = {
1619 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1620 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001621 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001622 };
1623
1624 psa_invec in_vec[] = {
1625 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1626 {.base = peer_key, .len = peer_key_length},
1627 };
1628
1629 psa_outvec out_vec[] = {
1630 {.base = output, .len = output_size},
1631 };
1632
1633 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1634 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1635
1636 *output_length = out_vec[0].len;
1637
1638 return status;
1639}
1640
1641psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1642 psa_algorithm_t alg)
1643{
1644 psa_status_t status;
1645 struct tfm_crypto_pack_iovec iov = {
1646 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1647 .alg = alg,
1648 .op_handle = operation->handle,
1649 };
1650
1651 psa_invec in_vec[] = {
1652 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1653 };
1654 psa_outvec out_vec[] = {
1655 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1656 };
1657
1658 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1659 TFM_CRYPTO_KEY_DERIVATION_SETUP);
1660 return status;
1661}
1662
1663psa_status_t psa_key_derivation_set_capacity(
1664 psa_key_derivation_operation_t *operation,
1665 size_t capacity)
1666{
1667 psa_status_t status;
1668 struct tfm_crypto_pack_iovec iov = {
1669 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
1670 .capacity = capacity,
1671 .op_handle = operation->handle,
1672 };
1673
1674 psa_invec in_vec[] = {
1675 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1676 };
1677
1678 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1679 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
1680 return status;
1681}
1682
1683psa_status_t psa_key_derivation_input_bytes(
1684 psa_key_derivation_operation_t *operation,
1685 psa_key_derivation_step_t step,
1686 const uint8_t *data,
1687 size_t data_length)
1688{
1689 psa_status_t status;
1690 struct tfm_crypto_pack_iovec iov = {
1691 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1692 .step = step,
1693 .op_handle = operation->handle,
1694 };
1695
1696 psa_invec in_vec[] = {
1697 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1698 {.base = data, .len = data_length},
1699 };
1700
1701 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1702 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
1703 return status;
1704}
1705
1706psa_status_t psa_key_derivation_output_key(
1707 const psa_key_attributes_t *attributes,
1708 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001709 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001710{
1711 psa_status_t status;
1712 struct tfm_crypto_pack_iovec iov = {
1713 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1714 .op_handle = operation->handle,
1715 };
1716
1717 psa_invec in_vec[] = {
1718 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1719 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1720 };
1721
1722 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001723 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001724 };
1725
1726 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1727 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
1728 return status;
1729}