blob: 9ef95ff49942f4673933ea1a2e88e7c405658807 [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#include "psa_manifest/sid.h"
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000013
14#define IOVEC_LEN(x) (uint32_t)(sizeof(x)/sizeof(x[0]))
Mate Toth-Pal261df462018-08-07 12:02:42 +020015
Jamie Foxb93da8b2018-12-13 18:27:30 +000016psa_ps_status_t psa_ps_set(psa_ps_uid_t uid,
17 uint32_t data_length,
18 const void *p_data,
19 psa_ps_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000020{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000021 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +000022 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +080023 psa_handle_t handle;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010024
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000025 psa_invec in_vec[] = {
26 { .base = &uid, .len = sizeof(uid) },
27 { .base = p_data, .len = data_length },
28 { .base = &create_flags, .len = sizeof(create_flags) }
29 };
30
31 psa_outvec out_vec[] = {
32 { .base = &err , .len = sizeof(err) }
33 };
34
Edison Aib892dfe2019-06-21 11:28:11 +080035 handle = psa_connect(TFM_SST_SET_SID, TFM_SST_SET_VERSION);
Summer Qinba48ccd2019-07-03 16:31:29 +080036 if (!PSA_HANDLE_IS_VALID(handle)) {
Summer Qindb1448b2019-02-26 11:20:52 +080037 return PSA_PS_ERROR_OPERATION_FAILED;
38 }
39
Summer Qin4b1d03b2019-07-02 14:56:08 +080040 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec,
Summer Qindb1448b2019-02-26 11:20:52 +080041 IOVEC_LEN(out_vec));
42
43 psa_close(handle);
44
45 if (status != PSA_SUCCESS) {
46 return PSA_PS_ERROR_OPERATION_FAILED;
47 }
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010048
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +000049 return err;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000050}
51
Jamie Foxb93da8b2018-12-13 18:27:30 +000052psa_ps_status_t psa_ps_get(psa_ps_uid_t uid,
53 uint32_t data_offset,
54 uint32_t data_length,
55 void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000056{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000057 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +000058 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +080059 psa_handle_t handle;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010060
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000061 psa_invec in_vec[] = {
62 { .base = &uid, .len = sizeof(uid) },
63 { .base = &data_offset, .len = sizeof(data_offset) }
64 };
65
66 psa_outvec out_vec[] = {
67 { .base = &err, .len = sizeof(err) },
68 { .base = p_data, .len = data_length }
69 };
70
Edison Aib892dfe2019-06-21 11:28:11 +080071 handle = psa_connect(TFM_SST_GET_SID, TFM_SST_GET_VERSION);
Summer Qinba48ccd2019-07-03 16:31:29 +080072 if (!PSA_HANDLE_IS_VALID(handle)) {
Summer Qindb1448b2019-02-26 11:20:52 +080073 return PSA_PS_ERROR_OPERATION_FAILED;
74 }
75
Summer Qin4b1d03b2019-07-02 14:56:08 +080076 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec,
Summer Qindb1448b2019-02-26 11:20:52 +080077 IOVEC_LEN(out_vec));
78
79 psa_close(handle);
80
81 if (status != PSA_SUCCESS) {
82 return PSA_PS_ERROR_OPERATION_FAILED;
83 }
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010084
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +000085 return err;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000086}
87
Jamie Foxb93da8b2018-12-13 18:27:30 +000088psa_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 +010089{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000090 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +000091 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +080092 psa_handle_t handle;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010093
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000094 psa_invec in_vec[] = {
95 { .base = &uid, .len = sizeof(uid) }
96 };
97
98 psa_outvec out_vec[] = {
99 { .base = &err, .len = sizeof(err) },
100 { .base = p_info, .len = sizeof(*p_info) }
101 };
102
Edison Aib892dfe2019-06-21 11:28:11 +0800103 handle = psa_connect(TFM_SST_GET_INFO_SID, TFM_SST_GET_INFO_VERSION);
Summer Qinba48ccd2019-07-03 16:31:29 +0800104 if (!PSA_HANDLE_IS_VALID(handle)) {
Summer Qindb1448b2019-02-26 11:20:52 +0800105 return PSA_PS_ERROR_OPERATION_FAILED;
106 }
107
Summer Qin4b1d03b2019-07-02 14:56:08 +0800108 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec,
Summer Qindb1448b2019-02-26 11:20:52 +0800109 IOVEC_LEN(out_vec));
110
111 psa_close(handle);
112
113 if (status != PSA_SUCCESS) {
114 return PSA_PS_ERROR_OPERATION_FAILED;
115 }
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100116
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000117 return err;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100118}
119
Jamie Foxb93da8b2018-12-13 18:27:30 +0000120psa_ps_status_t psa_ps_remove(psa_ps_uid_t uid)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100121{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000122 psa_status_t status;
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000123 psa_ps_status_t err;
Summer Qindb1448b2019-02-26 11:20:52 +0800124 psa_handle_t handle;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100125
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000126 psa_invec in_vec[] = {
127 { .base = &uid, .len = sizeof(uid) }
128 };
129
130 psa_outvec out_vec[] = {
131 { .base = &err, .len = sizeof(err) }
132 };
133
Edison Aib892dfe2019-06-21 11:28:11 +0800134 handle = psa_connect(TFM_SST_REMOVE_SID, TFM_SST_REMOVE_VERSION);
Summer Qinba48ccd2019-07-03 16:31:29 +0800135 if (!PSA_HANDLE_IS_VALID(handle)) {
Summer Qindb1448b2019-02-26 11:20:52 +0800136 return PSA_PS_ERROR_OPERATION_FAILED;
137 }
138
Summer Qin4b1d03b2019-07-02 14:56:08 +0800139 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec,
Summer Qindb1448b2019-02-26 11:20:52 +0800140 IOVEC_LEN(out_vec));
141
142 psa_close(handle);
143
144 if (status != PSA_SUCCESS) {
145 return PSA_PS_ERROR_OPERATION_FAILED;
146 }
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100147
Marc Moreno Berengue15d8a312019-01-25 14:35:52 +0000148 return err;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100149}
150
Jamie Foxb93da8b2018-12-13 18:27:30 +0000151psa_ps_status_t psa_ps_create(psa_ps_uid_t uid, uint32_t size,
152 psa_ps_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000153{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000154 (void)uid;
155 (void)size;
156 (void)create_flags;
157
Jamie Foxb93da8b2018-12-13 18:27:30 +0000158 return PSA_PS_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000159}
160
Jamie Foxb93da8b2018-12-13 18:27:30 +0000161psa_ps_status_t psa_ps_set_extended(psa_ps_uid_t uid, uint32_t data_offset,
162 uint32_t data_length, const void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000163{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000164 (void)uid;
165 (void)data_offset;
166 (void)data_length;
167 (void)p_data;
168
Jamie Foxb93da8b2018-12-13 18:27:30 +0000169 return PSA_PS_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000170}
171
Jamie Foxb93da8b2018-12-13 18:27:30 +0000172uint32_t psa_ps_get_support(void)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000173{
Jamie Foxb93da8b2018-12-13 18:27:30 +0000174 /* Initialise support_flags to a sensible default, to avoid returning an
175 * uninitialised value in case the secure function fails.
176 */
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000177 uint32_t support_flags = 0;
Summer Qindb1448b2019-02-26 11:20:52 +0800178 psa_handle_t handle;
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000179
180 psa_outvec out_vec[] = {
181 { .base = &support_flags, .len = sizeof(support_flags) }
182 };
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100183
Jamie Foxb93da8b2018-12-13 18:27:30 +0000184 /* The PSA API does not return an error, so any error from TF-M is
185 * ignored.
186 */
Edison Aib892dfe2019-06-21 11:28:11 +0800187 handle = psa_connect(TFM_SST_GET_SUPPORT_SID, TFM_SST_GET_SUPPORT_VERSION);
Summer Qinba48ccd2019-07-03 16:31:29 +0800188 if (!PSA_HANDLE_IS_VALID(handle)) {
Summer Qindb1448b2019-02-26 11:20:52 +0800189 return support_flags;
190 }
191
Summer Qin4b1d03b2019-07-02 14:56:08 +0800192 (void)psa_call(handle, PSA_IPC_CALL, NULL, 0, out_vec, IOVEC_LEN(out_vec));
Summer Qindb1448b2019-02-26 11:20:52 +0800193
194 psa_close(handle);
Jamie Foxb93da8b2018-12-13 18:27:30 +0000195
196 return support_flags;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000197}