| Index: components/proximity_auth/cryptauth/cryptauth_enroller_impl.cc
|
| diff --git a/components/proximity_auth/cryptauth/cryptauth_enroller_impl.cc b/components/proximity_auth/cryptauth/cryptauth_enroller_impl.cc
|
| deleted file mode 100644
|
| index 406a5946099c2cc2b5007393fe318a1001a31c19..0000000000000000000000000000000000000000
|
| --- a/components/proximity_auth/cryptauth/cryptauth_enroller_impl.cc
|
| +++ /dev/null
|
| @@ -1,229 +0,0 @@
|
| -// Copyright 2015 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 "components/proximity_auth/cryptauth/cryptauth_enroller_impl.h"
|
| -
|
| -#include <utility>
|
| -
|
| -#include "base/bind.h"
|
| -#include "components/proximity_auth/cryptauth/cryptauth_client_impl.h"
|
| -#include "components/proximity_auth/cryptauth/cryptauth_enrollment_utils.h"
|
| -#include "components/proximity_auth/cryptauth/secure_message_delegate.h"
|
| -#include "components/proximity_auth/logging/logging.h"
|
| -#include "crypto/sha2.h"
|
| -
|
| -namespace proximity_auth {
|
| -
|
| -namespace {
|
| -
|
| -// A successful SetupEnrollment or FinishEnrollment response should contain this
|
| -// status string.
|
| -const char kResponseStatusOk[] = "ok";
|
| -
|
| -// The name of the "gcmV1" protocol that the enrolling device supports.
|
| -const char kSupportedEnrollmentTypeGcmV1[] = "gcmV1";
|
| -
|
| -// The version field of the GcmMetadata message.
|
| -const int kGCMMetadataVersion = 1;
|
| -
|
| -// Returns true if |device_info| contains the required fields for enrollment.
|
| -bool ValidateDeviceInfo(const cryptauth::GcmDeviceInfo& device_info) {
|
| - if (!device_info.has_long_device_id()) {
|
| - PA_LOG(ERROR) << "Expected long_device_id field in GcmDeviceInfo.";
|
| - return false;
|
| - }
|
| -
|
| - if (!device_info.has_device_type()) {
|
| - PA_LOG(ERROR) << "Expected device_type field in GcmDeviceInfo.";
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -// Creates the public metadata to put in the SecureMessage that is sent to the
|
| -// server with the FinishEnrollment request.
|
| -std::string CreateEnrollmentPublicMetadata() {
|
| - cryptauth::GcmMetadata metadata;
|
| - metadata.set_version(kGCMMetadataVersion);
|
| - metadata.set_type(cryptauth::MessageType::ENROLLMENT);
|
| - return metadata.SerializeAsString();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -CryptAuthEnrollerImpl::CryptAuthEnrollerImpl(
|
| - std::unique_ptr<CryptAuthClientFactory> client_factory,
|
| - std::unique_ptr<SecureMessageDelegate> secure_message_delegate)
|
| - : client_factory_(std::move(client_factory)),
|
| - secure_message_delegate_(std::move(secure_message_delegate)),
|
| - weak_ptr_factory_(this) {}
|
| -
|
| -CryptAuthEnrollerImpl::~CryptAuthEnrollerImpl() {
|
| -}
|
| -
|
| -void CryptAuthEnrollerImpl::Enroll(
|
| - const std::string& user_public_key,
|
| - const std::string& user_private_key,
|
| - const cryptauth::GcmDeviceInfo& device_info,
|
| - cryptauth::InvocationReason invocation_reason,
|
| - const EnrollmentFinishedCallback& callback) {
|
| - if (!callback_.is_null()) {
|
| - PA_LOG(ERROR) << "Enroll() already called. Do not reuse.";
|
| - callback.Run(false);
|
| - return;
|
| - }
|
| -
|
| - user_public_key_ = user_public_key;
|
| - user_private_key_ = user_private_key;
|
| - device_info_ = device_info;
|
| - invocation_reason_ = invocation_reason;
|
| - callback_ = callback;
|
| -
|
| - if (!ValidateDeviceInfo(device_info)) {
|
| - callback.Run(false);
|
| - return;
|
| - }
|
| -
|
| - secure_message_delegate_->GenerateKeyPair(
|
| - base::Bind(&CryptAuthEnrollerImpl::OnKeyPairGenerated,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void CryptAuthEnrollerImpl::OnKeyPairGenerated(const std::string& public_key,
|
| - const std::string& private_key) {
|
| - PA_LOG(INFO) << "Ephemeral key pair generated, calling SetupEnrollment API.";
|
| - session_public_key_ = public_key;
|
| - session_private_key_ = private_key;
|
| -
|
| - cryptauth_client_ = client_factory_->CreateInstance();
|
| - cryptauth::SetupEnrollmentRequest request;
|
| - request.add_types(kSupportedEnrollmentTypeGcmV1);
|
| - request.set_invocation_reason(invocation_reason_);
|
| - cryptauth_client_->SetupEnrollment(
|
| - request, base::Bind(&CryptAuthEnrollerImpl::OnSetupEnrollmentSuccess,
|
| - weak_ptr_factory_.GetWeakPtr()),
|
| - base::Bind(&CryptAuthEnrollerImpl::OnSetupEnrollmentFailure,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void CryptAuthEnrollerImpl::OnSetupEnrollmentSuccess(
|
| - const cryptauth::SetupEnrollmentResponse& response) {
|
| - if (response.status() != kResponseStatusOk) {
|
| - PA_LOG(WARNING) << "Unexpected status for SetupEnrollment: "
|
| - << response.status();
|
| - callback_.Run(false);
|
| - return;
|
| - }
|
| -
|
| - if (response.infos_size() == 0) {
|
| - PA_LOG(ERROR) << "No response info returned by server for SetupEnrollment";
|
| - callback_.Run(false);
|
| - return;
|
| - }
|
| -
|
| - PA_LOG(INFO) << "SetupEnrollment request succeeded: deriving symmetric key.";
|
| - setup_info_ = response.infos(0);
|
| - device_info_.set_enrollment_session_id(setup_info_.enrollment_session_id());
|
| -
|
| - secure_message_delegate_->DeriveKey(
|
| - session_private_key_, setup_info_.server_ephemeral_key(),
|
| - base::Bind(&CryptAuthEnrollerImpl::OnKeyDerived,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void CryptAuthEnrollerImpl::OnSetupEnrollmentFailure(const std::string& error) {
|
| - PA_LOG(WARNING) << "SetupEnrollment API failed with error: " << error;
|
| - callback_.Run(false);
|
| -}
|
| -
|
| -void CryptAuthEnrollerImpl::OnKeyDerived(const std::string& symmetric_key) {
|
| - PA_LOG(INFO) << "Derived symmetric key, "
|
| - << "encrypting enrollment data for upload.";
|
| -
|
| - // Make sure we're enrolling the same public key used below to sign the
|
| - // secure message.
|
| - device_info_.set_user_public_key(user_public_key_);
|
| - device_info_.set_key_handle(user_public_key_);
|
| -
|
| - // Hash the symmetric key and add it to the |device_info_| to be uploaded.
|
| - device_info_.set_device_master_key_hash(
|
| - crypto::SHA256HashString(symmetric_key));
|
| -
|
| - // The server verifies that the access token set here and in the header
|
| - // of the FinishEnrollment() request are the same.
|
| - device_info_.set_oauth_token(cryptauth_client_->GetAccessTokenUsed());
|
| - PA_LOG(INFO) << "Using access token: " << device_info_.oauth_token();
|
| -
|
| - symmetric_key_ = symmetric_key;
|
| - SecureMessageDelegate::CreateOptions options;
|
| - options.encryption_scheme = securemessage::NONE;
|
| - options.signature_scheme = securemessage::ECDSA_P256_SHA256;
|
| - options.verification_key_id = user_public_key_;
|
| -
|
| - // The inner message contains the signed device information that will be
|
| - // sent to CryptAuth.
|
| - secure_message_delegate_->CreateSecureMessage(
|
| - device_info_.SerializeAsString(), user_private_key_, options,
|
| - base::Bind(&CryptAuthEnrollerImpl::OnInnerSecureMessageCreated,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void CryptAuthEnrollerImpl::OnInnerSecureMessageCreated(
|
| - const std::string& inner_message) {
|
| - if (inner_message.empty()) {
|
| - PA_LOG(ERROR) << "Error creating inner message";
|
| - callback_.Run(false);
|
| - return;
|
| - }
|
| -
|
| - SecureMessageDelegate::CreateOptions options;
|
| - options.encryption_scheme = securemessage::AES_256_CBC;
|
| - options.signature_scheme = securemessage::HMAC_SHA256;
|
| - options.public_metadata = CreateEnrollmentPublicMetadata();
|
| -
|
| - // The outer message encrypts and signs the inner message with the derived
|
| - // symmetric session key.
|
| - secure_message_delegate_->CreateSecureMessage(
|
| - inner_message, symmetric_key_, options,
|
| - base::Bind(&CryptAuthEnrollerImpl::OnOuterSecureMessageCreated,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void CryptAuthEnrollerImpl::OnOuterSecureMessageCreated(
|
| - const std::string& outer_message) {
|
| - PA_LOG(INFO) << "SecureMessage created, calling FinishEnrollment API.";
|
| -
|
| - cryptauth::FinishEnrollmentRequest request;
|
| - request.set_enrollment_session_id(setup_info_.enrollment_session_id());
|
| - request.set_enrollment_message(outer_message);
|
| - request.set_device_ephemeral_key(session_public_key_);
|
| - request.set_invocation_reason(invocation_reason_);
|
| -
|
| - cryptauth_client_ = client_factory_->CreateInstance();
|
| - cryptauth_client_->FinishEnrollment(
|
| - request, base::Bind(&CryptAuthEnrollerImpl::OnFinishEnrollmentSuccess,
|
| - weak_ptr_factory_.GetWeakPtr()),
|
| - base::Bind(&CryptAuthEnrollerImpl::OnFinishEnrollmentFailure,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void CryptAuthEnrollerImpl::OnFinishEnrollmentSuccess(
|
| - const cryptauth::FinishEnrollmentResponse& response) {
|
| - if (response.status() != kResponseStatusOk) {
|
| - PA_LOG(WARNING) << "Unexpected status for FinishEnrollment: "
|
| - << response.status();
|
| - callback_.Run(false);
|
| - } else {
|
| - callback_.Run(true);
|
| - }
|
| -}
|
| -
|
| -void CryptAuthEnrollerImpl::OnFinishEnrollmentFailure(
|
| - const std::string& error) {
|
| - PA_LOG(WARNING) << "FinishEnrollment API failed with error: " << error;
|
| - callback_.Run(false);
|
| -}
|
| -
|
| -} // namespace proximity_auth
|
|
|