blob: a002c4564debbc3dfe8b98291dd73fbc0d9c2c18 [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 Forissiere3688342015-09-24 10:45:17 -070019#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +020020#include <TTA_DS_protocol.h>
21#endif
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020022#include <util.h>
23
Jens Wiklander14f48872018-06-29 15:30:13 +020024#define DEFINE_TEST_MULTIPLE_STORAGE_IDS(test_name) \
25static void test_name(ADBG_Case_t *c) \
26{ \
27 size_t i; \
28 \
29 for (i = 0; i < ARRAY_SIZE(storage_ids); i++) { \
30 Do_ADBG_BeginSubCase(c, "Storage id: %08x", storage_ids[i]); \
31 test_name##_single(c, storage_ids[i]); \
32 Do_ADBG_EndSubCase(c, "Storage id: %08x", storage_ids[i]); \
33 } \
34}
35
Jerome Forissier0e99d6a2016-07-25 14:21:43 +020036static uint32_t storage_ids[] = {
37 TEE_STORAGE_PRIVATE,
38#ifdef CFG_REE_FS
39 TEE_STORAGE_PRIVATE_REE,
40#endif
41#ifdef CFG_RPMB_FS
42 TEE_STORAGE_PRIVATE_RPMB,
43#endif
44};
Pascal Brandc639ac82015-07-02 08:53:34 +020045
46static uint8_t file_00[] = {
47 0x00, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
48 0xF0, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
49 0xE9, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
50 0xF0, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x8E
51};
52
53static uint8_t file_01[] = {
54 0x01, 0x00
55};
56
57static uint8_t file_02[] = {
58 0x02, 0x11, 0x02
59};
60
61static uint8_t file_03[] = {
62 0x03, 0x13, 0x03
63};
64
Pascal Brandeb84c442016-04-19 17:49:49 +020065static uint8_t file_04[] = {
66 0x00, 0x01, 0x02
67};
68
Pascal Brandc639ac82015-07-02 08:53:34 +020069static uint8_t data_00[] = {
70 0x00, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
71 0x00, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
72 0x00, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
73 0x00, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x00
74};
75
76static uint8_t data_01[] = {
77 0x01, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
78 0x01, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
79 0x01, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
80 0x01, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x01
81};
82
Jens Wiklanderaba31ba2017-02-15 15:24:06 +010083static uint32_t fs_id_for_tee_storage_private(void)
84{
85#if defined(CFG_REE_FS)
86 return TEE_STORAGE_PRIVATE_REE;
87#elif defined(CFG_RPMB_FS)
88 return TEE_STORAGE_PRIVATE_RPMB;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +010089#endif
90}
91
92static uint32_t real_id_for(uint32_t id)
93{
94 if (id == TEE_STORAGE_PRIVATE)
95 return fs_id_for_tee_storage_private();
96 return id;
97}
98
99static bool storage_is(uint32_t id1, uint32_t id2)
100{
101 return (real_id_for(id1) == real_id_for(id2));
102}
103
Pascal Brandc639ac82015-07-02 08:53:34 +0200104static TEEC_Result fs_open(TEEC_Session *sess, void *id, uint32_t id_size,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200105 uint32_t flags, uint32_t *obj, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200106{
Aijun Sun473d9072015-08-06 15:24:49 +0800107 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100108 TEEC_Result res = TEEC_ERROR_GENERIC;
109 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200110
111 op.params[0].tmpref.buffer = id;
112 op.params[0].tmpref.size = id_size;
113 op.params[1].value.a = flags;
114 op.params[1].value.b = 0;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200115 op.params[2].value.a = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200116
117 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200118 TEEC_VALUE_INOUT, TEEC_VALUE_INPUT,
Pascal Brandc639ac82015-07-02 08:53:34 +0200119 TEEC_NONE);
120
121 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_OPEN, &op, &org);
122
123 if (res == TEEC_SUCCESS)
124 *obj = op.params[1].value.b;
125
126 return res;
127}
128
129static TEEC_Result fs_create(TEEC_Session *sess, void *id, uint32_t id_size,
130 uint32_t flags, uint32_t attr, void *data,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200131 uint32_t data_size, uint32_t *obj,
132 uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200133{
Aijun Sun473d9072015-08-06 15:24:49 +0800134 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100135 TEEC_Result res = TEEC_ERROR_GENERIC;
136 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200137
138 op.params[0].tmpref.buffer = id;
139 op.params[0].tmpref.size = id_size;
140 op.params[1].value.a = flags;
141 op.params[1].value.b = 0;
142 op.params[2].value.a = attr;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200143 op.params[2].value.b = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200144 op.params[3].tmpref.buffer = data;
145 op.params[3].tmpref.size = data_size;
146
147 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
148 TEEC_VALUE_INOUT, TEEC_VALUE_INPUT,
149 TEEC_MEMREF_TEMP_INPUT);
150
151 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CREATE, &op, &org);
152
153 if (res == TEEC_SUCCESS)
154 *obj = op.params[1].value.b;
155
156 return res;
157}
158
Pascal Brandeb84c442016-04-19 17:49:49 +0200159static TEEC_Result fs_create_overwrite(TEEC_Session *sess, void *id,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200160 uint32_t id_size, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +0200161{
162 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100163 TEEC_Result res = TEEC_ERROR_GENERIC;
164 uint32_t org = 0;
Pascal Brandeb84c442016-04-19 17:49:49 +0200165
166 op.params[0].tmpref.buffer = id;
167 op.params[0].tmpref.size = id_size;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200168 op.params[1].value.a = storage_id;
Pascal Brandeb84c442016-04-19 17:49:49 +0200169
170 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200171 TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brandeb84c442016-04-19 17:49:49 +0200172 TEEC_NONE);
173
174 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CREATE_OVERWRITE, &op, &org);
175
176 return res;
177}
178
Pascal Brandc639ac82015-07-02 08:53:34 +0200179static TEEC_Result fs_close(TEEC_Session *sess, uint32_t obj)
180{
Aijun Sun473d9072015-08-06 15:24:49 +0800181 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100182 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200183
184 op.params[0].value.a = obj;
185
186 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
187 TEEC_NONE, TEEC_NONE);
188
189 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_CLOSE, &op, &org);
190}
191
192static TEEC_Result fs_read(TEEC_Session *sess, uint32_t obj, void *data,
193 uint32_t data_size, uint32_t *count)
194{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100195 TEEC_Result res = TEEC_ERROR_GENERIC;
Aijun Sun473d9072015-08-06 15:24:49 +0800196 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100197 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200198
199 op.params[0].tmpref.buffer = data;
200 op.params[0].tmpref.size = data_size;
201 op.params[1].value.a = obj;
202 op.params[1].value.b = 0;
203
204 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
205 TEEC_VALUE_INOUT, TEEC_NONE,
206 TEEC_NONE);
207
208 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_READ, &op, &org);
209
210 if (res == TEEC_SUCCESS)
211 *count = op.params[1].value.b;
212
213 return res;
214}
215
216static TEEC_Result fs_write(TEEC_Session *sess, uint32_t obj, void *data,
217 uint32_t data_size)
218{
Aijun Sun473d9072015-08-06 15:24:49 +0800219 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100220 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200221
222 op.params[0].tmpref.buffer = data;
223 op.params[0].tmpref.size = data_size;
224 op.params[1].value.a = obj;
225 op.params[1].value.b = 0;
226
227 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
228 TEEC_VALUE_INPUT, TEEC_NONE,
229 TEEC_NONE);
230
231 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_WRITE, &op, &org);
232}
233
234static TEEC_Result fs_seek(TEEC_Session *sess, uint32_t obj, int32_t offset,
235 int32_t whence)
236{
Aijun Sun473d9072015-08-06 15:24:49 +0800237 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100238 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200239
240 op.params[0].value.a = obj;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200241 op.params[0].value.b = *(uint32_t *)&offset;
Pascal Brandc639ac82015-07-02 08:53:34 +0200242 op.params[1].value.a = whence;
243
244 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INOUT,
245 TEEC_NONE, TEEC_NONE);
246
247 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_SEEK, &op, &org);
248}
249
250static TEEC_Result fs_unlink(TEEC_Session *sess, uint32_t obj)
251{
Aijun Sun473d9072015-08-06 15:24:49 +0800252 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100253 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200254
255 op.params[0].value.a = obj;
256
257 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
258 TEEC_NONE, TEEC_NONE);
259
260 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_UNLINK, &op, &org);
261}
262
263static TEEC_Result fs_trunc(TEEC_Session *sess, uint32_t obj, uint32_t len)
264{
Aijun Sun473d9072015-08-06 15:24:49 +0800265 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100266 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200267
268 op.params[0].value.a = obj;
269 op.params[0].value.b = len;
270
271 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
272 TEEC_NONE, TEEC_NONE);
273
274 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_TRUNC, &op, &org);
275}
276
277static TEEC_Result fs_rename(TEEC_Session *sess, uint32_t obj, void *id,
278 uint32_t id_size)
279{
Aijun Sun473d9072015-08-06 15:24:49 +0800280 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100281 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200282
283 op.params[0].value.a = obj;
284 op.params[1].tmpref.buffer = id;
285 op.params[1].tmpref.size = id_size;
286
287 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
288 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
289 TEEC_NONE);
290
291 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RENAME, &op, &org);
292}
293
294static TEEC_Result fs_alloc_enum(TEEC_Session *sess, uint32_t *e)
295{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100296 TEEC_Result res = TEEC_ERROR_GENERIC;
Aijun Sun473d9072015-08-06 15:24:49 +0800297 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100298 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200299
300 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE,
301 TEEC_NONE, TEEC_NONE);
302
303 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_ALLOC_ENUM, &op, &org);
304
305 if (res == TEEC_SUCCESS)
306 *e = op.params[0].value.a;
307
308 return res;
309}
310
Jerome Forissier5d969d82017-03-21 10:01:04 +0100311static TEEC_Result fs_reset_enum(TEEC_Session *sess, uint32_t e)
312{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100313 TEEC_Result res = TEEC_ERROR_GENERIC;
Jerome Forissier5d969d82017-03-21 10:01:04 +0100314 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100315 uint32_t org = 0;
Jerome Forissier5d969d82017-03-21 10:01:04 +0100316
317 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
318 TEEC_NONE, TEEC_NONE);
319
320 op.params[0].value.a = e;
321 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESET_ENUM, &op, &org);
322
323 return res;
324}
325
Pascal Brandc639ac82015-07-02 08:53:34 +0200326static TEEC_Result fs_free_enum(TEEC_Session *sess, uint32_t e)
327{
Aijun Sun473d9072015-08-06 15:24:49 +0800328 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100329 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200330
331 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
332 TEEC_NONE);
333
334 op.params[0].value.a = e;
335
336 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_FREE_ENUM, &op, &org);
337}
338
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200339static TEEC_Result fs_start_enum(TEEC_Session *sess, uint32_t e,
340 uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200341{
Aijun Sun473d9072015-08-06 15:24:49 +0800342 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100343 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200344
345 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
346 TEEC_NONE, TEEC_NONE);
347
348 op.params[0].value.a = e;
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200349 op.params[0].value.b = storage_id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200350
351 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_START_ENUM, &op, &org);
352}
353
354static TEEC_Result fs_next_enum(TEEC_Session *sess, uint32_t e, void *obj_info,
355 size_t info_size, void *id, uint32_t id_size)
356{
Aijun Sun473d9072015-08-06 15:24:49 +0800357 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100358 uint32_t org = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200359
Pascal Brandc603e0d2016-04-25 12:37:18 +0200360 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brandc639ac82015-07-02 08:53:34 +0200361 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
Pascal Brandc603e0d2016-04-25 12:37:18 +0200362 if (obj_info && info_size)
363 op.paramTypes |= (TEEC_MEMREF_TEMP_OUTPUT << 4);
Pascal Brandc639ac82015-07-02 08:53:34 +0200364
365 op.params[0].value.a = e;
366 op.params[1].tmpref.buffer = obj_info;
367 op.params[1].tmpref.size = info_size;
368 op.params[2].tmpref.buffer = id;
369 op.params[2].tmpref.size = id_size;
370
371 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_NEXT_ENUM, &op, &org);
372}
373
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200374static TEEC_Result fs_restrict_usage(TEEC_Session *sess, uint32_t obj,
375 uint32_t obj_usage)
376{
377 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100378 uint32_t org = 0;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200379
380 op.params[0].value.a = obj;
381 op.params[0].value.b = obj_usage;
382
383 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
384 TEEC_NONE, TEEC_NONE);
385
386 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESTRICT_USAGE,
387 &op, &org);
388}
389
390static TEEC_Result fs_alloc_obj(TEEC_Session *sess, uint32_t obj_type,
391 uint32_t max_key_size, uint32_t *obj)
392{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100393 TEEC_Result res = TEEC_ERROR_GENERIC;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200394 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100395 uint32_t org = 0;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200396
397 op.params[0].value.a = obj_type;
398 op.params[0].value.b = max_key_size;
399
400 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
401 TEEC_NONE, TEEC_NONE);
402
403 res = TEEC_InvokeCommand(sess, TA_STORAGE_CMD_ALLOC_OBJ, &op, &org);
404 *obj = op.params[1].value.a;
405 return res;
406}
407
408static TEEC_Result fs_free_obj(TEEC_Session *sess, uint32_t obj)
409{
410 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100411 uint32_t org = 0;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200412
413 op.params[0].value.a = obj;
414
415 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
416 TEEC_NONE, TEEC_NONE);
417
418 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_FREE_OBJ, &op, &org);
419}
420
421static TEEC_Result fs_reset_obj(TEEC_Session *sess, uint32_t obj)
422{
423 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100424 uint32_t org = 0;
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +0200425
426 op.params[0].value.a = obj;
427
428 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
429 TEEC_NONE, TEEC_NONE);
430
431 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESET_OBJ, &op, &org);
432}
433
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800434static TEEC_Result fs_get_obj_info(TEEC_Session *sess, uint32_t obj,
435 void *obj_info, size_t info_size)
436{
437 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100438 uint32_t org = 0;
Guanchao Liang31a9cbf2016-12-20 00:35:26 +0800439
440 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
441 TEEC_MEMREF_TEMP_OUTPUT,
442 TEEC_NONE, TEEC_NONE);
443
444 op.params[0].value.a = obj;
445 op.params[1].tmpref.buffer = obj_info;
446 op.params[1].tmpref.size = info_size;
447
448 return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_GET_OBJ_INFO, &op, &org);
449}
450
James Kung98c0ba12015-09-09 15:51:59 +0800451/* trunc */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200452static void test_truncate_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800453{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100454 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100455 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100456 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100457 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100458 uint32_t orig = 0;
James Kung98c0ba12015-09-09 15:51:59 +0800459
460 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
461 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
462 return;
463
464 /* create */
465 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
466 fs_create(&sess, file_01, sizeof(file_01),
467 TEE_DATA_FLAG_ACCESS_WRITE |
468 TEE_DATA_FLAG_ACCESS_READ |
469 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200470 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800471 goto exit;
472
473 /* trunc */
474 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 10)))
475 goto exit;
476
477 /* seek */
478 if (!ADBG_EXPECT_TEEC_SUCCESS(
479 c, fs_seek(&sess, obj, 5, TEE_DATA_SEEK_SET)))
480 goto exit;
481
482 /* verify */
483 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
484 goto exit;
485
486 /* check buffer */
487 (void)ADBG_EXPECT_BUFFER(c, &data_00[5], 5, out, count);
488
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100489 /* close */
490 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
491 goto exit;
492
493 /* open */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100494 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100495 TEE_DATA_FLAG_ACCESS_WRITE |
496 TEE_DATA_FLAG_ACCESS_READ |
497 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
498 goto exit;
499
500 /* seek */
501 if (!ADBG_EXPECT_TEEC_SUCCESS(
502 c, fs_seek(&sess, obj, 5, TEE_DATA_SEEK_SET)))
503 goto exit;
504
505 /* verify */
506 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
507 goto exit;
508
509 /* check buffer */
510 (void)ADBG_EXPECT_BUFFER(c, &data_00[5], 5, out, count);
511
James Kung98c0ba12015-09-09 15:51:59 +0800512 /* clean */
513 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
514 goto exit;
515
516exit:
517 TEEC_CloseSession(&sess);
518}
519
520/* extend */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200521static void test_extend_file_length(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800522{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100523 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100524 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100525 uint8_t out[10] = { };
526 uint8_t expect[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100527 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100528 uint32_t orig = 0;
James Kung98c0ba12015-09-09 15:51:59 +0800529
530 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
531 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
532 return;
533
534 /* create */
535 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
536 fs_create(&sess, file_01, sizeof(file_01),
537 TEE_DATA_FLAG_ACCESS_WRITE |
538 TEE_DATA_FLAG_ACCESS_READ |
539 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200540 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800541 goto exit;
542
543 /* extend */
544 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_trunc(&sess, obj, 40)))
545 goto exit;
546
547 /* seek */
548 if (!ADBG_EXPECT_TEEC_SUCCESS(
549 c, fs_seek(&sess, obj, 30, TEE_DATA_SEEK_SET)))
550 goto exit;
551
552 /* verify */
553 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
554 goto exit;
555
556 /* check buffer */
557 expect[0] = data_00[30];
558 expect[1] = data_00[31];
559 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
560
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100561 /* close */
562 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
563 goto exit;
564
565 /* open */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100566 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100567 TEE_DATA_FLAG_ACCESS_WRITE |
568 TEE_DATA_FLAG_ACCESS_READ |
569 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
570 goto exit;
571
572 /* seek */
573 if (!ADBG_EXPECT_TEEC_SUCCESS(
574 c, fs_seek(&sess, obj, 30, TEE_DATA_SEEK_SET)))
575 goto exit;
576
577 /* verify */
578 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
579 goto exit;
580
581 /* check buffer */
582 expect[0] = data_00[30];
583 expect[1] = data_00[31];
584 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
585
James Kung98c0ba12015-09-09 15:51:59 +0800586 /* clean */
587 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
588 goto exit;
589
590exit:
591 TEEC_CloseSession(&sess);
592}
593
594/* file hole */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200595static void test_file_hole(ADBG_Case_t *c, uint32_t storage_id)
James Kung98c0ba12015-09-09 15:51:59 +0800596{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100597 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100598 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100599 uint8_t out[10] = { };
600 uint8_t expect[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100601 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100602 uint32_t orig = 0;
James Kung98c0ba12015-09-09 15:51:59 +0800603
604 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
605 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
606 return;
607
608 /* create */
609 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
610 fs_create(&sess, file_01, sizeof(file_01),
611 TEE_DATA_FLAG_ACCESS_WRITE |
612 TEE_DATA_FLAG_ACCESS_READ |
613 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200614 sizeof(data_00), &obj, storage_id)))
James Kung98c0ba12015-09-09 15:51:59 +0800615 goto exit;
616
617 /* seek */
618 if (!ADBG_EXPECT_TEEC_SUCCESS(
619 c, fs_seek(&sess, obj, 80, TEE_DATA_SEEK_SET)))
620 goto exit;
621
622 /* write */
623 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_write(&sess, obj, data_00,
624 sizeof(data_00))))
625 goto exit;
626
627 /* seek */
628 if (!ADBG_EXPECT_TEEC_SUCCESS(
629 c, fs_seek(&sess, obj, 74, TEE_DATA_SEEK_SET)))
630 goto exit;
631
632 /* verify */
633 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
634 goto exit;
635
636 /* check buffer */
637 expect[6] = data_00[0];
638 expect[7] = data_00[1];
639 expect[8] = data_00[2];
640 expect[9] = data_00[3];
641 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
642
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100643 /* close */
644 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
645 goto exit;
646
647 /* open */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100648 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier3e7d1072018-01-26 10:39:54 +0100649 TEE_DATA_FLAG_ACCESS_WRITE |
650 TEE_DATA_FLAG_ACCESS_READ |
651 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
652 goto exit;
653
654 /* seek */
655 if (!ADBG_EXPECT_TEEC_SUCCESS(
656 c, fs_seek(&sess, obj, 74, TEE_DATA_SEEK_SET)))
657 goto exit;
658
659 /* verify */
660 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
661 goto exit;
662
663 /* check buffer */
664 expect[6] = data_00[0];
665 expect[7] = data_00[1];
666 expect[8] = data_00[2];
667 expect[9] = data_00[3];
668 (void)ADBG_EXPECT_BUFFER(c, &expect[0], 10, out, count);
669
James Kung98c0ba12015-09-09 15:51:59 +0800670 /* clean */
671 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
672 goto exit;
673
674exit:
675 TEEC_CloseSession(&sess);
676}
677
Jerome Forissiere3688342015-09-24 10:45:17 -0700678#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +0200679static TEEC_Result ds_seek_obj_inv_handle(TEEC_Session *sess)
680{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100681 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
682 uint32_t org = 0;
Pascal Brand8a74e362015-09-10 12:41:52 +0200683
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100684 op.paramTypes = TEEC_PARAM_TYPES(
685 TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
Pascal Brand8a74e362015-09-10 12:41:52 +0200686
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100687 op.params[0].value.a = CASE_DATA_OBJECT_NOT_PERSISTENT;
Pascal Brand8a74e362015-09-10 12:41:52 +0200688
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100689 return TEEC_InvokeCommand(
690 sess, CMD_SeekObjectData_panic, &op, &org);
Pascal Brand8a74e362015-09-10 12:41:52 +0200691}
692
Pascal Brand8a74e362015-09-10 12:41:52 +0200693static TEEC_Result ds_seek_gp(
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100694 TEEC_Session *sess, TEE_Whence wh, uint32_t wh_off, uint32_t set_off,
695 void *in, size_t in_size, void *out, size_t out_size)
Pascal Brand8a74e362015-09-10 12:41:52 +0200696{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100697 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
698 uint32_t org = 0;
Pascal Brand8a74e362015-09-10 12:41:52 +0200699
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100700 op.paramTypes = TEEC_PARAM_TYPES(
701 TEEC_VALUE_INPUT, TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT,
702 TEEC_MEMREF_TEMP_OUTPUT);
Pascal Brand8a74e362015-09-10 12:41:52 +0200703
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100704 op.params[0].value.a = wh;
705 op.params[0].value.b = wh_off;
706 op.params[1].value.a = set_off;
707 op.params[2].tmpref.buffer = in;
708 op.params[2].tmpref.size = in_size;
709 op.params[3].tmpref.buffer = out;
710 op.params[3].tmpref.size = out_size;
Pascal Brand8a74e362015-09-10 12:41:52 +0200711
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100712 return TEEC_InvokeCommand(sess, CMD_SeekWriteReadObjectData, &op, &org);
Pascal Brand8a74e362015-09-10 12:41:52 +0200713}
714
715static TEEC_Result ds_init_object_and_attributes(TEEC_Session *sess,
716 uint32_t obj_type, uint32_t obj_size, const void *attr_meta,
717 size_t attr_meta_len, const void *attr_data, size_t attr_data_len,
718 uint32_t option)
719{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100720 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
721 uint32_t org = 0;
Pascal Brand8a74e362015-09-10 12:41:52 +0200722
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100723 op.paramTypes = TEEC_PARAM_TYPES(
724 TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT,
725 TEEC_MEMREF_TEMP_INPUT, TEEC_VALUE_INPUT);
Pascal Brand8a74e362015-09-10 12:41:52 +0200726
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100727 op.params[0].value.a = obj_type;
728 op.params[0].value.b = obj_size;
729 op.params[1].tmpref.buffer = (void *)attr_meta;
730 op.params[1].tmpref.size = attr_meta_len;
731 op.params[2].tmpref.buffer = (void *)attr_data;
732 op.params[2].tmpref.size = attr_data_len;
733 op.params[3].value.a = option;
Pascal Brand8a74e362015-09-10 12:41:52 +0200734
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100735 return TEEC_InvokeCommand(sess, CMD_InitObjectAndAttributes, &op, &org);
Pascal Brand8a74e362015-09-10 12:41:52 +0200736}
737
738static TEEC_Result ds_rename_access_conflict(TEEC_Session *sess)
739{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100740 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
741 uint32_t org = 0;
Pascal Brand8a74e362015-09-10 12:41:52 +0200742
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100743 op.paramTypes = TEEC_PARAM_TYPES(
744 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
Pascal Brand8a74e362015-09-10 12:41:52 +0200745
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100746 return TEEC_InvokeCommand(
747 sess, CMD_RenamePersistentObject_AccessConflict, &op, &org);
Pascal Brand8a74e362015-09-10 12:41:52 +0200748}
749
750static TEEC_Result ds_start_enum_no_item(TEEC_Session *sess)
751{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100752 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
753 uint32_t org = 0;
754 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brand8a74e362015-09-10 12:41:52 +0200755
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100756 op.paramTypes = TEEC_PARAM_TYPES(
757 TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
Pascal Brand8a74e362015-09-10 12:41:52 +0200758
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100759 res = TEEC_InvokeCommand(
760 sess, CMD_StartNGetPersistentObjectEnumerator_itemNotFound,
761 &op, &org);
Pascal Brand8a74e362015-09-10 12:41:52 +0200762
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100763 if (res != TEEC_SUCCESS)
764 return res;
Pascal Brand8a74e362015-09-10 12:41:52 +0200765
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100766 if (op.params[0].value.a != 0 || op.params[0].value.b != 0)
767 return TEEC_ERROR_GENERIC;
Pascal Brand8a74e362015-09-10 12:41:52 +0200768
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100769 return res;
Pascal Brand8a74e362015-09-10 12:41:52 +0200770}
771
772static TEEC_Result ds_rename_success(TEEC_Session *sess)
773{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100774 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
775 uint32_t org = 0;
Pascal Brand8a74e362015-09-10 12:41:52 +0200776
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100777 op.paramTypes = TEEC_PARAM_TYPES(
778 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
Pascal Brand8a74e362015-09-10 12:41:52 +0200779
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100780 return TEEC_InvokeCommand(
781 sess, CMD_RenamePersistentObject_Success, &op, &org);
Pascal Brand8a74e362015-09-10 12:41:52 +0200782}
783
784static TEEC_Result ds_null_close_free_reset(TEEC_Session *sess)
785{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100786 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
787 uint32_t org = 0;
Pascal Brand8a74e362015-09-10 12:41:52 +0200788
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100789 op.paramTypes = TEEC_PARAM_TYPES(
790 TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE);
Pascal Brand8a74e362015-09-10 12:41:52 +0200791
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100792 return TEEC_InvokeCommand(
793 sess, CMD_CloseFreeAndResetObjectSuccessHandleNull, &op, &org);
Pascal Brand8a74e362015-09-10 12:41:52 +0200794}
795#endif
796
Pascal Brandc639ac82015-07-02 08:53:34 +0200797/* create */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200798static void xtest_tee_test_6001_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200799{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100800 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100801 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100802 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200803
804 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
805 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
806 return;
807
808 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
809 fs_create(&sess, file_00, sizeof(file_00),
810 TEE_DATA_FLAG_ACCESS_WRITE |
811 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200812 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200813 goto exit;
814
815 /* clean */
816 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
817 goto exit;
818
819exit:
820 TEEC_CloseSession(&sess);
821}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200822DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6001)
Jens Wiklander14f48872018-06-29 15:30:13 +0200823ADBG_CASE_DEFINE(regression, 6001, xtest_tee_test_6001,
824 "Test TEE_CreatePersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200825
Pascal Brandc639ac82015-07-02 08:53:34 +0200826/* open */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200827static void xtest_tee_test_6002_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200828{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100829 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100830 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100831 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200832
833 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
834 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
835 return;
836
837 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
838 fs_create(&sess, file_01, sizeof(file_01),
839 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200840 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200841 goto exit;
842
843 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
844 goto exit;
845
846 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
847 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200848 TEE_DATA_FLAG_ACCESS_WRITE_META, &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 /* clean */
860 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
861 goto exit;
862
863exit:
864 TEEC_CloseSession(&sess);
865}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200866DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6002)
Jens Wiklander14f48872018-06-29 15:30:13 +0200867ADBG_CASE_DEFINE(regression, 6002, xtest_tee_test_6002,
868 "Test TEE_OpenPersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200869
Pascal Brandc639ac82015-07-02 08:53:34 +0200870/* read */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200871static void xtest_tee_test_6003_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200872{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100873 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100874 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100875 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100876 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100877 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200878
879 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
880 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
881 return;
882
883 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
884 fs_create(&sess, file_02, sizeof(file_02),
885 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200886 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200887 goto exit;
888
889 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
890 goto exit;
891
892 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
893 fs_open(&sess, file_02, sizeof(file_02),
894 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200895 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200896 goto exit;
897
898 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
899 goto exit;
900
901 (void)ADBG_EXPECT_BUFFER(c, data_01, 10, out, count);
902
903 /* clean */
904 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
905 goto exit;
906
907exit:
908 TEEC_CloseSession(&sess);
909}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200910DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6003)
Jens Wiklander14f48872018-06-29 15:30:13 +0200911ADBG_CASE_DEFINE(regression, 6003, xtest_tee_test_6003,
912 "Test TEE_ReadObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200913
Pascal Brandc639ac82015-07-02 08:53:34 +0200914/* write */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200915static void xtest_tee_test_6004_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200916{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100917 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100918 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100919 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100920 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100921 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200922
923 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
924 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
925 return;
926
927 /* create */
928 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
929 fs_create(&sess, file_02, sizeof(file_02),
930 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200931 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200932 goto exit;
933
934 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
935 goto exit;
936
937 /* write new data */
938 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
939 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200940 TEE_DATA_FLAG_ACCESS_WRITE, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200941 goto exit;
942
943 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
944 fs_write(&sess, obj, data_00, sizeof(data_00))))
945 goto exit;
946
947 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
948 goto exit;
949
950 /* verify */
951 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
952 fs_open(&sess, file_02, sizeof(file_02),
953 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200954 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200955 goto exit;
956
957 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
958 goto exit;
959
960 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
961
962 /* clean */
963 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
964 goto exit;
965
966exit:
967 TEEC_CloseSession(&sess);
968}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200969DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6004)
Jens Wiklander14f48872018-06-29 15:30:13 +0200970ADBG_CASE_DEFINE(regression, 6004, xtest_tee_test_6004,
971 "Test TEE_WriteObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200972
Pascal Brandc639ac82015-07-02 08:53:34 +0200973/* seek */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200974static void xtest_tee_test_6005_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +0200975{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100976 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100977 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100978 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +0100979 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100980 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200981
982 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
983 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
984 return;
985
986 /* create */
987 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
988 fs_create(&sess, file_01, sizeof(file_01),
989 TEE_DATA_FLAG_ACCESS_WRITE |
990 TEE_DATA_FLAG_ACCESS_READ |
991 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +0200992 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200993 goto exit;
994
995 /* seek */
996 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
997 fs_seek(&sess, obj, 10, TEE_DATA_SEEK_SET)))
998 goto exit;
999
1000 /* verify */
1001 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1002 goto exit;
1003
1004 (void)ADBG_EXPECT_BUFFER(c, &data_00[10], 10, out, count);
1005
1006 /* clean */
1007 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1008 goto exit;
1009
1010exit:
1011 TEEC_CloseSession(&sess);
1012}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001013DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6005)
Jens Wiklander14f48872018-06-29 15:30:13 +02001014ADBG_CASE_DEFINE(regression, 6005, xtest_tee_test_6005,
1015 "Test TEE_SeekObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001016
Pascal Brandc639ac82015-07-02 08:53:34 +02001017/* unlink */
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001018static void xtest_tee_test_6006_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001019{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001020 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001021 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001022 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 */
1029 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1030 fs_create(&sess, file_01, sizeof(file_01),
1031 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001032 sizeof(data_00), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001033 goto exit;
1034
1035 /* del & close */
1036 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1037 goto exit;
1038
1039 /* check result */
1040 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1041 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001042 TEE_DATA_FLAG_ACCESS_READ, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001043 goto exit;
1044
1045exit:
1046 TEEC_CloseSession(&sess);
1047}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001048DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6006)
Jens Wiklander14f48872018-06-29 15:30:13 +02001049ADBG_CASE_DEFINE(regression, 6006, xtest_tee_test_6006,
1050 "Test TEE_CloseAndDeletePersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001051
1052static void xtest_tee_test_6007_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001053{
James Kung98c0ba12015-09-09 15:51:59 +08001054 Do_ADBG_BeginSubCase(c, "Test truncate file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001055 test_truncate_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +08001056 Do_ADBG_EndSubCase(c, "Test truncate file length");
Pascal Brandc639ac82015-07-02 08:53:34 +02001057
James Kung98c0ba12015-09-09 15:51:59 +08001058 Do_ADBG_BeginSubCase(c, "Test extend file length");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001059 test_extend_file_length(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +08001060 Do_ADBG_EndSubCase(c, "Test extend file length");
Pascal Brandc639ac82015-07-02 08:53:34 +02001061
James Kung98c0ba12015-09-09 15:51:59 +08001062 Do_ADBG_BeginSubCase(c, "Test file hole");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001063 test_file_hole(c, storage_id);
James Kung98c0ba12015-09-09 15:51:59 +08001064 Do_ADBG_EndSubCase(c, "Test file hole");
Pascal Brandc639ac82015-07-02 08:53:34 +02001065}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001066DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6007)
Jens Wiklander14f48872018-06-29 15:30:13 +02001067ADBG_CASE_DEFINE(regression, 6007, xtest_tee_test_6007,
1068 "Test TEE_TruncateObjectData");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001069
1070static void xtest_tee_test_6008_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001071{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001072 TEEC_Session sess = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001073 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001074 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001075 uint32_t count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001076 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001077
1078 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1079 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1080 return;
1081
1082 /* create */
1083 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1084 fs_create(&sess, file_02, sizeof(file_02),
1085 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001086 sizeof(data_01), &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001087 goto exit;
1088
1089 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1090 goto exit;
1091
1092 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1093 fs_open(&sess, file_02, sizeof(file_02),
1094 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001095 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001096 goto exit;
1097
1098 /* write new data */
1099 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1100 fs_write(&sess, obj, data_00, sizeof(data_00))))
1101 goto exit;
1102
1103 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1104 fs_rename(&sess, obj, file_03, sizeof(file_03))))
1105 goto exit;
1106
1107 /* close */
1108 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1109 goto exit;
1110
1111 /* verify */
1112 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1113 fs_open(&sess, file_03, sizeof(file_03),
1114 TEE_DATA_FLAG_ACCESS_READ |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001115 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001116 goto exit;
1117
1118 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1119 goto exit;
1120
1121 /* check buffer */
1122 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
1123
1124 /* clean */
1125 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1126 goto exit;
1127
1128exit:
1129 TEEC_CloseSession(&sess);
1130}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001131DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6008)
Jens Wiklander14f48872018-06-29 15:30:13 +02001132ADBG_CASE_DEFINE(regression, 6008, xtest_tee_test_6008,
1133 "Test TEE_RenamePersistentObject");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001134
1135static void xtest_tee_test_6009_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandc639ac82015-07-02 08:53:34 +02001136{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001137 TEEC_Session sess = { };
1138 uint32_t obj0 = 0;
1139 uint32_t obj1 = 0;
1140 uint32_t obj2 = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001141 uint32_t e = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001142 uint8_t info[200] = { };
1143 uint8_t id[200] = { };
1144 uint32_t orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001145
1146 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1147 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1148 return;
1149
1150 /* create file 00 */
1151 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1152 fs_create(&sess, file_00, sizeof(file_00),
1153 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001154 sizeof(data_01), &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001155 goto exit;
1156
1157 /* create file 01 */
1158 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1159 fs_create(&sess, file_01, sizeof(file_01),
1160 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001161 sizeof(data_01), &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001162 goto exit;
1163
1164 /* create file 02 */
1165 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1166 fs_create(&sess, file_02, sizeof(file_02),
1167 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001168 sizeof(data_01), &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001169 goto exit;
1170
1171 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj0)))
1172 goto exit;
1173
1174 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj1)))
1175 goto exit;
1176
1177 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj2)))
1178 goto exit;
1179
1180 /* iterate */
1181 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e)))
1182 goto exit;
1183
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001184 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_start_enum(&sess, e, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001185 goto exit;
1186
1187 /* get 00 */
1188 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1189 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1190 goto exit;
1191
1192 /* get 01 */
1193 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc603e0d2016-04-25 12:37:18 +02001194 fs_next_enum(&sess, e, NULL, 0, id, sizeof(id))))
Pascal Brandc639ac82015-07-02 08:53:34 +02001195 goto exit;
1196
1197 /* get 02 */
1198 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1199 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1200 goto exit;
1201
1202 /* we should not have more files */
1203 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1204 fs_next_enum(&sess, e, info, sizeof(info), id, sizeof(id))))
1205 goto exit;
1206
1207 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e)))
1208 goto exit;
1209
1210 /* clean */
1211 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1212 fs_open(&sess, file_00, sizeof(file_00),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001213 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj0, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001214 goto exit;
1215
1216 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj0)))
1217 goto exit;
1218
1219 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1220 fs_open(&sess, file_01, sizeof(file_01),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001221 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj1, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001222 goto exit;
1223
1224 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj1)))
1225 goto exit;
1226
1227 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1228 fs_open(&sess, file_02, sizeof(file_02),
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001229 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj2, storage_id)))
Pascal Brandc639ac82015-07-02 08:53:34 +02001230 goto exit;
1231
1232 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj2)))
1233 goto exit;
1234
1235exit:
1236 TEEC_CloseSession(&sess);
1237}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001238DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6009)
Jens Wiklander14f48872018-06-29 15:30:13 +02001239ADBG_CASE_DEFINE(regression, 6009, xtest_tee_test_6009,
1240 "Test TEE Internal API Persistent Object Enumeration Functions");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001241
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001242static void xtest_tee_test_6010_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand8a74e362015-09-10 12:41:52 +02001243{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001244 TEEC_Session sess = { };
1245 uint32_t orig = 0;
1246 uint32_t o1 = 0;
1247 uint32_t o2 = 0;
1248 uint32_t e = 0;
1249 uint32_t f = 0;
1250 uint8_t data[1024] = { };
1251 uint8_t out[1024] = { };
1252 uint32_t n = 0;
Pascal Brand30844922015-09-17 12:12:42 +02001253
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001254 for (n = 0; n < ARRAY_SIZE(data); n++)
1255 data[n] = n;
Pascal Brand8a74e362015-09-10 12:41:52 +02001256
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001257 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1258 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1259 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001260
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001261 Do_ADBG_BeginSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001262
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001263 o1 = TEE_HANDLE_NULL;
1264 o2 = TEE_HANDLE_NULL;
1265 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1266 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1267 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
Pascal Brand8a74e362015-09-10 12:41:52 +02001268
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001269 ADBG_EXPECT_TEEC_SUCCESS(c,
1270 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1271 sizeof(data), &o1, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001272
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001273 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE;
1274 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ACCESS_CONFLICT,
1275 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1276 sizeof(data), &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001277
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001278 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1279 if (o2)
1280 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
Pascal Brand8a74e362015-09-10 12:41:52 +02001281
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001282 Do_ADBG_EndSubCase(c, "CreatePersistentObject AccessConflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001283
Pascal Brand8a74e362015-09-10 12:41:52 +02001284
Pascal Brand8a74e362015-09-10 12:41:52 +02001285
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001286 Do_ADBG_BeginSubCase(c, "RestrictObjectUsage Panic");
1287 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1288 fs_restrict_usage(&sess, 0xffffbad0, 0xffffffff));
1289 Do_ADBG_EndSubCase(c, "RestrictObjectUsage Panic");
Pascal Brand8a74e362015-09-10 12:41:52 +02001290
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001291 TEEC_CloseSession(&sess);
1292 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1293 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1294 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001295
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001296 Do_ADBG_BeginSubCase(c, "SeekObjectData BadHandle");
1297 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1298 fs_seek(&sess, 0xffffbad0, 5, TEE_DATA_SEEK_SET));
1299 Do_ADBG_EndSubCase(c, "SeekObjectData BadHandle");
Pascal Brand8a74e362015-09-10 12:41:52 +02001300
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001301 TEEC_CloseSession(&sess);
1302 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1303 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1304 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001305
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001306 Do_ADBG_BeginSubCase(c, "SeekObjectData NotPersist");
1307 o1 = 0;
1308 ADBG_EXPECT_TEEC_SUCCESS(c,
1309 fs_alloc_obj(&sess, TEE_TYPE_AES, 256, &o1));
1310 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD,
1311 fs_seek(&sess, o1, 5, TEE_DATA_SEEK_SET));
1312 Do_ADBG_EndSubCase(c, "SeekObjectData NotPersist");
Pascal Brand8a74e362015-09-10 12:41:52 +02001313
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001314 TEEC_CloseSession(&sess);
1315 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1316 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1317 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001318
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001319 Do_ADBG_BeginSubCase(c, "SeekWriteRead");
1320 o1 = 0;
1321 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1322 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1323 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1324 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1325 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1326 sizeof(data), &o1, storage_id)))
1327 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001328
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001329 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1330 fs_seek(&sess, o1, 2, TEE_DATA_SEEK_SET)))
1331 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001332
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001333 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1334 fs_seek(&sess, o1, 0, TEE_DATA_SEEK_END)))
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_write(&sess, o1, data, sizeof(data))))
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, sizeof(data), TEE_DATA_SEEK_SET)))
1343 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001344
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001345 memset(out, 0xab, sizeof(out));
1346 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1347 fs_read(&sess, o1, out, sizeof(out), &n)))
1348 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001349
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001350 ADBG_EXPECT_BUFFER(c, data, sizeof(data), out, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001351
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001352 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander3a6892e2016-09-14 15:53:52 +02001353 fs_seek(&sess, o1, 10, TEE_DATA_SEEK_END)))
1354 goto seek_write_read_out;
1355
1356 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1357 fs_read(&sess, o1, out, sizeof(out), &n)))
1358 goto seek_write_read_out;
1359 ADBG_EXPECT_COMPARE_UNSIGNED(c, n, ==, 0);
1360
1361 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001362 fs_seek(&sess, o1, -(int32_t)sizeof(data) / 2,
1363 TEE_DATA_SEEK_END)))
1364 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001365
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001366 memset(out, 0xab, sizeof(out) / 2);
1367 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1368 fs_read(&sess, o1, out, sizeof(out) / 2, &n)))
1369 goto seek_write_read_out;
Pascal Brand8a74e362015-09-10 12:41:52 +02001370
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001371 ADBG_EXPECT_BUFFER(c,
1372 data + sizeof(data) / 2, sizeof(data) / 2,
Melanie Favre73205032018-02-19 13:35:52 +01001373 out, n);
Pascal Brand8a74e362015-09-10 12:41:52 +02001374
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001375seek_write_read_out:
1376 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1377 Do_ADBG_EndSubCase(c, "SeekWriteRead");
Pascal Brand8a74e362015-09-10 12:41:52 +02001378
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001379 Do_ADBG_BeginSubCase(c, "Rename Access Conflict");
Pascal Brand8a74e362015-09-10 12:41:52 +02001380
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001381 o1 = TEE_HANDLE_NULL;
1382 o2 = TEE_HANDLE_NULL;
1383 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1384 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1385 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1386 ADBG_EXPECT_TEEC_SUCCESS(c,
1387 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1388 sizeof(data), &o1, storage_id));
1389 ADBG_EXPECT_TEEC_SUCCESS(c,
1390 fs_create(&sess, file_01, sizeof(file_01), f, 0, data,
1391 sizeof(data) / 2, &o2, storage_id));
Pascal Brand8a74e362015-09-10 12:41:52 +02001392
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001393 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ACCESS_CONFLICT,
1394 fs_rename(&sess, o2, file_00, sizeof(file_00)));
Pascal Brand8a74e362015-09-10 12:41:52 +02001395
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001396 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1397 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
1398
1399 Do_ADBG_EndSubCase(c, "Rename Access Conflict");
1400
Jerome Forissier7dbf8772018-12-19 09:05:48 +01001401 Do_ADBG_BeginSubCase(c, "Rename Access Conflict 2");
1402
1403 o1 = TEE_HANDLE_NULL;
1404 o2 = TEE_HANDLE_NULL;
1405 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1406 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1407 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1408 ADBG_EXPECT_TEEC_SUCCESS(c,
1409 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1410 sizeof(data), &o1, storage_id));
1411 ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, o1));
1412
1413 ADBG_EXPECT_TEEC_SUCCESS(c,
1414 fs_create(&sess, file_01, sizeof(file_01), f, 0, data,
1415 sizeof(data) / 2, &o2, storage_id));
1416 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ACCESS_CONFLICT,
1417 fs_rename(&sess, o2, file_00, sizeof(file_00)));
1418
1419 ADBG_EXPECT_TEEC_SUCCESS(c,
1420 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1421 sizeof(data), &o1, storage_id));
1422
1423 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1424 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o2));
1425
1426 Do_ADBG_EndSubCase(c, "Rename Access Conflict 2");
1427
Jerome Forissier5d969d82017-03-21 10:01:04 +01001428 Do_ADBG_BeginSubCase(c, "AllocPersistentObjectEnumerator + "
1429 "ResetPersistentObjectEnumerator");
1430 e = TEE_HANDLE_NULL;
1431 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1432 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_enum(&sess, e));
1433 Do_ADBG_EndSubCase(c, "AllocPersistentObjectEnumerator + "
1434 "ResetPersistentObjectEnumerator");
1435
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001436 Do_ADBG_BeginSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1437 e = TEE_HANDLE_NULL;
1438 ADBG_EXPECT_TEEC_SUCCESS(c, fs_alloc_enum(&sess, &e));
1439 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1440 fs_next_enum(&sess, e, NULL, 0, out, sizeof(out)));
1441 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_ITEM_NOT_FOUND,
1442 fs_start_enum(&sess, e, storage_id));
1443 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_enum(&sess, e));
1444 Do_ADBG_EndSubCase(c, "StartPersistentObjectEnumerator ItemNotFound");
1445
1446 Do_ADBG_BeginSubCase(c, "RenamePersistent ReadWrite");
1447 o1 = TEE_HANDLE_NULL;
1448 f = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
1449 TEE_DATA_FLAG_ACCESS_WRITE_META | TEE_DATA_FLAG_SHARE_READ |
1450 TEE_DATA_FLAG_SHARE_WRITE | TEE_DATA_FLAG_OVERWRITE;
1451 ADBG_EXPECT_TEEC_SUCCESS(c,
1452 fs_create(&sess, file_00, sizeof(file_00), f, 0, data,
1453 sizeof(data), &o1, storage_id));
1454 ADBG_EXPECT_TEEC_SUCCESS(c,
1455 fs_rename(&sess, o1, file_01, sizeof(file_01)));
1456 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, o1));
1457 Do_ADBG_EndSubCase(c, "RenamePersistent ReadWrite");
1458
1459 Do_ADBG_BeginSubCase(c, "Close Free Reset Null");
1460 ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, TEE_HANDLE_NULL));
1461 ADBG_EXPECT_TEEC_SUCCESS(c, fs_free_obj(&sess, TEE_HANDLE_NULL));
1462 ADBG_EXPECT_TEEC_SUCCESS(c, fs_reset_obj(&sess, TEE_HANDLE_NULL));
1463 Do_ADBG_EndSubCase(c, "Close Free Reset Null");
1464
1465 TEEC_CloseSession(&sess);
Pascal Brand8a74e362015-09-10 12:41:52 +02001466}
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001467DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6010)
Jens Wiklander14f48872018-06-29 15:30:13 +02001468ADBG_CASE_DEFINE(regression, 6010, xtest_tee_test_6010, "Test Storage");
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001469
1470#ifdef WITH_GP_TESTS
Pascal Brand8a74e362015-09-10 12:41:52 +02001471static void xtest_tee_test_6011(ADBG_Case_t *c)
1472{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001473 TEEC_Session sess = { };
1474 uint32_t orig = 0;
1475 /*
1476 * Test data from
1477 * Invoke_InitObjectAndAttributes_TEE_TYPE_AES_success_attribute_
1478 * TEE_ATTR_SECRET_VALUE_correct_size (9d-9a-91)
1479 */
1480 static const uint8_t attr_meta[] = {
Pascal Brand8a74e362015-09-10 12:41:52 +020014810xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
14820x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
14830x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
14840x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001485 };
1486 static const uint8_t attr_data[] = {
Pascal Brand8a74e362015-09-10 12:41:52 +020014870x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,
14880x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,
14890xdf,0xf4,
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001490 };
Pascal Brand8a74e362015-09-10 12:41:52 +02001491
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001492 if (!ADBG_EXPECT_TEEC_SUCCESS(
1493 c, xtest_teec_open_session(&sess, &gp_tta_ds_uuid,
1494 NULL, &orig)))
1495 return;
Pascal Brand8a74e362015-09-10 12:41:52 +02001496
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001497 if (!ADBG_EXPECT_TEEC_SUCCESS(
1498 c, ds_init_object_and_attributes(&sess, 0xa0000010,
1499 0x100, attr_meta, sizeof(attr_meta),
1500 attr_data, sizeof(attr_data), 0)))
1501 goto exit;
Pascal Brand8a74e362015-09-10 12:41:52 +02001502
1503exit:
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001504 TEEC_CloseSession(&sess);
Pascal Brand8a74e362015-09-10 12:41:52 +02001505}
Jens Wiklander14f48872018-06-29 15:30:13 +02001506ADBG_CASE_DEFINE(regression, 6011, xtest_tee_test_6011,
1507 "Test TEE GP TTA DS init objects");
Jens Wiklandere6d4ddd2016-09-14 15:50:48 +02001508#endif /*WITH_GP_TESTS*/
Pascal Brand8a74e362015-09-10 12:41:52 +02001509
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001510static void xtest_tee_test_6012_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brandeb84c442016-04-19 17:49:49 +02001511{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001512 TEEC_Session sess = { };
1513 uint32_t orig = 0;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001514 uint32_t obj = 0;
Pascal Brandeb84c442016-04-19 17:49:49 +02001515
Etienne Carrierea54952b2017-10-27 15:58:01 +02001516 /*
1517 * create the object a first time (forced through with overwrite attribute)
1518 */
Pascal Brandeb84c442016-04-19 17:49:49 +02001519 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1520 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1521 return;
1522
1523 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001524 fs_create_overwrite(&sess, file_04, sizeof(file_04), storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001525 goto bail1;
Pascal Brandeb84c442016-04-19 17:49:49 +02001526
1527 TEEC_CloseSession(&sess);
1528
Etienne Carrierea54952b2017-10-27 15:58:01 +02001529 /*
1530 * re-create the object two times with overwrite attribute
1531 */
Pascal Brandeb84c442016-04-19 17:49:49 +02001532 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1533 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1534 return;
1535
1536 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001537 fs_create_overwrite(&sess, file_04, sizeof(file_04),
1538 storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001539 goto bail1;
Pascal Brandeb84c442016-04-19 17:49:49 +02001540
Etienne Carrierea54952b2017-10-27 15:58:01 +02001541 /* re-create it with an object */
1542 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandeb84c442016-04-19 17:49:49 +02001543 fs_create(&sess, file_04, sizeof(file_04),
1544 TEE_DATA_FLAG_ACCESS_WRITE |
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001545 TEE_DATA_FLAG_ACCESS_WRITE_META |
1546 TEE_DATA_FLAG_OVERWRITE, 0, NULL, 0, &obj,
1547 storage_id)))
Etienne Carrierea54952b2017-10-27 15:58:01 +02001548 goto bail2;
Pascal Brandeb84c442016-04-19 17:49:49 +02001549
Etienne Carrierea54952b2017-10-27 15:58:01 +02001550 TEEC_CloseSession(&sess);
Pascal Brandeb84c442016-04-19 17:49:49 +02001551
Etienne Carrierea54952b2017-10-27 15:58:01 +02001552 /*
1553 * re-create it again without overwrite flag: should fail and
1554 * existing object should not be altered.
1555 */
1556 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1557 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1558 return;
1559
1560 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ACCESS_CONFLICT,
1561 fs_create(&sess, file_04, sizeof(file_04),
1562 TEE_DATA_FLAG_ACCESS_WRITE |
1563 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, NULL, 0, &obj,
1564 storage_id)))
1565 goto bail2;
1566
1567 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1568 fs_open(&sess, file_04, sizeof(file_04),
1569 TEE_DATA_FLAG_ACCESS_READ |
1570 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj,
1571 storage_id)))
1572 goto bail1;
1573
1574bail2:
1575 /* remove the object so that xtest 600x can be replayed */
1576 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1577bail1:
Pascal Brandeb84c442016-04-19 17:49:49 +02001578 TEEC_CloseSession(&sess);
1579}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001580DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6012)
Jens Wiklander14f48872018-06-29 15:30:13 +02001581ADBG_CASE_DEFINE(regression, 6012, xtest_tee_test_6012,
1582 "Test TEE GP TTA DS init objects");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001583
1584static void xtest_tee_test_6013_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand90f23352016-05-19 15:15:47 +02001585{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001586 TEEC_Session sess = { };
1587 uint32_t orig = 0;
Pascal Brand90f23352016-05-19 15:15:47 +02001588 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1589
1590 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1591 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1592 return;
1593
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001594 op.params[0].value.a = storage_id;
1595 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand90f23352016-05-19 15:15:47 +02001596 TEEC_NONE, TEEC_NONE);
1597
1598 ADBG_EXPECT_TEEC_SUCCESS(c,
1599 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_KEY_IN_PERSISTENT,
1600 &op, &orig));
1601
1602 TEEC_CloseSession(&sess);
1603}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001604DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6013)
Jens Wiklander14f48872018-06-29 15:30:13 +02001605ADBG_CASE_DEFINE(regression, 6013, xtest_tee_test_6013,
1606 "Key usage in Persistent objects");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001607
1608static void xtest_tee_test_6014_single(ADBG_Case_t *c, uint32_t storage_id)
Pascal Brand29ee18f2016-05-23 14:13:56 +02001609{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001610 TEEC_Session sess = { };
1611 uint32_t orig = 0;
Pascal Brand29ee18f2016-05-23 14:13:56 +02001612 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1613
1614 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1615 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1616 return;
1617
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001618 op.params[0].value.a = storage_id;
1619 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
Pascal Brand29ee18f2016-05-23 14:13:56 +02001620 TEEC_NONE, TEEC_NONE);
1621
1622 ADBG_EXPECT_TEEC_SUCCESS(c,
1623 TEEC_InvokeCommand(&sess, TA_STORAGE_CMD_LOOP, &op, &orig));
1624
1625 TEEC_CloseSession(&sess);
1626}
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001627DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6014)
Jens Wiklander14f48872018-06-29 15:30:13 +02001628ADBG_CASE_DEFINE(regression, 6014, xtest_tee_test_6014,
1629 "Loop on Persistent objects");
Jerome Forissier0e99d6a2016-07-25 14:21:43 +02001630
Jerome Forissiere3854162016-08-12 12:40:12 +02001631static void xtest_tee_test_6015_single(ADBG_Case_t *c, uint32_t storage_id)
1632{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001633 TEEC_Session sess = { };
1634 TEEC_Session sess2 = { };
1635 uint32_t orig = 0;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001636 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001637 uint32_t obj2 = 0;
Jerome Forissiere3854162016-08-12 12:40:12 +02001638
1639 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1640 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1641 return;
1642
1643 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1644 xtest_teec_open_session(&sess2, &storage2_ta_uuid, NULL,
1645 &orig)))
1646 goto exit2;
1647
1648 /* TA #1 creates a persistent object */
1649 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1650 fs_create(&sess, file_01, sizeof(file_01),
1651 TEE_DATA_FLAG_ACCESS_WRITE |
1652 TEE_DATA_FLAG_ACCESS_READ |
1653 TEE_DATA_FLAG_ACCESS_WRITE_META, 0, data_00,
1654 sizeof(data_00), &obj, storage_id)))
1655 goto exit;
1656
1657 /* TA #2 tries to open the object created by TA #1 */
1658 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
1659 fs_open(&sess2, file_01, sizeof(file_01),
1660 TEE_DATA_FLAG_ACCESS_READ, &obj2, storage_id)))
1661 goto clean;
1662
Jerome Forissiere3854162016-08-12 12:40:12 +02001663clean:
1664 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1665exit:
1666 TEEC_CloseSession(&sess2);
1667exit2:
1668 TEEC_CloseSession(&sess);
1669}
Jerome Forissiere3854162016-08-12 12:40:12 +02001670DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6015)
Jens Wiklander14f48872018-06-29 15:30:13 +02001671ADBG_CASE_DEFINE(regression, 6015, xtest_tee_test_6015, "Storage isolation");
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001672
1673struct test_6016_thread_arg {
1674 ADBG_Case_t *case_t;
1675 uint32_t storage_id;
Jerome Forissier54cfbef2016-08-31 18:34:31 +02001676 char file_name[8];
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001677 TEEC_Session session;
1678};
1679
1680static void *test_6016_thread(void *arg)
1681{
1682 struct test_6016_thread_arg *a = arg;
1683 TEEC_Session sess = a->session;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001684 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001685 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001686 uint32_t count = 0;
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001687
1688 /* create */
1689 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1690 fs_create(&sess, a->file_name, sizeof(a->file_name),
1691 TEE_DATA_FLAG_ACCESS_WRITE, 0, data_01,
1692 sizeof(data_01), &obj, a->storage_id)))
1693 goto exit;
1694
1695 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1696 goto exit;
1697
1698 /* write new data */
1699 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1700 fs_open(&sess, a->file_name, sizeof(a->file_name),
1701 TEE_DATA_FLAG_ACCESS_WRITE, &obj, a->storage_id)))
1702 goto exit;
1703
1704 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1705 fs_write(&sess, obj, data_00, sizeof(data_00))))
1706 goto exit;
1707
1708 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_close(&sess, obj)))
1709 goto exit;
1710
1711 /* verify */
1712 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1713 fs_open(&sess, a->file_name, sizeof(a->file_name),
1714 TEE_DATA_FLAG_ACCESS_READ |
1715 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, a->storage_id)))
1716 goto exit;
1717
1718 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t,
1719 fs_read(&sess, obj, out, 10, &count)))
1720 goto exit;
1721
1722 (void)ADBG_EXPECT_BUFFER(a->case_t, data_00, 10, out, count);
1723
1724 /* clean */
1725 if (!ADBG_EXPECT_TEEC_SUCCESS(a->case_t, fs_unlink(&sess, obj)))
1726 goto exit;
1727
1728exit:
1729 return NULL;
1730}
1731
1732
1733#define NUM_THREADS 4
1734static void xtest_tee_test_6016_loop(ADBG_Case_t *c, uint32_t storage_id)
1735{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001736 struct test_6016_thread_arg arg[NUM_THREADS] = { };
1737 uint32_t orig = 0;
1738 size_t i = 0;
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001739 size_t n = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001740 size_t m = 0;
1741 pthread_t thr[NUM_THREADS] = { };
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001742
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001743 for (m = 0; m < NUM_THREADS; m++)
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001744 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1745 xtest_teec_open_session(&arg[m].session,
1746 &storage_ta_uuid, NULL, &orig)))
1747 goto out;
1748
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001749 for (n = 0; n < NUM_THREADS; n++) {
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001750 arg[n].case_t = c;
1751 arg[n].storage_id = storage_id;
Jerome Forissiercb10f832016-09-01 14:53:05 +02001752 snprintf(arg[n].file_name, sizeof(arg[n].file_name),
Jens Wiklander2b1c11d2016-09-16 14:58:41 +02001753 "file_%zu", n);
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001754 if (!ADBG_EXPECT(c, 0, pthread_create(thr + n, NULL,
1755 test_6016_thread, arg + n)))
1756 goto out;
1757 }
1758
1759out:
1760 for (i = 0; i < n; i++)
1761 ADBG_EXPECT(c, 0, pthread_join(thr[i], NULL));
1762 for (i = 0; i < m; i++)
1763 TEEC_CloseSession(&arg[i].session);
1764}
1765
1766/* concurency */
1767static void xtest_tee_test_6016_single(ADBG_Case_t *c, uint32_t storage_id)
1768{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001769 int i = 0;
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001770 int loops = 8;
1771
1772 Do_ADBG_Log(" threads: %d, loops: %d", NUM_THREADS, loops);
1773 for (i = 0; i < loops; i++)
1774 xtest_tee_test_6016_loop(c, storage_id);
1775}
Jerome Forissierefd71d32016-09-13 15:09:33 +02001776DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6016)
Jens Wiklander14f48872018-06-29 15:30:13 +02001777ADBG_CASE_DEFINE(regression, 6016, xtest_tee_test_6016, "Storage concurency");
Jerome Forissier327672c2016-09-01 18:34:11 +02001778
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001779static void xtest_tee_test_6017_single(ADBG_Case_t *c, uint32_t storage_id)
1780{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001781 TEEC_Session sess = { };
1782 TEE_ObjectInfo obj_info1 = { };
1783 TEE_ObjectInfo obj_info2 = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001784 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001785 uint32_t orig = 0;
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001786
1787 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1788 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1789 return;
1790
1791 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1792 fs_create(&sess, file_01, sizeof(file_01),
1793 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1794 0, &obj, storage_id)))
1795 goto exit;
1796
1797 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1798 fs_write(&sess, obj, data_00, sizeof(data_00))))
1799 goto exit;
1800
1801 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1802 fs_get_obj_info(&sess, obj, &obj_info1,
1803 sizeof(TEE_ObjectInfo))))
1804 goto exit;
1805
1806 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1807 goto exit;
1808
1809 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1810 fs_open(&sess, file_01, sizeof(file_01),
1811 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1812 goto exit;
1813
1814 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1815 fs_get_obj_info(&sess, obj, &obj_info2,
1816 sizeof(TEE_ObjectInfo))))
1817 goto exit;
1818
1819 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1820 obj_info1.dataSize, ==, obj_info2.dataSize))
1821 goto exit;
1822
1823 /* clean */
1824 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1825 goto exit;
1826
1827exit:
1828 TEEC_CloseSession(&sess);
1829}
Guanchao Liang31a9cbf2016-12-20 00:35:26 +08001830DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6017)
Jens Wiklander14f48872018-06-29 15:30:13 +02001831ADBG_CASE_DEFINE(regression, 6017, xtest_tee_test_6017,
1832 "Test Persistent objects info");
Lijianhui (Airbak)29d7c7a2016-08-24 17:35:55 +08001833
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001834static void xtest_tee_test_6018_single(ADBG_Case_t *c, uint32_t storage_id)
1835{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001836 TEEC_Session sess = { };
1837 TEE_ObjectInfo obj_info1 = { };
1838 TEE_ObjectInfo obj_info2 = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001839 uint32_t obj = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001840 uint32_t orig = 0;
1841 uint8_t block[32 * 1024] = { };
1842 size_t num_blocks = 0;
1843 size_t block_size = 0;
1844 size_t n = 0;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001845
1846 if (storage_is(storage_id, TEE_STORAGE_PRIVATE_RPMB)) {
1847 /* RPMB FS is a bit resource constrained */
Jens Wiklander20949ea2017-05-17 17:47:58 +02001848 num_blocks = 10;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001849 block_size = 1024;
1850 } else {
Jens Wiklander5f86daa2017-05-30 16:37:19 +02001851 num_blocks = 20;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001852 block_size = sizeof(block);
1853 }
1854
1855 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1856 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1857 return;
1858
1859 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1860 fs_create(&sess, file_01, sizeof(file_01),
1861 TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
1862 0, &obj, storage_id)))
1863 goto exit;
1864
1865 for (n = 0; n < num_blocks; n++) {
1866 memset(block, n, block_size);
1867
1868 Do_ADBG_Log("writing %zu", n);
1869 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1870 fs_write(&sess, obj, block, block_size)))
1871 goto exit;
1872 }
1873
1874 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1875 fs_get_obj_info(&sess, obj, &obj_info1,
1876 sizeof(TEE_ObjectInfo))))
1877 goto exit;
1878
1879 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1880 obj_info1.dataSize, ==, block_size * num_blocks))
1881 goto exit;
1882
1883 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1884 goto exit;
1885
1886 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1887 fs_open(&sess, file_01, sizeof(file_01),
1888 TEE_DATA_FLAG_ACCESS_READ |
1889 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1890 goto exit;
1891
1892 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1893 fs_get_obj_info(&sess, obj, &obj_info2,
1894 sizeof(TEE_ObjectInfo))))
1895 goto exit;
1896
1897 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
1898 obj_info1.dataSize, ==, obj_info2.dataSize))
1899 goto exit;
1900
1901 for (n = 0; n < num_blocks; n++) {
1902 uint8_t br[block_size];
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001903 uint32_t count = 0;
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001904
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001905 memset(br, 0, sizeof(br));
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001906 memset(block, n, block_size);
1907
1908 Do_ADBG_Log("reading %zu", n);
1909 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1910 fs_read(&sess, obj, br, sizeof(br), &count)))
1911 goto exit;
1912 if (!ADBG_EXPECT_BUFFER(c, block, block_size, br, count))
1913 goto exit;
1914 }
1915
1916 /* clean */
1917 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
1918 goto exit;
1919
1920exit:
1921 TEEC_CloseSession(&sess);
1922}
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001923DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6018)
Jens Wiklander14f48872018-06-29 15:30:13 +02001924ADBG_CASE_DEFINE(regression, 6018, xtest_tee_test_6018, "Large object");
Jens Wiklanderaba31ba2017-02-15 15:24:06 +01001925
l00176142ebba0c92017-11-08 01:16:26 +08001926static void xtest_tee_test_6019_single(ADBG_Case_t *c, uint32_t storage_id)
1927{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001928 TEEC_Session sess = { };
1929 TEEC_Session sess2 = { };
1930 uint32_t orig = 0;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001931 uint32_t obj = 0;
1932 uint32_t obj2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001933 uint8_t out[10] = { };
Etienne Carrieref6f68a22019-01-22 13:27:46 +01001934 uint32_t count = 0;
l00176142ebba0c92017-11-08 01:16:26 +08001935
1936 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1937 xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
1938 return;
1939
1940 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1941 xtest_teec_open_session(&sess2, &storage2_ta_uuid, NULL,
1942 &orig)))
1943 goto exit3;
1944
1945 /* TA #1 creates a persistent object */
1946 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1947 fs_create(&sess, file_01, sizeof(file_01),
1948 TEE_DATA_FLAG_ACCESS_WRITE |
1949 TEE_DATA_FLAG_ACCESS_WRITE_META |
1950 TEE_DATA_FLAG_OVERWRITE, 0, data_00,
1951 sizeof(data_00), &obj, storage_id)))
1952 goto exit2;
1953
1954 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
1955 goto exit1;
1956
1957 /* TA #2 creates a persistent object */
1958 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1959 fs_create(&sess2, file_01, sizeof(file_01),
1960 TEE_DATA_FLAG_ACCESS_WRITE |
1961 TEE_DATA_FLAG_ACCESS_WRITE_META |
1962 TEE_DATA_FLAG_OVERWRITE, 0, data_01,
1963 sizeof(data_01), &obj2, storage_id)))
1964 goto exit1;
1965
1966 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess2, obj2)))
1967 goto exit;
1968
1969 /* TA #1 open and read */
1970 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1971 fs_open(&sess, file_01, sizeof(file_01),
1972 TEE_DATA_FLAG_ACCESS_READ |
1973 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
1974 goto exit;
1975
1976 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess, obj, out, 10, &count)))
1977 goto exit;
1978
1979 /* verify */
1980 (void)ADBG_EXPECT_BUFFER(c, data_00, 10, out, count);
1981
1982 /* TA #2 open and read */
1983 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1984 fs_open(&sess2, file_01, sizeof(file_01),
1985 TEE_DATA_FLAG_ACCESS_READ |
1986 TEE_DATA_FLAG_ACCESS_WRITE_META, &obj2, storage_id)))
1987 goto exit;
1988
1989 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_read(&sess2, obj2, out, 10, &count)))
1990 goto exit;
1991
1992 /* verify */
1993 (void)ADBG_EXPECT_BUFFER(c, data_01, 10, out, count);
1994
1995exit:
1996 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess2, obj2));
1997exit1:
1998 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
1999exit2:
2000 TEEC_CloseSession(&sess2);
2001exit3:
2002 TEEC_CloseSession(&sess);
2003}
l00176142ebba0c92017-11-08 01:16:26 +08002004DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6019)
Jens Wiklander14f48872018-06-29 15:30:13 +02002005ADBG_CASE_DEFINE(regression, 6019, xtest_tee_test_6019, "Storage independence");
l00176142ebba0c92017-11-08 01:16:26 +08002006
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002007/*
2008 * According to the GP spec V1.1, the object_id in create/open/rename
2009 * functions is not allowed to reside in the shared memory.
2010 *
2011 * The function below replicates fs_open/fs_create/fs_rename but using
2012 * specific commands to ask the TA to use the client object ID buffer
2013 * from the shared memory when accessing the object through target APIs.
2014 * The TA is not expected to use such references and gets killed by the TEE.
2015 */
2016static TEEC_Result fs_access_with_bad_object_id_ref(TEEC_Session *sess,
2017 uint32_t command,
2018 void *id, uint32_t id_size,
2019 uint32_t flags,
2020 uint32_t attr,
2021 void *data, uint32_t data_size,
2022 uint32_t *obj,
2023 uint32_t storage_id)
2024{
2025 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002026 TEEC_Result res = TEEC_ERROR_GENERIC;
2027 uint32_t org = 0;
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002028
2029 switch (command) {
2030 case TA_STORAGE_CMD_OPEN_ID_IN_SHM:
2031 op.params[0].tmpref.buffer = id;
2032 op.params[0].tmpref.size = id_size;
2033 op.params[1].value.a = flags;
2034 op.params[1].value.b = 0;
2035 op.params[2].value.a = storage_id;
2036
2037 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
2038 TEEC_VALUE_INOUT,
2039 TEEC_VALUE_INPUT,
2040 TEEC_NONE);
2041 break;
2042 case TA_STORAGE_CMD_CREATE_ID_IN_SHM:
2043 op.params[0].tmpref.buffer = id;
2044 op.params[0].tmpref.size = id_size;
2045 op.params[1].value.a = flags;
2046 op.params[1].value.b = 0;
2047 op.params[2].value.a = attr;
2048 op.params[2].value.b = storage_id;
2049 op.params[3].tmpref.buffer = data;
2050 op.params[3].tmpref.size = data_size;
2051
2052 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
2053 TEEC_VALUE_INOUT,
2054 TEEC_VALUE_INPUT,
2055 TEEC_MEMREF_TEMP_INPUT);
2056 break;
2057 case TA_STORAGE_CMD_CREATEOVER_ID_IN_SHM:
2058 op.params[0].tmpref.buffer = id;
2059 op.params[0].tmpref.size = id_size;
2060 op.params[1].value.a = storage_id;
2061
2062 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
2063 TEEC_VALUE_INPUT,
2064 TEEC_NONE, TEEC_NONE);
2065 break;
2066 case TA_STORAGE_CMD_RENAME_ID_IN_SHM:
2067 op.params[0].value.a = *obj;
2068 op.params[1].tmpref.buffer = id;
2069 op.params[1].tmpref.size = id_size;
2070
2071 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
2072 TEEC_MEMREF_TEMP_INPUT,
2073 TEEC_NONE, TEEC_NONE);
2074 break;
2075 default:
2076 return TEE_ERROR_GENERIC;
2077 }
2078
2079 res = TEEC_InvokeCommand(sess, command, &op, &org);
2080
2081 switch (command) {
2082 case TA_STORAGE_CMD_OPEN_ID_IN_SHM:
2083 case TA_STORAGE_CMD_CREATE_ID_IN_SHM:
2084 if (res == TEEC_SUCCESS)
2085 *obj = op.params[1].value.b;
2086 break;
2087 default:
2088 break;
2089 }
2090
2091 return res;
2092}
2093
2094static void xtest_tee_test_6020_single(ADBG_Case_t *c, uint32_t storage_id)
2095{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002096 TEEC_Result res = TEEC_ERROR_GENERIC;
2097 TEEC_Session sess = { };
2098 uint32_t orig = 0;
Etienne Carrieref6f68a22019-01-22 13:27:46 +01002099 uint32_t obj = 0;
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002100
2101 /*
2102 * Invalid open request from the TA (object ID reference in SHM)
2103 */
2104 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
2105 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2106 return;
2107
2108 res = fs_create(&sess, file_01, sizeof(file_01),
2109 TEE_DATA_FLAG_ACCESS_WRITE |
2110 TEE_DATA_FLAG_ACCESS_WRITE_META |
2111 TEE_DATA_FLAG_OVERWRITE,
2112 0,
2113 data_00, sizeof(data_00),
2114 &obj,
2115 storage_id);
2116
2117 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2118 goto exit1;
2119 if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
2120 goto exit1;
2121
2122 res = fs_access_with_bad_object_id_ref(&sess,
2123 TA_STORAGE_CMD_OPEN_ID_IN_SHM,
2124 file_01, sizeof(file_01),
2125 TEE_DATA_FLAG_ACCESS_WRITE |
Jens Wiklanderbc7d12c2020-08-26 13:40:59 +02002126 TEE_DATA_FLAG_ACCESS_WRITE_META,
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002127 0,
2128 NULL, 0,
2129 &obj,
2130 storage_id);
2131
2132 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
2133
2134 /*
2135 * Invalid create-overwrite request from the TA (object ID reference in SHM)
2136 */
2137 TEEC_CloseSession(&sess);
2138 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
2139 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2140 return;
2141
2142 res = fs_access_with_bad_object_id_ref(&sess,
2143 TA_STORAGE_CMD_CREATEOVER_ID_IN_SHM,
2144 file_01, sizeof(file_01),
2145 0,
2146 0,
2147 NULL, 0,
2148 NULL,
2149 storage_id);
2150
2151 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
2152
2153 /*
2154 * Invalid rename request from the TA (object ID reference in SHM)
2155 */
2156 TEEC_CloseSession(&sess);
2157 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
2158 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2159 return;
2160
2161 res = fs_open(&sess, file_01, sizeof(file_01),
2162 TEE_DATA_FLAG_ACCESS_WRITE |
Jens Wiklanderbc7d12c2020-08-26 13:40:59 +02002163 TEE_DATA_FLAG_ACCESS_WRITE_META,
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002164 &obj,
2165 storage_id);
2166
2167 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2168 goto exit1;
2169
2170 res = fs_access_with_bad_object_id_ref(&sess,
2171 TA_STORAGE_CMD_RENAME_ID_IN_SHM,
2172 file_01, sizeof(file_01) - 1,
2173 0,
2174 0,
2175 NULL, 0,
2176 &obj,
2177 0);
2178
2179 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
2180
2181 /*
2182 * Invalid creation request from the TA (object ID reference in SHM)
2183 */
2184 TEEC_CloseSession(&sess);
2185 res = xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig);
2186 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2187 return;
2188
2189 res = fs_open(&sess, file_01, sizeof(file_01),
2190 TEE_DATA_FLAG_ACCESS_WRITE |
Jens Wiklanderbc7d12c2020-08-26 13:40:59 +02002191 TEE_DATA_FLAG_ACCESS_WRITE_META,
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002192 &obj,
2193 storage_id);
2194
2195 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2196 goto exit1;
2197
2198 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
2199
2200 res = fs_access_with_bad_object_id_ref(&sess,
2201 TA_STORAGE_CMD_CREATE_ID_IN_SHM,
2202 file_01, sizeof(file_01),
2203 TEE_DATA_FLAG_ACCESS_WRITE |
2204 TEE_DATA_FLAG_ACCESS_WRITE_META |
2205 TEE_DATA_FLAG_OVERWRITE,
2206 0,
2207 data_00, sizeof(data_00),
2208 &obj,
2209 storage_id);
2210
2211 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_TARGET_DEAD, res);
Oliver Chiang50d932f2019-05-31 13:29:50 +00002212 TEEC_CloseSession(&sess);
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002213 return;
2214exit1:
2215 ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj));
2216 TEEC_CloseSession(&sess);
2217}
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002218DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6020)
Etienne Carriere294ffbd2018-04-26 14:20:35 +02002219ADBG_CASE_DEFINE(regression, 6020, xtest_tee_test_6020,
2220 "Object IDs in SHM (negative)");