blob: d0c8edbdcf18f884d562e9722a24f077f024f8ac [file] [log] [blame]
Pascal Brandc639ac82015-07-02 08:53:34 +02001/*
2 * Copyright (c) 2014, STMicroelectronics International N.V.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#include <string.h>
15#include <stdio.h>
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +080016#include <pthread.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020017
18#include <adbg.h>
19#include <xtest_test.h>
20#include <xtest_helpers.h>
21
22#include <tee_client_api.h>
23#include <ta_storage.h>
24#include <tee_api_defines.h>
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020025#include <tee_api_defines_extensions.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020026#include <tee_api_types.h>
Jerome Forissiere3688342015-09-24 10:45:17 -070027#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +020028#include <TTA_DS_protocol.h>
29#endif
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020030#include <util.h>
31
Jens Wiklander14f48872018-06-29 15:30:13 +020032#define DEFINE_TEST_MULTIPLE_STORAGE_IDS(test_name) \
33static void test_name(ADBG_Case_t *c) \
34{ \
35 size_t i; \
36 \
37 for (i = 0; i < ARRAY_SIZE(storage_ids); i++) { \
38 Do_ADBG_BeginSubCase(c, "Storage id: %08x", storage_ids[i]); \
39 test_name##_single(c, storage_ids[i]); \
40 Do_ADBG_EndSubCase(c, "Storage id: %08x", storage_ids[i]); \
41 } \
42}
43
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020044static uint32_t storage_ids[] = {
45 TEE_STORAGE_PRIVATE,
46#ifdef CFG_REE_FS
47 TEE_STORAGE_PRIVATE_REE,
48#endif
49#ifdef CFG_RPMB_FS
50 TEE_STORAGE_PRIVATE_RPMB,
51#endif
52};
Pascal Brandc639ac82015-07-02 08:53:34 +020053
54static uint8_t file_00[] = {
55 0x00, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
56 0xF0, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
57 0xE9, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
58 0xF0, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x8E
59};
60
61static uint8_t file_01[] = {
62 0x01, 0x00
63};
64
65static uint8_t file_02[] = {
66 0x02, 0x11, 0x02
67};
68
69static uint8_t file_03[] = {
70 0x03, 0x13, 0x03
71};
72
Pascal Brandeb84c442016-04-19 17:49:49 +020073static uint8_t file_04[] = {
74 0x00, 0x01, 0x02
75};
76
Pascal Brandc639ac82015-07-02 08:53:34 +020077static uint8_t data_00[] = {
78 0x00, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
79 0x00, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
80 0x00, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
81 0x00, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x00
82};
83
84static uint8_t data_01[] = {
85 0x01, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
86 0x01, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
87 0x01, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
88 0x01, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x01
89};
90
Jens Wiklanderaba31ba2017-02-15 15:24:06 +010091static uint32_t fs_id_for_tee_storage_private(void)
92{
93#if defined(CFG_REE_FS)
94 return TEE_STORAGE_PRIVATE_REE;
95#elif defined(CFG_RPMB_FS)
96 return TEE_STORAGE_PRIVATE_RPMB;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +010097#endif
98}
99
100static uint32_t real_id_for(uint32_t id)
101{
102 if (id == TEE_STORAGE_PRIVATE)
103 return fs_id_for_tee_storage_private();
104 return id;
105}
106
107static bool storage_is(uint32_t id1, uint32_t id2)
108{
109 return (real_id_for(id1) == real_id_for(id2));
110}
111
Pascal Brandc639ac82015-07-02 08:53:34 +0200112static TEEC_Result fs_open(TEEC_Session *sess, void *id, uint32_t id_size,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200113 uint32_t flags, uint32_t *obj, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200114{
Aijun Sun473d9072015-08-06 15:24:49 +0800115 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200116 TEEC_Result res;
117 uint32_t org;
118
119 op.params[0].tmpref.buffer = id;
120 op.params[0].tmpref.size = id_size;
121 op.params[1].value.a = flags;
122 op.params[1].value.b = 0;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200123 op.params[2].value.a = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200124
125 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200126 TEEC_VALUE_INOUT, TEEC_VALUE_INPUT,
Pascal Brandc639ac82015-07-02 08:53:34 +0200127 TEEC_NONE);
128
129 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_OPEN, &op, &org);
130
131 if (res == TEEC_SUCCESS)
132 *obj = op.params[1].value.b;
133
134 return res;
135}
136
137static TEEC_Result fs_create(TEEC_Session *sess, void *id, uint32_t id_size,
138 uint32_t flags, uint32_t attr, void *data,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200139 uint32_t data_size, uint32_t *obj,
140 uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200141{
Aijun Sun473d9072015-08-06 15:24:49 +0800142 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200143 TEEC_Result res;
144 uint32_t org;
145
146 op.params[0].tmpref.buffer = id;
147 op.params[0].tmpref.size = id_size;
148 op.params[1].value.a = flags;
149 op.params[1].value.b = 0;
150 op.params[2].value.a = attr;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200151 op.params[2].value.b = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200152 op.params[3].tmpref.buffer = data;
153 op.params[3].tmpref.size = data_size;
154
155 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
156 TEEC_VALUE_INOUT, TEEC_VALUE_INPUT,
157 TEEC_MEMREF_TEMP_INPUT);
158
159 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CREATE, &op, &org);
160
161 if (res == TEEC_SUCCESS)
162 *obj = op.params[1].value.b;
163
164 return res;
165}
166
Pascal Brandeb84c442016-04-19 17:49:49 +0200167static TEEC_Result fs_create_overwrite(TEEC_Session *sess, void *id,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200168 uint32_t id_size, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +0200169{
170 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
171 TEEC_Result res;
172 uint32_t org;
173
174 op.params[0].tmpref.buffer = id;
175 op.params[0].tmpref.size = id_size;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200176 op.params[1].value.a = storage_id;
Pascal Brandeb84c442016-04-19 17:49:49 +0200177
178 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200179 TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brandeb84c442016-04-19 17:49:49 +0200180 TEEC_NONE);
181
182 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CREATE_OVERWRITE, &op, &org);
183
184 return res;
185}
186
Pascal Brandc639ac82015-07-02 08:53:34 +0200187static TEEC_Result fs_close(TEEC_Session *sess, uint32_t obj)
188{
Aijun Sun473d9072015-08-06 15:24:49 +0800189 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200190 uint32_t org;
191
192 op.params[0].value.a = obj;
193
194 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
195 TEEC_NONE, TEEC_NONE);
196
197 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CLOSE, &op, &org);
198}
199
200static TEEC_Result fs_read(TEEC_Session *sess, uint32_t obj, void *data,
201 uint32_t data_size, uint32_t *count)
202{
203 TEEC_Result res;
Aijun Sun473d9072015-08-06 15:24:49 +0800204 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200205 uint32_t org;
206
207 op.params[0].tmpref.buffer = data;
208 op.params[0].tmpref.size = data_size;
209 op.params[1].value.a = obj;
210 op.params[1].value.b = 0;
211
212 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
213 TEEC_VALUE_INOUT, TEEC_NONE,
214 TEEC_NONE);
215
216 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_READ, &op, &org);
217
218 if (res == TEEC_SUCCESS)
219 *count = op.params[1].value.b;
220
221 return res;
222}
223
224static TEEC_Result fs_write(TEEC_Session *sess, uint32_t obj, void *data,
225 uint32_t data_size)
226{
Aijun Sun473d9072015-08-06 15:24:49 +0800227 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200228 uint32_t org;
229
230 op.params[0].tmpref.buffer = data;
231 op.params[0].tmpref.size = data_size;
232 op.params[1].value.a = obj;
233 op.params[1].value.b = 0;
234
235 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
236 TEEC_VALUE_INPUT, TEEC_NONE,
237 TEEC_NONE);
238
239 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_WRITE, &op, &org);
240}
241
242static TEEC_Result fs_seek(TEEC_Session *sess, uint32_t obj, int32_t offset,
243 int32_t whence)
244{
Aijun Sun473d9072015-08-06 15:24:49 +0800245 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200246 uint32_t org;
247
248 op.params[0].value.a = obj;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200249 op.params[0].value.b = *(uint32_t *)&offset;
Pascal Brandc639ac82015-07-02 08:53:34 +0200250 op.params[1].value.a = whence;
251
252 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INOUT,
253 TEEC_NONE, TEEC_NONE);
254
255 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_SEEK, &op, &org);
256}
257
258static TEEC_Result fs_unlink(TEEC_Session *sess, uint32_t obj)
259{
Aijun Sun473d9072015-08-06 15:24:49 +0800260 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200261 uint32_t org;
262
263 op.params[0].value.a = obj;
264
265 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
266 TEEC_NONE, TEEC_NONE);
267
268 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_UNLINK, &op, &org);
269}
270
271static TEEC_Result fs_trunc(TEEC_Session *sess, uint32_t obj, uint32_t len)
272{
Aijun Sun473d9072015-08-06 15:24:49 +0800273 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200274 uint32_t org;
275
276 op.params[0].value.a = obj;
277 op.params[0].value.b = len;
278
279 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
280 TEEC_NONE, TEEC_NONE);
281
282 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_TRUNC, &op, &org);
283}
284
285static TEEC_Result fs_rename(TEEC_Session *sess, uint32_t obj, void *id,
286 uint32_t id_size)
287{
Aijun Sun473d9072015-08-06 15:24:49 +0800288 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200289 uint32_t org;
290
291 op.params[0].value.a = obj;
292 op.params[1].tmpref.buffer = id;
293 op.params[1].tmpref.size = id_size;
294
295 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
296 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
297 TEEC_NONE);
298
299 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RENAME, &op, &org);
300}
301
302static TEEC_Result fs_alloc_enum(TEEC_Session *sess, uint32_t *e)
303{
304 TEEC_Result res;
Aijun Sun473d9072015-08-06 15:24:49 +0800305 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200306 uint32_t org;
307
308 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE,
309 TEEC_NONE, TEEC_NONE);
310
311 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_ALLOC_ENUM, &op, &org);
312
313 if (res == TEEC_SUCCESS)
314 *e = op.params[0].value.a;
315
316 return res;
317}
318
Jerome Forissier5d969d82017-03-21 10:01:04 +0100319static TEEC_Result fs_reset_enum(TEEC_Session *sess, uint32_t e)
320{
321 TEEC_Result res;
322 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
323 uint32_t org;
324
325 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
326 TEEC_NONE, TEEC_NONE);
327
328 op.params[0].value.a = e;
329 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESET_ENUM, &op, &org);
330
331 return res;
332}
333
Pascal Brandc639ac82015-07-02 08:53:34 +0200334static TEEC_Result fs_free_enum(TEEC_Session *sess, uint32_t e)
335{
Aijun Sun473d9072015-08-06 15:24:49 +0800336 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200337 uint32_t org;
338
339 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
340 TEEC_NONE);
341
342 op.params[0].value.a = e;
343
344 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_FREE_ENUM, &op, &org);
345}
346
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200347static TEEC_Result fs_start_enum(TEEC_Session *sess, uint32_t e,
348 uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200349{
Aijun Sun473d9072015-08-06 15:24:49 +0800350 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200351 uint32_t org;
352
353 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
354 TEEC_NONE, TEEC_NONE);
355
356 op.params[0].value.a = e;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200357 op.params[0].value.b = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200358
359 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_START_ENUM, &op, &org);
360}
361
362static TEEC_Result fs_next_enum(TEEC_Session *sess, uint32_t e, void *obj_info,
363 size_t info_size, void *id, uint32_t id_size)
364{
Aijun Sun473d9072015-08-06 15:24:49 +0800365 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200366 uint32_t org;
367
Pascal Brandc603e0d2016-04-25 12:37:18 +0200368 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brandc639ac82015-07-02 08:53:34 +0200369 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
Pascal Brandc603e0d2016-04-25 12:37:18 +0200370 if (obj_info && info_size)
371 op.paramTypes |= (TEEC_MEMREF_TEMP_OUTPUT << 4);
Pascal Brandc639ac82015-07-02 08:53:34 +0200372
373 op.params[0].value.a = e;
374 op.params[1].tmpref.buffer = obj_info;
375 op.params[1].tmpref.size = info_size;
376 op.params[2].tmpref.buffer = id;
377 op.params[2].tmpref.size = id_size;
378
379 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_NEXT_ENUM, &op, &org);
380}
381
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200382static TEEC_Result fs_restrict_usage(TEEC_Session *sess, uint32_t obj,
383 uint32_t obj_usage)
384{
385 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
386 uint32_t org;
387
388 op.params[0].value.a = obj;
389 op.params[0].value.b = obj_usage;
390
391 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
392 TEEC_NONE, TEEC_NONE);
393
394 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESTRICT_USAGE,
395 &op, &org);
396}
397
398static TEEC_Result fs_alloc_obj(TEEC_Session *sess, uint32_t obj_type,
399 uint32_t max_key_size, uint32_t *obj)
400{
401 TEEC_Result res;
402 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
403 uint32_t org;
404
405 op.params[0].value.a = obj_type;
406 op.params[0].value.b = max_key_size;
407
408 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
409 TEEC_NONE, TEEC_NONE);
410
411 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_ALLOC_OBJ, &op, &org);
412 *obj = op.params[1].value.a;
413 return res;
414}
415
416static TEEC_Result fs_free_obj(TEEC_Session *sess, uint32_t obj)
417{
418 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
419 uint32_t org;
420
421 op.params[0].value.a = obj;
422
423 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
424 TEEC_NONE, TEEC_NONE);
425
426 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_FREE_OBJ, &op, &org);
427}
428
429static TEEC_Result fs_reset_obj(TEEC_Session *sess, uint32_t obj)
430{
431 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
432 uint32_t org;
433
434 op.params[0].value.a = obj;
435
436 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
437 TEEC_NONE, TEEC_NONE);
438
439 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESET_OBJ, &op, &org);
440}
441
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800442static TEEC_Result fs_get_obj_info(TEEC_Session *sess, uint32_t obj,
443 void *obj_info, size_t info_size)
444{
445 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
446 uint32_t org;
447
448 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
449 TEEC_MEMREF_TEMP_OUTPUT,
450 TEEC_NONE, TEEC_NONE);
451
452 op.params[0].value.a = obj;
453 op.params[1].tmpref.buffer = obj_info;
454 op.params[1].tmpref.size = info_size;
455
456 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_GET_OBJ_INFO, &op, &org);
457}
458
James Kung98c0ba12015-09-09 15:51:59 +0800459/* trunc */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200460static void test_truncate_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800461{
462 TEEC_Session sess;
463 uint32_t obj;
464 uint8_t out[10] = { 0 };
465 uint32_t count;
466 uint32_t orig;
467
468 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
469 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
470 return;
471
472 /* create */
473 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
474 fs_create(&sess, file_01, sizeof(file_01),
475 TEE_DATA_FLAG_ACCESS_WRITE |
476 TEE_DATA_FLAG_ACCESS_READ |
477 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200478 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800479 goto exit;
480
481 /* trunc */
482 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 10)))
483 goto exit;
484
485 /* seek */
486 if (!ADBG_EXPECT_TEEC_SUCCESS(
487 c, fs_seek(&sess, obj, 5, TEE_DATA_SEEK_SET)))
488 goto exit;
489
490 /* verify */
491 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
492 goto exit;
493
494 /* check buffer */
495 (void)ADBG_EXPECT_BUFFER(c, &data_00[5], 5, out, count);
496
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100497 /* close */
498 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
499 goto exit;
500
501 /* open */
502 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
503 TEE_DATA_FLAG_ACCESS_WRITE |
504 TEE_DATA_FLAG_ACCESS_READ |
505 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
506 goto exit;
507
508 /* seek */
509 if (!ADBG_EXPECT_TEEC_SUCCESS(
510 c, fs_seek(&sess, obj, 5, TEE_DATA_SEEK_SET)))
511 goto exit;
512
513 /* verify */
514 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
515 goto exit;
516
517 /* check buffer */
518 (void)ADBG_EXPECT_BUFFER(c, &data_00[5], 5, out, count);
519
James Kung98c0ba12015-09-09 15:51:59 +0800520 /* clean */
521 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
522 goto exit;
523
524exit:
525 TEEC_CloseSession(&sess);
526}
527
528/* extend */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200529static void test_extend_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800530{
531 TEEC_Session sess;
532 uint32_t obj;
533 uint8_t out[10] = { 0 };
534 uint8_t expect[10] = { 0 };
535 uint32_t count;
536 uint32_t orig;
537
538 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
539 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
540 return;
541
542 /* create */
543 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
544 fs_create(&sess, file_01, sizeof(file_01),
545 TEE_DATA_FLAG_ACCESS_WRITE |
546 TEE_DATA_FLAG_ACCESS_READ |
547 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200548 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800549 goto exit;
550
551 /* extend */
552 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 40)))
553 goto exit;
554
555 /* seek */
556 if (!ADBG_EXPECT_TEEC_SUCCESS(
557 c, fs_seek(&sess, obj, 30, TEE_DATA_SEEK_SET)))
558 goto exit;
559
560 /* verify */
561 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
562 goto exit;
563
564 /* check buffer */
565 expect[0] = data_00[30];
566 expect[1] = data_00[31];
567 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
568
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100569 /* close */
570 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
571 goto exit;
572
573 /* open */
574 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
575 TEE_DATA_FLAG_ACCESS_WRITE |
576 TEE_DATA_FLAG_ACCESS_READ |
577 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
578 goto exit;
579
580 /* seek */
581 if (!ADBG_EXPECT_TEEC_SUCCESS(
582 c, fs_seek(&sess, obj, 30, TEE_DATA_SEEK_SET)))
583 goto exit;
584
585 /* verify */
586 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
587 goto exit;
588
589 /* check buffer */
590 expect[0] = data_00[30];
591 expect[1] = data_00[31];
592 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
593
James Kung98c0ba12015-09-09 15:51:59 +0800594 /* clean */
595 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
596 goto exit;
597
598exit:
599 TEEC_CloseSession(&sess);
600}
601
602/* file hole */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200603static void test_file_hole(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800604{
605 TEEC_Session sess;
606 uint32_t obj;
607 uint8_t out[10] = { 0 };
608 uint8_t expect[10] = { 0 };
609 uint32_t count;
610 uint32_t orig;
611
612 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
613 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
614 return;
615
616 /* create */
617 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
618 fs_create(&sess, file_01, sizeof(file_01),
619 TEE_DATA_FLAG_ACCESS_WRITE |
620 TEE_DATA_FLAG_ACCESS_READ |
621 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200622 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800623 goto exit;
624
625 /* seek */
626 if (!ADBG_EXPECT_TEEC_SUCCESS(
627 c, fs_seek(&sess, obj, 80, TEE_DATA_SEEK_SET)))
628 goto exit;
629
630 /* write */
631 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_write(&sess, obj, data_00,
632 sizeof(data_00))))
633 goto exit;
634
635 /* seek */
636 if (!ADBG_EXPECT_TEEC_SUCCESS(
637 c, fs_seek(&sess, obj, 74, TEE_DATA_SEEK_SET)))
638 goto exit;
639
640 /* verify */
641 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
642 goto exit;
643
644 /* check buffer */
645 expect[6] = data_00[0];
646 expect[7] = data_00[1];
647 expect[8] = data_00[2];
648 expect[9] = data_00[3];
649 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
650
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100651 /* close */
652 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
653 goto exit;
654
655 /* open */
656 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
657 TEE_DATA_FLAG_ACCESS_WRITE |
658 TEE_DATA_FLAG_ACCESS_READ |
659 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
660 goto exit;
661
662 /* seek */
663 if (!ADBG_EXPECT_TEEC_SUCCESS(
664 c, fs_seek(&sess, obj, 74, TEE_DATA_SEEK_SET)))
665 goto exit;
666
667 /* verify */
668 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
669 goto exit;
670
671 /* check buffer */
672 expect[6] = data_00[0];
673 expect[7] = data_00[1];
674 expect[8] = data_00[2];
675 expect[9] = data_00[3];
676 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
677
James Kung98c0ba12015-09-09 15:51:59 +0800678 /* clean */
679 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
680 goto exit;
681
682exit:
683 TEEC_CloseSession(&sess);
684}
685
Jerome Forissiere3688342015-09-24 10:45:17 -0700686#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +0200687static TEEC_Result ds_seek_obj_inv_handle(TEEC_Session *sess)
688{
689 TEEC_Operation op;
690 uint32_t org;
691
692 op.paramTypes = TEEC_PARAM_TYPES(
693 TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
694
695 op.params[0].value.a = CASE_DATA_OBJECT_NOT_PERSISTENT;
696
697 return TEEC_InvokeCommand(
698 sess, CMD_SeekObjectData_panic, &op, &org);
699}
700
Pascal Brand8a74e362015-09-10 12:41:52 +0200701static TEEC_Result ds_seek_gp(
702 TEEC_Session *sess, TEE_Whence wh, uint32_t wh_off, uint32_t set_off,
703 void *in, size_t in_size, void *out, size_t out_size)
704{
705 TEEC_Operation op;
706 uint32_t org;
707
708 op.paramTypes = TEEC_PARAM_TYPES(
709 TEEC_VALUE_INPUT, TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT,
710 TEEC_MEMREF_TEMP_OUTPUT);
711
712 op.params[0].value.a = wh;
713 op.params[0].value.b = wh_off;
714 op.params[1].value.a = set_off;
715 op.params[2].tmpref.buffer = in;
716 op.params[2].tmpref.size = in_size;
717 op.params[3].tmpref.buffer = out;
718 op.params[3].tmpref.size = out_size;
719
720 return TEEC_InvokeCommand(sess, CMD_SeekWriteReadObjectData, &op, &org);
721}
722
723static TEEC_Result ds_init_object_and_attributes(TEEC_Session *sess,
724 uint32_t obj_type, uint32_t obj_size, const void *attr_meta,
725 size_t attr_meta_len, const void *attr_data, size_t attr_data_len,
726 uint32_t option)
727{
728 TEEC_Operation op;
729 uint32_t org;
730
731 op.paramTypes = TEEC_PARAM_TYPES(
732 TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT,
733 TEEC_MEMREF_TEMP_INPUT, TEEC_VALUE_INPUT);
734
735 op.params[0].value.a = obj_type;
736 op.params[0].value.b = obj_size;
737 op.params[1].tmpref.buffer = (void *)attr_meta;
738 op.params[1].tmpref.size = attr_meta_len;
739 op.params[2].tmpref.buffer = (void *)attr_data;
740 op.params[2].tmpref.size = attr_data_len;
741 op.params[3].value.a = option;
742
743 return TEEC_InvokeCommand(sess, CMD_InitObjectAndAttributes, &op, &org);
744}
745
746static TEEC_Result ds_rename_access_conflict(TEEC_Session *sess)
747{
748 TEEC_Operation op;
749 uint32_t org;
750
751 op.paramTypes = TEEC_PARAM_TYPES(
752 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
753
754 return TEEC_InvokeCommand(
755 sess, CMD_RenamePersistentObject_AccessConflict, &op, &org);
756}
757
758static TEEC_Result ds_start_enum_no_item(TEEC_Session *sess)
759{
760 TEEC_Operation op;
761 uint32_t org;
762 TEEC_Result res;
763
764 op.paramTypes = TEEC_PARAM_TYPES(
765 TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
766
767 res = TEEC_InvokeCommand(
768 sess, CMD_StartNGetPersistentObjectEnumerator_itemNotFound, &op, &org);
769
770 if (res != TEEC_SUCCESS)
771 return res;
772
773 if (op.params[0].value.a != 0 || op.params[0].value.b != 0)
774 return TEEC_ERROR_GENERIC;
775
776 return res;
777}
778
779static TEEC_Result ds_rename_success(TEEC_Session *sess)
780{
781 TEEC_Operation op;
782 uint32_t org;
783
784 op.paramTypes = TEEC_PARAM_TYPES(
785 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
786
787 return TEEC_InvokeCommand(
788 sess, CMD_RenamePersistentObject_Success, &op, &org);
789}
790
791static TEEC_Result ds_null_close_free_reset(TEEC_Session *sess)
792{
793 TEEC_Operation op;
794 uint32_t org;
795
796 op.paramTypes = TEEC_PARAM_TYPES(
797 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
798
799 return TEEC_InvokeCommand(
800 sess, CMD_CloseFreeAndResetObjectSuccessHandleNull, &op, &org);
801}
802#endif
803
Pascal Brandc639ac82015-07-02 08:53:34 +0200804/* create */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200805static void xtest_tee_test_6001_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200806{
807 TEEC_Session sess;
808 uint32_t obj;
809 uint32_t orig;
810
811 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
812 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
813 return;
814
815 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
816 fs_create(&sess, file_00, sizeof(file_00),
817 TEE_DATA_FLAG_ACCESS_WRITE |
818 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200819 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200820 goto exit;
821
822 /* clean */
823 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
824 goto exit;
825
826exit:
827 TEEC_CloseSession(&sess);
828}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200829DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6001)
Jens Wiklander14f48872018-06-29 15:30:13 +0200830ADBG_CASE_DEFINE(regression, 6001, xtest_tee_test_6001,
831 "Test TEE_CreatePersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200832
Pascal Brandc639ac82015-07-02 08:53:34 +0200833/* open */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200834static void xtest_tee_test_6002_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200835{
836 TEEC_Session sess;
837 uint32_t obj;
838 uint32_t orig;
839
840 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
841 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
842 return;
843
844 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
845 fs_create(&sess, file_01, sizeof(file_01),
846 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200847 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200848 goto exit;
849
850 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
851 goto exit;
852
853 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
854 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200855 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200856 goto exit;
857
858 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
859 goto exit;
860
861 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
862 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200863 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200864 goto exit;
865
866 /* clean */
867 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
868 goto exit;
869
870exit:
871 TEEC_CloseSession(&sess);
872}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200873DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6002)
Jens Wiklander14f48872018-06-29 15:30:13 +0200874ADBG_CASE_DEFINE(regression, 6002, xtest_tee_test_6002,
875 "Test TEE_OpenPersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200876
Pascal Brandc639ac82015-07-02 08:53:34 +0200877/* read */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200878static void xtest_tee_test_6003_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200879{
880 TEEC_Session sess;
881 uint32_t obj;
882 uint8_t out[10] = { 0 };
883 uint32_t count;
884 uint32_t orig;
885
886 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
887 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
888 return;
889
890 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
891 fs_create(&sess, file_02, sizeof(file_02),
892 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200893 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200894 goto exit;
895
896 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
897 goto exit;
898
899 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
900 fs_open(&sess, file_02, sizeof(file_02),
901 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200902 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200903 goto exit;
904
905 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
906 goto exit;
907
908 (void)ADBG_EXPECT_BUFFER(c, data_01, 10, out, count);
909
910 /* clean */
911 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
912 goto exit;
913
914exit:
915 TEEC_CloseSession(&sess);
916}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200917DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6003)
Jens Wiklander14f48872018-06-29 15:30:13 +0200918ADBG_CASE_DEFINE(regression, 6003, xtest_tee_test_6003,
919 "Test TEE_ReadObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200920
Pascal Brandc639ac82015-07-02 08:53:34 +0200921/* write */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200922static void xtest_tee_test_6004_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200923{
924 TEEC_Session sess;
925 uint32_t obj;
926 uint8_t out[10] = { 0 };
927 uint32_t count;
928 uint32_t orig;
929
930 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
931 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
932 return;
933
934 /* create */
935 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
936 fs_create(&sess, file_02, sizeof(file_02),
937 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200938 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200939 goto exit;
940
941 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
942 goto exit;
943
944 /* write new data */
945 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
946 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200947 TEE_DATA_FLAG_ACCESS_WRITE, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200948 goto exit;
949
950 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
951 fs_write(&sess, obj, data_00, sizeof(data_00))))
952 goto exit;
953
954 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
955 goto exit;
956
957 /* verify */
958 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
959 fs_open(&sess, file_02, sizeof(file_02),
960 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200961 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200962 goto exit;
963
964 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
965 goto exit;
966
967 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
968
969 /* clean */
970 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
971 goto exit;
972
973exit:
974 TEEC_CloseSession(&sess);
975}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200976DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6004)
Jens Wiklander14f48872018-06-29 15:30:13 +0200977ADBG_CASE_DEFINE(regression, 6004, xtest_tee_test_6004,
978 "Test TEE_WriteObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200979
Pascal Brandc639ac82015-07-02 08:53:34 +0200980/* seek */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200981static void xtest_tee_test_6005_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200982{
983 TEEC_Session sess;
984 uint32_t obj;
985 uint8_t out[10] = { 0 };
986 uint32_t count;
987 uint32_t orig;
988
989 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
990 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
991 return;
992
993 /* create */
994 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
995 fs_create(&sess, file_01, sizeof(file_01),
996 TEE_DATA_FLAG_ACCESS_WRITE |
997 TEE_DATA_FLAG_ACCESS_READ |
998 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200999 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001000 goto exit;
1001
1002 /* seek */
1003 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1004 fs_seek(&sess, obj, 10, TEE_DATA_SEEK_SET)))
1005 goto exit;
1006
1007 /* verify */
1008 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1009 goto exit;
1010
1011 (void)ADBG_EXPECT_BUFFER(c, &data_00[10], 10, out, count);
1012
1013 /* clean */
1014 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1015 goto exit;
1016
1017exit:
1018 TEEC_CloseSession(&sess);
1019}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001020DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6005)
Jens Wiklander14f48872018-06-29 15:30:13 +02001021ADBG_CASE_DEFINE(regression, 6005, xtest_tee_test_6005,
1022 "Test TEE_SeekObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001023
Pascal Brandc639ac82015-07-02 08:53:34 +02001024/* unlink */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001025static void xtest_tee_test_6006_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001026{
1027 TEEC_Session sess;
1028 uint32_t obj;
1029 uint32_t orig;
1030
1031 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1032 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1033 return;
1034
1035 /* create */
1036 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1037 fs_create(&sess, file_01, sizeof(file_01),
1038 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001039 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001040 goto exit;
1041
1042 /* del & close */
1043 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1044 goto exit;
1045
1046 /* check result */
1047 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1048 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001049 TEE_DATA_FLAG_ACCESS_READ, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001050 goto exit;
1051
1052exit:
1053 TEEC_CloseSession(&sess);
1054}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001055DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6006)
Jens Wiklander14f48872018-06-29 15:30:13 +02001056ADBG_CASE_DEFINE(regression, 6006, xtest_tee_test_6006,
1057 "Test TEE_CloseAndDeletePersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001058
1059static void xtest_tee_test_6007_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001060{
James Kung98c0ba12015-09-09 15:51:59 +08001061 Do_ADBG_BeginSubCase(c, "Test truncate file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001062 test_truncate_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +08001063 Do_ADBG_EndSubCase(c, "Test truncate file length");
Pascal Brandc639ac82015-07-02 08:53:34 +02001064
James Kung98c0ba12015-09-09 15:51:59 +08001065 Do_ADBG_BeginSubCase(c, "Test extend file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001066 test_extend_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +08001067 Do_ADBG_EndSubCase(c, "Test extend file length");
Pascal Brandc639ac82015-07-02 08:53:34 +02001068
James Kung98c0ba12015-09-09 15:51:59 +08001069 Do_ADBG_BeginSubCase(c, "Test file hole");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001070 test_file_hole(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +08001071 Do_ADBG_EndSubCase(c, "Test file hole");
Pascal Brandc639ac82015-07-02 08:53:34 +02001072}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001073DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6007)
Jens Wiklander14f48872018-06-29 15:30:13 +02001074ADBG_CASE_DEFINE(regression, 6007, xtest_tee_test_6007,
1075 "Test TEE_TruncateObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001076
1077static void xtest_tee_test_6008_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001078{
1079 TEEC_Session sess;
1080 uint32_t obj;
1081 uint8_t out[10] = { 0 };
1082 uint32_t count;
1083 uint32_t orig;
1084
1085 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1086 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1087 return;
1088
1089 /* create */
1090 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1091 fs_create(&sess, file_02, sizeof(file_02),
1092 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001093 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001094 goto exit;
1095
1096 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1097 goto exit;
1098
1099 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1100 fs_open(&sess, file_02, sizeof(file_02),
1101 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001102 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001103 goto exit;
1104
1105 /* write new data */
1106 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1107 fs_write(&sess, obj, data_00, sizeof(data_00))))
1108 goto exit;
1109
1110 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1111 fs_rename(&sess, obj, file_03, sizeof(file_03))))
1112 goto exit;
1113
1114 /* close */
1115 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1116 goto exit;
1117
1118 /* verify */
1119 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1120 fs_open(&sess, file_03, sizeof(file_03),
1121 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001122 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001123 goto exit;
1124
1125 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1126 goto exit;
1127
1128 /* check buffer */
1129 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
1130
1131 /* clean */
1132 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1133 goto exit;
1134
1135exit:
1136 TEEC_CloseSession(&sess);
1137}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001138DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6008)
Jens Wiklander14f48872018-06-29 15:30:13 +02001139ADBG_CASE_DEFINE(regression, 6008, xtest_tee_test_6008,
1140 "Test TEE_RenamePersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001141
1142static void xtest_tee_test_6009_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001143{
1144 TEEC_Session sess;
1145 uint32_t obj0;
1146 uint32_t obj1;
1147 uint32_t obj2;
1148 uint32_t e = 0;
1149 uint8_t info[200];
1150 uint8_t id[200];
1151 uint32_t orig;
1152
1153 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1154 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1155 return;
1156
1157 /* create file 00 */
1158 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1159 fs_create(&sess, file_00, sizeof(file_00),
1160 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001161 sizeof(data_01), &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001162 goto exit;
1163
1164 /* create file 01 */
1165 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1166 fs_create(&sess, file_01, sizeof(file_01),
1167 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001168 sizeof(data_01), &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001169 goto exit;
1170
1171 /* create file 02 */
1172 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1173 fs_create(&sess, file_02, sizeof(file_02),
1174 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001175 sizeof(data_01), &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001176 goto exit;
1177
1178 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj0)))
1179 goto exit;
1180
1181 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj1)))
1182 goto exit;
1183
1184 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj2)))
1185 goto exit;
1186
1187 /* iterate */
1188 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e)))
1189 goto exit;
1190
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001191 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_start_enum(&sess, e, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001192 goto exit;
1193
1194 /* get 00 */
1195 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1196 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1197 goto exit;
1198
1199 /* get 01 */
1200 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc603e0d2016-04-25 12:37:18 +02001201 fs_next_enum(&sess, e, NULL, 0, id, sizeof(id))))
Pascal Brandc639ac82015-07-02 08:53:34 +02001202 goto exit;
1203
1204 /* get 02 */
1205 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1206 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1207 goto exit;
1208
1209 /* we should not have more files */
1210 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1211 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1212 goto exit;
1213
1214 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e)))
1215 goto exit;
1216
1217 /* clean */
1218 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1219 fs_open(&sess, file_00, sizeof(file_00),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001220 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001221 goto exit;
1222
1223 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj0)))
1224 goto exit;
1225
1226 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1227 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001228 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001229 goto exit;
1230
1231 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj1)))
1232 goto exit;
1233
1234 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1235 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001236 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001237 goto exit;
1238
1239 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj2)))
1240 goto exit;
1241
1242exit:
1243 TEEC_CloseSession(&sess);
1244}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001245DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6009)
Jens Wiklander14f48872018-06-29 15:30:13 +02001246ADBG_CASE_DEFINE(regression, 6009, xtest_tee_test_6009,
1247 "Test TEE Internal API Persistent Object Enumeration Functions");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001248
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001249static void xtest_tee_test_6010_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand8a74e362015-09-10 12:41:52 +02001250{
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001251 TEEC_Session sess;
1252 uint32_t orig;
1253 uint32_t o1;
1254 uint32_t o2;
1255 uint32_t e;
1256 uint32_t f;
1257 uint8_t data[1024];
1258 uint8_t out[1024];
1259 uint32_t n;
Pascal Brand30844922015-09-17 12:12:42 +02001260
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001261 for (n = 0; n < ARRAY_SIZE(data); n++)
1262 data[n] = n;
Pascal Brand8a74e362015-09-10 12:41:52 +02001263
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001264 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1265 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1266 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001267
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001268 Do_ADBG_BeginSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001269
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001270 o1 = TEE_HANDLE_NULL;
1271 o2 = TEE_HANDLE_NULL;
1272 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1273 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1274 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
Pascal Brand8a74e362015-09-10 12:41:52 +02001275
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001276 ADBG_EXPECT_TEEC_SUCCESS(c,
1277 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1278 sizeof(data), &o1, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001279
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001280 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE;
1281 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ACCESS_CONFLICT,
1282 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1283 sizeof(data), &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001284
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001285 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1286 if (o2)
1287 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
Pascal Brand8a74e362015-09-10 12:41:52 +02001288
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001289 Do_ADBG_EndSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001290
Pascal Brand8a74e362015-09-10 12:41:52 +02001291
Pascal Brand8a74e362015-09-10 12:41:52 +02001292
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001293 Do_ADBG_BeginSubCase(c, "RestrictObjectUsage Panic");
1294 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1295 fs_restrict_usage(&sess, 0xffffbad0, 0xffffffff));
1296 Do_ADBG_EndSubCase(c, "RestrictObjectUsage Panic");
Pascal Brand8a74e362015-09-10 12:41:52 +02001297
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001298 TEEC_CloseSession(&sess);
1299 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1300 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1301 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001302
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001303 Do_ADBG_BeginSubCase(c, "SeekObjectData BadHandle");
1304 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1305 fs_seek(&sess, 0xffffbad0, 5, TEE_DATA_SEEK_SET));
1306 Do_ADBG_EndSubCase(c, "SeekObjectData BadHandle");
Pascal Brand8a74e362015-09-10 12:41:52 +02001307
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001308 TEEC_CloseSession(&sess);
1309 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1310 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1311 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001312
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001313 Do_ADBG_BeginSubCase(c, "SeekObjectData NotPersist");
1314 o1 = 0;
1315 ADBG_EXPECT_TEEC_SUCCESS(c,
1316 fs_alloc_obj(&sess, TEE_TYPE_AES, 256, &o1));
1317 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1318 fs_seek(&sess, o1, 5, TEE_DATA_SEEK_SET));
1319 Do_ADBG_EndSubCase(c, "SeekObjectData NotPersist");
Pascal Brand8a74e362015-09-10 12:41:52 +02001320
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001321 TEEC_CloseSession(&sess);
1322 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1323 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1324 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001325
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001326 Do_ADBG_BeginSubCase(c, "SeekWriteRead");
1327 o1 = 0;
1328 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1329 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1330 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1331 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1332 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1333 sizeof(data), &o1, storage_id)))
1334 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001335
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001336 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1337 fs_seek(&sess, o1, 2, TEE_DATA_SEEK_SET)))
1338 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001339
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001340 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1341 fs_seek(&sess, o1, 0, TEE_DATA_SEEK_END)))
1342 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001343
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001344 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1345 fs_write(&sess, o1, data, sizeof(data))))
1346 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001347
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001348 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1349 fs_seek(&sess, o1, sizeof(data), TEE_DATA_SEEK_SET)))
1350 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001351
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001352 memset(out, 0xab, sizeof(out));
1353 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1354 fs_read(&sess, o1, out, sizeof(out), &n)))
1355 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001356
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001357 ADBG_EXPECT_BUFFER(c, data, sizeof(data), out, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001358
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001359 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander3a6892e2016-09-14 15:53:52 +02001360 fs_seek(&sess, o1, 10, TEE_DATA_SEEK_END)))
1361 goto seek_write_read_out;
1362
1363 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1364 fs_read(&sess, o1, out, sizeof(out), &n)))
1365 goto seek_write_read_out;
1366 ADBG_EXPECT_COMPARE_UNSIGNED(c, n, ==, 0);
1367
1368 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001369 fs_seek(&sess, o1, -(int32_t)sizeof(data) / 2,
1370 TEE_DATA_SEEK_END)))
1371 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001372
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001373 memset(out, 0xab, sizeof(out) / 2);
1374 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1375 fs_read(&sess, o1, out, sizeof(out) / 2, &n)))
1376 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001377
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001378 ADBG_EXPECT_BUFFER(c,
1379 data + sizeof(data) / 2, sizeof(data) / 2,
Melanie Favre73205032018-02-19 13:35:52 +01001380 out, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001381
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001382seek_write_read_out:
1383 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1384 Do_ADBG_EndSubCase(c, "SeekWriteRead");
Pascal Brand8a74e362015-09-10 12:41:52 +02001385
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001386 Do_ADBG_BeginSubCase(c, "Rename Access Conflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001387
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001388 o1 = TEE_HANDLE_NULL;
1389 o2 = TEE_HANDLE_NULL;
1390 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1391 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1392 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1393 ADBG_EXPECT_TEEC_SUCCESS(c,
1394 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1395 sizeof(data), &o1, storage_id));
1396 ADBG_EXPECT_TEEC_SUCCESS(c,
1397 fs_create(&sess, file_01, sizeof(file_01), f, 0, data,
1398 sizeof(data) / 2, &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001399
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001400 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ACCESS_CONFLICT,
1401 fs_rename(&sess, o2, file_00, sizeof(file_00)));
Pascal Brand8a74e362015-09-10 12:41:52 +02001402
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001403 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1404 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
1405
1406 Do_ADBG_EndSubCase(c, "Rename Access Conflict");
1407
Jerome Forissier7dbf8772018-12-19 09:05:48 +01001408 Do_ADBG_BeginSubCase(c, "Rename Access Conflict 2");
1409
1410 o1 = TEE_HANDLE_NULL;
1411 o2 = TEE_HANDLE_NULL;
1412 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1413 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1414 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1415 ADBG_EXPECT_TEEC_SUCCESS(c,
1416 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1417 sizeof(data), &o1, storage_id));
1418 ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, o1));
1419
1420 ADBG_EXPECT_TEEC_SUCCESS(c,
1421 fs_create(&sess, file_01, sizeof(file_01), f, 0, data,
1422 sizeof(data) / 2, &o2, storage_id));
1423 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ACCESS_CONFLICT,
1424 fs_rename(&sess, o2, file_00, sizeof(file_00)));
1425
1426 ADBG_EXPECT_TEEC_SUCCESS(c,
1427 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1428 sizeof(data), &o1, storage_id));
1429
1430 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1431 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
1432
1433 Do_ADBG_EndSubCase(c, "Rename Access Conflict 2");
1434
Jerome Forissier5d969d82017-03-21 10:01:04 +01001435 Do_ADBG_BeginSubCase(c, "AllocPersistentObjectEnumerator + "
1436 "ResetPersistentObjectEnumerator");
1437 e = TEE_HANDLE_NULL;
1438 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1439 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_enum(&sess, e));
1440 Do_ADBG_EndSubCase(c, "AllocPersistentObjectEnumerator + "
1441 "ResetPersistentObjectEnumerator");
1442
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001443 Do_ADBG_BeginSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1444 e = TEE_HANDLE_NULL;
1445 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1446 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1447 fs_next_enum(&sess, e, NULL, 0, out, sizeof(out)));
1448 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1449 fs_start_enum(&sess, e, storage_id));
1450 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e));
1451 Do_ADBG_EndSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1452
1453 Do_ADBG_BeginSubCase(c, "RenamePersistent ReadWrite");
1454 o1 = TEE_HANDLE_NULL;
1455 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1456 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1457 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1458 ADBG_EXPECT_TEEC_SUCCESS(c,
1459 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1460 sizeof(data), &o1, storage_id));
1461 ADBG_EXPECT_TEEC_SUCCESS(c,
1462 fs_rename(&sess, o1, file_01, sizeof(file_01)));
1463 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1464 Do_ADBG_EndSubCase(c, "RenamePersistent ReadWrite");
1465
1466 Do_ADBG_BeginSubCase(c, "Close Free Reset Null");
1467 ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, TEE_HANDLE_NULL));
1468 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_obj(&sess, TEE_HANDLE_NULL));
1469 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_obj(&sess, TEE_HANDLE_NULL));
1470 Do_ADBG_EndSubCase(c, "Close Free Reset Null");
1471
1472 TEEC_CloseSession(&sess);
Pascal Brand8a74e362015-09-10 12:41:52 +02001473}
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001474DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6010)
Jens Wiklander14f48872018-06-29 15:30:13 +02001475ADBG_CASE_DEFINE(regression, 6010, xtest_tee_test_6010, "Test Storage");
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001476
1477#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +02001478static void xtest_tee_test_6011(ADBG_Case_t *c)
1479{
1480 TEEC_Session sess;
1481 uint32_t orig;
1482 /*
1483 * Test data from
1484 * Invoke_InitObjectAndAttributes_TEE_TYPE_AES_success_attribute_
1485 * TEE_ATTR_SECRET_VALUE_correct_size (9d-9a-91)
1486 */
1487 static const uint8_t attr_meta[] = {
14880xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
14890x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
14900x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
14910x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
1492 };
1493 static const uint8_t attr_data[] = {
14940x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,
14950x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,
14960xdf,0xf4,
1497 };
1498
1499 if (!ADBG_EXPECT_TEEC_SUCCESS(
1500 c, xtest_teec_open_session(
1501 &sess, &gp_tta_ds_uuid, NULL, &orig)))
1502 return;
1503
1504 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ds_init_object_and_attributes(&sess,
1505 0xa0000010, 0x100, attr_meta, sizeof(attr_meta), attr_data,
1506 sizeof(attr_data), 0)))
1507 goto exit;
1508
1509exit:
1510 TEEC_CloseSession(&sess);
1511}
Jens Wiklander14f48872018-06-29 15:30:13 +02001512ADBG_CASE_DEFINE(regression, 6011, xtest_tee_test_6011,
1513 "Test TEE GP TTA DS init objects");
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001514#endif /*WITH_GP_TESTS*/
Pascal Brand8a74e362015-09-10 12:41:52 +02001515
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001516static void xtest_tee_test_6012_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +02001517{
1518 TEEC_Session sess;
1519 uint32_t orig;
1520 uint32_t obj;
1521
Etienne Carrierea54952b2017-10-27 15:58:01 +02001522 /*
1523 * create the object a first time (forced through with overwrite attribute)
1524 */
Pascal Brandeb84c442016-04-19 17:49:49 +02001525 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1526 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1527 return;
1528
1529 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001530 fs_create_overwrite(&sess, file_04, sizeof(file_04), storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001531 goto bail1;
Pascal Brandeb84c442016-04-19 17:49:49 +02001532
1533 TEEC_CloseSession(&sess);
1534
Etienne Carrierea54952b2017-10-27 15:58:01 +02001535 /*
1536 * re-create the object two times with overwrite attribute
1537 */
Pascal Brandeb84c442016-04-19 17:49:49 +02001538 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1539 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1540 return;
1541
1542 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001543 fs_create_overwrite(&sess, file_04, sizeof(file_04),
1544 storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001545 goto bail1;
Pascal Brandeb84c442016-04-19 17:49:49 +02001546
Etienne Carrierea54952b2017-10-27 15:58:01 +02001547 /* re-create it with an object */
1548 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandeb84c442016-04-19 17:49:49 +02001549 fs_create(&sess, file_04, sizeof(file_04),
1550 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001551 TEE_DATA_FLAG_ACCESS_WRITE_META |
1552 TEE_DATA_FLAG_OVERWRITE, 0, NULL, 0, &obj,
1553 storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001554 goto bail2;
Pascal Brandeb84c442016-04-19 17:49:49 +02001555
Etienne Carrierea54952b2017-10-27 15:58:01 +02001556 TEEC_CloseSession(&sess);
Pascal Brandeb84c442016-04-19 17:49:49 +02001557
Etienne Carrierea54952b2017-10-27 15:58:01 +02001558 /*
1559 * re-create it again without overwrite flag: should fail and
1560 * existing object should not be altered.
1561 */
1562 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1563 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1564 return;
1565
1566 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ACCESS_CONFLICT,
1567 fs_create(&sess, file_04, sizeof(file_04),
1568 TEE_DATA_FLAG_ACCESS_WRITE |
1569 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, NULL, 0, &obj,
1570 storage_id)))
1571 goto bail2;
1572
1573 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1574 fs_open(&sess, file_04, sizeof(file_04),
1575 TEE_DATA_FLAG_ACCESS_READ |
1576 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj,
1577 storage_id)))
1578 goto bail1;
1579
1580bail2:
1581 /* remove the object so that xtest 600x can be replayed */
1582 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1583bail1:
Pascal Brandeb84c442016-04-19 17:49:49 +02001584 TEEC_CloseSession(&sess);
1585}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001586DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6012)
Jens Wiklander14f48872018-06-29 15:30:13 +02001587ADBG_CASE_DEFINE(regression, 6012, xtest_tee_test_6012,
1588 "Test TEE GP TTA DS init objects");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001589
1590static void xtest_tee_test_6013_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand90f23352016-05-19 15:15:47 +02001591{
1592 TEEC_Session sess;
1593 uint32_t orig;
1594 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1595
1596 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1597 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1598 return;
1599
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001600 op.params[0].value.a = storage_id;
1601 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand90f23352016-05-19 15:15:47 +02001602 TEEC_NONE, TEEC_NONE);
1603
1604 ADBG_EXPECT_TEEC_SUCCESS(c,
1605 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_KEY_IN_PERSISTENT,
1606 &op, &orig));
1607
1608 TEEC_CloseSession(&sess);
1609}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001610DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6013)
Jens Wiklander14f48872018-06-29 15:30:13 +02001611ADBG_CASE_DEFINE(regression, 6013, xtest_tee_test_6013,
1612 "Key usage in Persistent objects");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001613
1614static void xtest_tee_test_6014_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand29ee18f2016-05-23 14:13:56 +02001615{
1616 TEEC_Session sess;
1617 uint32_t orig;
1618 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1619
1620 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1621 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1622 return;
1623
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001624 op.params[0].value.a = storage_id;
1625 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand29ee18f2016-05-23 14:13:56 +02001626 TEEC_NONE, TEEC_NONE);
1627
1628 ADBG_EXPECT_TEEC_SUCCESS(c,
1629 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_LOOP, &op, &orig));
1630
1631 TEEC_CloseSession(&sess);
1632}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001633DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6014)
Jens Wiklander14f48872018-06-29 15:30:13 +02001634ADBG_CASE_DEFINE(regression, 6014, xtest_tee_test_6014,
1635 "Loop on Persistent objects");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001636
Jerome Forissiere3854162016-08-12 12:40:12 +02001637static void xtest_tee_test_6015_single(ADBG_Case_t *c, uint32_t storage_id)
1638{
1639 TEEC_Session sess;
1640 TEEC_Session sess2;
1641 uint32_t orig;
1642 uint32_t obj;
1643 uint32_t obj2;
Jerome Forissiere3854162016-08-12 12:40:12 +02001644
1645 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1646 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1647 return;
1648
1649 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1650 xtest_teec_open_session(&sess2, &storage2_ta_uuid, NULL,
1651 &orig)))
1652 goto exit2;
1653
1654 /* TA #1 creates a persistent object */
1655 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1656 fs_create(&sess, file_01, sizeof(file_01),
1657 TEE_DATA_FLAG_ACCESS_WRITE |
1658 TEE_DATA_FLAG_ACCESS_READ |
1659 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
1660 sizeof(data_00), &obj, storage_id)))
1661 goto exit;
1662
1663 /* TA #2 tries to open the object created by TA #1 */
1664 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1665 fs_open(&sess2, file_01, sizeof(file_01),
1666 TEE_DATA_FLAG_ACCESS_READ, &obj2, storage_id)))
1667 goto clean;
1668
Jerome Forissiere3854162016-08-12 12:40:12 +02001669clean:
1670 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1671exit:
1672 TEEC_CloseSession(&sess2);
1673exit2:
1674 TEEC_CloseSession(&sess);
1675}
Jerome Forissiere3854162016-08-12 12:40:12 +02001676DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6015)
Jens Wiklander14f48872018-06-29 15:30:13 +02001677ADBG_CASE_DEFINE(regression, 6015, xtest_tee_test_6015, "Storage isolation");
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001678
1679struct test_6016_thread_arg {
1680 ADBG_Case_t *case_t;
1681 uint32_t storage_id;
Jerome Forissier54cfbef2016-08-31 18:34:31 +02001682 char file_name[8];
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001683 TEEC_Session session;
1684};
1685
1686static void *test_6016_thread(void *arg)
1687{
1688 struct test_6016_thread_arg *a = arg;
1689 TEEC_Session sess = a->session;
1690 uint32_t obj;
1691 uint8_t out[10] = { 0 };
1692 uint32_t count;
1693
1694 /* create */
1695 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1696 fs_create(&sess, a->file_name, sizeof(a->file_name),
1697 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
1698 sizeof(data_01), &obj, a->storage_id)))
1699 goto exit;
1700
1701 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1702 goto exit;
1703
1704 /* write new data */
1705 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1706 fs_open(&sess, a->file_name, sizeof(a->file_name),
1707 TEE_DATA_FLAG_ACCESS_WRITE, &obj, a->storage_id)))
1708 goto exit;
1709
1710 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1711 fs_write(&sess, obj, data_00, sizeof(data_00))))
1712 goto exit;
1713
1714 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1715 goto exit;
1716
1717 /* verify */
1718 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1719 fs_open(&sess, a->file_name, sizeof(a->file_name),
1720 TEE_DATA_FLAG_ACCESS_READ |
1721 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, a->storage_id)))
1722 goto exit;
1723
1724 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1725 fs_read(&sess, obj, out, 10, &count)))
1726 goto exit;
1727
1728 (void)ADBG_EXPECT_BUFFER(a->case_t, data_00, 10, out, count);
1729
1730 /* clean */
1731 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_unlink(&sess, obj)))
1732 goto exit;
1733
1734exit:
1735 return NULL;
1736}
1737
1738
1739#define NUM_THREADS 4
1740static void xtest_tee_test_6016_loop(ADBG_Case_t *c, uint32_t storage_id)
1741{
1742 size_t num_threads = NUM_THREADS;
1743 struct test_6016_thread_arg arg[num_threads];
1744 pthread_t thr[num_threads];
1745 uint32_t orig;
1746 size_t i;
1747 size_t n = 0;
1748 size_t m;
1749
1750 memset(arg, 0, sizeof(arg));
1751
1752 for (m = 0; m < num_threads; m++)
1753 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1754 xtest_teec_open_session(&arg[m].session,
1755 &storage_ta_uuid, NULL, &orig)))
1756 goto out;
1757
1758 for (n = 0; n < num_threads; n++) {
1759 arg[n].case_t = c;
1760 arg[n].storage_id = storage_id;
Jerome Forissiercb10f832016-09-01 14:53:05 +02001761 snprintf(arg[n].file_name, sizeof(arg[n].file_name),
Jens Wiklander2b1c11d2016-09-16 14:58:41 +02001762 "file_%zu", n);
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001763 if (!ADBG_EXPECT(c, 0, pthread_create(thr + n, NULL,
1764 test_6016_thread, arg + n)))
1765 goto out;
1766 }
1767
1768out:
1769 for (i = 0; i < n; i++)
1770 ADBG_EXPECT(c, 0, pthread_join(thr[i], NULL));
1771 for (i = 0; i < m; i++)
1772 TEEC_CloseSession(&arg[i].session);
1773}
1774
1775/* concurency */
1776static void xtest_tee_test_6016_single(ADBG_Case_t *c, uint32_t storage_id)
1777{
1778 int i;
1779 int loops = 8;
1780
1781 Do_ADBG_Log(" threads: %d, loops: %d", NUM_THREADS, loops);
1782 for (i = 0; i < loops; i++)
1783 xtest_tee_test_6016_loop(c, storage_id);
1784}
Jerome Forissierefd71d32016-09-13 15:09:33 +02001785DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6016)
Jens Wiklander14f48872018-06-29 15:30:13 +02001786ADBG_CASE_DEFINE(regression, 6016, xtest_tee_test_6016, "Storage concurency");
Jerome Forissier327672c2016-09-01 18:34:11 +02001787
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001788static void xtest_tee_test_6017_single(ADBG_Case_t *c, uint32_t storage_id)
1789{
1790 TEEC_Session sess;
1791 TEE_ObjectInfo obj_info1;
1792 TEE_ObjectInfo obj_info2;
1793 uint32_t obj;
1794 uint32_t orig;
1795
1796 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1797 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1798 return;
1799
1800 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1801 fs_create(&sess, file_01, sizeof(file_01),
1802 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1803 0, &obj, storage_id)))
1804 goto exit;
1805
1806 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1807 fs_write(&sess, obj, data_00, sizeof(data_00))))
1808 goto exit;
1809
1810 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1811 fs_get_obj_info(&sess, obj, &obj_info1,
1812 sizeof(TEE_ObjectInfo))))
1813 goto exit;
1814
1815 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1816 goto exit;
1817
1818 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1819 fs_open(&sess, file_01, sizeof(file_01),
1820 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1821 goto exit;
1822
1823 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1824 fs_get_obj_info(&sess, obj, &obj_info2,
1825 sizeof(TEE_ObjectInfo))))
1826 goto exit;
1827
1828 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1829 obj_info1.dataSize, ==, obj_info2.dataSize))
1830 goto exit;
1831
1832 /* clean */
1833 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1834 goto exit;
1835
1836exit:
1837 TEEC_CloseSession(&sess);
1838}
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001839DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6017)
Jens Wiklander14f48872018-06-29 15:30:13 +02001840ADBG_CASE_DEFINE(regression, 6017, xtest_tee_test_6017,
1841 "Test Persistent objects info");
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001842
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001843static void xtest_tee_test_6018_single(ADBG_Case_t *c, uint32_t storage_id)
1844{
1845 TEEC_Session sess;
1846 TEE_ObjectInfo obj_info1;
1847 TEE_ObjectInfo obj_info2;
1848 uint32_t obj;
1849 uint32_t orig;
1850 uint8_t block[32 * 1024];
1851 size_t num_blocks;
1852 size_t block_size;
1853 size_t n;
1854
1855 if (storage_is(storage_id, TEE_STORAGE_PRIVATE_RPMB)) {
1856 /* RPMB FS is a bit resource constrained */
Jens Wiklander20949ea2017-05-17 17:47:58 +02001857 num_blocks = 10;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001858 block_size = 1024;
1859 } else {
Jens Wiklander5f86daa2017-05-30 16:37:19 +02001860 num_blocks = 20;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001861 block_size = sizeof(block);
1862 }
1863
1864 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1865 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1866 return;
1867
1868 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1869 fs_create(&sess, file_01, sizeof(file_01),
1870 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1871 0, &obj, storage_id)))
1872 goto exit;
1873
1874 for (n = 0; n < num_blocks; n++) {
1875 memset(block, n, block_size);
1876
1877 Do_ADBG_Log("writing %zu", n);
1878 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1879 fs_write(&sess, obj, block, block_size)))
1880 goto exit;
1881 }
1882
1883 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1884 fs_get_obj_info(&sess, obj, &obj_info1,
1885 sizeof(TEE_ObjectInfo))))
1886 goto exit;
1887
1888 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1889 obj_info1.dataSize, ==, block_size * num_blocks))
1890 goto exit;
1891
1892 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1893 goto exit;
1894
1895 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1896 fs_open(&sess, file_01, sizeof(file_01),
1897 TEE_DATA_FLAG_ACCESS_READ |
1898 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1899 goto exit;
1900
1901 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1902 fs_get_obj_info(&sess, obj, &obj_info2,
1903 sizeof(TEE_ObjectInfo))))
1904 goto exit;
1905
1906 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1907 obj_info1.dataSize, ==, obj_info2.dataSize))
1908 goto exit;
1909
1910 for (n = 0; n < num_blocks; n++) {
1911 uint8_t br[block_size];
1912 uint32_t count;
1913
1914 memset(block, n, block_size);
1915
1916 Do_ADBG_Log("reading %zu", n);
1917 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1918 fs_read(&sess, obj, br, sizeof(br), &count)))
1919 goto exit;
1920 if (!ADBG_EXPECT_BUFFER(c, block, block_size, br, count))
1921 goto exit;
1922 }
1923
1924 /* clean */
1925 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1926 goto exit;
1927
1928exit:
1929 TEEC_CloseSession(&sess);
1930}
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001931DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6018)
Jens Wiklander14f48872018-06-29 15:30:13 +02001932ADBG_CASE_DEFINE(regression, 6018, xtest_tee_test_6018, "Large object");
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001933
l00176142ebba0c92017-11-08 01:16:26 +08001934static void xtest_tee_test_6019_single(ADBG_Case_t *c, uint32_t storage_id)
1935{
1936 TEEC_Session sess;
1937 TEEC_Session sess2;
1938 uint32_t orig;
1939 uint32_t obj;
1940 uint32_t obj2;
1941 uint8_t out[10] = { 0 };
1942 uint32_t count;
1943
1944 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1945 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1946 return;
1947
1948 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1949 xtest_teec_open_session(&sess2, &storage2_ta_uuid, NULL,
1950 &orig)))
1951 goto exit3;
1952
1953 /* TA #1 creates a persistent object */
1954 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1955 fs_create(&sess, file_01, sizeof(file_01),
1956 TEE_DATA_FLAG_ACCESS_WRITE |
1957 TEE_DATA_FLAG_ACCESS_WRITE_META |
1958 TEE_DATA_FLAG_OVERWRITE, 0, data_00,
1959 sizeof(data_00), &obj, storage_id)))
1960 goto exit2;
1961
1962 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1963 goto exit1;
1964
1965 /* TA #2 creates a persistent object */
1966 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1967 fs_create(&sess2, file_01, sizeof(file_01),
1968 TEE_DATA_FLAG_ACCESS_WRITE |
1969 TEE_DATA_FLAG_ACCESS_WRITE_META |
1970 TEE_DATA_FLAG_OVERWRITE, 0, data_01,
1971 sizeof(data_01), &obj2, storage_id)))
1972 goto exit1;
1973
1974 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess2, obj2)))
1975 goto exit;
1976
1977 /* TA #1 open and read */
1978 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1979 fs_open(&sess, file_01, sizeof(file_01),
1980 TEE_DATA_FLAG_ACCESS_READ |
1981 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1982 goto exit;
1983
1984 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1985 goto exit;
1986
1987 /* verify */
1988 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
1989
1990 /* TA #2 open and read */
1991 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1992 fs_open(&sess2, file_01, sizeof(file_01),
1993 TEE_DATA_FLAG_ACCESS_READ |
1994 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj2, storage_id)))
1995 goto exit;
1996
1997 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess2, obj2, out, 10, &count)))
1998 goto exit;
1999
2000 /* verify */
2001 (void)ADBG_EXPECT_BUFFER(c, data_01, 10, out, count);
2002
2003exit:
2004 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess2, obj2));
2005exit1:
2006 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
2007exit2:
2008 TEEC_CloseSession(&sess2);
2009exit3:
2010 TEEC_CloseSession(&sess);
2011}
l00176142ebba0c92017-11-08 01:16:26 +08002012DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6019)
Jens Wiklander14f48872018-06-29 15:30:13 +02002013ADBG_CASE_DEFINE(regression, 6019, xtest_tee_test_6019, "Storage independence");
l00176142ebba0c92017-11-08 01:16:26 +08002014
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002015/*
2016 * According to the GP spec V1.1, the object_id in create/open/rename
2017 * functions is not allowed to reside in the shared memory.
2018 *
2019 * The function below replicates fs_open/fs_create/fs_rename but using
2020 * specific commands to ask the TA to use the client object ID buffer
2021 * from the shared memory when accessing the object through target APIs.
2022 * The TA is not expected to use such references and gets killed by the TEE.
2023 */
2024static TEEC_Result fs_access_with_bad_object_id_ref(TEEC_Session *sess,
2025 uint32_t command,
2026 void *id, uint32_t id_size,
2027 uint32_t flags,
2028 uint32_t attr,
2029 void *data, uint32_t data_size,
2030 uint32_t *obj,
2031 uint32_t storage_id)
2032{
2033 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
2034 TEEC_Result res;
2035 uint32_t org;
2036
2037 switch (command) {
2038 case TA_STORAGE_CMD_OPEN_ID_IN_SHM:
2039 op.params[0].tmpref.buffer = id;
2040 op.params[0].tmpref.size = id_size;
2041 op.params[1].value.a = flags;
2042 op.params[1].value.b = 0;
2043 op.params[2].value.a = storage_id;
2044
2045 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
2046 TEEC_VALUE_INOUT,
2047 TEEC_VALUE_INPUT,
2048 TEEC_NONE);
2049 break;
2050 case TA_STORAGE_CMD_CREATE_ID_IN_SHM:
2051 op.params[0].tmpref.buffer = id;
2052 op.params[0].tmpref.size = id_size;
2053 op.params[1].value.a = flags;
2054 op.params[1].value.b = 0;
2055 op.params[2].value.a = attr;
2056 op.params[2].value.b = storage_id;
2057 op.params[3].tmpref.buffer = data;
2058 op.params[3].tmpref.size = data_size;
2059
2060 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
2061 TEEC_VALUE_INOUT,
2062 TEEC_VALUE_INPUT,
2063 TEEC_MEMREF_TEMP_INPUT);
2064 break;
2065 case TA_STORAGE_CMD_CREATEOVER_ID_IN_SHM:
2066 op.params[0].tmpref.buffer = id;
2067 op.params[0].tmpref.size = id_size;
2068 op.params[1].value.a = storage_id;
2069
2070 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
2071 TEEC_VALUE_INPUT,
2072 TEEC_NONE, TEEC_NONE);
2073 break;
2074 case TA_STORAGE_CMD_RENAME_ID_IN_SHM:
2075 op.params[0].value.a = *obj;
2076 op.params[1].tmpref.buffer = id;
2077 op.params[1].tmpref.size = id_size;
2078
2079 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
2080 TEEC_MEMREF_TEMP_INPUT,
2081 TEEC_NONE, TEEC_NONE);
2082 break;
2083 default:
2084 return TEE_ERROR_GENERIC;
2085 }
2086
2087 res = TEEC_InvokeCommand(sess, command, &op, &org);
2088
2089 switch (command) {
2090 case TA_STORAGE_CMD_OPEN_ID_IN_SHM:
2091 case TA_STORAGE_CMD_CREATE_ID_IN_SHM:
2092 if (res == TEEC_SUCCESS)
2093 *obj = op.params[1].value.b;
2094 break;
2095 default:
2096 break;
2097 }
2098
2099 return res;
2100}
2101
2102static void xtest_tee_test_6020_single(ADBG_Case_t *c, uint32_t storage_id)
2103{
2104 TEEC_Result res;
2105 TEEC_Session sess;
2106 uint32_t orig;
2107 uint32_t obj;
2108
2109 /*
2110 * Invalid open request from the TA (object ID reference in SHM)
2111 */
2112 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
2113 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2114 return;
2115
2116 res = fs_create(&sess, file_01, sizeof(file_01),
2117 TEE_DATA_FLAG_ACCESS_WRITE |
2118 TEE_DATA_FLAG_ACCESS_WRITE_META |
2119 TEE_DATA_FLAG_OVERWRITE,
2120 0,
2121 data_00, sizeof(data_00),
2122 &obj,
2123 storage_id);
2124
2125 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2126 goto exit1;
2127 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
2128 goto exit1;
2129
2130 res = fs_access_with_bad_object_id_ref(&sess,
2131 TA_STORAGE_CMD_OPEN_ID_IN_SHM,
2132 file_01, sizeof(file_01),
2133 TEE_DATA_FLAG_ACCESS_WRITE |
2134 TEE_DATA_FLAG_ACCESS_WRITE_META |
2135 TEE_DATA_FLAG_OVERWRITE,
2136 0,
2137 NULL, 0,
2138 &obj,
2139 storage_id);
2140
2141 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
2142
2143 /*
2144 * Invalid create-overwrite request from the TA (object ID reference in SHM)
2145 */
2146 TEEC_CloseSession(&sess);
2147 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
2148 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2149 return;
2150
2151 res = fs_access_with_bad_object_id_ref(&sess,
2152 TA_STORAGE_CMD_CREATEOVER_ID_IN_SHM,
2153 file_01, sizeof(file_01),
2154 0,
2155 0,
2156 NULL, 0,
2157 NULL,
2158 storage_id);
2159
2160 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
2161
2162 /*
2163 * Invalid rename request from the TA (object ID reference in SHM)
2164 */
2165 TEEC_CloseSession(&sess);
2166 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
2167 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2168 return;
2169
2170 res = fs_open(&sess, file_01, sizeof(file_01),
2171 TEE_DATA_FLAG_ACCESS_WRITE |
2172 TEE_DATA_FLAG_ACCESS_WRITE_META |
2173 TEE_DATA_FLAG_OVERWRITE,
2174 &obj,
2175 storage_id);
2176
2177 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2178 goto exit1;
2179
2180 res = fs_access_with_bad_object_id_ref(&sess,
2181 TA_STORAGE_CMD_RENAME_ID_IN_SHM,
2182 file_01, sizeof(file_01) - 1,
2183 0,
2184 0,
2185 NULL, 0,
2186 &obj,
2187 0);
2188
2189 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
2190
2191 /*
2192 * Invalid creation request from the TA (object ID reference in SHM)
2193 */
2194 TEEC_CloseSession(&sess);
2195 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
2196 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2197 return;
2198
2199 res = fs_open(&sess, file_01, sizeof(file_01),
2200 TEE_DATA_FLAG_ACCESS_WRITE |
2201 TEE_DATA_FLAG_ACCESS_WRITE_META |
2202 TEE_DATA_FLAG_OVERWRITE,
2203 &obj,
2204 storage_id);
2205
2206 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2207 goto exit1;
2208
2209 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
2210
2211 res = fs_access_with_bad_object_id_ref(&sess,
2212 TA_STORAGE_CMD_CREATE_ID_IN_SHM,
2213 file_01, sizeof(file_01),
2214 TEE_DATA_FLAG_ACCESS_WRITE |
2215 TEE_DATA_FLAG_ACCESS_WRITE_META |
2216 TEE_DATA_FLAG_OVERWRITE,
2217 0,
2218 data_00, sizeof(data_00),
2219 &obj,
2220 storage_id);
2221
2222 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
2223
2224 return;
2225exit1:
2226 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
2227 TEEC_CloseSession(&sess);
2228}
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002229DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6020)
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002230ADBG_CASE_DEFINE(regression, 6020, xtest_tee_test_6020,
2231 "Object IDs in SHM (negative)");