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 <gtest/gtest.h> 14 #include <test_defines.h> 15 #include <common_test.h> 16 #include <securec.h> 17 #include <tee_client_api.h> 18 #include <tee_client_type.h> 19 #include <test_log.h> 20 #include <test_tcf_cmdid.h> 21 22 using namespace testing::ext; 23 24 /** 25 * @testcase.name : TEE_GetPropertyAsBool_WithoutEnum_GPD_TA_SINGLEINSTANCE 26 * @testcase.desc : test TA call TEE_GetPropertyAsBool to get value of GPD_TA_SINGLEINSTANCE 27 * @testcase.expect : return TEEC_SUCCESS, get value is correct 28 */ 29 TEE_TEST(TeeTCF1Test, TEE_GetPropertyAsBool_WithoutEnum_GPD_TA_SINGLEINSTANCE, Function | MediumTest | Level0) 30 { 31 TEEC_Result ret; 32 33 int rc; 34 TestData value = { 0 }; 35 value.cmd = CMD_TEE_GetPropertyAsBool; 36 value.propSet = TEE_PROPSET_CURRENT_TA; 37 rc = memcpy_s(value.inBuffer, BIG_SIZE, GPD_TA_SINGLEINSTANCE, sizeof(GPD_TA_SINGLEINSTANCE)); 38 ASSERT_EQ(rc, 0); 39 value.inBufferLen = sizeof(GPD_TA_SINGLEINSTANCE); 40 ret = Invoke_GetPropertyAsX(GetContext(), GetSession(), &value); 41 ASSERT_EQ(ret, TEEC_SUCCESS); 42 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP); 43 ASSERT_STREQ(value.outBuffer, VALUE_PREDEFINED_BOOLEAN); 44 ASSERT_EQ(value.outBufferLen, sizeof(VALUE_PREDEFINED_BOOLEAN)); 45 } 46 47 /** 48 * @testcase.name : TEE_GetPropertyAsBool_WithoutEnum_GPD_TA_MULTISESSION 49 * @testcase.desc : test TA call TEE_GetPropertyAsBool to get value of GPD_TA_MULTISESSION 50 * @testcase.expect : return TEEC_SUCCESS 51 */ 52 TEE_TEST(TeeTCF1Test, TEE_GetPropertyAsBool_WithoutEnum_GPD_TA_MULTISESSION, Function | MediumTest | Level0) 53 { 54 TEEC_Result ret; 55 56 int rc; 57 TestData value = { 0 }; 58 value.cmd = CMD_TEE_GetPropertyAsBool; 59 value.propSet = TEE_PROPSET_CURRENT_TA; 60 rc = memcpy_s(value.inBuffer, BIG_SIZE, GPD_TA_MULTISESSION, sizeof(GPD_TA_MULTISESSION)); 61 ASSERT_EQ(rc, 0); 62 value.inBufferLen = sizeof(GPD_TA_MULTISESSION); 63 64 ret = Invoke_GetPropertyAsX(GetContext(), GetSession(), &value); 65 ASSERT_EQ(ret, TEEC_SUCCESS); 66 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP); 67 ASSERT_STREQ(value.outBuffer, VALUE_PREDEFINED_BOOLEAN); 68 ASSERT_EQ(value.outBufferLen, sizeof(VALUE_PREDEFINED_BOOLEAN)); 69 } 70 71 /** 72 * @testcase.name : TEE_GetPropertyAsBool_WithoutEnum_GPD_TA_INSTANCEKEEPALIVE 73 * @testcase.desc : test TA call TEE_GetPropertyAsBool to get value of GPD_TA_INSTANCEKEEPALIVE 74 * @testcase.expect : return TEEC_SUCCESS, get value is correct 75 */ 76 TEE_TEST(TeeTCF1Test, TEE_GetPropertyAsBool_WithoutEnum_GPD_TA_INSTANCEKEEPALIVE, Function | MediumTest | Level0) 77 { 78 TEEC_Result ret; 79 80 int rc; 81 TestData value = { 0 }; 82 value.cmd = CMD_TEE_GetPropertyAsBool; 83 value.propSet = TEE_PROPSET_CURRENT_TA; 84 rc = memcpy_s(value.inBuffer, BIG_SIZE, GPD_TA_INSTANCEKEEPALIVE, sizeof(GPD_TA_INSTANCEKEEPALIVE)); 85 ASSERT_EQ(rc, 0); 86 value.inBufferLen = sizeof(GPD_TA_INSTANCEKEEPALIVE); 87 88 ret = Invoke_GetPropertyAsX(GetContext(), GetSession(), &value); 89 ASSERT_EQ(ret, TEEC_SUCCESS); 90 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP); 91 ASSERT_STREQ(value.outBuffer, VALUE_PREDEFINED_FALSE); 92 ASSERT_EQ(value.outBufferLen, sizeof(VALUE_PREDEFINED_FALSE)); 93 } 94 95 /** 96 * @testcase.name : TEE_GetPropertyAsBool_WithoutEnum_GPD_TEE_CRYPTOGRAPHY_ECC 97 * @testcase.desc : test TA call TEE_GetPropertyAsBool to get value of GPD_TEE_CRYPTOGRAPHY_ECC 98 * @testcase.expect : return TEEC_SUCCESS, get value is correct 99 */ 100 TEE_TEST(TeeTCF1Test, TEE_GetPropertyAsBool_WithoutEnum_GPD_TEE_CRYPTOGRAPHY_ECC, Function | MediumTest | Level0) 101 { 102 TEEC_Result ret; 103 int rc; 104 105 TestData value = { 0 }; 106 value.cmd = CMD_TEE_GetPropertyAsBool; 107 value.propSet = TEE_PROPSET_IMPLEMENTATION; 108 rc = memcpy_s(value.inBuffer, BIG_SIZE, GPD_TEE_CRYPTOGRAPHY_ECC, sizeof(GPD_TEE_CRYPTOGRAPHY_ECC)); 109 ASSERT_EQ(rc, 0); 110 value.inBufferLen = sizeof(GPD_TEE_CRYPTOGRAPHY_ECC); 111 112 ret = Invoke_GetPropertyAsX(GetContext(), GetSession(), &value); 113 ASSERT_EQ(ret, TEEC_SUCCESS); 114 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP); 115 ASSERT_STREQ(value.outBuffer, VALUE_PREDEFINED_FALSE); 116 ASSERT_EQ(value.outBufferLen, sizeof(VALUE_PREDEFINED_FALSE)); 117 } 118 119 /** 120 * @testcase.name : TEE_GetPropertyAsBool_WithoutEnum_GPD_TEE_CRYPTOGRAPHY_NIST 121 * @testcase.desc : test TA call TEE_GetPropertyAsBool to get value of GPD_TEE_CRYPTOGRAPHY_NIST 122 * @testcase.expect : return TEEC_SUCCESS, get value is correct 123 */ 124 TEE_TEST(TeeTCF1Test, TEE_GetPropertyAsBool_WithoutEnum_GPD_TEE_CRYPTOGRAPHY_NIST, Function | MediumTest | Level0) 125 { 126 TEEC_Result ret; 127 int rc; 128 129 TestData value = { 0 }; 130 value.cmd = CMD_TEE_GetPropertyAsBool; 131 value.propSet = TEE_PROPSET_IMPLEMENTATION; 132 rc = memcpy_s(value.inBuffer, BIG_SIZE, GPD_TEE_CRYPTOGRAPHY_NIST, sizeof(GPD_TEE_CRYPTOGRAPHY_NIST)); 133 ASSERT_EQ(rc, 0); 134 value.inBufferLen = sizeof(GPD_TEE_CRYPTOGRAPHY_NIST); 135 136 ret = Invoke_GetPropertyAsX(GetContext(), GetSession(), &value); 137 ASSERT_EQ(ret, TEEC_SUCCESS); 138 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP); 139 ASSERT_STREQ(value.outBuffer, VALUE_PREDEFINED_FALSE); 140 ASSERT_EQ(value.outBufferLen, sizeof(VALUE_PREDEFINED_FALSE)); 141 } 142 143 /** 144 * @testcase.name : TEE_GetPropertyAsBool_WithoutEnum_GPD_TEE_CRYPTOGRAPHY_BSI_R 145 * @testcase.desc : test TA call TEE_GetPropertyAsBool to get value of GPD_TEE_CRYPTOGRAPHY_BSI_R 146 * @testcase.expect : return TEEC_SUCCESS, get value is correct 147 */ 148 TEE_TEST(TeeTCF1Test, TEE_GetPropertyAsBool_WithoutEnum_GPD_TEE_CRYPTOGRAPHY_BSI_R, Function | MediumTest | Level0) 149 { 150 TEEC_Result ret; 151 int rc; 152 153 TestData value = { 0 }; 154 value.cmd = CMD_TEE_GetPropertyAsBool; 155 value.propSet = TEE_PROPSET_IMPLEMENTATION; 156 rc = memcpy_s(value.inBuffer, BIG_SIZE, GPD_TEE_CRYPTOGRAPHY_BSI_R, sizeof(GPD_TEE_CRYPTOGRAPHY_BSI_R)); 157 ASSERT_EQ(rc, 0); 158 value.inBufferLen = sizeof(GPD_TEE_CRYPTOGRAPHY_BSI_R); 159 160 ret = Invoke_GetPropertyAsX(GetContext(), GetSession(), &value); 161 ASSERT_EQ(ret, TEEC_SUCCESS); 162 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP); 163 ASSERT_STREQ(value.outBuffer, VALUE_PREDEFINED_FALSE); 164 ASSERT_EQ(value.outBufferLen, sizeof(VALUE_PREDEFINED_FALSE)); 165 } 166 167 /** 168 * @testcase.name : TEE_GetPropertyAsBool_WithoutEnum_GPD_TEE_CRYPTOGRAPHY_BSI_T 169 * @testcase.desc : test TA call TEE_GetPropertyAsBool to get value of GPD_TEE_CRYPTOGRAPHY_BSI_T 170 * @testcase.expect : return TEEC_SUCCESS, get value is correct 171 */ 172 TEE_TEST(TeeTCF1Test, TEE_GetPropertyAsBool_WithoutEnum_GPD_TEE_CRYPTOGRAPHY_BSI_T, Function | MediumTest | Level0) 173 { 174 TEEC_Result ret; 175 int rc; 176 177 TestData value = { 0 }; 178 value.cmd = CMD_TEE_GetPropertyAsBool; 179 value.propSet = TEE_PROPSET_IMPLEMENTATION; 180 rc = memcpy_s(value.inBuffer, BIG_SIZE, GPD_TEE_CRYPTOGRAPHY_BSI_T, sizeof(GPD_TEE_CRYPTOGRAPHY_BSI_T)); 181 ASSERT_EQ(rc, 0); 182 value.inBufferLen = sizeof(GPD_TEE_CRYPTOGRAPHY_BSI_T); 183 184 ret = Invoke_GetPropertyAsX(GetContext(), GetSession(), &value); 185 ASSERT_EQ(ret, TEEC_SUCCESS); 186 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP); 187 ASSERT_STREQ(value.outBuffer, VALUE_PREDEFINED_FALSE); 188 ASSERT_EQ(value.outBufferLen, sizeof(VALUE_PREDEFINED_FALSE)); 189 } 190 191 /** 192 * @testcase.name : TEE_GetPropertyAsBool_WithoutEnum_GPD_TEE_CRYPTOGRAPHY_IETF 193 * @testcase.desc : test TA call TEE_GetPropertyAsBool to get value of GPD_TEE_CRYPTOGRAPHY_IETF 194 * @testcase.expect : return TEEC_SUCCESS, get value is correct 195 */ 196 TEE_TEST(TeeTCF1Test, TEE_GetPropertyAsBool_WithoutEnum_GPD_TEE_CRYPTOGRAPHY_IETF, Function | MediumTest | Level0) 197 { 198 TEEC_Result ret; 199 int rc; 200 201 TestData value = { 0 }; 202 value.cmd = CMD_TEE_GetPropertyAsBool; 203 value.propSet = TEE_PROPSET_IMPLEMENTATION; 204 rc = memcpy_s(value.inBuffer, BIG_SIZE, GPD_TEE_CRYPTOGRAPHY_IETF, sizeof(GPD_TEE_CRYPTOGRAPHY_IETF)); 205 ASSERT_EQ(rc, 0); 206 value.inBufferLen = sizeof(GPD_TEE_CRYPTOGRAPHY_IETF); 207 208 ret = Invoke_GetPropertyAsX(GetContext(), GetSession(), &value); 209 ASSERT_EQ(ret, TEEC_SUCCESS); 210 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP); 211 ASSERT_STREQ(value.outBuffer, VALUE_PREDEFINED_FALSE); 212 ASSERT_EQ(value.outBufferLen, sizeof(VALUE_PREDEFINED_FALSE)); 213 } 214 215 /** 216 * @testcase.name : TEE_GetPropertyAsBool_WithoutEnum_GPD_TEE_CRYPTOGRAPHY_OCTA 217 * @testcase.desc : test TA call TEE_GetPropertyAsBool to get value of GPD_TEE_CRYPTOGRAPHY_OCTA 218 * @testcase.expect : return TEEC_SUCCESS, get value is correct 219 */ 220 TEE_TEST(TeeTCF1Test, TEE_GetPropertyAsBool_WithoutEnum_GPD_TEE_CRYPTOGRAPHY_OCTA, Function | MediumTest | Level0) 221 { 222 TEEC_Result ret; 223 int rc; 224 225 TestData value = { 0 }; 226 value.cmd = CMD_TEE_GetPropertyAsBool; 227 value.propSet = TEE_PROPSET_IMPLEMENTATION; 228 rc = memcpy_s(value.inBuffer, BIG_SIZE, GPD_TEE_CRYPTOGRAPHY_OCTA, sizeof(GPD_TEE_CRYPTOGRAPHY_OCTA)); 229 ASSERT_EQ(rc, 0); 230 value.inBufferLen = sizeof(GPD_TEE_CRYPTOGRAPHY_OCTA); 231 232 ret = Invoke_GetPropertyAsX(GetContext(), GetSession(), &value); 233 ASSERT_EQ(ret, TEEC_SUCCESS); 234 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP); 235 ASSERT_STREQ(value.outBuffer, VALUE_PREDEFINED_FALSE); 236 ASSERT_EQ(value.outBufferLen, sizeof(VALUE_PREDEFINED_FALSE)); 237 } 238 239 /** 240 * @testcase.name : TEE_GetPropertyAsBool_WithoutEnum_NameIsNull 241 * @testcase.desc : test TA call TEE_GetPropertyAsBool for name is null 242 * @testcase.expect : return TEEC_ERROR_ITEM_NOT_FOUND 243 */ 244 TEE_TEST(TeeTCF1Test, TEE_GetPropertyAsBool_WithoutEnum_NameIsNull, Function | MediumTest | Level0) 245 { 246 TEEC_Result ret; 247 248 TestData value = { 0 }; 249 value.cmd = CMD_TEE_GetPropertyAsBool; 250 value.caseId = INPUT_ISNULL; 251 value.propSet = TEE_PROPSET_CURRENT_TA; 252 253 ret = Invoke_GetPropertyAsX(GetContext(), GetSession(), &value); 254 ASSERT_EQ(ret, TEEC_ERROR_ITEM_NOT_FOUND); 255 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP); 256 } 257 258 /** 259 * @testcase.name : TEE_GetPropertyAsBool_WithoutEnum_NameIsZero 260 * @testcase.desc : test TA call TEE_GetPropertyAsBool for name value is zero 261 * @testcase.expect : return TEEC_ERROR_ITEM_NOT_FOUND 262 */ 263 TEE_TEST(TeeTCF1Test, TEE_GetPropertyAsBool_WithoutEnum_NameIsZero, Function | MediumTest | Level0) 264 { 265 TEEC_Result ret; 266 267 TestData value = { 0 }; 268 value.cmd = CMD_TEE_GetPropertyAsBool; 269 value.propSet = TEE_PROPSET_CURRENT_TA; 270 271 ret = Invoke_GetPropertyAsX(GetContext(), GetSession(), &value); 272 ASSERT_EQ(ret, TEEC_ERROR_ITEM_NOT_FOUND); 273 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP); 274 } 275 276 /** 277 * @testcase.name : TEE_GetPropertyAsBool_WithoutEnum_ValueIsNull 278 * @testcase.desc : test TA call TEE_GetPropertyAsBool for value is null 279 * @testcase.expect : return TEEC_ERROR_BAD_PARAMETERS 280 */ 281 TEE_TEST(TeeTCF1Test, TEE_GetPropertyAsBool_WithoutEnum_ValueIsNull, Function | MediumTest | Level0) 282 { 283 TEEC_Result ret; 284 285 int rc; 286 TestData value = { 0 }; 287 value.cmd = CMD_TEE_GetPropertyAsBool; 288 value.caseId = OUTPUT_ISNULL; 289 value.propSet = TEE_PROPSET_CURRENT_TA; 290 rc = memcpy_s(value.inBuffer, BIG_SIZE, GPD_TA_MULTISESSION, sizeof(GPD_TA_MULTISESSION)); 291 ASSERT_EQ(rc, 0); 292 value.inBufferLen = sizeof(GPD_TA_MULTISESSION); 293 294 ret = Invoke_GetPropertyAsX(GetContext(), GetSession(), &value); 295 ASSERT_EQ(ret, TEEC_ERROR_BAD_PARAMETERS); 296 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP); 297 } 298 299 /** 300 * @testcase.name : TEE_GetPropertyAsBool_WithoutEnum_NameNotFound 301 * @testcase.desc : test TA call TEE_GetPropertyAsBool while Name Not Found 302 * @testcase.expect : return TEEC_ERROR_ITEM_NOT_FOUND 303 */ 304 TEE_TEST(TeeTCF1Test, TEE_GetPropertyAsBool_WithoutEnum_NameNotFound, Function | MediumTest | Level0) 305 { 306 TEEC_Result ret; 307 308 int rc; 309 TestData value = { 0 }; 310 value.cmd = CMD_TEE_GetPropertyAsBool; 311 value.propSet = TEE_PROPSET_CURRENT_TA; 312 rc = memcpy_s(value.inBuffer, BIG_SIZE, PROPERTY_NAME_UNKNOWN, sizeof(PROPERTY_NAME_UNKNOWN)); 313 ASSERT_EQ(rc, 0); 314 value.inBufferLen = sizeof(PROPERTY_NAME_UNKNOWN); 315 316 ret = Invoke_GetPropertyAsX(GetContext(), GetSession(), &value); 317 ASSERT_EQ(ret, TEEC_ERROR_ITEM_NOT_FOUND); 318 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP); 319 } 320 321 /** 322 * @testcase.name : TEE_GetPropertyAsBool_WithoutEnum_NameNotBool 323 * @testcase.desc : test TA call TEE_GetPropertyAsBool while Name type is not bool 324 * @testcase.expect : return TEEC_ERROR_BAD_FORMAT 325 */ 326 TEE_TEST(TeeTCF1Test, TEE_GetPropertyAsBool_WithoutEnum_NameNotBool, Function | MediumTest | Level0) 327 { 328 TEEC_Result ret; 329 330 int rc; 331 TestData value = { 0 }; 332 value.cmd = CMD_TEE_GetPropertyAsBool; 333 value.propSet = TEE_PROPSET_CURRENT_TA; 334 rc = memcpy_s(value.inBuffer, BIG_SIZE, GPD_TA_STACKSIZE, sizeof(GPD_TA_STACKSIZE)); 335 ASSERT_EQ(rc, 0); 336 value.inBufferLen = sizeof(GPD_TA_STACKSIZE); 337 338 ret = Invoke_GetPropertyAsX(GetContext(), GetSession(), &value); 339 ASSERT_EQ(ret, TEEC_ERROR_BAD_FORMAT); 340 ASSERT_EQ(value.origin, TEEC_ORIGIN_TRUSTED_APP); 341 }