blob: 87c1a64631386aa34a3db86f40cc04d21b3b006f [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{
Jamie Foxdadb4e82019-09-03 17:59:41 +010056 const struct tfm_crypto_pack_iovec iov = {
57 .sfn_id = TFM_CRYPTO_OPEN_KEY_SID,
58 .lifetime = lifetime,
59 };
60 psa_invec in_vec[] = {
61 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
62 {.base = &id, .len = sizeof(psa_key_id_t)},
63 };
64 psa_outvec out_vec[] = {
65 {.base = handle, .len = sizeof(psa_key_handle_t)},
66 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010067
Jamie Foxdadb4e82019-09-03 17:59:41 +010068 return API_DISPATCH(tfm_crypto_open_key,
69 TFM_CRYPTO_OPEN_KEY);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010070}
71
72psa_status_t psa_create_key(psa_key_lifetime_t lifetime,
73 psa_key_id_t id,
74 psa_key_handle_t *handle)
75{
76 (void)lifetime;
77 (void)id;
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_close_key(psa_key_handle_t handle)
85{
Jamie Foxdadb4e82019-09-03 17:59:41 +010086 const struct tfm_crypto_pack_iovec iov = {
87 .sfn_id = TFM_CRYPTO_CLOSE_KEY_SID,
88 .key_handle = handle,
89 };
90 psa_invec in_vec[] = {
91 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
92 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010093
Jamie Foxdadb4e82019-09-03 17:59:41 +010094 return API_DISPATCH_NO_OUTVEC(tfm_crypto_close_key,
95 TFM_CRYPTO_CLOSE_KEY);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010096}
97
98psa_status_t psa_import_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +010099 psa_key_type_t type,
100 const uint8_t *data,
101 size_t data_length)
102{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000103 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100104 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800105 .sfn_id = TFM_CRYPTO_IMPORT_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100106 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100107 .type = type,
108 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000109 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100110 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000111 {.base = data, .len = data_length}
112 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100113
Antonio de Angelis4743e672019-04-11 11:38:48 +0100114 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_import_key,
115 TFM_CRYPTO_IMPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100116
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000117 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100118}
119
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100120psa_status_t psa_destroy_key(psa_key_handle_t handle)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100121{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000122 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100123 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800124 .sfn_id = TFM_CRYPTO_DESTROY_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100125 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100126 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000127 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100128 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000129 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100130
Antonio de Angelis4743e672019-04-11 11:38:48 +0100131 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_destroy_key,
132 TFM_CRYPTO_DESTROY_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100133
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000134 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100135}
136
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100137psa_status_t psa_get_key_information(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100138 psa_key_type_t *type,
139 size_t *bits)
140{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000141 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100142 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800143 .sfn_id = TFM_CRYPTO_GET_KEY_INFORMATION_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100144 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100145 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000146 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100147 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000148 };
149 psa_outvec out_vec[] = {
150 {.base = type, .len = sizeof(psa_key_type_t)},
151 {.base = bits, .len = sizeof(size_t)}
152 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100153
Antonio de Angelis4743e672019-04-11 11:38:48 +0100154 status = API_DISPATCH(tfm_crypto_get_key_information,
155 TFM_CRYPTO_GET_KEY_INFORMATION);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100156
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000157 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100158}
159
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100160psa_status_t psa_export_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100161 uint8_t *data,
162 size_t data_size,
163 size_t *data_length)
164{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000165 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100166 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800167 .sfn_id = TFM_CRYPTO_EXPORT_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100168 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100169 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000170 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100171 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000172 };
173 psa_outvec out_vec[] = {
174 {.base = data, .len = data_size}
175 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100176
Antonio de Angelis4743e672019-04-11 11:38:48 +0100177 status = API_DISPATCH(tfm_crypto_export_key,
178 TFM_CRYPTO_EXPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100179
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000180 *data_length = out_vec[0].len;
181
Antonio de Angelis4743e672019-04-11 11:38:48 +0100182
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000183 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100184}
185
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100186psa_status_t psa_export_public_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100187 uint8_t *data,
188 size_t data_size,
189 size_t *data_length)
190{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100191 psa_status_t status;
192 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800193 .sfn_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100194 .key_handle = handle,
195 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000196
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100197 psa_invec in_vec[] = {
198 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
199 };
200 psa_outvec out_vec[] = {
201 {.base = data, .len = data_size}
202 };
203
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100204 status = API_DISPATCH(tfm_crypto_export_public_key,
205 TFM_CRYPTO_EXPORT_PUBLIC_KEY);
206
207 *data_length = out_vec[0].len;
208
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100209 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100210}
211
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100212psa_status_t psa_copy_key(psa_key_handle_t source_handle,
213 psa_key_handle_t target_handle,
214 const psa_key_policy_t *constraint)
Jamie Foxefd82732018-11-26 10:34:32 +0000215{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100216 psa_status_t status;
217 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800218 .sfn_id = TFM_CRYPTO_COPY_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100219 .key_handle = source_handle,
220 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000221
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100222 psa_invec in_vec[] = {
223 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
224 {.base = &target_handle, .len = sizeof(psa_key_handle_t)},
225 {.base = constraint, .len = sizeof(psa_key_policy_t)},
226 };
227
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100228 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_copy_key,
229 TFM_CRYPTO_COPY_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100230
231 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000232}
233
234void psa_key_policy_set_usage(psa_key_policy_t *policy,
235 psa_key_usage_t usage,
236 psa_algorithm_t alg)
237{
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100238 policy->usage = usage;
239 policy->alg = alg;
Jamie Foxefd82732018-11-26 10:34:32 +0000240}
241
242psa_key_usage_t psa_key_policy_get_usage(const psa_key_policy_t *policy)
243{
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100244 return policy->usage;
Jamie Foxefd82732018-11-26 10:34:32 +0000245}
246
247psa_algorithm_t psa_key_policy_get_algorithm(const psa_key_policy_t *policy)
248{
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100249 return policy->alg;
Jamie Foxefd82732018-11-26 10:34:32 +0000250}
251
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100252psa_status_t psa_set_key_policy(psa_key_handle_t handle,
Jamie Foxefd82732018-11-26 10:34:32 +0000253 const psa_key_policy_t *policy)
254{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000255 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100256 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800257 .sfn_id = TFM_CRYPTO_SET_KEY_POLICY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100258 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100259 };
260
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000261 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100262 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000263 {.base = policy, .len = sizeof(psa_key_policy_t)},
264 };
Jamie Foxefd82732018-11-26 10:34:32 +0000265
Antonio de Angelis4743e672019-04-11 11:38:48 +0100266 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_set_key_policy,
267 TFM_CRYPTO_SET_KEY_POLICY);
Jamie Foxefd82732018-11-26 10:34:32 +0000268
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000269 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000270}
271
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100272psa_status_t psa_get_key_policy(psa_key_handle_t handle,
Jamie Foxefd82732018-11-26 10:34:32 +0000273 psa_key_policy_t *policy)
274{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000275 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100276 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800277 .sfn_id = TFM_CRYPTO_GET_KEY_POLICY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100278 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100279 };
280
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000281 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100282 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000283 };
284 psa_outvec out_vec[] = {
285 {.base = policy, .len = sizeof(psa_key_policy_t)},
286 };
Jamie Foxefd82732018-11-26 10:34:32 +0000287
Antonio de Angelis4743e672019-04-11 11:38:48 +0100288 status = API_DISPATCH(tfm_crypto_get_key_policy,
289 TFM_CRYPTO_GET_KEY_POLICY);
Jamie Foxefd82732018-11-26 10:34:32 +0000290
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000291 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000292}
293
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100294psa_status_t psa_get_key_lifetime(psa_key_handle_t handle,
Jamie Foxefd82732018-11-26 10:34:32 +0000295 psa_key_lifetime_t *lifetime)
296{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000297 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100298 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800299 .sfn_id = TFM_CRYPTO_GET_KEY_LIFETIME_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100300 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100301 };
302
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000303 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100304 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000305 };
306 psa_outvec out_vec[] = {
307 {.base = lifetime, .len = sizeof(psa_key_lifetime_t)},
308 };
Jamie Foxefd82732018-11-26 10:34:32 +0000309
Antonio de Angelis4743e672019-04-11 11:38:48 +0100310 status = API_DISPATCH(tfm_crypto_get_key_lifetime,
311 TFM_CRYPTO_GET_KEY_LIFETIME);
Jamie Foxefd82732018-11-26 10:34:32 +0000312
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000313 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000314}
315
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100316psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
317 unsigned char *iv,
318 size_t iv_size,
319 size_t *iv_length)
320{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100321 psa_status_t status;
322 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800323 .sfn_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100324 .op_handle = operation->handle,
325 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100326
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100327 psa_invec in_vec[] = {
328 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
329 };
330 psa_outvec out_vec[] = {
331 {.base = &(operation->handle), .len = sizeof(uint32_t)},
332 {.base = iv, .len = iv_size},
333 };
334
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100335 status = API_DISPATCH(tfm_crypto_cipher_generate_iv,
336 TFM_CRYPTO_CIPHER_GENERATE_IV);
337
338 *iv_length = out_vec[1].len;
339
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100340 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100341}
342
Antonio de Angelis377a1552018-11-22 17:02:40 +0000343psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
344 const unsigned char *iv,
345 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100346{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000347 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100348 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800349 .sfn_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100350 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100351 };
352
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000353 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100354 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000355 {.base = iv, .len = iv_length},
356 };
357 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100358 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000359 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100360
Antonio de Angelis4743e672019-04-11 11:38:48 +0100361 status = API_DISPATCH(tfm_crypto_cipher_set_iv,
362 TFM_CRYPTO_CIPHER_SET_IV);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100363
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000364 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100365}
366
Antonio de Angelis377a1552018-11-22 17:02:40 +0000367psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100368 psa_key_handle_t handle,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000369 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100370{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000371 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100372 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800373 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100374 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100375 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100376 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000377 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100378
Antonio de Angelis4743e672019-04-11 11:38:48 +0100379 psa_invec in_vec[] = {
380 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
381 };
382 psa_outvec out_vec[] = {
383 {.base = &(operation->handle), .len = sizeof(uint32_t)},
384 };
385
Antonio de Angelis4743e672019-04-11 11:38:48 +0100386 status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup,
387 TFM_CRYPTO_CIPHER_ENCRYPT_SETUP);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100388
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000389 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100390}
391
Antonio de Angelis377a1552018-11-22 17:02:40 +0000392psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100393 psa_key_handle_t handle,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000394 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100395{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000396 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100397 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800398 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100399 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100400 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100401 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000402 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100403
Antonio de Angelis4743e672019-04-11 11:38:48 +0100404 psa_invec in_vec[] = {
405 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
406 };
407 psa_outvec out_vec[] = {
408 {.base = &(operation->handle), .len = sizeof(uint32_t)},
409 };
410
Antonio de Angelis4743e672019-04-11 11:38:48 +0100411 status = API_DISPATCH(tfm_crypto_cipher_decrypt_setup,
412 TFM_CRYPTO_CIPHER_DECRYPT_SETUP);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100413
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000414 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100415}
416
417psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
418 const uint8_t *input,
419 size_t input_length,
420 unsigned char *output,
421 size_t output_size,
422 size_t *output_length)
423{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000424 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100425 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800426 .sfn_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100427 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100428 };
429
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000430 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100431 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000432 {.base = input, .len = input_length},
433 };
434 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100435 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000436 {.base = output, .len = output_size}
437 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100438
Antonio de Angelis4743e672019-04-11 11:38:48 +0100439 status = API_DISPATCH(tfm_crypto_cipher_update,
440 TFM_CRYPTO_CIPHER_UPDATE);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100441
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000442 *output_length = out_vec[1].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100443
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000444 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100445}
446
447psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
448{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000449 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100450 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800451 .sfn_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100452 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000453 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100454
Antonio de Angelis4743e672019-04-11 11:38:48 +0100455 psa_invec in_vec[] = {
456 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
457 };
458 psa_outvec out_vec[] = {
459 {.base = &(operation->handle), .len = sizeof(uint32_t)},
460 };
461
Antonio de Angelis4743e672019-04-11 11:38:48 +0100462 status = API_DISPATCH(tfm_crypto_cipher_abort,
463 TFM_CRYPTO_CIPHER_ABORT);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100464
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000465 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100466}
467
468psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
469 uint8_t *output,
470 size_t output_size,
471 size_t *output_length)
472{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000473 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100474 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800475 .sfn_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100476 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100477 };
478
479 psa_invec in_vec[] = {
480 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
481 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000482 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100483 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000484 {.base = output, .len = output_size},
485 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100486
Antonio de Angelis4743e672019-04-11 11:38:48 +0100487 status = API_DISPATCH(tfm_crypto_cipher_finish,
488 TFM_CRYPTO_CIPHER_FINISH);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100489
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000490 *output_length = out_vec[1].len;
491
492 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100493}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100494
Antonio de Angelis377a1552018-11-22 17:02:40 +0000495psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100496 psa_algorithm_t alg)
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_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100501 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100502 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000503 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100504
Antonio de Angelis4743e672019-04-11 11:38:48 +0100505 psa_invec in_vec[] = {
506 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
507 };
508 psa_outvec out_vec[] = {
509 {.base = &(operation->handle), .len = sizeof(uint32_t)},
510 };
511
Antonio de Angelis4743e672019-04-11 11:38:48 +0100512 status = API_DISPATCH(tfm_crypto_hash_setup,
513 TFM_CRYPTO_HASH_SETUP);
514
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000515 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100516}
517
518psa_status_t psa_hash_update(psa_hash_operation_t *operation,
519 const uint8_t *input,
520 size_t input_length)
521{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000522 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100523 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800524 .sfn_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100525 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100526 };
527
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000528 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100529 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000530 {.base = input, .len = input_length},
531 };
532 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100533 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000534 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100535
Antonio de Angelis4743e672019-04-11 11:38:48 +0100536 status = API_DISPATCH(tfm_crypto_hash_update,
537 TFM_CRYPTO_HASH_UPDATE);
538
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000539 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100540}
541
542psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
543 uint8_t *hash,
544 size_t hash_size,
545 size_t *hash_length)
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_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100550 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100551 };
552
553 psa_invec in_vec[] = {
554 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
555 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000556 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100557 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000558 {.base = hash, .len = hash_size},
559 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100560
Antonio de Angelis4743e672019-04-11 11:38:48 +0100561 status = API_DISPATCH(tfm_crypto_hash_finish,
562 TFM_CRYPTO_HASH_FINISH);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100563
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000564 *hash_length = out_vec[1].len;
565
566 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100567}
568
569psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
570 const uint8_t *hash,
571 size_t hash_length)
572{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000573 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100574 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800575 .sfn_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100576 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100577 };
578
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000579 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100580 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000581 {.base = hash, .len = hash_length},
582 };
583 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100584 {.base = &(operation->handle), .len = sizeof(uint32_t)},
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 status = API_DISPATCH(tfm_crypto_hash_verify,
588 TFM_CRYPTO_HASH_VERIFY);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100589
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000590 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100591}
592
593psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
594{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000595 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100596 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800597 .sfn_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100598 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000599 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100600
Antonio de Angelis4743e672019-04-11 11:38:48 +0100601 psa_invec in_vec[] = {
602 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
603 };
604 psa_outvec out_vec[] = {
605 {.base = &(operation->handle), .len = sizeof(uint32_t)},
606 };
607
Antonio de Angelis4743e672019-04-11 11:38:48 +0100608 status = API_DISPATCH(tfm_crypto_hash_abort,
609 TFM_CRYPTO_HASH_ABORT);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100610
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000611 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100612}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100613
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100614psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
615 psa_hash_operation_t *target_operation)
616{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100617 psa_status_t status;
618 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800619 .sfn_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100620 .op_handle = source_operation->handle,
621 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100622
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100623 psa_invec in_vec[] = {
624 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
625 };
626 psa_outvec out_vec[] = {
627 {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
628 };
629
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100630 status = API_DISPATCH(tfm_crypto_hash_clone,
631 TFM_CRYPTO_HASH_CLONE);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100632
633 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100634}
635
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100636psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100637 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100638 psa_algorithm_t alg)
639{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000640 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100641 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800642 .sfn_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100643 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100644 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100645 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000646 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100647
Antonio de Angelis4743e672019-04-11 11:38:48 +0100648 psa_invec in_vec[] = {
649 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
650 };
651 psa_outvec out_vec[] = {
652 {.base = &(operation->handle), .len = sizeof(uint32_t)},
653 };
654
Antonio de Angelis4743e672019-04-11 11:38:48 +0100655 status = API_DISPATCH(tfm_crypto_mac_sign_setup,
656 TFM_CRYPTO_MAC_SIGN_SETUP);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100657
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000658 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100659}
660
661psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100662 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100663 psa_algorithm_t alg)
664{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000665 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100666 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800667 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100668 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100669 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100670 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000671 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100672
Antonio de Angelis4743e672019-04-11 11:38:48 +0100673 psa_invec in_vec[] = {
674 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
675 };
676 psa_outvec out_vec[] = {
677 {.base = &(operation->handle), .len = sizeof(uint32_t)},
678 };
679
Antonio de Angelis4743e672019-04-11 11:38:48 +0100680 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
681 TFM_CRYPTO_MAC_VERIFY_SETUP);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100682
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000683 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100684}
685
686psa_status_t psa_mac_update(psa_mac_operation_t *operation,
687 const uint8_t *input,
688 size_t input_length)
689{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000690 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100691 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800692 .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100693 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100694 };
695
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000696 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100697 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000698 {.base = input, .len = input_length},
699 };
700 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100701 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000702 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100703
Antonio de Angelis4743e672019-04-11 11:38:48 +0100704 status = API_DISPATCH(tfm_crypto_mac_update,
705 TFM_CRYPTO_MAC_UPDATE);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100706
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000707 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100708}
709
710psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
711 uint8_t *mac,
712 size_t mac_size,
713 size_t *mac_length)
714{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000715 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100716 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800717 .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100718 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100719 };
720
721 psa_invec in_vec[] = {
722 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
723 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000724 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100725 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000726 {.base = mac, .len = mac_size},
727 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100728
Antonio de Angelis4743e672019-04-11 11:38:48 +0100729 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
730 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100731
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000732 *mac_length = out_vec[1].len;
733
734 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100735}
736
737psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
738 const uint8_t *mac,
739 size_t mac_length)
740{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000741 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100742 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800743 .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100744 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100745 };
746
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000747 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100748 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000749 {.base = mac, .len = mac_length},
750 };
751 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100752 {.base = &(operation->handle), .len = sizeof(uint32_t)},
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 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
756 TFM_CRYPTO_MAC_VERIFY_FINISH);
757
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000758 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100759}
760
761psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
762{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000763 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100764 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800765 .sfn_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100766 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000767 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100768
Antonio de Angelis4743e672019-04-11 11:38:48 +0100769 psa_invec in_vec[] = {
770 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
771 };
772 psa_outvec out_vec[] = {
773 {.base = &(operation->handle), .len = sizeof(uint32_t)},
774 };
775
Antonio de Angelis4743e672019-04-11 11:38:48 +0100776 status = API_DISPATCH(tfm_crypto_mac_abort,
777 TFM_CRYPTO_MAC_ABORT);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100778
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000779 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100780}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000781
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100782psa_status_t psa_aead_encrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000783 psa_algorithm_t alg,
784 const uint8_t *nonce,
785 size_t nonce_length,
786 const uint8_t *additional_data,
787 size_t additional_data_length,
788 const uint8_t *plaintext,
789 size_t plaintext_length,
790 uint8_t *ciphertext,
791 size_t ciphertext_size,
792 size_t *ciphertext_length)
793{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000794 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100795 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800796 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100797 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100798 .alg = alg,
799 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000800 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100801
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100802 /* Sanitize the optional input */
803 if ((additional_data == NULL) && (additional_data_length != 0)) {
804 return PSA_ERROR_INVALID_ARGUMENT;
805 }
806
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000807 size_t idx = 0;
808 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100809 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000810 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100811 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000812 };
813 psa_outvec out_vec[] = {
814 {.base = ciphertext, .len = ciphertext_size},
815 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000816
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000817 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
818 return PSA_ERROR_INVALID_ARGUMENT;
819 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000820
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000821 if (nonce != NULL) {
822 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100823 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000824 }
825 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000826
Antonio de Angelis4743e672019-04-11 11:38:48 +0100827 status = API_DISPATCH(tfm_crypto_aead_encrypt,
828 TFM_CRYPTO_AEAD_ENCRYPT);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000829
830 *ciphertext_length = out_vec[0].len;
831
832 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000833}
834
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100835psa_status_t psa_aead_decrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000836 psa_algorithm_t alg,
837 const uint8_t *nonce,
838 size_t nonce_length,
839 const uint8_t *additional_data,
840 size_t additional_data_length,
841 const uint8_t *ciphertext,
842 size_t ciphertext_length,
843 uint8_t *plaintext,
844 size_t plaintext_size,
845 size_t *plaintext_length)
846{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000847 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100848 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800849 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100850 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100851 .alg = alg,
852 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000853 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100854
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100855 /* Sanitize the optional input */
856 if ((additional_data == NULL) && (additional_data_length != 0)) {
857 return PSA_ERROR_INVALID_ARGUMENT;
858 }
859
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000860 size_t idx = 0;
861 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100862 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000863 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100864 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000865 };
866 psa_outvec out_vec[] = {
867 {.base = plaintext, .len = plaintext_size},
868 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000869
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000870 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
871 return PSA_ERROR_INVALID_ARGUMENT;
872 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000873
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000874 if (nonce != NULL) {
875 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100876 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000877 }
878 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000879
Antonio de Angelis4743e672019-04-11 11:38:48 +0100880 status = API_DISPATCH(tfm_crypto_aead_decrypt,
881 TFM_CRYPTO_AEAD_DECRYPT);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000882
883 *plaintext_length = out_vec[0].len;
884
885 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000886}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100887
888psa_status_t psa_asymmetric_sign(psa_key_handle_t handle,
889 psa_algorithm_t alg,
890 const uint8_t *hash,
891 size_t hash_length,
892 uint8_t *signature,
893 size_t signature_size,
894 size_t *signature_length)
895{
896 psa_status_t status;
897 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800898 .sfn_id = TFM_CRYPTO_ASYMMETRIC_SIGN_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100899 .key_handle = handle,
900 .alg = alg,
901 };
902
903 psa_invec in_vec[] = {
904 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
905 {.base = hash, .len = hash_length},
906 };
907 psa_outvec out_vec[] = {
908 {.base = signature, .len = signature_size},
909 };
910
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100911 status = API_DISPATCH(tfm_crypto_asymmetric_sign,
912 TFM_CRYPTO_ASYMMETRIC_SIGN);
913
914 *signature_length = out_vec[0].len;
915
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100916 return status;
917}
918
919psa_status_t psa_asymmetric_verify(psa_key_handle_t handle,
920 psa_algorithm_t alg,
921 const uint8_t *hash,
922 size_t hash_length,
923 const uint8_t *signature,
924 size_t signature_length)
925{
926 psa_status_t status;
927 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800928 .sfn_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100929 .key_handle = handle,
930 .alg = alg
931 };
932
933 psa_invec in_vec[] = {
934 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
935 {.base = hash, .len = hash_length},
936 {.base = signature, .len = signature_length}
937 };
938
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100939 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_asymmetric_verify,
940 TFM_CRYPTO_ASYMMETRIC_VERIFY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100941
942 return status;
943}
944
945psa_status_t psa_asymmetric_encrypt(psa_key_handle_t handle,
946 psa_algorithm_t alg,
947 const uint8_t *input,
948 size_t input_length,
949 const uint8_t *salt,
950 size_t salt_length,
951 uint8_t *output,
952 size_t output_size,
953 size_t *output_length)
954{
955 psa_status_t status;
956 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800957 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100958 .key_handle = handle,
959 .alg = alg
960 };
961
962 /* Sanitize the optional input */
963 if ((salt == NULL) && (salt_length != 0)) {
964 return PSA_ERROR_INVALID_ARGUMENT;
965 }
966
967 psa_invec in_vec[] = {
968 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
969 {.base = input, .len = input_length},
970 {.base = salt, .len = salt_length}
971 };
972
973 psa_outvec out_vec[] = {
974 {.base = output, .len = output_size},
975 };
976
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100977 status = API_DISPATCH(tfm_crypto_asymmetric_encrypt,
978 TFM_CRYPTO_ASYMMETRIC_ENCRYPT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100979
980 *output_length = out_vec[0].len;
981
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100982 return status;
983}
984
985psa_status_t psa_asymmetric_decrypt(psa_key_handle_t handle,
986 psa_algorithm_t alg,
987 const uint8_t *input,
988 size_t input_length,
989 const uint8_t *salt,
990 size_t salt_length,
991 uint8_t *output,
992 size_t output_size,
993 size_t *output_length)
994{
995 psa_status_t status;
996 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800997 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100998 .key_handle = handle,
999 .alg = alg
1000 };
1001
1002 /* Sanitize the optional input */
1003 if ((salt == NULL) && (salt_length != 0)) {
1004 return PSA_ERROR_INVALID_ARGUMENT;
1005 }
1006
1007 psa_invec in_vec[] = {
1008 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1009 {.base = input, .len = input_length},
1010 {.base = salt, .len = salt_length}
1011 };
1012
1013 psa_outvec out_vec[] = {
1014 {.base = output, .len = output_size},
1015 };
1016
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001017 status = API_DISPATCH(tfm_crypto_asymmetric_decrypt,
1018 TFM_CRYPTO_ASYMMETRIC_DECRYPT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001019
1020 *output_length = out_vec[0].len;
1021
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001022 return status;
1023}
1024
1025psa_status_t psa_get_generator_capacity(const psa_crypto_generator_t *generator,
1026 size_t *capacity)
1027{
1028 psa_status_t status;
1029 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001030 .sfn_id = TFM_CRYPTO_GET_GENERATOR_CAPACITY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001031 .op_handle = generator->handle,
1032 };
1033
1034 psa_invec in_vec[] = {
1035 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1036 };
1037
1038 psa_outvec out_vec[] = {
1039 {.base = capacity, .len = sizeof(size_t)},
1040 };
1041
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001042 status = API_DISPATCH(tfm_crypto_get_generator_capacity,
1043 TFM_CRYPTO_GET_GENERATOR_CAPACITY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001044
1045 return status;
1046}
1047
1048psa_status_t psa_generator_read(psa_crypto_generator_t *generator,
1049 uint8_t *output,
1050 size_t output_length)
1051{
1052 psa_status_t status;
1053 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001054 .sfn_id = TFM_CRYPTO_GENERATOR_READ_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001055 .op_handle = generator->handle,
1056 };
1057
1058 psa_invec in_vec[] = {
1059 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1060 };
1061
1062 psa_outvec out_vec[] = {
1063 {.base = output, .len = output_length},
1064 };
1065
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001066 status = API_DISPATCH(tfm_crypto_generator_read,
1067 TFM_CRYPTO_GENERATOR_READ);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001068
1069 return status;
1070}
1071
1072psa_status_t psa_generator_import_key(psa_key_handle_t handle,
1073 psa_key_type_t type,
1074 size_t bits,
1075 psa_crypto_generator_t *generator)
1076{
1077 psa_status_t status;
1078 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001079 .sfn_id = TFM_CRYPTO_GENERATOR_IMPORT_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001080 .key_handle = handle,
1081 .type = type,
1082 .op_handle = generator->handle,
1083 };
1084
1085 psa_invec in_vec[] = {
1086 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1087 {.base = &bits, .len = sizeof(size_t)},
1088 };
1089
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001090 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_generator_import_key,
1091 TFM_CRYPTO_GENERATOR_IMPORT_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001092
1093 return status;
1094}
1095
1096psa_status_t psa_generator_abort(psa_crypto_generator_t *generator)
1097{
1098 psa_status_t status;
1099 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001100 .sfn_id = TFM_CRYPTO_GENERATOR_ABORT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001101 .op_handle = generator->handle,
1102 };
1103
1104 psa_invec in_vec[] = {
1105 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1106 };
1107
1108 psa_outvec out_vec[] = {
1109 {.base = &(generator->handle), .len = sizeof(uint32_t)},
1110 };
1111
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001112 status = API_DISPATCH(tfm_crypto_generator_abort,
1113 TFM_CRYPTO_GENERATOR_ABORT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001114
1115 return status;
1116}
1117
1118psa_status_t psa_key_derivation(psa_crypto_generator_t *generator,
1119 psa_key_handle_t handle,
1120 psa_algorithm_t alg,
1121 const uint8_t *salt,
1122 size_t salt_length,
1123 const uint8_t *label,
1124 size_t label_length,
1125 size_t capacity)
1126{
1127 psa_status_t status;
1128 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001129 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001130 .key_handle = handle,
1131 .alg = alg,
1132 .op_handle = generator->handle,
1133 .capacity = capacity,
1134 };
1135
1136 /* Sanitize the optional input */
1137 if ((salt == NULL) && (salt_length != 0)) {
1138 return PSA_ERROR_INVALID_ARGUMENT;
1139 }
1140
1141 if ((label == NULL) && (label_length != 0)) {
1142 return PSA_ERROR_INVALID_ARGUMENT;
1143 }
1144
1145 psa_invec in_vec[] = {
1146 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1147 {.base = salt, .len = salt_length},
1148 {.base = label, .len = label_length},
1149 };
1150
1151 psa_outvec out_vec[] = {
1152 {.base = &(generator->handle), .len = sizeof(uint32_t)},
1153 };
1154
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001155 status = API_DISPATCH(tfm_crypto_key_derivation,
1156 TFM_CRYPTO_KEY_DERIVATION);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001157
1158 return status;
1159}
1160
1161psa_status_t psa_key_agreement(psa_crypto_generator_t *generator,
1162 psa_key_handle_t private_key,
1163 const uint8_t *peer_key,
1164 size_t peer_key_length,
1165 psa_algorithm_t alg)
1166{
1167 psa_status_t status;
1168 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001169 .sfn_id = TFM_CRYPTO_KEY_AGREEMENT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001170 .key_handle = private_key,
1171 .alg = alg,
1172 .op_handle = generator->handle,
1173 };
1174
1175 psa_invec in_vec[] = {
1176 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1177 {.base = peer_key, .len = peer_key_length},
1178 };
1179
1180 psa_outvec out_vec[] = {
1181 {.base = &(generator->handle), .len = sizeof(uint32_t)},
1182 };
1183
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001184 status = API_DISPATCH(tfm_crypto_key_agreement,
1185 TFM_CRYPTO_KEY_AGREEMENT);
1186
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001187 return status;
1188}
1189
1190psa_status_t psa_generate_random(uint8_t *output,
1191 size_t output_size)
1192{
1193 psa_status_t status;
1194 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001195 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001196 };
1197
1198 psa_invec in_vec[] = {
1199 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1200 };
1201
1202 psa_outvec out_vec[] = {
1203 {.base = output, .len = output_size},
1204 };
1205
1206 if (output_size == 0) {
1207 return PSA_SUCCESS;
1208 }
1209
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001210 status = API_DISPATCH(tfm_crypto_generate_random,
1211 TFM_CRYPTO_GENERATE_RANDOM);
1212
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001213 return status;
1214}
1215
1216psa_status_t psa_generate_key(psa_key_handle_t handle,
1217 psa_key_type_t type,
1218 size_t bits,
1219 const void *extra,
1220 size_t extra_size)
1221{
1222 psa_status_t status;
1223 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001224 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001225 .key_handle = handle,
1226 .type = type,
1227 };
1228
1229 /* Sanitize the optional input */
1230 if ((extra == NULL) && (extra_size != 0)) {
1231 return PSA_ERROR_INVALID_ARGUMENT;
1232 }
1233
1234 psa_invec in_vec[] = {
1235 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1236 {.base = &bits, .len = sizeof(size_t)},
1237 {.base = extra, .len = extra_size},
1238 };
1239
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001240 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_generate_key,
1241 TFM_CRYPTO_GENERATE_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001242
1243 return status;
1244}