blob: ddbfb428f72dddbdc09226dd2614657a54c43fca [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
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100485 /* close */
486 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
487 goto exit;
488
489 /* open */
490 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
491 TEE_DATA_FLAG_ACCESS_WRITE |
492 TEE_DATA_FLAG_ACCESS_READ |
493 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
494 goto exit;
495
496 /* seek */
497 if (!ADBG_EXPECT_TEEC_SUCCESS(
498 c, fs_seek(&sess, obj, 5, TEE_DATA_SEEK_SET)))
499 goto exit;
500
501 /* verify */
502 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
503 goto exit;
504
505 /* check buffer */
506 (void)ADBG_EXPECT_BUFFER(c, &data_00[5], 5, out, count);
507
James Kung98c0ba12015-09-09 15:51:59 +0800508 /* clean */
509 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
510 goto exit;
511
512exit:
513 TEEC_CloseSession(&sess);
514}
515
516/* extend */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200517static void test_extend_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800518{
519 TEEC_Session sess;
520 uint32_t obj;
521 uint8_t out[10] = { 0 };
522 uint8_t expect[10] = { 0 };
523 uint32_t count;
524 uint32_t orig;
525
526 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
527 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
528 return;
529
530 /* create */
531 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
532 fs_create(&sess, file_01, sizeof(file_01),
533 TEE_DATA_FLAG_ACCESS_WRITE |
534 TEE_DATA_FLAG_ACCESS_READ |
535 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200536 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800537 goto exit;
538
539 /* extend */
540 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 40)))
541 goto exit;
542
543 /* seek */
544 if (!ADBG_EXPECT_TEEC_SUCCESS(
545 c, fs_seek(&sess, obj, 30, TEE_DATA_SEEK_SET)))
546 goto exit;
547
548 /* verify */
549 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
550 goto exit;
551
552 /* check buffer */
553 expect[0] = data_00[30];
554 expect[1] = data_00[31];
555 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
556
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100557 /* close */
558 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
559 goto exit;
560
561 /* open */
562 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
563 TEE_DATA_FLAG_ACCESS_WRITE |
564 TEE_DATA_FLAG_ACCESS_READ |
565 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
566 goto exit;
567
568 /* seek */
569 if (!ADBG_EXPECT_TEEC_SUCCESS(
570 c, fs_seek(&sess, obj, 30, TEE_DATA_SEEK_SET)))
571 goto exit;
572
573 /* verify */
574 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
575 goto exit;
576
577 /* check buffer */
578 expect[0] = data_00[30];
579 expect[1] = data_00[31];
580 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
581
James Kung98c0ba12015-09-09 15:51:59 +0800582 /* clean */
583 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
584 goto exit;
585
586exit:
587 TEEC_CloseSession(&sess);
588}
589
590/* file hole */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200591static void test_file_hole(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800592{
593 TEEC_Session sess;
594 uint32_t obj;
595 uint8_t out[10] = { 0 };
596 uint8_t expect[10] = { 0 };
597 uint32_t count;
598 uint32_t orig;
599
600 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
601 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
602 return;
603
604 /* create */
605 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
606 fs_create(&sess, file_01, sizeof(file_01),
607 TEE_DATA_FLAG_ACCESS_WRITE |
608 TEE_DATA_FLAG_ACCESS_READ |
609 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200610 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800611 goto exit;
612
613 /* seek */
614 if (!ADBG_EXPECT_TEEC_SUCCESS(
615 c, fs_seek(&sess, obj, 80, TEE_DATA_SEEK_SET)))
616 goto exit;
617
618 /* write */
619 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_write(&sess, obj, data_00,
620 sizeof(data_00))))
621 goto exit;
622
623 /* seek */
624 if (!ADBG_EXPECT_TEEC_SUCCESS(
625 c, fs_seek(&sess, obj, 74, TEE_DATA_SEEK_SET)))
626 goto exit;
627
628 /* verify */
629 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
630 goto exit;
631
632 /* check buffer */
633 expect[6] = data_00[0];
634 expect[7] = data_00[1];
635 expect[8] = data_00[2];
636 expect[9] = data_00[3];
637 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
638
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100639 /* close */
640 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
641 goto exit;
642
643 /* open */
644 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
645 TEE_DATA_FLAG_ACCESS_WRITE |
646 TEE_DATA_FLAG_ACCESS_READ |
647 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
648 goto exit;
649
650 /* seek */
651 if (!ADBG_EXPECT_TEEC_SUCCESS(
652 c, fs_seek(&sess, obj, 74, TEE_DATA_SEEK_SET)))
653 goto exit;
654
655 /* verify */
656 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
657 goto exit;
658
659 /* check buffer */
660 expect[6] = data_00[0];
661 expect[7] = data_00[1];
662 expect[8] = data_00[2];
663 expect[9] = data_00[3];
664 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
665
James Kung98c0ba12015-09-09 15:51:59 +0800666 /* clean */
667 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
668 goto exit;
669
670exit:
671 TEEC_CloseSession(&sess);
672}
673
Jerome Forissiere3688342015-09-24 10:45:17 -0700674#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +0200675static TEEC_Result ds_seek_obj_inv_handle(TEEC_Session *sess)
676{
677 TEEC_Operation op;
678 uint32_t org;
679
680 op.paramTypes = TEEC_PARAM_TYPES(
681 TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
682
683 op.params[0].value.a = CASE_DATA_OBJECT_NOT_PERSISTENT;
684
685 return TEEC_InvokeCommand(
686 sess, CMD_SeekObjectData_panic, &op, &org);
687}
688
Pascal Brand8a74e362015-09-10 12:41:52 +0200689static TEEC_Result ds_seek_gp(
690 TEEC_Session *sess, TEE_Whence wh, uint32_t wh_off, uint32_t set_off,
691 void *in, size_t in_size, void *out, size_t out_size)
692{
693 TEEC_Operation op;
694 uint32_t org;
695
696 op.paramTypes = TEEC_PARAM_TYPES(
697 TEEC_VALUE_INPUT, TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT,
698 TEEC_MEMREF_TEMP_OUTPUT);
699
700 op.params[0].value.a = wh;
701 op.params[0].value.b = wh_off;
702 op.params[1].value.a = set_off;
703 op.params[2].tmpref.buffer = in;
704 op.params[2].tmpref.size = in_size;
705 op.params[3].tmpref.buffer = out;
706 op.params[3].tmpref.size = out_size;
707
708 return TEEC_InvokeCommand(sess, CMD_SeekWriteReadObjectData, &op, &org);
709}
710
711static TEEC_Result ds_init_object_and_attributes(TEEC_Session *sess,
712 uint32_t obj_type, uint32_t obj_size, const void *attr_meta,
713 size_t attr_meta_len, const void *attr_data, size_t attr_data_len,
714 uint32_t option)
715{
716 TEEC_Operation op;
717 uint32_t org;
718
719 op.paramTypes = TEEC_PARAM_TYPES(
720 TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT,
721 TEEC_MEMREF_TEMP_INPUT, TEEC_VALUE_INPUT);
722
723 op.params[0].value.a = obj_type;
724 op.params[0].value.b = obj_size;
725 op.params[1].tmpref.buffer = (void *)attr_meta;
726 op.params[1].tmpref.size = attr_meta_len;
727 op.params[2].tmpref.buffer = (void *)attr_data;
728 op.params[2].tmpref.size = attr_data_len;
729 op.params[3].value.a = option;
730
731 return TEEC_InvokeCommand(sess, CMD_InitObjectAndAttributes, &op, &org);
732}
733
734static TEEC_Result ds_rename_access_conflict(TEEC_Session *sess)
735{
736 TEEC_Operation op;
737 uint32_t org;
738
739 op.paramTypes = TEEC_PARAM_TYPES(
740 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
741
742 return TEEC_InvokeCommand(
743 sess, CMD_RenamePersistentObject_AccessConflict, &op, &org);
744}
745
746static TEEC_Result ds_start_enum_no_item(TEEC_Session *sess)
747{
748 TEEC_Operation op;
749 uint32_t org;
750 TEEC_Result res;
751
752 op.paramTypes = TEEC_PARAM_TYPES(
753 TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
754
755 res = TEEC_InvokeCommand(
756 sess, CMD_StartNGetPersistentObjectEnumerator_itemNotFound, &op, &org);
757
758 if (res != TEEC_SUCCESS)
759 return res;
760
761 if (op.params[0].value.a != 0 || op.params[0].value.b != 0)
762 return TEEC_ERROR_GENERIC;
763
764 return res;
765}
766
767static TEEC_Result ds_rename_success(TEEC_Session *sess)
768{
769 TEEC_Operation op;
770 uint32_t org;
771
772 op.paramTypes = TEEC_PARAM_TYPES(
773 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
774
775 return TEEC_InvokeCommand(
776 sess, CMD_RenamePersistentObject_Success, &op, &org);
777}
778
779static TEEC_Result ds_null_close_free_reset(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_CloseFreeAndResetObjectSuccessHandleNull, &op, &org);
789}
790#endif
791
Pascal Brandc639ac82015-07-02 08:53:34 +0200792/* create */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200793static void xtest_tee_test_6001_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200794{
795 TEEC_Session sess;
796 uint32_t obj;
797 uint32_t orig;
798
799 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
800 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
801 return;
802
803 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
804 fs_create(&sess, file_00, sizeof(file_00),
805 TEE_DATA_FLAG_ACCESS_WRITE |
806 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200807 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200808 goto exit;
809
810 /* clean */
811 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
812 goto exit;
813
814exit:
815 TEEC_CloseSession(&sess);
816}
817
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200818#define DEFINE_TEST_MULTIPLE_STORAGE_IDS(test_name) \
819static void test_name(ADBG_Case_t *c) \
820{ \
821 size_t i; \
822 \
823 for (i = 0; i < ARRAY_SIZE(storage_ids); i++) { \
824 Do_ADBG_BeginSubCase(c, "Storage id: %08x", storage_ids[i]); \
825 test_name##_single(c, storage_ids[i]); \
826 Do_ADBG_EndSubCase(c, "Storage id: %08x", storage_ids[i]); \
827 } \
828}
829
830DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6001)
831
Pascal Brandc639ac82015-07-02 08:53:34 +0200832/* open */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200833static void xtest_tee_test_6002_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200834{
835 TEEC_Session sess;
836 uint32_t obj;
837 uint32_t orig;
838
839 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
840 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
841 return;
842
843 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
844 fs_create(&sess, file_01, sizeof(file_01),
845 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200846 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200847 goto exit;
848
849 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
850 goto exit;
851
852 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
853 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200854 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200855 goto exit;
856
857 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
858 goto exit;
859
860 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
861 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200862 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200863 goto exit;
864
865 /* clean */
866 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
867 goto exit;
868
869exit:
870 TEEC_CloseSession(&sess);
871}
872
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200873DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6002)
874
Pascal Brandc639ac82015-07-02 08:53:34 +0200875/* read */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200876static void xtest_tee_test_6003_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200877{
878 TEEC_Session sess;
879 uint32_t obj;
880 uint8_t out[10] = { 0 };
881 uint32_t count;
882 uint32_t orig;
883
884 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
885 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
886 return;
887
888 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
889 fs_create(&sess, file_02, sizeof(file_02),
890 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200891 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200892 goto exit;
893
894 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
895 goto exit;
896
897 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
898 fs_open(&sess, file_02, sizeof(file_02),
899 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200900 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200901 goto exit;
902
903 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
904 goto exit;
905
906 (void)ADBG_EXPECT_BUFFER(c, data_01, 10, out, count);
907
908 /* clean */
909 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
910 goto exit;
911
912exit:
913 TEEC_CloseSession(&sess);
914}
915
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200916DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6003)
917
Pascal Brandc639ac82015-07-02 08:53:34 +0200918/* write */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200919static void xtest_tee_test_6004_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200920{
921 TEEC_Session sess;
922 uint32_t obj;
923 uint8_t out[10] = { 0 };
924 uint32_t count;
925 uint32_t orig;
926
927 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
928 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
929 return;
930
931 /* create */
932 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
933 fs_create(&sess, file_02, sizeof(file_02),
934 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200935 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200936 goto exit;
937
938 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
939 goto exit;
940
941 /* write new data */
942 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
943 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200944 TEE_DATA_FLAG_ACCESS_WRITE, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200945 goto exit;
946
947 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
948 fs_write(&sess, obj, data_00, sizeof(data_00))))
949 goto exit;
950
951 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
952 goto exit;
953
954 /* verify */
955 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
956 fs_open(&sess, file_02, sizeof(file_02),
957 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200958 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200959 goto exit;
960
961 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
962 goto exit;
963
964 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
965
966 /* clean */
967 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
968 goto exit;
969
970exit:
971 TEEC_CloseSession(&sess);
972}
973
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200974DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6004)
975
Pascal Brandc639ac82015-07-02 08:53:34 +0200976/* seek */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200977static void xtest_tee_test_6005_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200978{
979 TEEC_Session sess;
980 uint32_t obj;
981 uint8_t out[10] = { 0 };
982 uint32_t count;
983 uint32_t orig;
984
985 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
986 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
987 return;
988
989 /* create */
990 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
991 fs_create(&sess, file_01, sizeof(file_01),
992 TEE_DATA_FLAG_ACCESS_WRITE |
993 TEE_DATA_FLAG_ACCESS_READ |
994 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200995 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200996 goto exit;
997
998 /* seek */
999 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1000 fs_seek(&sess, obj, 10, TEE_DATA_SEEK_SET)))
1001 goto exit;
1002
1003 /* verify */
1004 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1005 goto exit;
1006
1007 (void)ADBG_EXPECT_BUFFER(c, &data_00[10], 10, out, count);
1008
1009 /* clean */
1010 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1011 goto exit;
1012
1013exit:
1014 TEEC_CloseSession(&sess);
1015}
1016
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001017DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6005)
1018
Pascal Brandc639ac82015-07-02 08:53:34 +02001019/* unlink */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001020static void xtest_tee_test_6006_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001021{
1022 TEEC_Session sess;
1023 uint32_t obj;
1024 uint32_t orig;
1025
1026 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1027 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1028 return;
1029
1030 /* create */
1031 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1032 fs_create(&sess, file_01, sizeof(file_01),
1033 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001034 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001035 goto exit;
1036
1037 /* del & close */
1038 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1039 goto exit;
1040
1041 /* check result */
1042 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1043 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001044 TEE_DATA_FLAG_ACCESS_READ, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001045 goto exit;
1046
1047exit:
1048 TEEC_CloseSession(&sess);
1049}
1050
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001051DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6006)
1052
1053static void xtest_tee_test_6007_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001054{
James Kung98c0ba12015-09-09 15:51:59 +08001055 Do_ADBG_BeginSubCase(c, "Test truncate file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001056 test_truncate_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +08001057 Do_ADBG_EndSubCase(c, "Test truncate file length");
Pascal Brandc639ac82015-07-02 08:53:34 +02001058
James Kung98c0ba12015-09-09 15:51:59 +08001059 Do_ADBG_BeginSubCase(c, "Test extend file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001060 test_extend_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +08001061 Do_ADBG_EndSubCase(c, "Test extend file length");
Pascal Brandc639ac82015-07-02 08:53:34 +02001062
James Kung98c0ba12015-09-09 15:51:59 +08001063 Do_ADBG_BeginSubCase(c, "Test file hole");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001064 test_file_hole(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +08001065 Do_ADBG_EndSubCase(c, "Test file hole");
Pascal Brandc639ac82015-07-02 08:53:34 +02001066}
1067
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001068DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6007)
1069
1070static void xtest_tee_test_6008_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001071{
1072 TEEC_Session sess;
1073 uint32_t obj;
1074 uint8_t out[10] = { 0 };
1075 uint32_t count;
1076 uint32_t orig;
1077
1078 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1079 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1080 return;
1081
1082 /* create */
1083 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1084 fs_create(&sess, file_02, sizeof(file_02),
1085 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001086 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001087 goto exit;
1088
1089 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1090 goto exit;
1091
1092 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1093 fs_open(&sess, file_02, sizeof(file_02),
1094 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001095 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001096 goto exit;
1097
1098 /* write new data */
1099 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1100 fs_write(&sess, obj, data_00, sizeof(data_00))))
1101 goto exit;
1102
1103 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1104 fs_rename(&sess, obj, file_03, sizeof(file_03))))
1105 goto exit;
1106
1107 /* close */
1108 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1109 goto exit;
1110
1111 /* verify */
1112 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1113 fs_open(&sess, file_03, sizeof(file_03),
1114 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001115 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001116 goto exit;
1117
1118 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1119 goto exit;
1120
1121 /* check buffer */
1122 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
1123
1124 /* clean */
1125 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1126 goto exit;
1127
1128exit:
1129 TEEC_CloseSession(&sess);
1130}
1131
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001132DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6008)
1133
1134static void xtest_tee_test_6009_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001135{
1136 TEEC_Session sess;
1137 uint32_t obj0;
1138 uint32_t obj1;
1139 uint32_t obj2;
1140 uint32_t e = 0;
1141 uint8_t info[200];
1142 uint8_t id[200];
1143 uint32_t orig;
1144
1145 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1146 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1147 return;
1148
1149 /* create file 00 */
1150 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1151 fs_create(&sess, file_00, sizeof(file_00),
1152 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001153 sizeof(data_01), &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001154 goto exit;
1155
1156 /* create file 01 */
1157 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1158 fs_create(&sess, file_01, sizeof(file_01),
1159 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001160 sizeof(data_01), &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001161 goto exit;
1162
1163 /* create file 02 */
1164 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1165 fs_create(&sess, file_02, sizeof(file_02),
1166 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001167 sizeof(data_01), &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001168 goto exit;
1169
1170 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj0)))
1171 goto exit;
1172
1173 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj1)))
1174 goto exit;
1175
1176 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj2)))
1177 goto exit;
1178
1179 /* iterate */
1180 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e)))
1181 goto exit;
1182
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001183 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_start_enum(&sess, e, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001184 goto exit;
1185
1186 /* get 00 */
1187 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1188 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1189 goto exit;
1190
1191 /* get 01 */
1192 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc603e0d2016-04-25 12:37:18 +02001193 fs_next_enum(&sess, e, NULL, 0, id, sizeof(id))))
Pascal Brandc639ac82015-07-02 08:53:34 +02001194 goto exit;
1195
1196 /* get 02 */
1197 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1198 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1199 goto exit;
1200
1201 /* we should not have more files */
1202 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1203 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1204 goto exit;
1205
1206 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e)))
1207 goto exit;
1208
1209 /* clean */
1210 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1211 fs_open(&sess, file_00, sizeof(file_00),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001212 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001213 goto exit;
1214
1215 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj0)))
1216 goto exit;
1217
1218 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1219 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001220 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001221 goto exit;
1222
1223 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj1)))
1224 goto exit;
1225
1226 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1227 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001228 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001229 goto exit;
1230
1231 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj2)))
1232 goto exit;
1233
1234exit:
1235 TEEC_CloseSession(&sess);
1236}
1237
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001238DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6009)
1239
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001240static void xtest_tee_test_6010_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand8a74e362015-09-10 12:41:52 +02001241{
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001242 TEEC_Session sess;
1243 uint32_t orig;
1244 uint32_t o1;
1245 uint32_t o2;
1246 uint32_t e;
1247 uint32_t f;
1248 uint8_t data[1024];
1249 uint8_t out[1024];
1250 uint32_t n;
Pascal Brand30844922015-09-17 12:12:42 +02001251
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001252 for (n = 0; n < ARRAY_SIZE(data); n++)
1253 data[n] = n;
Pascal Brand8a74e362015-09-10 12:41:52 +02001254
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001255 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1256 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1257 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001258
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001259 Do_ADBG_BeginSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001260
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001261 o1 = TEE_HANDLE_NULL;
1262 o2 = TEE_HANDLE_NULL;
1263 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1264 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1265 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
Pascal Brand8a74e362015-09-10 12:41:52 +02001266
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001267 ADBG_EXPECT_TEEC_SUCCESS(c,
1268 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1269 sizeof(data), &o1, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001270
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001271 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE;
1272 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ACCESS_CONFLICT,
1273 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1274 sizeof(data), &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001275
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001276 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1277 if (o2)
1278 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
Pascal Brand8a74e362015-09-10 12:41:52 +02001279
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001280 Do_ADBG_EndSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001281
Pascal Brand8a74e362015-09-10 12:41:52 +02001282
Pascal Brand8a74e362015-09-10 12:41:52 +02001283
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001284 Do_ADBG_BeginSubCase(c, "RestrictObjectUsage Panic");
1285 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1286 fs_restrict_usage(&sess, 0xffffbad0, 0xffffffff));
1287 Do_ADBG_EndSubCase(c, "RestrictObjectUsage Panic");
Pascal Brand8a74e362015-09-10 12:41:52 +02001288
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001289 TEEC_CloseSession(&sess);
1290 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1291 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1292 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001293
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001294 Do_ADBG_BeginSubCase(c, "SeekObjectData BadHandle");
1295 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1296 fs_seek(&sess, 0xffffbad0, 5, TEE_DATA_SEEK_SET));
1297 Do_ADBG_EndSubCase(c, "SeekObjectData BadHandle");
Pascal Brand8a74e362015-09-10 12:41:52 +02001298
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001299 TEEC_CloseSession(&sess);
1300 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1301 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1302 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001303
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001304 Do_ADBG_BeginSubCase(c, "SeekObjectData NotPersist");
1305 o1 = 0;
1306 ADBG_EXPECT_TEEC_SUCCESS(c,
1307 fs_alloc_obj(&sess, TEE_TYPE_AES, 256, &o1));
1308 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1309 fs_seek(&sess, o1, 5, TEE_DATA_SEEK_SET));
1310 Do_ADBG_EndSubCase(c, "SeekObjectData NotPersist");
Pascal Brand8a74e362015-09-10 12:41:52 +02001311
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001312 TEEC_CloseSession(&sess);
1313 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1314 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1315 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001316
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001317 Do_ADBG_BeginSubCase(c, "SeekWriteRead");
1318 o1 = 0;
1319 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1320 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1321 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1322 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1323 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1324 sizeof(data), &o1, storage_id)))
1325 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001326
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001327 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1328 fs_seek(&sess, o1, 2, TEE_DATA_SEEK_SET)))
1329 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001330
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001331 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1332 fs_seek(&sess, o1, 0, TEE_DATA_SEEK_END)))
1333 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001334
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001335 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1336 fs_write(&sess, o1, data, sizeof(data))))
1337 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001338
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001339 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1340 fs_seek(&sess, o1, sizeof(data), TEE_DATA_SEEK_SET)))
1341 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001342
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001343 memset(out, 0xab, sizeof(out));
1344 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1345 fs_read(&sess, o1, out, sizeof(out), &n)))
1346 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001347
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001348 ADBG_EXPECT_BUFFER(c, data, sizeof(data), out, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001349
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001350 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander3a6892e2016-09-14 15:53:52 +02001351 fs_seek(&sess, o1, 10, TEE_DATA_SEEK_END)))
1352 goto seek_write_read_out;
1353
1354 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1355 fs_read(&sess, o1, out, sizeof(out), &n)))
1356 goto seek_write_read_out;
1357 ADBG_EXPECT_COMPARE_UNSIGNED(c, n, ==, 0);
1358
1359 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001360 fs_seek(&sess, o1, -(int32_t)sizeof(data) / 2,
1361 TEE_DATA_SEEK_END)))
1362 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001363
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001364 memset(out, 0xab, sizeof(out) / 2);
1365 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1366 fs_read(&sess, o1, out, sizeof(out) / 2, &n)))
1367 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001368
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001369 ADBG_EXPECT_BUFFER(c,
1370 data + sizeof(data) / 2, sizeof(data) / 2,
1371 out + sizeof(data) / 2, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001372
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001373seek_write_read_out:
1374 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1375 Do_ADBG_EndSubCase(c, "SeekWriteRead");
Pascal Brand8a74e362015-09-10 12:41:52 +02001376
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001377 Do_ADBG_BeginSubCase(c, "Rename Access Conflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001378
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001379 o1 = TEE_HANDLE_NULL;
1380 o2 = TEE_HANDLE_NULL;
1381 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1382 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1383 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1384 ADBG_EXPECT_TEEC_SUCCESS(c,
1385 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1386 sizeof(data), &o1, storage_id));
1387 ADBG_EXPECT_TEEC_SUCCESS(c,
1388 fs_create(&sess, file_01, sizeof(file_01), f, 0, data,
1389 sizeof(data) / 2, &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001390
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001391 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ACCESS_CONFLICT,
1392 fs_rename(&sess, o2, file_00, sizeof(file_00)));
Pascal Brand8a74e362015-09-10 12:41:52 +02001393
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001394 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1395 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
1396
1397 Do_ADBG_EndSubCase(c, "Rename Access Conflict");
1398
Jerome Forissier5d969d82017-03-21 10:01:04 +01001399 Do_ADBG_BeginSubCase(c, "AllocPersistentObjectEnumerator + "
1400 "ResetPersistentObjectEnumerator");
1401 e = TEE_HANDLE_NULL;
1402 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1403 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_enum(&sess, e));
1404 Do_ADBG_EndSubCase(c, "AllocPersistentObjectEnumerator + "
1405 "ResetPersistentObjectEnumerator");
1406
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001407 Do_ADBG_BeginSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1408 e = TEE_HANDLE_NULL;
1409 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1410 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1411 fs_next_enum(&sess, e, NULL, 0, out, sizeof(out)));
1412 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1413 fs_start_enum(&sess, e, storage_id));
1414 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e));
1415 Do_ADBG_EndSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1416
1417 Do_ADBG_BeginSubCase(c, "RenamePersistent ReadWrite");
1418 o1 = TEE_HANDLE_NULL;
1419 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1420 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1421 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1422 ADBG_EXPECT_TEEC_SUCCESS(c,
1423 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1424 sizeof(data), &o1, storage_id));
1425 ADBG_EXPECT_TEEC_SUCCESS(c,
1426 fs_rename(&sess, o1, file_01, sizeof(file_01)));
1427 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1428 Do_ADBG_EndSubCase(c, "RenamePersistent ReadWrite");
1429
1430 Do_ADBG_BeginSubCase(c, "Close Free Reset Null");
1431 ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, TEE_HANDLE_NULL));
1432 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_obj(&sess, TEE_HANDLE_NULL));
1433 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_obj(&sess, TEE_HANDLE_NULL));
1434 Do_ADBG_EndSubCase(c, "Close Free Reset Null");
1435
1436 TEEC_CloseSession(&sess);
Pascal Brand8a74e362015-09-10 12:41:52 +02001437}
1438
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001439DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6010)
1440
1441#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +02001442static void xtest_tee_test_6011(ADBG_Case_t *c)
1443{
1444 TEEC_Session sess;
1445 uint32_t orig;
1446 /*
1447 * Test data from
1448 * Invoke_InitObjectAndAttributes_TEE_TYPE_AES_success_attribute_
1449 * TEE_ATTR_SECRET_VALUE_correct_size (9d-9a-91)
1450 */
1451 static const uint8_t attr_meta[] = {
14520xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
14530x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
14540x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
14550x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
1456 };
1457 static const uint8_t attr_data[] = {
14580x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,
14590x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,
14600xdf,0xf4,
1461 };
1462
1463 if (!ADBG_EXPECT_TEEC_SUCCESS(
1464 c, xtest_teec_open_session(
1465 &sess, &gp_tta_ds_uuid, NULL, &orig)))
1466 return;
1467
1468 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ds_init_object_and_attributes(&sess,
1469 0xa0000010, 0x100, attr_meta, sizeof(attr_meta), attr_data,
1470 sizeof(attr_data), 0)))
1471 goto exit;
1472
1473exit:
1474 TEEC_CloseSession(&sess);
1475}
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001476#endif /*WITH_GP_TESTS*/
Pascal Brand8a74e362015-09-10 12:41:52 +02001477
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001478static void xtest_tee_test_6012_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +02001479{
1480 TEEC_Session sess;
1481 uint32_t orig;
1482 uint32_t obj;
1483
Etienne Carrierea54952b2017-10-27 15:58:01 +02001484 /*
1485 * create the object a first time (forced through with overwrite attribute)
1486 */
Pascal Brandeb84c442016-04-19 17:49:49 +02001487 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1488 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1489 return;
1490
1491 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001492 fs_create_overwrite(&sess, file_04, sizeof(file_04), storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001493 goto bail1;
Pascal Brandeb84c442016-04-19 17:49:49 +02001494
1495 TEEC_CloseSession(&sess);
1496
Etienne Carrierea54952b2017-10-27 15:58:01 +02001497 /*
1498 * re-create the object two times with overwrite attribute
1499 */
Pascal Brandeb84c442016-04-19 17:49:49 +02001500 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1501 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1502 return;
1503
1504 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001505 fs_create_overwrite(&sess, file_04, sizeof(file_04),
1506 storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001507 goto bail1;
Pascal Brandeb84c442016-04-19 17:49:49 +02001508
Etienne Carrierea54952b2017-10-27 15:58:01 +02001509 /* re-create it with an object */
1510 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandeb84c442016-04-19 17:49:49 +02001511 fs_create(&sess, file_04, sizeof(file_04),
1512 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001513 TEE_DATA_FLAG_ACCESS_WRITE_META |
1514 TEE_DATA_FLAG_OVERWRITE, 0, NULL, 0, &obj,
1515 storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001516 goto bail2;
Pascal Brandeb84c442016-04-19 17:49:49 +02001517
Etienne Carrierea54952b2017-10-27 15:58:01 +02001518 TEEC_CloseSession(&sess);
Pascal Brandeb84c442016-04-19 17:49:49 +02001519
Etienne Carrierea54952b2017-10-27 15:58:01 +02001520 /*
1521 * re-create it again without overwrite flag: should fail and
1522 * existing object should not be altered.
1523 */
1524 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1525 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1526 return;
1527
1528 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ACCESS_CONFLICT,
1529 fs_create(&sess, file_04, sizeof(file_04),
1530 TEE_DATA_FLAG_ACCESS_WRITE |
1531 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, NULL, 0, &obj,
1532 storage_id)))
1533 goto bail2;
1534
1535 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1536 fs_open(&sess, file_04, sizeof(file_04),
1537 TEE_DATA_FLAG_ACCESS_READ |
1538 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj,
1539 storage_id)))
1540 goto bail1;
1541
1542bail2:
1543 /* remove the object so that xtest 600x can be replayed */
1544 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1545bail1:
Pascal Brandeb84c442016-04-19 17:49:49 +02001546 TEEC_CloseSession(&sess);
1547}
1548
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001549DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6012)
1550
1551static void xtest_tee_test_6013_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand90f23352016-05-19 15:15:47 +02001552{
1553 TEEC_Session sess;
1554 uint32_t orig;
1555 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1556
1557 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1558 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1559 return;
1560
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001561 op.params[0].value.a = storage_id;
1562 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand90f23352016-05-19 15:15:47 +02001563 TEEC_NONE, TEEC_NONE);
1564
1565 ADBG_EXPECT_TEEC_SUCCESS(c,
1566 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_KEY_IN_PERSISTENT,
1567 &op, &orig));
1568
1569 TEEC_CloseSession(&sess);
1570}
1571
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001572DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6013)
1573
1574static void xtest_tee_test_6014_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand29ee18f2016-05-23 14:13:56 +02001575{
1576 TEEC_Session sess;
1577 uint32_t orig;
1578 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1579
1580 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1581 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1582 return;
1583
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001584 op.params[0].value.a = storage_id;
1585 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand29ee18f2016-05-23 14:13:56 +02001586 TEEC_NONE, TEEC_NONE);
1587
1588 ADBG_EXPECT_TEEC_SUCCESS(c,
1589 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_LOOP, &op, &orig));
1590
1591 TEEC_CloseSession(&sess);
1592}
1593
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001594DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6014)
1595
Jerome Forissiere3854162016-08-12 12:40:12 +02001596static void xtest_tee_test_6015_single(ADBG_Case_t *c, uint32_t storage_id)
1597{
1598 TEEC_Session sess;
1599 TEEC_Session sess2;
1600 uint32_t orig;
1601 uint32_t obj;
1602 uint32_t obj2;
Jerome Forissiere3854162016-08-12 12:40:12 +02001603
1604 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1605 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1606 return;
1607
1608 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1609 xtest_teec_open_session(&sess2, &storage2_ta_uuid, NULL,
1610 &orig)))
1611 goto exit2;
1612
1613 /* TA #1 creates a persistent object */
1614 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1615 fs_create(&sess, file_01, sizeof(file_01),
1616 TEE_DATA_FLAG_ACCESS_WRITE |
1617 TEE_DATA_FLAG_ACCESS_READ |
1618 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
1619 sizeof(data_00), &obj, storage_id)))
1620 goto exit;
1621
1622 /* TA #2 tries to open the object created by TA #1 */
1623 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1624 fs_open(&sess2, file_01, sizeof(file_01),
1625 TEE_DATA_FLAG_ACCESS_READ, &obj2, storage_id)))
1626 goto clean;
1627
Jerome Forissiere3854162016-08-12 12:40:12 +02001628clean:
1629 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1630exit:
1631 TEEC_CloseSession(&sess2);
1632exit2:
1633 TEEC_CloseSession(&sess);
1634}
1635
1636DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6015)
1637
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001638
1639struct test_6016_thread_arg {
1640 ADBG_Case_t *case_t;
1641 uint32_t storage_id;
Jerome Forissier54cfbef2016-08-31 18:34:31 +02001642 char file_name[8];
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001643 TEEC_Session session;
1644};
1645
1646static void *test_6016_thread(void *arg)
1647{
1648 struct test_6016_thread_arg *a = arg;
1649 TEEC_Session sess = a->session;
1650 uint32_t obj;
1651 uint8_t out[10] = { 0 };
1652 uint32_t count;
1653
1654 /* create */
1655 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1656 fs_create(&sess, a->file_name, sizeof(a->file_name),
1657 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
1658 sizeof(data_01), &obj, a->storage_id)))
1659 goto exit;
1660
1661 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1662 goto exit;
1663
1664 /* write new data */
1665 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1666 fs_open(&sess, a->file_name, sizeof(a->file_name),
1667 TEE_DATA_FLAG_ACCESS_WRITE, &obj, a->storage_id)))
1668 goto exit;
1669
1670 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1671 fs_write(&sess, obj, data_00, sizeof(data_00))))
1672 goto exit;
1673
1674 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1675 goto exit;
1676
1677 /* verify */
1678 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1679 fs_open(&sess, a->file_name, sizeof(a->file_name),
1680 TEE_DATA_FLAG_ACCESS_READ |
1681 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, a->storage_id)))
1682 goto exit;
1683
1684 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1685 fs_read(&sess, obj, out, 10, &count)))
1686 goto exit;
1687
1688 (void)ADBG_EXPECT_BUFFER(a->case_t, data_00, 10, out, count);
1689
1690 /* clean */
1691 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_unlink(&sess, obj)))
1692 goto exit;
1693
1694exit:
1695 return NULL;
1696}
1697
1698
1699#define NUM_THREADS 4
1700static void xtest_tee_test_6016_loop(ADBG_Case_t *c, uint32_t storage_id)
1701{
1702 size_t num_threads = NUM_THREADS;
1703 struct test_6016_thread_arg arg[num_threads];
1704 pthread_t thr[num_threads];
1705 uint32_t orig;
1706 size_t i;
1707 size_t n = 0;
1708 size_t m;
1709
1710 memset(arg, 0, sizeof(arg));
1711
1712 for (m = 0; m < num_threads; m++)
1713 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1714 xtest_teec_open_session(&arg[m].session,
1715 &storage_ta_uuid, NULL, &orig)))
1716 goto out;
1717
1718 for (n = 0; n < num_threads; n++) {
1719 arg[n].case_t = c;
1720 arg[n].storage_id = storage_id;
Jerome Forissiercb10f832016-09-01 14:53:05 +02001721 snprintf(arg[n].file_name, sizeof(arg[n].file_name),
Jens Wiklander2b1c11d2016-09-16 14:58:41 +02001722 "file_%zu", n);
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001723 if (!ADBG_EXPECT(c, 0, pthread_create(thr + n, NULL,
1724 test_6016_thread, arg + n)))
1725 goto out;
1726 }
1727
1728out:
1729 for (i = 0; i < n; i++)
1730 ADBG_EXPECT(c, 0, pthread_join(thr[i], NULL));
1731 for (i = 0; i < m; i++)
1732 TEEC_CloseSession(&arg[i].session);
1733}
1734
1735/* concurency */
1736static void xtest_tee_test_6016_single(ADBG_Case_t *c, uint32_t storage_id)
1737{
1738 int i;
1739 int loops = 8;
1740
1741 Do_ADBG_Log(" threads: %d, loops: %d", NUM_THREADS, loops);
1742 for (i = 0; i < loops; i++)
1743 xtest_tee_test_6016_loop(c, storage_id);
1744}
1745
Jerome Forissierefd71d32016-09-13 15:09:33 +02001746DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6016)
Jerome Forissier327672c2016-09-01 18:34:11 +02001747
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001748static void xtest_tee_test_6017_single(ADBG_Case_t *c, uint32_t storage_id)
1749{
1750 TEEC_Session sess;
1751 TEE_ObjectInfo obj_info1;
1752 TEE_ObjectInfo obj_info2;
1753 uint32_t obj;
1754 uint32_t orig;
1755
1756 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1757 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1758 return;
1759
1760 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1761 fs_create(&sess, file_01, sizeof(file_01),
1762 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1763 0, &obj, storage_id)))
1764 goto exit;
1765
1766 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1767 fs_write(&sess, obj, data_00, sizeof(data_00))))
1768 goto exit;
1769
1770 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1771 fs_get_obj_info(&sess, obj, &obj_info1,
1772 sizeof(TEE_ObjectInfo))))
1773 goto exit;
1774
1775 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1776 goto exit;
1777
1778 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1779 fs_open(&sess, file_01, sizeof(file_01),
1780 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1781 goto exit;
1782
1783 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1784 fs_get_obj_info(&sess, obj, &obj_info2,
1785 sizeof(TEE_ObjectInfo))))
1786 goto exit;
1787
1788 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1789 obj_info1.dataSize, ==, obj_info2.dataSize))
1790 goto exit;
1791
1792 /* clean */
1793 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1794 goto exit;
1795
1796exit:
1797 TEEC_CloseSession(&sess);
1798}
1799
1800DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6017)
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001801
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001802static void xtest_tee_test_6018_single(ADBG_Case_t *c, uint32_t storage_id)
1803{
1804 TEEC_Session sess;
1805 TEE_ObjectInfo obj_info1;
1806 TEE_ObjectInfo obj_info2;
1807 uint32_t obj;
1808 uint32_t orig;
1809 uint8_t block[32 * 1024];
1810 size_t num_blocks;
1811 size_t block_size;
1812 size_t n;
1813
1814 if (storage_is(storage_id, TEE_STORAGE_PRIVATE_RPMB)) {
1815 /* RPMB FS is a bit resource constrained */
Jens Wiklander20949ea2017-05-17 17:47:58 +02001816 num_blocks = 10;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001817 block_size = 1024;
1818 } else {
Jens Wiklander5f86daa2017-05-30 16:37:19 +02001819 num_blocks = 20;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001820 block_size = sizeof(block);
1821 }
1822
1823 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1824 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1825 return;
1826
1827 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1828 fs_create(&sess, file_01, sizeof(file_01),
1829 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1830 0, &obj, storage_id)))
1831 goto exit;
1832
1833 for (n = 0; n < num_blocks; n++) {
1834 memset(block, n, block_size);
1835
1836 Do_ADBG_Log("writing %zu", n);
1837 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1838 fs_write(&sess, obj, block, block_size)))
1839 goto exit;
1840 }
1841
1842 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1843 fs_get_obj_info(&sess, obj, &obj_info1,
1844 sizeof(TEE_ObjectInfo))))
1845 goto exit;
1846
1847 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1848 obj_info1.dataSize, ==, block_size * num_blocks))
1849 goto exit;
1850
1851 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1852 goto exit;
1853
1854 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1855 fs_open(&sess, file_01, sizeof(file_01),
1856 TEE_DATA_FLAG_ACCESS_READ |
1857 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1858 goto exit;
1859
1860 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1861 fs_get_obj_info(&sess, obj, &obj_info2,
1862 sizeof(TEE_ObjectInfo))))
1863 goto exit;
1864
1865 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1866 obj_info1.dataSize, ==, obj_info2.dataSize))
1867 goto exit;
1868
1869 for (n = 0; n < num_blocks; n++) {
1870 uint8_t br[block_size];
1871 uint32_t count;
1872
1873 memset(block, n, block_size);
1874
1875 Do_ADBG_Log("reading %zu", n);
1876 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1877 fs_read(&sess, obj, br, sizeof(br), &count)))
1878 goto exit;
1879 if (!ADBG_EXPECT_BUFFER(c, block, block_size, br, count))
1880 goto exit;
1881 }
1882
1883 /* clean */
1884 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1885 goto exit;
1886
1887exit:
1888 TEEC_CloseSession(&sess);
1889}
1890
1891DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6018)
1892
l00176142ebba0c92017-11-08 01:16:26 +08001893static void xtest_tee_test_6019_single(ADBG_Case_t *c, uint32_t storage_id)
1894{
1895 TEEC_Session sess;
1896 TEEC_Session sess2;
1897 uint32_t orig;
1898 uint32_t obj;
1899 uint32_t obj2;
1900 uint8_t out[10] = { 0 };
1901 uint32_t count;
1902
1903 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1904 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1905 return;
1906
1907 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1908 xtest_teec_open_session(&sess2, &storage2_ta_uuid, NULL,
1909 &orig)))
1910 goto exit3;
1911
1912 /* TA #1 creates a persistent object */
1913 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1914 fs_create(&sess, file_01, sizeof(file_01),
1915 TEE_DATA_FLAG_ACCESS_WRITE |
1916 TEE_DATA_FLAG_ACCESS_WRITE_META |
1917 TEE_DATA_FLAG_OVERWRITE, 0, data_00,
1918 sizeof(data_00), &obj, storage_id)))
1919 goto exit2;
1920
1921 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1922 goto exit1;
1923
1924 /* TA #2 creates a persistent object */
1925 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1926 fs_create(&sess2, file_01, sizeof(file_01),
1927 TEE_DATA_FLAG_ACCESS_WRITE |
1928 TEE_DATA_FLAG_ACCESS_WRITE_META |
1929 TEE_DATA_FLAG_OVERWRITE, 0, data_01,
1930 sizeof(data_01), &obj2, storage_id)))
1931 goto exit1;
1932
1933 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess2, obj2)))
1934 goto exit;
1935
1936 /* TA #1 open and read */
1937 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1938 fs_open(&sess, file_01, sizeof(file_01),
1939 TEE_DATA_FLAG_ACCESS_READ |
1940 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1941 goto exit;
1942
1943 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1944 goto exit;
1945
1946 /* verify */
1947 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
1948
1949 /* TA #2 open and read */
1950 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1951 fs_open(&sess2, file_01, sizeof(file_01),
1952 TEE_DATA_FLAG_ACCESS_READ |
1953 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj2, storage_id)))
1954 goto exit;
1955
1956 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess2, obj2, out, 10, &count)))
1957 goto exit;
1958
1959 /* verify */
1960 (void)ADBG_EXPECT_BUFFER(c, data_01, 10, out, count);
1961
1962exit:
1963 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess2, obj2));
1964exit1:
1965 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1966exit2:
1967 TEEC_CloseSession(&sess2);
1968exit3:
1969 TEEC_CloseSession(&sess);
1970}
1971
1972DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6019)
1973
Jens Wiklander74abfe32017-01-03 14:17:47 +01001974ADBG_CASE_DEFINE(regression, 6001, xtest_tee_test_6001,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001975 "Test TEE_CreatePersistentObject");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001976ADBG_CASE_DEFINE(regression, 6002, xtest_tee_test_6002,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001977 "Test TEE_OpenPersistentObject");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001978ADBG_CASE_DEFINE(regression, 6003, xtest_tee_test_6003,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001979 "Test TEE_ReadObjectData");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001980ADBG_CASE_DEFINE(regression, 6004, xtest_tee_test_6004,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001981 "Test TEE_WriteObjectData");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001982ADBG_CASE_DEFINE(regression, 6005, xtest_tee_test_6005,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001983 "Test TEE_SeekObjectData");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001984ADBG_CASE_DEFINE(regression, 6006, xtest_tee_test_6006,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001985 "Test TEE_CloseAndDeletePersistentObject");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001986ADBG_CASE_DEFINE(regression, 6007, xtest_tee_test_6007,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001987 "Test TEE_TruncateObjectData");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001988ADBG_CASE_DEFINE(regression, 6008, xtest_tee_test_6008,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001989 "Test TEE_RenamePersistentObject");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001990ADBG_CASE_DEFINE(regression, 6009, xtest_tee_test_6009,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001991 "Test TEE Internal API Persistent Object Enumeration Functions");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001992ADBG_CASE_DEFINE(regression, 6010, xtest_tee_test_6010, "Test Storage");
Pascal Brand8a74e362015-09-10 12:41:52 +02001993
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001994#ifdef WITH_GP_TESTS
Jens Wiklander74abfe32017-01-03 14:17:47 +01001995ADBG_CASE_DEFINE(regression, 6011, xtest_tee_test_6011,
1996 "Test TEE GP TTA DS init objects");
Pascal Brand8a74e362015-09-10 12:41:52 +02001997#endif
Pascal Brandeb84c442016-04-19 17:49:49 +02001998
Jens Wiklander74abfe32017-01-03 14:17:47 +01001999ADBG_CASE_DEFINE(regression, 6012, xtest_tee_test_6012,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01002000 "Test TEE GP TTA DS init objects");
Jens Wiklander74abfe32017-01-03 14:17:47 +01002001ADBG_CASE_DEFINE(regression, 6013, xtest_tee_test_6013,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01002002 "Key usage in Persistent objects");
Jens Wiklander74abfe32017-01-03 14:17:47 +01002003ADBG_CASE_DEFINE(regression, 6014, xtest_tee_test_6014,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01002004 "Loop on Persistent objects");
Jens Wiklander74abfe32017-01-03 14:17:47 +01002005ADBG_CASE_DEFINE(regression, 6015, xtest_tee_test_6015, "Storage isolation");
2006ADBG_CASE_DEFINE(regression, 6016, xtest_tee_test_6016, "Storage concurency");
2007ADBG_CASE_DEFINE(regression, 6017, xtest_tee_test_6017,
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08002008 "Test Persistent objects info");
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01002009ADBG_CASE_DEFINE(regression, 6018, xtest_tee_test_6018, "Large object");
l00176142ebba0c92017-11-08 01:16:26 +08002010ADBG_CASE_DEFINE(regression, 6019, xtest_tee_test_6019, "Storage independence");