blob: a9ebf29d3dfa5f7e414c044f2bd2a779b1514166 [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
Jens Wiklanderaba31ba2017-02-15 15:24:06 +010082static uint32_t fs_id_for_tee_storage_private(void)
83{
84#if defined(CFG_REE_FS)
85 return TEE_STORAGE_PRIVATE_REE;
86#elif defined(CFG_RPMB_FS)
87 return TEE_STORAGE_PRIVATE_RPMB;
88#elif defined(CFG_SQL_FS)
89 return TEE_STORAGE_PRIVATE_SQL;
90#endif
91}
92
93static uint32_t real_id_for(uint32_t id)
94{
95 if (id == TEE_STORAGE_PRIVATE)
96 return fs_id_for_tee_storage_private();
97 return id;
98}
99
100static bool storage_is(uint32_t id1, uint32_t id2)
101{
102 return (real_id_for(id1) == real_id_for(id2));
103}
104
Pascal Brandc639ac82015-07-02 08:53:34 +0200105static TEEC_Result fs_open(TEEC_Session *sess, void *id, uint32_t id_size,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200106 uint32_t flags, uint32_t *obj, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200107{
Aijun Sun473d9072015-08-06 15:24:49 +0800108 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200109 TEEC_Result res;
110 uint32_t org;
111
112 op.params[0].tmpref.buffer = id;
113 op.params[0].tmpref.size = id_size;
114 op.params[1].value.a = flags;
115 op.params[1].value.b = 0;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200116 op.params[2].value.a = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200117
118 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200119 TEEC_VALUE_INOUT, TEEC_VALUE_INPUT,
Pascal Brandc639ac82015-07-02 08:53:34 +0200120 TEEC_NONE);
121
122 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_OPEN, &op, &org);
123
124 if (res == TEEC_SUCCESS)
125 *obj = op.params[1].value.b;
126
127 return res;
128}
129
130static TEEC_Result fs_create(TEEC_Session *sess, void *id, uint32_t id_size,
131 uint32_t flags, uint32_t attr, void *data,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200132 uint32_t data_size, uint32_t *obj,
133 uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200134{
Aijun Sun473d9072015-08-06 15:24:49 +0800135 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200136 TEEC_Result res;
137 uint32_t org;
138
139 op.params[0].tmpref.buffer = id;
140 op.params[0].tmpref.size = id_size;
141 op.params[1].value.a = flags;
142 op.params[1].value.b = 0;
143 op.params[2].value.a = attr;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200144 op.params[2].value.b = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200145 op.params[3].tmpref.buffer = data;
146 op.params[3].tmpref.size = data_size;
147
148 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
149 TEEC_VALUE_INOUT, TEEC_VALUE_INPUT,
150 TEEC_MEMREF_TEMP_INPUT);
151
152 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CREATE, &op, &org);
153
154 if (res == TEEC_SUCCESS)
155 *obj = op.params[1].value.b;
156
157 return res;
158}
159
Pascal Brandeb84c442016-04-19 17:49:49 +0200160static TEEC_Result fs_create_overwrite(TEEC_Session *sess, void *id,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200161 uint32_t id_size, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +0200162{
163 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
164 TEEC_Result res;
165 uint32_t org;
166
167 op.params[0].tmpref.buffer = id;
168 op.params[0].tmpref.size = id_size;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200169 op.params[1].value.a = storage_id;
Pascal Brandeb84c442016-04-19 17:49:49 +0200170
171 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200172 TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brandeb84c442016-04-19 17:49:49 +0200173 TEEC_NONE);
174
175 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CREATE_OVERWRITE, &op, &org);
176
177 return res;
178}
179
Pascal Brandc639ac82015-07-02 08:53:34 +0200180static TEEC_Result fs_close(TEEC_Session *sess, uint32_t obj)
181{
Aijun Sun473d9072015-08-06 15:24:49 +0800182 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200183 uint32_t org;
184
185 op.params[0].value.a = obj;
186
187 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
188 TEEC_NONE, TEEC_NONE);
189
190 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CLOSE, &op, &org);
191}
192
193static TEEC_Result fs_read(TEEC_Session *sess, uint32_t obj, void *data,
194 uint32_t data_size, uint32_t *count)
195{
196 TEEC_Result res;
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_OUTPUT,
206 TEEC_VALUE_INOUT, TEEC_NONE,
207 TEEC_NONE);
208
209 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_READ, &op, &org);
210
211 if (res == TEEC_SUCCESS)
212 *count = op.params[1].value.b;
213
214 return res;
215}
216
217static TEEC_Result fs_write(TEEC_Session *sess, uint32_t obj, void *data,
218 uint32_t data_size)
219{
Aijun Sun473d9072015-08-06 15:24:49 +0800220 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200221 uint32_t org;
222
223 op.params[0].tmpref.buffer = data;
224 op.params[0].tmpref.size = data_size;
225 op.params[1].value.a = obj;
226 op.params[1].value.b = 0;
227
228 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
229 TEEC_VALUE_INPUT, TEEC_NONE,
230 TEEC_NONE);
231
232 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_WRITE, &op, &org);
233}
234
235static TEEC_Result fs_seek(TEEC_Session *sess, uint32_t obj, int32_t offset,
236 int32_t whence)
237{
Aijun Sun473d9072015-08-06 15:24:49 +0800238 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200239 uint32_t org;
240
241 op.params[0].value.a = obj;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200242 op.params[0].value.b = *(uint32_t *)&offset;
Pascal Brandc639ac82015-07-02 08:53:34 +0200243 op.params[1].value.a = whence;
244
245 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INOUT,
246 TEEC_NONE, TEEC_NONE);
247
248 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_SEEK, &op, &org);
249}
250
251static TEEC_Result fs_unlink(TEEC_Session *sess, uint32_t obj)
252{
Aijun Sun473d9072015-08-06 15:24:49 +0800253 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200254 uint32_t org;
255
256 op.params[0].value.a = obj;
257
258 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
259 TEEC_NONE, TEEC_NONE);
260
261 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_UNLINK, &op, &org);
262}
263
264static TEEC_Result fs_trunc(TEEC_Session *sess, uint32_t obj, uint32_t len)
265{
Aijun Sun473d9072015-08-06 15:24:49 +0800266 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200267 uint32_t org;
268
269 op.params[0].value.a = obj;
270 op.params[0].value.b = len;
271
272 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
273 TEEC_NONE, TEEC_NONE);
274
275 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_TRUNC, &op, &org);
276}
277
278static TEEC_Result fs_rename(TEEC_Session *sess, uint32_t obj, void *id,
279 uint32_t id_size)
280{
Aijun Sun473d9072015-08-06 15:24:49 +0800281 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200282 uint32_t org;
283
284 op.params[0].value.a = obj;
285 op.params[1].tmpref.buffer = id;
286 op.params[1].tmpref.size = id_size;
287
288 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
289 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
290 TEEC_NONE);
291
292 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RENAME, &op, &org);
293}
294
295static TEEC_Result fs_alloc_enum(TEEC_Session *sess, uint32_t *e)
296{
297 TEEC_Result res;
Aijun Sun473d9072015-08-06 15:24:49 +0800298 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200299 uint32_t org;
300
301 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE,
302 TEEC_NONE, TEEC_NONE);
303
304 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_ALLOC_ENUM, &op, &org);
305
306 if (res == TEEC_SUCCESS)
307 *e = op.params[0].value.a;
308
309 return res;
310}
311
Jerome Forissier5d969d82017-03-21 10:01:04 +0100312static TEEC_Result fs_reset_enum(TEEC_Session *sess, uint32_t e)
313{
314 TEEC_Result res;
315 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
316 uint32_t org;
317
318 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
319 TEEC_NONE, TEEC_NONE);
320
321 op.params[0].value.a = e;
322 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESET_ENUM, &op, &org);
323
324 return res;
325}
326
Pascal Brandc639ac82015-07-02 08:53:34 +0200327static TEEC_Result fs_free_enum(TEEC_Session *sess, uint32_t e)
328{
Aijun Sun473d9072015-08-06 15:24:49 +0800329 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200330 uint32_t org;
331
332 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
333 TEEC_NONE);
334
335 op.params[0].value.a = e;
336
337 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_FREE_ENUM, &op, &org);
338}
339
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200340static TEEC_Result fs_start_enum(TEEC_Session *sess, uint32_t e,
341 uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200342{
Aijun Sun473d9072015-08-06 15:24:49 +0800343 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200344 uint32_t org;
345
346 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
347 TEEC_NONE, TEEC_NONE);
348
349 op.params[0].value.a = e;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200350 op.params[0].value.b = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200351
352 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_START_ENUM, &op, &org);
353}
354
355static TEEC_Result fs_next_enum(TEEC_Session *sess, uint32_t e, void *obj_info,
356 size_t info_size, void *id, uint32_t id_size)
357{
Aijun Sun473d9072015-08-06 15:24:49 +0800358 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Pascal Brandc639ac82015-07-02 08:53:34 +0200359 uint32_t org;
360
Pascal Brandc603e0d2016-04-25 12:37:18 +0200361 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brandc639ac82015-07-02 08:53:34 +0200362 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
Pascal Brandc603e0d2016-04-25 12:37:18 +0200363 if (obj_info && info_size)
364 op.paramTypes |= (TEEC_MEMREF_TEMP_OUTPUT << 4);
Pascal Brandc639ac82015-07-02 08:53:34 +0200365
366 op.params[0].value.a = e;
367 op.params[1].tmpref.buffer = obj_info;
368 op.params[1].tmpref.size = info_size;
369 op.params[2].tmpref.buffer = id;
370 op.params[2].tmpref.size = id_size;
371
372 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_NEXT_ENUM, &op, &org);
373}
374
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200375static TEEC_Result fs_restrict_usage(TEEC_Session *sess, uint32_t obj,
376 uint32_t obj_usage)
377{
378 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
379 uint32_t org;
380
381 op.params[0].value.a = obj;
382 op.params[0].value.b = obj_usage;
383
384 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
385 TEEC_NONE, TEEC_NONE);
386
387 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESTRICT_USAGE,
388 &op, &org);
389}
390
391static TEEC_Result fs_alloc_obj(TEEC_Session *sess, uint32_t obj_type,
392 uint32_t max_key_size, uint32_t *obj)
393{
394 TEEC_Result res;
395 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
396 uint32_t org;
397
398 op.params[0].value.a = obj_type;
399 op.params[0].value.b = max_key_size;
400
401 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
402 TEEC_NONE, TEEC_NONE);
403
404 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_ALLOC_OBJ, &op, &org);
405 *obj = op.params[1].value.a;
406 return res;
407}
408
409static TEEC_Result fs_free_obj(TEEC_Session *sess, uint32_t obj)
410{
411 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
412 uint32_t org;
413
414 op.params[0].value.a = obj;
415
416 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
417 TEEC_NONE, TEEC_NONE);
418
419 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_FREE_OBJ, &op, &org);
420}
421
422static TEEC_Result fs_reset_obj(TEEC_Session *sess, uint32_t obj)
423{
424 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
425 uint32_t org;
426
427 op.params[0].value.a = obj;
428
429 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
430 TEEC_NONE, TEEC_NONE);
431
432 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESET_OBJ, &op, &org);
433}
434
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800435static TEEC_Result fs_get_obj_info(TEEC_Session *sess, uint32_t obj,
436 void *obj_info, size_t info_size)
437{
438 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
439 uint32_t org;
440
441 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
442 TEEC_MEMREF_TEMP_OUTPUT,
443 TEEC_NONE, TEEC_NONE);
444
445 op.params[0].value.a = obj;
446 op.params[1].tmpref.buffer = obj_info;
447 op.params[1].tmpref.size = info_size;
448
449 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_GET_OBJ_INFO, &op, &org);
450}
451
James Kung98c0ba12015-09-09 15:51:59 +0800452/* trunc */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200453static void test_truncate_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800454{
455 TEEC_Session sess;
456 uint32_t obj;
457 uint8_t out[10] = { 0 };
458 uint32_t count;
459 uint32_t orig;
460
461 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
462 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
463 return;
464
465 /* create */
466 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
467 fs_create(&sess, file_01, sizeof(file_01),
468 TEE_DATA_FLAG_ACCESS_WRITE |
469 TEE_DATA_FLAG_ACCESS_READ |
470 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200471 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800472 goto exit;
473
474 /* trunc */
475 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 10)))
476 goto exit;
477
478 /* seek */
479 if (!ADBG_EXPECT_TEEC_SUCCESS(
480 c, fs_seek(&sess, obj, 5, TEE_DATA_SEEK_SET)))
481 goto exit;
482
483 /* verify */
484 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
485 goto exit;
486
487 /* check buffer */
488 (void)ADBG_EXPECT_BUFFER(c, &data_00[5], 5, out, count);
489
490 /* clean */
491 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
492 goto exit;
493
494exit:
495 TEEC_CloseSession(&sess);
496}
497
498/* extend */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200499static void test_extend_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800500{
501 TEEC_Session sess;
502 uint32_t obj;
503 uint8_t out[10] = { 0 };
504 uint8_t expect[10] = { 0 };
505 uint32_t count;
506 uint32_t orig;
507
508 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
509 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
510 return;
511
512 /* create */
513 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
514 fs_create(&sess, file_01, sizeof(file_01),
515 TEE_DATA_FLAG_ACCESS_WRITE |
516 TEE_DATA_FLAG_ACCESS_READ |
517 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200518 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800519 goto exit;
520
521 /* extend */
522 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 40)))
523 goto exit;
524
525 /* seek */
526 if (!ADBG_EXPECT_TEEC_SUCCESS(
527 c, fs_seek(&sess, obj, 30, TEE_DATA_SEEK_SET)))
528 goto exit;
529
530 /* verify */
531 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
532 goto exit;
533
534 /* check buffer */
535 expect[0] = data_00[30];
536 expect[1] = data_00[31];
537 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
538
539 /* clean */
540 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
541 goto exit;
542
543exit:
544 TEEC_CloseSession(&sess);
545}
546
547/* file hole */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200548static void test_file_hole(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800549{
550 TEEC_Session sess;
551 uint32_t obj;
552 uint8_t out[10] = { 0 };
553 uint8_t expect[10] = { 0 };
554 uint32_t count;
555 uint32_t orig;
556
557 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
558 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
559 return;
560
561 /* create */
562 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
563 fs_create(&sess, file_01, sizeof(file_01),
564 TEE_DATA_FLAG_ACCESS_WRITE |
565 TEE_DATA_FLAG_ACCESS_READ |
566 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200567 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800568 goto exit;
569
570 /* seek */
571 if (!ADBG_EXPECT_TEEC_SUCCESS(
572 c, fs_seek(&sess, obj, 80, TEE_DATA_SEEK_SET)))
573 goto exit;
574
575 /* write */
576 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_write(&sess, obj, data_00,
577 sizeof(data_00))))
578 goto exit;
579
580 /* seek */
581 if (!ADBG_EXPECT_TEEC_SUCCESS(
582 c, fs_seek(&sess, obj, 74, 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[6] = data_00[0];
591 expect[7] = data_00[1];
592 expect[8] = data_00[2];
593 expect[9] = data_00[3];
594 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
595
596 /* clean */
597 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
598 goto exit;
599
600exit:
601 TEEC_CloseSession(&sess);
602}
603
Jerome Forissiere3688342015-09-24 10:45:17 -0700604#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +0200605static TEEC_Result ds_seek_obj_inv_handle(TEEC_Session *sess)
606{
607 TEEC_Operation op;
608 uint32_t org;
609
610 op.paramTypes = TEEC_PARAM_TYPES(
611 TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
612
613 op.params[0].value.a = CASE_DATA_OBJECT_NOT_PERSISTENT;
614
615 return TEEC_InvokeCommand(
616 sess, CMD_SeekObjectData_panic, &op, &org);
617}
618
Pascal Brand8a74e362015-09-10 12:41:52 +0200619static TEEC_Result ds_seek_gp(
620 TEEC_Session *sess, TEE_Whence wh, uint32_t wh_off, uint32_t set_off,
621 void *in, size_t in_size, void *out, size_t out_size)
622{
623 TEEC_Operation op;
624 uint32_t org;
625
626 op.paramTypes = TEEC_PARAM_TYPES(
627 TEEC_VALUE_INPUT, TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT,
628 TEEC_MEMREF_TEMP_OUTPUT);
629
630 op.params[0].value.a = wh;
631 op.params[0].value.b = wh_off;
632 op.params[1].value.a = set_off;
633 op.params[2].tmpref.buffer = in;
634 op.params[2].tmpref.size = in_size;
635 op.params[3].tmpref.buffer = out;
636 op.params[3].tmpref.size = out_size;
637
638 return TEEC_InvokeCommand(sess, CMD_SeekWriteReadObjectData, &op, &org);
639}
640
641static TEEC_Result ds_init_object_and_attributes(TEEC_Session *sess,
642 uint32_t obj_type, uint32_t obj_size, const void *attr_meta,
643 size_t attr_meta_len, const void *attr_data, size_t attr_data_len,
644 uint32_t option)
645{
646 TEEC_Operation op;
647 uint32_t org;
648
649 op.paramTypes = TEEC_PARAM_TYPES(
650 TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT,
651 TEEC_MEMREF_TEMP_INPUT, TEEC_VALUE_INPUT);
652
653 op.params[0].value.a = obj_type;
654 op.params[0].value.b = obj_size;
655 op.params[1].tmpref.buffer = (void *)attr_meta;
656 op.params[1].tmpref.size = attr_meta_len;
657 op.params[2].tmpref.buffer = (void *)attr_data;
658 op.params[2].tmpref.size = attr_data_len;
659 op.params[3].value.a = option;
660
661 return TEEC_InvokeCommand(sess, CMD_InitObjectAndAttributes, &op, &org);
662}
663
664static TEEC_Result ds_rename_access_conflict(TEEC_Session *sess)
665{
666 TEEC_Operation op;
667 uint32_t org;
668
669 op.paramTypes = TEEC_PARAM_TYPES(
670 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
671
672 return TEEC_InvokeCommand(
673 sess, CMD_RenamePersistentObject_AccessConflict, &op, &org);
674}
675
676static TEEC_Result ds_start_enum_no_item(TEEC_Session *sess)
677{
678 TEEC_Operation op;
679 uint32_t org;
680 TEEC_Result res;
681
682 op.paramTypes = TEEC_PARAM_TYPES(
683 TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
684
685 res = TEEC_InvokeCommand(
686 sess, CMD_StartNGetPersistentObjectEnumerator_itemNotFound, &op, &org);
687
688 if (res != TEEC_SUCCESS)
689 return res;
690
691 if (op.params[0].value.a != 0 || op.params[0].value.b != 0)
692 return TEEC_ERROR_GENERIC;
693
694 return res;
695}
696
697static TEEC_Result ds_rename_success(TEEC_Session *sess)
698{
699 TEEC_Operation op;
700 uint32_t org;
701
702 op.paramTypes = TEEC_PARAM_TYPES(
703 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
704
705 return TEEC_InvokeCommand(
706 sess, CMD_RenamePersistentObject_Success, &op, &org);
707}
708
709static TEEC_Result ds_null_close_free_reset(TEEC_Session *sess)
710{
711 TEEC_Operation op;
712 uint32_t org;
713
714 op.paramTypes = TEEC_PARAM_TYPES(
715 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
716
717 return TEEC_InvokeCommand(
718 sess, CMD_CloseFreeAndResetObjectSuccessHandleNull, &op, &org);
719}
720#endif
721
Pascal Brandc639ac82015-07-02 08:53:34 +0200722/* create */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200723static void xtest_tee_test_6001_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200724{
725 TEEC_Session sess;
726 uint32_t obj;
727 uint32_t orig;
728
729 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
730 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
731 return;
732
733 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
734 fs_create(&sess, file_00, sizeof(file_00),
735 TEE_DATA_FLAG_ACCESS_WRITE |
736 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200737 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200738 goto exit;
739
740 /* clean */
741 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
742 goto exit;
743
744exit:
745 TEEC_CloseSession(&sess);
746}
747
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200748#define DEFINE_TEST_MULTIPLE_STORAGE_IDS(test_name) \
749static void test_name(ADBG_Case_t *c) \
750{ \
751 size_t i; \
752 \
753 for (i = 0; i < ARRAY_SIZE(storage_ids); i++) { \
754 Do_ADBG_BeginSubCase(c, "Storage id: %08x", storage_ids[i]); \
755 test_name##_single(c, storage_ids[i]); \
756 Do_ADBG_EndSubCase(c, "Storage id: %08x", storage_ids[i]); \
757 } \
758}
759
760DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6001)
761
Pascal Brandc639ac82015-07-02 08:53:34 +0200762/* open */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200763static void xtest_tee_test_6002_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200764{
765 TEEC_Session sess;
766 uint32_t obj;
767 uint32_t orig;
768
769 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
770 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
771 return;
772
773 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
774 fs_create(&sess, file_01, sizeof(file_01),
775 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200776 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200777 goto exit;
778
779 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
780 goto exit;
781
782 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
783 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200784 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200785 goto exit;
786
787 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
788 goto exit;
789
790 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
791 fs_open(&sess, file_01, sizeof(file_01),
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 /* clean */
796 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
797 goto exit;
798
799exit:
800 TEEC_CloseSession(&sess);
801}
802
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200803DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6002)
804
Pascal Brandc639ac82015-07-02 08:53:34 +0200805/* read */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200806static void xtest_tee_test_6003_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200807{
808 TEEC_Session sess;
809 uint32_t obj;
810 uint8_t out[10] = { 0 };
811 uint32_t count;
812 uint32_t orig;
813
814 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
815 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
816 return;
817
818 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
819 fs_create(&sess, file_02, sizeof(file_02),
820 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200821 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200822 goto exit;
823
824 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
825 goto exit;
826
827 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
828 fs_open(&sess, file_02, sizeof(file_02),
829 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200830 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200831 goto exit;
832
833 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
834 goto exit;
835
836 (void)ADBG_EXPECT_BUFFER(c, data_01, 10, out, count);
837
838 /* clean */
839 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
840 goto exit;
841
842exit:
843 TEEC_CloseSession(&sess);
844}
845
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200846DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6003)
847
Pascal Brandc639ac82015-07-02 08:53:34 +0200848/* write */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200849static void xtest_tee_test_6004_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200850{
851 TEEC_Session sess;
852 uint32_t obj;
853 uint8_t out[10] = { 0 };
854 uint32_t count;
855 uint32_t orig;
856
857 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
858 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
859 return;
860
861 /* create */
862 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
863 fs_create(&sess, file_02, sizeof(file_02),
864 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200865 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200866 goto exit;
867
868 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
869 goto exit;
870
871 /* write new data */
872 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
873 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200874 TEE_DATA_FLAG_ACCESS_WRITE, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200875 goto exit;
876
877 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
878 fs_write(&sess, obj, data_00, sizeof(data_00))))
879 goto exit;
880
881 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
882 goto exit;
883
884 /* verify */
885 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
886 fs_open(&sess, file_02, sizeof(file_02),
887 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200888 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200889 goto exit;
890
891 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
892 goto exit;
893
894 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
895
896 /* clean */
897 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
898 goto exit;
899
900exit:
901 TEEC_CloseSession(&sess);
902}
903
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200904DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6004)
905
Pascal Brandc639ac82015-07-02 08:53:34 +0200906/* seek */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200907static void xtest_tee_test_6005_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200908{
909 TEEC_Session sess;
910 uint32_t obj;
911 uint8_t out[10] = { 0 };
912 uint32_t count;
913 uint32_t orig;
914
915 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
916 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
917 return;
918
919 /* create */
920 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
921 fs_create(&sess, file_01, sizeof(file_01),
922 TEE_DATA_FLAG_ACCESS_WRITE |
923 TEE_DATA_FLAG_ACCESS_READ |
924 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200925 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200926 goto exit;
927
928 /* seek */
929 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
930 fs_seek(&sess, obj, 10, TEE_DATA_SEEK_SET)))
931 goto exit;
932
933 /* verify */
934 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
935 goto exit;
936
937 (void)ADBG_EXPECT_BUFFER(c, &data_00[10], 10, out, count);
938
939 /* clean */
940 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
941 goto exit;
942
943exit:
944 TEEC_CloseSession(&sess);
945}
946
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200947DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6005)
948
Pascal Brandc639ac82015-07-02 08:53:34 +0200949/* unlink */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200950static void xtest_tee_test_6006_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200951{
952 TEEC_Session sess;
953 uint32_t obj;
954 uint32_t orig;
955
956 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
957 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
958 return;
959
960 /* create */
961 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
962 fs_create(&sess, file_01, sizeof(file_01),
963 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200964 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200965 goto exit;
966
967 /* del & close */
968 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
969 goto exit;
970
971 /* check result */
972 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
973 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200974 TEE_DATA_FLAG_ACCESS_READ, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200975 goto exit;
976
977exit:
978 TEEC_CloseSession(&sess);
979}
980
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200981DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6006)
982
983static void xtest_tee_test_6007_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200984{
James Kung98c0ba12015-09-09 15:51:59 +0800985 Do_ADBG_BeginSubCase(c, "Test truncate file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200986 test_truncate_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +0800987 Do_ADBG_EndSubCase(c, "Test truncate file length");
Pascal Brandc639ac82015-07-02 08:53:34 +0200988
James Kung98c0ba12015-09-09 15:51:59 +0800989 Do_ADBG_BeginSubCase(c, "Test extend file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200990 test_extend_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +0800991 Do_ADBG_EndSubCase(c, "Test extend file length");
Pascal Brandc639ac82015-07-02 08:53:34 +0200992
James Kung98c0ba12015-09-09 15:51:59 +0800993 Do_ADBG_BeginSubCase(c, "Test file hole");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200994 test_file_hole(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +0800995 Do_ADBG_EndSubCase(c, "Test file hole");
Pascal Brandc639ac82015-07-02 08:53:34 +0200996}
997
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200998DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6007)
999
1000static void xtest_tee_test_6008_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001001{
1002 TEEC_Session sess;
1003 uint32_t obj;
1004 uint8_t out[10] = { 0 };
1005 uint32_t count;
1006 uint32_t orig;
1007
1008 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1009 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1010 return;
1011
1012 /* create */
1013 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1014 fs_create(&sess, file_02, sizeof(file_02),
1015 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001016 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001017 goto exit;
1018
1019 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1020 goto exit;
1021
1022 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1023 fs_open(&sess, file_02, sizeof(file_02),
1024 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001025 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001026 goto exit;
1027
1028 /* write new data */
1029 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1030 fs_write(&sess, obj, data_00, sizeof(data_00))))
1031 goto exit;
1032
1033 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1034 fs_rename(&sess, obj, file_03, sizeof(file_03))))
1035 goto exit;
1036
1037 /* close */
1038 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1039 goto exit;
1040
1041 /* verify */
1042 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1043 fs_open(&sess, file_03, sizeof(file_03),
1044 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001045 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001046 goto exit;
1047
1048 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1049 goto exit;
1050
1051 /* check buffer */
1052 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
1053
1054 /* clean */
1055 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1056 goto exit;
1057
1058exit:
1059 TEEC_CloseSession(&sess);
1060}
1061
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001062DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6008)
1063
1064static void xtest_tee_test_6009_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001065{
1066 TEEC_Session sess;
1067 uint32_t obj0;
1068 uint32_t obj1;
1069 uint32_t obj2;
1070 uint32_t e = 0;
1071 uint8_t info[200];
1072 uint8_t id[200];
1073 uint32_t orig;
1074
1075 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1076 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1077 return;
1078
1079 /* create file 00 */
1080 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1081 fs_create(&sess, file_00, sizeof(file_00),
1082 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001083 sizeof(data_01), &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001084 goto exit;
1085
1086 /* create file 01 */
1087 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1088 fs_create(&sess, file_01, sizeof(file_01),
1089 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001090 sizeof(data_01), &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001091 goto exit;
1092
1093 /* create file 02 */
1094 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1095 fs_create(&sess, file_02, sizeof(file_02),
1096 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001097 sizeof(data_01), &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001098 goto exit;
1099
1100 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj0)))
1101 goto exit;
1102
1103 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj1)))
1104 goto exit;
1105
1106 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj2)))
1107 goto exit;
1108
1109 /* iterate */
1110 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e)))
1111 goto exit;
1112
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001113 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_start_enum(&sess, e, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001114 goto exit;
1115
1116 /* get 00 */
1117 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1118 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1119 goto exit;
1120
1121 /* get 01 */
1122 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc603e0d2016-04-25 12:37:18 +02001123 fs_next_enum(&sess, e, NULL, 0, id, sizeof(id))))
Pascal Brandc639ac82015-07-02 08:53:34 +02001124 goto exit;
1125
1126 /* get 02 */
1127 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1128 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1129 goto exit;
1130
1131 /* we should not have more files */
1132 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1133 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1134 goto exit;
1135
1136 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e)))
1137 goto exit;
1138
1139 /* clean */
1140 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1141 fs_open(&sess, file_00, sizeof(file_00),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001142 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001143 goto exit;
1144
1145 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj0)))
1146 goto exit;
1147
1148 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1149 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001150 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001151 goto exit;
1152
1153 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj1)))
1154 goto exit;
1155
1156 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1157 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001158 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001159 goto exit;
1160
1161 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj2)))
1162 goto exit;
1163
1164exit:
1165 TEEC_CloseSession(&sess);
1166}
1167
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001168DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6009)
1169
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001170static void xtest_tee_test_6010_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand8a74e362015-09-10 12:41:52 +02001171{
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001172 TEEC_Session sess;
1173 uint32_t orig;
1174 uint32_t o1;
1175 uint32_t o2;
1176 uint32_t e;
1177 uint32_t f;
1178 uint8_t data[1024];
1179 uint8_t out[1024];
1180 uint32_t n;
Pascal Brand30844922015-09-17 12:12:42 +02001181
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001182 for (n = 0; n < ARRAY_SIZE(data); n++)
1183 data[n] = n;
Pascal Brand8a74e362015-09-10 12:41:52 +02001184
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001185 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1186 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1187 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001188
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001189 Do_ADBG_BeginSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001190
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001191 o1 = TEE_HANDLE_NULL;
1192 o2 = TEE_HANDLE_NULL;
1193 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1194 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1195 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
Pascal Brand8a74e362015-09-10 12:41:52 +02001196
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001197 ADBG_EXPECT_TEEC_SUCCESS(c,
1198 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1199 sizeof(data), &o1, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001200
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001201 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE;
1202 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ACCESS_CONFLICT,
1203 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1204 sizeof(data), &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001205
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001206 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1207 if (o2)
1208 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
Pascal Brand8a74e362015-09-10 12:41:52 +02001209
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001210 Do_ADBG_EndSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001211
Pascal Brand8a74e362015-09-10 12:41:52 +02001212
Pascal Brand8a74e362015-09-10 12:41:52 +02001213
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001214 Do_ADBG_BeginSubCase(c, "RestrictObjectUsage Panic");
1215 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1216 fs_restrict_usage(&sess, 0xffffbad0, 0xffffffff));
1217 Do_ADBG_EndSubCase(c, "RestrictObjectUsage Panic");
Pascal Brand8a74e362015-09-10 12:41:52 +02001218
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001219 TEEC_CloseSession(&sess);
1220 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1221 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1222 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001223
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001224 Do_ADBG_BeginSubCase(c, "SeekObjectData BadHandle");
1225 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1226 fs_seek(&sess, 0xffffbad0, 5, TEE_DATA_SEEK_SET));
1227 Do_ADBG_EndSubCase(c, "SeekObjectData BadHandle");
Pascal Brand8a74e362015-09-10 12:41:52 +02001228
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001229 TEEC_CloseSession(&sess);
1230 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1231 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1232 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001233
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001234 Do_ADBG_BeginSubCase(c, "SeekObjectData NotPersist");
1235 o1 = 0;
1236 ADBG_EXPECT_TEEC_SUCCESS(c,
1237 fs_alloc_obj(&sess, TEE_TYPE_AES, 256, &o1));
1238 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1239 fs_seek(&sess, o1, 5, TEE_DATA_SEEK_SET));
1240 Do_ADBG_EndSubCase(c, "SeekObjectData NotPersist");
Pascal Brand8a74e362015-09-10 12:41:52 +02001241
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001242 TEEC_CloseSession(&sess);
1243 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1244 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1245 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001246
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001247 Do_ADBG_BeginSubCase(c, "SeekWriteRead");
1248 o1 = 0;
1249 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1250 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1251 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1252 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1253 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1254 sizeof(data), &o1, storage_id)))
1255 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001256
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001257 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1258 fs_seek(&sess, o1, 2, TEE_DATA_SEEK_SET)))
1259 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001260
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001261 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1262 fs_seek(&sess, o1, 0, TEE_DATA_SEEK_END)))
1263 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001264
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001265 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1266 fs_write(&sess, o1, data, sizeof(data))))
1267 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001268
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001269 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1270 fs_seek(&sess, o1, sizeof(data), TEE_DATA_SEEK_SET)))
1271 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001272
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001273 memset(out, 0xab, sizeof(out));
1274 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1275 fs_read(&sess, o1, out, sizeof(out), &n)))
1276 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001277
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001278 ADBG_EXPECT_BUFFER(c, data, sizeof(data), out, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001279
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001280 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander3a6892e2016-09-14 15:53:52 +02001281 fs_seek(&sess, o1, 10, TEE_DATA_SEEK_END)))
1282 goto seek_write_read_out;
1283
1284 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1285 fs_read(&sess, o1, out, sizeof(out), &n)))
1286 goto seek_write_read_out;
1287 ADBG_EXPECT_COMPARE_UNSIGNED(c, n, ==, 0);
1288
1289 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001290 fs_seek(&sess, o1, -(int32_t)sizeof(data) / 2,
1291 TEE_DATA_SEEK_END)))
1292 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001293
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001294 memset(out, 0xab, sizeof(out) / 2);
1295 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1296 fs_read(&sess, o1, out, sizeof(out) / 2, &n)))
1297 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001298
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001299 ADBG_EXPECT_BUFFER(c,
1300 data + sizeof(data) / 2, sizeof(data) / 2,
1301 out + sizeof(data) / 2, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001302
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001303seek_write_read_out:
1304 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1305 Do_ADBG_EndSubCase(c, "SeekWriteRead");
Pascal Brand8a74e362015-09-10 12:41:52 +02001306
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001307 Do_ADBG_BeginSubCase(c, "Rename Access Conflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001308
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001309 o1 = TEE_HANDLE_NULL;
1310 o2 = TEE_HANDLE_NULL;
1311 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1312 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1313 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1314 ADBG_EXPECT_TEEC_SUCCESS(c,
1315 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1316 sizeof(data), &o1, storage_id));
1317 ADBG_EXPECT_TEEC_SUCCESS(c,
1318 fs_create(&sess, file_01, sizeof(file_01), f, 0, data,
1319 sizeof(data) / 2, &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001320
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001321 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ACCESS_CONFLICT,
1322 fs_rename(&sess, o2, file_00, sizeof(file_00)));
Pascal Brand8a74e362015-09-10 12:41:52 +02001323
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001324 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1325 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
1326
1327 Do_ADBG_EndSubCase(c, "Rename Access Conflict");
1328
Jerome Forissier5d969d82017-03-21 10:01:04 +01001329 Do_ADBG_BeginSubCase(c, "AllocPersistentObjectEnumerator + "
1330 "ResetPersistentObjectEnumerator");
1331 e = TEE_HANDLE_NULL;
1332 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1333 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_enum(&sess, e));
1334 Do_ADBG_EndSubCase(c, "AllocPersistentObjectEnumerator + "
1335 "ResetPersistentObjectEnumerator");
1336
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001337 Do_ADBG_BeginSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1338 e = TEE_HANDLE_NULL;
1339 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1340 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1341 fs_next_enum(&sess, e, NULL, 0, out, sizeof(out)));
1342 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1343 fs_start_enum(&sess, e, storage_id));
1344 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e));
1345 Do_ADBG_EndSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1346
1347 Do_ADBG_BeginSubCase(c, "RenamePersistent ReadWrite");
1348 o1 = TEE_HANDLE_NULL;
1349 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1350 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1351 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1352 ADBG_EXPECT_TEEC_SUCCESS(c,
1353 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1354 sizeof(data), &o1, storage_id));
1355 ADBG_EXPECT_TEEC_SUCCESS(c,
1356 fs_rename(&sess, o1, file_01, sizeof(file_01)));
1357 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1358 Do_ADBG_EndSubCase(c, "RenamePersistent ReadWrite");
1359
1360 Do_ADBG_BeginSubCase(c, "Close Free Reset Null");
1361 ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, TEE_HANDLE_NULL));
1362 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_obj(&sess, TEE_HANDLE_NULL));
1363 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_obj(&sess, TEE_HANDLE_NULL));
1364 Do_ADBG_EndSubCase(c, "Close Free Reset Null");
1365
1366 TEEC_CloseSession(&sess);
Pascal Brand8a74e362015-09-10 12:41:52 +02001367}
1368
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001369DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6010)
1370
1371#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +02001372static void xtest_tee_test_6011(ADBG_Case_t *c)
1373{
1374 TEEC_Session sess;
1375 uint32_t orig;
1376 /*
1377 * Test data from
1378 * Invoke_InitObjectAndAttributes_TEE_TYPE_AES_success_attribute_
1379 * TEE_ATTR_SECRET_VALUE_correct_size (9d-9a-91)
1380 */
1381 static const uint8_t attr_meta[] = {
13820xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
13830x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
13840x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
13850x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
1386 };
1387 static const uint8_t attr_data[] = {
13880x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,
13890x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,
13900xdf,0xf4,
1391 };
1392
1393 if (!ADBG_EXPECT_TEEC_SUCCESS(
1394 c, xtest_teec_open_session(
1395 &sess, &gp_tta_ds_uuid, NULL, &orig)))
1396 return;
1397
1398 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ds_init_object_and_attributes(&sess,
1399 0xa0000010, 0x100, attr_meta, sizeof(attr_meta), attr_data,
1400 sizeof(attr_data), 0)))
1401 goto exit;
1402
1403exit:
1404 TEEC_CloseSession(&sess);
1405}
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001406#endif /*WITH_GP_TESTS*/
Pascal Brand8a74e362015-09-10 12:41:52 +02001407
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001408static void xtest_tee_test_6012_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +02001409{
1410 TEEC_Session sess;
1411 uint32_t orig;
1412 uint32_t obj;
1413
1414 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1415 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1416 return;
1417
1418 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001419 fs_create_overwrite(&sess, file_04, sizeof(file_04), storage_id)))
Pascal Brandeb84c442016-04-19 17:49:49 +02001420 goto exit;
1421
1422 TEEC_CloseSession(&sess);
1423
1424 /* re-create the same */
1425 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1426 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1427 return;
1428
1429 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001430 fs_create_overwrite(&sess, file_04, sizeof(file_04),
1431 storage_id)))
Pascal Brandeb84c442016-04-19 17:49:49 +02001432 goto exit;
1433
1434 /*
1435 * recreate it with an object, and remove it so that xtest 6009
1436 * can be replayed
1437 */
1438 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1439 fs_create(&sess, file_04, sizeof(file_04),
1440 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001441 TEE_DATA_FLAG_ACCESS_WRITE_META |
1442 TEE_DATA_FLAG_OVERWRITE, 0, NULL, 0, &obj,
1443 storage_id)))
Pascal Brandeb84c442016-04-19 17:49:49 +02001444 goto exit;
1445
1446 /* clean */
1447 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1448 goto exit;
1449
1450exit:
1451 TEEC_CloseSession(&sess);
1452}
1453
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001454DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6012)
1455
1456static void xtest_tee_test_6013_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand90f23352016-05-19 15:15:47 +02001457{
1458 TEEC_Session sess;
1459 uint32_t orig;
1460 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1461
1462 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1463 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1464 return;
1465
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001466 op.params[0].value.a = storage_id;
1467 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand90f23352016-05-19 15:15:47 +02001468 TEEC_NONE, TEEC_NONE);
1469
1470 ADBG_EXPECT_TEEC_SUCCESS(c,
1471 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_KEY_IN_PERSISTENT,
1472 &op, &orig));
1473
1474 TEEC_CloseSession(&sess);
1475}
1476
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001477DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6013)
1478
1479static void xtest_tee_test_6014_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand29ee18f2016-05-23 14:13:56 +02001480{
1481 TEEC_Session sess;
1482 uint32_t orig;
1483 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1484
1485 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1486 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1487 return;
1488
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001489 op.params[0].value.a = storage_id;
1490 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand29ee18f2016-05-23 14:13:56 +02001491 TEEC_NONE, TEEC_NONE);
1492
1493 ADBG_EXPECT_TEEC_SUCCESS(c,
1494 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_LOOP, &op, &orig));
1495
1496 TEEC_CloseSession(&sess);
1497}
1498
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001499DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6014)
1500
Jerome Forissiere3854162016-08-12 12:40:12 +02001501static int get_ta_storage_path(TEEC_UUID *p_uuid, char *buffer, uint32_t len)
1502{
1503 int s;
1504
1505 if (!p_uuid || !buffer)
1506 return -1;
1507
1508 s = snprintf(buffer, len, "/data/tee/");
1509 if (s < 0 || s >= (int)len)
1510 return -1;
1511
1512 len -= s;
1513 buffer += s;
1514
1515 s = ree_fs_get_ta_dirname(p_uuid, buffer, len);
1516 return s;
1517}
1518
1519static int rename_data_dir(TEEC_UUID *old, TEEC_UUID *nw)
1520{
1521 char opath[150];
1522 char npath[150];
1523 int s;
1524
1525 s = get_ta_storage_path(old, opath, sizeof(opath));
1526 if (s < 0 || s >= (int)sizeof(opath)) {
1527 s = -1;
1528 goto exit;
1529 }
1530 s = get_ta_storage_path(nw, npath, sizeof(npath));
1531 if (s < 0 || s >= (int)sizeof(opath)) {
1532 s = -1;
1533 goto exit;
1534 }
1535 s = rename(opath, npath);
1536exit:
1537 if (s < 0)
1538 fprintf(stderr, "Warning: could not rename %s -> %s\n", opath,
1539 npath);
1540 return s;
1541}
1542
1543static void xtest_tee_test_6015_single(ADBG_Case_t *c, uint32_t storage_id)
1544{
1545 TEEC_Session sess;
1546 TEEC_Session sess2;
1547 uint32_t orig;
1548 uint32_t obj;
1549 uint32_t obj2;
1550 TEEC_UUID uuid = TA_STORAGE_UUID;
1551 TEEC_UUID uuid2 = TA_STORAGE2_UUID;
1552
1553 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1554 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1555 return;
1556
1557 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1558 xtest_teec_open_session(&sess2, &storage2_ta_uuid, NULL,
1559 &orig)))
1560 goto exit2;
1561
1562 /* TA #1 creates a persistent object */
1563 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1564 fs_create(&sess, file_01, sizeof(file_01),
1565 TEE_DATA_FLAG_ACCESS_WRITE |
1566 TEE_DATA_FLAG_ACCESS_READ |
1567 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
1568 sizeof(data_00), &obj, storage_id)))
1569 goto exit;
1570
1571 /* TA #2 tries to open the object created by TA #1 */
1572 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1573 fs_open(&sess2, file_01, sizeof(file_01),
1574 TEE_DATA_FLAG_ACCESS_READ, &obj2, storage_id)))
1575 goto clean;
1576
1577 if (storage_id == TEE_STORAGE_PRIVATE_REE) {
1578 /*
1579 * When the storage backend is the REE filesystem, we can
1580 * simulate a hack attempt by renaming the TA storage. Should
1581 * be detected by the TEE.
1582 */
1583 if (rename_data_dir(&uuid, &uuid2) < 0)
1584 goto clean;
1585
1586 /* TA #2 tries to open the object created by TA #1 */
1587 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_CORRUPT_OBJECT,
1588 fs_open(&sess2, file_01, sizeof(file_01),
1589 TEE_DATA_FLAG_ACCESS_READ, &obj2, storage_id));
1590 /*
1591 * At this point, the TEE is expected to have removed the
1592 * corrupt object, so there is no need to try and restore the
1593 * directory name.
1594 */
1595 goto exit;
1596 }
1597
1598clean:
1599 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1600exit:
1601 TEEC_CloseSession(&sess2);
1602exit2:
1603 TEEC_CloseSession(&sess);
1604}
1605
1606DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6015)
1607
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001608
1609struct test_6016_thread_arg {
1610 ADBG_Case_t *case_t;
1611 uint32_t storage_id;
Jerome Forissier54cfbef2016-08-31 18:34:31 +02001612 char file_name[8];
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001613 TEEC_Session session;
1614};
1615
1616static void *test_6016_thread(void *arg)
1617{
1618 struct test_6016_thread_arg *a = arg;
1619 TEEC_Session sess = a->session;
1620 uint32_t obj;
1621 uint8_t out[10] = { 0 };
1622 uint32_t count;
1623
1624 /* create */
1625 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1626 fs_create(&sess, a->file_name, sizeof(a->file_name),
1627 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
1628 sizeof(data_01), &obj, a->storage_id)))
1629 goto exit;
1630
1631 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1632 goto exit;
1633
1634 /* write new data */
1635 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1636 fs_open(&sess, a->file_name, sizeof(a->file_name),
1637 TEE_DATA_FLAG_ACCESS_WRITE, &obj, a->storage_id)))
1638 goto exit;
1639
1640 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1641 fs_write(&sess, obj, data_00, sizeof(data_00))))
1642 goto exit;
1643
1644 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1645 goto exit;
1646
1647 /* verify */
1648 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1649 fs_open(&sess, a->file_name, sizeof(a->file_name),
1650 TEE_DATA_FLAG_ACCESS_READ |
1651 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, a->storage_id)))
1652 goto exit;
1653
1654 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1655 fs_read(&sess, obj, out, 10, &count)))
1656 goto exit;
1657
1658 (void)ADBG_EXPECT_BUFFER(a->case_t, data_00, 10, out, count);
1659
1660 /* clean */
1661 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_unlink(&sess, obj)))
1662 goto exit;
1663
1664exit:
1665 return NULL;
1666}
1667
1668
1669#define NUM_THREADS 4
1670static void xtest_tee_test_6016_loop(ADBG_Case_t *c, uint32_t storage_id)
1671{
1672 size_t num_threads = NUM_THREADS;
1673 struct test_6016_thread_arg arg[num_threads];
1674 pthread_t thr[num_threads];
1675 uint32_t orig;
1676 size_t i;
1677 size_t n = 0;
1678 size_t m;
1679
1680 memset(arg, 0, sizeof(arg));
1681
1682 for (m = 0; m < num_threads; m++)
1683 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1684 xtest_teec_open_session(&arg[m].session,
1685 &storage_ta_uuid, NULL, &orig)))
1686 goto out;
1687
1688 for (n = 0; n < num_threads; n++) {
1689 arg[n].case_t = c;
1690 arg[n].storage_id = storage_id;
Jerome Forissiercb10f832016-09-01 14:53:05 +02001691 snprintf(arg[n].file_name, sizeof(arg[n].file_name),
Jens Wiklander2b1c11d2016-09-16 14:58:41 +02001692 "file_%zu", n);
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001693 if (!ADBG_EXPECT(c, 0, pthread_create(thr + n, NULL,
1694 test_6016_thread, arg + n)))
1695 goto out;
1696 }
1697
1698out:
1699 for (i = 0; i < n; i++)
1700 ADBG_EXPECT(c, 0, pthread_join(thr[i], NULL));
1701 for (i = 0; i < m; i++)
1702 TEEC_CloseSession(&arg[i].session);
1703}
1704
1705/* concurency */
1706static void xtest_tee_test_6016_single(ADBG_Case_t *c, uint32_t storage_id)
1707{
1708 int i;
1709 int loops = 8;
1710
1711 Do_ADBG_Log(" threads: %d, loops: %d", NUM_THREADS, loops);
1712 for (i = 0; i < loops; i++)
1713 xtest_tee_test_6016_loop(c, storage_id);
1714}
1715
Jerome Forissierefd71d32016-09-13 15:09:33 +02001716DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6016)
Jerome Forissier327672c2016-09-01 18:34:11 +02001717
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001718static void xtest_tee_test_6017_single(ADBG_Case_t *c, uint32_t storage_id)
1719{
1720 TEEC_Session sess;
1721 TEE_ObjectInfo obj_info1;
1722 TEE_ObjectInfo obj_info2;
1723 uint32_t obj;
1724 uint32_t orig;
1725
1726 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1727 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1728 return;
1729
1730 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1731 fs_create(&sess, file_01, sizeof(file_01),
1732 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1733 0, &obj, storage_id)))
1734 goto exit;
1735
1736 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1737 fs_write(&sess, obj, data_00, sizeof(data_00))))
1738 goto exit;
1739
1740 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1741 fs_get_obj_info(&sess, obj, &obj_info1,
1742 sizeof(TEE_ObjectInfo))))
1743 goto exit;
1744
1745 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1746 goto exit;
1747
1748 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1749 fs_open(&sess, file_01, sizeof(file_01),
1750 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1751 goto exit;
1752
1753 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1754 fs_get_obj_info(&sess, obj, &obj_info2,
1755 sizeof(TEE_ObjectInfo))))
1756 goto exit;
1757
1758 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1759 obj_info1.dataSize, ==, obj_info2.dataSize))
1760 goto exit;
1761
1762 /* clean */
1763 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1764 goto exit;
1765
1766exit:
1767 TEEC_CloseSession(&sess);
1768}
1769
1770DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6017)
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001771
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001772static void xtest_tee_test_6018_single(ADBG_Case_t *c, uint32_t storage_id)
1773{
1774 TEEC_Session sess;
1775 TEE_ObjectInfo obj_info1;
1776 TEE_ObjectInfo obj_info2;
1777 uint32_t obj;
1778 uint32_t orig;
1779 uint8_t block[32 * 1024];
1780 size_t num_blocks;
1781 size_t block_size;
1782 size_t n;
1783
1784 if (storage_is(storage_id, TEE_STORAGE_PRIVATE_RPMB)) {
1785 /* RPMB FS is a bit resource constrained */
1786 num_blocks = 20;
1787 block_size = 1024;
1788 } else {
Jens Wiklandera3db0502017-03-09 11:39:23 +01001789 num_blocks = 40;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001790 block_size = sizeof(block);
1791 }
1792
1793 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1794 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1795 return;
1796
1797 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1798 fs_create(&sess, file_01, sizeof(file_01),
1799 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1800 0, &obj, storage_id)))
1801 goto exit;
1802
1803 for (n = 0; n < num_blocks; n++) {
1804 memset(block, n, block_size);
1805
1806 Do_ADBG_Log("writing %zu", n);
1807 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1808 fs_write(&sess, obj, block, block_size)))
1809 goto exit;
1810 }
1811
1812 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1813 fs_get_obj_info(&sess, obj, &obj_info1,
1814 sizeof(TEE_ObjectInfo))))
1815 goto exit;
1816
1817 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1818 obj_info1.dataSize, ==, block_size * num_blocks))
1819 goto exit;
1820
1821 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1822 goto exit;
1823
1824 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1825 fs_open(&sess, file_01, sizeof(file_01),
1826 TEE_DATA_FLAG_ACCESS_READ |
1827 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1828 goto exit;
1829
1830 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1831 fs_get_obj_info(&sess, obj, &obj_info2,
1832 sizeof(TEE_ObjectInfo))))
1833 goto exit;
1834
1835 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1836 obj_info1.dataSize, ==, obj_info2.dataSize))
1837 goto exit;
1838
1839 for (n = 0; n < num_blocks; n++) {
1840 uint8_t br[block_size];
1841 uint32_t count;
1842
1843 memset(block, n, block_size);
1844
1845 Do_ADBG_Log("reading %zu", n);
1846 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1847 fs_read(&sess, obj, br, sizeof(br), &count)))
1848 goto exit;
1849 if (!ADBG_EXPECT_BUFFER(c, block, block_size, br, count))
1850 goto exit;
1851 }
1852
1853 /* clean */
1854 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1855 goto exit;
1856
1857exit:
1858 TEEC_CloseSession(&sess);
1859}
1860
1861DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6018)
1862
Jens Wiklander74abfe32017-01-03 14:17:47 +01001863ADBG_CASE_DEFINE(regression, 6001, xtest_tee_test_6001,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001864 "Test TEE_CreatePersistentObject");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001865ADBG_CASE_DEFINE(regression, 6002, xtest_tee_test_6002,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001866 "Test TEE_OpenPersistentObject");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001867ADBG_CASE_DEFINE(regression, 6003, xtest_tee_test_6003,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001868 "Test TEE_ReadObjectData");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001869ADBG_CASE_DEFINE(regression, 6004, xtest_tee_test_6004,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001870 "Test TEE_WriteObjectData");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001871ADBG_CASE_DEFINE(regression, 6005, xtest_tee_test_6005,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001872 "Test TEE_SeekObjectData");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001873ADBG_CASE_DEFINE(regression, 6006, xtest_tee_test_6006,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001874 "Test TEE_CloseAndDeletePersistentObject");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001875ADBG_CASE_DEFINE(regression, 6007, xtest_tee_test_6007,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001876 "Test TEE_TruncateObjectData");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001877ADBG_CASE_DEFINE(regression, 6008, xtest_tee_test_6008,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001878 "Test TEE_RenamePersistentObject");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001879ADBG_CASE_DEFINE(regression, 6009, xtest_tee_test_6009,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001880 "Test TEE Internal API Persistent Object Enumeration Functions");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001881ADBG_CASE_DEFINE(regression, 6010, xtest_tee_test_6010, "Test Storage");
Pascal Brand8a74e362015-09-10 12:41:52 +02001882
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001883#ifdef WITH_GP_TESTS
Jens Wiklander74abfe32017-01-03 14:17:47 +01001884ADBG_CASE_DEFINE(regression, 6011, xtest_tee_test_6011,
1885 "Test TEE GP TTA DS init objects");
Pascal Brand8a74e362015-09-10 12:41:52 +02001886#endif
Pascal Brandeb84c442016-04-19 17:49:49 +02001887
Jens Wiklander74abfe32017-01-03 14:17:47 +01001888ADBG_CASE_DEFINE(regression, 6012, xtest_tee_test_6012,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001889 "Test TEE GP TTA DS init objects");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001890ADBG_CASE_DEFINE(regression, 6013, xtest_tee_test_6013,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001891 "Key usage in Persistent objects");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001892ADBG_CASE_DEFINE(regression, 6014, xtest_tee_test_6014,
Jens Wiklander25a57fe2016-12-26 21:46:24 +01001893 "Loop on Persistent objects");
Jens Wiklander74abfe32017-01-03 14:17:47 +01001894ADBG_CASE_DEFINE(regression, 6015, xtest_tee_test_6015, "Storage isolation");
1895ADBG_CASE_DEFINE(regression, 6016, xtest_tee_test_6016, "Storage concurency");
1896ADBG_CASE_DEFINE(regression, 6017, xtest_tee_test_6017,
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001897 "Test Persistent objects info");
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001898ADBG_CASE_DEFINE(regression, 6018, xtest_tee_test_6018, "Large object");