| Index: components/proximity_auth/cryptauth/cryptauth_enroller_impl_unittest.cc
|
| diff --git a/components/proximity_auth/cryptauth/cryptauth_enroller_impl_unittest.cc b/components/proximity_auth/cryptauth/cryptauth_enroller_impl_unittest.cc
|
| deleted file mode 100644
|
| index b4a42be77f8b50893d3580074b96e2311a85e7e1..0000000000000000000000000000000000000000
|
| --- a/components/proximity_auth/cryptauth/cryptauth_enroller_impl_unittest.cc
|
| +++ /dev/null
|
| @@ -1,359 +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 "base/bind.h"
|
| -#include "base/macros.h"
|
| -#include "base/memory/ptr_util.h"
|
| -#include "components/proximity_auth/cryptauth/cryptauth_enrollment_utils.h"
|
| -#include "components/proximity_auth/cryptauth/fake_secure_message_delegate.h"
|
| -#include "components/proximity_auth/cryptauth/mock_cryptauth_client.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using ::testing::_;
|
| -using ::testing::Return;
|
| -
|
| -namespace proximity_auth {
|
| -
|
| -namespace {
|
| -
|
| -const char kAccessTokenUsed[] = "access token used by CryptAuthClient";
|
| -
|
| -const char kClientSessionPublicKey[] = "throw away after one use";
|
| -const char kServerSessionPublicKey[] = "disposables are not eco-friendly";
|
| -
|
| -cryptauth::InvocationReason kInvocationReason =
|
| - cryptauth::INVOCATION_REASON_MANUAL;
|
| -const int kGCMMetadataVersion = 1;
|
| -const char kSupportedEnrollmentTypeGcmV1[] = "gcmV1";
|
| -const char kResponseStatusOk[] = "ok";
|
| -const char kResponseStatusNotOk[] = "Your key was too bland.";
|
| -const char kEnrollmentSessionId[] = "0123456789876543210";
|
| -const char kFinishEnrollmentError[] = "A hungry router ate all your packets.";
|
| -
|
| -const char kDeviceId[] = "2015 AD";
|
| -const cryptauth::DeviceType kDeviceType = cryptauth::CHROME;
|
| -const char kDeviceOsVersion[] = "41.0.0";
|
| -
|
| -// Creates and returns the GcmDeviceInfo message to be uploaded.
|
| -cryptauth::GcmDeviceInfo GetDeviceInfo() {
|
| - cryptauth::GcmDeviceInfo device_info;
|
| - device_info.set_long_device_id(kDeviceId);
|
| - device_info.set_device_type(kDeviceType);
|
| - device_info.set_device_os_version(kDeviceOsVersion);
|
| - return device_info;
|
| -}
|
| -
|
| -// Creates and returns the SetupEnrollmentResponse message to be returned to the
|
| -// enroller with the session_. If |success| is false, then a bad response will
|
| -// be returned.
|
| -cryptauth::SetupEnrollmentResponse GetSetupEnrollmentResponse(bool success) {
|
| - cryptauth::SetupEnrollmentResponse response;
|
| - if (!success) {
|
| - response.set_status(kResponseStatusNotOk);
|
| - return response;
|
| - }
|
| -
|
| - response.set_status(kResponseStatusOk);
|
| - cryptauth::SetupEnrollmentInfo* info = response.add_infos();
|
| - info->set_type(kSupportedEnrollmentTypeGcmV1);
|
| - info->set_enrollment_session_id(kEnrollmentSessionId);
|
| - info->set_server_ephemeral_key(kServerSessionPublicKey);
|
| - return response;
|
| -}
|
| -
|
| -// Creates and returns the FinishEnrollmentResponse message to be returned to
|
| -// the enroller with the session_. If |success| is false, then a bad response
|
| -// will be returned.
|
| -cryptauth::FinishEnrollmentResponse GetFinishEnrollmentResponse(bool success) {
|
| - cryptauth::FinishEnrollmentResponse response;
|
| - if (success) {
|
| - response.set_status(kResponseStatusOk);
|
| - } else {
|
| - response.set_status(kResponseStatusNotOk);
|
| - response.set_error_message(kFinishEnrollmentError);
|
| - }
|
| - return response;
|
| -}
|
| -
|
| -// Callback that saves the key returned by SecureMessageDelegate::DeriveKey().
|
| -void SaveDerivedKey(std::string* value_out, const std::string& value) {
|
| - *value_out = value;
|
| -}
|
| -
|
| -// Callback that saves the results returned by
|
| -// SecureMessageDelegate::UnwrapSecureMessage().
|
| -void SaveUnwrapResults(bool* verified_out,
|
| - std::string* payload_out,
|
| - securemessage::Header* header_out,
|
| - bool verified,
|
| - const std::string& payload,
|
| - const securemessage::Header& header) {
|
| - *verified_out = verified;
|
| - *payload_out = payload;
|
| - *header_out = header;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -class ProximityAuthCryptAuthEnrollerTest
|
| - : public testing::Test,
|
| - public MockCryptAuthClientFactory::Observer {
|
| - public:
|
| - ProximityAuthCryptAuthEnrollerTest()
|
| - : client_factory_(new MockCryptAuthClientFactory(
|
| - MockCryptAuthClientFactory::MockType::MAKE_NICE_MOCKS)),
|
| - secure_message_delegate_(new FakeSecureMessageDelegate()),
|
| - enroller_(base::WrapUnique(client_factory_),
|
| - base::WrapUnique(secure_message_delegate_)) {
|
| - client_factory_->AddObserver(this);
|
| -
|
| - // This call is actually synchronous.
|
| - secure_message_delegate_->GenerateKeyPair(
|
| - base::Bind(&ProximityAuthCryptAuthEnrollerTest::OnKeyPairGenerated,
|
| - base::Unretained(this)));
|
| - }
|
| -
|
| - // Starts the enroller.
|
| - void StartEnroller(const cryptauth::GcmDeviceInfo& device_info) {
|
| - secure_message_delegate_->set_next_public_key(kClientSessionPublicKey);
|
| - enroller_result_.reset();
|
| - enroller_.Enroll(
|
| - user_public_key_, user_private_key_, device_info, kInvocationReason,
|
| - base::Bind(&ProximityAuthCryptAuthEnrollerTest::OnEnrollerCompleted,
|
| - base::Unretained(this)));
|
| - }
|
| -
|
| - // Verifies that |serialized_message| is a valid SecureMessage sent with the
|
| - // FinishEnrollment API call.
|
| - void ValidateEnrollmentMessage(const std::string& serialized_message) {
|
| - // Derive the session symmetric key.
|
| - std::string server_session_private_key =
|
| - secure_message_delegate_->GetPrivateKeyForPublicKey(
|
| - kServerSessionPublicKey);
|
| - std::string symmetric_key;
|
| - secure_message_delegate_->DeriveKey(
|
| - server_session_private_key, kClientSessionPublicKey,
|
| - base::Bind(&SaveDerivedKey, &symmetric_key));
|
| -
|
| - std::string inner_message;
|
| - std::string inner_payload;
|
| - {
|
| - // Unwrap the outer message.
|
| - bool verified;
|
| - securemessage::Header header;
|
| - SecureMessageDelegate::UnwrapOptions unwrap_options;
|
| - unwrap_options.encryption_scheme = securemessage::AES_256_CBC;
|
| - unwrap_options.signature_scheme = securemessage::HMAC_SHA256;
|
| - secure_message_delegate_->UnwrapSecureMessage(
|
| - serialized_message, symmetric_key, unwrap_options,
|
| - base::Bind(&SaveUnwrapResults, &verified, &inner_message, &header));
|
| - EXPECT_TRUE(verified);
|
| -
|
| - cryptauth::GcmMetadata metadata;
|
| - ASSERT_TRUE(metadata.ParseFromString(header.public_metadata()));
|
| - EXPECT_EQ(kGCMMetadataVersion, metadata.version());
|
| - EXPECT_EQ(cryptauth::MessageType::ENROLLMENT, metadata.type());
|
| - }
|
| -
|
| - {
|
| - // Unwrap inner message.
|
| - bool verified;
|
| - securemessage::Header header;
|
| - SecureMessageDelegate::UnwrapOptions unwrap_options;
|
| - unwrap_options.encryption_scheme = securemessage::NONE;
|
| - unwrap_options.signature_scheme = securemessage::ECDSA_P256_SHA256;
|
| - secure_message_delegate_->UnwrapSecureMessage(
|
| - inner_message, user_public_key_, unwrap_options,
|
| - base::Bind(&SaveUnwrapResults, &verified, &inner_payload, &header));
|
| - EXPECT_TRUE(verified);
|
| - EXPECT_EQ(user_public_key_, header.verification_key_id());
|
| - }
|
| -
|
| - // Check that the decrypted GcmDeviceInfo is correct.
|
| - cryptauth::GcmDeviceInfo device_info;
|
| - ASSERT_TRUE(device_info.ParseFromString(inner_payload));
|
| - EXPECT_EQ(kDeviceId, device_info.long_device_id());
|
| - EXPECT_EQ(kDeviceType, device_info.device_type());
|
| - EXPECT_EQ(kDeviceOsVersion, device_info.device_os_version());
|
| - EXPECT_EQ(user_public_key_, device_info.user_public_key());
|
| - EXPECT_EQ(user_public_key_, device_info.key_handle());
|
| - EXPECT_EQ(kEnrollmentSessionId, device_info.enrollment_session_id());
|
| - }
|
| -
|
| - protected:
|
| - // MockCryptAuthClientFactory::Observer:
|
| - void OnCryptAuthClientCreated(MockCryptAuthClient* client) override {
|
| - ON_CALL(*client, SetupEnrollment(_, _, _))
|
| - .WillByDefault(Invoke(
|
| - this, &ProximityAuthCryptAuthEnrollerTest::OnSetupEnrollment));
|
| -
|
| - ON_CALL(*client, FinishEnrollment(_, _, _))
|
| - .WillByDefault(Invoke(
|
| - this, &ProximityAuthCryptAuthEnrollerTest::OnFinishEnrollment));
|
| -
|
| - ON_CALL(*client, GetAccessTokenUsed())
|
| - .WillByDefault(Return(kAccessTokenUsed));
|
| - }
|
| -
|
| - void OnKeyPairGenerated(const std::string& public_key,
|
| - const std::string& private_key) {
|
| - user_public_key_ = public_key;
|
| - user_private_key_ = private_key;
|
| - }
|
| -
|
| - void OnEnrollerCompleted(bool success) {
|
| - EXPECT_FALSE(enroller_result_.get());
|
| - enroller_result_.reset(new bool(success));
|
| - }
|
| -
|
| - void OnSetupEnrollment(
|
| - const cryptauth::SetupEnrollmentRequest& request,
|
| - const CryptAuthClient::SetupEnrollmentCallback& callback,
|
| - const CryptAuthClient::ErrorCallback& error_callback) {
|
| - // Check that SetupEnrollment is called before FinishEnrollment.
|
| - EXPECT_FALSE(setup_request_.get());
|
| - EXPECT_FALSE(finish_request_.get());
|
| - EXPECT_TRUE(setup_callback_.is_null());
|
| - EXPECT_TRUE(error_callback_.is_null());
|
| -
|
| - setup_request_.reset(new cryptauth::SetupEnrollmentRequest(request));
|
| - setup_callback_ = callback;
|
| - error_callback_ = error_callback;
|
| - }
|
| -
|
| - void OnFinishEnrollment(
|
| - const cryptauth::FinishEnrollmentRequest& request,
|
| - const CryptAuthClient::FinishEnrollmentCallback& callback,
|
| - const CryptAuthClient::ErrorCallback& error_callback) {
|
| - // Check that FinishEnrollment is called after SetupEnrollment.
|
| - EXPECT_TRUE(setup_request_.get());
|
| - EXPECT_FALSE(finish_request_.get());
|
| - EXPECT_TRUE(finish_callback_.is_null());
|
| -
|
| - finish_request_.reset(new cryptauth::FinishEnrollmentRequest(request));
|
| - finish_callback_ = callback;
|
| - error_callback_ = error_callback;
|
| - }
|
| -
|
| - // The persistent user key-pair.
|
| - std::string user_public_key_;
|
| - std::string user_private_key_;
|
| -
|
| - // Owned by |enroller_|.
|
| - MockCryptAuthClientFactory* client_factory_;
|
| - // Owned by |enroller_|.
|
| - FakeSecureMessageDelegate* secure_message_delegate_;
|
| - // The CryptAuthEnroller under test.
|
| - CryptAuthEnrollerImpl enroller_;
|
| -
|
| - // Stores the result of running |enroller_|.
|
| - std::unique_ptr<bool> enroller_result_;
|
| -
|
| - // Stored callbacks and requests for SetupEnrollment and FinishEnrollment.
|
| - std::unique_ptr<cryptauth::SetupEnrollmentRequest> setup_request_;
|
| - std::unique_ptr<cryptauth::FinishEnrollmentRequest> finish_request_;
|
| - CryptAuthClient::SetupEnrollmentCallback setup_callback_;
|
| - CryptAuthClient::FinishEnrollmentCallback finish_callback_;
|
| - CryptAuthClient::ErrorCallback error_callback_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ProximityAuthCryptAuthEnrollerTest);
|
| -};
|
| -
|
| -TEST_F(ProximityAuthCryptAuthEnrollerTest, EnrollmentSucceeds) {
|
| - StartEnroller(GetDeviceInfo());
|
| -
|
| - // Handle SetupEnrollment request.
|
| - EXPECT_TRUE(setup_request_.get());
|
| - EXPECT_EQ(kInvocationReason, setup_request_->invocation_reason());
|
| - ASSERT_EQ(1, setup_request_->types_size());
|
| - EXPECT_EQ(kSupportedEnrollmentTypeGcmV1, setup_request_->types(0));
|
| - ASSERT_FALSE(setup_callback_.is_null());
|
| - setup_callback_.Run(GetSetupEnrollmentResponse(true));
|
| -
|
| - // Handle FinishEnrollment request.
|
| - EXPECT_TRUE(finish_request_.get());
|
| - EXPECT_EQ(kEnrollmentSessionId, finish_request_->enrollment_session_id());
|
| - EXPECT_EQ(kClientSessionPublicKey, finish_request_->device_ephemeral_key());
|
| - ValidateEnrollmentMessage(finish_request_->enrollment_message());
|
| - EXPECT_EQ(kInvocationReason, finish_request_->invocation_reason());
|
| -
|
| - ASSERT_FALSE(finish_callback_.is_null());
|
| - finish_callback_.Run(GetFinishEnrollmentResponse(true));
|
| -
|
| - ASSERT_TRUE(enroller_result_.get());
|
| - EXPECT_TRUE(*enroller_result_);
|
| -}
|
| -
|
| -TEST_F(ProximityAuthCryptAuthEnrollerTest, SetupEnrollmentApiCallError) {
|
| - StartEnroller(GetDeviceInfo());
|
| -
|
| - EXPECT_TRUE(setup_request_.get());
|
| - ASSERT_FALSE(error_callback_.is_null());
|
| - error_callback_.Run("Setup enrollment failed network");
|
| -
|
| - EXPECT_TRUE(finish_callback_.is_null());
|
| - ASSERT_TRUE(enroller_result_.get());
|
| - EXPECT_FALSE(*enroller_result_);
|
| -}
|
| -
|
| -TEST_F(ProximityAuthCryptAuthEnrollerTest, SetupEnrollmentBadStatus) {
|
| - StartEnroller(GetDeviceInfo());
|
| -
|
| - EXPECT_TRUE(setup_request_.get());
|
| - setup_callback_.Run(GetSetupEnrollmentResponse(false));
|
| -
|
| - EXPECT_TRUE(finish_callback_.is_null());
|
| - ASSERT_TRUE(enroller_result_.get());
|
| - EXPECT_FALSE(*enroller_result_);
|
| -}
|
| -
|
| -TEST_F(ProximityAuthCryptAuthEnrollerTest, SetupEnrollmentNoInfosReturned) {
|
| - StartEnroller(GetDeviceInfo());
|
| - EXPECT_TRUE(setup_request_.get());
|
| - cryptauth::SetupEnrollmentResponse response;
|
| - response.set_status(kResponseStatusOk);
|
| - setup_callback_.Run(response);
|
| -
|
| - EXPECT_TRUE(finish_callback_.is_null());
|
| - ASSERT_TRUE(enroller_result_.get());
|
| - EXPECT_FALSE(*enroller_result_);
|
| -}
|
| -
|
| -TEST_F(ProximityAuthCryptAuthEnrollerTest, FinishEnrollmentApiCallError) {
|
| - StartEnroller(GetDeviceInfo());
|
| - setup_callback_.Run(GetSetupEnrollmentResponse(true));
|
| - ASSERT_FALSE(error_callback_.is_null());
|
| - error_callback_.Run("finish enrollment oauth error");
|
| - ASSERT_TRUE(enroller_result_.get());
|
| - EXPECT_FALSE(*enroller_result_);
|
| -}
|
| -
|
| -TEST_F(ProximityAuthCryptAuthEnrollerTest, FinishEnrollmentBadStatus) {
|
| - StartEnroller(GetDeviceInfo());
|
| - setup_callback_.Run(GetSetupEnrollmentResponse(true));
|
| - ASSERT_FALSE(finish_callback_.is_null());
|
| - finish_callback_.Run(GetFinishEnrollmentResponse(false));
|
| - ASSERT_TRUE(enroller_result_.get());
|
| - EXPECT_FALSE(*enroller_result_);
|
| -}
|
| -
|
| -TEST_F(ProximityAuthCryptAuthEnrollerTest, ReuseEnroller) {
|
| - StartEnroller(GetDeviceInfo());
|
| - setup_callback_.Run(GetSetupEnrollmentResponse(true));
|
| - finish_callback_.Run(GetFinishEnrollmentResponse(true));
|
| - EXPECT_TRUE(*enroller_result_);
|
| -
|
| - StartEnroller(GetDeviceInfo());
|
| - EXPECT_FALSE(*enroller_result_);
|
| -}
|
| -
|
| -TEST_F(ProximityAuthCryptAuthEnrollerTest, IncompleteDeviceInfo) {
|
| - StartEnroller(cryptauth::GcmDeviceInfo());
|
| - ASSERT_TRUE(enroller_result_.get());
|
| - EXPECT_FALSE(*enroller_result_);
|
| -}
|
| -
|
| -} // namespace proximity_auth
|
|
|