blob: 3b70d496e3fa712331b2dc48b00c681c7c907de3 [file] [log] [blame]
Antonio de Angelis8908f472018-08-31 15:44:25 +01001/*
Antonio de Angelis377a1552018-11-22 17:02:40 +00002 * Copyright (c) 2018-2019, 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"
Antonio de Angelis8908f472018-08-31 15:44:25 +010010#include "psa_crypto.h"
11#include "tfm_ns_lock.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000012
13#define NS_LOCK_DISPATCH(sfn_name) \
14 tfm_ns_lock_dispatch((veneer_fn)tfm_##sfn_name##_veneer, \
15 (uint32_t)in_vec, sizeof(in_vec)/sizeof(in_vec[0]), \
16 (uint32_t)out_vec, sizeof(out_vec)/sizeof(out_vec[0]))
17
18#define NS_LOCK_DISPATCH_NO_INVEC(sfn_name) \
19 tfm_ns_lock_dispatch((veneer_fn)tfm_##sfn_name##_veneer, \
20 (uint32_t)NULL, 0, \
21 (uint32_t)out_vec, sizeof(out_vec)/sizeof(out_vec[0]))
22
23#define NS_LOCK_DISPATCH_NO_OUTVEC(sfn_name) \
24 tfm_ns_lock_dispatch((veneer_fn)tfm_##sfn_name##_veneer, \
25 (uint32_t)in_vec, sizeof(in_vec)/sizeof(in_vec[0]), \
26 (uint32_t)NULL, 0)
27
28#define API_DISPATCH(sfn_name) NS_LOCK_DISPATCH(sfn_name)
29#define API_DISPATCH_NO_INVEC(sfn_name) NS_LOCK_DISPATCH_NO_INVEC(sfn_name)
30#define API_DISPATCH_NO_OUTVEC(sfn_name) NS_LOCK_DISPATCH_NO_OUTVEC(sfn_name)
Antonio de Angelis8908f472018-08-31 15:44:25 +010031
32psa_status_t psa_crypto_init(void)
33{
34 /* Service init is performed during TFM boot up,
35 * so application level initialisation is empty
36 */
37 return PSA_SUCCESS;
38}
39
40psa_status_t psa_import_key(psa_key_slot_t key,
41 psa_key_type_t type,
42 const uint8_t *data,
43 size_t data_length)
44{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000045 psa_status_t status;
46 psa_invec in_vec[] = {
47 {.base = &key, .len = sizeof(psa_key_slot_t)},
48 {.base = &type, .len = sizeof(psa_key_type_t)},
49 {.base = data, .len = data_length}
50 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010051
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000052 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_import_key);
Antonio de Angelis8908f472018-08-31 15:44:25 +010053
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000054 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +010055}
56
57psa_status_t psa_destroy_key(psa_key_slot_t key)
58{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000059 psa_status_t status;
60 psa_invec in_vec[] = {
61 {.base = &key, .len = sizeof(psa_key_slot_t)},
62 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010063
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000064 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_destroy_key);
Antonio de Angelis8908f472018-08-31 15:44:25 +010065
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000066 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +010067}
68
69psa_status_t psa_get_key_information(psa_key_slot_t key,
70 psa_key_type_t *type,
71 size_t *bits)
72{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000073 psa_status_t status;
74 psa_invec in_vec[] = {
75 {.base = &key, .len = sizeof(psa_key_slot_t)},
76 };
77 psa_outvec out_vec[] = {
78 {.base = type, .len = sizeof(psa_key_type_t)},
79 {.base = bits, .len = sizeof(size_t)}
80 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010081
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000082 status = API_DISPATCH(tfm_crypto_get_key_information);
Antonio de Angelis8908f472018-08-31 15:44:25 +010083
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000084 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +010085}
86
87psa_status_t psa_export_key(psa_key_slot_t key,
88 uint8_t *data,
89 size_t data_size,
90 size_t *data_length)
91{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000092 psa_status_t status;
93 psa_invec in_vec[] = {
94 {.base = &key, .len = sizeof(psa_key_slot_t)},
95 };
96 psa_outvec out_vec[] = {
97 {.base = data, .len = data_size}
98 };
Antonio de Angelis8908f472018-08-31 15:44:25 +010099
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000100 status = API_DISPATCH(tfm_crypto_export_key);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100101
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000102 *data_length = out_vec[0].len;
103
104 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100105}
106
107psa_status_t psa_export_public_key(psa_key_slot_t key,
108 uint8_t *data,
109 size_t data_size,
110 size_t *data_length)
111{
Hugues de Valon8b442442019-02-19 14:30:52 +0000112 (void)key;
113 (void)data;
114 (void)data_size;
115 (void)data_length;
116
Antonio de Angelis8908f472018-08-31 15:44:25 +0100117 /* TODO: This API is not supported yet */
118 return PSA_ERROR_NOT_SUPPORTED;
119}
120
Jamie Foxefd82732018-11-26 10:34:32 +0000121void psa_key_policy_init(psa_key_policy_t *policy)
122{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000123 psa_status_t status;
124 psa_outvec out_vec[] = {
125 {.base = policy, .len = sizeof(psa_key_policy_t)},
126 };
127
Jamie Foxefd82732018-11-26 10:34:32 +0000128 /* PSA API returns void so just ignore error value returned */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000129 status = API_DISPATCH_NO_INVEC(tfm_crypto_key_policy_init);
Jamie Foxefd82732018-11-26 10:34:32 +0000130}
131
132void psa_key_policy_set_usage(psa_key_policy_t *policy,
133 psa_key_usage_t usage,
134 psa_algorithm_t alg)
135{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000136 psa_status_t status;
137 psa_invec in_vec[] = {
138 {.base = &usage, .len = sizeof(psa_key_usage_t)},
139 {.base = &alg, .len = sizeof(psa_algorithm_t)}
140 };
141 psa_outvec out_vec[] = {
142 {.base = policy, .len = sizeof(psa_key_policy_t)},
143 };
144
Jamie Foxefd82732018-11-26 10:34:32 +0000145 /* PSA API returns void so just ignore error value returned */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000146 status = API_DISPATCH(tfm_crypto_key_policy_set_usage);
Jamie Foxefd82732018-11-26 10:34:32 +0000147}
148
149psa_key_usage_t psa_key_policy_get_usage(const psa_key_policy_t *policy)
150{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000151 psa_status_t status;
Jamie Foxefd82732018-11-26 10:34:32 +0000152 psa_key_usage_t usage;
153
154 /* Initialise to a sensible default to avoid returning an uninitialised
155 * value in case the secure function fails.
156 */
157 usage = 0;
158
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000159 psa_invec in_vec[] = {
160 {.base = policy, .len = sizeof(psa_key_policy_t)},
161 };
162 psa_outvec out_vec[] = {
163 {.base = &usage, .len = sizeof(psa_key_usage_t)},
164 };
165
Jamie Foxefd82732018-11-26 10:34:32 +0000166 /* The PSA API does not return an error, so ignore any error from TF-M */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000167 status = API_DISPATCH(tfm_crypto_key_policy_get_usage);
Jamie Foxefd82732018-11-26 10:34:32 +0000168
169 return usage;
170}
171
172psa_algorithm_t psa_key_policy_get_algorithm(const psa_key_policy_t *policy)
173{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000174 psa_status_t status;
Jamie Foxefd82732018-11-26 10:34:32 +0000175 psa_algorithm_t alg;
176
177 /* Initialise to a sensible default to avoid returning an uninitialised
178 * value in case the secure function fails.
179 */
180 alg = 0;
181
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000182 psa_invec in_vec[] = {
183 {.base = policy, .len = sizeof(psa_key_policy_t)},
184 };
185 psa_outvec out_vec[] = {
186 {.base = &alg, .len = sizeof(psa_algorithm_t)},
187 };
188
Jamie Foxefd82732018-11-26 10:34:32 +0000189 /* The PSA API does not return an error, so ignore any error from TF-M */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000190 status = API_DISPATCH(tfm_crypto_key_policy_get_algorithm);
Jamie Foxefd82732018-11-26 10:34:32 +0000191
192 return alg;
193}
194
195psa_status_t psa_set_key_policy(psa_key_slot_t key,
196 const psa_key_policy_t *policy)
197{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000198 psa_status_t status;
199 psa_invec in_vec[] = {
200 {.base = &key, .len = sizeof(psa_key_slot_t)},
201 {.base = policy, .len = sizeof(psa_key_policy_t)},
202 };
Jamie Foxefd82732018-11-26 10:34:32 +0000203
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000204 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_set_key_policy);
Jamie Foxefd82732018-11-26 10:34:32 +0000205
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000206 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000207}
208
209psa_status_t psa_get_key_policy(psa_key_slot_t key,
210 psa_key_policy_t *policy)
211{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000212 psa_status_t status;
213 psa_invec in_vec[] = {
214 {.base = &key, .len = sizeof(psa_key_slot_t)},
215 };
216 psa_outvec out_vec[] = {
217 {.base = policy, .len = sizeof(psa_key_policy_t)},
218 };
Jamie Foxefd82732018-11-26 10:34:32 +0000219
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000220 status = API_DISPATCH(tfm_crypto_get_key_policy);
Jamie Foxefd82732018-11-26 10:34:32 +0000221
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000222 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000223}
224
225psa_status_t psa_set_key_lifetime(psa_key_slot_t key,
226 psa_key_lifetime_t lifetime)
227{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000228 psa_status_t status;
229 psa_invec in_vec[] = {
230 {.base = &key, .len = sizeof(psa_key_slot_t)},
231 {.base = &lifetime, .len = sizeof(psa_key_lifetime_t)},
232 };
Jamie Foxefd82732018-11-26 10:34:32 +0000233
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000234 status = API_DISPATCH_NO_OUTVEC(tfm_crypto_set_key_lifetime);
Jamie Foxefd82732018-11-26 10:34:32 +0000235
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000236 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000237}
238
239psa_status_t psa_get_key_lifetime(psa_key_slot_t key,
240 psa_key_lifetime_t *lifetime)
241{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000242 psa_status_t status;
243 psa_invec in_vec[] = {
244 {.base = &key, .len = sizeof(psa_key_slot_t)},
245 };
246 psa_outvec out_vec[] = {
247 {.base = lifetime, .len = sizeof(psa_key_lifetime_t)},
248 };
Jamie Foxefd82732018-11-26 10:34:32 +0000249
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000250 status = API_DISPATCH(tfm_crypto_get_key_lifetime);
Jamie Foxefd82732018-11-26 10:34:32 +0000251
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000252 return status;
Jamie Foxefd82732018-11-26 10:34:32 +0000253}
254
Antonio de Angelis377a1552018-11-22 17:02:40 +0000255psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation,
256 const unsigned char *iv,
257 size_t iv_length)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100258{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000259 psa_status_t status;
260 psa_invec in_vec[] = {
261 {.base = iv, .len = iv_length},
262 };
263 psa_outvec out_vec[] = {
264 {.base = operation, .len = sizeof(psa_cipher_operation_t)},
265 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100266
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000267 status = API_DISPATCH(tfm_crypto_cipher_set_iv);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100268
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000269 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100270}
271
Antonio de Angelis377a1552018-11-22 17:02:40 +0000272psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation,
273 psa_key_slot_t key,
274 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100275{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000276 psa_status_t status;
277 psa_invec in_vec[] = {
278 {.base = &key, .len = sizeof(psa_key_slot_t)},
279 {.base = &alg, .len = sizeof(psa_algorithm_t)},
280 };
281 psa_outvec out_vec[] = {
282 {.base = operation, .len = sizeof(psa_cipher_operation_t)},
283 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100284
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000285 status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100286
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000287 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100288}
289
Antonio de Angelis377a1552018-11-22 17:02:40 +0000290psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation,
291 psa_key_slot_t key,
292 psa_algorithm_t alg)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100293{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000294 psa_status_t status;
295 psa_invec in_vec[] = {
296 {.base = &key, .len = sizeof(psa_key_slot_t)},
297 {.base = &alg, .len = sizeof(psa_algorithm_t)},
298 };
299 psa_outvec out_vec[] = {
300 {.base = operation, .len = sizeof(psa_cipher_operation_t)},
301 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100302
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000303 status = API_DISPATCH(tfm_crypto_cipher_decrypt_setup);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100304
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000305 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100306}
307
308psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
309 const uint8_t *input,
310 size_t input_length,
311 unsigned char *output,
312 size_t output_size,
313 size_t *output_length)
314{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000315 psa_status_t status;
316 psa_invec in_vec[] = {
317 {.base = input, .len = input_length},
318 };
319 psa_outvec out_vec[] = {
320 {.base = operation, .len = sizeof(psa_cipher_operation_t)},
321 {.base = output, .len = output_size}
322 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100323
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000324 status = API_DISPATCH(tfm_crypto_cipher_update);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100325
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000326 *output_length = out_vec[1].len;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100327
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000328 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100329}
330
331psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation)
332{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000333 psa_status_t status;
334 psa_outvec out_vec[] = {
335 {.base = operation, .len = sizeof(psa_cipher_operation_t)},
336 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100337
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000338 status = API_DISPATCH_NO_INVEC(tfm_crypto_cipher_abort);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100339
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000340 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100341}
342
343psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
344 uint8_t *output,
345 size_t output_size,
346 size_t *output_length)
347{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000348 psa_status_t status;
349 psa_outvec out_vec[] = {
350 {.base = operation, .len = sizeof(psa_cipher_operation_t)},
351 {.base = output, .len = output_size},
352 };
Antonio de Angelis8908f472018-08-31 15:44:25 +0100353
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000354 status = API_DISPATCH_NO_INVEC(tfm_crypto_cipher_finish);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100355
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000356 *output_length = out_vec[1].len;
357
358 return status;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100359}
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100360
Antonio de Angelis377a1552018-11-22 17:02:40 +0000361psa_status_t psa_hash_setup(psa_hash_operation_t *operation,
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100362 psa_algorithm_t alg)
363{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000364 psa_status_t status;
365 psa_invec in_vec[] = {
366 {.base = &alg, .len = sizeof(psa_algorithm_t)},
367 };
368 psa_outvec out_vec[] = {
369 {.base = operation, .len = sizeof(psa_hash_operation_t)},
370 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100371
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000372 status = API_DISPATCH(tfm_crypto_hash_setup);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100373
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000374 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100375}
376
377psa_status_t psa_hash_update(psa_hash_operation_t *operation,
378 const uint8_t *input,
379 size_t input_length)
380{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000381 psa_status_t status;
382 psa_invec in_vec[] = {
383 {.base = input, .len = input_length},
384 };
385 psa_outvec out_vec[] = {
386 {.base = operation, .len = sizeof(psa_hash_operation_t)},
387 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100388
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000389 status = API_DISPATCH(tfm_crypto_hash_update);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100390
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000391 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100392}
393
394psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
395 uint8_t *hash,
396 size_t hash_size,
397 size_t *hash_length)
398{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000399 psa_status_t status;
400 psa_outvec out_vec[] = {
401 {.base = operation, .len = sizeof(psa_hash_operation_t)},
402 {.base = hash, .len = hash_size},
403 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100404
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000405 status = API_DISPATCH_NO_INVEC(tfm_crypto_hash_finish);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100406
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000407 *hash_length = out_vec[1].len;
408
409 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100410}
411
412psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
413 const uint8_t *hash,
414 size_t hash_length)
415{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000416 psa_status_t status;
417 psa_invec in_vec[] = {
418 {.base = hash, .len = hash_length},
419 };
420 psa_outvec out_vec[] = {
421 {.base = operation, .len = sizeof(psa_hash_operation_t)},
422 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100423
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000424 status = API_DISPATCH(tfm_crypto_hash_verify);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100425
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000426 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100427}
428
429psa_status_t psa_hash_abort(psa_hash_operation_t *operation)
430{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000431 psa_status_t status;
432 psa_outvec out_vec[] = {
433 {.base = operation, .len = sizeof(psa_hash_operation_t)},
434 };
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100435
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000436 status = API_DISPATCH_NO_INVEC(tfm_crypto_hash_abort);
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100437
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000438 return status;
Antonio de Angelisa6f72162018-09-05 11:00:37 +0100439}
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100440
441psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation,
442 psa_key_slot_t key,
443 psa_algorithm_t alg)
444{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000445 psa_status_t status;
446 psa_invec in_vec[] = {
447 {.base = &key, .len = sizeof(psa_key_slot_t)},
448 {.base = &alg, .len = sizeof(psa_algorithm_t)}
449 };
450 psa_outvec out_vec[] = {
451 {.base = operation, .len = sizeof(psa_mac_operation_t)},
452 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100453
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000454 status = API_DISPATCH(tfm_crypto_mac_sign_setup);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100455
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000456 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100457}
458
459psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation,
460 psa_key_slot_t key,
461 psa_algorithm_t alg)
462{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000463 psa_status_t status;
464 psa_invec in_vec[] = {
465 {.base = &key, .len = sizeof(psa_key_slot_t)},
466 {.base = &alg, .len = sizeof(psa_algorithm_t)}
467 };
468 psa_outvec out_vec[] = {
469 {.base = operation, .len = sizeof(psa_mac_operation_t)},
470 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100471
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000472 status = API_DISPATCH(tfm_crypto_mac_verify_setup);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100473
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000474 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100475}
476
477psa_status_t psa_mac_update(psa_mac_operation_t *operation,
478 const uint8_t *input,
479 size_t input_length)
480{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000481 psa_status_t status;
482 psa_invec in_vec[] = {
483 {.base = input, .len = input_length},
484 };
485 psa_outvec out_vec[] = {
486 {.base = operation, .len = sizeof(psa_mac_operation_t)},
487 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100488
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000489 status = API_DISPATCH(tfm_crypto_mac_update);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100490
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000491 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100492}
493
494psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation,
495 uint8_t *mac,
496 size_t mac_size,
497 size_t *mac_length)
498{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000499 psa_status_t status;
500 psa_outvec out_vec[] = {
501 {.base = operation, .len = sizeof(psa_mac_operation_t)},
502 {.base = mac, .len = mac_size},
503 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100504
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000505 status = API_DISPATCH_NO_INVEC(tfm_crypto_mac_sign_finish);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100506
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000507 *mac_length = out_vec[1].len;
508
509 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100510}
511
512psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation,
513 const uint8_t *mac,
514 size_t mac_length)
515{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000516 psa_status_t status;
517 psa_invec in_vec[] = {
518 {.base = mac, .len = mac_length},
519 };
520 psa_outvec out_vec[] = {
521 {.base = operation, .len = sizeof(psa_mac_operation_t)},
522 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100523
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000524 status = API_DISPATCH(tfm_crypto_mac_verify_finish);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100525
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000526 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100527}
528
529psa_status_t psa_mac_abort(psa_mac_operation_t *operation)
530{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000531 psa_status_t status;
532 psa_outvec out_vec[] = {
533 {.base = operation, .len = sizeof(psa_mac_operation_t)},
534 };
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100535
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000536 status = API_DISPATCH_NO_INVEC(tfm_crypto_mac_abort);
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100537
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000538 return status;
Louis Mayencourt7a36f782018-09-24 14:00:57 +0100539}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000540
541psa_status_t psa_aead_encrypt(psa_key_slot_t key,
542 psa_algorithm_t alg,
543 const uint8_t *nonce,
544 size_t nonce_length,
545 const uint8_t *additional_data,
546 size_t additional_data_length,
547 const uint8_t *plaintext,
548 size_t plaintext_length,
549 uint8_t *ciphertext,
550 size_t ciphertext_size,
551 size_t *ciphertext_length)
552{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000553 psa_status_t status;
554 struct tfm_crypto_aead_pack_input input_s = {
555 .key = key,
556 .alg = alg,
557 .nonce = {0},
558 };
559 size_t idx = 0;
560 psa_invec in_vec[] = {
561 {.base = &input_s, .len = nonce_length + sizeof(psa_key_slot_t)
562 + sizeof(psa_algorithm_t)},
563 {.base = additional_data, .len = additional_data_length},
564 {.base = plaintext, .len = plaintext_length},
565 };
566 psa_outvec out_vec[] = {
567 {.base = ciphertext, .len = ciphertext_size},
568 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000569
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000570 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
571 return PSA_ERROR_INVALID_ARGUMENT;
572 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000573
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000574 if (nonce != NULL) {
575 for (idx = 0; idx < nonce_length; idx++) {
576 input_s.nonce[idx] = nonce[idx];
577 }
578 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000579
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000580 status = API_DISPATCH(tfm_crypto_aead_encrypt);
581
582 *ciphertext_length = out_vec[0].len;
583
584 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000585}
586
587psa_status_t psa_aead_decrypt(psa_key_slot_t key,
588 psa_algorithm_t alg,
589 const uint8_t *nonce,
590 size_t nonce_length,
591 const uint8_t *additional_data,
592 size_t additional_data_length,
593 const uint8_t *ciphertext,
594 size_t ciphertext_length,
595 uint8_t *plaintext,
596 size_t plaintext_size,
597 size_t *plaintext_length)
598{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000599 psa_status_t status;
600 struct tfm_crypto_aead_pack_input input_s = {
601 .key = key,
602 .alg = alg,
603 .nonce = {0},
604 };
605 size_t idx = 0;
606 psa_invec in_vec[] = {
607 {.base = &input_s, .len = nonce_length + sizeof(psa_key_slot_t)
608 + sizeof(psa_algorithm_t)},
609 {.base = additional_data, .len = additional_data_length},
610 {.base = ciphertext, .len = ciphertext_length},
611 };
612 psa_outvec out_vec[] = {
613 {.base = plaintext, .len = plaintext_size},
614 };
Antonio de Angelis3a480992018-11-07 11:53:28 +0000615
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000616 if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) {
617 return PSA_ERROR_INVALID_ARGUMENT;
618 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000619
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000620 if (nonce != NULL) {
621 for (idx = 0; idx < nonce_length; idx++) {
622 input_s.nonce[idx] = nonce[idx];
623 }
624 }
Antonio de Angelis3a480992018-11-07 11:53:28 +0000625
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000626 status = API_DISPATCH(tfm_crypto_aead_decrypt);
627
628 *plaintext_length = out_vec[0].len;
629
630 return status;
Antonio de Angelis3a480992018-11-07 11:53:28 +0000631}