blob: 70b3a0dfe597190ffcb5c675789414d70b66eb87 [file] [log] [blame]
Antonio de Angelis8908f472018-08-31 15:44:25 +01001/*
Antonio de Angelis04debbd2019-10-14 12:12:52 +01002 * Copyright (c) 2018-2020, Arm Limited. All rights reserved.
Antonio de Angelis8908f472018-08-31 15:44:25 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00008#include "tfm_crypto_defs.h"
Jamie Foxcc31d402019-01-28 17:13:52 +00009#include "psa/crypto.h"
Antonio de Angelis05b24192019-07-04 15:28:46 +010010#include "tfm_ns_interface.h"
Edison Aicc4c6162019-06-21 13:52:49 +080011#include "psa_manifest/sid.h"
Kevin Peng9449a362019-07-29 16:05:42 +080012#include "psa/client.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000013
Antonio de Angelis4743e672019-04-11 11:38:48 +010014#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000015
Jamie Fox0e54ebc2019-04-09 14:21:04 +010016#define PSA_CONNECT(service) \
17 psa_handle_t ipc_handle; \
Edison Aicc4c6162019-06-21 13:52:49 +080018 ipc_handle = psa_connect(service##_SID, service##_VERSION); \
Summer Qinb207a152019-07-03 16:36:49 +080019 if (!PSA_HANDLE_IS_VALID(ipc_handle)) { \
Jamie Fox0e54ebc2019-04-09 14:21:04 +010020 return PSA_ERROR_GENERIC_ERROR; \
21 } \
Antonio de Angelis4743e672019-04-11 11:38:48 +010022
Jamie Fox0e54ebc2019-04-09 14:21:04 +010023#define PSA_CLOSE() psa_close(ipc_handle)
Antonio de Angelis4743e672019-04-11 11:38:48 +010024
Jamie Fox0e54ebc2019-04-09 14:21:04 +010025#define API_DISPATCH(sfn_name, sfn_id) \
Summer Qin4b1d03b2019-07-02 14:56:08 +080026 psa_call(ipc_handle, PSA_IPC_CALL, \
Jamie Fox0e54ebc2019-04-09 14:21:04 +010027 in_vec, ARRAY_SIZE(in_vec), \
Antonio de Angelis4743e672019-04-11 11:38:48 +010028 out_vec, ARRAY_SIZE(out_vec))
29
Jamie Fox0e54ebc2019-04-09 14:21:04 +010030#define API_DISPATCH_NO_OUTVEC(sfn_name, sfn_id) \
Summer Qin4b1d03b2019-07-02 14:56:08 +080031 psa_call(ipc_handle, PSA_IPC_CALL, \
Jamie Fox0e54ebc2019-04-09 14:21:04 +010032 in_vec, ARRAY_SIZE(in_vec), \
Antonio de Angelis4743e672019-04-11 11:38:48 +010033 (psa_outvec *)NULL, 0)
Antonio de Angelis8908f472018-08-31 15:44:25 +010034
35psa_status_t psa_crypto_init(void)
36{
37 /* Service init is performed during TFM boot up,
38 * so application level initialisation is empty
39 */
40 return PSA_SUCCESS;
41}
42
Antonio de Angelis04debbd2019-10-14 12:12:52 +010043psa_status_t psa_open_key(psa_key_id_t id,
Jamie Fox0e54ebc2019-04-09 14:21:04 +010044 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 Foxdadb4e82019-09-03 17:59:41 +010049 psa_status_t status;
50 const struct tfm_crypto_pack_iovec iov = {
51 .sfn_id = TFM_CRYPTO_OPEN_KEY_SID,
Jamie Foxdadb4e82019-09-03 17:59:41 +010052 };
53 psa_invec in_vec[] = {
54 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
55 {.base = &id, .len = sizeof(psa_key_id_t)},
56 };
57 psa_outvec out_vec[] = {
58 {.base = handle, .len = sizeof(psa_key_handle_t)},
59 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010060
Jamie Foxdadb4e82019-09-03 17:59:41 +010061 PSA_CONNECT(TFM_CRYPTO);
62
63 status = API_DISPATCH(tfm_crypto_open_key,
64 TFM_CRYPTO_OPEN_KEY);
65
66 PSA_CLOSE();
67
68 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +010069#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +010070}
71
Jamie Fox0e54ebc2019-04-09 14:21:04 +010072psa_status_t psa_close_key(psa_key_handle_t handle)
73{
Kevin Peng96f802e2019-12-26 16:10:25 +080074#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +010075 return PSA_ERROR_NOT_SUPPORTED;
76#else
Jamie Foxdadb4e82019-09-03 17:59:41 +010077 psa_status_t status;
78 const struct tfm_crypto_pack_iovec iov = {
79 .sfn_id = TFM_CRYPTO_CLOSE_KEY_SID,
80 .key_handle = handle,
81 };
82 psa_invec in_vec[] = {
83 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
84 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010085
Jamie Foxdadb4e82019-09-03 17:59:41 +010086 PSA_CONNECT(TFM_CRYPTO);
87
88 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_close_key,
89 TFM_CRYPTO_CLOSE_KEY);;
90
91 PSA_CLOSE();
92
93 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +010094#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +010095}
96
Antonio de Angelis04debbd2019-10-14 12:12:52 +010097psa_status_t psa_import_key(const psa_key_attributes_t *attributes,
Antonio de Angelis8908f472018-08-31 15:44:25 +010098 const uint8_t *data,
Antonio de Angelis04debbd2019-10-14 12:12:52 +010099 size_t data_length,
100 psa_key_handle_t *handle)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100101{
Kevin Peng96f802e2019-12-26 16:10:25 +0800102#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100103 return PSA_ERROR_NOT_SUPPORTED;
104#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000105 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100106 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800107 .sfn_id = TFM_CRYPTO_IMPORT_KEY_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100108 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000109 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100110 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100111 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000112 {.base = data, .len = data_length}
113 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100114 psa_outvec out_vec[] = {
115 {.base = handle, .len = sizeof(psa_key_handle_t)}
116 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100117
Antonio de Angelis4743e672019-04-11 11:38:48 +0100118 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100119
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100120 status = API_DISPATCH(tfm_crypto_import_key,
121 TFM_CRYPTO_IMPORT_KEY);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100122 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100123
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000124 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100125#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100126}
127
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100128psa_status_t psa_destroy_key(psa_key_handle_t handle)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100129{
Kevin Peng96f802e2019-12-26 16:10:25 +0800130#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100131 return PSA_ERROR_NOT_SUPPORTED;
132#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000133 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100134 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800135 .sfn_id = TFM_CRYPTO_DESTROY_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100136 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100137 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000138 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100139 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000140 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100141
Antonio de Angelis4743e672019-04-11 11:38:48 +0100142 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100143
144 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_destroy_key,
145 TFM_CRYPTO_DESTROY_KEY);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100146 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100147
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000148 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100149#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100150}
151
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100152psa_status_t psa_get_key_attributes(psa_key_handle_t handle,
153 psa_key_attributes_t *attributes)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100154{
Kevin Peng96f802e2019-12-26 16:10:25 +0800155#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100156 return PSA_ERROR_NOT_SUPPORTED;
157#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000158 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100159 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100160 .sfn_id = TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100161 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100162 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000163 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100164 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000165 };
166 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100167 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000168 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100169
Antonio de Angelis4743e672019-04-11 11:38:48 +0100170 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100171
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100172 status = API_DISPATCH(tfm_crypto_get_key_attributes,
173 TFM_CRYPTO_GET_KEY_ATTRIBUTES);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100174 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100175
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000176 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100177#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100178}
179
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100180void psa_reset_key_attributes(psa_key_attributes_t *attributes)
181{
182#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
183 return;
184#else
185 struct tfm_crypto_pack_iovec iov = {
186 .sfn_id = TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID,
187 };
188 psa_invec in_vec[] = {
189 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
190 };
191 psa_outvec out_vec[] = {
192 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
193 };
194
195 psa_handle_t ipc_handle;
196 ipc_handle = psa_connect(TFM_CRYPTO_SID, TFM_CRYPTO_VERSION);
197 if (!PSA_HANDLE_IS_VALID(ipc_handle)) {
198 return;
199 }
200
201 (void)API_DISPATCH(tfm_crypto_reset_key_attributes,
202 TFM_CRYPTO_RESET_KEY_ATTRIBUTES);
203 PSA_CLOSE();
204
205 return;
206#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
207}
208
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100209psa_status_t psa_export_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100210 uint8_t *data,
211 size_t data_size,
212 size_t *data_length)
213{
Kevin Peng96f802e2019-12-26 16:10:25 +0800214#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100215 return PSA_ERROR_NOT_SUPPORTED;
216#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000217 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100218 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800219 .sfn_id = TFM_CRYPTO_EXPORT_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100220 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100221 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000222 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100223 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000224 };
225 psa_outvec out_vec[] = {
226 {.base = data, .len = data_size}
227 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100228
Antonio de Angelis4743e672019-04-11 11:38:48 +0100229 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100230
231 status = API_DISPATCH(tfm_crypto_export_key,
232 TFM_CRYPTO_EXPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100233
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000234 *data_length = out_vec[0].len;
235
Antonio de Angelis4743e672019-04-11 11:38:48 +0100236 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100237
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000238 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100239#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100240}
241
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100242psa_status_t psa_export_public_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100243 uint8_t *data,
244 size_t data_size,
245 size_t *data_length)
246{
Kevin Peng96f802e2019-12-26 16:10:25 +0800247#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100248 return PSA_ERROR_NOT_SUPPORTED;
249#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100250 psa_status_t status;
251 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800252 .sfn_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100253 .key_handle = handle,
254 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000255
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100256 psa_invec in_vec[] = {
257 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
258 };
259 psa_outvec out_vec[] = {
260 {.base = data, .len = data_size}
261 };
262
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100263 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100264
265 status = API_DISPATCH(tfm_crypto_export_public_key,
266 TFM_CRYPTO_EXPORT_PUBLIC_KEY);
267
268 *data_length = out_vec[0].len;
269
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100270 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100271
272 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100273#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100274}
275
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100276psa_status_t psa_copy_key(psa_key_handle_t source_handle,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100277 const psa_key_attributes_t *attributes,
278 psa_key_handle_t *target_handle)
Jamie Foxefd82732018-11-26 10:34:32 +0000279{
Kevin Peng96f802e2019-12-26 16:10:25 +0800280#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100281 return PSA_ERROR_NOT_SUPPORTED;
282#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100283 psa_status_t status;
284 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800285 .sfn_id = TFM_CRYPTO_COPY_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100286 .key_handle = source_handle,
287 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000288
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100289 psa_invec in_vec[] = {
290 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100291 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
292
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100293 };
294
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000295 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100296 {.base = target_handle, .len = sizeof(psa_key_handle_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000297 };
Jamie Foxefd82732018-11-26 10:34:32 +0000298
Antonio de Angelis4743e672019-04-11 11:38:48 +0100299 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100300
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100301 status = API_DISPATCH(tfm_crypto_copy_key,
302 TFM_CRYPTO_COPY_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +0800303
Antonio de Angelis4743e672019-04-11 11:38:48 +0100304 PSA_CLOSE();
Jamie Foxefd82732018-11-26 10:34:32 +0000305
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000306 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100307#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Foxefd82732018-11-26 10:34:32 +0000308}
309
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100310psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
311 unsigned char *iv,
312 size_t iv_size,
313 size_t *iv_length)
314{
Kevin Peng96f802e2019-12-26 16:10:25 +0800315#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100316 return PSA_ERROR_NOT_SUPPORTED;
317#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100318 psa_status_t status;
319 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800320 .sfn_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100321 .op_handle = operation->handle,
322 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100323
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100324 psa_invec in_vec[] = {
325 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
326 };
327 psa_outvec out_vec[] = {
328 {.base = &(operation->handle), .len = sizeof(uint32_t)},
329 {.base = iv, .len = iv_size},
330 };
331
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100332 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100333
334 status = API_DISPATCH(tfm_crypto_cipher_generate_iv,
335 TFM_CRYPTO_CIPHER_GENERATE_IV);
336
337 *iv_length = out_vec[1].len;
338
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100339 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100340
341 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100342#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100343}
344
Antonio de Angelis377a1552018-11-22 17:02:40 +0000345psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
346 const unsigned char *iv,
347 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100348{
Kevin Peng96f802e2019-12-26 16:10:25 +0800349#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100350 return PSA_ERROR_NOT_SUPPORTED;
351#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000352 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100353 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800354 .sfn_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100355 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100356 };
357
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000358 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100359 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000360 {.base = iv, .len = iv_length},
361 };
362 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100363 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000364 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100365
Antonio de Angelis4743e672019-04-11 11:38:48 +0100366 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100367
368 status = API_DISPATCH(tfm_crypto_cipher_set_iv,
369 TFM_CRYPTO_CIPHER_SET_IV);
Kevin Peng9449a362019-07-29 16:05:42 +0800370
Antonio de Angelis4743e672019-04-11 11:38:48 +0100371 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100372
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000373 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100374#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100375}
376
Antonio de Angelis377a1552018-11-22 17:02:40 +0000377psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100378 psa_key_handle_t handle,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000379 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100380{
Kevin Peng96f802e2019-12-26 16:10:25 +0800381#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100382 return PSA_ERROR_NOT_SUPPORTED;
383#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000384 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100385 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800386 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100387 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100388 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100389 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000390 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100391
Antonio de Angelis4743e672019-04-11 11:38:48 +0100392 psa_invec in_vec[] = {
393 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
394 };
395 psa_outvec out_vec[] = {
396 {.base = &(operation->handle), .len = sizeof(uint32_t)},
397 };
398
Antonio de Angelis4743e672019-04-11 11:38:48 +0100399 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100400
401 status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup,
402 TFM_CRYPTO_CIPHER_ENCRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800403
Antonio de Angelis4743e672019-04-11 11:38:48 +0100404 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100405
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000406 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100407#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100408}
409
Antonio de Angelis377a1552018-11-22 17:02:40 +0000410psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100411 psa_key_handle_t handle,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000412 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100413{
Kevin Peng96f802e2019-12-26 16:10:25 +0800414#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100415 return PSA_ERROR_NOT_SUPPORTED;
416#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000417 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100418 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800419 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100420 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100421 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100422 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000423 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100424
Antonio de Angelis4743e672019-04-11 11:38:48 +0100425 psa_invec in_vec[] = {
426 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
427 };
428 psa_outvec out_vec[] = {
429 {.base = &(operation->handle), .len = sizeof(uint32_t)},
430 };
431
Antonio de Angelis4743e672019-04-11 11:38:48 +0100432 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100433
434 status = API_DISPATCH(tfm_crypto_cipher_decrypt_setup,
435 TFM_CRYPTO_CIPHER_DECRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800436
Antonio de Angelis4743e672019-04-11 11:38:48 +0100437 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100438
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000439 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100440#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100441}
442
443psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
444 const uint8_t *input,
445 size_t input_length,
446 unsigned char *output,
447 size_t output_size,
448 size_t *output_length)
449{
Kevin Peng96f802e2019-12-26 16:10:25 +0800450#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100451 return PSA_ERROR_NOT_SUPPORTED;
452#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000453 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100454 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800455 .sfn_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100456 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100457 };
458
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000459 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100460 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000461 {.base = input, .len = input_length},
462 };
463 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100464 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000465 {.base = output, .len = output_size}
466 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100467
Antonio de Angelis4743e672019-04-11 11:38:48 +0100468 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100469
470 status = API_DISPATCH(tfm_crypto_cipher_update,
471 TFM_CRYPTO_CIPHER_UPDATE);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100472
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000473 *output_length = out_vec[1].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100474
Antonio de Angelis4743e672019-04-11 11:38:48 +0100475 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100476
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000477 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100478#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100479}
480
481psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
482{
Kevin Peng96f802e2019-12-26 16:10:25 +0800483#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100484 return PSA_ERROR_NOT_SUPPORTED;
485#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000486 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100487 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800488 .sfn_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100489 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000490 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100491
Antonio de Angelis4743e672019-04-11 11:38:48 +0100492 psa_invec in_vec[] = {
493 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
494 };
495 psa_outvec out_vec[] = {
496 {.base = &(operation->handle), .len = sizeof(uint32_t)},
497 };
498
Antonio de Angelis4743e672019-04-11 11:38:48 +0100499 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100500
501 status = API_DISPATCH(tfm_crypto_cipher_abort,
502 TFM_CRYPTO_CIPHER_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800503
Antonio de Angelis4743e672019-04-11 11:38:48 +0100504 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100505
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000506 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100507#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100508}
509
510psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
511 uint8_t *output,
512 size_t output_size,
513 size_t *output_length)
514{
Kevin Peng96f802e2019-12-26 16:10:25 +0800515#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100516 return PSA_ERROR_NOT_SUPPORTED;
517#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000518 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100519 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800520 .sfn_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100521 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100522 };
523
524 psa_invec in_vec[] = {
525 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
526 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000527 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100528 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000529 {.base = output, .len = output_size},
530 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100531
Antonio de Angelis4743e672019-04-11 11:38:48 +0100532 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100533
534 status = API_DISPATCH(tfm_crypto_cipher_finish,
535 TFM_CRYPTO_CIPHER_FINISH);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100536
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000537 *output_length = out_vec[1].len;
538
Antonio de Angelis4743e672019-04-11 11:38:48 +0100539 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100540
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000541 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100542#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100543}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100544
Antonio de Angelis377a1552018-11-22 17:02:40 +0000545psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100546 psa_algorithm_t alg)
547{
Kevin Peng96f802e2019-12-26 16:10:25 +0800548#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100549 return PSA_ERROR_NOT_SUPPORTED;
550#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000551 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100552 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800553 .sfn_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100554 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100555 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000556 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100557
Antonio de Angelis4743e672019-04-11 11:38:48 +0100558 psa_invec in_vec[] = {
559 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
560 };
561 psa_outvec out_vec[] = {
562 {.base = &(operation->handle), .len = sizeof(uint32_t)},
563 };
564
Antonio de Angelis4743e672019-04-11 11:38:48 +0100565 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100566
567 status = API_DISPATCH(tfm_crypto_hash_setup,
568 TFM_CRYPTO_HASH_SETUP);
569
Antonio de Angelis4743e672019-04-11 11:38:48 +0100570 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100571
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000572 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100573#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100574}
575
576psa_status_t psa_hash_update(psa_hash_operation_t *operation,
577 const uint8_t *input,
578 size_t input_length)
579{
Kevin Peng96f802e2019-12-26 16:10:25 +0800580#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100581 return PSA_ERROR_NOT_SUPPORTED;
582#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000583 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100584 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800585 .sfn_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100586 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100587 };
588
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000589 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100590 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000591 {.base = input, .len = input_length},
592 };
593 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100594 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000595 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100596
Antonio de Angelis4743e672019-04-11 11:38:48 +0100597 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100598
599 status = API_DISPATCH(tfm_crypto_hash_update,
600 TFM_CRYPTO_HASH_UPDATE);
601
Antonio de Angelis4743e672019-04-11 11:38:48 +0100602 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100603
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000604 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100605#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100606}
607
608psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
609 uint8_t *hash,
610 size_t hash_size,
611 size_t *hash_length)
612{
Kevin Peng96f802e2019-12-26 16:10:25 +0800613#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100614 return PSA_ERROR_NOT_SUPPORTED;
615#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000616 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100617 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800618 .sfn_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100619 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100620 };
621
622 psa_invec in_vec[] = {
623 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
624 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000625 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100626 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000627 {.base = hash, .len = hash_size},
628 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100629
Antonio de Angelis4743e672019-04-11 11:38:48 +0100630 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100631
632 status = API_DISPATCH(tfm_crypto_hash_finish,
633 TFM_CRYPTO_HASH_FINISH);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100634
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000635 *hash_length = out_vec[1].len;
636
Antonio de Angelis4743e672019-04-11 11:38:48 +0100637 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100638
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000639 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100640#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100641}
642
643psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
644 const uint8_t *hash,
645 size_t hash_length)
646{
Kevin Peng96f802e2019-12-26 16:10:25 +0800647#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100648 return PSA_ERROR_NOT_SUPPORTED;
649#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000650 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100651 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800652 .sfn_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100653 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100654 };
655
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000656 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100657 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000658 {.base = hash, .len = hash_length},
659 };
660 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100661 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000662 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100663
Antonio de Angelis4743e672019-04-11 11:38:48 +0100664 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100665
666 status = API_DISPATCH(tfm_crypto_hash_verify,
667 TFM_CRYPTO_HASH_VERIFY);
Kevin Peng9449a362019-07-29 16:05:42 +0800668
Antonio de Angelis4743e672019-04-11 11:38:48 +0100669 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100670
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000671 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100672#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100673}
674
675psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
676{
Kevin Peng96f802e2019-12-26 16:10:25 +0800677#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100678 return PSA_ERROR_NOT_SUPPORTED;
679#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000680 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100681 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800682 .sfn_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100683 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000684 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100685
Antonio de Angelis4743e672019-04-11 11:38:48 +0100686 psa_invec in_vec[] = {
687 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
688 };
689 psa_outvec out_vec[] = {
690 {.base = &(operation->handle), .len = sizeof(uint32_t)},
691 };
692
Antonio de Angelis4743e672019-04-11 11:38:48 +0100693 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100694
695 status = API_DISPATCH(tfm_crypto_hash_abort,
696 TFM_CRYPTO_HASH_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800697
Antonio de Angelis4743e672019-04-11 11:38:48 +0100698 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100699
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000700 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100701#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100702}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100703
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100704psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
705 psa_hash_operation_t *target_operation)
706{
Kevin Peng96f802e2019-12-26 16:10:25 +0800707#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100708 return PSA_ERROR_NOT_SUPPORTED;
709#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100710 psa_status_t status;
711 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800712 .sfn_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100713 .op_handle = source_operation->handle,
714 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100715
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100716 psa_invec in_vec[] = {
717 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
718 };
719 psa_outvec out_vec[] = {
720 {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
721 };
722
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100723 if (target_operation && (target_operation->handle != 0)) {
724 return PSA_ERROR_BAD_STATE;
725 }
726
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100727 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100728
729 status = API_DISPATCH(tfm_crypto_hash_clone,
730 TFM_CRYPTO_HASH_CLONE);
Kevin Peng9449a362019-07-29 16:05:42 +0800731
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100732 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100733
734 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100735#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100736}
737
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100738psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100739 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100740 psa_algorithm_t alg)
741{
Kevin Peng96f802e2019-12-26 16:10:25 +0800742#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100743 return PSA_ERROR_NOT_SUPPORTED;
744#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000745 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100746 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800747 .sfn_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100748 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100749 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100750 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000751 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100752
Antonio de Angelis4743e672019-04-11 11:38:48 +0100753 psa_invec in_vec[] = {
754 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
755 };
756 psa_outvec out_vec[] = {
757 {.base = &(operation->handle), .len = sizeof(uint32_t)},
758 };
759
Antonio de Angelis4743e672019-04-11 11:38:48 +0100760 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100761
762 status = API_DISPATCH(tfm_crypto_mac_sign_setup,
763 TFM_CRYPTO_MAC_SIGN_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800764
Antonio de Angelis4743e672019-04-11 11:38:48 +0100765 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100766
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000767 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100768#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100769}
770
771psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100772 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100773 psa_algorithm_t alg)
774{
Kevin Peng96f802e2019-12-26 16:10:25 +0800775#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100776 return PSA_ERROR_NOT_SUPPORTED;
777#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000778 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100779 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800780 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100781 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100782 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100783 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000784 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100785
Antonio de Angelis4743e672019-04-11 11:38:48 +0100786 psa_invec in_vec[] = {
787 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
788 };
789 psa_outvec out_vec[] = {
790 {.base = &(operation->handle), .len = sizeof(uint32_t)},
791 };
792
Antonio de Angelis4743e672019-04-11 11:38:48 +0100793 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100794
795 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
796 TFM_CRYPTO_MAC_VERIFY_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800797
Antonio de Angelis4743e672019-04-11 11:38:48 +0100798 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100799
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000800 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100801#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100802}
803
804psa_status_t psa_mac_update(psa_mac_operation_t *operation,
805 const uint8_t *input,
806 size_t input_length)
807{
Kevin Peng96f802e2019-12-26 16:10:25 +0800808#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100809 return PSA_ERROR_NOT_SUPPORTED;
810#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000811 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100812 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800813 .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100814 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100815 };
816
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000817 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100818 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000819 {.base = input, .len = input_length},
820 };
821 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100822 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000823 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100824
Antonio de Angelis4743e672019-04-11 11:38:48 +0100825 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100826
827 status = API_DISPATCH(tfm_crypto_mac_update,
828 TFM_CRYPTO_MAC_UPDATE);
Kevin Peng9449a362019-07-29 16:05:42 +0800829
Antonio de Angelis4743e672019-04-11 11:38:48 +0100830 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100831
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000832 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100833#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100834}
835
836psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
837 uint8_t *mac,
838 size_t mac_size,
839 size_t *mac_length)
840{
Kevin Peng96f802e2019-12-26 16:10:25 +0800841#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100842 return PSA_ERROR_NOT_SUPPORTED;
843#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000844 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100845 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800846 .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100847 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100848 };
849
850 psa_invec in_vec[] = {
851 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
852 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000853 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100854 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000855 {.base = mac, .len = mac_size},
856 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100857
Antonio de Angelis4743e672019-04-11 11:38:48 +0100858 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100859
860 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
861 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100862
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000863 *mac_length = out_vec[1].len;
864
Antonio de Angelis4743e672019-04-11 11:38:48 +0100865 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100866
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000867 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100868#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100869}
870
871psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
872 const uint8_t *mac,
873 size_t mac_length)
874{
Kevin Peng96f802e2019-12-26 16:10:25 +0800875#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100876 return PSA_ERROR_NOT_SUPPORTED;
877#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000878 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100879 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800880 .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100881 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100882 };
883
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000884 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100885 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000886 {.base = mac, .len = mac_length},
887 };
888 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100889 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000890 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100891
Antonio de Angelis4743e672019-04-11 11:38:48 +0100892 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100893
894 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
895 TFM_CRYPTO_MAC_VERIFY_FINISH);
896
Antonio de Angelis4743e672019-04-11 11:38:48 +0100897 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100898
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000899 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100900#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100901}
902
903psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
904{
Kevin Peng96f802e2019-12-26 16:10:25 +0800905#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100906 return PSA_ERROR_NOT_SUPPORTED;
907#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000908 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100909 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800910 .sfn_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100911 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000912 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100913
Antonio de Angelis4743e672019-04-11 11:38:48 +0100914 psa_invec in_vec[] = {
915 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
916 };
917 psa_outvec out_vec[] = {
918 {.base = &(operation->handle), .len = sizeof(uint32_t)},
919 };
920
Antonio de Angelis4743e672019-04-11 11:38:48 +0100921 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100922
923 status = API_DISPATCH(tfm_crypto_mac_abort,
924 TFM_CRYPTO_MAC_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800925
Antonio de Angelis4743e672019-04-11 11:38:48 +0100926 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100927
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000928 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100929#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100930}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000931
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100932psa_status_t psa_aead_encrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000933 psa_algorithm_t alg,
934 const uint8_t *nonce,
935 size_t nonce_length,
936 const uint8_t *additional_data,
937 size_t additional_data_length,
938 const uint8_t *plaintext,
939 size_t plaintext_length,
940 uint8_t *ciphertext,
941 size_t ciphertext_size,
942 size_t *ciphertext_length)
943{
Kevin Peng96f802e2019-12-26 16:10:25 +0800944#ifdef TFM_CRYPTO_AEAD_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100945 return PSA_ERROR_NOT_SUPPORTED;
946#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000947 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100948 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800949 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100950 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100951 .alg = alg,
952 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000953 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100954
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100955 /* Sanitize the optional input */
956 if ((additional_data == NULL) && (additional_data_length != 0)) {
957 return PSA_ERROR_INVALID_ARGUMENT;
958 }
959
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000960 size_t idx = 0;
961 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100962 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000963 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100964 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000965 };
966 psa_outvec out_vec[] = {
967 {.base = ciphertext, .len = ciphertext_size},
968 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000969
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000970 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
971 return PSA_ERROR_INVALID_ARGUMENT;
972 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000973
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000974 if (nonce != NULL) {
975 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100976 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000977 }
978 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000979
Antonio de Angelis4743e672019-04-11 11:38:48 +0100980 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100981
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100982 size_t in_len = ARRAY_SIZE(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100983 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100984 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100985 }
Summer Qin4b1d03b2019-07-02 14:56:08 +0800986 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100987 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000988
989 *ciphertext_length = out_vec[0].len;
990
Antonio de Angelis4743e672019-04-11 11:38:48 +0100991 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100992
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000993 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100994#endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */
Antonio de Angelis3a480992018-11-07 11:53:28 +0000995}
996
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100997psa_status_t psa_aead_decrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000998 psa_algorithm_t alg,
999 const uint8_t *nonce,
1000 size_t nonce_length,
1001 const uint8_t *additional_data,
1002 size_t additional_data_length,
1003 const uint8_t *ciphertext,
1004 size_t ciphertext_length,
1005 uint8_t *plaintext,
1006 size_t plaintext_size,
1007 size_t *plaintext_length)
1008{
Kevin Peng96f802e2019-12-26 16:10:25 +08001009#ifdef TFM_CRYPTO_AEAD_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001010 return PSA_ERROR_NOT_SUPPORTED;
1011#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001012 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001013 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001014 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001015 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +01001016 .alg = alg,
1017 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001018 };
Antonio de Angelis4743e672019-04-11 11:38:48 +01001019
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001020 /* Sanitize the optional input */
1021 if ((additional_data == NULL) && (additional_data_length != 0)) {
1022 return PSA_ERROR_INVALID_ARGUMENT;
1023 }
1024
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001025 size_t idx = 0;
1026 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001027 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001028 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +01001029 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001030 };
1031 psa_outvec out_vec[] = {
1032 {.base = plaintext, .len = plaintext_size},
1033 };
Antonio de Angelis3a480992018-11-07 11:53:28 +00001034
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001035 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
1036 return PSA_ERROR_INVALID_ARGUMENT;
1037 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001038
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001039 if (nonce != NULL) {
1040 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001041 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001042 }
1043 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001044
Antonio de Angelis4743e672019-04-11 11:38:48 +01001045 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001046
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001047 size_t in_len = ARRAY_SIZE(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001048 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001049 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001050 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001051 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001052 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001053
1054 *plaintext_length = out_vec[0].len;
1055
Antonio de Angelis4743e672019-04-11 11:38:48 +01001056 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +01001057
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001058 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001059#endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */
Antonio de Angelis3a480992018-11-07 11:53:28 +00001060}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001061
1062psa_status_t psa_asymmetric_sign(psa_key_handle_t handle,
1063 psa_algorithm_t alg,
1064 const uint8_t *hash,
1065 size_t hash_length,
1066 uint8_t *signature,
1067 size_t signature_size,
1068 size_t *signature_length)
1069{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001070 return psa_sign_hash(handle, alg, hash, hash_length, signature, signature_size, signature_length);
1071}
1072
1073psa_status_t psa_sign_hash(psa_key_handle_t handle,
1074 psa_algorithm_t alg,
1075 const uint8_t *hash,
1076 size_t hash_length,
1077 uint8_t *signature,
1078 size_t signature_size,
1079 size_t *signature_length)
1080{
Kevin Peng96f802e2019-12-26 16:10:25 +08001081#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001082 return PSA_ERROR_NOT_SUPPORTED;
1083#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001084 psa_status_t status;
1085 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001086 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001087 .key_handle = handle,
1088 .alg = alg,
1089 };
1090
1091 psa_invec in_vec[] = {
1092 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1093 {.base = hash, .len = hash_length},
1094 };
1095 psa_outvec out_vec[] = {
1096 {.base = signature, .len = signature_size},
1097 };
1098
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001099 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001100
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001101 status = API_DISPATCH(tfm_crypto_sign_hash,
1102 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001103
1104 *signature_length = out_vec[0].len;
1105
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001106 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001107
1108 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001109#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001110}
1111
1112psa_status_t psa_asymmetric_verify(psa_key_handle_t handle,
1113 psa_algorithm_t alg,
1114 const uint8_t *hash,
1115 size_t hash_length,
1116 const uint8_t *signature,
1117 size_t signature_length)
1118{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001119 return psa_verify_hash(handle, alg, hash, hash_length, signature, signature_length);
1120}
1121
1122psa_status_t psa_verify_hash(psa_key_handle_t handle,
1123 psa_algorithm_t alg,
1124 const uint8_t *hash,
1125 size_t hash_length,
1126 const uint8_t *signature,
1127 size_t signature_length)
1128{
Kevin Peng96f802e2019-12-26 16:10:25 +08001129#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001130 return PSA_ERROR_NOT_SUPPORTED;
1131#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001132 psa_status_t status;
1133 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001134 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001135 .key_handle = handle,
1136 .alg = alg
1137 };
1138
1139 psa_invec in_vec[] = {
1140 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1141 {.base = hash, .len = hash_length},
1142 {.base = signature, .len = signature_length}
1143 };
1144
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001145 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001146
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001147 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
1148 TFM_CRYPTO_VERIFY_HASH);
Kevin Peng9449a362019-07-29 16:05:42 +08001149
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001150 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001151
1152 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001153#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001154}
1155
1156psa_status_t psa_asymmetric_encrypt(psa_key_handle_t handle,
1157 psa_algorithm_t alg,
1158 const uint8_t *input,
1159 size_t input_length,
1160 const uint8_t *salt,
1161 size_t salt_length,
1162 uint8_t *output,
1163 size_t output_size,
1164 size_t *output_length)
1165{
Kevin Peng96f802e2019-12-26 16:10:25 +08001166#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001167 return PSA_ERROR_NOT_SUPPORTED;
1168#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001169 psa_status_t status;
1170 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001171 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001172 .key_handle = handle,
1173 .alg = alg
1174 };
1175
1176 /* Sanitize the optional input */
1177 if ((salt == NULL) && (salt_length != 0)) {
1178 return PSA_ERROR_INVALID_ARGUMENT;
1179 }
1180
1181 psa_invec in_vec[] = {
1182 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1183 {.base = input, .len = input_length},
1184 {.base = salt, .len = salt_length}
1185 };
1186
1187 psa_outvec out_vec[] = {
1188 {.base = output, .len = output_size},
1189 };
1190
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001191 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001192
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001193 size_t in_len = ARRAY_SIZE(in_vec);
1194 if (salt == NULL) {
1195 in_len--;
1196 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001197 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001198 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001199
1200 *output_length = out_vec[0].len;
1201
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001202 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001203
1204 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001205#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001206}
1207
1208psa_status_t psa_asymmetric_decrypt(psa_key_handle_t handle,
1209 psa_algorithm_t alg,
1210 const uint8_t *input,
1211 size_t input_length,
1212 const uint8_t *salt,
1213 size_t salt_length,
1214 uint8_t *output,
1215 size_t output_size,
1216 size_t *output_length)
1217{
Kevin Peng96f802e2019-12-26 16:10:25 +08001218#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001219 return PSA_ERROR_NOT_SUPPORTED;
1220#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001221 psa_status_t status;
1222 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001223 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001224 .key_handle = handle,
1225 .alg = alg
1226 };
1227
1228 /* Sanitize the optional input */
1229 if ((salt == NULL) && (salt_length != 0)) {
1230 return PSA_ERROR_INVALID_ARGUMENT;
1231 }
1232
1233 psa_invec in_vec[] = {
1234 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1235 {.base = input, .len = input_length},
1236 {.base = salt, .len = salt_length}
1237 };
1238
1239 psa_outvec out_vec[] = {
1240 {.base = output, .len = output_size},
1241 };
1242
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001243 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001244
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001245 size_t in_len = ARRAY_SIZE(in_vec);
1246 if (salt == NULL) {
1247 in_len--;
1248 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001249 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001250 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001251
1252 *output_length = out_vec[0].len;
1253
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001254 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001255
1256 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001257#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001258}
1259
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001260psa_status_t psa_key_derivation_get_capacity(
1261 const psa_key_derivation_operation_t *operation,
1262 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001263{
Kevin Peng96f802e2019-12-26 16:10:25 +08001264#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001265 return PSA_ERROR_NOT_SUPPORTED;
1266#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001267 psa_status_t status;
1268 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001269 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
1270 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001271 };
1272
1273 psa_invec in_vec[] = {
1274 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1275 };
1276
1277 psa_outvec out_vec[] = {
1278 {.base = capacity, .len = sizeof(size_t)},
1279 };
1280
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001281 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001282
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001283 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1284 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Kevin Peng9449a362019-07-29 16:05:42 +08001285
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001286 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001287
1288 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001289#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001290}
1291
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001292psa_status_t psa_key_derivation_output_bytes(
1293 psa_key_derivation_operation_t *operation,
1294 uint8_t *output,
1295 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001296{
Kevin Peng96f802e2019-12-26 16:10:25 +08001297#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001298 return PSA_ERROR_NOT_SUPPORTED;
1299#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001300 psa_status_t status;
1301 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001302 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
1303 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001304 };
1305
1306 psa_invec in_vec[] = {
1307 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1308 };
1309
1310 psa_outvec out_vec[] = {
1311 {.base = output, .len = output_length},
1312 };
1313
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001314 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001315
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001316 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1317 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Kevin Peng9449a362019-07-29 16:05:42 +08001318
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001319 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001320
1321 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001322#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001323}
1324
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001325psa_status_t psa_key_derivation_input_key(
1326 psa_key_derivation_operation_t *operation,
1327 psa_key_derivation_step_t step,
1328 psa_key_handle_t handle)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001329{
Kevin Peng96f802e2019-12-26 16:10:25 +08001330#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001331 return PSA_ERROR_NOT_SUPPORTED;
1332#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001333 psa_status_t status;
1334 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001335 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001336 .key_handle = handle,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001337 .step = step,
1338 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001339 };
1340
1341 psa_invec in_vec[] = {
1342 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001343 };
1344
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001345 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001346
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001347 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1348 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +08001349
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001350 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001351
1352 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001353#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001354}
1355
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001356psa_status_t psa_key_derivation_abort(
1357 psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001358{
Kevin Peng96f802e2019-12-26 16:10:25 +08001359#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001360 return PSA_ERROR_NOT_SUPPORTED;
1361#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001362 psa_status_t status;
1363 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001364 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
1365 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001366 };
1367
1368 psa_invec in_vec[] = {
1369 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1370 };
1371
1372 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001373 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001374 };
1375
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001376 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001377
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001378 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1379 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001380
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001381 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001382
1383 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001384#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001385}
1386
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001387psa_status_t psa_key_derivation_key_agreement(
1388 psa_key_derivation_operation_t *operation,
1389 psa_key_derivation_step_t step,
1390 psa_key_handle_t private_key,
1391 const uint8_t *peer_key,
1392 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001393{
Kevin Peng96f802e2019-12-26 16:10:25 +08001394#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001395 return PSA_ERROR_NOT_SUPPORTED;
1396#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001397 psa_status_t status;
1398 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001399 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001400 .key_handle = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001401 .step = step,
1402 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001403 };
1404
1405 psa_invec in_vec[] = {
1406 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1407 {.base = peer_key, .len = peer_key_length},
1408 };
1409
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001410 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001411
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001412 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1413 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001414
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001415 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001416
1417 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001418#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001419}
1420
1421psa_status_t psa_generate_random(uint8_t *output,
1422 size_t output_size)
1423{
Kevin Peng96f802e2019-12-26 16:10:25 +08001424#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001425 return PSA_ERROR_NOT_SUPPORTED;
1426#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001427 psa_status_t status;
1428 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001429 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001430 };
1431
1432 psa_invec in_vec[] = {
1433 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1434 };
1435
1436 psa_outvec out_vec[] = {
1437 {.base = output, .len = output_size},
1438 };
1439
1440 if (output_size == 0) {
1441 return PSA_SUCCESS;
1442 }
1443
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001444 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001445
1446 status = API_DISPATCH(tfm_crypto_generate_random,
1447 TFM_CRYPTO_GENERATE_RANDOM);
1448
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001449 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001450
1451 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001452#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001453}
1454
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001455psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
1456 psa_key_handle_t *handle)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001457{
Kevin Peng96f802e2019-12-26 16:10:25 +08001458#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001459 return PSA_ERROR_NOT_SUPPORTED;
1460#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001461 psa_status_t status;
1462 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001463 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001464 };
1465
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001466 psa_invec in_vec[] = {
1467 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001468 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1469 };
1470
1471 psa_outvec out_vec[] = {
1472 {.base = handle, .len = sizeof(psa_key_handle_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001473 };
1474
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001475 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001476
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001477 status = API_DISPATCH(tfm_crypto_generate_key,
1478 TFM_CRYPTO_GENERATE_KEY);
1479 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001480
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001481 return status;
1482#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1483}
1484
1485psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes,
1486 psa_key_type_t type,
1487 const uint8_t *data,
1488 size_t data_length)
1489{
1490 psa_status_t status;
1491
1492 status = PSA_ERROR_NOT_SUPPORTED;
1493
1494 return status;
1495}
1496
1497psa_status_t psa_get_key_domain_parameters(
1498 const psa_key_attributes_t *attributes,
1499 uint8_t *data,
1500 size_t data_size,
1501 size_t *data_length)
1502{
1503 psa_status_t status;
1504
1505 status = PSA_ERROR_NOT_SUPPORTED;
1506
1507 return status;
1508}
1509
1510psa_status_t psa_hash_compare(psa_algorithm_t alg,
1511 const uint8_t *input,
1512 size_t input_length,
1513 const uint8_t *hash,
1514 const size_t hash_length)
1515{
1516 psa_status_t status;
1517
1518 status = PSA_ERROR_NOT_SUPPORTED;
1519
1520 return status;
1521}
1522
1523psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1524 const uint8_t *input,
1525 size_t input_length)
1526{
1527 psa_status_t status;
1528
1529 status = PSA_ERROR_NOT_SUPPORTED;
1530
1531 return status;
1532}
1533
1534psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1535 uint8_t *ciphertext,
1536 size_t ciphertext_size,
1537 size_t *ciphertext_length,
1538 uint8_t *tag,
1539 size_t tag_size,
1540 size_t *tag_length)
1541{
1542 psa_status_t status;
1543
1544 status = PSA_ERROR_NOT_SUPPORTED;
1545
1546 return status;
1547}
1548
1549psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1550 uint8_t *plaintext,
1551 size_t plaintext_size,
1552 size_t *plaintext_length,
1553 const uint8_t *tag,
1554 size_t tag_length)
1555{
1556 psa_status_t status;
1557
1558 status = PSA_ERROR_NOT_SUPPORTED;
1559
1560 return status;
1561}
1562
1563psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1564{
1565 psa_status_t status;
1566
1567 status = PSA_ERROR_NOT_SUPPORTED;
1568
1569 return status;
1570}
1571
1572psa_status_t psa_mac_compute(psa_key_handle_t handle,
1573 psa_algorithm_t alg,
1574 const uint8_t *input,
1575 size_t input_length,
1576 uint8_t *mac,
1577 size_t mac_size,
1578 size_t *mac_length)
1579{
1580 psa_status_t status;
1581
1582 status = PSA_ERROR_NOT_SUPPORTED;
1583
1584 return status;
1585}
1586
1587psa_status_t psa_mac_verify(psa_key_handle_t handle,
1588 psa_algorithm_t alg,
1589 const uint8_t *input,
1590 size_t input_length,
1591 const uint8_t *mac,
1592 const size_t mac_length)
1593{
1594 psa_status_t status;
1595
1596 status = PSA_ERROR_NOT_SUPPORTED;
1597
1598 return status;
1599}
1600
1601psa_status_t psa_cipher_encrypt(psa_key_handle_t handle,
1602 psa_algorithm_t alg,
1603 const uint8_t *input,
1604 size_t input_length,
1605 uint8_t *output,
1606 size_t output_size,
1607 size_t *output_length)
1608{
1609 psa_status_t status;
1610
1611 status = PSA_ERROR_NOT_SUPPORTED;
1612
1613 return status;
1614}
1615
1616psa_status_t psa_cipher_decrypt(psa_key_handle_t handle,
1617 psa_algorithm_t alg,
1618 const uint8_t *input,
1619 size_t input_length,
1620 uint8_t *output,
1621 size_t output_size,
1622 size_t *output_length)
1623{
1624 psa_status_t status;
1625
1626 status = PSA_ERROR_NOT_SUPPORTED;
1627
1628 return status;
1629}
1630
1631psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
1632 psa_key_handle_t private_key,
1633 const uint8_t *peer_key,
1634 size_t peer_key_length,
1635 uint8_t *output,
1636 size_t output_size,
1637 size_t *output_length)
1638{
1639#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1640 return PSA_ERROR_NOT_SUPPORTED;
1641#else
1642 psa_status_t status;
1643 struct tfm_crypto_pack_iovec iov = {
1644 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1645 .alg = alg,
1646 .key_handle = private_key
1647 };
1648
1649 psa_invec in_vec[] = {
1650 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1651 {.base = peer_key, .len = peer_key_length},
1652 };
1653
1654 psa_outvec out_vec[] = {
1655 {.base = output, .len = output_size},
1656 };
1657
1658 PSA_CONNECT(TFM_CRYPTO);
1659
1660 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1661 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1662
1663 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001664
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001665 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001666
1667 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001668#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001669}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001670
1671psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1672 psa_algorithm_t alg)
1673{
1674#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1675 return PSA_ERROR_NOT_SUPPORTED;
1676#else
1677 psa_status_t status;
1678 struct tfm_crypto_pack_iovec iov = {
1679 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1680 .alg = alg,
1681 .op_handle = operation->handle,
1682 };
1683
1684 psa_invec in_vec[] = {
1685 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1686 };
1687 psa_outvec out_vec[] = {
1688 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1689 };
1690
1691 PSA_CONNECT(TFM_CRYPTO);
1692
1693 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1694 TFM_CRYPTO_KEY_DERIVATION_SETUP);
1695 PSA_CLOSE();
1696
1697 return status;
1698#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1699}
1700
1701psa_status_t psa_key_derivation_set_capacity(
1702 psa_key_derivation_operation_t *operation,
1703 size_t capacity)
1704{
1705#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1706 return PSA_ERROR_NOT_SUPPORTED;
1707#else
1708 psa_status_t status;
1709 struct tfm_crypto_pack_iovec iov = {
1710 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
1711 .capacity = capacity,
1712 .op_handle = operation->handle,
1713 };
1714
1715 psa_invec in_vec[] = {
1716 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1717 };
1718
1719 PSA_CONNECT(TFM_CRYPTO);
1720
1721 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1722 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
1723 PSA_CLOSE();
1724
1725 return status;
1726#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1727}
1728
1729psa_status_t psa_key_derivation_input_bytes(
1730 psa_key_derivation_operation_t *operation,
1731 psa_key_derivation_step_t step,
1732 const uint8_t *data,
1733 size_t data_length)
1734{
1735#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1736 return PSA_ERROR_NOT_SUPPORTED;
1737#else
1738 psa_status_t status;
1739 struct tfm_crypto_pack_iovec iov = {
1740 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1741 .step = step,
1742 .op_handle = operation->handle,
1743 };
1744
1745 psa_invec in_vec[] = {
1746 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1747 {.base = data, .len = data_length},
1748 };
1749
1750 PSA_CONNECT(TFM_CRYPTO);
1751
1752 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1753 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
1754 PSA_CLOSE();
1755
1756 return status;
1757#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1758}
1759
1760psa_status_t psa_key_derivation_output_key(
1761 const psa_key_attributes_t *attributes,
1762 psa_key_derivation_operation_t *operation,
1763 psa_key_handle_t *handle)
1764{
1765#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1766 return PSA_ERROR_NOT_SUPPORTED;
1767#else
1768 psa_status_t status;
1769 struct tfm_crypto_pack_iovec iov = {
1770 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1771 .op_handle = operation->handle,
1772 };
1773
1774 psa_invec in_vec[] = {
1775 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1776 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1777 };
1778
1779 psa_outvec out_vec[] = {
1780 {.base = handle, .len = sizeof(psa_key_handle_t)}
1781 };
1782
1783 PSA_CONNECT(TFM_CRYPTO);
1784
1785 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1786 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
1787 PSA_CLOSE();
1788
1789 return status;
1790#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1791}
1792
1793psa_status_t psa_hash_compute(psa_algorithm_t alg,
1794 const uint8_t *input,
1795 size_t input_length,
1796 uint8_t *hash,
1797 size_t hash_size,
1798 size_t *hash_length)
1799{
1800 psa_status_t status;
1801
1802 status = PSA_ERROR_NOT_SUPPORTED;
1803
1804 return status;
1805}
1806
1807psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
1808 psa_key_handle_t handle,
1809 psa_algorithm_t alg)
1810{
1811 psa_status_t status;
1812
1813 status = PSA_ERROR_NOT_SUPPORTED;
1814
1815 return status;
1816}
1817
1818psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
1819 psa_key_handle_t handle,
1820 psa_algorithm_t alg)
1821{
1822 psa_status_t status;
1823
1824 status = PSA_ERROR_NOT_SUPPORTED;
1825
1826 return status;
1827}
1828
1829psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
1830 uint8_t *nonce,
1831 size_t nonce_size,
1832 size_t *nonce_length)
1833{
1834 psa_status_t status;
1835
1836 status = PSA_ERROR_NOT_SUPPORTED;
1837
1838 return status;
1839}
1840
1841psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
1842 const uint8_t *nonce,
1843 size_t nonce_length)
1844{
1845 psa_status_t status;
1846
1847 status = PSA_ERROR_NOT_SUPPORTED;
1848
1849 return status;
1850}
1851
1852psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
1853 size_t ad_length,
1854 size_t plaintext_length)
1855{
1856 psa_status_t status;
1857
1858 status = PSA_ERROR_NOT_SUPPORTED;
1859
1860 return status;
1861}
1862
1863psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1864 const uint8_t *input,
1865 size_t input_length,
1866 uint8_t *output,
1867 size_t output_size,
1868 size_t *output_length)
1869{
1870 psa_status_t status;
1871
1872 status = PSA_ERROR_NOT_SUPPORTED;
1873
1874 return status;
1875}