blob: 0da82d0b7c015e223ffd75e99f6c288aaa4dd81c [file] [log] [blame]
Ashutosh Singhf4d88672017-11-29 13:35:43 +00001/*
Jamie Foxb93da8b2018-12-13 18:27:30 +00002 * Copyright (c) 2017-2019, Arm Limited. All rights reserved.
Ashutosh Singhf4d88672017-11-29 13:35:43 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Jamie Foxb93da8b2018-12-13 18:27:30 +00008#include "psa_protected_storage.h"
9
Ashutosh Singhf4d88672017-11-29 13:35:43 +000010#include "tfm_ns_lock.h"
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000011#include "tfm_veneers.h"
Summer Qindb1448b2019-02-26 11:20:52 +080012#include "tfm_sst_defs.h"
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000013
14#define IOVEC_LEN(x) (uint32_t)(sizeof(x)/sizeof(x[0]))
Summer Qindb1448b2019-02-26 11:20:52 +080015/* FixMe: Check if PSA framework header would provide similar macro. */
16#define TFM_PSA_HANDLE_IS_VALID(handle) ((handle) > (psa_handle_t)0)
Mate Toth-Pal261df462018-08-07 12:02:42 +020017
Jamie Foxb93da8b2018-12-13 18:27:30 +000018psa_ps_status_t psa_ps_set(psa_ps_uid_t uid,
19 uint32_t data_length,
20 const void *p_data,
21 psa_ps_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000022{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000023 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +000024 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +080025#ifdef TFM_PSA_API
26 psa_handle_t handle;
27#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010028
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000029 psa_invec in_vec[] = {
30 { .base = &uid, .len = sizeof(uid) },
31 { .base = p_data, .len = data_length },
32 { .base = &create_flags, .len = sizeof(create_flags) }
33 };
34
35 psa_outvec out_vec[] = {
36 { .base = &err , .len = sizeof(err) }
37 };
38
Summer Qindb1448b2019-02-26 11:20:52 +080039#ifdef TFM_PSA_API
40 if (p_data == NULL) {
41 return PSA_PS_ERROR_INVALID_ARGUMENT;
42 }
43
44 handle = psa_connect(TFM_SST_SET_SID, TFM_SST_SET_MIN_VER);
45 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
46 return PSA_PS_ERROR_OPERATION_FAILED;
47 }
48
49 status = psa_call(handle, in_vec, IOVEC_LEN(in_vec), out_vec,
50 IOVEC_LEN(out_vec));
51
52 psa_close(handle);
53
54 if (status != PSA_SUCCESS) {
55 return PSA_PS_ERROR_OPERATION_FAILED;
56 }
57#else
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000058 status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_set_req_veneer,
59 (uint32_t)in_vec, IOVEC_LEN(in_vec),
60 (uint32_t)out_vec, IOVEC_LEN(out_vec));
61 if (status != PSA_SUCCESS) {
62 return PSA_PS_ERROR_OPERATION_FAILED;
63 }
Summer Qindb1448b2019-02-26 11:20:52 +080064#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010065
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +000066 return err;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000067}
68
Jamie Foxb93da8b2018-12-13 18:27:30 +000069psa_ps_status_t psa_ps_get(psa_ps_uid_t uid,
70 uint32_t data_offset,
71 uint32_t data_length,
72 void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000073{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000074 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +000075 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +080076#ifdef TFM_PSA_API
77 psa_handle_t handle;
78#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010079
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000080 psa_invec in_vec[] = {
81 { .base = &uid, .len = sizeof(uid) },
82 { .base = &data_offset, .len = sizeof(data_offset) }
83 };
84
85 psa_outvec out_vec[] = {
86 { .base = &err, .len = sizeof(err) },
87 { .base = p_data, .len = data_length }
88 };
89
Summer Qindb1448b2019-02-26 11:20:52 +080090#ifdef TFM_PSA_API
91 if (p_data == NULL) {
92 return PSA_PS_ERROR_INVALID_ARGUMENT;
93 }
94
95 handle = psa_connect(TFM_SST_GET_SID, TFM_SST_GET_MIN_VER);
96 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
97 return PSA_PS_ERROR_OPERATION_FAILED;
98 }
99
100 status = psa_call(handle, in_vec, IOVEC_LEN(in_vec), out_vec,
101 IOVEC_LEN(out_vec));
102
103 psa_close(handle);
104
105 if (status != PSA_SUCCESS) {
106 return PSA_PS_ERROR_OPERATION_FAILED;
107 }
108#else
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000109 status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_get_req_veneer,
110 (uint32_t)in_vec, IOVEC_LEN(in_vec),
111 (uint32_t)out_vec, IOVEC_LEN(out_vec));
112
113 if (status != PSA_SUCCESS) {
114 return PSA_PS_ERROR_OPERATION_FAILED;
115 }
Summer Qindb1448b2019-02-26 11:20:52 +0800116#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100117
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000118 return err;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000119}
120
Jamie Foxb93da8b2018-12-13 18:27:30 +0000121psa_ps_status_t psa_ps_get_info(psa_ps_uid_t uid, struct psa_ps_info_t *p_info)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100122{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000123 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000124 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +0800125#ifdef TFM_PSA_API
126 psa_handle_t handle;
127#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100128
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000129 psa_invec in_vec[] = {
130 { .base = &uid, .len = sizeof(uid) }
131 };
132
133 psa_outvec out_vec[] = {
134 { .base = &err, .len = sizeof(err) },
135 { .base = p_info, .len = sizeof(*p_info) }
136 };
137
Summer Qindb1448b2019-02-26 11:20:52 +0800138#ifdef TFM_PSA_API
139 handle = psa_connect(TFM_SST_GET_INFO_SID, TFM_SST_GET_INFO_MIN_VER);
140 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
141 return PSA_PS_ERROR_OPERATION_FAILED;
142 }
143
144 status = psa_call(handle, in_vec, IOVEC_LEN(in_vec), out_vec,
145 IOVEC_LEN(out_vec));
146
147 psa_close(handle);
148
149 if (status != PSA_SUCCESS) {
150 return PSA_PS_ERROR_OPERATION_FAILED;
151 }
152#else
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000153 status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_get_info_req_veneer,
154 (uint32_t)in_vec, IOVEC_LEN(in_vec),
155 (uint32_t)out_vec, IOVEC_LEN(out_vec));
156
157 if (status != PSA_SUCCESS) {
158 return PSA_PS_ERROR_OPERATION_FAILED;
159 }
Summer Qindb1448b2019-02-26 11:20:52 +0800160#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100161
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000162 return err;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100163}
164
Jamie Foxb93da8b2018-12-13 18:27:30 +0000165psa_ps_status_t psa_ps_remove(psa_ps_uid_t uid)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100166{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000167 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000168 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +0800169#ifdef TFM_PSA_API
170 psa_handle_t handle;
171#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100172
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000173 psa_invec in_vec[] = {
174 { .base = &uid, .len = sizeof(uid) }
175 };
176
177 psa_outvec out_vec[] = {
178 { .base = &err, .len = sizeof(err) }
179 };
180
Summer Qindb1448b2019-02-26 11:20:52 +0800181#ifdef TFM_PSA_API
182 handle = psa_connect(TFM_SST_REMOVE_SID, TFM_SST_REMOVE_MIN_VER);
183 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
184 return PSA_PS_ERROR_OPERATION_FAILED;
185 }
186
187 status = psa_call(handle, in_vec, IOVEC_LEN(in_vec), out_vec,
188 IOVEC_LEN(out_vec));
189
190 psa_close(handle);
191
192 if (status != PSA_SUCCESS) {
193 return PSA_PS_ERROR_OPERATION_FAILED;
194 }
195#else
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000196 status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_remove_req_veneer,
197 (uint32_t)in_vec, IOVEC_LEN(in_vec),
198 (uint32_t)out_vec, IOVEC_LEN(out_vec));
199
200 if (status != PSA_SUCCESS) {
201 return PSA_PS_ERROR_OPERATION_FAILED;
202 }
Summer Qindb1448b2019-02-26 11:20:52 +0800203#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100204
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000205 return err;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100206}
207
Jamie Foxb93da8b2018-12-13 18:27:30 +0000208psa_ps_status_t psa_ps_create(psa_ps_uid_t uid, uint32_t size,
209 psa_ps_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000210{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000211 (void)uid;
212 (void)size;
213 (void)create_flags;
214
Jamie Foxb93da8b2018-12-13 18:27:30 +0000215 return PSA_PS_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000216}
217
Jamie Foxb93da8b2018-12-13 18:27:30 +0000218psa_ps_status_t psa_ps_set_extended(psa_ps_uid_t uid, uint32_t data_offset,
219 uint32_t data_length, const void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000220{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000221 (void)uid;
222 (void)data_offset;
223 (void)data_length;
224 (void)p_data;
225
Jamie Foxb93da8b2018-12-13 18:27:30 +0000226 return PSA_PS_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000227}
228
Jamie Foxb93da8b2018-12-13 18:27:30 +0000229uint32_t psa_ps_get_support(void)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000230{
Jamie Foxb93da8b2018-12-13 18:27:30 +0000231 /* Initialise support_flags to a sensible default, to avoid returning an
232 * uninitialised value in case the secure function fails.
233 */
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000234 uint32_t support_flags = 0;
Summer Qindb1448b2019-02-26 11:20:52 +0800235#ifdef TFM_PSA_API
236 psa_handle_t handle;
237#endif
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000238
239 psa_outvec out_vec[] = {
240 { .base = &support_flags, .len = sizeof(support_flags) }
241 };
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100242
Jamie Foxb93da8b2018-12-13 18:27:30 +0000243 /* The PSA API does not return an error, so any error from TF-M is
244 * ignored.
245 */
Summer Qindb1448b2019-02-26 11:20:52 +0800246#ifdef TFM_PSA_API
247 handle = psa_connect(TFM_SST_GET_SUPPORT_SID, TFM_SST_GET_SUPPORT_MIN_VER);
248 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
249 return support_flags;
250 }
251
252 (void)psa_call(handle, NULL, 0, out_vec, IOVEC_LEN(out_vec));
253
254 psa_close(handle);
255#else
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000256 (void)tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_get_support_req_veneer,
257 (uint32_t)NULL, 0,
258 (uint32_t)out_vec, IOVEC_LEN(out_vec));
Summer Qindb1448b2019-02-26 11:20:52 +0800259#endif
Jamie Foxb93da8b2018-12-13 18:27:30 +0000260
261 return support_flags;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000262}