blob: 7e639f3f2cfde213e382422d2edd50c51f7f3efa [file] [log] [blame]
Etienne Carriere75141172020-05-16 11:58:23 +02001// SPDX-License-Identifier: BSD-2-Clause
Pascal Brandc639ac82015-07-02 08:53:34 +02002/*
3 * Copyright (c) 2014, STMicroelectronics International N.V.
4 * All rights reserved.
Pascal Brandc639ac82015-07-02 08:53:34 +02005 */
6
7#include "storage.h"
Etienne Carriere294ffbd2018-04-26 14:20:35 +02008#include "ta_storage.h"
Pascal Brandc639ac82015-07-02 08:53:34 +02009
10#include <tee_api.h>
Pascal Brand90f23352016-05-19 15:15:47 +020011#include <trace.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020012
13#define ASSERT_PARAM_TYPE(pt) \
14do { \
15 if ((pt) != param_types) \
16 return TEE_ERROR_BAD_PARAMETERS; \
17} while (0)
18
Jens Wiklanderc5231592015-11-11 09:27:27 +010019#define VAL2HANDLE(v) (void *)(uintptr_t)(v)
20
Etienne Carriere294ffbd2018-04-26 14:20:35 +020021TEE_Result ta_storage_cmd_open(uint32_t command,
22 uint32_t param_types, TEE_Param params[4])
Pascal Brandc639ac82015-07-02 08:53:34 +020023{
Etienne Carriere102092e2019-03-28 15:24:22 +010024 TEE_Result res = TEE_ERROR_GENERIC;
25 TEE_ObjectHandle o = TEE_HANDLE_NULL;
26 void *object_id = NULL;
Jens Wiklanderc5231592015-11-11 09:27:27 +010027
Pascal Brandc639ac82015-07-02 08:53:34 +020028 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
29 (TEE_PARAM_TYPE_MEMREF_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020030 TEE_PARAM_TYPE_VALUE_INOUT,
31 TEE_PARAM_TYPE_VALUE_INPUT,
Pascal Brandc639ac82015-07-02 08:53:34 +020032 TEE_PARAM_TYPE_NONE));
33
Etienne Carriere294ffbd2018-04-26 14:20:35 +020034 switch (command) {
35 case TA_STORAGE_CMD_OPEN:
36 object_id = TEE_Malloc(params[0].memref.size, 0);
37 if (!object_id)
38 return TEE_ERROR_OUT_OF_MEMORY;
Etienne Carriere9811a802018-02-16 16:11:42 +010039
Etienne Carriere294ffbd2018-04-26 14:20:35 +020040 TEE_MemMove(object_id, params[0].memref.buffer,
41 params[0].memref.size);
42 break;
43 case TA_STORAGE_CMD_OPEN_ID_IN_SHM:
44 object_id = params[0].memref.buffer;
45 break;
46 default:
47 return TEE_ERROR_NOT_SUPPORTED;
48 }
Etienne Carriere9811a802018-02-16 16:11:42 +010049
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020050 res = TEE_OpenPersistentObject(params[2].value.a,
Etienne Carriere294ffbd2018-04-26 14:20:35 +020051 object_id, params[0].memref.size,
Jens Wiklanderc5231592015-11-11 09:27:27 +010052 params[1].value.a, &o);
53
54 params[1].value.b = (uintptr_t)o;
Etienne Carriere294ffbd2018-04-26 14:20:35 +020055
56 if (command == TA_STORAGE_CMD_OPEN)
57 TEE_Free(object_id);
Etienne Carriere9811a802018-02-16 16:11:42 +010058
Jens Wiklanderc5231592015-11-11 09:27:27 +010059 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +020060}
61
Etienne Carriere294ffbd2018-04-26 14:20:35 +020062TEE_Result ta_storage_cmd_create(uint32_t command,
63 uint32_t param_types, TEE_Param params[4])
Pascal Brandc639ac82015-07-02 08:53:34 +020064{
Etienne Carriere102092e2019-03-28 15:24:22 +010065 TEE_Result res = TEE_ERROR_GENERIC;
66 TEE_ObjectHandle o = TEE_HANDLE_NULL;
67 void *object_id = NULL;
68 TEE_ObjectHandle ref_handle = TEE_HANDLE_NULL;
Jens Wiklanderc5231592015-11-11 09:27:27 +010069
Pascal Brandc639ac82015-07-02 08:53:34 +020070 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
71 (TEE_PARAM_TYPE_MEMREF_INPUT,
72 TEE_PARAM_TYPE_VALUE_INOUT,
73 TEE_PARAM_TYPE_VALUE_INPUT,
74 TEE_PARAM_TYPE_MEMREF_INPUT));
75
Etienne Carriere294ffbd2018-04-26 14:20:35 +020076 switch (command) {
77 case TA_STORAGE_CMD_CREATE:
78 object_id = TEE_Malloc(params[0].memref.size, 0);
79 if (!object_id)
80 return TEE_ERROR_OUT_OF_MEMORY;
Etienne Carriere9811a802018-02-16 16:11:42 +010081
Etienne Carriere294ffbd2018-04-26 14:20:35 +020082 TEE_MemMove(object_id, params[0].memref.buffer,
83 params[0].memref.size);
84 break;
85 case TA_STORAGE_CMD_CREATE_ID_IN_SHM:
86 object_id = params[0].memref.buffer;
87 break;
88 default:
89 return TEE_ERROR_NOT_SUPPORTED;
90 }
91
92 ref_handle = (TEE_ObjectHandle)(uintptr_t)params[2].value.a;
Etienne Carriere9811a802018-02-16 16:11:42 +010093
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020094 res = TEE_CreatePersistentObject(params[2].value.b,
Etienne Carriere294ffbd2018-04-26 14:20:35 +020095 object_id, params[0].memref.size,
96 params[1].value.a, ref_handle,
Etienne Carriere9811a802018-02-16 16:11:42 +010097 params[3].memref.buffer,
98 params[3].memref.size, &o);
99
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200100 if (command == TA_STORAGE_CMD_CREATE)
101 TEE_Free(object_id);
102
Jens Wiklanderc5231592015-11-11 09:27:27 +0100103 params[1].value.b = (uintptr_t)o;
Etienne Carriere9811a802018-02-16 16:11:42 +0100104
Jens Wiklanderc5231592015-11-11 09:27:27 +0100105 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +0200106}
107
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200108TEE_Result ta_storage_cmd_create_overwrite(uint32_t command,
109 uint32_t param_types,
Pascal Brandeb84c442016-04-19 17:49:49 +0200110 TEE_Param params[4])
111{
Etienne Carriere102092e2019-03-28 15:24:22 +0100112 TEE_Result res = TEE_ERROR_GENERIC;
Cedric Auger3ad6b8a2019-09-11 16:38:42 +0200113 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Etienne Carriere102092e2019-03-28 15:24:22 +0100114 void *object_id = NULL;
Pascal Brandeb84c442016-04-19 17:49:49 +0200115
116 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
117 (TEE_PARAM_TYPE_MEMREF_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200118 TEE_PARAM_TYPE_VALUE_INPUT,
Pascal Brandeb84c442016-04-19 17:49:49 +0200119 TEE_PARAM_TYPE_NONE,
120 TEE_PARAM_TYPE_NONE));
121
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200122 switch (command) {
123 case TA_STORAGE_CMD_CREATE_OVERWRITE:
124 object_id = TEE_Malloc(params[0].memref.size, 0);
125 if (!object_id)
126 return TEE_ERROR_OUT_OF_MEMORY;
Etienne Carriere9811a802018-02-16 16:11:42 +0100127
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200128 TEE_MemMove(object_id, params[0].memref.buffer,
129 params[0].memref.size);
130 break;
131 case TA_STORAGE_CMD_CREATEOVER_ID_IN_SHM:
132 object_id = params[0].memref.buffer;
133 break;
134 default:
135 return TEE_ERROR_NOT_SUPPORTED;
136 }
Etienne Carriere9811a802018-02-16 16:11:42 +0100137
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200138 res = TEE_CreatePersistentObject(params[1].value.a,
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200139 object_id, params[0].memref.size,
Etienne Carriere9811a802018-02-16 16:11:42 +0100140 TEE_DATA_FLAG_OVERWRITE,
Cedric Auger3ad6b8a2019-09-11 16:38:42 +0200141 NULL, NULL, 0, &o);
142 TEE_CloseObject(o);
Etienne Carriere9811a802018-02-16 16:11:42 +0100143
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200144 if (command == TA_STORAGE_CMD_CREATE_OVERWRITE)
145 TEE_Free(object_id);
Etienne Carriere9811a802018-02-16 16:11:42 +0100146
Pascal Brandeb84c442016-04-19 17:49:49 +0200147 return res;
148}
149
Pascal Brandc639ac82015-07-02 08:53:34 +0200150TEE_Result ta_storage_cmd_close(uint32_t param_types, TEE_Param params[4])
151{
152 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
153 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
154 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
155
Jens Wiklanderc5231592015-11-11 09:27:27 +0100156 TEE_CloseObject((TEE_ObjectHandle)(uintptr_t)params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200157
158 return TEE_SUCCESS;
159}
160
161TEE_Result ta_storage_cmd_read(uint32_t param_types, TEE_Param params[4])
162{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100163 TEE_ObjectHandle o = VAL2HANDLE(params[1].value.a);
Jens Wiklanderc9d6c2f2020-09-11 10:13:54 +0200164 TEE_Result res = TEE_SUCCESS;
165 void *b0 = NULL;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100166
Pascal Brandc639ac82015-07-02 08:53:34 +0200167 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
168 (TEE_PARAM_TYPE_MEMREF_OUTPUT,
169 TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE,
170 TEE_PARAM_TYPE_NONE));
171
Jens Wiklanderc9d6c2f2020-09-11 10:13:54 +0200172 b0 = TEE_Malloc(params[0].memref.size, 0);
173 if (!b0)
174 return TEE_ERROR_OUT_OF_MEMORY;
175
176 res = TEE_ReadObjectData(o, b0, params[0].memref.size,
177 &params[1].value.b);
178 if (!res)
179 TEE_MemMove(params[0].memref.buffer, b0, params[0].memref.size);
180 TEE_Free(b0);
181
182 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +0200183}
184
185TEE_Result ta_storage_cmd_write(uint32_t param_types, TEE_Param params[4])
186{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100187 TEE_ObjectHandle o = VAL2HANDLE(params[1].value.a);
Jens Wiklanderc9d6c2f2020-09-11 10:13:54 +0200188 TEE_Result res = TEE_SUCCESS;
189 void *b0 = NULL;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100190
Pascal Brandc639ac82015-07-02 08:53:34 +0200191 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
192 (TEE_PARAM_TYPE_MEMREF_INPUT,
193 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
194 TEE_PARAM_TYPE_NONE));
195
Jens Wiklanderc9d6c2f2020-09-11 10:13:54 +0200196 b0 = TEE_Malloc(params[0].memref.size, 0);
197 if (!b0)
198 return TEE_ERROR_OUT_OF_MEMORY;
199 TEE_MemMove(b0, params[0].memref.buffer, params[0].memref.size);
200
201 res = TEE_WriteObjectData(o, b0, params[0].memref.size);
202 TEE_Free(b0);
203
204 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +0200205}
206
207TEE_Result ta_storage_cmd_seek(uint32_t param_types, TEE_Param params[4])
208{
Etienne Carriere102092e2019-03-28 15:24:22 +0100209 TEE_Result res = TEE_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200210 TEE_ObjectInfo info;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100211 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
Etienne Carriere102092e2019-03-28 15:24:22 +0100212 int32_t offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200213
214 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
215 (TEE_PARAM_TYPE_VALUE_INPUT,
216 TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE,
217 TEE_PARAM_TYPE_NONE));
218
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200219 offs = *(int32_t *)&params[0].value.b;
220 res = TEE_SeekObjectData(o, offs, params[1].value.a);
Jens Wiklanderc5231592015-11-11 09:27:27 +0100221 if (res != TEE_SUCCESS)
222 return res;
223 res = TEE_GetObjectInfo1(o, &info);
Pascal Brandc639ac82015-07-02 08:53:34 +0200224
225 params[1].value.b = info.dataPosition;
226
227 return res;
228}
229
230TEE_Result ta_storage_cmd_unlink(uint32_t param_types, TEE_Param params[4])
231{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100232 TEE_ObjectHandle o = 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 TEE_CloseAndDeletePersistentObject1(o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200239
240 return TEE_SUCCESS;
241}
242
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200243TEE_Result ta_storage_cmd_rename(uint32_t command, uint32_t param_types,
244 TEE_Param params[4])
Pascal Brandc639ac82015-07-02 08:53:34 +0200245{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100246 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
Etienne Carriere102092e2019-03-28 15:24:22 +0100247 void *object_id = NULL;
248 TEE_Result res = TEE_ERROR_GENERIC;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100249
Pascal Brandc639ac82015-07-02 08:53:34 +0200250 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
251 (TEE_PARAM_TYPE_VALUE_INPUT,
252 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
253 TEE_PARAM_TYPE_NONE));
254
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200255 switch (command) {
256 case TA_STORAGE_CMD_RENAME:
257 object_id = TEE_Malloc(params[1].memref.size, 0);
258 if (!object_id)
259 return TEE_ERROR_OUT_OF_MEMORY;
Etienne Carriere9811a802018-02-16 16:11:42 +0100260
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200261 TEE_MemMove(object_id, params[1].memref.buffer,
262 params[1].memref.size);
263 break;
264 case TA_STORAGE_CMD_RENAME_ID_IN_SHM:
265 object_id = params[1].memref.buffer;
266 break;
267 default:
268 return TEE_ERROR_NOT_SUPPORTED;
269 }
270
271 res = TEE_RenamePersistentObject(o, object_id, params[1].memref.size);
272
273 if (command == TA_STORAGE_CMD_RENAME)
274 TEE_Free(object_id);
Etienne Carriere9811a802018-02-16 16:11:42 +0100275
276 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +0200277}
278
279TEE_Result ta_storage_cmd_trunc(uint32_t param_types, TEE_Param params[4])
280{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100281 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
282
Pascal Brandc639ac82015-07-02 08:53:34 +0200283 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
284 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
285 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
286
Jens Wiklanderc5231592015-11-11 09:27:27 +0100287 return TEE_TruncateObjectData(o, params[0].value.b);
Pascal Brandc639ac82015-07-02 08:53:34 +0200288}
289
290TEE_Result ta_storage_cmd_alloc_enum(uint32_t param_types, TEE_Param params[4])
291{
Etienne Carriere102092e2019-03-28 15:24:22 +0100292 TEE_Result res = TEE_ERROR_GENERIC;
293 TEE_ObjectEnumHandle oe = TEE_HANDLE_NULL;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100294
Pascal Brandc639ac82015-07-02 08:53:34 +0200295 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
296 (TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,
297 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
298
Jens Wiklanderc5231592015-11-11 09:27:27 +0100299 res = TEE_AllocatePersistentObjectEnumerator(&oe);
300 params[0].value.a = (uintptr_t)oe;
301 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +0200302}
303
304TEE_Result ta_storage_cmd_free_enum(uint32_t param_types, TEE_Param params[4])
305{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100306 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
307
Pascal Brandc639ac82015-07-02 08:53:34 +0200308 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
309 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
310 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
311
Jens Wiklanderc5231592015-11-11 09:27:27 +0100312 TEE_FreePersistentObjectEnumerator(oe);
Pascal Brandc639ac82015-07-02 08:53:34 +0200313 return TEE_SUCCESS;
314}
315
316TEE_Result ta_storage_cmd_reset_enum(uint32_t param_types, TEE_Param params[4])
317{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100318 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
319
Pascal Brandc639ac82015-07-02 08:53:34 +0200320 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
321 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
322 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
323
Jens Wiklanderc5231592015-11-11 09:27:27 +0100324 TEE_ResetPersistentObjectEnumerator(oe);
Pascal Brandc639ac82015-07-02 08:53:34 +0200325 return TEE_SUCCESS;
326}
327
328TEE_Result ta_storage_cmd_start_enum(uint32_t param_types, TEE_Param params[4])
329{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100330 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
331
Pascal Brandc639ac82015-07-02 08:53:34 +0200332 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
333 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
334 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
335
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200336 return TEE_StartPersistentObjectEnumerator(oe, params[0].value.b);
Pascal Brandc639ac82015-07-02 08:53:34 +0200337}
338
339TEE_Result ta_storage_cmd_next_enum(uint32_t param_types, TEE_Param params[4])
340{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100341 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
Jens Wiklanderc9d6c2f2020-09-11 10:13:54 +0200342 TEE_Result res = TEE_SUCCESS;
Etienne Carriere102092e2019-03-28 15:24:22 +0100343 TEE_ObjectInfo *obj = NULL;
Jens Wiklanderc9d6c2f2020-09-11 10:13:54 +0200344 void *b2 = NULL;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100345
Pascal Brandc603e0d2016-04-25 12:37:18 +0200346 if (TEE_PARAM_TYPE_GET(param_types, 0) != TEE_PARAM_TYPE_VALUE_INPUT)
347 return TEE_ERROR_BAD_PARAMETERS;
348 if (TEE_PARAM_TYPE_GET(param_types, 2) != TEE_PARAM_TYPE_MEMREF_OUTPUT)
349 return TEE_ERROR_BAD_PARAMETERS;
350 if (TEE_PARAM_TYPE_GET(param_types, 3) != TEE_PARAM_TYPE_NONE)
351 return TEE_ERROR_BAD_PARAMETERS;
Pascal Brandc639ac82015-07-02 08:53:34 +0200352
Jens Wiklanderc9d6c2f2020-09-11 10:13:54 +0200353 if (params[2].memref.size < TEE_OBJECT_ID_MAX_LEN)
354 return TEE_ERROR_SHORT_BUFFER;
355
Pascal Brandc603e0d2016-04-25 12:37:18 +0200356 if (TEE_PARAM_TYPE_GET(param_types, 1) == TEE_PARAM_TYPE_NONE)
357 obj = NULL;
358 else if (TEE_PARAM_TYPE_GET(param_types, 1) ==
359 TEE_PARAM_TYPE_MEMREF_OUTPUT) {
360 if (params[1].memref.size < sizeof(TEE_ObjectInfo)) {
361 params[1].memref.size = sizeof(TEE_ObjectInfo);
362 return TEE_ERROR_SHORT_BUFFER;
363 }
364 params[1].memref.size = sizeof(TEE_ObjectInfo);
Jens Wiklanderc9d6c2f2020-09-11 10:13:54 +0200365 obj = TEE_Malloc(sizeof(TEE_ObjectInfo), 0);
366 if (!obj)
367 return TEE_ERROR_OUT_OF_MEMORY;
Pascal Brandc603e0d2016-04-25 12:37:18 +0200368 } else
369 return TEE_ERROR_BAD_PARAMETERS;
Pascal Brandc639ac82015-07-02 08:53:34 +0200370
Jens Wiklanderc9d6c2f2020-09-11 10:13:54 +0200371 b2 = TEE_Malloc(params[2].memref.size, 0);
372 if (!b2) {
373 res = TEE_ERROR_OUT_OF_MEMORY;
374 goto out;
375 }
Pascal Brandc639ac82015-07-02 08:53:34 +0200376
Jens Wiklanderc9d6c2f2020-09-11 10:13:54 +0200377 res = TEE_GetNextPersistentObject(oe, obj, b2, &params[2].memref.size);
378 if (res)
379 goto out;
380
381 TEE_MemMove(params[2].memref.buffer, b2, params[2].memref.size);
382 if (obj)
383 TEE_MemMove(params[1].memref.buffer, obj, sizeof(*obj));
384out:
385 TEE_Free(b2);
386 TEE_Free(obj);
387
388 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +0200389}
Pascal Brand90f23352016-05-19 15:15:47 +0200390
391static TEE_Result check_obj(TEE_ObjectInfo *o1, TEE_ObjectInfo *o2)
392{
393 if ((o1->objectType != o2->objectType) ||
394 (o1->keySize != o2->keySize) ||
395 (o1->maxKeySize != o2->maxKeySize) ||
396 (o1->objectUsage != o2->objectUsage))
397 return TEE_ERROR_GENERIC;
398 return TEE_SUCCESS;
399}
400
401TEE_Result ta_storage_cmd_key_in_persistent(uint32_t param_types,
402 TEE_Param params[4])
403{
404 TEE_Result result = TEE_SUCCESS;
Etienne Carriere102092e2019-03-28 15:24:22 +0100405 TEE_ObjectHandle transient_key = TEE_HANDLE_NULL;
406 TEE_ObjectHandle persistent_key = TEE_HANDLE_NULL;
407 TEE_ObjectHandle key = TEE_HANDLE_NULL;
408 TEE_OperationHandle encrypt_op = TEE_HANDLE_NULL;
Pascal Brand90f23352016-05-19 15:15:47 +0200409 TEE_ObjectInfo keyInfo;
410 TEE_ObjectInfo keyInfo2;
411 TEE_ObjectInfo keyInfo3;
412 uint32_t alg = TEE_ALG_AES_CBC_NOPAD;
413 void *IV = NULL;
414 size_t IVlen = 16;
415 size_t key_size = 256;
416 uint32_t objectID = 1;
417 uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
418 TEE_DATA_FLAG_ACCESS_WRITE |
419 TEE_DATA_FLAG_ACCESS_WRITE_META |
420 TEE_DATA_FLAG_SHARE_READ |
421 TEE_DATA_FLAG_SHARE_WRITE;
422
Etienne Carriere102092e2019-03-28 15:24:22 +0100423 TEE_MemFill(&keyInfo, 0, sizeof(keyInfo));
424 TEE_MemFill(&keyInfo2, 0, sizeof(keyInfo2));
425 TEE_MemFill(&keyInfo3, 0, sizeof(keyInfo3));
426
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200427 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
428 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
429 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
Pascal Brand90f23352016-05-19 15:15:47 +0200430
431 result = TEE_AllocateTransientObject(TEE_TYPE_AES, key_size,
432 &transient_key);
433 if (result != TEE_SUCCESS) {
434 EMSG("Failed to Allocate transient object handle : 0x%x",
435 result);
436 goto cleanup1;
437 }
438
439 result = TEE_GenerateKey(transient_key, key_size, NULL, 0);
440 if (result != TEE_SUCCESS) {
441 EMSG("Failed to generate a transient key: 0x%x", result);
442 goto cleanup2;
443 }
444
445 TEE_GetObjectInfo1(transient_key, &keyInfo);
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200446 result = TEE_CreatePersistentObject(params[0].value.a,
Pascal Brand90f23352016-05-19 15:15:47 +0200447 &objectID, sizeof(objectID),
448 flags, transient_key, NULL, 0,
449 &persistent_key);
450 if (result != TEE_SUCCESS) {
451 EMSG("Failed to create a persistent key: 0x%x", result);
452 goto cleanup2;
453 }
454
455 TEE_GetObjectInfo1(persistent_key, &keyInfo2);
456 result = check_obj(&keyInfo, &keyInfo2);
457 if (result != TEE_SUCCESS) {
458 EMSG("keyInfo and keyInfo2 are different");
459 goto cleanup2;
460 }
461
462 TEE_CloseObject(persistent_key);
463
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200464 result = TEE_OpenPersistentObject(params[0].value.a,
Pascal Brand90f23352016-05-19 15:15:47 +0200465 &objectID, sizeof(objectID),
466 flags, &key);
467 if (result != TEE_SUCCESS) {
468 EMSG("Failed to open persistent key: 0x%x", result);
469 goto cleanup2;
470 }
471
472 TEE_GetObjectInfo(key, &keyInfo3);
473 result = check_obj(&keyInfo3, &keyInfo2);
474 if (result != TEE_SUCCESS) {
475 EMSG("keyInfo2 and keyInfo3 are different");
476 goto cleanup2;
477 }
478
479 result = TEE_AllocateOperation(&encrypt_op, alg, TEE_MODE_ENCRYPT,
480 keyInfo3.maxObjectSize);
481 if (result != TEE_SUCCESS) {
482 EMSG("Failed to allocate an operation: 0x%x", result);
483 goto cleanup3;
484 }
485
486 result = TEE_SetOperationKey(encrypt_op, key);
487 if (result != TEE_SUCCESS) {
488 EMSG("Failed to set operation key: 0x%x", result);
489 goto cleanup4;
490 }
491
492 IV = TEE_Malloc(IVlen, 0);
493 if (!IV) {
494 EMSG("Out of memory for IV.");
495 result = TEE_ERROR_OUT_OF_MEMORY;
496 goto cleanup4;
497 }
498
499 TEE_CipherInit(encrypt_op, IV, IVlen);
500 TEE_Free(IV);
501
502cleanup4:
503 TEE_FreeOperation(encrypt_op);
504cleanup3:
505 TEE_CloseAndDeletePersistentObject1(key);
506cleanup2:
507 TEE_FreeTransientObject(transient_key);
508cleanup1:
509 return result;
510}
511
Pascal Brand29ee18f2016-05-23 14:13:56 +0200512TEE_Result ta_storage_cmd_loop(uint32_t param_types, TEE_Param params[4])
513{
514 TEE_ObjectHandle object = TEE_HANDLE_NULL;
Etienne Carriere102092e2019-03-28 15:24:22 +0100515 TEE_Result res = TEE_ERROR_GENERIC;
Pascal Brand29ee18f2016-05-23 14:13:56 +0200516 int object_id = 0;
517 uint32_t flags = TEE_DATA_FLAG_OVERWRITE |
518 TEE_DATA_FLAG_ACCESS_WRITE_META;
519 int i = 0;
520
Pascal Brand29ee18f2016-05-23 14:13:56 +0200521 (void)params;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200522 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
523 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
524 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
Pascal Brand29ee18f2016-05-23 14:13:56 +0200525
526 for (i = 0; i < 20; i++) {
527 DMSG("\n\nLOOP : %d", i);
528 object = TEE_HANDLE_NULL;
529 object_id = i;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200530 res = TEE_CreatePersistentObject(params[0].value.a,
Pascal Brand29ee18f2016-05-23 14:13:56 +0200531 &object_id, sizeof(int), flags,
532 TEE_HANDLE_NULL, NULL, 0,
533 &object);
534
535 if (res != TEE_SUCCESS) {
536 EMSG("FAIL");
537 return res;
538 }
539
540 res = TEE_CloseAndDeletePersistentObject1(object);
541 if (res != TEE_SUCCESS) {
542 EMSG("FAIL");
543 return res;
544 }
545 }
546
547 return TEE_SUCCESS;
548}
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200549
550TEE_Result ta_storage_cmd_restrict_usage(uint32_t param_types,
551 TEE_Param params[4])
552{
Etienne Carriere102092e2019-03-28 15:24:22 +0100553 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200554
555 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
556 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
557 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
558
559 o = (TEE_ObjectHandle)(uintptr_t)params[0].value.a;
560 TEE_RestrictObjectUsage1(o, params[0].value.b);
561 return TEE_SUCCESS;
562}
563
564TEE_Result ta_storage_cmd_alloc_obj(uint32_t param_types, TEE_Param params[4])
565{
Etienne Carriere102092e2019-03-28 15:24:22 +0100566 TEE_Result res = TEE_ERROR_GENERIC;
567 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200568
569 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
570 (TEE_PARAM_TYPE_VALUE_INPUT,
571 TEE_PARAM_TYPE_VALUE_OUTPUT,
572 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
573
574 res = TEE_AllocateTransientObject(params[0].value.a, params[0].value.b,
575 &o);
576 params[1].value.a = (uint32_t)(uintptr_t)o;
577 return res;
578}
579
580TEE_Result ta_storage_cmd_free_obj(uint32_t param_types, TEE_Param params[4])
581{
Etienne Carriere102092e2019-03-28 15:24:22 +0100582 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200583
584 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
585 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
586 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
587
588 o = (TEE_ObjectHandle)(uintptr_t)params[0].value.a;
589 TEE_FreeTransientObject(o);
590 return TEE_SUCCESS;
591}
592
593TEE_Result ta_storage_cmd_reset_obj(uint32_t param_types, TEE_Param params[4])
594{
Etienne Carriere102092e2019-03-28 15:24:22 +0100595 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200596
597 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
598 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
599 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
600
601 o = (TEE_ObjectHandle)(uintptr_t)params[0].value.a;
602 TEE_ResetTransientObject(o);
603 return TEE_SUCCESS;
604}
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800605
606TEE_Result ta_storage_cmd_get_obj_info(uint32_t param_types,
607 TEE_Param params[4])
608{
Etienne Carriere102092e2019-03-28 15:24:22 +0100609 TEE_Result res = TEE_ERROR_GENERIC;
Jens Wiklanderc9d6c2f2020-09-11 10:13:54 +0200610 TEE_ObjectInfo info = { };
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800611 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
612
613 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
614 (TEE_PARAM_TYPE_VALUE_INPUT,
615 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE,
616 TEE_PARAM_TYPE_NONE));
617
Jens Wiklanderc9d6c2f2020-09-11 10:13:54 +0200618 if (params[1].memref.size < sizeof(info))
619 return TEE_ERROR_SHORT_BUFFER;
620 res = TEE_GetObjectInfo1(o, &info);
621 if (!res) {
622 params[1].memref.size = sizeof(info);
623 TEE_MemMove(params[1].memref.buffer, &info, sizeof(info));
624 }
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800625
626 return res;
627}