blob: dd6a90a9ff2bdf6fc08299cd8d668166f0e706ec [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_veneers.h"
9#include "tfm_crypto_defs.h"
Jamie Foxcc31d402019-01-28 17:13:52 +000010#include "psa/crypto.h"
Antonio de Angelis05b24192019-07-04 15:28:46 +010011#include "tfm_ns_interface.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000012
Antonio de Angelis4743e672019-04-11 11:38:48 +010013#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000014
Antonio de Angelis05b24192019-07-04 15:28:46 +010015#define API_DISPATCH(sfn_name, sfn_id) \
16 tfm_ns_interface_dispatch((veneer_fn)tfm_##sfn_name##_veneer,\
17 (uint32_t)in_vec, ARRAY_SIZE(in_vec), \
Antonio de Angelis4743e672019-04-11 11:38:48 +010018 (uint32_t)out_vec, ARRAY_SIZE(out_vec))
19
Antonio de Angelis05b24192019-07-04 15:28:46 +010020#define API_DISPATCH_NO_OUTVEC(sfn_name, sfn_id) \
21 tfm_ns_interface_dispatch((veneer_fn)tfm_##sfn_name##_veneer,\
22 (uint32_t)in_vec, ARRAY_SIZE(in_vec), \
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000023 (uint32_t)NULL, 0)
Antonio de Angelis8908f472018-08-31 15:44:25 +010024
25psa_status_t psa_crypto_init(void)
26{
27 /* Service init is performed during TFM boot up,
28 * so application level initialisation is empty
29 */
30 return PSA_SUCCESS;
31}
32
Antonio de Angelis04debbd2019-10-14 12:12:52 +010033psa_status_t psa_open_key(psa_key_id_t id,
Maulik Patel28659c42021-01-06 14:09:22 +000034 psa_key_id_t *key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010035{
Jamie Foxdadb4e82019-09-03 17:59:41 +010036 const struct tfm_crypto_pack_iovec iov = {
37 .sfn_id = TFM_CRYPTO_OPEN_KEY_SID,
Jamie Foxdadb4e82019-09-03 17:59:41 +010038 };
39 psa_invec in_vec[] = {
40 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
41 {.base = &id, .len = sizeof(psa_key_id_t)},
42 };
43 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000044 {.base = key, .len = sizeof(psa_key_id_t)},
Jamie Foxdadb4e82019-09-03 17:59:41 +010045 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010046
Jamie Foxdadb4e82019-09-03 17:59:41 +010047 return API_DISPATCH(tfm_crypto_open_key,
48 TFM_CRYPTO_OPEN_KEY);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010049}
50
Maulik Patel28659c42021-01-06 14:09:22 +000051psa_status_t psa_close_key(psa_key_id_t key)
Jamie Fox0e54ebc2019-04-09 14:21:04 +010052{
Jamie Foxdadb4e82019-09-03 17:59:41 +010053 const struct tfm_crypto_pack_iovec iov = {
54 .sfn_id = TFM_CRYPTO_CLOSE_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000055 .key_id = key,
Jamie Foxdadb4e82019-09-03 17:59:41 +010056 };
57 psa_invec in_vec[] = {
58 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
59 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +010060
Jamie Foxdadb4e82019-09-03 17:59:41 +010061 return API_DISPATCH_NO_OUTVEC(tfm_crypto_close_key,
62 TFM_CRYPTO_CLOSE_KEY);
Jamie Fox0e54ebc2019-04-09 14:21:04 +010063}
64
Antonio de Angelis04debbd2019-10-14 12:12:52 +010065psa_status_t psa_import_key(const psa_key_attributes_t *attributes,
Antonio de Angelis8908f472018-08-31 15:44:25 +010066 const uint8_t *data,
Antonio de Angelis04debbd2019-10-14 12:12:52 +010067 size_t data_length,
Maulik Patel28659c42021-01-06 14:09:22 +000068 psa_key_id_t *key)
Antonio de Angelis8908f472018-08-31 15:44:25 +010069{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000070 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +010071 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +080072 .sfn_id = TFM_CRYPTO_IMPORT_KEY_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +010073 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000074 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +010075 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +010076 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000077 {.base = data, .len = data_length}
78 };
Antonio de Angelis04debbd2019-10-14 12:12:52 +010079 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +000080 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +010081 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010082
Antonio de Angelis04debbd2019-10-14 12:12:52 +010083 status = API_DISPATCH(tfm_crypto_import_key,
84 TFM_CRYPTO_IMPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +010085
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000086 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +010087}
88
Maulik Patel28659c42021-01-06 14:09:22 +000089psa_status_t psa_destroy_key(psa_key_id_t key)
Antonio de Angelis8908f472018-08-31 15:44:25 +010090{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000091 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +010092 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +080093 .sfn_id = TFM_CRYPTO_DESTROY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +000094 .key_id = key,
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 Angelisab85ccd2019-03-25 15:14:29 +000098 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010099
Antonio de Angelis4743e672019-04-11 11:38:48 +0100100 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_destroy_key,
101 TFM_CRYPTO_DESTROY_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100102
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000103 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100104}
105
Maulik Patel28659c42021-01-06 14:09:22 +0000106psa_status_t psa_get_key_attributes(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100107 psa_key_attributes_t *attributes)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100108{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000109 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100110 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100111 .sfn_id = TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000112 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100113 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000114 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100115 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000116 };
117 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100118 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000119 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100120
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100121 status = API_DISPATCH(tfm_crypto_get_key_attributes,
122 TFM_CRYPTO_GET_KEY_ATTRIBUTES);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000123 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100124}
125
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100126void psa_reset_key_attributes(psa_key_attributes_t *attributes)
127{
128 struct tfm_crypto_pack_iovec iov = {
129 .sfn_id = TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID,
130 };
131 psa_invec in_vec[] = {
132 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
133 };
134 psa_outvec out_vec[] = {
135 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
136 };
137
138 (void)API_DISPATCH(tfm_crypto_reset_key_attributes,
139 TFM_CRYPTO_RESET_KEY_ATTRIBUTES);
140 return;
141}
142
Maulik Patel28659c42021-01-06 14:09:22 +0000143psa_status_t psa_export_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100144 uint8_t *data,
145 size_t data_size,
146 size_t *data_length)
147{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000148 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100149 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800150 .sfn_id = TFM_CRYPTO_EXPORT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000151 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100152 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000153 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100154 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000155 };
156 psa_outvec out_vec[] = {
157 {.base = data, .len = data_size}
158 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100159
Antonio de Angelis4743e672019-04-11 11:38:48 +0100160 status = API_DISPATCH(tfm_crypto_export_key,
161 TFM_CRYPTO_EXPORT_KEY);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100162
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000163 *data_length = out_vec[0].len;
164
165 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100166}
167
Maulik Patel28659c42021-01-06 14:09:22 +0000168psa_status_t psa_export_public_key(psa_key_id_t key,
Antonio de Angelis8908f472018-08-31 15:44:25 +0100169 uint8_t *data,
170 size_t data_size,
171 size_t *data_length)
172{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100173 psa_status_t status;
174 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800175 .sfn_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000176 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100177 };
Hugues de Valon8b442442019-02-19 14:30:52 +0000178
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100179 psa_invec in_vec[] = {
180 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
181 };
182 psa_outvec out_vec[] = {
183 {.base = data, .len = data_size}
184 };
185
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100186 status = API_DISPATCH(tfm_crypto_export_public_key,
187 TFM_CRYPTO_EXPORT_PUBLIC_KEY);
188
189 *data_length = out_vec[0].len;
190
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100191 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100192}
193
Maulik Patel28659c42021-01-06 14:09:22 +0000194psa_status_t psa_purge_key(psa_key_id_t key)
195{
196 psa_status_t status;
197 struct tfm_crypto_pack_iovec iov = {
198 .sfn_id = TFM_CRYPTO_PURGE_KEY_SID,
199 .key_id = key,
200 };
201 psa_invec in_vec[] = {
202 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
203 };
204
205 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_purge_key,
206 TFM_CRYPTO_PURGE_KEY);
207 return status;
208}
209
210psa_status_t psa_copy_key(psa_key_id_t source_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100211 const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +0000212 psa_key_id_t *target_key)
Jamie Foxefd82732018-11-26 10:34:32 +0000213{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100214 psa_status_t status;
215 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800216 .sfn_id = TFM_CRYPTO_COPY_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000217 .key_id = source_key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100218 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000219
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100220 psa_invec in_vec[] = {
221 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100222 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100223 };
224
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000225 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +0000226 {.base = target_key, .len = sizeof(psa_key_id_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000227 };
Jamie Foxefd82732018-11-26 10:34:32 +0000228
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100229 status = API_DISPATCH(tfm_crypto_copy_key,
230 TFM_CRYPTO_COPY_KEY);
Jamie Foxefd82732018-11-26 10:34:32 +0000231
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000232 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000233}
234
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100235psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation,
236 unsigned char *iv,
237 size_t iv_size,
238 size_t *iv_length)
239{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100240 psa_status_t status;
241 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800242 .sfn_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100243 .op_handle = operation->handle,
244 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100245
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100246 psa_invec in_vec[] = {
247 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
248 };
249 psa_outvec out_vec[] = {
250 {.base = &(operation->handle), .len = sizeof(uint32_t)},
251 {.base = iv, .len = iv_size},
252 };
253
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100254 status = API_DISPATCH(tfm_crypto_cipher_generate_iv,
255 TFM_CRYPTO_CIPHER_GENERATE_IV);
256
257 *iv_length = out_vec[1].len;
258
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100259 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100260}
261
Antonio de Angelis377a1552018-11-22 17:02:40 +0000262psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
263 const unsigned char *iv,
264 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100265{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000266 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100267 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800268 .sfn_id = TFM_CRYPTO_CIPHER_SET_IV_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100269 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100270 };
271
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000272 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100273 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000274 {.base = iv, .len = iv_length},
275 };
276 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100277 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000278 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100279
Antonio de Angelis4743e672019-04-11 11:38:48 +0100280 status = API_DISPATCH(tfm_crypto_cipher_set_iv,
281 TFM_CRYPTO_CIPHER_SET_IV);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100282
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000283 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100284}
285
Antonio de Angelis377a1552018-11-22 17:02:40 +0000286psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000287 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000288 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100289{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000290 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100291 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800292 .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000293 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100294 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100295 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000296 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100297
Antonio de Angelis4743e672019-04-11 11:38:48 +0100298 psa_invec in_vec[] = {
299 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
300 };
301 psa_outvec out_vec[] = {
302 {.base = &(operation->handle), .len = sizeof(uint32_t)},
303 };
304
Antonio de Angelis4743e672019-04-11 11:38:48 +0100305 status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup,
306 TFM_CRYPTO_CIPHER_ENCRYPT_SETUP);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100307
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000308 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100309}
310
Antonio de Angelis377a1552018-11-22 17:02:40 +0000311psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000312 psa_key_id_t key,
Antonio de Angelis377a1552018-11-22 17:02:40 +0000313 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100314{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000315 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100316 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800317 .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000318 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100319 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100320 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000321 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100322
Antonio de Angelis4743e672019-04-11 11:38:48 +0100323 psa_invec in_vec[] = {
324 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
325 };
326 psa_outvec out_vec[] = {
327 {.base = &(operation->handle), .len = sizeof(uint32_t)},
328 };
329
Antonio de Angelis4743e672019-04-11 11:38:48 +0100330 status = API_DISPATCH(tfm_crypto_cipher_decrypt_setup,
331 TFM_CRYPTO_CIPHER_DECRYPT_SETUP);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100332
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000333 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100334}
335
336psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
337 const uint8_t *input,
338 size_t input_length,
339 unsigned char *output,
340 size_t output_size,
341 size_t *output_length)
342{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000343 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100344 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800345 .sfn_id = TFM_CRYPTO_CIPHER_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100346 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100347 };
348
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000349 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100350 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000351 {.base = input, .len = input_length},
352 };
353 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100354 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000355 {.base = output, .len = output_size}
356 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100357
Antonio de Angelis4743e672019-04-11 11:38:48 +0100358 status = API_DISPATCH(tfm_crypto_cipher_update,
359 TFM_CRYPTO_CIPHER_UPDATE);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100360
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000361 *output_length = out_vec[1].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100362
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000363 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100364}
365
366psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
367{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000368 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100369 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800370 .sfn_id = TFM_CRYPTO_CIPHER_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100371 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000372 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100373
Antonio de Angelis4743e672019-04-11 11:38:48 +0100374 psa_invec in_vec[] = {
375 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
376 };
377 psa_outvec out_vec[] = {
378 {.base = &(operation->handle), .len = sizeof(uint32_t)},
379 };
380
Antonio de Angelis4743e672019-04-11 11:38:48 +0100381 status = API_DISPATCH(tfm_crypto_cipher_abort,
382 TFM_CRYPTO_CIPHER_ABORT);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100383
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000384 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100385}
386
387psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
388 uint8_t *output,
389 size_t output_size,
390 size_t *output_length)
391{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000392 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100393 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800394 .sfn_id = TFM_CRYPTO_CIPHER_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100395 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100396 };
397
398 psa_invec in_vec[] = {
399 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
400 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000401 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100402 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000403 {.base = output, .len = output_size},
404 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100405
Antonio de Angelis4743e672019-04-11 11:38:48 +0100406 status = API_DISPATCH(tfm_crypto_cipher_finish,
407 TFM_CRYPTO_CIPHER_FINISH);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100408
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000409 *output_length = out_vec[1].len;
410
411 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100412}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100413
Antonio de Angelis377a1552018-11-22 17:02:40 +0000414psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100415 psa_algorithm_t alg)
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_HASH_SETUP_SID,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100420 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100421 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000422 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100423
Antonio de Angelis4743e672019-04-11 11:38:48 +0100424 psa_invec in_vec[] = {
425 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
426 };
427 psa_outvec out_vec[] = {
428 {.base = &(operation->handle), .len = sizeof(uint32_t)},
429 };
430
Antonio de Angelis4743e672019-04-11 11:38:48 +0100431 status = API_DISPATCH(tfm_crypto_hash_setup,
432 TFM_CRYPTO_HASH_SETUP);
433
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000434 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100435}
436
437psa_status_t psa_hash_update(psa_hash_operation_t *operation,
438 const uint8_t *input,
439 size_t input_length)
440{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000441 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100442 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800443 .sfn_id = TFM_CRYPTO_HASH_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100444 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100445 };
446
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000447 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100448 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000449 {.base = input, .len = input_length},
450 };
451 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100452 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000453 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100454
Antonio de Angelis4743e672019-04-11 11:38:48 +0100455 status = API_DISPATCH(tfm_crypto_hash_update,
456 TFM_CRYPTO_HASH_UPDATE);
457
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000458 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100459}
460
461psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
462 uint8_t *hash,
463 size_t hash_size,
464 size_t *hash_length)
465{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000466 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100467 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800468 .sfn_id = TFM_CRYPTO_HASH_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100469 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100470 };
471
472 psa_invec in_vec[] = {
473 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
474 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000475 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100476 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000477 {.base = hash, .len = hash_size},
478 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100479
Antonio de Angelis4743e672019-04-11 11:38:48 +0100480 status = API_DISPATCH(tfm_crypto_hash_finish,
481 TFM_CRYPTO_HASH_FINISH);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100482
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000483 *hash_length = out_vec[1].len;
484
485 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100486}
487
488psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
489 const uint8_t *hash,
490 size_t hash_length)
491{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000492 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100493 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800494 .sfn_id = TFM_CRYPTO_HASH_VERIFY_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100495 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100496 };
497
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000498 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100499 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000500 {.base = hash, .len = hash_length},
501 };
502 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100503 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000504 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100505
Antonio de Angelis4743e672019-04-11 11:38:48 +0100506 status = API_DISPATCH(tfm_crypto_hash_verify,
507 TFM_CRYPTO_HASH_VERIFY);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100508
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000509 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100510}
511
512psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
513{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000514 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100515 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800516 .sfn_id = TFM_CRYPTO_HASH_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100517 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000518 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100519
Antonio de Angelis4743e672019-04-11 11:38:48 +0100520 psa_invec in_vec[] = {
521 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
522 };
523 psa_outvec out_vec[] = {
524 {.base = &(operation->handle), .len = sizeof(uint32_t)},
525 };
526
Antonio de Angelis4743e672019-04-11 11:38:48 +0100527 status = API_DISPATCH(tfm_crypto_hash_abort,
528 TFM_CRYPTO_HASH_ABORT);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100529
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000530 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100531}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100532
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100533psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
534 psa_hash_operation_t *target_operation)
535{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100536 psa_status_t status;
537 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800538 .sfn_id = TFM_CRYPTO_HASH_CLONE_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100539 .op_handle = source_operation->handle,
540 };
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100541
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100542 psa_invec in_vec[] = {
543 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
544 };
545 psa_outvec out_vec[] = {
546 {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
547 };
548
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100549 if (target_operation && (target_operation->handle != 0)) {
550 return PSA_ERROR_BAD_STATE;
551 }
552
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100553 status = API_DISPATCH(tfm_crypto_hash_clone,
554 TFM_CRYPTO_HASH_CLONE);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100555
556 return status;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100557}
558
Soby Mathew07ef6e42020-07-20 21:09:23 +0100559psa_status_t psa_hash_compute(psa_algorithm_t alg,
560 const uint8_t *input,
561 size_t input_length,
562 uint8_t *hash,
563 size_t hash_size,
564 size_t *hash_length)
565{
566 psa_status_t status;
567 struct tfm_crypto_pack_iovec iov = {
568 .sfn_id = TFM_CRYPTO_HASH_COMPUTE_SID,
569 .alg = alg,
570 };
571
572 psa_invec in_vec[] = {
573 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
574 {.base = input, .len = input_length},
575 };
576
577 psa_outvec out_vec[] = {
578 {.base = hash, .len = hash_size}
579 };
580
581 status = API_DISPATCH(tfm_crypto_hash_compute,
582 TFM_CRYPTO_HASH_COMPUTE);
583
584 *hash_length = out_vec[0].len;
585
586 return status;
587}
588
589psa_status_t psa_hash_compare(psa_algorithm_t alg,
590 const uint8_t *input,
591 size_t input_length,
592 const uint8_t *hash,
593 size_t hash_length)
594{
595 psa_status_t status;
596 struct tfm_crypto_pack_iovec iov = {
597 .sfn_id = TFM_CRYPTO_HASH_COMPARE_SID,
598 .alg = alg,
599 };
600
601 psa_invec in_vec[] = {
602 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
603 {.base = input, .len = input_length},
604 {.base = hash, .len = hash_length},
605 };
606
607 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_hash_compare,
608 TFM_CRYPTO_HASH_COMPARE);
609
610 return status;
611}
612
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100613psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000614 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100615 psa_algorithm_t alg)
616{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000617 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100618 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800619 .sfn_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000620 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100621 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100622 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000623 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100624
Antonio de Angelis4743e672019-04-11 11:38:48 +0100625 psa_invec in_vec[] = {
626 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
627 };
628 psa_outvec out_vec[] = {
629 {.base = &(operation->handle), .len = sizeof(uint32_t)},
630 };
631
Antonio de Angelis4743e672019-04-11 11:38:48 +0100632 status = API_DISPATCH(tfm_crypto_mac_sign_setup,
633 TFM_CRYPTO_MAC_SIGN_SETUP);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100634
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000635 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100636}
637
638psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +0000639 psa_key_id_t key,
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100640 psa_algorithm_t alg)
641{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000642 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100643 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800644 .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000645 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100646 .alg = alg,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100647 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000648 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100649
Antonio de Angelis4743e672019-04-11 11:38:48 +0100650 psa_invec in_vec[] = {
651 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
652 };
653 psa_outvec out_vec[] = {
654 {.base = &(operation->handle), .len = sizeof(uint32_t)},
655 };
656
Antonio de Angelis4743e672019-04-11 11:38:48 +0100657 status = API_DISPATCH(tfm_crypto_mac_verify_setup,
658 TFM_CRYPTO_MAC_VERIFY_SETUP);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100659
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000660 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100661}
662
663psa_status_t psa_mac_update(psa_mac_operation_t *operation,
664 const uint8_t *input,
665 size_t input_length)
666{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000667 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100668 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800669 .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100670 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100671 };
672
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000673 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100674 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000675 {.base = input, .len = input_length},
676 };
677 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100678 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000679 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100680
Antonio de Angelis4743e672019-04-11 11:38:48 +0100681 status = API_DISPATCH(tfm_crypto_mac_update,
682 TFM_CRYPTO_MAC_UPDATE);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100683
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000684 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100685}
686
687psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
688 uint8_t *mac,
689 size_t mac_size,
690 size_t *mac_length)
691{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000692 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100693 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800694 .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100695 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100696 };
697
698 psa_invec in_vec[] = {
699 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
700 };
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000701 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100702 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000703 {.base = mac, .len = mac_size},
704 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100705
Antonio de Angelis4743e672019-04-11 11:38:48 +0100706 status = API_DISPATCH(tfm_crypto_mac_sign_finish,
707 TFM_CRYPTO_MAC_SIGN_FINISH);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100708
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000709 *mac_length = out_vec[1].len;
710
711 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100712}
713
714psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
715 const uint8_t *mac,
716 size_t mac_length)
717{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000718 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100719 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800720 .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100721 .op_handle = operation->handle,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100722 };
723
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000724 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100725 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000726 {.base = mac, .len = mac_length},
727 };
728 psa_outvec out_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100729 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000730 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100731
Antonio de Angelis4743e672019-04-11 11:38:48 +0100732 status = API_DISPATCH(tfm_crypto_mac_verify_finish,
733 TFM_CRYPTO_MAC_VERIFY_FINISH);
734
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000735 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100736}
737
738psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
739{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000740 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100741 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800742 .sfn_id = TFM_CRYPTO_MAC_ABORT_SID,
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100743 .op_handle = operation->handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000744 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100745
Antonio de Angelis4743e672019-04-11 11:38:48 +0100746 psa_invec in_vec[] = {
747 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
748 };
749 psa_outvec out_vec[] = {
750 {.base = &(operation->handle), .len = sizeof(uint32_t)},
751 };
752
Antonio de Angelis4743e672019-04-11 11:38:48 +0100753 status = API_DISPATCH(tfm_crypto_mac_abort,
754 TFM_CRYPTO_MAC_ABORT);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100755
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000756 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100757}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000758
Maulik Patel28659c42021-01-06 14:09:22 +0000759psa_status_t psa_aead_encrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000760 psa_algorithm_t alg,
761 const uint8_t *nonce,
762 size_t nonce_length,
763 const uint8_t *additional_data,
764 size_t additional_data_length,
765 const uint8_t *plaintext,
766 size_t plaintext_length,
767 uint8_t *ciphertext,
768 size_t ciphertext_size,
769 size_t *ciphertext_length)
770{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000771 psa_status_t status;
Antonio de Angelis4743e672019-04-11 11:38:48 +0100772 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800773 .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000774 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100775 .alg = alg,
776 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000777 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100778
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100779 /* Sanitize the optional input */
780 if ((additional_data == NULL) && (additional_data_length != 0)) {
781 return PSA_ERROR_INVALID_ARGUMENT;
782 }
783
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000784 size_t idx = 0;
785 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100786 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000787 {.base = plaintext, .len = plaintext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100788 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000789 };
790 psa_outvec out_vec[] = {
791 {.base = ciphertext, .len = ciphertext_size},
792 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000793
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000794 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
795 return PSA_ERROR_INVALID_ARGUMENT;
796 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000797
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000798 if (nonce != NULL) {
799 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100800 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000801 }
802 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000803
Antonio de Angelis4743e672019-04-11 11:38:48 +0100804 status = API_DISPATCH(tfm_crypto_aead_encrypt,
805 TFM_CRYPTO_AEAD_ENCRYPT);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000806
807 *ciphertext_length = out_vec[0].len;
808
809 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000810}
811
Maulik Patel28659c42021-01-06 14:09:22 +0000812psa_status_t psa_aead_decrypt(psa_key_id_t key,
Antonio de Angelis3a480992018-11-07 11:53:28 +0000813 psa_algorithm_t alg,
814 const uint8_t *nonce,
815 size_t nonce_length,
816 const uint8_t *additional_data,
817 size_t additional_data_length,
818 const uint8_t *ciphertext,
819 size_t ciphertext_length,
820 uint8_t *plaintext,
821 size_t plaintext_size,
822 size_t *plaintext_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_AEAD_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000827 .key_id = key,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100828 .alg = alg,
829 .aead_in = {.nonce = {0}, .nonce_length = nonce_length}
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000830 };
Antonio de Angelis4743e672019-04-11 11:38:48 +0100831
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100832 /* Sanitize the optional input */
833 if ((additional_data == NULL) && (additional_data_length != 0)) {
834 return PSA_ERROR_INVALID_ARGUMENT;
835 }
836
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000837 size_t idx = 0;
838 psa_invec in_vec[] = {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100839 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000840 {.base = ciphertext, .len = ciphertext_length},
Antonio de Angelis4743e672019-04-11 11:38:48 +0100841 {.base = additional_data, .len = additional_data_length},
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000842 };
843 psa_outvec out_vec[] = {
844 {.base = plaintext, .len = plaintext_size},
845 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000846
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000847 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
848 return PSA_ERROR_INVALID_ARGUMENT;
849 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000850
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000851 if (nonce != NULL) {
852 for (idx = 0; idx < nonce_length; idx++) {
Antonio de Angelis4743e672019-04-11 11:38:48 +0100853 iov.aead_in.nonce[idx] = nonce[idx];
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000854 }
855 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000856
Antonio de Angelis4743e672019-04-11 11:38:48 +0100857 status = API_DISPATCH(tfm_crypto_aead_decrypt,
858 TFM_CRYPTO_AEAD_DECRYPT);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000859
860 *plaintext_length = out_vec[0].len;
861
862 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000863}
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100864
Maulik Patel28659c42021-01-06 14:09:22 +0000865psa_status_t psa_asymmetric_sign(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100866 psa_algorithm_t alg,
867 const uint8_t *hash,
868 size_t hash_length,
869 uint8_t *signature,
870 size_t signature_size,
871 size_t *signature_length)
872{
Maulik Patel28659c42021-01-06 14:09:22 +0000873 return psa_sign_hash(key, alg, hash, hash_length, signature,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100874 signature_size, signature_length);
875}
876
Maulik Patel28659c42021-01-06 14:09:22 +0000877psa_status_t psa_sign_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100878 psa_algorithm_t alg,
879 const uint8_t *hash,
880 size_t hash_length,
881 uint8_t *signature,
882 size_t signature_size,
883 size_t *signature_length)
884{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100885 psa_status_t status;
886 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100887 .sfn_id = TFM_CRYPTO_SIGN_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000888 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100889 .alg = alg,
890 };
891
892 psa_invec in_vec[] = {
893 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
894 {.base = hash, .len = hash_length},
895 };
896 psa_outvec out_vec[] = {
897 {.base = signature, .len = signature_size},
898 };
899
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100900 status = API_DISPATCH(tfm_crypto_sign_hash,
901 TFM_CRYPTO_SIGN_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100902
903 *signature_length = out_vec[0].len;
904
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100905 return status;
906}
907
Maulik Patel28659c42021-01-06 14:09:22 +0000908psa_status_t psa_asymmetric_verify(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100909 psa_algorithm_t alg,
910 const uint8_t *hash,
911 size_t hash_length,
912 const uint8_t *signature,
913 size_t signature_length)
914{
Maulik Patel28659c42021-01-06 14:09:22 +0000915 return psa_verify_hash(key, alg, hash, hash_length,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100916 signature, signature_length);
917}
918
Maulik Patel28659c42021-01-06 14:09:22 +0000919psa_status_t psa_verify_hash(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100920 psa_algorithm_t alg,
921 const uint8_t *hash,
922 size_t hash_length,
923 const uint8_t *signature,
924 size_t signature_length)
925{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100926 psa_status_t status;
927 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100928 .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000929 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100930 .alg = alg
931 };
932
933 psa_invec in_vec[] = {
934 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
935 {.base = hash, .len = hash_length},
936 {.base = signature, .len = signature_length}
937 };
938
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100939 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash,
940 TFM_CRYPTO_VERIFY_HASH);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100941
942 return status;
943}
944
Maulik Patel28659c42021-01-06 14:09:22 +0000945psa_status_t psa_asymmetric_encrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100946 psa_algorithm_t alg,
947 const uint8_t *input,
948 size_t input_length,
949 const uint8_t *salt,
950 size_t salt_length,
951 uint8_t *output,
952 size_t output_size,
953 size_t *output_length)
954{
955 psa_status_t status;
956 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800957 .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000958 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100959 .alg = alg
960 };
961
962 /* Sanitize the optional input */
963 if ((salt == NULL) && (salt_length != 0)) {
964 return PSA_ERROR_INVALID_ARGUMENT;
965 }
966
967 psa_invec in_vec[] = {
968 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
969 {.base = input, .len = input_length},
970 {.base = salt, .len = salt_length}
971 };
972
973 psa_outvec out_vec[] = {
974 {.base = output, .len = output_size},
975 };
976
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100977 status = API_DISPATCH(tfm_crypto_asymmetric_encrypt,
978 TFM_CRYPTO_ASYMMETRIC_ENCRYPT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100979
980 *output_length = out_vec[0].len;
981
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100982 return status;
983}
984
Maulik Patel28659c42021-01-06 14:09:22 +0000985psa_status_t psa_asymmetric_decrypt(psa_key_id_t key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100986 psa_algorithm_t alg,
987 const uint8_t *input,
988 size_t input_length,
989 const uint8_t *salt,
990 size_t salt_length,
991 uint8_t *output,
992 size_t output_size,
993 size_t *output_length)
994{
995 psa_status_t status;
996 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +0800997 .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +0000998 .key_id = key,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100999 .alg = alg
1000 };
1001
1002 /* Sanitize the optional input */
1003 if ((salt == NULL) && (salt_length != 0)) {
1004 return PSA_ERROR_INVALID_ARGUMENT;
1005 }
1006
1007 psa_invec in_vec[] = {
1008 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1009 {.base = input, .len = input_length},
1010 {.base = salt, .len = salt_length}
1011 };
1012
1013 psa_outvec out_vec[] = {
1014 {.base = output, .len = output_size},
1015 };
1016
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001017 status = API_DISPATCH(tfm_crypto_asymmetric_decrypt,
1018 TFM_CRYPTO_ASYMMETRIC_DECRYPT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001019
1020 *output_length = out_vec[0].len;
1021
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001022 return status;
1023}
1024
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001025psa_status_t psa_key_derivation_get_capacity(
1026 const psa_key_derivation_operation_t *operation,
1027 size_t *capacity)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001028{
1029 psa_status_t status;
1030 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001031 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID,
1032 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001033 };
1034
1035 psa_invec in_vec[] = {
1036 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1037 };
1038
1039 psa_outvec out_vec[] = {
1040 {.base = capacity, .len = sizeof(size_t)},
1041 };
1042
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001043 status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity,
1044 TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001045
1046 return status;
1047}
1048
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001049psa_status_t psa_key_derivation_output_bytes(
1050 psa_key_derivation_operation_t *operation,
1051 uint8_t *output,
1052 size_t output_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001053{
1054 psa_status_t status;
1055 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001056 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID,
1057 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001058 };
1059
1060 psa_invec in_vec[] = {
1061 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1062 };
1063
1064 psa_outvec out_vec[] = {
1065 {.base = output, .len = output_length},
1066 };
1067
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001068 status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes,
1069 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001070
1071 return status;
1072}
1073
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001074psa_status_t psa_key_derivation_input_key(
1075 psa_key_derivation_operation_t *operation,
1076 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001077 psa_key_id_t key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001078{
1079 psa_status_t status;
1080 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001081 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001082 .key_id = key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001083 .step = step,
1084 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001085 };
1086
1087 psa_invec in_vec[] = {
1088 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001089 };
1090
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001091 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key,
1092 TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001093
1094 return status;
1095}
1096
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001097psa_status_t psa_key_derivation_abort(psa_key_derivation_operation_t *operation)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001098{
1099 psa_status_t status;
1100 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001101 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID,
1102 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001103 };
1104
1105 psa_invec in_vec[] = {
1106 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1107 };
1108
1109 psa_outvec out_vec[] = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001110 {.base = &(operation->handle), .len = sizeof(uint32_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001111 };
1112
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001113 status = API_DISPATCH(tfm_crypto_key_derivation_abort,
1114 TFM_CRYPTO_KEY_DERIVATION_ABORT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001115
1116 return status;
1117}
1118
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001119psa_status_t psa_key_derivation_key_agreement(
1120 psa_key_derivation_operation_t *operation,
1121 psa_key_derivation_step_t step,
Maulik Patel28659c42021-01-06 14:09:22 +00001122 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001123 const uint8_t *peer_key,
1124 size_t peer_key_length)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001125{
1126 psa_status_t status;
1127 struct tfm_crypto_pack_iovec iov = {
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001128 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID,
Maulik Patel28659c42021-01-06 14:09:22 +00001129 .key_id = private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001130 .step = step,
1131 .op_handle = operation->handle,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001132 };
1133
1134 psa_invec in_vec[] = {
1135 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1136 {.base = peer_key, .len = peer_key_length},
1137 };
1138
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001139 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement,
1140 TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT);
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001141
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001142 return status;
1143}
1144
1145psa_status_t psa_generate_random(uint8_t *output,
1146 size_t output_size)
1147{
1148 psa_status_t status;
1149 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001150 .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001151 };
1152
1153 psa_invec in_vec[] = {
1154 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1155 };
1156
1157 psa_outvec out_vec[] = {
1158 {.base = output, .len = output_size},
1159 };
1160
1161 if (output_size == 0) {
1162 return PSA_SUCCESS;
1163 }
1164
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001165 status = API_DISPATCH(tfm_crypto_generate_random,
1166 TFM_CRYPTO_GENERATE_RANDOM);
1167
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001168 return status;
1169}
1170
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001171psa_status_t psa_generate_key(const psa_key_attributes_t *attributes,
Maulik Patel28659c42021-01-06 14:09:22 +00001172 psa_key_id_t *key)
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001173{
1174 psa_status_t status;
1175 struct tfm_crypto_pack_iovec iov = {
Edison Ai080b2e22019-04-17 16:27:21 +08001176 .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001177 };
1178
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001179 psa_invec in_vec[] = {
1180 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001181 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001182 };
1183
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001184 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001185 {.base = key, .len = sizeof(psa_key_id_t)},
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001186 };
1187
1188 status = API_DISPATCH(tfm_crypto_generate_key,
1189 TFM_CRYPTO_GENERATE_KEY);
1190
1191 return status;
1192}
1193
1194psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes,
1195 psa_key_type_t type,
1196 const uint8_t *data,
1197 size_t data_length)
1198{
1199 psa_status_t status;
1200
1201 status = PSA_ERROR_NOT_SUPPORTED;
1202
1203 return status;
1204}
1205
1206psa_status_t psa_get_key_domain_parameters(
1207 const psa_key_attributes_t *attributes,
1208 uint8_t *data,
1209 size_t data_size,
1210 size_t *data_length)
1211{
1212 psa_status_t status;
1213
1214 status = PSA_ERROR_NOT_SUPPORTED;
1215
1216 return status;
1217}
1218
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001219psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1220 const uint8_t *input,
1221 size_t input_length)
1222{
1223 psa_status_t status;
1224
1225 status = PSA_ERROR_NOT_SUPPORTED;
1226
1227 return status;
1228}
1229
1230psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1231 uint8_t *ciphertext,
1232 size_t ciphertext_size,
1233 size_t *ciphertext_length,
1234 uint8_t *tag,
1235 size_t tag_size,
1236 size_t *tag_length)
1237{
1238 psa_status_t status;
1239
1240 status = PSA_ERROR_NOT_SUPPORTED;
1241
1242 return status;
1243}
1244
1245psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1246 uint8_t *plaintext,
1247 size_t plaintext_size,
1248 size_t *plaintext_length,
1249 const uint8_t *tag,
1250 size_t tag_length)
1251{
1252 psa_status_t status;
1253
1254 status = PSA_ERROR_NOT_SUPPORTED;
1255
1256 return status;
1257}
1258
1259psa_status_t psa_aead_abort(psa_aead_operation_t *operation)
1260{
1261 psa_status_t status;
1262
1263 status = PSA_ERROR_NOT_SUPPORTED;
1264
1265 return status;
1266}
1267
Maulik Patel28659c42021-01-06 14:09:22 +00001268psa_status_t psa_mac_compute(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001269 psa_algorithm_t alg,
1270 const uint8_t *input,
1271 size_t input_length,
1272 uint8_t *mac,
1273 size_t mac_size,
1274 size_t *mac_length)
1275{
1276 psa_status_t status;
1277
1278 status = PSA_ERROR_NOT_SUPPORTED;
1279
1280 return status;
1281}
1282
Maulik Patel28659c42021-01-06 14:09:22 +00001283psa_status_t psa_mac_verify(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001284 psa_algorithm_t alg,
1285 const uint8_t *input,
1286 size_t input_length,
1287 const uint8_t *mac,
1288 const size_t mac_length)
1289{
1290 psa_status_t status;
1291
1292 status = PSA_ERROR_NOT_SUPPORTED;
1293
1294 return status;
1295}
1296
Maulik Patel28659c42021-01-06 14:09:22 +00001297psa_status_t psa_cipher_encrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001298 psa_algorithm_t alg,
1299 const uint8_t *input,
1300 size_t input_length,
1301 uint8_t *output,
1302 size_t output_size,
1303 size_t *output_length)
1304{
1305 psa_status_t status;
1306
1307 status = PSA_ERROR_NOT_SUPPORTED;
1308
1309 return status;
1310}
1311
Maulik Patel28659c42021-01-06 14:09:22 +00001312psa_status_t psa_cipher_decrypt(psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001313 psa_algorithm_t alg,
1314 const uint8_t *input,
1315 size_t input_length,
1316 uint8_t *output,
1317 size_t output_size,
1318 size_t *output_length)
1319{
1320 psa_status_t status;
1321
1322 status = PSA_ERROR_NOT_SUPPORTED;
1323
1324 return status;
1325}
1326
1327psa_status_t psa_raw_key_agreement(psa_algorithm_t alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001328 psa_key_id_t private_key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001329 const uint8_t *peer_key,
1330 size_t peer_key_length,
1331 uint8_t *output,
1332 size_t output_size,
1333 size_t *output_length)
1334{
1335 psa_status_t status;
1336 struct tfm_crypto_pack_iovec iov = {
1337 .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID,
1338 .alg = alg,
Maulik Patel28659c42021-01-06 14:09:22 +00001339 .key_id = private_key
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001340 };
1341
1342 psa_invec in_vec[] = {
1343 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1344 {.base = peer_key, .len = peer_key_length},
1345 };
1346
1347 psa_outvec out_vec[] = {
1348 {.base = output, .len = output_size},
1349 };
1350
1351 status = API_DISPATCH(tfm_crypto_raw_key_agreement,
1352 TFM_CRYPTO_RAW_KEY_AGREEMENT);
1353
1354 *output_length = out_vec[0].len;
1355
1356 return status;
1357}
1358
1359psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation,
1360 psa_algorithm_t alg)
1361{
1362 psa_status_t status;
1363 struct tfm_crypto_pack_iovec iov = {
1364 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID,
1365 .alg = alg,
1366 .op_handle = operation->handle,
1367 };
1368
1369 psa_invec in_vec[] = {
1370 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1371 };
1372 psa_outvec out_vec[] = {
1373 {.base = &(operation->handle), .len = sizeof(uint32_t)},
1374 };
1375
1376 status = API_DISPATCH(tfm_crypto_key_derivation_setup,
1377 TFM_CRYPTO_KEY_DERIVATION_SETUP);
1378 return status;
1379}
1380
1381psa_status_t psa_key_derivation_set_capacity(
1382 psa_key_derivation_operation_t *operation,
1383 size_t capacity)
1384{
1385 psa_status_t status;
1386 struct tfm_crypto_pack_iovec iov = {
1387 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID,
1388 .capacity = capacity,
1389 .op_handle = operation->handle,
1390 };
1391
1392 psa_invec in_vec[] = {
1393 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1394 };
1395
1396 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity,
1397 TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY);
1398 return status;
1399}
1400
1401psa_status_t psa_key_derivation_input_bytes(
1402 psa_key_derivation_operation_t *operation,
1403 psa_key_derivation_step_t step,
1404 const uint8_t *data,
1405 size_t data_length)
1406{
1407 psa_status_t status;
1408 struct tfm_crypto_pack_iovec iov = {
1409 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID,
1410 .step = step,
1411 .op_handle = operation->handle,
1412 };
1413
1414 psa_invec in_vec[] = {
1415 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1416 {.base = data, .len = data_length},
1417 };
1418
1419 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes,
1420 TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES);
1421 return status;
1422}
1423
1424psa_status_t psa_key_derivation_output_key(
1425 const psa_key_attributes_t *attributes,
1426 psa_key_derivation_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001427 psa_key_id_t *key)
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001428{
1429 psa_status_t status;
1430 struct tfm_crypto_pack_iovec iov = {
1431 .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID,
1432 .op_handle = operation->handle,
1433 };
1434
1435 psa_invec in_vec[] = {
1436 {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
1437 {.base = attributes, .len = sizeof(psa_key_attributes_t)},
1438 };
1439
1440 psa_outvec out_vec[] = {
Maulik Patel28659c42021-01-06 14:09:22 +00001441 {.base = key, .len = sizeof(psa_key_id_t)}
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001442 };
1443
1444 status = API_DISPATCH(tfm_crypto_key_derivation_output_key,
1445 TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY);
1446 return status;
1447}
1448
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001449psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001450 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001451 psa_algorithm_t alg)
1452{
1453 psa_status_t status;
1454
1455 status = PSA_ERROR_NOT_SUPPORTED;
1456
1457 return status;
1458}
1459
1460psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
Maulik Patel28659c42021-01-06 14:09:22 +00001461 psa_key_id_t key,
Antonio de Angelis04debbd2019-10-14 12:12:52 +01001462 psa_algorithm_t alg)
1463{
1464 psa_status_t status;
1465
1466 status = PSA_ERROR_NOT_SUPPORTED;
1467
1468 return status;
1469}
1470
1471psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation,
1472 uint8_t *nonce,
1473 size_t nonce_size,
1474 size_t *nonce_length)
1475{
1476 psa_status_t status;
1477
1478 status = PSA_ERROR_NOT_SUPPORTED;
1479
1480 return status;
1481}
1482
1483psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation,
1484 const uint8_t *nonce,
1485 size_t nonce_length)
1486{
1487 psa_status_t status;
1488
1489 status = PSA_ERROR_NOT_SUPPORTED;
1490
1491 return status;
1492}
1493
1494psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation,
1495 size_t ad_length,
1496 size_t plaintext_length)
1497{
1498 psa_status_t status;
1499
1500 status = PSA_ERROR_NOT_SUPPORTED;
1501
1502 return status;
1503}
1504
1505psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1506 const uint8_t *input,
1507 size_t input_length,
1508 uint8_t *output,
1509 size_t output_size,
1510 size_t *output_length)
1511{
1512 psa_status_t status;
1513
1514 status = PSA_ERROR_NOT_SUPPORTED;
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +01001515
1516 return status;
1517}