blob: 599a5bee4ea7fbae88f82f25ddbb0b2635e9a6cf [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
Jens Wiklanderc5231592015-11-11 09:27:27 +010038#define VAL2HANDLE(v) (void *)(uintptr_t)(v)
39
Pascal Brandc639ac82015-07-02 08:53:34 +020040TEE_Result ta_storage_cmd_open(uint32_t param_types, TEE_Param params[4])
41{
Jens Wiklanderc5231592015-11-11 09:27:27 +010042 TEE_Result res;
43 TEE_ObjectHandle o;
44
Pascal Brandc639ac82015-07-02 08:53:34 +020045 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
46 (TEE_PARAM_TYPE_MEMREF_INPUT,
47 TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE,
48 TEE_PARAM_TYPE_NONE));
49
Jens Wiklanderc5231592015-11-11 09:27:27 +010050 res = TEE_OpenPersistentObject(TEE_STORAGE_PRIVATE,
Pascal Brandc639ac82015-07-02 08:53:34 +020051 params[0].memref.buffer,
52 params[0].memref.size,
Jens Wiklanderc5231592015-11-11 09:27:27 +010053 params[1].value.a, &o);
54
55 params[1].value.b = (uintptr_t)o;
56 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +020057}
58
59TEE_Result ta_storage_cmd_create(uint32_t param_types, TEE_Param params[4])
60{
Jens Wiklanderc5231592015-11-11 09:27:27 +010061 TEE_Result res;
62 TEE_ObjectHandle o;
63
Pascal Brandc639ac82015-07-02 08:53:34 +020064 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
65 (TEE_PARAM_TYPE_MEMREF_INPUT,
66 TEE_PARAM_TYPE_VALUE_INOUT,
67 TEE_PARAM_TYPE_VALUE_INPUT,
68 TEE_PARAM_TYPE_MEMREF_INPUT));
69
Jens Wiklanderc5231592015-11-11 09:27:27 +010070 res = TEE_CreatePersistentObject(TEE_STORAGE_PRIVATE,
71 params[0].memref.buffer, params[0].memref.size,
72 params[1].value.a,
73 (TEE_ObjectHandle)(uintptr_t)params[2].value.a,
74 params[3].memref.buffer, params[3].memref.size, &o);
75 params[1].value.b = (uintptr_t)o;
76 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +020077}
78
Pascal Brandeb84c442016-04-19 17:49:49 +020079TEE_Result ta_storage_cmd_create_overwrite(uint32_t param_types,
80 TEE_Param params[4])
81{
82 TEE_Result res;
83
84 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
85 (TEE_PARAM_TYPE_MEMREF_INPUT,
86 TEE_PARAM_TYPE_NONE,
87 TEE_PARAM_TYPE_NONE,
88 TEE_PARAM_TYPE_NONE));
89
90 res = TEE_CreatePersistentObject(TEE_STORAGE_PRIVATE,
91 params[0].memref.buffer, params[0].memref.size,
92 TEE_DATA_FLAG_OVERWRITE,
93 NULL, NULL, 0, NULL);
94 return res;
95}
96
Pascal Brandc639ac82015-07-02 08:53:34 +020097TEE_Result ta_storage_cmd_close(uint32_t param_types, TEE_Param params[4])
98{
99 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
100 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
101 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
102
Jens Wiklanderc5231592015-11-11 09:27:27 +0100103 TEE_CloseObject((TEE_ObjectHandle)(uintptr_t)params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200104
105 return TEE_SUCCESS;
106}
107
108TEE_Result ta_storage_cmd_read(uint32_t param_types, TEE_Param params[4])
109{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100110 TEE_ObjectHandle o = VAL2HANDLE(params[1].value.a);
111
Pascal Brandc639ac82015-07-02 08:53:34 +0200112 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
113 (TEE_PARAM_TYPE_MEMREF_OUTPUT,
114 TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE,
115 TEE_PARAM_TYPE_NONE));
116
Jens Wiklanderc5231592015-11-11 09:27:27 +0100117 return TEE_ReadObjectData(o, params[0].memref.buffer,
Pascal Brandc639ac82015-07-02 08:53:34 +0200118 params[0].memref.size, &params[1].value.b);
119}
120
121TEE_Result ta_storage_cmd_write(uint32_t param_types, TEE_Param params[4])
122{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100123 TEE_ObjectHandle o = VAL2HANDLE(params[1].value.a);
124
Pascal Brandc639ac82015-07-02 08:53:34 +0200125 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
126 (TEE_PARAM_TYPE_MEMREF_INPUT,
127 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
128 TEE_PARAM_TYPE_NONE));
129
Jens Wiklanderc5231592015-11-11 09:27:27 +0100130 return TEE_WriteObjectData(o, params[0].memref.buffer,
Pascal Brandc639ac82015-07-02 08:53:34 +0200131 params[0].memref.size);
132}
133
134TEE_Result ta_storage_cmd_seek(uint32_t param_types, TEE_Param params[4])
135{
136 TEE_Result res;
137 TEE_ObjectInfo info;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100138 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200139
140 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
141 (TEE_PARAM_TYPE_VALUE_INPUT,
142 TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE,
143 TEE_PARAM_TYPE_NONE));
144
Jens Wiklanderc5231592015-11-11 09:27:27 +0100145 res = TEE_SeekObjectData(o, params[0].value.b, params[1].value.a);
146 if (res != TEE_SUCCESS)
147 return res;
148 res = TEE_GetObjectInfo1(o, &info);
Pascal Brandc639ac82015-07-02 08:53:34 +0200149
150 params[1].value.b = info.dataPosition;
151
152 return res;
153}
154
155TEE_Result ta_storage_cmd_unlink(uint32_t param_types, TEE_Param params[4])
156{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100157 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
158
Pascal Brandc639ac82015-07-02 08:53:34 +0200159 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
160 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
161 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
162
Jens Wiklanderc5231592015-11-11 09:27:27 +0100163 TEE_CloseAndDeletePersistentObject1(o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200164
165 return TEE_SUCCESS;
166}
167
168TEE_Result ta_storage_cmd_rename(uint32_t param_types, TEE_Param params[4])
169{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100170 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
171
Pascal Brandc639ac82015-07-02 08:53:34 +0200172 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
173 (TEE_PARAM_TYPE_VALUE_INPUT,
174 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
175 TEE_PARAM_TYPE_NONE));
176
Jens Wiklanderc5231592015-11-11 09:27:27 +0100177 return TEE_RenamePersistentObject(o, params[1].memref.buffer,
Pascal Brandc639ac82015-07-02 08:53:34 +0200178 params[1].memref.size);
179}
180
181TEE_Result ta_storage_cmd_trunc(uint32_t param_types, TEE_Param params[4])
182{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100183 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
184
Pascal Brandc639ac82015-07-02 08:53:34 +0200185 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
186 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
187 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
188
Jens Wiklanderc5231592015-11-11 09:27:27 +0100189 return TEE_TruncateObjectData(o, params[0].value.b);
Pascal Brandc639ac82015-07-02 08:53:34 +0200190}
191
192TEE_Result ta_storage_cmd_alloc_enum(uint32_t param_types, TEE_Param params[4])
193{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100194 TEE_Result res;
195 TEE_ObjectEnumHandle oe;
196
Pascal Brandc639ac82015-07-02 08:53:34 +0200197 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
198 (TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,
199 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
200
Jens Wiklanderc5231592015-11-11 09:27:27 +0100201 res = TEE_AllocatePersistentObjectEnumerator(&oe);
202 params[0].value.a = (uintptr_t)oe;
203 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +0200204}
205
206TEE_Result ta_storage_cmd_free_enum(uint32_t param_types, TEE_Param params[4])
207{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100208 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
209
Pascal Brandc639ac82015-07-02 08:53:34 +0200210 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
211 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
212 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
213
Jens Wiklanderc5231592015-11-11 09:27:27 +0100214 TEE_FreePersistentObjectEnumerator(oe);
Pascal Brandc639ac82015-07-02 08:53:34 +0200215 return TEE_SUCCESS;
216}
217
218TEE_Result ta_storage_cmd_reset_enum(uint32_t param_types, TEE_Param params[4])
219{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100220 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
221
Pascal Brandc639ac82015-07-02 08:53:34 +0200222 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
223 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
224 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
225
Jens Wiklanderc5231592015-11-11 09:27:27 +0100226 TEE_ResetPersistentObjectEnumerator(oe);
Pascal Brandc639ac82015-07-02 08:53:34 +0200227 return TEE_SUCCESS;
228}
229
230TEE_Result ta_storage_cmd_start_enum(uint32_t param_types, TEE_Param params[4])
231{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100232 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
233
Pascal Brandc639ac82015-07-02 08:53:34 +0200234 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
235 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
236 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
237
Jens Wiklanderc5231592015-11-11 09:27:27 +0100238 return TEE_StartPersistentObjectEnumerator(oe, TEE_STORAGE_PRIVATE);
Pascal Brandc639ac82015-07-02 08:53:34 +0200239}
240
241TEE_Result ta_storage_cmd_next_enum(uint32_t param_types, TEE_Param params[4])
242{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100243 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
Pascal Brandc603e0d2016-04-25 12:37:18 +0200244 TEE_ObjectInfo *obj;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100245
Pascal Brandc603e0d2016-04-25 12:37:18 +0200246 if (TEE_PARAM_TYPE_GET(param_types, 0) != TEE_PARAM_TYPE_VALUE_INPUT)
247 return TEE_ERROR_BAD_PARAMETERS;
248 if (TEE_PARAM_TYPE_GET(param_types, 2) != TEE_PARAM_TYPE_MEMREF_OUTPUT)
249 return TEE_ERROR_BAD_PARAMETERS;
250 if (TEE_PARAM_TYPE_GET(param_types, 3) != TEE_PARAM_TYPE_NONE)
251 return TEE_ERROR_BAD_PARAMETERS;
Pascal Brandc639ac82015-07-02 08:53:34 +0200252
Pascal Brandc603e0d2016-04-25 12:37:18 +0200253 if (TEE_PARAM_TYPE_GET(param_types, 1) == TEE_PARAM_TYPE_NONE)
254 obj = NULL;
255 else if (TEE_PARAM_TYPE_GET(param_types, 1) ==
256 TEE_PARAM_TYPE_MEMREF_OUTPUT) {
257 if (params[1].memref.size < sizeof(TEE_ObjectInfo)) {
258 params[1].memref.size = sizeof(TEE_ObjectInfo);
259 return TEE_ERROR_SHORT_BUFFER;
260 }
261 params[1].memref.size = sizeof(TEE_ObjectInfo);
262 obj = (TEE_ObjectInfo *)params[1].memref.buffer;
263 } else
264 return TEE_ERROR_BAD_PARAMETERS;
Pascal Brandc639ac82015-07-02 08:53:34 +0200265
266 if (params[2].memref.size < TEE_OBJECT_ID_MAX_LEN)
267 return TEE_ERROR_SHORT_BUFFER;
268
Pascal Brandc603e0d2016-04-25 12:37:18 +0200269 return TEE_GetNextPersistentObject(oe, obj,
270 params[2].memref.buffer,
271 &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200272}