blob: 6d4f8921fa07c63167956c516eb43213f31ba695 [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
79TEE_Result ta_storage_cmd_close(uint32_t param_types, TEE_Param params[4])
80{
81 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
82 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
83 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
84
Jens Wiklanderc5231592015-11-11 09:27:27 +010085 TEE_CloseObject((TEE_ObjectHandle)(uintptr_t)params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +020086
87 return TEE_SUCCESS;
88}
89
90TEE_Result ta_storage_cmd_read(uint32_t param_types, TEE_Param params[4])
91{
Jens Wiklanderc5231592015-11-11 09:27:27 +010092 TEE_ObjectHandle o = VAL2HANDLE(params[1].value.a);
93
Pascal Brandc639ac82015-07-02 08:53:34 +020094 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
95 (TEE_PARAM_TYPE_MEMREF_OUTPUT,
96 TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE,
97 TEE_PARAM_TYPE_NONE));
98
Jens Wiklanderc5231592015-11-11 09:27:27 +010099 return TEE_ReadObjectData(o, params[0].memref.buffer,
Pascal Brandc639ac82015-07-02 08:53:34 +0200100 params[0].memref.size, &params[1].value.b);
101}
102
103TEE_Result ta_storage_cmd_write(uint32_t param_types, TEE_Param params[4])
104{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100105 TEE_ObjectHandle o = VAL2HANDLE(params[1].value.a);
106
Pascal Brandc639ac82015-07-02 08:53:34 +0200107 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
108 (TEE_PARAM_TYPE_MEMREF_INPUT,
109 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
110 TEE_PARAM_TYPE_NONE));
111
Jens Wiklanderc5231592015-11-11 09:27:27 +0100112 return TEE_WriteObjectData(o, params[0].memref.buffer,
Pascal Brandc639ac82015-07-02 08:53:34 +0200113 params[0].memref.size);
114}
115
116TEE_Result ta_storage_cmd_seek(uint32_t param_types, TEE_Param params[4])
117{
118 TEE_Result res;
119 TEE_ObjectInfo info;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100120 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200121
122 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
123 (TEE_PARAM_TYPE_VALUE_INPUT,
124 TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE,
125 TEE_PARAM_TYPE_NONE));
126
Jens Wiklanderc5231592015-11-11 09:27:27 +0100127 res = TEE_SeekObjectData(o, params[0].value.b, params[1].value.a);
128 if (res != TEE_SUCCESS)
129 return res;
130 res = TEE_GetObjectInfo1(o, &info);
Pascal Brandc639ac82015-07-02 08:53:34 +0200131
132 params[1].value.b = info.dataPosition;
133
134 return res;
135}
136
137TEE_Result ta_storage_cmd_unlink(uint32_t param_types, TEE_Param params[4])
138{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100139 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
140
Pascal Brandc639ac82015-07-02 08:53:34 +0200141 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
142 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
143 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
144
Jens Wiklanderc5231592015-11-11 09:27:27 +0100145 TEE_CloseAndDeletePersistentObject1(o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200146
147 return TEE_SUCCESS;
148}
149
150TEE_Result ta_storage_cmd_rename(uint32_t param_types, TEE_Param params[4])
151{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100152 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
153
Pascal Brandc639ac82015-07-02 08:53:34 +0200154 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
155 (TEE_PARAM_TYPE_VALUE_INPUT,
156 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
157 TEE_PARAM_TYPE_NONE));
158
Jens Wiklanderc5231592015-11-11 09:27:27 +0100159 return TEE_RenamePersistentObject(o, params[1].memref.buffer,
Pascal Brandc639ac82015-07-02 08:53:34 +0200160 params[1].memref.size);
161}
162
163TEE_Result ta_storage_cmd_trunc(uint32_t param_types, TEE_Param params[4])
164{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100165 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
166
Pascal Brandc639ac82015-07-02 08:53:34 +0200167 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
168 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
169 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
170
Jens Wiklanderc5231592015-11-11 09:27:27 +0100171 return TEE_TruncateObjectData(o, params[0].value.b);
Pascal Brandc639ac82015-07-02 08:53:34 +0200172}
173
174TEE_Result ta_storage_cmd_alloc_enum(uint32_t param_types, TEE_Param params[4])
175{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100176 TEE_Result res;
177 TEE_ObjectEnumHandle oe;
178
Pascal Brandc639ac82015-07-02 08:53:34 +0200179 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
180 (TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,
181 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
182
Jens Wiklanderc5231592015-11-11 09:27:27 +0100183 res = TEE_AllocatePersistentObjectEnumerator(&oe);
184 params[0].value.a = (uintptr_t)oe;
185 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +0200186}
187
188TEE_Result ta_storage_cmd_free_enum(uint32_t param_types, TEE_Param params[4])
189{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100190 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
191
Pascal Brandc639ac82015-07-02 08:53:34 +0200192 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
193 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
194 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
195
Jens Wiklanderc5231592015-11-11 09:27:27 +0100196 TEE_FreePersistentObjectEnumerator(oe);
Pascal Brandc639ac82015-07-02 08:53:34 +0200197 return TEE_SUCCESS;
198}
199
200TEE_Result ta_storage_cmd_reset_enum(uint32_t param_types, TEE_Param params[4])
201{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100202 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
203
Pascal Brandc639ac82015-07-02 08:53:34 +0200204 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
205 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
206 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
207
Jens Wiklanderc5231592015-11-11 09:27:27 +0100208 TEE_ResetPersistentObjectEnumerator(oe);
Pascal Brandc639ac82015-07-02 08:53:34 +0200209 return TEE_SUCCESS;
210}
211
212TEE_Result ta_storage_cmd_start_enum(uint32_t param_types, TEE_Param params[4])
213{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100214 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
215
Pascal Brandc639ac82015-07-02 08:53:34 +0200216 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
217 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
218 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
219
Jens Wiklanderc5231592015-11-11 09:27:27 +0100220 return TEE_StartPersistentObjectEnumerator(oe, TEE_STORAGE_PRIVATE);
Pascal Brandc639ac82015-07-02 08:53:34 +0200221}
222
223TEE_Result ta_storage_cmd_next_enum(uint32_t param_types, TEE_Param params[4])
224{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100225 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
226
Pascal Brandc639ac82015-07-02 08:53:34 +0200227 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
228 (TEE_PARAM_TYPE_VALUE_INPUT,
229 TEE_PARAM_TYPE_MEMREF_OUTPUT,
230 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
231
232 if (params[1].memref.size < sizeof(TEE_ObjectInfo))
233 return TEE_ERROR_SHORT_BUFFER;
234
235 if (params[2].memref.size < TEE_OBJECT_ID_MAX_LEN)
236 return TEE_ERROR_SHORT_BUFFER;
237
238 params[1].memref.size = sizeof(TEE_ObjectInfo);
239
Jens Wiklanderc5231592015-11-11 09:27:27 +0100240 return TEE_GetNextPersistentObject(oe,
241 (TEE_ObjectInfo *)params[1].memref.buffer,
242 params[2].memref.buffer, &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200243}