blob: 073203ced5d58ae9e806e2ed1d03eb58ef19592e [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;
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100131 size_t *data_length = &(out_vec[0].len);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000132
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100133 return psa_export_key(key, data, data_size, data_length);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100134}
135
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000136psa_status_t tfm_crypto_export_public_key(psa_invec in_vec[],
137 size_t in_len,
138 psa_outvec out_vec[],
139 size_t out_len)
Antonio de Angelis8908f472018-08-31 15:44:25 +0100140{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000141 (void)in_vec;
142 (void)in_len;
143 (void)out_vec;
144 (void)out_len;
Hugues de Valon8b442442019-02-19 14:30:52 +0000145
Antonio de Angelis8908f472018-08-31 15:44:25 +0100146 /* FIXME: This API is not supported yet */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000147 return PSA_ERROR_NOT_SUPPORTED;
Antonio de Angelis8908f472018-08-31 15:44:25 +0100148}
Jamie Foxefd82732018-11-26 10:34:32 +0000149
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000150psa_status_t tfm_crypto_set_key_policy(psa_invec in_vec[],
151 size_t in_len,
152 psa_outvec out_vec[],
153 size_t out_len)
Jamie Foxefd82732018-11-26 10:34:32 +0000154{
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100155 (void)out_vec;
Jamie Foxefd82732018-11-26 10:34:32 +0000156
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000157 if ((in_len != 2) || (out_len != 0)) {
158 return PSA_CONNECTION_REFUSED;
Jamie Foxefd82732018-11-26 10:34:32 +0000159 }
160
Antonio de Angelis4743e672019-04-11 11:38:48 +0100161 if ((in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) ||
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000162 (in_vec[1].len != sizeof(psa_key_policy_t))) {
163 return PSA_CONNECTION_REFUSED;
164 }
Antonio de Angelis4743e672019-04-11 11:38:48 +0100165 const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000166
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100167 psa_key_handle_t key = iov->key_handle;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000168 const psa_key_policy_t *policy = in_vec[1].base;
169
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100170 return psa_set_key_policy(key, policy);
Jamie Foxefd82732018-11-26 10:34:32 +0000171}
172
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000173psa_status_t tfm_crypto_get_key_policy(psa_invec in_vec[],
174 size_t in_len,
175 psa_outvec out_vec[],
176 size_t out_len)
Jamie Foxefd82732018-11-26 10:34:32 +0000177{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000178 if ((in_len != 1) || (out_len != 1)) {
179 return PSA_CONNECTION_REFUSED;
Jamie Foxefd82732018-11-26 10:34:32 +0000180 }
181
Antonio de Angelis4743e672019-04-11 11:38:48 +0100182 if ((in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) ||
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000183 (out_vec[0].len != sizeof(psa_key_policy_t))) {
184 return PSA_CONNECTION_REFUSED;
185 }
Antonio de Angelis4743e672019-04-11 11:38:48 +0100186 const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000187
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100188 psa_key_handle_t key = iov->key_handle;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000189 psa_key_policy_t *policy = out_vec[0].base;
190
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100191 return psa_get_key_policy(key, policy);
Jamie Foxefd82732018-11-26 10:34:32 +0000192}
193
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000194psa_status_t tfm_crypto_get_key_lifetime(psa_invec in_vec[],
195 size_t in_len,
196 psa_outvec out_vec[],
197 size_t out_len)
Jamie Foxefd82732018-11-26 10:34:32 +0000198{
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000199 if ((in_len != 1) || (out_len != 1)) {
200 return PSA_CONNECTION_REFUSED;
Jamie Foxefd82732018-11-26 10:34:32 +0000201 }
202
Antonio de Angelis4743e672019-04-11 11:38:48 +0100203 if ((in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) ||
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000204 (out_vec[0].len != sizeof(psa_key_lifetime_t))) {
205 return PSA_CONNECTION_REFUSED;
206 }
Antonio de Angelis4743e672019-04-11 11:38:48 +0100207 const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000208
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100209 psa_key_handle_t key = iov->key_handle;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000210 psa_key_lifetime_t *lifetime = out_vec[0].base;
211
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100212 return psa_get_key_lifetime(key, lifetime);
Jamie Foxefd82732018-11-26 10:34:32 +0000213}
Antonio de Angelis8908f472018-08-31 15:44:25 +0100214/*!@}*/