blob: 6a8e49b1aa62009216a92c692e28fa7b5a9b0ed7 [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"
Etienne Carriere294ffbd2018-04-26 14:20:35 +020029#include "ta_storage.h"
Pascal Brandc639ac82015-07-02 08:53:34 +020030
31#include <tee_api.h>
Pascal Brand90f23352016-05-19 15:15:47 +020032#include <trace.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020033
34#define ASSERT_PARAM_TYPE(pt) \
35do { \
36 if ((pt) != param_types) \
37 return TEE_ERROR_BAD_PARAMETERS; \
38} while (0)
39
Jens Wiklanderc5231592015-11-11 09:27:27 +010040#define VAL2HANDLE(v) (void *)(uintptr_t)(v)
41
Etienne Carriere294ffbd2018-04-26 14:20:35 +020042TEE_Result ta_storage_cmd_open(uint32_t command,
43 uint32_t param_types, TEE_Param params[4])
Pascal Brandc639ac82015-07-02 08:53:34 +020044{
Etienne Carriere102092e2019-03-28 15:24:22 +010045 TEE_Result res = TEE_ERROR_GENERIC;
46 TEE_ObjectHandle o = TEE_HANDLE_NULL;
47 void *object_id = NULL;
Jens Wiklanderc5231592015-11-11 09:27:27 +010048
Pascal Brandc639ac82015-07-02 08:53:34 +020049 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
50 (TEE_PARAM_TYPE_MEMREF_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020051 TEE_PARAM_TYPE_VALUE_INOUT,
52 TEE_PARAM_TYPE_VALUE_INPUT,
Pascal Brandc639ac82015-07-02 08:53:34 +020053 TEE_PARAM_TYPE_NONE));
54
Etienne Carriere294ffbd2018-04-26 14:20:35 +020055 switch (command) {
56 case TA_STORAGE_CMD_OPEN:
57 object_id = TEE_Malloc(params[0].memref.size, 0);
58 if (!object_id)
59 return TEE_ERROR_OUT_OF_MEMORY;
Etienne Carriere9811a802018-02-16 16:11:42 +010060
Etienne Carriere294ffbd2018-04-26 14:20:35 +020061 TEE_MemMove(object_id, params[0].memref.buffer,
62 params[0].memref.size);
63 break;
64 case TA_STORAGE_CMD_OPEN_ID_IN_SHM:
65 object_id = params[0].memref.buffer;
66 break;
67 default:
68 return TEE_ERROR_NOT_SUPPORTED;
69 }
Etienne Carriere9811a802018-02-16 16:11:42 +010070
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020071 res = TEE_OpenPersistentObject(params[2].value.a,
Etienne Carriere294ffbd2018-04-26 14:20:35 +020072 object_id, params[0].memref.size,
Jens Wiklanderc5231592015-11-11 09:27:27 +010073 params[1].value.a, &o);
74
75 params[1].value.b = (uintptr_t)o;
Etienne Carriere294ffbd2018-04-26 14:20:35 +020076
77 if (command == TA_STORAGE_CMD_OPEN)
78 TEE_Free(object_id);
Etienne Carriere9811a802018-02-16 16:11:42 +010079
Jens Wiklanderc5231592015-11-11 09:27:27 +010080 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +020081}
82
Etienne Carriere294ffbd2018-04-26 14:20:35 +020083TEE_Result ta_storage_cmd_create(uint32_t command,
84 uint32_t param_types, TEE_Param params[4])
Pascal Brandc639ac82015-07-02 08:53:34 +020085{
Etienne Carriere102092e2019-03-28 15:24:22 +010086 TEE_Result res = TEE_ERROR_GENERIC;
87 TEE_ObjectHandle o = TEE_HANDLE_NULL;
88 void *object_id = NULL;
89 TEE_ObjectHandle ref_handle = TEE_HANDLE_NULL;
Jens Wiklanderc5231592015-11-11 09:27:27 +010090
Pascal Brandc639ac82015-07-02 08:53:34 +020091 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
92 (TEE_PARAM_TYPE_MEMREF_INPUT,
93 TEE_PARAM_TYPE_VALUE_INOUT,
94 TEE_PARAM_TYPE_VALUE_INPUT,
95 TEE_PARAM_TYPE_MEMREF_INPUT));
96
Etienne Carriere294ffbd2018-04-26 14:20:35 +020097 switch (command) {
98 case TA_STORAGE_CMD_CREATE:
99 object_id = TEE_Malloc(params[0].memref.size, 0);
100 if (!object_id)
101 return TEE_ERROR_OUT_OF_MEMORY;
Etienne Carriere9811a802018-02-16 16:11:42 +0100102
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200103 TEE_MemMove(object_id, params[0].memref.buffer,
104 params[0].memref.size);
105 break;
106 case TA_STORAGE_CMD_CREATE_ID_IN_SHM:
107 object_id = params[0].memref.buffer;
108 break;
109 default:
110 return TEE_ERROR_NOT_SUPPORTED;
111 }
112
113 ref_handle = (TEE_ObjectHandle)(uintptr_t)params[2].value.a;
Etienne Carriere9811a802018-02-16 16:11:42 +0100114
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200115 res = TEE_CreatePersistentObject(params[2].value.b,
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200116 object_id, params[0].memref.size,
117 params[1].value.a, ref_handle,
Etienne Carriere9811a802018-02-16 16:11:42 +0100118 params[3].memref.buffer,
119 params[3].memref.size, &o);
120
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200121 if (command == TA_STORAGE_CMD_CREATE)
122 TEE_Free(object_id);
123
Jens Wiklanderc5231592015-11-11 09:27:27 +0100124 params[1].value.b = (uintptr_t)o;
Etienne Carriere9811a802018-02-16 16:11:42 +0100125
Jens Wiklanderc5231592015-11-11 09:27:27 +0100126 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +0200127}
128
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200129TEE_Result ta_storage_cmd_create_overwrite(uint32_t command,
130 uint32_t param_types,
Pascal Brandeb84c442016-04-19 17:49:49 +0200131 TEE_Param params[4])
132{
Etienne Carriere102092e2019-03-28 15:24:22 +0100133 TEE_Result res = TEE_ERROR_GENERIC;
134 void *object_id = NULL;
Pascal Brandeb84c442016-04-19 17:49:49 +0200135
136 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
137 (TEE_PARAM_TYPE_MEMREF_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200138 TEE_PARAM_TYPE_VALUE_INPUT,
Pascal Brandeb84c442016-04-19 17:49:49 +0200139 TEE_PARAM_TYPE_NONE,
140 TEE_PARAM_TYPE_NONE));
141
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200142 switch (command) {
143 case TA_STORAGE_CMD_CREATE_OVERWRITE:
144 object_id = TEE_Malloc(params[0].memref.size, 0);
145 if (!object_id)
146 return TEE_ERROR_OUT_OF_MEMORY;
Etienne Carriere9811a802018-02-16 16:11:42 +0100147
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200148 TEE_MemMove(object_id, params[0].memref.buffer,
149 params[0].memref.size);
150 break;
151 case TA_STORAGE_CMD_CREATEOVER_ID_IN_SHM:
152 object_id = params[0].memref.buffer;
153 break;
154 default:
155 return TEE_ERROR_NOT_SUPPORTED;
156 }
Etienne Carriere9811a802018-02-16 16:11:42 +0100157
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200158 res = TEE_CreatePersistentObject(params[1].value.a,
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200159 object_id, params[0].memref.size,
Etienne Carriere9811a802018-02-16 16:11:42 +0100160 TEE_DATA_FLAG_OVERWRITE,
161 NULL, NULL, 0, NULL);
162
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200163 if (command == TA_STORAGE_CMD_CREATE_OVERWRITE)
164 TEE_Free(object_id);
Etienne Carriere9811a802018-02-16 16:11:42 +0100165
Pascal Brandeb84c442016-04-19 17:49:49 +0200166 return res;
167}
168
Pascal Brandc639ac82015-07-02 08:53:34 +0200169TEE_Result ta_storage_cmd_close(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
Jens Wiklanderc5231592015-11-11 09:27:27 +0100175 TEE_CloseObject((TEE_ObjectHandle)(uintptr_t)params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200176
177 return TEE_SUCCESS;
178}
179
180TEE_Result ta_storage_cmd_read(uint32_t param_types, TEE_Param params[4])
181{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100182 TEE_ObjectHandle o = VAL2HANDLE(params[1].value.a);
183
Pascal Brandc639ac82015-07-02 08:53:34 +0200184 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
185 (TEE_PARAM_TYPE_MEMREF_OUTPUT,
186 TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE,
187 TEE_PARAM_TYPE_NONE));
188
Jens Wiklanderc5231592015-11-11 09:27:27 +0100189 return TEE_ReadObjectData(o, params[0].memref.buffer,
Pascal Brandc639ac82015-07-02 08:53:34 +0200190 params[0].memref.size, &params[1].value.b);
191}
192
193TEE_Result ta_storage_cmd_write(uint32_t param_types, TEE_Param params[4])
194{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100195 TEE_ObjectHandle o = VAL2HANDLE(params[1].value.a);
196
Pascal Brandc639ac82015-07-02 08:53:34 +0200197 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
198 (TEE_PARAM_TYPE_MEMREF_INPUT,
199 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
200 TEE_PARAM_TYPE_NONE));
201
Jens Wiklanderc5231592015-11-11 09:27:27 +0100202 return TEE_WriteObjectData(o, params[0].memref.buffer,
Pascal Brandc639ac82015-07-02 08:53:34 +0200203 params[0].memref.size);
204}
205
206TEE_Result ta_storage_cmd_seek(uint32_t param_types, TEE_Param params[4])
207{
Etienne Carriere102092e2019-03-28 15:24:22 +0100208 TEE_Result res = TEE_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200209 TEE_ObjectInfo info;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100210 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
Etienne Carriere102092e2019-03-28 15:24:22 +0100211 int32_t offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200212
213 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
214 (TEE_PARAM_TYPE_VALUE_INPUT,
215 TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE,
216 TEE_PARAM_TYPE_NONE));
217
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200218 offs = *(int32_t *)&params[0].value.b;
219 res = TEE_SeekObjectData(o, offs, params[1].value.a);
Jens Wiklanderc5231592015-11-11 09:27:27 +0100220 if (res != TEE_SUCCESS)
221 return res;
222 res = TEE_GetObjectInfo1(o, &info);
Pascal Brandc639ac82015-07-02 08:53:34 +0200223
224 params[1].value.b = info.dataPosition;
225
226 return res;
227}
228
229TEE_Result ta_storage_cmd_unlink(uint32_t param_types, TEE_Param params[4])
230{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100231 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
232
Pascal Brandc639ac82015-07-02 08:53:34 +0200233 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
234 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
235 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
236
Jens Wiklanderc5231592015-11-11 09:27:27 +0100237 TEE_CloseAndDeletePersistentObject1(o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200238
239 return TEE_SUCCESS;
240}
241
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200242TEE_Result ta_storage_cmd_rename(uint32_t command, uint32_t param_types,
243 TEE_Param params[4])
Pascal Brandc639ac82015-07-02 08:53:34 +0200244{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100245 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
Etienne Carriere102092e2019-03-28 15:24:22 +0100246 void *object_id = NULL;
247 TEE_Result res = TEE_ERROR_GENERIC;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100248
Pascal Brandc639ac82015-07-02 08:53:34 +0200249 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
250 (TEE_PARAM_TYPE_VALUE_INPUT,
251 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
252 TEE_PARAM_TYPE_NONE));
253
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200254 switch (command) {
255 case TA_STORAGE_CMD_RENAME:
256 object_id = TEE_Malloc(params[1].memref.size, 0);
257 if (!object_id)
258 return TEE_ERROR_OUT_OF_MEMORY;
Etienne Carriere9811a802018-02-16 16:11:42 +0100259
Etienne Carriere294ffbd2018-04-26 14:20:35 +0200260 TEE_MemMove(object_id, params[1].memref.buffer,
261 params[1].memref.size);
262 break;
263 case TA_STORAGE_CMD_RENAME_ID_IN_SHM:
264 object_id = params[1].memref.buffer;
265 break;
266 default:
267 return TEE_ERROR_NOT_SUPPORTED;
268 }
269
270 res = TEE_RenamePersistentObject(o, object_id, params[1].memref.size);
271
272 if (command == TA_STORAGE_CMD_RENAME)
273 TEE_Free(object_id);
Etienne Carriere9811a802018-02-16 16:11:42 +0100274
275 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +0200276}
277
278TEE_Result ta_storage_cmd_trunc(uint32_t param_types, TEE_Param params[4])
279{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100280 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
281
Pascal Brandc639ac82015-07-02 08:53:34 +0200282 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
283 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
284 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
285
Jens Wiklanderc5231592015-11-11 09:27:27 +0100286 return TEE_TruncateObjectData(o, params[0].value.b);
Pascal Brandc639ac82015-07-02 08:53:34 +0200287}
288
289TEE_Result ta_storage_cmd_alloc_enum(uint32_t param_types, TEE_Param params[4])
290{
Etienne Carriere102092e2019-03-28 15:24:22 +0100291 TEE_Result res = TEE_ERROR_GENERIC;
292 TEE_ObjectEnumHandle oe = TEE_HANDLE_NULL;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100293
Pascal Brandc639ac82015-07-02 08:53:34 +0200294 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
295 (TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,
296 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
297
Jens Wiklanderc5231592015-11-11 09:27:27 +0100298 res = TEE_AllocatePersistentObjectEnumerator(&oe);
299 params[0].value.a = (uintptr_t)oe;
300 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +0200301}
302
303TEE_Result ta_storage_cmd_free_enum(uint32_t param_types, TEE_Param params[4])
304{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100305 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
306
Pascal Brandc639ac82015-07-02 08:53:34 +0200307 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
308 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
309 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
310
Jens Wiklanderc5231592015-11-11 09:27:27 +0100311 TEE_FreePersistentObjectEnumerator(oe);
Pascal Brandc639ac82015-07-02 08:53:34 +0200312 return TEE_SUCCESS;
313}
314
315TEE_Result ta_storage_cmd_reset_enum(uint32_t param_types, TEE_Param params[4])
316{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100317 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
318
Pascal Brandc639ac82015-07-02 08:53:34 +0200319 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
320 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
321 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
322
Jens Wiklanderc5231592015-11-11 09:27:27 +0100323 TEE_ResetPersistentObjectEnumerator(oe);
Pascal Brandc639ac82015-07-02 08:53:34 +0200324 return TEE_SUCCESS;
325}
326
327TEE_Result ta_storage_cmd_start_enum(uint32_t param_types, TEE_Param params[4])
328{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100329 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
330
Pascal Brandc639ac82015-07-02 08:53:34 +0200331 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
332 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
333 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
334
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200335 return TEE_StartPersistentObjectEnumerator(oe, params[0].value.b);
Pascal Brandc639ac82015-07-02 08:53:34 +0200336}
337
338TEE_Result ta_storage_cmd_next_enum(uint32_t param_types, TEE_Param params[4])
339{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100340 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
Etienne Carriere102092e2019-03-28 15:24:22 +0100341 TEE_ObjectInfo *obj = NULL;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100342
Pascal Brandc603e0d2016-04-25 12:37:18 +0200343 if (TEE_PARAM_TYPE_GET(param_types, 0) != TEE_PARAM_TYPE_VALUE_INPUT)
344 return TEE_ERROR_BAD_PARAMETERS;
345 if (TEE_PARAM_TYPE_GET(param_types, 2) != TEE_PARAM_TYPE_MEMREF_OUTPUT)
346 return TEE_ERROR_BAD_PARAMETERS;
347 if (TEE_PARAM_TYPE_GET(param_types, 3) != TEE_PARAM_TYPE_NONE)
348 return TEE_ERROR_BAD_PARAMETERS;
Pascal Brandc639ac82015-07-02 08:53:34 +0200349
Pascal Brandc603e0d2016-04-25 12:37:18 +0200350 if (TEE_PARAM_TYPE_GET(param_types, 1) == TEE_PARAM_TYPE_NONE)
351 obj = NULL;
352 else if (TEE_PARAM_TYPE_GET(param_types, 1) ==
353 TEE_PARAM_TYPE_MEMREF_OUTPUT) {
354 if (params[1].memref.size < sizeof(TEE_ObjectInfo)) {
355 params[1].memref.size = sizeof(TEE_ObjectInfo);
356 return TEE_ERROR_SHORT_BUFFER;
357 }
358 params[1].memref.size = sizeof(TEE_ObjectInfo);
359 obj = (TEE_ObjectInfo *)params[1].memref.buffer;
360 } else
361 return TEE_ERROR_BAD_PARAMETERS;
Pascal Brandc639ac82015-07-02 08:53:34 +0200362
363 if (params[2].memref.size < TEE_OBJECT_ID_MAX_LEN)
364 return TEE_ERROR_SHORT_BUFFER;
365
Pascal Brandc603e0d2016-04-25 12:37:18 +0200366 return TEE_GetNextPersistentObject(oe, obj,
367 params[2].memref.buffer,
368 &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200369}
Pascal Brand90f23352016-05-19 15:15:47 +0200370
371static TEE_Result check_obj(TEE_ObjectInfo *o1, TEE_ObjectInfo *o2)
372{
373 if ((o1->objectType != o2->objectType) ||
374 (o1->keySize != o2->keySize) ||
375 (o1->maxKeySize != o2->maxKeySize) ||
376 (o1->objectUsage != o2->objectUsage))
377 return TEE_ERROR_GENERIC;
378 return TEE_SUCCESS;
379}
380
381TEE_Result ta_storage_cmd_key_in_persistent(uint32_t param_types,
382 TEE_Param params[4])
383{
384 TEE_Result result = TEE_SUCCESS;
Etienne Carriere102092e2019-03-28 15:24:22 +0100385 TEE_ObjectHandle transient_key = TEE_HANDLE_NULL;
386 TEE_ObjectHandle persistent_key = TEE_HANDLE_NULL;
387 TEE_ObjectHandle key = TEE_HANDLE_NULL;
388 TEE_OperationHandle encrypt_op = TEE_HANDLE_NULL;
Pascal Brand90f23352016-05-19 15:15:47 +0200389 TEE_ObjectInfo keyInfo;
390 TEE_ObjectInfo keyInfo2;
391 TEE_ObjectInfo keyInfo3;
392 uint32_t alg = TEE_ALG_AES_CBC_NOPAD;
393 void *IV = NULL;
394 size_t IVlen = 16;
395 size_t key_size = 256;
396 uint32_t objectID = 1;
397 uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
398 TEE_DATA_FLAG_ACCESS_WRITE |
399 TEE_DATA_FLAG_ACCESS_WRITE_META |
400 TEE_DATA_FLAG_SHARE_READ |
401 TEE_DATA_FLAG_SHARE_WRITE;
402
Etienne Carriere102092e2019-03-28 15:24:22 +0100403 TEE_MemFill(&keyInfo, 0, sizeof(keyInfo));
404 TEE_MemFill(&keyInfo2, 0, sizeof(keyInfo2));
405 TEE_MemFill(&keyInfo3, 0, sizeof(keyInfo3));
406
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200407 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
408 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
409 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
Pascal Brand90f23352016-05-19 15:15:47 +0200410
411 result = TEE_AllocateTransientObject(TEE_TYPE_AES, key_size,
412 &transient_key);
413 if (result != TEE_SUCCESS) {
414 EMSG("Failed to Allocate transient object handle : 0x%x",
415 result);
416 goto cleanup1;
417 }
418
419 result = TEE_GenerateKey(transient_key, key_size, NULL, 0);
420 if (result != TEE_SUCCESS) {
421 EMSG("Failed to generate a transient key: 0x%x", result);
422 goto cleanup2;
423 }
424
425 TEE_GetObjectInfo1(transient_key, &keyInfo);
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200426 result = TEE_CreatePersistentObject(params[0].value.a,
Pascal Brand90f23352016-05-19 15:15:47 +0200427 &objectID, sizeof(objectID),
428 flags, transient_key, NULL, 0,
429 &persistent_key);
430 if (result != TEE_SUCCESS) {
431 EMSG("Failed to create a persistent key: 0x%x", result);
432 goto cleanup2;
433 }
434
435 TEE_GetObjectInfo1(persistent_key, &keyInfo2);
436 result = check_obj(&keyInfo, &keyInfo2);
437 if (result != TEE_SUCCESS) {
438 EMSG("keyInfo and keyInfo2 are different");
439 goto cleanup2;
440 }
441
442 TEE_CloseObject(persistent_key);
443
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200444 result = TEE_OpenPersistentObject(params[0].value.a,
Pascal Brand90f23352016-05-19 15:15:47 +0200445 &objectID, sizeof(objectID),
446 flags, &key);
447 if (result != TEE_SUCCESS) {
448 EMSG("Failed to open persistent key: 0x%x", result);
449 goto cleanup2;
450 }
451
452 TEE_GetObjectInfo(key, &keyInfo3);
453 result = check_obj(&keyInfo3, &keyInfo2);
454 if (result != TEE_SUCCESS) {
455 EMSG("keyInfo2 and keyInfo3 are different");
456 goto cleanup2;
457 }
458
459 result = TEE_AllocateOperation(&encrypt_op, alg, TEE_MODE_ENCRYPT,
460 keyInfo3.maxObjectSize);
461 if (result != TEE_SUCCESS) {
462 EMSG("Failed to allocate an operation: 0x%x", result);
463 goto cleanup3;
464 }
465
466 result = TEE_SetOperationKey(encrypt_op, key);
467 if (result != TEE_SUCCESS) {
468 EMSG("Failed to set operation key: 0x%x", result);
469 goto cleanup4;
470 }
471
472 IV = TEE_Malloc(IVlen, 0);
473 if (!IV) {
474 EMSG("Out of memory for IV.");
475 result = TEE_ERROR_OUT_OF_MEMORY;
476 goto cleanup4;
477 }
478
479 TEE_CipherInit(encrypt_op, IV, IVlen);
480 TEE_Free(IV);
481
482cleanup4:
483 TEE_FreeOperation(encrypt_op);
484cleanup3:
485 TEE_CloseAndDeletePersistentObject1(key);
486cleanup2:
487 TEE_FreeTransientObject(transient_key);
488cleanup1:
489 return result;
490}
491
Pascal Brand29ee18f2016-05-23 14:13:56 +0200492TEE_Result ta_storage_cmd_loop(uint32_t param_types, TEE_Param params[4])
493{
494 TEE_ObjectHandle object = TEE_HANDLE_NULL;
Etienne Carriere102092e2019-03-28 15:24:22 +0100495 TEE_Result res = TEE_ERROR_GENERIC;
Pascal Brand29ee18f2016-05-23 14:13:56 +0200496 int object_id = 0;
497 uint32_t flags = TEE_DATA_FLAG_OVERWRITE |
498 TEE_DATA_FLAG_ACCESS_WRITE_META;
499 int i = 0;
500
Pascal Brand29ee18f2016-05-23 14:13:56 +0200501 (void)params;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200502 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
503 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
504 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
Pascal Brand29ee18f2016-05-23 14:13:56 +0200505
506 for (i = 0; i < 20; i++) {
507 DMSG("\n\nLOOP : %d", i);
508 object = TEE_HANDLE_NULL;
509 object_id = i;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200510 res = TEE_CreatePersistentObject(params[0].value.a,
Pascal Brand29ee18f2016-05-23 14:13:56 +0200511 &object_id, sizeof(int), flags,
512 TEE_HANDLE_NULL, NULL, 0,
513 &object);
514
515 if (res != TEE_SUCCESS) {
516 EMSG("FAIL");
517 return res;
518 }
519
520 res = TEE_CloseAndDeletePersistentObject1(object);
521 if (res != TEE_SUCCESS) {
522 EMSG("FAIL");
523 return res;
524 }
525 }
526
527 return TEE_SUCCESS;
528}
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200529
530TEE_Result ta_storage_cmd_restrict_usage(uint32_t param_types,
531 TEE_Param params[4])
532{
Etienne Carriere102092e2019-03-28 15:24:22 +0100533 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200534
535 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
536 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
537 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
538
539 o = (TEE_ObjectHandle)(uintptr_t)params[0].value.a;
540 TEE_RestrictObjectUsage1(o, params[0].value.b);
541 return TEE_SUCCESS;
542}
543
544TEE_Result ta_storage_cmd_alloc_obj(uint32_t param_types, TEE_Param params[4])
545{
Etienne Carriere102092e2019-03-28 15:24:22 +0100546 TEE_Result res = TEE_ERROR_GENERIC;
547 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200548
549 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
550 (TEE_PARAM_TYPE_VALUE_INPUT,
551 TEE_PARAM_TYPE_VALUE_OUTPUT,
552 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
553
554 res = TEE_AllocateTransientObject(params[0].value.a, params[0].value.b,
555 &o);
556 params[1].value.a = (uint32_t)(uintptr_t)o;
557 return res;
558}
559
560TEE_Result ta_storage_cmd_free_obj(uint32_t param_types, TEE_Param params[4])
561{
Etienne Carriere102092e2019-03-28 15:24:22 +0100562 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200563
564 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
565 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
566 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
567
568 o = (TEE_ObjectHandle)(uintptr_t)params[0].value.a;
569 TEE_FreeTransientObject(o);
570 return TEE_SUCCESS;
571}
572
573TEE_Result ta_storage_cmd_reset_obj(uint32_t param_types, TEE_Param params[4])
574{
Etienne Carriere102092e2019-03-28 15:24:22 +0100575 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200576
577 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
578 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
579 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
580
581 o = (TEE_ObjectHandle)(uintptr_t)params[0].value.a;
582 TEE_ResetTransientObject(o);
583 return TEE_SUCCESS;
584}
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800585
586TEE_Result ta_storage_cmd_get_obj_info(uint32_t param_types,
587 TEE_Param params[4])
588{
Etienne Carriere102092e2019-03-28 15:24:22 +0100589 TEE_Result res = TEE_ERROR_GENERIC;
590 TEE_ObjectInfo *info = NULL;
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800591 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
592
593 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
594 (TEE_PARAM_TYPE_VALUE_INPUT,
595 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE,
596 TEE_PARAM_TYPE_NONE));
597
598 info = (TEE_ObjectInfo *)params[1].memref.buffer;
599 res = TEE_GetObjectInfo1(o, info);
600
601 return res;
602}