1 // 2 // Copyright (C) 2014 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include <gmock/gmock.h> 18 #include <gtest/gtest.h> 19 20 #include "trunks/mock_tpm.h" 21 #include "trunks/tpm_generated.h" 22 #include "trunks/tpm_state_impl.h" 23 #include "trunks/trunks_factory_for_test.h" 24 25 using testing::_; 26 using testing::DoAll; 27 using testing::Invoke; 28 using testing::NiceMock; 29 using testing::Return; 30 using testing::SetArgPointee; 31 using testing::WithArgs; 32 33 namespace trunks { 34 35 // From definition of TPMA_STARTUP_CLEAR. 36 const trunks::TPMA_STARTUP_CLEAR kPlatformHierarchyMask = 1U; 37 38 // A test fixture for TpmState tests. 39 class TpmStateTest : public testing::Test { 40 public: 41 TpmStateTest() {} 42 ~TpmStateTest() override {} 43 44 void SetUp() override { 45 factory_.set_tpm(&mock_tpm_); 46 permanent_data_ = GetValidCapabilityData(TPM_PT_PERMANENT, 0); 47 startup_clear_data_ = GetValidCapabilityData(TPM_PT_STARTUP_CLEAR, 0); 48 rsa_data_ = GetValidAlgorithmData(TPM_ALG_RSA, 0); 49 ecc_data_ = GetValidAlgorithmData(TPM_ALG_ECC, 0); 50 lockout_counter_ = GetValidCapabilityData(TPM_PT_LOCKOUT_COUNTER, 0); 51 lockout_threshold_ = GetValidCapabilityData(TPM_PT_MAX_AUTH_FAIL, 0); 52 lockout_interval_ = GetValidCapabilityData(TPM_PT_LOCKOUT_INTERVAL, 0); 53 lockout_recovery_ = GetValidCapabilityData(TPM_PT_LOCKOUT_RECOVERY, 0); 54 EXPECT_CALL(mock_tpm_, GetCapabilitySync(TPM_CAP_TPM_PROPERTIES, 55 TPM_PT_PERMANENT, 1, _, _, _)) 56 .WillRepeatedly(WithArgs<4>( 57 Invoke(this, &TpmStateTest::GetLivePermanent))); 58 EXPECT_CALL(mock_tpm_, GetCapabilitySync(TPM_CAP_TPM_PROPERTIES, 59 TPM_PT_STARTUP_CLEAR, 1, _, _, _)) 60 .WillRepeatedly(WithArgs<4>( 61 Invoke(this, &TpmStateTest::GetLiveStartupClear))); 62 EXPECT_CALL(mock_tpm_, GetCapabilitySync(TPM_CAP_ALGS, 63 TPM_ALG_RSA, 1, _, _, _)) 64 .WillRepeatedly(WithArgs<4>( 65 Invoke(this, &TpmStateTest::GetLiveRSA))); 66 EXPECT_CALL(mock_tpm_, GetCapabilitySync(TPM_CAP_ALGS, 67 TPM_ALG_ECC, 1, _, _, _)) 68 .WillRepeatedly(WithArgs<4>( 69 Invoke(this, &TpmStateTest::GetLiveECC))); 70 EXPECT_CALL(mock_tpm_, GetCapabilitySync(TPM_CAP_TPM_PROPERTIES, 71 TPM_PT_LOCKOUT_COUNTER, 72 1, _, _, _)) 73 .WillRepeatedly(WithArgs<4>( 74 Invoke(this, &TpmStateTest::GetLiveLockoutCounter))); 75 EXPECT_CALL(mock_tpm_, GetCapabilitySync(TPM_CAP_TPM_PROPERTIES, 76 TPM_PT_MAX_AUTH_FAIL, 77 1, _, _, _)) 78 .WillRepeatedly(WithArgs<4>( 79 Invoke(this, &TpmStateTest::GetLiveLockoutThreshold))); 80 EXPECT_CALL(mock_tpm_, GetCapabilitySync(TPM_CAP_TPM_PROPERTIES, 81 TPM_PT_LOCKOUT_INTERVAL, 82 1, _, _, _)) 83 .WillRepeatedly(WithArgs<4>( 84 Invoke(this, &TpmStateTest::GetLiveLockoutInterval))); 85 EXPECT_CALL(mock_tpm_, GetCapabilitySync(TPM_CAP_TPM_PROPERTIES, 86 TPM_PT_LOCKOUT_RECOVERY, 87 1, _, _, _)) 88 .WillRepeatedly(WithArgs<4>( 89 Invoke(this, &TpmStateTest::GetLiveLockoutRecovery))); 90 } 91 92 TPM_RC GetLivePermanent(TPMS_CAPABILITY_DATA* capability_data) { 93 *capability_data = permanent_data_; 94 return TPM_RC_SUCCESS; 95 } 96 TPM_RC GetLiveStartupClear(TPMS_CAPABILITY_DATA* capability_data) { 97 *capability_data = startup_clear_data_; 98 return TPM_RC_SUCCESS; 99 } 100 TPM_RC GetLiveRSA(TPMS_CAPABILITY_DATA* capability_data) { 101 *capability_data = rsa_data_; 102 return TPM_RC_SUCCESS; 103 } 104 TPM_RC GetLiveECC(TPMS_CAPABILITY_DATA* capability_data) { 105 *capability_data = ecc_data_; 106 return TPM_RC_SUCCESS; 107 } 108 TPM_RC GetLiveLockoutCounter(TPMS_CAPABILITY_DATA* capability_data) { 109 *capability_data = lockout_counter_; 110 return TPM_RC_SUCCESS; 111 } 112 TPM_RC GetLiveLockoutThreshold(TPMS_CAPABILITY_DATA* capability_data) { 113 *capability_data = lockout_threshold_; 114 return TPM_RC_SUCCESS; 115 } 116 TPM_RC GetLiveLockoutInterval(TPMS_CAPABILITY_DATA* capability_data) { 117 *capability_data = lockout_interval_; 118 return TPM_RC_SUCCESS; 119 } 120 TPM_RC GetLiveLockoutRecovery(TPMS_CAPABILITY_DATA* capability_data) { 121 *capability_data = lockout_recovery_; 122 return TPM_RC_SUCCESS; 123 } 124 125 protected: 126 TPMS_CAPABILITY_DATA GetValidCapabilityData(TPM_PT property, UINT32 value) { 127 TPMS_CAPABILITY_DATA data; 128 memset(&data, 0, sizeof(TPMS_CAPABILITY_DATA)); 129 data.capability = TPM_CAP_TPM_PROPERTIES; 130 data.data.tpm_properties.count = 1; 131 data.data.tpm_properties.tpm_property[0].property = property; 132 data.data.tpm_properties.tpm_property[0].value = value; 133 return data; 134 } 135 136 TPMS_CAPABILITY_DATA GetValidAlgorithmData(TPM_ALG_ID alg_id, UINT32 value) { 137 TPMS_CAPABILITY_DATA data; 138 memset(&data, 0, sizeof(TPMS_CAPABILITY_DATA)); 139 data.capability = TPM_CAP_ALGS; 140 data.data.tpm_properties.count = 1; 141 data.data.algorithms.alg_properties[0].alg = alg_id; 142 data.data.algorithms.alg_properties[0].alg_properties = value; 143 return data; 144 } 145 146 TrunksFactoryForTest factory_; 147 NiceMock<MockTpm> mock_tpm_; 148 TPMS_CAPABILITY_DATA permanent_data_; 149 TPMS_CAPABILITY_DATA startup_clear_data_; 150 TPMS_CAPABILITY_DATA rsa_data_; 151 TPMS_CAPABILITY_DATA ecc_data_; 152 TPMS_CAPABILITY_DATA lockout_counter_; 153 TPMS_CAPABILITY_DATA lockout_threshold_; 154 TPMS_CAPABILITY_DATA lockout_interval_; 155 TPMS_CAPABILITY_DATA lockout_recovery_; 156 }; 157 158 TEST(TpmState_DeathTest, NotInitialized) { 159 TrunksFactoryForTest factory; 160 TpmStateImpl tpm_state(factory); 161 EXPECT_DEATH_IF_SUPPORTED(tpm_state.IsOwnerPasswordSet(), "Check failed"); 162 EXPECT_DEATH_IF_SUPPORTED(tpm_state.IsEndorsementPasswordSet(), 163 "Check failed"); 164 EXPECT_DEATH_IF_SUPPORTED(tpm_state.IsLockoutPasswordSet(), "Check failed"); 165 EXPECT_DEATH_IF_SUPPORTED(tpm_state.IsOwned(), "Check failed"); 166 EXPECT_DEATH_IF_SUPPORTED(tpm_state.IsInLockout(), "Check failed"); 167 EXPECT_DEATH_IF_SUPPORTED(tpm_state.IsPlatformHierarchyEnabled(), 168 "Check failed"); 169 EXPECT_DEATH_IF_SUPPORTED(tpm_state.IsStorageHierarchyEnabled(), 170 "Check failed"); 171 EXPECT_DEATH_IF_SUPPORTED(tpm_state.IsEndorsementHierarchyEnabled(), 172 "Check failed"); 173 EXPECT_DEATH_IF_SUPPORTED(tpm_state.IsEnabled(), "Check failed"); 174 EXPECT_DEATH_IF_SUPPORTED(tpm_state.WasShutdownOrderly(), "Check failed"); 175 EXPECT_DEATH_IF_SUPPORTED(tpm_state.IsRSASupported(), "Check failed"); 176 EXPECT_DEATH_IF_SUPPORTED(tpm_state.IsECCSupported(), "Check failed"); 177 EXPECT_DEATH_IF_SUPPORTED(tpm_state.GetLockoutCounter(), "Check failed"); 178 EXPECT_DEATH_IF_SUPPORTED(tpm_state.GetLockoutThreshold(), "Check failed"); 179 EXPECT_DEATH_IF_SUPPORTED(tpm_state.GetLockoutInterval(), "Check failed"); 180 EXPECT_DEATH_IF_SUPPORTED(tpm_state.GetLockoutRecovery(), "Check failed"); 181 } 182 183 TEST_F(TpmStateTest, FlagsClear) { 184 TpmStateImpl tpm_state(factory_); 185 EXPECT_EQ(TPM_RC_SUCCESS, tpm_state.Initialize()); 186 EXPECT_FALSE(tpm_state.IsOwnerPasswordSet()); 187 EXPECT_FALSE(tpm_state.IsEndorsementPasswordSet()); 188 EXPECT_FALSE(tpm_state.IsLockoutPasswordSet()); 189 EXPECT_FALSE(tpm_state.IsInLockout()); 190 EXPECT_FALSE(tpm_state.IsOwned()); 191 EXPECT_FALSE(tpm_state.IsPlatformHierarchyEnabled()); 192 EXPECT_FALSE(tpm_state.IsStorageHierarchyEnabled()); 193 EXPECT_FALSE(tpm_state.IsEndorsementHierarchyEnabled()); 194 EXPECT_FALSE(tpm_state.IsEnabled()); 195 EXPECT_FALSE(tpm_state.WasShutdownOrderly()); 196 EXPECT_FALSE(tpm_state.IsRSASupported()); 197 EXPECT_FALSE(tpm_state.IsECCSupported()); 198 EXPECT_EQ(0u, tpm_state.GetLockoutCounter()); 199 EXPECT_EQ(0u, tpm_state.GetLockoutThreshold()); 200 EXPECT_EQ(0u, tpm_state.GetLockoutInterval()); 201 EXPECT_EQ(0u, tpm_state.GetLockoutRecovery()); 202 } 203 204 TEST_F(TpmStateTest, FlagsSet) { 205 uint32_t lockout_counter = 5; 206 uint32_t lockout_threshold = 8; 207 uint32_t lockout_interval = 1200; 208 uint32_t lockout_recovery = 84600; 209 permanent_data_.data.tpm_properties.tpm_property[0].value = ~0U; 210 startup_clear_data_.data.tpm_properties.tpm_property[0].value = ~0U; 211 lockout_counter_.data.tpm_properties.tpm_property[0].value = lockout_counter; 212 lockout_threshold_.data.tpm_properties.tpm_property[0].value = 213 lockout_threshold; 214 lockout_interval_.data.tpm_properties.tpm_property[0].value = 215 lockout_interval; 216 lockout_recovery_.data.tpm_properties.tpm_property[0].value = 217 lockout_recovery; 218 rsa_data_.data.algorithms.alg_properties[0].alg_properties = ~0U; 219 ecc_data_.data.algorithms.alg_properties[0].alg_properties = ~0U; 220 TpmStateImpl tpm_state(factory_); 221 EXPECT_EQ(TPM_RC_SUCCESS, tpm_state.Initialize()); 222 EXPECT_TRUE(tpm_state.IsOwnerPasswordSet()); 223 EXPECT_TRUE(tpm_state.IsEndorsementPasswordSet()); 224 EXPECT_TRUE(tpm_state.IsLockoutPasswordSet()); 225 EXPECT_TRUE(tpm_state.IsOwned()); 226 EXPECT_TRUE(tpm_state.IsInLockout()); 227 EXPECT_TRUE(tpm_state.IsPlatformHierarchyEnabled()); 228 EXPECT_TRUE(tpm_state.IsStorageHierarchyEnabled()); 229 EXPECT_TRUE(tpm_state.IsEndorsementHierarchyEnabled()); 230 EXPECT_FALSE(tpm_state.IsEnabled()); 231 EXPECT_TRUE(tpm_state.WasShutdownOrderly()); 232 EXPECT_TRUE(tpm_state.IsRSASupported()); 233 EXPECT_TRUE(tpm_state.IsECCSupported()); 234 EXPECT_EQ(lockout_counter, tpm_state.GetLockoutCounter()); 235 EXPECT_EQ(lockout_threshold, tpm_state.GetLockoutThreshold()); 236 EXPECT_EQ(lockout_interval, tpm_state.GetLockoutInterval()); 237 EXPECT_EQ(lockout_recovery, tpm_state.GetLockoutRecovery()); 238 } 239 240 TEST_F(TpmStateTest, EnabledTpm) { 241 startup_clear_data_.data.tpm_properties.tpm_property[0].value = 242 ~kPlatformHierarchyMask; 243 TpmStateImpl tpm_state(factory_); 244 EXPECT_EQ(TPM_RC_SUCCESS, tpm_state.Initialize()); 245 EXPECT_FALSE(tpm_state.IsPlatformHierarchyEnabled()); 246 EXPECT_TRUE(tpm_state.IsStorageHierarchyEnabled()); 247 EXPECT_TRUE(tpm_state.IsEndorsementHierarchyEnabled()); 248 EXPECT_TRUE(tpm_state.IsEnabled()); 249 EXPECT_TRUE(tpm_state.WasShutdownOrderly()); 250 } 251 252 TEST_F(TpmStateTest, BadResponsePermanentCapabilityType) { 253 permanent_data_.capability = 0xFFFFF; 254 TpmStateImpl tpm_state(factory_); 255 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 256 } 257 258 TEST_F(TpmStateTest, BadResponseStartupClearCapabilityType) { 259 startup_clear_data_.capability = 0xFFFFF; 260 TpmStateImpl tpm_state(factory_); 261 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 262 } 263 264 TEST_F(TpmStateTest, BadResponseLockoutCounterCapabilityType) { 265 lockout_counter_.capability = 0xFFFFF; 266 TpmStateImpl tpm_state(factory_); 267 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 268 } 269 270 TEST_F(TpmStateTest, BadResponseLockoutThresholdCapabilityType) { 271 lockout_threshold_.capability = 0xFFFFF; 272 TpmStateImpl tpm_state(factory_); 273 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 274 } 275 276 TEST_F(TpmStateTest, BadResponseLockoutIntervalCapabilityType) { 277 lockout_interval_.capability = 0xFFFFF; 278 TpmStateImpl tpm_state(factory_); 279 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 280 } 281 282 TEST_F(TpmStateTest, BadResponseLockoutRecoveryCapabilityType) { 283 lockout_recovery_.capability = 0xFFFFF; 284 TpmStateImpl tpm_state(factory_); 285 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 286 } 287 288 TEST_F(TpmStateTest, BadResponseRSAAlgCapabilityType) { 289 rsa_data_.capability = 0xFFFFF; 290 TpmStateImpl tpm_state(factory_); 291 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 292 } 293 294 TEST_F(TpmStateTest, BadResponseECCAlgCapabilityType) { 295 ecc_data_.capability = 0xFFFFF; 296 TpmStateImpl tpm_state(factory_); 297 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 298 } 299 300 TEST_F(TpmStateTest, BadResponsePermanentPropertyCount) { 301 permanent_data_.data.tpm_properties.count = 0; 302 TpmStateImpl tpm_state(factory_); 303 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 304 } 305 306 TEST_F(TpmStateTest, BadResponseStartupClearPropertyCount) { 307 startup_clear_data_.data.tpm_properties.count = 0; 308 TpmStateImpl tpm_state(factory_); 309 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 310 } 311 312 TEST_F(TpmStateTest, BadResponseLockoutCounterPropertyCount) { 313 lockout_counter_.data.tpm_properties.count = 0; 314 TpmStateImpl tpm_state(factory_); 315 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 316 } 317 318 TEST_F(TpmStateTest, BadResponseLockoutThresholdPropertyCount) { 319 lockout_threshold_.data.tpm_properties.count = 0; 320 TpmStateImpl tpm_state(factory_); 321 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 322 } 323 324 TEST_F(TpmStateTest, BadResponseLockoutIntervalPropertyCount) { 325 lockout_interval_.data.tpm_properties.count = 0; 326 TpmStateImpl tpm_state(factory_); 327 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 328 } 329 330 TEST_F(TpmStateTest, BadResponseLockoutRecoveryPropertyCount) { 331 lockout_recovery_.data.tpm_properties.count = 0; 332 TpmStateImpl tpm_state(factory_); 333 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 334 } 335 336 TEST_F(TpmStateTest, BadResponseRSAAlgPropertyCount) { 337 rsa_data_.data.algorithms.count = 0; 338 TpmStateImpl tpm_state(factory_); 339 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 340 } 341 342 TEST_F(TpmStateTest, BadResponseECCAlgPropertyCount) { 343 ecc_data_.data.algorithms.count = 0; 344 TpmStateImpl tpm_state(factory_); 345 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 346 } 347 348 TEST_F(TpmStateTest, BadResponsePermanentPropertyType) { 349 permanent_data_.data.tpm_properties.tpm_property[0].property = 0xFFFFF; 350 TpmStateImpl tpm_state(factory_); 351 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 352 } 353 354 TEST_F(TpmStateTest, BadResponseStartupClearPropertyType) { 355 startup_clear_data_.data.tpm_properties.tpm_property[0].property = 0xFFFFF; 356 TpmStateImpl tpm_state(factory_); 357 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 358 } 359 360 TEST_F(TpmStateTest, BadResponseLockoutCounterPropertyType) { 361 lockout_counter_.data.tpm_properties.tpm_property[0].property = 0xFFFFF; 362 TpmStateImpl tpm_state(factory_); 363 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 364 } 365 366 TEST_F(TpmStateTest, BadResponseLockoutThresholdPropertyType) { 367 lockout_threshold_.data.tpm_properties.tpm_property[0].property = 0xFFFFF; 368 TpmStateImpl tpm_state(factory_); 369 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 370 } 371 372 TEST_F(TpmStateTest, BadResponseLockoutIntervalPropertyType) { 373 lockout_interval_.data.tpm_properties.tpm_property[0].property = 0xFFFFF; 374 TpmStateImpl tpm_state(factory_); 375 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 376 } 377 378 TEST_F(TpmStateTest, BadResponseLockoutRecoveryPropertyType) { 379 lockout_recovery_.data.tpm_properties.tpm_property[0].property = 0xFFFFF; 380 TpmStateImpl tpm_state(factory_); 381 EXPECT_NE(TPM_RC_SUCCESS, tpm_state.Initialize()); 382 } 383 384 } // namespace trunks 385