| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 | 5 |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 |
| 8 #include <memory> |
| 7 #include <string> | 9 #include <string> |
| 8 #include <utility> | 10 #include <utility> |
| 9 #include <vector> | 11 #include <vector> |
| 10 | 12 |
| 11 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 12 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
| 13 #include "base/files/file_util.h" | 15 #include "base/files/file_util.h" |
| 14 #include "base/macros.h" | 16 #include "base/macros.h" |
| 15 #include "base/memory/scoped_ptr.h" | 17 #include "base/memory/ptr_util.h" |
| 16 #include "base/message_loop/message_loop.h" | 18 #include "base/message_loop/message_loop.h" |
| 17 #include "base/run_loop.h" | 19 #include "base/run_loop.h" |
| 18 #include "base/strings/string_util.h" | 20 #include "base/strings/string_util.h" |
| 19 #include "base/strings/stringprintf.h" | 21 #include "base/strings/stringprintf.h" |
| 20 #include "chrome/browser/chromeos/login/auth/chrome_cryptohome_authenticator.h" | 22 #include "chrome/browser/chromeos/login/auth/chrome_cryptohome_authenticator.h" |
| 21 #include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h" | 23 #include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h" |
| 22 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" | 24 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" |
| 23 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_fact
ory.h" | 25 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_fact
ory.h" |
| 24 #include "chrome/browser/chromeos/profiles/profile_helper.h" | 26 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
| 25 #include "chrome/browser/chromeos/settings/cros_settings.h" | 27 #include "chrome/browser/chromeos/settings/cros_settings.h" |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 switches::kLoginManager); | 163 switches::kLoginManager); |
| 162 | 164 |
| 163 mock_caller_ = new cryptohome::MockAsyncMethodCaller; | 165 mock_caller_ = new cryptohome::MockAsyncMethodCaller; |
| 164 cryptohome::AsyncMethodCaller::InitializeForTesting(mock_caller_); | 166 cryptohome::AsyncMethodCaller::InitializeForTesting(mock_caller_); |
| 165 mock_homedir_methods_ = new cryptohome::MockHomedirMethods; | 167 mock_homedir_methods_ = new cryptohome::MockHomedirMethods; |
| 166 mock_homedir_methods_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | 168 mock_homedir_methods_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); |
| 167 cryptohome::HomedirMethods::InitializeForTesting(mock_homedir_methods_); | 169 cryptohome::HomedirMethods::InitializeForTesting(mock_homedir_methods_); |
| 168 | 170 |
| 169 fake_cryptohome_client_ = new FakeCryptohomeClient; | 171 fake_cryptohome_client_ = new FakeCryptohomeClient; |
| 170 chromeos::DBusThreadManager::GetSetterForTesting()->SetCryptohomeClient( | 172 chromeos::DBusThreadManager::GetSetterForTesting()->SetCryptohomeClient( |
| 171 scoped_ptr<CryptohomeClient>(fake_cryptohome_client_)); | 173 std::unique_ptr<CryptohomeClient>(fake_cryptohome_client_)); |
| 172 | 174 |
| 173 SystemSaltGetter::Initialize(); | 175 SystemSaltGetter::Initialize(); |
| 174 | 176 |
| 175 auth_ = new ChromeCryptohomeAuthenticator(&consumer_); | 177 auth_ = new ChromeCryptohomeAuthenticator(&consumer_); |
| 176 state_.reset(new TestAttemptState(user_context_, false)); | 178 state_.reset(new TestAttemptState(user_context_, false)); |
| 177 } | 179 } |
| 178 | 180 |
| 179 // Tears down the test fixture. | 181 // Tears down the test fixture. |
| 180 void TearDown() override { | 182 void TearDown() override { |
| 181 SystemSaltGetter::Shutdown(); | 183 SystemSaltGetter::Shutdown(); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 .WillOnce(Invoke(MockAuthStatusConsumer::OnGuestSuccessQuit)) | 242 .WillOnce(Invoke(MockAuthStatusConsumer::OnGuestSuccessQuit)) |
| 241 .RetiresOnSaturation(); | 243 .RetiresOnSaturation(); |
| 242 } | 244 } |
| 243 | 245 |
| 244 void ExpectPasswordChange() { | 246 void ExpectPasswordChange() { |
| 245 EXPECT_CALL(consumer_, OnPasswordChangeDetected()) | 247 EXPECT_CALL(consumer_, OnPasswordChangeDetected()) |
| 246 .WillOnce(Invoke(MockAuthStatusConsumer::OnMigrateQuit)) | 248 .WillOnce(Invoke(MockAuthStatusConsumer::OnMigrateQuit)) |
| 247 .RetiresOnSaturation(); | 249 .RetiresOnSaturation(); |
| 248 } | 250 } |
| 249 | 251 |
| 250 void ExpectGetKeyDataExCall(scoped_ptr<int64_t> key_type, | 252 void ExpectGetKeyDataExCall(std::unique_ptr<int64_t> key_type, |
| 251 scoped_ptr<std::string> salt) { | 253 std::unique_ptr<std::string> salt) { |
| 252 key_definitions_.clear(); | 254 key_definitions_.clear(); |
| 253 key_definitions_.push_back(cryptohome::KeyDefinition( | 255 key_definitions_.push_back(cryptohome::KeyDefinition( |
| 254 std::string() /* secret */, | 256 std::string() /* secret */, |
| 255 kCryptohomeGAIAKeyLabel, | 257 kCryptohomeGAIAKeyLabel, |
| 256 cryptohome::PRIV_DEFAULT)); | 258 cryptohome::PRIV_DEFAULT)); |
| 257 cryptohome::KeyDefinition& key_definition = key_definitions_.back(); | 259 cryptohome::KeyDefinition& key_definition = key_definitions_.back(); |
| 258 key_definition.revision = 1; | 260 key_definition.revision = 1; |
| 259 if (key_type) { | 261 if (key_type) { |
| 260 key_definition.provider_data.push_back( | 262 key_definition.provider_data.push_back( |
| 261 cryptohome::KeyDefinition::ProviderData("type")); | 263 cryptohome::KeyDefinition::ProviderData("type")); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 UserContext user_context_; | 320 UserContext user_context_; |
| 319 UserContext user_context_with_transformed_key_; | 321 UserContext user_context_with_transformed_key_; |
| 320 Key transformed_key_; | 322 Key transformed_key_; |
| 321 | 323 |
| 322 std::vector<cryptohome::KeyDefinition> key_definitions_; | 324 std::vector<cryptohome::KeyDefinition> key_definitions_; |
| 323 | 325 |
| 324 ScopedDeviceSettingsTestHelper device_settings_test_helper_; | 326 ScopedDeviceSettingsTestHelper device_settings_test_helper_; |
| 325 ScopedTestCrosSettings test_cros_settings_; | 327 ScopedTestCrosSettings test_cros_settings_; |
| 326 | 328 |
| 327 TestingProfile profile_; | 329 TestingProfile profile_; |
| 328 scoped_ptr<TestingProfileManager> profile_manager_; | 330 std::unique_ptr<TestingProfileManager> profile_manager_; |
| 329 user_manager::FakeUserManager* user_manager_; | 331 user_manager::FakeUserManager* user_manager_; |
| 330 ScopedUserManagerEnabler user_manager_enabler_; | 332 ScopedUserManagerEnabler user_manager_enabler_; |
| 331 | 333 |
| 332 cryptohome::MockAsyncMethodCaller* mock_caller_; | 334 cryptohome::MockAsyncMethodCaller* mock_caller_; |
| 333 cryptohome::MockHomedirMethods* mock_homedir_methods_; | 335 cryptohome::MockHomedirMethods* mock_homedir_methods_; |
| 334 | 336 |
| 335 MockAuthStatusConsumer consumer_; | 337 MockAuthStatusConsumer consumer_; |
| 336 | 338 |
| 337 scoped_refptr<CryptohomeAuthenticator> auth_; | 339 scoped_refptr<CryptohomeAuthenticator> auth_; |
| 338 scoped_ptr<TestAttemptState> state_; | 340 std::unique_ptr<TestAttemptState> state_; |
| 339 FakeCryptohomeClient* fake_cryptohome_client_; | 341 FakeCryptohomeClient* fake_cryptohome_client_; |
| 340 | 342 |
| 341 scoped_refptr<ownership::MockOwnerKeyUtil> owner_key_util_; | 343 scoped_refptr<ownership::MockOwnerKeyUtil> owner_key_util_; |
| 342 | 344 |
| 343 private: | 345 private: |
| 344 void InvokeGetDataExCallback( | 346 void InvokeGetDataExCallback( |
| 345 const cryptohome::HomedirMethods::GetKeyDataCallback& callback) { | 347 const cryptohome::HomedirMethods::GetKeyDataCallback& callback) { |
| 346 callback.Run(true /* success */, | 348 callback.Run(true /* success */, |
| 347 cryptohome::MOUNT_ERROR_NONE, | 349 cryptohome::MOUNT_ERROR_NONE, |
| 348 key_definitions_); | 350 key_definitions_); |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 563 // remove attempt. | 565 // remove attempt. |
| 564 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | 566 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); |
| 565 EXPECT_CALL( | 567 EXPECT_CALL( |
| 566 *mock_caller_, | 568 *mock_caller_, |
| 567 AsyncRemove(cryptohome::Identification(user_context_.GetAccountId()), _)) | 569 AsyncRemove(cryptohome::Identification(user_context_.GetAccountId()), _)) |
| 568 .Times(1) | 570 .Times(1) |
| 569 .RetiresOnSaturation(); | 571 .RetiresOnSaturation(); |
| 570 | 572 |
| 571 // Set up mock homedir methods to respond successfully to a cryptohome create | 573 // Set up mock homedir methods to respond successfully to a cryptohome create |
| 572 // attempt. | 574 // attempt. |
| 573 ExpectGetKeyDataExCall(scoped_ptr<int64_t>(), scoped_ptr<std::string>()); | 575 ExpectGetKeyDataExCall(std::unique_ptr<int64_t>(), |
| 576 std::unique_ptr<std::string>()); |
| 574 ExpectMountExCall(true /* expect_create_attempt */); | 577 ExpectMountExCall(true /* expect_create_attempt */); |
| 575 | 578 |
| 576 state_->PresetOnlineLoginStatus(AuthFailure::AuthFailureNone()); | 579 state_->PresetOnlineLoginStatus(AuthFailure::AuthFailureNone()); |
| 577 SetAttemptState(auth_.get(), state_.release()); | 580 SetAttemptState(auth_.get(), state_.release()); |
| 578 | 581 |
| 579 auth_->ResyncEncryptedData(); | 582 auth_->ResyncEncryptedData(); |
| 580 base::MessageLoop::current()->Run(); | 583 base::MessageLoop::current()->Run(); |
| 581 } | 584 } |
| 582 | 585 |
| 583 TEST_F(CryptohomeAuthenticatorTest, DriveResyncFail) { | 586 TEST_F(CryptohomeAuthenticatorTest, DriveResyncFail) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 620 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | 623 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); |
| 621 EXPECT_CALL( | 624 EXPECT_CALL( |
| 622 *mock_caller_, | 625 *mock_caller_, |
| 623 AsyncMigrateKey(cryptohome::Identification(user_context_.GetAccountId()), | 626 AsyncMigrateKey(cryptohome::Identification(user_context_.GetAccountId()), |
| 624 _, transformed_key_.GetSecret(), _)) | 627 _, transformed_key_.GetSecret(), _)) |
| 625 .Times(1) | 628 .Times(1) |
| 626 .RetiresOnSaturation(); | 629 .RetiresOnSaturation(); |
| 627 | 630 |
| 628 // Set up mock homedir methods to respond successfully to a cryptohome mount | 631 // Set up mock homedir methods to respond successfully to a cryptohome mount |
| 629 // attempt. | 632 // attempt. |
| 630 ExpectGetKeyDataExCall(scoped_ptr<int64_t>(), scoped_ptr<std::string>()); | 633 ExpectGetKeyDataExCall(std::unique_ptr<int64_t>(), |
| 634 std::unique_ptr<std::string>()); |
| 631 ExpectMountExCall(false /* expect_create_attempt */); | 635 ExpectMountExCall(false /* expect_create_attempt */); |
| 632 | 636 |
| 633 state_->PresetOnlineLoginStatus(AuthFailure::AuthFailureNone()); | 637 state_->PresetOnlineLoginStatus(AuthFailure::AuthFailureNone()); |
| 634 SetAttemptState(auth_.get(), state_.release()); | 638 SetAttemptState(auth_.get(), state_.release()); |
| 635 | 639 |
| 636 auth_->RecoverEncryptedData(std::string()); | 640 auth_->RecoverEncryptedData(std::string()); |
| 637 base::MessageLoop::current()->Run(); | 641 base::MessageLoop::current()->Run(); |
| 638 } | 642 } |
| 639 | 643 |
| 640 TEST_F(CryptohomeAuthenticatorTest, DriveDataRecoverButFail) { | 644 TEST_F(CryptohomeAuthenticatorTest, DriveDataRecoverButFail) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 | 687 |
| 684 TEST_F(CryptohomeAuthenticatorTest, DriveCreateForNewUser) { | 688 TEST_F(CryptohomeAuthenticatorTest, DriveCreateForNewUser) { |
| 685 UserContext expected_user_context(user_context_with_transformed_key_); | 689 UserContext expected_user_context(user_context_with_transformed_key_); |
| 686 expected_user_context.SetUserIDHash( | 690 expected_user_context.SetUserIDHash( |
| 687 cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername); | 691 cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername); |
| 688 ExpectLoginSuccess(expected_user_context); | 692 ExpectLoginSuccess(expected_user_context); |
| 689 FailOnLoginFailure(); | 693 FailOnLoginFailure(); |
| 690 | 694 |
| 691 // Set up mock homedir methods to respond successfully to a cryptohome create | 695 // Set up mock homedir methods to respond successfully to a cryptohome create |
| 692 // attempt. | 696 // attempt. |
| 693 ExpectGetKeyDataExCall(scoped_ptr<int64_t>(), scoped_ptr<std::string>()); | 697 ExpectGetKeyDataExCall(std::unique_ptr<int64_t>(), |
| 698 std::unique_ptr<std::string>()); |
| 694 ExpectMountExCall(true /* expect_create_attempt */); | 699 ExpectMountExCall(true /* expect_create_attempt */); |
| 695 | 700 |
| 696 // Set up state as though a cryptohome mount attempt has occurred | 701 // Set up state as though a cryptohome mount attempt has occurred |
| 697 // and been rejected because the user doesn't exist; additionally, | 702 // and been rejected because the user doesn't exist; additionally, |
| 698 // an online auth attempt has completed successfully. | 703 // an online auth attempt has completed successfully. |
| 699 state_->PresetCryptohomeStatus(false, | 704 state_->PresetCryptohomeStatus(false, |
| 700 cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST); | 705 cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST); |
| 701 state_->PresetOnlineLoginStatus(AuthFailure::AuthFailureNone()); | 706 state_->PresetOnlineLoginStatus(AuthFailure::AuthFailureNone()); |
| 702 SetAttemptState(auth_.get(), state_.release()); | 707 SetAttemptState(auth_.get(), state_.release()); |
| 703 | 708 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 754 expected_user_context.SetUserIDHash( | 759 expected_user_context.SetUserIDHash( |
| 755 cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername); | 760 cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername); |
| 756 ExpectLoginSuccess(expected_user_context); | 761 ExpectLoginSuccess(expected_user_context); |
| 757 FailOnLoginFailure(); | 762 FailOnLoginFailure(); |
| 758 | 763 |
| 759 // Set up mock homedir methods to respond with key metadata indicating that a | 764 // Set up mock homedir methods to respond with key metadata indicating that a |
| 760 // pre-hashed key was used to create the cryptohome and allow a successful | 765 // pre-hashed key was used to create the cryptohome and allow a successful |
| 761 // mount when this pre-hashed key is used. | 766 // mount when this pre-hashed key is used. |
| 762 | 767 |
| 763 ExpectGetKeyDataExCall( | 768 ExpectGetKeyDataExCall( |
| 764 make_scoped_ptr(new int64_t(Key::KEY_TYPE_SALTED_SHA256)), | 769 base::WrapUnique(new int64_t(Key::KEY_TYPE_SALTED_SHA256)), |
| 765 make_scoped_ptr(new std::string(kSalt))); | 770 base::WrapUnique(new std::string(kSalt))); |
| 766 ExpectMountExCall(false /* expect_create_attempt */); | 771 ExpectMountExCall(false /* expect_create_attempt */); |
| 767 | 772 |
| 768 auth_->AuthenticateToLogin(NULL, user_context_); | 773 auth_->AuthenticateToLogin(NULL, user_context_); |
| 769 base::RunLoop().Run(); | 774 base::RunLoop().Run(); |
| 770 } | 775 } |
| 771 | 776 |
| 772 TEST_F(CryptohomeAuthenticatorTest, FailLoginWithMissingSalt) { | 777 TEST_F(CryptohomeAuthenticatorTest, FailLoginWithMissingSalt) { |
| 773 CreateTransformedKey(Key::KEY_TYPE_SALTED_SHA256, kSalt); | 778 CreateTransformedKey(Key::KEY_TYPE_SALTED_SHA256, kSalt); |
| 774 | 779 |
| 775 FailOnLoginSuccess(); | 780 FailOnLoginSuccess(); |
| 776 ExpectLoginFailure(AuthFailure(AuthFailure::COULD_NOT_MOUNT_CRYPTOHOME)); | 781 ExpectLoginFailure(AuthFailure(AuthFailure::COULD_NOT_MOUNT_CRYPTOHOME)); |
| 777 | 782 |
| 778 // Set up mock homedir methods to respond with key metadata indicating that a | 783 // Set up mock homedir methods to respond with key metadata indicating that a |
| 779 // pre-hashed key was used to create the cryptohome but without the required | 784 // pre-hashed key was used to create the cryptohome but without the required |
| 780 // salt. | 785 // salt. |
| 781 ExpectGetKeyDataExCall( | 786 ExpectGetKeyDataExCall( |
| 782 make_scoped_ptr(new int64_t(Key::KEY_TYPE_SALTED_SHA256)), | 787 base::WrapUnique(new int64_t(Key::KEY_TYPE_SALTED_SHA256)), |
| 783 scoped_ptr<std::string>()); | 788 std::unique_ptr<std::string>()); |
| 784 | 789 |
| 785 auth_->AuthenticateToLogin(NULL, user_context_); | 790 auth_->AuthenticateToLogin(NULL, user_context_); |
| 786 base::RunLoop().Run(); | 791 base::RunLoop().Run(); |
| 787 } | 792 } |
| 788 | 793 |
| 789 } // namespace chromeos | 794 } // namespace chromeos |
| OLD | NEW |