blob: 6ddbb6bc96525a504c1a5762595e3f9f9ac54adc [file] [log] [blame]
Antonio de Angelis8908f472018-08-31 15:44:25 +01001/*
Antonio de Angelis04debbd2019-10-14 12:12:52 +01002 * Copyright (c) 2018-2020, Arm Limited. All rights reserved.
Antonio de Angelis8908f472018-08-31 15:44:25 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00008#include "tfm_veneers.h"
9#include "tfm_crypto_defs.h"
Jamie Foxcc31d402019-01-28 17:13:52 +000010#include "psa/crypto.h"
Antonio de Angelis05b24192019-07-04 15:28:46 +010011#include "tfm_ns_interface.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000012
Antonio de Angelis4743e672019-04-11 11:38:48 +010013#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000014
Antonio de Angelis05b24192019-07-04 15:28:46 +010015#define API_DISPATCH(sfn_name, sfn_id) \
16 tfm_ns_interface_dispatch((veneer_fn)tfm_##sfn_name##_veneer,\
17 (uint32_t)in_vec, ARRAY_SIZE(in_vec), \
Antonio de Angelis4743e672019-04-11 11:38:48 +010018 (uint32_t)out_vec, ARRAY_SIZE(out_vec))
19
Antonio de Angelis05b24192019-07-04 15:28:46 +010020#define API_DISPATCH_NO_OUTVEC(sfn_name, sfn_id) \
21 tfm_ns_interface_dispatch((veneer_fn)tfm_##sfn_name##_veneer,\
22 (uint32_t)in_vec, ARRAY_SIZE(in_vec), \
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000023 (uint32_t)NULL, 0)
Antonio de Angelis8908f472018-08-31 15:44:25 +010024
25psa_status_t psa_crypto_init(void)
26{
27 /* Service init is performed during TFM boot up,
28 * so application level initialisation is empty
29 */
30 return PSA_SUCCESS;
31}
32
Antonio de Angelis04debbd2019-10-14 12:12:52 +010033psa_status_t psa_open_key(psa_key_id_t id,
Jamie Fox0e54ebc2019-04-09 14:21:04 +010034 psa_key_handle_t *handle)
35{
Jamie Foxdadb4e82019-09-03 17:59:41 +010036 const struct tfm_crypto_pack_iovec iov = {
37 .sfn_id = TFM_CRYPTO_OPEN_KEY_SID,
Jamie Foxdadb4e82019-09-03 17:59:41 +010038 };
39 psa_invec in_vec[] = {
40 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
41 {.base = &id, .len = sizeof(psa_key_id_t)},
42 };
43 psa_outvec out_vec[] = {
44 {.base = handle, .len = sizeof(psa_key_handle_t)},
45 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010046
Jamie Foxdadb4e82019-09-03 17:59:41 +010047 return API_DISPATCH(tfm_crypto_open_key,
48 TFM_CRYPTO_OPEN_KEY);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010049}
50
Jamie Fox0e54ebc2019-04-09 14:21:04 +010051psa_status_t psa_close_key(psa_key_handle_t handle)
52{
Jamie Foxdadb4e82019-09-03 17:59:41 +010053 const struct tfm_crypto_pack_iovec iov = {
54 .sfn_id = TFM_CRYPTO_CLOSE_KEY_SID,
55 .key_handle = handle,
56 };
57 psa_invec in_vec[] = {
58 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
59 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010060
Jamie Foxdadb4e82019-09-03 17:59:41 +010061 return API_DISPATCH_NO_OUTVEC(tfm_crypto_close_key,
62 TFM_CRYPTO_CLOSE_KEY);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010063}
64
Antonio de Angelis04debbd2019-10-14 12:12:52 +010065psa_status_t psa_import_key(const psa_key_attributes_t *attributes,
Antonio de Angelis8908f472018-08-31 15:44:25 +010066 const uint8_t *data,
Antonio de Angelis04debbd2019-10-14 12:12:52 +010067 size_t data_length,
68 psa_key_handle_t *handle)
Antonio de Angelis8908f472018-08-31 15:44:25 +010069{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000070 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +010071 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +080072 .sfn_id = TFM_CRYPTO_IMPORT_KEY_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +010073 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000074 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +010075 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +010076 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000077 {.base = data, .len = data_length}
78 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +010079 psa_outvec out_vec[] = {
80 {.base = handle, .len = sizeof(psa_key_handle_t)}
81 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010082
Antonio de Angelis04debbd2019-10-14 12:12:52 +010083 status = API_DISPATCH(tfm_crypto_import_key,
84 TFM_CRYPTO_IMPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +010085
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000086 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +010087}
88
Jamie Fox0e54ebc2019-04-09 14:21:04 +010089psa_status_t psa_destroy_key(psa_key_handle_t handle)
Antonio de Angelis8908f472018-08-31 15:44:25 +010090{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000091 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +010092 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +080093 .sfn_id = TFM_CRYPTO_DESTROY_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +010094 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +010095 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000096 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +010097 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000098 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010099
Antonio de Angelis4743e672019-04-11 11:38:48 +0100100 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_destroy_key,
101 TFM_CRYPTO_DESTROY_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100102
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000103 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100104}
105
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100106psa_status_t psa_get_key_attributes(psa_key_handle_t handle,
107 psa_key_attributes_t *attributes)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100108{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000109 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100110 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100111 .sfn_id = TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100112 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100113 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000114 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100115 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000116 };
117 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100118 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000119 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100120
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100121 status = API_DISPATCH(tfm_crypto_get_key_attributes,
122 TFM_CRYPTO_GET_KEY_ATTRIBUTES);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000123 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100124}
125
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100126void psa_reset_key_attributes(psa_key_attributes_t *attributes)
127{
128 struct tfm_crypto_pack_iovec iov = {
129 .sfn_id = TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID,
130 };
131 psa_invec in_vec[] = {
132 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
133 };
134 psa_outvec out_vec[] = {
135 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
136 };
137
138 (void)API_DISPATCH(tfm_crypto_reset_key_attributes,
139 TFM_CRYPTO_RESET_KEY_ATTRIBUTES);
140 return;
141}
142
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100143psa_status_t psa_export_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100144 uint8_t *data,
145 size_t data_size,
146 size_t *data_length)
147{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000148 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100149 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800150 .sfn_id = TFM_CRYPTO_EXPORT_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100151 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100152 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000153 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100154 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000155 };
156 psa_outvec out_vec[] = {
157 {.base = data, .len = data_size}
158 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100159
Antonio de Angelis4743e672019-04-11 11:38:48 +0100160 status = API_DISPATCH(tfm_crypto_export_key,
161 TFM_CRYPTO_EXPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100162
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000163 *data_length = out_vec[0].len;
164
165 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100166}
167
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100168psa_status_t psa_export_public_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100169 uint8_t *data,
170 size_t data_size,
171 size_t *data_length)
172{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100173 psa_status_t status;
174 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800175 .sfn_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100176 .key_handle = handle,
177 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000178
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100179 psa_invec in_vec[] = {
180 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
181 };
182 psa_outvec out_vec[] = {
183 {.base = data, .len = data_size}
184 };
185
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100186 status = API_DISPATCH(tfm_crypto_export_public_key,
187 TFM_CRYPTO_EXPORT_PUBLIC_KEY);
188
189 *data_length = out_vec[0].len;
190
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100191 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100192}
193
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100194psa_status_t psa_copy_key(psa_key_handle_t source_handle,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100195 const psa_key_attributes_t *attributes,
196 psa_key_handle_t *target_handle)
Jamie Foxefd82732018-11-26 10:34:32 +0000197{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100198 psa_status_t status;
199 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800200 .sfn_id = TFM_CRYPTO_COPY_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100201 .key_handle = source_handle,
202 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000203
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100204 psa_invec in_vec[] = {
205 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100206 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100207 };
208
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000209 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100210 {.base = target_handle, .len = sizeof(psa_key_handle_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000211 };
Jamie Foxefd82732018-11-26 10:34:32 +0000212
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100213 status = API_DISPATCH(tfm_crypto_copy_key,
214 TFM_CRYPTO_COPY_KEY);
Jamie Foxefd82732018-11-26 10:34:32 +0000215
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000216 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000217}
218
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100219psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
220 unsigned char *iv,
221 size_t iv_size,
222 size_t *iv_length)
223{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100224 psa_status_t status;
225 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800226 .sfn_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100227 .op_handle = operation->handle,
228 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100229
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100230 psa_invec in_vec[] = {
231 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
232 };
233 psa_outvec out_vec[] = {
234 {.base = &(operation->handle), .len = sizeof(uint32_t)},
235 {.base = iv, .len = iv_size},
236 };
237
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100238 status = API_DISPATCH(tfm_crypto_cipher_generate_iv,
239 TFM_CRYPTO_CIPHER_GENERATE_IV);
240
241 *iv_length = out_vec[1].len;
242
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100243 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100244}
245
Antonio de Angelis377a1552018-11-22 17:02:40 +0000246psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
247 const unsigned char *iv,
248 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100249{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000250 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100251 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800252 .sfn_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100253 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100254 };
255
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000256 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100257 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000258 {.base = iv, .len = iv_length},
259 };
260 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100261 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000262 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100263
Antonio de Angelis4743e672019-04-11 11:38:48 +0100264 status = API_DISPATCH(tfm_crypto_cipher_set_iv,
265 TFM_CRYPTO_CIPHER_SET_IV);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100266
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000267 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100268}
269
Antonio de Angelis377a1552018-11-22 17:02:40 +0000270psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100271 psa_key_handle_t handle,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000272 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100273{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000274 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100275 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800276 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100277 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100278 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100279 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000280 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100281
Antonio de Angelis4743e672019-04-11 11:38:48 +0100282 psa_invec in_vec[] = {
283 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
284 };
285 psa_outvec out_vec[] = {
286 {.base = &(operation->handle), .len = sizeof(uint32_t)},
287 };
288
Antonio de Angelis4743e672019-04-11 11:38:48 +0100289 status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup,
290 TFM_CRYPTO_CIPHER_ENCRYPT_SETUP);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100291
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000292 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100293}
294
Antonio de Angelis377a1552018-11-22 17:02:40 +0000295psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100296 psa_key_handle_t handle,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000297 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100298{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000299 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100300 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800301 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100302 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100303 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100304 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000305 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100306
Antonio de Angelis4743e672019-04-11 11:38:48 +0100307 psa_invec in_vec[] = {
308 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
309 };
310 psa_outvec out_vec[] = {
311 {.base = &(operation->handle), .len = sizeof(uint32_t)},
312 };
313
Antonio de Angelis4743e672019-04-11 11:38:48 +0100314 status = API_DISPATCH(tfm_crypto_cipher_decrypt_setup,
315 TFM_CRYPTO_CIPHER_DECRYPT_SETUP);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100316
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000317 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100318}
319
320psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
321 const uint8_t *input,
322 size_t input_length,
323 unsigned char *output,
324 size_t output_size,
325 size_t *output_length)
326{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000327 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100328 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800329 .sfn_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100330 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100331 };
332
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000333 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100334 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000335 {.base = input, .len = input_length},
336 };
337 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100338 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000339 {.base = output, .len = output_size}
340 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100341
Antonio de Angelis4743e672019-04-11 11:38:48 +0100342 status = API_DISPATCH(tfm_crypto_cipher_update,
343 TFM_CRYPTO_CIPHER_UPDATE);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100344
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000345 *output_length = out_vec[1].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100346
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000347 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100348}
349
350psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
351{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000352 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100353 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800354 .sfn_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100355 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000356 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100357
Antonio de Angelis4743e672019-04-11 11:38:48 +0100358 psa_invec in_vec[] = {
359 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
360 };
361 psa_outvec out_vec[] = {
362 {.base = &(operation->handle), .len = sizeof(uint32_t)},
363 };
364
Antonio de Angelis4743e672019-04-11 11:38:48 +0100365 status = API_DISPATCH(tfm_crypto_cipher_abort,
366 TFM_CRYPTO_CIPHER_ABORT);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100367
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000368 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100369}
370
371psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
372 uint8_t *output,
373 size_t output_size,
374 size_t *output_length)
375{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000376 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100377 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800378 .sfn_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100379 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100380 };
381
382 psa_invec in_vec[] = {
383 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
384 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000385 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100386 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000387 {.base = output, .len = output_size},
388 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100389
Antonio de Angelis4743e672019-04-11 11:38:48 +0100390 status = API_DISPATCH(tfm_crypto_cipher_finish,
391 TFM_CRYPTO_CIPHER_FINISH);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100392
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000393 *output_length = out_vec[1].len;
394
395 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100396}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100397
Antonio de Angelis377a1552018-11-22 17:02:40 +0000398psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100399 psa_algorithm_t alg)
400{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000401 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100402 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800403 .sfn_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100404 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100405 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000406 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100407
Antonio de Angelis4743e672019-04-11 11:38:48 +0100408 psa_invec in_vec[] = {
409 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
410 };
411 psa_outvec out_vec[] = {
412 {.base = &(operation->handle), .len = sizeof(uint32_t)},
413 };
414
Antonio de Angelis4743e672019-04-11 11:38:48 +0100415 status = API_DISPATCH(tfm_crypto_hash_setup,
416 TFM_CRYPTO_HASH_SETUP);
417
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000418 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100419}
420
421psa_status_t psa_hash_update(psa_hash_operation_t *operation,
422 const uint8_t *input,
423 size_t input_length)
424{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000425 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100426 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800427 .sfn_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100428 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100429 };
430
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000431 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100432 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000433 {.base = input, .len = input_length},
434 };
435 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100436 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000437 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100438
Antonio de Angelis4743e672019-04-11 11:38:48 +0100439 status = API_DISPATCH(tfm_crypto_hash_update,
440 TFM_CRYPTO_HASH_UPDATE);
441
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000442 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100443}
444
445psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
446 uint8_t *hash,
447 size_t hash_size,
448 size_t *hash_length)
449{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000450 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100451 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800452 .sfn_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100453 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100454 };
455
456 psa_invec in_vec[] = {
457 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
458 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000459 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100460 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000461 {.base = hash, .len = hash_size},
462 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100463
Antonio de Angelis4743e672019-04-11 11:38:48 +0100464 status = API_DISPATCH(tfm_crypto_hash_finish,
465 TFM_CRYPTO_HASH_FINISH);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100466
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000467 *hash_length = out_vec[1].len;
468
469 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100470}
471
472psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
473 const uint8_t *hash,
474 size_t hash_length)
475{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000476 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100477 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800478 .sfn_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100479 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100480 };
481
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000482 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100483 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000484 {.base = hash, .len = hash_length},
485 };
486 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100487 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000488 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100489
Antonio de Angelis4743e672019-04-11 11:38:48 +0100490 status = API_DISPATCH(tfm_crypto_hash_verify,
491 TFM_CRYPTO_HASH_VERIFY);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100492
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000493 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100494}
495
496psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
497{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000498 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100499 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800500 .sfn_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100501 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000502 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100503
Antonio de Angelis4743e672019-04-11 11:38:48 +0100504 psa_invec in_vec[] = {
505 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
506 };
507 psa_outvec out_vec[] = {
508 {.base = &(operation->handle), .len = sizeof(uint32_t)},
509 };
510
Antonio de Angelis4743e672019-04-11 11:38:48 +0100511 status = API_DISPATCH(tfm_crypto_hash_abort,
512 TFM_CRYPTO_HASH_ABORT);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100513
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000514 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100515}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100516
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100517psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
518 psa_hash_operation_t *target_operation)
519{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100520 psa_status_t status;
521 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800522 .sfn_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100523 .op_handle = source_operation->handle,
524 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100525
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100526 psa_invec in_vec[] = {
527 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
528 };
529 psa_outvec out_vec[] = {
530 {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
531 };
532
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100533 if (target_operation && (target_operation->handle != 0)) {
534 return PSA_ERROR_BAD_STATE;
535 }
536
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100537 status = API_DISPATCH(tfm_crypto_hash_clone,
538 TFM_CRYPTO_HASH_CLONE);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100539
540 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100541}
542
Soby Mathew07ef6e42020-07-20 21:09:23 +0100543psa_status_t psa_hash_compute(psa_algorithm_t alg,
544 const uint8_t *input,
545 size_t input_length,
546 uint8_t *hash,
547 size_t hash_size,
548 size_t *hash_length)
549{
550 psa_status_t status;
551 struct tfm_crypto_pack_iovec iov = {
552 .sfn_id = TFM_CRYPTO_HASH_COMPUTE_SID,
553 .alg = alg,
554 };
555
556 psa_invec in_vec[] = {
557 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
558 {.base = input, .len = input_length},
559 };
560
561 psa_outvec out_vec[] = {
562 {.base = hash, .len = hash_size}
563 };
564
565 status = API_DISPATCH(tfm_crypto_hash_compute,
566 TFM_CRYPTO_HASH_COMPUTE);
567
568 *hash_length = out_vec[0].len;
569
570 return status;
571}
572
573psa_status_t psa_hash_compare(psa_algorithm_t alg,
574 const uint8_t *input,
575 size_t input_length,
576 const uint8_t *hash,
577 size_t hash_length)
578{
579 psa_status_t status;
580 struct tfm_crypto_pack_iovec iov = {
581 .sfn_id = TFM_CRYPTO_HASH_COMPARE_SID,
582 .alg = alg,
583 };
584
585 psa_invec in_vec[] = {
586 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
587 {.base = input, .len = input_length},
588 {.base = hash, .len = hash_length},
589 };
590
591 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_hash_compare,
592 TFM_CRYPTO_HASH_COMPARE);
593
594 return status;
595}
596
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100597psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100598 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100599 psa_algorithm_t alg)
600{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000601 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100602 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800603 .sfn_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100604 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100605 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100606 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000607 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100608
Antonio de Angelis4743e672019-04-11 11:38:48 +0100609 psa_invec in_vec[] = {
610 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
611 };
612 psa_outvec out_vec[] = {
613 {.base = &(operation->handle), .len = sizeof(uint32_t)},
614 };
615
Antonio de Angelis4743e672019-04-11 11:38:48 +0100616 status = API_DISPATCH(tfm_crypto_mac_sign_setup,
617 TFM_CRYPTO_MAC_SIGN_SETUP);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100618
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000619 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100620}
621
622psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100623 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100624 psa_algorithm_t alg)
625{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000626 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100627 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800628 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100629 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100630 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100631 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000632 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100633
Antonio de Angelis4743e672019-04-11 11:38:48 +0100634 psa_invec in_vec[] = {
635 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
636 };
637 psa_outvec out_vec[] = {
638 {.base = &(operation->handle), .len = sizeof(uint32_t)},
639 };
640
Antonio de Angelis4743e672019-04-11 11:38:48 +0100641 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
642 TFM_CRYPTO_MAC_VERIFY_SETUP);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100643
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000644 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100645}
646
647psa_status_t psa_mac_update(psa_mac_operation_t *operation,
648 const uint8_t *input,
649 size_t input_length)
650{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000651 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100652 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800653 .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100654 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100655 };
656
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000657 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100658 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000659 {.base = input, .len = input_length},
660 };
661 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100662 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000663 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100664
Antonio de Angelis4743e672019-04-11 11:38:48 +0100665 status = API_DISPATCH(tfm_crypto_mac_update,
666 TFM_CRYPTO_MAC_UPDATE);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100667
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000668 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100669}
670
671psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
672 uint8_t *mac,
673 size_t mac_size,
674 size_t *mac_length)
675{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000676 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100677 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800678 .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100679 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100680 };
681
682 psa_invec in_vec[] = {
683 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
684 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000685 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100686 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000687 {.base = mac, .len = mac_size},
688 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100689
Antonio de Angelis4743e672019-04-11 11:38:48 +0100690 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
691 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100692
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000693 *mac_length = out_vec[1].len;
694
695 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100696}
697
698psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
699 const uint8_t *mac,
700 size_t mac_length)
701{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000702 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100703 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800704 .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100705 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100706 };
707
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000708 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100709 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000710 {.base = mac, .len = mac_length},
711 };
712 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100713 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000714 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100715
Antonio de Angelis4743e672019-04-11 11:38:48 +0100716 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
717 TFM_CRYPTO_MAC_VERIFY_FINISH);
718
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000719 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100720}
721
722psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
723{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000724 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100725 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800726 .sfn_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100727 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000728 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100729
Antonio de Angelis4743e672019-04-11 11:38:48 +0100730 psa_invec in_vec[] = {
731 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
732 };
733 psa_outvec out_vec[] = {
734 {.base = &(operation->handle), .len = sizeof(uint32_t)},
735 };
736
Antonio de Angelis4743e672019-04-11 11:38:48 +0100737 status = API_DISPATCH(tfm_crypto_mac_abort,
738 TFM_CRYPTO_MAC_ABORT);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100739
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000740 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100741}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000742
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100743psa_status_t psa_aead_encrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000744 psa_algorithm_t alg,
745 const uint8_t *nonce,
746 size_t nonce_length,
747 const uint8_t *additional_data,
748 size_t additional_data_length,
749 const uint8_t *plaintext,
750 size_t plaintext_length,
751 uint8_t *ciphertext,
752 size_t ciphertext_size,
753 size_t *ciphertext_length)
754{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000755 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100756 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800757 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100758 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100759 .alg = alg,
760 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000761 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100762
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100763 /* Sanitize the optional input */
764 if ((additional_data == NULL) && (additional_data_length != 0)) {
765 return PSA_ERROR_INVALID_ARGUMENT;
766 }
767
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000768 size_t idx = 0;
769 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100770 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000771 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100772 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000773 };
774 psa_outvec out_vec[] = {
775 {.base = ciphertext, .len = ciphertext_size},
776 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000777
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000778 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
779 return PSA_ERROR_INVALID_ARGUMENT;
780 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000781
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000782 if (nonce != NULL) {
783 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100784 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000785 }
786 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000787
Antonio de Angelis4743e672019-04-11 11:38:48 +0100788 status = API_DISPATCH(tfm_crypto_aead_encrypt,
789 TFM_CRYPTO_AEAD_ENCRYPT);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000790
791 *ciphertext_length = out_vec[0].len;
792
793 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000794}
795
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100796psa_status_t psa_aead_decrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000797 psa_algorithm_t alg,
798 const uint8_t *nonce,
799 size_t nonce_length,
800 const uint8_t *additional_data,
801 size_t additional_data_length,
802 const uint8_t *ciphertext,
803 size_t ciphertext_length,
804 uint8_t *plaintext,
805 size_t plaintext_size,
806 size_t *plaintext_length)
807{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000808 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100809 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800810 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100811 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100812 .alg = alg,
813 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000814 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100815
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100816 /* Sanitize the optional input */
817 if ((additional_data == NULL) && (additional_data_length != 0)) {
818 return PSA_ERROR_INVALID_ARGUMENT;
819 }
820
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000821 size_t idx = 0;
822 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100823 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000824 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100825 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000826 };
827 psa_outvec out_vec[] = {
828 {.base = plaintext, .len = plaintext_size},
829 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000830
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000831 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
832 return PSA_ERROR_INVALID_ARGUMENT;
833 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000834
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000835 if (nonce != NULL) {
836 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100837 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000838 }
839 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000840
Antonio de Angelis4743e672019-04-11 11:38:48 +0100841 status = API_DISPATCH(tfm_crypto_aead_decrypt,
842 TFM_CRYPTO_AEAD_DECRYPT);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000843
844 *plaintext_length = out_vec[0].len;
845
846 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000847}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100848
849psa_status_t psa_asymmetric_sign(psa_key_handle_t handle,
850 psa_algorithm_t alg,
851 const uint8_t *hash,
852 size_t hash_length,
853 uint8_t *signature,
854 size_t signature_size,
855 size_t *signature_length)
856{
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100857 return psa_sign_hash(handle, alg, hash, hash_length, signature,
858 signature_size, signature_length);
859}
860
861psa_status_t psa_sign_hash(psa_key_handle_t handle,
862 psa_algorithm_t alg,
863 const uint8_t *hash,
864 size_t hash_length,
865 uint8_t *signature,
866 size_t signature_size,
867 size_t *signature_length)
868{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100869 psa_status_t status;
870 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100871 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100872 .key_handle = handle,
873 .alg = alg,
874 };
875
876 psa_invec in_vec[] = {
877 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
878 {.base = hash, .len = hash_length},
879 };
880 psa_outvec out_vec[] = {
881 {.base = signature, .len = signature_size},
882 };
883
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100884 status = API_DISPATCH(tfm_crypto_sign_hash,
885 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100886
887 *signature_length = out_vec[0].len;
888
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100889 return status;
890}
891
892psa_status_t psa_asymmetric_verify(psa_key_handle_t handle,
893 psa_algorithm_t alg,
894 const uint8_t *hash,
895 size_t hash_length,
896 const uint8_t *signature,
897 size_t signature_length)
898{
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100899 return psa_verify_hash(handle, alg, hash, hash_length,
900 signature, signature_length);
901}
902
903psa_status_t psa_verify_hash(psa_key_handle_t handle,
904 psa_algorithm_t alg,
905 const uint8_t *hash,
906 size_t hash_length,
907 const uint8_t *signature,
908 size_t signature_length)
909{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100910 psa_status_t status;
911 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100912 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100913 .key_handle = handle,
914 .alg = alg
915 };
916
917 psa_invec in_vec[] = {
918 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
919 {.base = hash, .len = hash_length},
920 {.base = signature, .len = signature_length}
921 };
922
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100923 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
924 TFM_CRYPTO_VERIFY_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100925
926 return status;
927}
928
929psa_status_t psa_asymmetric_encrypt(psa_key_handle_t handle,
930 psa_algorithm_t alg,
931 const uint8_t *input,
932 size_t input_length,
933 const uint8_t *salt,
934 size_t salt_length,
935 uint8_t *output,
936 size_t output_size,
937 size_t *output_length)
938{
939 psa_status_t status;
940 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800941 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100942 .key_handle = handle,
943 .alg = alg
944 };
945
946 /* Sanitize the optional input */
947 if ((salt == NULL) && (salt_length != 0)) {
948 return PSA_ERROR_INVALID_ARGUMENT;
949 }
950
951 psa_invec in_vec[] = {
952 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
953 {.base = input, .len = input_length},
954 {.base = salt, .len = salt_length}
955 };
956
957 psa_outvec out_vec[] = {
958 {.base = output, .len = output_size},
959 };
960
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100961 status = API_DISPATCH(tfm_crypto_asymmetric_encrypt,
962 TFM_CRYPTO_ASYMMETRIC_ENCRYPT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100963
964 *output_length = out_vec[0].len;
965
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100966 return status;
967}
968
969psa_status_t psa_asymmetric_decrypt(psa_key_handle_t handle,
970 psa_algorithm_t alg,
971 const uint8_t *input,
972 size_t input_length,
973 const uint8_t *salt,
974 size_t salt_length,
975 uint8_t *output,
976 size_t output_size,
977 size_t *output_length)
978{
979 psa_status_t status;
980 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800981 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100982 .key_handle = handle,
983 .alg = alg
984 };
985
986 /* Sanitize the optional input */
987 if ((salt == NULL) && (salt_length != 0)) {
988 return PSA_ERROR_INVALID_ARGUMENT;
989 }
990
991 psa_invec in_vec[] = {
992 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
993 {.base = input, .len = input_length},
994 {.base = salt, .len = salt_length}
995 };
996
997 psa_outvec out_vec[] = {
998 {.base = output, .len = output_size},
999 };
1000
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001001 status = API_DISPATCH(tfm_crypto_asymmetric_decrypt,
1002 TFM_CRYPTO_ASYMMETRIC_DECRYPT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001003
1004 *output_length = out_vec[0].len;
1005
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001006 return status;
1007}
1008
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001009psa_status_t psa_key_derivation_get_capacity(
1010 const psa_key_derivation_operation_t *operation,
1011 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001012{
1013 psa_status_t status;
1014 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001015 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
1016 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001017 };
1018
1019 psa_invec in_vec[] = {
1020 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1021 };
1022
1023 psa_outvec out_vec[] = {
1024 {.base = capacity, .len = sizeof(size_t)},
1025 };
1026
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001027 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1028 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001029
1030 return status;
1031}
1032
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001033psa_status_t psa_key_derivation_output_bytes(
1034 psa_key_derivation_operation_t *operation,
1035 uint8_t *output,
1036 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001037{
1038 psa_status_t status;
1039 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001040 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
1041 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001042 };
1043
1044 psa_invec in_vec[] = {
1045 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1046 };
1047
1048 psa_outvec out_vec[] = {
1049 {.base = output, .len = output_length},
1050 };
1051
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001052 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1053 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001054
1055 return status;
1056}
1057
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001058psa_status_t psa_key_derivation_input_key(
1059 psa_key_derivation_operation_t *operation,
1060 psa_key_derivation_step_t step,
1061 psa_key_handle_t handle)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001062{
1063 psa_status_t status;
1064 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001065 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001066 .key_handle = handle,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001067 .step = step,
1068 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001069 };
1070
1071 psa_invec in_vec[] = {
1072 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001073 };
1074
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001075 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1076 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001077
1078 return status;
1079}
1080
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001081psa_status_t psa_key_derivation_abort(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001082{
1083 psa_status_t status;
1084 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001085 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
1086 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001087 };
1088
1089 psa_invec in_vec[] = {
1090 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1091 };
1092
1093 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001094 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001095 };
1096
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001097 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1098 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001099
1100 return status;
1101}
1102
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001103psa_status_t psa_key_derivation_key_agreement(
1104 psa_key_derivation_operation_t *operation,
1105 psa_key_derivation_step_t step,
1106 psa_key_handle_t private_key,
1107 const uint8_t *peer_key,
1108 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001109{
1110 psa_status_t status;
1111 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001112 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001113 .key_handle = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001114 .step = step,
1115 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001116 };
1117
1118 psa_invec in_vec[] = {
1119 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1120 {.base = peer_key, .len = peer_key_length},
1121 };
1122
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001123 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1124 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001125
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001126 return status;
1127}
1128
1129psa_status_t psa_generate_random(uint8_t *output,
1130 size_t output_size)
1131{
1132 psa_status_t status;
1133 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001134 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001135 };
1136
1137 psa_invec in_vec[] = {
1138 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1139 };
1140
1141 psa_outvec out_vec[] = {
1142 {.base = output, .len = output_size},
1143 };
1144
1145 if (output_size == 0) {
1146 return PSA_SUCCESS;
1147 }
1148
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001149 status = API_DISPATCH(tfm_crypto_generate_random,
1150 TFM_CRYPTO_GENERATE_RANDOM);
1151
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001152 return status;
1153}
1154
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001155psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
1156 psa_key_handle_t *handle)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001157{
1158 psa_status_t status;
1159 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001160 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001161 };
1162
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001163 psa_invec in_vec[] = {
1164 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001165 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001166 };
1167
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001168 psa_outvec out_vec[] = {
1169 {.base = handle, .len = sizeof(psa_key_handle_t)},
1170 };
1171
1172 status = API_DISPATCH(tfm_crypto_generate_key,
1173 TFM_CRYPTO_GENERATE_KEY);
1174
1175 return status;
1176}
1177
1178psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes,
1179 psa_key_type_t type,
1180 const uint8_t *data,
1181 size_t data_length)
1182{
1183 psa_status_t status;
1184
1185 status = PSA_ERROR_NOT_SUPPORTED;
1186
1187 return status;
1188}
1189
1190psa_status_t psa_get_key_domain_parameters(
1191 const psa_key_attributes_t *attributes,
1192 uint8_t *data,
1193 size_t data_size,
1194 size_t *data_length)
1195{
1196 psa_status_t status;
1197
1198 status = PSA_ERROR_NOT_SUPPORTED;
1199
1200 return status;
1201}
1202
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001203psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1204 const uint8_t *input,
1205 size_t input_length)
1206{
1207 psa_status_t status;
1208
1209 status = PSA_ERROR_NOT_SUPPORTED;
1210
1211 return status;
1212}
1213
1214psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1215 uint8_t *ciphertext,
1216 size_t ciphertext_size,
1217 size_t *ciphertext_length,
1218 uint8_t *tag,
1219 size_t tag_size,
1220 size_t *tag_length)
1221{
1222 psa_status_t status;
1223
1224 status = PSA_ERROR_NOT_SUPPORTED;
1225
1226 return status;
1227}
1228
1229psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1230 uint8_t *plaintext,
1231 size_t plaintext_size,
1232 size_t *plaintext_length,
1233 const uint8_t *tag,
1234 size_t tag_length)
1235{
1236 psa_status_t status;
1237
1238 status = PSA_ERROR_NOT_SUPPORTED;
1239
1240 return status;
1241}
1242
1243psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1244{
1245 psa_status_t status;
1246
1247 status = PSA_ERROR_NOT_SUPPORTED;
1248
1249 return status;
1250}
1251
1252psa_status_t psa_mac_compute(psa_key_handle_t handle,
1253 psa_algorithm_t alg,
1254 const uint8_t *input,
1255 size_t input_length,
1256 uint8_t *mac,
1257 size_t mac_size,
1258 size_t *mac_length)
1259{
1260 psa_status_t status;
1261
1262 status = PSA_ERROR_NOT_SUPPORTED;
1263
1264 return status;
1265}
1266
1267psa_status_t psa_mac_verify(psa_key_handle_t handle,
1268 psa_algorithm_t alg,
1269 const uint8_t *input,
1270 size_t input_length,
1271 const uint8_t *mac,
1272 const size_t mac_length)
1273{
1274 psa_status_t status;
1275
1276 status = PSA_ERROR_NOT_SUPPORTED;
1277
1278 return status;
1279}
1280
1281psa_status_t psa_cipher_encrypt(psa_key_handle_t handle,
1282 psa_algorithm_t alg,
1283 const uint8_t *input,
1284 size_t input_length,
1285 uint8_t *output,
1286 size_t output_size,
1287 size_t *output_length)
1288{
1289 psa_status_t status;
1290
1291 status = PSA_ERROR_NOT_SUPPORTED;
1292
1293 return status;
1294}
1295
1296psa_status_t psa_cipher_decrypt(psa_key_handle_t handle,
1297 psa_algorithm_t alg,
1298 const uint8_t *input,
1299 size_t input_length,
1300 uint8_t *output,
1301 size_t output_size,
1302 size_t *output_length)
1303{
1304 psa_status_t status;
1305
1306 status = PSA_ERROR_NOT_SUPPORTED;
1307
1308 return status;
1309}
1310
1311psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
1312 psa_key_handle_t private_key,
1313 const uint8_t *peer_key,
1314 size_t peer_key_length,
1315 uint8_t *output,
1316 size_t output_size,
1317 size_t *output_length)
1318{
1319 psa_status_t status;
1320 struct tfm_crypto_pack_iovec iov = {
1321 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1322 .alg = alg,
1323 .key_handle = private_key
1324 };
1325
1326 psa_invec in_vec[] = {
1327 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1328 {.base = peer_key, .len = peer_key_length},
1329 };
1330
1331 psa_outvec out_vec[] = {
1332 {.base = output, .len = output_size},
1333 };
1334
1335 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1336 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1337
1338 *output_length = out_vec[0].len;
1339
1340 return status;
1341}
1342
1343psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1344 psa_algorithm_t alg)
1345{
1346 psa_status_t status;
1347 struct tfm_crypto_pack_iovec iov = {
1348 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1349 .alg = alg,
1350 .op_handle = operation->handle,
1351 };
1352
1353 psa_invec in_vec[] = {
1354 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1355 };
1356 psa_outvec out_vec[] = {
1357 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1358 };
1359
1360 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1361 TFM_CRYPTO_KEY_DERIVATION_SETUP);
1362 return status;
1363}
1364
1365psa_status_t psa_key_derivation_set_capacity(
1366 psa_key_derivation_operation_t *operation,
1367 size_t capacity)
1368{
1369 psa_status_t status;
1370 struct tfm_crypto_pack_iovec iov = {
1371 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
1372 .capacity = capacity,
1373 .op_handle = operation->handle,
1374 };
1375
1376 psa_invec in_vec[] = {
1377 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1378 };
1379
1380 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1381 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
1382 return status;
1383}
1384
1385psa_status_t psa_key_derivation_input_bytes(
1386 psa_key_derivation_operation_t *operation,
1387 psa_key_derivation_step_t step,
1388 const uint8_t *data,
1389 size_t data_length)
1390{
1391 psa_status_t status;
1392 struct tfm_crypto_pack_iovec iov = {
1393 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1394 .step = step,
1395 .op_handle = operation->handle,
1396 };
1397
1398 psa_invec in_vec[] = {
1399 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1400 {.base = data, .len = data_length},
1401 };
1402
1403 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1404 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
1405 return status;
1406}
1407
1408psa_status_t psa_key_derivation_output_key(
1409 const psa_key_attributes_t *attributes,
1410 psa_key_derivation_operation_t *operation,
1411 psa_key_handle_t *handle)
1412{
1413 psa_status_t status;
1414 struct tfm_crypto_pack_iovec iov = {
1415 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1416 .op_handle = operation->handle,
1417 };
1418
1419 psa_invec in_vec[] = {
1420 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1421 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1422 };
1423
1424 psa_outvec out_vec[] = {
1425 {.base = handle, .len = sizeof(psa_key_handle_t)}
1426 };
1427
1428 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1429 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
1430 return status;
1431}
1432
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001433psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
1434 psa_key_handle_t handle,
1435 psa_algorithm_t alg)
1436{
1437 psa_status_t status;
1438
1439 status = PSA_ERROR_NOT_SUPPORTED;
1440
1441 return status;
1442}
1443
1444psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
1445 psa_key_handle_t handle,
1446 psa_algorithm_t alg)
1447{
1448 psa_status_t status;
1449
1450 status = PSA_ERROR_NOT_SUPPORTED;
1451
1452 return status;
1453}
1454
1455psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
1456 uint8_t *nonce,
1457 size_t nonce_size,
1458 size_t *nonce_length)
1459{
1460 psa_status_t status;
1461
1462 status = PSA_ERROR_NOT_SUPPORTED;
1463
1464 return status;
1465}
1466
1467psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
1468 const uint8_t *nonce,
1469 size_t nonce_length)
1470{
1471 psa_status_t status;
1472
1473 status = PSA_ERROR_NOT_SUPPORTED;
1474
1475 return status;
1476}
1477
1478psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
1479 size_t ad_length,
1480 size_t plaintext_length)
1481{
1482 psa_status_t status;
1483
1484 status = PSA_ERROR_NOT_SUPPORTED;
1485
1486 return status;
1487}
1488
1489psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1490 const uint8_t *input,
1491 size_t input_length,
1492 uint8_t *output,
1493 size_t output_size,
1494 size_t *output_length)
1495{
1496 psa_status_t status;
1497
1498 status = PSA_ERROR_NOT_SUPPORTED;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001499
1500 return status;
1501}