1 /*
2 * Copyright (C) 2022 Huawei Technologies Co., Ltd.
3 * Licensed under the Mulan PSL v2.
4 * You can use this software according to the terms and conditions of the Mulan PSL v2.
5 * You may obtain a copy of Mulan PSL v2 at:
6 * http://license.coscl.org.cn/MulanPSL2
7 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
8 * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
9 * PURPOSE.
10 * See the Mulan PSL v2 for more details.
11 */
12
13 #include <common_test.h>
14 #include <gtest/gtest.h>
15 #include <securec.h>
16 #include <tee_client_api.h>
17 #include <tee_client_type.h>
18 #include <test_defines.h>
19 #include <test_log.h>
20 #include <test_tcf_cmdid.h>
21
22 using namespace testing::ext;
23
24 struct unIntMapping {
25 char *name;
26 uint32_t cmd;
27 ALL_PROP_SETS propSet;
28 char *expectResult;
29 uint32_t expectLen;
30 };
31
32 struct intMapping {
33 char *name;
34 uint32_t cmd;
35 ALL_PROP_SETS propSet;
36 uint64_t expectResult;
37 };
38
39 struct unIntMapping g_unIntMap[] = {
40 // bool
41 { (char*)GPD_TA_INSTANCEKEEPALIVE, CMD_TEE_GetPropertyAsBool, TEE_PROPSET_CURRENT_TA,
42 (char*)VALUE_PREDEFINED_FALSE, sizeof(VALUE_PREDEFINED_FALSE) },
43 { (char*)GPD_TA_MULTISESSION, CMD_TEE_GetPropertyAsBool, TEE_PROPSET_CURRENT_TA,
44 (char*)VALUE_PREDEFINED_BOOLEAN, sizeof(VALUE_PREDEFINED_BOOLEAN) },
45 { (char*)GPD_TA_SINGLEINSTANCE, CMD_TEE_GetPropertyAsBool, TEE_PROPSET_CURRENT_TA,
46 (char*)VALUE_PREDEFINED_BOOLEAN, sizeof(VALUE_PREDEFINED_BOOLEAN) },
47 { (char*)GPD_TEE_CRYPTOGRAPHY_ECC, CMD_TEE_GetPropertyAsBool, TEE_PROPSET_IMPLEMENTATION,
48 (char*)VALUE_PREDEFINED_FALSE, sizeof(VALUE_PREDEFINED_FALSE) },
49 { (char*)GPD_TEE_CRYPTOGRAPHY_NIST, CMD_TEE_GetPropertyAsBool, TEE_PROPSET_IMPLEMENTATION,
50 (char*)VALUE_PREDEFINED_FALSE, sizeof(VALUE_PREDEFINED_FALSE) },
51 { (char*)GPD_TEE_CRYPTOGRAPHY_BSI_R, CMD_TEE_GetPropertyAsBool, TEE_PROPSET_IMPLEMENTATION,
52 (char*)VALUE_PREDEFINED_FALSE, sizeof(VALUE_PREDEFINED_FALSE) },
53 { (char*)GPD_TEE_CRYPTOGRAPHY_BSI_T, CMD_TEE_GetPropertyAsBool, TEE_PROPSET_IMPLEMENTATION,
54 (char*)VALUE_PREDEFINED_FALSE, sizeof(VALUE_PREDEFINED_FALSE) },
55 { (char*)GPD_TEE_CRYPTOGRAPHY_IETF, CMD_TEE_GetPropertyAsBool, TEE_PROPSET_IMPLEMENTATION,
56 (char*)VALUE_PREDEFINED_FALSE, sizeof(VALUE_PREDEFINED_FALSE) },
57 { (char*)GPD_TEE_CRYPTOGRAPHY_OCTA, CMD_TEE_GetPropertyAsBool, TEE_PROPSET_IMPLEMENTATION,
58 (char*)VALUE_PREDEFINED_FALSE, sizeof(VALUE_PREDEFINED_FALSE) },
59
60 // binaryblock
61 { (char*)SMC_TA_TESTBINARYBLOCK, CMD_TEE_GetPropertyAsBinaryBlock, TEE_PROPSET_CURRENT_TA,
62 (char*)VALUE_PREDEFINED_BINARY_BLOCK, sizeof(VALUE_PREDEFINED_BINARY_BLOCK) },
63
64 // uuid
65 { (char*)GPD_TA_APPID, CMD_TEE_GetPropertyAsUUID, TEE_PROPSET_CURRENT_TA, NULL, 0 },
66 // do not test GPD_TEE_DEVICEID
67 { (char*)GPD_TEE_DEVICEID, CMD_TEE_GetPropertyAsUUID, TEE_PROPSET_IMPLEMENTATION, NULL, 0 },
68
69 // string
70 // this only test get uuid as string
71 { (char*)GPD_TA_APPID, CMD_TEE_GetPropertyAsString,
72 TEE_PROPSET_CURRENT_TA, (char*)VALUE_PREDEFINED_UUID, BIG_SIZE },
73 { (char*)GPD_CLIENT_IDENTITY, CMD_TEE_GetPropertyAsString,
74 TEE_PROPSET_CURRENT_CLIENT, (char*)VALUE_PREDEFINED_CLIENT_IDENTITY, BIG_SIZE },
75 { (char*)GPD_TA_VERSION, CMD_TEE_GetPropertyAsString,
76 TEE_PROPSET_CURRENT_TA, (char*)VALUE_PREDEFINED_TA_VERSION, BIG_SIZE },
77 { (char*)GPD_TA_DESCRIPTION, CMD_TEE_GetPropertyAsString,
78 TEE_PROPSET_CURRENT_TA, (char*)VALUE_PREDEFINED_TA_DESCRIPTION, BIG_SIZE },
79 { (char*)GPD_TEE_APIVERSION, CMD_TEE_GetPropertyAsString,
80 TEE_PROPSET_IMPLEMENTATION, (char*)TEE_API_VERSION, BIG_SIZE },
81 { (char*)GPD_TEE_DESCRIPTION, CMD_TEE_GetPropertyAsString,
82 TEE_PROPSET_IMPLEMENTATION, (char*)TEE_BUILD_VER, BIG_SIZE },
83 { (char*)GPD_TEE_TRUSTEDOS_IMP_VERSION, CMD_TEE_GetPropertyAsString,
84 TEE_PROPSET_IMPLEMENTATION, (char*)TEE_IMP_VERSION, BIG_SIZE },
85 { (char*)GPD_TEE_TRUSTEDOS_IMP_BINARYVERSION, CMD_TEE_GetPropertyAsString,
86 TEE_PROPSET_IMPLEMENTATION, (char*)TEE_IMP_VERSION, BIG_SIZE },
87 { (char*)GPD_TEE_FIRMWARE_IMP_VERSION, CMD_TEE_GetPropertyAsString,
88 TEE_PROPSET_IMPLEMENTATION, (char*)TEE_FIRMWARE_IMP_VERSION, BIG_SIZE },
89 { (char*)GPD_TEE_FIRMWARE_IMP_BINARYVERSION, CMD_TEE_GetPropertyAsString,
90 TEE_PROPSET_IMPLEMENTATION, (char*)TEE_FIRMWARE_IMP_VERSION, BIG_SIZE },
91 { (char*)GPD_TEE_TRUSTEDOS_MANUFACTURER, CMD_TEE_GetPropertyAsString,
92 TEE_PROPSET_IMPLEMENTATION, (char*)TEE_MANUFACTURER, BIG_SIZE },
93 { (char*)GPD_TEE_FIRMWARE_MANUFACTURER, CMD_TEE_GetPropertyAsString,
94 TEE_PROPSET_IMPLEMENTATION, (char*)TEE_FIRMWARE_MANUFACTURER, BIG_SIZE },
95 { (char*)GPD_TEE_DEVICEID, CMD_TEE_GetPropertyAsString,
96 TEE_PROPSET_IMPLEMENTATION, (char*)TEE_FIRMWARE_MANUFACTURER, BIG_SIZE },
97 };
98
99 struct intMapping g_intMap[] = {
100 // int32
101 { (char*)GPD_TA_DATASIZE, CMD_TEE_GetPropertyAsU32,
102 TEE_PROPSET_CURRENT_TA, VALUE_PREDEFINED_DATASIZE },
103 { (char*)GPD_TA_STACKSIZE, CMD_TEE_GetPropertyAsU32,
104 TEE_PROPSET_CURRENT_TA, VALUE_PREDEFINED_STACKSIZE },
105 { (char*)GPD_TA_ENDIAN, CMD_TEE_GetPropertyAsU32,
106 TEE_PROPSET_CURRENT_TA, 0 },
107 { (char*)GPD_TA_API_LEVEL, CMD_TEE_GetPropertyAsU32,
108 TEE_PROPSET_CURRENT_TA, API_LEVEL1_2 },
109 { (char*)GPD_CLIENT_ENDIAN, CMD_TEE_GetPropertyAsU32,
110 TEE_PROPSET_CURRENT_CLIENT, VALUE_PREDEFINED_CLIENT_ENDIAN },
111 { (char*)GPD_TEE_INTERNALCORE_VERSION, CMD_TEE_GetPropertyAsU32,
112 TEE_PROPSET_IMPLEMENTATION, TEE_INTERNAL_CORE_VERSION },
113 { (char*)GPD_TEE_SYSTEM_TIME_PROTECTIONLEVEL, CMD_TEE_GetPropertyAsU32,
114 TEE_PROPSET_IMPLEMENTATION, TEE_TIME_PROTECT_LEVEL },
115 { (char*)GPD_TEE_TA_PERSISTENT_TIME_PROTECTIONLEVEL, CMD_TEE_GetPropertyAsU32,
116 TEE_PROPSET_IMPLEMENTATION, TA_TIME_PROTECT_LEVEL },
117 { (char*)GPD_TEE_ARITH_MAXBIGINTSIZE, CMD_TEE_GetPropertyAsU32,
118 TEE_PROPSET_IMPLEMENTATION, MAX_BIG_INT_SIZE },
119 { (char*)GPD_TEE_ANTIROLLBACK_PROTECTIONLEVEL, CMD_TEE_GetPropertyAsU32,
120 TEE_PROPSET_IMPLEMENTATION, 0 },
121 { (char*)GPD_TEE_ROLLBACKDETECT_PROTECTIONLEVEL, CMD_TEE_GetPropertyAsU32,
122 TEE_PROPSET_IMPLEMENTATION, 0 },
123 { (char*)GPD_TEE_EVENT_MAXSOURCES, CMD_TEE_GetPropertyAsU32,
124 TEE_PROPSET_IMPLEMENTATION, 0 },
125 { (char*)GPD_TEE_API_LEVEL, CMD_TEE_GetPropertyAsU32,
126 TEE_PROPSET_IMPLEMENTATION, TEE_MAX_API_LEVEL_CONFIG },
127 // int64
128 { (char*)SMC_TA_TESTU64, CMD_TEE_GetPropertyAsU64,
129 TEE_PROPSET_CURRENT_TA, VALUE_PREDEFINED_U64 },
130 };
131
GetPropertyFromUnIntMap(TEEC_Context * context,TEEC_Session * session,TestData * val,int * flag)132 TEEC_Result GetPropertyFromUnIntMap(TEEC_Context *context, TEEC_Session *session, TestData *val, int *flag)
133 {
134 TEEC_Result result;
135 int i;
136
137 for (i = 0; i < (sizeof(g_unIntMap) / sizeof(g_unIntMap[0])); i++) {
138 if (strncmp(val->inBuffer, g_unIntMap[i].name, val->inBufferLen) == 0) {
139 *flag = 1;
140 val->cmd = g_unIntMap[i].cmd;
141 result = Invoke_GetPropertyAsX(context, session, val);
142 if (result != TEEC_SUCCESS || val->origin != TEEC_ORIGIN_TRUSTED_APP) {
143 TEST_PRINT_ERROR("getProperty from Enumerator with %s is fail! result = 0x%x\n", val->inBuffer, result);
144 return result;
145 }
146 if (val->cmd != CMD_TEE_GetPropertyAsUUID) {
147 if (val->outBufferLen != g_unIntMap[i].expectLen ||
148 (strncmp(val->outBuffer, g_unIntMap[i].expectResult, g_unIntMap[i].expectLen) != 0)) {
149 TEST_PRINT_ERROR("getProperty from Enumerator with %s is fail! outlen=0x%x, expect outlen=0x%x\n",
150 val->inBuffer, val->outBufferLen, g_unIntMap[i].expectLen);
151 TEST_PRINT_ERROR("outbuffer=%s, expect outbuffer=%s\n", val->outBuffer, g_unIntMap[i].expectResult);
152 return TEEC_ERROR_GENERIC;
153 }
154 }
155 return result;
156 }
157 }
158 return TEEC_SUCCESS;
159 }
160
GetPropertyFromIntMap(TEEC_Context * context,TEEC_Session * session,TestData * val,int * flag)161 TEEC_Result GetPropertyFromIntMap(TEEC_Context *context, TEEC_Session *session, TestData *val, int *flag)
162 {
163 TEEC_Result result;
164 int i;
165
166 for (i = 0; i < (sizeof(g_intMap) / sizeof(g_intMap[0])); i++) {
167 if (strncmp(val->inBuffer, g_intMap[i].name, val->inBufferLen) == 0) {
168 *flag = 1;
169 val->cmd = g_intMap[i].cmd;
170 result = Invoke_GetPropertyAsX(context, session, val);
171 if (result != TEEC_SUCCESS || val->origin != TEEC_ORIGIN_TRUSTED_APP) {
172 TEST_PRINT_ERROR("getProperty from Enumerator with %s is fail! result = 0x%x\n", val->inBuffer, result);
173 return result;
174 }
175 if (val->cmd == CMD_TEE_GetPropertyAsU32) {
176 if (atoi(val->outBuffer) != (uint32_t)g_intMap[i].expectResult) {
177 TEST_PRINT_ERROR("getProperty from Enumerator with %s is fail! out=0x%x, expect out=0x%x\n",
178 val->inBuffer, atoi(val->outBuffer), (uint32_t)g_intMap[i].expectResult);
179 return TEEC_ERROR_GENERIC;
180 }
181 } else {
182 if (atoll(val->outBuffer) != g_intMap[i].expectResult) {
183 TEST_PRINT_ERROR("getProperty from Enumerator with %s is fail! out=0x%llx, expect out=0x%llu\n",
184 val->inBuffer, atoll(val->outBuffer), g_intMap[i].expectResult);
185 return TEEC_ERROR_GENERIC;
186 }
187 }
188 return result;
189 }
190 }
191 return TEEC_SUCCESS;
192 }
193
194 /**
195 * @testcase.name : TEE_GetProperty_WithEnum_TEE_PROPSET_CURRENT_TA
196 * @testcase.desc : test TA call TEE_AllocatePropertyEnumerator, TEE_StartPropertyEnumerator, TEE_GetPropertyName,
197 * TEE_GetNextProperty and TEE_GetPropertyAsX API to get all kinds of property from Enumerator for
198 * TEE_PROPSET_CURRENT_TA
199 * @testcase.expect : process success
200 */
201 TEE_TEST(TeeTCF1EnumTest, TEE_GetProperty_WithEnum_TEE_PROPSET_CURRENT_TA, Function | MediumTest | Level0)
202 {
203 TEEC_Result result, ret;
204 int rc, count = 0, findFlag = 0;
205
206 // start PropertyEnumerator this api has no return value
207 value.cmd = CMD_TEE_StartPropertyEnumerator;
208 value.propSet = TEE_PROPSET_CURRENT_TA;
209 Invoke_Operate_PropertyEnumerator(GetSession(), &value);
210
211 do {
212 value.cmd = CMD_TEE_GetPropertyNameEnumerator;
213 value.outBufferLen = BIG_SIZE;
214 result = Invoke_Operate_PropertyEnumerator(GetSession(), &value);
215 if ((count != 0) && (result == TEEC_ERROR_ITEM_NOT_FOUND))
216 break;
217 ASSERT_EQ(result, TEEC_SUCCESS);
218 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
219 rc = memcpy_s(value.inBuffer, BIG_SIZE, value.outBuffer, value.outBufferLen);
220 value.inBufferLen = value.outBufferLen;
221 ASSERT_EQ(rc, 0);
222 count++;
223
224 ret = GetPropertyFromUnIntMap(GetContext(), GetSession(), &value, &findFlag);
225 ASSERT_EQ(ret, TEEC_SUCCESS);
226
227 if (findFlag != 1) {
228 ret = GetPropertyFromIntMap(GetContext(), GetSession(), &value, &findFlag);
229 ASSERT_EQ(ret, TEEC_SUCCESS);
230 }
231
232 if (findFlag == 0) {
233 TEST_PRINT_ERROR("get PropertyName from Enumerator is undefined! count=%d\n", count);
234 ASSERT_FALSE(1);
235 }
236
237 value.cmd = CMD_TEE_GetNextPropertyEnumerator;
238 Invoke_Operate_PropertyEnumerator(GetSession(), &value);
239 findFlag = 0;
240 } while (result != TEEC_ERROR_ITEM_NOT_FOUND);
241 }
242
243 /**
244 * @testcase.name : TEE_GetProperty_WithEnum_TEE_PROPSET_CURRENT_CLIENT
245 * @testcase.desc : test TA call TEE_AllocatePropertyEnumerator, TEE_StartPropertyEnumerator, TEE_GetPropertyName,
246 * TEE_GetNextProperty and TEE_GetPropertyAsX API to get all kinds of property from Enumerator for
247 * TEE_PROPSET_CURRENT_CLIENT
248 * @testcase.expect : process success
249 */
250 TEE_TEST(TeeTCF1EnumTest, TEE_GetProperty_WithEnum_TEE_PROPSET_CURRENT_CLIENT, Function | MediumTest | Level0)
251 {
252 TEEC_Result result, ret;
253 int rc, count = 0, findFlag = 0;
254
255 // start PropertyEnumerator this api has no return value
256 value.cmd = CMD_TEE_StartPropertyEnumerator;
257 value.propSet = TEE_PROPSET_CURRENT_CLIENT;
258 Invoke_Operate_PropertyEnumerator(GetSession(), &value);
259
260 do {
261 value.cmd = CMD_TEE_GetPropertyNameEnumerator;
262 value.outBufferLen = BIG_SIZE;
263 result = Invoke_Operate_PropertyEnumerator(GetSession(), &value);
264 if ((count != 0) && (result == TEEC_ERROR_ITEM_NOT_FOUND))
265 break;
266 ASSERT_EQ(result, TEEC_SUCCESS);
267 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
268 rc = memcpy_s(value.inBuffer, BIG_SIZE, value.outBuffer, value.outBufferLen);
269 value.inBufferLen = value.outBufferLen;
270 ASSERT_EQ(rc, 0);
271 count++;
272
273 ret = GetPropertyFromUnIntMap(GetContext(), GetSession(), &value, &findFlag);
274 ASSERT_EQ(ret, TEEC_SUCCESS);
275
276 if (findFlag != 1) {
277 ret = GetPropertyFromIntMap(GetContext(), GetSession(), &value, &findFlag);
278 ASSERT_EQ(ret, TEEC_SUCCESS);
279 }
280
281 if (findFlag == 0) {
282 TEST_PRINT_ERROR("get PropertyName from Enumerator is undefined!\n");
283 ASSERT_FALSE(1);
284 }
285
286 value.cmd = CMD_TEE_GetNextPropertyEnumerator;
287 Invoke_Operate_PropertyEnumerator(GetSession(), &value);
288 findFlag = 0;
289 } while (result != TEEC_ERROR_ITEM_NOT_FOUND);
290 }
291
292 /**
293 * @testcase.name : TEE_GetProperty_WithEnum_TEE_PROPSET_IMPLEMENTATION
294 * @testcase.desc : test TA call TEE_AllocatePropertyEnumerator, TEE_StartPropertyEnumerator, TEE_GetPropertyName,
295 * TEE_GetNextProperty and TEE_GetPropertyAsX API to get all kinds of property from Enumerator for
296 * TEE_PROPSET_IMPLEMENTATION
297 * @testcase.expect : process success
298 */
299 TEE_TEST(TeeTCF1EnumTest, TEE_GetProperty_WithEnum_TEE_PROPSET_IMPLEMENTATION, Function | MediumTest | Level0)
300 {
301 TEEC_Result result, ret;
302 int rc, count = 0, findFlag = 0;
303
304 // start PropertyEnumerator this api has no return value
305 value.cmd = CMD_TEE_StartPropertyEnumerator;
306 value.propSet = TEE_PROPSET_IMPLEMENTATION;
307 Invoke_Operate_PropertyEnumerator(GetSession(), &value);
308
309 do {
310 value.cmd = CMD_TEE_GetPropertyNameEnumerator;
311 value.outBufferLen = BIG_SIZE;
312 result = Invoke_Operate_PropertyEnumerator(GetSession(), &value);
313 if ((count != 0) && (result == TEEC_ERROR_ITEM_NOT_FOUND))
314 break;
315 ASSERT_EQ(result, TEEC_SUCCESS);
316 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
317 rc = memcpy_s(value.inBuffer, BIG_SIZE, value.outBuffer, value.outBufferLen);
318 value.inBufferLen = value.outBufferLen;
319 ASSERT_EQ(rc, 0);
320 count++;
321
322 ret = GetPropertyFromUnIntMap(GetContext(), GetSession(), &value, &findFlag);
323 ASSERT_EQ(ret, TEEC_SUCCESS);
324
325 if (findFlag != 1) {
326 ret = GetPropertyFromIntMap(GetContext(), GetSession(), &value, &findFlag);
327 ASSERT_EQ(ret, TEEC_SUCCESS);
328 }
329
330 if (findFlag == 0) {
331 TEST_PRINT_ERROR("get PropertyName from Enumerator is undefined!\n");
332 ASSERT_FALSE(1);
333 }
334
335 value.cmd = CMD_TEE_GetNextPropertyEnumerator;
336 Invoke_Operate_PropertyEnumerator(GetSession(), &value);
337 findFlag = 0;
338 } while (result != TEEC_ERROR_ITEM_NOT_FOUND);
339 }
340
341 /**
342 * @testcase.name : TEE_GetProperty_WithEnum_WithResetEnum
343 * @testcase.desc : test TA call TEE_AllocatePropertyEnumerator , TEE_StartPropertyEnumerator,
344 * TEE_ResetPropertyEnumerator, TEE_GetPropertyName, TEE_GetNextProperty and TEE_GetPropertyAsX
345 * API to get all kinds of property from Enumerator for TEE_PROPSET_CURRENT_CLIENT
346 * @testcase.expect : process success
347 */
348 TEE_TEST(TeeTCF1EnumTest, TEE_GetProperty_WithEnum_WithResetEnum, Function | MediumTest | Level0)
349 {
350 TEEC_Result result, ret;
351 int rc, count = 0, findFlag = 0;
352
353 // start PropertyEnumerator this api has no return value
354 value.cmd = CMD_TEE_StartPropertyEnumerator;
355 value.propSet = TEE_PROPSET_CURRENT_CLIENT;
356 Invoke_Operate_PropertyEnumerator(GetSession(), &value);
357
358 do {
359 value.cmd = CMD_TEE_GetPropertyNameEnumerator;
360 value.outBufferLen = BIG_SIZE;
361 result = Invoke_Operate_PropertyEnumerator(GetSession(), &value);
362 if ((count != 0) && (result == TEEC_ERROR_ITEM_NOT_FOUND))
363 break;
364 ASSERT_EQ(result, TEEC_SUCCESS);
365 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
366 rc = memcpy_s(value.inBuffer, BIG_SIZE, value.outBuffer, value.outBufferLen);
367 value.inBufferLen = value.outBufferLen;
368 ASSERT_EQ(rc, 0);
369 count++;
370
371 ret = GetPropertyFromUnIntMap(GetContext(), GetSession(), &value, &findFlag);
372 ASSERT_EQ(ret, TEEC_SUCCESS);
373
374 if (findFlag != 1) {
375 ret = GetPropertyFromIntMap(GetContext(), GetSession(), &value, &findFlag);
376 ASSERT_EQ(ret, TEEC_SUCCESS);
377 }
378
379 if (findFlag == 0) {
380 TEST_PRINT_ERROR("get PropertyName from Enumerator is undefined!\n");
381 ASSERT_FALSE(1);
382 }
383
384 value.cmd = CMD_TEE_GetNextPropertyEnumerator;
385 Invoke_Operate_PropertyEnumerator(GetSession(), &value);
386 findFlag = 0;
387 } while (result != TEEC_ERROR_ITEM_NOT_FOUND);
388
389 // reset PropertyEnumerator this api has no return value
390 value.cmd = CMD_TEE_ResetPropertyEnumerator;
391 value.propSet = TEE_PROPSET_IMPLEMENTATION;
392 Invoke_Operate_PropertyEnumerator(GetSession(), &value);
393
394 // get PropertyEnumerator after reset
395 value.cmd = CMD_TEE_GetPropertyNameEnumerator;
396 value.outBufferLen = BIG_SIZE;
397 result = Invoke_Operate_PropertyEnumerator(GetSession(), &value);
398 ASSERT_EQ(result, TEEC_ERROR_ITEM_NOT_FOUND);
399 }
400
401 /**
402 * @testcase.name : TEE_AllocatePropertyEnumerator_EnumIsNull
403 * @testcase.desc : test TA call TEE_AllocatePropertyEnumerator while Enumerator is NULL
404 * property from TEE_PROPSET_CURRENT_TA
405 * @testcase.expect : return TEEC_ERROR_BAD_PARAMETERS
406 */
407 TEE_TEST(TeeTCF1Test, TEE_AllocatePropertyEnumerator_EnumIsNull, Function | MediumTest | Level0)
408 {
409 TEEC_Result ret;
410 TestData value = { 0 };
411 value.cmd = CMD_TEE_AllocatePropertyEnumerator;
412 value.caseId = OUTPUT_ISNULL;
413 ret = Invoke_AllocatePropertyEnumerator(GetSession(), &value);
414 ASSERT_EQ(ret, TEEC_ERROR_BAD_PARAMETERS);
415 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
416 }
417
418 /**
419 * @testcase.name : TEE_AllocatePropertyEnumerator_MaxEnum
420 * @testcase.desc : test TA call TEE_AllocatePropertyEnumerator alloc PropertyEnumerator reach max numbers limit
421 * property from TEE_PROPSET_CURRENT_TA
422 * @testcase.expect : return TEEC_SUCCESS
423 */
424 TEE_TEST(TeeTCF1Test, TEE_AllocatePropertyEnumerator_MaxEnum, Function | MediumTest | Level0)
425 {
426 TEEC_Result ret;
427 TestData value = { 0 };
428 value.cmd = CMD_TEE_AllocatePropertyEnumerator;
429
430 for (int i = 1; i <= MAX_ENUMERATOR; i++) {
431 ret = Invoke_AllocatePropertyEnumerator(GetSession(), &value);
432 ASSERT_EQ(ret, TEEC_SUCCESS);
433 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
434 }
435
436 // then alloc 1024th Enumerator,should fail
437 ret = Invoke_AllocatePropertyEnumerator(GetSession(), &value);
438 ASSERT_EQ(ret, TEEC_ERROR_OUT_OF_MEMORY);
439 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
440 ASSERT_EQ(value.enumerator, 0);
441
442 // intend to free enumerator which NO is MAX_ENUMERATOR
443 value.enumerator = MAX_ENUMERATOR;
444 value.cmd = CMD_TEE_FreePropertyEnumerator;
445 Invoke_Operate_PropertyEnumerator(GetSession(), &value);
446
447 value.cmd = CMD_TEE_AllocatePropertyEnumerator;
448 ret = Invoke_AllocatePropertyEnumerator(GetSession(), &value);
449 ASSERT_EQ(ret, TEEC_SUCCESS);
450 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
451 ASSERT_EQ(value.enumerator, MAX_ENUMERATOR);
452 }
453
454 /**
455 * @testcase.name : TEE_GetPropertyName_BufferIsNull
456 * @testcase.desc : test TA call TEE_GetPropertyName while output buffer is null
457 * @testcase.expect : return TEEC_ERROR_BAD_PARAMETERS
458 */
459 TEE_TEST(TeeTCF1EnumTest, TEE_GetPropertyName_BufferIsNull, Function | MediumTest | Level0)
460 {
461 TEEC_Result ret;
462
463 // get Property from Enumerator
464 value.cmd = CMD_TEE_GetPropertyNameEnumerator;
465 value.caseId = OUTPUT_ISNULL;
466 value.outBufferLen = BIG_SIZE;
467 ret = Invoke_Operate_PropertyEnumerator(GetSession(), &value);
468 ASSERT_EQ(ret, TEEC_ERROR_BAD_PARAMETERS);
469 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
470 }
471
472 /**
473 * @testcase.name : TEE_GetPropertyName_BufferSizeIsNull
474 * @testcase.desc : test TA call TEE_GetPropertyName while output buffer size is null
475 * @testcase.expect : return TEEC_ERROR_BAD_PARAMETERS
476 */
477 TEE_TEST(TeeTCF1EnumTest, TEE_GetPropertyName_BufferSizeIsNull, Function | MediumTest | Level0)
478 {
479 TEEC_Result ret;
480
481 // get Property from Enumerator
482 value.cmd = CMD_TEE_GetPropertyNameEnumerator;
483 value.caseId = OUTPUTBUFFERSIZE_ISNULL;
484 value.outBufferLen = BIG_SIZE;
485 ret = Invoke_Operate_PropertyEnumerator(GetSession(), &value);
486 ASSERT_EQ(ret, TEEC_ERROR_BAD_PARAMETERS);
487 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
488 }
489
490 /**
491 * @testcase.name : TEE_GetPropertyName_BufferSizeTooShort
492 * @testcase.desc : test TA call TEE_GetPropertyName while output buffer size too short
493 * @testcase.expect : return TEEC_ERROR_SHORT_BUFFER
494 */
495 TEE_TEST(TeeTCF1EnumTest, TEE_GetPropertyName_BufferSizeTooShort, Function | MediumTest | Level0)
496 {
497 TEEC_Result ret;
498
499 // start PropertyEnumerator this api has no return value
500 value.cmd = CMD_TEE_StartPropertyEnumerator;
501 value.propSet = TEE_PROPSET_CURRENT_TA;
502 Invoke_Operate_PropertyEnumerator(GetSession(), &value);
503
504 // get Property from Enumerator
505 value.cmd = CMD_TEE_GetPropertyNameEnumerator;
506 value.caseId = OUTPUTBUFFERSIZE_TOOSHORT;
507 value.outBufferLen = BIG_SIZE;
508 ret = Invoke_Operate_PropertyEnumerator(GetSession(), &value);
509 ASSERT_EQ(ret, TEEC_ERROR_SHORT_BUFFER);
510 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
511 }
512
513 /**
514 * @testcase.name : TEE_GetPropertyName_EnumeratorNotAlloc
515 * @testcase.desc : test TA call TEE_GetPropertyName while Enumerator is not alloc
516 * @testcase.expect : return TEEC_ERROR_ITEM_NOT_FOUND
517 */
518 TEE_TEST(TeeTCF1Test, TEE_GetPropertyName_EnumeratorNotAlloc, Function | MediumTest | Level0)
519 {
520 TEEC_Result ret;
521 TestData value = { 0 };
522
523 // get Property from Enumerator
524 value.cmd = CMD_TEE_GetPropertyNameEnumerator;
525 value.enumerator = ENUMERATOR1;
526 value.outBufferLen = BIG_SIZE;
527 ret = Invoke_Operate_PropertyEnumerator(GetSession(), &value);
528 EXPECT_EQ(ret, TEEC_ERROR_ITEM_NOT_FOUND);
529 EXPECT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
530 }
531
532 /**
533 * @testcase.name : TEE_GetPropertyName_EnumeratorNotStart
534 * @testcase.desc : test TA call TEE_GetPropertyName while Enumerator is not start
535 * @testcase.expect : return TEEC_ERROR_ITEM_NOT_FOUND
536 */
537 TEE_TEST(TeeTCF1Test, TEE_GetPropertyName_EnumeratorNotStart, Function | MediumTest | Level0)
538 {
539 TEEC_Result ret;
540 TestData value = { 0 };
541
542 // alloc PropertyEnumerator
543 value.cmd = CMD_TEE_AllocatePropertyEnumerator;
544 ret = Invoke_AllocatePropertyEnumerator(GetSession(), &value);
545 ASSERT_EQ(ret, TEEC_SUCCESS);
546 EXPECT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
547 EXPECT_EQ(value.enumerator, ENUMERATOR1);
548
549 // get Property from Enumerator
550 value.cmd = CMD_TEE_GetPropertyNameEnumerator;
551 value.outBufferLen = BIG_SIZE;
552 ret = Invoke_Operate_PropertyEnumerator(GetSession(), &value);
553 EXPECT_EQ(ret, TEEC_ERROR_ITEM_NOT_FOUND);
554 EXPECT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
555
556 value.cmd = CMD_TEE_FreePropertyEnumerator;
557 Invoke_Operate_PropertyEnumerator(GetSession(), &value);
558 }
559
560 /**
561 * @testcase.name : TEE_GetNextProperty_EnumeratorNotAlloc
562 * @testcase.desc : test TA call TEE_GetPropertyName while Enumerator is not alloc
563 * @testcase.expect : return TEEC_ERROR_ITEM_NOT_FOUND
564 */
565 TEE_TEST(TeeTCF1Test, TEE_GetNextProperty_EnumeratorNotAlloc, Function | MediumTest | Level0)
566 {
567 TEEC_Result ret;
568 TestData value = { 0 };
569
570 // get next Property from Enumerator
571 value.cmd = CMD_TEE_GetNextPropertyEnumerator;
572 value.enumerator = ENUMERATOR1;
573 value.outBufferLen = BIG_SIZE;
574 ret = Invoke_Operate_PropertyEnumerator(GetSession(), &value);
575 EXPECT_EQ(ret, TEEC_ERROR_ITEM_NOT_FOUND);
576 EXPECT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
577 }
578
579 /**
580 * @testcase.name : TEE_GetNextProperty_EnumeratorNotStart
581 * @testcase.desc : test TA call TEE_GetPropertyName while Enumerator is not start
582 * @testcase.expect : return TEEC_ERROR_ITEM_NOT_FOUND
583 */
584 TEE_TEST(TeeTCF1Test, TEE_GetNextProperty_EnumeratorNotStart, Function | MediumTest | Level0)
585 {
586 TEEC_Result ret;
587 TestData value = { 0 };
588
589 // alloc PropertyEnumerator
590 value.cmd = CMD_TEE_AllocatePropertyEnumerator;
591 ret = Invoke_AllocatePropertyEnumerator(GetSession(), &value);
592 ASSERT_EQ(ret, TEEC_SUCCESS);
593 EXPECT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
594 EXPECT_EQ(value.enumerator, ENUMERATOR1);
595
596 // get next Property from Enumerator
597 value.cmd = CMD_TEE_GetNextPropertyEnumerator;
598 value.outBufferLen = BIG_SIZE;
599 ret = Invoke_Operate_PropertyEnumerator(GetSession(), &value);
600 EXPECT_EQ(ret, TEEC_ERROR_ITEM_NOT_FOUND);
601 EXPECT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP);
602
603 value.cmd = CMD_TEE_FreePropertyEnumerator;
604 Invoke_Operate_PropertyEnumerator(GetSession(), &value);
605 }
606