blob: 9488bdc98ba2d1df936e372c9b900808998e7cd0 [file] [log] [blame]
TudorCretufb182bc2019-07-05 17:34:12 +01001/*
David Vincze6ec7c652025-03-07 17:46:28 +00002 * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
TudorCretufb182bc2019-07-05 17:34:12 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
TudorCretufb182bc2019-07-05 17:34:12 +01008#include "psa/client.h"
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08009#include "psa/internal_trusted_storage.h"
TudorCretufb182bc2019-07-05 17:34:12 +010010#include "psa_manifest/sid.h"
Shawn Shan428141d2021-07-08 11:05:53 +080011#include "tfm_its_defs.h"
TudorCretufb182bc2019-07-05 17:34:12 +010012
David Vincze6ec7c652025-03-07 17:46:28 +000013struct rot_psa_its_storage_info_t {
14 rot_size_t capacity;
15 rot_size_t size;
16 psa_storage_create_flags_t flags;
17};
18
TudorCretufb182bc2019-07-05 17:34:12 +010019psa_status_t psa_its_set(psa_storage_uid_t uid,
20 size_t data_length,
21 const void *p_data,
22 psa_storage_create_flags_t create_flags)
23{
24 psa_status_t status;
TudorCretufb182bc2019-07-05 17:34:12 +010025
26 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 Shan428141d2021-07-08 11:05:53 +080032 status = psa_call(TFM_INTERNAL_TRUSTED_STORAGE_SERVICE_HANDLE, TFM_ITS_SET,
33 in_vec, IOVEC_LEN(in_vec), NULL, 0);
TudorCretufb182bc2019-07-05 17:34:12 +010034
TudorCretufb182bc2019-07-05 17:34:12 +010035 return status;
36}
37
38psa_status_t psa_its_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)
43{
44 psa_status_t status;
David Vincze6ec7c652025-03-07 17:46:28 +000045 rot_size_t data_offset_param;
TudorCretufb182bc2019-07-05 17:34:12 +010046
47 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) }
TudorCretufb182bc2019-07-05 17:34:12 +010050 };
51
52 psa_outvec out_vec[] = {
53 { .base = p_data, .len = data_size }
54 };
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
TudorCretufb182bc2019-07-05 17:34:12 +010061 if (p_data_length == NULL) {
62 return PSA_ERROR_INVALID_ARGUMENT;
63 }
64
Shawn Shan428141d2021-07-08 11:05:53 +080065 status = psa_call(TFM_INTERNAL_TRUSTED_STORAGE_SERVICE_HANDLE, TFM_ITS_GET,
66 in_vec, IOVEC_LEN(in_vec), out_vec, IOVEC_LEN(out_vec));
TudorCretufb182bc2019-07-05 17:34:12 +010067
TudorCretufb182bc2019-07-05 17:34:12 +010068 *p_data_length = out_vec[0].len;
69
70 return status;
71}
72
73psa_status_t psa_its_get_info(psa_storage_uid_t uid,
74 struct psa_storage_info_t *p_info)
75{
76 psa_status_t status;
David Vincze6ec7c652025-03-07 17:46:28 +000077 struct rot_psa_its_storage_info_t info_param = {0};
TudorCretufb182bc2019-07-05 17:34:12 +010078
79 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) }
TudorCretufb182bc2019-07-05 17:34:12 +010085 };
86
David Vincze6ec7c652025-03-07 17:46:28 +000087 if (p_info == NULL) {
88 return PSA_ERROR_INVALID_ARGUMENT;
89 }
90
Shawn Shan428141d2021-07-08 11:05:53 +080091 status = psa_call(TFM_INTERNAL_TRUSTED_STORAGE_SERVICE_HANDLE,
92 TFM_ITS_GET_INFO, in_vec, IOVEC_LEN(in_vec), out_vec,
TudorCretufb182bc2019-07-05 17:34:12 +010093 IOVEC_LEN(out_vec));
94
David Vincze6ec7c652025-03-07 17:46:28 +000095 p_info->capacity = info_param.capacity;
96 p_info->size = info_param.size;
97 p_info->flags = info_param.flags;
98
TudorCretufb182bc2019-07-05 17:34:12 +010099 return status;
100}
101
102psa_status_t psa_its_remove(psa_storage_uid_t uid)
103{
104 psa_status_t status;
TudorCretufb182bc2019-07-05 17:34:12 +0100105
106 psa_invec in_vec[] = {
107 { .base = &uid, .len = sizeof(uid) }
108 };
109
Shawn Shan428141d2021-07-08 11:05:53 +0800110 status = psa_call(TFM_INTERNAL_TRUSTED_STORAGE_SERVICE_HANDLE,
111 TFM_ITS_REMOVE, in_vec, IOVEC_LEN(in_vec), NULL, 0);
TudorCretufb182bc2019-07-05 17:34:12 +0100112
113 return status;
114}