blob: 8c0e953342969d9f50d48b26b49144c149428248 [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
32static uint32_t storage_ids[] = {
33 TEE_STORAGE_PRIVATE,
34#ifdef CFG_REE_FS
35 TEE_STORAGE_PRIVATE_REE,
36#endif
37#ifdef CFG_RPMB_FS
38 TEE_STORAGE_PRIVATE_RPMB,
39#endif
40};
Pascal Brandc639ac82015-07-02 08:53:34 +020041
42static uint8_t file_00[] = {
43 0x00, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
44 0xF0, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
45 0xE9, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
46 0xF0, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x8E
47};
48
49static uint8_t file_01[] = {
50 0x01, 0x00
51};
52
53static uint8_t file_02[] = {
54 0x02, 0x11, 0x02
55};
56
57static uint8_t file_03[] = {
58 0x03, 0x13, 0x03
59};
60
Pascal Brandeb84c442016-04-19 17:49:49 +020061static uint8_t file_04[] = {
62 0x00, 0x01, 0x02
63};
64
Pascal Brandc639ac82015-07-02 08:53:34 +020065static uint8_t data_00[] = {
66 0x00, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
67 0x00, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
68 0x00, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
69 0x00, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x00
70};
71
72static uint8_t data_01[] = {
73 0x01, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
74 0x01, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
75 0x01, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
76 0x01, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x01
77};
78
Jens Wiklanderaba31ba2017-02-15 15:24:06 +010079static uint32_t fs_id_for_tee_storage_private(void)
80{
81#if defined(CFG_REE_FS)
82 return TEE_STORAGE_PRIVATE_REE;
83#elif defined(CFG_RPMB_FS)
84 return TEE_STORAGE_PRIVATE_RPMB;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +010085#endif
86}
87
88static uint32_t real_id_for(uint32_t id)
89{
90 if (id == TEE_STORAGE_PRIVATE)
91 return fs_id_for_tee_storage_private();
92 return id;
93}
94
95static bool storage_is(uint32_t id1, uint32_t id2)
96{
97 return (real_id_for(id1) == real_id_for(id2));
98}
99
Pascal Brandc639ac82015-07-02 08:53:34 +0200100static TEEC_Result fs_open(TEEC_Session *sess, void *id, uint32_t id_size,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200101 uint32_t flags, uint32_t *obj, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200102{
Aijun Sun473d9072015-08-06 15:24:49 +0800103 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200104 TEEC_Result res;
105 uint32_t org;
106
107 op.params[0].tmpref.buffer = id;
108 op.params[0].tmpref.size = id_size;
109 op.params[1].value.a = flags;
110 op.params[1].value.b = 0;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200111 op.params[2].value.a = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200112
113 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200114 TEEC_VALUE_INOUT, TEEC_VALUE_INPUT,
Pascal Brandc639ac82015-07-02 08:53:34 +0200115 TEEC_NONE);
116
117 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_OPEN, &op, &org);
118
119 if (res == TEEC_SUCCESS)
120 *obj = op.params[1].value.b;
121
122 return res;
123}
124
125static TEEC_Result fs_create(TEEC_Session *sess, void *id, uint32_t id_size,
126 uint32_t flags, uint32_t attr, void *data,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200127 uint32_t data_size, uint32_t *obj,
128 uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200129{
Aijun Sun473d9072015-08-06 15:24:49 +0800130 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200131 TEEC_Result res;
132 uint32_t org;
133
134 op.params[0].tmpref.buffer = id;
135 op.params[0].tmpref.size = id_size;
136 op.params[1].value.a = flags;
137 op.params[1].value.b = 0;
138 op.params[2].value.a = attr;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200139 op.params[2].value.b = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200140 op.params[3].tmpref.buffer = data;
141 op.params[3].tmpref.size = data_size;
142
143 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
144 TEEC_VALUE_INOUT, TEEC_VALUE_INPUT,
145 TEEC_MEMREF_TEMP_INPUT);
146
147 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CREATE, &op, &org);
148
149 if (res == TEEC_SUCCESS)
150 *obj = op.params[1].value.b;
151
152 return res;
153}
154
Pascal Brandeb84c442016-04-19 17:49:49 +0200155static TEEC_Result fs_create_overwrite(TEEC_Session *sess, void *id,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200156 uint32_t id_size, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +0200157{
158 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
159 TEEC_Result res;
160 uint32_t org;
161
162 op.params[0].tmpref.buffer = id;
163 op.params[0].tmpref.size = id_size;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200164 op.params[1].value.a = storage_id;
Pascal Brandeb84c442016-04-19 17:49:49 +0200165
166 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200167 TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brandeb84c442016-04-19 17:49:49 +0200168 TEEC_NONE);
169
170 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CREATE_OVERWRITE, &op, &org);
171
172 return res;
173}
174
Pascal Brandc639ac82015-07-02 08:53:34 +0200175static TEEC_Result fs_close(TEEC_Session *sess, uint32_t obj)
176{
Aijun Sun473d9072015-08-06 15:24:49 +0800177 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200178 uint32_t org;
179
180 op.params[0].value.a = obj;
181
182 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
183 TEEC_NONE, TEEC_NONE);
184
185 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CLOSE, &op, &org);
186}
187
188static TEEC_Result fs_read(TEEC_Session *sess, uint32_t obj, void *data,
189 uint32_t data_size, uint32_t *count)
190{
191 TEEC_Result res;
Aijun Sun473d9072015-08-06 15:24:49 +0800192 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200193 uint32_t org;
194
195 op.params[0].tmpref.buffer = data;
196 op.params[0].tmpref.size = data_size;
197 op.params[1].value.a = obj;
198 op.params[1].value.b = 0;
199
200 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
201 TEEC_VALUE_INOUT, TEEC_NONE,
202 TEEC_NONE);
203
204 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_READ, &op, &org);
205
206 if (res == TEEC_SUCCESS)
207 *count = op.params[1].value.b;
208
209 return res;
210}
211
212static TEEC_Result fs_write(TEEC_Session *sess, uint32_t obj, void *data,
213 uint32_t data_size)
214{
Aijun Sun473d9072015-08-06 15:24:49 +0800215 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200216 uint32_t org;
217
218 op.params[0].tmpref.buffer = data;
219 op.params[0].tmpref.size = data_size;
220 op.params[1].value.a = obj;
221 op.params[1].value.b = 0;
222
223 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
224 TEEC_VALUE_INPUT, TEEC_NONE,
225 TEEC_NONE);
226
227 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_WRITE, &op, &org);
228}
229
230static TEEC_Result fs_seek(TEEC_Session *sess, uint32_t obj, int32_t offset,
231 int32_t whence)
232{
Aijun Sun473d9072015-08-06 15:24:49 +0800233 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200234 uint32_t org;
235
236 op.params[0].value.a = obj;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200237 op.params[0].value.b = *(uint32_t *)&offset;
Pascal Brandc639ac82015-07-02 08:53:34 +0200238 op.params[1].value.a = whence;
239
240 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INOUT,
241 TEEC_NONE, TEEC_NONE);
242
243 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_SEEK, &op, &org);
244}
245
246static TEEC_Result fs_unlink(TEEC_Session *sess, uint32_t obj)
247{
Aijun Sun473d9072015-08-06 15:24:49 +0800248 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200249 uint32_t org;
250
251 op.params[0].value.a = obj;
252
253 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
254 TEEC_NONE, TEEC_NONE);
255
256 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_UNLINK, &op, &org);
257}
258
259static TEEC_Result fs_trunc(TEEC_Session *sess, uint32_t obj, uint32_t len)
260{
Aijun Sun473d9072015-08-06 15:24:49 +0800261 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200262 uint32_t org;
263
264 op.params[0].value.a = obj;
265 op.params[0].value.b = len;
266
267 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
268 TEEC_NONE, TEEC_NONE);
269
270 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_TRUNC, &op, &org);
271}
272
273static TEEC_Result fs_rename(TEEC_Session *sess, uint32_t obj, void *id,
274 uint32_t id_size)
275{
Aijun Sun473d9072015-08-06 15:24:49 +0800276 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200277 uint32_t org;
278
279 op.params[0].value.a = obj;
280 op.params[1].tmpref.buffer = id;
281 op.params[1].tmpref.size = id_size;
282
283 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
284 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
285 TEEC_NONE);
286
287 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RENAME, &op, &org);
288}
289
290static TEEC_Result fs_alloc_enum(TEEC_Session *sess, uint32_t *e)
291{
292 TEEC_Result res;
Aijun Sun473d9072015-08-06 15:24:49 +0800293 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200294 uint32_t org;
295
296 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE,
297 TEEC_NONE, TEEC_NONE);
298
299 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_ALLOC_ENUM, &op, &org);
300
301 if (res == TEEC_SUCCESS)
302 *e = op.params[0].value.a;
303
304 return res;
305}
306
Jerome Forissier5d969d82017-03-21 10:01:04 +0100307static TEEC_Result fs_reset_enum(TEEC_Session *sess, uint32_t e)
308{
309 TEEC_Result res;
310 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
311 uint32_t org;
312
313 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
314 TEEC_NONE, TEEC_NONE);
315
316 op.params[0].value.a = e;
317 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESET_ENUM, &op, &org);
318
319 return res;
320}
321
Pascal Brandc639ac82015-07-02 08:53:34 +0200322static TEEC_Result fs_free_enum(TEEC_Session *sess, uint32_t e)
323{
Aijun Sun473d9072015-08-06 15:24:49 +0800324 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200325 uint32_t org;
326
327 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
328 TEEC_NONE);
329
330 op.params[0].value.a = e;
331
332 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_FREE_ENUM, &op, &org);
333}
334
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200335static TEEC_Result fs_start_enum(TEEC_Session *sess, uint32_t e,
336 uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200337{
Aijun Sun473d9072015-08-06 15:24:49 +0800338 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200339 uint32_t org;
340
341 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
342 TEEC_NONE, TEEC_NONE);
343
344 op.params[0].value.a = e;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200345 op.params[0].value.b = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200346
347 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_START_ENUM, &op, &org);
348}
349
350static TEEC_Result fs_next_enum(TEEC_Session *sess, uint32_t e, void *obj_info,
351 size_t info_size, void *id, uint32_t id_size)
352{
Aijun Sun473d9072015-08-06 15:24:49 +0800353 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200354 uint32_t org;
355
Pascal Brandc603e0d2016-04-25 12:37:18 +0200356 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brandc639ac82015-07-02 08:53:34 +0200357 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
Pascal Brandc603e0d2016-04-25 12:37:18 +0200358 if (obj_info && info_size)
359 op.paramTypes |= (TEEC_MEMREF_TEMP_OUTPUT << 4);
Pascal Brandc639ac82015-07-02 08:53:34 +0200360
361 op.params[0].value.a = e;
362 op.params[1].tmpref.buffer = obj_info;
363 op.params[1].tmpref.size = info_size;
364 op.params[2].tmpref.buffer = id;
365 op.params[2].tmpref.size = id_size;
366
367 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_NEXT_ENUM, &op, &org);
368}
369
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200370static TEEC_Result fs_restrict_usage(TEEC_Session *sess, uint32_t obj,
371 uint32_t obj_usage)
372{
373 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
374 uint32_t org;
375
376 op.params[0].value.a = obj;
377 op.params[0].value.b = obj_usage;
378
379 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
380 TEEC_NONE, TEEC_NONE);
381
382 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESTRICT_USAGE,
383 &op, &org);
384}
385
386static TEEC_Result fs_alloc_obj(TEEC_Session *sess, uint32_t obj_type,
387 uint32_t max_key_size, uint32_t *obj)
388{
389 TEEC_Result res;
390 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
391 uint32_t org;
392
393 op.params[0].value.a = obj_type;
394 op.params[0].value.b = max_key_size;
395
396 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
397 TEEC_NONE, TEEC_NONE);
398
399 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_ALLOC_OBJ, &op, &org);
400 *obj = op.params[1].value.a;
401 return res;
402}
403
404static TEEC_Result fs_free_obj(TEEC_Session *sess, uint32_t obj)
405{
406 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
407 uint32_t org;
408
409 op.params[0].value.a = obj;
410
411 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
412 TEEC_NONE, TEEC_NONE);
413
414 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_FREE_OBJ, &op, &org);
415}
416
417static TEEC_Result fs_reset_obj(TEEC_Session *sess, uint32_t obj)
418{
419 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
420 uint32_t org;
421
422 op.params[0].value.a = obj;
423
424 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
425 TEEC_NONE, TEEC_NONE);
426
427 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESET_OBJ, &op, &org);
428}
429
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800430static TEEC_Result fs_get_obj_info(TEEC_Session *sess, uint32_t obj,
431 void *obj_info, size_t info_size)
432{
433 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
434 uint32_t org;
435
436 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
437 TEEC_MEMREF_TEMP_OUTPUT,
438 TEEC_NONE, TEEC_NONE);
439
440 op.params[0].value.a = obj;
441 op.params[1].tmpref.buffer = obj_info;
442 op.params[1].tmpref.size = info_size;
443
444 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_GET_OBJ_INFO, &op, &org);
445}
446
James Kung98c0ba12015-09-09 15:51:59 +0800447/* trunc */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200448static void test_truncate_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800449{
450 TEEC_Session sess;
451 uint32_t obj;
452 uint8_t out[10] = { 0 };
453 uint32_t count;
454 uint32_t orig;
455
456 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
457 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
458 return;
459
460 /* create */
461 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
462 fs_create(&sess, file_01, sizeof(file_01),
463 TEE_DATA_FLAG_ACCESS_WRITE |
464 TEE_DATA_FLAG_ACCESS_READ |
465 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200466 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800467 goto exit;
468
469 /* trunc */
470 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 10)))
471 goto exit;
472
473 /* seek */
474 if (!ADBG_EXPECT_TEEC_SUCCESS(
475 c, fs_seek(&sess, obj, 5, TEE_DATA_SEEK_SET)))
476 goto exit;
477
478 /* verify */
479 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
480 goto exit;
481
482 /* check buffer */
483 (void)ADBG_EXPECT_BUFFER(c, &data_00[5], 5, out, count);
484
485 /* clean */
486 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
487 goto exit;
488
489exit:
490 TEEC_CloseSession(&sess);
491}
492
493/* extend */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200494static void test_extend_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800495{
496 TEEC_Session sess;
497 uint32_t obj;
498 uint8_t out[10] = { 0 };
499 uint8_t expect[10] = { 0 };
500 uint32_t count;
501 uint32_t orig;
502
503 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
504 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
505 return;
506
507 /* create */
508 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
509 fs_create(&sess, file_01, sizeof(file_01),
510 TEE_DATA_FLAG_ACCESS_WRITE |
511 TEE_DATA_FLAG_ACCESS_READ |
512 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200513 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800514 goto exit;
515
516 /* extend */
517 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 40)))
518 goto exit;
519
520 /* seek */
521 if (!ADBG_EXPECT_TEEC_SUCCESS(
522 c, fs_seek(&sess, obj, 30, TEE_DATA_SEEK_SET)))
523 goto exit;
524
525 /* verify */
526 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
527 goto exit;
528
529 /* check buffer */
530 expect[0] = data_00[30];
531 expect[1] = data_00[31];
532 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
533
534 /* clean */
535 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
536 goto exit;
537
538exit:
539 TEEC_CloseSession(&sess);
540}
541
542/* file hole */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200543static void test_file_hole(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800544{
545 TEEC_Session sess;
546 uint32_t obj;
547 uint8_t out[10] = { 0 };
548 uint8_t expect[10] = { 0 };
549 uint32_t count;
550 uint32_t orig;
551
552 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
553 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
554 return;
555
556 /* create */
557 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
558 fs_create(&sess, file_01, sizeof(file_01),
559 TEE_DATA_FLAG_ACCESS_WRITE |
560 TEE_DATA_FLAG_ACCESS_READ |
561 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200562 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800563 goto exit;
564
565 /* seek */
566 if (!ADBG_EXPECT_TEEC_SUCCESS(
567 c, fs_seek(&sess, obj, 80, TEE_DATA_SEEK_SET)))
568 goto exit;
569
570 /* write */
571 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_write(&sess, obj, data_00,
572 sizeof(data_00))))
573 goto exit;
574
575 /* seek */
576 if (!ADBG_EXPECT_TEEC_SUCCESS(
577 c, fs_seek(&sess, obj, 74, TEE_DATA_SEEK_SET)))
578 goto exit;
579
580 /* verify */
581 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
582 goto exit;
583
584 /* check buffer */
585 expect[6] = data_00[0];
586 expect[7] = data_00[1];
587 expect[8] = data_00[2];
588 expect[9] = data_00[3];
589 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
590
591 /* clean */
592 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
593 goto exit;
594
595exit:
596 TEEC_CloseSession(&sess);
597}
598
Jerome Forissiere3688342015-09-24 10:45:17 -0700599#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +0200600static TEEC_Result ds_seek_obj_inv_handle(TEEC_Session *sess)
601{
602 TEEC_Operation op;
603 uint32_t org;
604
605 op.paramTypes = TEEC_PARAM_TYPES(
606 TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
607
608 op.params[0].value.a = CASE_DATA_OBJECT_NOT_PERSISTENT;
609
610 return TEEC_InvokeCommand(
611 sess, CMD_SeekObjectData_panic, &op, &org);
612}
613
Pascal Brand8a74e362015-09-10 12:41:52 +0200614static TEEC_Result ds_seek_gp(
615 TEEC_Session *sess, TEE_Whence wh, uint32_t wh_off, uint32_t set_off,
616 void *in, size_t in_size, void *out, size_t out_size)
617{
618 TEEC_Operation op;
619 uint32_t org;
620
621 op.paramTypes = TEEC_PARAM_TYPES(
622 TEEC_VALUE_INPUT, TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT,
623 TEEC_MEMREF_TEMP_OUTPUT);
624
625 op.params[0].value.a = wh;
626 op.params[0].value.b = wh_off;
627 op.params[1].value.a = set_off;
628 op.params[2].tmpref.buffer = in;
629 op.params[2].tmpref.size = in_size;
630 op.params[3].tmpref.buffer = out;
631 op.params[3].tmpref.size = out_size;
632
633 return TEEC_InvokeCommand(sess, CMD_SeekWriteReadObjectData, &op, &org);
634}
635
636static TEEC_Result ds_init_object_and_attributes(TEEC_Session *sess,
637 uint32_t obj_type, uint32_t obj_size, const void *attr_meta,
638 size_t attr_meta_len, const void *attr_data, size_t attr_data_len,
639 uint32_t option)
640{
641 TEEC_Operation op;
642 uint32_t org;
643
644 op.paramTypes = TEEC_PARAM_TYPES(
645 TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT,
646 TEEC_MEMREF_TEMP_INPUT, TEEC_VALUE_INPUT);
647
648 op.params[0].value.a = obj_type;
649 op.params[0].value.b = obj_size;
650 op.params[1].tmpref.buffer = (void *)attr_meta;
651 op.params[1].tmpref.size = attr_meta_len;
652 op.params[2].tmpref.buffer = (void *)attr_data;
653 op.params[2].tmpref.size = attr_data_len;
654 op.params[3].value.a = option;
655
656 return TEEC_InvokeCommand(sess, CMD_InitObjectAndAttributes, &op, &org);
657}
658
659static TEEC_Result ds_rename_access_conflict(TEEC_Session *sess)
660{
661 TEEC_Operation op;
662 uint32_t org;
663
664 op.paramTypes = TEEC_PARAM_TYPES(
665 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
666
667 return TEEC_InvokeCommand(
668 sess, CMD_RenamePersistentObject_AccessConflict, &op, &org);
669}
670
671static TEEC_Result ds_start_enum_no_item(TEEC_Session *sess)
672{
673 TEEC_Operation op;
674 uint32_t org;
675 TEEC_Result res;
676
677 op.paramTypes = TEEC_PARAM_TYPES(
678 TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
679
680 res = TEEC_InvokeCommand(
681 sess, CMD_StartNGetPersistentObjectEnumerator_itemNotFound, &op, &org);
682
683 if (res != TEEC_SUCCESS)
684 return res;
685
686 if (op.params[0].value.a != 0 || op.params[0].value.b != 0)
687 return TEEC_ERROR_GENERIC;
688
689 return res;
690}
691
692static TEEC_Result ds_rename_success(TEEC_Session *sess)
693{
694 TEEC_Operation op;
695 uint32_t org;
696
697 op.paramTypes = TEEC_PARAM_TYPES(
698 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
699
700 return TEEC_InvokeCommand(
701 sess, CMD_RenamePersistentObject_Success, &op, &org);
702}
703
704static TEEC_Result ds_null_close_free_reset(TEEC_Session *sess)
705{
706 TEEC_Operation op;
707 uint32_t org;
708
709 op.paramTypes = TEEC_PARAM_TYPES(
710 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
711
712 return TEEC_InvokeCommand(
713 sess, CMD_CloseFreeAndResetObjectSuccessHandleNull, &op, &org);
714}
715#endif
716
Pascal Brandc639ac82015-07-02 08:53:34 +0200717/* create */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200718static void xtest_tee_test_6001_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200719{
720 TEEC_Session sess;
721 uint32_t obj;
722 uint32_t orig;
723
724 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
725 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
726 return;
727
728 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
729 fs_create(&sess, file_00, sizeof(file_00),
730 TEE_DATA_FLAG_ACCESS_WRITE |
731 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200732 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200733 goto exit;
734
735 /* clean */
736 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
737 goto exit;
738
739exit:
740 TEEC_CloseSession(&sess);
741}
742
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200743#define DEFINE_TEST_MULTIPLE_STORAGE_IDS(test_name) \
744static void test_name(ADBG_Case_t *c) \
745{ \
746 size_t i; \
747 \
748 for (i = 0; i < ARRAY_SIZE(storage_ids); i++) { \
749 Do_ADBG_BeginSubCase(c, "Storage id: %08x", storage_ids[i]); \
750 test_name##_single(c, storage_ids[i]); \
751 Do_ADBG_EndSubCase(c, "Storage id: %08x", storage_ids[i]); \
752 } \
753}
754
755DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6001)
756
Pascal Brandc639ac82015-07-02 08:53:34 +0200757/* open */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200758static void xtest_tee_test_6002_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200759{
760 TEEC_Session sess;
761 uint32_t obj;
762 uint32_t orig;
763
764 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
765 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
766 return;
767
768 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
769 fs_create(&sess, file_01, sizeof(file_01),
770 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200771 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200772 goto exit;
773
774 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
775 goto exit;
776
777 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
778 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200779 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200780 goto exit;
781
782 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
783 goto exit;
784
785 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
786 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200787 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200788 goto exit;
789
790 /* clean */
791 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
792 goto exit;
793
794exit:
795 TEEC_CloseSession(&sess);
796}
797
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200798DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6002)
799
Pascal Brandc639ac82015-07-02 08:53:34 +0200800/* read */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200801static void xtest_tee_test_6003_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200802{
803 TEEC_Session sess;
804 uint32_t obj;
805 uint8_t out[10] = { 0 };
806 uint32_t count;
807 uint32_t orig;
808
809 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
810 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
811 return;
812
813 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
814 fs_create(&sess, file_02, sizeof(file_02),
815 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200816 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200817 goto exit;
818
819 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
820 goto exit;
821
822 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
823 fs_open(&sess, file_02, sizeof(file_02),
824 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200825 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200826 goto exit;
827
828 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
829 goto exit;
830
831 (void)ADBG_EXPECT_BUFFER(c, data_01, 10, out, count);
832
833 /* clean */
834 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
835 goto exit;
836
837exit:
838 TEEC_CloseSession(&sess);
839}
840
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200841DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6003)
842
Pascal Brandc639ac82015-07-02 08:53:34 +0200843/* write */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200844static void xtest_tee_test_6004_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200845{
846 TEEC_Session sess;
847 uint32_t obj;
848 uint8_t out[10] = { 0 };
849 uint32_t count;
850 uint32_t orig;
851
852 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
853 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
854 return;
855
856 /* create */
857 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
858 fs_create(&sess, file_02, sizeof(file_02),
859 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200860 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200861 goto exit;
862
863 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
864 goto exit;
865
866 /* write new data */
867 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
868 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200869 TEE_DATA_FLAG_ACCESS_WRITE, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200870 goto exit;
871
872 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
873 fs_write(&sess, obj, data_00, sizeof(data_00))))
874 goto exit;
875
876 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
877 goto exit;
878
879 /* verify */
880 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
881 fs_open(&sess, file_02, sizeof(file_02),
882 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200883 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200884 goto exit;
885
886 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
887 goto exit;
888
889 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
890
891 /* clean */
892 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
893 goto exit;
894
895exit:
896 TEEC_CloseSession(&sess);
897}
898
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200899DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6004)
900
Pascal Brandc639ac82015-07-02 08:53:34 +0200901/* seek */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200902static void xtest_tee_test_6005_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200903{
904 TEEC_Session sess;
905 uint32_t obj;
906 uint8_t out[10] = { 0 };
907 uint32_t count;
908 uint32_t orig;
909
910 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
911 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
912 return;
913
914 /* create */
915 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
916 fs_create(&sess, file_01, sizeof(file_01),
917 TEE_DATA_FLAG_ACCESS_WRITE |
918 TEE_DATA_FLAG_ACCESS_READ |
919 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200920 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200921 goto exit;
922
923 /* seek */
924 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
925 fs_seek(&sess, obj, 10, TEE_DATA_SEEK_SET)))
926 goto exit;
927
928 /* verify */
929 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
930 goto exit;
931
932 (void)ADBG_EXPECT_BUFFER(c, &data_00[10], 10, out, count);
933
934 /* clean */
935 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
936 goto exit;
937
938exit:
939 TEEC_CloseSession(&sess);
940}
941
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200942DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6005)
943
Pascal Brandc639ac82015-07-02 08:53:34 +0200944/* unlink */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200945static void xtest_tee_test_6006_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200946{
947 TEEC_Session sess;
948 uint32_t obj;
949 uint32_t orig;
950
951 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
952 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
953 return;
954
955 /* create */
956 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
957 fs_create(&sess, file_01, sizeof(file_01),
958 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200959 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200960 goto exit;
961
962 /* del & close */
963 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
964 goto exit;
965
966 /* check result */
967 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
968 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200969 TEE_DATA_FLAG_ACCESS_READ, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200970 goto exit;
971
972exit:
973 TEEC_CloseSession(&sess);
974}
975
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200976DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6006)
977
978static void xtest_tee_test_6007_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200979{
James Kung98c0ba12015-09-09 15:51:59 +0800980 Do_ADBG_BeginSubCase(c, "Test truncate file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200981 test_truncate_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +0800982 Do_ADBG_EndSubCase(c, "Test truncate file length");
Pascal Brandc639ac82015-07-02 08:53:34 +0200983
James Kung98c0ba12015-09-09 15:51:59 +0800984 Do_ADBG_BeginSubCase(c, "Test extend file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200985 test_extend_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +0800986 Do_ADBG_EndSubCase(c, "Test extend file length");
Pascal Brandc639ac82015-07-02 08:53:34 +0200987
James Kung98c0ba12015-09-09 15:51:59 +0800988 Do_ADBG_BeginSubCase(c, "Test file hole");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200989 test_file_hole(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +0800990 Do_ADBG_EndSubCase(c, "Test file hole");
Pascal Brandc639ac82015-07-02 08:53:34 +0200991}
992
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200993DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6007)
994
995static void xtest_tee_test_6008_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200996{
997 TEEC_Session sess;
998 uint32_t obj;
999 uint8_t out[10] = { 0 };
1000 uint32_t count;
1001 uint32_t orig;
1002
1003 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1004 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1005 return;
1006
1007 /* create */
1008 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1009 fs_create(&sess, file_02, sizeof(file_02),
1010 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001011 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001012 goto exit;
1013
1014 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1015 goto exit;
1016
1017 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1018 fs_open(&sess, file_02, sizeof(file_02),
1019 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001020 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001021 goto exit;
1022
1023 /* write new data */
1024 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1025 fs_write(&sess, obj, data_00, sizeof(data_00))))
1026 goto exit;
1027
1028 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1029 fs_rename(&sess, obj, file_03, sizeof(file_03))))
1030 goto exit;
1031
1032 /* close */
1033 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1034 goto exit;
1035
1036 /* verify */
1037 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1038 fs_open(&sess, file_03, sizeof(file_03),
1039 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001040 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001041 goto exit;
1042
1043 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1044 goto exit;
1045
1046 /* check buffer */
1047 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
1048
1049 /* clean */
1050 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1051 goto exit;
1052
1053exit:
1054 TEEC_CloseSession(&sess);
1055}
1056
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001057DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6008)
1058
1059static void xtest_tee_test_6009_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001060{
1061 TEEC_Session sess;
1062 uint32_t obj0;
1063 uint32_t obj1;
1064 uint32_t obj2;
1065 uint32_t e = 0;
1066 uint8_t info[200];
1067 uint8_t id[200];
1068 uint32_t orig;
1069
1070 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1071 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1072 return;
1073
1074 /* create file 00 */
1075 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1076 fs_create(&sess, file_00, sizeof(file_00),
1077 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001078 sizeof(data_01), &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001079 goto exit;
1080
1081 /* create file 01 */
1082 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1083 fs_create(&sess, file_01, sizeof(file_01),
1084 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001085 sizeof(data_01), &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001086 goto exit;
1087
1088 /* create file 02 */
1089 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1090 fs_create(&sess, file_02, sizeof(file_02),
1091 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001092 sizeof(data_01), &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001093 goto exit;
1094
1095 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj0)))
1096 goto exit;
1097
1098 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj1)))
1099 goto exit;
1100
1101 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj2)))
1102 goto exit;
1103
1104 /* iterate */
1105 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e)))
1106 goto exit;
1107
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001108 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_start_enum(&sess, e, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001109 goto exit;
1110
1111 /* get 00 */
1112 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1113 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1114 goto exit;
1115
1116 /* get 01 */
1117 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc603e0d2016-04-25 12:37:18 +02001118 fs_next_enum(&sess, e, NULL, 0, id, sizeof(id))))
Pascal Brandc639ac82015-07-02 08:53:34 +02001119 goto exit;
1120
1121 /* get 02 */
1122 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1123 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1124 goto exit;
1125
1126 /* we should not have more files */
1127 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1128 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1129 goto exit;
1130
1131 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e)))
1132 goto exit;
1133
1134 /* clean */
1135 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1136 fs_open(&sess, file_00, sizeof(file_00),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001137 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001138 goto exit;
1139
1140 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj0)))
1141 goto exit;
1142
1143 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1144 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001145 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001146 goto exit;
1147
1148 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj1)))
1149 goto exit;
1150
1151 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1152 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001153 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001154 goto exit;
1155
1156 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj2)))
1157 goto exit;
1158
1159exit:
1160 TEEC_CloseSession(&sess);
1161}
1162
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001163DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6009)
1164
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001165static void xtest_tee_test_6010_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand8a74e362015-09-10 12:41:52 +02001166{
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001167 TEEC_Session sess;
1168 uint32_t orig;
1169 uint32_t o1;
1170 uint32_t o2;
1171 uint32_t e;
1172 uint32_t f;
1173 uint8_t data[1024];
1174 uint8_t out[1024];
1175 uint32_t n;
Pascal Brand30844922015-09-17 12:12:42 +02001176
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001177 for (n = 0; n < ARRAY_SIZE(data); n++)
1178 data[n] = n;
Pascal Brand8a74e362015-09-10 12:41:52 +02001179
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001180 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1181 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1182 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001183
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001184 Do_ADBG_BeginSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001185
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001186 o1 = TEE_HANDLE_NULL;
1187 o2 = TEE_HANDLE_NULL;
1188 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1189 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1190 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
Pascal Brand8a74e362015-09-10 12:41:52 +02001191
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001192 ADBG_EXPECT_TEEC_SUCCESS(c,
1193 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1194 sizeof(data), &o1, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001195
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001196 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE;
1197 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ACCESS_CONFLICT,
1198 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1199 sizeof(data), &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001200
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001201 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1202 if (o2)
1203 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
Pascal Brand8a74e362015-09-10 12:41:52 +02001204
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001205 Do_ADBG_EndSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001206
Pascal Brand8a74e362015-09-10 12:41:52 +02001207
Pascal Brand8a74e362015-09-10 12:41:52 +02001208
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001209 Do_ADBG_BeginSubCase(c, "RestrictObjectUsage Panic");
1210 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1211 fs_restrict_usage(&sess, 0xffffbad0, 0xffffffff));
1212 Do_ADBG_EndSubCase(c, "RestrictObjectUsage Panic");
Pascal Brand8a74e362015-09-10 12:41:52 +02001213
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001214 TEEC_CloseSession(&sess);
1215 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1216 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1217 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001218
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001219 Do_ADBG_BeginSubCase(c, "SeekObjectData BadHandle");
1220 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1221 fs_seek(&sess, 0xffffbad0, 5, TEE_DATA_SEEK_SET));
1222 Do_ADBG_EndSubCase(c, "SeekObjectData BadHandle");
Pascal Brand8a74e362015-09-10 12:41:52 +02001223
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001224 TEEC_CloseSession(&sess);
1225 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1226 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1227 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001228
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001229 Do_ADBG_BeginSubCase(c, "SeekObjectData NotPersist");
1230 o1 = 0;
1231 ADBG_EXPECT_TEEC_SUCCESS(c,
1232 fs_alloc_obj(&sess, TEE_TYPE_AES, 256, &o1));
1233 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1234 fs_seek(&sess, o1, 5, TEE_DATA_SEEK_SET));
1235 Do_ADBG_EndSubCase(c, "SeekObjectData NotPersist");
Pascal Brand8a74e362015-09-10 12:41:52 +02001236
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001237 TEEC_CloseSession(&sess);
1238 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1239 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1240 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001241
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001242 Do_ADBG_BeginSubCase(c, "SeekWriteRead");
1243 o1 = 0;
1244 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1245 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1246 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1247 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1248 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1249 sizeof(data), &o1, storage_id)))
1250 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001251
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001252 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1253 fs_seek(&sess, o1, 2, TEE_DATA_SEEK_SET)))
1254 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001255
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001256 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1257 fs_seek(&sess, o1, 0, TEE_DATA_SEEK_END)))
1258 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001259
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001260 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1261 fs_write(&sess, o1, data, sizeof(data))))
1262 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001263
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001264 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1265 fs_seek(&sess, o1, sizeof(data), TEE_DATA_SEEK_SET)))
1266 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001267
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001268 memset(out, 0xab, sizeof(out));
1269 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1270 fs_read(&sess, o1, out, sizeof(out), &n)))
1271 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001272
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001273 ADBG_EXPECT_BUFFER(c, data, sizeof(data), out, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001274
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001275 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander3a6892e2016-09-14 15:53:52 +02001276 fs_seek(&sess, o1, 10, TEE_DATA_SEEK_END)))
1277 goto seek_write_read_out;
1278
1279 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1280 fs_read(&sess, o1, out, sizeof(out), &n)))
1281 goto seek_write_read_out;
1282 ADBG_EXPECT_COMPARE_UNSIGNED(c, n, ==, 0);
1283
1284 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001285 fs_seek(&sess, o1, -(int32_t)sizeof(data) / 2,
1286 TEE_DATA_SEEK_END)))
1287 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001288
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001289 memset(out, 0xab, sizeof(out) / 2);
1290 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1291 fs_read(&sess, o1, out, sizeof(out) / 2, &n)))
1292 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001293
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001294 ADBG_EXPECT_BUFFER(c,
1295 data + sizeof(data) / 2, sizeof(data) / 2,
1296 out + sizeof(data) / 2, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001297
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001298seek_write_read_out:
1299 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1300 Do_ADBG_EndSubCase(c, "SeekWriteRead");
Pascal Brand8a74e362015-09-10 12:41:52 +02001301
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001302 Do_ADBG_BeginSubCase(c, "Rename Access Conflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001303
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001304 o1 = TEE_HANDLE_NULL;
1305 o2 = TEE_HANDLE_NULL;
1306 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1307 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1308 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1309 ADBG_EXPECT_TEEC_SUCCESS(c,
1310 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1311 sizeof(data), &o1, storage_id));
1312 ADBG_EXPECT_TEEC_SUCCESS(c,
1313 fs_create(&sess, file_01, sizeof(file_01), f, 0, data,
1314 sizeof(data) / 2, &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001315
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001316 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ACCESS_CONFLICT,
1317 fs_rename(&sess, o2, file_00, sizeof(file_00)));
Pascal Brand8a74e362015-09-10 12:41:52 +02001318
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001319 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1320 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
1321
1322 Do_ADBG_EndSubCase(c, "Rename Access Conflict");
1323
Jerome Forissier5d969d82017-03-21 10:01:04 +01001324 Do_ADBG_BeginSubCase(c, "AllocPersistentObjectEnumerator + "
1325 "ResetPersistentObjectEnumerator");
1326 e = TEE_HANDLE_NULL;
1327 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1328 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_enum(&sess, e));
1329 Do_ADBG_EndSubCase(c, "AllocPersistentObjectEnumerator + "
1330 "ResetPersistentObjectEnumerator");
1331
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001332 Do_ADBG_BeginSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1333 e = TEE_HANDLE_NULL;
1334 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1335 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1336 fs_next_enum(&sess, e, NULL, 0, out, sizeof(out)));
1337 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1338 fs_start_enum(&sess, e, storage_id));
1339 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e));
1340 Do_ADBG_EndSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1341
1342 Do_ADBG_BeginSubCase(c, "RenamePersistent ReadWrite");
1343 o1 = TEE_HANDLE_NULL;
1344 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1345 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1346 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1347 ADBG_EXPECT_TEEC_SUCCESS(c,
1348 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1349 sizeof(data), &o1, storage_id));
1350 ADBG_EXPECT_TEEC_SUCCESS(c,
1351 fs_rename(&sess, o1, file_01, sizeof(file_01)));
1352 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1353 Do_ADBG_EndSubCase(c, "RenamePersistent ReadWrite");
1354
1355 Do_ADBG_BeginSubCase(c, "Close Free Reset Null");
1356 ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, TEE_HANDLE_NULL));
1357 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_obj(&sess, TEE_HANDLE_NULL));
1358 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_obj(&sess, TEE_HANDLE_NULL));
1359 Do_ADBG_EndSubCase(c, "Close Free Reset Null");
1360
1361 TEEC_CloseSession(&sess);
Pascal Brand8a74e362015-09-10 12:41:52 +02001362}
1363
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001364DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6010)
1365
1366#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +02001367static void xtest_tee_test_6011(ADBG_Case_t *c)
1368{
1369 TEEC_Session sess;
1370 uint32_t orig;
1371 /*
1372 * Test data from
1373 * Invoke_InitObjectAndAttributes_TEE_TYPE_AES_success_attribute_
1374 * TEE_ATTR_SECRET_VALUE_correct_size (9d-9a-91)
1375 */
1376 static const uint8_t attr_meta[] = {
13770xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
13780x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
13790x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
13800x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
1381 };
1382 static const uint8_t attr_data[] = {
13830x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,
13840x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,
13850xdf,0xf4,
1386 };
1387
1388 if (!ADBG_EXPECT_TEEC_SUCCESS(
1389 c, xtest_teec_open_session(
1390 &sess, &gp_tta_ds_uuid, NULL, &orig)))
1391 return;
1392
1393 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ds_init_object_and_attributes(&sess,
1394 0xa0000010, 0x100, attr_meta, sizeof(attr_meta), attr_data,
1395 sizeof(attr_data), 0)))
1396 goto exit;
1397
1398exit:
1399 TEEC_CloseSession(&sess);
1400}
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001401#endif /*WITH_GP_TESTS*/
Pascal Brand8a74e362015-09-10 12:41:52 +02001402
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001403static void xtest_tee_test_6012_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +02001404{
1405 TEEC_Session sess;
1406 uint32_t orig;
1407 uint32_t obj;
1408
Etienne Carrierea54952b2017-10-27 15:58:01 +02001409 /*
1410 * create the object a first time (forced through with overwrite attribute)
1411 */
Pascal Brandeb84c442016-04-19 17:49:49 +02001412 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1413 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1414 return;
1415
1416 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001417 fs_create_overwrite(&sess, file_04, sizeof(file_04), storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001418 goto bail1;
Pascal Brandeb84c442016-04-19 17:49:49 +02001419
1420 TEEC_CloseSession(&sess);
1421
Etienne Carrierea54952b2017-10-27 15:58:01 +02001422 /*
1423 * re-create the object two times with overwrite attribute
1424 */
Pascal Brandeb84c442016-04-19 17:49:49 +02001425 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1426 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1427 return;
1428
1429 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001430 fs_create_overwrite(&sess, file_04, sizeof(file_04),
1431 storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001432 goto bail1;
Pascal Brandeb84c442016-04-19 17:49:49 +02001433
Etienne Carrierea54952b2017-10-27 15:58:01 +02001434 /* re-create it with an object */
1435 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandeb84c442016-04-19 17:49:49 +02001436 fs_create(&sess, file_04, sizeof(file_04),
1437 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001438 TEE_DATA_FLAG_ACCESS_WRITE_META |
1439 TEE_DATA_FLAG_OVERWRITE, 0, NULL, 0, &obj,
1440 storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001441 goto bail2;
Pascal Brandeb84c442016-04-19 17:49:49 +02001442
Etienne Carrierea54952b2017-10-27 15:58:01 +02001443 TEEC_CloseSession(&sess);
Pascal Brandeb84c442016-04-19 17:49:49 +02001444
Etienne Carrierea54952b2017-10-27 15:58:01 +02001445 /*
1446 * re-create it again without overwrite flag: should fail and
1447 * existing object should not be altered.
1448 */
1449 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1450 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1451 return;
1452
1453 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ACCESS_CONFLICT,
1454 fs_create(&sess, file_04, sizeof(file_04),
1455 TEE_DATA_FLAG_ACCESS_WRITE |
1456 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, NULL, 0, &obj,
1457 storage_id)))
1458 goto bail2;
1459
1460 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1461 fs_open(&sess, file_04, sizeof(file_04),
1462 TEE_DATA_FLAG_ACCESS_READ |
1463 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj,
1464 storage_id)))
1465 goto bail1;
1466
1467bail2:
1468 /* remove the object so that xtest 600x can be replayed */
1469 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1470bail1:
Pascal Brandeb84c442016-04-19 17:49:49 +02001471 TEEC_CloseSession(&sess);
1472}
1473
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001474DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6012)
1475
1476static void xtest_tee_test_6013_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand90f23352016-05-19 15:15:47 +02001477{
1478 TEEC_Session sess;
1479 uint32_t orig;
1480 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1481
1482 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1483 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1484 return;
1485
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001486 op.params[0].value.a = storage_id;
1487 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand90f23352016-05-19 15:15:47 +02001488 TEEC_NONE, TEEC_NONE);
1489
1490 ADBG_EXPECT_TEEC_SUCCESS(c,
1491 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_KEY_IN_PERSISTENT,
1492 &op, &orig));
1493
1494 TEEC_CloseSession(&sess);
1495}
1496
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001497DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6013)
1498
1499static void xtest_tee_test_6014_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand29ee18f2016-05-23 14:13:56 +02001500{
1501 TEEC_Session sess;
1502 uint32_t orig;
1503 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1504
1505 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1506 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1507 return;
1508
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001509 op.params[0].value.a = storage_id;
1510 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand29ee18f2016-05-23 14:13:56 +02001511 TEEC_NONE, TEEC_NONE);
1512
1513 ADBG_EXPECT_TEEC_SUCCESS(c,
1514 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_LOOP, &op, &orig));
1515
1516 TEEC_CloseSession(&sess);
1517}
1518
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001519DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6014)
1520
Jerome Forissiere3854162016-08-12 12:40:12 +02001521static void xtest_tee_test_6015_single(ADBG_Case_t *c, uint32_t storage_id)
1522{
1523 TEEC_Session sess;
1524 TEEC_Session sess2;
1525 uint32_t orig;
1526 uint32_t obj;
1527 uint32_t obj2;
Jerome Forissiere3854162016-08-12 12:40:12 +02001528
1529 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1530 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1531 return;
1532
1533 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1534 xtest_teec_open_session(&sess2, &storage2_ta_uuid, NULL,
1535 &orig)))
1536 goto exit2;
1537
1538 /* TA #1 creates a persistent object */
1539 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1540 fs_create(&sess, file_01, sizeof(file_01),
1541 TEE_DATA_FLAG_ACCESS_WRITE |
1542 TEE_DATA_FLAG_ACCESS_READ |
1543 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
1544 sizeof(data_00), &obj, storage_id)))
1545 goto exit;
1546
1547 /* TA #2 tries to open the object created by TA #1 */
1548 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1549 fs_open(&sess2, file_01, sizeof(file_01),
1550 TEE_DATA_FLAG_ACCESS_READ, &obj2, storage_id)))
1551 goto clean;
1552
Jerome Forissiere3854162016-08-12 12:40:12 +02001553clean:
1554 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1555exit:
1556 TEEC_CloseSession(&sess2);
1557exit2:
1558 TEEC_CloseSession(&sess);
1559}
1560
1561DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6015)
1562
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001563
1564struct test_6016_thread_arg {
1565 ADBG_Case_t *case_t;
1566 uint32_t storage_id;
Jerome Forissier54cfbef2016-08-31 18:34:31 +02001567 char file_name[8];
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001568 TEEC_Session session;
1569};
1570
1571static void *test_6016_thread(void *arg)
1572{
1573 struct test_6016_thread_arg *a = arg;
1574 TEEC_Session sess = a->session;
1575 uint32_t obj;
1576 uint8_t out[10] = { 0 };
1577 uint32_t count;
1578
1579 /* create */
1580 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1581 fs_create(&sess, a->file_name, sizeof(a->file_name),
1582 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
1583 sizeof(data_01), &obj, a->storage_id)))
1584 goto exit;
1585
1586 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1587 goto exit;
1588
1589 /* write new data */
1590 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1591 fs_open(&sess, a->file_name, sizeof(a->file_name),
1592 TEE_DATA_FLAG_ACCESS_WRITE, &obj, a->storage_id)))
1593 goto exit;
1594
1595 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1596 fs_write(&sess, obj, data_00, sizeof(data_00))))
1597 goto exit;
1598
1599 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1600 goto exit;
1601
1602 /* verify */
1603 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1604 fs_open(&sess, a->file_name, sizeof(a->file_name),
1605 TEE_DATA_FLAG_ACCESS_READ |
1606 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, a->storage_id)))
1607 goto exit;
1608
1609 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1610 fs_read(&sess, obj, out, 10, &count)))
1611 goto exit;
1612
1613 (void)ADBG_EXPECT_BUFFER(a->case_t, data_00, 10, out, count);
1614
1615 /* clean */
1616 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_unlink(&sess, obj)))
1617 goto exit;
1618
1619exit:
1620 return NULL;
1621}
1622
1623
1624#define NUM_THREADS 4
1625static void xtest_tee_test_6016_loop(ADBG_Case_t *c, uint32_t storage_id)
1626{
1627 size_t num_threads = NUM_THREADS;
1628 struct test_6016_thread_arg arg[num_threads];
1629 pthread_t thr[num_threads];
1630 uint32_t orig;
1631 size_t i;
1632 size_t n = 0;
1633 size_t m;
1634
1635 memset(arg, 0, sizeof(arg));
1636
1637 for (m = 0; m < num_threads; m++)
1638 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1639 xtest_teec_open_session(&arg[m].session,
1640 &storage_ta_uuid, NULL, &orig)))
1641 goto out;
1642
1643 for (n = 0; n < num_threads; n++) {
1644 arg[n].case_t = c;
1645 arg[n].storage_id = storage_id;
Jerome Forissiercb10f832016-09-01 14:53:05 +02001646 snprintf(arg[n].file_name, sizeof(arg[n].file_name),
Jens Wiklander2b1c11d2016-09-16 14:58:41 +02001647 "file_%zu", n);
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001648 if (!ADBG_EXPECT(c, 0, pthread_create(thr + n, NULL,
1649 test_6016_thread, arg + n)))
1650 goto out;
1651 }
1652
1653out:
1654 for (i = 0; i < n; i++)
1655 ADBG_EXPECT(c, 0, pthread_join(thr[i], NULL));
1656 for (i = 0; i < m; i++)
1657 TEEC_CloseSession(&arg[i].session);
1658}
1659
1660/* concurency */
1661static void xtest_tee_test_6016_single(ADBG_Case_t *c, uint32_t storage_id)
1662{
1663 int i;
1664 int loops = 8;
1665
1666 Do_ADBG_Log(" threads: %d, loops: %d", NUM_THREADS, loops);
1667 for (i = 0; i < loops; i++)
1668 xtest_tee_test_6016_loop(c, storage_id);
1669}
1670
Jerome Forissierefd71d32016-09-13 15:09:33 +02001671DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6016)
Jerome Forissier327672c2016-09-01 18:34:11 +02001672
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001673static void xtest_tee_test_6017_single(ADBG_Case_t *c, uint32_t storage_id)
1674{
1675 TEEC_Session sess;
1676 TEE_ObjectInfo obj_info1;
1677 TEE_ObjectInfo obj_info2;
1678 uint32_t obj;
1679 uint32_t orig;
1680
1681 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1682 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1683 return;
1684
1685 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1686 fs_create(&sess, file_01, sizeof(file_01),
1687 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1688 0, &obj, storage_id)))
1689 goto exit;
1690
1691 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1692 fs_write(&sess, obj, data_00, sizeof(data_00))))
1693 goto exit;
1694
1695 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1696 fs_get_obj_info(&sess, obj, &obj_info1,
1697 sizeof(TEE_ObjectInfo))))
1698 goto exit;
1699
1700 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1701 goto exit;
1702
1703 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1704 fs_open(&sess, file_01, sizeof(file_01),
1705 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1706 goto exit;
1707
1708 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1709 fs_get_obj_info(&sess, obj, &obj_info2,
1710 sizeof(TEE_ObjectInfo))))
1711 goto exit;
1712
1713 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1714 obj_info1.dataSize, ==, obj_info2.dataSize))
1715 goto exit;
1716
1717 /* clean */
1718 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1719 goto exit;
1720
1721exit:
1722 TEEC_CloseSession(&sess);
1723}
1724
1725DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6017)
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001726
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001727static void xtest_tee_test_6018_single(ADBG_Case_t *c, uint32_t storage_id)
1728{
1729 TEEC_Session sess;
1730 TEE_ObjectInfo obj_info1;
1731 TEE_ObjectInfo obj_info2;
1732 uint32_t obj;
1733 uint32_t orig;
1734 uint8_t block[32 * 1024];
1735 size_t num_blocks;
1736 size_t block_size;
1737 size_t n;
1738
1739 if (storage_is(storage_id, TEE_STORAGE_PRIVATE_RPMB)) {
1740 /* RPMB FS is a bit resource constrained */
Jens Wiklander20949ea2017-05-17 17:47:58 +02001741 num_blocks = 10;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001742 block_size = 1024;
1743 } else {
Jens Wiklander5f86daa2017-05-30 16:37:19 +02001744 num_blocks = 20;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001745 block_size = sizeof(block);
1746 }
1747
1748 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1749 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1750 return;
1751
1752 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1753 fs_create(&sess, file_01, sizeof(file_01),
1754 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1755 0, &obj, storage_id)))
1756 goto exit;
1757
1758 for (n = 0; n < num_blocks; n++) {
1759 memset(block, n, block_size);
1760
1761 Do_ADBG_Log("writing %zu", n);
1762 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1763 fs_write(&sess, obj, block, block_size)))
1764 goto exit;
1765 }
1766
1767 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1768 fs_get_obj_info(&sess, obj, &obj_info1,
1769 sizeof(TEE_ObjectInfo))))
1770 goto exit;
1771
1772 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1773 obj_info1.dataSize, ==, block_size * num_blocks))
1774 goto exit;
1775
1776 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1777 goto exit;
1778
1779 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1780 fs_open(&sess, file_01, sizeof(file_01),
1781 TEE_DATA_FLAG_ACCESS_READ |
1782 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1783 goto exit;
1784
1785 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1786 fs_get_obj_info(&sess, obj, &obj_info2,
1787 sizeof(TEE_ObjectInfo))))
1788 goto exit;
1789
1790 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1791 obj_info1.dataSize, ==, obj_info2.dataSize))
1792 goto exit;
1793
1794 for (n = 0; n < num_blocks; n++) {
1795 uint8_t br[block_size];
1796 uint32_t count;
1797
1798 memset(block, n, block_size);
1799
1800 Do_ADBG_Log("reading %zu", n);
1801 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1802 fs_read(&sess, obj, br, sizeof(br), &count)))
1803 goto exit;
1804 if (!ADBG_EXPECT_BUFFER(c, block, block_size, br, count))
1805 goto exit;
1806 }
1807
1808 /* clean */
1809 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1810 goto exit;
1811
1812exit:
1813 TEEC_CloseSession(&sess);
1814}
1815
1816DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6018)
1817
Jens Wiklander74abfe32017-01-03 14:17:47 +01001818ADBG_CASE_DEFINE(regression, 6001, xtest_tee_test_6001,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001819 "Test TEE_CreatePersistentObject");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001820ADBG_CASE_DEFINE(regression, 6002, xtest_tee_test_6002,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001821 "Test TEE_OpenPersistentObject");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001822ADBG_CASE_DEFINE(regression, 6003, xtest_tee_test_6003,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001823 "Test TEE_ReadObjectData");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001824ADBG_CASE_DEFINE(regression, 6004, xtest_tee_test_6004,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001825 "Test TEE_WriteObjectData");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001826ADBG_CASE_DEFINE(regression, 6005, xtest_tee_test_6005,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001827 "Test TEE_SeekObjectData");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001828ADBG_CASE_DEFINE(regression, 6006, xtest_tee_test_6006,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001829 "Test TEE_CloseAndDeletePersistentObject");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001830ADBG_CASE_DEFINE(regression, 6007, xtest_tee_test_6007,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001831 "Test TEE_TruncateObjectData");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001832ADBG_CASE_DEFINE(regression, 6008, xtest_tee_test_6008,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001833 "Test TEE_RenamePersistentObject");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001834ADBG_CASE_DEFINE(regression, 6009, xtest_tee_test_6009,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001835 "Test TEE Internal API Persistent Object Enumeration Functions");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001836ADBG_CASE_DEFINE(regression, 6010, xtest_tee_test_6010, "Test Storage");
Pascal Brand8a74e362015-09-10 12:41:52 +02001837
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001838#ifdef WITH_GP_TESTS
Jens Wiklander74abfe32017-01-03 14:17:47 +01001839ADBG_CASE_DEFINE(regression, 6011, xtest_tee_test_6011,
1840 "Test TEE GP TTA DS init objects");
Pascal Brand8a74e362015-09-10 12:41:52 +02001841#endif
Pascal Brandeb84c442016-04-19 17:49:49 +02001842
Jens Wiklander74abfe32017-01-03 14:17:47 +01001843ADBG_CASE_DEFINE(regression, 6012, xtest_tee_test_6012,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001844 "Test TEE GP TTA DS init objects");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001845ADBG_CASE_DEFINE(regression, 6013, xtest_tee_test_6013,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001846 "Key usage in Persistent objects");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001847ADBG_CASE_DEFINE(regression, 6014, xtest_tee_test_6014,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001848 "Loop on Persistent objects");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001849ADBG_CASE_DEFINE(regression, 6015, xtest_tee_test_6015, "Storage isolation");
1850ADBG_CASE_DEFINE(regression, 6016, xtest_tee_test_6016, "Storage concurency");
1851ADBG_CASE_DEFINE(regression, 6017, xtest_tee_test_6017,
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001852 "Test Persistent objects info");
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001853ADBG_CASE_DEFINE(regression, 6018, xtest_tee_test_6018, "Large object");