blob: 9326f7b8e30b00d41b6a5a42feeb83bd952e1abb [file] [log] [blame]
TudorCretufb182bc2019-07-05 17:34:12 +01001/*
2 * Copyright (c) 2019, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#include "psa/internal_trusted_storage.h"
9#include "tfm_api.h"
10
11#include "psa/client.h"
12#include "psa_manifest/sid.h"
13
14#define IOVEC_LEN(x) (sizeof(x)/sizeof(x[0]))
15
16psa_status_t psa_its_set(psa_storage_uid_t uid,
17 size_t data_length,
18 const void *p_data,
19 psa_storage_create_flags_t create_flags)
20{
21 psa_status_t status;
22 psa_handle_t handle;
23
24 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
30 handle = psa_connect(TFM_ITS_SET_SID, TFM_ITS_SET_VERSION);
31 if (!PSA_HANDLE_IS_VALID(handle)) {
32 return PSA_ERROR_GENERIC_ERROR;
33 }
34
35 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), NULL, 0);
36
37 psa_close(handle);
38
39 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
40 return PSA_ERROR_INVALID_ARGUMENT;
41 }
42
43 return status;
44}
45
46psa_status_t psa_its_get(psa_storage_uid_t uid,
47 size_t data_offset,
48 size_t data_size,
49 void *p_data,
50 size_t *p_data_length)
51{
52 psa_status_t status;
53 psa_handle_t handle;
54
55 psa_invec in_vec[] = {
56 { .base = &uid, .len = sizeof(uid) },
57 { .base = &data_offset, .len = sizeof(data_offset) }
58 };
59
60 psa_outvec out_vec[] = {
61 { .base = p_data, .len = data_size }
62 };
63
64 if (p_data_length == NULL) {
65 return PSA_ERROR_INVALID_ARGUMENT;
66 }
67
68 handle = psa_connect(TFM_ITS_GET_SID, TFM_ITS_GET_VERSION);
69 if (!PSA_HANDLE_IS_VALID(handle)) {
70 return PSA_ERROR_GENERIC_ERROR;
71 }
72
73 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec,
74 IOVEC_LEN(out_vec));
75
76 psa_close(handle);
77
78 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
79 return PSA_ERROR_INVALID_ARGUMENT;
80 }
81
82 *p_data_length = out_vec[0].len;
83
84 return status;
85}
86
87psa_status_t psa_its_get_info(psa_storage_uid_t uid,
88 struct psa_storage_info_t *p_info)
89{
90 psa_status_t status;
91 psa_handle_t handle;
92
93 psa_invec in_vec[] = {
94 { .base = &uid, .len = sizeof(uid) }
95 };
96
97 psa_outvec out_vec[] = {
98 { .base = p_info, .len = sizeof(*p_info) }
99 };
100
101 handle = psa_connect(TFM_ITS_GET_INFO_SID, TFM_ITS_GET_INFO_VERSION);
102 if (!PSA_HANDLE_IS_VALID(handle)) {
103 return PSA_ERROR_GENERIC_ERROR;
104 }
105
106 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec,
107 IOVEC_LEN(out_vec));
108
109 psa_close(handle);
110
111 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
112 return PSA_ERROR_INVALID_ARGUMENT;
113 }
114
115 return status;
116}
117
118psa_status_t psa_its_remove(psa_storage_uid_t uid)
119{
120 psa_status_t status;
121 psa_handle_t handle;
122
123 psa_invec in_vec[] = {
124 { .base = &uid, .len = sizeof(uid) }
125 };
126
127 handle = psa_connect(TFM_ITS_REMOVE_SID, TFM_ITS_REMOVE_VERSION);
128 if (!PSA_HANDLE_IS_VALID(handle)) {
129 return PSA_ERROR_GENERIC_ERROR;
130 }
131
132 status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), NULL, 0);
133
134 psa_close(handle);
135
136 return status;
137}