blob: a89dd2b9ca7cd8b1fe22607f05f1a6f519fbfeb8 [file] [log] [blame]
Antonio de Angelis8908f472018-08-31 15:44:25 +01001/*
Maulik Patel28659c42021-01-06 14:09:22 +00002 * Copyright (c) 2018-2021, 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,
Maulik Patel28659c42021-01-06 14:09:22 +000044 psa_key_id_t *key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010045{
Jamie Foxdadb4e82019-09-03 17:59:41 +010046 psa_status_t status;
47 const struct tfm_crypto_pack_iovec iov = {
48 .sfn_id = TFM_CRYPTO_OPEN_KEY_SID,
Jamie Foxdadb4e82019-09-03 17:59:41 +010049 };
50 psa_invec in_vec[] = {
51 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
52 {.base = &id, .len = sizeof(psa_key_id_t)},
53 };
54 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000055 {.base = key, .len = sizeof(psa_key_id_t)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010056 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010057
Jamie Foxdadb4e82019-09-03 17:59:41 +010058 PSA_CONNECT(TFM_CRYPTO);
59
60 status = API_DISPATCH(tfm_crypto_open_key,
61 TFM_CRYPTO_OPEN_KEY);
62
63 PSA_CLOSE();
64
65 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +010066}
67
Maulik Patel28659c42021-01-06 14:09:22 +000068psa_status_t psa_close_key(psa_key_id_t key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010069{
Jamie Foxdadb4e82019-09-03 17:59:41 +010070 psa_status_t status;
71 const struct tfm_crypto_pack_iovec iov = {
72 .sfn_id = TFM_CRYPTO_CLOSE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000073 .key_id = key,
Jamie Foxdadb4e82019-09-03 17:59:41 +010074 };
75 psa_invec in_vec[] = {
76 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
77 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010078
Jamie Foxdadb4e82019-09-03 17:59:41 +010079 PSA_CONNECT(TFM_CRYPTO);
80
81 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_close_key,
82 TFM_CRYPTO_CLOSE_KEY);;
83
84 PSA_CLOSE();
85
86 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +010087}
88
Antonio de Angelis04debbd2019-10-14 12:12:52 +010089psa_status_t psa_import_key(const psa_key_attributes_t *attributes,
Antonio de Angelis8908f472018-08-31 15:44:25 +010090 const uint8_t *data,
Antonio de Angelis04debbd2019-10-14 12:12:52 +010091 size_t data_length,
Maulik Patel28659c42021-01-06 14:09:22 +000092 psa_key_id_t *key)
Antonio de Angelis8908f472018-08-31 15:44:25 +010093{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000094 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +010095 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +080096 .sfn_id = TFM_CRYPTO_IMPORT_KEY_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +010097 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000098 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +010099 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100100 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000101 {.base = data, .len = data_length}
102 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100103 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000104 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100105 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100106
Antonio de Angelis4743e672019-04-11 11:38:48 +0100107 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100108
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100109 status = API_DISPATCH(tfm_crypto_import_key,
110 TFM_CRYPTO_IMPORT_KEY);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100111 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100112
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000113 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100114}
115
Maulik Patel28659c42021-01-06 14:09:22 +0000116psa_status_t psa_destroy_key(psa_key_id_t key)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100117{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000118 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100119 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800120 .sfn_id = TFM_CRYPTO_DESTROY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000121 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100122 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000123 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100124 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000125 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100126
Antonio de Angelis4743e672019-04-11 11:38:48 +0100127 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100128
129 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_destroy_key,
130 TFM_CRYPTO_DESTROY_KEY);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100131 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100132
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000133 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100134}
135
Maulik Patel28659c42021-01-06 14:09:22 +0000136psa_status_t psa_get_key_attributes(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100137 psa_key_attributes_t *attributes)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100138{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000139 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100140 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100141 .sfn_id = TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000142 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100143 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000144 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100145 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000146 };
147 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100148 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000149 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100150
Antonio de Angelis4743e672019-04-11 11:38:48 +0100151 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100152
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100153 status = API_DISPATCH(tfm_crypto_get_key_attributes,
154 TFM_CRYPTO_GET_KEY_ATTRIBUTES);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100155 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100156
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000157 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100158}
159
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100160void psa_reset_key_attributes(psa_key_attributes_t *attributes)
161{
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100162 struct tfm_crypto_pack_iovec iov = {
163 .sfn_id = TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID,
164 };
165 psa_invec in_vec[] = {
166 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
167 };
168 psa_outvec out_vec[] = {
169 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
170 };
171
172 psa_handle_t ipc_handle;
173 ipc_handle = psa_connect(TFM_CRYPTO_SID, TFM_CRYPTO_VERSION);
174 if (!PSA_HANDLE_IS_VALID(ipc_handle)) {
175 return;
176 }
177
178 (void)API_DISPATCH(tfm_crypto_reset_key_attributes,
179 TFM_CRYPTO_RESET_KEY_ATTRIBUTES);
180 PSA_CLOSE();
181
182 return;
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100183}
184
Maulik Patel28659c42021-01-06 14:09:22 +0000185psa_status_t psa_export_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100186 uint8_t *data,
187 size_t data_size,
188 size_t *data_length)
189{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000190 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100191 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800192 .sfn_id = TFM_CRYPTO_EXPORT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000193 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100194 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000195 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100196 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000197 };
198 psa_outvec out_vec[] = {
199 {.base = data, .len = data_size}
200 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100201
Antonio de Angelis4743e672019-04-11 11:38:48 +0100202 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100203
204 status = API_DISPATCH(tfm_crypto_export_key,
205 TFM_CRYPTO_EXPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100206
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000207 *data_length = out_vec[0].len;
208
Antonio de Angelis4743e672019-04-11 11:38:48 +0100209 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100210
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000211 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100212}
213
Maulik Patel28659c42021-01-06 14:09:22 +0000214psa_status_t psa_export_public_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100215 uint8_t *data,
216 size_t data_size,
217 size_t *data_length)
218{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100219 psa_status_t status;
220 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800221 .sfn_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000222 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100223 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000224
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100225 psa_invec in_vec[] = {
226 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
227 };
228 psa_outvec out_vec[] = {
229 {.base = data, .len = data_size}
230 };
231
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100232 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100233
234 status = API_DISPATCH(tfm_crypto_export_public_key,
235 TFM_CRYPTO_EXPORT_PUBLIC_KEY);
236
237 *data_length = out_vec[0].len;
238
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100239 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100240
241 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100242}
243
Maulik Patel28659c42021-01-06 14:09:22 +0000244psa_status_t psa_purge_key(psa_key_id_t key)
245{
246 psa_status_t status;
247 struct tfm_crypto_pack_iovec iov = {
248 .sfn_id = TFM_CRYPTO_PURGE_KEY_SID,
249 .key_id = key,
250 };
251 psa_invec in_vec[] = {
252 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
253 };
254
255 PSA_CONNECT(TFM_CRYPTO);
256
257 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_purge_key,
258 TFM_CRYPTO_PURGE_KEY);
259
260 PSA_CLOSE();
261
262 return status;
263}
264
265psa_status_t psa_copy_key(psa_key_id_t source_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100266 const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +0000267 psa_key_id_t *target_key)
Jamie Foxefd82732018-11-26 10:34:32 +0000268{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100269 psa_status_t status;
270 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800271 .sfn_id = TFM_CRYPTO_COPY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000272 .key_id = source_key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100273 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000274
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100275 psa_invec in_vec[] = {
276 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100277 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
278
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100279 };
280
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000281 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000282 {.base = target_key, .len = sizeof(psa_key_id_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000283 };
Jamie Foxefd82732018-11-26 10:34:32 +0000284
Antonio de Angelis4743e672019-04-11 11:38:48 +0100285 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100286
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100287 status = API_DISPATCH(tfm_crypto_copy_key,
288 TFM_CRYPTO_COPY_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +0800289
Antonio de Angelis4743e672019-04-11 11:38:48 +0100290 PSA_CLOSE();
Jamie Foxefd82732018-11-26 10:34:32 +0000291
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000292 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000293}
294
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100295psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
296 unsigned char *iv,
297 size_t iv_size,
298 size_t *iv_length)
299{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100300 psa_status_t status;
301 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800302 .sfn_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100303 .op_handle = operation->handle,
304 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100305
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100306 psa_invec in_vec[] = {
307 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
308 };
309 psa_outvec out_vec[] = {
310 {.base = &(operation->handle), .len = sizeof(uint32_t)},
311 {.base = iv, .len = iv_size},
312 };
313
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100314 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100315
316 status = API_DISPATCH(tfm_crypto_cipher_generate_iv,
317 TFM_CRYPTO_CIPHER_GENERATE_IV);
318
319 *iv_length = out_vec[1].len;
320
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100321 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100322
323 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100324}
325
Antonio de Angelis377a1552018-11-22 17:02:40 +0000326psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
327 const unsigned char *iv,
328 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100329{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000330 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100331 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800332 .sfn_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100333 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100334 };
335
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000336 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100337 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000338 {.base = iv, .len = iv_length},
339 };
340 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100341 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000342 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100343
Antonio de Angelis4743e672019-04-11 11:38:48 +0100344 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100345
346 status = API_DISPATCH(tfm_crypto_cipher_set_iv,
347 TFM_CRYPTO_CIPHER_SET_IV);
Kevin Peng9449a362019-07-29 16:05:42 +0800348
Antonio de Angelis4743e672019-04-11 11:38:48 +0100349 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100350
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000351 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100352}
353
Antonio de Angelis377a1552018-11-22 17:02:40 +0000354psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000355 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000356 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100357{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000358 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100359 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800360 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000361 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100362 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100363 .op_handle = operation->handle,
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_invec in_vec[] = {
367 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
368 };
369 psa_outvec out_vec[] = {
370 {.base = &(operation->handle), .len = sizeof(uint32_t)},
371 };
372
Antonio de Angelis4743e672019-04-11 11:38:48 +0100373 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100374
375 status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup,
376 TFM_CRYPTO_CIPHER_ENCRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800377
Antonio de Angelis4743e672019-04-11 11:38:48 +0100378 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100379
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000380 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100381}
382
Antonio de Angelis377a1552018-11-22 17:02:40 +0000383psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000384 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000385 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100386{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000387 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100388 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800389 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000390 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100391 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100392 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000393 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100394
Antonio de Angelis4743e672019-04-11 11:38:48 +0100395 psa_invec in_vec[] = {
396 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
397 };
398 psa_outvec out_vec[] = {
399 {.base = &(operation->handle), .len = sizeof(uint32_t)},
400 };
401
Antonio de Angelis4743e672019-04-11 11:38:48 +0100402 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100403
404 status = API_DISPATCH(tfm_crypto_cipher_decrypt_setup,
405 TFM_CRYPTO_CIPHER_DECRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800406
Antonio de Angelis4743e672019-04-11 11:38:48 +0100407 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100408
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000409 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100410}
411
412psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
413 const uint8_t *input,
414 size_t input_length,
415 unsigned char *output,
416 size_t output_size,
417 size_t *output_length)
418{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000419 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100420 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800421 .sfn_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100422 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100423 };
424
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000425 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100426 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000427 {.base = input, .len = input_length},
428 };
429 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100430 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000431 {.base = output, .len = output_size}
432 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100433
Antonio de Angelis4743e672019-04-11 11:38:48 +0100434 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100435
436 status = API_DISPATCH(tfm_crypto_cipher_update,
437 TFM_CRYPTO_CIPHER_UPDATE);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100438
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000439 *output_length = out_vec[1].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100440
Antonio de Angelis4743e672019-04-11 11:38:48 +0100441 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100442
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000443 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100444}
445
446psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
447{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000448 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100449 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800450 .sfn_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100451 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000452 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100453
Antonio de Angelis4743e672019-04-11 11:38:48 +0100454 psa_invec in_vec[] = {
455 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
456 };
457 psa_outvec out_vec[] = {
458 {.base = &(operation->handle), .len = sizeof(uint32_t)},
459 };
460
Antonio de Angelis4743e672019-04-11 11:38:48 +0100461 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100462
463 status = API_DISPATCH(tfm_crypto_cipher_abort,
464 TFM_CRYPTO_CIPHER_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800465
Antonio de Angelis4743e672019-04-11 11:38:48 +0100466 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100467
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000468 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100469}
470
471psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
472 uint8_t *output,
473 size_t output_size,
474 size_t *output_length)
475{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000476 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100477 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800478 .sfn_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100479 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100480 };
481
482 psa_invec in_vec[] = {
483 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
484 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000485 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100486 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000487 {.base = output, .len = output_size},
488 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100489
Antonio de Angelis4743e672019-04-11 11:38:48 +0100490 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100491
492 status = API_DISPATCH(tfm_crypto_cipher_finish,
493 TFM_CRYPTO_CIPHER_FINISH);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100494
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000495 *output_length = out_vec[1].len;
496
Antonio de Angelis4743e672019-04-11 11:38:48 +0100497 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100498
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000499 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100500}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100501
Antonio de Angelis377a1552018-11-22 17:02:40 +0000502psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100503 psa_algorithm_t alg)
504{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000505 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100506 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800507 .sfn_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100508 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100509 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000510 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100511
Antonio de Angelis4743e672019-04-11 11:38:48 +0100512 psa_invec in_vec[] = {
513 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
514 };
515 psa_outvec out_vec[] = {
516 {.base = &(operation->handle), .len = sizeof(uint32_t)},
517 };
518
Antonio de Angelis4743e672019-04-11 11:38:48 +0100519 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100520
521 status = API_DISPATCH(tfm_crypto_hash_setup,
522 TFM_CRYPTO_HASH_SETUP);
523
Antonio de Angelis4743e672019-04-11 11:38:48 +0100524 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100525
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000526 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100527}
528
529psa_status_t psa_hash_update(psa_hash_operation_t *operation,
530 const uint8_t *input,
531 size_t input_length)
532{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000533 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100534 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800535 .sfn_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100536 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100537 };
538
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000539 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100540 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000541 {.base = input, .len = input_length},
542 };
543 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100544 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000545 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100546
Antonio de Angelis4743e672019-04-11 11:38:48 +0100547 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100548
549 status = API_DISPATCH(tfm_crypto_hash_update,
550 TFM_CRYPTO_HASH_UPDATE);
551
Antonio de Angelis4743e672019-04-11 11:38:48 +0100552 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100553
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000554 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100555}
556
557psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
558 uint8_t *hash,
559 size_t hash_size,
560 size_t *hash_length)
561{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000562 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100563 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800564 .sfn_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100565 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100566 };
567
568 psa_invec in_vec[] = {
569 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
570 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000571 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100572 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000573 {.base = hash, .len = hash_size},
574 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100575
Antonio de Angelis4743e672019-04-11 11:38:48 +0100576 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100577
578 status = API_DISPATCH(tfm_crypto_hash_finish,
579 TFM_CRYPTO_HASH_FINISH);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100580
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000581 *hash_length = out_vec[1].len;
582
Antonio de Angelis4743e672019-04-11 11:38:48 +0100583 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100584
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000585 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100586}
587
588psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
589 const uint8_t *hash,
590 size_t hash_length)
591{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000592 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100593 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800594 .sfn_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100595 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100596 };
597
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000598 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100599 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000600 {.base = hash, .len = hash_length},
601 };
602 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100603 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000604 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100605
Antonio de Angelis4743e672019-04-11 11:38:48 +0100606 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100607
608 status = API_DISPATCH(tfm_crypto_hash_verify,
609 TFM_CRYPTO_HASH_VERIFY);
Kevin Peng9449a362019-07-29 16:05:42 +0800610
Antonio de Angelis4743e672019-04-11 11:38:48 +0100611 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100612
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000613 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100614}
615
616psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
617{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000618 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100619 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800620 .sfn_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100621 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000622 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100623
Antonio de Angelis4743e672019-04-11 11:38:48 +0100624 psa_invec in_vec[] = {
625 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
626 };
627 psa_outvec out_vec[] = {
628 {.base = &(operation->handle), .len = sizeof(uint32_t)},
629 };
630
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_abort,
634 TFM_CRYPTO_HASH_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800635
Antonio de Angelis4743e672019-04-11 11:38:48 +0100636 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100637
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000638 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100639}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100640
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100641psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
642 psa_hash_operation_t *target_operation)
643{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100644 psa_status_t status;
645 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800646 .sfn_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100647 .op_handle = source_operation->handle,
648 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100649
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100650 psa_invec in_vec[] = {
651 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
652 };
653 psa_outvec out_vec[] = {
654 {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
655 };
656
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100657 if (target_operation && (target_operation->handle != 0)) {
658 return PSA_ERROR_BAD_STATE;
659 }
660
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100661 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100662
663 status = API_DISPATCH(tfm_crypto_hash_clone,
664 TFM_CRYPTO_HASH_CLONE);
Kevin Peng9449a362019-07-29 16:05:42 +0800665
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100666 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100667
668 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100669}
670
Soby Mathew07ef6e42020-07-20 21:09:23 +0100671psa_status_t psa_hash_compute(psa_algorithm_t alg,
672 const uint8_t *input,
673 size_t input_length,
674 uint8_t *hash,
675 size_t hash_size,
676 size_t *hash_length)
677{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100678 psa_status_t status;
679 struct tfm_crypto_pack_iovec iov = {
680 .sfn_id = TFM_CRYPTO_HASH_COMPUTE_SID,
681 .alg = alg,
682 };
683
684 psa_invec in_vec[] = {
685 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
686 {.base = input, .len = input_length},
687 };
688
689 psa_outvec out_vec[] = {
690 {.base = hash, .len = hash_size}
691 };
692
693 PSA_CONNECT(TFM_CRYPTO);
694
695 status = API_DISPATCH(tfm_crypto_hash_compute,
696 TFM_CRYPTO_HASH_COMPUTE);
697
698 *hash_length = out_vec[0].len;
699
700 PSA_CLOSE();
701
702 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100703}
704
705psa_status_t psa_hash_compare(psa_algorithm_t alg,
706 const uint8_t *input,
707 size_t input_length,
708 const uint8_t *hash,
709 size_t hash_length)
710{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100711 psa_status_t status;
712 struct tfm_crypto_pack_iovec iov = {
713 .sfn_id = TFM_CRYPTO_HASH_COMPARE_SID,
714 .alg = alg,
715 };
716
717 psa_invec in_vec[] = {
718 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
719 {.base = input, .len = input_length},
720 {.base = hash, .len = hash_length},
721 };
722
723 PSA_CONNECT(TFM_CRYPTO);
724
725 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_hash_compare,
726 TFM_CRYPTO_HASH_COMPARE);
727
728 PSA_CLOSE();
729
730 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100731}
732
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100733psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000734 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100735 psa_algorithm_t alg)
736{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000737 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100738 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800739 .sfn_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000740 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100741 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100742 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000743 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100744
Antonio de Angelis4743e672019-04-11 11:38:48 +0100745 psa_invec in_vec[] = {
746 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
747 };
748 psa_outvec out_vec[] = {
749 {.base = &(operation->handle), .len = sizeof(uint32_t)},
750 };
751
Antonio de Angelis4743e672019-04-11 11:38:48 +0100752 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100753
754 status = API_DISPATCH(tfm_crypto_mac_sign_setup,
755 TFM_CRYPTO_MAC_SIGN_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800756
Antonio de Angelis4743e672019-04-11 11:38:48 +0100757 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100758
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000759 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100760}
761
762psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000763 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100764 psa_algorithm_t alg)
765{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000766 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100767 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800768 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000769 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100770 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100771 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000772 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100773
Antonio de Angelis4743e672019-04-11 11:38:48 +0100774 psa_invec in_vec[] = {
775 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
776 };
777 psa_outvec out_vec[] = {
778 {.base = &(operation->handle), .len = sizeof(uint32_t)},
779 };
780
Antonio de Angelis4743e672019-04-11 11:38:48 +0100781 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100782
783 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
784 TFM_CRYPTO_MAC_VERIFY_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800785
Antonio de Angelis4743e672019-04-11 11:38:48 +0100786 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100787
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000788 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100789}
790
791psa_status_t psa_mac_update(psa_mac_operation_t *operation,
792 const uint8_t *input,
793 size_t input_length)
794{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000795 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100796 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800797 .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100798 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100799 };
800
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000801 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100802 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000803 {.base = input, .len = input_length},
804 };
805 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100806 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000807 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100808
Antonio de Angelis4743e672019-04-11 11:38:48 +0100809 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100810
811 status = API_DISPATCH(tfm_crypto_mac_update,
812 TFM_CRYPTO_MAC_UPDATE);
Kevin Peng9449a362019-07-29 16:05:42 +0800813
Antonio de Angelis4743e672019-04-11 11:38:48 +0100814 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100815
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000816 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100817}
818
819psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
820 uint8_t *mac,
821 size_t mac_size,
822 size_t *mac_length)
823{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000824 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100825 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800826 .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100827 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100828 };
829
830 psa_invec in_vec[] = {
831 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
832 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000833 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100834 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000835 {.base = mac, .len = mac_size},
836 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100837
Antonio de Angelis4743e672019-04-11 11:38:48 +0100838 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100839
840 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
841 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100842
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000843 *mac_length = out_vec[1].len;
844
Antonio de Angelis4743e672019-04-11 11:38:48 +0100845 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100846
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000847 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100848}
849
850psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
851 const uint8_t *mac,
852 size_t mac_length)
853{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000854 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100855 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800856 .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100857 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100858 };
859
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000860 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100861 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000862 {.base = mac, .len = mac_length},
863 };
864 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100865 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000866 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100867
Antonio de Angelis4743e672019-04-11 11:38:48 +0100868 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100869
870 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
871 TFM_CRYPTO_MAC_VERIFY_FINISH);
872
Antonio de Angelis4743e672019-04-11 11:38:48 +0100873 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100874
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000875 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100876}
877
878psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
879{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000880 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100881 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800882 .sfn_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100883 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000884 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100885
Antonio de Angelis4743e672019-04-11 11:38:48 +0100886 psa_invec in_vec[] = {
887 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
888 };
889 psa_outvec out_vec[] = {
890 {.base = &(operation->handle), .len = sizeof(uint32_t)},
891 };
892
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_abort,
896 TFM_CRYPTO_MAC_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800897
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;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100901}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000902
Maulik Patel28659c42021-01-06 14:09:22 +0000903psa_status_t psa_aead_encrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000904 psa_algorithm_t alg,
905 const uint8_t *nonce,
906 size_t nonce_length,
907 const uint8_t *additional_data,
908 size_t additional_data_length,
909 const uint8_t *plaintext,
910 size_t plaintext_length,
911 uint8_t *ciphertext,
912 size_t ciphertext_size,
913 size_t *ciphertext_length)
914{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000915 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100916 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800917 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000918 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100919 .alg = alg,
920 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000921 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100922
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100923 /* Sanitize the optional input */
924 if ((additional_data == NULL) && (additional_data_length != 0)) {
925 return PSA_ERROR_INVALID_ARGUMENT;
926 }
927
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000928 size_t idx = 0;
929 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100930 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000931 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100932 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000933 };
934 psa_outvec out_vec[] = {
935 {.base = ciphertext, .len = ciphertext_size},
936 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000937
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000938 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
939 return PSA_ERROR_INVALID_ARGUMENT;
940 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000941
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000942 if (nonce != NULL) {
943 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100944 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000945 }
946 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000947
Antonio de Angelis4743e672019-04-11 11:38:48 +0100948 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100949
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100950 size_t in_len = ARRAY_SIZE(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100951 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100952 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100953 }
Summer Qin4b1d03b2019-07-02 14:56:08 +0800954 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100955 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000956
957 *ciphertext_length = out_vec[0].len;
958
Antonio de Angelis4743e672019-04-11 11:38:48 +0100959 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100960
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000961 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000962}
963
Maulik Patel28659c42021-01-06 14:09:22 +0000964psa_status_t psa_aead_decrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000965 psa_algorithm_t alg,
966 const uint8_t *nonce,
967 size_t nonce_length,
968 const uint8_t *additional_data,
969 size_t additional_data_length,
970 const uint8_t *ciphertext,
971 size_t ciphertext_length,
972 uint8_t *plaintext,
973 size_t plaintext_size,
974 size_t *plaintext_length)
975{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000976 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100977 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800978 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000979 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100980 .alg = alg,
981 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000982 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100983
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100984 /* Sanitize the optional input */
985 if ((additional_data == NULL) && (additional_data_length != 0)) {
986 return PSA_ERROR_INVALID_ARGUMENT;
987 }
988
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000989 size_t idx = 0;
990 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100991 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000992 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100993 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000994 };
995 psa_outvec out_vec[] = {
996 {.base = plaintext, .len = plaintext_size},
997 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000998
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000999 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
1000 return PSA_ERROR_INVALID_ARGUMENT;
1001 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001002
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001003 if (nonce != NULL) {
1004 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001005 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001006 }
1007 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001008
Antonio de Angelis4743e672019-04-11 11:38:48 +01001009 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001010
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001011 size_t in_len = ARRAY_SIZE(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001012 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001013 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001014 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001015 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001016 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001017
1018 *plaintext_length = out_vec[0].len;
1019
Antonio de Angelis4743e672019-04-11 11:38:48 +01001020 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +01001021
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001022 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +00001023}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001024
Maulik Patel28659c42021-01-06 14:09:22 +00001025psa_status_t psa_asymmetric_sign(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001026 psa_algorithm_t alg,
1027 const uint8_t *hash,
1028 size_t hash_length,
1029 uint8_t *signature,
1030 size_t signature_size,
1031 size_t *signature_length)
1032{
Maulik Patel28659c42021-01-06 14:09:22 +00001033 return psa_sign_hash(key, alg, hash, hash_length, signature, signature_size, signature_length);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001034}
1035
Maulik Patel28659c42021-01-06 14:09:22 +00001036psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001037 psa_algorithm_t alg,
1038 const uint8_t *hash,
1039 size_t hash_length,
1040 uint8_t *signature,
1041 size_t signature_size,
1042 size_t *signature_length)
1043{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001044 psa_status_t status;
1045 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001046 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001047 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001048 .alg = alg,
1049 };
1050
1051 psa_invec in_vec[] = {
1052 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1053 {.base = hash, .len = hash_length},
1054 };
1055 psa_outvec out_vec[] = {
1056 {.base = signature, .len = signature_size},
1057 };
1058
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001059 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001060
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001061 status = API_DISPATCH(tfm_crypto_sign_hash,
1062 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001063
1064 *signature_length = out_vec[0].len;
1065
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001066 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001067
1068 return status;
1069}
1070
Maulik Patel28659c42021-01-06 14:09:22 +00001071psa_status_t psa_asymmetric_verify(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001072 psa_algorithm_t alg,
1073 const uint8_t *hash,
1074 size_t hash_length,
1075 const uint8_t *signature,
1076 size_t signature_length)
1077{
Maulik Patel28659c42021-01-06 14:09:22 +00001078 return psa_verify_hash(key, alg, hash, hash_length, signature, signature_length);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001079}
1080
Maulik Patel28659c42021-01-06 14:09:22 +00001081psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001082 psa_algorithm_t alg,
1083 const uint8_t *hash,
1084 size_t hash_length,
1085 const uint8_t *signature,
1086 size_t signature_length)
1087{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001088 psa_status_t status;
1089 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001090 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001091 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001092 .alg = alg
1093 };
1094
1095 psa_invec in_vec[] = {
1096 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1097 {.base = hash, .len = hash_length},
1098 {.base = signature, .len = signature_length}
1099 };
1100
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001101 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001102
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001103 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
1104 TFM_CRYPTO_VERIFY_HASH);
Kevin Peng9449a362019-07-29 16:05:42 +08001105
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001106 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001107
1108 return status;
1109}
1110
Maulik Patel28659c42021-01-06 14:09:22 +00001111psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001112 psa_algorithm_t alg,
1113 const uint8_t *input,
1114 size_t input_length,
1115 const uint8_t *salt,
1116 size_t salt_length,
1117 uint8_t *output,
1118 size_t output_size,
1119 size_t *output_length)
1120{
1121 psa_status_t status;
1122 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001123 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001124 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001125 .alg = alg
1126 };
1127
1128 /* Sanitize the optional input */
1129 if ((salt == NULL) && (salt_length != 0)) {
1130 return PSA_ERROR_INVALID_ARGUMENT;
1131 }
1132
1133 psa_invec in_vec[] = {
1134 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1135 {.base = input, .len = input_length},
1136 {.base = salt, .len = salt_length}
1137 };
1138
1139 psa_outvec out_vec[] = {
1140 {.base = output, .len = output_size},
1141 };
1142
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001143 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001144
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001145 size_t in_len = ARRAY_SIZE(in_vec);
1146 if (salt == NULL) {
1147 in_len--;
1148 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001149 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001150 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001151
1152 *output_length = out_vec[0].len;
1153
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001154 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001155
1156 return status;
1157}
1158
Maulik Patel28659c42021-01-06 14:09:22 +00001159psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001160 psa_algorithm_t alg,
1161 const uint8_t *input,
1162 size_t input_length,
1163 const uint8_t *salt,
1164 size_t salt_length,
1165 uint8_t *output,
1166 size_t output_size,
1167 size_t *output_length)
1168{
1169 psa_status_t status;
1170 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001171 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001172 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001173 .alg = alg
1174 };
1175
1176 /* Sanitize the optional input */
1177 if ((salt == NULL) && (salt_length != 0)) {
1178 return PSA_ERROR_INVALID_ARGUMENT;
1179 }
1180
1181 psa_invec in_vec[] = {
1182 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1183 {.base = input, .len = input_length},
1184 {.base = salt, .len = salt_length}
1185 };
1186
1187 psa_outvec out_vec[] = {
1188 {.base = output, .len = output_size},
1189 };
1190
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001191 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001192
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001193 size_t in_len = ARRAY_SIZE(in_vec);
1194 if (salt == NULL) {
1195 in_len--;
1196 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001197 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001198 out_vec, ARRAY_SIZE(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001199
1200 *output_length = out_vec[0].len;
1201
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001202 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001203
1204 return status;
1205}
1206
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001207psa_status_t psa_key_derivation_get_capacity(
1208 const psa_key_derivation_operation_t *operation,
1209 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001210{
1211 psa_status_t status;
1212 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001213 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
1214 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001215 };
1216
1217 psa_invec in_vec[] = {
1218 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1219 };
1220
1221 psa_outvec out_vec[] = {
1222 {.base = capacity, .len = sizeof(size_t)},
1223 };
1224
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001225 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001226
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001227 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1228 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Kevin Peng9449a362019-07-29 16:05:42 +08001229
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001230 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001231
1232 return status;
1233}
1234
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001235psa_status_t psa_key_derivation_output_bytes(
1236 psa_key_derivation_operation_t *operation,
1237 uint8_t *output,
1238 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001239{
1240 psa_status_t status;
1241 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001242 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
1243 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001244 };
1245
1246 psa_invec in_vec[] = {
1247 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1248 };
1249
1250 psa_outvec out_vec[] = {
1251 {.base = output, .len = output_length},
1252 };
1253
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001254 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001255
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001256 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1257 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Kevin Peng9449a362019-07-29 16:05:42 +08001258
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001259 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001260
1261 return status;
1262}
1263
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001264psa_status_t psa_key_derivation_input_key(
1265 psa_key_derivation_operation_t *operation,
1266 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001267 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001268{
1269 psa_status_t status;
1270 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001271 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001272 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001273 .step = step,
1274 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001275 };
1276
1277 psa_invec in_vec[] = {
1278 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001279 };
1280
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001281 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001282
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001283 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1284 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +08001285
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001286 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001287
1288 return status;
1289}
1290
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001291psa_status_t psa_key_derivation_abort(
1292 psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001293{
1294 psa_status_t status;
1295 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001296 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
1297 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001298 };
1299
1300 psa_invec in_vec[] = {
1301 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1302 };
1303
1304 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001305 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001306 };
1307
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001308 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001309
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001310 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1311 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001312
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001313 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001314
1315 return status;
1316}
1317
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001318psa_status_t psa_key_derivation_key_agreement(
1319 psa_key_derivation_operation_t *operation,
1320 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001321 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001322 const uint8_t *peer_key,
1323 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001324{
1325 psa_status_t status;
1326 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001327 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001328 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001329 .step = step,
1330 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001331 };
1332
1333 psa_invec in_vec[] = {
1334 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1335 {.base = peer_key, .len = peer_key_length},
1336 };
1337
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001338 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001339
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001340 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1341 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001342
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001343 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001344
1345 return status;
1346}
1347
1348psa_status_t psa_generate_random(uint8_t *output,
1349 size_t output_size)
1350{
1351 psa_status_t status;
1352 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001353 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001354 };
1355
1356 psa_invec in_vec[] = {
1357 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1358 };
1359
1360 psa_outvec out_vec[] = {
1361 {.base = output, .len = output_size},
1362 };
1363
1364 if (output_size == 0) {
1365 return PSA_SUCCESS;
1366 }
1367
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001368 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001369
1370 status = API_DISPATCH(tfm_crypto_generate_random,
1371 TFM_CRYPTO_GENERATE_RANDOM);
1372
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001373 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001374
1375 return status;
1376}
1377
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001378psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001379 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001380{
1381 psa_status_t status;
1382 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001383 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001384 };
1385
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001386 psa_invec in_vec[] = {
1387 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001388 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1389 };
1390
1391 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001392 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001393 };
1394
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001395 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001396
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001397 status = API_DISPATCH(tfm_crypto_generate_key,
1398 TFM_CRYPTO_GENERATE_KEY);
1399 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001400
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001401 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001402}
1403
1404psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes,
1405 psa_key_type_t type,
1406 const uint8_t *data,
1407 size_t data_length)
1408{
1409 psa_status_t status;
1410
1411 status = PSA_ERROR_NOT_SUPPORTED;
1412
1413 return status;
1414}
1415
1416psa_status_t psa_get_key_domain_parameters(
1417 const psa_key_attributes_t *attributes,
1418 uint8_t *data,
1419 size_t data_size,
1420 size_t *data_length)
1421{
1422 psa_status_t status;
1423
1424 status = PSA_ERROR_NOT_SUPPORTED;
1425
1426 return status;
1427}
1428
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001429psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1430 const uint8_t *input,
1431 size_t input_length)
1432{
1433 psa_status_t status;
1434
1435 status = PSA_ERROR_NOT_SUPPORTED;
1436
1437 return status;
1438}
1439
1440psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1441 uint8_t *ciphertext,
1442 size_t ciphertext_size,
1443 size_t *ciphertext_length,
1444 uint8_t *tag,
1445 size_t tag_size,
1446 size_t *tag_length)
1447{
1448 psa_status_t status;
1449
1450 status = PSA_ERROR_NOT_SUPPORTED;
1451
1452 return status;
1453}
1454
1455psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1456 uint8_t *plaintext,
1457 size_t plaintext_size,
1458 size_t *plaintext_length,
1459 const uint8_t *tag,
1460 size_t tag_length)
1461{
1462 psa_status_t status;
1463
1464 status = PSA_ERROR_NOT_SUPPORTED;
1465
1466 return status;
1467}
1468
1469psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1470{
1471 psa_status_t status;
1472
1473 status = PSA_ERROR_NOT_SUPPORTED;
1474
1475 return status;
1476}
1477
Maulik Patel28659c42021-01-06 14:09:22 +00001478psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001479 psa_algorithm_t alg,
1480 const uint8_t *input,
1481 size_t input_length,
1482 uint8_t *mac,
1483 size_t mac_size,
1484 size_t *mac_length)
1485{
1486 psa_status_t status;
1487
1488 status = PSA_ERROR_NOT_SUPPORTED;
1489
1490 return status;
1491}
1492
Maulik Patel28659c42021-01-06 14:09:22 +00001493psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001494 psa_algorithm_t alg,
1495 const uint8_t *input,
1496 size_t input_length,
1497 const uint8_t *mac,
1498 const size_t mac_length)
1499{
1500 psa_status_t status;
1501
1502 status = PSA_ERROR_NOT_SUPPORTED;
1503
1504 return status;
1505}
1506
Maulik Patel28659c42021-01-06 14:09:22 +00001507psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001508 psa_algorithm_t alg,
1509 const uint8_t *input,
1510 size_t input_length,
1511 uint8_t *output,
1512 size_t output_size,
1513 size_t *output_length)
1514{
1515 psa_status_t status;
1516
1517 status = PSA_ERROR_NOT_SUPPORTED;
1518
1519 return status;
1520}
1521
Maulik Patel28659c42021-01-06 14:09:22 +00001522psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001523 psa_algorithm_t alg,
1524 const uint8_t *input,
1525 size_t input_length,
1526 uint8_t *output,
1527 size_t output_size,
1528 size_t *output_length)
1529{
1530 psa_status_t status;
1531
1532 status = PSA_ERROR_NOT_SUPPORTED;
1533
1534 return status;
1535}
1536
1537psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001538 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001539 const uint8_t *peer_key,
1540 size_t peer_key_length,
1541 uint8_t *output,
1542 size_t output_size,
1543 size_t *output_length)
1544{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001545 psa_status_t status;
1546 struct tfm_crypto_pack_iovec iov = {
1547 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1548 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001549 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001550 };
1551
1552 psa_invec in_vec[] = {
1553 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1554 {.base = peer_key, .len = peer_key_length},
1555 };
1556
1557 psa_outvec out_vec[] = {
1558 {.base = output, .len = output_size},
1559 };
1560
1561 PSA_CONNECT(TFM_CRYPTO);
1562
1563 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1564 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1565
1566 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001567
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001568 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001569
1570 return status;
1571}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001572
1573psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1574 psa_algorithm_t alg)
1575{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001576 psa_status_t status;
1577 struct tfm_crypto_pack_iovec iov = {
1578 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1579 .alg = alg,
1580 .op_handle = operation->handle,
1581 };
1582
1583 psa_invec in_vec[] = {
1584 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1585 };
1586 psa_outvec out_vec[] = {
1587 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1588 };
1589
1590 PSA_CONNECT(TFM_CRYPTO);
1591
1592 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1593 TFM_CRYPTO_KEY_DERIVATION_SETUP);
1594 PSA_CLOSE();
1595
1596 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001597}
1598
1599psa_status_t psa_key_derivation_set_capacity(
1600 psa_key_derivation_operation_t *operation,
1601 size_t capacity)
1602{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001603 psa_status_t status;
1604 struct tfm_crypto_pack_iovec iov = {
1605 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
1606 .capacity = capacity,
1607 .op_handle = operation->handle,
1608 };
1609
1610 psa_invec in_vec[] = {
1611 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1612 };
1613
1614 PSA_CONNECT(TFM_CRYPTO);
1615
1616 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1617 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
1618 PSA_CLOSE();
1619
1620 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001621}
1622
1623psa_status_t psa_key_derivation_input_bytes(
1624 psa_key_derivation_operation_t *operation,
1625 psa_key_derivation_step_t step,
1626 const uint8_t *data,
1627 size_t data_length)
1628{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001629 psa_status_t status;
1630 struct tfm_crypto_pack_iovec iov = {
1631 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1632 .step = step,
1633 .op_handle = operation->handle,
1634 };
1635
1636 psa_invec in_vec[] = {
1637 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1638 {.base = data, .len = data_length},
1639 };
1640
1641 PSA_CONNECT(TFM_CRYPTO);
1642
1643 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1644 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
1645 PSA_CLOSE();
1646
1647 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001648}
1649
1650psa_status_t psa_key_derivation_output_key(
1651 const psa_key_attributes_t *attributes,
1652 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001653 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001654{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001655 psa_status_t status;
1656 struct tfm_crypto_pack_iovec iov = {
1657 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1658 .op_handle = operation->handle,
1659 };
1660
1661 psa_invec in_vec[] = {
1662 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1663 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1664 };
1665
1666 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001667 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001668 };
1669
1670 PSA_CONNECT(TFM_CRYPTO);
1671
1672 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1673 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
1674 PSA_CLOSE();
1675
1676 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001677}
1678
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001679psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001680 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001681 psa_algorithm_t alg)
1682{
1683 psa_status_t status;
1684
1685 status = PSA_ERROR_NOT_SUPPORTED;
1686
1687 return status;
1688}
1689
1690psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001691 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001692 psa_algorithm_t alg)
1693{
1694 psa_status_t status;
1695
1696 status = PSA_ERROR_NOT_SUPPORTED;
1697
1698 return status;
1699}
1700
1701psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
1702 uint8_t *nonce,
1703 size_t nonce_size,
1704 size_t *nonce_length)
1705{
1706 psa_status_t status;
1707
1708 status = PSA_ERROR_NOT_SUPPORTED;
1709
1710 return status;
1711}
1712
1713psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
1714 const uint8_t *nonce,
1715 size_t nonce_length)
1716{
1717 psa_status_t status;
1718
1719 status = PSA_ERROR_NOT_SUPPORTED;
1720
1721 return status;
1722}
1723
1724psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
1725 size_t ad_length,
1726 size_t plaintext_length)
1727{
1728 psa_status_t status;
1729
1730 status = PSA_ERROR_NOT_SUPPORTED;
1731
1732 return status;
1733}
1734
1735psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1736 const uint8_t *input,
1737 size_t input_length,
1738 uint8_t *output,
1739 size_t output_size,
1740 size_t *output_length)
1741{
1742 psa_status_t status;
1743
1744 status = PSA_ERROR_NOT_SUPPORTED;
1745
1746 return status;
1747}