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