blob: 176c192e1bbee6fd832f42f4f404601523455cc1 [file] [log] [blame]
Antonio de Angelis8908f472018-08-31 15:44:25 +01001/*
Antonio de Angelis377a1552018-11-22 17:02:40 +00002 * Copyright (c) 2018-2019, 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
Jamie Fox0e54ebc2019-04-09 14:21:04 +010033psa_status_t psa_allocate_key(psa_key_handle_t *handle)
34{
35 psa_status_t status;
36 const struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +080037 .sfn_id = TFM_CRYPTO_ALLOCATE_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +010038 };
39 psa_invec in_vec[] = {
40 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
41 };
42 psa_outvec out_vec[] = {
43 {.base = handle, .len = sizeof(psa_key_handle_t)},
44 };
45
Jamie Fox0e54ebc2019-04-09 14:21:04 +010046 status = API_DISPATCH(tfm_crypto_allocate_key,
47 TFM_CRYPTO_ALLOCATE_KEY);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010048
49 return status;
50}
51
52psa_status_t psa_open_key(psa_key_lifetime_t lifetime,
53 psa_key_id_t id,
54 psa_key_handle_t *handle)
55{
56 (void)lifetime;
57 (void)id;
58 (void)handle;
59
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +010060 /* TODO: Persistent key APIs are not supported yet */
Jamie Fox0e54ebc2019-04-09 14:21:04 +010061 return PSA_ERROR_NOT_SUPPORTED;
62}
63
64psa_status_t psa_create_key(psa_key_lifetime_t lifetime,
65 psa_key_id_t id,
66 psa_key_handle_t *handle)
67{
68 (void)lifetime;
69 (void)id;
70 (void)handle;
71
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +010072 /* TODO: Persistent key APIs are not supported yet */
Jamie Fox0e54ebc2019-04-09 14:21:04 +010073 return PSA_ERROR_NOT_SUPPORTED;
74}
75
76psa_status_t psa_close_key(psa_key_handle_t handle)
77{
78 (void)handle;
79
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +010080 /* TODO: Persistent key APIs are not supported yet */
Jamie Fox0e54ebc2019-04-09 14:21:04 +010081 return PSA_ERROR_NOT_SUPPORTED;
82}
83
84psa_status_t psa_import_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +010085 psa_key_type_t type,
86 const uint8_t *data,
87 size_t data_length)
88{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000089 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +010090 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +080091 .sfn_id = TFM_CRYPTO_IMPORT_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +010092 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +010093 .type = type,
94 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000095 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +010096 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000097 {.base = data, .len = data_length}
98 };
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_import_key,
101 TFM_CRYPTO_IMPORT_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
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100106psa_status_t psa_destroy_key(psa_key_handle_t handle)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100107{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000108 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100109 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800110 .sfn_id = TFM_CRYPTO_DESTROY_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100111 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100112 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000113 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100114 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000115 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100116
Antonio de Angelis4743e672019-04-11 11:38:48 +0100117 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_destroy_key,
118 TFM_CRYPTO_DESTROY_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100119
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000120 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100121}
122
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100123psa_status_t psa_get_key_information(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100124 psa_key_type_t *type,
125 size_t *bits)
126{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000127 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100128 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800129 .sfn_id = TFM_CRYPTO_GET_KEY_INFORMATION_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100130 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100131 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000132 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100133 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000134 };
135 psa_outvec out_vec[] = {
136 {.base = type, .len = sizeof(psa_key_type_t)},
137 {.base = bits, .len = sizeof(size_t)}
138 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100139
Antonio de Angelis4743e672019-04-11 11:38:48 +0100140 status = API_DISPATCH(tfm_crypto_get_key_information,
141 TFM_CRYPTO_GET_KEY_INFORMATION);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100142
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000143 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100144}
145
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100146psa_status_t psa_export_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100147 uint8_t *data,
148 size_t data_size,
149 size_t *data_length)
150{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000151 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100152 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800153 .sfn_id = TFM_CRYPTO_EXPORT_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100154 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100155 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000156 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100157 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000158 };
159 psa_outvec out_vec[] = {
160 {.base = data, .len = data_size}
161 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100162
Antonio de Angelis4743e672019-04-11 11:38:48 +0100163 status = API_DISPATCH(tfm_crypto_export_key,
164 TFM_CRYPTO_EXPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100165
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000166 *data_length = out_vec[0].len;
167
Antonio de Angelis4743e672019-04-11 11:38:48 +0100168
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000169 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100170}
171
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100172psa_status_t psa_export_public_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100173 uint8_t *data,
174 size_t data_size,
175 size_t *data_length)
176{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100177 psa_status_t status;
178 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800179 .sfn_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100180 .key_handle = handle,
181 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000182
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100183 psa_invec in_vec[] = {
184 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
185 };
186 psa_outvec out_vec[] = {
187 {.base = data, .len = data_size}
188 };
189
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100190 status = API_DISPATCH(tfm_crypto_export_public_key,
191 TFM_CRYPTO_EXPORT_PUBLIC_KEY);
192
193 *data_length = out_vec[0].len;
194
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100195 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100196}
197
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100198psa_status_t psa_copy_key(psa_key_handle_t source_handle,
199 psa_key_handle_t target_handle,
200 const psa_key_policy_t *constraint)
Jamie Foxefd82732018-11-26 10:34:32 +0000201{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100202 psa_status_t status;
203 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800204 .sfn_id = TFM_CRYPTO_COPY_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100205 .key_handle = source_handle,
206 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000207
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100208 psa_invec in_vec[] = {
209 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
210 {.base = &target_handle, .len = sizeof(psa_key_handle_t)},
211 {.base = constraint, .len = sizeof(psa_key_policy_t)},
212 };
213
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100214 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_copy_key,
215 TFM_CRYPTO_COPY_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100216
217 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000218}
219
220void psa_key_policy_set_usage(psa_key_policy_t *policy,
221 psa_key_usage_t usage,
222 psa_algorithm_t alg)
223{
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100224 policy->usage = usage;
225 policy->alg = alg;
Jamie Foxefd82732018-11-26 10:34:32 +0000226}
227
228psa_key_usage_t psa_key_policy_get_usage(const psa_key_policy_t *policy)
229{
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100230 return policy->usage;
Jamie Foxefd82732018-11-26 10:34:32 +0000231}
232
233psa_algorithm_t psa_key_policy_get_algorithm(const psa_key_policy_t *policy)
234{
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100235 return policy->alg;
Jamie Foxefd82732018-11-26 10:34:32 +0000236}
237
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100238psa_status_t psa_set_key_policy(psa_key_handle_t handle,
Jamie Foxefd82732018-11-26 10:34:32 +0000239 const psa_key_policy_t *policy)
240{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000241 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100242 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800243 .sfn_id = TFM_CRYPTO_SET_KEY_POLICY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100244 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100245 };
246
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000247 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100248 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000249 {.base = policy, .len = sizeof(psa_key_policy_t)},
250 };
Jamie Foxefd82732018-11-26 10:34:32 +0000251
Antonio de Angelis4743e672019-04-11 11:38:48 +0100252 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_set_key_policy,
253 TFM_CRYPTO_SET_KEY_POLICY);
Jamie Foxefd82732018-11-26 10:34:32 +0000254
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000255 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000256}
257
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100258psa_status_t psa_get_key_policy(psa_key_handle_t handle,
Jamie Foxefd82732018-11-26 10:34:32 +0000259 psa_key_policy_t *policy)
260{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000261 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100262 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800263 .sfn_id = TFM_CRYPTO_GET_KEY_POLICY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100264 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100265 };
266
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000267 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100268 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000269 };
270 psa_outvec out_vec[] = {
271 {.base = policy, .len = sizeof(psa_key_policy_t)},
272 };
Jamie Foxefd82732018-11-26 10:34:32 +0000273
Antonio de Angelis4743e672019-04-11 11:38:48 +0100274 status = API_DISPATCH(tfm_crypto_get_key_policy,
275 TFM_CRYPTO_GET_KEY_POLICY);
Jamie Foxefd82732018-11-26 10:34:32 +0000276
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000277 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000278}
279
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100280psa_status_t psa_get_key_lifetime(psa_key_handle_t handle,
Jamie Foxefd82732018-11-26 10:34:32 +0000281 psa_key_lifetime_t *lifetime)
282{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000283 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100284 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800285 .sfn_id = TFM_CRYPTO_GET_KEY_LIFETIME_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100286 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100287 };
288
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000289 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100290 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000291 };
292 psa_outvec out_vec[] = {
293 {.base = lifetime, .len = sizeof(psa_key_lifetime_t)},
294 };
Jamie Foxefd82732018-11-26 10:34:32 +0000295
Antonio de Angelis4743e672019-04-11 11:38:48 +0100296 status = API_DISPATCH(tfm_crypto_get_key_lifetime,
297 TFM_CRYPTO_GET_KEY_LIFETIME);
Jamie Foxefd82732018-11-26 10:34:32 +0000298
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000299 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000300}
301
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100302psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
303 unsigned char *iv,
304 size_t iv_size,
305 size_t *iv_length)
306{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100307 psa_status_t status;
308 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800309 .sfn_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100310 .op_handle = operation->handle,
311 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100312
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100313 psa_invec in_vec[] = {
314 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
315 };
316 psa_outvec out_vec[] = {
317 {.base = &(operation->handle), .len = sizeof(uint32_t)},
318 {.base = iv, .len = iv_size},
319 };
320
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100321 status = API_DISPATCH(tfm_crypto_cipher_generate_iv,
322 TFM_CRYPTO_CIPHER_GENERATE_IV);
323
324 *iv_length = out_vec[1].len;
325
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100326 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100327}
328
Antonio de Angelis377a1552018-11-22 17:02:40 +0000329psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
330 const unsigned char *iv,
331 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100332{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000333 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100334 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800335 .sfn_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100336 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100337 };
338
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000339 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100340 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000341 {.base = iv, .len = iv_length},
342 };
343 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100344 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000345 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100346
Antonio de Angelis4743e672019-04-11 11:38:48 +0100347 status = API_DISPATCH(tfm_crypto_cipher_set_iv,
348 TFM_CRYPTO_CIPHER_SET_IV);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100349
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000350 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100351}
352
Antonio de Angelis377a1552018-11-22 17:02:40 +0000353psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100354 psa_key_handle_t handle,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000355 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100356{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000357 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100358 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800359 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100360 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100361 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100362 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000363 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100364
Antonio de Angelis4743e672019-04-11 11:38:48 +0100365 psa_invec in_vec[] = {
366 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
367 };
368 psa_outvec out_vec[] = {
369 {.base = &(operation->handle), .len = sizeof(uint32_t)},
370 };
371
Antonio de Angelis4743e672019-04-11 11:38:48 +0100372 status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup,
373 TFM_CRYPTO_CIPHER_ENCRYPT_SETUP);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100374
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000375 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100376}
377
Antonio de Angelis377a1552018-11-22 17:02:40 +0000378psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100379 psa_key_handle_t handle,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000380 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100381{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000382 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100383 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800384 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100385 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100386 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100387 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000388 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100389
Antonio de Angelis4743e672019-04-11 11:38:48 +0100390 psa_invec in_vec[] = {
391 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
392 };
393 psa_outvec out_vec[] = {
394 {.base = &(operation->handle), .len = sizeof(uint32_t)},
395 };
396
Antonio de Angelis4743e672019-04-11 11:38:48 +0100397 status = API_DISPATCH(tfm_crypto_cipher_decrypt_setup,
398 TFM_CRYPTO_CIPHER_DECRYPT_SETUP);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100399
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000400 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100401}
402
403psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
404 const uint8_t *input,
405 size_t input_length,
406 unsigned char *output,
407 size_t output_size,
408 size_t *output_length)
409{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000410 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100411 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800412 .sfn_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100413 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100414 };
415
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000416 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100417 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000418 {.base = input, .len = input_length},
419 };
420 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100421 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000422 {.base = output, .len = output_size}
423 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100424
Antonio de Angelis4743e672019-04-11 11:38:48 +0100425 status = API_DISPATCH(tfm_crypto_cipher_update,
426 TFM_CRYPTO_CIPHER_UPDATE);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100427
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000428 *output_length = out_vec[1].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100429
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000430 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100431}
432
433psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
434{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000435 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100436 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800437 .sfn_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100438 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000439 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100440
Antonio de Angelis4743e672019-04-11 11:38:48 +0100441 psa_invec in_vec[] = {
442 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
443 };
444 psa_outvec out_vec[] = {
445 {.base = &(operation->handle), .len = sizeof(uint32_t)},
446 };
447
Antonio de Angelis4743e672019-04-11 11:38:48 +0100448 status = API_DISPATCH(tfm_crypto_cipher_abort,
449 TFM_CRYPTO_CIPHER_ABORT);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100450
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000451 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100452}
453
454psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
455 uint8_t *output,
456 size_t output_size,
457 size_t *output_length)
458{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000459 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100460 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800461 .sfn_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100462 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100463 };
464
465 psa_invec in_vec[] = {
466 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
467 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000468 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100469 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000470 {.base = output, .len = output_size},
471 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100472
Antonio de Angelis4743e672019-04-11 11:38:48 +0100473 status = API_DISPATCH(tfm_crypto_cipher_finish,
474 TFM_CRYPTO_CIPHER_FINISH);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100475
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000476 *output_length = out_vec[1].len;
477
478 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100479}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100480
Antonio de Angelis377a1552018-11-22 17:02:40 +0000481psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100482 psa_algorithm_t alg)
483{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000484 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100485 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800486 .sfn_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100487 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100488 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000489 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100490
Antonio de Angelis4743e672019-04-11 11:38:48 +0100491 psa_invec in_vec[] = {
492 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
493 };
494 psa_outvec out_vec[] = {
495 {.base = &(operation->handle), .len = sizeof(uint32_t)},
496 };
497
Antonio de Angelis4743e672019-04-11 11:38:48 +0100498 status = API_DISPATCH(tfm_crypto_hash_setup,
499 TFM_CRYPTO_HASH_SETUP);
500
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000501 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100502}
503
504psa_status_t psa_hash_update(psa_hash_operation_t *operation,
505 const uint8_t *input,
506 size_t input_length)
507{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000508 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100509 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800510 .sfn_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100511 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100512 };
513
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000514 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100515 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000516 {.base = input, .len = input_length},
517 };
518 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100519 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000520 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100521
Antonio de Angelis4743e672019-04-11 11:38:48 +0100522 status = API_DISPATCH(tfm_crypto_hash_update,
523 TFM_CRYPTO_HASH_UPDATE);
524
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000525 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100526}
527
528psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
529 uint8_t *hash,
530 size_t hash_size,
531 size_t *hash_length)
532{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000533 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100534 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800535 .sfn_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100536 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100537 };
538
539 psa_invec in_vec[] = {
540 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
541 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000542 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100543 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000544 {.base = hash, .len = hash_size},
545 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100546
Antonio de Angelis4743e672019-04-11 11:38:48 +0100547 status = API_DISPATCH(tfm_crypto_hash_finish,
548 TFM_CRYPTO_HASH_FINISH);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100549
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000550 *hash_length = out_vec[1].len;
551
552 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100553}
554
555psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
556 const uint8_t *hash,
557 size_t hash_length)
558{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000559 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100560 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800561 .sfn_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100562 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100563 };
564
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000565 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100566 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000567 {.base = hash, .len = hash_length},
568 };
569 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100570 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000571 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100572
Antonio de Angelis4743e672019-04-11 11:38:48 +0100573 status = API_DISPATCH(tfm_crypto_hash_verify,
574 TFM_CRYPTO_HASH_VERIFY);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100575
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000576 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100577}
578
579psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
580{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000581 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100582 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800583 .sfn_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100584 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000585 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100586
Antonio de Angelis4743e672019-04-11 11:38:48 +0100587 psa_invec in_vec[] = {
588 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
589 };
590 psa_outvec out_vec[] = {
591 {.base = &(operation->handle), .len = sizeof(uint32_t)},
592 };
593
Antonio de Angelis4743e672019-04-11 11:38:48 +0100594 status = API_DISPATCH(tfm_crypto_hash_abort,
595 TFM_CRYPTO_HASH_ABORT);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100596
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000597 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100598}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100599
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100600psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
601 psa_hash_operation_t *target_operation)
602{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100603 psa_status_t status;
604 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800605 .sfn_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100606 .op_handle = source_operation->handle,
607 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100608
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100609 psa_invec in_vec[] = {
610 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
611 };
612 psa_outvec out_vec[] = {
613 {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
614 };
615
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100616 status = API_DISPATCH(tfm_crypto_hash_clone,
617 TFM_CRYPTO_HASH_CLONE);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100618
619 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100620}
621
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100622psa_status_t psa_mac_sign_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_SIGN_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_sign_setup,
642 TFM_CRYPTO_MAC_SIGN_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_verify_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100648 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100649 psa_algorithm_t alg)
650{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000651 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100652 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800653 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100654 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100655 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100656 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000657 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100658
Antonio de Angelis4743e672019-04-11 11:38:48 +0100659 psa_invec in_vec[] = {
660 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
661 };
662 psa_outvec out_vec[] = {
663 {.base = &(operation->handle), .len = sizeof(uint32_t)},
664 };
665
Antonio de Angelis4743e672019-04-11 11:38:48 +0100666 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
667 TFM_CRYPTO_MAC_VERIFY_SETUP);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100668
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000669 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100670}
671
672psa_status_t psa_mac_update(psa_mac_operation_t *operation,
673 const uint8_t *input,
674 size_t input_length)
675{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000676 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100677 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800678 .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100679 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100680 };
681
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000682 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100683 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000684 {.base = input, .len = input_length},
685 };
686 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100687 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000688 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100689
Antonio de Angelis4743e672019-04-11 11:38:48 +0100690 status = API_DISPATCH(tfm_crypto_mac_update,
691 TFM_CRYPTO_MAC_UPDATE);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100692
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000693 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100694}
695
696psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
697 uint8_t *mac,
698 size_t mac_size,
699 size_t *mac_length)
700{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000701 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100702 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800703 .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100704 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100705 };
706
707 psa_invec in_vec[] = {
708 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
709 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000710 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100711 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000712 {.base = mac, .len = mac_size},
713 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100714
Antonio de Angelis4743e672019-04-11 11:38:48 +0100715 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
716 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100717
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000718 *mac_length = out_vec[1].len;
719
720 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100721}
722
723psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
724 const uint8_t *mac,
725 size_t mac_length)
726{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000727 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100728 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800729 .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100730 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100731 };
732
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000733 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100734 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000735 {.base = mac, .len = mac_length},
736 };
737 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100738 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000739 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100740
Antonio de Angelis4743e672019-04-11 11:38:48 +0100741 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
742 TFM_CRYPTO_MAC_VERIFY_FINISH);
743
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000744 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100745}
746
747psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
748{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000749 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100750 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800751 .sfn_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100752 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000753 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100754
Antonio de Angelis4743e672019-04-11 11:38:48 +0100755 psa_invec in_vec[] = {
756 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
757 };
758 psa_outvec out_vec[] = {
759 {.base = &(operation->handle), .len = sizeof(uint32_t)},
760 };
761
Antonio de Angelis4743e672019-04-11 11:38:48 +0100762 status = API_DISPATCH(tfm_crypto_mac_abort,
763 TFM_CRYPTO_MAC_ABORT);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100764
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000765 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100766}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000767
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100768psa_status_t psa_aead_encrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000769 psa_algorithm_t alg,
770 const uint8_t *nonce,
771 size_t nonce_length,
772 const uint8_t *additional_data,
773 size_t additional_data_length,
774 const uint8_t *plaintext,
775 size_t plaintext_length,
776 uint8_t *ciphertext,
777 size_t ciphertext_size,
778 size_t *ciphertext_length)
779{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000780 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100781 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800782 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100783 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100784 .alg = alg,
785 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000786 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100787
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100788 /* Sanitize the optional input */
789 if ((additional_data == NULL) && (additional_data_length != 0)) {
790 return PSA_ERROR_INVALID_ARGUMENT;
791 }
792
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000793 size_t idx = 0;
794 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100795 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000796 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100797 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000798 };
799 psa_outvec out_vec[] = {
800 {.base = ciphertext, .len = ciphertext_size},
801 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000802
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000803 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
804 return PSA_ERROR_INVALID_ARGUMENT;
805 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000806
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000807 if (nonce != NULL) {
808 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100809 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000810 }
811 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000812
Antonio de Angelis4743e672019-04-11 11:38:48 +0100813 status = API_DISPATCH(tfm_crypto_aead_encrypt,
814 TFM_CRYPTO_AEAD_ENCRYPT);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000815
816 *ciphertext_length = out_vec[0].len;
817
818 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000819}
820
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100821psa_status_t psa_aead_decrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000822 psa_algorithm_t alg,
823 const uint8_t *nonce,
824 size_t nonce_length,
825 const uint8_t *additional_data,
826 size_t additional_data_length,
827 const uint8_t *ciphertext,
828 size_t ciphertext_length,
829 uint8_t *plaintext,
830 size_t plaintext_size,
831 size_t *plaintext_length)
832{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000833 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100834 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800835 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100836 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100837 .alg = alg,
838 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000839 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100840
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100841 /* Sanitize the optional input */
842 if ((additional_data == NULL) && (additional_data_length != 0)) {
843 return PSA_ERROR_INVALID_ARGUMENT;
844 }
845
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000846 size_t idx = 0;
847 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100848 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000849 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100850 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000851 };
852 psa_outvec out_vec[] = {
853 {.base = plaintext, .len = plaintext_size},
854 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000855
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000856 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
857 return PSA_ERROR_INVALID_ARGUMENT;
858 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000859
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000860 if (nonce != NULL) {
861 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100862 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000863 }
864 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000865
Antonio de Angelis4743e672019-04-11 11:38:48 +0100866 status = API_DISPATCH(tfm_crypto_aead_decrypt,
867 TFM_CRYPTO_AEAD_DECRYPT);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000868
869 *plaintext_length = out_vec[0].len;
870
871 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000872}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100873
874psa_status_t psa_asymmetric_sign(psa_key_handle_t handle,
875 psa_algorithm_t alg,
876 const uint8_t *hash,
877 size_t hash_length,
878 uint8_t *signature,
879 size_t signature_size,
880 size_t *signature_length)
881{
882 psa_status_t status;
883 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800884 .sfn_id = TFM_CRYPTO_ASYMMETRIC_SIGN_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100885 .key_handle = handle,
886 .alg = alg,
887 };
888
889 psa_invec in_vec[] = {
890 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
891 {.base = hash, .len = hash_length},
892 };
893 psa_outvec out_vec[] = {
894 {.base = signature, .len = signature_size},
895 };
896
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100897 status = API_DISPATCH(tfm_crypto_asymmetric_sign,
898 TFM_CRYPTO_ASYMMETRIC_SIGN);
899
900 *signature_length = out_vec[0].len;
901
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100902 return status;
903}
904
905psa_status_t psa_asymmetric_verify(psa_key_handle_t handle,
906 psa_algorithm_t alg,
907 const uint8_t *hash,
908 size_t hash_length,
909 const uint8_t *signature,
910 size_t signature_length)
911{
912 psa_status_t status;
913 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800914 .sfn_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100915 .key_handle = handle,
916 .alg = alg
917 };
918
919 psa_invec in_vec[] = {
920 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
921 {.base = hash, .len = hash_length},
922 {.base = signature, .len = signature_length}
923 };
924
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100925 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_asymmetric_verify,
926 TFM_CRYPTO_ASYMMETRIC_VERIFY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100927
928 return status;
929}
930
931psa_status_t psa_asymmetric_encrypt(psa_key_handle_t handle,
932 psa_algorithm_t alg,
933 const uint8_t *input,
934 size_t input_length,
935 const uint8_t *salt,
936 size_t salt_length,
937 uint8_t *output,
938 size_t output_size,
939 size_t *output_length)
940{
941 psa_status_t status;
942 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800943 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100944 .key_handle = handle,
945 .alg = alg
946 };
947
948 /* Sanitize the optional input */
949 if ((salt == NULL) && (salt_length != 0)) {
950 return PSA_ERROR_INVALID_ARGUMENT;
951 }
952
953 psa_invec in_vec[] = {
954 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
955 {.base = input, .len = input_length},
956 {.base = salt, .len = salt_length}
957 };
958
959 psa_outvec out_vec[] = {
960 {.base = output, .len = output_size},
961 };
962
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100963 status = API_DISPATCH(tfm_crypto_asymmetric_encrypt,
964 TFM_CRYPTO_ASYMMETRIC_ENCRYPT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100965
966 *output_length = out_vec[0].len;
967
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100968 return status;
969}
970
971psa_status_t psa_asymmetric_decrypt(psa_key_handle_t handle,
972 psa_algorithm_t alg,
973 const uint8_t *input,
974 size_t input_length,
975 const uint8_t *salt,
976 size_t salt_length,
977 uint8_t *output,
978 size_t output_size,
979 size_t *output_length)
980{
981 psa_status_t status;
982 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800983 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100984 .key_handle = handle,
985 .alg = alg
986 };
987
988 /* Sanitize the optional input */
989 if ((salt == NULL) && (salt_length != 0)) {
990 return PSA_ERROR_INVALID_ARGUMENT;
991 }
992
993 psa_invec in_vec[] = {
994 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
995 {.base = input, .len = input_length},
996 {.base = salt, .len = salt_length}
997 };
998
999 psa_outvec out_vec[] = {
1000 {.base = output, .len = output_size},
1001 };
1002
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001003 status = API_DISPATCH(tfm_crypto_asymmetric_decrypt,
1004 TFM_CRYPTO_ASYMMETRIC_DECRYPT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001005
1006 *output_length = out_vec[0].len;
1007
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001008 return status;
1009}
1010
1011psa_status_t psa_get_generator_capacity(const psa_crypto_generator_t *generator,
1012 size_t *capacity)
1013{
1014 psa_status_t status;
1015 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001016 .sfn_id = TFM_CRYPTO_GET_GENERATOR_CAPACITY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001017 .op_handle = generator->handle,
1018 };
1019
1020 psa_invec in_vec[] = {
1021 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1022 };
1023
1024 psa_outvec out_vec[] = {
1025 {.base = capacity, .len = sizeof(size_t)},
1026 };
1027
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001028 status = API_DISPATCH(tfm_crypto_get_generator_capacity,
1029 TFM_CRYPTO_GET_GENERATOR_CAPACITY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001030
1031 return status;
1032}
1033
1034psa_status_t psa_generator_read(psa_crypto_generator_t *generator,
1035 uint8_t *output,
1036 size_t output_length)
1037{
1038 psa_status_t status;
1039 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001040 .sfn_id = TFM_CRYPTO_GENERATOR_READ_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001041 .op_handle = generator->handle,
1042 };
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 Angelis25e2b2d2019-04-25 14:49:50 +01001052 status = API_DISPATCH(tfm_crypto_generator_read,
1053 TFM_CRYPTO_GENERATOR_READ);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001054
1055 return status;
1056}
1057
1058psa_status_t psa_generator_import_key(psa_key_handle_t handle,
1059 psa_key_type_t type,
1060 size_t bits,
1061 psa_crypto_generator_t *generator)
1062{
1063 psa_status_t status;
1064 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001065 .sfn_id = TFM_CRYPTO_GENERATOR_IMPORT_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001066 .key_handle = handle,
1067 .type = type,
1068 .op_handle = generator->handle,
1069 };
1070
1071 psa_invec in_vec[] = {
1072 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1073 {.base = &bits, .len = sizeof(size_t)},
1074 };
1075
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001076 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_generator_import_key,
1077 TFM_CRYPTO_GENERATOR_IMPORT_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001078
1079 return status;
1080}
1081
1082psa_status_t psa_generator_abort(psa_crypto_generator_t *generator)
1083{
1084 psa_status_t status;
1085 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001086 .sfn_id = TFM_CRYPTO_GENERATOR_ABORT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001087 .op_handle = generator->handle,
1088 };
1089
1090 psa_invec in_vec[] = {
1091 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1092 };
1093
1094 psa_outvec out_vec[] = {
1095 {.base = &(generator->handle), .len = sizeof(uint32_t)},
1096 };
1097
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001098 status = API_DISPATCH(tfm_crypto_generator_abort,
1099 TFM_CRYPTO_GENERATOR_ABORT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001100
1101 return status;
1102}
1103
1104psa_status_t psa_key_derivation(psa_crypto_generator_t *generator,
1105 psa_key_handle_t handle,
1106 psa_algorithm_t alg,
1107 const uint8_t *salt,
1108 size_t salt_length,
1109 const uint8_t *label,
1110 size_t label_length,
1111 size_t capacity)
1112{
1113 psa_status_t status;
1114 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001115 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001116 .key_handle = handle,
1117 .alg = alg,
1118 .op_handle = generator->handle,
1119 .capacity = capacity,
1120 };
1121
1122 /* Sanitize the optional input */
1123 if ((salt == NULL) && (salt_length != 0)) {
1124 return PSA_ERROR_INVALID_ARGUMENT;
1125 }
1126
1127 if ((label == NULL) && (label_length != 0)) {
1128 return PSA_ERROR_INVALID_ARGUMENT;
1129 }
1130
1131 psa_invec in_vec[] = {
1132 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1133 {.base = salt, .len = salt_length},
1134 {.base = label, .len = label_length},
1135 };
1136
1137 psa_outvec out_vec[] = {
1138 {.base = &(generator->handle), .len = sizeof(uint32_t)},
1139 };
1140
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001141 status = API_DISPATCH(tfm_crypto_key_derivation,
1142 TFM_CRYPTO_KEY_DERIVATION);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001143
1144 return status;
1145}
1146
1147psa_status_t psa_key_agreement(psa_crypto_generator_t *generator,
1148 psa_key_handle_t private_key,
1149 const uint8_t *peer_key,
1150 size_t peer_key_length,
1151 psa_algorithm_t alg)
1152{
1153 psa_status_t status;
1154 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001155 .sfn_id = TFM_CRYPTO_KEY_AGREEMENT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001156 .key_handle = private_key,
1157 .alg = alg,
1158 .op_handle = generator->handle,
1159 };
1160
1161 psa_invec in_vec[] = {
1162 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1163 {.base = peer_key, .len = peer_key_length},
1164 };
1165
1166 psa_outvec out_vec[] = {
1167 {.base = &(generator->handle), .len = sizeof(uint32_t)},
1168 };
1169
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001170 status = API_DISPATCH(tfm_crypto_key_agreement,
1171 TFM_CRYPTO_KEY_AGREEMENT);
1172
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001173 return status;
1174}
1175
1176psa_status_t psa_generate_random(uint8_t *output,
1177 size_t output_size)
1178{
1179 psa_status_t status;
1180 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001181 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001182 };
1183
1184 psa_invec in_vec[] = {
1185 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1186 };
1187
1188 psa_outvec out_vec[] = {
1189 {.base = output, .len = output_size},
1190 };
1191
1192 if (output_size == 0) {
1193 return PSA_SUCCESS;
1194 }
1195
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001196 status = API_DISPATCH(tfm_crypto_generate_random,
1197 TFM_CRYPTO_GENERATE_RANDOM);
1198
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001199 return status;
1200}
1201
1202psa_status_t psa_generate_key(psa_key_handle_t handle,
1203 psa_key_type_t type,
1204 size_t bits,
1205 const void *extra,
1206 size_t extra_size)
1207{
1208 psa_status_t status;
1209 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001210 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001211 .key_handle = handle,
1212 .type = type,
1213 };
1214
1215 /* Sanitize the optional input */
1216 if ((extra == NULL) && (extra_size != 0)) {
1217 return PSA_ERROR_INVALID_ARGUMENT;
1218 }
1219
1220 psa_invec in_vec[] = {
1221 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1222 {.base = &bits, .len = sizeof(size_t)},
1223 {.base = extra, .len = extra_size},
1224 };
1225
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001226 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_generate_key,
1227 TFM_CRYPTO_GENERATE_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001228
1229 return status;
1230}