blob: ca1c2543df37026bc50ad461e6867406d413da28 [file] [log] [blame]
Etienne Carriere9b7b70d2020-05-16 10:27:23 +02001// SPDX-License-Identifier: GPL-2.0
Pascal Brandc639ac82015-07-02 08:53:34 +02002/*
3 * Copyright (c) 2014, STMicroelectronics International N.V.
Pascal Brandc639ac82015-07-02 08:53:34 +02004 */
5
6#include <string.h>
7#include <stdio.h>
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08008#include <pthread.h>
Pascal Brandc639ac82015-07-02 08:53:34 +02009
10#include <adbg.h>
11#include <xtest_test.h>
12#include <xtest_helpers.h>
13
14#include <tee_client_api.h>
15#include <ta_storage.h>
16#include <tee_api_defines.h>
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020017#include <tee_api_defines_extensions.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020018#include <tee_api_types.h>
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020019#include <util.h>
20
Jens Wiklander14f48872018-06-29 15:30:13 +020021#define DEFINE_TEST_MULTIPLE_STORAGE_IDS(test_name) \
22static void test_name(ADBG_Case_t *c) \
23{ \
24 size_t i; \
25 \
26 for (i = 0; i < ARRAY_SIZE(storage_ids); i++) { \
27 Do_ADBG_BeginSubCase(c, "Storage id: %08x", storage_ids[i]); \
28 test_name##_single(c, storage_ids[i]); \
29 Do_ADBG_EndSubCase(c, "Storage id: %08x", storage_ids[i]); \
30 } \
31}
32
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020033static uint32_t storage_ids[] = {
34 TEE_STORAGE_PRIVATE,
35#ifdef CFG_REE_FS
36 TEE_STORAGE_PRIVATE_REE,
37#endif
38#ifdef CFG_RPMB_FS
39 TEE_STORAGE_PRIVATE_RPMB,
40#endif
41};
Pascal Brandc639ac82015-07-02 08:53:34 +020042
43static uint8_t file_00[] = {
44 0x00, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
45 0xF0, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
46 0xE9, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
47 0xF0, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x8E
48};
49
50static uint8_t file_01[] = {
51 0x01, 0x00
52};
53
54static uint8_t file_02[] = {
55 0x02, 0x11, 0x02
56};
57
58static uint8_t file_03[] = {
59 0x03, 0x13, 0x03
60};
61
Pascal Brandeb84c442016-04-19 17:49:49 +020062static uint8_t file_04[] = {
63 0x00, 0x01, 0x02
64};
65
Pascal Brandc639ac82015-07-02 08:53:34 +020066static uint8_t data_00[] = {
67 0x00, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
68 0x00, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
69 0x00, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
70 0x00, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x00
71};
72
73static uint8_t data_01[] = {
74 0x01, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
75 0x01, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
76 0x01, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
77 0x01, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x01
78};
79
Jens Wiklanderaba31ba2017-02-15 15:24:06 +010080static uint32_t fs_id_for_tee_storage_private(void)
81{
82#if defined(CFG_REE_FS)
83 return TEE_STORAGE_PRIVATE_REE;
84#elif defined(CFG_RPMB_FS)
85 return TEE_STORAGE_PRIVATE_RPMB;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +010086#endif
87}
88
89static uint32_t real_id_for(uint32_t id)
90{
91 if (id == TEE_STORAGE_PRIVATE)
92 return fs_id_for_tee_storage_private();
93 return id;
94}
95
96static bool storage_is(uint32_t id1, uint32_t id2)
97{
98 return (real_id_for(id1) == real_id_for(id2));
99}
100
Pascal Brandc639ac82015-07-02 08:53:34 +0200101static TEEC_Result fs_open(TEEC_Session *sess, void *id, uint32_t id_size,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200102 uint32_t flags, uint32_t *obj, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200103{
Aijun Sun473d9072015-08-06 15:24:49 +0800104 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100105 TEEC_Result res = TEEC_ERROR_GENERIC;
106 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200107
108 op.params[0].tmpref.buffer = id;
109 op.params[0].tmpref.size = id_size;
110 op.params[1].value.a = flags;
111 op.params[1].value.b = 0;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200112 op.params[2].value.a = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200113
114 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200115 TEEC_VALUE_INOUT, TEEC_VALUE_INPUT,
Pascal Brandc639ac82015-07-02 08:53:34 +0200116 TEEC_NONE);
117
118 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_OPEN, &op, &org);
119
120 if (res == TEEC_SUCCESS)
121 *obj = op.params[1].value.b;
122
123 return res;
124}
125
126static TEEC_Result fs_create(TEEC_Session *sess, void *id, uint32_t id_size,
127 uint32_t flags, uint32_t attr, void *data,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200128 uint32_t data_size, uint32_t *obj,
129 uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200130{
Aijun Sun473d9072015-08-06 15:24:49 +0800131 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100132 TEEC_Result res = TEEC_ERROR_GENERIC;
133 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200134
135 op.params[0].tmpref.buffer = id;
136 op.params[0].tmpref.size = id_size;
137 op.params[1].value.a = flags;
138 op.params[1].value.b = 0;
139 op.params[2].value.a = attr;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200140 op.params[2].value.b = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200141 op.params[3].tmpref.buffer = data;
142 op.params[3].tmpref.size = data_size;
143
144 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
145 TEEC_VALUE_INOUT, TEEC_VALUE_INPUT,
146 TEEC_MEMREF_TEMP_INPUT);
147
148 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CREATE, &op, &org);
149
150 if (res == TEEC_SUCCESS)
151 *obj = op.params[1].value.b;
152
153 return res;
154}
155
Pascal Brandeb84c442016-04-19 17:49:49 +0200156static TEEC_Result fs_create_overwrite(TEEC_Session *sess, void *id,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200157 uint32_t id_size, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +0200158{
159 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100160 TEEC_Result res = TEEC_ERROR_GENERIC;
161 uint32_t org = 0;
Pascal Brandeb84c442016-04-19 17:49:49 +0200162
163 op.params[0].tmpref.buffer = id;
164 op.params[0].tmpref.size = id_size;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200165 op.params[1].value.a = storage_id;
Pascal Brandeb84c442016-04-19 17:49:49 +0200166
167 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200168 TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brandeb84c442016-04-19 17:49:49 +0200169 TEEC_NONE);
170
171 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CREATE_OVERWRITE, &op, &org);
172
173 return res;
174}
175
Pascal Brandc639ac82015-07-02 08:53:34 +0200176static TEEC_Result fs_close(TEEC_Session *sess, uint32_t obj)
177{
Aijun Sun473d9072015-08-06 15:24:49 +0800178 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100179 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200180
181 op.params[0].value.a = obj;
182
183 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
184 TEEC_NONE, TEEC_NONE);
185
186 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CLOSE, &op, &org);
187}
188
189static TEEC_Result fs_read(TEEC_Session *sess, uint32_t obj, void *data,
190 uint32_t data_size, uint32_t *count)
191{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100192 TEEC_Result res = TEEC_ERROR_GENERIC;
Aijun Sun473d9072015-08-06 15:24:49 +0800193 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100194 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200195
196 op.params[0].tmpref.buffer = data;
197 op.params[0].tmpref.size = data_size;
198 op.params[1].value.a = obj;
199 op.params[1].value.b = 0;
200
201 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
202 TEEC_VALUE_INOUT, TEEC_NONE,
203 TEEC_NONE);
204
205 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_READ, &op, &org);
206
207 if (res == TEEC_SUCCESS)
208 *count = op.params[1].value.b;
209
210 return res;
211}
212
213static TEEC_Result fs_write(TEEC_Session *sess, uint32_t obj, void *data,
214 uint32_t data_size)
215{
Aijun Sun473d9072015-08-06 15:24:49 +0800216 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100217 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200218
219 op.params[0].tmpref.buffer = data;
220 op.params[0].tmpref.size = data_size;
221 op.params[1].value.a = obj;
222 op.params[1].value.b = 0;
223
224 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
225 TEEC_VALUE_INPUT, TEEC_NONE,
226 TEEC_NONE);
227
228 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_WRITE, &op, &org);
229}
230
231static TEEC_Result fs_seek(TEEC_Session *sess, uint32_t obj, int32_t offset,
232 int32_t whence)
233{
Aijun Sun473d9072015-08-06 15:24:49 +0800234 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100235 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200236
237 op.params[0].value.a = obj;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200238 op.params[0].value.b = *(uint32_t *)&offset;
Pascal Brandc639ac82015-07-02 08:53:34 +0200239 op.params[1].value.a = whence;
240
241 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INOUT,
242 TEEC_NONE, TEEC_NONE);
243
244 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_SEEK, &op, &org);
245}
246
247static TEEC_Result fs_unlink(TEEC_Session *sess, uint32_t obj)
248{
Aijun Sun473d9072015-08-06 15:24:49 +0800249 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100250 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200251
252 op.params[0].value.a = obj;
253
254 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
255 TEEC_NONE, TEEC_NONE);
256
257 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_UNLINK, &op, &org);
258}
259
260static TEEC_Result fs_trunc(TEEC_Session *sess, uint32_t obj, uint32_t len)
261{
Aijun Sun473d9072015-08-06 15:24:49 +0800262 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100263 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200264
265 op.params[0].value.a = obj;
266 op.params[0].value.b = len;
267
268 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
269 TEEC_NONE, TEEC_NONE);
270
271 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_TRUNC, &op, &org);
272}
273
274static TEEC_Result fs_rename(TEEC_Session *sess, uint32_t obj, void *id,
275 uint32_t id_size)
276{
Aijun Sun473d9072015-08-06 15:24:49 +0800277 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100278 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200279
280 op.params[0].value.a = obj;
281 op.params[1].tmpref.buffer = id;
282 op.params[1].tmpref.size = id_size;
283
284 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
285 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
286 TEEC_NONE);
287
288 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RENAME, &op, &org);
289}
290
291static TEEC_Result fs_alloc_enum(TEEC_Session *sess, uint32_t *e)
292{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100293 TEEC_Result res = TEEC_ERROR_GENERIC;
Aijun Sun473d9072015-08-06 15:24:49 +0800294 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100295 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200296
297 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE,
298 TEEC_NONE, TEEC_NONE);
299
300 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_ALLOC_ENUM, &op, &org);
301
302 if (res == TEEC_SUCCESS)
303 *e = op.params[0].value.a;
304
305 return res;
306}
307
Jerome Forissier5d969d82017-03-21 10:01:04 +0100308static TEEC_Result fs_reset_enum(TEEC_Session *sess, uint32_t e)
309{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100310 TEEC_Result res = TEEC_ERROR_GENERIC;
Jerome Forissier5d969d82017-03-21 10:01:04 +0100311 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100312 uint32_t org = 0;
Jerome Forissier5d969d82017-03-21 10:01:04 +0100313
314 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
315 TEEC_NONE, TEEC_NONE);
316
317 op.params[0].value.a = e;
318 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESET_ENUM, &op, &org);
319
320 return res;
321}
322
Pascal Brandc639ac82015-07-02 08:53:34 +0200323static TEEC_Result fs_free_enum(TEEC_Session *sess, uint32_t e)
324{
Aijun Sun473d9072015-08-06 15:24:49 +0800325 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100326 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200327
328 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
329 TEEC_NONE);
330
331 op.params[0].value.a = e;
332
333 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_FREE_ENUM, &op, &org);
334}
335
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200336static TEEC_Result fs_start_enum(TEEC_Session *sess, uint32_t e,
337 uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200338{
Aijun Sun473d9072015-08-06 15:24:49 +0800339 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100340 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200341
342 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
343 TEEC_NONE, TEEC_NONE);
344
345 op.params[0].value.a = e;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200346 op.params[0].value.b = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200347
348 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_START_ENUM, &op, &org);
349}
350
351static TEEC_Result fs_next_enum(TEEC_Session *sess, uint32_t e, void *obj_info,
352 size_t info_size, void *id, uint32_t id_size)
353{
Aijun Sun473d9072015-08-06 15:24:49 +0800354 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100355 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200356
Pascal Brandc603e0d2016-04-25 12:37:18 +0200357 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brandc639ac82015-07-02 08:53:34 +0200358 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
Pascal Brandc603e0d2016-04-25 12:37:18 +0200359 if (obj_info && info_size)
360 op.paramTypes |= (TEEC_MEMREF_TEMP_OUTPUT << 4);
Pascal Brandc639ac82015-07-02 08:53:34 +0200361
362 op.params[0].value.a = e;
363 op.params[1].tmpref.buffer = obj_info;
364 op.params[1].tmpref.size = info_size;
365 op.params[2].tmpref.buffer = id;
366 op.params[2].tmpref.size = id_size;
367
368 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_NEXT_ENUM, &op, &org);
369}
370
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200371static TEEC_Result fs_restrict_usage(TEEC_Session *sess, uint32_t obj,
372 uint32_t obj_usage)
373{
374 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100375 uint32_t org = 0;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200376
377 op.params[0].value.a = obj;
378 op.params[0].value.b = obj_usage;
379
380 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
381 TEEC_NONE, TEEC_NONE);
382
383 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESTRICT_USAGE,
384 &op, &org);
385}
386
387static TEEC_Result fs_alloc_obj(TEEC_Session *sess, uint32_t obj_type,
388 uint32_t max_key_size, uint32_t *obj)
389{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100390 TEEC_Result res = TEEC_ERROR_GENERIC;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200391 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100392 uint32_t org = 0;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200393
394 op.params[0].value.a = obj_type;
395 op.params[0].value.b = max_key_size;
396
397 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
398 TEEC_NONE, TEEC_NONE);
399
400 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_ALLOC_OBJ, &op, &org);
401 *obj = op.params[1].value.a;
402 return res;
403}
404
405static TEEC_Result fs_free_obj(TEEC_Session *sess, uint32_t obj)
406{
407 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100408 uint32_t org = 0;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200409
410 op.params[0].value.a = obj;
411
412 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
413 TEEC_NONE, TEEC_NONE);
414
415 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_FREE_OBJ, &op, &org);
416}
417
418static TEEC_Result fs_reset_obj(TEEC_Session *sess, uint32_t obj)
419{
420 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100421 uint32_t org = 0;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200422
423 op.params[0].value.a = obj;
424
425 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
426 TEEC_NONE, TEEC_NONE);
427
428 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESET_OBJ, &op, &org);
429}
430
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800431static TEEC_Result fs_get_obj_info(TEEC_Session *sess, uint32_t obj,
432 void *obj_info, size_t info_size)
433{
434 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100435 uint32_t org = 0;
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800436
437 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
438 TEEC_MEMREF_TEMP_OUTPUT,
439 TEEC_NONE, TEEC_NONE);
440
441 op.params[0].value.a = obj;
442 op.params[1].tmpref.buffer = obj_info;
443 op.params[1].tmpref.size = info_size;
444
445 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_GET_OBJ_INFO, &op, &org);
446}
447
James Kung98c0ba12015-09-09 15:51:59 +0800448/* trunc */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200449static void test_truncate_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800450{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100451 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100452 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100453 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100454 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100455 uint32_t orig = 0;
James Kung98c0ba12015-09-09 15:51:59 +0800456
457 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
458 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
459 return;
460
461 /* create */
462 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
463 fs_create(&sess, file_01, sizeof(file_01),
464 TEE_DATA_FLAG_ACCESS_WRITE |
465 TEE_DATA_FLAG_ACCESS_READ |
466 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200467 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800468 goto exit;
469
470 /* trunc */
471 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 10)))
472 goto exit;
473
474 /* seek */
475 if (!ADBG_EXPECT_TEEC_SUCCESS(
476 c, fs_seek(&sess, obj, 5, TEE_DATA_SEEK_SET)))
477 goto exit;
478
479 /* verify */
480 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
481 goto exit;
482
483 /* check buffer */
484 (void)ADBG_EXPECT_BUFFER(c, &data_00[5], 5, out, count);
485
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100486 /* close */
487 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
488 goto exit;
489
490 /* open */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100491 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100492 TEE_DATA_FLAG_ACCESS_WRITE |
493 TEE_DATA_FLAG_ACCESS_READ |
494 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
495 goto exit;
496
497 /* seek */
498 if (!ADBG_EXPECT_TEEC_SUCCESS(
499 c, fs_seek(&sess, obj, 5, TEE_DATA_SEEK_SET)))
500 goto exit;
501
502 /* verify */
503 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
504 goto exit;
505
506 /* check buffer */
507 (void)ADBG_EXPECT_BUFFER(c, &data_00[5], 5, out, count);
508
James Kung98c0ba12015-09-09 15:51:59 +0800509 /* clean */
510 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
511 goto exit;
512
513exit:
514 TEEC_CloseSession(&sess);
515}
516
517/* extend */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200518static void test_extend_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800519{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100520 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100521 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100522 uint8_t out[10] = { };
523 uint8_t expect[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100524 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100525 uint32_t orig = 0;
James Kung98c0ba12015-09-09 15:51:59 +0800526
527 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
528 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
529 return;
530
531 /* create */
532 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
533 fs_create(&sess, file_01, sizeof(file_01),
534 TEE_DATA_FLAG_ACCESS_WRITE |
535 TEE_DATA_FLAG_ACCESS_READ |
536 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200537 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800538 goto exit;
539
540 /* extend */
541 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 40)))
542 goto exit;
543
544 /* seek */
545 if (!ADBG_EXPECT_TEEC_SUCCESS(
546 c, fs_seek(&sess, obj, 30, TEE_DATA_SEEK_SET)))
547 goto exit;
548
549 /* verify */
550 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
551 goto exit;
552
553 /* check buffer */
554 expect[0] = data_00[30];
555 expect[1] = data_00[31];
556 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
557
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100558 /* close */
559 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
560 goto exit;
561
562 /* open */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100563 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100564 TEE_DATA_FLAG_ACCESS_WRITE |
565 TEE_DATA_FLAG_ACCESS_READ |
566 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
567 goto exit;
568
569 /* seek */
570 if (!ADBG_EXPECT_TEEC_SUCCESS(
571 c, fs_seek(&sess, obj, 30, TEE_DATA_SEEK_SET)))
572 goto exit;
573
574 /* verify */
575 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
576 goto exit;
577
578 /* check buffer */
579 expect[0] = data_00[30];
580 expect[1] = data_00[31];
581 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
582
James Kung98c0ba12015-09-09 15:51:59 +0800583 /* clean */
584 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
585 goto exit;
586
587exit:
588 TEEC_CloseSession(&sess);
589}
590
591/* file hole */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200592static void test_file_hole(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800593{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100594 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100595 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100596 uint8_t out[10] = { };
597 uint8_t expect[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100598 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100599 uint32_t orig = 0;
James Kung98c0ba12015-09-09 15:51:59 +0800600
601 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
602 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
603 return;
604
605 /* create */
606 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
607 fs_create(&sess, file_01, sizeof(file_01),
608 TEE_DATA_FLAG_ACCESS_WRITE |
609 TEE_DATA_FLAG_ACCESS_READ |
610 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200611 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800612 goto exit;
613
614 /* seek */
615 if (!ADBG_EXPECT_TEEC_SUCCESS(
616 c, fs_seek(&sess, obj, 80, TEE_DATA_SEEK_SET)))
617 goto exit;
618
619 /* write */
620 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_write(&sess, obj, data_00,
621 sizeof(data_00))))
622 goto exit;
623
624 /* seek */
625 if (!ADBG_EXPECT_TEEC_SUCCESS(
626 c, fs_seek(&sess, obj, 74, TEE_DATA_SEEK_SET)))
627 goto exit;
628
629 /* verify */
630 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
631 goto exit;
632
633 /* check buffer */
634 expect[6] = data_00[0];
635 expect[7] = data_00[1];
636 expect[8] = data_00[2];
637 expect[9] = data_00[3];
638 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
639
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100640 /* close */
641 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
642 goto exit;
643
644 /* open */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100645 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100646 TEE_DATA_FLAG_ACCESS_WRITE |
647 TEE_DATA_FLAG_ACCESS_READ |
648 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
649 goto exit;
650
651 /* seek */
652 if (!ADBG_EXPECT_TEEC_SUCCESS(
653 c, fs_seek(&sess, obj, 74, TEE_DATA_SEEK_SET)))
654 goto exit;
655
656 /* verify */
657 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
658 goto exit;
659
660 /* check buffer */
661 expect[6] = data_00[0];
662 expect[7] = data_00[1];
663 expect[8] = data_00[2];
664 expect[9] = data_00[3];
665 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
666
James Kung98c0ba12015-09-09 15:51:59 +0800667 /* clean */
668 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
669 goto exit;
670
671exit:
672 TEEC_CloseSession(&sess);
673}
674
Pascal Brandc639ac82015-07-02 08:53:34 +0200675/* create */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200676static void xtest_tee_test_6001_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200677{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100678 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100679 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100680 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200681
682 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
683 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
684 return;
685
686 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
687 fs_create(&sess, file_00, sizeof(file_00),
688 TEE_DATA_FLAG_ACCESS_WRITE |
689 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200690 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200691 goto exit;
692
693 /* clean */
694 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
695 goto exit;
696
697exit:
698 TEEC_CloseSession(&sess);
699}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200700DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6001)
Jens Wiklander14f48872018-06-29 15:30:13 +0200701ADBG_CASE_DEFINE(regression, 6001, xtest_tee_test_6001,
702 "Test TEE_CreatePersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200703
Pascal Brandc639ac82015-07-02 08:53:34 +0200704/* open */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200705static void xtest_tee_test_6002_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200706{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100707 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100708 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100709 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200710
711 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
712 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
713 return;
714
715 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
716 fs_create(&sess, file_01, sizeof(file_01),
717 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200718 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200719 goto exit;
720
721 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
722 goto exit;
723
724 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
725 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200726 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200727 goto exit;
728
729 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
730 goto exit;
731
732 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
733 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200734 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200735 goto exit;
736
737 /* clean */
738 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
739 goto exit;
740
741exit:
742 TEEC_CloseSession(&sess);
743}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200744DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6002)
Jens Wiklander14f48872018-06-29 15:30:13 +0200745ADBG_CASE_DEFINE(regression, 6002, xtest_tee_test_6002,
746 "Test TEE_OpenPersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200747
Pascal Brandc639ac82015-07-02 08:53:34 +0200748/* read */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200749static void xtest_tee_test_6003_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200750{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100751 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100752 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100753 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100754 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100755 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200756
757 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
758 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
759 return;
760
761 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
762 fs_create(&sess, file_02, sizeof(file_02),
763 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200764 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200765 goto exit;
766
767 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
768 goto exit;
769
770 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
771 fs_open(&sess, file_02, sizeof(file_02),
772 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200773 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200774 goto exit;
775
776 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
777 goto exit;
778
779 (void)ADBG_EXPECT_BUFFER(c, data_01, 10, out, count);
780
781 /* clean */
782 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
783 goto exit;
784
785exit:
786 TEEC_CloseSession(&sess);
787}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200788DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6003)
Jens Wiklander14f48872018-06-29 15:30:13 +0200789ADBG_CASE_DEFINE(regression, 6003, xtest_tee_test_6003,
790 "Test TEE_ReadObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200791
Pascal Brandc639ac82015-07-02 08:53:34 +0200792/* write */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200793static void xtest_tee_test_6004_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200794{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100795 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100796 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100797 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100798 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100799 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200800
801 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
802 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
803 return;
804
805 /* create */
806 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
807 fs_create(&sess, file_02, sizeof(file_02),
808 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200809 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200810 goto exit;
811
812 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
813 goto exit;
814
815 /* write new data */
816 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
817 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200818 TEE_DATA_FLAG_ACCESS_WRITE, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200819 goto exit;
820
821 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
822 fs_write(&sess, obj, data_00, sizeof(data_00))))
823 goto exit;
824
825 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
826 goto exit;
827
828 /* verify */
829 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
830 fs_open(&sess, file_02, sizeof(file_02),
831 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200832 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200833 goto exit;
834
835 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
836 goto exit;
837
838 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
839
840 /* clean */
841 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
842 goto exit;
843
844exit:
845 TEEC_CloseSession(&sess);
846}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200847DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6004)
Jens Wiklander14f48872018-06-29 15:30:13 +0200848ADBG_CASE_DEFINE(regression, 6004, xtest_tee_test_6004,
849 "Test TEE_WriteObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200850
Pascal Brandc639ac82015-07-02 08:53:34 +0200851/* seek */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200852static void xtest_tee_test_6005_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200853{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100854 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100855 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100856 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100857 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100858 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200859
860 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
861 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
862 return;
863
864 /* create */
865 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
866 fs_create(&sess, file_01, sizeof(file_01),
867 TEE_DATA_FLAG_ACCESS_WRITE |
868 TEE_DATA_FLAG_ACCESS_READ |
869 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200870 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200871 goto exit;
872
873 /* seek */
874 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
875 fs_seek(&sess, obj, 10, TEE_DATA_SEEK_SET)))
876 goto exit;
877
878 /* verify */
879 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
880 goto exit;
881
882 (void)ADBG_EXPECT_BUFFER(c, &data_00[10], 10, out, count);
883
884 /* clean */
885 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
886 goto exit;
887
888exit:
889 TEEC_CloseSession(&sess);
890}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200891DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6005)
Jens Wiklander14f48872018-06-29 15:30:13 +0200892ADBG_CASE_DEFINE(regression, 6005, xtest_tee_test_6005,
893 "Test TEE_SeekObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200894
Pascal Brandc639ac82015-07-02 08:53:34 +0200895/* unlink */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200896static void xtest_tee_test_6006_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200897{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100898 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100899 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100900 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200901
902 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
903 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
904 return;
905
906 /* create */
907 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
908 fs_create(&sess, file_01, sizeof(file_01),
909 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200910 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200911 goto exit;
912
913 /* del & close */
914 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
915 goto exit;
916
917 /* check result */
918 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
919 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200920 TEE_DATA_FLAG_ACCESS_READ, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200921 goto exit;
922
923exit:
924 TEEC_CloseSession(&sess);
925}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200926DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6006)
Jens Wiklander14f48872018-06-29 15:30:13 +0200927ADBG_CASE_DEFINE(regression, 6006, xtest_tee_test_6006,
928 "Test TEE_CloseAndDeletePersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200929
930static void xtest_tee_test_6007_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200931{
James Kung98c0ba12015-09-09 15:51:59 +0800932 Do_ADBG_BeginSubCase(c, "Test truncate file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200933 test_truncate_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +0800934 Do_ADBG_EndSubCase(c, "Test truncate file length");
Pascal Brandc639ac82015-07-02 08:53:34 +0200935
James Kung98c0ba12015-09-09 15:51:59 +0800936 Do_ADBG_BeginSubCase(c, "Test extend file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200937 test_extend_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +0800938 Do_ADBG_EndSubCase(c, "Test extend file length");
Pascal Brandc639ac82015-07-02 08:53:34 +0200939
James Kung98c0ba12015-09-09 15:51:59 +0800940 Do_ADBG_BeginSubCase(c, "Test file hole");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200941 test_file_hole(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +0800942 Do_ADBG_EndSubCase(c, "Test file hole");
Pascal Brandc639ac82015-07-02 08:53:34 +0200943}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200944DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6007)
Jens Wiklander14f48872018-06-29 15:30:13 +0200945ADBG_CASE_DEFINE(regression, 6007, xtest_tee_test_6007,
946 "Test TEE_TruncateObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200947
948static void xtest_tee_test_6008_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200949{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100950 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100951 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100952 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100953 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100954 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200955
956 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
957 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
958 return;
959
960 /* create */
961 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
962 fs_create(&sess, file_02, sizeof(file_02),
963 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200964 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200965 goto exit;
966
967 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
968 goto exit;
969
970 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
971 fs_open(&sess, file_02, sizeof(file_02),
972 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200973 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200974 goto exit;
975
976 /* write new data */
977 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
978 fs_write(&sess, obj, data_00, sizeof(data_00))))
979 goto exit;
980
981 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
982 fs_rename(&sess, obj, file_03, sizeof(file_03))))
983 goto exit;
984
985 /* close */
986 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
987 goto exit;
988
989 /* verify */
990 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
991 fs_open(&sess, file_03, sizeof(file_03),
992 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200993 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200994 goto exit;
995
996 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
997 goto exit;
998
999 /* check buffer */
1000 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
1001
1002 /* clean */
1003 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1004 goto exit;
1005
1006exit:
1007 TEEC_CloseSession(&sess);
1008}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001009DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6008)
Jens Wiklander14f48872018-06-29 15:30:13 +02001010ADBG_CASE_DEFINE(regression, 6008, xtest_tee_test_6008,
1011 "Test TEE_RenamePersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001012
1013static void xtest_tee_test_6009_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001014{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001015 TEEC_Session sess = { };
1016 uint32_t obj0 = 0;
1017 uint32_t obj1 = 0;
1018 uint32_t obj2 = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001019 uint32_t e = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001020 uint8_t info[200] = { };
1021 uint8_t id[200] = { };
1022 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001023
1024 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1025 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1026 return;
1027
1028 /* create file 00 */
1029 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1030 fs_create(&sess, file_00, sizeof(file_00),
1031 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001032 sizeof(data_01), &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001033 goto exit;
1034
1035 /* create file 01 */
1036 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1037 fs_create(&sess, file_01, sizeof(file_01),
1038 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001039 sizeof(data_01), &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001040 goto exit;
1041
1042 /* create file 02 */
1043 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1044 fs_create(&sess, file_02, sizeof(file_02),
1045 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001046 sizeof(data_01), &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001047 goto exit;
1048
1049 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj0)))
1050 goto exit;
1051
1052 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj1)))
1053 goto exit;
1054
1055 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj2)))
1056 goto exit;
1057
1058 /* iterate */
1059 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e)))
1060 goto exit;
1061
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001062 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_start_enum(&sess, e, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001063 goto exit;
1064
1065 /* get 00 */
1066 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1067 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1068 goto exit;
1069
1070 /* get 01 */
1071 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc603e0d2016-04-25 12:37:18 +02001072 fs_next_enum(&sess, e, NULL, 0, id, sizeof(id))))
Pascal Brandc639ac82015-07-02 08:53:34 +02001073 goto exit;
1074
1075 /* get 02 */
1076 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1077 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1078 goto exit;
1079
1080 /* we should not have more files */
1081 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1082 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1083 goto exit;
1084
1085 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e)))
1086 goto exit;
1087
1088 /* clean */
1089 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1090 fs_open(&sess, file_00, sizeof(file_00),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001091 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001092 goto exit;
1093
1094 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj0)))
1095 goto exit;
1096
1097 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1098 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001099 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001100 goto exit;
1101
1102 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj1)))
1103 goto exit;
1104
1105 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1106 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001107 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001108 goto exit;
1109
1110 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj2)))
1111 goto exit;
1112
1113exit:
1114 TEEC_CloseSession(&sess);
1115}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001116DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6009)
Jens Wiklander14f48872018-06-29 15:30:13 +02001117ADBG_CASE_DEFINE(regression, 6009, xtest_tee_test_6009,
1118 "Test TEE Internal API Persistent Object Enumeration Functions");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001119
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001120static void xtest_tee_test_6010_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand8a74e362015-09-10 12:41:52 +02001121{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001122 TEEC_Session sess = { };
1123 uint32_t orig = 0;
1124 uint32_t o1 = 0;
1125 uint32_t o2 = 0;
1126 uint32_t e = 0;
1127 uint32_t f = 0;
1128 uint8_t data[1024] = { };
1129 uint8_t out[1024] = { };
1130 uint32_t n = 0;
Pascal Brand30844922015-09-17 12:12:42 +02001131
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001132 for (n = 0; n < ARRAY_SIZE(data); n++)
1133 data[n] = n;
Pascal Brand8a74e362015-09-10 12:41:52 +02001134
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001135 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1136 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1137 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001138
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001139 Do_ADBG_BeginSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001140
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001141 o1 = TEE_HANDLE_NULL;
1142 o2 = TEE_HANDLE_NULL;
1143 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1144 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1145 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
Pascal Brand8a74e362015-09-10 12:41:52 +02001146
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001147 ADBG_EXPECT_TEEC_SUCCESS(c,
1148 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1149 sizeof(data), &o1, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001150
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001151 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE;
1152 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ACCESS_CONFLICT,
1153 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1154 sizeof(data), &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001155
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001156 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1157 if (o2)
1158 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
Pascal Brand8a74e362015-09-10 12:41:52 +02001159
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001160 Do_ADBG_EndSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001161
Pascal Brand8a74e362015-09-10 12:41:52 +02001162
Pascal Brand8a74e362015-09-10 12:41:52 +02001163
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001164 Do_ADBG_BeginSubCase(c, "RestrictObjectUsage Panic");
1165 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1166 fs_restrict_usage(&sess, 0xffffbad0, 0xffffffff));
1167 Do_ADBG_EndSubCase(c, "RestrictObjectUsage Panic");
Pascal Brand8a74e362015-09-10 12:41:52 +02001168
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001169 TEEC_CloseSession(&sess);
1170 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1171 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1172 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001173
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001174 Do_ADBG_BeginSubCase(c, "SeekObjectData BadHandle");
1175 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1176 fs_seek(&sess, 0xffffbad0, 5, TEE_DATA_SEEK_SET));
1177 Do_ADBG_EndSubCase(c, "SeekObjectData BadHandle");
Pascal Brand8a74e362015-09-10 12:41:52 +02001178
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001179 TEEC_CloseSession(&sess);
1180 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1181 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1182 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001183
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001184 Do_ADBG_BeginSubCase(c, "SeekObjectData NotPersist");
1185 o1 = 0;
1186 ADBG_EXPECT_TEEC_SUCCESS(c,
1187 fs_alloc_obj(&sess, TEE_TYPE_AES, 256, &o1));
1188 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1189 fs_seek(&sess, o1, 5, TEE_DATA_SEEK_SET));
1190 Do_ADBG_EndSubCase(c, "SeekObjectData NotPersist");
Pascal Brand8a74e362015-09-10 12:41:52 +02001191
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001192 TEEC_CloseSession(&sess);
1193 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1194 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1195 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001196
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001197 Do_ADBG_BeginSubCase(c, "SeekWriteRead");
1198 o1 = 0;
1199 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1200 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1201 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1202 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1203 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1204 sizeof(data), &o1, storage_id)))
1205 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001206
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001207 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1208 fs_seek(&sess, o1, 2, TEE_DATA_SEEK_SET)))
1209 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001210
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001211 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1212 fs_seek(&sess, o1, 0, TEE_DATA_SEEK_END)))
1213 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001214
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001215 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1216 fs_write(&sess, o1, data, sizeof(data))))
1217 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001218
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001219 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1220 fs_seek(&sess, o1, sizeof(data), TEE_DATA_SEEK_SET)))
1221 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001222
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001223 memset(out, 0xab, sizeof(out));
1224 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1225 fs_read(&sess, o1, out, sizeof(out), &n)))
1226 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001227
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001228 ADBG_EXPECT_BUFFER(c, data, sizeof(data), out, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001229
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001230 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander3a6892e2016-09-14 15:53:52 +02001231 fs_seek(&sess, o1, 10, TEE_DATA_SEEK_END)))
1232 goto seek_write_read_out;
1233
1234 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1235 fs_read(&sess, o1, out, sizeof(out), &n)))
1236 goto seek_write_read_out;
1237 ADBG_EXPECT_COMPARE_UNSIGNED(c, n, ==, 0);
1238
1239 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001240 fs_seek(&sess, o1, -(int32_t)sizeof(data) / 2,
1241 TEE_DATA_SEEK_END)))
1242 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001243
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001244 memset(out, 0xab, sizeof(out) / 2);
1245 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1246 fs_read(&sess, o1, out, sizeof(out) / 2, &n)))
1247 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001248
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001249 ADBG_EXPECT_BUFFER(c,
1250 data + sizeof(data) / 2, sizeof(data) / 2,
Melanie Favre73205032018-02-19 13:35:52 +01001251 out, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001252
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001253seek_write_read_out:
1254 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1255 Do_ADBG_EndSubCase(c, "SeekWriteRead");
Pascal Brand8a74e362015-09-10 12:41:52 +02001256
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001257 Do_ADBG_BeginSubCase(c, "Rename Access Conflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001258
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001259 o1 = TEE_HANDLE_NULL;
1260 o2 = TEE_HANDLE_NULL;
1261 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1262 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1263 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1264 ADBG_EXPECT_TEEC_SUCCESS(c,
1265 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1266 sizeof(data), &o1, storage_id));
1267 ADBG_EXPECT_TEEC_SUCCESS(c,
1268 fs_create(&sess, file_01, sizeof(file_01), f, 0, data,
1269 sizeof(data) / 2, &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001270
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001271 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ACCESS_CONFLICT,
1272 fs_rename(&sess, o2, file_00, sizeof(file_00)));
Pascal Brand8a74e362015-09-10 12:41:52 +02001273
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001274 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1275 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
1276
1277 Do_ADBG_EndSubCase(c, "Rename Access Conflict");
1278
Jerome Forissier7dbf8772018-12-19 09:05:48 +01001279 Do_ADBG_BeginSubCase(c, "Rename Access Conflict 2");
1280
1281 o1 = TEE_HANDLE_NULL;
1282 o2 = TEE_HANDLE_NULL;
1283 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1284 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1285 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1286 ADBG_EXPECT_TEEC_SUCCESS(c,
1287 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1288 sizeof(data), &o1, storage_id));
1289 ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, o1));
1290
1291 ADBG_EXPECT_TEEC_SUCCESS(c,
1292 fs_create(&sess, file_01, sizeof(file_01), f, 0, data,
1293 sizeof(data) / 2, &o2, storage_id));
1294 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ACCESS_CONFLICT,
1295 fs_rename(&sess, o2, file_00, sizeof(file_00)));
1296
1297 ADBG_EXPECT_TEEC_SUCCESS(c,
1298 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1299 sizeof(data), &o1, storage_id));
1300
1301 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1302 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
1303
1304 Do_ADBG_EndSubCase(c, "Rename Access Conflict 2");
1305
Jerome Forissier5d969d82017-03-21 10:01:04 +01001306 Do_ADBG_BeginSubCase(c, "AllocPersistentObjectEnumerator + "
1307 "ResetPersistentObjectEnumerator");
1308 e = TEE_HANDLE_NULL;
1309 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1310 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_enum(&sess, e));
1311 Do_ADBG_EndSubCase(c, "AllocPersistentObjectEnumerator + "
1312 "ResetPersistentObjectEnumerator");
1313
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001314 Do_ADBG_BeginSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1315 e = TEE_HANDLE_NULL;
1316 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1317 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1318 fs_next_enum(&sess, e, NULL, 0, out, sizeof(out)));
1319 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1320 fs_start_enum(&sess, e, storage_id));
1321 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e));
1322 Do_ADBG_EndSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1323
1324 Do_ADBG_BeginSubCase(c, "RenamePersistent ReadWrite");
1325 o1 = TEE_HANDLE_NULL;
1326 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1327 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1328 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1329 ADBG_EXPECT_TEEC_SUCCESS(c,
1330 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1331 sizeof(data), &o1, storage_id));
1332 ADBG_EXPECT_TEEC_SUCCESS(c,
1333 fs_rename(&sess, o1, file_01, sizeof(file_01)));
1334 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1335 Do_ADBG_EndSubCase(c, "RenamePersistent ReadWrite");
1336
1337 Do_ADBG_BeginSubCase(c, "Close Free Reset Null");
1338 ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, TEE_HANDLE_NULL));
1339 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_obj(&sess, TEE_HANDLE_NULL));
1340 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_obj(&sess, TEE_HANDLE_NULL));
1341 Do_ADBG_EndSubCase(c, "Close Free Reset Null");
1342
1343 TEEC_CloseSession(&sess);
Pascal Brand8a74e362015-09-10 12:41:52 +02001344}
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001345DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6010)
Jens Wiklander14f48872018-06-29 15:30:13 +02001346ADBG_CASE_DEFINE(regression, 6010, xtest_tee_test_6010, "Test Storage");
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001347
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001348static void xtest_tee_test_6012_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +02001349{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001350 TEEC_Session sess = { };
1351 uint32_t orig = 0;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001352 uint32_t obj = 0;
Pascal Brandeb84c442016-04-19 17:49:49 +02001353
Etienne Carrierea54952b2017-10-27 15:58:01 +02001354 /*
1355 * create the object a first time (forced through with overwrite attribute)
1356 */
Pascal Brandeb84c442016-04-19 17:49:49 +02001357 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1358 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1359 return;
1360
1361 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001362 fs_create_overwrite(&sess, file_04, sizeof(file_04), storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001363 goto bail1;
Pascal Brandeb84c442016-04-19 17:49:49 +02001364
1365 TEEC_CloseSession(&sess);
1366
Etienne Carrierea54952b2017-10-27 15:58:01 +02001367 /*
1368 * re-create the object two times with overwrite attribute
1369 */
Pascal Brandeb84c442016-04-19 17:49:49 +02001370 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1371 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1372 return;
1373
1374 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001375 fs_create_overwrite(&sess, file_04, sizeof(file_04),
1376 storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001377 goto bail1;
Pascal Brandeb84c442016-04-19 17:49:49 +02001378
Etienne Carrierea54952b2017-10-27 15:58:01 +02001379 /* re-create it with an object */
1380 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandeb84c442016-04-19 17:49:49 +02001381 fs_create(&sess, file_04, sizeof(file_04),
1382 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001383 TEE_DATA_FLAG_ACCESS_WRITE_META |
1384 TEE_DATA_FLAG_OVERWRITE, 0, NULL, 0, &obj,
1385 storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001386 goto bail2;
Pascal Brandeb84c442016-04-19 17:49:49 +02001387
Etienne Carrierea54952b2017-10-27 15:58:01 +02001388 TEEC_CloseSession(&sess);
Pascal Brandeb84c442016-04-19 17:49:49 +02001389
Etienne Carrierea54952b2017-10-27 15:58:01 +02001390 /*
1391 * re-create it again without overwrite flag: should fail and
1392 * existing object should not be altered.
1393 */
1394 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1395 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1396 return;
1397
1398 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ACCESS_CONFLICT,
1399 fs_create(&sess, file_04, sizeof(file_04),
1400 TEE_DATA_FLAG_ACCESS_WRITE |
1401 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, NULL, 0, &obj,
1402 storage_id)))
1403 goto bail2;
1404
1405 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1406 fs_open(&sess, file_04, sizeof(file_04),
1407 TEE_DATA_FLAG_ACCESS_READ |
1408 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj,
1409 storage_id)))
1410 goto bail1;
1411
1412bail2:
1413 /* remove the object so that xtest 600x can be replayed */
1414 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1415bail1:
Pascal Brandeb84c442016-04-19 17:49:49 +02001416 TEEC_CloseSession(&sess);
1417}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001418DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6012)
Jens Wiklander14f48872018-06-29 15:30:13 +02001419ADBG_CASE_DEFINE(regression, 6012, xtest_tee_test_6012,
1420 "Test TEE GP TTA DS init objects");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001421
1422static void xtest_tee_test_6013_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand90f23352016-05-19 15:15:47 +02001423{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001424 TEEC_Session sess = { };
1425 uint32_t orig = 0;
Pascal Brand90f23352016-05-19 15:15:47 +02001426 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1427
1428 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1429 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1430 return;
1431
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001432 op.params[0].value.a = storage_id;
1433 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand90f23352016-05-19 15:15:47 +02001434 TEEC_NONE, TEEC_NONE);
1435
1436 ADBG_EXPECT_TEEC_SUCCESS(c,
1437 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_KEY_IN_PERSISTENT,
1438 &op, &orig));
1439
1440 TEEC_CloseSession(&sess);
1441}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001442DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6013)
Jens Wiklander14f48872018-06-29 15:30:13 +02001443ADBG_CASE_DEFINE(regression, 6013, xtest_tee_test_6013,
1444 "Key usage in Persistent objects");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001445
1446static void xtest_tee_test_6014_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand29ee18f2016-05-23 14:13:56 +02001447{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001448 TEEC_Session sess = { };
1449 uint32_t orig = 0;
Pascal Brand29ee18f2016-05-23 14:13:56 +02001450 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1451
1452 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1453 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1454 return;
1455
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001456 op.params[0].value.a = storage_id;
1457 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand29ee18f2016-05-23 14:13:56 +02001458 TEEC_NONE, TEEC_NONE);
1459
1460 ADBG_EXPECT_TEEC_SUCCESS(c,
1461 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_LOOP, &op, &orig));
1462
1463 TEEC_CloseSession(&sess);
1464}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001465DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6014)
Jens Wiklander14f48872018-06-29 15:30:13 +02001466ADBG_CASE_DEFINE(regression, 6014, xtest_tee_test_6014,
1467 "Loop on Persistent objects");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001468
Jerome Forissiere3854162016-08-12 12:40:12 +02001469static void xtest_tee_test_6015_single(ADBG_Case_t *c, uint32_t storage_id)
1470{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001471 TEEC_Session sess = { };
1472 TEEC_Session sess2 = { };
1473 uint32_t orig = 0;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001474 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001475 uint32_t obj2 = 0;
Jerome Forissiere3854162016-08-12 12:40:12 +02001476
1477 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1478 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1479 return;
1480
1481 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1482 xtest_teec_open_session(&sess2, &storage2_ta_uuid, NULL,
1483 &orig)))
1484 goto exit2;
1485
1486 /* TA #1 creates a persistent object */
1487 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1488 fs_create(&sess, file_01, sizeof(file_01),
1489 TEE_DATA_FLAG_ACCESS_WRITE |
1490 TEE_DATA_FLAG_ACCESS_READ |
1491 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
1492 sizeof(data_00), &obj, storage_id)))
1493 goto exit;
1494
1495 /* TA #2 tries to open the object created by TA #1 */
1496 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1497 fs_open(&sess2, file_01, sizeof(file_01),
1498 TEE_DATA_FLAG_ACCESS_READ, &obj2, storage_id)))
1499 goto clean;
1500
Jerome Forissiere3854162016-08-12 12:40:12 +02001501clean:
1502 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1503exit:
1504 TEEC_CloseSession(&sess2);
1505exit2:
1506 TEEC_CloseSession(&sess);
1507}
Jerome Forissiere3854162016-08-12 12:40:12 +02001508DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6015)
Jens Wiklander14f48872018-06-29 15:30:13 +02001509ADBG_CASE_DEFINE(regression, 6015, xtest_tee_test_6015, "Storage isolation");
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001510
1511struct test_6016_thread_arg {
1512 ADBG_Case_t *case_t;
1513 uint32_t storage_id;
Jerome Forissier54cfbef2016-08-31 18:34:31 +02001514 char file_name[8];
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001515 TEEC_Session session;
1516};
1517
1518static void *test_6016_thread(void *arg)
1519{
1520 struct test_6016_thread_arg *a = arg;
1521 TEEC_Session sess = a->session;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001522 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001523 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001524 uint32_t count = 0;
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001525
1526 /* create */
1527 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1528 fs_create(&sess, a->file_name, sizeof(a->file_name),
1529 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
1530 sizeof(data_01), &obj, a->storage_id)))
1531 goto exit;
1532
1533 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1534 goto exit;
1535
1536 /* write new data */
1537 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1538 fs_open(&sess, a->file_name, sizeof(a->file_name),
1539 TEE_DATA_FLAG_ACCESS_WRITE, &obj, a->storage_id)))
1540 goto exit;
1541
1542 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1543 fs_write(&sess, obj, data_00, sizeof(data_00))))
1544 goto exit;
1545
1546 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1547 goto exit;
1548
1549 /* verify */
1550 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1551 fs_open(&sess, a->file_name, sizeof(a->file_name),
1552 TEE_DATA_FLAG_ACCESS_READ |
1553 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, a->storage_id)))
1554 goto exit;
1555
1556 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1557 fs_read(&sess, obj, out, 10, &count)))
1558 goto exit;
1559
1560 (void)ADBG_EXPECT_BUFFER(a->case_t, data_00, 10, out, count);
1561
1562 /* clean */
1563 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_unlink(&sess, obj)))
1564 goto exit;
1565
1566exit:
1567 return NULL;
1568}
1569
1570
1571#define NUM_THREADS 4
1572static void xtest_tee_test_6016_loop(ADBG_Case_t *c, uint32_t storage_id)
1573{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001574 struct test_6016_thread_arg arg[NUM_THREADS] = { };
1575 uint32_t orig = 0;
1576 size_t i = 0;
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001577 size_t n = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001578 size_t m = 0;
1579 pthread_t thr[NUM_THREADS] = { };
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001580
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001581 for (m = 0; m < NUM_THREADS; m++)
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001582 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1583 xtest_teec_open_session(&arg[m].session,
1584 &storage_ta_uuid, NULL, &orig)))
1585 goto out;
1586
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001587 for (n = 0; n < NUM_THREADS; n++) {
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001588 arg[n].case_t = c;
1589 arg[n].storage_id = storage_id;
Jerome Forissiercb10f832016-09-01 14:53:05 +02001590 snprintf(arg[n].file_name, sizeof(arg[n].file_name),
Jens Wiklander2b1c11d2016-09-16 14:58:41 +02001591 "file_%zu", n);
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001592 if (!ADBG_EXPECT(c, 0, pthread_create(thr + n, NULL,
1593 test_6016_thread, arg + n)))
1594 goto out;
1595 }
1596
1597out:
1598 for (i = 0; i < n; i++)
1599 ADBG_EXPECT(c, 0, pthread_join(thr[i], NULL));
1600 for (i = 0; i < m; i++)
1601 TEEC_CloseSession(&arg[i].session);
1602}
1603
1604/* concurency */
1605static void xtest_tee_test_6016_single(ADBG_Case_t *c, uint32_t storage_id)
1606{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001607 int i = 0;
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001608 int loops = 8;
1609
1610 Do_ADBG_Log(" threads: %d, loops: %d", NUM_THREADS, loops);
1611 for (i = 0; i < loops; i++)
1612 xtest_tee_test_6016_loop(c, storage_id);
1613}
Jerome Forissierefd71d32016-09-13 15:09:33 +02001614DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6016)
Jens Wiklander14f48872018-06-29 15:30:13 +02001615ADBG_CASE_DEFINE(regression, 6016, xtest_tee_test_6016, "Storage concurency");
Jerome Forissier327672c2016-09-01 18:34:11 +02001616
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001617static void xtest_tee_test_6017_single(ADBG_Case_t *c, uint32_t storage_id)
1618{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001619 TEEC_Session sess = { };
1620 TEE_ObjectInfo obj_info1 = { };
1621 TEE_ObjectInfo obj_info2 = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001622 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001623 uint32_t orig = 0;
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001624
1625 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1626 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1627 return;
1628
1629 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1630 fs_create(&sess, file_01, sizeof(file_01),
1631 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1632 0, &obj, storage_id)))
1633 goto exit;
1634
1635 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1636 fs_write(&sess, obj, data_00, sizeof(data_00))))
1637 goto exit;
1638
1639 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1640 fs_get_obj_info(&sess, obj, &obj_info1,
1641 sizeof(TEE_ObjectInfo))))
1642 goto exit;
1643
1644 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1645 goto exit;
1646
1647 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1648 fs_open(&sess, file_01, sizeof(file_01),
1649 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1650 goto exit;
1651
1652 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1653 fs_get_obj_info(&sess, obj, &obj_info2,
1654 sizeof(TEE_ObjectInfo))))
1655 goto exit;
1656
1657 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1658 obj_info1.dataSize, ==, obj_info2.dataSize))
1659 goto exit;
1660
1661 /* clean */
1662 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1663 goto exit;
1664
1665exit:
1666 TEEC_CloseSession(&sess);
1667}
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001668DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6017)
Jens Wiklander14f48872018-06-29 15:30:13 +02001669ADBG_CASE_DEFINE(regression, 6017, xtest_tee_test_6017,
1670 "Test Persistent objects info");
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001671
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001672static void xtest_tee_test_6018_single(ADBG_Case_t *c, uint32_t storage_id)
1673{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001674 TEEC_Session sess = { };
1675 TEE_ObjectInfo obj_info1 = { };
1676 TEE_ObjectInfo obj_info2 = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001677 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001678 uint32_t orig = 0;
1679 uint8_t block[32 * 1024] = { };
1680 size_t num_blocks = 0;
1681 size_t block_size = 0;
1682 size_t n = 0;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001683
1684 if (storage_is(storage_id, TEE_STORAGE_PRIVATE_RPMB)) {
1685 /* RPMB FS is a bit resource constrained */
Jens Wiklander20949ea2017-05-17 17:47:58 +02001686 num_blocks = 10;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001687 block_size = 1024;
1688 } else {
Jens Wiklander5f86daa2017-05-30 16:37:19 +02001689 num_blocks = 20;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001690 block_size = sizeof(block);
1691 }
1692
1693 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1694 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1695 return;
1696
1697 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1698 fs_create(&sess, file_01, sizeof(file_01),
1699 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1700 0, &obj, storage_id)))
1701 goto exit;
1702
1703 for (n = 0; n < num_blocks; n++) {
1704 memset(block, n, block_size);
1705
1706 Do_ADBG_Log("writing %zu", n);
1707 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1708 fs_write(&sess, obj, block, block_size)))
1709 goto exit;
1710 }
1711
1712 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1713 fs_get_obj_info(&sess, obj, &obj_info1,
1714 sizeof(TEE_ObjectInfo))))
1715 goto exit;
1716
1717 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1718 obj_info1.dataSize, ==, block_size * num_blocks))
1719 goto exit;
1720
1721 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1722 goto exit;
1723
1724 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1725 fs_open(&sess, file_01, sizeof(file_01),
1726 TEE_DATA_FLAG_ACCESS_READ |
1727 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1728 goto exit;
1729
1730 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1731 fs_get_obj_info(&sess, obj, &obj_info2,
1732 sizeof(TEE_ObjectInfo))))
1733 goto exit;
1734
1735 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1736 obj_info1.dataSize, ==, obj_info2.dataSize))
1737 goto exit;
1738
1739 for (n = 0; n < num_blocks; n++) {
1740 uint8_t br[block_size];
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001741 uint32_t count = 0;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001742
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001743 memset(br, 0, sizeof(br));
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001744 memset(block, n, block_size);
1745
1746 Do_ADBG_Log("reading %zu", n);
1747 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1748 fs_read(&sess, obj, br, sizeof(br), &count)))
1749 goto exit;
1750 if (!ADBG_EXPECT_BUFFER(c, block, block_size, br, count))
1751 goto exit;
1752 }
1753
1754 /* clean */
1755 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1756 goto exit;
1757
1758exit:
1759 TEEC_CloseSession(&sess);
1760}
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001761DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6018)
Jens Wiklander14f48872018-06-29 15:30:13 +02001762ADBG_CASE_DEFINE(regression, 6018, xtest_tee_test_6018, "Large object");
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001763
l00176142ebba0c92017-11-08 01:16:26 +08001764static void xtest_tee_test_6019_single(ADBG_Case_t *c, uint32_t storage_id)
1765{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001766 TEEC_Session sess = { };
1767 TEEC_Session sess2 = { };
1768 uint32_t orig = 0;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001769 uint32_t obj = 0;
1770 uint32_t obj2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001771 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001772 uint32_t count = 0;
l00176142ebba0c92017-11-08 01:16:26 +08001773
1774 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1775 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1776 return;
1777
1778 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1779 xtest_teec_open_session(&sess2, &storage2_ta_uuid, NULL,
1780 &orig)))
1781 goto exit3;
1782
1783 /* TA #1 creates a persistent object */
1784 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1785 fs_create(&sess, file_01, sizeof(file_01),
1786 TEE_DATA_FLAG_ACCESS_WRITE |
1787 TEE_DATA_FLAG_ACCESS_WRITE_META |
1788 TEE_DATA_FLAG_OVERWRITE, 0, data_00,
1789 sizeof(data_00), &obj, storage_id)))
1790 goto exit2;
1791
1792 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1793 goto exit1;
1794
1795 /* TA #2 creates a persistent object */
1796 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1797 fs_create(&sess2, file_01, sizeof(file_01),
1798 TEE_DATA_FLAG_ACCESS_WRITE |
1799 TEE_DATA_FLAG_ACCESS_WRITE_META |
1800 TEE_DATA_FLAG_OVERWRITE, 0, data_01,
1801 sizeof(data_01), &obj2, storage_id)))
1802 goto exit1;
1803
1804 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess2, obj2)))
1805 goto exit;
1806
1807 /* TA #1 open and read */
1808 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1809 fs_open(&sess, file_01, sizeof(file_01),
1810 TEE_DATA_FLAG_ACCESS_READ |
1811 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1812 goto exit;
1813
1814 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1815 goto exit;
1816
1817 /* verify */
1818 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
1819
1820 /* TA #2 open and read */
1821 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1822 fs_open(&sess2, file_01, sizeof(file_01),
1823 TEE_DATA_FLAG_ACCESS_READ |
1824 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj2, storage_id)))
1825 goto exit;
1826
1827 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess2, obj2, out, 10, &count)))
1828 goto exit;
1829
1830 /* verify */
1831 (void)ADBG_EXPECT_BUFFER(c, data_01, 10, out, count);
1832
1833exit:
1834 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess2, obj2));
1835exit1:
1836 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1837exit2:
1838 TEEC_CloseSession(&sess2);
1839exit3:
1840 TEEC_CloseSession(&sess);
1841}
l00176142ebba0c92017-11-08 01:16:26 +08001842DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6019)
Jens Wiklander14f48872018-06-29 15:30:13 +02001843ADBG_CASE_DEFINE(regression, 6019, xtest_tee_test_6019, "Storage independence");
l00176142ebba0c92017-11-08 01:16:26 +08001844
Etienne Carriere294ffbd2018-04-26 14:20:35 +02001845/*
1846 * According to the GP spec V1.1, the object_id in create/open/rename
1847 * functions is not allowed to reside in the shared memory.
1848 *
1849 * The function below replicates fs_open/fs_create/fs_rename but using
1850 * specific commands to ask the TA to use the client object ID buffer
1851 * from the shared memory when accessing the object through target APIs.
1852 * The TA is not expected to use such references and gets killed by the TEE.
1853 */
1854static TEEC_Result fs_access_with_bad_object_id_ref(TEEC_Session *sess,
1855 uint32_t command,
1856 void *id, uint32_t id_size,
1857 uint32_t flags,
1858 uint32_t attr,
1859 void *data, uint32_t data_size,
1860 uint32_t *obj,
1861 uint32_t storage_id)
1862{
1863 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001864 TEEC_Result res = TEEC_ERROR_GENERIC;
1865 uint32_t org = 0;
Etienne Carriere294ffbd2018-04-26 14:20:35 +02001866
1867 switch (command) {
1868 case TA_STORAGE_CMD_OPEN_ID_IN_SHM:
1869 op.params[0].tmpref.buffer = id;
1870 op.params[0].tmpref.size = id_size;
1871 op.params[1].value.a = flags;
1872 op.params[1].value.b = 0;
1873 op.params[2].value.a = storage_id;
1874
1875 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1876 TEEC_VALUE_INOUT,
1877 TEEC_VALUE_INPUT,
1878 TEEC_NONE);
1879 break;
1880 case TA_STORAGE_CMD_CREATE_ID_IN_SHM:
1881 op.params[0].tmpref.buffer = id;
1882 op.params[0].tmpref.size = id_size;
1883 op.params[1].value.a = flags;
1884 op.params[1].value.b = 0;
1885 op.params[2].value.a = attr;
1886 op.params[2].value.b = storage_id;
1887 op.params[3].tmpref.buffer = data;
1888 op.params[3].tmpref.size = data_size;
1889
1890 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1891 TEEC_VALUE_INOUT,
1892 TEEC_VALUE_INPUT,
1893 TEEC_MEMREF_TEMP_INPUT);
1894 break;
1895 case TA_STORAGE_CMD_CREATEOVER_ID_IN_SHM:
1896 op.params[0].tmpref.buffer = id;
1897 op.params[0].tmpref.size = id_size;
1898 op.params[1].value.a = storage_id;
1899
1900 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1901 TEEC_VALUE_INPUT,
1902 TEEC_NONE, TEEC_NONE);
1903 break;
1904 case TA_STORAGE_CMD_RENAME_ID_IN_SHM:
1905 op.params[0].value.a = *obj;
1906 op.params[1].tmpref.buffer = id;
1907 op.params[1].tmpref.size = id_size;
1908
1909 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1910 TEEC_MEMREF_TEMP_INPUT,
1911 TEEC_NONE, TEEC_NONE);
1912 break;
1913 default:
1914 return TEE_ERROR_GENERIC;
1915 }
1916
1917 res = TEEC_InvokeCommand(sess, command, &op, &org);
1918
1919 switch (command) {
1920 case TA_STORAGE_CMD_OPEN_ID_IN_SHM:
1921 case TA_STORAGE_CMD_CREATE_ID_IN_SHM:
1922 if (res == TEEC_SUCCESS)
1923 *obj = op.params[1].value.b;
1924 break;
1925 default:
1926 break;
1927 }
1928
1929 return res;
1930}
1931
1932static void xtest_tee_test_6020_single(ADBG_Case_t *c, uint32_t storage_id)
1933{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001934 TEEC_Result res = TEEC_ERROR_GENERIC;
1935 TEEC_Session sess = { };
1936 uint32_t orig = 0;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001937 uint32_t obj = 0;
Etienne Carriere294ffbd2018-04-26 14:20:35 +02001938
1939 /*
1940 * Invalid open request from the TA (object ID reference in SHM)
1941 */
1942 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
1943 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
1944 return;
1945
1946 res = fs_create(&sess, file_01, sizeof(file_01),
1947 TEE_DATA_FLAG_ACCESS_WRITE |
1948 TEE_DATA_FLAG_ACCESS_WRITE_META |
1949 TEE_DATA_FLAG_OVERWRITE,
1950 0,
1951 data_00, sizeof(data_00),
1952 &obj,
1953 storage_id);
1954
1955 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
1956 goto exit1;
1957 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1958 goto exit1;
1959
1960 res = fs_access_with_bad_object_id_ref(&sess,
1961 TA_STORAGE_CMD_OPEN_ID_IN_SHM,
1962 file_01, sizeof(file_01),
1963 TEE_DATA_FLAG_ACCESS_WRITE |
Jens Wiklanderbc7d12c2020-08-26 13:40:59 +02001964 TEE_DATA_FLAG_ACCESS_WRITE_META,
Etienne Carriere294ffbd2018-04-26 14:20:35 +02001965 0,
1966 NULL, 0,
1967 &obj,
1968 storage_id);
1969
1970 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
1971
1972 /*
1973 * Invalid create-overwrite request from the TA (object ID reference in SHM)
1974 */
1975 TEEC_CloseSession(&sess);
1976 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
1977 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
1978 return;
1979
1980 res = fs_access_with_bad_object_id_ref(&sess,
1981 TA_STORAGE_CMD_CREATEOVER_ID_IN_SHM,
1982 file_01, sizeof(file_01),
1983 0,
1984 0,
1985 NULL, 0,
1986 NULL,
1987 storage_id);
1988
1989 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
1990
1991 /*
1992 * Invalid rename request from the TA (object ID reference in SHM)
1993 */
1994 TEEC_CloseSession(&sess);
1995 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
1996 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
1997 return;
1998
1999 res = fs_open(&sess, file_01, sizeof(file_01),
2000 TEE_DATA_FLAG_ACCESS_WRITE |
Jens Wiklanderbc7d12c2020-08-26 13:40:59 +02002001 TEE_DATA_FLAG_ACCESS_WRITE_META,
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002002 &obj,
2003 storage_id);
2004
2005 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2006 goto exit1;
2007
2008 res = fs_access_with_bad_object_id_ref(&sess,
2009 TA_STORAGE_CMD_RENAME_ID_IN_SHM,
2010 file_01, sizeof(file_01) - 1,
2011 0,
2012 0,
2013 NULL, 0,
2014 &obj,
2015 0);
2016
2017 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
2018
2019 /*
2020 * Invalid creation request from the TA (object ID reference in SHM)
2021 */
2022 TEEC_CloseSession(&sess);
2023 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
2024 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2025 return;
2026
2027 res = fs_open(&sess, file_01, sizeof(file_01),
2028 TEE_DATA_FLAG_ACCESS_WRITE |
Jens Wiklanderbc7d12c2020-08-26 13:40:59 +02002029 TEE_DATA_FLAG_ACCESS_WRITE_META,
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002030 &obj,
2031 storage_id);
2032
2033 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2034 goto exit1;
2035
2036 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
2037
2038 res = fs_access_with_bad_object_id_ref(&sess,
2039 TA_STORAGE_CMD_CREATE_ID_IN_SHM,
2040 file_01, sizeof(file_01),
2041 TEE_DATA_FLAG_ACCESS_WRITE |
2042 TEE_DATA_FLAG_ACCESS_WRITE_META |
2043 TEE_DATA_FLAG_OVERWRITE,
2044 0,
2045 data_00, sizeof(data_00),
2046 &obj,
2047 storage_id);
2048
2049 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
Oliver Chiang50d932f2019-05-31 13:29:50 +00002050 TEEC_CloseSession(&sess);
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002051 return;
2052exit1:
2053 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
2054 TEEC_CloseSession(&sess);
2055}
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002056DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6020)
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002057ADBG_CASE_DEFINE(regression, 6020, xtest_tee_test_6020,
2058 "Object IDs in SHM (negative)");