| Index: remoting/protocol/negotiating_authenticator_unittest.cc
|
| diff --git a/remoting/protocol/negotiating_authenticator_unittest.cc b/remoting/protocol/negotiating_authenticator_unittest.cc
|
| index f07be708dc6772c84701724e8a264e9e9da10f9e..889e287ddc7f7bd3c0dacede64d84add1307081e 100644
|
| --- a/remoting/protocol/negotiating_authenticator_unittest.cc
|
| +++ b/remoting/protocol/negotiating_authenticator_unittest.cc
|
| @@ -53,26 +53,29 @@ class NegotiatingAuthenticatorTest : public AuthenticatorTestBase {
|
| ~NegotiatingAuthenticatorTest() override {}
|
|
|
| protected:
|
| - void InitAuthenticators(const std::string& client_id,
|
| - const std::string& client_paired_secret,
|
| - const std::string& client_interactive_pin,
|
| - const std::string& host_secret,
|
| - bool it2me) {
|
| + virtual void InitAuthenticators(const std::string& client_id,
|
| + const std::string& client_paired_secret,
|
| + const std::string& client_interactive_pin,
|
| + const std::string& host_secret,
|
| + bool it2me) {
|
| if (it2me) {
|
| host_ = NegotiatingHostAuthenticator::CreateForIt2Me(
|
| kHostJid, kClientJid, host_cert_, key_pair_, host_secret);
|
| } else {
|
| std::string host_secret_hash =
|
| GetSharedSecretHash(kTestHostId, host_secret);
|
| - host_ = NegotiatingHostAuthenticator::CreateWithPin(
|
| - kHostJid, kClientJid, host_cert_, key_pair_, host_secret_hash,
|
| - pairing_registry_);
|
| + scoped_ptr<NegotiatingHostAuthenticator> host =
|
| + NegotiatingHostAuthenticator::CreateWithPin(
|
| + kHostJid, kClientJid, host_cert_, key_pair_, host_secret_hash,
|
| + pairing_registry_);
|
| + host_as_negotiating_authenticator_ = host.get();
|
| + host_ = std::move(host);
|
| }
|
|
|
| protocol::ClientAuthenticationConfig client_auth_config;
|
| client_auth_config.host_id = kTestHostId;
|
| client_auth_config.pairing_client_id = client_id;
|
| - client_auth_config.pairing_secret= client_paired_secret;
|
| + client_auth_config.pairing_secret = client_paired_secret;
|
| bool pairing_expected = pairing_registry_.get() != nullptr;
|
| client_auth_config.fetch_secret_callback =
|
| base::Bind(&NegotiatingAuthenticatorTest::FetchSecret,
|
| @@ -82,6 +85,20 @@ class NegotiatingAuthenticatorTest : public AuthenticatorTestBase {
|
| client_.reset(client_as_negotiating_authenticator_);
|
| }
|
|
|
| + void DisableMethodOnClient(NegotiatingAuthenticatorBase::Method method) {
|
| + auto* methods = &(client_as_negotiating_authenticator_->methods_);
|
| + auto iter = std::find(methods->begin(), methods->end(), method);
|
| + ASSERT_TRUE(iter != methods->end());
|
| + methods->erase(iter);
|
| + }
|
| +
|
| + void DisableMethodOnHost(NegotiatingAuthenticatorBase::Method method) {
|
| + auto* methods = &(host_as_negotiating_authenticator_->methods_);
|
| + auto iter = std::find(methods->begin(), methods->end(), method);
|
| + ASSERT_TRUE(iter != methods->end());
|
| + methods->erase(iter);
|
| + }
|
| +
|
| void CreatePairingRegistry(bool with_paired_client) {
|
| pairing_registry_ = new SynchronousPairingRegistry(
|
| make_scoped_ptr(new MockPairingRegistryDelegate()));
|
| @@ -112,7 +129,7 @@ class NegotiatingAuthenticatorTest : public AuthenticatorTestBase {
|
| }
|
| }
|
|
|
| - void VerifyAccepted(NegotiatingAuthenticatorBase::Method expected_method) {
|
| + virtual void VerifyAccepted() {
|
| ASSERT_NO_FATAL_FAILURE(RunAuthExchange());
|
|
|
| ASSERT_EQ(Authenticator::ACCEPTED, host_->state());
|
| @@ -131,11 +148,14 @@ class NegotiatingAuthenticatorTest : public AuthenticatorTestBase {
|
| tester.Start();
|
| message_loop_.Run();
|
| tester.CheckResults();
|
| - EXPECT_EQ(expected_method,
|
| - client_as_negotiating_authenticator_->current_method_);
|
| + }
|
| +
|
| + NegotiatingAuthenticatorBase::Method current_method() {
|
| + return client_as_negotiating_authenticator_->current_method_;
|
| }
|
|
|
| // Use a bare pointer because the storage is managed by the base class.
|
| + NegotiatingHostAuthenticator* host_as_negotiating_authenticator_;
|
| NegotiatingClientAuthenticator* client_as_negotiating_authenticator_;
|
|
|
| private:
|
| @@ -144,18 +164,90 @@ class NegotiatingAuthenticatorTest : public AuthenticatorTestBase {
|
| DISALLOW_COPY_AND_ASSIGN(NegotiatingAuthenticatorTest);
|
| };
|
|
|
| +struct PairingTestParameters {
|
| + bool p224_on_client;
|
| + bool curve25519_on_client;
|
| + bool p224_on_host;
|
| + bool curve25519_on_host;
|
| +
|
| + bool expect_curve25519_used;
|
| +};
|
| +
|
| +class NegotiatingPairingAuthenticatorTest
|
| + : public NegotiatingAuthenticatorTest,
|
| + public testing::WithParamInterface<PairingTestParameters> {
|
| +public:
|
| + void InitAuthenticators(const std::string& client_id,
|
| + const std::string& client_paired_secret,
|
| + const std::string& client_interactive_pin,
|
| + const std::string& host_secret,
|
| + bool it2me) override {
|
| + NegotiatingAuthenticatorTest::InitAuthenticators(
|
| + client_id, client_paired_secret, client_interactive_pin, host_secret,
|
| + it2me);
|
| + if (!GetParam().p224_on_client) {
|
| + DisableMethodOnClient(
|
| + NegotiatingAuthenticatorBase::Method::PAIRED_SPAKE2_P224);
|
| + }
|
| + if (!GetParam().curve25519_on_client) {
|
| + DisableMethodOnClient(
|
| + NegotiatingAuthenticatorBase::Method::PAIRED_SPAKE2_CURVE25519);
|
| + }
|
| + if (!GetParam().p224_on_host) {
|
| + DisableMethodOnHost(
|
| + NegotiatingAuthenticatorBase::Method::PAIRED_SPAKE2_P224);
|
| + }
|
| + if (!GetParam().curve25519_on_host) {
|
| + DisableMethodOnHost(
|
| + NegotiatingAuthenticatorBase::Method::PAIRED_SPAKE2_CURVE25519);
|
| + }
|
| + }
|
| +
|
| + void VerifyAccepted() override {
|
| + NegotiatingAuthenticatorTest::VerifyAccepted();
|
| + EXPECT_TRUE(
|
| + current_method() ==
|
| + NegotiatingAuthenticatorBase::Method::PAIRED_SPAKE2_P224 ||
|
| + current_method() ==
|
| + NegotiatingAuthenticatorBase::Method::PAIRED_SPAKE2_CURVE25519);
|
| + }
|
| +};
|
| +
|
| +INSTANTIATE_TEST_CASE_P(
|
| + PairingParams,
|
| + NegotiatingPairingAuthenticatorTest,
|
| + testing::Values(
|
| + // Only P224.
|
| + PairingTestParameters{true, false, true, false},
|
| +
|
| + // Only curve25519.
|
| + PairingTestParameters{false, true, false, true},
|
| +
|
| + // Both P224 and curve25519.
|
| + PairingTestParameters{true, true, true, true},
|
| +
|
| + // One end supports both, the other supports only P224 or curve25519.
|
| + PairingTestParameters{false, true, true, true},
|
| + PairingTestParameters{true, false, true, true},
|
| + PairingTestParameters{true, true, false, true},
|
| + PairingTestParameters{true, true, true, false}));
|
| +
|
| TEST_F(NegotiatingAuthenticatorTest, SuccessfulAuthMe2MePin) {
|
| ASSERT_NO_FATAL_FAILURE(InitAuthenticators(kNoClientId, kNoPairedSecret,
|
| kTestPin, kTestPin, false));
|
| - VerifyAccepted(
|
| - NegotiatingAuthenticatorBase::Method::SHARED_SECRET_SPAKE2_CURVE25519);
|
| + VerifyAccepted();
|
| + EXPECT_EQ(
|
| + NegotiatingAuthenticatorBase::Method::SHARED_SECRET_SPAKE2_CURVE25519,
|
| + current_method());
|
| }
|
|
|
| TEST_F(NegotiatingAuthenticatorTest, SuccessfulAuthIt2me) {
|
| ASSERT_NO_FATAL_FAILURE(InitAuthenticators(kNoClientId, kNoPairedSecret,
|
| kTestPin, kTestPin, true));
|
| - VerifyAccepted(
|
| - NegotiatingAuthenticatorBase::Method::SHARED_SECRET_PLAIN_SPAKE2_P224);
|
| + VerifyAccepted();
|
| + EXPECT_EQ(
|
| + NegotiatingAuthenticatorBase::Method::SHARED_SECRET_PLAIN_SPAKE2_P224,
|
| + current_method());
|
| }
|
|
|
| TEST_F(NegotiatingAuthenticatorTest, InvalidMe2MePin) {
|
| @@ -177,11 +269,8 @@ TEST_F(NegotiatingAuthenticatorTest, InvalidIt2MeAccessCode) {
|
| TEST_F(NegotiatingAuthenticatorTest, IncompatibleMethods) {
|
| ASSERT_NO_FATAL_FAILURE(InitAuthenticators(kNoClientId, kNoPairedSecret,
|
| kTestPin, kTestPinBad, true));
|
| - std::vector<NegotiatingAuthenticatorBase::Method>* methods =
|
| - &(client_as_negotiating_authenticator_->methods_);
|
| - methods->erase(std::find(
|
| - methods->begin(), methods->end(),
|
| - NegotiatingAuthenticatorBase::Method::SHARED_SECRET_PLAIN_SPAKE2_P224));
|
| + DisableMethodOnClient(
|
| + NegotiatingAuthenticatorBase::Method::SHARED_SECRET_PLAIN_SPAKE2_P224);
|
|
|
| ASSERT_NO_FATAL_FAILURE(RunAuthExchange());
|
|
|
| @@ -192,27 +281,29 @@ TEST_F(NegotiatingAuthenticatorTest, PairingNotSupported) {
|
| ASSERT_NO_FATAL_FAILURE(InitAuthenticators(kTestClientId, kTestPairedSecret,
|
| kTestPin, kTestPin, false));
|
| ASSERT_NO_FATAL_FAILURE(RunAuthExchange());
|
| - VerifyAccepted(
|
| - NegotiatingAuthenticatorBase::Method::SHARED_SECRET_SPAKE2_CURVE25519);
|
| + VerifyAccepted();
|
| + EXPECT_EQ(
|
| + NegotiatingAuthenticatorBase::Method::SHARED_SECRET_SPAKE2_CURVE25519,
|
| + current_method());
|
| }
|
|
|
| -TEST_F(NegotiatingAuthenticatorTest, PairingSupportedButNotPaired) {
|
| +TEST_P(NegotiatingPairingAuthenticatorTest, PairingSupportedButNotPaired) {
|
| CreatePairingRegistry(false);
|
| ASSERT_NO_FATAL_FAILURE(InitAuthenticators(kNoClientId, kNoPairedSecret,
|
| kTestPin, kTestPin, false));
|
| ASSERT_NO_FATAL_FAILURE(RunAuthExchange());
|
| - VerifyAccepted(NegotiatingAuthenticatorBase::Method::PAIRED_SPAKE2_P224);
|
| + VerifyAccepted();
|
| }
|
|
|
| -TEST_F(NegotiatingAuthenticatorTest, PairingRevokedPinOkay) {
|
| +TEST_P(NegotiatingPairingAuthenticatorTest, PairingRevokedPinOkay) {
|
| CreatePairingRegistry(false);
|
| ASSERT_NO_FATAL_FAILURE(InitAuthenticators(kTestClientId, kTestPairedSecret,
|
| kTestPin, kTestPin, false));
|
| ASSERT_NO_FATAL_FAILURE(RunAuthExchange());
|
| - VerifyAccepted(NegotiatingAuthenticatorBase::Method::PAIRED_SPAKE2_P224);
|
| + VerifyAccepted();
|
| }
|
|
|
| -TEST_F(NegotiatingAuthenticatorTest, PairingRevokedPinBad) {
|
| +TEST_P(NegotiatingPairingAuthenticatorTest, PairingRevokedPinBad) {
|
| CreatePairingRegistry(false);
|
| ASSERT_NO_FATAL_FAILURE(InitAuthenticators(kTestClientId, kTestPairedSecret,
|
| kTestPinBad, kTestPin, false));
|
| @@ -220,24 +311,24 @@ TEST_F(NegotiatingAuthenticatorTest, PairingRevokedPinBad) {
|
| VerifyRejected(Authenticator::INVALID_CREDENTIALS);
|
| }
|
|
|
| -TEST_F(NegotiatingAuthenticatorTest, PairingSucceeded) {
|
| +TEST_P(NegotiatingPairingAuthenticatorTest, PairingSucceeded) {
|
| CreatePairingRegistry(true);
|
| ASSERT_NO_FATAL_FAILURE(InitAuthenticators(kTestClientId, kTestPairedSecret,
|
| kTestPinBad, kTestPin, false));
|
| ASSERT_NO_FATAL_FAILURE(RunAuthExchange());
|
| - VerifyAccepted(NegotiatingAuthenticatorBase::Method::PAIRED_SPAKE2_P224);
|
| + VerifyAccepted();
|
| }
|
|
|
| -TEST_F(NegotiatingAuthenticatorTest,
|
| +TEST_P(NegotiatingPairingAuthenticatorTest,
|
| PairingSucceededInvalidSecretButPinOkay) {
|
| CreatePairingRegistry(true);
|
| ASSERT_NO_FATAL_FAILURE(InitAuthenticators(
|
| kTestClientId, kTestPairedSecretBad, kTestPin, kTestPin, false));
|
| ASSERT_NO_FATAL_FAILURE(RunAuthExchange());
|
| - VerifyAccepted(NegotiatingAuthenticatorBase::Method::PAIRED_SPAKE2_P224);
|
| + VerifyAccepted();
|
| }
|
|
|
| -TEST_F(NegotiatingAuthenticatorTest, PairingFailedInvalidSecretAndPin) {
|
| +TEST_P(NegotiatingPairingAuthenticatorTest, PairingFailedInvalidSecretAndPin) {
|
| CreatePairingRegistry(true);
|
| ASSERT_NO_FATAL_FAILURE(InitAuthenticators(
|
| kTestClientId, kTestPairedSecretBad, kTestPinBad, kTestPin, false));
|
|
|