| Index: chrome/browser/chromeos/login/extended_authenticator.cc
|
| diff --git a/chrome/browser/chromeos/login/extended_authenticator.cc b/chrome/browser/chromeos/login/extended_authenticator.cc
|
| deleted file mode 100644
|
| index bee6f64ef06782f7fa4340e11c3a4728ca1e9763..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/chromeos/login/extended_authenticator.cc
|
| +++ /dev/null
|
| @@ -1,406 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/chromeos/login/extended_authenticator.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "chrome/browser/chromeos/boot_times_loader.h"
|
| -#include "chrome/browser/chromeos/login/login_status_consumer.h"
|
| -#include "chrome/browser/chromeos/login/parallel_authenticator.h"
|
| -#include "chromeos/cryptohome/async_method_caller.h"
|
| -#include "chromeos/cryptohome/cryptohome_parameters.h"
|
| -#include "chromeos/cryptohome/homedir_methods.h"
|
| -#include "chromeos/cryptohome/system_salt_getter.h"
|
| -#include "chromeos/dbus/cryptohome_client.h"
|
| -#include "chromeos/dbus/dbus_thread_manager.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "crypto/sha2.h"
|
| -#include "google_apis/gaia/gaia_auth_util.h"
|
| -#include "third_party/cros_system_api/dbus/service_constants.h"
|
| -
|
| -using content::BrowserThread;
|
| -
|
| -namespace chromeos {
|
| -
|
| -namespace {
|
| -
|
| -void RecordStartMarker(const std::string& marker) {
|
| - std::string full_marker = "Cryptohome-";
|
| - full_marker.append(marker);
|
| - full_marker.append("-Start");
|
| - chromeos::BootTimesLoader::Get()->AddLoginTimeMarker(full_marker, false);
|
| -}
|
| -
|
| -void RecordEndMarker(const std::string& marker) {
|
| - std::string full_marker = "Cryptohome-";
|
| - full_marker.append(marker);
|
| - full_marker.append("-End");
|
| - chromeos::BootTimesLoader::Get()->AddLoginTimeMarker(full_marker, false);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -ExtendedAuthenticator::ExtendedAuthenticator(AuthStatusConsumer* consumer)
|
| - : salt_obtained_(false), consumer_(consumer), old_consumer_(NULL) {
|
| - SystemSaltGetter::Get()->GetSystemSalt(
|
| - base::Bind(&ExtendedAuthenticator::OnSaltObtained, this));
|
| -}
|
| -
|
| -ExtendedAuthenticator::ExtendedAuthenticator(LoginStatusConsumer* consumer)
|
| - : salt_obtained_(false), consumer_(NULL), old_consumer_(consumer) {
|
| - SystemSaltGetter::Get()->GetSystemSalt(
|
| - base::Bind(&ExtendedAuthenticator::OnSaltObtained, this));
|
| -}
|
| -
|
| -ExtendedAuthenticator::~ExtendedAuthenticator() {}
|
| -
|
| -void ExtendedAuthenticator::SetConsumer(LoginStatusConsumer* consumer) {
|
| - old_consumer_ = consumer;
|
| -}
|
| -
|
| -void ExtendedAuthenticator::OnSaltObtained(const std::string& system_salt) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - salt_obtained_ = true;
|
| - system_salt_ = system_salt;
|
| - for (size_t i = 0; i < hashing_queue_.size(); i++) {
|
| - hashing_queue_[i].Run(system_salt);
|
| - }
|
| - hashing_queue_.clear();
|
| -}
|
| -
|
| -void ExtendedAuthenticator::AuthenticateToMount(
|
| - const UserContext& context,
|
| - const HashSuccessCallback& success_callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - TransformContext(context,
|
| - base::Bind(&ExtendedAuthenticator::DoAuthenticateToMount,
|
| - this,
|
| - success_callback));
|
| -}
|
| -
|
| -void ExtendedAuthenticator::AuthenticateToCheck(
|
| - const UserContext& context,
|
| - const base::Closure& success_callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - TransformContext(context,
|
| - base::Bind(&ExtendedAuthenticator::DoAuthenticateToCheck,
|
| - this,
|
| - success_callback));
|
| -}
|
| -
|
| -void ExtendedAuthenticator::CreateMount(
|
| - const std::string& user_id,
|
| - const std::vector<cryptohome::KeyDefinition>& keys,
|
| - const HashSuccessCallback& success_callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - RecordStartMarker("MountEx");
|
| -
|
| - std::string canonicalized = gaia::CanonicalizeEmail(user_id);
|
| - cryptohome::Identification id(canonicalized);
|
| - cryptohome::Authorization auth(keys.front());
|
| - cryptohome::MountParameters mount(false);
|
| - for (size_t i = 0; i < keys.size(); i++) {
|
| - mount.create_keys.push_back(keys[i]);
|
| - }
|
| - UserContext context(user_id, keys.front().key, std::string());
|
| - context.SetKeyLabel(keys.front().label);
|
| -
|
| - cryptohome::HomedirMethods::GetInstance()->MountEx(
|
| - id,
|
| - auth,
|
| - mount,
|
| - base::Bind(&ExtendedAuthenticator::OnMountComplete,
|
| - this,
|
| - "MountEx",
|
| - context,
|
| - success_callback));
|
| -}
|
| -
|
| -void ExtendedAuthenticator::AddKey(const UserContext& context,
|
| - const cryptohome::KeyDefinition& key,
|
| - bool replace_existing,
|
| - const base::Closure& success_callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - TransformContext(context,
|
| - base::Bind(&ExtendedAuthenticator::DoAddKey,
|
| - this,
|
| - key,
|
| - replace_existing,
|
| - success_callback));
|
| -}
|
| -
|
| -void ExtendedAuthenticator::UpdateKeyAuthorized(
|
| - const UserContext& context,
|
| - const cryptohome::KeyDefinition& key,
|
| - const std::string& signature,
|
| - const base::Closure& success_callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - TransformContext(context,
|
| - base::Bind(&ExtendedAuthenticator::DoUpdateKeyAuthorized,
|
| - this,
|
| - key,
|
| - signature,
|
| - success_callback));
|
| -}
|
| -
|
| -void ExtendedAuthenticator::RemoveKey(const UserContext& context,
|
| - const std::string& key_to_remove,
|
| - const base::Closure& success_callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - TransformContext(context,
|
| - base::Bind(&ExtendedAuthenticator::DoRemoveKey,
|
| - this,
|
| - key_to_remove,
|
| - success_callback));
|
| -}
|
| -
|
| -void ExtendedAuthenticator::DoAuthenticateToMount(
|
| - const HashSuccessCallback& success_callback,
|
| - const UserContext& user_context) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - RecordStartMarker("MountEx");
|
| -
|
| - std::string canonicalized = gaia::CanonicalizeEmail(user_context.GetUserID());
|
| - cryptohome::Identification id(canonicalized);
|
| - cryptohome::Authorization auth(user_context.GetPassword(),
|
| - user_context.GetKeyLabel());
|
| - cryptohome::MountParameters mount(false);
|
| -
|
| - cryptohome::HomedirMethods::GetInstance()->MountEx(
|
| - id,
|
| - auth,
|
| - mount,
|
| - base::Bind(&ExtendedAuthenticator::OnMountComplete,
|
| - this,
|
| - "MountEx",
|
| - user_context,
|
| - success_callback));
|
| -}
|
| -
|
| -void ExtendedAuthenticator::DoAuthenticateToCheck(
|
| - const base::Closure& success_callback,
|
| - const UserContext& user_context) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - RecordStartMarker("CheckKeyEx");
|
| -
|
| - std::string canonicalized = gaia::CanonicalizeEmail(user_context.GetUserID());
|
| - cryptohome::Identification id(canonicalized);
|
| - cryptohome::Authorization auth(user_context.GetPassword(),
|
| - user_context.GetKeyLabel());
|
| -
|
| - cryptohome::HomedirMethods::GetInstance()->CheckKeyEx(
|
| - id,
|
| - auth,
|
| - base::Bind(&ExtendedAuthenticator::OnOperationComplete,
|
| - this,
|
| - "CheckKeyEx",
|
| - user_context,
|
| - success_callback));
|
| -}
|
| -
|
| -void ExtendedAuthenticator::DoAddKey(const cryptohome::KeyDefinition& key,
|
| - bool replace_existing,
|
| - const base::Closure& success_callback,
|
| - const UserContext& user_context) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - RecordStartMarker("AddKeyEx");
|
| -
|
| - std::string canonicalized = gaia::CanonicalizeEmail(user_context.GetUserID());
|
| - cryptohome::Identification id(canonicalized);
|
| - cryptohome::Authorization auth(user_context.GetPassword(),
|
| - user_context.GetKeyLabel());
|
| -
|
| - cryptohome::HomedirMethods::GetInstance()->AddKeyEx(
|
| - id,
|
| - auth,
|
| - key,
|
| - replace_existing,
|
| - base::Bind(&ExtendedAuthenticator::OnOperationComplete,
|
| - this,
|
| - "AddKeyEx",
|
| - user_context,
|
| - success_callback));
|
| -}
|
| -
|
| -void ExtendedAuthenticator::DoUpdateKeyAuthorized(
|
| - const cryptohome::KeyDefinition& key,
|
| - const std::string& signature,
|
| - const base::Closure& success_callback,
|
| - const UserContext& user_context) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - RecordStartMarker("UpdateKeyAuthorized");
|
| -
|
| - std::string canonicalized = gaia::CanonicalizeEmail(user_context.GetUserID());
|
| - cryptohome::Identification id(canonicalized);
|
| - cryptohome::Authorization auth(user_context.GetPassword(),
|
| - user_context.GetKeyLabel());
|
| -
|
| - cryptohome::HomedirMethods::GetInstance()->UpdateKeyEx(
|
| - id,
|
| - auth,
|
| - key,
|
| - signature,
|
| - base::Bind(&ExtendedAuthenticator::OnOperationComplete,
|
| - this,
|
| - "UpdateKeyAuthorized",
|
| - user_context,
|
| - success_callback));
|
| -}
|
| -
|
| -void ExtendedAuthenticator::DoRemoveKey(const std::string& key_to_remove,
|
| - const base::Closure& success_callback,
|
| - const UserContext& user_context) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - RecordStartMarker("RemoveKeyEx");
|
| -
|
| - std::string canonicalized = gaia::CanonicalizeEmail(user_context.GetUserID());
|
| - cryptohome::Identification id(canonicalized);
|
| - cryptohome::Authorization auth(user_context.GetPassword(),
|
| - user_context.GetKeyLabel());
|
| -
|
| - cryptohome::HomedirMethods::GetInstance()->RemoveKeyEx(
|
| - id,
|
| - auth,
|
| - key_to_remove,
|
| - base::Bind(&ExtendedAuthenticator::OnOperationComplete,
|
| - this,
|
| - "RemoveKeyEx",
|
| - user_context,
|
| - success_callback));
|
| -}
|
| -
|
| -void ExtendedAuthenticator::OnMountComplete(
|
| - const std::string& time_marker,
|
| - const UserContext& user_context,
|
| - const HashSuccessCallback& success_callback,
|
| - bool success,
|
| - cryptohome::MountError return_code,
|
| - const std::string& mount_hash) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - RecordEndMarker(time_marker);
|
| - UserContext copy;
|
| - copy.CopyFrom(user_context);
|
| - copy.SetUserIDHash(mount_hash);
|
| - if (return_code == cryptohome::MOUNT_ERROR_NONE) {
|
| - if (!success_callback.is_null())
|
| - success_callback.Run(mount_hash);
|
| - if (old_consumer_)
|
| - old_consumer_->OnLoginSuccess(copy);
|
| - return;
|
| - }
|
| - AuthState state = FAILED_MOUNT;
|
| - if (return_code == cryptohome::MOUNT_ERROR_TPM_COMM_ERROR ||
|
| - return_code == cryptohome::MOUNT_ERROR_TPM_DEFEND_LOCK ||
|
| - return_code == cryptohome::MOUNT_ERROR_TPM_NEEDS_REBOOT) {
|
| - state = FAILED_TPM;
|
| - }
|
| - if (return_code == cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST) {
|
| - state = NO_MOUNT;
|
| - }
|
| - if (consumer_)
|
| - consumer_->OnAuthenticationFailure(state);
|
| - if (old_consumer_) {
|
| - LoginFailure failure(LoginFailure::COULD_NOT_MOUNT_CRYPTOHOME);
|
| - old_consumer_->OnLoginFailure(failure);
|
| - }
|
| -}
|
| -
|
| -void ExtendedAuthenticator::OnOperationComplete(
|
| - const std::string& time_marker,
|
| - const UserContext& user_context,
|
| - const base::Closure& success_callback,
|
| - bool success,
|
| - cryptohome::MountError return_code) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - RecordEndMarker(time_marker);
|
| - if (return_code == cryptohome::MOUNT_ERROR_NONE) {
|
| - if (!success_callback.is_null())
|
| - success_callback.Run();
|
| - if (old_consumer_)
|
| - old_consumer_->OnLoginSuccess(user_context);
|
| - return;
|
| - }
|
| -
|
| - AuthState state = FAILED_MOUNT;
|
| -
|
| - if (return_code == cryptohome::MOUNT_ERROR_TPM_COMM_ERROR ||
|
| - return_code == cryptohome::MOUNT_ERROR_TPM_DEFEND_LOCK ||
|
| - return_code == cryptohome::MOUNT_ERROR_TPM_NEEDS_REBOOT) {
|
| - state = FAILED_TPM;
|
| - }
|
| -
|
| - if (return_code == cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST)
|
| - state = NO_MOUNT;
|
| -
|
| - if (consumer_)
|
| - consumer_->OnAuthenticationFailure(state);
|
| -
|
| - if (old_consumer_) {
|
| - LoginFailure failure(LoginFailure::UNLOCK_FAILED);
|
| - old_consumer_->OnLoginFailure(failure);
|
| - }
|
| -}
|
| -
|
| -void ExtendedAuthenticator::HashPasswordWithSalt(
|
| - const std::string& password,
|
| - const HashSuccessCallback& success_callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(consumer_) << "This is a part of new API";
|
| -
|
| - DoHashWithSalt(password, success_callback, system_salt_);
|
| -}
|
| -
|
| -void ExtendedAuthenticator::TransformContext(const UserContext& user_context,
|
| - const ContextCallback& callback) {
|
| - if (!user_context.DoesNeedPasswordHashing()) {
|
| - callback.Run(user_context);
|
| - } else {
|
| - DoHashWithSalt(user_context.GetPassword(),
|
| - base::Bind(&ExtendedAuthenticator::DidTransformContext,
|
| - this,
|
| - user_context,
|
| - callback),
|
| - system_salt_);
|
| - }
|
| -}
|
| -
|
| -void ExtendedAuthenticator::DidTransformContext(
|
| - const UserContext& user_context,
|
| - const ContextCallback& callback,
|
| - const std::string& hashed_password) {
|
| - DCHECK(user_context.DoesNeedPasswordHashing());
|
| - UserContext context;
|
| - context.CopyFrom(user_context);
|
| - context.SetPassword(hashed_password);
|
| - context.SetDoesNeedPasswordHashing(false);
|
| - callback.Run(context);
|
| -}
|
| -
|
| -void ExtendedAuthenticator::DoHashWithSalt(const std::string& password,
|
| - const HashSuccessCallback& callback,
|
| - const std::string& system_salt) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - if (salt_obtained_) {
|
| - std::string hash =
|
| - ParallelAuthenticator::HashPassword(password, system_salt);
|
| - callback.Run(hash);
|
| - return;
|
| - }
|
| - hashing_queue_.push_back(base::Bind(
|
| - &ExtendedAuthenticator::DoHashWithSalt, this, password, callback));
|
| -}
|
| -
|
| -} // namespace chromeos
|
|
|