blob: 6d9759767f497406c3ba0cdbf8e7395fb78e5def [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>
Pascal Brand90f23352016-05-19 15:15:47 +020031#include <trace.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020032
33#define ASSERT_PARAM_TYPE(pt) \
34do { \
35 if ((pt) != param_types) \
36 return TEE_ERROR_BAD_PARAMETERS; \
37} while (0)
38
Jens Wiklanderc5231592015-11-11 09:27:27 +010039#define VAL2HANDLE(v) (void *)(uintptr_t)(v)
40
Pascal Brandc639ac82015-07-02 08:53:34 +020041TEE_Result ta_storage_cmd_open(uint32_t param_types, TEE_Param params[4])
42{
Jens Wiklanderc5231592015-11-11 09:27:27 +010043 TEE_Result res;
44 TEE_ObjectHandle o;
Etienne Carriere9811a802018-02-16 16:11:42 +010045 void *object_id;
46 size_t object_id_size;
Jens Wiklanderc5231592015-11-11 09:27:27 +010047
Pascal Brandc639ac82015-07-02 08:53:34 +020048 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
49 (TEE_PARAM_TYPE_MEMREF_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020050 TEE_PARAM_TYPE_VALUE_INOUT,
51 TEE_PARAM_TYPE_VALUE_INPUT,
Pascal Brandc639ac82015-07-02 08:53:34 +020052 TEE_PARAM_TYPE_NONE));
53
Etienne Carriere9811a802018-02-16 16:11:42 +010054 object_id_size = params[0].memref.size;
55 object_id = TEE_Malloc(object_id_size, 0);
56 if (!object_id)
57 return TEE_ERROR_OUT_OF_MEMORY;
58
59 TEE_MemMove(object_id, params[0].memref.buffer, object_id_size);
60
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020061 res = TEE_OpenPersistentObject(params[2].value.a,
Etienne Carriere9811a802018-02-16 16:11:42 +010062 object_id, object_id_size,
Jens Wiklanderc5231592015-11-11 09:27:27 +010063 params[1].value.a, &o);
64
65 params[1].value.b = (uintptr_t)o;
Etienne Carriere9811a802018-02-16 16:11:42 +010066 TEE_Free(object_id);
67
Jens Wiklanderc5231592015-11-11 09:27:27 +010068 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +020069}
70
71TEE_Result ta_storage_cmd_create(uint32_t param_types, TEE_Param params[4])
72{
Jens Wiklanderc5231592015-11-11 09:27:27 +010073 TEE_Result res;
74 TEE_ObjectHandle o;
Etienne Carriere9811a802018-02-16 16:11:42 +010075 void *object_id;
76 size_t object_id_size;
77 TEE_ObjectHandle ref;
Jens Wiklanderc5231592015-11-11 09:27:27 +010078
Pascal Brandc639ac82015-07-02 08:53:34 +020079 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
80 (TEE_PARAM_TYPE_MEMREF_INPUT,
81 TEE_PARAM_TYPE_VALUE_INOUT,
82 TEE_PARAM_TYPE_VALUE_INPUT,
83 TEE_PARAM_TYPE_MEMREF_INPUT));
84
Etienne Carriere9811a802018-02-16 16:11:42 +010085 object_id_size = params[0].memref.size;
86 object_id = TEE_Malloc(object_id_size, 0);
87 if (!object_id)
88 return TEE_ERROR_OUT_OF_MEMORY;
89
90 TEE_MemMove(object_id, params[0].memref.buffer, object_id_size);
91 ref = (TEE_ObjectHandle)(uintptr_t)params[2].value.a;
92
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020093 res = TEE_CreatePersistentObject(params[2].value.b,
Etienne Carriere9811a802018-02-16 16:11:42 +010094 object_id, object_id_size,
95 params[1].value.a, ref,
96 params[3].memref.buffer,
97 params[3].memref.size, &o);
98
Jens Wiklanderc5231592015-11-11 09:27:27 +010099 params[1].value.b = (uintptr_t)o;
Etienne Carriere9811a802018-02-16 16:11:42 +0100100 TEE_Free(object_id);
101
Jens Wiklanderc5231592015-11-11 09:27:27 +0100102 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +0200103}
104
Pascal Brandeb84c442016-04-19 17:49:49 +0200105TEE_Result ta_storage_cmd_create_overwrite(uint32_t param_types,
106 TEE_Param params[4])
107{
108 TEE_Result res;
Etienne Carriere9811a802018-02-16 16:11:42 +0100109 void *object_id;
110 size_t object_id_size;
Pascal Brandeb84c442016-04-19 17:49:49 +0200111
112 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
113 (TEE_PARAM_TYPE_MEMREF_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200114 TEE_PARAM_TYPE_VALUE_INPUT,
Pascal Brandeb84c442016-04-19 17:49:49 +0200115 TEE_PARAM_TYPE_NONE,
116 TEE_PARAM_TYPE_NONE));
117
Etienne Carriere9811a802018-02-16 16:11:42 +0100118 object_id_size = params[0].memref.size;
119 object_id = TEE_Malloc(object_id_size, 0);
120 if (!object_id)
121 return TEE_ERROR_OUT_OF_MEMORY;
122
123 TEE_MemMove(object_id, params[0].memref.buffer, object_id_size);
124
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200125 res = TEE_CreatePersistentObject(params[1].value.a,
Etienne Carriere9811a802018-02-16 16:11:42 +0100126 object_id, object_id_size,
127 TEE_DATA_FLAG_OVERWRITE,
128 NULL, NULL, 0, NULL);
129
130 TEE_Free(object_id);
131
Pascal Brandeb84c442016-04-19 17:49:49 +0200132 return res;
133}
134
Pascal Brandc639ac82015-07-02 08:53:34 +0200135TEE_Result ta_storage_cmd_close(uint32_t param_types, TEE_Param params[4])
136{
137 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
138 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
139 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
140
Jens Wiklanderc5231592015-11-11 09:27:27 +0100141 TEE_CloseObject((TEE_ObjectHandle)(uintptr_t)params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200142
143 return TEE_SUCCESS;
144}
145
146TEE_Result ta_storage_cmd_read(uint32_t param_types, TEE_Param params[4])
147{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100148 TEE_ObjectHandle o = VAL2HANDLE(params[1].value.a);
149
Pascal Brandc639ac82015-07-02 08:53:34 +0200150 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
151 (TEE_PARAM_TYPE_MEMREF_OUTPUT,
152 TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE,
153 TEE_PARAM_TYPE_NONE));
154
Jens Wiklanderc5231592015-11-11 09:27:27 +0100155 return TEE_ReadObjectData(o, params[0].memref.buffer,
Pascal Brandc639ac82015-07-02 08:53:34 +0200156 params[0].memref.size, &params[1].value.b);
157}
158
159TEE_Result ta_storage_cmd_write(uint32_t param_types, TEE_Param params[4])
160{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100161 TEE_ObjectHandle o = VAL2HANDLE(params[1].value.a);
162
Pascal Brandc639ac82015-07-02 08:53:34 +0200163 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
164 (TEE_PARAM_TYPE_MEMREF_INPUT,
165 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
166 TEE_PARAM_TYPE_NONE));
167
Jens Wiklanderc5231592015-11-11 09:27:27 +0100168 return TEE_WriteObjectData(o, params[0].memref.buffer,
Pascal Brandc639ac82015-07-02 08:53:34 +0200169 params[0].memref.size);
170}
171
172TEE_Result ta_storage_cmd_seek(uint32_t param_types, TEE_Param params[4])
173{
174 TEE_Result res;
175 TEE_ObjectInfo info;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100176 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200177 int32_t offs;
Pascal Brandc639ac82015-07-02 08:53:34 +0200178
179 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
180 (TEE_PARAM_TYPE_VALUE_INPUT,
181 TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE,
182 TEE_PARAM_TYPE_NONE));
183
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200184 offs = *(int32_t *)&params[0].value.b;
185 res = TEE_SeekObjectData(o, offs, params[1].value.a);
Jens Wiklanderc5231592015-11-11 09:27:27 +0100186 if (res != TEE_SUCCESS)
187 return res;
188 res = TEE_GetObjectInfo1(o, &info);
Pascal Brandc639ac82015-07-02 08:53:34 +0200189
190 params[1].value.b = info.dataPosition;
191
192 return res;
193}
194
195TEE_Result ta_storage_cmd_unlink(uint32_t param_types, TEE_Param params[4])
196{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100197 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
198
Pascal Brandc639ac82015-07-02 08:53:34 +0200199 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
200 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
201 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
202
Jens Wiklanderc5231592015-11-11 09:27:27 +0100203 TEE_CloseAndDeletePersistentObject1(o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200204
205 return TEE_SUCCESS;
206}
207
208TEE_Result ta_storage_cmd_rename(uint32_t param_types, TEE_Param params[4])
209{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100210 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
Etienne Carriere9811a802018-02-16 16:11:42 +0100211 void *object_id;
212 size_t object_id_size;
213 TEE_Result res;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100214
Pascal Brandc639ac82015-07-02 08:53:34 +0200215 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
216 (TEE_PARAM_TYPE_VALUE_INPUT,
217 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
218 TEE_PARAM_TYPE_NONE));
219
Etienne Carriere9811a802018-02-16 16:11:42 +0100220 object_id_size = params[1].memref.size;
221 object_id = TEE_Malloc(object_id_size, 0);
222 if (!object_id)
223 return TEE_ERROR_OUT_OF_MEMORY;
224
225 TEE_MemMove(object_id, params[1].memref.buffer, object_id_size);
226 res = TEE_RenamePersistentObject(o, object_id, object_id_size);
227 TEE_Free(object_id);
228
229 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +0200230}
231
232TEE_Result ta_storage_cmd_trunc(uint32_t param_types, TEE_Param params[4])
233{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100234 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
235
Pascal Brandc639ac82015-07-02 08:53:34 +0200236 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
237 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
238 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
239
Jens Wiklanderc5231592015-11-11 09:27:27 +0100240 return TEE_TruncateObjectData(o, params[0].value.b);
Pascal Brandc639ac82015-07-02 08:53:34 +0200241}
242
243TEE_Result ta_storage_cmd_alloc_enum(uint32_t param_types, TEE_Param params[4])
244{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100245 TEE_Result res;
246 TEE_ObjectEnumHandle oe;
247
Pascal Brandc639ac82015-07-02 08:53:34 +0200248 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
249 (TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,
250 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
251
Jens Wiklanderc5231592015-11-11 09:27:27 +0100252 res = TEE_AllocatePersistentObjectEnumerator(&oe);
253 params[0].value.a = (uintptr_t)oe;
254 return res;
Pascal Brandc639ac82015-07-02 08:53:34 +0200255}
256
257TEE_Result ta_storage_cmd_free_enum(uint32_t param_types, TEE_Param params[4])
258{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100259 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
260
Pascal Brandc639ac82015-07-02 08:53:34 +0200261 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
262 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
263 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
264
Jens Wiklanderc5231592015-11-11 09:27:27 +0100265 TEE_FreePersistentObjectEnumerator(oe);
Pascal Brandc639ac82015-07-02 08:53:34 +0200266 return TEE_SUCCESS;
267}
268
269TEE_Result ta_storage_cmd_reset_enum(uint32_t param_types, TEE_Param params[4])
270{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100271 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
272
Pascal Brandc639ac82015-07-02 08:53:34 +0200273 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
274 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
275 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
276
Jens Wiklanderc5231592015-11-11 09:27:27 +0100277 TEE_ResetPersistentObjectEnumerator(oe);
Pascal Brandc639ac82015-07-02 08:53:34 +0200278 return TEE_SUCCESS;
279}
280
281TEE_Result ta_storage_cmd_start_enum(uint32_t param_types, TEE_Param params[4])
282{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100283 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
284
Pascal Brandc639ac82015-07-02 08:53:34 +0200285 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
286 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
287 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
288
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200289 return TEE_StartPersistentObjectEnumerator(oe, params[0].value.b);
Pascal Brandc639ac82015-07-02 08:53:34 +0200290}
291
292TEE_Result ta_storage_cmd_next_enum(uint32_t param_types, TEE_Param params[4])
293{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100294 TEE_ObjectEnumHandle oe = VAL2HANDLE(params[0].value.a);
Pascal Brandc603e0d2016-04-25 12:37:18 +0200295 TEE_ObjectInfo *obj;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100296
Pascal Brandc603e0d2016-04-25 12:37:18 +0200297 if (TEE_PARAM_TYPE_GET(param_types, 0) != TEE_PARAM_TYPE_VALUE_INPUT)
298 return TEE_ERROR_BAD_PARAMETERS;
299 if (TEE_PARAM_TYPE_GET(param_types, 2) != TEE_PARAM_TYPE_MEMREF_OUTPUT)
300 return TEE_ERROR_BAD_PARAMETERS;
301 if (TEE_PARAM_TYPE_GET(param_types, 3) != TEE_PARAM_TYPE_NONE)
302 return TEE_ERROR_BAD_PARAMETERS;
Pascal Brandc639ac82015-07-02 08:53:34 +0200303
Pascal Brandc603e0d2016-04-25 12:37:18 +0200304 if (TEE_PARAM_TYPE_GET(param_types, 1) == TEE_PARAM_TYPE_NONE)
305 obj = NULL;
306 else if (TEE_PARAM_TYPE_GET(param_types, 1) ==
307 TEE_PARAM_TYPE_MEMREF_OUTPUT) {
308 if (params[1].memref.size < sizeof(TEE_ObjectInfo)) {
309 params[1].memref.size = sizeof(TEE_ObjectInfo);
310 return TEE_ERROR_SHORT_BUFFER;
311 }
312 params[1].memref.size = sizeof(TEE_ObjectInfo);
313 obj = (TEE_ObjectInfo *)params[1].memref.buffer;
314 } else
315 return TEE_ERROR_BAD_PARAMETERS;
Pascal Brandc639ac82015-07-02 08:53:34 +0200316
317 if (params[2].memref.size < TEE_OBJECT_ID_MAX_LEN)
318 return TEE_ERROR_SHORT_BUFFER;
319
Pascal Brandc603e0d2016-04-25 12:37:18 +0200320 return TEE_GetNextPersistentObject(oe, obj,
321 params[2].memref.buffer,
322 &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200323}
Pascal Brand90f23352016-05-19 15:15:47 +0200324
325static TEE_Result check_obj(TEE_ObjectInfo *o1, TEE_ObjectInfo *o2)
326{
327 if ((o1->objectType != o2->objectType) ||
328 (o1->keySize != o2->keySize) ||
329 (o1->maxKeySize != o2->maxKeySize) ||
330 (o1->objectUsage != o2->objectUsage))
331 return TEE_ERROR_GENERIC;
332 return TEE_SUCCESS;
333}
334
335TEE_Result ta_storage_cmd_key_in_persistent(uint32_t param_types,
336 TEE_Param params[4])
337{
338 TEE_Result result = TEE_SUCCESS;
339 TEE_ObjectHandle transient_key = (TEE_ObjectHandle)NULL;
340 TEE_ObjectHandle persistent_key = (TEE_ObjectHandle)NULL;
341 TEE_ObjectHandle key = (TEE_ObjectHandle)NULL;
342 TEE_OperationHandle encrypt_op = (TEE_OperationHandle)NULL;
343 TEE_ObjectInfo keyInfo;
344 TEE_ObjectInfo keyInfo2;
345 TEE_ObjectInfo keyInfo3;
346 uint32_t alg = TEE_ALG_AES_CBC_NOPAD;
347 void *IV = NULL;
348 size_t IVlen = 16;
349 size_t key_size = 256;
350 uint32_t objectID = 1;
351 uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
352 TEE_DATA_FLAG_ACCESS_WRITE |
353 TEE_DATA_FLAG_ACCESS_WRITE_META |
354 TEE_DATA_FLAG_SHARE_READ |
355 TEE_DATA_FLAG_SHARE_WRITE;
356
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200357 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
358 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
359 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
Pascal Brand90f23352016-05-19 15:15:47 +0200360
361 result = TEE_AllocateTransientObject(TEE_TYPE_AES, key_size,
362 &transient_key);
363 if (result != TEE_SUCCESS) {
364 EMSG("Failed to Allocate transient object handle : 0x%x",
365 result);
366 goto cleanup1;
367 }
368
369 result = TEE_GenerateKey(transient_key, key_size, NULL, 0);
370 if (result != TEE_SUCCESS) {
371 EMSG("Failed to generate a transient key: 0x%x", result);
372 goto cleanup2;
373 }
374
375 TEE_GetObjectInfo1(transient_key, &keyInfo);
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200376 result = TEE_CreatePersistentObject(params[0].value.a,
Pascal Brand90f23352016-05-19 15:15:47 +0200377 &objectID, sizeof(objectID),
378 flags, transient_key, NULL, 0,
379 &persistent_key);
380 if (result != TEE_SUCCESS) {
381 EMSG("Failed to create a persistent key: 0x%x", result);
382 goto cleanup2;
383 }
384
385 TEE_GetObjectInfo1(persistent_key, &keyInfo2);
386 result = check_obj(&keyInfo, &keyInfo2);
387 if (result != TEE_SUCCESS) {
388 EMSG("keyInfo and keyInfo2 are different");
389 goto cleanup2;
390 }
391
392 TEE_CloseObject(persistent_key);
393
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200394 result = TEE_OpenPersistentObject(params[0].value.a,
Pascal Brand90f23352016-05-19 15:15:47 +0200395 &objectID, sizeof(objectID),
396 flags, &key);
397 if (result != TEE_SUCCESS) {
398 EMSG("Failed to open persistent key: 0x%x", result);
399 goto cleanup2;
400 }
401
402 TEE_GetObjectInfo(key, &keyInfo3);
403 result = check_obj(&keyInfo3, &keyInfo2);
404 if (result != TEE_SUCCESS) {
405 EMSG("keyInfo2 and keyInfo3 are different");
406 goto cleanup2;
407 }
408
409 result = TEE_AllocateOperation(&encrypt_op, alg, TEE_MODE_ENCRYPT,
410 keyInfo3.maxObjectSize);
411 if (result != TEE_SUCCESS) {
412 EMSG("Failed to allocate an operation: 0x%x", result);
413 goto cleanup3;
414 }
415
416 result = TEE_SetOperationKey(encrypt_op, key);
417 if (result != TEE_SUCCESS) {
418 EMSG("Failed to set operation key: 0x%x", result);
419 goto cleanup4;
420 }
421
422 IV = TEE_Malloc(IVlen, 0);
423 if (!IV) {
424 EMSG("Out of memory for IV.");
425 result = TEE_ERROR_OUT_OF_MEMORY;
426 goto cleanup4;
427 }
428
429 TEE_CipherInit(encrypt_op, IV, IVlen);
430 TEE_Free(IV);
431
432cleanup4:
433 TEE_FreeOperation(encrypt_op);
434cleanup3:
435 TEE_CloseAndDeletePersistentObject1(key);
436cleanup2:
437 TEE_FreeTransientObject(transient_key);
438cleanup1:
439 return result;
440}
441
Pascal Brand29ee18f2016-05-23 14:13:56 +0200442TEE_Result ta_storage_cmd_loop(uint32_t param_types, TEE_Param params[4])
443{
444 TEE_ObjectHandle object = TEE_HANDLE_NULL;
445 TEE_Result res;
446 int object_id = 0;
447 uint32_t flags = TEE_DATA_FLAG_OVERWRITE |
448 TEE_DATA_FLAG_ACCESS_WRITE_META;
449 int i = 0;
450
Pascal Brand29ee18f2016-05-23 14:13:56 +0200451 (void)params;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200452 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
453 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
454 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
Pascal Brand29ee18f2016-05-23 14:13:56 +0200455
456 for (i = 0; i < 20; i++) {
457 DMSG("\n\nLOOP : %d", i);
458 object = TEE_HANDLE_NULL;
459 object_id = i;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200460 res = TEE_CreatePersistentObject(params[0].value.a,
Pascal Brand29ee18f2016-05-23 14:13:56 +0200461 &object_id, sizeof(int), flags,
462 TEE_HANDLE_NULL, NULL, 0,
463 &object);
464
465 if (res != TEE_SUCCESS) {
466 EMSG("FAIL");
467 return res;
468 }
469
470 res = TEE_CloseAndDeletePersistentObject1(object);
471 if (res != TEE_SUCCESS) {
472 EMSG("FAIL");
473 return res;
474 }
475 }
476
477 return TEE_SUCCESS;
478}
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200479
480TEE_Result ta_storage_cmd_restrict_usage(uint32_t param_types,
481 TEE_Param params[4])
482{
483 TEE_ObjectHandle o;
484
485 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
486 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
487 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
488
489 o = (TEE_ObjectHandle)(uintptr_t)params[0].value.a;
490 TEE_RestrictObjectUsage1(o, params[0].value.b);
491 return TEE_SUCCESS;
492}
493
494TEE_Result ta_storage_cmd_alloc_obj(uint32_t param_types, TEE_Param params[4])
495{
496 TEE_Result res;
497 TEE_ObjectHandle o;
498
499 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
500 (TEE_PARAM_TYPE_VALUE_INPUT,
501 TEE_PARAM_TYPE_VALUE_OUTPUT,
502 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
503
504 res = TEE_AllocateTransientObject(params[0].value.a, params[0].value.b,
505 &o);
506 params[1].value.a = (uint32_t)(uintptr_t)o;
507 return res;
508}
509
510TEE_Result ta_storage_cmd_free_obj(uint32_t param_types, TEE_Param params[4])
511{
512 TEE_ObjectHandle o;
513
514 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
515 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
516 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
517
518 o = (TEE_ObjectHandle)(uintptr_t)params[0].value.a;
519 TEE_FreeTransientObject(o);
520 return TEE_SUCCESS;
521}
522
523TEE_Result ta_storage_cmd_reset_obj(uint32_t param_types, TEE_Param params[4])
524{
525 TEE_ObjectHandle o;
526
527 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
528 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
529 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
530
531 o = (TEE_ObjectHandle)(uintptr_t)params[0].value.a;
532 TEE_ResetTransientObject(o);
533 return TEE_SUCCESS;
534}
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800535
536TEE_Result ta_storage_cmd_get_obj_info(uint32_t param_types,
537 TEE_Param params[4])
538{
539 TEE_Result res;
540 TEE_ObjectInfo *info;
541 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
542
543 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
544 (TEE_PARAM_TYPE_VALUE_INPUT,
545 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE,
546 TEE_PARAM_TYPE_NONE));
547
548 info = (TEE_ObjectInfo *)params[1].memref.buffer;
549 res = TEE_GetObjectInfo1(o, info);
550
551 return res;
552}