• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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