blob: 1e4df7c02d77d747d7063be5dd6424239d583faf [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
Soby Mathew07ef6e42020-07-20 21:09:23 +0100738psa_status_t psa_hash_compute(psa_algorithm_t alg,
739 const uint8_t *input,
740 size_t input_length,
741 uint8_t *hash,
742 size_t hash_size,
743 size_t *hash_length)
744{
745#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
746 return PSA_ERROR_NOT_SUPPORTED;
747#else
748 psa_status_t status;
749 struct tfm_crypto_pack_iovec iov = {
750 .sfn_id = TFM_CRYPTO_HASH_COMPUTE_SID,
751 .alg = alg,
752 };
753
754 psa_invec in_vec[] = {
755 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
756 {.base = input, .len = input_length},
757 };
758
759 psa_outvec out_vec[] = {
760 {.base = hash, .len = hash_size}
761 };
762
763 PSA_CONNECT(TFM_CRYPTO);
764
765 status = API_DISPATCH(tfm_crypto_hash_compute,
766 TFM_CRYPTO_HASH_COMPUTE);
767
768 *hash_length = out_vec[0].len;
769
770 PSA_CLOSE();
771
772 return status;
773#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
774}
775
776psa_status_t psa_hash_compare(psa_algorithm_t alg,
777 const uint8_t *input,
778 size_t input_length,
779 const uint8_t *hash,
780 size_t hash_length)
781{
782#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
783 return PSA_ERROR_NOT_SUPPORTED;
784#else
785 psa_status_t status;
786 struct tfm_crypto_pack_iovec iov = {
787 .sfn_id = TFM_CRYPTO_HASH_COMPARE_SID,
788 .alg = alg,
789 };
790
791 psa_invec in_vec[] = {
792 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
793 {.base = input, .len = input_length},
794 {.base = hash, .len = hash_length},
795 };
796
797 PSA_CONNECT(TFM_CRYPTO);
798
799 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_hash_compare,
800 TFM_CRYPTO_HASH_COMPARE);
801
802 PSA_CLOSE();
803
804 return status;
805#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
806}
807
808
809
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100810psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100811 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100812 psa_algorithm_t alg)
813{
Kevin Peng96f802e2019-12-26 16:10:25 +0800814#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100815 return PSA_ERROR_NOT_SUPPORTED;
816#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000817 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100818 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800819 .sfn_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100820 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100821 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100822 .op_handle = operation->handle,
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_invec in_vec[] = {
826 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
827 };
828 psa_outvec out_vec[] = {
829 {.base = &(operation->handle), .len = sizeof(uint32_t)},
830 };
831
Antonio de Angelis4743e672019-04-11 11:38:48 +0100832 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100833
834 status = API_DISPATCH(tfm_crypto_mac_sign_setup,
835 TFM_CRYPTO_MAC_SIGN_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800836
Antonio de Angelis4743e672019-04-11 11:38:48 +0100837 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100838
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000839 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100840#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100841}
842
843psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100844 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100845 psa_algorithm_t alg)
846{
Kevin Peng96f802e2019-12-26 16:10:25 +0800847#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100848 return PSA_ERROR_NOT_SUPPORTED;
849#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000850 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100851 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800852 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100853 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100854 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100855 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000856 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100857
Antonio de Angelis4743e672019-04-11 11:38:48 +0100858 psa_invec in_vec[] = {
859 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
860 };
861 psa_outvec out_vec[] = {
862 {.base = &(operation->handle), .len = sizeof(uint32_t)},
863 };
864
Antonio de Angelis4743e672019-04-11 11:38:48 +0100865 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100866
867 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
868 TFM_CRYPTO_MAC_VERIFY_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800869
Antonio de Angelis4743e672019-04-11 11:38:48 +0100870 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100871
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000872 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100873#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100874}
875
876psa_status_t psa_mac_update(psa_mac_operation_t *operation,
877 const uint8_t *input,
878 size_t input_length)
879{
Kevin Peng96f802e2019-12-26 16:10:25 +0800880#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100881 return PSA_ERROR_NOT_SUPPORTED;
882#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000883 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100884 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800885 .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100886 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100887 };
888
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000889 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100890 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000891 {.base = input, .len = input_length},
892 };
893 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100894 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000895 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100896
Antonio de Angelis4743e672019-04-11 11:38:48 +0100897 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100898
899 status = API_DISPATCH(tfm_crypto_mac_update,
900 TFM_CRYPTO_MAC_UPDATE);
Kevin Peng9449a362019-07-29 16:05:42 +0800901
Antonio de Angelis4743e672019-04-11 11:38:48 +0100902 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100903
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000904 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100905#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100906}
907
908psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
909 uint8_t *mac,
910 size_t mac_size,
911 size_t *mac_length)
912{
Kevin Peng96f802e2019-12-26 16:10:25 +0800913#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100914 return PSA_ERROR_NOT_SUPPORTED;
915#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000916 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100917 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800918 .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100919 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100920 };
921
922 psa_invec in_vec[] = {
923 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
924 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000925 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100926 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000927 {.base = mac, .len = mac_size},
928 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100929
Antonio de Angelis4743e672019-04-11 11:38:48 +0100930 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100931
932 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
933 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100934
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000935 *mac_length = out_vec[1].len;
936
Antonio de Angelis4743e672019-04-11 11:38:48 +0100937 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100938
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000939 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100940#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100941}
942
943psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
944 const uint8_t *mac,
945 size_t mac_length)
946{
Kevin Peng96f802e2019-12-26 16:10:25 +0800947#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100948 return PSA_ERROR_NOT_SUPPORTED;
949#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000950 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100951 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800952 .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100953 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100954 };
955
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000956 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100957 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000958 {.base = mac, .len = mac_length},
959 };
960 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100961 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000962 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100963
Antonio de Angelis4743e672019-04-11 11:38:48 +0100964 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100965
966 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
967 TFM_CRYPTO_MAC_VERIFY_FINISH);
968
Antonio de Angelis4743e672019-04-11 11:38:48 +0100969 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100970
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000971 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100972#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100973}
974
975psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
976{
Kevin Peng96f802e2019-12-26 16:10:25 +0800977#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100978 return PSA_ERROR_NOT_SUPPORTED;
979#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000980 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100981 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800982 .sfn_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100983 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000984 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100985
Antonio de Angelis4743e672019-04-11 11:38:48 +0100986 psa_invec in_vec[] = {
987 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
988 };
989 psa_outvec out_vec[] = {
990 {.base = &(operation->handle), .len = sizeof(uint32_t)},
991 };
992
Antonio de Angelis4743e672019-04-11 11:38:48 +0100993 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100994
995 status = API_DISPATCH(tfm_crypto_mac_abort,
996 TFM_CRYPTO_MAC_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800997
Antonio de Angelis4743e672019-04-11 11:38:48 +0100998 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100999
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001000 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001001#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +01001002}
Antonio de Angelis3a480992018-11-07 11:53:28 +00001003
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001004psa_status_t psa_aead_encrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +00001005 psa_algorithm_t alg,
1006 const uint8_t *nonce,
1007 size_t nonce_length,
1008 const uint8_t *additional_data,
1009 size_t additional_data_length,
1010 const uint8_t *plaintext,
1011 size_t plaintext_length,
1012 uint8_t *ciphertext,
1013 size_t ciphertext_size,
1014 size_t *ciphertext_length)
1015{
Kevin Peng96f802e2019-12-26 16:10:25 +08001016#ifdef TFM_CRYPTO_AEAD_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001017 return PSA_ERROR_NOT_SUPPORTED;
1018#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001019 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001020 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001021 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001022 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +01001023 .alg = alg,
1024 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001025 };
Antonio de Angelis4743e672019-04-11 11:38:48 +01001026
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001027 /* Sanitize the optional input */
1028 if ((additional_data == NULL) && (additional_data_length != 0)) {
1029 return PSA_ERROR_INVALID_ARGUMENT;
1030 }
1031
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001032 size_t idx = 0;
1033 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001034 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001035 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +01001036 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001037 };
1038 psa_outvec out_vec[] = {
1039 {.base = ciphertext, .len = ciphertext_size},
1040 };
Antonio de Angelis3a480992018-11-07 11:53:28 +00001041
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001042 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
1043 return PSA_ERROR_INVALID_ARGUMENT;
1044 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001045
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001046 if (nonce != NULL) {
1047 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001048 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001049 }
1050 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001051
Antonio de Angelis4743e672019-04-11 11:38:48 +01001052 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001053
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001054 size_t in_len = ARRAY_SIZE(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001055 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001056 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001057 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001058 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001059 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001060
1061 *ciphertext_length = out_vec[0].len;
1062
Antonio de Angelis4743e672019-04-11 11:38:48 +01001063 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +01001064
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001065 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001066#endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */
Antonio de Angelis3a480992018-11-07 11:53:28 +00001067}
1068
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001069psa_status_t psa_aead_decrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +00001070 psa_algorithm_t alg,
1071 const uint8_t *nonce,
1072 size_t nonce_length,
1073 const uint8_t *additional_data,
1074 size_t additional_data_length,
1075 const uint8_t *ciphertext,
1076 size_t ciphertext_length,
1077 uint8_t *plaintext,
1078 size_t plaintext_size,
1079 size_t *plaintext_length)
1080{
Kevin Peng96f802e2019-12-26 16:10:25 +08001081#ifdef TFM_CRYPTO_AEAD_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001082 return PSA_ERROR_NOT_SUPPORTED;
1083#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001084 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001085 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001086 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001087 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +01001088 .alg = alg,
1089 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001090 };
Antonio de Angelis4743e672019-04-11 11:38:48 +01001091
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001092 /* Sanitize the optional input */
1093 if ((additional_data == NULL) && (additional_data_length != 0)) {
1094 return PSA_ERROR_INVALID_ARGUMENT;
1095 }
1096
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001097 size_t idx = 0;
1098 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001099 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001100 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +01001101 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001102 };
1103 psa_outvec out_vec[] = {
1104 {.base = plaintext, .len = plaintext_size},
1105 };
Antonio de Angelis3a480992018-11-07 11:53:28 +00001106
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001107 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
1108 return PSA_ERROR_INVALID_ARGUMENT;
1109 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001110
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001111 if (nonce != NULL) {
1112 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001113 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001114 }
1115 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001116
Antonio de Angelis4743e672019-04-11 11:38:48 +01001117 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001118
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001119 size_t in_len = ARRAY_SIZE(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001120 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001121 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001122 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001123 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001124 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001125
1126 *plaintext_length = out_vec[0].len;
1127
Antonio de Angelis4743e672019-04-11 11:38:48 +01001128 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +01001129
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001130 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001131#endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */
Antonio de Angelis3a480992018-11-07 11:53:28 +00001132}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001133
1134psa_status_t psa_asymmetric_sign(psa_key_handle_t handle,
1135 psa_algorithm_t alg,
1136 const uint8_t *hash,
1137 size_t hash_length,
1138 uint8_t *signature,
1139 size_t signature_size,
1140 size_t *signature_length)
1141{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001142 return psa_sign_hash(handle, alg, hash, hash_length, signature, signature_size, signature_length);
1143}
1144
1145psa_status_t psa_sign_hash(psa_key_handle_t handle,
1146 psa_algorithm_t alg,
1147 const uint8_t *hash,
1148 size_t hash_length,
1149 uint8_t *signature,
1150 size_t signature_size,
1151 size_t *signature_length)
1152{
Kevin Peng96f802e2019-12-26 16:10:25 +08001153#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001154 return PSA_ERROR_NOT_SUPPORTED;
1155#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001156 psa_status_t status;
1157 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001158 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001159 .key_handle = handle,
1160 .alg = alg,
1161 };
1162
1163 psa_invec in_vec[] = {
1164 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1165 {.base = hash, .len = hash_length},
1166 };
1167 psa_outvec out_vec[] = {
1168 {.base = signature, .len = signature_size},
1169 };
1170
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001171 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001172
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001173 status = API_DISPATCH(tfm_crypto_sign_hash,
1174 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001175
1176 *signature_length = out_vec[0].len;
1177
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001178 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001179
1180 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001181#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001182}
1183
1184psa_status_t psa_asymmetric_verify(psa_key_handle_t handle,
1185 psa_algorithm_t alg,
1186 const uint8_t *hash,
1187 size_t hash_length,
1188 const uint8_t *signature,
1189 size_t signature_length)
1190{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001191 return psa_verify_hash(handle, alg, hash, hash_length, signature, signature_length);
1192}
1193
1194psa_status_t psa_verify_hash(psa_key_handle_t handle,
1195 psa_algorithm_t alg,
1196 const uint8_t *hash,
1197 size_t hash_length,
1198 const uint8_t *signature,
1199 size_t signature_length)
1200{
Kevin Peng96f802e2019-12-26 16:10:25 +08001201#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001202 return PSA_ERROR_NOT_SUPPORTED;
1203#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001204 psa_status_t status;
1205 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001206 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001207 .key_handle = handle,
1208 .alg = alg
1209 };
1210
1211 psa_invec in_vec[] = {
1212 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1213 {.base = hash, .len = hash_length},
1214 {.base = signature, .len = signature_length}
1215 };
1216
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001217 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001218
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001219 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
1220 TFM_CRYPTO_VERIFY_HASH);
Kevin Peng9449a362019-07-29 16:05:42 +08001221
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001222 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001223
1224 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001225#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001226}
1227
1228psa_status_t psa_asymmetric_encrypt(psa_key_handle_t handle,
1229 psa_algorithm_t alg,
1230 const uint8_t *input,
1231 size_t input_length,
1232 const uint8_t *salt,
1233 size_t salt_length,
1234 uint8_t *output,
1235 size_t output_size,
1236 size_t *output_length)
1237{
Kevin Peng96f802e2019-12-26 16:10:25 +08001238#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001239 return PSA_ERROR_NOT_SUPPORTED;
1240#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001241 psa_status_t status;
1242 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001243 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001244 .key_handle = handle,
1245 .alg = alg
1246 };
1247
1248 /* Sanitize the optional input */
1249 if ((salt == NULL) && (salt_length != 0)) {
1250 return PSA_ERROR_INVALID_ARGUMENT;
1251 }
1252
1253 psa_invec in_vec[] = {
1254 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1255 {.base = input, .len = input_length},
1256 {.base = salt, .len = salt_length}
1257 };
1258
1259 psa_outvec out_vec[] = {
1260 {.base = output, .len = output_size},
1261 };
1262
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001263 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001264
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001265 size_t in_len = ARRAY_SIZE(in_vec);
1266 if (salt == NULL) {
1267 in_len--;
1268 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001269 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001270 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001271
1272 *output_length = out_vec[0].len;
1273
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001274 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001275
1276 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001277#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001278}
1279
1280psa_status_t psa_asymmetric_decrypt(psa_key_handle_t handle,
1281 psa_algorithm_t alg,
1282 const uint8_t *input,
1283 size_t input_length,
1284 const uint8_t *salt,
1285 size_t salt_length,
1286 uint8_t *output,
1287 size_t output_size,
1288 size_t *output_length)
1289{
Kevin Peng96f802e2019-12-26 16:10:25 +08001290#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001291 return PSA_ERROR_NOT_SUPPORTED;
1292#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001293 psa_status_t status;
1294 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001295 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001296 .key_handle = handle,
1297 .alg = alg
1298 };
1299
1300 /* Sanitize the optional input */
1301 if ((salt == NULL) && (salt_length != 0)) {
1302 return PSA_ERROR_INVALID_ARGUMENT;
1303 }
1304
1305 psa_invec in_vec[] = {
1306 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1307 {.base = input, .len = input_length},
1308 {.base = salt, .len = salt_length}
1309 };
1310
1311 psa_outvec out_vec[] = {
1312 {.base = output, .len = output_size},
1313 };
1314
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001315 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001316
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001317 size_t in_len = ARRAY_SIZE(in_vec);
1318 if (salt == NULL) {
1319 in_len--;
1320 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001321 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001322 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001323
1324 *output_length = out_vec[0].len;
1325
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001326 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001327
1328 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001329#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001330}
1331
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001332psa_status_t psa_key_derivation_get_capacity(
1333 const psa_key_derivation_operation_t *operation,
1334 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001335{
Kevin Peng96f802e2019-12-26 16:10:25 +08001336#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001337 return PSA_ERROR_NOT_SUPPORTED;
1338#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001339 psa_status_t status;
1340 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001341 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
1342 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001343 };
1344
1345 psa_invec in_vec[] = {
1346 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1347 };
1348
1349 psa_outvec out_vec[] = {
1350 {.base = capacity, .len = sizeof(size_t)},
1351 };
1352
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001353 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001354
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001355 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1356 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Kevin Peng9449a362019-07-29 16:05:42 +08001357
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001358 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001359
1360 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001361#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001362}
1363
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001364psa_status_t psa_key_derivation_output_bytes(
1365 psa_key_derivation_operation_t *operation,
1366 uint8_t *output,
1367 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001368{
Kevin Peng96f802e2019-12-26 16:10:25 +08001369#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001370 return PSA_ERROR_NOT_SUPPORTED;
1371#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001372 psa_status_t status;
1373 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001374 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
1375 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001376 };
1377
1378 psa_invec in_vec[] = {
1379 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1380 };
1381
1382 psa_outvec out_vec[] = {
1383 {.base = output, .len = output_length},
1384 };
1385
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001386 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001387
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001388 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1389 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Kevin Peng9449a362019-07-29 16:05:42 +08001390
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001391 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001392
1393 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001394#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001395}
1396
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001397psa_status_t psa_key_derivation_input_key(
1398 psa_key_derivation_operation_t *operation,
1399 psa_key_derivation_step_t step,
1400 psa_key_handle_t handle)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001401{
Kevin Peng96f802e2019-12-26 16:10:25 +08001402#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001403 return PSA_ERROR_NOT_SUPPORTED;
1404#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001405 psa_status_t status;
1406 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001407 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001408 .key_handle = handle,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001409 .step = step,
1410 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001411 };
1412
1413 psa_invec in_vec[] = {
1414 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001415 };
1416
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001417 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001418
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001419 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1420 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +08001421
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001422 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001423
1424 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001425#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001426}
1427
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001428psa_status_t psa_key_derivation_abort(
1429 psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001430{
Kevin Peng96f802e2019-12-26 16:10:25 +08001431#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001432 return PSA_ERROR_NOT_SUPPORTED;
1433#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001434 psa_status_t status;
1435 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001436 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
1437 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001438 };
1439
1440 psa_invec in_vec[] = {
1441 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1442 };
1443
1444 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001445 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001446 };
1447
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001448 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001449
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001450 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1451 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001452
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001453 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001454
1455 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001456#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001457}
1458
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001459psa_status_t psa_key_derivation_key_agreement(
1460 psa_key_derivation_operation_t *operation,
1461 psa_key_derivation_step_t step,
1462 psa_key_handle_t private_key,
1463 const uint8_t *peer_key,
1464 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001465{
Kevin Peng96f802e2019-12-26 16:10:25 +08001466#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001467 return PSA_ERROR_NOT_SUPPORTED;
1468#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001469 psa_status_t status;
1470 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001471 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001472 .key_handle = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001473 .step = step,
1474 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001475 };
1476
1477 psa_invec in_vec[] = {
1478 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1479 {.base = peer_key, .len = peer_key_length},
1480 };
1481
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001482 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001483
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001484 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1485 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001486
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001487 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001488
1489 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001490#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001491}
1492
1493psa_status_t psa_generate_random(uint8_t *output,
1494 size_t output_size)
1495{
Kevin Peng96f802e2019-12-26 16:10:25 +08001496#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001497 return PSA_ERROR_NOT_SUPPORTED;
1498#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001499 psa_status_t status;
1500 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001501 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001502 };
1503
1504 psa_invec in_vec[] = {
1505 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1506 };
1507
1508 psa_outvec out_vec[] = {
1509 {.base = output, .len = output_size},
1510 };
1511
1512 if (output_size == 0) {
1513 return PSA_SUCCESS;
1514 }
1515
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001516 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001517
1518 status = API_DISPATCH(tfm_crypto_generate_random,
1519 TFM_CRYPTO_GENERATE_RANDOM);
1520
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001521 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001522
1523 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001524#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001525}
1526
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001527psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
1528 psa_key_handle_t *handle)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001529{
Kevin Peng96f802e2019-12-26 16:10:25 +08001530#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001531 return PSA_ERROR_NOT_SUPPORTED;
1532#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001533 psa_status_t status;
1534 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001535 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001536 };
1537
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001538 psa_invec in_vec[] = {
1539 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001540 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1541 };
1542
1543 psa_outvec out_vec[] = {
1544 {.base = handle, .len = sizeof(psa_key_handle_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001545 };
1546
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001547 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001548
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001549 status = API_DISPATCH(tfm_crypto_generate_key,
1550 TFM_CRYPTO_GENERATE_KEY);
1551 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001552
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001553 return status;
1554#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1555}
1556
1557psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes,
1558 psa_key_type_t type,
1559 const uint8_t *data,
1560 size_t data_length)
1561{
1562 psa_status_t status;
1563
1564 status = PSA_ERROR_NOT_SUPPORTED;
1565
1566 return status;
1567}
1568
1569psa_status_t psa_get_key_domain_parameters(
1570 const psa_key_attributes_t *attributes,
1571 uint8_t *data,
1572 size_t data_size,
1573 size_t *data_length)
1574{
1575 psa_status_t status;
1576
1577 status = PSA_ERROR_NOT_SUPPORTED;
1578
1579 return status;
1580}
1581
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001582psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1583 const uint8_t *input,
1584 size_t input_length)
1585{
1586 psa_status_t status;
1587
1588 status = PSA_ERROR_NOT_SUPPORTED;
1589
1590 return status;
1591}
1592
1593psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1594 uint8_t *ciphertext,
1595 size_t ciphertext_size,
1596 size_t *ciphertext_length,
1597 uint8_t *tag,
1598 size_t tag_size,
1599 size_t *tag_length)
1600{
1601 psa_status_t status;
1602
1603 status = PSA_ERROR_NOT_SUPPORTED;
1604
1605 return status;
1606}
1607
1608psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1609 uint8_t *plaintext,
1610 size_t plaintext_size,
1611 size_t *plaintext_length,
1612 const uint8_t *tag,
1613 size_t tag_length)
1614{
1615 psa_status_t status;
1616
1617 status = PSA_ERROR_NOT_SUPPORTED;
1618
1619 return status;
1620}
1621
1622psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1623{
1624 psa_status_t status;
1625
1626 status = PSA_ERROR_NOT_SUPPORTED;
1627
1628 return status;
1629}
1630
1631psa_status_t psa_mac_compute(psa_key_handle_t handle,
1632 psa_algorithm_t alg,
1633 const uint8_t *input,
1634 size_t input_length,
1635 uint8_t *mac,
1636 size_t mac_size,
1637 size_t *mac_length)
1638{
1639 psa_status_t status;
1640
1641 status = PSA_ERROR_NOT_SUPPORTED;
1642
1643 return status;
1644}
1645
1646psa_status_t psa_mac_verify(psa_key_handle_t handle,
1647 psa_algorithm_t alg,
1648 const uint8_t *input,
1649 size_t input_length,
1650 const uint8_t *mac,
1651 const size_t mac_length)
1652{
1653 psa_status_t status;
1654
1655 status = PSA_ERROR_NOT_SUPPORTED;
1656
1657 return status;
1658}
1659
1660psa_status_t psa_cipher_encrypt(psa_key_handle_t handle,
1661 psa_algorithm_t alg,
1662 const uint8_t *input,
1663 size_t input_length,
1664 uint8_t *output,
1665 size_t output_size,
1666 size_t *output_length)
1667{
1668 psa_status_t status;
1669
1670 status = PSA_ERROR_NOT_SUPPORTED;
1671
1672 return status;
1673}
1674
1675psa_status_t psa_cipher_decrypt(psa_key_handle_t handle,
1676 psa_algorithm_t alg,
1677 const uint8_t *input,
1678 size_t input_length,
1679 uint8_t *output,
1680 size_t output_size,
1681 size_t *output_length)
1682{
1683 psa_status_t status;
1684
1685 status = PSA_ERROR_NOT_SUPPORTED;
1686
1687 return status;
1688}
1689
1690psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
1691 psa_key_handle_t private_key,
1692 const uint8_t *peer_key,
1693 size_t peer_key_length,
1694 uint8_t *output,
1695 size_t output_size,
1696 size_t *output_length)
1697{
1698#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1699 return PSA_ERROR_NOT_SUPPORTED;
1700#else
1701 psa_status_t status;
1702 struct tfm_crypto_pack_iovec iov = {
1703 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1704 .alg = alg,
1705 .key_handle = private_key
1706 };
1707
1708 psa_invec in_vec[] = {
1709 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1710 {.base = peer_key, .len = peer_key_length},
1711 };
1712
1713 psa_outvec out_vec[] = {
1714 {.base = output, .len = output_size},
1715 };
1716
1717 PSA_CONNECT(TFM_CRYPTO);
1718
1719 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1720 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1721
1722 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001723
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001724 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001725
1726 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001727#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001728}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001729
1730psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1731 psa_algorithm_t alg)
1732{
1733#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1734 return PSA_ERROR_NOT_SUPPORTED;
1735#else
1736 psa_status_t status;
1737 struct tfm_crypto_pack_iovec iov = {
1738 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1739 .alg = alg,
1740 .op_handle = operation->handle,
1741 };
1742
1743 psa_invec in_vec[] = {
1744 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1745 };
1746 psa_outvec out_vec[] = {
1747 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1748 };
1749
1750 PSA_CONNECT(TFM_CRYPTO);
1751
1752 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1753 TFM_CRYPTO_KEY_DERIVATION_SETUP);
1754 PSA_CLOSE();
1755
1756 return status;
1757#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1758}
1759
1760psa_status_t psa_key_derivation_set_capacity(
1761 psa_key_derivation_operation_t *operation,
1762 size_t capacity)
1763{
1764#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1765 return PSA_ERROR_NOT_SUPPORTED;
1766#else
1767 psa_status_t status;
1768 struct tfm_crypto_pack_iovec iov = {
1769 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
1770 .capacity = capacity,
1771 .op_handle = operation->handle,
1772 };
1773
1774 psa_invec in_vec[] = {
1775 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1776 };
1777
1778 PSA_CONNECT(TFM_CRYPTO);
1779
1780 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1781 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
1782 PSA_CLOSE();
1783
1784 return status;
1785#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1786}
1787
1788psa_status_t psa_key_derivation_input_bytes(
1789 psa_key_derivation_operation_t *operation,
1790 psa_key_derivation_step_t step,
1791 const uint8_t *data,
1792 size_t data_length)
1793{
1794#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1795 return PSA_ERROR_NOT_SUPPORTED;
1796#else
1797 psa_status_t status;
1798 struct tfm_crypto_pack_iovec iov = {
1799 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1800 .step = step,
1801 .op_handle = operation->handle,
1802 };
1803
1804 psa_invec in_vec[] = {
1805 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1806 {.base = data, .len = data_length},
1807 };
1808
1809 PSA_CONNECT(TFM_CRYPTO);
1810
1811 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1812 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
1813 PSA_CLOSE();
1814
1815 return status;
1816#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1817}
1818
1819psa_status_t psa_key_derivation_output_key(
1820 const psa_key_attributes_t *attributes,
1821 psa_key_derivation_operation_t *operation,
1822 psa_key_handle_t *handle)
1823{
1824#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1825 return PSA_ERROR_NOT_SUPPORTED;
1826#else
1827 psa_status_t status;
1828 struct tfm_crypto_pack_iovec iov = {
1829 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1830 .op_handle = operation->handle,
1831 };
1832
1833 psa_invec in_vec[] = {
1834 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1835 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1836 };
1837
1838 psa_outvec out_vec[] = {
1839 {.base = handle, .len = sizeof(psa_key_handle_t)}
1840 };
1841
1842 PSA_CONNECT(TFM_CRYPTO);
1843
1844 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1845 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
1846 PSA_CLOSE();
1847
1848 return status;
1849#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1850}
1851
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001852psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
1853 psa_key_handle_t handle,
1854 psa_algorithm_t alg)
1855{
1856 psa_status_t status;
1857
1858 status = PSA_ERROR_NOT_SUPPORTED;
1859
1860 return status;
1861}
1862
1863psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
1864 psa_key_handle_t handle,
1865 psa_algorithm_t alg)
1866{
1867 psa_status_t status;
1868
1869 status = PSA_ERROR_NOT_SUPPORTED;
1870
1871 return status;
1872}
1873
1874psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
1875 uint8_t *nonce,
1876 size_t nonce_size,
1877 size_t *nonce_length)
1878{
1879 psa_status_t status;
1880
1881 status = PSA_ERROR_NOT_SUPPORTED;
1882
1883 return status;
1884}
1885
1886psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
1887 const uint8_t *nonce,
1888 size_t nonce_length)
1889{
1890 psa_status_t status;
1891
1892 status = PSA_ERROR_NOT_SUPPORTED;
1893
1894 return status;
1895}
1896
1897psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
1898 size_t ad_length,
1899 size_t plaintext_length)
1900{
1901 psa_status_t status;
1902
1903 status = PSA_ERROR_NOT_SUPPORTED;
1904
1905 return status;
1906}
1907
1908psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1909 const uint8_t *input,
1910 size_t input_length,
1911 uint8_t *output,
1912 size_t output_size,
1913 size_t *output_length)
1914{
1915 psa_status_t status;
1916
1917 status = PSA_ERROR_NOT_SUPPORTED;
1918
1919 return status;
1920}