blob: 9e27ade61bc73b306acc07236e8f3886e897ca5c [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_veneers.h"
9#include "tfm_crypto_defs.h"
Jamie Foxcc31d402019-01-28 17:13:52 +000010#include "psa/crypto.h"
Antonio de Angelis05b24192019-07-04 15:28:46 +010011#include "tfm_ns_interface.h"
Edison Aicc4c6162019-06-21 13:52:49 +080012#include "psa_manifest/sid.h"
Kevin Peng9449a362019-07-29 16:05:42 +080013#include "psa/client.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000014
Antonio de Angelis4743e672019-04-11 11:38:48 +010015#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000016
Jamie Fox0e54ebc2019-04-09 14:21:04 +010017#define PSA_CONNECT(service) \
18 psa_handle_t ipc_handle; \
Edison Aicc4c6162019-06-21 13:52:49 +080019 ipc_handle = psa_connect(service##_SID, service##_VERSION); \
Summer Qinb207a152019-07-03 16:36:49 +080020 if (!PSA_HANDLE_IS_VALID(ipc_handle)) { \
Jamie Fox0e54ebc2019-04-09 14:21:04 +010021 return PSA_ERROR_GENERIC_ERROR; \
22 } \
Antonio de Angelis4743e672019-04-11 11:38:48 +010023
Jamie Fox0e54ebc2019-04-09 14:21:04 +010024#define PSA_CLOSE() psa_close(ipc_handle)
Antonio de Angelis4743e672019-04-11 11:38:48 +010025
Jamie Fox0e54ebc2019-04-09 14:21:04 +010026#define API_DISPATCH(sfn_name, sfn_id) \
Summer Qin4b1d03b2019-07-02 14:56:08 +080027 psa_call(ipc_handle, PSA_IPC_CALL, \
Jamie Fox0e54ebc2019-04-09 14:21:04 +010028 in_vec, ARRAY_SIZE(in_vec), \
Antonio de Angelis4743e672019-04-11 11:38:48 +010029 out_vec, ARRAY_SIZE(out_vec))
30
Jamie Fox0e54ebc2019-04-09 14:21:04 +010031#define API_DISPATCH_NO_OUTVEC(sfn_name, sfn_id) \
Summer Qin4b1d03b2019-07-02 14:56:08 +080032 psa_call(ipc_handle, PSA_IPC_CALL, \
Jamie Fox0e54ebc2019-04-09 14:21:04 +010033 in_vec, ARRAY_SIZE(in_vec), \
Antonio de Angelis4743e672019-04-11 11:38:48 +010034 (psa_outvec *)NULL, 0)
Antonio de Angelis8908f472018-08-31 15:44:25 +010035
36psa_status_t psa_crypto_init(void)
37{
38 /* Service init is performed during TFM boot up,
39 * so application level initialisation is empty
40 */
41 return PSA_SUCCESS;
42}
43
Antonio de Angelis04debbd2019-10-14 12:12:52 +010044psa_status_t psa_open_key(psa_key_id_t id,
Jamie Fox0e54ebc2019-04-09 14:21:04 +010045 psa_key_handle_t *handle)
46{
Kevin Peng96f802e2019-12-26 16:10:25 +080047#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +010048 return PSA_ERROR_NOT_SUPPORTED;
49#else
Jamie Foxdadb4e82019-09-03 17:59:41 +010050 psa_status_t status;
51 const struct tfm_crypto_pack_iovec iov = {
52 .sfn_id = TFM_CRYPTO_OPEN_KEY_SID,
Jamie Foxdadb4e82019-09-03 17:59:41 +010053 };
54 psa_invec in_vec[] = {
55 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
56 {.base = &id, .len = sizeof(psa_key_id_t)},
57 };
58 psa_outvec out_vec[] = {
59 {.base = handle, .len = sizeof(psa_key_handle_t)},
60 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010061
Jamie Foxdadb4e82019-09-03 17:59:41 +010062 PSA_CONNECT(TFM_CRYPTO);
63
64 status = API_DISPATCH(tfm_crypto_open_key,
65 TFM_CRYPTO_OPEN_KEY);
66
67 PSA_CLOSE();
68
69 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +010070#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +010071}
72
Jamie Fox0e54ebc2019-04-09 14:21:04 +010073psa_status_t psa_close_key(psa_key_handle_t handle)
74{
Kevin Peng96f802e2019-12-26 16:10:25 +080075#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +010076 return PSA_ERROR_NOT_SUPPORTED;
77#else
Jamie Foxdadb4e82019-09-03 17:59:41 +010078 psa_status_t status;
79 const struct tfm_crypto_pack_iovec iov = {
80 .sfn_id = TFM_CRYPTO_CLOSE_KEY_SID,
81 .key_handle = handle,
82 };
83 psa_invec in_vec[] = {
84 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
85 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010086
Jamie Foxdadb4e82019-09-03 17:59:41 +010087 PSA_CONNECT(TFM_CRYPTO);
88
89 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_close_key,
90 TFM_CRYPTO_CLOSE_KEY);;
91
92 PSA_CLOSE();
93
94 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +010095#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +010096}
97
Antonio de Angelis04debbd2019-10-14 12:12:52 +010098psa_status_t psa_import_key(const psa_key_attributes_t *attributes,
Antonio de Angelis8908f472018-08-31 15:44:25 +010099 const uint8_t *data,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100100 size_t data_length,
101 psa_key_handle_t *handle)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100102{
Kevin Peng96f802e2019-12-26 16:10:25 +0800103#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100104 return PSA_ERROR_NOT_SUPPORTED;
105#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000106 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100107 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800108 .sfn_id = TFM_CRYPTO_IMPORT_KEY_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100109 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000110 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100111 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100112 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000113 {.base = data, .len = data_length}
114 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100115 psa_outvec out_vec[] = {
116 {.base = handle, .len = sizeof(psa_key_handle_t)}
117 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100118
Antonio de Angelis4743e672019-04-11 11:38:48 +0100119 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100120
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100121 status = API_DISPATCH(tfm_crypto_import_key,
122 TFM_CRYPTO_IMPORT_KEY);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100123 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100124
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000125 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100126#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100127}
128
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100129psa_status_t psa_destroy_key(psa_key_handle_t handle)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100130{
Kevin Peng96f802e2019-12-26 16:10:25 +0800131#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100132 return PSA_ERROR_NOT_SUPPORTED;
133#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000134 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100135 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800136 .sfn_id = TFM_CRYPTO_DESTROY_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100137 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100138 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000139 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100140 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000141 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100142
Antonio de Angelis4743e672019-04-11 11:38:48 +0100143 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100144
145 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_destroy_key,
146 TFM_CRYPTO_DESTROY_KEY);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100147 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100148
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000149 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100150#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100151}
152
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100153psa_status_t psa_get_key_attributes(psa_key_handle_t handle,
154 psa_key_attributes_t *attributes)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100155{
Kevin Peng96f802e2019-12-26 16:10:25 +0800156#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100157 return PSA_ERROR_NOT_SUPPORTED;
158#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000159 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100160 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100161 .sfn_id = TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100162 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100163 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000164 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100165 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000166 };
167 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100168 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000169 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100170
Antonio de Angelis4743e672019-04-11 11:38:48 +0100171 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100172
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100173 status = API_DISPATCH(tfm_crypto_get_key_attributes,
174 TFM_CRYPTO_GET_KEY_ATTRIBUTES);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100175 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100176
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000177 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100178#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100179}
180
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100181void psa_reset_key_attributes(psa_key_attributes_t *attributes)
182{
183#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
184 return;
185#else
186 struct tfm_crypto_pack_iovec iov = {
187 .sfn_id = TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID,
188 };
189 psa_invec in_vec[] = {
190 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
191 };
192 psa_outvec out_vec[] = {
193 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
194 };
195
196 psa_handle_t ipc_handle;
197 ipc_handle = psa_connect(TFM_CRYPTO_SID, TFM_CRYPTO_VERSION);
198 if (!PSA_HANDLE_IS_VALID(ipc_handle)) {
199 return;
200 }
201
202 (void)API_DISPATCH(tfm_crypto_reset_key_attributes,
203 TFM_CRYPTO_RESET_KEY_ATTRIBUTES);
204 PSA_CLOSE();
205
206 return;
207#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
208}
209
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100210psa_status_t psa_export_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100211 uint8_t *data,
212 size_t data_size,
213 size_t *data_length)
214{
Kevin Peng96f802e2019-12-26 16:10:25 +0800215#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100216 return PSA_ERROR_NOT_SUPPORTED;
217#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000218 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100219 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800220 .sfn_id = TFM_CRYPTO_EXPORT_KEY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100221 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100222 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000223 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100224 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000225 };
226 psa_outvec out_vec[] = {
227 {.base = data, .len = data_size}
228 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100229
Antonio de Angelis4743e672019-04-11 11:38:48 +0100230 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100231
232 status = API_DISPATCH(tfm_crypto_export_key,
233 TFM_CRYPTO_EXPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100234
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000235 *data_length = out_vec[0].len;
236
Antonio de Angelis4743e672019-04-11 11:38:48 +0100237 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100238
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000239 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100240#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100241}
242
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100243psa_status_t psa_export_public_key(psa_key_handle_t handle,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100244 uint8_t *data,
245 size_t data_size,
246 size_t *data_length)
247{
Kevin Peng96f802e2019-12-26 16:10:25 +0800248#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100249 return PSA_ERROR_NOT_SUPPORTED;
250#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100251 psa_status_t status;
252 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800253 .sfn_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100254 .key_handle = handle,
255 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000256
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100257 psa_invec in_vec[] = {
258 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
259 };
260 psa_outvec out_vec[] = {
261 {.base = data, .len = data_size}
262 };
263
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100264 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100265
266 status = API_DISPATCH(tfm_crypto_export_public_key,
267 TFM_CRYPTO_EXPORT_PUBLIC_KEY);
268
269 *data_length = out_vec[0].len;
270
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100271 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100272
273 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100274#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100275}
276
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100277psa_status_t psa_copy_key(psa_key_handle_t source_handle,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100278 const psa_key_attributes_t *attributes,
279 psa_key_handle_t *target_handle)
Jamie Foxefd82732018-11-26 10:34:32 +0000280{
Kevin Peng96f802e2019-12-26 16:10:25 +0800281#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100282 return PSA_ERROR_NOT_SUPPORTED;
283#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100284 psa_status_t status;
285 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800286 .sfn_id = TFM_CRYPTO_COPY_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100287 .key_handle = source_handle,
288 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000289
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100290 psa_invec in_vec[] = {
291 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100292 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
293
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100294 };
295
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000296 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100297 {.base = target_handle, .len = sizeof(psa_key_handle_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000298 };
Jamie Foxefd82732018-11-26 10:34:32 +0000299
Antonio de Angelis4743e672019-04-11 11:38:48 +0100300 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100301
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100302 status = API_DISPATCH(tfm_crypto_copy_key,
303 TFM_CRYPTO_COPY_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +0800304
Antonio de Angelis4743e672019-04-11 11:38:48 +0100305 PSA_CLOSE();
Jamie Foxefd82732018-11-26 10:34:32 +0000306
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000307 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100308#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */
Jamie Foxefd82732018-11-26 10:34:32 +0000309}
310
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100311psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
312 unsigned char *iv,
313 size_t iv_size,
314 size_t *iv_length)
315{
Kevin Peng96f802e2019-12-26 16:10:25 +0800316#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100317 return PSA_ERROR_NOT_SUPPORTED;
318#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100319 psa_status_t status;
320 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800321 .sfn_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100322 .op_handle = operation->handle,
323 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100324
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100325 psa_invec in_vec[] = {
326 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
327 };
328 psa_outvec out_vec[] = {
329 {.base = &(operation->handle), .len = sizeof(uint32_t)},
330 {.base = iv, .len = iv_size},
331 };
332
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100333 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100334
335 status = API_DISPATCH(tfm_crypto_cipher_generate_iv,
336 TFM_CRYPTO_CIPHER_GENERATE_IV);
337
338 *iv_length = out_vec[1].len;
339
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100340 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100341
342 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100343#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100344}
345
Antonio de Angelis377a1552018-11-22 17:02:40 +0000346psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
347 const unsigned char *iv,
348 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100349{
Kevin Peng96f802e2019-12-26 16:10:25 +0800350#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100351 return PSA_ERROR_NOT_SUPPORTED;
352#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000353 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100354 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800355 .sfn_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100356 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100357 };
358
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000359 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100360 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000361 {.base = iv, .len = iv_length},
362 };
363 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100364 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000365 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100366
Antonio de Angelis4743e672019-04-11 11:38:48 +0100367 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100368
369 status = API_DISPATCH(tfm_crypto_cipher_set_iv,
370 TFM_CRYPTO_CIPHER_SET_IV);
Kevin Peng9449a362019-07-29 16:05:42 +0800371
Antonio de Angelis4743e672019-04-11 11:38:48 +0100372 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100373
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000374 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100375#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100376}
377
Antonio de Angelis377a1552018-11-22 17:02:40 +0000378psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100379 psa_key_handle_t handle,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000380 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100381{
Kevin Peng96f802e2019-12-26 16:10:25 +0800382#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100383 return PSA_ERROR_NOT_SUPPORTED;
384#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000385 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100386 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800387 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100388 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100389 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100390 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000391 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100392
Antonio de Angelis4743e672019-04-11 11:38:48 +0100393 psa_invec in_vec[] = {
394 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
395 };
396 psa_outvec out_vec[] = {
397 {.base = &(operation->handle), .len = sizeof(uint32_t)},
398 };
399
Antonio de Angelis4743e672019-04-11 11:38:48 +0100400 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100401
402 status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup,
403 TFM_CRYPTO_CIPHER_ENCRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800404
Antonio de Angelis4743e672019-04-11 11:38:48 +0100405 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100406
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000407 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100408#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100409}
410
Antonio de Angelis377a1552018-11-22 17:02:40 +0000411psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100412 psa_key_handle_t handle,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000413 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100414{
Kevin Peng96f802e2019-12-26 16:10:25 +0800415#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100416 return PSA_ERROR_NOT_SUPPORTED;
417#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000418 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100419 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800420 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100421 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100422 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100423 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000424 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100425
Antonio de Angelis4743e672019-04-11 11:38:48 +0100426 psa_invec in_vec[] = {
427 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
428 };
429 psa_outvec out_vec[] = {
430 {.base = &(operation->handle), .len = sizeof(uint32_t)},
431 };
432
Antonio de Angelis4743e672019-04-11 11:38:48 +0100433 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100434
435 status = API_DISPATCH(tfm_crypto_cipher_decrypt_setup,
436 TFM_CRYPTO_CIPHER_DECRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800437
Antonio de Angelis4743e672019-04-11 11:38:48 +0100438 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100439
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000440 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100441#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100442}
443
444psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
445 const uint8_t *input,
446 size_t input_length,
447 unsigned char *output,
448 size_t output_size,
449 size_t *output_length)
450{
Kevin Peng96f802e2019-12-26 16:10:25 +0800451#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100452 return PSA_ERROR_NOT_SUPPORTED;
453#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000454 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100455 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800456 .sfn_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100457 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100458 };
459
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000460 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100461 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000462 {.base = input, .len = input_length},
463 };
464 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100465 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000466 {.base = output, .len = output_size}
467 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100468
Antonio de Angelis4743e672019-04-11 11:38:48 +0100469 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100470
471 status = API_DISPATCH(tfm_crypto_cipher_update,
472 TFM_CRYPTO_CIPHER_UPDATE);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100473
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000474 *output_length = out_vec[1].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100475
Antonio de Angelis4743e672019-04-11 11:38:48 +0100476 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100477
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000478 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100479#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100480}
481
482psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
483{
Kevin Peng96f802e2019-12-26 16:10:25 +0800484#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100485 return PSA_ERROR_NOT_SUPPORTED;
486#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000487 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100488 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800489 .sfn_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100490 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000491 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100492
Antonio de Angelis4743e672019-04-11 11:38:48 +0100493 psa_invec in_vec[] = {
494 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
495 };
496 psa_outvec out_vec[] = {
497 {.base = &(operation->handle), .len = sizeof(uint32_t)},
498 };
499
Antonio de Angelis4743e672019-04-11 11:38:48 +0100500 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100501
502 status = API_DISPATCH(tfm_crypto_cipher_abort,
503 TFM_CRYPTO_CIPHER_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800504
Antonio de Angelis4743e672019-04-11 11:38:48 +0100505 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100506
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000507 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100508#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100509}
510
511psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
512 uint8_t *output,
513 size_t output_size,
514 size_t *output_length)
515{
Kevin Peng96f802e2019-12-26 16:10:25 +0800516#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100517 return PSA_ERROR_NOT_SUPPORTED;
518#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000519 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100520 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800521 .sfn_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100522 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100523 };
524
525 psa_invec in_vec[] = {
526 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
527 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000528 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100529 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000530 {.base = output, .len = output_size},
531 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100532
Antonio de Angelis4743e672019-04-11 11:38:48 +0100533 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100534
535 status = API_DISPATCH(tfm_crypto_cipher_finish,
536 TFM_CRYPTO_CIPHER_FINISH);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100537
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000538 *output_length = out_vec[1].len;
539
Antonio de Angelis4743e672019-04-11 11:38:48 +0100540 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100541
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000542 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100543#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */
Antonio de Angelis8908f472018-08-31 15:44:25 +0100544}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100545
Antonio de Angelis377a1552018-11-22 17:02:40 +0000546psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100547 psa_algorithm_t alg)
548{
Kevin Peng96f802e2019-12-26 16:10:25 +0800549#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100550 return PSA_ERROR_NOT_SUPPORTED;
551#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000552 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100553 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800554 .sfn_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100555 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100556 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000557 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100558
Antonio de Angelis4743e672019-04-11 11:38:48 +0100559 psa_invec in_vec[] = {
560 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
561 };
562 psa_outvec out_vec[] = {
563 {.base = &(operation->handle), .len = sizeof(uint32_t)},
564 };
565
Antonio de Angelis4743e672019-04-11 11:38:48 +0100566 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100567
568 status = API_DISPATCH(tfm_crypto_hash_setup,
569 TFM_CRYPTO_HASH_SETUP);
570
Antonio de Angelis4743e672019-04-11 11:38:48 +0100571 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100572
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000573 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100574#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100575}
576
577psa_status_t psa_hash_update(psa_hash_operation_t *operation,
578 const uint8_t *input,
579 size_t input_length)
580{
Kevin Peng96f802e2019-12-26 16:10:25 +0800581#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100582 return PSA_ERROR_NOT_SUPPORTED;
583#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000584 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100585 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800586 .sfn_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100587 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100588 };
589
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000590 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100591 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000592 {.base = input, .len = input_length},
593 };
594 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100595 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000596 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100597
Antonio de Angelis4743e672019-04-11 11:38:48 +0100598 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100599
600 status = API_DISPATCH(tfm_crypto_hash_update,
601 TFM_CRYPTO_HASH_UPDATE);
602
Antonio de Angelis4743e672019-04-11 11:38:48 +0100603 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100604
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000605 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100606#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100607}
608
609psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
610 uint8_t *hash,
611 size_t hash_size,
612 size_t *hash_length)
613{
Kevin Peng96f802e2019-12-26 16:10:25 +0800614#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100615 return PSA_ERROR_NOT_SUPPORTED;
616#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000617 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100618 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800619 .sfn_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100620 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100621 };
622
623 psa_invec in_vec[] = {
624 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
625 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000626 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100627 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000628 {.base = hash, .len = hash_size},
629 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100630
Antonio de Angelis4743e672019-04-11 11:38:48 +0100631 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100632
633 status = API_DISPATCH(tfm_crypto_hash_finish,
634 TFM_CRYPTO_HASH_FINISH);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100635
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000636 *hash_length = out_vec[1].len;
637
Antonio de Angelis4743e672019-04-11 11:38:48 +0100638 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100639
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000640 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100641#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100642}
643
644psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
645 const uint8_t *hash,
646 size_t hash_length)
647{
Kevin Peng96f802e2019-12-26 16:10:25 +0800648#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100649 return PSA_ERROR_NOT_SUPPORTED;
650#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000651 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100652 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800653 .sfn_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100654 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100655 };
656
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000657 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100658 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000659 {.base = hash, .len = hash_length},
660 };
661 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100662 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000663 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100664
Antonio de Angelis4743e672019-04-11 11:38:48 +0100665 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100666
667 status = API_DISPATCH(tfm_crypto_hash_verify,
668 TFM_CRYPTO_HASH_VERIFY);
Kevin Peng9449a362019-07-29 16:05:42 +0800669
Antonio de Angelis4743e672019-04-11 11:38:48 +0100670 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100671
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000672 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100673#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100674}
675
676psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
677{
Kevin Peng96f802e2019-12-26 16:10:25 +0800678#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100679 return PSA_ERROR_NOT_SUPPORTED;
680#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000681 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100682 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800683 .sfn_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100684 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000685 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100686
Antonio de Angelis4743e672019-04-11 11:38:48 +0100687 psa_invec in_vec[] = {
688 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
689 };
690 psa_outvec out_vec[] = {
691 {.base = &(operation->handle), .len = sizeof(uint32_t)},
692 };
693
Antonio de Angelis4743e672019-04-11 11:38:48 +0100694 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100695
696 status = API_DISPATCH(tfm_crypto_hash_abort,
697 TFM_CRYPTO_HASH_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800698
Antonio de Angelis4743e672019-04-11 11:38:48 +0100699 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100700
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000701 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100702#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100703}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100704
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100705psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
706 psa_hash_operation_t *target_operation)
707{
Kevin Peng96f802e2019-12-26 16:10:25 +0800708#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100709 return PSA_ERROR_NOT_SUPPORTED;
710#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100711 psa_status_t status;
712 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800713 .sfn_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100714 .op_handle = source_operation->handle,
715 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100716
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100717 psa_invec in_vec[] = {
718 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
719 };
720 psa_outvec out_vec[] = {
721 {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
722 };
723
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100724 if (target_operation && (target_operation->handle != 0)) {
725 return PSA_ERROR_BAD_STATE;
726 }
727
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100728 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100729
730 status = API_DISPATCH(tfm_crypto_hash_clone,
731 TFM_CRYPTO_HASH_CLONE);
Kevin Peng9449a362019-07-29 16:05:42 +0800732
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100733 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100734
735 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100736#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100737}
738
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100739psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100740 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100741 psa_algorithm_t alg)
742{
Kevin Peng96f802e2019-12-26 16:10:25 +0800743#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100744 return PSA_ERROR_NOT_SUPPORTED;
745#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000746 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100747 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800748 .sfn_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100749 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100750 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100751 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000752 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100753
Antonio de Angelis4743e672019-04-11 11:38:48 +0100754 psa_invec in_vec[] = {
755 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
756 };
757 psa_outvec out_vec[] = {
758 {.base = &(operation->handle), .len = sizeof(uint32_t)},
759 };
760
Antonio de Angelis4743e672019-04-11 11:38:48 +0100761 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100762
763 status = API_DISPATCH(tfm_crypto_mac_sign_setup,
764 TFM_CRYPTO_MAC_SIGN_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800765
Antonio de Angelis4743e672019-04-11 11:38:48 +0100766 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100767
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000768 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100769#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100770}
771
772psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100773 psa_key_handle_t handle,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100774 psa_algorithm_t alg)
775{
Kevin Peng96f802e2019-12-26 16:10:25 +0800776#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100777 return PSA_ERROR_NOT_SUPPORTED;
778#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000779 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100780 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800781 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100782 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100783 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100784 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000785 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100786
Antonio de Angelis4743e672019-04-11 11:38:48 +0100787 psa_invec in_vec[] = {
788 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
789 };
790 psa_outvec out_vec[] = {
791 {.base = &(operation->handle), .len = sizeof(uint32_t)},
792 };
793
Antonio de Angelis4743e672019-04-11 11:38:48 +0100794 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100795
796 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
797 TFM_CRYPTO_MAC_VERIFY_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800798
Antonio de Angelis4743e672019-04-11 11:38:48 +0100799 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100800
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000801 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100802#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100803}
804
805psa_status_t psa_mac_update(psa_mac_operation_t *operation,
806 const uint8_t *input,
807 size_t input_length)
808{
Kevin Peng96f802e2019-12-26 16:10:25 +0800809#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100810 return PSA_ERROR_NOT_SUPPORTED;
811#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000812 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100813 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800814 .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100815 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100816 };
817
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000818 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100819 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000820 {.base = input, .len = input_length},
821 };
822 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100823 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000824 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100825
Antonio de Angelis4743e672019-04-11 11:38:48 +0100826 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100827
828 status = API_DISPATCH(tfm_crypto_mac_update,
829 TFM_CRYPTO_MAC_UPDATE);
Kevin Peng9449a362019-07-29 16:05:42 +0800830
Antonio de Angelis4743e672019-04-11 11:38:48 +0100831 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100832
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000833 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100834#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100835}
836
837psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
838 uint8_t *mac,
839 size_t mac_size,
840 size_t *mac_length)
841{
Kevin Peng96f802e2019-12-26 16:10:25 +0800842#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100843 return PSA_ERROR_NOT_SUPPORTED;
844#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000845 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100846 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800847 .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100848 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100849 };
850
851 psa_invec in_vec[] = {
852 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
853 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000854 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100855 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000856 {.base = mac, .len = mac_size},
857 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100858
Antonio de Angelis4743e672019-04-11 11:38:48 +0100859 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100860
861 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
862 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100863
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000864 *mac_length = out_vec[1].len;
865
Antonio de Angelis4743e672019-04-11 11:38:48 +0100866 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100867
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000868 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100869#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100870}
871
872psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
873 const uint8_t *mac,
874 size_t mac_length)
875{
Kevin Peng96f802e2019-12-26 16:10:25 +0800876#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100877 return PSA_ERROR_NOT_SUPPORTED;
878#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000879 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100880 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800881 .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100882 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100883 };
884
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000885 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100886 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000887 {.base = mac, .len = mac_length},
888 };
889 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100890 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000891 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100892
Antonio de Angelis4743e672019-04-11 11:38:48 +0100893 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100894
895 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
896 TFM_CRYPTO_MAC_VERIFY_FINISH);
897
Antonio de Angelis4743e672019-04-11 11:38:48 +0100898 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100899
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000900 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100901#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100902}
903
904psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
905{
Kevin Peng96f802e2019-12-26 16:10:25 +0800906#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100907 return PSA_ERROR_NOT_SUPPORTED;
908#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000909 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100910 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800911 .sfn_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100912 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000913 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100914
Antonio de Angelis4743e672019-04-11 11:38:48 +0100915 psa_invec in_vec[] = {
916 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
917 };
918 psa_outvec out_vec[] = {
919 {.base = &(operation->handle), .len = sizeof(uint32_t)},
920 };
921
Antonio de Angelis4743e672019-04-11 11:38:48 +0100922 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100923
924 status = API_DISPATCH(tfm_crypto_mac_abort,
925 TFM_CRYPTO_MAC_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800926
Antonio de Angelis4743e672019-04-11 11:38:48 +0100927 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100928
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000929 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100930#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100931}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000932
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100933psa_status_t psa_aead_encrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000934 psa_algorithm_t alg,
935 const uint8_t *nonce,
936 size_t nonce_length,
937 const uint8_t *additional_data,
938 size_t additional_data_length,
939 const uint8_t *plaintext,
940 size_t plaintext_length,
941 uint8_t *ciphertext,
942 size_t ciphertext_size,
943 size_t *ciphertext_length)
944{
Kevin Peng96f802e2019-12-26 16:10:25 +0800945#ifdef TFM_CRYPTO_AEAD_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +0100946 return PSA_ERROR_NOT_SUPPORTED;
947#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000948 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100949 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800950 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100951 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100952 .alg = alg,
953 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000954 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100955
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100956 /* Sanitize the optional input */
957 if ((additional_data == NULL) && (additional_data_length != 0)) {
958 return PSA_ERROR_INVALID_ARGUMENT;
959 }
960
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000961 size_t idx = 0;
962 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100963 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000964 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100965 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000966 };
967 psa_outvec out_vec[] = {
968 {.base = ciphertext, .len = ciphertext_size},
969 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000970
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000971 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
972 return PSA_ERROR_INVALID_ARGUMENT;
973 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000974
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000975 if (nonce != NULL) {
976 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100977 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000978 }
979 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000980
Antonio de Angelis4743e672019-04-11 11:38:48 +0100981 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100982
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100983 size_t in_len = ARRAY_SIZE(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100984 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100985 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100986 }
Summer Qin4b1d03b2019-07-02 14:56:08 +0800987 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100988 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000989
990 *ciphertext_length = out_vec[0].len;
991
Antonio de Angelis4743e672019-04-11 11:38:48 +0100992 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100993
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000994 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100995#endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */
Antonio de Angelis3a480992018-11-07 11:53:28 +0000996}
997
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100998psa_status_t psa_aead_decrypt(psa_key_handle_t handle,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000999 psa_algorithm_t alg,
1000 const uint8_t *nonce,
1001 size_t nonce_length,
1002 const uint8_t *additional_data,
1003 size_t additional_data_length,
1004 const uint8_t *ciphertext,
1005 size_t ciphertext_length,
1006 uint8_t *plaintext,
1007 size_t plaintext_size,
1008 size_t *plaintext_length)
1009{
Kevin Peng96f802e2019-12-26 16:10:25 +08001010#ifdef TFM_CRYPTO_AEAD_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001011 return PSA_ERROR_NOT_SUPPORTED;
1012#else
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001013 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001014 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001015 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001016 .key_handle = handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +01001017 .alg = alg,
1018 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001019 };
Antonio de Angelis4743e672019-04-11 11:38:48 +01001020
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001021 /* Sanitize the optional input */
1022 if ((additional_data == NULL) && (additional_data_length != 0)) {
1023 return PSA_ERROR_INVALID_ARGUMENT;
1024 }
1025
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001026 size_t idx = 0;
1027 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001028 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001029 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +01001030 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001031 };
1032 psa_outvec out_vec[] = {
1033 {.base = plaintext, .len = plaintext_size},
1034 };
Antonio de Angelis3a480992018-11-07 11:53:28 +00001035
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001036 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
1037 return PSA_ERROR_INVALID_ARGUMENT;
1038 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001039
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001040 if (nonce != NULL) {
1041 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001042 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001043 }
1044 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001045
Antonio de Angelis4743e672019-04-11 11:38:48 +01001046 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001047
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001048 size_t in_len = ARRAY_SIZE(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001049 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001050 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001051 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001052 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001053 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001054
1055 *plaintext_length = out_vec[0].len;
1056
Antonio de Angelis4743e672019-04-11 11:38:48 +01001057 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +01001058
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001059 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001060#endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */
Antonio de Angelis3a480992018-11-07 11:53:28 +00001061}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001062
1063psa_status_t psa_asymmetric_sign(psa_key_handle_t handle,
1064 psa_algorithm_t alg,
1065 const uint8_t *hash,
1066 size_t hash_length,
1067 uint8_t *signature,
1068 size_t signature_size,
1069 size_t *signature_length)
1070{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001071 return psa_sign_hash(handle, alg, hash, hash_length, signature, signature_size, signature_length);
1072}
1073
1074psa_status_t psa_sign_hash(psa_key_handle_t handle,
1075 psa_algorithm_t alg,
1076 const uint8_t *hash,
1077 size_t hash_length,
1078 uint8_t *signature,
1079 size_t signature_size,
1080 size_t *signature_length)
1081{
Kevin Peng96f802e2019-12-26 16:10:25 +08001082#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001083 return PSA_ERROR_NOT_SUPPORTED;
1084#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001085 psa_status_t status;
1086 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001087 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001088 .key_handle = handle,
1089 .alg = alg,
1090 };
1091
1092 psa_invec in_vec[] = {
1093 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1094 {.base = hash, .len = hash_length},
1095 };
1096 psa_outvec out_vec[] = {
1097 {.base = signature, .len = signature_size},
1098 };
1099
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001100 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001101
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001102 status = API_DISPATCH(tfm_crypto_sign_hash,
1103 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001104
1105 *signature_length = out_vec[0].len;
1106
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001107 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001108
1109 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001110#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001111}
1112
1113psa_status_t psa_asymmetric_verify(psa_key_handle_t handle,
1114 psa_algorithm_t alg,
1115 const uint8_t *hash,
1116 size_t hash_length,
1117 const uint8_t *signature,
1118 size_t signature_length)
1119{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001120 return psa_verify_hash(handle, alg, hash, hash_length, signature, signature_length);
1121}
1122
1123psa_status_t psa_verify_hash(psa_key_handle_t handle,
1124 psa_algorithm_t alg,
1125 const uint8_t *hash,
1126 size_t hash_length,
1127 const uint8_t *signature,
1128 size_t signature_length)
1129{
Kevin Peng96f802e2019-12-26 16:10:25 +08001130#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001131 return PSA_ERROR_NOT_SUPPORTED;
1132#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001133 psa_status_t status;
1134 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001135 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001136 .key_handle = handle,
1137 .alg = alg
1138 };
1139
1140 psa_invec in_vec[] = {
1141 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1142 {.base = hash, .len = hash_length},
1143 {.base = signature, .len = signature_length}
1144 };
1145
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001146 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001147
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001148 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
1149 TFM_CRYPTO_VERIFY_HASH);
Kevin Peng9449a362019-07-29 16:05:42 +08001150
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001151 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001152
1153 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001154#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001155}
1156
1157psa_status_t psa_asymmetric_encrypt(psa_key_handle_t handle,
1158 psa_algorithm_t alg,
1159 const uint8_t *input,
1160 size_t input_length,
1161 const uint8_t *salt,
1162 size_t salt_length,
1163 uint8_t *output,
1164 size_t output_size,
1165 size_t *output_length)
1166{
Kevin Peng96f802e2019-12-26 16:10:25 +08001167#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001168 return PSA_ERROR_NOT_SUPPORTED;
1169#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001170 psa_status_t status;
1171 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001172 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001173 .key_handle = handle,
1174 .alg = alg
1175 };
1176
1177 /* Sanitize the optional input */
1178 if ((salt == NULL) && (salt_length != 0)) {
1179 return PSA_ERROR_INVALID_ARGUMENT;
1180 }
1181
1182 psa_invec in_vec[] = {
1183 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1184 {.base = input, .len = input_length},
1185 {.base = salt, .len = salt_length}
1186 };
1187
1188 psa_outvec out_vec[] = {
1189 {.base = output, .len = output_size},
1190 };
1191
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001192 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001193
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001194 size_t in_len = ARRAY_SIZE(in_vec);
1195 if (salt == NULL) {
1196 in_len--;
1197 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001198 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001199 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001200
1201 *output_length = out_vec[0].len;
1202
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001203 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001204
1205 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001206#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001207}
1208
1209psa_status_t psa_asymmetric_decrypt(psa_key_handle_t handle,
1210 psa_algorithm_t alg,
1211 const uint8_t *input,
1212 size_t input_length,
1213 const uint8_t *salt,
1214 size_t salt_length,
1215 uint8_t *output,
1216 size_t output_size,
1217 size_t *output_length)
1218{
Kevin Peng96f802e2019-12-26 16:10:25 +08001219#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001220 return PSA_ERROR_NOT_SUPPORTED;
1221#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001222 psa_status_t status;
1223 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001224 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001225 .key_handle = handle,
1226 .alg = alg
1227 };
1228
1229 /* Sanitize the optional input */
1230 if ((salt == NULL) && (salt_length != 0)) {
1231 return PSA_ERROR_INVALID_ARGUMENT;
1232 }
1233
1234 psa_invec in_vec[] = {
1235 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1236 {.base = input, .len = input_length},
1237 {.base = salt, .len = salt_length}
1238 };
1239
1240 psa_outvec out_vec[] = {
1241 {.base = output, .len = output_size},
1242 };
1243
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001244 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001245
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001246 size_t in_len = ARRAY_SIZE(in_vec);
1247 if (salt == NULL) {
1248 in_len--;
1249 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001250 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001251 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001252
1253 *output_length = out_vec[0].len;
1254
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001255 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001256
1257 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001258#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001259}
1260
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001261psa_status_t psa_key_derivation_get_capacity(
1262 const psa_key_derivation_operation_t *operation,
1263 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001264{
Kevin Peng96f802e2019-12-26 16:10:25 +08001265#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001266 return PSA_ERROR_NOT_SUPPORTED;
1267#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001268 psa_status_t status;
1269 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001270 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
1271 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001272 };
1273
1274 psa_invec in_vec[] = {
1275 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1276 };
1277
1278 psa_outvec out_vec[] = {
1279 {.base = capacity, .len = sizeof(size_t)},
1280 };
1281
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001282 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001283
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001284 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1285 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Kevin Peng9449a362019-07-29 16:05:42 +08001286
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001287 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001288
1289 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001290#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001291}
1292
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001293psa_status_t psa_key_derivation_output_bytes(
1294 psa_key_derivation_operation_t *operation,
1295 uint8_t *output,
1296 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001297{
Kevin Peng96f802e2019-12-26 16:10:25 +08001298#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001299 return PSA_ERROR_NOT_SUPPORTED;
1300#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001301 psa_status_t status;
1302 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001303 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
1304 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001305 };
1306
1307 psa_invec in_vec[] = {
1308 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1309 };
1310
1311 psa_outvec out_vec[] = {
1312 {.base = output, .len = output_length},
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 Angelis04debbd2019-10-14 12:12:52 +01001317 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1318 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Kevin Peng9449a362019-07-29 16:05:42 +08001319
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001320 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001321
1322 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001323#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001324}
1325
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001326psa_status_t psa_key_derivation_input_key(
1327 psa_key_derivation_operation_t *operation,
1328 psa_key_derivation_step_t step,
1329 psa_key_handle_t handle)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001330{
Kevin Peng96f802e2019-12-26 16:10:25 +08001331#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001332 return PSA_ERROR_NOT_SUPPORTED;
1333#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001334 psa_status_t status;
1335 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001336 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001337 .key_handle = handle,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001338 .step = step,
1339 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001340 };
1341
1342 psa_invec in_vec[] = {
1343 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001344 };
1345
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001346 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001347
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001348 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1349 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +08001350
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001351 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001352
1353 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001354#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001355}
1356
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001357psa_status_t psa_key_derivation_abort(
1358 psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001359{
Kevin Peng96f802e2019-12-26 16:10:25 +08001360#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001361 return PSA_ERROR_NOT_SUPPORTED;
1362#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001363 psa_status_t status;
1364 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001365 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
1366 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001367 };
1368
1369 psa_invec in_vec[] = {
1370 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1371 };
1372
1373 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001374 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001375 };
1376
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001377 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001378
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001379 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1380 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001381
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001382 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001383
1384 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001385#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001386}
1387
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001388psa_status_t psa_key_derivation_key_agreement(
1389 psa_key_derivation_operation_t *operation,
1390 psa_key_derivation_step_t step,
1391 psa_key_handle_t private_key,
1392 const uint8_t *peer_key,
1393 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001394{
Kevin Peng96f802e2019-12-26 16:10:25 +08001395#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001396 return PSA_ERROR_NOT_SUPPORTED;
1397#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001398 psa_status_t status;
1399 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001400 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001401 .key_handle = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001402 .step = step,
1403 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001404 };
1405
1406 psa_invec in_vec[] = {
1407 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1408 {.base = peer_key, .len = peer_key_length},
1409 };
1410
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001411 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001412
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001413 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1414 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001415
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001416 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001417
1418 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001419#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001420}
1421
1422psa_status_t psa_generate_random(uint8_t *output,
1423 size_t output_size)
1424{
Kevin Peng96f802e2019-12-26 16:10:25 +08001425#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001426 return PSA_ERROR_NOT_SUPPORTED;
1427#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001428 psa_status_t status;
1429 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001430 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001431 };
1432
1433 psa_invec in_vec[] = {
1434 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1435 };
1436
1437 psa_outvec out_vec[] = {
1438 {.base = output, .len = output_size},
1439 };
1440
1441 if (output_size == 0) {
1442 return PSA_SUCCESS;
1443 }
1444
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001445 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001446
1447 status = API_DISPATCH(tfm_crypto_generate_random,
1448 TFM_CRYPTO_GENERATE_RANDOM);
1449
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001450 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001451
1452 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001453#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001454}
1455
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001456psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
1457 psa_key_handle_t *handle)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001458{
Kevin Peng96f802e2019-12-26 16:10:25 +08001459#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +01001460 return PSA_ERROR_NOT_SUPPORTED;
1461#else
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001462 psa_status_t status;
1463 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001464 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001465 };
1466
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001467 psa_invec in_vec[] = {
1468 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001469 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1470 };
1471
1472 psa_outvec out_vec[] = {
1473 {.base = handle, .len = sizeof(psa_key_handle_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001474 };
1475
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001476 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001477
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001478 status = API_DISPATCH(tfm_crypto_generate_key,
1479 TFM_CRYPTO_GENERATE_KEY);
1480 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001481
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001482 return status;
1483#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1484}
1485
1486psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes,
1487 psa_key_type_t type,
1488 const uint8_t *data,
1489 size_t data_length)
1490{
1491 psa_status_t status;
1492
1493 status = PSA_ERROR_NOT_SUPPORTED;
1494
1495 return status;
1496}
1497
1498psa_status_t psa_get_key_domain_parameters(
1499 const psa_key_attributes_t *attributes,
1500 uint8_t *data,
1501 size_t data_size,
1502 size_t *data_length)
1503{
1504 psa_status_t status;
1505
1506 status = PSA_ERROR_NOT_SUPPORTED;
1507
1508 return status;
1509}
1510
1511psa_status_t psa_hash_compare(psa_algorithm_t alg,
1512 const uint8_t *input,
1513 size_t input_length,
1514 const uint8_t *hash,
1515 const size_t hash_length)
1516{
1517 psa_status_t status;
1518
1519 status = PSA_ERROR_NOT_SUPPORTED;
1520
1521 return status;
1522}
1523
1524psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1525 const uint8_t *input,
1526 size_t input_length)
1527{
1528 psa_status_t status;
1529
1530 status = PSA_ERROR_NOT_SUPPORTED;
1531
1532 return status;
1533}
1534
1535psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1536 uint8_t *ciphertext,
1537 size_t ciphertext_size,
1538 size_t *ciphertext_length,
1539 uint8_t *tag,
1540 size_t tag_size,
1541 size_t *tag_length)
1542{
1543 psa_status_t status;
1544
1545 status = PSA_ERROR_NOT_SUPPORTED;
1546
1547 return status;
1548}
1549
1550psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1551 uint8_t *plaintext,
1552 size_t plaintext_size,
1553 size_t *plaintext_length,
1554 const uint8_t *tag,
1555 size_t tag_length)
1556{
1557 psa_status_t status;
1558
1559 status = PSA_ERROR_NOT_SUPPORTED;
1560
1561 return status;
1562}
1563
1564psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1565{
1566 psa_status_t status;
1567
1568 status = PSA_ERROR_NOT_SUPPORTED;
1569
1570 return status;
1571}
1572
1573psa_status_t psa_mac_compute(psa_key_handle_t handle,
1574 psa_algorithm_t alg,
1575 const uint8_t *input,
1576 size_t input_length,
1577 uint8_t *mac,
1578 size_t mac_size,
1579 size_t *mac_length)
1580{
1581 psa_status_t status;
1582
1583 status = PSA_ERROR_NOT_SUPPORTED;
1584
1585 return status;
1586}
1587
1588psa_status_t psa_mac_verify(psa_key_handle_t handle,
1589 psa_algorithm_t alg,
1590 const uint8_t *input,
1591 size_t input_length,
1592 const uint8_t *mac,
1593 const size_t mac_length)
1594{
1595 psa_status_t status;
1596
1597 status = PSA_ERROR_NOT_SUPPORTED;
1598
1599 return status;
1600}
1601
1602psa_status_t psa_cipher_encrypt(psa_key_handle_t handle,
1603 psa_algorithm_t alg,
1604 const uint8_t *input,
1605 size_t input_length,
1606 uint8_t *output,
1607 size_t output_size,
1608 size_t *output_length)
1609{
1610 psa_status_t status;
1611
1612 status = PSA_ERROR_NOT_SUPPORTED;
1613
1614 return status;
1615}
1616
1617psa_status_t psa_cipher_decrypt(psa_key_handle_t handle,
1618 psa_algorithm_t alg,
1619 const uint8_t *input,
1620 size_t input_length,
1621 uint8_t *output,
1622 size_t output_size,
1623 size_t *output_length)
1624{
1625 psa_status_t status;
1626
1627 status = PSA_ERROR_NOT_SUPPORTED;
1628
1629 return status;
1630}
1631
1632psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
1633 psa_key_handle_t private_key,
1634 const uint8_t *peer_key,
1635 size_t peer_key_length,
1636 uint8_t *output,
1637 size_t output_size,
1638 size_t *output_length)
1639{
1640#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1641 return PSA_ERROR_NOT_SUPPORTED;
1642#else
1643 psa_status_t status;
1644 struct tfm_crypto_pack_iovec iov = {
1645 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1646 .alg = alg,
1647 .key_handle = private_key
1648 };
1649
1650 psa_invec in_vec[] = {
1651 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1652 {.base = peer_key, .len = peer_key_length},
1653 };
1654
1655 psa_outvec out_vec[] = {
1656 {.base = output, .len = output_size},
1657 };
1658
1659 PSA_CONNECT(TFM_CRYPTO);
1660
1661 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1662 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1663
1664 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001665
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001666 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001667
1668 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +01001669#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001670}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001671
1672psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1673 psa_algorithm_t alg)
1674{
1675#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1676 return PSA_ERROR_NOT_SUPPORTED;
1677#else
1678 psa_status_t status;
1679 struct tfm_crypto_pack_iovec iov = {
1680 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1681 .alg = alg,
1682 .op_handle = operation->handle,
1683 };
1684
1685 psa_invec in_vec[] = {
1686 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1687 };
1688 psa_outvec out_vec[] = {
1689 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1690 };
1691
1692 PSA_CONNECT(TFM_CRYPTO);
1693
1694 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1695 TFM_CRYPTO_KEY_DERIVATION_SETUP);
1696 PSA_CLOSE();
1697
1698 return status;
1699#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1700}
1701
1702psa_status_t psa_key_derivation_set_capacity(
1703 psa_key_derivation_operation_t *operation,
1704 size_t capacity)
1705{
1706#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1707 return PSA_ERROR_NOT_SUPPORTED;
1708#else
1709 psa_status_t status;
1710 struct tfm_crypto_pack_iovec iov = {
1711 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
1712 .capacity = capacity,
1713 .op_handle = operation->handle,
1714 };
1715
1716 psa_invec in_vec[] = {
1717 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1718 };
1719
1720 PSA_CONNECT(TFM_CRYPTO);
1721
1722 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1723 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
1724 PSA_CLOSE();
1725
1726 return status;
1727#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1728}
1729
1730psa_status_t psa_key_derivation_input_bytes(
1731 psa_key_derivation_operation_t *operation,
1732 psa_key_derivation_step_t step,
1733 const uint8_t *data,
1734 size_t data_length)
1735{
1736#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1737 return PSA_ERROR_NOT_SUPPORTED;
1738#else
1739 psa_status_t status;
1740 struct tfm_crypto_pack_iovec iov = {
1741 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1742 .step = step,
1743 .op_handle = operation->handle,
1744 };
1745
1746 psa_invec in_vec[] = {
1747 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1748 {.base = data, .len = data_length},
1749 };
1750
1751 PSA_CONNECT(TFM_CRYPTO);
1752
1753 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1754 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
1755 PSA_CLOSE();
1756
1757 return status;
1758#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1759}
1760
1761psa_status_t psa_key_derivation_output_key(
1762 const psa_key_attributes_t *attributes,
1763 psa_key_derivation_operation_t *operation,
1764 psa_key_handle_t *handle)
1765{
1766#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED
1767 return PSA_ERROR_NOT_SUPPORTED;
1768#else
1769 psa_status_t status;
1770 struct tfm_crypto_pack_iovec iov = {
1771 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1772 .op_handle = operation->handle,
1773 };
1774
1775 psa_invec in_vec[] = {
1776 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1777 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1778 };
1779
1780 psa_outvec out_vec[] = {
1781 {.base = handle, .len = sizeof(psa_key_handle_t)}
1782 };
1783
1784 PSA_CONNECT(TFM_CRYPTO);
1785
1786 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1787 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
1788 PSA_CLOSE();
1789
1790 return status;
1791#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */
1792}
1793
1794psa_status_t psa_hash_compute(psa_algorithm_t alg,
1795 const uint8_t *input,
1796 size_t input_length,
1797 uint8_t *hash,
1798 size_t hash_size,
1799 size_t *hash_length)
1800{
1801 psa_status_t status;
1802
1803 status = PSA_ERROR_NOT_SUPPORTED;
1804
1805 return status;
1806}
1807
1808psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
1809 psa_key_handle_t handle,
1810 psa_algorithm_t alg)
1811{
1812 psa_status_t status;
1813
1814 status = PSA_ERROR_NOT_SUPPORTED;
1815
1816 return status;
1817}
1818
1819psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
1820 psa_key_handle_t handle,
1821 psa_algorithm_t alg)
1822{
1823 psa_status_t status;
1824
1825 status = PSA_ERROR_NOT_SUPPORTED;
1826
1827 return status;
1828}
1829
1830psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
1831 uint8_t *nonce,
1832 size_t nonce_size,
1833 size_t *nonce_length)
1834{
1835 psa_status_t status;
1836
1837 status = PSA_ERROR_NOT_SUPPORTED;
1838
1839 return status;
1840}
1841
1842psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
1843 const uint8_t *nonce,
1844 size_t nonce_length)
1845{
1846 psa_status_t status;
1847
1848 status = PSA_ERROR_NOT_SUPPORTED;
1849
1850 return status;
1851}
1852
1853psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
1854 size_t ad_length,
1855 size_t plaintext_length)
1856{
1857 psa_status_t status;
1858
1859 status = PSA_ERROR_NOT_SUPPORTED;
1860
1861 return status;
1862}
1863
1864psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1865 const uint8_t *input,
1866 size_t input_length,
1867 uint8_t *output,
1868 size_t output_size,
1869 size_t *output_length)
1870{
1871 psa_status_t status;
1872
1873 status = PSA_ERROR_NOT_SUPPORTED;
1874
1875 return status;
1876}