blob: c1b1d9060d2186f7d4e35509afe6cd2e78122126 [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
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100543psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100544 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100545 psa_algorithm_t alg)
546{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000547 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100548 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800549 .sfn_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100550 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100551 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100552 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000553 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100554
Antonio de Angelis4743e672019-04-11 11:38:48 +0100555 psa_invec in_vec[] = {
556 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
557 };
558 psa_outvec out_vec[] = {
559 {.base = &(operation->handle), .len = sizeof(uint32_t)},
560 };
561
Antonio de Angelis4743e672019-04-11 11:38:48 +0100562 status = API_DISPATCH(tfm_crypto_mac_sign_setup,
563 TFM_CRYPTO_MAC_SIGN_SETUP);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100564
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000565 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100566}
567
568psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100569 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100570 psa_algorithm_t alg)
571{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000572 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100573 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800574 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100575 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100576 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100577 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000578 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100579
Antonio de Angelis4743e672019-04-11 11:38:48 +0100580 psa_invec in_vec[] = {
581 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
582 };
583 psa_outvec out_vec[] = {
584 {.base = &(operation->handle), .len = sizeof(uint32_t)},
585 };
586
Antonio de Angelis4743e672019-04-11 11:38:48 +0100587 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
588 TFM_CRYPTO_MAC_VERIFY_SETUP);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100589
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000590 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100591}
592
593psa_status_t psa_mac_update(psa_mac_operation_t *operation,
594 const uint8_t *input,
595 size_t input_length)
596{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000597 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100598 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800599 .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100600 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100601 };
602
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000603 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100604 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000605 {.base = input, .len = input_length},
606 };
607 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100608 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000609 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100610
Antonio de Angelis4743e672019-04-11 11:38:48 +0100611 status = API_DISPATCH(tfm_crypto_mac_update,
612 TFM_CRYPTO_MAC_UPDATE);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100613
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000614 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100615}
616
617psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
618 uint8_t *mac,
619 size_t mac_size,
620 size_t *mac_length)
621{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000622 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100623 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800624 .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100625 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100626 };
627
628 psa_invec in_vec[] = {
629 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
630 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000631 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100632 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000633 {.base = mac, .len = mac_size},
634 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100635
Antonio de Angelis4743e672019-04-11 11:38:48 +0100636 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
637 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100638
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000639 *mac_length = out_vec[1].len;
640
641 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100642}
643
644psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
645 const uint8_t *mac,
646 size_t mac_length)
647{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000648 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100649 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800650 .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100651 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100652 };
653
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000654 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100655 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000656 {.base = mac, .len = mac_length},
657 };
658 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100659 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000660 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100661
Antonio de Angelis4743e672019-04-11 11:38:48 +0100662 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
663 TFM_CRYPTO_MAC_VERIFY_FINISH);
664
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000665 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100666}
667
668psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
669{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000670 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100671 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800672 .sfn_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100673 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000674 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100675
Antonio de Angelis4743e672019-04-11 11:38:48 +0100676 psa_invec in_vec[] = {
677 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
678 };
679 psa_outvec out_vec[] = {
680 {.base = &(operation->handle), .len = sizeof(uint32_t)},
681 };
682
Antonio de Angelis4743e672019-04-11 11:38:48 +0100683 status = API_DISPATCH(tfm_crypto_mac_abort,
684 TFM_CRYPTO_MAC_ABORT);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100685
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000686 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100687}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000688
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100689psa_status_t psa_aead_encrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000690 psa_algorithm_t alg,
691 const uint8_t *nonce,
692 size_t nonce_length,
693 const uint8_t *additional_data,
694 size_t additional_data_length,
695 const uint8_t *plaintext,
696 size_t plaintext_length,
697 uint8_t *ciphertext,
698 size_t ciphertext_size,
699 size_t *ciphertext_length)
700{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000701 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100702 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800703 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100704 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100705 .alg = alg,
706 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000707 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100708
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100709 /* Sanitize the optional input */
710 if ((additional_data == NULL) && (additional_data_length != 0)) {
711 return PSA_ERROR_INVALID_ARGUMENT;
712 }
713
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000714 size_t idx = 0;
715 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100716 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000717 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100718 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000719 };
720 psa_outvec out_vec[] = {
721 {.base = ciphertext, .len = ciphertext_size},
722 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000723
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000724 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
725 return PSA_ERROR_INVALID_ARGUMENT;
726 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000727
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000728 if (nonce != NULL) {
729 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100730 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000731 }
732 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000733
Antonio de Angelis4743e672019-04-11 11:38:48 +0100734 status = API_DISPATCH(tfm_crypto_aead_encrypt,
735 TFM_CRYPTO_AEAD_ENCRYPT);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000736
737 *ciphertext_length = out_vec[0].len;
738
739 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000740}
741
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100742psa_status_t psa_aead_decrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000743 psa_algorithm_t alg,
744 const uint8_t *nonce,
745 size_t nonce_length,
746 const uint8_t *additional_data,
747 size_t additional_data_length,
748 const uint8_t *ciphertext,
749 size_t ciphertext_length,
750 uint8_t *plaintext,
751 size_t plaintext_size,
752 size_t *plaintext_length)
753{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000754 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100755 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800756 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100757 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100758 .alg = alg,
759 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000760 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100761
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100762 /* Sanitize the optional input */
763 if ((additional_data == NULL) && (additional_data_length != 0)) {
764 return PSA_ERROR_INVALID_ARGUMENT;
765 }
766
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000767 size_t idx = 0;
768 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100769 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000770 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100771 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000772 };
773 psa_outvec out_vec[] = {
774 {.base = plaintext, .len = plaintext_size},
775 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000776
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000777 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
778 return PSA_ERROR_INVALID_ARGUMENT;
779 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000780
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000781 if (nonce != NULL) {
782 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100783 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000784 }
785 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000786
Antonio de Angelis4743e672019-04-11 11:38:48 +0100787 status = API_DISPATCH(tfm_crypto_aead_decrypt,
788 TFM_CRYPTO_AEAD_DECRYPT);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000789
790 *plaintext_length = out_vec[0].len;
791
792 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000793}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100794
795psa_status_t psa_asymmetric_sign(psa_key_handle_t handle,
796 psa_algorithm_t alg,
797 const uint8_t *hash,
798 size_t hash_length,
799 uint8_t *signature,
800 size_t signature_size,
801 size_t *signature_length)
802{
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100803 return psa_sign_hash(handle, alg, hash, hash_length, signature,
804 signature_size, signature_length);
805}
806
807psa_status_t psa_sign_hash(psa_key_handle_t handle,
808 psa_algorithm_t alg,
809 const uint8_t *hash,
810 size_t hash_length,
811 uint8_t *signature,
812 size_t signature_size,
813 size_t *signature_length)
814{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100815 psa_status_t status;
816 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100817 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100818 .key_handle = handle,
819 .alg = alg,
820 };
821
822 psa_invec in_vec[] = {
823 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
824 {.base = hash, .len = hash_length},
825 };
826 psa_outvec out_vec[] = {
827 {.base = signature, .len = signature_size},
828 };
829
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100830 status = API_DISPATCH(tfm_crypto_sign_hash,
831 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100832
833 *signature_length = out_vec[0].len;
834
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100835 return status;
836}
837
838psa_status_t psa_asymmetric_verify(psa_key_handle_t handle,
839 psa_algorithm_t alg,
840 const uint8_t *hash,
841 size_t hash_length,
842 const uint8_t *signature,
843 size_t signature_length)
844{
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100845 return psa_verify_hash(handle, alg, hash, hash_length,
846 signature, signature_length);
847}
848
849psa_status_t psa_verify_hash(psa_key_handle_t handle,
850 psa_algorithm_t alg,
851 const uint8_t *hash,
852 size_t hash_length,
853 const uint8_t *signature,
854 size_t signature_length)
855{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100856 psa_status_t status;
857 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100858 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100859 .key_handle = handle,
860 .alg = alg
861 };
862
863 psa_invec in_vec[] = {
864 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
865 {.base = hash, .len = hash_length},
866 {.base = signature, .len = signature_length}
867 };
868
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100869 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
870 TFM_CRYPTO_VERIFY_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100871
872 return status;
873}
874
875psa_status_t psa_asymmetric_encrypt(psa_key_handle_t handle,
876 psa_algorithm_t alg,
877 const uint8_t *input,
878 size_t input_length,
879 const uint8_t *salt,
880 size_t salt_length,
881 uint8_t *output,
882 size_t output_size,
883 size_t *output_length)
884{
885 psa_status_t status;
886 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800887 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100888 .key_handle = handle,
889 .alg = alg
890 };
891
892 /* Sanitize the optional input */
893 if ((salt == NULL) && (salt_length != 0)) {
894 return PSA_ERROR_INVALID_ARGUMENT;
895 }
896
897 psa_invec in_vec[] = {
898 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
899 {.base = input, .len = input_length},
900 {.base = salt, .len = salt_length}
901 };
902
903 psa_outvec out_vec[] = {
904 {.base = output, .len = output_size},
905 };
906
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100907 status = API_DISPATCH(tfm_crypto_asymmetric_encrypt,
908 TFM_CRYPTO_ASYMMETRIC_ENCRYPT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100909
910 *output_length = out_vec[0].len;
911
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100912 return status;
913}
914
915psa_status_t psa_asymmetric_decrypt(psa_key_handle_t handle,
916 psa_algorithm_t alg,
917 const uint8_t *input,
918 size_t input_length,
919 const uint8_t *salt,
920 size_t salt_length,
921 uint8_t *output,
922 size_t output_size,
923 size_t *output_length)
924{
925 psa_status_t status;
926 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800927 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100928 .key_handle = handle,
929 .alg = alg
930 };
931
932 /* Sanitize the optional input */
933 if ((salt == NULL) && (salt_length != 0)) {
934 return PSA_ERROR_INVALID_ARGUMENT;
935 }
936
937 psa_invec in_vec[] = {
938 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
939 {.base = input, .len = input_length},
940 {.base = salt, .len = salt_length}
941 };
942
943 psa_outvec out_vec[] = {
944 {.base = output, .len = output_size},
945 };
946
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100947 status = API_DISPATCH(tfm_crypto_asymmetric_decrypt,
948 TFM_CRYPTO_ASYMMETRIC_DECRYPT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100949
950 *output_length = out_vec[0].len;
951
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100952 return status;
953}
954
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100955psa_status_t psa_key_derivation_get_capacity(
956 const psa_key_derivation_operation_t *operation,
957 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100958{
959 psa_status_t status;
960 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100961 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
962 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100963 };
964
965 psa_invec in_vec[] = {
966 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
967 };
968
969 psa_outvec out_vec[] = {
970 {.base = capacity, .len = sizeof(size_t)},
971 };
972
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100973 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
974 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100975
976 return status;
977}
978
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100979psa_status_t psa_key_derivation_output_bytes(
980 psa_key_derivation_operation_t *operation,
981 uint8_t *output,
982 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100983{
984 psa_status_t status;
985 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100986 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
987 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100988 };
989
990 psa_invec in_vec[] = {
991 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
992 };
993
994 psa_outvec out_vec[] = {
995 {.base = output, .len = output_length},
996 };
997
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100998 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
999 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001000
1001 return status;
1002}
1003
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001004psa_status_t psa_key_derivation_input_key(
1005 psa_key_derivation_operation_t *operation,
1006 psa_key_derivation_step_t step,
1007 psa_key_handle_t handle)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001008{
1009 psa_status_t status;
1010 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001011 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001012 .key_handle = handle,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001013 .step = step,
1014 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001015 };
1016
1017 psa_invec in_vec[] = {
1018 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001019 };
1020
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001021 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1022 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001023
1024 return status;
1025}
1026
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001027psa_status_t psa_key_derivation_abort(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001028{
1029 psa_status_t status;
1030 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001031 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
1032 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001033 };
1034
1035 psa_invec in_vec[] = {
1036 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1037 };
1038
1039 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001040 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001041 };
1042
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001043 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1044 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001045
1046 return status;
1047}
1048
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001049psa_status_t psa_key_derivation_key_agreement(
1050 psa_key_derivation_operation_t *operation,
1051 psa_key_derivation_step_t step,
1052 psa_key_handle_t private_key,
1053 const uint8_t *peer_key,
1054 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001055{
1056 psa_status_t status;
1057 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001058 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001059 .key_handle = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001060 .step = step,
1061 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001062 };
1063
1064 psa_invec in_vec[] = {
1065 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1066 {.base = peer_key, .len = peer_key_length},
1067 };
1068
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001069 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1070 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001071
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001072 return status;
1073}
1074
1075psa_status_t psa_generate_random(uint8_t *output,
1076 size_t output_size)
1077{
1078 psa_status_t status;
1079 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001080 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001081 };
1082
1083 psa_invec in_vec[] = {
1084 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1085 };
1086
1087 psa_outvec out_vec[] = {
1088 {.base = output, .len = output_size},
1089 };
1090
1091 if (output_size == 0) {
1092 return PSA_SUCCESS;
1093 }
1094
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001095 status = API_DISPATCH(tfm_crypto_generate_random,
1096 TFM_CRYPTO_GENERATE_RANDOM);
1097
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001098 return status;
1099}
1100
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001101psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
1102 psa_key_handle_t *handle)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001103{
1104 psa_status_t status;
1105 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001106 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001107 };
1108
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001109 psa_invec in_vec[] = {
1110 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001111 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001112 };
1113
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001114 psa_outvec out_vec[] = {
1115 {.base = handle, .len = sizeof(psa_key_handle_t)},
1116 };
1117
1118 status = API_DISPATCH(tfm_crypto_generate_key,
1119 TFM_CRYPTO_GENERATE_KEY);
1120
1121 return status;
1122}
1123
1124psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes,
1125 psa_key_type_t type,
1126 const uint8_t *data,
1127 size_t data_length)
1128{
1129 psa_status_t status;
1130
1131 status = PSA_ERROR_NOT_SUPPORTED;
1132
1133 return status;
1134}
1135
1136psa_status_t psa_get_key_domain_parameters(
1137 const psa_key_attributes_t *attributes,
1138 uint8_t *data,
1139 size_t data_size,
1140 size_t *data_length)
1141{
1142 psa_status_t status;
1143
1144 status = PSA_ERROR_NOT_SUPPORTED;
1145
1146 return status;
1147}
1148
1149psa_status_t psa_hash_compare(psa_algorithm_t alg,
1150 const uint8_t *input,
1151 size_t input_length,
1152 const uint8_t *hash,
1153 const size_t hash_length)
1154{
1155 psa_status_t status;
1156
1157 status = PSA_ERROR_NOT_SUPPORTED;
1158
1159 return status;
1160}
1161
1162psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1163 const uint8_t *input,
1164 size_t input_length)
1165{
1166 psa_status_t status;
1167
1168 status = PSA_ERROR_NOT_SUPPORTED;
1169
1170 return status;
1171}
1172
1173psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1174 uint8_t *ciphertext,
1175 size_t ciphertext_size,
1176 size_t *ciphertext_length,
1177 uint8_t *tag,
1178 size_t tag_size,
1179 size_t *tag_length)
1180{
1181 psa_status_t status;
1182
1183 status = PSA_ERROR_NOT_SUPPORTED;
1184
1185 return status;
1186}
1187
1188psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1189 uint8_t *plaintext,
1190 size_t plaintext_size,
1191 size_t *plaintext_length,
1192 const uint8_t *tag,
1193 size_t tag_length)
1194{
1195 psa_status_t status;
1196
1197 status = PSA_ERROR_NOT_SUPPORTED;
1198
1199 return status;
1200}
1201
1202psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1203{
1204 psa_status_t status;
1205
1206 status = PSA_ERROR_NOT_SUPPORTED;
1207
1208 return status;
1209}
1210
1211psa_status_t psa_mac_compute(psa_key_handle_t handle,
1212 psa_algorithm_t alg,
1213 const uint8_t *input,
1214 size_t input_length,
1215 uint8_t *mac,
1216 size_t mac_size,
1217 size_t *mac_length)
1218{
1219 psa_status_t status;
1220
1221 status = PSA_ERROR_NOT_SUPPORTED;
1222
1223 return status;
1224}
1225
1226psa_status_t psa_mac_verify(psa_key_handle_t handle,
1227 psa_algorithm_t alg,
1228 const uint8_t *input,
1229 size_t input_length,
1230 const uint8_t *mac,
1231 const size_t mac_length)
1232{
1233 psa_status_t status;
1234
1235 status = PSA_ERROR_NOT_SUPPORTED;
1236
1237 return status;
1238}
1239
1240psa_status_t psa_cipher_encrypt(psa_key_handle_t handle,
1241 psa_algorithm_t alg,
1242 const uint8_t *input,
1243 size_t input_length,
1244 uint8_t *output,
1245 size_t output_size,
1246 size_t *output_length)
1247{
1248 psa_status_t status;
1249
1250 status = PSA_ERROR_NOT_SUPPORTED;
1251
1252 return status;
1253}
1254
1255psa_status_t psa_cipher_decrypt(psa_key_handle_t handle,
1256 psa_algorithm_t alg,
1257 const uint8_t *input,
1258 size_t input_length,
1259 uint8_t *output,
1260 size_t output_size,
1261 size_t *output_length)
1262{
1263 psa_status_t status;
1264
1265 status = PSA_ERROR_NOT_SUPPORTED;
1266
1267 return status;
1268}
1269
1270psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
1271 psa_key_handle_t private_key,
1272 const uint8_t *peer_key,
1273 size_t peer_key_length,
1274 uint8_t *output,
1275 size_t output_size,
1276 size_t *output_length)
1277{
1278 psa_status_t status;
1279 struct tfm_crypto_pack_iovec iov = {
1280 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1281 .alg = alg,
1282 .key_handle = private_key
1283 };
1284
1285 psa_invec in_vec[] = {
1286 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1287 {.base = peer_key, .len = peer_key_length},
1288 };
1289
1290 psa_outvec out_vec[] = {
1291 {.base = output, .len = output_size},
1292 };
1293
1294 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1295 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1296
1297 *output_length = out_vec[0].len;
1298
1299 return status;
1300}
1301
1302psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1303 psa_algorithm_t alg)
1304{
1305 psa_status_t status;
1306 struct tfm_crypto_pack_iovec iov = {
1307 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1308 .alg = alg,
1309 .op_handle = operation->handle,
1310 };
1311
1312 psa_invec in_vec[] = {
1313 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1314 };
1315 psa_outvec out_vec[] = {
1316 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1317 };
1318
1319 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1320 TFM_CRYPTO_KEY_DERIVATION_SETUP);
1321 return status;
1322}
1323
1324psa_status_t psa_key_derivation_set_capacity(
1325 psa_key_derivation_operation_t *operation,
1326 size_t capacity)
1327{
1328 psa_status_t status;
1329 struct tfm_crypto_pack_iovec iov = {
1330 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
1331 .capacity = capacity,
1332 .op_handle = operation->handle,
1333 };
1334
1335 psa_invec in_vec[] = {
1336 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1337 };
1338
1339 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1340 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
1341 return status;
1342}
1343
1344psa_status_t psa_key_derivation_input_bytes(
1345 psa_key_derivation_operation_t *operation,
1346 psa_key_derivation_step_t step,
1347 const uint8_t *data,
1348 size_t data_length)
1349{
1350 psa_status_t status;
1351 struct tfm_crypto_pack_iovec iov = {
1352 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1353 .step = step,
1354 .op_handle = operation->handle,
1355 };
1356
1357 psa_invec in_vec[] = {
1358 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1359 {.base = data, .len = data_length},
1360 };
1361
1362 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1363 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
1364 return status;
1365}
1366
1367psa_status_t psa_key_derivation_output_key(
1368 const psa_key_attributes_t *attributes,
1369 psa_key_derivation_operation_t *operation,
1370 psa_key_handle_t *handle)
1371{
1372 psa_status_t status;
1373 struct tfm_crypto_pack_iovec iov = {
1374 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1375 .op_handle = operation->handle,
1376 };
1377
1378 psa_invec in_vec[] = {
1379 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1380 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1381 };
1382
1383 psa_outvec out_vec[] = {
1384 {.base = handle, .len = sizeof(psa_key_handle_t)}
1385 };
1386
1387 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1388 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
1389 return status;
1390}
1391
1392psa_status_t psa_hash_compute(psa_algorithm_t alg,
1393 const uint8_t *input,
1394 size_t input_length,
1395 uint8_t *hash,
1396 size_t hash_size,
1397 size_t *hash_length)
1398{
1399 psa_status_t status;
1400
1401 status = PSA_ERROR_NOT_SUPPORTED;
1402
1403 return status;
1404}
1405
1406psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
1407 psa_key_handle_t handle,
1408 psa_algorithm_t alg)
1409{
1410 psa_status_t status;
1411
1412 status = PSA_ERROR_NOT_SUPPORTED;
1413
1414 return status;
1415}
1416
1417psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
1418 psa_key_handle_t handle,
1419 psa_algorithm_t alg)
1420{
1421 psa_status_t status;
1422
1423 status = PSA_ERROR_NOT_SUPPORTED;
1424
1425 return status;
1426}
1427
1428psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
1429 uint8_t *nonce,
1430 size_t nonce_size,
1431 size_t *nonce_length)
1432{
1433 psa_status_t status;
1434
1435 status = PSA_ERROR_NOT_SUPPORTED;
1436
1437 return status;
1438}
1439
1440psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
1441 const uint8_t *nonce,
1442 size_t nonce_length)
1443{
1444 psa_status_t status;
1445
1446 status = PSA_ERROR_NOT_SUPPORTED;
1447
1448 return status;
1449}
1450
1451psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
1452 size_t ad_length,
1453 size_t plaintext_length)
1454{
1455 psa_status_t status;
1456
1457 status = PSA_ERROR_NOT_SUPPORTED;
1458
1459 return status;
1460}
1461
1462psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1463 const uint8_t *input,
1464 size_t input_length,
1465 uint8_t *output,
1466 size_t output_size,
1467 size_t *output_length)
1468{
1469 psa_status_t status;
1470
1471 status = PSA_ERROR_NOT_SUPPORTED;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001472
1473 return status;
1474}