blob: 543b88f3d1b00631a0844734ab9e7e49d20107f1 [file] [log] [blame]
TudorCretufb182bc2019-07-05 17:34:12 +01001/*
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08002 * Copyright (c) 2019-2021, Arm Limited. All rights reserved.
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"
Xinyu Zhangade2e0a2021-03-18 16:20:54 +080011#include "tfm_api.h"
TudorCretufb182bc2019-07-05 17:34:12 +010012
13psa_status_t psa_its_set(psa_storage_uid_t uid,
14 size_t data_length,
15 const void *p_data,
16 psa_storage_create_flags_t create_flags)
17{
18 psa_status_t status;
19 psa_handle_t handle;
20
21 psa_invec in_vec[] = {
22 { .base = &uid, .len = sizeof(uid) },
23 { .base = p_data, .len = data_length },
24 { .base = &create_flags, .len = sizeof(create_flags) }
25 };
26
27 handle = psa_connect(TFM_ITS_SET_SID, TFM_ITS_SET_VERSION);
28 if (!PSA_HANDLE_IS_VALID(handle)) {
29 return PSA_ERROR_GENERIC_ERROR;
30 }
31
32 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), NULL, 0);
33
34 psa_close(handle);
35
TudorCretufb182bc2019-07-05 17:34:12 +010036 return status;
37}
38
39psa_status_t psa_its_get(psa_storage_uid_t uid,
40 size_t data_offset,
41 size_t data_size,
42 void *p_data,
43 size_t *p_data_length)
44{
45 psa_status_t status;
46 psa_handle_t handle;
47
48 psa_invec in_vec[] = {
49 { .base = &uid, .len = sizeof(uid) },
50 { .base = &data_offset, .len = sizeof(data_offset) }
51 };
52
53 psa_outvec out_vec[] = {
54 { .base = p_data, .len = data_size }
55 };
56
57 if (p_data_length == NULL) {
58 return PSA_ERROR_INVALID_ARGUMENT;
59 }
60
61 handle = psa_connect(TFM_ITS_GET_SID, TFM_ITS_GET_VERSION);
62 if (!PSA_HANDLE_IS_VALID(handle)) {
63 return PSA_ERROR_GENERIC_ERROR;
64 }
65
66 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec,
67 IOVEC_LEN(out_vec));
68
69 psa_close(handle);
70
TudorCretufb182bc2019-07-05 17:34:12 +010071 *p_data_length = out_vec[0].len;
72
73 return status;
74}
75
76psa_status_t psa_its_get_info(psa_storage_uid_t uid,
77 struct psa_storage_info_t *p_info)
78{
79 psa_status_t status;
80 psa_handle_t handle;
81
82 psa_invec in_vec[] = {
83 { .base = &uid, .len = sizeof(uid) }
84 };
85
86 psa_outvec out_vec[] = {
87 { .base = p_info, .len = sizeof(*p_info) }
88 };
89
90 handle = psa_connect(TFM_ITS_GET_INFO_SID, TFM_ITS_GET_INFO_VERSION);
91 if (!PSA_HANDLE_IS_VALID(handle)) {
92 return PSA_ERROR_GENERIC_ERROR;
93 }
94
95 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec,
96 IOVEC_LEN(out_vec));
97
98 psa_close(handle);
99
TudorCretufb182bc2019-07-05 17:34:12 +0100100 return status;
101}
102
103psa_status_t psa_its_remove(psa_storage_uid_t uid)
104{
105 psa_status_t status;
106 psa_handle_t handle;
107
108 psa_invec in_vec[] = {
109 { .base = &uid, .len = sizeof(uid) }
110 };
111
112 handle = psa_connect(TFM_ITS_REMOVE_SID, TFM_ITS_REMOVE_VERSION);
113 if (!PSA_HANDLE_IS_VALID(handle)) {
114 return PSA_ERROR_GENERIC_ERROR;
115 }
116
117 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), NULL, 0);
118
119 psa_close(handle);
120
121 return status;
122}