| Index: remoting/host/token_validator_base_unittest.cc
|
| diff --git a/remoting/host/token_validator_base_unittest.cc b/remoting/host/token_validator_base_unittest.cc
|
| index 4404771e2c851838acbe5dca265e3b913d2bd884..a40d07b031eb3469cb444e1505c196ffd26bd3b0 100644
|
| --- a/remoting/host/token_validator_base_unittest.cc
|
| +++ b/remoting/host/token_validator_base_unittest.cc
|
| @@ -7,8 +7,11 @@
|
| #include <vector>
|
|
|
| #include "base/atomic_sequence_num.h"
|
| +#include "base/memory/ptr_util.h"
|
| #include "crypto/rsa_private_key.h"
|
| #include "net/cert/x509_util.h"
|
| +#include "net/ssl/client_cert_identity_test_util.h"
|
| +#include "net/ssl/test_ssl_private_key.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace {
|
| @@ -19,15 +22,26 @@ const char kTokenValidationCertIssuer[] = "*";
|
|
|
| base::StaticAtomicSequenceNumber g_serial_number;
|
|
|
| -scoped_refptr<net::X509Certificate> CreateFakeCert(base::Time valid_start,
|
| - base::Time valid_expiry) {
|
| - std::unique_ptr<crypto::RSAPrivateKey> unused_key;
|
| +std::unique_ptr<net::FakeClientCertIdentity> CreateFakeCert(
|
| + base::Time valid_start,
|
| + base::Time valid_expiry) {
|
| + std::unique_ptr<crypto::RSAPrivateKey> rsa_private_key;
|
| std::string cert_der;
|
| net::x509_util::CreateKeyAndSelfSignedCert(
|
| "CN=subject", g_serial_number.GetNext(), valid_start, valid_expiry,
|
| - &unused_key, &cert_der);
|
| - return net::X509Certificate::CreateFromBytes(cert_der.data(),
|
| - cert_der.size());
|
| + &rsa_private_key, &cert_der);
|
| +
|
| + scoped_refptr<net::X509Certificate> cert =
|
| + net::X509Certificate::CreateFromBytes(cert_der.data(), cert_der.size());
|
| + if (!cert)
|
| + return nullptr;
|
| +
|
| + scoped_refptr<net::SSLPrivateKey> ssl_private_key =
|
| + net::WrapRSAPrivateKey(rsa_private_key.get());
|
| + if (!ssl_private_key)
|
| + return nullptr;
|
| +
|
| + return base::MakeUnique<net::FakeClientCertIdentity>(cert, ssl_private_key);
|
| }
|
|
|
| } // namespace
|
| @@ -39,18 +53,21 @@ class TestTokenValidator : TokenValidatorBase {
|
| explicit TestTokenValidator(const ThirdPartyAuthConfig& config);
|
| ~TestTokenValidator() override;
|
|
|
| - void SelectCertificates(net::CertificateList selected_certs);
|
| + void SelectCertificates(net::ClientCertIdentityList selected_certs);
|
|
|
| - void ExpectContinueWithCertificate(net::X509Certificate* client_cert);
|
| + void ExpectContinueWithCertificate(
|
| + const net::FakeClientCertIdentity* identity);
|
|
|
| protected:
|
| - void ContinueWithCertificate(net::X509Certificate* client_cert,
|
| - net::SSLPrivateKey* client_private_key) override;
|
| + void ContinueWithCertificate(
|
| + scoped_refptr<net::X509Certificate> client_cert,
|
| + scoped_refptr<net::SSLPrivateKey> client_private_key) override;
|
|
|
| private:
|
| void StartValidateRequest(const std::string& token) override {}
|
|
|
| net::X509Certificate* expected_client_cert_ = nullptr;
|
| + net::SSLPrivateKey* expected_private_key_ = nullptr;
|
| };
|
|
|
| TestTokenValidator::TestTokenValidator(const ThirdPartyAuthConfig& config) :
|
| @@ -60,19 +77,26 @@ TestTokenValidator::TestTokenValidator(const ThirdPartyAuthConfig& config) :
|
| TestTokenValidator::~TestTokenValidator() {}
|
|
|
| void TestTokenValidator::SelectCertificates(
|
| - net::CertificateList selected_certs) {
|
| + net::ClientCertIdentityList selected_certs) {
|
| OnCertificatesSelected(nullptr, std::move(selected_certs));
|
| }
|
|
|
| void TestTokenValidator::ExpectContinueWithCertificate(
|
| - net::X509Certificate* client_cert) {
|
| - expected_client_cert_ = client_cert;
|
| + const net::FakeClientCertIdentity* identity) {
|
| + if (identity) {
|
| + expected_client_cert_ = identity->certificate();
|
| + expected_private_key_ = identity->ssl_private_key();
|
| + } else {
|
| + expected_client_cert_ = nullptr;
|
| + expected_private_key_ = nullptr;
|
| + }
|
| }
|
|
|
| void TestTokenValidator::ContinueWithCertificate(
|
| - net::X509Certificate* client_cert,
|
| - net::SSLPrivateKey* client_private_key) {
|
| - EXPECT_EQ(expected_client_cert_, client_cert);
|
| + scoped_refptr<net::X509Certificate> client_cert,
|
| + scoped_refptr<net::SSLPrivateKey> client_private_key) {
|
| + EXPECT_EQ(expected_client_cert_, client_cert.get());
|
| + EXPECT_EQ(expected_private_key_, client_private_key.get());
|
| }
|
|
|
| class TokenValidatorBaseTest : public testing::Test {
|
| @@ -93,66 +117,82 @@ void TokenValidatorBaseTest::SetUp() {
|
| TEST_F(TokenValidatorBaseTest, TestSelectCertificate) {
|
| base::Time now = base::Time::Now();
|
|
|
| - scoped_refptr<net::X509Certificate> cert_expired_5_minutes_ago =
|
| + std::unique_ptr<net::FakeClientCertIdentity> cert_expired_5_minutes_ago =
|
| CreateFakeCert(now - base::TimeDelta::FromMinutes(10),
|
| - now - base::TimeDelta::FromMinutes(5));
|
| + now - base::TimeDelta::FromMinutes(5));
|
| ASSERT_TRUE(cert_expired_5_minutes_ago);
|
|
|
| - scoped_refptr<net::X509Certificate> cert_start_5min_expire_5min =
|
| + std::unique_ptr<net::FakeClientCertIdentity> cert_start_5min_expire_5min =
|
| CreateFakeCert(now - base::TimeDelta::FromMinutes(5),
|
| - now + base::TimeDelta::FromMinutes(5));
|
| + now + base::TimeDelta::FromMinutes(5));
|
| ASSERT_TRUE(cert_start_5min_expire_5min);
|
|
|
| - scoped_refptr<net::X509Certificate> cert_start_10min_expire_5min =
|
| + std::unique_ptr<net::FakeClientCertIdentity> cert_start_10min_expire_5min =
|
| CreateFakeCert(now - base::TimeDelta::FromMinutes(10),
|
| - now + base::TimeDelta::FromMinutes(5));
|
| + now + base::TimeDelta::FromMinutes(5));
|
| ASSERT_TRUE(cert_start_10min_expire_5min);
|
|
|
| - scoped_refptr<net::X509Certificate> cert_start_5min_expire_10min =
|
| + std::unique_ptr<net::FakeClientCertIdentity> cert_start_5min_expire_10min =
|
| CreateFakeCert(now - base::TimeDelta::FromMinutes(5),
|
| - now + base::TimeDelta::FromMinutes(10));
|
| + now + base::TimeDelta::FromMinutes(10));
|
| ASSERT_TRUE(cert_start_5min_expire_10min);
|
|
|
| // No certificate.
|
| - net::CertificateList certificates {};
|
| - token_validator_->ExpectContinueWithCertificate(nullptr);
|
| - token_validator_->SelectCertificates(std::move(certificates));
|
| -
|
| - // One invalid certificate.
|
| - certificates = { cert_expired_5_minutes_ago };
|
| token_validator_->ExpectContinueWithCertificate(nullptr);
|
| - token_validator_->SelectCertificates(std::move(certificates));
|
| -
|
| - // One valid certificate.
|
| - certificates = { cert_start_5min_expire_5min };
|
| - token_validator_->ExpectContinueWithCertificate(
|
| - cert_start_5min_expire_5min.get());
|
| - token_validator_->SelectCertificates(std::move(certificates));
|
| -
|
| - // One valid one invalid.
|
| - certificates = { cert_expired_5_minutes_ago, cert_start_5min_expire_5min };
|
| - token_validator_->ExpectContinueWithCertificate(
|
| - cert_start_5min_expire_5min.get());
|
| - token_validator_->SelectCertificates(std::move(certificates));
|
| -
|
| - // Two valid certs. Choose latest created.
|
| - certificates = { cert_start_10min_expire_5min, cert_start_5min_expire_5min };
|
| - token_validator_->ExpectContinueWithCertificate(
|
| - cert_start_5min_expire_5min.get());
|
| - token_validator_->SelectCertificates(std::move(certificates));
|
| -
|
| - // Two valid certs. Choose latest expires.
|
| - certificates = { cert_start_5min_expire_5min, cert_start_5min_expire_10min };
|
| - token_validator_->ExpectContinueWithCertificate(
|
| - cert_start_5min_expire_10min.get());
|
| - token_validator_->SelectCertificates(std::move(certificates));
|
| -
|
| - // Pick the best given all certificates.
|
| - certificates = { cert_expired_5_minutes_ago, cert_start_5min_expire_5min,
|
| - cert_start_5min_expire_10min, cert_start_10min_expire_5min };
|
| + token_validator_->SelectCertificates(net::ClientCertIdentityList());
|
| + {
|
| + // One invalid certificate.
|
| + net::ClientCertIdentityList client_certs;
|
| + client_certs.push_back(cert_expired_5_minutes_ago->Copy());
|
| + token_validator_->ExpectContinueWithCertificate(nullptr);
|
| + token_validator_->SelectCertificates(std::move(client_certs));
|
| + }
|
| + {
|
| + // One valid certificate.
|
| + net::ClientCertIdentityList client_certs;
|
| + client_certs.push_back(cert_start_5min_expire_5min->Copy());
|
| + token_validator_->ExpectContinueWithCertificate(
|
| + cert_start_5min_expire_5min.get());
|
| + token_validator_->SelectCertificates(std::move(client_certs));
|
| + }
|
| + {
|
| + // One valid one invalid.
|
| + net::ClientCertIdentityList client_certs;
|
| + client_certs.push_back(cert_expired_5_minutes_ago->Copy());
|
| + client_certs.push_back(cert_start_5min_expire_5min->Copy());
|
| + token_validator_->ExpectContinueWithCertificate(
|
| + cert_start_5min_expire_5min.get());
|
| + token_validator_->SelectCertificates(std::move(client_certs));
|
| + }
|
| + {
|
| + // Two valid certs. Choose latest created.
|
| + net::ClientCertIdentityList client_certs;
|
| + client_certs.push_back(cert_start_10min_expire_5min->Copy());
|
| + client_certs.push_back(cert_start_5min_expire_5min->Copy());
|
| + token_validator_->ExpectContinueWithCertificate(
|
| + cert_start_5min_expire_5min.get());
|
| + token_validator_->SelectCertificates(std::move(client_certs));
|
| + }
|
| + {
|
| + // Two valid certs. Choose latest expires.
|
| + net::ClientCertIdentityList client_certs;
|
| + client_certs.push_back(cert_start_5min_expire_5min->Copy());
|
| + client_certs.push_back(cert_start_5min_expire_10min->Copy());
|
| + token_validator_->ExpectContinueWithCertificate(
|
| + cert_start_5min_expire_10min.get());
|
| + token_validator_->SelectCertificates(std::move(client_certs));
|
| + }
|
| + {
|
| + // Pick the best given all certificates.
|
| + net::ClientCertIdentityList client_certs;
|
| + client_certs.push_back(cert_expired_5_minutes_ago->Copy());
|
| + client_certs.push_back(cert_start_5min_expire_5min->Copy());
|
| + client_certs.push_back(cert_start_5min_expire_10min->Copy());
|
| + client_certs.push_back(cert_start_10min_expire_5min->Copy());
|
| token_validator_->ExpectContinueWithCertificate(
|
| cert_start_5min_expire_10min.get());
|
| - token_validator_->SelectCertificates(std::move(certificates));
|
| + token_validator_->SelectCertificates(std::move(client_certs));
|
| + }
|
| }
|
|
|
| } // namespace remoting
|
|
|