blob: 3bc75976c101703cbe4111c039ef2ae4634f614d [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{
Kevin Peng96f802e2019-12-26 16:10:25 +080046#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +010047 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{
Kevin Peng96f802e2019-12-26 16:10:25 +080075#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +010076 return PSA_ERROR_NOT_SUPPORTED;
77#else
Jamie Foxdadb4e82019-09-03 17:59:41 +010078 psa_status_t status;
79 const struct tfm_crypto_pack_iovec iov = {
80 .sfn_id = TFM_CRYPTO_OPEN_KEY_SID,
81 .lifetime = lifetime,
82 };
83 psa_invec in_vec[] = {
84 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
85 {.base = &id, .len = sizeof(psa_key_id_t)},
86 };
87 psa_outvec out_vec[] = {
88 {.base = handle, .len = sizeof(psa_key_handle_t)},
89 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010090
Jamie Foxdadb4e82019-09-03 17:59:41 +010091 PSA_CONNECT(TFM_CRYPTO);
92
93 status = API_DISPATCH(tfm_crypto_open_key,
94 TFM_CRYPTO_OPEN_KEY);
95
96 PSA_CLOSE();
97
98 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +010099#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100100}
101
102psa_status_t psa_create_key(psa_key_lifetime_t lifetime,
103 psa_key_id_t id,
104 psa_key_handle_t *handle)
105{
Kevin Peng96f802e2019-12-26 16:10:25 +0800106#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100107 return PSA_ERROR_NOT_SUPPORTED;
108#else
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100109 (void)lifetime;
110 (void)id;
111 (void)handle;
112
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100113 /* TODO: Persistent key APIs are not supported yet */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100114 return PSA_ERROR_NOT_SUPPORTED;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100115#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100116}
117
118psa_status_t psa_close_key(psa_key_handle_t handle)
119{
Kevin Peng96f802e2019-12-26 16:10:25 +0800120#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100121 return PSA_ERROR_NOT_SUPPORTED;
122#else
Jamie Foxdadb4e82019-09-03 17:59:41 +0100123 psa_status_t status;
124 const struct tfm_crypto_pack_iovec iov = {
125 .sfn_id = TFM_CRYPTO_CLOSE_KEY_SID,
126 .key_handle = handle,
127 };
128 psa_invec in_vec[] = {
129 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
130 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100131
Jamie Foxdadb4e82019-09-03 17:59:41 +0100132 PSA_CONNECT(TFM_CRYPTO);
133
134 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_close_key,
135 TFM_CRYPTO_CLOSE_KEY);;
136
137 PSA_CLOSE();
138
139 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100140#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100141}
142
143psa_status_t psa_import_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100144 psa_key_type_t type,
145 const uint8_t *data,
146 size_t data_length)
147{
Kevin Peng96f802e2019-12-26 16:10:25 +0800148#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100149 return PSA_ERROR_NOT_SUPPORTED;
150#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000151 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100152 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800153 .sfn_id = TFM_CRYPTO_IMPORT_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100154 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100155 .type = type,
156 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000157 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100158 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000159 {.base = data, .len = data_length}
160 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100161
Antonio de Angelis4743e672019-04-11 11:38:48 +0100162 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100163
164 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_import_key,
165 TFM_CRYPTO_IMPORT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +0800166
Antonio de Angelis4743e672019-04-11 11:38:48 +0100167 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100168
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000169 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100170#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100171}
172
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100173psa_status_t psa_destroy_key(psa_key_handle_t handle)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100174{
Kevin Peng96f802e2019-12-26 16:10:25 +0800175#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100176 return PSA_ERROR_NOT_SUPPORTED;
177#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000178 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100179 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800180 .sfn_id = TFM_CRYPTO_DESTROY_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100181 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100182 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000183 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100184 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000185 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100186
Antonio de Angelis4743e672019-04-11 11:38:48 +0100187 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100188
189 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_destroy_key,
190 TFM_CRYPTO_DESTROY_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +0800191
Antonio de Angelis4743e672019-04-11 11:38:48 +0100192 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100193
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000194 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100195#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100196}
197
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100198psa_status_t psa_get_key_information(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100199 psa_key_type_t *type,
200 size_t *bits)
201{
Kevin Peng96f802e2019-12-26 16:10:25 +0800202#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100203 return PSA_ERROR_NOT_SUPPORTED;
204#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000205 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100206 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800207 .sfn_id = TFM_CRYPTO_GET_KEY_INFORMATION_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100208 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100209 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000210 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100211 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000212 };
213 psa_outvec out_vec[] = {
214 {.base = type, .len = sizeof(psa_key_type_t)},
215 {.base = bits, .len = sizeof(size_t)}
216 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100217
Antonio de Angelis4743e672019-04-11 11:38:48 +0100218 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100219
220 status = API_DISPATCH(tfm_crypto_get_key_information,
221 TFM_CRYPTO_GET_KEY_INFORMATION);
Kevin Peng9449a362019-07-29 16:05:42 +0800222
Antonio de Angelis4743e672019-04-11 11:38:48 +0100223 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100224
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000225 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100226#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100227}
228
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100229psa_status_t psa_export_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100230 uint8_t *data,
231 size_t data_size,
232 size_t *data_length)
233{
Kevin Peng96f802e2019-12-26 16:10:25 +0800234#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100235 return PSA_ERROR_NOT_SUPPORTED;
236#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000237 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100238 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800239 .sfn_id = TFM_CRYPTO_EXPORT_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100240 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100241 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000242 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100243 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000244 };
245 psa_outvec out_vec[] = {
246 {.base = data, .len = data_size}
247 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100248
Antonio de Angelis4743e672019-04-11 11:38:48 +0100249 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100250
251 status = API_DISPATCH(tfm_crypto_export_key,
252 TFM_CRYPTO_EXPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100253
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000254 *data_length = out_vec[0].len;
255
Antonio de Angelis4743e672019-04-11 11:38:48 +0100256 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100257
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000258 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100259#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100260}
261
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100262psa_status_t psa_export_public_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100263 uint8_t *data,
264 size_t data_size,
265 size_t *data_length)
266{
Kevin Peng96f802e2019-12-26 16:10:25 +0800267#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100268 return PSA_ERROR_NOT_SUPPORTED;
269#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100270 psa_status_t status;
271 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800272 .sfn_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100273 .key_handle = handle,
274 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000275
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100276 psa_invec in_vec[] = {
277 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
278 };
279 psa_outvec out_vec[] = {
280 {.base = data, .len = data_size}
281 };
282
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100283 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100284
285 status = API_DISPATCH(tfm_crypto_export_public_key,
286 TFM_CRYPTO_EXPORT_PUBLIC_KEY);
287
288 *data_length = out_vec[0].len;
289
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100290 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100291
292 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100293#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100294}
295
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100296psa_status_t psa_copy_key(psa_key_handle_t source_handle,
297 psa_key_handle_t target_handle,
298 const psa_key_policy_t *constraint)
Jamie Foxefd82732018-11-26 10:34:32 +0000299{
Kevin Peng96f802e2019-12-26 16:10:25 +0800300#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100301 return PSA_ERROR_NOT_SUPPORTED;
302#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100303 psa_status_t status;
304 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800305 .sfn_id = TFM_CRYPTO_COPY_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100306 .key_handle = source_handle,
307 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000308
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100309 psa_invec in_vec[] = {
310 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
311 {.base = &target_handle, .len = sizeof(psa_key_handle_t)},
312 {.base = constraint, .len = sizeof(psa_key_policy_t)},
313 };
314
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100315 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100316
317 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_copy_key,
318 TFM_CRYPTO_COPY_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +0800319
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100320 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100321
322 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100323#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Foxefd82732018-11-26 10:34:32 +0000324}
325
326void psa_key_policy_set_usage(psa_key_policy_t *policy,
327 psa_key_usage_t usage,
328 psa_algorithm_t alg)
329{
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100330 policy->usage = usage;
331 policy->alg = alg;
Jamie Foxefd82732018-11-26 10:34:32 +0000332}
333
334psa_key_usage_t psa_key_policy_get_usage(const psa_key_policy_t *policy)
335{
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100336 return policy->usage;
Jamie Foxefd82732018-11-26 10:34:32 +0000337}
338
339psa_algorithm_t psa_key_policy_get_algorithm(const psa_key_policy_t *policy)
340{
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100341 return policy->alg;
Jamie Foxefd82732018-11-26 10:34:32 +0000342}
343
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100344psa_status_t psa_set_key_policy(psa_key_handle_t handle,
Jamie Foxefd82732018-11-26 10:34:32 +0000345 const psa_key_policy_t *policy)
346{
Kevin Peng96f802e2019-12-26 16:10:25 +0800347#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100348 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_SET_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 {.base = policy, .len = sizeof(psa_key_policy_t)},
359 };
Jamie Foxefd82732018-11-26 10:34:32 +0000360
Antonio de Angelis4743e672019-04-11 11:38:48 +0100361 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100362
363 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_set_key_policy,
364 TFM_CRYPTO_SET_KEY_POLICY);
Kevin Peng9449a362019-07-29 16:05:42 +0800365
Antonio de Angelis4743e672019-04-11 11:38:48 +0100366 PSA_CLOSE();
Jamie Foxefd82732018-11-26 10:34:32 +0000367
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000368 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100369#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Foxefd82732018-11-26 10:34:32 +0000370}
371
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100372psa_status_t psa_get_key_policy(psa_key_handle_t handle,
Jamie Foxefd82732018-11-26 10:34:32 +0000373 psa_key_policy_t *policy)
374{
Kevin Peng96f802e2019-12-26 16:10:25 +0800375#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100376 return PSA_ERROR_NOT_SUPPORTED;
377#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000378 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100379 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800380 .sfn_id = TFM_CRYPTO_GET_KEY_POLICY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100381 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100382 };
383
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000384 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100385 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000386 };
387 psa_outvec out_vec[] = {
388 {.base = policy, .len = sizeof(psa_key_policy_t)},
389 };
Jamie Foxefd82732018-11-26 10:34:32 +0000390
Antonio de Angelis4743e672019-04-11 11:38:48 +0100391 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100392
393 status = API_DISPATCH(tfm_crypto_get_key_policy,
394 TFM_CRYPTO_GET_KEY_POLICY);
Kevin Peng9449a362019-07-29 16:05:42 +0800395
Antonio de Angelis4743e672019-04-11 11:38:48 +0100396 PSA_CLOSE();
Jamie Foxefd82732018-11-26 10:34:32 +0000397
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000398 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100399#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Foxefd82732018-11-26 10:34:32 +0000400}
401
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100402psa_status_t psa_get_key_lifetime(psa_key_handle_t handle,
Jamie Foxefd82732018-11-26 10:34:32 +0000403 psa_key_lifetime_t *lifetime)
404{
Kevin Peng96f802e2019-12-26 16:10:25 +0800405#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100406 return PSA_ERROR_NOT_SUPPORTED;
407#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000408 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100409 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800410 .sfn_id = TFM_CRYPTO_GET_KEY_LIFETIME_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100411 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100412 };
413
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000414 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100415 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000416 };
417 psa_outvec out_vec[] = {
418 {.base = lifetime, .len = sizeof(psa_key_lifetime_t)},
419 };
Jamie Foxefd82732018-11-26 10:34:32 +0000420
Antonio de Angelis4743e672019-04-11 11:38:48 +0100421 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100422
423 status = API_DISPATCH(tfm_crypto_get_key_lifetime,
424 TFM_CRYPTO_GET_KEY_LIFETIME);
Kevin Peng9449a362019-07-29 16:05:42 +0800425
Antonio de Angelis4743e672019-04-11 11:38:48 +0100426 PSA_CLOSE();
Jamie Foxefd82732018-11-26 10:34:32 +0000427
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000428 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100429#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Foxefd82732018-11-26 10:34:32 +0000430}
431
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100432psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
433 unsigned char *iv,
434 size_t iv_size,
435 size_t *iv_length)
436{
Kevin Peng96f802e2019-12-26 16:10:25 +0800437#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100438 return PSA_ERROR_NOT_SUPPORTED;
439#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100440 psa_status_t status;
441 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800442 .sfn_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100443 .op_handle = operation->handle,
444 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100445
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100446 psa_invec in_vec[] = {
447 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
448 };
449 psa_outvec out_vec[] = {
450 {.base = &(operation->handle), .len = sizeof(uint32_t)},
451 {.base = iv, .len = iv_size},
452 };
453
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100454 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100455
456 status = API_DISPATCH(tfm_crypto_cipher_generate_iv,
457 TFM_CRYPTO_CIPHER_GENERATE_IV);
458
459 *iv_length = out_vec[1].len;
460
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100461 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100462
463 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100464#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100465}
466
Antonio de Angelis377a1552018-11-22 17:02:40 +0000467psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
468 const unsigned char *iv,
469 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100470{
Kevin Peng96f802e2019-12-26 16:10:25 +0800471#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100472 return PSA_ERROR_NOT_SUPPORTED;
473#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000474 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100475 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800476 .sfn_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100477 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100478 };
479
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000480 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100481 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000482 {.base = iv, .len = iv_length},
483 };
484 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100485 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000486 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100487
Antonio de Angelis4743e672019-04-11 11:38:48 +0100488 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100489
490 status = API_DISPATCH(tfm_crypto_cipher_set_iv,
491 TFM_CRYPTO_CIPHER_SET_IV);
Kevin Peng9449a362019-07-29 16:05:42 +0800492
Antonio de Angelis4743e672019-04-11 11:38:48 +0100493 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100494
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000495 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100496#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100497}
498
Antonio de Angelis377a1552018-11-22 17:02:40 +0000499psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100500 psa_key_handle_t handle,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000501 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100502{
Kevin Peng96f802e2019-12-26 16:10:25 +0800503#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100504 return PSA_ERROR_NOT_SUPPORTED;
505#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000506 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100507 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800508 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100509 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100510 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100511 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000512 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100513
Antonio de Angelis4743e672019-04-11 11:38:48 +0100514 psa_invec in_vec[] = {
515 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
516 };
517 psa_outvec out_vec[] = {
518 {.base = &(operation->handle), .len = sizeof(uint32_t)},
519 };
520
Antonio de Angelis4743e672019-04-11 11:38:48 +0100521 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100522
523 status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup,
524 TFM_CRYPTO_CIPHER_ENCRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800525
Antonio de Angelis4743e672019-04-11 11:38:48 +0100526 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100527
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000528 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100529#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100530}
531
Antonio de Angelis377a1552018-11-22 17:02:40 +0000532psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100533 psa_key_handle_t handle,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000534 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100535{
Kevin Peng96f802e2019-12-26 16:10:25 +0800536#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100537 return PSA_ERROR_NOT_SUPPORTED;
538#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000539 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100540 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800541 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100542 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100543 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100544 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000545 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100546
Antonio de Angelis4743e672019-04-11 11:38:48 +0100547 psa_invec in_vec[] = {
548 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
549 };
550 psa_outvec out_vec[] = {
551 {.base = &(operation->handle), .len = sizeof(uint32_t)},
552 };
553
Antonio de Angelis4743e672019-04-11 11:38:48 +0100554 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100555
556 status = API_DISPATCH(tfm_crypto_cipher_decrypt_setup,
557 TFM_CRYPTO_CIPHER_DECRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800558
Antonio de Angelis4743e672019-04-11 11:38:48 +0100559 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100560
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000561 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100562#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100563}
564
565psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
566 const uint8_t *input,
567 size_t input_length,
568 unsigned char *output,
569 size_t output_size,
570 size_t *output_length)
571{
Kevin Peng96f802e2019-12-26 16:10:25 +0800572#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100573 return PSA_ERROR_NOT_SUPPORTED;
574#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000575 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100576 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800577 .sfn_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100578 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100579 };
580
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000581 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100582 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000583 {.base = input, .len = input_length},
584 };
585 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100586 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000587 {.base = output, .len = output_size}
588 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100589
Antonio de Angelis4743e672019-04-11 11:38:48 +0100590 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100591
592 status = API_DISPATCH(tfm_crypto_cipher_update,
593 TFM_CRYPTO_CIPHER_UPDATE);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100594
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000595 *output_length = out_vec[1].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100596
Antonio de Angelis4743e672019-04-11 11:38:48 +0100597 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100598
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000599 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100600#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100601}
602
603psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
604{
Kevin Peng96f802e2019-12-26 16:10:25 +0800605#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100606 return PSA_ERROR_NOT_SUPPORTED;
607#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000608 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100609 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800610 .sfn_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100611 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000612 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100613
Antonio de Angelis4743e672019-04-11 11:38:48 +0100614 psa_invec in_vec[] = {
615 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
616 };
617 psa_outvec out_vec[] = {
618 {.base = &(operation->handle), .len = sizeof(uint32_t)},
619 };
620
Antonio de Angelis4743e672019-04-11 11:38:48 +0100621 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100622
623 status = API_DISPATCH(tfm_crypto_cipher_abort,
624 TFM_CRYPTO_CIPHER_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800625
Antonio de Angelis4743e672019-04-11 11:38:48 +0100626 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100627
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000628 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100629#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100630}
631
632psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
633 uint8_t *output,
634 size_t output_size,
635 size_t *output_length)
636{
Kevin Peng96f802e2019-12-26 16:10:25 +0800637#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100638 return PSA_ERROR_NOT_SUPPORTED;
639#else
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_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100643 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100644 };
645
646 psa_invec in_vec[] = {
647 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
648 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000649 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100650 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000651 {.base = output, .len = output_size},
652 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100653
Antonio de Angelis4743e672019-04-11 11:38:48 +0100654 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100655
656 status = API_DISPATCH(tfm_crypto_cipher_finish,
657 TFM_CRYPTO_CIPHER_FINISH);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100658
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000659 *output_length = out_vec[1].len;
660
Antonio de Angelis4743e672019-04-11 11:38:48 +0100661 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100662
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000663 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100664#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100665}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100666
Antonio de Angelis377a1552018-11-22 17:02:40 +0000667psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100668 psa_algorithm_t alg)
669{
Kevin Peng96f802e2019-12-26 16:10:25 +0800670#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100671 return PSA_ERROR_NOT_SUPPORTED;
672#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000673 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100674 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800675 .sfn_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100676 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100677 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000678 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100679
Antonio de Angelis4743e672019-04-11 11:38:48 +0100680 psa_invec in_vec[] = {
681 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
682 };
683 psa_outvec out_vec[] = {
684 {.base = &(operation->handle), .len = sizeof(uint32_t)},
685 };
686
Antonio de Angelis4743e672019-04-11 11:38:48 +0100687 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100688
689 status = API_DISPATCH(tfm_crypto_hash_setup,
690 TFM_CRYPTO_HASH_SETUP);
691
Antonio de Angelis4743e672019-04-11 11:38:48 +0100692 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100693
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000694 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100695#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100696}
697
698psa_status_t psa_hash_update(psa_hash_operation_t *operation,
699 const uint8_t *input,
700 size_t input_length)
701{
Kevin Peng96f802e2019-12-26 16:10:25 +0800702#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100703 return PSA_ERROR_NOT_SUPPORTED;
704#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000705 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100706 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800707 .sfn_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100708 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100709 };
710
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000711 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100712 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000713 {.base = input, .len = input_length},
714 };
715 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100716 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000717 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100718
Antonio de Angelis4743e672019-04-11 11:38:48 +0100719 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100720
721 status = API_DISPATCH(tfm_crypto_hash_update,
722 TFM_CRYPTO_HASH_UPDATE);
723
Antonio de Angelis4743e672019-04-11 11:38:48 +0100724 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100725
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000726 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100727#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100728}
729
730psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
731 uint8_t *hash,
732 size_t hash_size,
733 size_t *hash_length)
734{
Kevin Peng96f802e2019-12-26 16:10:25 +0800735#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100736 return PSA_ERROR_NOT_SUPPORTED;
737#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000738 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100739 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800740 .sfn_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100741 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100742 };
743
744 psa_invec in_vec[] = {
745 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
746 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000747 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100748 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000749 {.base = hash, .len = hash_size},
750 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100751
Antonio de Angelis4743e672019-04-11 11:38:48 +0100752 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100753
754 status = API_DISPATCH(tfm_crypto_hash_finish,
755 TFM_CRYPTO_HASH_FINISH);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100756
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000757 *hash_length = out_vec[1].len;
758
Antonio de Angelis4743e672019-04-11 11:38:48 +0100759 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100760
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000761 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100762#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100763}
764
765psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
766 const uint8_t *hash,
767 size_t hash_length)
768{
Kevin Peng96f802e2019-12-26 16:10:25 +0800769#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100770 return PSA_ERROR_NOT_SUPPORTED;
771#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000772 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100773 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800774 .sfn_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100775 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100776 };
777
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000778 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100779 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000780 {.base = hash, .len = hash_length},
781 };
782 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100783 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000784 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100785
Antonio de Angelis4743e672019-04-11 11:38:48 +0100786 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100787
788 status = API_DISPATCH(tfm_crypto_hash_verify,
789 TFM_CRYPTO_HASH_VERIFY);
Kevin Peng9449a362019-07-29 16:05:42 +0800790
Antonio de Angelis4743e672019-04-11 11:38:48 +0100791 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100792
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000793 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100794#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100795}
796
797psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
798{
Kevin Peng96f802e2019-12-26 16:10:25 +0800799#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100800 return PSA_ERROR_NOT_SUPPORTED;
801#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000802 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100803 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800804 .sfn_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100805 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000806 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100807
Antonio de Angelis4743e672019-04-11 11:38:48 +0100808 psa_invec in_vec[] = {
809 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
810 };
811 psa_outvec out_vec[] = {
812 {.base = &(operation->handle), .len = sizeof(uint32_t)},
813 };
814
Antonio de Angelis4743e672019-04-11 11:38:48 +0100815 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100816
817 status = API_DISPATCH(tfm_crypto_hash_abort,
818 TFM_CRYPTO_HASH_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800819
Antonio de Angelis4743e672019-04-11 11:38:48 +0100820 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100821
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000822 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100823#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100824}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100825
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100826psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
827 psa_hash_operation_t *target_operation)
828{
Kevin Peng96f802e2019-12-26 16:10:25 +0800829#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100830 return PSA_ERROR_NOT_SUPPORTED;
831#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100832 psa_status_t status;
833 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800834 .sfn_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100835 .op_handle = source_operation->handle,
836 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100837
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100838 psa_invec in_vec[] = {
839 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
840 };
841 psa_outvec out_vec[] = {
842 {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
843 };
844
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100845 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100846
847 status = API_DISPATCH(tfm_crypto_hash_clone,
848 TFM_CRYPTO_HASH_CLONE);
Kevin Peng9449a362019-07-29 16:05:42 +0800849
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100850 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100851
852 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100853#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100854}
855
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100856psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100857 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100858 psa_algorithm_t alg)
859{
Kevin Peng96f802e2019-12-26 16:10:25 +0800860#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100861 return PSA_ERROR_NOT_SUPPORTED;
862#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000863 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100864 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800865 .sfn_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100866 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100867 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100868 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000869 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100870
Antonio de Angelis4743e672019-04-11 11:38:48 +0100871 psa_invec in_vec[] = {
872 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
873 };
874 psa_outvec out_vec[] = {
875 {.base = &(operation->handle), .len = sizeof(uint32_t)},
876 };
877
Antonio de Angelis4743e672019-04-11 11:38:48 +0100878 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100879
880 status = API_DISPATCH(tfm_crypto_mac_sign_setup,
881 TFM_CRYPTO_MAC_SIGN_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800882
Antonio de Angelis4743e672019-04-11 11:38:48 +0100883 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100884
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000885 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100886#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100887}
888
889psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100890 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100891 psa_algorithm_t alg)
892{
Kevin Peng96f802e2019-12-26 16:10:25 +0800893#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100894 return PSA_ERROR_NOT_SUPPORTED;
895#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000896 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100897 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800898 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100899 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100900 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100901 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000902 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100903
Antonio de Angelis4743e672019-04-11 11:38:48 +0100904 psa_invec in_vec[] = {
905 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
906 };
907 psa_outvec out_vec[] = {
908 {.base = &(operation->handle), .len = sizeof(uint32_t)},
909 };
910
Antonio de Angelis4743e672019-04-11 11:38:48 +0100911 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100912
913 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
914 TFM_CRYPTO_MAC_VERIFY_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800915
Antonio de Angelis4743e672019-04-11 11:38:48 +0100916 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100917
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000918 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100919#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100920}
921
922psa_status_t psa_mac_update(psa_mac_operation_t *operation,
923 const uint8_t *input,
924 size_t input_length)
925{
Kevin Peng96f802e2019-12-26 16:10:25 +0800926#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100927 return PSA_ERROR_NOT_SUPPORTED;
928#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000929 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100930 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800931 .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100932 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100933 };
934
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000935 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100936 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000937 {.base = input, .len = input_length},
938 };
939 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100940 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000941 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100942
Antonio de Angelis4743e672019-04-11 11:38:48 +0100943 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100944
945 status = API_DISPATCH(tfm_crypto_mac_update,
946 TFM_CRYPTO_MAC_UPDATE);
Kevin Peng9449a362019-07-29 16:05:42 +0800947
Antonio de Angelis4743e672019-04-11 11:38:48 +0100948 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100949
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000950 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100951#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100952}
953
954psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
955 uint8_t *mac,
956 size_t mac_size,
957 size_t *mac_length)
958{
Kevin Peng96f802e2019-12-26 16:10:25 +0800959#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100960 return PSA_ERROR_NOT_SUPPORTED;
961#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000962 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100963 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800964 .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100965 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100966 };
967
968 psa_invec in_vec[] = {
969 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
970 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000971 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100972 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000973 {.base = mac, .len = mac_size},
974 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100975
Antonio de Angelis4743e672019-04-11 11:38:48 +0100976 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100977
978 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
979 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100980
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000981 *mac_length = out_vec[1].len;
982
Antonio de Angelis4743e672019-04-11 11:38:48 +0100983 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100984
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000985 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100986#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100987}
988
989psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
990 const uint8_t *mac,
991 size_t mac_length)
992{
Kevin Peng96f802e2019-12-26 16:10:25 +0800993#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100994 return PSA_ERROR_NOT_SUPPORTED;
995#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000996 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100997 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800998 .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100999 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +01001000 };
1001
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001002 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001003 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001004 {.base = mac, .len = mac_length},
1005 };
1006 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001007 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001008 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +01001009
Antonio de Angelis4743e672019-04-11 11:38:48 +01001010 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001011
1012 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
1013 TFM_CRYPTO_MAC_VERIFY_FINISH);
1014
Antonio de Angelis4743e672019-04-11 11:38:48 +01001015 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +01001016
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001017 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001018#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +01001019}
1020
1021psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
1022{
Kevin Peng96f802e2019-12-26 16:10:25 +08001023#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001024 return PSA_ERROR_NOT_SUPPORTED;
1025#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001026 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001027 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001028 .sfn_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001029 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001030 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +01001031
Antonio de Angelis4743e672019-04-11 11:38:48 +01001032 psa_invec in_vec[] = {
1033 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1034 };
1035 psa_outvec out_vec[] = {
1036 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1037 };
1038
Antonio de Angelis4743e672019-04-11 11:38:48 +01001039 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001040
1041 status = API_DISPATCH(tfm_crypto_mac_abort,
1042 TFM_CRYPTO_MAC_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001043
Antonio de Angelis4743e672019-04-11 11:38:48 +01001044 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +01001045
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001046 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001047#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +01001048}
Antonio de Angelis3a480992018-11-07 11:53:28 +00001049
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001050psa_status_t psa_aead_encrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +00001051 psa_algorithm_t alg,
1052 const uint8_t *nonce,
1053 size_t nonce_length,
1054 const uint8_t *additional_data,
1055 size_t additional_data_length,
1056 const uint8_t *plaintext,
1057 size_t plaintext_length,
1058 uint8_t *ciphertext,
1059 size_t ciphertext_size,
1060 size_t *ciphertext_length)
1061{
Kevin Peng96f802e2019-12-26 16:10:25 +08001062#ifdef TFM_CRYPTO_AEAD_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001063 return PSA_ERROR_NOT_SUPPORTED;
1064#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001065 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001066 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001067 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001068 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +01001069 .alg = alg,
1070 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001071 };
Antonio de Angelis4743e672019-04-11 11:38:48 +01001072
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001073 /* Sanitize the optional input */
1074 if ((additional_data == NULL) && (additional_data_length != 0)) {
1075 return PSA_ERROR_INVALID_ARGUMENT;
1076 }
1077
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001078 size_t idx = 0;
1079 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001080 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001081 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +01001082 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001083 };
1084 psa_outvec out_vec[] = {
1085 {.base = ciphertext, .len = ciphertext_size},
1086 };
Antonio de Angelis3a480992018-11-07 11:53:28 +00001087
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001088 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
1089 return PSA_ERROR_INVALID_ARGUMENT;
1090 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001091
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001092 if (nonce != NULL) {
1093 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001094 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001095 }
1096 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001097
Antonio de Angelis4743e672019-04-11 11:38:48 +01001098 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001099
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001100 size_t in_len = ARRAY_SIZE(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001101 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001102 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001103 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001104 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001105 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001106
1107 *ciphertext_length = out_vec[0].len;
1108
Antonio de Angelis4743e672019-04-11 11:38:48 +01001109 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +01001110
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001111 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001112#endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */
Antonio de Angelis3a480992018-11-07 11:53:28 +00001113}
1114
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001115psa_status_t psa_aead_decrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +00001116 psa_algorithm_t alg,
1117 const uint8_t *nonce,
1118 size_t nonce_length,
1119 const uint8_t *additional_data,
1120 size_t additional_data_length,
1121 const uint8_t *ciphertext,
1122 size_t ciphertext_length,
1123 uint8_t *plaintext,
1124 size_t plaintext_size,
1125 size_t *plaintext_length)
1126{
Kevin Peng96f802e2019-12-26 16:10:25 +08001127#ifdef TFM_CRYPTO_AEAD_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001128 return PSA_ERROR_NOT_SUPPORTED;
1129#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001130 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001131 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001132 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001133 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +01001134 .alg = alg,
1135 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001136 };
Antonio de Angelis4743e672019-04-11 11:38:48 +01001137
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001138 /* Sanitize the optional input */
1139 if ((additional_data == NULL) && (additional_data_length != 0)) {
1140 return PSA_ERROR_INVALID_ARGUMENT;
1141 }
1142
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001143 size_t idx = 0;
1144 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001145 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001146 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +01001147 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001148 };
1149 psa_outvec out_vec[] = {
1150 {.base = plaintext, .len = plaintext_size},
1151 };
Antonio de Angelis3a480992018-11-07 11:53:28 +00001152
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001153 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
1154 return PSA_ERROR_INVALID_ARGUMENT;
1155 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001156
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001157 if (nonce != NULL) {
1158 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001159 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001160 }
1161 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001162
Antonio de Angelis4743e672019-04-11 11:38:48 +01001163 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001164
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001165 size_t in_len = ARRAY_SIZE(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001166 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001167 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001168 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001169 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001170 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001171
1172 *plaintext_length = out_vec[0].len;
1173
Antonio de Angelis4743e672019-04-11 11:38:48 +01001174 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +01001175
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001176 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001177#endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */
Antonio de Angelis3a480992018-11-07 11:53:28 +00001178}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001179
1180psa_status_t psa_asymmetric_sign(psa_key_handle_t handle,
1181 psa_algorithm_t alg,
1182 const uint8_t *hash,
1183 size_t hash_length,
1184 uint8_t *signature,
1185 size_t signature_size,
1186 size_t *signature_length)
1187{
Kevin Peng96f802e2019-12-26 16:10:25 +08001188#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001189 return PSA_ERROR_NOT_SUPPORTED;
1190#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001191 psa_status_t status;
1192 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001193 .sfn_id = TFM_CRYPTO_ASYMMETRIC_SIGN_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001194 .key_handle = handle,
1195 .alg = alg,
1196 };
1197
1198 psa_invec in_vec[] = {
1199 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1200 {.base = hash, .len = hash_length},
1201 };
1202 psa_outvec out_vec[] = {
1203 {.base = signature, .len = signature_size},
1204 };
1205
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001206 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001207
1208 status = API_DISPATCH(tfm_crypto_asymmetric_sign,
1209 TFM_CRYPTO_ASYMMETRIC_SIGN);
1210
1211 *signature_length = out_vec[0].len;
1212
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001213 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001214
1215 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001216#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001217}
1218
1219psa_status_t psa_asymmetric_verify(psa_key_handle_t handle,
1220 psa_algorithm_t alg,
1221 const uint8_t *hash,
1222 size_t hash_length,
1223 const uint8_t *signature,
1224 size_t signature_length)
1225{
Kevin Peng96f802e2019-12-26 16:10:25 +08001226#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001227 return PSA_ERROR_NOT_SUPPORTED;
1228#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001229 psa_status_t status;
1230 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001231 .sfn_id = TFM_CRYPTO_ASYMMETRIC_VERIFY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001232 .key_handle = handle,
1233 .alg = alg
1234 };
1235
1236 psa_invec in_vec[] = {
1237 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1238 {.base = hash, .len = hash_length},
1239 {.base = signature, .len = signature_length}
1240 };
1241
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001242 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001243
1244 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_asymmetric_verify,
1245 TFM_CRYPTO_ASYMMETRIC_VERIFY);
Kevin Peng9449a362019-07-29 16:05:42 +08001246
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001247 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001248
1249 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001250#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001251}
1252
1253psa_status_t psa_asymmetric_encrypt(psa_key_handle_t handle,
1254 psa_algorithm_t alg,
1255 const uint8_t *input,
1256 size_t input_length,
1257 const uint8_t *salt,
1258 size_t salt_length,
1259 uint8_t *output,
1260 size_t output_size,
1261 size_t *output_length)
1262{
Kevin Peng96f802e2019-12-26 16:10:25 +08001263#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001264 return PSA_ERROR_NOT_SUPPORTED;
1265#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001266 psa_status_t status;
1267 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001268 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001269 .key_handle = handle,
1270 .alg = alg
1271 };
1272
1273 /* Sanitize the optional input */
1274 if ((salt == NULL) && (salt_length != 0)) {
1275 return PSA_ERROR_INVALID_ARGUMENT;
1276 }
1277
1278 psa_invec in_vec[] = {
1279 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1280 {.base = input, .len = input_length},
1281 {.base = salt, .len = salt_length}
1282 };
1283
1284 psa_outvec out_vec[] = {
1285 {.base = output, .len = output_size},
1286 };
1287
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001288 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001289
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001290 size_t in_len = ARRAY_SIZE(in_vec);
1291 if (salt == NULL) {
1292 in_len--;
1293 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001294 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001295 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001296
1297 *output_length = out_vec[0].len;
1298
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001299 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001300
1301 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001302#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001303}
1304
1305psa_status_t psa_asymmetric_decrypt(psa_key_handle_t handle,
1306 psa_algorithm_t alg,
1307 const uint8_t *input,
1308 size_t input_length,
1309 const uint8_t *salt,
1310 size_t salt_length,
1311 uint8_t *output,
1312 size_t output_size,
1313 size_t *output_length)
1314{
Kevin Peng96f802e2019-12-26 16:10:25 +08001315#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001316 return PSA_ERROR_NOT_SUPPORTED;
1317#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001318 psa_status_t status;
1319 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001320 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001321 .key_handle = handle,
1322 .alg = alg
1323 };
1324
1325 /* Sanitize the optional input */
1326 if ((salt == NULL) && (salt_length != 0)) {
1327 return PSA_ERROR_INVALID_ARGUMENT;
1328 }
1329
1330 psa_invec in_vec[] = {
1331 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1332 {.base = input, .len = input_length},
1333 {.base = salt, .len = salt_length}
1334 };
1335
1336 psa_outvec out_vec[] = {
1337 {.base = output, .len = output_size},
1338 };
1339
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001340 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001341
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001342 size_t in_len = ARRAY_SIZE(in_vec);
1343 if (salt == NULL) {
1344 in_len--;
1345 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001346 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001347 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001348
1349 *output_length = out_vec[0].len;
1350
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001351 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001352
1353 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001354#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001355}
1356
1357psa_status_t psa_get_generator_capacity(const psa_crypto_generator_t *generator,
1358 size_t *capacity)
1359{
Kevin Peng96f802e2019-12-26 16:10:25 +08001360#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001361 return PSA_ERROR_NOT_SUPPORTED;
1362#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001363 psa_status_t status;
1364 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001365 .sfn_id = TFM_CRYPTO_GET_GENERATOR_CAPACITY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001366 .op_handle = generator->handle,
1367 };
1368
1369 psa_invec in_vec[] = {
1370 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1371 };
1372
1373 psa_outvec out_vec[] = {
1374 {.base = capacity, .len = sizeof(size_t)},
1375 };
1376
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001377 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001378
1379 status = API_DISPATCH(tfm_crypto_get_generator_capacity,
1380 TFM_CRYPTO_GET_GENERATOR_CAPACITY);
Kevin Peng9449a362019-07-29 16:05:42 +08001381
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001382 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001383
1384 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001385#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001386}
1387
1388psa_status_t psa_generator_read(psa_crypto_generator_t *generator,
1389 uint8_t *output,
1390 size_t output_length)
1391{
Kevin Peng96f802e2019-12-26 16:10:25 +08001392#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001393 return PSA_ERROR_NOT_SUPPORTED;
1394#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001395 psa_status_t status;
1396 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001397 .sfn_id = TFM_CRYPTO_GENERATOR_READ_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001398 .op_handle = generator->handle,
1399 };
1400
1401 psa_invec in_vec[] = {
1402 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1403 };
1404
1405 psa_outvec out_vec[] = {
1406 {.base = output, .len = output_length},
1407 };
1408
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001409 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001410
1411 status = API_DISPATCH(tfm_crypto_generator_read,
1412 TFM_CRYPTO_GENERATOR_READ);
Kevin Peng9449a362019-07-29 16:05:42 +08001413
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001414 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001415
1416 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001417#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001418}
1419
1420psa_status_t psa_generator_import_key(psa_key_handle_t handle,
1421 psa_key_type_t type,
1422 size_t bits,
1423 psa_crypto_generator_t *generator)
1424{
Kevin Peng96f802e2019-12-26 16:10:25 +08001425#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001426 return PSA_ERROR_NOT_SUPPORTED;
1427#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001428 psa_status_t status;
1429 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001430 .sfn_id = TFM_CRYPTO_GENERATOR_IMPORT_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001431 .key_handle = handle,
1432 .type = type,
1433 .op_handle = generator->handle,
1434 };
1435
1436 psa_invec in_vec[] = {
1437 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1438 {.base = &bits, .len = sizeof(size_t)},
1439 };
1440
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001441 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001442
1443 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_generator_import_key,
1444 TFM_CRYPTO_GENERATOR_IMPORT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +08001445
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001446 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001447
1448 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001449#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001450}
1451
1452psa_status_t psa_generator_abort(psa_crypto_generator_t *generator)
1453{
Kevin Peng96f802e2019-12-26 16:10:25 +08001454#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001455 return PSA_ERROR_NOT_SUPPORTED;
1456#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001457 psa_status_t status;
1458 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001459 .sfn_id = TFM_CRYPTO_GENERATOR_ABORT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001460 .op_handle = generator->handle,
1461 };
1462
1463 psa_invec in_vec[] = {
1464 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1465 };
1466
1467 psa_outvec out_vec[] = {
1468 {.base = &(generator->handle), .len = sizeof(uint32_t)},
1469 };
1470
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001471 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001472
1473 status = API_DISPATCH(tfm_crypto_generator_abort,
1474 TFM_CRYPTO_GENERATOR_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001475
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001476 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001477
1478 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001479#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001480}
1481
1482psa_status_t psa_key_derivation(psa_crypto_generator_t *generator,
1483 psa_key_handle_t handle,
1484 psa_algorithm_t alg,
1485 const uint8_t *salt,
1486 size_t salt_length,
1487 const uint8_t *label,
1488 size_t label_length,
1489 size_t capacity)
1490{
Kevin Peng96f802e2019-12-26 16:10:25 +08001491#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001492 return PSA_ERROR_NOT_SUPPORTED;
1493#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001494 psa_status_t status;
1495 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001496 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001497 .key_handle = handle,
1498 .alg = alg,
1499 .op_handle = generator->handle,
1500 .capacity = capacity,
1501 };
1502
1503 /* Sanitize the optional input */
1504 if ((salt == NULL) && (salt_length != 0)) {
1505 return PSA_ERROR_INVALID_ARGUMENT;
1506 }
1507
1508 if ((label == NULL) && (label_length != 0)) {
1509 return PSA_ERROR_INVALID_ARGUMENT;
1510 }
1511
1512 psa_invec in_vec[] = {
1513 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1514 {.base = salt, .len = salt_length},
1515 {.base = label, .len = label_length},
1516 };
1517
1518 psa_outvec out_vec[] = {
1519 {.base = &(generator->handle), .len = sizeof(uint32_t)},
1520 };
1521
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001522 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001523
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001524 size_t in_len = ARRAY_SIZE(in_vec);
1525 if (label == NULL) {
1526 in_len--;
1527 if (salt == NULL) {
1528 in_len--;
1529 }
1530 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001531 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001532 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001533
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001534 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001535
1536 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001537#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001538}
1539
1540psa_status_t psa_key_agreement(psa_crypto_generator_t *generator,
1541 psa_key_handle_t private_key,
1542 const uint8_t *peer_key,
1543 size_t peer_key_length,
1544 psa_algorithm_t alg)
1545{
Kevin Peng96f802e2019-12-26 16:10:25 +08001546#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001547 return PSA_ERROR_NOT_SUPPORTED;
1548#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001549 psa_status_t status;
1550 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001551 .sfn_id = TFM_CRYPTO_KEY_AGREEMENT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001552 .key_handle = private_key,
1553 .alg = alg,
1554 .op_handle = generator->handle,
1555 };
1556
1557 psa_invec in_vec[] = {
1558 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1559 {.base = peer_key, .len = peer_key_length},
1560 };
1561
1562 psa_outvec out_vec[] = {
1563 {.base = &(generator->handle), .len = sizeof(uint32_t)},
1564 };
1565
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001566 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001567
1568 status = API_DISPATCH(tfm_crypto_key_agreement,
1569 TFM_CRYPTO_KEY_AGREEMENT);
1570
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001571 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001572
1573 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001574#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001575}
1576
1577psa_status_t psa_generate_random(uint8_t *output,
1578 size_t output_size)
1579{
Kevin Peng96f802e2019-12-26 16:10:25 +08001580#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001581 return PSA_ERROR_NOT_SUPPORTED;
1582#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001583 psa_status_t status;
1584 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001585 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001586 };
1587
1588 psa_invec in_vec[] = {
1589 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1590 };
1591
1592 psa_outvec out_vec[] = {
1593 {.base = output, .len = output_size},
1594 };
1595
1596 if (output_size == 0) {
1597 return PSA_SUCCESS;
1598 }
1599
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001600 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001601
1602 status = API_DISPATCH(tfm_crypto_generate_random,
1603 TFM_CRYPTO_GENERATE_RANDOM);
1604
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001605 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001606
1607 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001608#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001609}
1610
1611psa_status_t psa_generate_key(psa_key_handle_t handle,
1612 psa_key_type_t type,
1613 size_t bits,
1614 const void *extra,
1615 size_t extra_size)
1616{
Kevin Peng96f802e2019-12-26 16:10:25 +08001617#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001618 return PSA_ERROR_NOT_SUPPORTED;
1619#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001620 psa_status_t status;
1621 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001622 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001623 .key_handle = handle,
1624 .type = type,
1625 };
1626
1627 /* Sanitize the optional input */
1628 if ((extra == NULL) && (extra_size != 0)) {
1629 return PSA_ERROR_INVALID_ARGUMENT;
1630 }
1631
1632 psa_invec in_vec[] = {
1633 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1634 {.base = &bits, .len = sizeof(size_t)},
1635 {.base = extra, .len = extra_size},
1636 };
1637
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001638 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001639
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001640 size_t in_len = ARRAY_SIZE(in_vec);
1641 if (extra == NULL) {
1642 in_len--;
1643 }
1644
Summer Qin4b1d03b2019-07-02 14:56:08 +08001645 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len, NULL, 0);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001646
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001647 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001648
1649 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001650#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001651}