blob: c412f257335df364b1eb21feaf1aec6572f5c01e [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
Jerome Forissiera966bb42016-08-16 16:41:47 +020040#ifdef CFG_SQL_FS
41 TEE_STORAGE_PRIVATE_SQL,
42#endif
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020043};
Pascal Brandc639ac82015-07-02 08:53:34 +020044
45static uint8_t file_00[] = {
46 0x00, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
47 0xF0, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
48 0xE9, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
49 0xF0, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x8E
50};
51
52static uint8_t file_01[] = {
53 0x01, 0x00
54};
55
56static uint8_t file_02[] = {
57 0x02, 0x11, 0x02
58};
59
60static uint8_t file_03[] = {
61 0x03, 0x13, 0x03
62};
63
Pascal Brandeb84c442016-04-19 17:49:49 +020064static uint8_t file_04[] = {
65 0x00, 0x01, 0x02
66};
67
Pascal Brandc639ac82015-07-02 08:53:34 +020068static uint8_t data_00[] = {
69 0x00, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
70 0x00, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
71 0x00, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
72 0x00, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x00
73};
74
75static uint8_t data_01[] = {
76 0x01, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
77 0x01, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
78 0x01, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
79 0x01, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x01
80};
81
82static TEEC_Result fs_open(TEEC_Session *sess, void *id, uint32_t id_size,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020083 uint32_t flags, uint32_t *obj, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +020084{
Aijun Sun473d9072015-08-06 15:24:49 +080085 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +020086 TEEC_Result res;
87 uint32_t org;
88
89 op.params[0].tmpref.buffer = id;
90 op.params[0].tmpref.size = id_size;
91 op.params[1].value.a = flags;
92 op.params[1].value.b = 0;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020093 op.params[2].value.a = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +020094
95 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020096 TEEC_VALUE_INOUT, TEEC_VALUE_INPUT,
Pascal Brandc639ac82015-07-02 08:53:34 +020097 TEEC_NONE);
98
99 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_OPEN, &op, &org);
100
101 if (res == TEEC_SUCCESS)
102 *obj = op.params[1].value.b;
103
104 return res;
105}
106
107static TEEC_Result fs_create(TEEC_Session *sess, void *id, uint32_t id_size,
108 uint32_t flags, uint32_t attr, void *data,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200109 uint32_t data_size, uint32_t *obj,
110 uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200111{
Aijun Sun473d9072015-08-06 15:24:49 +0800112 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200113 TEEC_Result res;
114 uint32_t org;
115
116 op.params[0].tmpref.buffer = id;
117 op.params[0].tmpref.size = id_size;
118 op.params[1].value.a = flags;
119 op.params[1].value.b = 0;
120 op.params[2].value.a = attr;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200121 op.params[2].value.b = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200122 op.params[3].tmpref.buffer = data;
123 op.params[3].tmpref.size = data_size;
124
125 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
126 TEEC_VALUE_INOUT, TEEC_VALUE_INPUT,
127 TEEC_MEMREF_TEMP_INPUT);
128
129 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CREATE, &op, &org);
130
131 if (res == TEEC_SUCCESS)
132 *obj = op.params[1].value.b;
133
134 return res;
135}
136
Pascal Brandeb84c442016-04-19 17:49:49 +0200137static TEEC_Result fs_create_overwrite(TEEC_Session *sess, void *id,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200138 uint32_t id_size, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +0200139{
140 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
141 TEEC_Result res;
142 uint32_t org;
143
144 op.params[0].tmpref.buffer = id;
145 op.params[0].tmpref.size = id_size;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200146 op.params[1].value.a = storage_id;
Pascal Brandeb84c442016-04-19 17:49:49 +0200147
148 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200149 TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brandeb84c442016-04-19 17:49:49 +0200150 TEEC_NONE);
151
152 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CREATE_OVERWRITE, &op, &org);
153
154 return res;
155}
156
Pascal Brandc639ac82015-07-02 08:53:34 +0200157static TEEC_Result fs_close(TEEC_Session *sess, uint32_t obj)
158{
Aijun Sun473d9072015-08-06 15:24:49 +0800159 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200160 uint32_t org;
161
162 op.params[0].value.a = obj;
163
164 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
165 TEEC_NONE, TEEC_NONE);
166
167 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CLOSE, &op, &org);
168}
169
170static TEEC_Result fs_read(TEEC_Session *sess, uint32_t obj, void *data,
171 uint32_t data_size, uint32_t *count)
172{
173 TEEC_Result res;
Aijun Sun473d9072015-08-06 15:24:49 +0800174 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200175 uint32_t org;
176
177 op.params[0].tmpref.buffer = data;
178 op.params[0].tmpref.size = data_size;
179 op.params[1].value.a = obj;
180 op.params[1].value.b = 0;
181
182 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
183 TEEC_VALUE_INOUT, TEEC_NONE,
184 TEEC_NONE);
185
186 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_READ, &op, &org);
187
188 if (res == TEEC_SUCCESS)
189 *count = op.params[1].value.b;
190
191 return res;
192}
193
194static TEEC_Result fs_write(TEEC_Session *sess, uint32_t obj, void *data,
195 uint32_t data_size)
196{
Aijun Sun473d9072015-08-06 15:24:49 +0800197 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200198 uint32_t org;
199
200 op.params[0].tmpref.buffer = data;
201 op.params[0].tmpref.size = data_size;
202 op.params[1].value.a = obj;
203 op.params[1].value.b = 0;
204
205 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
206 TEEC_VALUE_INPUT, TEEC_NONE,
207 TEEC_NONE);
208
209 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_WRITE, &op, &org);
210}
211
212static TEEC_Result fs_seek(TEEC_Session *sess, uint32_t obj, int32_t offset,
213 int32_t whence)
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].value.a = obj;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200219 op.params[0].value.b = *(uint32_t *)&offset;
Pascal Brandc639ac82015-07-02 08:53:34 +0200220 op.params[1].value.a = whence;
221
222 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INOUT,
223 TEEC_NONE, TEEC_NONE);
224
225 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_SEEK, &op, &org);
226}
227
228static TEEC_Result fs_unlink(TEEC_Session *sess, uint32_t obj)
229{
Aijun Sun473d9072015-08-06 15:24:49 +0800230 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200231 uint32_t org;
232
233 op.params[0].value.a = obj;
234
235 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
236 TEEC_NONE, TEEC_NONE);
237
238 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_UNLINK, &op, &org);
239}
240
241static TEEC_Result fs_trunc(TEEC_Session *sess, uint32_t obj, uint32_t len)
242{
Aijun Sun473d9072015-08-06 15:24:49 +0800243 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200244 uint32_t org;
245
246 op.params[0].value.a = obj;
247 op.params[0].value.b = len;
248
249 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
250 TEEC_NONE, TEEC_NONE);
251
252 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_TRUNC, &op, &org);
253}
254
255static TEEC_Result fs_rename(TEEC_Session *sess, uint32_t obj, void *id,
256 uint32_t id_size)
257{
Aijun Sun473d9072015-08-06 15:24:49 +0800258 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200259 uint32_t org;
260
261 op.params[0].value.a = obj;
262 op.params[1].tmpref.buffer = id;
263 op.params[1].tmpref.size = id_size;
264
265 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
266 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
267 TEEC_NONE);
268
269 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RENAME, &op, &org);
270}
271
272static TEEC_Result fs_alloc_enum(TEEC_Session *sess, uint32_t *e)
273{
274 TEEC_Result res;
Aijun Sun473d9072015-08-06 15:24:49 +0800275 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200276 uint32_t org;
277
278 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE,
279 TEEC_NONE, TEEC_NONE);
280
281 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_ALLOC_ENUM, &op, &org);
282
283 if (res == TEEC_SUCCESS)
284 *e = op.params[0].value.a;
285
286 return res;
287}
288
289static TEEC_Result fs_free_enum(TEEC_Session *sess, uint32_t e)
290{
Aijun Sun473d9072015-08-06 15:24:49 +0800291 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200292 uint32_t org;
293
294 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
295 TEEC_NONE);
296
297 op.params[0].value.a = e;
298
299 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_FREE_ENUM, &op, &org);
300}
301
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200302static TEEC_Result fs_start_enum(TEEC_Session *sess, uint32_t e,
303 uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200304{
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_INPUT, TEEC_NONE,
309 TEEC_NONE, TEEC_NONE);
310
311 op.params[0].value.a = e;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200312 op.params[0].value.b = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200313
314 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_START_ENUM, &op, &org);
315}
316
317static TEEC_Result fs_next_enum(TEEC_Session *sess, uint32_t e, void *obj_info,
318 size_t info_size, void *id, uint32_t id_size)
319{
Aijun Sun473d9072015-08-06 15:24:49 +0800320 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200321 uint32_t org;
322
Pascal Brandc603e0d2016-04-25 12:37:18 +0200323 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brandc639ac82015-07-02 08:53:34 +0200324 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
Pascal Brandc603e0d2016-04-25 12:37:18 +0200325 if (obj_info && info_size)
326 op.paramTypes |= (TEEC_MEMREF_TEMP_OUTPUT << 4);
Pascal Brandc639ac82015-07-02 08:53:34 +0200327
328 op.params[0].value.a = e;
329 op.params[1].tmpref.buffer = obj_info;
330 op.params[1].tmpref.size = info_size;
331 op.params[2].tmpref.buffer = id;
332 op.params[2].tmpref.size = id_size;
333
334 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_NEXT_ENUM, &op, &org);
335}
336
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200337static TEEC_Result fs_restrict_usage(TEEC_Session *sess, uint32_t obj,
338 uint32_t obj_usage)
339{
340 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
341 uint32_t org;
342
343 op.params[0].value.a = obj;
344 op.params[0].value.b = obj_usage;
345
346 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
347 TEEC_NONE, TEEC_NONE);
348
349 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESTRICT_USAGE,
350 &op, &org);
351}
352
353static TEEC_Result fs_alloc_obj(TEEC_Session *sess, uint32_t obj_type,
354 uint32_t max_key_size, uint32_t *obj)
355{
356 TEEC_Result res;
357 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
358 uint32_t org;
359
360 op.params[0].value.a = obj_type;
361 op.params[0].value.b = max_key_size;
362
363 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
364 TEEC_NONE, TEEC_NONE);
365
366 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_ALLOC_OBJ, &op, &org);
367 *obj = op.params[1].value.a;
368 return res;
369}
370
371static TEEC_Result fs_free_obj(TEEC_Session *sess, uint32_t obj)
372{
373 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
374 uint32_t org;
375
376 op.params[0].value.a = obj;
377
378 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
379 TEEC_NONE, TEEC_NONE);
380
381 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_FREE_OBJ, &op, &org);
382}
383
384static TEEC_Result fs_reset_obj(TEEC_Session *sess, uint32_t obj)
385{
386 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
387 uint32_t org;
388
389 op.params[0].value.a = obj;
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_RESET_OBJ, &op, &org);
395}
396
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800397static TEEC_Result fs_get_obj_info(TEEC_Session *sess, uint32_t obj,
398 void *obj_info, size_t info_size)
399{
400 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
401 uint32_t org;
402
403 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
404 TEEC_MEMREF_TEMP_OUTPUT,
405 TEEC_NONE, TEEC_NONE);
406
407 op.params[0].value.a = obj;
408 op.params[1].tmpref.buffer = obj_info;
409 op.params[1].tmpref.size = info_size;
410
411 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_GET_OBJ_INFO, &op, &org);
412}
413
James Kung98c0ba12015-09-09 15:51:59 +0800414/* trunc */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200415static void test_truncate_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800416{
417 TEEC_Session sess;
418 uint32_t obj;
419 uint8_t out[10] = { 0 };
420 uint32_t count;
421 uint32_t orig;
422
423 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
424 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
425 return;
426
427 /* create */
428 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
429 fs_create(&sess, file_01, sizeof(file_01),
430 TEE_DATA_FLAG_ACCESS_WRITE |
431 TEE_DATA_FLAG_ACCESS_READ |
432 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200433 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800434 goto exit;
435
436 /* trunc */
437 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 10)))
438 goto exit;
439
440 /* seek */
441 if (!ADBG_EXPECT_TEEC_SUCCESS(
442 c, fs_seek(&sess, obj, 5, TEE_DATA_SEEK_SET)))
443 goto exit;
444
445 /* verify */
446 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
447 goto exit;
448
449 /* check buffer */
450 (void)ADBG_EXPECT_BUFFER(c, &data_00[5], 5, out, count);
451
452 /* clean */
453 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
454 goto exit;
455
456exit:
457 TEEC_CloseSession(&sess);
458}
459
460/* extend */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200461static void test_extend_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800462{
463 TEEC_Session sess;
464 uint32_t obj;
465 uint8_t out[10] = { 0 };
466 uint8_t expect[10] = { 0 };
467 uint32_t count;
468 uint32_t orig;
469
470 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
471 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
472 return;
473
474 /* create */
475 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
476 fs_create(&sess, file_01, sizeof(file_01),
477 TEE_DATA_FLAG_ACCESS_WRITE |
478 TEE_DATA_FLAG_ACCESS_READ |
479 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200480 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800481 goto exit;
482
483 /* extend */
484 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 40)))
485 goto exit;
486
487 /* seek */
488 if (!ADBG_EXPECT_TEEC_SUCCESS(
489 c, fs_seek(&sess, obj, 30, TEE_DATA_SEEK_SET)))
490 goto exit;
491
492 /* verify */
493 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
494 goto exit;
495
496 /* check buffer */
497 expect[0] = data_00[30];
498 expect[1] = data_00[31];
499 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
500
501 /* clean */
502 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
503 goto exit;
504
505exit:
506 TEEC_CloseSession(&sess);
507}
508
509/* file hole */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200510static void test_file_hole(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800511{
512 TEEC_Session sess;
513 uint32_t obj;
514 uint8_t out[10] = { 0 };
515 uint8_t expect[10] = { 0 };
516 uint32_t count;
517 uint32_t orig;
518
519 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
520 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
521 return;
522
523 /* create */
524 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
525 fs_create(&sess, file_01, sizeof(file_01),
526 TEE_DATA_FLAG_ACCESS_WRITE |
527 TEE_DATA_FLAG_ACCESS_READ |
528 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200529 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800530 goto exit;
531
532 /* seek */
533 if (!ADBG_EXPECT_TEEC_SUCCESS(
534 c, fs_seek(&sess, obj, 80, TEE_DATA_SEEK_SET)))
535 goto exit;
536
537 /* write */
538 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_write(&sess, obj, data_00,
539 sizeof(data_00))))
540 goto exit;
541
542 /* seek */
543 if (!ADBG_EXPECT_TEEC_SUCCESS(
544 c, fs_seek(&sess, obj, 74, TEE_DATA_SEEK_SET)))
545 goto exit;
546
547 /* verify */
548 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
549 goto exit;
550
551 /* check buffer */
552 expect[6] = data_00[0];
553 expect[7] = data_00[1];
554 expect[8] = data_00[2];
555 expect[9] = data_00[3];
556 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
557
558 /* clean */
559 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
560 goto exit;
561
562exit:
563 TEEC_CloseSession(&sess);
564}
565
Jerome Forissiere3688342015-09-24 10:45:17 -0700566#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +0200567static TEEC_Result ds_seek_obj_inv_handle(TEEC_Session *sess)
568{
569 TEEC_Operation op;
570 uint32_t org;
571
572 op.paramTypes = TEEC_PARAM_TYPES(
573 TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
574
575 op.params[0].value.a = CASE_DATA_OBJECT_NOT_PERSISTENT;
576
577 return TEEC_InvokeCommand(
578 sess, CMD_SeekObjectData_panic, &op, &org);
579}
580
Pascal Brand8a74e362015-09-10 12:41:52 +0200581static TEEC_Result ds_seek_gp(
582 TEEC_Session *sess, TEE_Whence wh, uint32_t wh_off, uint32_t set_off,
583 void *in, size_t in_size, void *out, size_t out_size)
584{
585 TEEC_Operation op;
586 uint32_t org;
587
588 op.paramTypes = TEEC_PARAM_TYPES(
589 TEEC_VALUE_INPUT, TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT,
590 TEEC_MEMREF_TEMP_OUTPUT);
591
592 op.params[0].value.a = wh;
593 op.params[0].value.b = wh_off;
594 op.params[1].value.a = set_off;
595 op.params[2].tmpref.buffer = in;
596 op.params[2].tmpref.size = in_size;
597 op.params[3].tmpref.buffer = out;
598 op.params[3].tmpref.size = out_size;
599
600 return TEEC_InvokeCommand(sess, CMD_SeekWriteReadObjectData, &op, &org);
601}
602
603static TEEC_Result ds_init_object_and_attributes(TEEC_Session *sess,
604 uint32_t obj_type, uint32_t obj_size, const void *attr_meta,
605 size_t attr_meta_len, const void *attr_data, size_t attr_data_len,
606 uint32_t option)
607{
608 TEEC_Operation op;
609 uint32_t org;
610
611 op.paramTypes = TEEC_PARAM_TYPES(
612 TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT,
613 TEEC_MEMREF_TEMP_INPUT, TEEC_VALUE_INPUT);
614
615 op.params[0].value.a = obj_type;
616 op.params[0].value.b = obj_size;
617 op.params[1].tmpref.buffer = (void *)attr_meta;
618 op.params[1].tmpref.size = attr_meta_len;
619 op.params[2].tmpref.buffer = (void *)attr_data;
620 op.params[2].tmpref.size = attr_data_len;
621 op.params[3].value.a = option;
622
623 return TEEC_InvokeCommand(sess, CMD_InitObjectAndAttributes, &op, &org);
624}
625
626static TEEC_Result ds_rename_access_conflict(TEEC_Session *sess)
627{
628 TEEC_Operation op;
629 uint32_t org;
630
631 op.paramTypes = TEEC_PARAM_TYPES(
632 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
633
634 return TEEC_InvokeCommand(
635 sess, CMD_RenamePersistentObject_AccessConflict, &op, &org);
636}
637
638static TEEC_Result ds_start_enum_no_item(TEEC_Session *sess)
639{
640 TEEC_Operation op;
641 uint32_t org;
642 TEEC_Result res;
643
644 op.paramTypes = TEEC_PARAM_TYPES(
645 TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
646
647 res = TEEC_InvokeCommand(
648 sess, CMD_StartNGetPersistentObjectEnumerator_itemNotFound, &op, &org);
649
650 if (res != TEEC_SUCCESS)
651 return res;
652
653 if (op.params[0].value.a != 0 || op.params[0].value.b != 0)
654 return TEEC_ERROR_GENERIC;
655
656 return res;
657}
658
659static TEEC_Result ds_rename_success(TEEC_Session *sess)
660{
661 TEEC_Operation op;
662 uint32_t org;
663
664 op.paramTypes = TEEC_PARAM_TYPES(
665 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
666
667 return TEEC_InvokeCommand(
668 sess, CMD_RenamePersistentObject_Success, &op, &org);
669}
670
671static TEEC_Result ds_null_close_free_reset(TEEC_Session *sess)
672{
673 TEEC_Operation op;
674 uint32_t org;
675
676 op.paramTypes = TEEC_PARAM_TYPES(
677 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
678
679 return TEEC_InvokeCommand(
680 sess, CMD_CloseFreeAndResetObjectSuccessHandleNull, &op, &org);
681}
682#endif
683
Pascal Brandc639ac82015-07-02 08:53:34 +0200684/* create */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200685static void xtest_tee_test_6001_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200686{
687 TEEC_Session sess;
688 uint32_t obj;
689 uint32_t orig;
690
691 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
692 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
693 return;
694
695 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
696 fs_create(&sess, file_00, sizeof(file_00),
697 TEE_DATA_FLAG_ACCESS_WRITE |
698 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200699 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200700 goto exit;
701
702 /* clean */
703 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
704 goto exit;
705
706exit:
707 TEEC_CloseSession(&sess);
708}
709
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200710#define DEFINE_TEST_MULTIPLE_STORAGE_IDS(test_name) \
711static void test_name(ADBG_Case_t *c) \
712{ \
713 size_t i; \
714 \
715 for (i = 0; i < ARRAY_SIZE(storage_ids); i++) { \
716 Do_ADBG_BeginSubCase(c, "Storage id: %08x", storage_ids[i]); \
717 test_name##_single(c, storage_ids[i]); \
718 Do_ADBG_EndSubCase(c, "Storage id: %08x", storage_ids[i]); \
719 } \
720}
721
722DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6001)
723
Pascal Brandc639ac82015-07-02 08:53:34 +0200724/* open */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200725static void xtest_tee_test_6002_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200726{
727 TEEC_Session sess;
728 uint32_t obj;
729 uint32_t orig;
730
731 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
732 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
733 return;
734
735 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
736 fs_create(&sess, file_01, sizeof(file_01),
737 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200738 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200739 goto exit;
740
741 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
742 goto exit;
743
744 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
745 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200746 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200747 goto exit;
748
749 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
750 goto exit;
751
752 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
753 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200754 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200755 goto exit;
756
757 /* clean */
758 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
759 goto exit;
760
761exit:
762 TEEC_CloseSession(&sess);
763}
764
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200765DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6002)
766
Pascal Brandc639ac82015-07-02 08:53:34 +0200767/* read */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200768static void xtest_tee_test_6003_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200769{
770 TEEC_Session sess;
771 uint32_t obj;
772 uint8_t out[10] = { 0 };
773 uint32_t count;
774 uint32_t orig;
775
776 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
777 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
778 return;
779
780 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
781 fs_create(&sess, file_02, sizeof(file_02),
782 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200783 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200784 goto exit;
785
786 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
787 goto exit;
788
789 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
790 fs_open(&sess, file_02, sizeof(file_02),
791 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200792 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200793 goto exit;
794
795 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
796 goto exit;
797
798 (void)ADBG_EXPECT_BUFFER(c, data_01, 10, out, count);
799
800 /* clean */
801 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
802 goto exit;
803
804exit:
805 TEEC_CloseSession(&sess);
806}
807
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200808DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6003)
809
Pascal Brandc639ac82015-07-02 08:53:34 +0200810/* write */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200811static void xtest_tee_test_6004_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200812{
813 TEEC_Session sess;
814 uint32_t obj;
815 uint8_t out[10] = { 0 };
816 uint32_t count;
817 uint32_t orig;
818
819 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
820 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
821 return;
822
823 /* create */
824 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
825 fs_create(&sess, file_02, sizeof(file_02),
826 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200827 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200828 goto exit;
829
830 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
831 goto exit;
832
833 /* write new data */
834 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
835 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200836 TEE_DATA_FLAG_ACCESS_WRITE, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200837 goto exit;
838
839 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
840 fs_write(&sess, obj, data_00, sizeof(data_00))))
841 goto exit;
842
843 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
844 goto exit;
845
846 /* verify */
847 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
848 fs_open(&sess, file_02, sizeof(file_02),
849 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200850 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200851 goto exit;
852
853 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
854 goto exit;
855
856 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
857
858 /* clean */
859 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
860 goto exit;
861
862exit:
863 TEEC_CloseSession(&sess);
864}
865
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200866DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6004)
867
Pascal Brandc639ac82015-07-02 08:53:34 +0200868/* seek */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200869static void xtest_tee_test_6005_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200870{
871 TEEC_Session sess;
872 uint32_t obj;
873 uint8_t out[10] = { 0 };
874 uint32_t count;
875 uint32_t orig;
876
877 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
878 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
879 return;
880
881 /* create */
882 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
883 fs_create(&sess, file_01, sizeof(file_01),
884 TEE_DATA_FLAG_ACCESS_WRITE |
885 TEE_DATA_FLAG_ACCESS_READ |
886 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200887 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200888 goto exit;
889
890 /* seek */
891 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
892 fs_seek(&sess, obj, 10, TEE_DATA_SEEK_SET)))
893 goto exit;
894
895 /* verify */
896 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
897 goto exit;
898
899 (void)ADBG_EXPECT_BUFFER(c, &data_00[10], 10, out, count);
900
901 /* clean */
902 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
903 goto exit;
904
905exit:
906 TEEC_CloseSession(&sess);
907}
908
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200909DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6005)
910
Pascal Brandc639ac82015-07-02 08:53:34 +0200911/* unlink */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200912static void xtest_tee_test_6006_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200913{
914 TEEC_Session sess;
915 uint32_t obj;
916 uint32_t orig;
917
918 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
919 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
920 return;
921
922 /* create */
923 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
924 fs_create(&sess, file_01, sizeof(file_01),
925 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200926 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200927 goto exit;
928
929 /* del & close */
930 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
931 goto exit;
932
933 /* check result */
934 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
935 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200936 TEE_DATA_FLAG_ACCESS_READ, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200937 goto exit;
938
939exit:
940 TEEC_CloseSession(&sess);
941}
942
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200943DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6006)
944
945static void xtest_tee_test_6007_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200946{
James Kung98c0ba12015-09-09 15:51:59 +0800947 Do_ADBG_BeginSubCase(c, "Test truncate file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200948 test_truncate_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +0800949 Do_ADBG_EndSubCase(c, "Test truncate file length");
Pascal Brandc639ac82015-07-02 08:53:34 +0200950
James Kung98c0ba12015-09-09 15:51:59 +0800951 Do_ADBG_BeginSubCase(c, "Test extend file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200952 test_extend_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +0800953 Do_ADBG_EndSubCase(c, "Test extend file length");
Pascal Brandc639ac82015-07-02 08:53:34 +0200954
James Kung98c0ba12015-09-09 15:51:59 +0800955 Do_ADBG_BeginSubCase(c, "Test file hole");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200956 test_file_hole(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +0800957 Do_ADBG_EndSubCase(c, "Test file hole");
Pascal Brandc639ac82015-07-02 08:53:34 +0200958}
959
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200960DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6007)
961
962static void xtest_tee_test_6008_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200963{
964 TEEC_Session sess;
965 uint32_t obj;
966 uint8_t out[10] = { 0 };
967 uint32_t count;
968 uint32_t orig;
969
970 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
971 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
972 return;
973
974 /* create */
975 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
976 fs_create(&sess, file_02, sizeof(file_02),
977 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200978 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200979 goto exit;
980
981 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
982 goto exit;
983
984 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
985 fs_open(&sess, file_02, sizeof(file_02),
986 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200987 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200988 goto exit;
989
990 /* write new data */
991 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
992 fs_write(&sess, obj, data_00, sizeof(data_00))))
993 goto exit;
994
995 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
996 fs_rename(&sess, obj, file_03, sizeof(file_03))))
997 goto exit;
998
999 /* close */
1000 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1001 goto exit;
1002
1003 /* verify */
1004 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1005 fs_open(&sess, file_03, sizeof(file_03),
1006 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001007 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001008 goto exit;
1009
1010 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1011 goto exit;
1012
1013 /* check buffer */
1014 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
1015
1016 /* clean */
1017 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1018 goto exit;
1019
1020exit:
1021 TEEC_CloseSession(&sess);
1022}
1023
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001024DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6008)
1025
1026static void xtest_tee_test_6009_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001027{
1028 TEEC_Session sess;
1029 uint32_t obj0;
1030 uint32_t obj1;
1031 uint32_t obj2;
1032 uint32_t e = 0;
1033 uint8_t info[200];
1034 uint8_t id[200];
1035 uint32_t orig;
1036
1037 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1038 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1039 return;
1040
1041 /* create file 00 */
1042 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1043 fs_create(&sess, file_00, sizeof(file_00),
1044 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001045 sizeof(data_01), &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001046 goto exit;
1047
1048 /* create file 01 */
1049 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1050 fs_create(&sess, file_01, sizeof(file_01),
1051 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001052 sizeof(data_01), &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001053 goto exit;
1054
1055 /* create file 02 */
1056 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1057 fs_create(&sess, file_02, sizeof(file_02),
1058 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001059 sizeof(data_01), &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001060 goto exit;
1061
1062 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj0)))
1063 goto exit;
1064
1065 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj1)))
1066 goto exit;
1067
1068 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj2)))
1069 goto exit;
1070
1071 /* iterate */
1072 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e)))
1073 goto exit;
1074
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001075 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_start_enum(&sess, e, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001076 goto exit;
1077
1078 /* get 00 */
1079 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1080 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1081 goto exit;
1082
1083 /* get 01 */
1084 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc603e0d2016-04-25 12:37:18 +02001085 fs_next_enum(&sess, e, NULL, 0, id, sizeof(id))))
Pascal Brandc639ac82015-07-02 08:53:34 +02001086 goto exit;
1087
1088 /* get 02 */
1089 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1090 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1091 goto exit;
1092
1093 /* we should not have more files */
1094 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1095 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1096 goto exit;
1097
1098 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e)))
1099 goto exit;
1100
1101 /* clean */
1102 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1103 fs_open(&sess, file_00, sizeof(file_00),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001104 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001105 goto exit;
1106
1107 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj0)))
1108 goto exit;
1109
1110 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1111 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001112 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001113 goto exit;
1114
1115 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj1)))
1116 goto exit;
1117
1118 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1119 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001120 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001121 goto exit;
1122
1123 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj2)))
1124 goto exit;
1125
1126exit:
1127 TEEC_CloseSession(&sess);
1128}
1129
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001130DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6009)
1131
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001132static void xtest_tee_test_6010_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand8a74e362015-09-10 12:41:52 +02001133{
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001134 TEEC_Session sess;
1135 uint32_t orig;
1136 uint32_t o1;
1137 uint32_t o2;
1138 uint32_t e;
1139 uint32_t f;
1140 uint8_t data[1024];
1141 uint8_t out[1024];
1142 uint32_t n;
Pascal Brand30844922015-09-17 12:12:42 +02001143
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001144 for (n = 0; n < ARRAY_SIZE(data); n++)
1145 data[n] = n;
Pascal Brand8a74e362015-09-10 12:41:52 +02001146
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001147 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1148 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1149 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001150
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001151 Do_ADBG_BeginSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001152
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001153 o1 = TEE_HANDLE_NULL;
1154 o2 = TEE_HANDLE_NULL;
1155 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1156 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1157 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
Pascal Brand8a74e362015-09-10 12:41:52 +02001158
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001159 ADBG_EXPECT_TEEC_SUCCESS(c,
1160 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1161 sizeof(data), &o1, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001162
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001163 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE;
1164 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ACCESS_CONFLICT,
1165 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1166 sizeof(data), &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001167
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001168 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1169 if (o2)
1170 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
Pascal Brand8a74e362015-09-10 12:41:52 +02001171
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001172 Do_ADBG_EndSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001173
Pascal Brand8a74e362015-09-10 12:41:52 +02001174
Pascal Brand8a74e362015-09-10 12:41:52 +02001175
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001176 Do_ADBG_BeginSubCase(c, "RestrictObjectUsage Panic");
1177 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1178 fs_restrict_usage(&sess, 0xffffbad0, 0xffffffff));
1179 Do_ADBG_EndSubCase(c, "RestrictObjectUsage Panic");
Pascal Brand8a74e362015-09-10 12:41:52 +02001180
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001181 TEEC_CloseSession(&sess);
1182 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1183 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1184 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001185
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001186 Do_ADBG_BeginSubCase(c, "SeekObjectData BadHandle");
1187 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1188 fs_seek(&sess, 0xffffbad0, 5, TEE_DATA_SEEK_SET));
1189 Do_ADBG_EndSubCase(c, "SeekObjectData BadHandle");
Pascal Brand8a74e362015-09-10 12:41:52 +02001190
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001191 TEEC_CloseSession(&sess);
1192 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1193 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1194 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001195
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001196 Do_ADBG_BeginSubCase(c, "SeekObjectData NotPersist");
1197 o1 = 0;
1198 ADBG_EXPECT_TEEC_SUCCESS(c,
1199 fs_alloc_obj(&sess, TEE_TYPE_AES, 256, &o1));
1200 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1201 fs_seek(&sess, o1, 5, TEE_DATA_SEEK_SET));
1202 Do_ADBG_EndSubCase(c, "SeekObjectData NotPersist");
Pascal Brand8a74e362015-09-10 12:41:52 +02001203
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001204 TEEC_CloseSession(&sess);
1205 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1206 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1207 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001208
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001209 Do_ADBG_BeginSubCase(c, "SeekWriteRead");
1210 o1 = 0;
1211 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1212 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1213 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1214 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1215 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1216 sizeof(data), &o1, storage_id)))
1217 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001218
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001219 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1220 fs_seek(&sess, o1, 2, TEE_DATA_SEEK_SET)))
1221 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001222
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001223 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1224 fs_seek(&sess, o1, 0, TEE_DATA_SEEK_END)))
1225 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001226
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001227 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1228 fs_write(&sess, o1, data, sizeof(data))))
1229 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001230
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001231 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1232 fs_seek(&sess, o1, sizeof(data), TEE_DATA_SEEK_SET)))
1233 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001234
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001235 memset(out, 0xab, sizeof(out));
1236 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1237 fs_read(&sess, o1, out, sizeof(out), &n)))
1238 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001239
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001240 ADBG_EXPECT_BUFFER(c, data, sizeof(data), out, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001241
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001242 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander3a6892e2016-09-14 15:53:52 +02001243 fs_seek(&sess, o1, 10, TEE_DATA_SEEK_END)))
1244 goto seek_write_read_out;
1245
1246 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1247 fs_read(&sess, o1, out, sizeof(out), &n)))
1248 goto seek_write_read_out;
1249 ADBG_EXPECT_COMPARE_UNSIGNED(c, n, ==, 0);
1250
1251 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001252 fs_seek(&sess, o1, -(int32_t)sizeof(data) / 2,
1253 TEE_DATA_SEEK_END)))
1254 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001255
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001256 memset(out, 0xab, sizeof(out) / 2);
1257 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1258 fs_read(&sess, o1, out, sizeof(out) / 2, &n)))
1259 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001260
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001261 ADBG_EXPECT_BUFFER(c,
1262 data + sizeof(data) / 2, sizeof(data) / 2,
1263 out + sizeof(data) / 2, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001264
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001265seek_write_read_out:
1266 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1267 Do_ADBG_EndSubCase(c, "SeekWriteRead");
Pascal Brand8a74e362015-09-10 12:41:52 +02001268
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001269 Do_ADBG_BeginSubCase(c, "Rename Access Conflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001270
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001271 o1 = TEE_HANDLE_NULL;
1272 o2 = TEE_HANDLE_NULL;
1273 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1274 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1275 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1276 ADBG_EXPECT_TEEC_SUCCESS(c,
1277 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1278 sizeof(data), &o1, storage_id));
1279 ADBG_EXPECT_TEEC_SUCCESS(c,
1280 fs_create(&sess, file_01, sizeof(file_01), f, 0, data,
1281 sizeof(data) / 2, &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001282
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001283 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ACCESS_CONFLICT,
1284 fs_rename(&sess, o2, file_00, sizeof(file_00)));
Pascal Brand8a74e362015-09-10 12:41:52 +02001285
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001286 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1287 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
1288
1289 Do_ADBG_EndSubCase(c, "Rename Access Conflict");
1290
1291 Do_ADBG_BeginSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1292 e = TEE_HANDLE_NULL;
1293 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1294 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1295 fs_next_enum(&sess, e, NULL, 0, out, sizeof(out)));
1296 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1297 fs_start_enum(&sess, e, storage_id));
1298 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e));
1299 Do_ADBG_EndSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1300
1301 Do_ADBG_BeginSubCase(c, "RenamePersistent ReadWrite");
1302 o1 = TEE_HANDLE_NULL;
1303 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1304 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1305 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1306 ADBG_EXPECT_TEEC_SUCCESS(c,
1307 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1308 sizeof(data), &o1, storage_id));
1309 ADBG_EXPECT_TEEC_SUCCESS(c,
1310 fs_rename(&sess, o1, file_01, sizeof(file_01)));
1311 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1312 Do_ADBG_EndSubCase(c, "RenamePersistent ReadWrite");
1313
1314 Do_ADBG_BeginSubCase(c, "Close Free Reset Null");
1315 ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, TEE_HANDLE_NULL));
1316 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_obj(&sess, TEE_HANDLE_NULL));
1317 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_obj(&sess, TEE_HANDLE_NULL));
1318 Do_ADBG_EndSubCase(c, "Close Free Reset Null");
1319
1320 TEEC_CloseSession(&sess);
Pascal Brand8a74e362015-09-10 12:41:52 +02001321}
1322
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001323DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6010)
1324
1325#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +02001326static void xtest_tee_test_6011(ADBG_Case_t *c)
1327{
1328 TEEC_Session sess;
1329 uint32_t orig;
1330 /*
1331 * Test data from
1332 * Invoke_InitObjectAndAttributes_TEE_TYPE_AES_success_attribute_
1333 * TEE_ATTR_SECRET_VALUE_correct_size (9d-9a-91)
1334 */
1335 static const uint8_t attr_meta[] = {
13360xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
13370x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
13380x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
13390x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
1340 };
1341 static const uint8_t attr_data[] = {
13420x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,
13430x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,
13440xdf,0xf4,
1345 };
1346
1347 if (!ADBG_EXPECT_TEEC_SUCCESS(
1348 c, xtest_teec_open_session(
1349 &sess, &gp_tta_ds_uuid, NULL, &orig)))
1350 return;
1351
1352 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ds_init_object_and_attributes(&sess,
1353 0xa0000010, 0x100, attr_meta, sizeof(attr_meta), attr_data,
1354 sizeof(attr_data), 0)))
1355 goto exit;
1356
1357exit:
1358 TEEC_CloseSession(&sess);
1359}
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001360#endif /*WITH_GP_TESTS*/
Pascal Brand8a74e362015-09-10 12:41:52 +02001361
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001362static void xtest_tee_test_6012_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +02001363{
1364 TEEC_Session sess;
1365 uint32_t orig;
1366 uint32_t obj;
1367
1368 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1369 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1370 return;
1371
1372 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001373 fs_create_overwrite(&sess, file_04, sizeof(file_04), storage_id)))
Pascal Brandeb84c442016-04-19 17:49:49 +02001374 goto exit;
1375
1376 TEEC_CloseSession(&sess);
1377
1378 /* re-create the same */
1379 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1380 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1381 return;
1382
1383 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001384 fs_create_overwrite(&sess, file_04, sizeof(file_04),
1385 storage_id)))
Pascal Brandeb84c442016-04-19 17:49:49 +02001386 goto exit;
1387
1388 /*
1389 * recreate it with an object, and remove it so that xtest 6009
1390 * can be replayed
1391 */
1392 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1393 fs_create(&sess, file_04, sizeof(file_04),
1394 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001395 TEE_DATA_FLAG_ACCESS_WRITE_META |
1396 TEE_DATA_FLAG_OVERWRITE, 0, NULL, 0, &obj,
1397 storage_id)))
Pascal Brandeb84c442016-04-19 17:49:49 +02001398 goto exit;
1399
1400 /* clean */
1401 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1402 goto exit;
1403
1404exit:
1405 TEEC_CloseSession(&sess);
1406}
1407
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001408DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6012)
1409
1410static void xtest_tee_test_6013_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand90f23352016-05-19 15:15:47 +02001411{
1412 TEEC_Session sess;
1413 uint32_t orig;
1414 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1415
1416 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1417 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1418 return;
1419
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001420 op.params[0].value.a = storage_id;
1421 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand90f23352016-05-19 15:15:47 +02001422 TEEC_NONE, TEEC_NONE);
1423
1424 ADBG_EXPECT_TEEC_SUCCESS(c,
1425 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_KEY_IN_PERSISTENT,
1426 &op, &orig));
1427
1428 TEEC_CloseSession(&sess);
1429}
1430
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001431DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6013)
1432
1433static void xtest_tee_test_6014_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand29ee18f2016-05-23 14:13:56 +02001434{
1435 TEEC_Session sess;
1436 uint32_t orig;
1437 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1438
1439 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1440 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1441 return;
1442
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001443 op.params[0].value.a = storage_id;
1444 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand29ee18f2016-05-23 14:13:56 +02001445 TEEC_NONE, TEEC_NONE);
1446
1447 ADBG_EXPECT_TEEC_SUCCESS(c,
1448 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_LOOP, &op, &orig));
1449
1450 TEEC_CloseSession(&sess);
1451}
1452
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001453DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6014)
1454
Jerome Forissiere3854162016-08-12 12:40:12 +02001455static int get_ta_storage_path(TEEC_UUID *p_uuid, char *buffer, uint32_t len)
1456{
1457 int s;
1458
1459 if (!p_uuid || !buffer)
1460 return -1;
1461
1462 s = snprintf(buffer, len, "/data/tee/");
1463 if (s < 0 || s >= (int)len)
1464 return -1;
1465
1466 len -= s;
1467 buffer += s;
1468
1469 s = ree_fs_get_ta_dirname(p_uuid, buffer, len);
1470 return s;
1471}
1472
1473static int rename_data_dir(TEEC_UUID *old, TEEC_UUID *nw)
1474{
1475 char opath[150];
1476 char npath[150];
1477 int s;
1478
1479 s = get_ta_storage_path(old, opath, sizeof(opath));
1480 if (s < 0 || s >= (int)sizeof(opath)) {
1481 s = -1;
1482 goto exit;
1483 }
1484 s = get_ta_storage_path(nw, npath, sizeof(npath));
1485 if (s < 0 || s >= (int)sizeof(opath)) {
1486 s = -1;
1487 goto exit;
1488 }
1489 s = rename(opath, npath);
1490exit:
1491 if (s < 0)
1492 fprintf(stderr, "Warning: could not rename %s -> %s\n", opath,
1493 npath);
1494 return s;
1495}
1496
1497static void xtest_tee_test_6015_single(ADBG_Case_t *c, uint32_t storage_id)
1498{
1499 TEEC_Session sess;
1500 TEEC_Session sess2;
1501 uint32_t orig;
1502 uint32_t obj;
1503 uint32_t obj2;
1504 TEEC_UUID uuid = TA_STORAGE_UUID;
1505 TEEC_UUID uuid2 = TA_STORAGE2_UUID;
1506
1507 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1508 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1509 return;
1510
1511 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1512 xtest_teec_open_session(&sess2, &storage2_ta_uuid, NULL,
1513 &orig)))
1514 goto exit2;
1515
1516 /* TA #1 creates a persistent object */
1517 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1518 fs_create(&sess, file_01, sizeof(file_01),
1519 TEE_DATA_FLAG_ACCESS_WRITE |
1520 TEE_DATA_FLAG_ACCESS_READ |
1521 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
1522 sizeof(data_00), &obj, storage_id)))
1523 goto exit;
1524
1525 /* TA #2 tries to open the object created by TA #1 */
1526 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1527 fs_open(&sess2, file_01, sizeof(file_01),
1528 TEE_DATA_FLAG_ACCESS_READ, &obj2, storage_id)))
1529 goto clean;
1530
1531 if (storage_id == TEE_STORAGE_PRIVATE_REE) {
1532 /*
1533 * When the storage backend is the REE filesystem, we can
1534 * simulate a hack attempt by renaming the TA storage. Should
1535 * be detected by the TEE.
1536 */
1537 if (rename_data_dir(&uuid, &uuid2) < 0)
1538 goto clean;
1539
1540 /* TA #2 tries to open the object created by TA #1 */
1541 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_CORRUPT_OBJECT,
1542 fs_open(&sess2, file_01, sizeof(file_01),
1543 TEE_DATA_FLAG_ACCESS_READ, &obj2, storage_id));
1544 /*
1545 * At this point, the TEE is expected to have removed the
1546 * corrupt object, so there is no need to try and restore the
1547 * directory name.
1548 */
1549 goto exit;
1550 }
1551
1552clean:
1553 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1554exit:
1555 TEEC_CloseSession(&sess2);
1556exit2:
1557 TEEC_CloseSession(&sess);
1558}
1559
1560DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6015)
1561
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001562
1563struct test_6016_thread_arg {
1564 ADBG_Case_t *case_t;
1565 uint32_t storage_id;
Jerome Forissier54cfbef2016-08-31 18:34:31 +02001566 char file_name[8];
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001567 TEEC_Session session;
1568};
1569
1570static void *test_6016_thread(void *arg)
1571{
1572 struct test_6016_thread_arg *a = arg;
1573 TEEC_Session sess = a->session;
1574 uint32_t obj;
1575 uint8_t out[10] = { 0 };
1576 uint32_t count;
1577
1578 /* create */
1579 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1580 fs_create(&sess, a->file_name, sizeof(a->file_name),
1581 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
1582 sizeof(data_01), &obj, a->storage_id)))
1583 goto exit;
1584
1585 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1586 goto exit;
1587
1588 /* write new data */
1589 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1590 fs_open(&sess, a->file_name, sizeof(a->file_name),
1591 TEE_DATA_FLAG_ACCESS_WRITE, &obj, a->storage_id)))
1592 goto exit;
1593
1594 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1595 fs_write(&sess, obj, data_00, sizeof(data_00))))
1596 goto exit;
1597
1598 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1599 goto exit;
1600
1601 /* verify */
1602 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1603 fs_open(&sess, a->file_name, sizeof(a->file_name),
1604 TEE_DATA_FLAG_ACCESS_READ |
1605 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, a->storage_id)))
1606 goto exit;
1607
1608 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1609 fs_read(&sess, obj, out, 10, &count)))
1610 goto exit;
1611
1612 (void)ADBG_EXPECT_BUFFER(a->case_t, data_00, 10, out, count);
1613
1614 /* clean */
1615 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_unlink(&sess, obj)))
1616 goto exit;
1617
1618exit:
1619 return NULL;
1620}
1621
1622
1623#define NUM_THREADS 4
1624static void xtest_tee_test_6016_loop(ADBG_Case_t *c, uint32_t storage_id)
1625{
1626 size_t num_threads = NUM_THREADS;
1627 struct test_6016_thread_arg arg[num_threads];
1628 pthread_t thr[num_threads];
1629 uint32_t orig;
1630 size_t i;
1631 size_t n = 0;
1632 size_t m;
1633
1634 memset(arg, 0, sizeof(arg));
1635
1636 for (m = 0; m < num_threads; m++)
1637 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1638 xtest_teec_open_session(&arg[m].session,
1639 &storage_ta_uuid, NULL, &orig)))
1640 goto out;
1641
1642 for (n = 0; n < num_threads; n++) {
1643 arg[n].case_t = c;
1644 arg[n].storage_id = storage_id;
Jerome Forissiercb10f832016-09-01 14:53:05 +02001645 snprintf(arg[n].file_name, sizeof(arg[n].file_name),
Jens Wiklander2b1c11d2016-09-16 14:58:41 +02001646 "file_%zu", n);
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001647 if (!ADBG_EXPECT(c, 0, pthread_create(thr + n, NULL,
1648 test_6016_thread, arg + n)))
1649 goto out;
1650 }
1651
1652out:
1653 for (i = 0; i < n; i++)
1654 ADBG_EXPECT(c, 0, pthread_join(thr[i], NULL));
1655 for (i = 0; i < m; i++)
1656 TEEC_CloseSession(&arg[i].session);
1657}
1658
1659/* concurency */
1660static void xtest_tee_test_6016_single(ADBG_Case_t *c, uint32_t storage_id)
1661{
1662 int i;
1663 int loops = 8;
1664
1665 Do_ADBG_Log(" threads: %d, loops: %d", NUM_THREADS, loops);
1666 for (i = 0; i < loops; i++)
1667 xtest_tee_test_6016_loop(c, storage_id);
1668}
1669
Jerome Forissierefd71d32016-09-13 15:09:33 +02001670DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6016)
Jerome Forissier327672c2016-09-01 18:34:11 +02001671
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001672static void xtest_tee_test_6017_single(ADBG_Case_t *c, uint32_t storage_id)
1673{
1674 TEEC_Session sess;
1675 TEE_ObjectInfo obj_info1;
1676 TEE_ObjectInfo obj_info2;
1677 uint32_t obj;
1678 uint32_t orig;
1679
1680 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1681 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1682 return;
1683
1684 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1685 fs_create(&sess, file_01, sizeof(file_01),
1686 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1687 0, &obj, storage_id)))
1688 goto exit;
1689
1690 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1691 fs_write(&sess, obj, data_00, sizeof(data_00))))
1692 goto exit;
1693
1694 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1695 fs_get_obj_info(&sess, obj, &obj_info1,
1696 sizeof(TEE_ObjectInfo))))
1697 goto exit;
1698
1699 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1700 goto exit;
1701
1702 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1703 fs_open(&sess, file_01, sizeof(file_01),
1704 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1705 goto exit;
1706
1707 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1708 fs_get_obj_info(&sess, obj, &obj_info2,
1709 sizeof(TEE_ObjectInfo))))
1710 goto exit;
1711
1712 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1713 obj_info1.dataSize, ==, obj_info2.dataSize))
1714 goto exit;
1715
1716 /* clean */
1717 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1718 goto exit;
1719
1720exit:
1721 TEEC_CloseSession(&sess);
1722}
1723
1724DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6017)
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001725
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001726ADBG_CASE_DEFINE(XTEST_TEE_6001, xtest_tee_test_6001,
1727 "Test TEE_CreatePersistentObject");
1728ADBG_CASE_DEFINE(XTEST_TEE_6002, xtest_tee_test_6002,
1729 "Test TEE_OpenPersistentObject");
1730ADBG_CASE_DEFINE(XTEST_TEE_6003, xtest_tee_test_6003,
1731 "Test TEE_ReadObjectData");
1732ADBG_CASE_DEFINE(XTEST_TEE_6004, xtest_tee_test_6004,
1733 "Test TEE_WriteObjectData");
1734ADBG_CASE_DEFINE(XTEST_TEE_6005, xtest_tee_test_6005,
1735 "Test TEE_SeekObjectData");
1736ADBG_CASE_DEFINE(XTEST_TEE_6006, xtest_tee_test_6006,
1737 "Test TEE_CloseAndDeletePersistentObject");
1738ADBG_CASE_DEFINE(XTEST_TEE_6007, xtest_tee_test_6007,
1739 "Test TEE_TruncateObjectData");
1740ADBG_CASE_DEFINE(XTEST_TEE_6008, xtest_tee_test_6008,
1741 "Test TEE_RenamePersistentObject");
1742ADBG_CASE_DEFINE(XTEST_TEE_6009, xtest_tee_test_6009,
1743 "Test TEE Internal API Persistent Object Enumeration Functions");
1744ADBG_CASE_DEFINE(XTEST_TEE_6010, xtest_tee_test_6010, "Test Storage");
Pascal Brand8a74e362015-09-10 12:41:52 +02001745
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001746#ifdef WITH_GP_TESTS
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001747ADBG_CASE_DEFINE(XTEST_TEE_6011, xtest_tee_test_6011,
1748 "Test TEE GP TTA DS init objects");
Pascal Brand8a74e362015-09-10 12:41:52 +02001749#endif
Pascal Brandeb84c442016-04-19 17:49:49 +02001750
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001751ADBG_CASE_DEFINE(XTEST_TEE_6012, xtest_tee_test_6012,
1752 "Test TEE GP TTA DS init objects");
1753ADBG_CASE_DEFINE(XTEST_TEE_6013, xtest_tee_test_6013,
1754 "Key usage in Persistent objects");
1755ADBG_CASE_DEFINE(XTEST_TEE_6014, xtest_tee_test_6014,
1756 "Loop on Persistent objects");
1757ADBG_CASE_DEFINE(XTEST_TEE_6015, xtest_tee_test_6015, "Storage isolation");
1758ADBG_CASE_DEFINE(XTEST_TEE_6016, xtest_tee_test_6016, "Storage concurency");
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001759ADBG_CASE_DEFINE(XTEST_TEE_6017, xtest_tee_test_6017,
1760 "Test Persistent objects info");