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