blob: cf6152c200e1921c4d32afa74d944b508ae67d1f [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"
Edison Aicc4c6162019-06-21 13:52:49 +080012#include "psa_manifest/sid.h"
Kevin Peng9449a362019-07-29 16:05:42 +080013#include "psa/client.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000014
Antonio de Angelis4743e672019-04-11 11:38:48 +010015#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000016
Jamie Fox0e54ebc2019-04-09 14:21:04 +010017#define PSA_CONNECT(service) \
18 psa_handle_t ipc_handle; \
Edison Aicc4c6162019-06-21 13:52:49 +080019 ipc_handle = psa_connect(service##_SID, service##_VERSION); \
Summer Qinb207a152019-07-03 16:36:49 +080020 if (!PSA_HANDLE_IS_VALID(ipc_handle)) { \
Jamie Fox0e54ebc2019-04-09 14:21:04 +010021 return PSA_ERROR_GENERIC_ERROR; \
22 } \
Antonio de Angelis4743e672019-04-11 11:38:48 +010023
Jamie Fox0e54ebc2019-04-09 14:21:04 +010024#define PSA_CLOSE() psa_close(ipc_handle)
Antonio de Angelis4743e672019-04-11 11:38:48 +010025
Jamie Fox0e54ebc2019-04-09 14:21:04 +010026#define API_DISPATCH(sfn_name, sfn_id) \
Summer Qin4b1d03b2019-07-02 14:56:08 +080027 psa_call(ipc_handle, PSA_IPC_CALL, \
Jamie Fox0e54ebc2019-04-09 14:21:04 +010028 in_vec, ARRAY_SIZE(in_vec), \
Antonio de Angelis4743e672019-04-11 11:38:48 +010029 out_vec, ARRAY_SIZE(out_vec))
30
Jamie Fox0e54ebc2019-04-09 14:21:04 +010031#define API_DISPATCH_NO_OUTVEC(sfn_name, sfn_id) \
Summer Qin4b1d03b2019-07-02 14:56:08 +080032 psa_call(ipc_handle, PSA_IPC_CALL, \
Jamie Fox0e54ebc2019-04-09 14:21:04 +010033 in_vec, ARRAY_SIZE(in_vec), \
Antonio de Angelis4743e672019-04-11 11:38:48 +010034 (psa_outvec *)NULL, 0)
Antonio de Angelis8908f472018-08-31 15:44:25 +010035
36psa_status_t psa_crypto_init(void)
37{
38 /* Service init is performed during TFM boot up,
39 * so application level initialisation is empty
40 */
41 return PSA_SUCCESS;
42}
43
Jamie Fox0e54ebc2019-04-09 14:21:04 +010044psa_status_t psa_allocate_key(psa_key_handle_t *handle)
45{
Antonio de Angelis7740b382019-07-16 10:59:25 +010046#if (TFM_CRYPTO_KEY_MODULE_DISABLED != 0)
47 return PSA_ERROR_NOT_SUPPORTED;
48#else
Jamie Fox0e54ebc2019-04-09 14:21:04 +010049 psa_status_t status;
50 const struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +080051 .sfn_id = TFM_CRYPTO_ALLOCATE_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +010052 };
53 psa_invec in_vec[] = {
54 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
55 };
56 psa_outvec out_vec[] = {
57 {.base = handle, .len = sizeof(psa_key_handle_t)},
58 };
59
Jamie Fox0e54ebc2019-04-09 14:21:04 +010060 PSA_CONNECT(TFM_CRYPTO);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010061
62 status = API_DISPATCH(tfm_crypto_allocate_key,
63 TFM_CRYPTO_ALLOCATE_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +080064
Jamie Fox0e54ebc2019-04-09 14:21:04 +010065 PSA_CLOSE();
Jamie Fox0e54ebc2019-04-09 14:21:04 +010066
67 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +010068#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +010069}
70
71psa_status_t psa_open_key(psa_key_lifetime_t lifetime,
72 psa_key_id_t id,
73 psa_key_handle_t *handle)
74{
Antonio de Angelis7740b382019-07-16 10:59:25 +010075#if (TFM_CRYPTO_KEY_MODULE_DISABLED != 0)
76 return PSA_ERROR_NOT_SUPPORTED;
77#else
Jamie Fox0e54ebc2019-04-09 14:21:04 +010078 (void)lifetime;
79 (void)id;
80 (void)handle;
81
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +010082 /* TODO: Persistent key APIs are not supported yet */
Jamie Fox0e54ebc2019-04-09 14:21:04 +010083 return PSA_ERROR_NOT_SUPPORTED;
Antonio de Angelis7740b382019-07-16 10:59:25 +010084#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +010085}
86
87psa_status_t psa_create_key(psa_key_lifetime_t lifetime,
88 psa_key_id_t id,
89 psa_key_handle_t *handle)
90{
Antonio de Angelis7740b382019-07-16 10:59:25 +010091#if (TFM_CRYPTO_KEY_MODULE_DISABLED != 0)
92 return PSA_ERROR_NOT_SUPPORTED;
93#else
Jamie Fox0e54ebc2019-04-09 14:21:04 +010094 (void)lifetime;
95 (void)id;
96 (void)handle;
97
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +010098 /* TODO: Persistent key APIs are not supported yet */
Jamie Fox0e54ebc2019-04-09 14:21:04 +010099 return PSA_ERROR_NOT_SUPPORTED;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100100#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100101}
102
103psa_status_t psa_close_key(psa_key_handle_t handle)
104{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100105#if (TFM_CRYPTO_KEY_MODULE_DISABLED != 0)
106 return PSA_ERROR_NOT_SUPPORTED;
107#else
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100108 (void)handle;
109
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100110 /* TODO: Persistent key APIs are not supported yet */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100111 return PSA_ERROR_NOT_SUPPORTED;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100112#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100113}
114
115psa_status_t psa_import_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100116 psa_key_type_t type,
117 const uint8_t *data,
118 size_t data_length)
119{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100120#if (TFM_CRYPTO_KEY_MODULE_DISABLED != 0)
121 return PSA_ERROR_NOT_SUPPORTED;
122#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000123 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100124 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800125 .sfn_id = TFM_CRYPTO_IMPORT_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100126 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100127 .type = type,
128 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000129 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100130 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000131 {.base = data, .len = data_length}
132 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100133
Antonio de Angelis4743e672019-04-11 11:38:48 +0100134 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100135
136 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_import_key,
137 TFM_CRYPTO_IMPORT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +0800138
Antonio de Angelis4743e672019-04-11 11:38:48 +0100139 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100140
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000141 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100142#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100143}
144
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100145psa_status_t psa_destroy_key(psa_key_handle_t handle)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100146{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100147#if (TFM_CRYPTO_KEY_MODULE_DISABLED != 0)
148 return PSA_ERROR_NOT_SUPPORTED;
149#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000150 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100151 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800152 .sfn_id = TFM_CRYPTO_DESTROY_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100153 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100154 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000155 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100156 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000157 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100158
Antonio de Angelis4743e672019-04-11 11:38:48 +0100159 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100160
161 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_destroy_key,
162 TFM_CRYPTO_DESTROY_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +0800163
Antonio de Angelis4743e672019-04-11 11:38:48 +0100164 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100165
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000166 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100167#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100168}
169
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100170psa_status_t psa_get_key_information(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100171 psa_key_type_t *type,
172 size_t *bits)
173{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100174#if (TFM_CRYPTO_KEY_MODULE_DISABLED != 0)
175 return PSA_ERROR_NOT_SUPPORTED;
176#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000177 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100178 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800179 .sfn_id = TFM_CRYPTO_GET_KEY_INFORMATION_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100180 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100181 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000182 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100183 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000184 };
185 psa_outvec out_vec[] = {
186 {.base = type, .len = sizeof(psa_key_type_t)},
187 {.base = bits, .len = sizeof(size_t)}
188 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100189
Antonio de Angelis4743e672019-04-11 11:38:48 +0100190 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100191
192 status = API_DISPATCH(tfm_crypto_get_key_information,
193 TFM_CRYPTO_GET_KEY_INFORMATION);
Kevin Peng9449a362019-07-29 16:05:42 +0800194
Antonio de Angelis4743e672019-04-11 11:38:48 +0100195 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100196
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000197 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100198#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100199}
200
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100201psa_status_t psa_export_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100202 uint8_t *data,
203 size_t data_size,
204 size_t *data_length)
205{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100206#if (TFM_CRYPTO_KEY_MODULE_DISABLED != 0)
207 return PSA_ERROR_NOT_SUPPORTED;
208#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000209 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100210 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800211 .sfn_id = TFM_CRYPTO_EXPORT_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100212 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100213 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000214 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100215 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000216 };
217 psa_outvec out_vec[] = {
218 {.base = data, .len = data_size}
219 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100220
Antonio de Angelis4743e672019-04-11 11:38:48 +0100221 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100222
223 status = API_DISPATCH(tfm_crypto_export_key,
224 TFM_CRYPTO_EXPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100225
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000226 *data_length = out_vec[0].len;
227
Antonio de Angelis4743e672019-04-11 11:38:48 +0100228 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100229
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000230 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100231#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100232}
233
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100234psa_status_t psa_export_public_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100235 uint8_t *data,
236 size_t data_size,
237 size_t *data_length)
238{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100239#if (TFM_CRYPTO_KEY_MODULE_DISABLED != 0)
240 return PSA_ERROR_NOT_SUPPORTED;
241#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100242 psa_status_t status;
243 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800244 .sfn_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100245 .key_handle = handle,
246 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000247
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100248 psa_invec in_vec[] = {
249 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
250 };
251 psa_outvec out_vec[] = {
252 {.base = data, .len = data_size}
253 };
254
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100255 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100256
257 status = API_DISPATCH(tfm_crypto_export_public_key,
258 TFM_CRYPTO_EXPORT_PUBLIC_KEY);
259
260 *data_length = out_vec[0].len;
261
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100262 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100263
264 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100265#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100266}
267
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100268psa_status_t psa_copy_key(psa_key_handle_t source_handle,
269 psa_key_handle_t target_handle,
270 const psa_key_policy_t *constraint)
Jamie Foxefd82732018-11-26 10:34:32 +0000271{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100272#if (TFM_CRYPTO_KEY_MODULE_DISABLED != 0)
273 return PSA_ERROR_NOT_SUPPORTED;
274#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100275 psa_status_t status;
276 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800277 .sfn_id = TFM_CRYPTO_COPY_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100278 .key_handle = source_handle,
279 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000280
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100281 psa_invec in_vec[] = {
282 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
283 {.base = &target_handle, .len = sizeof(psa_key_handle_t)},
284 {.base = constraint, .len = sizeof(psa_key_policy_t)},
285 };
286
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100287 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100288
289 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_copy_key,
290 TFM_CRYPTO_COPY_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +0800291
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100292 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100293
294 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100295#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Foxefd82732018-11-26 10:34:32 +0000296}
297
298void psa_key_policy_set_usage(psa_key_policy_t *policy,
299 psa_key_usage_t usage,
300 psa_algorithm_t alg)
301{
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100302 policy->usage = usage;
303 policy->alg = alg;
Jamie Foxefd82732018-11-26 10:34:32 +0000304}
305
306psa_key_usage_t psa_key_policy_get_usage(const psa_key_policy_t *policy)
307{
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100308 return policy->usage;
Jamie Foxefd82732018-11-26 10:34:32 +0000309}
310
311psa_algorithm_t psa_key_policy_get_algorithm(const psa_key_policy_t *policy)
312{
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100313 return policy->alg;
Jamie Foxefd82732018-11-26 10:34:32 +0000314}
315
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100316psa_status_t psa_set_key_policy(psa_key_handle_t handle,
Jamie Foxefd82732018-11-26 10:34:32 +0000317 const psa_key_policy_t *policy)
318{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100319#if (TFM_CRYPTO_KEY_MODULE_DISABLED != 0)
320 return PSA_ERROR_NOT_SUPPORTED;
321#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000322 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100323 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800324 .sfn_id = TFM_CRYPTO_SET_KEY_POLICY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100325 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100326 };
327
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000328 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100329 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000330 {.base = policy, .len = sizeof(psa_key_policy_t)},
331 };
Jamie Foxefd82732018-11-26 10:34:32 +0000332
Antonio de Angelis4743e672019-04-11 11:38:48 +0100333 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100334
335 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_set_key_policy,
336 TFM_CRYPTO_SET_KEY_POLICY);
Kevin Peng9449a362019-07-29 16:05:42 +0800337
Antonio de Angelis4743e672019-04-11 11:38:48 +0100338 PSA_CLOSE();
Jamie Foxefd82732018-11-26 10:34:32 +0000339
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000340 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100341#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Foxefd82732018-11-26 10:34:32 +0000342}
343
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100344psa_status_t psa_get_key_policy(psa_key_handle_t handle,
Jamie Foxefd82732018-11-26 10:34:32 +0000345 psa_key_policy_t *policy)
346{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100347#if (TFM_CRYPTO_KEY_MODULE_DISABLED != 0)
348 return PSA_ERROR_NOT_SUPPORTED;
349#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000350 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100351 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800352 .sfn_id = TFM_CRYPTO_GET_KEY_POLICY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100353 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100354 };
355
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000356 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100357 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000358 };
359 psa_outvec out_vec[] = {
360 {.base = policy, .len = sizeof(psa_key_policy_t)},
361 };
Jamie Foxefd82732018-11-26 10:34:32 +0000362
Antonio de Angelis4743e672019-04-11 11:38:48 +0100363 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100364
365 status = API_DISPATCH(tfm_crypto_get_key_policy,
366 TFM_CRYPTO_GET_KEY_POLICY);
Kevin Peng9449a362019-07-29 16:05:42 +0800367
Antonio de Angelis4743e672019-04-11 11:38:48 +0100368 PSA_CLOSE();
Jamie Foxefd82732018-11-26 10:34:32 +0000369
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000370 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100371#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Foxefd82732018-11-26 10:34:32 +0000372}
373
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100374psa_status_t psa_get_key_lifetime(psa_key_handle_t handle,
Jamie Foxefd82732018-11-26 10:34:32 +0000375 psa_key_lifetime_t *lifetime)
376{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100377#if (TFM_CRYPTO_KEY_MODULE_DISABLED != 0)
378 return PSA_ERROR_NOT_SUPPORTED;
379#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000380 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100381 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800382 .sfn_id = TFM_CRYPTO_GET_KEY_LIFETIME_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100383 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100384 };
385
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000386 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100387 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000388 };
389 psa_outvec out_vec[] = {
390 {.base = lifetime, .len = sizeof(psa_key_lifetime_t)},
391 };
Jamie Foxefd82732018-11-26 10:34:32 +0000392
Antonio de Angelis4743e672019-04-11 11:38:48 +0100393 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100394
395 status = API_DISPATCH(tfm_crypto_get_key_lifetime,
396 TFM_CRYPTO_GET_KEY_LIFETIME);
Kevin Peng9449a362019-07-29 16:05:42 +0800397
Antonio de Angelis4743e672019-04-11 11:38:48 +0100398 PSA_CLOSE();
Jamie Foxefd82732018-11-26 10:34:32 +0000399
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000400 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100401#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Foxefd82732018-11-26 10:34:32 +0000402}
403
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100404psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
405 unsigned char *iv,
406 size_t iv_size,
407 size_t *iv_length)
408{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100409#if (TFM_CRYPTO_CIPHER_MODULE_DISABLED != 0)
410 return PSA_ERROR_NOT_SUPPORTED;
411#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100412 psa_status_t status;
413 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800414 .sfn_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100415 .op_handle = operation->handle,
416 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100417
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100418 psa_invec in_vec[] = {
419 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
420 };
421 psa_outvec out_vec[] = {
422 {.base = &(operation->handle), .len = sizeof(uint32_t)},
423 {.base = iv, .len = iv_size},
424 };
425
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100426 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100427
428 status = API_DISPATCH(tfm_crypto_cipher_generate_iv,
429 TFM_CRYPTO_CIPHER_GENERATE_IV);
430
431 *iv_length = out_vec[1].len;
432
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100433 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100434
435 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100436#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100437}
438
Antonio de Angelis377a1552018-11-22 17:02:40 +0000439psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
440 const unsigned char *iv,
441 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100442{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100443#if (TFM_CRYPTO_CIPHER_MODULE_DISABLED != 0)
444 return PSA_ERROR_NOT_SUPPORTED;
445#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000446 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100447 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800448 .sfn_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100449 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100450 };
451
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000452 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100453 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000454 {.base = iv, .len = iv_length},
455 };
456 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100457 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000458 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100459
Antonio de Angelis4743e672019-04-11 11:38:48 +0100460 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100461
462 status = API_DISPATCH(tfm_crypto_cipher_set_iv,
463 TFM_CRYPTO_CIPHER_SET_IV);
Kevin Peng9449a362019-07-29 16:05:42 +0800464
Antonio de Angelis4743e672019-04-11 11:38:48 +0100465 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100466
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000467 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100468#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100469}
470
Antonio de Angelis377a1552018-11-22 17:02:40 +0000471psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100472 psa_key_handle_t handle,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000473 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100474{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100475#if (TFM_CRYPTO_CIPHER_MODULE_DISABLED != 0)
476 return PSA_ERROR_NOT_SUPPORTED;
477#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000478 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100479 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800480 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100481 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100482 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100483 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000484 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100485
Antonio de Angelis4743e672019-04-11 11:38:48 +0100486 psa_invec in_vec[] = {
487 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
488 };
489 psa_outvec out_vec[] = {
490 {.base = &(operation->handle), .len = sizeof(uint32_t)},
491 };
492
Antonio de Angelis4743e672019-04-11 11:38:48 +0100493 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100494
495 status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup,
496 TFM_CRYPTO_CIPHER_ENCRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800497
Antonio de Angelis4743e672019-04-11 11:38:48 +0100498 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100499
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000500 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100501#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100502}
503
Antonio de Angelis377a1552018-11-22 17:02:40 +0000504psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100505 psa_key_handle_t handle,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000506 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100507{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100508#if (TFM_CRYPTO_CIPHER_MODULE_DISABLED != 0)
509 return PSA_ERROR_NOT_SUPPORTED;
510#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000511 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100512 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800513 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100514 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100515 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100516 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000517 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100518
Antonio de Angelis4743e672019-04-11 11:38:48 +0100519 psa_invec in_vec[] = {
520 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
521 };
522 psa_outvec out_vec[] = {
523 {.base = &(operation->handle), .len = sizeof(uint32_t)},
524 };
525
Antonio de Angelis4743e672019-04-11 11:38:48 +0100526 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100527
528 status = API_DISPATCH(tfm_crypto_cipher_decrypt_setup,
529 TFM_CRYPTO_CIPHER_DECRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800530
Antonio de Angelis4743e672019-04-11 11:38:48 +0100531 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100532
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000533 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100534#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100535}
536
537psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
538 const uint8_t *input,
539 size_t input_length,
540 unsigned char *output,
541 size_t output_size,
542 size_t *output_length)
543{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100544#if (TFM_CRYPTO_CIPHER_MODULE_DISABLED != 0)
545 return PSA_ERROR_NOT_SUPPORTED;
546#else
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_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100550 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100551 };
552
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000553 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100554 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000555 {.base = input, .len = input_length},
556 };
557 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100558 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000559 {.base = output, .len = output_size}
560 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100561
Antonio de Angelis4743e672019-04-11 11:38:48 +0100562 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100563
564 status = API_DISPATCH(tfm_crypto_cipher_update,
565 TFM_CRYPTO_CIPHER_UPDATE);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100566
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000567 *output_length = out_vec[1].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100568
Antonio de Angelis4743e672019-04-11 11:38:48 +0100569 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100570
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000571 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100572#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100573}
574
575psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
576{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100577#if (TFM_CRYPTO_CIPHER_MODULE_DISABLED != 0)
578 return PSA_ERROR_NOT_SUPPORTED;
579#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000580 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100581 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800582 .sfn_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100583 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000584 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100585
Antonio de Angelis4743e672019-04-11 11:38:48 +0100586 psa_invec in_vec[] = {
587 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
588 };
589 psa_outvec out_vec[] = {
590 {.base = &(operation->handle), .len = sizeof(uint32_t)},
591 };
592
Antonio de Angelis4743e672019-04-11 11:38:48 +0100593 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100594
595 status = API_DISPATCH(tfm_crypto_cipher_abort,
596 TFM_CRYPTO_CIPHER_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800597
Antonio de Angelis4743e672019-04-11 11:38:48 +0100598 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100599
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000600 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100601#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100602}
603
604psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
605 uint8_t *output,
606 size_t output_size,
607 size_t *output_length)
608{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100609#if (TFM_CRYPTO_CIPHER_MODULE_DISABLED != 0)
610 return PSA_ERROR_NOT_SUPPORTED;
611#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000612 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100613 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800614 .sfn_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100615 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100616 };
617
618 psa_invec in_vec[] = {
619 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
620 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000621 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100622 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000623 {.base = output, .len = output_size},
624 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100625
Antonio de Angelis4743e672019-04-11 11:38:48 +0100626 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100627
628 status = API_DISPATCH(tfm_crypto_cipher_finish,
629 TFM_CRYPTO_CIPHER_FINISH);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100630
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000631 *output_length = out_vec[1].len;
632
Antonio de Angelis4743e672019-04-11 11:38:48 +0100633 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100634
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000635 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100636#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100637}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100638
Antonio de Angelis377a1552018-11-22 17:02:40 +0000639psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100640 psa_algorithm_t alg)
641{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100642#if (TFM_CRYPTO_HASH_MODULE_DISABLED != 0)
643 return PSA_ERROR_NOT_SUPPORTED;
644#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000645 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100646 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800647 .sfn_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100648 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100649 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000650 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100651
Antonio de Angelis4743e672019-04-11 11:38:48 +0100652 psa_invec in_vec[] = {
653 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
654 };
655 psa_outvec out_vec[] = {
656 {.base = &(operation->handle), .len = sizeof(uint32_t)},
657 };
658
Antonio de Angelis4743e672019-04-11 11:38:48 +0100659 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100660
661 status = API_DISPATCH(tfm_crypto_hash_setup,
662 TFM_CRYPTO_HASH_SETUP);
663
Antonio de Angelis4743e672019-04-11 11:38:48 +0100664 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100665
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000666 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100667#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100668}
669
670psa_status_t psa_hash_update(psa_hash_operation_t *operation,
671 const uint8_t *input,
672 size_t input_length)
673{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100674#if (TFM_CRYPTO_HASH_MODULE_DISABLED != 0)
675 return PSA_ERROR_NOT_SUPPORTED;
676#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000677 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100678 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800679 .sfn_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100680 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100681 };
682
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000683 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100684 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000685 {.base = input, .len = input_length},
686 };
687 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100688 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000689 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100690
Antonio de Angelis4743e672019-04-11 11:38:48 +0100691 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100692
693 status = API_DISPATCH(tfm_crypto_hash_update,
694 TFM_CRYPTO_HASH_UPDATE);
695
Antonio de Angelis4743e672019-04-11 11:38:48 +0100696 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100697
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000698 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100699#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100700}
701
702psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
703 uint8_t *hash,
704 size_t hash_size,
705 size_t *hash_length)
706{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100707#if (TFM_CRYPTO_HASH_MODULE_DISABLED != 0)
708 return PSA_ERROR_NOT_SUPPORTED;
709#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000710 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100711 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800712 .sfn_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100713 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100714 };
715
716 psa_invec in_vec[] = {
717 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
718 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000719 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100720 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000721 {.base = hash, .len = hash_size},
722 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100723
Antonio de Angelis4743e672019-04-11 11:38:48 +0100724 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100725
726 status = API_DISPATCH(tfm_crypto_hash_finish,
727 TFM_CRYPTO_HASH_FINISH);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100728
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000729 *hash_length = out_vec[1].len;
730
Antonio de Angelis4743e672019-04-11 11:38:48 +0100731 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100732
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000733 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100734#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100735}
736
737psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
738 const uint8_t *hash,
739 size_t hash_length)
740{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100741#if (TFM_CRYPTO_HASH_MODULE_DISABLED != 0)
742 return PSA_ERROR_NOT_SUPPORTED;
743#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000744 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100745 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800746 .sfn_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100747 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100748 };
749
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000750 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100751 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000752 {.base = hash, .len = hash_length},
753 };
754 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100755 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000756 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100757
Antonio de Angelis4743e672019-04-11 11:38:48 +0100758 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100759
760 status = API_DISPATCH(tfm_crypto_hash_verify,
761 TFM_CRYPTO_HASH_VERIFY);
Kevin Peng9449a362019-07-29 16:05:42 +0800762
Antonio de Angelis4743e672019-04-11 11:38:48 +0100763 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100764
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000765 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100766#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100767}
768
769psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
770{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100771#if (TFM_CRYPTO_HASH_MODULE_DISABLED != 0)
772 return PSA_ERROR_NOT_SUPPORTED;
773#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000774 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100775 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800776 .sfn_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100777 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000778 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100779
Antonio de Angelis4743e672019-04-11 11:38:48 +0100780 psa_invec in_vec[] = {
781 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
782 };
783 psa_outvec out_vec[] = {
784 {.base = &(operation->handle), .len = sizeof(uint32_t)},
785 };
786
Antonio de Angelis4743e672019-04-11 11:38:48 +0100787 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100788
789 status = API_DISPATCH(tfm_crypto_hash_abort,
790 TFM_CRYPTO_HASH_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800791
Antonio de Angelis4743e672019-04-11 11:38:48 +0100792 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100793
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000794 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100795#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100796}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100797
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100798psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
799 psa_hash_operation_t *target_operation)
800{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100801#if (TFM_CRYPTO_HASH_MODULE_DISABLED != 0)
802 return PSA_ERROR_NOT_SUPPORTED;
803#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100804 psa_status_t status;
805 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800806 .sfn_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100807 .op_handle = source_operation->handle,
808 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100809
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100810 psa_invec in_vec[] = {
811 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
812 };
813 psa_outvec out_vec[] = {
814 {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
815 };
816
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100817 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100818
819 status = API_DISPATCH(tfm_crypto_hash_clone,
820 TFM_CRYPTO_HASH_CLONE);
Kevin Peng9449a362019-07-29 16:05:42 +0800821
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100822 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100823
824 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100825#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100826}
827
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100828psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100829 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100830 psa_algorithm_t alg)
831{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100832#if (TFM_CRYPTO_MAC_MODULE_DISABLED != 0)
833 return PSA_ERROR_NOT_SUPPORTED;
834#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000835 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100836 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800837 .sfn_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100838 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100839 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100840 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000841 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100842
Antonio de Angelis4743e672019-04-11 11:38:48 +0100843 psa_invec in_vec[] = {
844 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
845 };
846 psa_outvec out_vec[] = {
847 {.base = &(operation->handle), .len = sizeof(uint32_t)},
848 };
849
Antonio de Angelis4743e672019-04-11 11:38:48 +0100850 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100851
852 status = API_DISPATCH(tfm_crypto_mac_sign_setup,
853 TFM_CRYPTO_MAC_SIGN_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800854
Antonio de Angelis4743e672019-04-11 11:38:48 +0100855 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100856
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000857 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100858#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100859}
860
861psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100862 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100863 psa_algorithm_t alg)
864{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100865#if (TFM_CRYPTO_MAC_MODULE_DISABLED != 0)
866 return PSA_ERROR_NOT_SUPPORTED;
867#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000868 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100869 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800870 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100871 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100872 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100873 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000874 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100875
Antonio de Angelis4743e672019-04-11 11:38:48 +0100876 psa_invec in_vec[] = {
877 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
878 };
879 psa_outvec out_vec[] = {
880 {.base = &(operation->handle), .len = sizeof(uint32_t)},
881 };
882
Antonio de Angelis4743e672019-04-11 11:38:48 +0100883 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100884
885 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
886 TFM_CRYPTO_MAC_VERIFY_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800887
Antonio de Angelis4743e672019-04-11 11:38:48 +0100888 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100889
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000890 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100891#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100892}
893
894psa_status_t psa_mac_update(psa_mac_operation_t *operation,
895 const uint8_t *input,
896 size_t input_length)
897{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100898#if (TFM_CRYPTO_MAC_MODULE_DISABLED != 0)
899 return PSA_ERROR_NOT_SUPPORTED;
900#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000901 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100902 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800903 .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100904 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100905 };
906
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000907 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100908 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000909 {.base = input, .len = input_length},
910 };
911 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100912 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000913 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100914
Antonio de Angelis4743e672019-04-11 11:38:48 +0100915 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100916
917 status = API_DISPATCH(tfm_crypto_mac_update,
918 TFM_CRYPTO_MAC_UPDATE);
Kevin Peng9449a362019-07-29 16:05:42 +0800919
Antonio de Angelis4743e672019-04-11 11:38:48 +0100920 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100921
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000922 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100923#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100924}
925
926psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
927 uint8_t *mac,
928 size_t mac_size,
929 size_t *mac_length)
930{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100931#if (TFM_CRYPTO_MAC_MODULE_DISABLED != 0)
932 return PSA_ERROR_NOT_SUPPORTED;
933#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000934 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100935 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800936 .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100937 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100938 };
939
940 psa_invec in_vec[] = {
941 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
942 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000943 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100944 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000945 {.base = mac, .len = mac_size},
946 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100947
Antonio de Angelis4743e672019-04-11 11:38:48 +0100948 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100949
950 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
951 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100952
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000953 *mac_length = out_vec[1].len;
954
Antonio de Angelis4743e672019-04-11 11:38:48 +0100955 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100956
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000957 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100958#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100959}
960
961psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
962 const uint8_t *mac,
963 size_t mac_length)
964{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100965#if (TFM_CRYPTO_MAC_MODULE_DISABLED != 0)
966 return PSA_ERROR_NOT_SUPPORTED;
967#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000968 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100969 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800970 .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100971 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100972 };
973
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000974 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100975 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000976 {.base = mac, .len = mac_length},
977 };
978 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100979 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000980 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100981
Antonio de Angelis4743e672019-04-11 11:38:48 +0100982 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100983
984 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
985 TFM_CRYPTO_MAC_VERIFY_FINISH);
986
Antonio de Angelis4743e672019-04-11 11:38:48 +0100987 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100988
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000989 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100990#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100991}
992
993psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
994{
Antonio de Angelis7740b382019-07-16 10:59:25 +0100995#if (TFM_CRYPTO_MAC_MODULE_DISABLED != 0)
996 return PSA_ERROR_NOT_SUPPORTED;
997#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000998 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100999 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001000 .sfn_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001001 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001002 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +01001003
Antonio de Angelis4743e672019-04-11 11:38:48 +01001004 psa_invec in_vec[] = {
1005 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1006 };
1007 psa_outvec out_vec[] = {
1008 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1009 };
1010
Antonio de Angelis4743e672019-04-11 11:38:48 +01001011 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001012
1013 status = API_DISPATCH(tfm_crypto_mac_abort,
1014 TFM_CRYPTO_MAC_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001015
Antonio de Angelis4743e672019-04-11 11:38:48 +01001016 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +01001017
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001018 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001019#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +01001020}
Antonio de Angelis3a480992018-11-07 11:53:28 +00001021
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001022psa_status_t psa_aead_encrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +00001023 psa_algorithm_t alg,
1024 const uint8_t *nonce,
1025 size_t nonce_length,
1026 const uint8_t *additional_data,
1027 size_t additional_data_length,
1028 const uint8_t *plaintext,
1029 size_t plaintext_length,
1030 uint8_t *ciphertext,
1031 size_t ciphertext_size,
1032 size_t *ciphertext_length)
1033{
Antonio de Angelis7740b382019-07-16 10:59:25 +01001034#if (TFM_CRYPTO_AEAD_MODULE_DISABLED != 0)
1035 return PSA_ERROR_NOT_SUPPORTED;
1036#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001037 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001038 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001039 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001040 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +01001041 .alg = alg,
1042 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001043 };
Antonio de Angelis4743e672019-04-11 11:38:48 +01001044
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001045 /* Sanitize the optional input */
1046 if ((additional_data == NULL) && (additional_data_length != 0)) {
1047 return PSA_ERROR_INVALID_ARGUMENT;
1048 }
1049
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001050 size_t idx = 0;
1051 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001052 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001053 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +01001054 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001055 };
1056 psa_outvec out_vec[] = {
1057 {.base = ciphertext, .len = ciphertext_size},
1058 };
Antonio de Angelis3a480992018-11-07 11:53:28 +00001059
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001060 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
1061 return PSA_ERROR_INVALID_ARGUMENT;
1062 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001063
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001064 if (nonce != NULL) {
1065 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001066 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001067 }
1068 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001069
Antonio de Angelis4743e672019-04-11 11:38:48 +01001070 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001071
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001072 size_t in_len = ARRAY_SIZE(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001073 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001074 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001075 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001076 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001077 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001078
1079 *ciphertext_length = out_vec[0].len;
1080
Antonio de Angelis4743e672019-04-11 11:38:48 +01001081 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +01001082
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001083 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001084#endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */
Antonio de Angelis3a480992018-11-07 11:53:28 +00001085}
1086
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001087psa_status_t psa_aead_decrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +00001088 psa_algorithm_t alg,
1089 const uint8_t *nonce,
1090 size_t nonce_length,
1091 const uint8_t *additional_data,
1092 size_t additional_data_length,
1093 const uint8_t *ciphertext,
1094 size_t ciphertext_length,
1095 uint8_t *plaintext,
1096 size_t plaintext_size,
1097 size_t *plaintext_length)
1098{
Antonio de Angelis7740b382019-07-16 10:59:25 +01001099#if (TFM_CRYPTO_AEAD_MODULE_DISABLED != 0)
1100 return PSA_ERROR_NOT_SUPPORTED;
1101#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001102 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001103 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001104 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001105 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +01001106 .alg = alg,
1107 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001108 };
Antonio de Angelis4743e672019-04-11 11:38:48 +01001109
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001110 /* Sanitize the optional input */
1111 if ((additional_data == NULL) && (additional_data_length != 0)) {
1112 return PSA_ERROR_INVALID_ARGUMENT;
1113 }
1114
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001115 size_t idx = 0;
1116 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001117 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001118 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +01001119 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001120 };
1121 psa_outvec out_vec[] = {
1122 {.base = plaintext, .len = plaintext_size},
1123 };
Antonio de Angelis3a480992018-11-07 11:53:28 +00001124
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001125 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
1126 return PSA_ERROR_INVALID_ARGUMENT;
1127 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001128
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001129 if (nonce != NULL) {
1130 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001131 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001132 }
1133 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001134
Antonio de Angelis4743e672019-04-11 11:38:48 +01001135 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001136
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001137 size_t in_len = ARRAY_SIZE(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001138 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001139 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001140 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001141 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001142 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001143
1144 *plaintext_length = out_vec[0].len;
1145
Antonio de Angelis4743e672019-04-11 11:38:48 +01001146 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +01001147
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001148 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001149#endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */
Antonio de Angelis3a480992018-11-07 11:53:28 +00001150}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001151
1152psa_status_t psa_asymmetric_sign(psa_key_handle_t handle,
1153 psa_algorithm_t alg,
1154 const uint8_t *hash,
1155 size_t hash_length,
1156 uint8_t *signature,
1157 size_t signature_size,
1158 size_t *signature_length)
1159{
Antonio de Angelis7740b382019-07-16 10:59:25 +01001160#if (TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED != 0)
1161 return PSA_ERROR_NOT_SUPPORTED;
1162#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001163 psa_status_t status;
1164 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001165 .sfn_id = TFM_CRYPTO_ASYMMETRIC_SIGN_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001166 .key_handle = handle,
1167 .alg = alg,
1168 };
1169
1170 psa_invec in_vec[] = {
1171 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1172 {.base = hash, .len = hash_length},
1173 };
1174 psa_outvec out_vec[] = {
1175 {.base = signature, .len = signature_size},
1176 };
1177
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001178 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001179
1180 status = API_DISPATCH(tfm_crypto_asymmetric_sign,
1181 TFM_CRYPTO_ASYMMETRIC_SIGN);
1182
1183 *signature_length = out_vec[0].len;
1184
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001185 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001186
1187 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001188#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001189}
1190
1191psa_status_t psa_asymmetric_verify(psa_key_handle_t handle,
1192 psa_algorithm_t alg,
1193 const uint8_t *hash,
1194 size_t hash_length,
1195 const uint8_t *signature,
1196 size_t signature_length)
1197{
Antonio de Angelis7740b382019-07-16 10:59:25 +01001198#if (TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED != 0)
1199 return PSA_ERROR_NOT_SUPPORTED;
1200#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001201 psa_status_t status;
1202 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001203 .sfn_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001204 .key_handle = handle,
1205 .alg = alg
1206 };
1207
1208 psa_invec in_vec[] = {
1209 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1210 {.base = hash, .len = hash_length},
1211 {.base = signature, .len = signature_length}
1212 };
1213
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001214 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001215
1216 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_asymmetric_verify,
1217 TFM_CRYPTO_ASYMMETRIC_VERIFY);
Kevin Peng9449a362019-07-29 16:05:42 +08001218
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001219 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001220
1221 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001222#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001223}
1224
1225psa_status_t psa_asymmetric_encrypt(psa_key_handle_t handle,
1226 psa_algorithm_t alg,
1227 const uint8_t *input,
1228 size_t input_length,
1229 const uint8_t *salt,
1230 size_t salt_length,
1231 uint8_t *output,
1232 size_t output_size,
1233 size_t *output_length)
1234{
Antonio de Angelis7740b382019-07-16 10:59:25 +01001235#if (TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED != 0)
1236 return PSA_ERROR_NOT_SUPPORTED;
1237#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001238 psa_status_t status;
1239 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001240 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001241 .key_handle = handle,
1242 .alg = alg
1243 };
1244
1245 /* Sanitize the optional input */
1246 if ((salt == NULL) && (salt_length != 0)) {
1247 return PSA_ERROR_INVALID_ARGUMENT;
1248 }
1249
1250 psa_invec in_vec[] = {
1251 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1252 {.base = input, .len = input_length},
1253 {.base = salt, .len = salt_length}
1254 };
1255
1256 psa_outvec out_vec[] = {
1257 {.base = output, .len = output_size},
1258 };
1259
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001260 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001261
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001262 size_t in_len = ARRAY_SIZE(in_vec);
1263 if (salt == NULL) {
1264 in_len--;
1265 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001266 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001267 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001268
1269 *output_length = out_vec[0].len;
1270
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001271 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001272
1273 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001274#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001275}
1276
1277psa_status_t psa_asymmetric_decrypt(psa_key_handle_t handle,
1278 psa_algorithm_t alg,
1279 const uint8_t *input,
1280 size_t input_length,
1281 const uint8_t *salt,
1282 size_t salt_length,
1283 uint8_t *output,
1284 size_t output_size,
1285 size_t *output_length)
1286{
Antonio de Angelis7740b382019-07-16 10:59:25 +01001287#if (TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED != 0)
1288 return PSA_ERROR_NOT_SUPPORTED;
1289#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001290 psa_status_t status;
1291 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001292 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001293 .key_handle = handle,
1294 .alg = alg
1295 };
1296
1297 /* Sanitize the optional input */
1298 if ((salt == NULL) && (salt_length != 0)) {
1299 return PSA_ERROR_INVALID_ARGUMENT;
1300 }
1301
1302 psa_invec in_vec[] = {
1303 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1304 {.base = input, .len = input_length},
1305 {.base = salt, .len = salt_length}
1306 };
1307
1308 psa_outvec out_vec[] = {
1309 {.base = output, .len = output_size},
1310 };
1311
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001312 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001313
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001314 size_t in_len = ARRAY_SIZE(in_vec);
1315 if (salt == NULL) {
1316 in_len--;
1317 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001318 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001319 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001320
1321 *output_length = out_vec[0].len;
1322
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001323 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001324
1325 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001326#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001327}
1328
1329psa_status_t psa_get_generator_capacity(const psa_crypto_generator_t *generator,
1330 size_t *capacity)
1331{
Antonio de Angelis7740b382019-07-16 10:59:25 +01001332#if (TFM_CRYPTO_GENERATOR_MODULE_DISABLED != 0)
1333 return PSA_ERROR_NOT_SUPPORTED;
1334#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001335 psa_status_t status;
1336 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001337 .sfn_id = TFM_CRYPTO_GET_GENERATOR_CAPACITY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001338 .op_handle = generator->handle,
1339 };
1340
1341 psa_invec in_vec[] = {
1342 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1343 };
1344
1345 psa_outvec out_vec[] = {
1346 {.base = capacity, .len = sizeof(size_t)},
1347 };
1348
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001349 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001350
1351 status = API_DISPATCH(tfm_crypto_get_generator_capacity,
1352 TFM_CRYPTO_GET_GENERATOR_CAPACITY);
Kevin Peng9449a362019-07-29 16:05:42 +08001353
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001354 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001355
1356 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001357#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001358}
1359
1360psa_status_t psa_generator_read(psa_crypto_generator_t *generator,
1361 uint8_t *output,
1362 size_t output_length)
1363{
Antonio de Angelis7740b382019-07-16 10:59:25 +01001364#if (TFM_CRYPTO_GENERATOR_MODULE_DISABLED != 0)
1365 return PSA_ERROR_NOT_SUPPORTED;
1366#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001367 psa_status_t status;
1368 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001369 .sfn_id = TFM_CRYPTO_GENERATOR_READ_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001370 .op_handle = generator->handle,
1371 };
1372
1373 psa_invec in_vec[] = {
1374 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1375 };
1376
1377 psa_outvec out_vec[] = {
1378 {.base = output, .len = output_length},
1379 };
1380
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001381 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001382
1383 status = API_DISPATCH(tfm_crypto_generator_read,
1384 TFM_CRYPTO_GENERATOR_READ);
Kevin Peng9449a362019-07-29 16:05:42 +08001385
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001386 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001387
1388 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001389#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001390}
1391
1392psa_status_t psa_generator_import_key(psa_key_handle_t handle,
1393 psa_key_type_t type,
1394 size_t bits,
1395 psa_crypto_generator_t *generator)
1396{
Antonio de Angelis7740b382019-07-16 10:59:25 +01001397#if (TFM_CRYPTO_GENERATOR_MODULE_DISABLED != 0)
1398 return PSA_ERROR_NOT_SUPPORTED;
1399#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001400 psa_status_t status;
1401 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001402 .sfn_id = TFM_CRYPTO_GENERATOR_IMPORT_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001403 .key_handle = handle,
1404 .type = type,
1405 .op_handle = generator->handle,
1406 };
1407
1408 psa_invec in_vec[] = {
1409 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1410 {.base = &bits, .len = sizeof(size_t)},
1411 };
1412
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001413 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001414
1415 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_generator_import_key,
1416 TFM_CRYPTO_GENERATOR_IMPORT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +08001417
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001418 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001419
1420 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001421#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001422}
1423
1424psa_status_t psa_generator_abort(psa_crypto_generator_t *generator)
1425{
Antonio de Angelis7740b382019-07-16 10:59:25 +01001426#if (TFM_CRYPTO_GENERATOR_MODULE_DISABLED != 0)
1427 return PSA_ERROR_NOT_SUPPORTED;
1428#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001429 psa_status_t status;
1430 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001431 .sfn_id = TFM_CRYPTO_GENERATOR_ABORT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001432 .op_handle = generator->handle,
1433 };
1434
1435 psa_invec in_vec[] = {
1436 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1437 };
1438
1439 psa_outvec out_vec[] = {
1440 {.base = &(generator->handle), .len = sizeof(uint32_t)},
1441 };
1442
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001443 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001444
1445 status = API_DISPATCH(tfm_crypto_generator_abort,
1446 TFM_CRYPTO_GENERATOR_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001447
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001448 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001449
1450 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001451#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001452}
1453
1454psa_status_t psa_key_derivation(psa_crypto_generator_t *generator,
1455 psa_key_handle_t handle,
1456 psa_algorithm_t alg,
1457 const uint8_t *salt,
1458 size_t salt_length,
1459 const uint8_t *label,
1460 size_t label_length,
1461 size_t capacity)
1462{
Antonio de Angelis7740b382019-07-16 10:59:25 +01001463#if (TFM_CRYPTO_GENERATOR_MODULE_DISABLED != 0)
1464 return PSA_ERROR_NOT_SUPPORTED;
1465#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001466 psa_status_t status;
1467 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001468 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001469 .key_handle = handle,
1470 .alg = alg,
1471 .op_handle = generator->handle,
1472 .capacity = capacity,
1473 };
1474
1475 /* Sanitize the optional input */
1476 if ((salt == NULL) && (salt_length != 0)) {
1477 return PSA_ERROR_INVALID_ARGUMENT;
1478 }
1479
1480 if ((label == NULL) && (label_length != 0)) {
1481 return PSA_ERROR_INVALID_ARGUMENT;
1482 }
1483
1484 psa_invec in_vec[] = {
1485 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1486 {.base = salt, .len = salt_length},
1487 {.base = label, .len = label_length},
1488 };
1489
1490 psa_outvec out_vec[] = {
1491 {.base = &(generator->handle), .len = sizeof(uint32_t)},
1492 };
1493
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001494 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001495
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001496 size_t in_len = ARRAY_SIZE(in_vec);
1497 if (label == NULL) {
1498 in_len--;
1499 if (salt == NULL) {
1500 in_len--;
1501 }
1502 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001503 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001504 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001505
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001506 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001507
1508 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001509#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001510}
1511
1512psa_status_t psa_key_agreement(psa_crypto_generator_t *generator,
1513 psa_key_handle_t private_key,
1514 const uint8_t *peer_key,
1515 size_t peer_key_length,
1516 psa_algorithm_t alg)
1517{
Antonio de Angelis7740b382019-07-16 10:59:25 +01001518#if (TFM_CRYPTO_GENERATOR_MODULE_DISABLED != 0)
1519 return PSA_ERROR_NOT_SUPPORTED;
1520#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001521 psa_status_t status;
1522 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001523 .sfn_id = TFM_CRYPTO_KEY_AGREEMENT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001524 .key_handle = private_key,
1525 .alg = alg,
1526 .op_handle = generator->handle,
1527 };
1528
1529 psa_invec in_vec[] = {
1530 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1531 {.base = peer_key, .len = peer_key_length},
1532 };
1533
1534 psa_outvec out_vec[] = {
1535 {.base = &(generator->handle), .len = sizeof(uint32_t)},
1536 };
1537
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001538 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001539
1540 status = API_DISPATCH(tfm_crypto_key_agreement,
1541 TFM_CRYPTO_KEY_AGREEMENT);
1542
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001543 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001544
1545 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001546#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001547}
1548
1549psa_status_t psa_generate_random(uint8_t *output,
1550 size_t output_size)
1551{
Antonio de Angelis7740b382019-07-16 10:59:25 +01001552#if (TFM_CRYPTO_GENERATOR_MODULE_DISABLED != 0)
1553 return PSA_ERROR_NOT_SUPPORTED;
1554#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001555 psa_status_t status;
1556 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001557 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001558 };
1559
1560 psa_invec in_vec[] = {
1561 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1562 };
1563
1564 psa_outvec out_vec[] = {
1565 {.base = output, .len = output_size},
1566 };
1567
1568 if (output_size == 0) {
1569 return PSA_SUCCESS;
1570 }
1571
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001572 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001573
1574 status = API_DISPATCH(tfm_crypto_generate_random,
1575 TFM_CRYPTO_GENERATE_RANDOM);
1576
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001577 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001578
1579 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001580#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001581}
1582
1583psa_status_t psa_generate_key(psa_key_handle_t handle,
1584 psa_key_type_t type,
1585 size_t bits,
1586 const void *extra,
1587 size_t extra_size)
1588{
Antonio de Angelis7740b382019-07-16 10:59:25 +01001589#if (TFM_CRYPTO_GENERATOR_MODULE_DISABLED != 0)
1590 return PSA_ERROR_NOT_SUPPORTED;
1591#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001592 psa_status_t status;
1593 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001594 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001595 .key_handle = handle,
1596 .type = type,
1597 };
1598
1599 /* Sanitize the optional input */
1600 if ((extra == NULL) && (extra_size != 0)) {
1601 return PSA_ERROR_INVALID_ARGUMENT;
1602 }
1603
1604 psa_invec in_vec[] = {
1605 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1606 {.base = &bits, .len = sizeof(size_t)},
1607 {.base = extra, .len = extra_size},
1608 };
1609
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001610 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001611
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001612 size_t in_len = ARRAY_SIZE(in_vec);
1613 if (extra == NULL) {
1614 in_len--;
1615 }
1616
Summer Qin4b1d03b2019-07-02 14:56:08 +08001617 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len, NULL, 0);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001618
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001619 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001620
1621 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001622#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001623}