blob: 34d19fe238b97f1351f33f7d03bab8649b55e921 [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 Foxcc31d402019-01-28 17:13:52 +00008#include "psa/protected_storage.h"
Jamie Foxb93da8b2018-12-13 18:27:30 +00009
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
Summer Qindb1448b2019-02-26 11:20:52 +080040 handle = psa_connect(TFM_SST_SET_SID, TFM_SST_SET_MIN_VER);
41 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
42 return PSA_PS_ERROR_OPERATION_FAILED;
43 }
44
45 status = psa_call(handle, in_vec, IOVEC_LEN(in_vec), out_vec,
46 IOVEC_LEN(out_vec));
47
48 psa_close(handle);
49
50 if (status != PSA_SUCCESS) {
51 return PSA_PS_ERROR_OPERATION_FAILED;
52 }
53#else
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000054 status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_set_req_veneer,
55 (uint32_t)in_vec, IOVEC_LEN(in_vec),
56 (uint32_t)out_vec, IOVEC_LEN(out_vec));
57 if (status != PSA_SUCCESS) {
58 return PSA_PS_ERROR_OPERATION_FAILED;
59 }
Summer Qindb1448b2019-02-26 11:20:52 +080060#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010061
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +000062 return err;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000063}
64
Jamie Foxb93da8b2018-12-13 18:27:30 +000065psa_ps_status_t psa_ps_get(psa_ps_uid_t uid,
66 uint32_t data_offset,
67 uint32_t data_length,
68 void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000069{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000070 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +000071 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +080072#ifdef TFM_PSA_API
73 psa_handle_t handle;
74#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010075
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000076 psa_invec in_vec[] = {
77 { .base = &uid, .len = sizeof(uid) },
78 { .base = &data_offset, .len = sizeof(data_offset) }
79 };
80
81 psa_outvec out_vec[] = {
82 { .base = &err, .len = sizeof(err) },
83 { .base = p_data, .len = data_length }
84 };
85
Summer Qindb1448b2019-02-26 11:20:52 +080086#ifdef TFM_PSA_API
Summer Qindb1448b2019-02-26 11:20:52 +080087 handle = psa_connect(TFM_SST_GET_SID, TFM_SST_GET_MIN_VER);
88 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
89 return PSA_PS_ERROR_OPERATION_FAILED;
90 }
91
92 status = psa_call(handle, in_vec, IOVEC_LEN(in_vec), out_vec,
93 IOVEC_LEN(out_vec));
94
95 psa_close(handle);
96
97 if (status != PSA_SUCCESS) {
98 return PSA_PS_ERROR_OPERATION_FAILED;
99 }
100#else
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000101 status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_get_req_veneer,
102 (uint32_t)in_vec, IOVEC_LEN(in_vec),
103 (uint32_t)out_vec, IOVEC_LEN(out_vec));
104
105 if (status != PSA_SUCCESS) {
106 return PSA_PS_ERROR_OPERATION_FAILED;
107 }
Summer Qindb1448b2019-02-26 11:20:52 +0800108#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100109
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000110 return err;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000111}
112
Jamie Foxb93da8b2018-12-13 18:27:30 +0000113psa_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 +0100114{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000115 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000116 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +0800117#ifdef TFM_PSA_API
118 psa_handle_t handle;
119#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100120
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000121 psa_invec in_vec[] = {
122 { .base = &uid, .len = sizeof(uid) }
123 };
124
125 psa_outvec out_vec[] = {
126 { .base = &err, .len = sizeof(err) },
127 { .base = p_info, .len = sizeof(*p_info) }
128 };
129
Summer Qindb1448b2019-02-26 11:20:52 +0800130#ifdef TFM_PSA_API
131 handle = psa_connect(TFM_SST_GET_INFO_SID, TFM_SST_GET_INFO_MIN_VER);
132 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
133 return PSA_PS_ERROR_OPERATION_FAILED;
134 }
135
136 status = psa_call(handle, in_vec, IOVEC_LEN(in_vec), out_vec,
137 IOVEC_LEN(out_vec));
138
139 psa_close(handle);
140
141 if (status != PSA_SUCCESS) {
142 return PSA_PS_ERROR_OPERATION_FAILED;
143 }
144#else
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000145 status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_get_info_req_veneer,
146 (uint32_t)in_vec, IOVEC_LEN(in_vec),
147 (uint32_t)out_vec, IOVEC_LEN(out_vec));
148
149 if (status != PSA_SUCCESS) {
150 return PSA_PS_ERROR_OPERATION_FAILED;
151 }
Summer Qindb1448b2019-02-26 11:20:52 +0800152#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100153
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000154 return err;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100155}
156
Jamie Foxb93da8b2018-12-13 18:27:30 +0000157psa_ps_status_t psa_ps_remove(psa_ps_uid_t uid)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100158{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000159 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000160 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +0800161#ifdef TFM_PSA_API
162 psa_handle_t handle;
163#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100164
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000165 psa_invec in_vec[] = {
166 { .base = &uid, .len = sizeof(uid) }
167 };
168
169 psa_outvec out_vec[] = {
170 { .base = &err, .len = sizeof(err) }
171 };
172
Summer Qindb1448b2019-02-26 11:20:52 +0800173#ifdef TFM_PSA_API
174 handle = psa_connect(TFM_SST_REMOVE_SID, TFM_SST_REMOVE_MIN_VER);
175 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
176 return PSA_PS_ERROR_OPERATION_FAILED;
177 }
178
179 status = psa_call(handle, in_vec, IOVEC_LEN(in_vec), out_vec,
180 IOVEC_LEN(out_vec));
181
182 psa_close(handle);
183
184 if (status != PSA_SUCCESS) {
185 return PSA_PS_ERROR_OPERATION_FAILED;
186 }
187#else
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000188 status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_remove_req_veneer,
189 (uint32_t)in_vec, IOVEC_LEN(in_vec),
190 (uint32_t)out_vec, IOVEC_LEN(out_vec));
191
192 if (status != PSA_SUCCESS) {
193 return PSA_PS_ERROR_OPERATION_FAILED;
194 }
Summer Qindb1448b2019-02-26 11:20:52 +0800195#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100196
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000197 return err;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100198}
199
Jamie Foxb93da8b2018-12-13 18:27:30 +0000200psa_ps_status_t psa_ps_create(psa_ps_uid_t uid, uint32_t size,
201 psa_ps_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000202{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000203 (void)uid;
204 (void)size;
205 (void)create_flags;
206
Jamie Foxb93da8b2018-12-13 18:27:30 +0000207 return PSA_PS_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000208}
209
Jamie Foxb93da8b2018-12-13 18:27:30 +0000210psa_ps_status_t psa_ps_set_extended(psa_ps_uid_t uid, uint32_t data_offset,
211 uint32_t data_length, const void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000212{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000213 (void)uid;
214 (void)data_offset;
215 (void)data_length;
216 (void)p_data;
217
Jamie Foxb93da8b2018-12-13 18:27:30 +0000218 return PSA_PS_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000219}
220
Jamie Foxb93da8b2018-12-13 18:27:30 +0000221uint32_t psa_ps_get_support(void)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000222{
Jamie Foxb93da8b2018-12-13 18:27:30 +0000223 /* Initialise support_flags to a sensible default, to avoid returning an
224 * uninitialised value in case the secure function fails.
225 */
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000226 uint32_t support_flags = 0;
Summer Qindb1448b2019-02-26 11:20:52 +0800227#ifdef TFM_PSA_API
228 psa_handle_t handle;
229#endif
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000230
231 psa_outvec out_vec[] = {
232 { .base = &support_flags, .len = sizeof(support_flags) }
233 };
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100234
Jamie Foxb93da8b2018-12-13 18:27:30 +0000235 /* The PSA API does not return an error, so any error from TF-M is
236 * ignored.
237 */
Summer Qindb1448b2019-02-26 11:20:52 +0800238#ifdef TFM_PSA_API
239 handle = psa_connect(TFM_SST_GET_SUPPORT_SID, TFM_SST_GET_SUPPORT_MIN_VER);
240 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
241 return support_flags;
242 }
243
244 (void)psa_call(handle, NULL, 0, out_vec, IOVEC_LEN(out_vec));
245
246 psa_close(handle);
247#else
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000248 (void)tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_get_support_req_veneer,
249 (uint32_t)NULL, 0,
250 (uint32_t)out_vec, IOVEC_LEN(out_vec));
Summer Qindb1448b2019-02-26 11:20:52 +0800251#endif
Jamie Foxb93da8b2018-12-13 18:27:30 +0000252
253 return support_flags;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000254}