• 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 #ifndef __TCF_COMMON_TEST_H__
14 #define __TCF_COMMON_TEST_H__
15 
16 #include <gtest/gtest.h>
17 #include <stdint.h>
18 #include <tee_client_type.h>
19 
20 #define TESTSIZE 16
21 #define BIG_SIZE 1024
22 #define MAX_SHARE_SIZE 0x100000
23 
24 #define ENUMERATOR1 1
25 #define MAX_ENUMERATOR 1023
26 
27 #define EXPECTBUFFER_ZERO ""
28 #define EXPECTBUFFER_A "AAAAAAAAAAAAAAAA"
29 #define EXPECTBUFFER_A_LESS "AAAAAAAAAAAAAAA"
30 #define EXPECTBUFFER_B "BBBBBBBBBBBBBBBB"
31 #define EXPECTBUFFER_OVERLAP "AAAAAAAAABBBBBBB"
32 
33 // ALL_PROPERTY_NAMES
34 #define GPD_CLIENT_IDENTITY "gpd.client.identity"
35 #define GPD_CLIENT_ENDIAN "gpd.client.endian"
36 #define GPD_TA_APPID "gpd.ta.appID"
37 #define GPD_TA_SERVICENAME "gpd.ta.service_name"
38 #define GPD_TA_DATASIZE "gpd.ta.dataSize"
39 #define GPD_TA_INSTANCEKEEPALIVE "gpd.ta.instanceKeepAlive"
40 #define GPD_TA_MULTISESSION "gpd.ta.multiSession"
41 #define GPD_TA_SINGLEINSTANCE "gpd.ta.singleInstance"
42 #define GPD_TA_STACKSIZE "gpd.ta.stackSize"
43 #define GPD_TA_VERSION "gpd.ta.version"
44 #define GPD_TA_DESCRIPTION "gpd.ta.description"
45 #define GPD_TA_ENDIAN "gpd.ta.endian"
46 #define GPD_TEE_ARITH_MAXBIGINTSIZE "gpd.tee.arith.maxBigIntSize"
47 #define GPD_TEE_SYSTEM_TIME_PROTECTIONLEVEL "gpd.tee.systemTime.protectionLevel"
48 #define GPD_TEE_TA_PERSISTENT_TIME_PROTECTIONLEVEL "gpd.tee.TAPersistentTime.protectionLevel"
49 #define GPD_TEE_APIVERSION "gpd.tee.apiversion"
50 #define GPD_TEE_INTERNALCORE_VERSION "gpd.tee.internalCore.version"
51 #define GPD_TEE_DESCRIPTION "gpd.tee.description"
52 #define GPD_TEE_DEVICEID "gpd.tee.deviceID"
53 #define GPD_TEE_CRYPTOGRAPHY_ECC "gpd.tee.cryptography.ecc"
54 #define GPD_TEE_CRYPTOGRAPHY_NIST "gpd.tee.cryptography.nist"
55 #define GPD_TEE_CRYPTOGRAPHY_BSI_R "gpd.tee.cryptography.bsi-r"
56 #define GPD_TEE_CRYPTOGRAPHY_BSI_T "gpd.tee.cryptography.bsi-t"
57 #define GPD_TEE_CRYPTOGRAPHY_IETF "gpd.tee.cryptography.ietf"
58 #define GPD_TEE_CRYPTOGRAPHY_OCTA "gpd.tee.cryptography.octa"
59 #define GPD_TEE_ANTIROLLBACK_PROTECTIONLEVEL "gpd.tee.trustedStorage.antiRollback.protectionLevel"
60 #define GPD_TEE_ROLLBACKDETECT_PROTECTIONLEVEL "gpd.tee.trustedStorage.rollbackDetection.protectionLevel"
61 #define GPD_TEE_TRUSTEDOS_IMP_VERSION "gpd.tee.trustedos.implementation.version"
62 #define GPD_TEE_TRUSTEDOS_IMP_BINARYVERSION "gpd.tee.trustedos.implementation.binaryversion"
63 #define GPD_TEE_TRUSTEDOS_MANUFACTURER "gpd.tee.trustedos.manufacturer"
64 #define GPD_TEE_FIRMWARE_IMP_VERSION "gpd.tee.firmware.implementation.version"
65 #define GPD_TEE_FIRMWARE_IMP_BINARYVERSION "gpd.tee.firmware.implementation.binaryversion"
66 #define GPD_TEE_FIRMWARE_MANUFACTURER "gpd.tee.firmware.manufacturer"
67 #define GPD_TEE_EVENT_MAXSOURCES "gpd.tee.event.maxSources"
68 #define GPD_TEE_API_LEVEL "gpd.tee.api_level"
69 #define GPD_TA_API_LEVEL "gpd.ta.api_level"
70 #define PROPERTY_NAME_UNKNOWN "unknown"
71 #define SMC_TA_TESTBINARYBLOCK "smc.ta.testbinaryblock"
72 #define SMC_TA_TESTIDENTITY "smc.ta.identity"
73 #define SMC_TA_TESTU64 "smc.ta.testu64"
74 
75 // ALL_PROPERTY_VALUES
76 #define VALUE_PREDEFINED_BINARY_BLOCK "VGhpcy"
77 #define VALUE_PREDEFINED_SERVICENAME "TCF_test"
78 #define VALUE_PREDEFINED_BOOLEAN "true"
79 #define VALUE_PREDEFINED_FALSE "false"
80 #define VALUE_PREDEFINED_DATASIZE 819200
81 #define VALUE_PREDEFINED_STACKSIZE 81920
82 #define VALUE_PREDEFINED_TA_VERSION "0"
83 #define VALUE_PREDEFINED_TA_DESCRIPTION "test ta"
84 #define VALUE_PREDEFINED_CLIENT_IDENTITY "identity:0:00000000-0000-0000-6100-000000000000"
85 #define VALUE_PREDEFINED_CLIENT_ENDIAN 0
86 #define VALUE_PREDEFINED_STRING "test string"
87 #define VALUE_PREDEFINED_U64 5147483647
88 #define VALUE_PREDEFINED_UUID "534d4152-542d-4353-4c54-d3016a171f01"
89 
90 #define TEE_INTERNAL_CORE_MAJOR_VERSION 1
91 #define TEE_INTERNAL_CORE_MINOR_VERSION 2
92 #define TEE_INTERNAL_CORE_MAINTENANCE_VERSION 0
93 #define TEE_INTERNAL_CORE_RESERVED_VERSION 0
94 // TEE_API_VERSION should match with TEE_INTERNAL_CORE_VERSION
95 #define TEE_API_VERSION "v1.2.0"
96 #define TEE_INTERNAL_CORE_VERSION                                                        \
97     ((TEE_INTERNAL_CORE_MAJOR_VERSION << 24) | (TEE_INTERNAL_CORE_MINOR_VERSION << 16) | \
98         (TEE_INTERNAL_CORE_MAINTENANCE_VERSION << 8) | TEE_INTERNAL_CORE_RESERVED_VERSION)
99 #define TEE_BUILD_VER "B309"
100 #define TEE_IMP_VERSION "TEE-1.0.0"
101 #define TEE_MANUFACTURER "TEE"
102 #define TEE_FIRMWARE_IMP_VERSION "TEE-1.0."
103 #define TEE_FIRMWARE_MANUFACTURER "TEE"
104 #define TEE_TIME_PROTECT_LEVEL 100
105 #define TA_TIME_PROTECT_LEVEL 100
106 #define MAX_BIG_INT_SIZE 32
107 #define API_LEVEL1_2 3
108 #define CIPHER_LAYER_VERSION 3
109 #define TEE_MAX_API_LEVEL_CONFIG ((CIPHER_LAYER_VERSION << 16) | API_LEVEL1_2)
110 
111 #define SESSION_FROM_UNKNOWN 0xff
112 
113 typedef enum {
114     TEE_PROPSET_CURRENT_CLIENT = 0xFFFFFFFE,
115     TEE_PROPSET_CURRENT_TA = 0xFFFFFFFF,
116     TEE_PROPSET_IMPLEMENTATION = 0xFFFFFFFD,
117     TEE_PROPSET_ZERO = 0x0,
118 } ALL_PROP_SETS;
119 
120 typedef struct {
121     uint32_t login;
122     TEEC_UUID uuid;
123 } TEEC_Identity;
124 
125 #define TCF_API_UUID_1                                     \
126     {                                                      \
127         0x534d4152, 0x542d, 0x4353,                        \
128         {                                                  \
129             0x4c, 0x54, 0xd3, 0x01, 0x6a, 0x17, 0x1f, 0x01 \
130         }                                                  \
131     }
132 
133 #define TCF_API_UUID_2                                     \
134     {                                                      \
135         0x534D4152, 0x542D, 0x4353,                        \
136         {                                                  \
137             0x4C, 0x54, 0xd3, 0x01, 0x6a, 0x17, 0x1f, 0x02 \
138         }                                                  \
139     }
140 
141 #define UUID_TA_NOT_EXIST                                  \
142     {                                                      \
143         0x534D4152, 0x542D, 0x4353,                        \
144         {                                                  \
145             0x4C, 0x54, 0x2D, 0x54, 0x41, 0x2D, 0x53, 0x5B \
146         }                                                  \
147     }
148 
149 struct TestData {
150     uint32_t cmd;
151     uint32_t caseId;
152     ALL_PROP_SETS propSet;
153     uint32_t enumerator;
154     uint32_t origin;
155     char inBuffer[BIG_SIZE];
156     uint32_t inBufferLen;
157     char outBuffer[BIG_SIZE];
158     uint32_t outBufferLen;
159     TEEC_UUID uuid;
160 };
161 typedef struct TestData TestData;
162 
163 struct TestMemData {
164     size_t oldSize;
165     size_t newSize;
166     uint32_t oldAddr;
167     uint32_t newAddr;
168     uint32_t caseId;
169     uint32_t origin;
170     uint32_t accessFlags;
171     size_t inMemSize;
172     uint32_t inHint;
173     char *testBuffer;
174 };
175 typedef struct TestMemData TestMemData;
176 
177 typedef enum {
178     HINT_RESERVE = 0x80000000,
179     TEE_MALLOC_FILL_ZERO = 0,
180     TEE_MALLOC_NO_FILL = 1,
181     TEE_MALLOC_NO_SHARE = 2,
182 } ALL_MEMORY_HINTS;
183 
184 #define TEE_MEMORY_ACCESS_READ 0x00000001
185 #define TEE_MEMORY_ACCESS_WRITE 0x00000002
186 #define TEE_MEMORY_ACCESS_ANY_OWNER 0x00000004
187 
188 class TeeTCF1Test : public ::testing::Test {
189 private:
190     static TEEC_Context context;
191     static TEEC_Session session;
192 
193 public:
SetUpTestCase()194     static void SetUpTestCase() {}
TearDownTestCase()195     static void TearDownTestCase() {}
196 
GetContext()197     TEEC_Context *GetContext()
198     {
199         return &TeeTCF1Test::context;
200     }
GetSession()201     TEEC_Session *GetSession()
202     {
203         return &TeeTCF1Test::session;
204     }
205     void SetUp();
206     void TearDown();
207 };
208 
209 class TeeTCF2Test : public ::testing::Test {
210 private:
211     static TEEC_Context context;
212     static TEEC_Session session;
213 
214 public:
SetUpTestCase()215     static void SetUpTestCase() {}
TearDownTestCase()216     static void TearDownTestCase() {}
217 
GetContext()218     TEEC_Context *GetContext()
219     {
220         return &TeeTCF2Test::context;
221     }
GetSession()222     TEEC_Session *GetSession()
223     {
224         return &TeeTCF2Test::session;
225     }
226     void SetUp();
227     void TearDown();
228 };
229 
230 class TeeTCF2TA2TATest : public ::testing::Test {
231 private:
232     static TEEC_Context context;
233     static TEEC_Session session;
234     static TEEC_Session session2;
235 
236 public:
SetUpTestCase()237     static void SetUpTestCase() {}
TearDownTestCase()238     static void TearDownTestCase() {}
239 
GetContext()240     TEEC_Context *GetContext()
241     {
242         return &TeeTCF2TA2TATest::context;
243     }
GetSession()244     TEEC_Session *GetSession()
245     {
246         return &TeeTCF2TA2TATest::session;
247     }
GetSession2()248     TEEC_Session *GetSession2()
249     {
250         return &TeeTCF2TA2TATest::session2;
251     }
252     void SetUp();
253     void TearDown();
254 };
255 
256 class TeeTCF1EnumTest : public ::testing::Test {
257 private:
258     static TEEC_Context context;
259     static TEEC_Session session;
260 
261 public:
262     TestData value = { 0 };
263     static void SetUpTestCase();
264     static void TearDownTestCase();
265 
GetContext()266     TEEC_Context *GetContext()
267     {
268         return &TeeTCF1EnumTest::context;
269     }
GetSession()270     TEEC_Session *GetSession()
271     {
272         return &TeeTCF1EnumTest::session;
273     }
274 
275     void SetUp();
276     void TearDown();
277 };
278 
279 TEEC_Result Invoke_GetPropertyAsX(TEEC_Context *context, TEEC_Session *session, TestData *testData);
280 TEEC_Result Invoke_AllocatePropertyEnumerator(TEEC_Session *session, TestData *testData);
281 TEEC_Result Invoke_Operate_PropertyEnumerator(TEEC_Session *session, TestData *testData);
282 TEEC_Result Invoke_Malloc(TEEC_Session *session, uint32_t commandID, TestMemData *testData, uint32_t *origin);
283 TEEC_Result Invoke_Realloc(TEEC_Session *session, uint32_t commandID, TestMemData *testData, char *output);
284 TEEC_Result Invoke_MemMove_Or_Fill(TEEC_Session *session, uint32_t commandID, TestMemData *testData, char *output);
285 TEEC_Result Invoke_Free(TEEC_Session *session, uint32_t commandID, uint32_t caseNum, uint32_t *origin);
286 TEEC_Result Invoke_MemCompare(TEEC_Session *session, uint32_t commandID, TestMemData *testData, char *buffer1,
287     char *buffer2);
288 TEEC_Result Invoke_CheckMemoryAccessRights(TEEC_Session *session, uint32_t commandID, TestMemData *testData);
289 TEEC_Result Invoke_SetInstanceData(TEEC_Session *session, uint32_t commandID, char *buffer, uint32_t caseNum,
290     uint32_t *origin);
291 TEEC_Result Invoke_GetInstanceData(TEEC_Session *session, uint32_t commandID, char *buffer, uint32_t *bufSize,
292     uint32_t *origin);
293 TEEC_Result Invoke_OpenTASession(TEEC_Session *session, uint32_t commandID, uint32_t *ta2taSession,
294     TestData *testData, uint32_t *origin);
295 TEEC_Result Invoke_CloseTASession(TEEC_Session *session, uint32_t commandID, uint32_t ta2taSession,
296     uint32_t *origin);
297 TEEC_Result Invoke_InvokeTACommand(TEEC_Session *session, uint32_t commandID, uint32_t ta2taSession,
298     TestData *testData, uint32_t *origin);
299 TEEC_Result Invoke_Panic(TEEC_Session *session, uint32_t commandID, TEEC_Result panicCode, uint32_t *origin);
300 uint32_t get_ta_data_size(TEEC_Context *context, TEEC_Session *session);
301 uint32_t get_ta_stack_size(TEEC_Context *context, TEEC_Session *session);
302 #endif
303