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 <base/stl_util.h> 18 #include <crypto/sha2.h> 19 #include <gmock/gmock.h> 20 #include <gtest/gtest.h> 21 #include <openssl/aes.h> 22 23 #include "trunks/error_codes.h" 24 #include "trunks/hmac_authorization_delegate.h" 25 #include "trunks/mock_authorization_delegate.h" 26 #include "trunks/mock_blob_parser.h" 27 #include "trunks/mock_hmac_session.h" 28 #include "trunks/mock_policy_session.h" 29 #include "trunks/mock_tpm.h" 30 #include "trunks/mock_tpm_state.h" 31 #include "trunks/tpm_constants.h" 32 #include "trunks/tpm_utility_impl.h" 33 #include "trunks/trunks_factory_for_test.h" 34 35 using testing::_; 36 using testing::DoAll; 37 using testing::NiceMock; 38 using testing::Return; 39 using testing::SaveArg; 40 using testing::SetArgPointee; 41 42 namespace trunks { 43 44 // A test fixture for TpmUtility tests. 45 class TpmUtilityTest : public testing::Test { 46 public: 47 TpmUtilityTest() : utility_(factory_) {} 48 ~TpmUtilityTest() override {} 49 void SetUp() override { 50 factory_.set_blob_parser(&mock_blob_parser_); 51 factory_.set_tpm_state(&mock_tpm_state_); 52 factory_.set_tpm(&mock_tpm_); 53 factory_.set_hmac_session(&mock_hmac_session_); 54 factory_.set_policy_session(&mock_policy_session_); 55 } 56 57 TPM_RC ComputeKeyName(const TPMT_PUBLIC& public_area, 58 std::string* object_name) { 59 return utility_.ComputeKeyName(public_area, object_name); 60 } 61 62 void SetNVRAMMap(uint32_t index, 63 const TPMS_NV_PUBLIC& public_area) { 64 utility_.nvram_public_area_map_[index] = public_area; 65 } 66 67 TPM_RC GetNVRAMMap(uint32_t index, 68 TPMS_NV_PUBLIC* public_area) { 69 auto it = utility_.nvram_public_area_map_.find(index); 70 if (it == utility_.nvram_public_area_map_.end()) { 71 return TPM_RC_FAILURE; 72 } 73 *public_area = it->second; 74 return TPM_RC_SUCCESS; 75 } 76 77 TPM_RC SetKnownOwnerPassword(const std::string& owner_password) { 78 return utility_.SetKnownOwnerPassword(owner_password); 79 } 80 81 TPM_RC CreateStorageRootKeys(const std::string& owner_password) { 82 return utility_.CreateStorageRootKeys(owner_password); 83 } 84 85 TPM_RC CreateSaltingKey(const std::string& owner_password) { 86 return utility_.CreateSaltingKey(owner_password); 87 } 88 89 void SetExistingKeyHandleExpectation(TPM_HANDLE handle) { 90 TPMS_CAPABILITY_DATA capability_data = {}; 91 TPML_HANDLE& handles = capability_data.data.handles; 92 handles.count = 1; 93 handles.handle[0] = handle; 94 EXPECT_CALL(mock_tpm_, 95 GetCapabilitySync(TPM_CAP_HANDLES, handle, _, _, _, _)) 96 .WillRepeatedly( 97 DoAll(SetArgPointee<4>(capability_data), Return(TPM_RC_SUCCESS))); 98 } 99 100 void PopulatePCRSelection(bool has_sha1_pcrs, 101 bool make_sha1_bank_empty, 102 bool has_sha256_pcrs, 103 TPML_PCR_SELECTION* pcrs) { 104 memset(pcrs, 0, sizeof(TPML_PCR_SELECTION)); 105 // By convention fill SHA-256 first. This is a bit brittle because order is 106 // not important but it simplifies comparison to memcmp. 107 if (has_sha256_pcrs) { 108 pcrs->pcr_selections[pcrs->count].hash = TPM_ALG_SHA256; 109 pcrs->pcr_selections[pcrs->count].sizeof_select = PCR_SELECT_MIN; 110 for (int i = 0; i < PCR_SELECT_MIN; ++i) { 111 pcrs->pcr_selections[pcrs->count].pcr_select[i] = 0xff; 112 } 113 ++pcrs->count; 114 } 115 if (has_sha1_pcrs) { 116 pcrs->pcr_selections[pcrs->count].hash = TPM_ALG_SHA1; 117 if (make_sha1_bank_empty) { 118 pcrs->pcr_selections[pcrs->count].sizeof_select = PCR_SELECT_MAX; 119 } else { 120 pcrs->pcr_selections[pcrs->count].sizeof_select = PCR_SELECT_MIN; 121 for (int i = 0; i < PCR_SELECT_MIN; ++i) { 122 pcrs->pcr_selections[pcrs->count].pcr_select[i] = 0xff; 123 } 124 } 125 ++pcrs->count; 126 } 127 } 128 129 void SetExistingPCRSExpectation(bool has_sha1_pcrs, bool has_sha256_pcrs) { 130 TPMS_CAPABILITY_DATA capability_data = {}; 131 TPML_PCR_SELECTION& pcrs = capability_data.data.assigned_pcr; 132 PopulatePCRSelection(has_sha1_pcrs, false, has_sha256_pcrs, &pcrs); 133 EXPECT_CALL(mock_tpm_, 134 GetCapabilitySync(TPM_CAP_PCRS, _, _, _, _, _)) 135 .WillRepeatedly( 136 DoAll(SetArgPointee<4>(capability_data), Return(TPM_RC_SUCCESS))); 137 } 138 139 protected: 140 TrunksFactoryForTest factory_; 141 NiceMock<MockBlobParser> mock_blob_parser_; 142 NiceMock<MockTpmState> mock_tpm_state_; 143 NiceMock<MockTpm> mock_tpm_; 144 NiceMock<MockAuthorizationDelegate> mock_authorization_delegate_; 145 NiceMock<MockHmacSession> mock_hmac_session_; 146 NiceMock<MockPolicySession> mock_policy_session_; 147 TpmUtilityImpl utility_; 148 }; 149 150 TEST_F(TpmUtilityTest, StartupSuccess) { 151 EXPECT_EQ(TPM_RC_SUCCESS, utility_.Startup()); 152 } 153 154 TEST_F(TpmUtilityTest, StartupAlreadyStarted) { 155 EXPECT_CALL(mock_tpm_, StartupSync(_, _)) 156 .WillRepeatedly(Return(TPM_RC_INITIALIZE)); 157 EXPECT_EQ(TPM_RC_SUCCESS, utility_.Startup()); 158 } 159 160 TEST_F(TpmUtilityTest, StartupFailure) { 161 EXPECT_CALL(mock_tpm_, StartupSync(_, _)) 162 .WillRepeatedly(Return(TPM_RC_FAILURE)); 163 EXPECT_EQ(TPM_RC_FAILURE, utility_.Startup()); 164 } 165 166 TEST_F(TpmUtilityTest, StartupSelfTestFailure) { 167 EXPECT_CALL(mock_tpm_, SelfTestSync(_, _)) 168 .WillRepeatedly(Return(TPM_RC_FAILURE)); 169 EXPECT_EQ(TPM_RC_FAILURE, utility_.Startup()); 170 } 171 172 TEST_F(TpmUtilityTest, ClearSuccess) { 173 EXPECT_EQ(TPM_RC_SUCCESS, utility_.Clear()); 174 } 175 176 TEST_F(TpmUtilityTest, ClearAfterBadInit) { 177 EXPECT_CALL(mock_tpm_, ClearSync(_, _, _)) 178 .WillOnce(Return(TPM_RC_AUTH_MISSING)) 179 .WillOnce(Return(TPM_RC_SUCCESS)); 180 EXPECT_EQ(TPM_RC_SUCCESS, utility_.Clear()); 181 } 182 183 TEST_F(TpmUtilityTest, ClearFail) { 184 EXPECT_CALL(mock_tpm_, ClearSync(_, _, _)) 185 .WillOnce(Return(TPM_RC_FAILURE)); 186 EXPECT_EQ(TPM_RC_FAILURE, utility_.Clear()); 187 } 188 189 TEST_F(TpmUtilityTest, ShutdownTest) { 190 EXPECT_CALL(mock_tpm_, ShutdownSync(TPM_SU_CLEAR, _)); 191 utility_.Shutdown(); 192 } 193 194 TEST_F(TpmUtilityTest, InitializeTpmAlreadyInit) { 195 SetExistingPCRSExpectation(false, true); 196 EXPECT_EQ(TPM_RC_SUCCESS, utility_.InitializeTpm()); 197 EXPECT_EQ(TPM_RC_SUCCESS, utility_.InitializeTpm()); 198 } 199 200 TEST_F(TpmUtilityTest, InitializeTpmSuccess) { 201 SetExistingPCRSExpectation(false, true); 202 EXPECT_EQ(TPM_RC_SUCCESS, utility_.InitializeTpm()); 203 } 204 205 TEST_F(TpmUtilityTest, InitializeTpmBadAuth) { 206 SetExistingPCRSExpectation(false, true); 207 // Reject attempts to set platform auth. 208 EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_PLATFORM, _, _, _)) 209 .WillRepeatedly(Return(TPM_RC_FAILURE)); 210 EXPECT_EQ(TPM_RC_FAILURE, utility_.InitializeTpm()); 211 } 212 213 TEST_F(TpmUtilityTest, InitializeTpmDisablePHFails) { 214 SetExistingPCRSExpectation(false, true); 215 // Reject attempts to disable the platform hierarchy. 216 EXPECT_CALL(mock_tpm_, HierarchyControlSync(_, _, TPM_RH_PLATFORM, _, _)) 217 .WillRepeatedly(Return(TPM_RC_FAILURE)); 218 EXPECT_EQ(TPM_RC_FAILURE, utility_.InitializeTpm()); 219 } 220 221 TEST_F(TpmUtilityTest, AllocatePCRFromNone) { 222 SetExistingPCRSExpectation(false, false); 223 TPML_PCR_SELECTION new_pcr_allocation; 224 EXPECT_CALL(mock_tpm_, PCR_AllocateSync(TPM_RH_PLATFORM, _, _, _, _, _, _, _)) 225 .WillOnce(DoAll(SaveArg<2>(&new_pcr_allocation), 226 SetArgPointee<3>(YES), 227 Return(TPM_RC_SUCCESS))); 228 ASSERT_EQ(TPM_RC_SUCCESS, utility_.AllocatePCR("")); 229 ASSERT_EQ(1u, new_pcr_allocation.count); 230 TPML_PCR_SELECTION expected_pcr_allocation; 231 PopulatePCRSelection(false, false, true, &expected_pcr_allocation); 232 ASSERT_EQ(0, memcmp(&expected_pcr_allocation, &new_pcr_allocation, 233 sizeof(TPML_PCR_SELECTION))); 234 } 235 236 TEST_F(TpmUtilityTest, AllocatePCRFromSHA1Only) { 237 SetExistingPCRSExpectation(true, false); 238 TPML_PCR_SELECTION new_pcr_allocation; 239 EXPECT_CALL(mock_tpm_, PCR_AllocateSync(TPM_RH_PLATFORM, _, _, _, _, _, _, _)) 240 .WillOnce(DoAll(SaveArg<2>(&new_pcr_allocation), 241 SetArgPointee<3>(YES), 242 Return(TPM_RC_SUCCESS))); 243 ASSERT_EQ(TPM_RC_SUCCESS, utility_.AllocatePCR("")); 244 ASSERT_EQ(2u, new_pcr_allocation.count); 245 TPML_PCR_SELECTION expected_pcr_allocation; 246 PopulatePCRSelection(true, true, true, &expected_pcr_allocation); 247 ASSERT_EQ(0, memcmp(&expected_pcr_allocation, &new_pcr_allocation, 248 sizeof(TPML_PCR_SELECTION))); 249 } 250 251 TEST_F(TpmUtilityTest, AllocatePCRFromSHA1AndSHA256) { 252 SetExistingPCRSExpectation(true, true); 253 TPML_PCR_SELECTION new_pcr_allocation; 254 EXPECT_CALL(mock_tpm_, PCR_AllocateSync(TPM_RH_PLATFORM, _, _, _, _, _, _, _)) 255 .WillOnce(DoAll(SaveArg<2>(&new_pcr_allocation), 256 SetArgPointee<3>(YES), 257 Return(TPM_RC_SUCCESS))); 258 ASSERT_EQ(TPM_RC_SUCCESS, utility_.AllocatePCR("")); 259 ASSERT_EQ(1u, new_pcr_allocation.count); 260 TPML_PCR_SELECTION expected_pcr_allocation; 261 PopulatePCRSelection(true, true, false, &expected_pcr_allocation); 262 ASSERT_EQ(0, memcmp(&expected_pcr_allocation, &new_pcr_allocation, 263 sizeof(TPML_PCR_SELECTION))); 264 } 265 266 TEST_F(TpmUtilityTest, AllocatePCRFromSHA256Only) { 267 SetExistingPCRSExpectation(false, true); 268 EXPECT_CALL(mock_tpm_, PCR_AllocateSync(TPM_RH_PLATFORM, _, _, _, _, _, _, _)) 269 .Times(0); 270 ASSERT_EQ(TPM_RC_SUCCESS, utility_.AllocatePCR("")); 271 } 272 273 TEST_F(TpmUtilityTest, AllocatePCRCommandFailure) { 274 SetExistingPCRSExpectation(false, false); 275 EXPECT_CALL(mock_tpm_, PCR_AllocateSync(_, _, _, _, _, _, _, _)) 276 .WillOnce(Return(TPM_RC_FAILURE)); 277 EXPECT_EQ(TPM_RC_FAILURE, utility_.AllocatePCR("")); 278 } 279 280 TEST_F(TpmUtilityTest, AllocatePCRTpmFailure) { 281 SetExistingPCRSExpectation(false, false); 282 EXPECT_CALL(mock_tpm_, PCR_AllocateSync(_, _, _, _, _, _, _, _)) 283 .WillOnce(DoAll(SetArgPointee<3>(NO), 284 Return(TPM_RC_SUCCESS))); 285 EXPECT_EQ(TPM_RC_FAILURE, utility_.AllocatePCR("")); 286 } 287 288 TEST_F(TpmUtilityTest, TakeOwnershipSuccess) { 289 EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 290 .WillRepeatedly(Return(false)); 291 EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet()) 292 .WillRepeatedly(Return(false)); 293 EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet()) 294 .WillRepeatedly(Return(false)); 295 EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner", 296 "endorsement", 297 "lockout")); 298 } 299 300 TEST_F(TpmUtilityTest, TakeOwnershipOwnershipDone) { 301 EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner", 302 "endorsement", 303 "lockout")); 304 } 305 306 TEST_F(TpmUtilityTest, TakeOwnershipBadSession) { 307 EXPECT_CALL(mock_hmac_session_, StartUnboundSession(true)) 308 .WillRepeatedly(Return(TPM_RC_FAILURE)); 309 EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner", 310 "endorsement", 311 "lockout")); 312 } 313 314 TEST_F(TpmUtilityTest, TakeOwnershipFailure) { 315 EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _)) 316 .WillRepeatedly(Return(TPM_RC_FAILURE)); 317 EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner", 318 "endorsement", 319 "lockout")); 320 } 321 322 TEST_F(TpmUtilityTest, ChangeOwnerPasswordEndorsementDone) { 323 EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 324 .WillRepeatedly(Return(false)); 325 EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet()) 326 .WillRepeatedly(Return(false)); 327 EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner", 328 "endorsement", 329 "lockout")); 330 } 331 332 TEST_F(TpmUtilityTest, ChangeOwnerPasswordLockoutDone) { 333 EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 334 .WillRepeatedly(Return(false)); 335 EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet()) 336 .WillRepeatedly(Return(false)); 337 EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner", 338 "endorsement", 339 "lockout")); 340 } 341 342 TEST_F(TpmUtilityTest, ChangeOwnerPasswordEndorsementLockoutDone) { 343 EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 344 .WillRepeatedly(Return(false)); 345 EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner", 346 "endorsement", 347 "lockout")); 348 } 349 350 TEST_F(TpmUtilityTest, ChangeOwnerPasswordEndorsementFail) { 351 EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 352 .WillRepeatedly(Return(false)); 353 EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet()) 354 .WillRepeatedly(Return(false)); 355 EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(_, _, _, _)) 356 .WillRepeatedly(Return(TPM_RC_SUCCESS)); 357 EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_ENDORSEMENT, _, _, _)) 358 .WillRepeatedly(Return(TPM_RC_FAILURE)); 359 EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner", 360 "endorsement", 361 "lockout")); 362 } 363 364 TEST_F(TpmUtilityTest, ChangeOwnerPasswordLockoutFailure) { 365 EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 366 .WillRepeatedly(Return(false)); 367 EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet()) 368 .WillRepeatedly(Return(false)); 369 EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet()) 370 .WillRepeatedly(Return(false)); 371 EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(_, _, _, _)) 372 .WillRepeatedly(Return(TPM_RC_SUCCESS)); 373 EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_LOCKOUT, _, _, _)) 374 .WillRepeatedly(Return(TPM_RC_FAILURE)); 375 EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner", 376 "endorsement", 377 "lockout")); 378 } 379 380 TEST_F(TpmUtilityTest, StirRandomSuccess) { 381 std::string entropy_data("large test data", 100); 382 EXPECT_EQ(TPM_RC_SUCCESS, 383 utility_.StirRandom(entropy_data, &mock_authorization_delegate_)); 384 } 385 386 TEST_F(TpmUtilityTest, StirRandomFails) { 387 std::string entropy_data("test data"); 388 EXPECT_CALL(mock_tpm_, StirRandomSync(_, nullptr)) 389 .WillOnce(Return(TPM_RC_FAILURE)); 390 EXPECT_EQ(TPM_RC_FAILURE, utility_.StirRandom(entropy_data, nullptr)); 391 } 392 393 TEST_F(TpmUtilityTest, GenerateRandomSuccess) { 394 // This number is larger than the max bytes the GetRandom call can return. 395 // Therefore we expect software to make multiple calls to fill this many 396 // bytes. 397 size_t num_bytes = 72; 398 std::string random_data; 399 TPM2B_DIGEST large_random; 400 large_random.size = 32; 401 TPM2B_DIGEST small_random; 402 small_random.size = 8; 403 EXPECT_CALL(mock_tpm_, GetRandomSync(_, _, &mock_authorization_delegate_)) 404 .Times(2) 405 .WillRepeatedly(DoAll(SetArgPointee<1>(large_random), 406 Return(TPM_RC_SUCCESS))); 407 EXPECT_CALL(mock_tpm_, GetRandomSync(8, _, &mock_authorization_delegate_)) 408 .WillOnce(DoAll(SetArgPointee<1>(small_random), 409 Return(TPM_RC_SUCCESS))); 410 EXPECT_EQ(TPM_RC_SUCCESS, utility_.GenerateRandom( 411 num_bytes, &mock_authorization_delegate_, &random_data)); 412 EXPECT_EQ(num_bytes, random_data.size()); 413 } 414 415 TEST_F(TpmUtilityTest, GenerateRandomFails) { 416 size_t num_bytes = 5; 417 std::string random_data; 418 EXPECT_CALL(mock_tpm_, GetRandomSync(_, _, nullptr)) 419 .WillOnce(Return(TPM_RC_FAILURE)); 420 EXPECT_EQ(TPM_RC_FAILURE, 421 utility_.GenerateRandom(num_bytes, nullptr, &random_data)); 422 } 423 424 TEST_F(TpmUtilityTest, ExtendPCRSuccess) { 425 TPM_HANDLE pcr_handle = HR_PCR + 1; 426 TPML_DIGEST_VALUES digests; 427 EXPECT_CALL(mock_tpm_, 428 PCR_ExtendSync(pcr_handle, _, _, &mock_authorization_delegate_)) 429 .WillOnce(DoAll(SaveArg<2>(&digests), 430 Return(TPM_RC_SUCCESS))); 431 EXPECT_EQ(TPM_RC_SUCCESS, utility_.ExtendPCR(1, "test digest", 432 &mock_authorization_delegate_)); 433 EXPECT_EQ(1u, digests.count); 434 EXPECT_EQ(TPM_ALG_SHA256, digests.digests[0].hash_alg); 435 std::string hash_string = crypto::SHA256HashString("test digest"); 436 EXPECT_EQ(0, memcmp(hash_string.data(), 437 digests.digests[0].digest.sha256, 438 crypto::kSHA256Length)); 439 } 440 441 TEST_F(TpmUtilityTest, ExtendPCRFail) { 442 int pcr_index = 0; 443 TPM_HANDLE pcr_handle = HR_PCR + pcr_index; 444 EXPECT_CALL(mock_tpm_, PCR_ExtendSync(pcr_handle, _, _, _)) 445 .WillOnce(Return(TPM_RC_FAILURE)); 446 EXPECT_EQ(TPM_RC_FAILURE, 447 utility_.ExtendPCR(pcr_index, "test digest", nullptr)); 448 } 449 450 TEST_F(TpmUtilityTest, ExtendPCRBadParam) { 451 EXPECT_EQ(TPM_RC_FAILURE, utility_.ExtendPCR(-1, "test digest", nullptr)); 452 } 453 454 TEST_F(TpmUtilityTest, ReadPCRSuccess) { 455 // The |pcr_index| is chosen to match the structure for |pcr_select|. 456 // If you change |pcr_index|, remember to change |pcr_select|. 457 int pcr_index = 1; 458 std::string pcr_value; 459 TPML_PCR_SELECTION pcr_select; 460 pcr_select.count = 1; 461 pcr_select.pcr_selections[0].hash = TPM_ALG_SHA256; 462 pcr_select.pcr_selections[0].sizeof_select = 1; 463 pcr_select.pcr_selections[0].pcr_select[0] = 2; 464 TPML_DIGEST pcr_values; 465 pcr_values.count = 1; 466 pcr_values.digests[0].size = 5; 467 EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _)) 468 .WillOnce(DoAll(SetArgPointee<2>(pcr_select), 469 SetArgPointee<3>(pcr_values), 470 Return(TPM_RC_SUCCESS))); 471 EXPECT_EQ(TPM_RC_SUCCESS, utility_.ReadPCR(pcr_index, &pcr_value)); 472 } 473 474 TEST_F(TpmUtilityTest, ReadPCRFail) { 475 std::string pcr_value; 476 EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _)) 477 .WillOnce(Return(TPM_RC_FAILURE)); 478 EXPECT_EQ(TPM_RC_FAILURE, utility_.ReadPCR(1, &pcr_value)); 479 } 480 481 TEST_F(TpmUtilityTest, ReadPCRBadReturn) { 482 std::string pcr_value; 483 EXPECT_EQ(TPM_RC_FAILURE, utility_.ReadPCR(1, &pcr_value)); 484 } 485 486 TEST_F(TpmUtilityTest, AsymmetricEncryptSuccess) { 487 TPM_HANDLE key_handle; 488 std::string plaintext; 489 std::string output_ciphertext("ciphertext"); 490 std::string ciphertext; 491 TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA( 492 output_ciphertext); 493 TPM2B_PUBLIC public_area; 494 public_area.public_area.type = TPM_ALG_RSA; 495 public_area.public_area.object_attributes = kDecrypt; 496 public_area.public_area.auth_policy.size = 0; 497 public_area.public_area.unique.rsa.size = 0; 498 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 499 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 500 Return(TPM_RC_SUCCESS))); 501 EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, 502 &mock_authorization_delegate_)) 503 .WillOnce(DoAll(SetArgPointee<5>(out_message), 504 Return(TPM_RC_SUCCESS))); 505 EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricEncrypt( 506 key_handle, 507 TPM_ALG_NULL, 508 TPM_ALG_NULL, 509 plaintext, 510 &mock_authorization_delegate_, 511 &ciphertext)); 512 EXPECT_EQ(0, ciphertext.compare(output_ciphertext)); 513 } 514 515 TEST_F(TpmUtilityTest, AsymmetricEncryptFail) { 516 TPM_HANDLE key_handle; 517 std::string plaintext; 518 std::string ciphertext; 519 TPM2B_PUBLIC public_area; 520 public_area.public_area.type = TPM_ALG_RSA; 521 public_area.public_area.object_attributes = kDecrypt; 522 public_area.public_area.auth_policy.size = 0; 523 public_area.public_area.unique.rsa.size = 0; 524 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 525 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 526 Return(TPM_RC_SUCCESS))); 527 EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, nullptr)) 528 .WillOnce(Return(TPM_RC_FAILURE)); 529 EXPECT_EQ(TPM_RC_FAILURE, utility_.AsymmetricEncrypt(key_handle, 530 TPM_ALG_NULL, 531 TPM_ALG_NULL, 532 plaintext, 533 nullptr, 534 &ciphertext)); 535 } 536 537 TEST_F(TpmUtilityTest, AsymmetricEncryptBadParams) { 538 TPM_HANDLE key_handle = TPM_RH_FIRST; 539 std::string plaintext; 540 std::string ciphertext; 541 TPM2B_PUBLIC public_area; 542 public_area.public_area.type = TPM_ALG_RSA; 543 public_area.public_area.object_attributes = kDecrypt | kRestricted; 544 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, nullptr)) 545 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 546 Return(TPM_RC_SUCCESS))); 547 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.AsymmetricEncrypt(key_handle, 548 TPM_ALG_RSAES, 549 TPM_ALG_NULL, 550 plaintext, 551 nullptr, 552 &ciphertext)); 553 } 554 555 TEST_F(TpmUtilityTest, AsymmetricEncryptNullSchemeForward) { 556 TPM_HANDLE key_handle; 557 std::string plaintext; 558 std::string output_ciphertext("ciphertext"); 559 std::string ciphertext; 560 TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA( 561 output_ciphertext); 562 TPM2B_PUBLIC public_area; 563 public_area.public_area.type = TPM_ALG_RSA; 564 public_area.public_area.object_attributes = kDecrypt; 565 public_area.public_area.auth_policy.size = 0; 566 public_area.public_area.unique.rsa.size = 0; 567 TPMT_RSA_DECRYPT scheme; 568 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 569 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 570 Return(TPM_RC_SUCCESS))); 571 EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, nullptr)) 572 .WillOnce(DoAll(SetArgPointee<5>(out_message), 573 SaveArg<3>(&scheme), 574 Return(TPM_RC_SUCCESS))); 575 EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricEncrypt(key_handle, 576 TPM_ALG_NULL, 577 TPM_ALG_NULL, 578 plaintext, 579 nullptr, 580 &ciphertext)); 581 EXPECT_EQ(scheme.scheme, TPM_ALG_OAEP); 582 EXPECT_EQ(scheme.details.oaep.hash_alg, TPM_ALG_SHA256); 583 } 584 585 TEST_F(TpmUtilityTest, AsymmetricEncryptSchemeForward) { 586 TPM_HANDLE key_handle; 587 std::string plaintext; 588 std::string output_ciphertext("ciphertext"); 589 std::string ciphertext; 590 TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA( 591 output_ciphertext); 592 TPM2B_PUBLIC public_area; 593 public_area.public_area.type = TPM_ALG_RSA; 594 public_area.public_area.object_attributes = kDecrypt; 595 public_area.public_area.auth_policy.size = 0; 596 public_area.public_area.unique.rsa.size = 0; 597 TPMT_RSA_DECRYPT scheme; 598 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 599 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 600 Return(TPM_RC_SUCCESS))); 601 EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, nullptr)) 602 .WillOnce(DoAll(SetArgPointee<5>(out_message), 603 SaveArg<3>(&scheme), 604 Return(TPM_RC_SUCCESS))); 605 EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricEncrypt(key_handle, 606 TPM_ALG_RSAES, 607 TPM_ALG_NULL, 608 plaintext, 609 nullptr, 610 &ciphertext)); 611 EXPECT_EQ(scheme.scheme, TPM_ALG_RSAES); 612 } 613 614 TEST_F(TpmUtilityTest, AsymmetricDecryptSuccess) { 615 TPM_HANDLE key_handle; 616 std::string plaintext; 617 std::string output_plaintext("plaintext"); 618 std::string ciphertext; 619 std::string password("password"); 620 TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA( 621 output_plaintext); 622 TPM2B_PUBLIC public_area; 623 public_area.public_area.type = TPM_ALG_RSA; 624 public_area.public_area.object_attributes = kDecrypt; 625 public_area.public_area.auth_policy.size = 0; 626 public_area.public_area.unique.rsa.size = 0; 627 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 628 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 629 Return(TPM_RC_SUCCESS))); 630 EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, 631 &mock_authorization_delegate_)) 632 .WillOnce(DoAll(SetArgPointee<5>(out_message), 633 Return(TPM_RC_SUCCESS))); 634 EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricDecrypt( 635 key_handle, 636 TPM_ALG_NULL, 637 TPM_ALG_NULL, 638 ciphertext, 639 &mock_authorization_delegate_, 640 &plaintext)); 641 EXPECT_EQ(0, plaintext.compare(output_plaintext)); 642 } 643 644 TEST_F(TpmUtilityTest, AsymmetricDecryptFail) { 645 TPM_HANDLE key_handle; 646 std::string key_name; 647 std::string plaintext; 648 std::string ciphertext; 649 std::string password; 650 TPM2B_PUBLIC public_area; 651 public_area.public_area.type = TPM_ALG_RSA; 652 public_area.public_area.object_attributes = kDecrypt; 653 public_area.public_area.auth_policy.size = 0; 654 public_area.public_area.unique.rsa.size = 0; 655 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 656 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 657 Return(TPM_RC_SUCCESS))); 658 EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _)) 659 .WillOnce(Return(TPM_RC_FAILURE)); 660 EXPECT_EQ(TPM_RC_FAILURE, utility_.AsymmetricDecrypt( 661 key_handle, 662 TPM_ALG_NULL, 663 TPM_ALG_NULL, 664 ciphertext, 665 &mock_authorization_delegate_, 666 &plaintext)); 667 } 668 669 TEST_F(TpmUtilityTest, AsymmetricDecryptBadParams) { 670 TPM_HANDLE key_handle = TPM_RH_FIRST; 671 std::string plaintext; 672 std::string ciphertext; 673 TPM2B_PUBLIC public_area; 674 public_area.public_area.type = TPM_ALG_RSA; 675 public_area.public_area.object_attributes = kDecrypt | kRestricted; 676 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 677 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 678 Return(TPM_RC_SUCCESS))); 679 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.AsymmetricDecrypt( 680 key_handle, 681 TPM_ALG_RSAES, 682 TPM_ALG_NULL, 683 ciphertext, 684 &mock_authorization_delegate_, 685 &plaintext)); 686 } 687 688 TEST_F(TpmUtilityTest, AsymmetricDecryptBadSession) { 689 TPM_HANDLE key_handle = TPM_RH_FIRST; 690 std::string key_name; 691 std::string plaintext; 692 std::string ciphertext; 693 std::string password; 694 EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.AsymmetricDecrypt( 695 key_handle, TPM_ALG_RSAES, TPM_ALG_NULL, 696 ciphertext, nullptr, &plaintext)); 697 } 698 699 TEST_F(TpmUtilityTest, AsymmetricDecryptNullSchemeForward) { 700 TPM_HANDLE key_handle; 701 std::string plaintext; 702 std::string output_plaintext("plaintext"); 703 std::string ciphertext; 704 std::string password; 705 TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA( 706 output_plaintext); 707 TPM2B_PUBLIC public_area; 708 public_area.public_area.type = TPM_ALG_RSA; 709 public_area.public_area.object_attributes = kDecrypt; 710 public_area.public_area.auth_policy.size = 0; 711 public_area.public_area.unique.rsa.size = 0; 712 TPMT_RSA_DECRYPT scheme; 713 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 714 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 715 Return(TPM_RC_SUCCESS))); 716 EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _)) 717 .WillOnce(DoAll(SetArgPointee<5>(out_message), 718 SaveArg<3>(&scheme), 719 Return(TPM_RC_SUCCESS))); 720 EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricDecrypt( 721 key_handle, 722 TPM_ALG_NULL, 723 TPM_ALG_NULL, 724 ciphertext, 725 &mock_authorization_delegate_, 726 &plaintext)); 727 EXPECT_EQ(scheme.scheme, TPM_ALG_OAEP); 728 EXPECT_EQ(scheme.details.oaep.hash_alg, TPM_ALG_SHA256); 729 } 730 731 TEST_F(TpmUtilityTest, AsymmetricDecryptSchemeForward) { 732 TPM_HANDLE key_handle; 733 std::string plaintext; 734 std::string output_plaintext("plaintext"); 735 std::string ciphertext; 736 std::string password; 737 TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA( 738 output_plaintext); 739 TPM2B_PUBLIC public_area; 740 public_area.public_area.type = TPM_ALG_RSA; 741 public_area.public_area.object_attributes = kDecrypt; 742 public_area.public_area.auth_policy.size = 0; 743 public_area.public_area.unique.rsa.size = 0; 744 TPMT_RSA_DECRYPT scheme; 745 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 746 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 747 Return(TPM_RC_SUCCESS))); 748 EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _)) 749 .WillOnce(DoAll(SetArgPointee<5>(out_message), 750 SaveArg<3>(&scheme), 751 Return(TPM_RC_SUCCESS))); 752 EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricDecrypt( 753 key_handle, 754 TPM_ALG_RSAES, 755 TPM_ALG_NULL, 756 ciphertext, 757 &mock_authorization_delegate_, 758 &plaintext)); 759 EXPECT_EQ(scheme.scheme, TPM_ALG_RSAES); 760 } 761 762 TEST_F(TpmUtilityTest, SignSuccess) { 763 TPM_HANDLE key_handle; 764 std::string password("password"); 765 std::string digest(32, 'a'); 766 TPMT_SIGNATURE signature_out; 767 signature_out.signature.rsassa.sig.size = 2; 768 signature_out.signature.rsassa.sig.buffer[0] = 'h'; 769 signature_out.signature.rsassa.sig.buffer[1] = 'i'; 770 std::string signature; 771 TPM2B_PUBLIC public_area; 772 public_area.public_area.type = TPM_ALG_RSA; 773 public_area.public_area.object_attributes = kSign; 774 public_area.public_area.auth_policy.size = 0; 775 public_area.public_area.unique.rsa.size = 0; 776 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 777 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 778 Return(TPM_RC_SUCCESS))); 779 EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, 780 &mock_authorization_delegate_)) 781 .WillOnce(DoAll(SetArgPointee<5>(signature_out), 782 Return(TPM_RC_SUCCESS))); 783 EXPECT_EQ(TPM_RC_SUCCESS, utility_.Sign(key_handle, 784 TPM_ALG_NULL, 785 TPM_ALG_NULL, 786 digest, 787 &mock_authorization_delegate_, 788 &signature)); 789 EXPECT_EQ(0, signature.compare("hi")); 790 } 791 792 TEST_F(TpmUtilityTest, SignFail) { 793 TPM_HANDLE key_handle; 794 std::string password; 795 std::string digest(32, 'a'); 796 std::string signature; 797 TPM2B_PUBLIC public_area; 798 public_area.public_area.type = TPM_ALG_RSA; 799 public_area.public_area.object_attributes = kSign; 800 public_area.public_area.auth_policy.size = 0; 801 public_area.public_area.unique.rsa.size = 0; 802 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 803 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 804 Return(TPM_RC_SUCCESS))); 805 EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _)) 806 .WillOnce(Return(TPM_RC_FAILURE)); 807 EXPECT_EQ(TPM_RC_FAILURE, utility_.Sign(key_handle, 808 TPM_ALG_NULL, 809 TPM_ALG_NULL, 810 digest, 811 &mock_authorization_delegate_, 812 &signature)); 813 } 814 815 TEST_F(TpmUtilityTest, SignBadParams1) { 816 TPM_HANDLE key_handle; 817 std::string password; 818 std::string digest(32, 'a'); 819 std::string signature; 820 TPM2B_PUBLIC public_area; 821 public_area.public_area.type = TPM_ALG_RSA; 822 public_area.public_area.object_attributes = kSign | kRestricted; 823 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 824 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 825 Return(TPM_RC_SUCCESS))); 826 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle, 827 TPM_ALG_RSAPSS, 828 TPM_ALG_NULL, 829 digest, 830 &mock_authorization_delegate_, 831 &signature)); 832 } 833 834 TEST_F(TpmUtilityTest, SignBadAuthorizationSession) { 835 TPM_HANDLE key_handle = TPM_RH_FIRST; 836 std::string password; 837 std::string digest(32, 'a'); 838 std::string signature; 839 EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.Sign(key_handle, 840 TPM_ALG_RSAPSS, 841 TPM_ALG_NULL, 842 digest, 843 nullptr, 844 &signature)); 845 } 846 847 TEST_F(TpmUtilityTest, SignBadParams2) { 848 TPM_HANDLE key_handle; 849 std::string password; 850 std::string digest(32, 'a'); 851 std::string signature; 852 TPM2B_PUBLIC public_area; 853 public_area.public_area.type = TPM_ALG_RSA; 854 public_area.public_area.object_attributes = kDecrypt; 855 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 856 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 857 Return(TPM_RC_SUCCESS))); 858 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle, 859 TPM_ALG_RSAPSS, 860 TPM_ALG_NULL, 861 digest, 862 &mock_authorization_delegate_, 863 &signature)); 864 } 865 866 TEST_F(TpmUtilityTest, SignBadParams3) { 867 TPM_HANDLE key_handle; 868 std::string password; 869 std::string digest(32, 'a'); 870 std::string signature; 871 TPM2B_PUBLIC public_area; 872 public_area.public_area.type = TPM_ALG_ECC; 873 public_area.public_area.object_attributes = kSign; 874 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 875 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 876 Return(TPM_RC_SUCCESS))); 877 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle, 878 TPM_ALG_RSAPSS, 879 TPM_ALG_NULL, 880 digest, 881 &mock_authorization_delegate_, 882 &signature)); 883 } 884 885 TEST_F(TpmUtilityTest, SignBadParams4) { 886 TPM_HANDLE key_handle; 887 std::string password; 888 std::string digest(32, 'a'); 889 std::string signature; 890 TPM2B_PUBLIC public_area; 891 public_area.public_area.type = TPM_ALG_RSA; 892 public_area.public_area.object_attributes = kSign; 893 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 894 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 895 Return(TPM_RC_FAILURE))); 896 EXPECT_EQ(TPM_RC_FAILURE, utility_.Sign(key_handle, 897 TPM_ALG_RSAPSS, 898 TPM_ALG_NULL, 899 digest, 900 &mock_authorization_delegate_, 901 &signature)); 902 } 903 904 TEST_F(TpmUtilityTest, SignBadParams5) { 905 TPM_HANDLE key_handle = 0; 906 std::string password; 907 std::string digest(32, 'a'); 908 std::string signature; 909 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle, 910 TPM_ALG_AES, 911 TPM_ALG_NULL, 912 digest, 913 &mock_authorization_delegate_, 914 &signature)); 915 } 916 917 918 TEST_F(TpmUtilityTest, SignNullSchemeForward) { 919 TPM_HANDLE key_handle; 920 std::string password; 921 std::string digest(32, 'a'); 922 TPMT_SIGNATURE signature_out; 923 signature_out.signature.rsassa.sig.size = 0; 924 std::string signature; 925 TPM2B_PUBLIC public_area; 926 TPMT_SIG_SCHEME scheme; 927 public_area.public_area.type = TPM_ALG_RSA; 928 public_area.public_area.object_attributes = kSign; 929 public_area.public_area.auth_policy.size = 0; 930 public_area.public_area.unique.rsa.size = 0; 931 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 932 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 933 Return(TPM_RC_SUCCESS))); 934 EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _)) 935 .WillOnce(DoAll(SetArgPointee<5>(signature_out), 936 SaveArg<3>(&scheme), 937 Return(TPM_RC_SUCCESS))); 938 EXPECT_EQ(TPM_RC_SUCCESS, utility_.Sign(key_handle, 939 TPM_ALG_NULL, 940 TPM_ALG_NULL, 941 digest, 942 &mock_authorization_delegate_, 943 &signature)); 944 EXPECT_EQ(scheme.scheme, TPM_ALG_RSASSA); 945 EXPECT_EQ(scheme.details.rsassa.hash_alg, TPM_ALG_SHA256); 946 } 947 948 TEST_F(TpmUtilityTest, SignSchemeForward) { 949 TPM_HANDLE key_handle; 950 std::string password; 951 std::string digest(64, 'a'); 952 TPMT_SIGNATURE signature_out; 953 signature_out.signature.rsassa.sig.size = 0; 954 std::string signature; 955 TPM2B_PUBLIC public_area; 956 TPMT_SIG_SCHEME scheme; 957 public_area.public_area.type = TPM_ALG_RSA; 958 public_area.public_area.object_attributes = kSign; 959 public_area.public_area.auth_policy.size = 0; 960 public_area.public_area.unique.rsa.size = 0; 961 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 962 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 963 Return(TPM_RC_SUCCESS))); 964 EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _)) 965 .WillOnce(DoAll(SetArgPointee<5>(signature_out), 966 SaveArg<3>(&scheme), 967 Return(TPM_RC_SUCCESS))); 968 EXPECT_EQ(TPM_RC_SUCCESS, utility_.Sign(key_handle, 969 TPM_ALG_RSAPSS, 970 TPM_ALG_SHA1, 971 digest, 972 &mock_authorization_delegate_, 973 &signature)); 974 EXPECT_EQ(scheme.scheme, TPM_ALG_RSAPSS); 975 EXPECT_EQ(scheme.details.rsapss.hash_alg, TPM_ALG_SHA1); 976 } 977 978 TEST_F(TpmUtilityTest, VerifySuccess) { 979 TPM_HANDLE key_handle; 980 std::string digest(32, 'a'); 981 std::string signature; 982 TPM2B_PUBLIC public_area; 983 public_area.public_area.type = TPM_ALG_RSA; 984 public_area.public_area.object_attributes = kSign; 985 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 986 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 987 Return(TPM_RC_SUCCESS))); 988 EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _)) 989 .WillOnce(Return(TPM_RC_SUCCESS)); 990 EXPECT_EQ(TPM_RC_SUCCESS, utility_.Verify(key_handle, 991 TPM_ALG_NULL, 992 TPM_ALG_NULL, 993 digest, 994 signature, 995 nullptr)); 996 } 997 998 TEST_F(TpmUtilityTest, VerifyFail) { 999 TPM_HANDLE key_handle; 1000 std::string digest(32, 'a'); 1001 std::string signature; 1002 TPM2B_PUBLIC public_area; 1003 public_area.public_area.type = TPM_ALG_RSA; 1004 public_area.public_area.object_attributes = kSign; 1005 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1006 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1007 Return(TPM_RC_SUCCESS))); 1008 EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _)) 1009 .WillOnce(Return(TPM_RC_FAILURE)); 1010 EXPECT_EQ(TPM_RC_FAILURE, utility_.Verify(key_handle, 1011 TPM_ALG_NULL, 1012 TPM_ALG_NULL, 1013 digest, 1014 signature, 1015 nullptr)); 1016 } 1017 1018 TEST_F(TpmUtilityTest, VerifyBadParams1) { 1019 TPM_HANDLE key_handle; 1020 std::string digest(32, 'a'); 1021 std::string signature; 1022 TPM2B_PUBLIC public_area; 1023 public_area.public_area.type = TPM_ALG_RSA; 1024 public_area.public_area.object_attributes = kSign | kRestricted; 1025 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1026 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1027 Return(TPM_RC_SUCCESS))); 1028 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle, 1029 TPM_ALG_NULL, 1030 TPM_ALG_NULL, 1031 digest, 1032 signature, 1033 nullptr)); 1034 } 1035 1036 TEST_F(TpmUtilityTest, VerifyBadParams2) { 1037 TPM_HANDLE key_handle; 1038 std::string digest(32, 'a'); 1039 std::string signature; 1040 TPM2B_PUBLIC public_area; 1041 public_area.public_area.type = TPM_ALG_RSA; 1042 public_area.public_area.object_attributes = kDecrypt; 1043 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1044 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1045 Return(TPM_RC_SUCCESS))); 1046 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle, 1047 TPM_ALG_NULL, 1048 TPM_ALG_NULL, 1049 digest, 1050 signature, 1051 nullptr)); 1052 } 1053 1054 TEST_F(TpmUtilityTest, VerifyBadParams3) { 1055 TPM_HANDLE key_handle; 1056 std::string digest(32, 'a'); 1057 std::string signature; 1058 TPM2B_PUBLIC public_area; 1059 public_area.public_area.type = TPM_ALG_ECC; 1060 public_area.public_area.object_attributes = kSign; 1061 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1062 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1063 Return(TPM_RC_SUCCESS))); 1064 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle, 1065 TPM_ALG_NULL, 1066 TPM_ALG_NULL, 1067 digest, 1068 signature, 1069 nullptr)); 1070 } 1071 1072 TEST_F(TpmUtilityTest, VerifyBadParams4) { 1073 TPM_HANDLE key_handle; 1074 std::string digest(32, 'a'); 1075 std::string signature; 1076 TPM2B_PUBLIC public_area; 1077 public_area.public_area.type = TPM_ALG_RSA; 1078 public_area.public_area.object_attributes = kSign; 1079 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1080 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1081 Return(TPM_RC_FAILURE))); 1082 EXPECT_EQ(TPM_RC_FAILURE, utility_.Verify(key_handle, 1083 TPM_ALG_NULL, 1084 TPM_ALG_NULL, 1085 digest, 1086 signature, 1087 nullptr)); 1088 } 1089 1090 TEST_F(TpmUtilityTest, VerifyBadParams5) { 1091 TPM_HANDLE key_handle; 1092 std::string digest(32, 'a'); 1093 std::string signature; 1094 TPM2B_PUBLIC public_area; 1095 public_area.public_area.type = TPM_ALG_RSA; 1096 public_area.public_area.object_attributes = kSign; 1097 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1098 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1099 Return(TPM_RC_SUCCESS))); 1100 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle, 1101 TPM_ALG_AES, 1102 TPM_ALG_NULL, 1103 digest, 1104 signature, 1105 nullptr)); 1106 } 1107 1108 TEST_F(TpmUtilityTest, VerifyNullSchemeForward) { 1109 TPM_HANDLE key_handle; 1110 std::string digest(32, 'a'); 1111 std::string signature; 1112 TPM2B_PUBLIC public_area; 1113 TPMT_SIGNATURE signature_in; 1114 public_area.public_area.type = TPM_ALG_RSA; 1115 public_area.public_area.object_attributes = kSign; 1116 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1117 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1118 Return(TPM_RC_SUCCESS))); 1119 EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _)) 1120 .WillOnce(DoAll(SaveArg<3>(&signature_in), 1121 Return(TPM_RC_SUCCESS))); 1122 EXPECT_EQ(TPM_RC_SUCCESS, utility_.Verify(key_handle, 1123 TPM_ALG_NULL, 1124 TPM_ALG_NULL, 1125 digest, 1126 signature, 1127 nullptr)); 1128 EXPECT_EQ(signature_in.sig_alg, TPM_ALG_RSASSA); 1129 EXPECT_EQ(signature_in.signature.rsassa.hash, TPM_ALG_SHA256); 1130 } 1131 1132 TEST_F(TpmUtilityTest, VerifySchemeForward) { 1133 TPM_HANDLE key_handle; 1134 std::string digest(64, 'a'); 1135 std::string signature; 1136 TPM2B_PUBLIC public_area; 1137 TPMT_SIGNATURE signature_in; 1138 public_area.public_area.type = TPM_ALG_RSA; 1139 public_area.public_area.object_attributes = kSign; 1140 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1141 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1142 Return(TPM_RC_SUCCESS))); 1143 EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _)) 1144 .WillOnce(DoAll(SaveArg<3>(&signature_in), 1145 Return(TPM_RC_SUCCESS))); 1146 EXPECT_EQ(TPM_RC_SUCCESS, utility_.Verify(key_handle, 1147 TPM_ALG_RSAPSS, 1148 TPM_ALG_SHA1, 1149 digest, 1150 signature, 1151 nullptr)); 1152 EXPECT_EQ(signature_in.sig_alg, TPM_ALG_RSAPSS); 1153 EXPECT_EQ(signature_in.signature.rsassa.hash, TPM_ALG_SHA1); 1154 } 1155 1156 TEST_F(TpmUtilityTest, CertifyCreationSuccess) { 1157 TPM_HANDLE key_handle = 42; 1158 std::string creation_blob; 1159 EXPECT_CALL(mock_tpm_, CertifyCreationSyncShort(TPM_RH_NULL, key_handle, 1160 _, _, _, _, _, _, _)) 1161 .WillOnce(Return(TPM_RC_SUCCESS)); 1162 EXPECT_EQ(TPM_RC_SUCCESS, 1163 utility_.CertifyCreation(key_handle, creation_blob)); 1164 } 1165 1166 TEST_F(TpmUtilityTest, CertifyCreationParserError) { 1167 TPM_HANDLE key_handle = 42; 1168 std::string creation_blob; 1169 EXPECT_CALL(mock_blob_parser_, ParseCreationBlob(creation_blob, _, _, _)) 1170 .WillOnce(Return(false)); 1171 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, 1172 utility_.CertifyCreation(key_handle, creation_blob)); 1173 } 1174 1175 TEST_F(TpmUtilityTest, CertifyCreationFailure) { 1176 TPM_HANDLE key_handle = 42; 1177 std::string creation_blob; 1178 EXPECT_CALL(mock_tpm_, CertifyCreationSyncShort(TPM_RH_NULL, key_handle, 1179 _, _, _, _, _, _, _)) 1180 .WillOnce(Return(TPM_RC_FAILURE)); 1181 EXPECT_EQ(TPM_RC_FAILURE, 1182 utility_.CertifyCreation(key_handle, creation_blob)); 1183 } 1184 1185 TEST_F(TpmUtilityTest, ChangeAuthDataSuccess) { 1186 TPM_HANDLE key_handle = 1; 1187 std::string new_password; 1188 std::string key_blob; 1189 TPM2B_PUBLIC public_area; 1190 public_area.public_area.type = TPM_ALG_RSA; 1191 public_area.public_area.auth_policy.size = 0; 1192 public_area.public_area.unique.rsa.size = 0; 1193 EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _)) 1194 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1195 Return(TPM_RC_SUCCESS))); 1196 EXPECT_EQ(TPM_RC_SUCCESS, utility_.ChangeKeyAuthorizationData( 1197 key_handle, new_password, &mock_authorization_delegate_, &key_blob)); 1198 } 1199 1200 TEST_F(TpmUtilityTest, ChangeAuthDataKeyNameFail) { 1201 TPM_HANDLE key_handle = 1; 1202 std::string old_password; 1203 std::string new_password; 1204 EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1205 .WillOnce(Return(TPM_RC_FAILURE)); 1206 EXPECT_EQ(TPM_RC_FAILURE, utility_.ChangeKeyAuthorizationData( 1207 key_handle, new_password, &mock_authorization_delegate_, nullptr)); 1208 } 1209 1210 TEST_F(TpmUtilityTest, ChangeAuthDataFailure) { 1211 TPM_HANDLE key_handle = 1; 1212 std::string new_password; 1213 EXPECT_CALL(mock_tpm_, ObjectChangeAuthSync(key_handle, _, _, _, _, _, _)) 1214 .WillOnce(Return(TPM_RC_FAILURE)); 1215 EXPECT_EQ(TPM_RC_FAILURE, utility_.ChangeKeyAuthorizationData( 1216 key_handle, new_password, &mock_authorization_delegate_, nullptr)); 1217 } 1218 1219 TEST_F(TpmUtilityTest, ChangeAuthDataParserFail) { 1220 TPM_HANDLE key_handle = 1; 1221 std::string new_password; 1222 std::string key_blob; 1223 TPM2B_PUBLIC public_area; 1224 public_area.public_area.type = TPM_ALG_RSA; 1225 public_area.public_area.auth_policy.size = 0; 1226 public_area.public_area.unique.rsa.size = 0; 1227 EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _)) 1228 .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1229 Return(TPM_RC_SUCCESS))); 1230 EXPECT_CALL(mock_blob_parser_, SerializeKeyBlob(_, _, &key_blob)) 1231 .WillOnce(Return(false)); 1232 EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.ChangeKeyAuthorizationData( 1233 key_handle, new_password, &mock_authorization_delegate_, &key_blob)); 1234 } 1235 1236 TEST_F(TpmUtilityTest, ImportRSAKeySuccess) { 1237 uint32_t public_exponent = 0x10001; 1238 std::string modulus(256, 'a'); 1239 std::string prime_factor(128, 'b'); 1240 std::string password("password"); 1241 std::string key_blob; 1242 TPM2B_DATA encryption_key; 1243 TPM2B_PUBLIC public_data; 1244 TPM2B_PRIVATE private_data; 1245 EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _)) 1246 .WillOnce(DoAll(SaveArg<2>(&encryption_key), 1247 SaveArg<3>(&public_data), 1248 SaveArg<4>(&private_data), 1249 Return(TPM_RC_SUCCESS))); 1250 EXPECT_EQ(TPM_RC_SUCCESS, utility_.ImportRSAKey( 1251 TpmUtility::AsymmetricKeyUsage::kDecryptKey, 1252 modulus, 1253 public_exponent, 1254 prime_factor, 1255 password, 1256 &mock_authorization_delegate_, 1257 &key_blob)); 1258 // Validate that the public area was properly constructed. 1259 EXPECT_EQ(public_data.public_area.parameters.rsa_detail.key_bits, 1260 modulus.size() * 8); 1261 EXPECT_EQ(public_data.public_area.parameters.rsa_detail.exponent, 1262 public_exponent); 1263 EXPECT_EQ(public_data.public_area.unique.rsa.size, modulus.size()); 1264 EXPECT_EQ(0, memcmp(public_data.public_area.unique.rsa.buffer, 1265 modulus.data(), modulus.size())); 1266 // Validate the private struct construction. 1267 EXPECT_EQ(kAesKeySize, encryption_key.size); 1268 AES_KEY key; 1269 AES_set_encrypt_key(encryption_key.buffer, kAesKeySize * 8, &key); 1270 unsigned char iv[MAX_AES_BLOCK_SIZE_BYTES] = {0}; 1271 int iv_in = 0; 1272 std::string unencrypted_private(private_data.size, 0); 1273 AES_cfb128_encrypt( 1274 reinterpret_cast<const unsigned char*>(private_data.buffer), 1275 reinterpret_cast<unsigned char*>(string_as_array(&unencrypted_private)), 1276 private_data.size, &key, iv, &iv_in, AES_DECRYPT); 1277 TPM2B_DIGEST inner_integrity; 1278 EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPM2B_DIGEST(&unencrypted_private, 1279 &inner_integrity, nullptr)); 1280 std::string object_name; 1281 EXPECT_EQ(TPM_RC_SUCCESS, 1282 ComputeKeyName(public_data.public_area, &object_name)); 1283 std::string integrity_value = crypto::SHA256HashString(unencrypted_private + 1284 object_name); 1285 EXPECT_EQ(integrity_value.size(), inner_integrity.size); 1286 EXPECT_EQ(0, memcmp(inner_integrity.buffer, 1287 integrity_value.data(), 1288 inner_integrity.size)); 1289 TPM2B_SENSITIVE sensitive_data; 1290 EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPM2B_SENSITIVE(&unencrypted_private, 1291 &sensitive_data, nullptr)); 1292 EXPECT_EQ(sensitive_data.sensitive_area.auth_value.size, password.size()); 1293 EXPECT_EQ(0, memcmp(sensitive_data.sensitive_area.auth_value.buffer, 1294 password.data(), password.size())); 1295 EXPECT_EQ(sensitive_data.sensitive_area.sensitive.rsa.size, 1296 prime_factor.size()); 1297 EXPECT_EQ(0, memcmp(sensitive_data.sensitive_area.sensitive.rsa.buffer, 1298 prime_factor.data(), prime_factor.size())); 1299 } 1300 1301 TEST_F(TpmUtilityTest, ImportRSAKeySuccessWithNoBlob) { 1302 uint32_t public_exponent = 0x10001; 1303 std::string modulus(256, 'a'); 1304 std::string prime_factor(128, 'b'); 1305 std::string password; 1306 EXPECT_EQ(TPM_RC_SUCCESS, utility_.ImportRSAKey( 1307 TpmUtility::AsymmetricKeyUsage::kDecryptKey, 1308 modulus, 1309 public_exponent, 1310 prime_factor, 1311 password, 1312 &mock_authorization_delegate_, 1313 nullptr)); 1314 } 1315 1316 TEST_F(TpmUtilityTest, ImportRSAKeyParentNameFail) { 1317 uint32_t public_exponent = 0x10001; 1318 std::string modulus(256, 'a'); 1319 std::string prime_factor(128, 'b'); 1320 std::string password; 1321 EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _)) 1322 .WillOnce(Return(TPM_RC_FAILURE)); 1323 EXPECT_EQ(TPM_RC_FAILURE, utility_.ImportRSAKey( 1324 TpmUtility::AsymmetricKeyUsage::kDecryptKey, 1325 modulus, 1326 public_exponent, 1327 prime_factor, 1328 password, 1329 &mock_authorization_delegate_, 1330 nullptr)); 1331 } 1332 1333 TEST_F(TpmUtilityTest, ImportRSAKeyFail) { 1334 std::string modulus; 1335 std::string prime_factor; 1336 std::string password; 1337 EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _)) 1338 .WillOnce(Return(TPM_RC_FAILURE)); 1339 EXPECT_EQ(TPM_RC_FAILURE, utility_.ImportRSAKey( 1340 TpmUtility::AsymmetricKeyUsage::kDecryptKey, 1341 modulus, 1342 0x10001, 1343 prime_factor, 1344 password, 1345 &mock_authorization_delegate_, 1346 nullptr)); 1347 } 1348 1349 TEST_F(TpmUtilityTest, ImportRSAKeyParserFail) { 1350 std::string modulus; 1351 std::string prime_factor; 1352 std::string password; 1353 std::string key_blob; 1354 EXPECT_CALL(mock_blob_parser_, SerializeKeyBlob(_, _, &key_blob)) 1355 .WillOnce(Return(false)); 1356 EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.ImportRSAKey( 1357 TpmUtility::AsymmetricKeyUsage::kDecryptKey, 1358 modulus, 1359 0x10001, 1360 prime_factor, 1361 password, 1362 &mock_authorization_delegate_, 1363 &key_blob)); 1364 } 1365 1366 TEST_F(TpmUtilityTest, CreateRSAKeyPairSuccess) { 1367 TPM2B_PUBLIC public_area; 1368 TPML_PCR_SELECTION creation_pcrs; 1369 EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey, 1370 _, _, _, _, _, _, _, _, 1371 &mock_authorization_delegate_)) 1372 .WillOnce(DoAll(SaveArg<2>(&public_area), 1373 SaveArg<3>(&creation_pcrs), 1374 Return(TPM_RC_SUCCESS))); 1375 std::string key_blob; 1376 std::string creation_blob; 1377 int creation_pcr = 12; 1378 EXPECT_EQ(TPM_RC_SUCCESS, utility_.CreateRSAKeyPair( 1379 TpmUtility::AsymmetricKeyUsage::kDecryptAndSignKey, 2048, 0x10001, 1380 "password", "", false, creation_pcr, &mock_authorization_delegate_, 1381 &key_blob, &creation_blob)); 1382 EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, kDecrypt); 1383 EXPECT_EQ(public_area.public_area.object_attributes & kSign, kSign); 1384 EXPECT_EQ(public_area.public_area.object_attributes & kUserWithAuth, 1385 kUserWithAuth); 1386 EXPECT_EQ(public_area.public_area.object_attributes & kAdminWithPolicy, 0u); 1387 EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme, 1388 TPM_ALG_NULL); 1389 EXPECT_EQ(1u, creation_pcrs.count); 1390 EXPECT_EQ(TPM_ALG_SHA256, creation_pcrs.pcr_selections[0].hash); 1391 EXPECT_EQ(PCR_SELECT_MIN, creation_pcrs.pcr_selections[0].sizeof_select); 1392 EXPECT_EQ(1u << (creation_pcr % 8), 1393 creation_pcrs.pcr_selections[0].pcr_select[creation_pcr / 8]); 1394 } 1395 1396 TEST_F(TpmUtilityTest, CreateRSAKeyPairDecryptKeySuccess) { 1397 TPM2B_PUBLIC public_area; 1398 EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey, 1399 _, _, _, _, _, _, _, _, 1400 &mock_authorization_delegate_)) 1401 .WillOnce(DoAll(SaveArg<2>(&public_area), 1402 Return(TPM_RC_SUCCESS))); 1403 std::string key_blob; 1404 EXPECT_EQ(TPM_RC_SUCCESS, utility_.CreateRSAKeyPair( 1405 TpmUtility::AsymmetricKeyUsage::kDecryptKey, 2048, 0x10001, "password", 1406 "", false, kNoCreationPCR, &mock_authorization_delegate_, &key_blob, 1407 nullptr)); 1408 EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, kDecrypt); 1409 EXPECT_EQ(public_area.public_area.object_attributes & kSign, 0u); 1410 EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme, 1411 TPM_ALG_NULL); 1412 } 1413 1414 TEST_F(TpmUtilityTest, CreateRSAKeyPairSignKeySuccess) { 1415 TPM2B_PUBLIC public_area; 1416 TPM2B_SENSITIVE_CREATE sensitive_create; 1417 EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey, 1418 _, _, _, _, _, _, _, _, 1419 &mock_authorization_delegate_)) 1420 .WillOnce(DoAll(SaveArg<1>(&sensitive_create), 1421 SaveArg<2>(&public_area), 1422 Return(TPM_RC_SUCCESS))); 1423 std::string key_blob; 1424 std::string policy_digest(32, 'a'); 1425 std::string key_auth("password"); 1426 EXPECT_EQ(TPM_RC_SUCCESS, utility_.CreateRSAKeyPair( 1427 TpmUtility::AsymmetricKeyUsage::kSignKey, 2048, 0x10001, key_auth, 1428 policy_digest, true /* use_only_policy_authorization */, kNoCreationPCR, 1429 &mock_authorization_delegate_, &key_blob, nullptr)); 1430 EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, 0u); 1431 EXPECT_EQ(public_area.public_area.object_attributes & kSign, kSign); 1432 EXPECT_EQ(public_area.public_area.object_attributes & kUserWithAuth, 0u); 1433 EXPECT_EQ(public_area.public_area.object_attributes & kAdminWithPolicy, 1434 kAdminWithPolicy); 1435 EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme, 1436 TPM_ALG_NULL); 1437 EXPECT_EQ(public_area.public_area.parameters.rsa_detail.key_bits, 2048); 1438 EXPECT_EQ(public_area.public_area.parameters.rsa_detail.exponent, 0x10001u); 1439 EXPECT_EQ(public_area.public_area.auth_policy.size, policy_digest.size()); 1440 EXPECT_EQ(0, memcmp(public_area.public_area.auth_policy.buffer, 1441 policy_digest.data(), policy_digest.size())); 1442 EXPECT_EQ(sensitive_create.sensitive.user_auth.size, key_auth.size()); 1443 EXPECT_EQ(0, memcmp(sensitive_create.sensitive.user_auth.buffer, 1444 key_auth.data(), key_auth.size())); 1445 } 1446 1447 TEST_F(TpmUtilityTest, CreateRSAKeyPairBadDelegate) { 1448 std::string key_blob; 1449 EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.CreateRSAKeyPair( 1450 TpmUtility::AsymmetricKeyUsage::kDecryptKey, 2048, 0x10001, "password", 1451 "", false, kNoCreationPCR, nullptr, &key_blob, nullptr)); 1452 } 1453 1454 TEST_F(TpmUtilityTest, CreateRSAKeyPairFailure) { 1455 EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey, 1456 _, _, _, _, _, _, _, _, 1457 &mock_authorization_delegate_)) 1458 .WillOnce(Return(TPM_RC_FAILURE)); 1459 std::string key_blob; 1460 EXPECT_EQ(TPM_RC_FAILURE, utility_.CreateRSAKeyPair( 1461 TpmUtility::AsymmetricKeyUsage::kSignKey, 2048, 0x10001, "password", 1462 "", false, kNoCreationPCR, &mock_authorization_delegate_, &key_blob, 1463 nullptr)); 1464 } 1465 1466 TEST_F(TpmUtilityTest, CreateRSAKeyPairKeyParserFail) { 1467 std::string key_blob; 1468 EXPECT_CALL(mock_blob_parser_, SerializeKeyBlob(_, _, &key_blob)) 1469 .WillOnce(Return(false)); 1470 EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.CreateRSAKeyPair( 1471 TpmUtility::AsymmetricKeyUsage::kSignKey, 2048, 0x10001, "password", 1472 "", false, kNoCreationPCR, &mock_authorization_delegate_, &key_blob, 1473 nullptr)); 1474 } 1475 1476 TEST_F(TpmUtilityTest, CreateRSAKeyPairCreationParserFail) { 1477 std::string creation_blob; 1478 std::string key_blob; 1479 EXPECT_CALL(mock_blob_parser_, SerializeCreationBlob(_, _, _, &creation_blob)) 1480 .WillOnce(Return(false)); 1481 EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.CreateRSAKeyPair( 1482 TpmUtility::AsymmetricKeyUsage::kSignKey, 2048, 0x10001, "password", 1483 "", false, kNoCreationPCR, &mock_authorization_delegate_, &key_blob, 1484 &creation_blob)); 1485 } 1486 1487 TEST_F(TpmUtilityTest, LoadKeySuccess) { 1488 TPM_HANDLE key_handle = TPM_RH_FIRST; 1489 TPM_HANDLE loaded_handle; 1490 EXPECT_CALL(mock_tpm_, LoadSync(kRSAStorageRootKey, _, _, _, _, _, 1491 &mock_authorization_delegate_)) 1492 .WillOnce(DoAll(SetArgPointee<4>(key_handle), 1493 Return(TPM_RC_SUCCESS))); 1494 std::string key_blob; 1495 EXPECT_EQ(TPM_RC_SUCCESS, utility_.LoadKey( 1496 key_blob, &mock_authorization_delegate_, &loaded_handle)); 1497 EXPECT_EQ(loaded_handle, key_handle); 1498 } 1499 1500 TEST_F(TpmUtilityTest, LoadKeyFailure) { 1501 TPM_HANDLE key_handle; 1502 EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _)) 1503 .WillOnce(Return(TPM_RC_FAILURE)); 1504 std::string key_blob; 1505 EXPECT_EQ(TPM_RC_FAILURE, utility_.LoadKey( 1506 key_blob, &mock_authorization_delegate_, &key_handle)); 1507 } 1508 1509 TEST_F(TpmUtilityTest, LoadKeyBadDelegate) { 1510 TPM_HANDLE key_handle; 1511 std::string key_blob; 1512 EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.LoadKey( 1513 key_blob, nullptr, &key_handle)); 1514 } 1515 1516 TEST_F(TpmUtilityTest, LoadKeyParserFail) { 1517 TPM_HANDLE key_handle; 1518 std::string key_blob; 1519 EXPECT_CALL(mock_blob_parser_, ParseKeyBlob(key_blob, _, _)) 1520 .WillOnce(Return(false)); 1521 EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.LoadKey( 1522 key_blob, &mock_authorization_delegate_, &key_handle)); 1523 } 1524 1525 TEST_F(TpmUtilityTest, SealedDataSuccess) { 1526 std::string data_to_seal("seal_data"); 1527 std::string sealed_data; 1528 TPM2B_SENSITIVE_CREATE sensitive_create; 1529 TPM2B_PUBLIC in_public; 1530 EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey, _, _, 1531 _, _, _, _, _, _, _)) 1532 .WillOnce(DoAll(SaveArg<1>(&sensitive_create), 1533 SaveArg<2>(&in_public), 1534 Return(TPM_RC_SUCCESS))); 1535 EXPECT_EQ(TPM_RC_SUCCESS, utility_.SealData( 1536 data_to_seal, "", &mock_authorization_delegate_, &sealed_data)); 1537 EXPECT_EQ(sensitive_create.sensitive.data.size, data_to_seal.size()); 1538 EXPECT_EQ(0, memcmp(sensitive_create.sensitive.data.buffer, 1539 data_to_seal.data(), data_to_seal.size())); 1540 EXPECT_EQ(in_public.public_area.type, TPM_ALG_KEYEDHASH); 1541 EXPECT_EQ(in_public.public_area.name_alg, TPM_ALG_SHA256); 1542 } 1543 1544 TEST_F(TpmUtilityTest, SealDataBadDelegate) { 1545 std::string data_to_seal("seal_data"); 1546 std::string sealed_data; 1547 EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.SealData( 1548 data_to_seal, "", nullptr, &sealed_data)); 1549 } 1550 1551 TEST_F(TpmUtilityTest, SealDataFailure) { 1552 std::string data_to_seal("seal_data"); 1553 std::string sealed_data; 1554 EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey, _, _, 1555 _, _, _, _, _, _, _)) 1556 .WillOnce(Return(TPM_RC_FAILURE)); 1557 EXPECT_EQ(TPM_RC_FAILURE, utility_.SealData( 1558 data_to_seal, "", &mock_authorization_delegate_, &sealed_data)); 1559 } 1560 1561 TEST_F(TpmUtilityTest, SealDataParserFail) { 1562 std::string data_to_seal("seal_data"); 1563 std::string sealed_data; 1564 EXPECT_CALL(mock_blob_parser_, SerializeKeyBlob(_, _, &sealed_data)) 1565 .WillOnce(Return(false)); 1566 EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.SealData( 1567 data_to_seal, "", &mock_authorization_delegate_, &sealed_data)); 1568 } 1569 1570 TEST_F(TpmUtilityTest, UnsealDataSuccess) { 1571 std::string sealed_data; 1572 std::string tpm_unsealed_data("password"); 1573 std::string unsealed_data; 1574 TPM_HANDLE object_handle = 42; 1575 TPM2B_PUBLIC public_data; 1576 public_data.public_area.auth_policy.size = 0; 1577 EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _)) 1578 .WillRepeatedly(DoAll(SetArgPointee<2>(public_data), 1579 Return(TPM_RC_SUCCESS))); 1580 EXPECT_CALL(mock_tpm_, ReadPublicSync(object_handle, _, _, _, _, _)) 1581 .WillRepeatedly(DoAll(SetArgPointee<2>(public_data), 1582 Return(TPM_RC_SUCCESS))); 1583 EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _)) 1584 .WillOnce(DoAll(SetArgPointee<4>(object_handle), 1585 Return(TPM_RC_SUCCESS))); 1586 TPM2B_SENSITIVE_DATA out_data = Make_TPM2B_SENSITIVE_DATA(tpm_unsealed_data); 1587 EXPECT_CALL(mock_tpm_, UnsealSync(object_handle, _, _, _)) 1588 .WillOnce(DoAll(SetArgPointee<2>(out_data), 1589 Return(TPM_RC_SUCCESS))); 1590 EXPECT_EQ(TPM_RC_SUCCESS, utility_.UnsealData( 1591 sealed_data, &mock_authorization_delegate_, &unsealed_data)); 1592 EXPECT_EQ(unsealed_data, tpm_unsealed_data); 1593 } 1594 1595 TEST_F(TpmUtilityTest, UnsealDataBadDelegate) { 1596 std::string sealed_data; 1597 std::string unsealed_data; 1598 EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.UnsealData( 1599 sealed_data, nullptr, &unsealed_data)); 1600 } 1601 1602 TEST_F(TpmUtilityTest, UnsealDataLoadFail) { 1603 std::string sealed_data; 1604 std::string unsealed_data; 1605 EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _)) 1606 .WillOnce(Return(TPM_RC_FAILURE)); 1607 EXPECT_EQ(TPM_RC_FAILURE, utility_.UnsealData( 1608 sealed_data, &mock_authorization_delegate_, &unsealed_data)); 1609 } 1610 1611 TEST_F(TpmUtilityTest, UnsealDataBadKeyName) { 1612 std::string sealed_data; 1613 std::string unsealed_data; 1614 EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _)) 1615 .WillOnce(Return(TPM_RC_FAILURE)); 1616 EXPECT_EQ(TPM_RC_FAILURE, utility_.UnsealData( 1617 sealed_data, &mock_authorization_delegate_, &unsealed_data)); 1618 } 1619 1620 TEST_F(TpmUtilityTest, UnsealObjectFailure) { 1621 std::string sealed_data; 1622 std::string unsealed_data; 1623 EXPECT_CALL(mock_tpm_, UnsealSync(_, _, _, _)) 1624 .WillOnce(Return(TPM_RC_FAILURE)); 1625 EXPECT_EQ(TPM_RC_FAILURE, utility_.UnsealData( 1626 sealed_data, &mock_authorization_delegate_, &unsealed_data)); 1627 } 1628 1629 TEST_F(TpmUtilityTest, StartSessionSuccess) { 1630 EXPECT_CALL(mock_hmac_session_, StartUnboundSession(true)) 1631 .WillOnce(Return(TPM_RC_SUCCESS)); 1632 EXPECT_EQ(TPM_RC_SUCCESS, 1633 utility_.StartSession(&mock_hmac_session_)); 1634 } 1635 1636 TEST_F(TpmUtilityTest, StartSessionFailure) { 1637 EXPECT_CALL(mock_hmac_session_, StartUnboundSession(true)) 1638 .WillOnce(Return(TPM_RC_FAILURE)); 1639 EXPECT_EQ(TPM_RC_FAILURE, 1640 utility_.StartSession(&mock_hmac_session_)); 1641 } 1642 1643 TEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueSuccess) { 1644 int index = 5; 1645 std::string pcr_value("pcr_value"); 1646 std::string policy_digest; 1647 TPML_PCR_SELECTION pcr_select; 1648 pcr_select.count = 1; 1649 pcr_select.pcr_selections[0].hash = TPM_ALG_SHA256; 1650 pcr_select.pcr_selections[0].sizeof_select = 1; 1651 pcr_select.pcr_selections[0].pcr_select[index / 8] = 1 << (index % 8); 1652 TPML_DIGEST pcr_values; 1653 pcr_values.count = 1; 1654 pcr_values.digests[0] = Make_TPM2B_DIGEST(pcr_value); 1655 EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _)) 1656 .WillOnce(DoAll(SetArgPointee<2>(pcr_select), 1657 SetArgPointee<3>(pcr_values), 1658 Return(TPM_RC_SUCCESS))); 1659 std::string tpm_pcr_value; 1660 EXPECT_CALL(mock_policy_session_, PolicyPCR(index, _)) 1661 .WillOnce(DoAll(SaveArg<1>(&tpm_pcr_value), 1662 Return(TPM_RC_SUCCESS))); 1663 std::string tpm_policy_digest("digest"); 1664 EXPECT_CALL(mock_policy_session_, GetDigest(_)) 1665 .WillOnce(DoAll(SetArgPointee<0>(tpm_policy_digest), 1666 Return(TPM_RC_SUCCESS))); 1667 EXPECT_EQ(TPM_RC_SUCCESS, 1668 utility_.GetPolicyDigestForPcrValue(index, "", &policy_digest)); 1669 EXPECT_EQ(policy_digest, tpm_policy_digest); 1670 EXPECT_EQ(pcr_value, tpm_pcr_value); 1671 } 1672 1673 TEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueSuccessWithPcrValue) { 1674 int index = 5; 1675 std::string pcr_value("pcr_value"); 1676 std::string policy_digest; 1677 std::string tpm_pcr_value; 1678 EXPECT_CALL(mock_policy_session_, PolicyPCR(index, _)) 1679 .WillOnce(DoAll(SaveArg<1>(&tpm_pcr_value), 1680 Return(TPM_RC_SUCCESS))); 1681 std::string tpm_policy_digest("digest"); 1682 EXPECT_CALL(mock_policy_session_, GetDigest(_)) 1683 .WillOnce(DoAll(SetArgPointee<0>(tpm_policy_digest), 1684 Return(TPM_RC_SUCCESS))); 1685 EXPECT_EQ(TPM_RC_SUCCESS, 1686 utility_.GetPolicyDigestForPcrValue(index, pcr_value, &policy_digest)); 1687 EXPECT_EQ(policy_digest, tpm_policy_digest); 1688 EXPECT_EQ(pcr_value, tpm_pcr_value); 1689 } 1690 1691 TEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueBadSession) { 1692 int index = 5; 1693 std::string pcr_value("value"); 1694 std::string policy_digest; 1695 EXPECT_CALL(mock_policy_session_, StartUnboundSession(false)) 1696 .WillOnce(Return(TPM_RC_FAILURE)); 1697 EXPECT_EQ(TPM_RC_FAILURE, 1698 utility_.GetPolicyDigestForPcrValue(index, pcr_value, &policy_digest)); 1699 } 1700 1701 TEST_F(TpmUtilityTest, GetPolicyDigestForPcrValuePcrReadFail) { 1702 int index = 5; 1703 std::string policy_digest; 1704 EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _)) 1705 .WillOnce(Return(TPM_RC_FAILURE)); 1706 EXPECT_EQ(TPM_RC_FAILURE, 1707 utility_.GetPolicyDigestForPcrValue(index, "", &policy_digest)); 1708 } 1709 1710 TEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueBadPcr) { 1711 int index = 5; 1712 std::string pcr_value("value"); 1713 std::string policy_digest; 1714 EXPECT_CALL(mock_policy_session_, PolicyPCR(index, _)) 1715 .WillOnce(Return(TPM_RC_FAILURE)); 1716 EXPECT_EQ(TPM_RC_FAILURE, 1717 utility_.GetPolicyDigestForPcrValue(index, pcr_value, &policy_digest)); 1718 } 1719 1720 TEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueBadDigest) { 1721 int index = 5; 1722 std::string pcr_value("value"); 1723 std::string policy_digest; 1724 EXPECT_CALL(mock_policy_session_, GetDigest(&policy_digest)) 1725 .WillOnce(Return(TPM_RC_FAILURE)); 1726 EXPECT_EQ(TPM_RC_FAILURE, 1727 utility_.GetPolicyDigestForPcrValue(index, pcr_value, &policy_digest)); 1728 } 1729 1730 TEST_F(TpmUtilityTest, DefineNVSpaceSuccess) { 1731 uint32_t index = 59; 1732 uint32_t nvram_index = NV_INDEX_FIRST + index; 1733 size_t length = 256; 1734 TPM2B_NV_PUBLIC public_data; 1735 EXPECT_CALL(mock_tpm_, NV_DefineSpaceSync(TPM_RH_OWNER, _, _, _, _)) 1736 .WillOnce(DoAll(SaveArg<3>(&public_data), 1737 Return(TPM_RC_SUCCESS))); 1738 EXPECT_EQ(TPM_RC_SUCCESS, utility_.DefineNVSpace( 1739 index, length, &mock_authorization_delegate_)); 1740 EXPECT_EQ(public_data.nv_public.nv_index, nvram_index); 1741 EXPECT_EQ(public_data.nv_public.name_alg, TPM_ALG_SHA256); 1742 EXPECT_EQ(public_data.nv_public.attributes, 1743 TPMA_NV_NO_DA | TPMA_NV_OWNERWRITE | TPMA_NV_WRITEDEFINE | 1744 TPMA_NV_AUTHREAD); 1745 EXPECT_EQ(public_data.nv_public.data_size, length); 1746 } 1747 1748 TEST_F(TpmUtilityTest, DefineNVSpaceBadLength) { 1749 size_t bad_length = 3000; 1750 EXPECT_EQ(SAPI_RC_BAD_SIZE, 1751 utility_.DefineNVSpace(0, bad_length, &mock_authorization_delegate_)); 1752 } 1753 1754 TEST_F(TpmUtilityTest, DefineNVSpaceBadIndex) { 1755 uint32_t bad_index = 1<<29; 1756 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, 1757 utility_.DefineNVSpace(bad_index, 2, &mock_authorization_delegate_)); 1758 } 1759 1760 TEST_F(TpmUtilityTest, DefineNVSpaceBadSession) { 1761 EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.DefineNVSpace(0, 2, nullptr)); 1762 } 1763 1764 TEST_F(TpmUtilityTest, DefineNVSpaceFail) { 1765 uint32_t index = 59; 1766 size_t length = 256; 1767 EXPECT_CALL(mock_tpm_, NV_DefineSpaceSync(TPM_RH_OWNER, _, _, _, _)) 1768 .WillOnce(Return(TPM_RC_FAILURE)); 1769 EXPECT_EQ(TPM_RC_FAILURE, 1770 utility_.DefineNVSpace(index, length, &mock_authorization_delegate_)); 1771 } 1772 1773 TEST_F(TpmUtilityTest, DestroyNVSpaceSuccess) { 1774 uint32_t index = 53; 1775 uint32_t nvram_index = NV_INDEX_FIRST + index; 1776 EXPECT_CALL(mock_tpm_, 1777 NV_UndefineSpaceSync(TPM_RH_OWNER, _, nvram_index, _, _)); 1778 EXPECT_EQ(TPM_RC_SUCCESS, 1779 utility_.DestroyNVSpace(index, &mock_authorization_delegate_)); 1780 } 1781 1782 TEST_F(TpmUtilityTest, DestroyNVSpaceBadIndex) { 1783 uint32_t bad_index = 1<<29; 1784 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, 1785 utility_.DestroyNVSpace(bad_index, &mock_authorization_delegate_)); 1786 } 1787 1788 TEST_F(TpmUtilityTest, DestroyNVSpaceBadSession) { 1789 EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.DestroyNVSpace(3, nullptr)); 1790 } 1791 1792 TEST_F(TpmUtilityTest, DestroyNVSpaceFailure) { 1793 uint32_t index = 53; 1794 uint32_t nvram_index = NV_INDEX_FIRST + index; 1795 EXPECT_CALL(mock_tpm_, 1796 NV_UndefineSpaceSync(TPM_RH_OWNER, _, nvram_index, _, _)) 1797 .WillOnce(Return(TPM_RC_FAILURE)); 1798 EXPECT_EQ(TPM_RC_FAILURE, 1799 utility_.DestroyNVSpace(index, &mock_authorization_delegate_)); 1800 } 1801 1802 TEST_F(TpmUtilityTest, LockNVSpaceSuccess) { 1803 uint32_t index = 53; 1804 uint32_t nvram_index = NV_INDEX_FIRST + index; 1805 EXPECT_CALL(mock_tpm_, NV_WriteLockSync(TPM_RH_OWNER, _, nvram_index, _, _)) 1806 .WillOnce(Return(TPM_RC_SUCCESS)); 1807 EXPECT_EQ(TPM_RC_SUCCESS, 1808 utility_.LockNVSpace(index, &mock_authorization_delegate_)); 1809 TPMS_NV_PUBLIC public_area; 1810 EXPECT_EQ(TPM_RC_SUCCESS, GetNVRAMMap(index, &public_area)); 1811 EXPECT_EQ(public_area.attributes & TPMA_NV_WRITELOCKED, TPMA_NV_WRITELOCKED); 1812 } 1813 1814 TEST_F(TpmUtilityTest, LockNVSpaceBadIndex) { 1815 uint32_t bad_index = 1<<24; 1816 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, 1817 utility_.LockNVSpace(bad_index, &mock_authorization_delegate_)); 1818 } 1819 1820 TEST_F(TpmUtilityTest, LockNVSpaceBadSession) { 1821 EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.LockNVSpace(52, nullptr)); 1822 } 1823 1824 TEST_F(TpmUtilityTest, LockNVSpaceFailure) { 1825 uint32_t index = 53; 1826 uint32_t nvram_index = NV_INDEX_FIRST + index; 1827 EXPECT_CALL(mock_tpm_, NV_WriteLockSync(TPM_RH_OWNER, _, nvram_index, _, _)) 1828 .WillOnce(Return(TPM_RC_FAILURE)); 1829 EXPECT_EQ(TPM_RC_FAILURE, 1830 utility_.LockNVSpace(index, &mock_authorization_delegate_)); 1831 } 1832 1833 TEST_F(TpmUtilityTest, WriteNVSpaceSuccess) { 1834 uint32_t index = 53; 1835 uint32_t offset = 5; 1836 uint32_t nvram_index = NV_INDEX_FIRST + index; 1837 EXPECT_CALL(mock_tpm_, 1838 NV_WriteSync(TPM_RH_OWNER, _, nvram_index, _, _, offset, _)) 1839 .WillOnce(Return(TPM_RC_SUCCESS)); 1840 EXPECT_EQ(TPM_RC_SUCCESS, utility_.WriteNVSpace( 1841 index, offset, "", &mock_authorization_delegate_)); 1842 TPMS_NV_PUBLIC public_area; 1843 EXPECT_EQ(TPM_RC_SUCCESS, GetNVRAMMap(index, &public_area)); 1844 EXPECT_EQ(public_area.attributes & TPMA_NV_WRITTEN, TPMA_NV_WRITTEN); 1845 } 1846 1847 TEST_F(TpmUtilityTest, WriteNVSpaceBadSize) { 1848 uint32_t index = 53; 1849 std::string nvram_data(1025, 0); 1850 EXPECT_EQ(SAPI_RC_BAD_SIZE, utility_.WriteNVSpace( 1851 index, 0, nvram_data, &mock_authorization_delegate_)); 1852 } 1853 1854 TEST_F(TpmUtilityTest, WriteNVSpaceBadIndex) { 1855 uint32_t bad_index = 1<<24; 1856 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.WriteNVSpace( 1857 bad_index, 0, "", &mock_authorization_delegate_)); 1858 } 1859 1860 TEST_F(TpmUtilityTest, WriteNVSpaceBadSessions) { 1861 EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, 1862 utility_.WriteNVSpace(53, 0, "", nullptr)); 1863 } 1864 1865 TEST_F(TpmUtilityTest, WriteNVSpaceFailure) { 1866 uint32_t index = 53; 1867 uint32_t offset = 5; 1868 uint32_t nvram_index = NV_INDEX_FIRST + index; 1869 EXPECT_CALL(mock_tpm_, 1870 NV_WriteSync(TPM_RH_OWNER, _, nvram_index, _, _, offset, _)) 1871 .WillOnce(Return(TPM_RC_FAILURE)); 1872 EXPECT_EQ(TPM_RC_FAILURE, utility_.WriteNVSpace( 1873 index, offset, "", &mock_authorization_delegate_)); 1874 } 1875 1876 TEST_F(TpmUtilityTest, ReadNVSpaceSuccess) { 1877 uint32_t index = 53; 1878 uint32_t offset = 5; 1879 uint32_t nv_index = NV_INDEX_FIRST + index; 1880 size_t length = 24; 1881 std::string nvram_data; 1882 EXPECT_CALL(mock_tpm_, 1883 NV_ReadSync(nv_index, _, nv_index, _, length, offset, _, _)) 1884 .WillOnce(Return(TPM_RC_SUCCESS)); 1885 EXPECT_EQ(TPM_RC_SUCCESS, utility_.ReadNVSpace( 1886 index, offset, length, &nvram_data, &mock_authorization_delegate_)); 1887 } 1888 1889 TEST_F(TpmUtilityTest, ReadNVSpaceBadReadLength) { 1890 size_t length = 1025; 1891 std::string nvram_data; 1892 EXPECT_EQ(SAPI_RC_BAD_SIZE, utility_.ReadNVSpace( 1893 52, 0, length, &nvram_data, &mock_authorization_delegate_)); 1894 } 1895 1896 TEST_F(TpmUtilityTest, ReadNVSpaceBadIndex) { 1897 uint32_t bad_index = 1<<24; 1898 std::string nvram_data; 1899 EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.ReadNVSpace( 1900 bad_index, 0, 5, &nvram_data, &mock_authorization_delegate_)); 1901 } 1902 1903 TEST_F(TpmUtilityTest, ReadNVSpaceBadSession) { 1904 std::string nvram_data; 1905 EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, 1906 utility_.ReadNVSpace(53, 0, 5, &nvram_data, nullptr)); 1907 } 1908 1909 TEST_F(TpmUtilityTest, ReadNVSpaceFailure) { 1910 uint32_t index = 53; 1911 uint32_t offset = 5; 1912 uint32_t nv_index = NV_INDEX_FIRST + index; 1913 size_t length = 24; 1914 std::string nvram_data; 1915 EXPECT_CALL(mock_tpm_, 1916 NV_ReadSync(nv_index, _, nv_index, _, length, offset, _, _)) 1917 .WillOnce(Return(TPM_RC_FAILURE)); 1918 EXPECT_EQ(TPM_RC_FAILURE, utility_.ReadNVSpace( 1919 index, offset, length, &nvram_data, &mock_authorization_delegate_)); 1920 } 1921 1922 TEST_F(TpmUtilityTest, GetNVSpaceNameSuccess) { 1923 uint32_t index = 53; 1924 uint32_t nvram_index = NV_INDEX_FIRST + index; 1925 std::string name; 1926 EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(nvram_index, _, _, _, _)) 1927 .WillOnce(Return(TPM_RC_SUCCESS)); 1928 EXPECT_EQ(TPM_RC_SUCCESS, utility_.GetNVSpaceName(index, &name)); 1929 } 1930 1931 TEST_F(TpmUtilityTest, GetNVSpaceNameFailure) { 1932 uint32_t index = 53; 1933 std::string name; 1934 EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _)) 1935 .WillOnce(Return(TPM_RC_FAILURE)); 1936 EXPECT_EQ(TPM_RC_FAILURE, utility_.GetNVSpaceName(index, &name)); 1937 } 1938 1939 TEST_F(TpmUtilityTest, GetNVSpacePublicAreaCachedSuccess) { 1940 uint32_t index = 53; 1941 TPMS_NV_PUBLIC public_area; 1942 SetNVRAMMap(index, public_area); 1943 EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _)) 1944 .Times(0); 1945 EXPECT_EQ(TPM_RC_SUCCESS, utility_.GetNVSpacePublicArea(index, &public_area)); 1946 } 1947 1948 TEST_F(TpmUtilityTest, GetNVSpacePublicAreaSuccess) { 1949 uint32_t index = 53; 1950 uint32_t nvram_index = NV_INDEX_FIRST + index; 1951 TPMS_NV_PUBLIC public_area; 1952 EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(nvram_index, _, _, _, _)) 1953 .WillOnce(Return(TPM_RC_SUCCESS)); 1954 EXPECT_EQ(TPM_RC_SUCCESS, utility_.GetNVSpacePublicArea(index, &public_area)); 1955 } 1956 1957 TEST_F(TpmUtilityTest, GetNVSpacePublicAreaFailure) { 1958 uint32_t index = 53; 1959 TPMS_NV_PUBLIC public_area; 1960 EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _)) 1961 .WillOnce(Return(TPM_RC_FAILURE)); 1962 EXPECT_EQ(TPM_RC_FAILURE, utility_.GetNVSpacePublicArea(index, &public_area)); 1963 } 1964 1965 TEST_F(TpmUtilityTest, SetKnownPasswordSuccess) { 1966 EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 1967 .WillOnce(Return(false)); 1968 EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _)) 1969 .WillOnce(Return(TPM_RC_SUCCESS)); 1970 EXPECT_EQ(TPM_RC_SUCCESS, SetKnownOwnerPassword("password")); 1971 } 1972 1973 TEST_F(TpmUtilityTest, SetKnownPasswordOwnershipDone) { 1974 EXPECT_EQ(TPM_RC_SUCCESS, SetKnownOwnerPassword("password")); 1975 } 1976 1977 TEST_F(TpmUtilityTest, SetKnownPasswordFailure) { 1978 EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 1979 .WillOnce(Return(false)); 1980 EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _)) 1981 .WillRepeatedly(Return(TPM_RC_FAILURE)); 1982 EXPECT_EQ(TPM_RC_FAILURE, SetKnownOwnerPassword("password")); 1983 } 1984 1985 TEST_F(TpmUtilityTest, RootKeysSuccess) { 1986 EXPECT_EQ(TPM_RC_SUCCESS, CreateStorageRootKeys("password")); 1987 } 1988 1989 TEST_F(TpmUtilityTest, RootKeysHandleConsistency) { 1990 TPM_HANDLE test_handle = 42; 1991 EXPECT_CALL(mock_tpm_, CreatePrimarySyncShort(_, _, _, _, _, _, _, _, _, _)) 1992 .WillRepeatedly(DoAll(SetArgPointee<3>(test_handle), 1993 Return(TPM_RC_SUCCESS))); 1994 EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, test_handle, _, _, _)) 1995 .WillRepeatedly(Return(TPM_RC_SUCCESS)); 1996 EXPECT_EQ(TPM_RC_SUCCESS, CreateStorageRootKeys("password")); 1997 } 1998 1999 TEST_F(TpmUtilityTest, RootKeysCreateFailure) { 2000 EXPECT_CALL(mock_tpm_, CreatePrimarySyncShort(_, _, _, _, _, _, _, _, _, _)) 2001 .WillRepeatedly(Return(TPM_RC_FAILURE)); 2002 EXPECT_EQ(TPM_RC_FAILURE, CreateStorageRootKeys("password")); 2003 } 2004 2005 TEST_F(TpmUtilityTest, RootKeysPersistFailure) { 2006 EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, _, _, _, _)) 2007 .WillRepeatedly(Return(TPM_RC_FAILURE)); 2008 EXPECT_EQ(TPM_RC_FAILURE, CreateStorageRootKeys("password")); 2009 } 2010 2011 TEST_F(TpmUtilityTest, RootKeysAlreadyExist) { 2012 SetExistingKeyHandleExpectation(kRSAStorageRootKey); 2013 SetExistingKeyHandleExpectation(kECCStorageRootKey); 2014 EXPECT_EQ(TPM_RC_SUCCESS, CreateStorageRootKeys("password")); 2015 } 2016 2017 TEST_F(TpmUtilityTest, SaltingKeySuccess) { 2018 TPM2B_PUBLIC public_area; 2019 EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _)) 2020 .WillOnce(DoAll(SaveArg<2>(&public_area), 2021 Return(TPM_RC_SUCCESS))); 2022 EXPECT_EQ(TPM_RC_SUCCESS, CreateSaltingKey("password")); 2023 EXPECT_EQ(TPM_ALG_SHA256, public_area.public_area.name_alg); 2024 } 2025 2026 TEST_F(TpmUtilityTest, SaltingKeyConsistency) { 2027 TPM_HANDLE test_handle = 42; 2028 EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _)) 2029 .WillRepeatedly(DoAll(SetArgPointee<4>(test_handle), 2030 Return(TPM_RC_SUCCESS))); 2031 EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, test_handle, _, _, _)) 2032 .WillRepeatedly(Return(TPM_RC_SUCCESS)); 2033 EXPECT_EQ(TPM_RC_SUCCESS, CreateSaltingKey("password")); 2034 } 2035 2036 TEST_F(TpmUtilityTest, SaltingKeyCreateFailure) { 2037 EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _)) 2038 .WillRepeatedly(Return(TPM_RC_FAILURE)); 2039 EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey("password")); 2040 } 2041 2042 TEST_F(TpmUtilityTest, SaltingKeyLoadFailure) { 2043 EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _)) 2044 .WillRepeatedly(Return(TPM_RC_FAILURE)); 2045 EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey("password")); 2046 } 2047 2048 TEST_F(TpmUtilityTest, SaltingKeyPersistFailure) { 2049 EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, _, _, _, _)) 2050 .WillRepeatedly(Return(TPM_RC_FAILURE)); 2051 EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey("password")); 2052 } 2053 2054 TEST_F(TpmUtilityTest, SaltingKeyAlreadyExists) { 2055 SetExistingKeyHandleExpectation(kSaltingKey); 2056 EXPECT_EQ(TPM_RC_SUCCESS, CreateSaltingKey("password")); 2057 } 2058 2059 } // namespace trunks 2060