blob: 3a2e37fae0f4f8ad698045195bc75f3b5816532d [file] [log] [blame]
Pascal Brandc639ac82015-07-02 08:53:34 +02001/*
2 * Copyright (c) 2014, STMicroelectronics International N.V.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include "storage.h"
29
30#include <tee_api.h>
31
32#define ASSERT_PARAM_TYPE(pt) \
33do { \
34 if ((pt) != param_types) \
35 return TEE_ERROR_BAD_PARAMETERS; \
36} while (0)
37
38TEE_Result ta_storage_cmd_open(uint32_t param_types, TEE_Param params[4])
39{
40 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
41 (TEE_PARAM_TYPE_MEMREF_INPUT,
42 TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE,
43 TEE_PARAM_TYPE_NONE));
44
45 return TEE_OpenPersistentObject(TEE_STORAGE_PRIVATE,
46 params[0].memref.buffer,
47 params[0].memref.size,
48 params[1].value.a,
49 (void *)&params[1].value.b);
50}
51
52TEE_Result ta_storage_cmd_create(uint32_t param_types, TEE_Param params[4])
53{
54 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
55 (TEE_PARAM_TYPE_MEMREF_INPUT,
56 TEE_PARAM_TYPE_VALUE_INOUT,
57 TEE_PARAM_TYPE_VALUE_INPUT,
58 TEE_PARAM_TYPE_MEMREF_INPUT));
59
60 return TEE_CreatePersistentObject(TEE_STORAGE_PRIVATE,
61 params[0].memref.buffer,
62 params[0].memref.size,
63 params[1].value.a,
64 (TEE_ObjectHandle) params[2].value.a,
65 params[3].memref.buffer,
66 params[3].memref.size,
67 (void *)&params[1].value.b);
68}
69
70TEE_Result ta_storage_cmd_close(uint32_t param_types, TEE_Param params[4])
71{
72 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
73 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
74 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
75
76 TEE_CloseObject((TEE_ObjectHandle) params[0].value.a);
77
78 return TEE_SUCCESS;
79}
80
81TEE_Result ta_storage_cmd_read(uint32_t param_types, TEE_Param params[4])
82{
83 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
84 (TEE_PARAM_TYPE_MEMREF_OUTPUT,
85 TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE,
86 TEE_PARAM_TYPE_NONE));
87
88 return TEE_ReadObjectData((TEE_ObjectHandle) params[1].value.a,
89 params[0].memref.buffer,
90 params[0].memref.size, &params[1].value.b);
91}
92
93TEE_Result ta_storage_cmd_write(uint32_t param_types, TEE_Param params[4])
94{
95 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
96 (TEE_PARAM_TYPE_MEMREF_INPUT,
97 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
98 TEE_PARAM_TYPE_NONE));
99
100 return TEE_WriteObjectData((TEE_ObjectHandle) params[1].value.a,
101 params[0].memref.buffer,
102 params[0].memref.size);
103}
104
105TEE_Result ta_storage_cmd_seek(uint32_t param_types, TEE_Param params[4])
106{
107 TEE_Result res;
108 TEE_ObjectInfo info;
109
110 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
111 (TEE_PARAM_TYPE_VALUE_INPUT,
112 TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE,
113 TEE_PARAM_TYPE_NONE));
114
115 res = TEE_SeekObjectData((TEE_ObjectHandle) params[0].value.a,
116 params[0].value.b, params[1].value.a);
117
118 res = TEE_GetObjectInfo1((TEE_ObjectHandle) params[0].value.a, &info);
119
120 params[1].value.b = info.dataPosition;
121
122 return res;
123}
124
125TEE_Result ta_storage_cmd_unlink(uint32_t param_types, TEE_Param params[4])
126{
127 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
128 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
129 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
130
131 TEE_CloseAndDeletePersistentObject1((TEE_ObjectHandle) params[0].value.
132 a);
133
134 return TEE_SUCCESS;
135}
136
137TEE_Result ta_storage_cmd_rename(uint32_t param_types, TEE_Param params[4])
138{
139 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
140 (TEE_PARAM_TYPE_VALUE_INPUT,
141 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
142 TEE_PARAM_TYPE_NONE));
143
144 return TEE_RenamePersistentObject((TEE_ObjectHandle) params[0].value.a,
145 params[1].memref.buffer,
146 params[1].memref.size);
147}
148
149TEE_Result ta_storage_cmd_trunc(uint32_t param_types, TEE_Param params[4])
150{
151 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
152 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
153 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
154
155 return TEE_TruncateObjectData((TEE_ObjectHandle) params[0].value.a,
156 params[0].value.b);
157}
158
159TEE_Result ta_storage_cmd_alloc_enum(uint32_t param_types, TEE_Param params[4])
160{
161 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
162 (TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,
163 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
164
165 return TEE_AllocatePersistentObjectEnumerator((void *)&params[0].
166 value.a);
167}
168
169TEE_Result ta_storage_cmd_free_enum(uint32_t param_types, TEE_Param params[4])
170{
171 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
172 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
173 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
174
175 TEE_FreePersistentObjectEnumerator((TEE_ObjectEnumHandle) params[0].
176 value.a);
177
178 return TEE_SUCCESS;
179}
180
181TEE_Result ta_storage_cmd_reset_enum(uint32_t param_types, TEE_Param params[4])
182{
183 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
184 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
185 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
186
187 TEE_ResetPersistentObjectEnumerator((TEE_ObjectEnumHandle) params[0].
188 value.a);
189
190 return TEE_SUCCESS;
191}
192
193TEE_Result ta_storage_cmd_start_enum(uint32_t param_types, TEE_Param params[4])
194{
195 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
196 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
197 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
198
199 return TEE_StartPersistentObjectEnumerator((TEE_ObjectEnumHandle)
200 params[0].value.a,
201 TEE_STORAGE_PRIVATE);
202}
203
204TEE_Result ta_storage_cmd_next_enum(uint32_t param_types, TEE_Param params[4])
205{
206 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
207 (TEE_PARAM_TYPE_VALUE_INPUT,
208 TEE_PARAM_TYPE_MEMREF_OUTPUT,
209 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
210
211 if (params[1].memref.size < sizeof(TEE_ObjectInfo))
212 return TEE_ERROR_SHORT_BUFFER;
213
214 if (params[2].memref.size < TEE_OBJECT_ID_MAX_LEN)
215 return TEE_ERROR_SHORT_BUFFER;
216
217 params[1].memref.size = sizeof(TEE_ObjectInfo);
218
219 return TEE_GetNextPersistentObject((TEE_ObjectEnumHandle) params[0].
220 value.a,
221 (TEE_ObjectInfo *) params[1].memref.
222 buffer, params[2].memref.buffer,
223 &params[2].memref.size);
224}