blob: 33aff2d2a948ee2714ee751532f6e3a58d317f30 [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
Jamie Fox0e54ebc2019-04-09 14:21:04 +010014#define PSA_CONNECT(service) \
15 psa_handle_t ipc_handle; \
Edison Aicc4c6162019-06-21 13:52:49 +080016 ipc_handle = psa_connect(service##_SID, service##_VERSION); \
Summer Qinb207a152019-07-03 16:36:49 +080017 if (!PSA_HANDLE_IS_VALID(ipc_handle)) { \
Jamie Fox0e54ebc2019-04-09 14:21:04 +010018 return PSA_ERROR_GENERIC_ERROR; \
19 } \
Antonio de Angelis4743e672019-04-11 11:38:48 +010020
Jamie Fox0e54ebc2019-04-09 14:21:04 +010021#define PSA_CLOSE() psa_close(ipc_handle)
Antonio de Angelis4743e672019-04-11 11:38:48 +010022
Jamie Fox0e54ebc2019-04-09 14:21:04 +010023#define API_DISPATCH(sfn_name, sfn_id) \
Summer Qin4b1d03b2019-07-02 14:56:08 +080024 psa_call(ipc_handle, PSA_IPC_CALL, \
Xinyu Zhangade2e0a2021-03-18 16:20:54 +080025 in_vec, IOVEC_LEN(in_vec), \
26 out_vec, IOVEC_LEN(out_vec))
Antonio de Angelis4743e672019-04-11 11:38:48 +010027
Jamie Fox0e54ebc2019-04-09 14:21:04 +010028#define API_DISPATCH_NO_OUTVEC(sfn_name, sfn_id) \
Summer Qin4b1d03b2019-07-02 14:56:08 +080029 psa_call(ipc_handle, PSA_IPC_CALL, \
Xinyu Zhangade2e0a2021-03-18 16:20:54 +080030 in_vec, IOVEC_LEN(in_vec), \
Antonio de Angelis4743e672019-04-11 11:38:48 +010031 (psa_outvec *)NULL, 0)
Antonio de Angelis8908f472018-08-31 15:44:25 +010032
33psa_status_t psa_crypto_init(void)
34{
35 /* Service init is performed during TFM boot up,
36 * so application level initialisation is empty
37 */
38 return PSA_SUCCESS;
39}
40
Antonio de Angelis04debbd2019-10-14 12:12:52 +010041psa_status_t psa_open_key(psa_key_id_t id,
Maulik Patel28659c42021-01-06 14:09:22 +000042 psa_key_id_t *key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010043{
Jamie Foxdadb4e82019-09-03 17:59:41 +010044 psa_status_t status;
45 const struct tfm_crypto_pack_iovec iov = {
46 .sfn_id = TFM_CRYPTO_OPEN_KEY_SID,
Jamie Foxdadb4e82019-09-03 17:59:41 +010047 };
48 psa_invec in_vec[] = {
49 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
50 {.base = &id, .len = sizeof(psa_key_id_t)},
51 };
52 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000053 {.base = key, .len = sizeof(psa_key_id_t)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010054 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010055
Jamie Foxdadb4e82019-09-03 17:59:41 +010056 PSA_CONNECT(TFM_CRYPTO);
57
58 status = API_DISPATCH(tfm_crypto_open_key,
59 TFM_CRYPTO_OPEN_KEY);
60
61 PSA_CLOSE();
62
63 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +010064}
65
Maulik Patel28659c42021-01-06 14:09:22 +000066psa_status_t psa_close_key(psa_key_id_t key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010067{
Jamie Foxdadb4e82019-09-03 17:59:41 +010068 psa_status_t status;
69 const struct tfm_crypto_pack_iovec iov = {
70 .sfn_id = TFM_CRYPTO_CLOSE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000071 .key_id = key,
Jamie Foxdadb4e82019-09-03 17:59:41 +010072 };
73 psa_invec in_vec[] = {
74 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
75 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010076
Jamie Foxdadb4e82019-09-03 17:59:41 +010077 PSA_CONNECT(TFM_CRYPTO);
78
79 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_close_key,
80 TFM_CRYPTO_CLOSE_KEY);;
81
82 PSA_CLOSE();
83
84 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +010085}
86
Antonio de Angelis04debbd2019-10-14 12:12:52 +010087psa_status_t psa_import_key(const psa_key_attributes_t *attributes,
Antonio de Angelis8908f472018-08-31 15:44:25 +010088 const uint8_t *data,
Antonio de Angelis04debbd2019-10-14 12:12:52 +010089 size_t data_length,
Maulik Patel28659c42021-01-06 14:09:22 +000090 psa_key_id_t *key)
Antonio de Angelis8908f472018-08-31 15:44:25 +010091{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000092 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +010093 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +080094 .sfn_id = TFM_CRYPTO_IMPORT_KEY_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +010095 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000096 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +010097 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +010098 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000099 {.base = data, .len = data_length}
100 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100101 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000102 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100103 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100104
Antonio de Angelis4743e672019-04-11 11:38:48 +0100105 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100106
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100107 status = API_DISPATCH(tfm_crypto_import_key,
108 TFM_CRYPTO_IMPORT_KEY);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100109 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100110
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000111 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100112}
113
Maulik Patel28659c42021-01-06 14:09:22 +0000114psa_status_t psa_destroy_key(psa_key_id_t key)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100115{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000116 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100117 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800118 .sfn_id = TFM_CRYPTO_DESTROY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000119 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100120 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000121 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100122 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000123 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100124
Antonio de Angelis4743e672019-04-11 11:38:48 +0100125 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100126
127 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_destroy_key,
128 TFM_CRYPTO_DESTROY_KEY);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100129 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100130
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000131 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100132}
133
Maulik Patel28659c42021-01-06 14:09:22 +0000134psa_status_t psa_get_key_attributes(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100135 psa_key_attributes_t *attributes)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100136{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000137 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100138 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100139 .sfn_id = TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000140 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100141 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000142 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100143 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000144 };
145 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100146 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000147 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100148
Antonio de Angelis4743e672019-04-11 11:38:48 +0100149 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100150
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100151 status = API_DISPATCH(tfm_crypto_get_key_attributes,
152 TFM_CRYPTO_GET_KEY_ATTRIBUTES);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100153 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100154
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000155 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100156}
157
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100158void psa_reset_key_attributes(psa_key_attributes_t *attributes)
159{
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100160 struct tfm_crypto_pack_iovec iov = {
161 .sfn_id = TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID,
162 };
163 psa_invec in_vec[] = {
164 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
165 };
166 psa_outvec out_vec[] = {
167 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
168 };
169
170 psa_handle_t ipc_handle;
171 ipc_handle = psa_connect(TFM_CRYPTO_SID, TFM_CRYPTO_VERSION);
172 if (!PSA_HANDLE_IS_VALID(ipc_handle)) {
173 return;
174 }
175
176 (void)API_DISPATCH(tfm_crypto_reset_key_attributes,
177 TFM_CRYPTO_RESET_KEY_ATTRIBUTES);
178 PSA_CLOSE();
179
180 return;
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100181}
182
Maulik Patel28659c42021-01-06 14:09:22 +0000183psa_status_t psa_export_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100184 uint8_t *data,
185 size_t data_size,
186 size_t *data_length)
187{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000188 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100189 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800190 .sfn_id = TFM_CRYPTO_EXPORT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000191 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100192 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000193 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100194 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000195 };
196 psa_outvec out_vec[] = {
197 {.base = data, .len = data_size}
198 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100199
Antonio de Angelis4743e672019-04-11 11:38:48 +0100200 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100201
202 status = API_DISPATCH(tfm_crypto_export_key,
203 TFM_CRYPTO_EXPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100204
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000205 *data_length = out_vec[0].len;
206
Antonio de Angelis4743e672019-04-11 11:38:48 +0100207 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100208
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000209 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100210}
211
Maulik Patel28659c42021-01-06 14:09:22 +0000212psa_status_t psa_export_public_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100213 uint8_t *data,
214 size_t data_size,
215 size_t *data_length)
216{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100217 psa_status_t status;
218 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800219 .sfn_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000220 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100221 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000222
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100223 psa_invec in_vec[] = {
224 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
225 };
226 psa_outvec out_vec[] = {
227 {.base = data, .len = data_size}
228 };
229
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100230 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100231
232 status = API_DISPATCH(tfm_crypto_export_public_key,
233 TFM_CRYPTO_EXPORT_PUBLIC_KEY);
234
235 *data_length = out_vec[0].len;
236
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100237 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100238
239 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100240}
241
Maulik Patel28659c42021-01-06 14:09:22 +0000242psa_status_t psa_purge_key(psa_key_id_t key)
243{
244 psa_status_t status;
245 struct tfm_crypto_pack_iovec iov = {
246 .sfn_id = TFM_CRYPTO_PURGE_KEY_SID,
247 .key_id = key,
248 };
249 psa_invec in_vec[] = {
250 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
251 };
252
253 PSA_CONNECT(TFM_CRYPTO);
254
255 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_purge_key,
256 TFM_CRYPTO_PURGE_KEY);
257
258 PSA_CLOSE();
259
260 return status;
261}
262
263psa_status_t psa_copy_key(psa_key_id_t source_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100264 const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +0000265 psa_key_id_t *target_key)
Jamie Foxefd82732018-11-26 10:34:32 +0000266{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100267 psa_status_t status;
268 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800269 .sfn_id = TFM_CRYPTO_COPY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000270 .key_id = source_key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100271 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000272
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100273 psa_invec in_vec[] = {
274 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100275 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
276
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100277 };
278
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000279 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000280 {.base = target_key, .len = sizeof(psa_key_id_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000281 };
Jamie Foxefd82732018-11-26 10:34:32 +0000282
Antonio de Angelis4743e672019-04-11 11:38:48 +0100283 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100284
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100285 status = API_DISPATCH(tfm_crypto_copy_key,
286 TFM_CRYPTO_COPY_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +0800287
Antonio de Angelis4743e672019-04-11 11:38:48 +0100288 PSA_CLOSE();
Jamie Foxefd82732018-11-26 10:34:32 +0000289
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000290 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000291}
292
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100293psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
294 unsigned char *iv,
295 size_t iv_size,
296 size_t *iv_length)
297{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100298 psa_status_t status;
299 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800300 .sfn_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100301 .op_handle = operation->handle,
302 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100303
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100304 psa_invec in_vec[] = {
305 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
306 };
307 psa_outvec out_vec[] = {
308 {.base = &(operation->handle), .len = sizeof(uint32_t)},
309 {.base = iv, .len = iv_size},
310 };
311
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100312 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100313
314 status = API_DISPATCH(tfm_crypto_cipher_generate_iv,
315 TFM_CRYPTO_CIPHER_GENERATE_IV);
316
317 *iv_length = out_vec[1].len;
318
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100319 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100320
321 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100322}
323
Antonio de Angelis377a1552018-11-22 17:02:40 +0000324psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
325 const unsigned char *iv,
326 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100327{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000328 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100329 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800330 .sfn_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100331 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100332 };
333
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000334 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100335 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000336 {.base = iv, .len = iv_length},
337 };
338 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100339 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000340 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100341
Antonio de Angelis4743e672019-04-11 11:38:48 +0100342 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100343
344 status = API_DISPATCH(tfm_crypto_cipher_set_iv,
345 TFM_CRYPTO_CIPHER_SET_IV);
Kevin Peng9449a362019-07-29 16:05:42 +0800346
Antonio de Angelis4743e672019-04-11 11:38:48 +0100347 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100348
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000349 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100350}
351
Antonio de Angelis377a1552018-11-22 17:02:40 +0000352psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000353 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000354 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100355{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000356 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100357 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800358 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000359 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100360 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100361 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000362 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100363
Antonio de Angelis4743e672019-04-11 11:38:48 +0100364 psa_invec in_vec[] = {
365 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
366 };
367 psa_outvec out_vec[] = {
368 {.base = &(operation->handle), .len = sizeof(uint32_t)},
369 };
370
Antonio de Angelis4743e672019-04-11 11:38:48 +0100371 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100372
373 status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup,
374 TFM_CRYPTO_CIPHER_ENCRYPT_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800375
Antonio de Angelis4743e672019-04-11 11:38:48 +0100376 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100377
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000378 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100379}
380
Antonio de Angelis377a1552018-11-22 17:02:40 +0000381psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000382 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000383 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100384{
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_DECRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000388 .key_id = key,
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_decrypt_setup,
403 TFM_CRYPTO_CIPHER_DECRYPT_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 Angelis8908f472018-08-31 15:44:25 +0100408}
409
410psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
411 const uint8_t *input,
412 size_t input_length,
413 unsigned char *output,
414 size_t output_size,
415 size_t *output_length)
416{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000417 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100418 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800419 .sfn_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100420 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100421 };
422
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000423 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100424 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000425 {.base = input, .len = input_length},
426 };
427 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100428 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000429 {.base = output, .len = output_size}
430 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100431
Antonio de Angelis4743e672019-04-11 11:38:48 +0100432 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100433
434 status = API_DISPATCH(tfm_crypto_cipher_update,
435 TFM_CRYPTO_CIPHER_UPDATE);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100436
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000437 *output_length = out_vec[1].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100438
Antonio de Angelis4743e672019-04-11 11:38:48 +0100439 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100440
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000441 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100442}
443
444psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
445{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000446 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100447 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800448 .sfn_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100449 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000450 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100451
Antonio de Angelis4743e672019-04-11 11:38:48 +0100452 psa_invec in_vec[] = {
453 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
454 };
455 psa_outvec out_vec[] = {
456 {.base = &(operation->handle), .len = sizeof(uint32_t)},
457 };
458
Antonio de Angelis4743e672019-04-11 11:38:48 +0100459 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100460
461 status = API_DISPATCH(tfm_crypto_cipher_abort,
462 TFM_CRYPTO_CIPHER_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800463
Antonio de Angelis4743e672019-04-11 11:38:48 +0100464 PSA_CLOSE();
Antonio de Angelis8908f472018-08-31 15:44:25 +0100465
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000466 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100467}
468
469psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
470 uint8_t *output,
471 size_t output_size,
472 size_t *output_length)
473{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000474 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100475 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800476 .sfn_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100477 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100478 };
479
480 psa_invec in_vec[] = {
481 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
482 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000483 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100484 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000485 {.base = output, .len = output_size},
486 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100487
Antonio de Angelis4743e672019-04-11 11:38:48 +0100488 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100489
490 status = API_DISPATCH(tfm_crypto_cipher_finish,
491 TFM_CRYPTO_CIPHER_FINISH);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100492
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000493 *output_length = out_vec[1].len;
494
Antonio de Angelis4743e672019-04-11 11:38:48 +0100495 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100496
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000497 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100498}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100499
Antonio de Angelis377a1552018-11-22 17:02:40 +0000500psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100501 psa_algorithm_t alg)
502{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000503 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100504 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800505 .sfn_id = TFM_CRYPTO_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100506 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100507 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000508 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100509
Antonio de Angelis4743e672019-04-11 11:38:48 +0100510 psa_invec in_vec[] = {
511 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
512 };
513 psa_outvec out_vec[] = {
514 {.base = &(operation->handle), .len = sizeof(uint32_t)},
515 };
516
Antonio de Angelis4743e672019-04-11 11:38:48 +0100517 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100518
519 status = API_DISPATCH(tfm_crypto_hash_setup,
520 TFM_CRYPTO_HASH_SETUP);
521
Antonio de Angelis4743e672019-04-11 11:38:48 +0100522 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100523
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000524 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100525}
526
527psa_status_t psa_hash_update(psa_hash_operation_t *operation,
528 const uint8_t *input,
529 size_t input_length)
530{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000531 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100532 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800533 .sfn_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100534 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100535 };
536
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000537 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100538 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000539 {.base = input, .len = input_length},
540 };
541 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100542 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000543 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100544
Antonio de Angelis4743e672019-04-11 11:38:48 +0100545 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100546
547 status = API_DISPATCH(tfm_crypto_hash_update,
548 TFM_CRYPTO_HASH_UPDATE);
549
Antonio de Angelis4743e672019-04-11 11:38:48 +0100550 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100551
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000552 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100553}
554
555psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
556 uint8_t *hash,
557 size_t hash_size,
558 size_t *hash_length)
559{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000560 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100561 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800562 .sfn_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100563 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100564 };
565
566 psa_invec in_vec[] = {
567 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
568 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000569 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100570 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000571 {.base = hash, .len = hash_size},
572 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100573
Antonio de Angelis4743e672019-04-11 11:38:48 +0100574 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100575
576 status = API_DISPATCH(tfm_crypto_hash_finish,
577 TFM_CRYPTO_HASH_FINISH);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100578
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000579 *hash_length = out_vec[1].len;
580
Antonio de Angelis4743e672019-04-11 11:38:48 +0100581 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100582
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000583 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100584}
585
586psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
587 const uint8_t *hash,
588 size_t hash_length)
589{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000590 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100591 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800592 .sfn_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100593 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100594 };
595
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000596 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100597 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000598 {.base = hash, .len = hash_length},
599 };
600 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100601 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000602 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100603
Antonio de Angelis4743e672019-04-11 11:38:48 +0100604 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100605
606 status = API_DISPATCH(tfm_crypto_hash_verify,
607 TFM_CRYPTO_HASH_VERIFY);
Kevin Peng9449a362019-07-29 16:05:42 +0800608
Antonio de Angelis4743e672019-04-11 11:38:48 +0100609 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100610
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000611 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100612}
613
614psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
615{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000616 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100617 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800618 .sfn_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100619 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000620 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100621
Antonio de Angelis4743e672019-04-11 11:38:48 +0100622 psa_invec in_vec[] = {
623 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
624 };
625 psa_outvec out_vec[] = {
626 {.base = &(operation->handle), .len = sizeof(uint32_t)},
627 };
628
Antonio de Angelis4743e672019-04-11 11:38:48 +0100629 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100630
631 status = API_DISPATCH(tfm_crypto_hash_abort,
632 TFM_CRYPTO_HASH_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800633
Antonio de Angelis4743e672019-04-11 11:38:48 +0100634 PSA_CLOSE();
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100635
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000636 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100637}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100638
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100639psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
640 psa_hash_operation_t *target_operation)
641{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100642 psa_status_t status;
643 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800644 .sfn_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100645 .op_handle = source_operation->handle,
646 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100647
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100648 psa_invec in_vec[] = {
649 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
650 };
651 psa_outvec out_vec[] = {
652 {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
653 };
654
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100655 if (target_operation && (target_operation->handle != 0)) {
656 return PSA_ERROR_BAD_STATE;
657 }
658
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100659 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100660
661 status = API_DISPATCH(tfm_crypto_hash_clone,
662 TFM_CRYPTO_HASH_CLONE);
Kevin Peng9449a362019-07-29 16:05:42 +0800663
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100664 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100665
666 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100667}
668
Soby Mathew07ef6e42020-07-20 21:09:23 +0100669psa_status_t psa_hash_compute(psa_algorithm_t alg,
670 const uint8_t *input,
671 size_t input_length,
672 uint8_t *hash,
673 size_t hash_size,
674 size_t *hash_length)
675{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100676 psa_status_t status;
677 struct tfm_crypto_pack_iovec iov = {
678 .sfn_id = TFM_CRYPTO_HASH_COMPUTE_SID,
679 .alg = alg,
680 };
681
682 psa_invec in_vec[] = {
683 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
684 {.base = input, .len = input_length},
685 };
686
687 psa_outvec out_vec[] = {
688 {.base = hash, .len = hash_size}
689 };
690
691 PSA_CONNECT(TFM_CRYPTO);
692
693 status = API_DISPATCH(tfm_crypto_hash_compute,
694 TFM_CRYPTO_HASH_COMPUTE);
695
696 *hash_length = out_vec[0].len;
697
698 PSA_CLOSE();
699
700 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100701}
702
703psa_status_t psa_hash_compare(psa_algorithm_t alg,
704 const uint8_t *input,
705 size_t input_length,
706 const uint8_t *hash,
707 size_t hash_length)
708{
Soby Mathew07ef6e42020-07-20 21:09:23 +0100709 psa_status_t status;
710 struct tfm_crypto_pack_iovec iov = {
711 .sfn_id = TFM_CRYPTO_HASH_COMPARE_SID,
712 .alg = alg,
713 };
714
715 psa_invec in_vec[] = {
716 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
717 {.base = input, .len = input_length},
718 {.base = hash, .len = hash_length},
719 };
720
721 PSA_CONNECT(TFM_CRYPTO);
722
723 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_hash_compare,
724 TFM_CRYPTO_HASH_COMPARE);
725
726 PSA_CLOSE();
727
728 return status;
Soby Mathew07ef6e42020-07-20 21:09:23 +0100729}
730
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100731psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000732 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100733 psa_algorithm_t alg)
734{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000735 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100736 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800737 .sfn_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000738 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100739 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100740 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000741 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100742
Antonio de Angelis4743e672019-04-11 11:38:48 +0100743 psa_invec in_vec[] = {
744 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
745 };
746 psa_outvec out_vec[] = {
747 {.base = &(operation->handle), .len = sizeof(uint32_t)},
748 };
749
Antonio de Angelis4743e672019-04-11 11:38:48 +0100750 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100751
752 status = API_DISPATCH(tfm_crypto_mac_sign_setup,
753 TFM_CRYPTO_MAC_SIGN_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800754
Antonio de Angelis4743e672019-04-11 11:38:48 +0100755 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100756
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000757 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100758}
759
760psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000761 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100762 psa_algorithm_t alg)
763{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000764 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100765 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800766 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000767 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100768 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100769 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000770 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100771
Antonio de Angelis4743e672019-04-11 11:38:48 +0100772 psa_invec in_vec[] = {
773 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
774 };
775 psa_outvec out_vec[] = {
776 {.base = &(operation->handle), .len = sizeof(uint32_t)},
777 };
778
Antonio de Angelis4743e672019-04-11 11:38:48 +0100779 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100780
781 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
782 TFM_CRYPTO_MAC_VERIFY_SETUP);
Kevin Peng9449a362019-07-29 16:05:42 +0800783
Antonio de Angelis4743e672019-04-11 11:38:48 +0100784 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100785
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000786 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100787}
788
789psa_status_t psa_mac_update(psa_mac_operation_t *operation,
790 const uint8_t *input,
791 size_t input_length)
792{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000793 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100794 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800795 .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100796 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100797 };
798
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000799 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100800 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000801 {.base = input, .len = input_length},
802 };
803 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100804 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000805 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100806
Antonio de Angelis4743e672019-04-11 11:38:48 +0100807 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100808
809 status = API_DISPATCH(tfm_crypto_mac_update,
810 TFM_CRYPTO_MAC_UPDATE);
Kevin Peng9449a362019-07-29 16:05:42 +0800811
Antonio de Angelis4743e672019-04-11 11:38:48 +0100812 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100813
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000814 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100815}
816
817psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
818 uint8_t *mac,
819 size_t mac_size,
820 size_t *mac_length)
821{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000822 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100823 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800824 .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100825 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100826 };
827
828 psa_invec in_vec[] = {
829 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
830 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000831 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100832 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000833 {.base = mac, .len = mac_size},
834 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100835
Antonio de Angelis4743e672019-04-11 11:38:48 +0100836 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100837
838 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
839 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100840
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000841 *mac_length = out_vec[1].len;
842
Antonio de Angelis4743e672019-04-11 11:38:48 +0100843 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100844
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000845 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100846}
847
848psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
849 const uint8_t *mac,
850 size_t mac_length)
851{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000852 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100853 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800854 .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100855 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100856 };
857
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000858 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100859 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000860 {.base = mac, .len = mac_length},
861 };
862 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100863 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000864 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100865
Antonio de Angelis4743e672019-04-11 11:38:48 +0100866 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100867
868 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
869 TFM_CRYPTO_MAC_VERIFY_FINISH);
870
Antonio de Angelis4743e672019-04-11 11:38:48 +0100871 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100872
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000873 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100874}
875
876psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
877{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000878 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100879 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800880 .sfn_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100881 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000882 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100883
Antonio de Angelis4743e672019-04-11 11:38:48 +0100884 psa_invec in_vec[] = {
885 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
886 };
887 psa_outvec out_vec[] = {
888 {.base = &(operation->handle), .len = sizeof(uint32_t)},
889 };
890
Antonio de Angelis4743e672019-04-11 11:38:48 +0100891 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100892
893 status = API_DISPATCH(tfm_crypto_mac_abort,
894 TFM_CRYPTO_MAC_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +0800895
Antonio de Angelis4743e672019-04-11 11:38:48 +0100896 PSA_CLOSE();
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100897
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000898 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100899}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000900
Maulik Patel28659c42021-01-06 14:09:22 +0000901psa_status_t psa_aead_encrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000902 psa_algorithm_t alg,
903 const uint8_t *nonce,
904 size_t nonce_length,
905 const uint8_t *additional_data,
906 size_t additional_data_length,
907 const uint8_t *plaintext,
908 size_t plaintext_length,
909 uint8_t *ciphertext,
910 size_t ciphertext_size,
911 size_t *ciphertext_length)
912{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000913 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100914 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800915 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000916 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100917 .alg = alg,
918 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000919 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100920
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100921 /* Sanitize the optional input */
922 if ((additional_data == NULL) && (additional_data_length != 0)) {
923 return PSA_ERROR_INVALID_ARGUMENT;
924 }
925
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000926 size_t idx = 0;
927 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100928 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000929 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100930 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000931 };
932 psa_outvec out_vec[] = {
933 {.base = ciphertext, .len = ciphertext_size},
934 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000935
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000936 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
937 return PSA_ERROR_INVALID_ARGUMENT;
938 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000939
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000940 if (nonce != NULL) {
941 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100942 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000943 }
944 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000945
Antonio de Angelis4743e672019-04-11 11:38:48 +0100946 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100947
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800948 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +0100949 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100950 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100951 }
Summer Qin4b1d03b2019-07-02 14:56:08 +0800952 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +0800953 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000954
955 *ciphertext_length = out_vec[0].len;
956
Antonio de Angelis4743e672019-04-11 11:38:48 +0100957 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +0100958
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000959 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000960}
961
Maulik Patel28659c42021-01-06 14:09:22 +0000962psa_status_t psa_aead_decrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000963 psa_algorithm_t alg,
964 const uint8_t *nonce,
965 size_t nonce_length,
966 const uint8_t *additional_data,
967 size_t additional_data_length,
968 const uint8_t *ciphertext,
969 size_t ciphertext_length,
970 uint8_t *plaintext,
971 size_t plaintext_size,
972 size_t *plaintext_length)
973{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000974 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100975 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800976 .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000977 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100978 .alg = alg,
979 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000980 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100981
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100982 /* Sanitize the optional input */
983 if ((additional_data == NULL) && (additional_data_length != 0)) {
984 return PSA_ERROR_INVALID_ARGUMENT;
985 }
986
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000987 size_t idx = 0;
988 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100989 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000990 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100991 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000992 };
993 psa_outvec out_vec[] = {
994 {.base = plaintext, .len = plaintext_size},
995 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000996
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000997 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
998 return PSA_ERROR_INVALID_ARGUMENT;
999 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001000
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001001 if (nonce != NULL) {
1002 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +01001003 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001004 }
1005 }
Antonio de Angelis3a480992018-11-07 11:53:28 +00001006
Antonio de Angelis4743e672019-04-11 11:38:48 +01001007 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001008
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001009 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis4743e672019-04-11 11:38:48 +01001010 if (additional_data == NULL) {
Jamie Fox0e54ebc2019-04-09 14:21:04 +01001011 in_len--;
Antonio de Angelis4743e672019-04-11 11:38:48 +01001012 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001013 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001014 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001015
1016 *plaintext_length = out_vec[0].len;
1017
Antonio de Angelis4743e672019-04-11 11:38:48 +01001018 PSA_CLOSE();
Antonio de Angelis4743e672019-04-11 11:38:48 +01001019
Antonio de Angelisab85ccd2019-03-25 15:14:29 +00001020 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +00001021}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001022
Maulik Patel28659c42021-01-06 14:09:22 +00001023psa_status_t psa_asymmetric_sign(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001024 psa_algorithm_t alg,
1025 const uint8_t *hash,
1026 size_t hash_length,
1027 uint8_t *signature,
1028 size_t signature_size,
1029 size_t *signature_length)
1030{
Maulik Patel28659c42021-01-06 14:09:22 +00001031 return psa_sign_hash(key, alg, hash, hash_length, signature, signature_size, signature_length);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001032}
1033
Maulik Patel28659c42021-01-06 14:09:22 +00001034psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001035 psa_algorithm_t alg,
1036 const uint8_t *hash,
1037 size_t hash_length,
1038 uint8_t *signature,
1039 size_t signature_size,
1040 size_t *signature_length)
1041{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001042 psa_status_t status;
1043 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001044 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001045 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001046 .alg = alg,
1047 };
1048
1049 psa_invec in_vec[] = {
1050 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1051 {.base = hash, .len = hash_length},
1052 };
1053 psa_outvec out_vec[] = {
1054 {.base = signature, .len = signature_size},
1055 };
1056
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001057 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001058
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001059 status = API_DISPATCH(tfm_crypto_sign_hash,
1060 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001061
1062 *signature_length = out_vec[0].len;
1063
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001064 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001065
1066 return status;
1067}
1068
Maulik Patel28659c42021-01-06 14:09:22 +00001069psa_status_t psa_asymmetric_verify(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001070 psa_algorithm_t alg,
1071 const uint8_t *hash,
1072 size_t hash_length,
1073 const uint8_t *signature,
1074 size_t signature_length)
1075{
Maulik Patel28659c42021-01-06 14:09:22 +00001076 return psa_verify_hash(key, alg, hash, hash_length, signature, signature_length);
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001077}
1078
Maulik Patel28659c42021-01-06 14:09:22 +00001079psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001080 psa_algorithm_t alg,
1081 const uint8_t *hash,
1082 size_t hash_length,
1083 const uint8_t *signature,
1084 size_t signature_length)
1085{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001086 psa_status_t status;
1087 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001088 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001089 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001090 .alg = alg
1091 };
1092
1093 psa_invec in_vec[] = {
1094 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1095 {.base = hash, .len = hash_length},
1096 {.base = signature, .len = signature_length}
1097 };
1098
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001099 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001100
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001101 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
1102 TFM_CRYPTO_VERIFY_HASH);
Kevin Peng9449a362019-07-29 16:05:42 +08001103
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001104 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001105
1106 return status;
1107}
1108
Maulik Patel28659c42021-01-06 14:09:22 +00001109psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001110 psa_algorithm_t alg,
1111 const uint8_t *input,
1112 size_t input_length,
1113 const uint8_t *salt,
1114 size_t salt_length,
1115 uint8_t *output,
1116 size_t output_size,
1117 size_t *output_length)
1118{
1119 psa_status_t status;
1120 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001121 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001122 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001123 .alg = alg
1124 };
1125
1126 /* Sanitize the optional input */
1127 if ((salt == NULL) && (salt_length != 0)) {
1128 return PSA_ERROR_INVALID_ARGUMENT;
1129 }
1130
1131 psa_invec in_vec[] = {
1132 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1133 {.base = input, .len = input_length},
1134 {.base = salt, .len = salt_length}
1135 };
1136
1137 psa_outvec out_vec[] = {
1138 {.base = output, .len = output_size},
1139 };
1140
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001141 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001142
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001143 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001144 if (salt == NULL) {
1145 in_len--;
1146 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001147 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001148 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001149
1150 *output_length = out_vec[0].len;
1151
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001152 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001153
1154 return status;
1155}
1156
Maulik Patel28659c42021-01-06 14:09:22 +00001157psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001158 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{
1167 psa_status_t status;
1168 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001169 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001170 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001171 .alg = alg
1172 };
1173
1174 /* Sanitize the optional input */
1175 if ((salt == NULL) && (salt_length != 0)) {
1176 return PSA_ERROR_INVALID_ARGUMENT;
1177 }
1178
1179 psa_invec in_vec[] = {
1180 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1181 {.base = input, .len = input_length},
1182 {.base = salt, .len = salt_length}
1183 };
1184
1185 psa_outvec out_vec[] = {
1186 {.base = output, .len = output_size},
1187 };
1188
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001189 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001190
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001191 size_t in_len = IOVEC_LEN(in_vec);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001192 if (salt == NULL) {
1193 in_len--;
1194 }
Summer Qin4b1d03b2019-07-02 14:56:08 +08001195 status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len,
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08001196 out_vec, IOVEC_LEN(out_vec));
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001197
1198 *output_length = out_vec[0].len;
1199
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001200 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001201
1202 return status;
1203}
1204
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001205psa_status_t psa_key_derivation_get_capacity(
1206 const psa_key_derivation_operation_t *operation,
1207 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001208{
1209 psa_status_t status;
1210 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001211 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
1212 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001213 };
1214
1215 psa_invec in_vec[] = {
1216 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1217 };
1218
1219 psa_outvec out_vec[] = {
1220 {.base = capacity, .len = sizeof(size_t)},
1221 };
1222
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001223 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001224
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001225 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1226 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Kevin Peng9449a362019-07-29 16:05:42 +08001227
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001228 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001229
1230 return status;
1231}
1232
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001233psa_status_t psa_key_derivation_output_bytes(
1234 psa_key_derivation_operation_t *operation,
1235 uint8_t *output,
1236 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001237{
1238 psa_status_t status;
1239 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001240 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
1241 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001242 };
1243
1244 psa_invec in_vec[] = {
1245 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1246 };
1247
1248 psa_outvec out_vec[] = {
1249 {.base = output, .len = output_length},
1250 };
1251
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001252 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001253
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001254 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1255 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Kevin Peng9449a362019-07-29 16:05:42 +08001256
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001257 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001258
1259 return status;
1260}
1261
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001262psa_status_t psa_key_derivation_input_key(
1263 psa_key_derivation_operation_t *operation,
1264 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001265 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001266{
1267 psa_status_t status;
1268 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001269 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001270 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001271 .step = step,
1272 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001273 };
1274
1275 psa_invec in_vec[] = {
1276 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001277 };
1278
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001279 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001280
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001281 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1282 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Kevin Peng9449a362019-07-29 16:05:42 +08001283
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001284 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001285
1286 return status;
1287}
1288
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001289psa_status_t psa_key_derivation_abort(
1290 psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001291{
1292 psa_status_t status;
1293 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001294 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
1295 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001296 };
1297
1298 psa_invec in_vec[] = {
1299 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1300 };
1301
1302 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001303 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001304 };
1305
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001306 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001307
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001308 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1309 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Kevin Peng9449a362019-07-29 16:05:42 +08001310
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001311 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001312
1313 return status;
1314}
1315
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001316psa_status_t psa_key_derivation_key_agreement(
1317 psa_key_derivation_operation_t *operation,
1318 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001319 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001320 const uint8_t *peer_key,
1321 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001322{
1323 psa_status_t status;
1324 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001325 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001326 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001327 .step = step,
1328 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001329 };
1330
1331 psa_invec in_vec[] = {
1332 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1333 {.base = peer_key, .len = peer_key_length},
1334 };
1335
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001336 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001337
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001338 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1339 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001340
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001341 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001342
1343 return status;
1344}
1345
1346psa_status_t psa_generate_random(uint8_t *output,
1347 size_t output_size)
1348{
1349 psa_status_t status;
1350 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001351 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001352 };
1353
1354 psa_invec in_vec[] = {
1355 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1356 };
1357
1358 psa_outvec out_vec[] = {
1359 {.base = output, .len = output_size},
1360 };
1361
1362 if (output_size == 0) {
1363 return PSA_SUCCESS;
1364 }
1365
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001366 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001367
1368 status = API_DISPATCH(tfm_crypto_generate_random,
1369 TFM_CRYPTO_GENERATE_RANDOM);
1370
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001371 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001372
1373 return status;
1374}
1375
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001376psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001377 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001378{
1379 psa_status_t status;
1380 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001381 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001382 };
1383
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001384 psa_invec in_vec[] = {
1385 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001386 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1387 };
1388
1389 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001390 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001391 };
1392
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001393 PSA_CONNECT(TFM_CRYPTO);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001394
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001395 status = API_DISPATCH(tfm_crypto_generate_key,
1396 TFM_CRYPTO_GENERATE_KEY);
1397 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001398
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001399 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001400}
1401
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001402psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1403 const uint8_t *input,
1404 size_t input_length)
1405{
1406 psa_status_t status;
1407
1408 status = PSA_ERROR_NOT_SUPPORTED;
1409
1410 return status;
1411}
1412
1413psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1414 uint8_t *ciphertext,
1415 size_t ciphertext_size,
1416 size_t *ciphertext_length,
1417 uint8_t *tag,
1418 size_t tag_size,
1419 size_t *tag_length)
1420{
1421 psa_status_t status;
1422
1423 status = PSA_ERROR_NOT_SUPPORTED;
1424
1425 return status;
1426}
1427
1428psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1429 uint8_t *plaintext,
1430 size_t plaintext_size,
1431 size_t *plaintext_length,
1432 const uint8_t *tag,
1433 size_t tag_length)
1434{
1435 psa_status_t status;
1436
1437 status = PSA_ERROR_NOT_SUPPORTED;
1438
1439 return status;
1440}
1441
1442psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1443{
1444 psa_status_t status;
1445
1446 status = PSA_ERROR_NOT_SUPPORTED;
1447
1448 return status;
1449}
1450
Maulik Patel28659c42021-01-06 14:09:22 +00001451psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001452 psa_algorithm_t alg,
1453 const uint8_t *input,
1454 size_t input_length,
1455 uint8_t *mac,
1456 size_t mac_size,
1457 size_t *mac_length)
1458{
1459 psa_status_t status;
1460
1461 status = PSA_ERROR_NOT_SUPPORTED;
1462
1463 return status;
1464}
1465
Maulik Patel28659c42021-01-06 14:09:22 +00001466psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001467 psa_algorithm_t alg,
1468 const uint8_t *input,
1469 size_t input_length,
1470 const uint8_t *mac,
1471 const size_t mac_length)
1472{
1473 psa_status_t status;
1474
1475 status = PSA_ERROR_NOT_SUPPORTED;
1476
1477 return status;
1478}
1479
Maulik Patel28659c42021-01-06 14:09:22 +00001480psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001481 psa_algorithm_t alg,
1482 const uint8_t *input,
1483 size_t input_length,
1484 uint8_t *output,
1485 size_t output_size,
1486 size_t *output_length)
1487{
1488 psa_status_t status;
1489
1490 status = PSA_ERROR_NOT_SUPPORTED;
1491
1492 return status;
1493}
1494
Maulik Patel28659c42021-01-06 14:09:22 +00001495psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001496 psa_algorithm_t alg,
1497 const uint8_t *input,
1498 size_t input_length,
1499 uint8_t *output,
1500 size_t output_size,
1501 size_t *output_length)
1502{
1503 psa_status_t status;
1504
1505 status = PSA_ERROR_NOT_SUPPORTED;
1506
1507 return status;
1508}
1509
1510psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001511 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001512 const uint8_t *peer_key,
1513 size_t peer_key_length,
1514 uint8_t *output,
1515 size_t output_size,
1516 size_t *output_length)
1517{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001518 psa_status_t status;
1519 struct tfm_crypto_pack_iovec iov = {
1520 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1521 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001522 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001523 };
1524
1525 psa_invec in_vec[] = {
1526 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1527 {.base = peer_key, .len = peer_key_length},
1528 };
1529
1530 psa_outvec out_vec[] = {
1531 {.base = output, .len = output_size},
1532 };
1533
1534 PSA_CONNECT(TFM_CRYPTO);
1535
1536 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1537 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1538
1539 *output_length = out_vec[0].len;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001540
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001541 PSA_CLOSE();
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001542
1543 return status;
1544}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001545
1546psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1547 psa_algorithm_t alg)
1548{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001549 psa_status_t status;
1550 struct tfm_crypto_pack_iovec iov = {
1551 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1552 .alg = alg,
1553 .op_handle = operation->handle,
1554 };
1555
1556 psa_invec in_vec[] = {
1557 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1558 };
1559 psa_outvec out_vec[] = {
1560 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1561 };
1562
1563 PSA_CONNECT(TFM_CRYPTO);
1564
1565 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1566 TFM_CRYPTO_KEY_DERIVATION_SETUP);
1567 PSA_CLOSE();
1568
1569 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001570}
1571
1572psa_status_t psa_key_derivation_set_capacity(
1573 psa_key_derivation_operation_t *operation,
1574 size_t capacity)
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_SET_CAPACITY_SID,
1579 .capacity = capacity,
1580 .op_handle = operation->handle,
1581 };
1582
1583 psa_invec in_vec[] = {
1584 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1585 };
1586
1587 PSA_CONNECT(TFM_CRYPTO);
1588
1589 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1590 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
1591 PSA_CLOSE();
1592
1593 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001594}
1595
1596psa_status_t psa_key_derivation_input_bytes(
1597 psa_key_derivation_operation_t *operation,
1598 psa_key_derivation_step_t step,
1599 const uint8_t *data,
1600 size_t data_length)
1601{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001602 psa_status_t status;
1603 struct tfm_crypto_pack_iovec iov = {
1604 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1605 .step = step,
1606 .op_handle = operation->handle,
1607 };
1608
1609 psa_invec in_vec[] = {
1610 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1611 {.base = data, .len = data_length},
1612 };
1613
1614 PSA_CONNECT(TFM_CRYPTO);
1615
1616 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1617 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
1618 PSA_CLOSE();
1619
1620 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001621}
1622
1623psa_status_t psa_key_derivation_output_key(
1624 const psa_key_attributes_t *attributes,
1625 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001626 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001627{
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001628 psa_status_t status;
1629 struct tfm_crypto_pack_iovec iov = {
1630 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1631 .op_handle = operation->handle,
1632 };
1633
1634 psa_invec in_vec[] = {
1635 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1636 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1637 };
1638
1639 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001640 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001641 };
1642
1643 PSA_CONNECT(TFM_CRYPTO);
1644
1645 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1646 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
1647 PSA_CLOSE();
1648
1649 return status;
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001650}
1651
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001652psa_status_t psa_aead_encrypt_setup(psa_aead_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 psa_algorithm_t alg)
1655{
1656 psa_status_t status;
1657
1658 status = PSA_ERROR_NOT_SUPPORTED;
1659
1660 return status;
1661}
1662
1663psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001664 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001665 psa_algorithm_t alg)
1666{
1667 psa_status_t status;
1668
1669 status = PSA_ERROR_NOT_SUPPORTED;
1670
1671 return status;
1672}
1673
1674psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
1675 uint8_t *nonce,
1676 size_t nonce_size,
1677 size_t *nonce_length)
1678{
1679 psa_status_t status;
1680
1681 status = PSA_ERROR_NOT_SUPPORTED;
1682
1683 return status;
1684}
1685
1686psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
1687 const uint8_t *nonce,
1688 size_t nonce_length)
1689{
1690 psa_status_t status;
1691
1692 status = PSA_ERROR_NOT_SUPPORTED;
1693
1694 return status;
1695}
1696
1697psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
1698 size_t ad_length,
1699 size_t plaintext_length)
1700{
1701 psa_status_t status;
1702
1703 status = PSA_ERROR_NOT_SUPPORTED;
1704
1705 return status;
1706}
1707
1708psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1709 const uint8_t *input,
1710 size_t input_length,
1711 uint8_t *output,
1712 size_t output_size,
1713 size_t *output_length)
1714{
1715 psa_status_t status;
1716
1717 status = PSA_ERROR_NOT_SUPPORTED;
1718
1719 return status;
1720}