blob: c7796d0a844148c65a10bbe4cc86ed10a6da09d4 [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
Antonio de Angelis05b24192019-07-04 15:28:46 +010010#include "tfm_ns_interface.h"
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000011#include "tfm_veneers.h"
Edison Aib892dfe2019-06-21 11:28:11 +080012#ifdef TFM_PSA_API
13#include "psa_manifest/sid.h"
14#endif
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000015
16#define IOVEC_LEN(x) (uint32_t)(sizeof(x)/sizeof(x[0]))
Summer Qindb1448b2019-02-26 11:20:52 +080017/* FixMe: Check if PSA framework header would provide similar macro. */
18#define TFM_PSA_HANDLE_IS_VALID(handle) ((handle) > (psa_handle_t)0)
Mate Toth-Pal261df462018-08-07 12:02:42 +020019
Jamie Foxb93da8b2018-12-13 18:27:30 +000020psa_ps_status_t psa_ps_set(psa_ps_uid_t uid,
21 uint32_t data_length,
22 const void *p_data,
23 psa_ps_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000024{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000025 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +000026 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +080027#ifdef TFM_PSA_API
28 psa_handle_t handle;
29#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010030
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000031 psa_invec in_vec[] = {
32 { .base = &uid, .len = sizeof(uid) },
33 { .base = p_data, .len = data_length },
34 { .base = &create_flags, .len = sizeof(create_flags) }
35 };
36
37 psa_outvec out_vec[] = {
38 { .base = &err , .len = sizeof(err) }
39 };
40
Summer Qindb1448b2019-02-26 11:20:52 +080041#ifdef TFM_PSA_API
Edison Aib892dfe2019-06-21 11:28:11 +080042 handle = psa_connect(TFM_SST_SET_SID, TFM_SST_SET_VERSION);
Summer Qindb1448b2019-02-26 11:20:52 +080043 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
44 return PSA_PS_ERROR_OPERATION_FAILED;
45 }
46
Summer Qin4b1d03b2019-07-02 14:56:08 +080047 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec,
Summer Qindb1448b2019-02-26 11:20:52 +080048 IOVEC_LEN(out_vec));
49
50 psa_close(handle);
51
52 if (status != PSA_SUCCESS) {
53 return PSA_PS_ERROR_OPERATION_FAILED;
54 }
55#else
Antonio de Angelis05b24192019-07-04 15:28:46 +010056 status = tfm_ns_interface_dispatch(
57 (veneer_fn)tfm_tfm_sst_set_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000058 (uint32_t)in_vec, IOVEC_LEN(in_vec),
59 (uint32_t)out_vec, IOVEC_LEN(out_vec));
60 if (status != PSA_SUCCESS) {
61 return PSA_PS_ERROR_OPERATION_FAILED;
62 }
Summer Qindb1448b2019-02-26 11:20:52 +080063#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010064
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +000065 return err;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000066}
67
Jamie Foxb93da8b2018-12-13 18:27:30 +000068psa_ps_status_t psa_ps_get(psa_ps_uid_t uid,
69 uint32_t data_offset,
70 uint32_t data_length,
71 void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000072{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000073 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +000074 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +080075#ifdef TFM_PSA_API
76 psa_handle_t handle;
77#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010078
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000079 psa_invec in_vec[] = {
80 { .base = &uid, .len = sizeof(uid) },
81 { .base = &data_offset, .len = sizeof(data_offset) }
82 };
83
84 psa_outvec out_vec[] = {
85 { .base = &err, .len = sizeof(err) },
86 { .base = p_data, .len = data_length }
87 };
88
Summer Qindb1448b2019-02-26 11:20:52 +080089#ifdef TFM_PSA_API
Edison Aib892dfe2019-06-21 11:28:11 +080090 handle = psa_connect(TFM_SST_GET_SID, TFM_SST_GET_VERSION);
Summer Qindb1448b2019-02-26 11:20:52 +080091 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
92 return PSA_PS_ERROR_OPERATION_FAILED;
93 }
94
Summer Qin4b1d03b2019-07-02 14:56:08 +080095 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec,
Summer Qindb1448b2019-02-26 11:20:52 +080096 IOVEC_LEN(out_vec));
97
98 psa_close(handle);
99
100 if (status != PSA_SUCCESS) {
101 return PSA_PS_ERROR_OPERATION_FAILED;
102 }
103#else
Antonio de Angelis05b24192019-07-04 15:28:46 +0100104 status = tfm_ns_interface_dispatch(
105 (veneer_fn)tfm_tfm_sst_get_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000106 (uint32_t)in_vec, IOVEC_LEN(in_vec),
107 (uint32_t)out_vec, IOVEC_LEN(out_vec));
108
109 if (status != PSA_SUCCESS) {
110 return PSA_PS_ERROR_OPERATION_FAILED;
111 }
Summer Qindb1448b2019-02-26 11:20:52 +0800112#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100113
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000114 return err;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000115}
116
Jamie Foxb93da8b2018-12-13 18:27:30 +0000117psa_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 +0100118{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000119 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000120 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +0800121#ifdef TFM_PSA_API
122 psa_handle_t handle;
123#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100124
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000125 psa_invec in_vec[] = {
126 { .base = &uid, .len = sizeof(uid) }
127 };
128
129 psa_outvec out_vec[] = {
130 { .base = &err, .len = sizeof(err) },
131 { .base = p_info, .len = sizeof(*p_info) }
132 };
133
Summer Qindb1448b2019-02-26 11:20:52 +0800134#ifdef TFM_PSA_API
Edison Aib892dfe2019-06-21 11:28:11 +0800135 handle = psa_connect(TFM_SST_GET_INFO_SID, TFM_SST_GET_INFO_VERSION);
Summer Qindb1448b2019-02-26 11:20:52 +0800136 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
137 return PSA_PS_ERROR_OPERATION_FAILED;
138 }
139
Summer Qin4b1d03b2019-07-02 14:56:08 +0800140 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec,
Summer Qindb1448b2019-02-26 11:20:52 +0800141 IOVEC_LEN(out_vec));
142
143 psa_close(handle);
144
145 if (status != PSA_SUCCESS) {
146 return PSA_PS_ERROR_OPERATION_FAILED;
147 }
148#else
Antonio de Angelis05b24192019-07-04 15:28:46 +0100149 status = tfm_ns_interface_dispatch(
150 (veneer_fn)tfm_tfm_sst_get_info_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000151 (uint32_t)in_vec, IOVEC_LEN(in_vec),
152 (uint32_t)out_vec, IOVEC_LEN(out_vec));
153
154 if (status != PSA_SUCCESS) {
155 return PSA_PS_ERROR_OPERATION_FAILED;
156 }
Summer Qindb1448b2019-02-26 11:20:52 +0800157#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100158
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000159 return err;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100160}
161
Jamie Foxb93da8b2018-12-13 18:27:30 +0000162psa_ps_status_t psa_ps_remove(psa_ps_uid_t uid)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100163{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000164 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000165 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +0800166#ifdef TFM_PSA_API
167 psa_handle_t handle;
168#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100169
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000170 psa_invec in_vec[] = {
171 { .base = &uid, .len = sizeof(uid) }
172 };
173
174 psa_outvec out_vec[] = {
175 { .base = &err, .len = sizeof(err) }
176 };
177
Summer Qindb1448b2019-02-26 11:20:52 +0800178#ifdef TFM_PSA_API
Edison Aib892dfe2019-06-21 11:28:11 +0800179 handle = psa_connect(TFM_SST_REMOVE_SID, TFM_SST_REMOVE_VERSION);
Summer Qindb1448b2019-02-26 11:20:52 +0800180 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
181 return PSA_PS_ERROR_OPERATION_FAILED;
182 }
183
Summer Qin4b1d03b2019-07-02 14:56:08 +0800184 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec,
Summer Qindb1448b2019-02-26 11:20:52 +0800185 IOVEC_LEN(out_vec));
186
187 psa_close(handle);
188
189 if (status != PSA_SUCCESS) {
190 return PSA_PS_ERROR_OPERATION_FAILED;
191 }
192#else
Antonio de Angelis05b24192019-07-04 15:28:46 +0100193 status = tfm_ns_interface_dispatch(
194 (veneer_fn)tfm_tfm_sst_remove_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000195 (uint32_t)in_vec, IOVEC_LEN(in_vec),
196 (uint32_t)out_vec, IOVEC_LEN(out_vec));
197
198 if (status != PSA_SUCCESS) {
199 return PSA_PS_ERROR_OPERATION_FAILED;
200 }
Summer Qindb1448b2019-02-26 11:20:52 +0800201#endif
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100202
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000203 return err;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100204}
205
Jamie Foxb93da8b2018-12-13 18:27:30 +0000206psa_ps_status_t psa_ps_create(psa_ps_uid_t uid, uint32_t size,
207 psa_ps_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000208{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000209 (void)uid;
210 (void)size;
211 (void)create_flags;
212
Jamie Foxb93da8b2018-12-13 18:27:30 +0000213 return PSA_PS_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000214}
215
Jamie Foxb93da8b2018-12-13 18:27:30 +0000216psa_ps_status_t psa_ps_set_extended(psa_ps_uid_t uid, uint32_t data_offset,
217 uint32_t data_length, const void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000218{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000219 (void)uid;
220 (void)data_offset;
221 (void)data_length;
222 (void)p_data;
223
Jamie Foxb93da8b2018-12-13 18:27:30 +0000224 return PSA_PS_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000225}
226
Jamie Foxb93da8b2018-12-13 18:27:30 +0000227uint32_t psa_ps_get_support(void)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000228{
Jamie Foxb93da8b2018-12-13 18:27:30 +0000229 /* Initialise support_flags to a sensible default, to avoid returning an
230 * uninitialised value in case the secure function fails.
231 */
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000232 uint32_t support_flags = 0;
Summer Qindb1448b2019-02-26 11:20:52 +0800233#ifdef TFM_PSA_API
234 psa_handle_t handle;
235#endif
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000236
237 psa_outvec out_vec[] = {
238 { .base = &support_flags, .len = sizeof(support_flags) }
239 };
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100240
Jamie Foxb93da8b2018-12-13 18:27:30 +0000241 /* The PSA API does not return an error, so any error from TF-M is
242 * ignored.
243 */
Summer Qindb1448b2019-02-26 11:20:52 +0800244#ifdef TFM_PSA_API
Edison Aib892dfe2019-06-21 11:28:11 +0800245 handle = psa_connect(TFM_SST_GET_SUPPORT_SID, TFM_SST_GET_SUPPORT_VERSION);
Summer Qindb1448b2019-02-26 11:20:52 +0800246 if (!TFM_PSA_HANDLE_IS_VALID(handle)) {
247 return support_flags;
248 }
249
Summer Qin4b1d03b2019-07-02 14:56:08 +0800250 (void)psa_call(handle, PSA_IPC_CALL, NULL, 0, out_vec, IOVEC_LEN(out_vec));
Summer Qindb1448b2019-02-26 11:20:52 +0800251
252 psa_close(handle);
253#else
Antonio de Angelis05b24192019-07-04 15:28:46 +0100254 (void)tfm_ns_interface_dispatch(
255 (veneer_fn)tfm_tfm_sst_get_support_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000256 (uint32_t)NULL, 0,
257 (uint32_t)out_vec, IOVEC_LEN(out_vec));
Summer Qindb1448b2019-02-26 11:20:52 +0800258#endif
Jamie Foxb93da8b2018-12-13 18:27:30 +0000259
260 return support_flags;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000261}