blob: e49af86da81e15a220122db993d96c2ddb885093 [file] [log] [blame]
Pascal Brandc639ac82015-07-02 08:53:34 +02001/*
2 * Copyright (c) 2014, STMicroelectronics International N.V.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#include <string.h>
15#include <stdio.h>
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +080016#include <pthread.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020017
18#include <adbg.h>
19#include <xtest_test.h>
20#include <xtest_helpers.h>
21
22#include <tee_client_api.h>
23#include <ta_storage.h>
24#include <tee_api_defines.h>
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020025#include <tee_api_defines_extensions.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020026#include <tee_api_types.h>
Jerome Forissiere3688342015-09-24 10:45:17 -070027#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +020028#include <TTA_DS_protocol.h>
29#endif
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020030#include <util.h>
31
Jens Wiklander14f48872018-06-29 15:30:13 +020032#define DEFINE_TEST_MULTIPLE_STORAGE_IDS(test_name) \
33static void test_name(ADBG_Case_t *c) \
34{ \
35 size_t i; \
36 \
37 for (i = 0; i < ARRAY_SIZE(storage_ids); i++) { \
38 Do_ADBG_BeginSubCase(c, "Storage id: %08x", storage_ids[i]); \
39 test_name##_single(c, storage_ids[i]); \
40 Do_ADBG_EndSubCase(c, "Storage id: %08x", storage_ids[i]); \
41 } \
42}
43
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020044static uint32_t storage_ids[] = {
45 TEE_STORAGE_PRIVATE,
46#ifdef CFG_REE_FS
47 TEE_STORAGE_PRIVATE_REE,
48#endif
49#ifdef CFG_RPMB_FS
50 TEE_STORAGE_PRIVATE_RPMB,
51#endif
52};
Pascal Brandc639ac82015-07-02 08:53:34 +020053
54static uint8_t file_00[] = {
55 0x00, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
56 0xF0, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
57 0xE9, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
58 0xF0, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x8E
59};
60
61static uint8_t file_01[] = {
62 0x01, 0x00
63};
64
65static uint8_t file_02[] = {
66 0x02, 0x11, 0x02
67};
68
69static uint8_t file_03[] = {
70 0x03, 0x13, 0x03
71};
72
Pascal Brandeb84c442016-04-19 17:49:49 +020073static uint8_t file_04[] = {
74 0x00, 0x01, 0x02
75};
76
Pascal Brandc639ac82015-07-02 08:53:34 +020077static uint8_t data_00[] = {
78 0x00, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
79 0x00, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
80 0x00, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
81 0x00, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x00
82};
83
84static uint8_t data_01[] = {
85 0x01, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
86 0x01, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
87 0x01, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
88 0x01, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x01
89};
90
Jens Wiklanderaba31ba2017-02-15 15:24:06 +010091static uint32_t fs_id_for_tee_storage_private(void)
92{
93#if defined(CFG_REE_FS)
94 return TEE_STORAGE_PRIVATE_REE;
95#elif defined(CFG_RPMB_FS)
96 return TEE_STORAGE_PRIVATE_RPMB;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +010097#endif
98}
99
100static uint32_t real_id_for(uint32_t id)
101{
102 if (id == TEE_STORAGE_PRIVATE)
103 return fs_id_for_tee_storage_private();
104 return id;
105}
106
107static bool storage_is(uint32_t id1, uint32_t id2)
108{
109 return (real_id_for(id1) == real_id_for(id2));
110}
111
Pascal Brandc639ac82015-07-02 08:53:34 +0200112static TEEC_Result fs_open(TEEC_Session *sess, void *id, uint32_t id_size,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200113 uint32_t flags, uint32_t *obj, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200114{
Aijun Sun473d9072015-08-06 15:24:49 +0800115 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100116 TEEC_Result res = TEEC_ERROR_GENERIC;
117 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200118
119 op.params[0].tmpref.buffer = id;
120 op.params[0].tmpref.size = id_size;
121 op.params[1].value.a = flags;
122 op.params[1].value.b = 0;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200123 op.params[2].value.a = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200124
125 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200126 TEEC_VALUE_INOUT, TEEC_VALUE_INPUT,
Pascal Brandc639ac82015-07-02 08:53:34 +0200127 TEEC_NONE);
128
129 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_OPEN, &op, &org);
130
131 if (res == TEEC_SUCCESS)
132 *obj = op.params[1].value.b;
133
134 return res;
135}
136
137static TEEC_Result fs_create(TEEC_Session *sess, void *id, uint32_t id_size,
138 uint32_t flags, uint32_t attr, void *data,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200139 uint32_t data_size, uint32_t *obj,
140 uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200141{
Aijun Sun473d9072015-08-06 15:24:49 +0800142 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100143 TEEC_Result res = TEEC_ERROR_GENERIC;
144 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200145
146 op.params[0].tmpref.buffer = id;
147 op.params[0].tmpref.size = id_size;
148 op.params[1].value.a = flags;
149 op.params[1].value.b = 0;
150 op.params[2].value.a = attr;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200151 op.params[2].value.b = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200152 op.params[3].tmpref.buffer = data;
153 op.params[3].tmpref.size = data_size;
154
155 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
156 TEEC_VALUE_INOUT, TEEC_VALUE_INPUT,
157 TEEC_MEMREF_TEMP_INPUT);
158
159 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CREATE, &op, &org);
160
161 if (res == TEEC_SUCCESS)
162 *obj = op.params[1].value.b;
163
164 return res;
165}
166
Pascal Brandeb84c442016-04-19 17:49:49 +0200167static TEEC_Result fs_create_overwrite(TEEC_Session *sess, void *id,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200168 uint32_t id_size, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +0200169{
170 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100171 TEEC_Result res = TEEC_ERROR_GENERIC;
172 uint32_t org = 0;
Pascal Brandeb84c442016-04-19 17:49:49 +0200173
174 op.params[0].tmpref.buffer = id;
175 op.params[0].tmpref.size = id_size;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200176 op.params[1].value.a = storage_id;
Pascal Brandeb84c442016-04-19 17:49:49 +0200177
178 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200179 TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brandeb84c442016-04-19 17:49:49 +0200180 TEEC_NONE);
181
182 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CREATE_OVERWRITE, &op, &org);
183
184 return res;
185}
186
Pascal Brandc639ac82015-07-02 08:53:34 +0200187static TEEC_Result fs_close(TEEC_Session *sess, uint32_t obj)
188{
Aijun Sun473d9072015-08-06 15:24:49 +0800189 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100190 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200191
192 op.params[0].value.a = obj;
193
194 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
195 TEEC_NONE, TEEC_NONE);
196
197 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CLOSE, &op, &org);
198}
199
200static TEEC_Result fs_read(TEEC_Session *sess, uint32_t obj, void *data,
201 uint32_t data_size, uint32_t *count)
202{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100203 TEEC_Result res = TEEC_ERROR_GENERIC;
Aijun Sun473d9072015-08-06 15:24:49 +0800204 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100205 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200206
207 op.params[0].tmpref.buffer = data;
208 op.params[0].tmpref.size = data_size;
209 op.params[1].value.a = obj;
210 op.params[1].value.b = 0;
211
212 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
213 TEEC_VALUE_INOUT, TEEC_NONE,
214 TEEC_NONE);
215
216 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_READ, &op, &org);
217
218 if (res == TEEC_SUCCESS)
219 *count = op.params[1].value.b;
220
221 return res;
222}
223
224static TEEC_Result fs_write(TEEC_Session *sess, uint32_t obj, void *data,
225 uint32_t data_size)
226{
Aijun Sun473d9072015-08-06 15:24:49 +0800227 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100228 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200229
230 op.params[0].tmpref.buffer = data;
231 op.params[0].tmpref.size = data_size;
232 op.params[1].value.a = obj;
233 op.params[1].value.b = 0;
234
235 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
236 TEEC_VALUE_INPUT, TEEC_NONE,
237 TEEC_NONE);
238
239 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_WRITE, &op, &org);
240}
241
242static TEEC_Result fs_seek(TEEC_Session *sess, uint32_t obj, int32_t offset,
243 int32_t whence)
244{
Aijun Sun473d9072015-08-06 15:24:49 +0800245 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100246 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200247
248 op.params[0].value.a = obj;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200249 op.params[0].value.b = *(uint32_t *)&offset;
Pascal Brandc639ac82015-07-02 08:53:34 +0200250 op.params[1].value.a = whence;
251
252 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INOUT,
253 TEEC_NONE, TEEC_NONE);
254
255 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_SEEK, &op, &org);
256}
257
258static TEEC_Result fs_unlink(TEEC_Session *sess, uint32_t obj)
259{
Aijun Sun473d9072015-08-06 15:24:49 +0800260 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100261 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200262
263 op.params[0].value.a = obj;
264
265 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
266 TEEC_NONE, TEEC_NONE);
267
268 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_UNLINK, &op, &org);
269}
270
271static TEEC_Result fs_trunc(TEEC_Session *sess, uint32_t obj, uint32_t len)
272{
Aijun Sun473d9072015-08-06 15:24:49 +0800273 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100274 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200275
276 op.params[0].value.a = obj;
277 op.params[0].value.b = len;
278
279 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
280 TEEC_NONE, TEEC_NONE);
281
282 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_TRUNC, &op, &org);
283}
284
285static TEEC_Result fs_rename(TEEC_Session *sess, uint32_t obj, void *id,
286 uint32_t id_size)
287{
Aijun Sun473d9072015-08-06 15:24:49 +0800288 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100289 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200290
291 op.params[0].value.a = obj;
292 op.params[1].tmpref.buffer = id;
293 op.params[1].tmpref.size = id_size;
294
295 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
296 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
297 TEEC_NONE);
298
299 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RENAME, &op, &org);
300}
301
302static TEEC_Result fs_alloc_enum(TEEC_Session *sess, uint32_t *e)
303{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100304 TEEC_Result res = TEEC_ERROR_GENERIC;
Aijun Sun473d9072015-08-06 15:24:49 +0800305 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100306 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200307
308 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE,
309 TEEC_NONE, TEEC_NONE);
310
311 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_ALLOC_ENUM, &op, &org);
312
313 if (res == TEEC_SUCCESS)
314 *e = op.params[0].value.a;
315
316 return res;
317}
318
Jerome Forissier5d969d82017-03-21 10:01:04 +0100319static TEEC_Result fs_reset_enum(TEEC_Session *sess, uint32_t e)
320{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100321 TEEC_Result res = TEEC_ERROR_GENERIC;
Jerome Forissier5d969d82017-03-21 10:01:04 +0100322 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100323 uint32_t org = 0;
Jerome Forissier5d969d82017-03-21 10:01:04 +0100324
325 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
326 TEEC_NONE, TEEC_NONE);
327
328 op.params[0].value.a = e;
329 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESET_ENUM, &op, &org);
330
331 return res;
332}
333
Pascal Brandc639ac82015-07-02 08:53:34 +0200334static TEEC_Result fs_free_enum(TEEC_Session *sess, uint32_t e)
335{
Aijun Sun473d9072015-08-06 15:24:49 +0800336 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100337 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200338
339 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
340 TEEC_NONE);
341
342 op.params[0].value.a = e;
343
344 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_FREE_ENUM, &op, &org);
345}
346
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200347static TEEC_Result fs_start_enum(TEEC_Session *sess, uint32_t e,
348 uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200349{
Aijun Sun473d9072015-08-06 15:24:49 +0800350 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100351 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200352
353 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
354 TEEC_NONE, TEEC_NONE);
355
356 op.params[0].value.a = e;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200357 op.params[0].value.b = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200358
359 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_START_ENUM, &op, &org);
360}
361
362static TEEC_Result fs_next_enum(TEEC_Session *sess, uint32_t e, void *obj_info,
363 size_t info_size, void *id, uint32_t id_size)
364{
Aijun Sun473d9072015-08-06 15:24:49 +0800365 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100366 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200367
Pascal Brandc603e0d2016-04-25 12:37:18 +0200368 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brandc639ac82015-07-02 08:53:34 +0200369 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
Pascal Brandc603e0d2016-04-25 12:37:18 +0200370 if (obj_info && info_size)
371 op.paramTypes |= (TEEC_MEMREF_TEMP_OUTPUT << 4);
Pascal Brandc639ac82015-07-02 08:53:34 +0200372
373 op.params[0].value.a = e;
374 op.params[1].tmpref.buffer = obj_info;
375 op.params[1].tmpref.size = info_size;
376 op.params[2].tmpref.buffer = id;
377 op.params[2].tmpref.size = id_size;
378
379 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_NEXT_ENUM, &op, &org);
380}
381
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200382static TEEC_Result fs_restrict_usage(TEEC_Session *sess, uint32_t obj,
383 uint32_t obj_usage)
384{
385 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100386 uint32_t org = 0;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200387
388 op.params[0].value.a = obj;
389 op.params[0].value.b = obj_usage;
390
391 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
392 TEEC_NONE, TEEC_NONE);
393
394 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESTRICT_USAGE,
395 &op, &org);
396}
397
398static TEEC_Result fs_alloc_obj(TEEC_Session *sess, uint32_t obj_type,
399 uint32_t max_key_size, uint32_t *obj)
400{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100401 TEEC_Result res = TEEC_ERROR_GENERIC;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200402 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100403 uint32_t org = 0;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200404
405 op.params[0].value.a = obj_type;
406 op.params[0].value.b = max_key_size;
407
408 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
409 TEEC_NONE, TEEC_NONE);
410
411 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_ALLOC_OBJ, &op, &org);
412 *obj = op.params[1].value.a;
413 return res;
414}
415
416static TEEC_Result fs_free_obj(TEEC_Session *sess, uint32_t obj)
417{
418 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100419 uint32_t org = 0;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200420
421 op.params[0].value.a = obj;
422
423 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
424 TEEC_NONE, TEEC_NONE);
425
426 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_FREE_OBJ, &op, &org);
427}
428
429static TEEC_Result fs_reset_obj(TEEC_Session *sess, uint32_t obj)
430{
431 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100432 uint32_t org = 0;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200433
434 op.params[0].value.a = obj;
435
436 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
437 TEEC_NONE, TEEC_NONE);
438
439 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESET_OBJ, &op, &org);
440}
441
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800442static TEEC_Result fs_get_obj_info(TEEC_Session *sess, uint32_t obj,
443 void *obj_info, size_t info_size)
444{
445 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100446 uint32_t org = 0;
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800447
448 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
449 TEEC_MEMREF_TEMP_OUTPUT,
450 TEEC_NONE, TEEC_NONE);
451
452 op.params[0].value.a = obj;
453 op.params[1].tmpref.buffer = obj_info;
454 op.params[1].tmpref.size = info_size;
455
456 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_GET_OBJ_INFO, &op, &org);
457}
458
James Kung98c0ba12015-09-09 15:51:59 +0800459/* trunc */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200460static void test_truncate_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800461{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100462 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100463 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100464 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100465 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100466 uint32_t orig = 0;
James Kung98c0ba12015-09-09 15:51:59 +0800467
468 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
469 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
470 return;
471
472 /* create */
473 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
474 fs_create(&sess, file_01, sizeof(file_01),
475 TEE_DATA_FLAG_ACCESS_WRITE |
476 TEE_DATA_FLAG_ACCESS_READ |
477 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200478 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800479 goto exit;
480
481 /* trunc */
482 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 10)))
483 goto exit;
484
485 /* seek */
486 if (!ADBG_EXPECT_TEEC_SUCCESS(
487 c, fs_seek(&sess, obj, 5, TEE_DATA_SEEK_SET)))
488 goto exit;
489
490 /* verify */
491 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
492 goto exit;
493
494 /* check buffer */
495 (void)ADBG_EXPECT_BUFFER(c, &data_00[5], 5, out, count);
496
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100497 /* close */
498 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
499 goto exit;
500
501 /* open */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100502 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100503 TEE_DATA_FLAG_ACCESS_WRITE |
504 TEE_DATA_FLAG_ACCESS_READ |
505 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
506 goto exit;
507
508 /* seek */
509 if (!ADBG_EXPECT_TEEC_SUCCESS(
510 c, fs_seek(&sess, obj, 5, TEE_DATA_SEEK_SET)))
511 goto exit;
512
513 /* verify */
514 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
515 goto exit;
516
517 /* check buffer */
518 (void)ADBG_EXPECT_BUFFER(c, &data_00[5], 5, out, count);
519
James Kung98c0ba12015-09-09 15:51:59 +0800520 /* clean */
521 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
522 goto exit;
523
524exit:
525 TEEC_CloseSession(&sess);
526}
527
528/* extend */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200529static void test_extend_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800530{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100531 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100532 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100533 uint8_t out[10] = { };
534 uint8_t expect[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100535 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100536 uint32_t orig = 0;
James Kung98c0ba12015-09-09 15:51:59 +0800537
538 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
539 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
540 return;
541
542 /* create */
543 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
544 fs_create(&sess, file_01, sizeof(file_01),
545 TEE_DATA_FLAG_ACCESS_WRITE |
546 TEE_DATA_FLAG_ACCESS_READ |
547 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200548 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800549 goto exit;
550
551 /* extend */
552 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 40)))
553 goto exit;
554
555 /* seek */
556 if (!ADBG_EXPECT_TEEC_SUCCESS(
557 c, fs_seek(&sess, obj, 30, TEE_DATA_SEEK_SET)))
558 goto exit;
559
560 /* verify */
561 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
562 goto exit;
563
564 /* check buffer */
565 expect[0] = data_00[30];
566 expect[1] = data_00[31];
567 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
568
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100569 /* close */
570 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
571 goto exit;
572
573 /* open */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100574 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100575 TEE_DATA_FLAG_ACCESS_WRITE |
576 TEE_DATA_FLAG_ACCESS_READ |
577 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
578 goto exit;
579
580 /* seek */
581 if (!ADBG_EXPECT_TEEC_SUCCESS(
582 c, fs_seek(&sess, obj, 30, TEE_DATA_SEEK_SET)))
583 goto exit;
584
585 /* verify */
586 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
587 goto exit;
588
589 /* check buffer */
590 expect[0] = data_00[30];
591 expect[1] = data_00[31];
592 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
593
James Kung98c0ba12015-09-09 15:51:59 +0800594 /* clean */
595 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
596 goto exit;
597
598exit:
599 TEEC_CloseSession(&sess);
600}
601
602/* file hole */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200603static void test_file_hole(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800604{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100605 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100606 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100607 uint8_t out[10] = { };
608 uint8_t expect[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100609 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100610 uint32_t orig = 0;
James Kung98c0ba12015-09-09 15:51:59 +0800611
612 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
613 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
614 return;
615
616 /* create */
617 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
618 fs_create(&sess, file_01, sizeof(file_01),
619 TEE_DATA_FLAG_ACCESS_WRITE |
620 TEE_DATA_FLAG_ACCESS_READ |
621 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200622 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800623 goto exit;
624
625 /* seek */
626 if (!ADBG_EXPECT_TEEC_SUCCESS(
627 c, fs_seek(&sess, obj, 80, TEE_DATA_SEEK_SET)))
628 goto exit;
629
630 /* write */
631 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_write(&sess, obj, data_00,
632 sizeof(data_00))))
633 goto exit;
634
635 /* seek */
636 if (!ADBG_EXPECT_TEEC_SUCCESS(
637 c, fs_seek(&sess, obj, 74, TEE_DATA_SEEK_SET)))
638 goto exit;
639
640 /* verify */
641 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
642 goto exit;
643
644 /* check buffer */
645 expect[6] = data_00[0];
646 expect[7] = data_00[1];
647 expect[8] = data_00[2];
648 expect[9] = data_00[3];
649 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
650
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100651 /* close */
652 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
653 goto exit;
654
655 /* open */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100656 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100657 TEE_DATA_FLAG_ACCESS_WRITE |
658 TEE_DATA_FLAG_ACCESS_READ |
659 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
660 goto exit;
661
662 /* seek */
663 if (!ADBG_EXPECT_TEEC_SUCCESS(
664 c, fs_seek(&sess, obj, 74, TEE_DATA_SEEK_SET)))
665 goto exit;
666
667 /* verify */
668 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
669 goto exit;
670
671 /* check buffer */
672 expect[6] = data_00[0];
673 expect[7] = data_00[1];
674 expect[8] = data_00[2];
675 expect[9] = data_00[3];
676 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
677
James Kung98c0ba12015-09-09 15:51:59 +0800678 /* clean */
679 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
680 goto exit;
681
682exit:
683 TEEC_CloseSession(&sess);
684}
685
Jerome Forissiere3688342015-09-24 10:45:17 -0700686#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +0200687static TEEC_Result ds_seek_obj_inv_handle(TEEC_Session *sess)
688{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100689 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
690 uint32_t org = 0;
Pascal Brand8a74e362015-09-10 12:41:52 +0200691
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100692 op.paramTypes = TEEC_PARAM_TYPES(
693 TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
Pascal Brand8a74e362015-09-10 12:41:52 +0200694
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100695 op.params[0].value.a = CASE_DATA_OBJECT_NOT_PERSISTENT;
Pascal Brand8a74e362015-09-10 12:41:52 +0200696
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100697 return TEEC_InvokeCommand(
698 sess, CMD_SeekObjectData_panic, &op, &org);
Pascal Brand8a74e362015-09-10 12:41:52 +0200699}
700
Pascal Brand8a74e362015-09-10 12:41:52 +0200701static TEEC_Result ds_seek_gp(
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100702 TEEC_Session *sess, TEE_Whence wh, uint32_t wh_off, uint32_t set_off,
703 void *in, size_t in_size, void *out, size_t out_size)
Pascal Brand8a74e362015-09-10 12:41:52 +0200704{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100705 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
706 uint32_t org = 0;
Pascal Brand8a74e362015-09-10 12:41:52 +0200707
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100708 op.paramTypes = TEEC_PARAM_TYPES(
709 TEEC_VALUE_INPUT, TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT,
710 TEEC_MEMREF_TEMP_OUTPUT);
Pascal Brand8a74e362015-09-10 12:41:52 +0200711
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100712 op.params[0].value.a = wh;
713 op.params[0].value.b = wh_off;
714 op.params[1].value.a = set_off;
715 op.params[2].tmpref.buffer = in;
716 op.params[2].tmpref.size = in_size;
717 op.params[3].tmpref.buffer = out;
718 op.params[3].tmpref.size = out_size;
Pascal Brand8a74e362015-09-10 12:41:52 +0200719
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100720 return TEEC_InvokeCommand(sess, CMD_SeekWriteReadObjectData, &op, &org);
Pascal Brand8a74e362015-09-10 12:41:52 +0200721}
722
723static TEEC_Result ds_init_object_and_attributes(TEEC_Session *sess,
724 uint32_t obj_type, uint32_t obj_size, const void *attr_meta,
725 size_t attr_meta_len, const void *attr_data, size_t attr_data_len,
726 uint32_t option)
727{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100728 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
729 uint32_t org = 0;
Pascal Brand8a74e362015-09-10 12:41:52 +0200730
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100731 op.paramTypes = TEEC_PARAM_TYPES(
732 TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT,
733 TEEC_MEMREF_TEMP_INPUT, TEEC_VALUE_INPUT);
Pascal Brand8a74e362015-09-10 12:41:52 +0200734
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100735 op.params[0].value.a = obj_type;
736 op.params[0].value.b = obj_size;
737 op.params[1].tmpref.buffer = (void *)attr_meta;
738 op.params[1].tmpref.size = attr_meta_len;
739 op.params[2].tmpref.buffer = (void *)attr_data;
740 op.params[2].tmpref.size = attr_data_len;
741 op.params[3].value.a = option;
Pascal Brand8a74e362015-09-10 12:41:52 +0200742
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100743 return TEEC_InvokeCommand(sess, CMD_InitObjectAndAttributes, &op, &org);
Pascal Brand8a74e362015-09-10 12:41:52 +0200744}
745
746static TEEC_Result ds_rename_access_conflict(TEEC_Session *sess)
747{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100748 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
749 uint32_t org = 0;
Pascal Brand8a74e362015-09-10 12:41:52 +0200750
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100751 op.paramTypes = TEEC_PARAM_TYPES(
752 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
Pascal Brand8a74e362015-09-10 12:41:52 +0200753
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100754 return TEEC_InvokeCommand(
755 sess, CMD_RenamePersistentObject_AccessConflict, &op, &org);
Pascal Brand8a74e362015-09-10 12:41:52 +0200756}
757
758static TEEC_Result ds_start_enum_no_item(TEEC_Session *sess)
759{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100760 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
761 uint32_t org = 0;
762 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brand8a74e362015-09-10 12:41:52 +0200763
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100764 op.paramTypes = TEEC_PARAM_TYPES(
765 TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
Pascal Brand8a74e362015-09-10 12:41:52 +0200766
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100767 res = TEEC_InvokeCommand(
768 sess, CMD_StartNGetPersistentObjectEnumerator_itemNotFound,
769 &op, &org);
Pascal Brand8a74e362015-09-10 12:41:52 +0200770
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100771 if (res != TEEC_SUCCESS)
772 return res;
Pascal Brand8a74e362015-09-10 12:41:52 +0200773
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100774 if (op.params[0].value.a != 0 || op.params[0].value.b != 0)
775 return TEEC_ERROR_GENERIC;
Pascal Brand8a74e362015-09-10 12:41:52 +0200776
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100777 return res;
Pascal Brand8a74e362015-09-10 12:41:52 +0200778}
779
780static TEEC_Result ds_rename_success(TEEC_Session *sess)
781{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100782 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
783 uint32_t org = 0;
Pascal Brand8a74e362015-09-10 12:41:52 +0200784
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100785 op.paramTypes = TEEC_PARAM_TYPES(
786 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
Pascal Brand8a74e362015-09-10 12:41:52 +0200787
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100788 return TEEC_InvokeCommand(
789 sess, CMD_RenamePersistentObject_Success, &op, &org);
Pascal Brand8a74e362015-09-10 12:41:52 +0200790}
791
792static TEEC_Result ds_null_close_free_reset(TEEC_Session *sess)
793{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100794 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
795 uint32_t org = 0;
Pascal Brand8a74e362015-09-10 12:41:52 +0200796
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100797 op.paramTypes = TEEC_PARAM_TYPES(
798 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
Pascal Brand8a74e362015-09-10 12:41:52 +0200799
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100800 return TEEC_InvokeCommand(
801 sess, CMD_CloseFreeAndResetObjectSuccessHandleNull, &op, &org);
Pascal Brand8a74e362015-09-10 12:41:52 +0200802}
803#endif
804
Pascal Brandc639ac82015-07-02 08:53:34 +0200805/* create */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200806static void xtest_tee_test_6001_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200807{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100808 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100809 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100810 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200811
812 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
813 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
814 return;
815
816 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
817 fs_create(&sess, file_00, sizeof(file_00),
818 TEE_DATA_FLAG_ACCESS_WRITE |
819 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200820 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200821 goto exit;
822
823 /* clean */
824 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
825 goto exit;
826
827exit:
828 TEEC_CloseSession(&sess);
829}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200830DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6001)
Jens Wiklander14f48872018-06-29 15:30:13 +0200831ADBG_CASE_DEFINE(regression, 6001, xtest_tee_test_6001,
832 "Test TEE_CreatePersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200833
Pascal Brandc639ac82015-07-02 08:53:34 +0200834/* open */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200835static void xtest_tee_test_6002_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200836{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100837 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100838 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100839 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200840
841 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
842 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
843 return;
844
845 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
846 fs_create(&sess, file_01, sizeof(file_01),
847 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200848 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200849 goto exit;
850
851 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
852 goto exit;
853
854 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
855 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200856 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200857 goto exit;
858
859 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
860 goto exit;
861
862 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
863 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200864 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200865 goto exit;
866
867 /* clean */
868 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
869 goto exit;
870
871exit:
872 TEEC_CloseSession(&sess);
873}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200874DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6002)
Jens Wiklander14f48872018-06-29 15:30:13 +0200875ADBG_CASE_DEFINE(regression, 6002, xtest_tee_test_6002,
876 "Test TEE_OpenPersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200877
Pascal Brandc639ac82015-07-02 08:53:34 +0200878/* read */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200879static void xtest_tee_test_6003_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200880{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100881 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100882 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100883 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100884 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100885 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200886
887 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
888 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
889 return;
890
891 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
892 fs_create(&sess, file_02, sizeof(file_02),
893 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200894 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200895 goto exit;
896
897 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
898 goto exit;
899
900 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
901 fs_open(&sess, file_02, sizeof(file_02),
902 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200903 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200904 goto exit;
905
906 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
907 goto exit;
908
909 (void)ADBG_EXPECT_BUFFER(c, data_01, 10, out, count);
910
911 /* clean */
912 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
913 goto exit;
914
915exit:
916 TEEC_CloseSession(&sess);
917}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200918DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6003)
Jens Wiklander14f48872018-06-29 15:30:13 +0200919ADBG_CASE_DEFINE(regression, 6003, xtest_tee_test_6003,
920 "Test TEE_ReadObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200921
Pascal Brandc639ac82015-07-02 08:53:34 +0200922/* write */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200923static void xtest_tee_test_6004_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200924{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100925 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100926 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100927 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100928 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100929 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200930
931 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
932 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
933 return;
934
935 /* create */
936 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
937 fs_create(&sess, file_02, sizeof(file_02),
938 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200939 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200940 goto exit;
941
942 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
943 goto exit;
944
945 /* write new data */
946 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
947 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200948 TEE_DATA_FLAG_ACCESS_WRITE, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200949 goto exit;
950
951 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
952 fs_write(&sess, obj, data_00, sizeof(data_00))))
953 goto exit;
954
955 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
956 goto exit;
957
958 /* verify */
959 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
960 fs_open(&sess, file_02, sizeof(file_02),
961 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200962 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200963 goto exit;
964
965 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
966 goto exit;
967
968 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
969
970 /* clean */
971 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
972 goto exit;
973
974exit:
975 TEEC_CloseSession(&sess);
976}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200977DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6004)
Jens Wiklander14f48872018-06-29 15:30:13 +0200978ADBG_CASE_DEFINE(regression, 6004, xtest_tee_test_6004,
979 "Test TEE_WriteObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200980
Pascal Brandc639ac82015-07-02 08:53:34 +0200981/* seek */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200982static void xtest_tee_test_6005_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200983{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100984 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100985 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100986 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100987 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100988 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200989
990 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
991 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
992 return;
993
994 /* create */
995 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
996 fs_create(&sess, file_01, sizeof(file_01),
997 TEE_DATA_FLAG_ACCESS_WRITE |
998 TEE_DATA_FLAG_ACCESS_READ |
999 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001000 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001001 goto exit;
1002
1003 /* seek */
1004 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1005 fs_seek(&sess, obj, 10, TEE_DATA_SEEK_SET)))
1006 goto exit;
1007
1008 /* verify */
1009 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1010 goto exit;
1011
1012 (void)ADBG_EXPECT_BUFFER(c, &data_00[10], 10, out, count);
1013
1014 /* clean */
1015 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1016 goto exit;
1017
1018exit:
1019 TEEC_CloseSession(&sess);
1020}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001021DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6005)
Jens Wiklander14f48872018-06-29 15:30:13 +02001022ADBG_CASE_DEFINE(regression, 6005, xtest_tee_test_6005,
1023 "Test TEE_SeekObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001024
Pascal Brandc639ac82015-07-02 08:53:34 +02001025/* unlink */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001026static void xtest_tee_test_6006_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001027{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001028 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001029 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001030 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001031
1032 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1033 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1034 return;
1035
1036 /* create */
1037 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1038 fs_create(&sess, file_01, sizeof(file_01),
1039 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001040 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001041 goto exit;
1042
1043 /* del & close */
1044 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1045 goto exit;
1046
1047 /* check result */
1048 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1049 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001050 TEE_DATA_FLAG_ACCESS_READ, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001051 goto exit;
1052
1053exit:
1054 TEEC_CloseSession(&sess);
1055}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001056DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6006)
Jens Wiklander14f48872018-06-29 15:30:13 +02001057ADBG_CASE_DEFINE(regression, 6006, xtest_tee_test_6006,
1058 "Test TEE_CloseAndDeletePersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001059
1060static void xtest_tee_test_6007_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001061{
James Kung98c0ba12015-09-09 15:51:59 +08001062 Do_ADBG_BeginSubCase(c, "Test truncate file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001063 test_truncate_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +08001064 Do_ADBG_EndSubCase(c, "Test truncate file length");
Pascal Brandc639ac82015-07-02 08:53:34 +02001065
James Kung98c0ba12015-09-09 15:51:59 +08001066 Do_ADBG_BeginSubCase(c, "Test extend file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001067 test_extend_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +08001068 Do_ADBG_EndSubCase(c, "Test extend file length");
Pascal Brandc639ac82015-07-02 08:53:34 +02001069
James Kung98c0ba12015-09-09 15:51:59 +08001070 Do_ADBG_BeginSubCase(c, "Test file hole");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001071 test_file_hole(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +08001072 Do_ADBG_EndSubCase(c, "Test file hole");
Pascal Brandc639ac82015-07-02 08:53:34 +02001073}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001074DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6007)
Jens Wiklander14f48872018-06-29 15:30:13 +02001075ADBG_CASE_DEFINE(regression, 6007, xtest_tee_test_6007,
1076 "Test TEE_TruncateObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001077
1078static void xtest_tee_test_6008_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001079{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001080 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001081 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001082 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001083 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001084 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001085
1086 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1087 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1088 return;
1089
1090 /* create */
1091 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1092 fs_create(&sess, file_02, sizeof(file_02),
1093 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001094 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001095 goto exit;
1096
1097 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1098 goto exit;
1099
1100 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1101 fs_open(&sess, file_02, sizeof(file_02),
1102 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001103 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001104 goto exit;
1105
1106 /* write new data */
1107 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1108 fs_write(&sess, obj, data_00, sizeof(data_00))))
1109 goto exit;
1110
1111 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1112 fs_rename(&sess, obj, file_03, sizeof(file_03))))
1113 goto exit;
1114
1115 /* close */
1116 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1117 goto exit;
1118
1119 /* verify */
1120 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1121 fs_open(&sess, file_03, sizeof(file_03),
1122 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001123 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001124 goto exit;
1125
1126 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1127 goto exit;
1128
1129 /* check buffer */
1130 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
1131
1132 /* clean */
1133 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1134 goto exit;
1135
1136exit:
1137 TEEC_CloseSession(&sess);
1138}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001139DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6008)
Jens Wiklander14f48872018-06-29 15:30:13 +02001140ADBG_CASE_DEFINE(regression, 6008, xtest_tee_test_6008,
1141 "Test TEE_RenamePersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001142
1143static void xtest_tee_test_6009_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001144{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001145 TEEC_Session sess = { };
1146 uint32_t obj0 = 0;
1147 uint32_t obj1 = 0;
1148 uint32_t obj2 = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001149 uint32_t e = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001150 uint8_t info[200] = { };
1151 uint8_t id[200] = { };
1152 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001153
1154 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1155 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1156 return;
1157
1158 /* create file 00 */
1159 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1160 fs_create(&sess, file_00, sizeof(file_00),
1161 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001162 sizeof(data_01), &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001163 goto exit;
1164
1165 /* create file 01 */
1166 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1167 fs_create(&sess, file_01, sizeof(file_01),
1168 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001169 sizeof(data_01), &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001170 goto exit;
1171
1172 /* create file 02 */
1173 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1174 fs_create(&sess, file_02, sizeof(file_02),
1175 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001176 sizeof(data_01), &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001177 goto exit;
1178
1179 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj0)))
1180 goto exit;
1181
1182 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj1)))
1183 goto exit;
1184
1185 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj2)))
1186 goto exit;
1187
1188 /* iterate */
1189 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e)))
1190 goto exit;
1191
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001192 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_start_enum(&sess, e, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001193 goto exit;
1194
1195 /* get 00 */
1196 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1197 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1198 goto exit;
1199
1200 /* get 01 */
1201 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc603e0d2016-04-25 12:37:18 +02001202 fs_next_enum(&sess, e, NULL, 0, id, sizeof(id))))
Pascal Brandc639ac82015-07-02 08:53:34 +02001203 goto exit;
1204
1205 /* get 02 */
1206 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1207 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1208 goto exit;
1209
1210 /* we should not have more files */
1211 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1212 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1213 goto exit;
1214
1215 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e)))
1216 goto exit;
1217
1218 /* clean */
1219 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1220 fs_open(&sess, file_00, sizeof(file_00),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001221 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001222 goto exit;
1223
1224 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj0)))
1225 goto exit;
1226
1227 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1228 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001229 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001230 goto exit;
1231
1232 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj1)))
1233 goto exit;
1234
1235 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1236 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001237 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001238 goto exit;
1239
1240 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj2)))
1241 goto exit;
1242
1243exit:
1244 TEEC_CloseSession(&sess);
1245}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001246DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6009)
Jens Wiklander14f48872018-06-29 15:30:13 +02001247ADBG_CASE_DEFINE(regression, 6009, xtest_tee_test_6009,
1248 "Test TEE Internal API Persistent Object Enumeration Functions");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001249
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001250static void xtest_tee_test_6010_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand8a74e362015-09-10 12:41:52 +02001251{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001252 TEEC_Session sess = { };
1253 uint32_t orig = 0;
1254 uint32_t o1 = 0;
1255 uint32_t o2 = 0;
1256 uint32_t e = 0;
1257 uint32_t f = 0;
1258 uint8_t data[1024] = { };
1259 uint8_t out[1024] = { };
1260 uint32_t n = 0;
Pascal Brand30844922015-09-17 12:12:42 +02001261
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001262 for (n = 0; n < ARRAY_SIZE(data); n++)
1263 data[n] = n;
Pascal Brand8a74e362015-09-10 12:41:52 +02001264
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001265 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1266 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1267 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001268
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001269 Do_ADBG_BeginSubCase(c, "CreatePersistentObject AccessConflict");
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;
Pascal Brand8a74e362015-09-10 12:41:52 +02001276
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001277 ADBG_EXPECT_TEEC_SUCCESS(c,
1278 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1279 sizeof(data), &o1, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001280
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001281 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE;
1282 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ACCESS_CONFLICT,
1283 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1284 sizeof(data), &o2, storage_id));
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 if (o2)
1288 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
Pascal Brand8a74e362015-09-10 12:41:52 +02001289
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001290 Do_ADBG_EndSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001291
Pascal Brand8a74e362015-09-10 12:41:52 +02001292
Pascal Brand8a74e362015-09-10 12:41:52 +02001293
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001294 Do_ADBG_BeginSubCase(c, "RestrictObjectUsage Panic");
1295 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1296 fs_restrict_usage(&sess, 0xffffbad0, 0xffffffff));
1297 Do_ADBG_EndSubCase(c, "RestrictObjectUsage Panic");
Pascal Brand8a74e362015-09-10 12:41:52 +02001298
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001299 TEEC_CloseSession(&sess);
1300 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1301 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1302 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001303
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001304 Do_ADBG_BeginSubCase(c, "SeekObjectData BadHandle");
1305 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1306 fs_seek(&sess, 0xffffbad0, 5, TEE_DATA_SEEK_SET));
1307 Do_ADBG_EndSubCase(c, "SeekObjectData BadHandle");
Pascal Brand8a74e362015-09-10 12:41:52 +02001308
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001309 TEEC_CloseSession(&sess);
1310 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1311 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1312 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001313
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001314 Do_ADBG_BeginSubCase(c, "SeekObjectData NotPersist");
1315 o1 = 0;
1316 ADBG_EXPECT_TEEC_SUCCESS(c,
1317 fs_alloc_obj(&sess, TEE_TYPE_AES, 256, &o1));
1318 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1319 fs_seek(&sess, o1, 5, TEE_DATA_SEEK_SET));
1320 Do_ADBG_EndSubCase(c, "SeekObjectData NotPersist");
Pascal Brand8a74e362015-09-10 12:41:52 +02001321
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001322 TEEC_CloseSession(&sess);
1323 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1324 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1325 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001326
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001327 Do_ADBG_BeginSubCase(c, "SeekWriteRead");
1328 o1 = 0;
1329 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1330 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1331 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1332 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1333 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1334 sizeof(data), &o1, storage_id)))
1335 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001336
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001337 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1338 fs_seek(&sess, o1, 2, TEE_DATA_SEEK_SET)))
1339 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001340
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001341 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1342 fs_seek(&sess, o1, 0, TEE_DATA_SEEK_END)))
1343 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001344
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001345 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1346 fs_write(&sess, o1, data, sizeof(data))))
1347 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001348
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001349 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1350 fs_seek(&sess, o1, sizeof(data), TEE_DATA_SEEK_SET)))
1351 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001352
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001353 memset(out, 0xab, sizeof(out));
1354 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1355 fs_read(&sess, o1, out, sizeof(out), &n)))
1356 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001357
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001358 ADBG_EXPECT_BUFFER(c, data, sizeof(data), out, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001359
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001360 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander3a6892e2016-09-14 15:53:52 +02001361 fs_seek(&sess, o1, 10, TEE_DATA_SEEK_END)))
1362 goto seek_write_read_out;
1363
1364 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1365 fs_read(&sess, o1, out, sizeof(out), &n)))
1366 goto seek_write_read_out;
1367 ADBG_EXPECT_COMPARE_UNSIGNED(c, n, ==, 0);
1368
1369 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001370 fs_seek(&sess, o1, -(int32_t)sizeof(data) / 2,
1371 TEE_DATA_SEEK_END)))
1372 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001373
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001374 memset(out, 0xab, sizeof(out) / 2);
1375 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1376 fs_read(&sess, o1, out, sizeof(out) / 2, &n)))
1377 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001378
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001379 ADBG_EXPECT_BUFFER(c,
1380 data + sizeof(data) / 2, sizeof(data) / 2,
Melanie Favre73205032018-02-19 13:35:52 +01001381 out, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001382
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001383seek_write_read_out:
1384 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1385 Do_ADBG_EndSubCase(c, "SeekWriteRead");
Pascal Brand8a74e362015-09-10 12:41:52 +02001386
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001387 Do_ADBG_BeginSubCase(c, "Rename Access Conflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001388
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001389 o1 = TEE_HANDLE_NULL;
1390 o2 = TEE_HANDLE_NULL;
1391 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1392 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1393 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1394 ADBG_EXPECT_TEEC_SUCCESS(c,
1395 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1396 sizeof(data), &o1, storage_id));
1397 ADBG_EXPECT_TEEC_SUCCESS(c,
1398 fs_create(&sess, file_01, sizeof(file_01), f, 0, data,
1399 sizeof(data) / 2, &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001400
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001401 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ACCESS_CONFLICT,
1402 fs_rename(&sess, o2, file_00, sizeof(file_00)));
Pascal Brand8a74e362015-09-10 12:41:52 +02001403
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001404 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1405 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
1406
1407 Do_ADBG_EndSubCase(c, "Rename Access Conflict");
1408
Jerome Forissier7dbf8772018-12-19 09:05:48 +01001409 Do_ADBG_BeginSubCase(c, "Rename Access Conflict 2");
1410
1411 o1 = TEE_HANDLE_NULL;
1412 o2 = TEE_HANDLE_NULL;
1413 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1414 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1415 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1416 ADBG_EXPECT_TEEC_SUCCESS(c,
1417 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1418 sizeof(data), &o1, storage_id));
1419 ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, o1));
1420
1421 ADBG_EXPECT_TEEC_SUCCESS(c,
1422 fs_create(&sess, file_01, sizeof(file_01), f, 0, data,
1423 sizeof(data) / 2, &o2, storage_id));
1424 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ACCESS_CONFLICT,
1425 fs_rename(&sess, o2, file_00, sizeof(file_00)));
1426
1427 ADBG_EXPECT_TEEC_SUCCESS(c,
1428 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1429 sizeof(data), &o1, storage_id));
1430
1431 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1432 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
1433
1434 Do_ADBG_EndSubCase(c, "Rename Access Conflict 2");
1435
Jerome Forissier5d969d82017-03-21 10:01:04 +01001436 Do_ADBG_BeginSubCase(c, "AllocPersistentObjectEnumerator + "
1437 "ResetPersistentObjectEnumerator");
1438 e = TEE_HANDLE_NULL;
1439 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1440 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_enum(&sess, e));
1441 Do_ADBG_EndSubCase(c, "AllocPersistentObjectEnumerator + "
1442 "ResetPersistentObjectEnumerator");
1443
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001444 Do_ADBG_BeginSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1445 e = TEE_HANDLE_NULL;
1446 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1447 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1448 fs_next_enum(&sess, e, NULL, 0, out, sizeof(out)));
1449 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1450 fs_start_enum(&sess, e, storage_id));
1451 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e));
1452 Do_ADBG_EndSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1453
1454 Do_ADBG_BeginSubCase(c, "RenamePersistent ReadWrite");
1455 o1 = TEE_HANDLE_NULL;
1456 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1457 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1458 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1459 ADBG_EXPECT_TEEC_SUCCESS(c,
1460 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1461 sizeof(data), &o1, storage_id));
1462 ADBG_EXPECT_TEEC_SUCCESS(c,
1463 fs_rename(&sess, o1, file_01, sizeof(file_01)));
1464 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1465 Do_ADBG_EndSubCase(c, "RenamePersistent ReadWrite");
1466
1467 Do_ADBG_BeginSubCase(c, "Close Free Reset Null");
1468 ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, TEE_HANDLE_NULL));
1469 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_obj(&sess, TEE_HANDLE_NULL));
1470 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_obj(&sess, TEE_HANDLE_NULL));
1471 Do_ADBG_EndSubCase(c, "Close Free Reset Null");
1472
1473 TEEC_CloseSession(&sess);
Pascal Brand8a74e362015-09-10 12:41:52 +02001474}
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001475DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6010)
Jens Wiklander14f48872018-06-29 15:30:13 +02001476ADBG_CASE_DEFINE(regression, 6010, xtest_tee_test_6010, "Test Storage");
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001477
1478#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +02001479static void xtest_tee_test_6011(ADBG_Case_t *c)
1480{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001481 TEEC_Session sess = { };
1482 uint32_t orig = 0;
1483 /*
1484 * Test data from
1485 * Invoke_InitObjectAndAttributes_TEE_TYPE_AES_success_attribute_
1486 * TEE_ATTR_SECRET_VALUE_correct_size (9d-9a-91)
1487 */
1488 static const uint8_t attr_meta[] = {
Pascal Brand8a74e362015-09-10 12:41:52 +020014890xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
14900x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
14910x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
14920x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001493 };
1494 static const uint8_t attr_data[] = {
Pascal Brand8a74e362015-09-10 12:41:52 +020014950x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,
14960x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,
14970xdf,0xf4,
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001498 };
Pascal Brand8a74e362015-09-10 12:41:52 +02001499
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001500 if (!ADBG_EXPECT_TEEC_SUCCESS(
1501 c, xtest_teec_open_session(&sess, &gp_tta_ds_uuid,
1502 NULL, &orig)))
1503 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001504
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001505 if (!ADBG_EXPECT_TEEC_SUCCESS(
1506 c, ds_init_object_and_attributes(&sess, 0xa0000010,
1507 0x100, attr_meta, sizeof(attr_meta),
1508 attr_data, sizeof(attr_data), 0)))
1509 goto exit;
Pascal Brand8a74e362015-09-10 12:41:52 +02001510
1511exit:
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001512 TEEC_CloseSession(&sess);
Pascal Brand8a74e362015-09-10 12:41:52 +02001513}
Jens Wiklander14f48872018-06-29 15:30:13 +02001514ADBG_CASE_DEFINE(regression, 6011, xtest_tee_test_6011,
1515 "Test TEE GP TTA DS init objects");
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001516#endif /*WITH_GP_TESTS*/
Pascal Brand8a74e362015-09-10 12:41:52 +02001517
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001518static void xtest_tee_test_6012_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +02001519{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001520 TEEC_Session sess = { };
1521 uint32_t orig = 0;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001522 uint32_t obj = 0;
Pascal Brandeb84c442016-04-19 17:49:49 +02001523
Etienne Carrierea54952b2017-10-27 15:58:01 +02001524 /*
1525 * create the object a first time (forced through with overwrite attribute)
1526 */
Pascal Brandeb84c442016-04-19 17:49:49 +02001527 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1528 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1529 return;
1530
1531 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001532 fs_create_overwrite(&sess, file_04, sizeof(file_04), storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001533 goto bail1;
Pascal Brandeb84c442016-04-19 17:49:49 +02001534
1535 TEEC_CloseSession(&sess);
1536
Etienne Carrierea54952b2017-10-27 15:58:01 +02001537 /*
1538 * re-create the object two times with overwrite attribute
1539 */
Pascal Brandeb84c442016-04-19 17:49:49 +02001540 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1541 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1542 return;
1543
1544 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001545 fs_create_overwrite(&sess, file_04, sizeof(file_04),
1546 storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001547 goto bail1;
Pascal Brandeb84c442016-04-19 17:49:49 +02001548
Etienne Carrierea54952b2017-10-27 15:58:01 +02001549 /* re-create it with an object */
1550 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandeb84c442016-04-19 17:49:49 +02001551 fs_create(&sess, file_04, sizeof(file_04),
1552 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001553 TEE_DATA_FLAG_ACCESS_WRITE_META |
1554 TEE_DATA_FLAG_OVERWRITE, 0, NULL, 0, &obj,
1555 storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001556 goto bail2;
Pascal Brandeb84c442016-04-19 17:49:49 +02001557
Etienne Carrierea54952b2017-10-27 15:58:01 +02001558 TEEC_CloseSession(&sess);
Pascal Brandeb84c442016-04-19 17:49:49 +02001559
Etienne Carrierea54952b2017-10-27 15:58:01 +02001560 /*
1561 * re-create it again without overwrite flag: should fail and
1562 * existing object should not be altered.
1563 */
1564 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1565 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1566 return;
1567
1568 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ACCESS_CONFLICT,
1569 fs_create(&sess, file_04, sizeof(file_04),
1570 TEE_DATA_FLAG_ACCESS_WRITE |
1571 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, NULL, 0, &obj,
1572 storage_id)))
1573 goto bail2;
1574
1575 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1576 fs_open(&sess, file_04, sizeof(file_04),
1577 TEE_DATA_FLAG_ACCESS_READ |
1578 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj,
1579 storage_id)))
1580 goto bail1;
1581
1582bail2:
1583 /* remove the object so that xtest 600x can be replayed */
1584 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1585bail1:
Pascal Brandeb84c442016-04-19 17:49:49 +02001586 TEEC_CloseSession(&sess);
1587}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001588DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6012)
Jens Wiklander14f48872018-06-29 15:30:13 +02001589ADBG_CASE_DEFINE(regression, 6012, xtest_tee_test_6012,
1590 "Test TEE GP TTA DS init objects");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001591
1592static void xtest_tee_test_6013_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand90f23352016-05-19 15:15:47 +02001593{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001594 TEEC_Session sess = { };
1595 uint32_t orig = 0;
Pascal Brand90f23352016-05-19 15:15:47 +02001596 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1597
1598 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1599 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1600 return;
1601
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001602 op.params[0].value.a = storage_id;
1603 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand90f23352016-05-19 15:15:47 +02001604 TEEC_NONE, TEEC_NONE);
1605
1606 ADBG_EXPECT_TEEC_SUCCESS(c,
1607 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_KEY_IN_PERSISTENT,
1608 &op, &orig));
1609
1610 TEEC_CloseSession(&sess);
1611}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001612DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6013)
Jens Wiklander14f48872018-06-29 15:30:13 +02001613ADBG_CASE_DEFINE(regression, 6013, xtest_tee_test_6013,
1614 "Key usage in Persistent objects");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001615
1616static void xtest_tee_test_6014_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand29ee18f2016-05-23 14:13:56 +02001617{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001618 TEEC_Session sess = { };
1619 uint32_t orig = 0;
Pascal Brand29ee18f2016-05-23 14:13:56 +02001620 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1621
1622 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1623 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1624 return;
1625
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001626 op.params[0].value.a = storage_id;
1627 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand29ee18f2016-05-23 14:13:56 +02001628 TEEC_NONE, TEEC_NONE);
1629
1630 ADBG_EXPECT_TEEC_SUCCESS(c,
1631 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_LOOP, &op, &orig));
1632
1633 TEEC_CloseSession(&sess);
1634}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001635DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6014)
Jens Wiklander14f48872018-06-29 15:30:13 +02001636ADBG_CASE_DEFINE(regression, 6014, xtest_tee_test_6014,
1637 "Loop on Persistent objects");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001638
Jerome Forissiere3854162016-08-12 12:40:12 +02001639static void xtest_tee_test_6015_single(ADBG_Case_t *c, uint32_t storage_id)
1640{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001641 TEEC_Session sess = { };
1642 TEEC_Session sess2 = { };
1643 uint32_t orig = 0;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001644 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001645 uint32_t obj2 = 0;
Jerome Forissiere3854162016-08-12 12:40:12 +02001646
1647 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1648 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1649 return;
1650
1651 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1652 xtest_teec_open_session(&sess2, &storage2_ta_uuid, NULL,
1653 &orig)))
1654 goto exit2;
1655
1656 /* TA #1 creates a persistent object */
1657 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1658 fs_create(&sess, file_01, sizeof(file_01),
1659 TEE_DATA_FLAG_ACCESS_WRITE |
1660 TEE_DATA_FLAG_ACCESS_READ |
1661 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
1662 sizeof(data_00), &obj, storage_id)))
1663 goto exit;
1664
1665 /* TA #2 tries to open the object created by TA #1 */
1666 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1667 fs_open(&sess2, file_01, sizeof(file_01),
1668 TEE_DATA_FLAG_ACCESS_READ, &obj2, storage_id)))
1669 goto clean;
1670
Jerome Forissiere3854162016-08-12 12:40:12 +02001671clean:
1672 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1673exit:
1674 TEEC_CloseSession(&sess2);
1675exit2:
1676 TEEC_CloseSession(&sess);
1677}
Jerome Forissiere3854162016-08-12 12:40:12 +02001678DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6015)
Jens Wiklander14f48872018-06-29 15:30:13 +02001679ADBG_CASE_DEFINE(regression, 6015, xtest_tee_test_6015, "Storage isolation");
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001680
1681struct test_6016_thread_arg {
1682 ADBG_Case_t *case_t;
1683 uint32_t storage_id;
Jerome Forissier54cfbef2016-08-31 18:34:31 +02001684 char file_name[8];
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001685 TEEC_Session session;
1686};
1687
1688static void *test_6016_thread(void *arg)
1689{
1690 struct test_6016_thread_arg *a = arg;
1691 TEEC_Session sess = a->session;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001692 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001693 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001694 uint32_t count = 0;
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001695
1696 /* create */
1697 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1698 fs_create(&sess, a->file_name, sizeof(a->file_name),
1699 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
1700 sizeof(data_01), &obj, a->storage_id)))
1701 goto exit;
1702
1703 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1704 goto exit;
1705
1706 /* write new data */
1707 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1708 fs_open(&sess, a->file_name, sizeof(a->file_name),
1709 TEE_DATA_FLAG_ACCESS_WRITE, &obj, a->storage_id)))
1710 goto exit;
1711
1712 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1713 fs_write(&sess, obj, data_00, sizeof(data_00))))
1714 goto exit;
1715
1716 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1717 goto exit;
1718
1719 /* verify */
1720 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1721 fs_open(&sess, a->file_name, sizeof(a->file_name),
1722 TEE_DATA_FLAG_ACCESS_READ |
1723 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, a->storage_id)))
1724 goto exit;
1725
1726 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1727 fs_read(&sess, obj, out, 10, &count)))
1728 goto exit;
1729
1730 (void)ADBG_EXPECT_BUFFER(a->case_t, data_00, 10, out, count);
1731
1732 /* clean */
1733 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_unlink(&sess, obj)))
1734 goto exit;
1735
1736exit:
1737 return NULL;
1738}
1739
1740
1741#define NUM_THREADS 4
1742static void xtest_tee_test_6016_loop(ADBG_Case_t *c, uint32_t storage_id)
1743{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001744 struct test_6016_thread_arg arg[NUM_THREADS] = { };
1745 uint32_t orig = 0;
1746 size_t i = 0;
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001747 size_t n = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001748 size_t m = 0;
1749 pthread_t thr[NUM_THREADS] = { };
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001750
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001751 for (m = 0; m < NUM_THREADS; m++)
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001752 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1753 xtest_teec_open_session(&arg[m].session,
1754 &storage_ta_uuid, NULL, &orig)))
1755 goto out;
1756
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001757 for (n = 0; n < NUM_THREADS; n++) {
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001758 arg[n].case_t = c;
1759 arg[n].storage_id = storage_id;
Jerome Forissiercb10f832016-09-01 14:53:05 +02001760 snprintf(arg[n].file_name, sizeof(arg[n].file_name),
Jens Wiklander2b1c11d2016-09-16 14:58:41 +02001761 "file_%zu", n);
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001762 if (!ADBG_EXPECT(c, 0, pthread_create(thr + n, NULL,
1763 test_6016_thread, arg + n)))
1764 goto out;
1765 }
1766
1767out:
1768 for (i = 0; i < n; i++)
1769 ADBG_EXPECT(c, 0, pthread_join(thr[i], NULL));
1770 for (i = 0; i < m; i++)
1771 TEEC_CloseSession(&arg[i].session);
1772}
1773
1774/* concurency */
1775static void xtest_tee_test_6016_single(ADBG_Case_t *c, uint32_t storage_id)
1776{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001777 int i = 0;
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001778 int loops = 8;
1779
1780 Do_ADBG_Log(" threads: %d, loops: %d", NUM_THREADS, loops);
1781 for (i = 0; i < loops; i++)
1782 xtest_tee_test_6016_loop(c, storage_id);
1783}
Jerome Forissierefd71d32016-09-13 15:09:33 +02001784DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6016)
Jens Wiklander14f48872018-06-29 15:30:13 +02001785ADBG_CASE_DEFINE(regression, 6016, xtest_tee_test_6016, "Storage concurency");
Jerome Forissier327672c2016-09-01 18:34:11 +02001786
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001787static void xtest_tee_test_6017_single(ADBG_Case_t *c, uint32_t storage_id)
1788{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001789 TEEC_Session sess = { };
1790 TEE_ObjectInfo obj_info1 = { };
1791 TEE_ObjectInfo obj_info2 = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001792 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001793 uint32_t orig = 0;
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001794
1795 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1796 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1797 return;
1798
1799 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1800 fs_create(&sess, file_01, sizeof(file_01),
1801 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1802 0, &obj, storage_id)))
1803 goto exit;
1804
1805 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1806 fs_write(&sess, obj, data_00, sizeof(data_00))))
1807 goto exit;
1808
1809 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1810 fs_get_obj_info(&sess, obj, &obj_info1,
1811 sizeof(TEE_ObjectInfo))))
1812 goto exit;
1813
1814 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1815 goto exit;
1816
1817 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1818 fs_open(&sess, file_01, sizeof(file_01),
1819 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1820 goto exit;
1821
1822 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1823 fs_get_obj_info(&sess, obj, &obj_info2,
1824 sizeof(TEE_ObjectInfo))))
1825 goto exit;
1826
1827 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1828 obj_info1.dataSize, ==, obj_info2.dataSize))
1829 goto exit;
1830
1831 /* clean */
1832 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1833 goto exit;
1834
1835exit:
1836 TEEC_CloseSession(&sess);
1837}
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001838DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6017)
Jens Wiklander14f48872018-06-29 15:30:13 +02001839ADBG_CASE_DEFINE(regression, 6017, xtest_tee_test_6017,
1840 "Test Persistent objects info");
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001841
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001842static void xtest_tee_test_6018_single(ADBG_Case_t *c, uint32_t storage_id)
1843{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001844 TEEC_Session sess = { };
1845 TEE_ObjectInfo obj_info1 = { };
1846 TEE_ObjectInfo obj_info2 = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001847 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001848 uint32_t orig = 0;
1849 uint8_t block[32 * 1024] = { };
1850 size_t num_blocks = 0;
1851 size_t block_size = 0;
1852 size_t n = 0;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001853
1854 if (storage_is(storage_id, TEE_STORAGE_PRIVATE_RPMB)) {
1855 /* RPMB FS is a bit resource constrained */
Jens Wiklander20949ea2017-05-17 17:47:58 +02001856 num_blocks = 10;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001857 block_size = 1024;
1858 } else {
Jens Wiklander5f86daa2017-05-30 16:37:19 +02001859 num_blocks = 20;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001860 block_size = sizeof(block);
1861 }
1862
1863 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1864 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1865 return;
1866
1867 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1868 fs_create(&sess, file_01, sizeof(file_01),
1869 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1870 0, &obj, storage_id)))
1871 goto exit;
1872
1873 for (n = 0; n < num_blocks; n++) {
1874 memset(block, n, block_size);
1875
1876 Do_ADBG_Log("writing %zu", n);
1877 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1878 fs_write(&sess, obj, block, block_size)))
1879 goto exit;
1880 }
1881
1882 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1883 fs_get_obj_info(&sess, obj, &obj_info1,
1884 sizeof(TEE_ObjectInfo))))
1885 goto exit;
1886
1887 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1888 obj_info1.dataSize, ==, block_size * num_blocks))
1889 goto exit;
1890
1891 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1892 goto exit;
1893
1894 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1895 fs_open(&sess, file_01, sizeof(file_01),
1896 TEE_DATA_FLAG_ACCESS_READ |
1897 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1898 goto exit;
1899
1900 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1901 fs_get_obj_info(&sess, obj, &obj_info2,
1902 sizeof(TEE_ObjectInfo))))
1903 goto exit;
1904
1905 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1906 obj_info1.dataSize, ==, obj_info2.dataSize))
1907 goto exit;
1908
1909 for (n = 0; n < num_blocks; n++) {
1910 uint8_t br[block_size];
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001911 uint32_t count = 0;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001912
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001913 memset(br, 0, sizeof(br));
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001914 memset(block, n, block_size);
1915
1916 Do_ADBG_Log("reading %zu", n);
1917 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1918 fs_read(&sess, obj, br, sizeof(br), &count)))
1919 goto exit;
1920 if (!ADBG_EXPECT_BUFFER(c, block, block_size, br, count))
1921 goto exit;
1922 }
1923
1924 /* clean */
1925 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1926 goto exit;
1927
1928exit:
1929 TEEC_CloseSession(&sess);
1930}
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001931DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6018)
Jens Wiklander14f48872018-06-29 15:30:13 +02001932ADBG_CASE_DEFINE(regression, 6018, xtest_tee_test_6018, "Large object");
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001933
l00176142ebba0c92017-11-08 01:16:26 +08001934static void xtest_tee_test_6019_single(ADBG_Case_t *c, uint32_t storage_id)
1935{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001936 TEEC_Session sess = { };
1937 TEEC_Session sess2 = { };
1938 uint32_t orig = 0;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001939 uint32_t obj = 0;
1940 uint32_t obj2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001941 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001942 uint32_t count = 0;
l00176142ebba0c92017-11-08 01:16:26 +08001943
1944 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1945 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1946 return;
1947
1948 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1949 xtest_teec_open_session(&sess2, &storage2_ta_uuid, NULL,
1950 &orig)))
1951 goto exit3;
1952
1953 /* TA #1 creates a persistent object */
1954 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1955 fs_create(&sess, file_01, sizeof(file_01),
1956 TEE_DATA_FLAG_ACCESS_WRITE |
1957 TEE_DATA_FLAG_ACCESS_WRITE_META |
1958 TEE_DATA_FLAG_OVERWRITE, 0, data_00,
1959 sizeof(data_00), &obj, storage_id)))
1960 goto exit2;
1961
1962 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1963 goto exit1;
1964
1965 /* TA #2 creates a persistent object */
1966 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1967 fs_create(&sess2, file_01, sizeof(file_01),
1968 TEE_DATA_FLAG_ACCESS_WRITE |
1969 TEE_DATA_FLAG_ACCESS_WRITE_META |
1970 TEE_DATA_FLAG_OVERWRITE, 0, data_01,
1971 sizeof(data_01), &obj2, storage_id)))
1972 goto exit1;
1973
1974 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess2, obj2)))
1975 goto exit;
1976
1977 /* TA #1 open and read */
1978 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1979 fs_open(&sess, file_01, sizeof(file_01),
1980 TEE_DATA_FLAG_ACCESS_READ |
1981 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1982 goto exit;
1983
1984 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1985 goto exit;
1986
1987 /* verify */
1988 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
1989
1990 /* TA #2 open and read */
1991 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1992 fs_open(&sess2, file_01, sizeof(file_01),
1993 TEE_DATA_FLAG_ACCESS_READ |
1994 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj2, storage_id)))
1995 goto exit;
1996
1997 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess2, obj2, out, 10, &count)))
1998 goto exit;
1999
2000 /* verify */
2001 (void)ADBG_EXPECT_BUFFER(c, data_01, 10, out, count);
2002
2003exit:
2004 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess2, obj2));
2005exit1:
2006 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
2007exit2:
2008 TEEC_CloseSession(&sess2);
2009exit3:
2010 TEEC_CloseSession(&sess);
2011}
l00176142ebba0c92017-11-08 01:16:26 +08002012DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6019)
Jens Wiklander14f48872018-06-29 15:30:13 +02002013ADBG_CASE_DEFINE(regression, 6019, xtest_tee_test_6019, "Storage independence");
l00176142ebba0c92017-11-08 01:16:26 +08002014
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002015/*
2016 * According to the GP spec V1.1, the object_id in create/open/rename
2017 * functions is not allowed to reside in the shared memory.
2018 *
2019 * The function below replicates fs_open/fs_create/fs_rename but using
2020 * specific commands to ask the TA to use the client object ID buffer
2021 * from the shared memory when accessing the object through target APIs.
2022 * The TA is not expected to use such references and gets killed by the TEE.
2023 */
2024static TEEC_Result fs_access_with_bad_object_id_ref(TEEC_Session *sess,
2025 uint32_t command,
2026 void *id, uint32_t id_size,
2027 uint32_t flags,
2028 uint32_t attr,
2029 void *data, uint32_t data_size,
2030 uint32_t *obj,
2031 uint32_t storage_id)
2032{
2033 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002034 TEEC_Result res = TEEC_ERROR_GENERIC;
2035 uint32_t org = 0;
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002036
2037 switch (command) {
2038 case TA_STORAGE_CMD_OPEN_ID_IN_SHM:
2039 op.params[0].tmpref.buffer = id;
2040 op.params[0].tmpref.size = id_size;
2041 op.params[1].value.a = flags;
2042 op.params[1].value.b = 0;
2043 op.params[2].value.a = storage_id;
2044
2045 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
2046 TEEC_VALUE_INOUT,
2047 TEEC_VALUE_INPUT,
2048 TEEC_NONE);
2049 break;
2050 case TA_STORAGE_CMD_CREATE_ID_IN_SHM:
2051 op.params[0].tmpref.buffer = id;
2052 op.params[0].tmpref.size = id_size;
2053 op.params[1].value.a = flags;
2054 op.params[1].value.b = 0;
2055 op.params[2].value.a = attr;
2056 op.params[2].value.b = storage_id;
2057 op.params[3].tmpref.buffer = data;
2058 op.params[3].tmpref.size = data_size;
2059
2060 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
2061 TEEC_VALUE_INOUT,
2062 TEEC_VALUE_INPUT,
2063 TEEC_MEMREF_TEMP_INPUT);
2064 break;
2065 case TA_STORAGE_CMD_CREATEOVER_ID_IN_SHM:
2066 op.params[0].tmpref.buffer = id;
2067 op.params[0].tmpref.size = id_size;
2068 op.params[1].value.a = storage_id;
2069
2070 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
2071 TEEC_VALUE_INPUT,
2072 TEEC_NONE, TEEC_NONE);
2073 break;
2074 case TA_STORAGE_CMD_RENAME_ID_IN_SHM:
2075 op.params[0].value.a = *obj;
2076 op.params[1].tmpref.buffer = id;
2077 op.params[1].tmpref.size = id_size;
2078
2079 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
2080 TEEC_MEMREF_TEMP_INPUT,
2081 TEEC_NONE, TEEC_NONE);
2082 break;
2083 default:
2084 return TEE_ERROR_GENERIC;
2085 }
2086
2087 res = TEEC_InvokeCommand(sess, command, &op, &org);
2088
2089 switch (command) {
2090 case TA_STORAGE_CMD_OPEN_ID_IN_SHM:
2091 case TA_STORAGE_CMD_CREATE_ID_IN_SHM:
2092 if (res == TEEC_SUCCESS)
2093 *obj = op.params[1].value.b;
2094 break;
2095 default:
2096 break;
2097 }
2098
2099 return res;
2100}
2101
2102static void xtest_tee_test_6020_single(ADBG_Case_t *c, uint32_t storage_id)
2103{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002104 TEEC_Result res = TEEC_ERROR_GENERIC;
2105 TEEC_Session sess = { };
2106 uint32_t orig = 0;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01002107 uint32_t obj = 0;
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002108
2109 /*
2110 * Invalid open request from the TA (object ID reference in SHM)
2111 */
2112 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
2113 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2114 return;
2115
2116 res = fs_create(&sess, file_01, sizeof(file_01),
2117 TEE_DATA_FLAG_ACCESS_WRITE |
2118 TEE_DATA_FLAG_ACCESS_WRITE_META |
2119 TEE_DATA_FLAG_OVERWRITE,
2120 0,
2121 data_00, sizeof(data_00),
2122 &obj,
2123 storage_id);
2124
2125 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2126 goto exit1;
2127 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
2128 goto exit1;
2129
2130 res = fs_access_with_bad_object_id_ref(&sess,
2131 TA_STORAGE_CMD_OPEN_ID_IN_SHM,
2132 file_01, sizeof(file_01),
2133 TEE_DATA_FLAG_ACCESS_WRITE |
2134 TEE_DATA_FLAG_ACCESS_WRITE_META |
2135 TEE_DATA_FLAG_OVERWRITE,
2136 0,
2137 NULL, 0,
2138 &obj,
2139 storage_id);
2140
2141 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
2142
2143 /*
2144 * Invalid create-overwrite request from the TA (object ID reference in SHM)
2145 */
2146 TEEC_CloseSession(&sess);
2147 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
2148 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2149 return;
2150
2151 res = fs_access_with_bad_object_id_ref(&sess,
2152 TA_STORAGE_CMD_CREATEOVER_ID_IN_SHM,
2153 file_01, sizeof(file_01),
2154 0,
2155 0,
2156 NULL, 0,
2157 NULL,
2158 storage_id);
2159
2160 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
2161
2162 /*
2163 * Invalid rename request from the TA (object ID reference in SHM)
2164 */
2165 TEEC_CloseSession(&sess);
2166 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
2167 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2168 return;
2169
2170 res = fs_open(&sess, file_01, sizeof(file_01),
2171 TEE_DATA_FLAG_ACCESS_WRITE |
2172 TEE_DATA_FLAG_ACCESS_WRITE_META |
2173 TEE_DATA_FLAG_OVERWRITE,
2174 &obj,
2175 storage_id);
2176
2177 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2178 goto exit1;
2179
2180 res = fs_access_with_bad_object_id_ref(&sess,
2181 TA_STORAGE_CMD_RENAME_ID_IN_SHM,
2182 file_01, sizeof(file_01) - 1,
2183 0,
2184 0,
2185 NULL, 0,
2186 &obj,
2187 0);
2188
2189 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
2190
2191 /*
2192 * Invalid creation request from the TA (object ID reference in SHM)
2193 */
2194 TEEC_CloseSession(&sess);
2195 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
2196 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2197 return;
2198
2199 res = fs_open(&sess, file_01, sizeof(file_01),
2200 TEE_DATA_FLAG_ACCESS_WRITE |
2201 TEE_DATA_FLAG_ACCESS_WRITE_META |
2202 TEE_DATA_FLAG_OVERWRITE,
2203 &obj,
2204 storage_id);
2205
2206 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2207 goto exit1;
2208
2209 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
2210
2211 res = fs_access_with_bad_object_id_ref(&sess,
2212 TA_STORAGE_CMD_CREATE_ID_IN_SHM,
2213 file_01, sizeof(file_01),
2214 TEE_DATA_FLAG_ACCESS_WRITE |
2215 TEE_DATA_FLAG_ACCESS_WRITE_META |
2216 TEE_DATA_FLAG_OVERWRITE,
2217 0,
2218 data_00, sizeof(data_00),
2219 &obj,
2220 storage_id);
2221
2222 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
2223
2224 return;
2225exit1:
2226 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
2227 TEEC_CloseSession(&sess);
2228}
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002229DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6020)
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002230ADBG_CASE_DEFINE(regression, 6020, xtest_tee_test_6020,
2231 "Object IDs in SHM (negative)");