blob: 8d0dc431a4efcd10d98a617e0c272faadbc86855 [file] [log] [blame]
Ashutosh Singhf4d88672017-11-29 13:35:43 +00001/*
Galanakis, Minosecc9de82019-11-20 14:29:44 +00002 * Copyright (c) 2017-2020, 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
Galanakis, Minosecc9de82019-11-20 14:29:44 +000016psa_status_t psa_ps_set(psa_storage_uid_t uid,
17 size_t data_length,
18 const void *p_data,
19 psa_storage_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;
Summer Qindb1448b2019-02-26 11:20:52 +080022 psa_handle_t handle;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010023
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000024 psa_invec in_vec[] = {
25 { .base = &uid, .len = sizeof(uid) },
26 { .base = p_data, .len = data_length },
27 { .base = &create_flags, .len = sizeof(create_flags) }
28 };
29
Edison Aib892dfe2019-06-21 11:28:11 +080030 handle = psa_connect(TFM_SST_SET_SID, TFM_SST_SET_VERSION);
Summer Qinba48ccd2019-07-03 16:31:29 +080031 if (!PSA_HANDLE_IS_VALID(handle)) {
Galanakis, Minosecc9de82019-11-20 14:29:44 +000032 return PSA_ERROR_GENERIC_ERROR;
Summer Qindb1448b2019-02-26 11:20:52 +080033 }
34
Galanakis, Minosecc9de82019-11-20 14:29:44 +000035 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec),
36 NULL, 0);
Summer Qindb1448b2019-02-26 11:20:52 +080037
38 psa_close(handle);
39
Galanakis, Minosecc9de82019-11-20 14:29:44 +000040 /* A parameter with a buffer pointer pointer that has data length longer
41 * than maximum permitted is treated as a secure violation.
42 * TF-M framework rejects the request with TFM_ERROR_INVALID_PARAMETER.
43 */
44 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
45 return PSA_ERROR_INVALID_ARGUMENT;
Summer Qindb1448b2019-02-26 11:20:52 +080046 }
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010047
Galanakis, Minosecc9de82019-11-20 14:29:44 +000048 return status;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000049}
50
Galanakis, Minosecc9de82019-11-20 14:29:44 +000051psa_status_t psa_ps_get(psa_storage_uid_t uid,
52 size_t data_offset,
53 size_t data_size,
54 void *p_data,
55 size_t *p_data_length)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000056{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000057 psa_status_t status;
Summer Qindb1448b2019-02-26 11:20:52 +080058 psa_handle_t handle;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010059
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000060 psa_invec in_vec[] = {
61 { .base = &uid, .len = sizeof(uid) },
62 { .base = &data_offset, .len = sizeof(data_offset) }
63 };
64
65 psa_outvec out_vec[] = {
Galanakis, Minosecc9de82019-11-20 14:29:44 +000066 { .base = p_data, .len = data_size }
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000067 };
68
Galanakis, Minosecc9de82019-11-20 14:29:44 +000069 if (p_data_length == NULL) {
70 return PSA_ERROR_INVALID_ARGUMENT;
71 }
72
Edison Aib892dfe2019-06-21 11:28:11 +080073 handle = psa_connect(TFM_SST_GET_SID, TFM_SST_GET_VERSION);
Summer Qinba48ccd2019-07-03 16:31:29 +080074 if (!PSA_HANDLE_IS_VALID(handle)) {
Galanakis, Minosecc9de82019-11-20 14:29:44 +000075 return PSA_ERROR_GENERIC_ERROR;
Summer Qindb1448b2019-02-26 11:20:52 +080076 }
77
Summer Qin4b1d03b2019-07-02 14:56:08 +080078 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec,
Summer Qindb1448b2019-02-26 11:20:52 +080079 IOVEC_LEN(out_vec));
80
81 psa_close(handle);
82
Galanakis, Minosecc9de82019-11-20 14:29:44 +000083 *p_data_length = out_vec[0].len;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010084
Galanakis, Minosecc9de82019-11-20 14:29:44 +000085 return status;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000086}
87
Galanakis, Minosecc9de82019-11-20 14:29:44 +000088psa_status_t psa_ps_get_info(psa_storage_uid_t uid,
89 struct psa_storage_info_t *p_info)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010090{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000091 psa_status_t status;
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[] = {
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000099 { .base = p_info, .len = sizeof(*p_info) }
100 };
101
Edison Aib892dfe2019-06-21 11:28:11 +0800102 handle = psa_connect(TFM_SST_GET_INFO_SID, TFM_SST_GET_INFO_VERSION);
Summer Qinba48ccd2019-07-03 16:31:29 +0800103 if (!PSA_HANDLE_IS_VALID(handle)) {
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000104 return PSA_ERROR_GENERIC_ERROR;
Summer Qindb1448b2019-02-26 11:20:52 +0800105 }
106
Summer Qin4b1d03b2019-07-02 14:56:08 +0800107 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec,
Summer Qindb1448b2019-02-26 11:20:52 +0800108 IOVEC_LEN(out_vec));
109
110 psa_close(handle);
111
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000112 return status;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100113}
114
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000115psa_status_t psa_ps_remove(psa_storage_uid_t uid)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100116{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000117 psa_status_t status;
Summer Qindb1448b2019-02-26 11:20:52 +0800118 psa_handle_t handle;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100119
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000120 psa_invec in_vec[] = {
121 { .base = &uid, .len = sizeof(uid) }
122 };
123
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000124
Edison Aib892dfe2019-06-21 11:28:11 +0800125 handle = psa_connect(TFM_SST_REMOVE_SID, TFM_SST_REMOVE_VERSION);
Summer Qinba48ccd2019-07-03 16:31:29 +0800126 if (!PSA_HANDLE_IS_VALID(handle)) {
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000127 return PSA_ERROR_GENERIC_ERROR;
Summer Qindb1448b2019-02-26 11:20:52 +0800128 }
129
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000130 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec),
131 NULL, 0);
Summer Qindb1448b2019-02-26 11:20:52 +0800132
133 psa_close(handle);
134
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000135 return status;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100136}
137
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000138psa_status_t psa_ps_create(psa_storage_uid_t uid, size_t size,
139 psa_storage_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000140{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000141 (void)uid;
142 (void)size;
143 (void)create_flags;
144
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000145 return PSA_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000146}
147
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000148psa_status_t psa_ps_set_extended(psa_storage_uid_t uid, size_t data_offset,
149 size_t data_length, const void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000150{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000151 (void)uid;
152 (void)data_offset;
153 (void)data_length;
154 (void)p_data;
155
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000156 return PSA_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000157}
158
Jamie Foxb93da8b2018-12-13 18:27:30 +0000159uint32_t psa_ps_get_support(void)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000160{
Jamie Foxb93da8b2018-12-13 18:27:30 +0000161 /* Initialise support_flags to a sensible default, to avoid returning an
162 * uninitialised value in case the secure function fails.
163 */
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000164 uint32_t support_flags = 0;
Summer Qindb1448b2019-02-26 11:20:52 +0800165 psa_handle_t handle;
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000166
167 psa_outvec out_vec[] = {
168 { .base = &support_flags, .len = sizeof(support_flags) }
169 };
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100170
Jamie Foxb93da8b2018-12-13 18:27:30 +0000171 /* The PSA API does not return an error, so any error from TF-M is
172 * ignored.
173 */
Edison Aib892dfe2019-06-21 11:28:11 +0800174 handle = psa_connect(TFM_SST_GET_SUPPORT_SID, TFM_SST_GET_SUPPORT_VERSION);
Summer Qinba48ccd2019-07-03 16:31:29 +0800175 if (!PSA_HANDLE_IS_VALID(handle)) {
Summer Qindb1448b2019-02-26 11:20:52 +0800176 return support_flags;
177 }
178
Summer Qin4b1d03b2019-07-02 14:56:08 +0800179 (void)psa_call(handle, PSA_IPC_CALL, NULL, 0, out_vec, IOVEC_LEN(out_vec));
Summer Qindb1448b2019-02-26 11:20:52 +0800180
181 psa_close(handle);
Jamie Foxb93da8b2018-12-13 18:27:30 +0000182
183 return support_flags;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000184}