blob: dc2d340868e973ed77a4ddff58db108d4494b726 [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
Jamie Foxefd82732018-11-26 10:34:32 +00008#include <stddef.h>
Jamie Fox0e54ebc2019-04-09 14:21:04 +01009#include <stdint.h>
Antonio de Angelis8908f472018-08-31 15:44:25 +010010
Antonio de Angelis4743e672019-04-11 11:38:48 +010011/* FixMe: Use PSA_CONNECTION_REFUSED when performing parameter
12 * integrity checks but this will have to be revised
13 * when the full set of error codes mandated by PSA FF
14 * is available.
15 */
Jamie Fox0e54ebc2019-04-09 14:21:04 +010016#include "tfm_mbedcrypto_include.h"
Antonio de Angelis4743e672019-04-11 11:38:48 +010017
Jamie Fox0e54ebc2019-04-09 14:21:04 +010018#include "tfm_crypto_api.h"
19#include "tfm_crypto_defs.h"
Jamie Fox82b87ca2018-12-11 16:41:11 +000020
Antonio de Angelis8908f472018-08-31 15:44:25 +010021/*!
22 * \defgroup public Public functions
23 *
24 */
25
26/*!@{*/
Jamie Fox0e54ebc2019-04-09 14:21:04 +010027psa_status_t tfm_crypto_allocate_key(psa_invec in_vec[],
28 size_t in_len,
29 psa_outvec out_vec[],
30 size_t out_len)
Antonio de Angeliscf85ba22018-10-09 13:29:40 +010031{
Jamie Fox0e54ebc2019-04-09 14:21:04 +010032 if ((in_len != 1) || (out_len != 1)) {
33 return PSA_CONNECTION_REFUSED;
Jamie Foxefd82732018-11-26 10:34:32 +000034 }
35
Jamie Fox0e54ebc2019-04-09 14:21:04 +010036 if ((in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) ||
37 (out_vec[0].len != sizeof(psa_key_handle_t))) {
38 return PSA_CONNECTION_REFUSED;
Jamie Foxefd82732018-11-26 10:34:32 +000039 }
40
Jamie Fox0e54ebc2019-04-09 14:21:04 +010041 psa_key_handle_t *key_handle = out_vec[0].base;
Jamie Foxefd82732018-11-26 10:34:32 +000042
Jamie Fox0e54ebc2019-04-09 14:21:04 +010043 return psa_allocate_key(key_handle);
Jamie Foxefd82732018-11-26 10:34:32 +000044}
45
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000046psa_status_t tfm_crypto_import_key(psa_invec in_vec[],
47 size_t in_len,
48 psa_outvec out_vec[],
49 size_t out_len)
Antonio de Angelis8908f472018-08-31 15:44:25 +010050{
Jamie Fox0e54ebc2019-04-09 14:21:04 +010051 (void)out_vec;
Antonio de Angelis8908f472018-08-31 15:44:25 +010052
Antonio de Angelis4743e672019-04-11 11:38:48 +010053 if ((in_len != 2) || (out_len != 0)) {
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000054 return PSA_CONNECTION_REFUSED;
Jamie Foxefd82732018-11-26 10:34:32 +000055 }
56
Antonio de Angelis4743e672019-04-11 11:38:48 +010057 if (in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) {
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000058 return PSA_CONNECTION_REFUSED;
59 }
Antonio de Angelis4743e672019-04-11 11:38:48 +010060 const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000061
Jamie Fox0e54ebc2019-04-09 14:21:04 +010062 psa_key_handle_t key = iov->key_handle;
Antonio de Angelis4743e672019-04-11 11:38:48 +010063 psa_key_type_t type = iov->type;
64 const uint8_t *data = in_vec[1].base;
65 size_t data_length = in_vec[1].len;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000066
Jamie Fox0e54ebc2019-04-09 14:21:04 +010067 return psa_import_key(key, type, data, data_length);
Antonio de Angelis8908f472018-08-31 15:44:25 +010068}
69
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000070psa_status_t tfm_crypto_destroy_key(psa_invec in_vec[],
71 size_t in_len,
72 psa_outvec out_vec[],
73 size_t out_len)
Antonio de Angelis8908f472018-08-31 15:44:25 +010074{
Jamie Fox0e54ebc2019-04-09 14:21:04 +010075 (void)out_vec;
Antonio de Angelis8908f472018-08-31 15:44:25 +010076
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000077 if ((in_len != 1) || (out_len != 0)) {
78 return PSA_CONNECTION_REFUSED;
79 }
80
Antonio de Angelis4743e672019-04-11 11:38:48 +010081 if (in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) {
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000082 return PSA_CONNECTION_REFUSED;
83 }
Antonio de Angelis4743e672019-04-11 11:38:48 +010084 const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000085
Jamie Fox0e54ebc2019-04-09 14:21:04 +010086 psa_key_handle_t key = iov->key_handle;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000087
Jamie Fox0e54ebc2019-04-09 14:21:04 +010088 return psa_destroy_key(key);
Antonio de Angelis8908f472018-08-31 15:44:25 +010089}
90
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000091psa_status_t tfm_crypto_get_key_information(psa_invec in_vec[],
92 size_t in_len,
93 psa_outvec out_vec[],
94 size_t out_len)
Antonio de Angelis8908f472018-08-31 15:44:25 +010095{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000096 if ((in_len != 1) || (out_len != 2)) {
97 return PSA_CONNECTION_REFUSED;
Jamie Foxefd82732018-11-26 10:34:32 +000098 }
99
Antonio de Angelis4743e672019-04-11 11:38:48 +0100100 if ((in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) ||
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000101 (out_vec[0].len != sizeof(psa_key_type_t)) ||
102 (out_vec[1].len != sizeof(size_t))) {
103 return PSA_CONNECTION_REFUSED;
Jamie Foxefd82732018-11-26 10:34:32 +0000104 }
Antonio de Angelis4743e672019-04-11 11:38:48 +0100105 const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
Jamie Foxefd82732018-11-26 10:34:32 +0000106
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100107 psa_key_handle_t key = iov->key_handle;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000108 psa_key_type_t *type = out_vec[0].base;
109 size_t *bits = out_vec[1].base;
110
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100111 return psa_get_key_information(key, type, bits);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100112}
113
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000114psa_status_t tfm_crypto_export_key(psa_invec in_vec[],
115 size_t in_len,
116 psa_outvec out_vec[],
117 size_t out_len)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100118{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000119 if ((in_len != 1) || (out_len != 1)) {
120 return PSA_CONNECTION_REFUSED;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100121 }
122
Antonio de Angelis4743e672019-04-11 11:38:48 +0100123 if (in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) {
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000124 return PSA_CONNECTION_REFUSED;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100125 }
Antonio de Angelis4743e672019-04-11 11:38:48 +0100126 const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100127
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100128 psa_key_handle_t key = iov->key_handle;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000129 uint8_t *data = out_vec[0].base;
130 size_t data_size = out_vec[0].len;
131
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100132 return psa_export_key(key, data, data_size, &(out_vec[0].len));
Antonio de Angelis8908f472018-08-31 15:44:25 +0100133}
134
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000135psa_status_t tfm_crypto_export_public_key(psa_invec in_vec[],
136 size_t in_len,
137 psa_outvec out_vec[],
138 size_t out_len)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100139{
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100140 if ((in_len != 1) || (out_len != 1)) {
141 return PSA_CONNECTION_REFUSED;
142 }
Hugues de Valon8b442442019-02-19 14:30:52 +0000143
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100144 if (in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) {
145 return PSA_CONNECTION_REFUSED;
146 }
147 const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
148
149 psa_key_handle_t key = iov->key_handle;
150 uint8_t *data = out_vec[0].base;
151 size_t data_size = out_vec[0].len;
152
153 return psa_export_public_key(key, data, data_size, &(out_vec[0].len));
154}
155
156psa_status_t tfm_crypto_copy_key(psa_invec in_vec[],
157 size_t in_len,
158 psa_outvec out_vec[],
159 size_t out_len)
160{
161 (void)out_vec;
162
163 if ((in_len != 3) || (out_len != 0)) {
164 return PSA_CONNECTION_REFUSED;
165 }
166
167 if ((in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) ||
168 (in_vec[1].len != sizeof(psa_key_handle_t)) ||
169 (in_vec[2].len != sizeof(psa_key_policy_t))) {
170 return PSA_CONNECTION_REFUSED;
171 }
172 const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
173
174 psa_key_handle_t source_handle = iov->key_handle;
175 psa_key_handle_t target_handle = *((psa_key_handle_t *)in_vec[1].base);
176 const psa_key_policy_t *policy = in_vec[2].base;
177
178 return psa_copy_key(source_handle, target_handle, policy);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100179}
Jamie Foxefd82732018-11-26 10:34:32 +0000180
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000181psa_status_t tfm_crypto_set_key_policy(psa_invec in_vec[],
182 size_t in_len,
183 psa_outvec out_vec[],
184 size_t out_len)
Jamie Foxefd82732018-11-26 10:34:32 +0000185{
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100186 (void)out_vec;
Jamie Foxefd82732018-11-26 10:34:32 +0000187
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000188 if ((in_len != 2) || (out_len != 0)) {
189 return PSA_CONNECTION_REFUSED;
Jamie Foxefd82732018-11-26 10:34:32 +0000190 }
191
Antonio de Angelis4743e672019-04-11 11:38:48 +0100192 if ((in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) ||
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000193 (in_vec[1].len != sizeof(psa_key_policy_t))) {
194 return PSA_CONNECTION_REFUSED;
195 }
Antonio de Angelis4743e672019-04-11 11:38:48 +0100196 const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000197
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100198 psa_key_handle_t key = iov->key_handle;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000199 const psa_key_policy_t *policy = in_vec[1].base;
200
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100201 return psa_set_key_policy(key, policy);
Jamie Foxefd82732018-11-26 10:34:32 +0000202}
203
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000204psa_status_t tfm_crypto_get_key_policy(psa_invec in_vec[],
205 size_t in_len,
206 psa_outvec out_vec[],
207 size_t out_len)
Jamie Foxefd82732018-11-26 10:34:32 +0000208{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000209 if ((in_len != 1) || (out_len != 1)) {
210 return PSA_CONNECTION_REFUSED;
Jamie Foxefd82732018-11-26 10:34:32 +0000211 }
212
Antonio de Angelis4743e672019-04-11 11:38:48 +0100213 if ((in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) ||
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000214 (out_vec[0].len != sizeof(psa_key_policy_t))) {
215 return PSA_CONNECTION_REFUSED;
216 }
Antonio de Angelis4743e672019-04-11 11:38:48 +0100217 const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000218
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100219 psa_key_handle_t key = iov->key_handle;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000220 psa_key_policy_t *policy = out_vec[0].base;
221
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100222 return psa_get_key_policy(key, policy);
Jamie Foxefd82732018-11-26 10:34:32 +0000223}
224
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000225psa_status_t tfm_crypto_get_key_lifetime(psa_invec in_vec[],
226 size_t in_len,
227 psa_outvec out_vec[],
228 size_t out_len)
Jamie Foxefd82732018-11-26 10:34:32 +0000229{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000230 if ((in_len != 1) || (out_len != 1)) {
231 return PSA_CONNECTION_REFUSED;
Jamie Foxefd82732018-11-26 10:34:32 +0000232 }
233
Antonio de Angelis4743e672019-04-11 11:38:48 +0100234 if ((in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) ||
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000235 (out_vec[0].len != sizeof(psa_key_lifetime_t))) {
236 return PSA_CONNECTION_REFUSED;
237 }
Antonio de Angelis4743e672019-04-11 11:38:48 +0100238 const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000239
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100240 psa_key_handle_t key = iov->key_handle;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000241 psa_key_lifetime_t *lifetime = out_vec[0].base;
242
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100243 return psa_get_key_lifetime(key, lifetime);
Jamie Foxefd82732018-11-26 10:34:32 +0000244}
Antonio de Angelis8908f472018-08-31 15:44:25 +0100245/*!@}*/