blob: a9e40f8f1abbe2108e3df84cdb8b0aec04420824 [file] [log] [blame]
Ashutosh Singhf4d88672017-11-29 13:35:43 +00001/*
David Vincze6ec7c652025-03-07 17:46:28 +00002 * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
Ashutosh Singhf4d88672017-11-29 13:35:43 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08008#include "psa/client.h"
Jamie Foxcc31d402019-01-28 17:13:52 +00009#include "psa/protected_storage.h"
Edison Aib892dfe2019-06-21 11:28:11 +080010#include "psa_manifest/sid.h"
Shawn Shan7936dbd2021-07-07 15:25:56 +080011#include "tfm_ps_defs.h"
Mate Toth-Pal261df462018-08-07 12:02:42 +020012
David Vincze6ec7c652025-03-07 17:46:28 +000013struct rot_psa_ps_storage_info_t {
14 rot_size_t capacity;
15 rot_size_t size;
16 psa_storage_create_flags_t flags;
17};
18
Galanakis, Minosecc9de82019-11-20 14:29:44 +000019psa_status_t psa_ps_set(psa_storage_uid_t uid,
20 size_t data_length,
21 const void *p_data,
22 psa_storage_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000023{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000024 psa_status_t status;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010025
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000026 psa_invec in_vec[] = {
27 { .base = &uid, .len = sizeof(uid) },
28 { .base = p_data, .len = data_length },
29 { .base = &create_flags, .len = sizeof(create_flags) }
30 };
31
Shawn Shan7936dbd2021-07-07 15:25:56 +080032 status = psa_call(TFM_PROTECTED_STORAGE_SERVICE_HANDLE, TFM_PS_SET, in_vec,
33 IOVEC_LEN(in_vec), NULL, 0);
Summer Qindb1448b2019-02-26 11:20:52 +080034
Galanakis, Minosecc9de82019-11-20 14:29:44 +000035 return status;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000036}
37
Galanakis, Minosecc9de82019-11-20 14:29:44 +000038psa_status_t psa_ps_get(psa_storage_uid_t uid,
39 size_t data_offset,
40 size_t data_size,
41 void *p_data,
42 size_t *p_data_length)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000043{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000044 psa_status_t status;
David Vincze6ec7c652025-03-07 17:46:28 +000045 rot_size_t data_offset_param;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010046
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000047 psa_invec in_vec[] = {
48 { .base = &uid, .len = sizeof(uid) },
David Vincze6ec7c652025-03-07 17:46:28 +000049 { .base = &data_offset_param, .len = sizeof(data_offset_param) }
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000050 };
51
52 psa_outvec out_vec[] = {
Galanakis, Minosecc9de82019-11-20 14:29:44 +000053 { .base = p_data, .len = data_size }
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000054 };
55
David Vincze6ec7c652025-03-07 17:46:28 +000056 if (data_offset > ROT_SIZE_MAX) {
57 return PSA_ERROR_INVALID_ARGUMENT;
58 }
59 data_offset_param = (rot_size_t)data_offset;
60
Galanakis, Minosecc9de82019-11-20 14:29:44 +000061 if (p_data_length == NULL) {
62 return PSA_ERROR_INVALID_ARGUMENT;
63 }
64
Shawn Shan7936dbd2021-07-07 15:25:56 +080065 status = psa_call(TFM_PROTECTED_STORAGE_SERVICE_HANDLE, TFM_PS_GET, in_vec,
66 IOVEC_LEN(in_vec), out_vec, IOVEC_LEN(out_vec));
Summer Qindb1448b2019-02-26 11:20:52 +080067
Galanakis, Minosecc9de82019-11-20 14:29:44 +000068 *p_data_length = out_vec[0].len;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010069
Galanakis, Minosecc9de82019-11-20 14:29:44 +000070 return status;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000071}
72
Galanakis, Minosecc9de82019-11-20 14:29:44 +000073psa_status_t psa_ps_get_info(psa_storage_uid_t uid,
74 struct psa_storage_info_t *p_info)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010075{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000076 psa_status_t status;
David Vincze6ec7c652025-03-07 17:46:28 +000077 struct rot_psa_ps_storage_info_t info_param = {0};
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 };
82
83 psa_outvec out_vec[] = {
David Vincze6ec7c652025-03-07 17:46:28 +000084 { .base = &info_param, .len = sizeof(info_param) }
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000085 };
86
David Vincze6ec7c652025-03-07 17:46:28 +000087 if (p_info == NULL) {
88 return PSA_ERROR_INVALID_ARGUMENT;
89 }
90
Shawn Shan7936dbd2021-07-07 15:25:56 +080091 status = psa_call(TFM_PROTECTED_STORAGE_SERVICE_HANDLE, TFM_PS_GET_INFO,
92 in_vec, IOVEC_LEN(in_vec), out_vec, IOVEC_LEN(out_vec));
Summer Qindb1448b2019-02-26 11:20:52 +080093
David Vincze6ec7c652025-03-07 17:46:28 +000094 p_info->capacity = info_param.capacity;
95 p_info->size = info_param.size;
96 p_info->flags = info_param.flags;
97
Galanakis, Minosecc9de82019-11-20 14:29:44 +000098 return status;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010099}
100
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000101psa_status_t psa_ps_remove(psa_storage_uid_t uid)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100102{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000103 psa_status_t status;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100104
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000105 psa_invec in_vec[] = {
106 { .base = &uid, .len = sizeof(uid) }
107 };
108
Shawn Shan7936dbd2021-07-07 15:25:56 +0800109 status = psa_call(TFM_PROTECTED_STORAGE_SERVICE_HANDLE, TFM_PS_REMOVE,
110 in_vec, IOVEC_LEN(in_vec), NULL, 0);
Summer Qindb1448b2019-02-26 11:20:52 +0800111
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_create(psa_storage_uid_t uid, size_t size,
116 psa_storage_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000117{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000118 (void)uid;
119 (void)size;
120 (void)create_flags;
121
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000122 return PSA_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000123}
124
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000125psa_status_t psa_ps_set_extended(psa_storage_uid_t uid, size_t data_offset,
126 size_t data_length, const void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000127{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000128 (void)uid;
129 (void)data_offset;
130 (void)data_length;
131 (void)p_data;
132
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000133 return PSA_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000134}
135
Jamie Foxb93da8b2018-12-13 18:27:30 +0000136uint32_t psa_ps_get_support(void)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000137{
Jamie Foxb93da8b2018-12-13 18:27:30 +0000138 /* Initialise support_flags to a sensible default, to avoid returning an
139 * uninitialised value in case the secure function fails.
140 */
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000141 uint32_t support_flags = 0;
142
143 psa_outvec out_vec[] = {
144 { .base = &support_flags, .len = sizeof(support_flags) }
145 };
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100146
Jamie Foxb93da8b2018-12-13 18:27:30 +0000147 /* The PSA API does not return an error, so any error from TF-M is
148 * ignored.
149 */
Shawn Shan7936dbd2021-07-07 15:25:56 +0800150 (void)psa_call(TFM_PROTECTED_STORAGE_SERVICE_HANDLE, TFM_PS_GET_SUPPORT,
151 NULL, 0, out_vec, IOVEC_LEN(out_vec));
Jamie Foxb93da8b2018-12-13 18:27:30 +0000152
153 return support_flags;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000154}