| Index: components/cast_certificate/cast_crl_unittest.cc
|
| diff --git a/components/cast_certificate/cast_crl_unittest.cc b/components/cast_certificate/cast_crl_unittest.cc
|
| index d65b3a63b1e8d1f0ffaefd93cbebbb65e49a2623..5698dbe4c6a80510e67ac813fa7c87500439ed00 100644
|
| --- a/components/cast_certificate/cast_crl_unittest.cc
|
| +++ b/components/cast_certificate/cast_crl_unittest.cc
|
| @@ -7,11 +7,27 @@
|
| #include "components/cast_certificate/cast_cert_validator_test_helpers.h"
|
| #include "components/cast_certificate/cast_crl.h"
|
| #include "components/cast_certificate/proto/test_suite.pb.h"
|
| +#include "net/cert/internal/trust_store.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace cast_certificate {
|
| namespace {
|
|
|
| +// Creates a trust store using the test roots encoded in the PEM file at |path|.
|
| +std::unique_ptr<net::TrustStore> CreateTrustStoreFromFile(
|
| + const std::string& path) {
|
| + std::unique_ptr<net::TrustStore> trust_store(new net::TrustStore());
|
| + const auto trusted_test_roots =
|
| + cast_certificate::testing::ReadCertificateChainFromFile(path);
|
| + for (const auto& trusted_root : trusted_test_roots) {
|
| + scoped_refptr<net::ParsedCertificate> anchor(
|
| + net::ParsedCertificate::CreateFromCertificateCopy(trusted_root, {}));
|
| + EXPECT_TRUE(anchor);
|
| + trust_store->AddTrustedCertificate(std::move(anchor));
|
| + }
|
| + return trust_store;
|
| +}
|
| +
|
| // Converts uint64_t unix timestamp in seconds to base::Time.
|
| base::Time ConvertUnixTimestampSeconds(uint64_t time) {
|
| return base::Time::UnixEpoch() +
|
| @@ -28,11 +44,19 @@ enum TestStepResult {
|
| // and chains up to a trust anchor.
|
| bool TestVerifyCertificate(TestStepResult expected_result,
|
| const std::vector<std::string>& certificate_chain,
|
| - const base::Time& time) {
|
| + const base::Time& time,
|
| + net::TrustStore* cast_trust_store) {
|
| std::unique_ptr<CertVerificationContext> context;
|
| CastDeviceCertPolicy policy;
|
| - bool result = VerifyDeviceCert(certificate_chain, time, &context, &policy,
|
| - nullptr, CRLPolicy::CRL_OPTIONAL);
|
| + int result;
|
| + if (cast_trust_store != nullptr) {
|
| + result = VerifyDeviceCertForTest(certificate_chain, time, &context, &policy,
|
| + nullptr, CRLPolicy::CRL_OPTIONAL,
|
| + cast_trust_store);
|
| + } else {
|
| + result = VerifyDeviceCert(certificate_chain, time, &context, &policy,
|
| + nullptr, CRLPolicy::CRL_OPTIONAL);
|
| + }
|
| if (expected_result != RESULT_SUCCESS) {
|
| EXPECT_FALSE(result);
|
| return !result;
|
| @@ -46,8 +70,14 @@ bool TestVerifyCertificate(TestStepResult expected_result,
|
| // The validity of the CRL is also checked at the specified time.
|
| bool TestVerifyCRL(TestStepResult expected_result,
|
| const std::string& crl_bundle,
|
| - const base::Time& time) {
|
| - std::unique_ptr<CastCRL> crl = ParseAndVerifyCRL(crl_bundle, time);
|
| + const base::Time& time,
|
| + net::TrustStore* crl_trust_store) {
|
| + std::unique_ptr<CastCRL> crl;
|
| + if (crl_trust_store != nullptr) {
|
| + crl = ParseAndVerifyCRLForTest(crl_bundle, time, crl_trust_store);
|
| + } else {
|
| + crl = ParseAndVerifyCRL(crl_bundle, time);
|
| + }
|
| if (expected_result != RESULT_SUCCESS) {
|
| EXPECT_EQ(crl, nullptr);
|
| return crl == nullptr;
|
| @@ -66,10 +96,16 @@ bool TestVerifyRevocation(TestStepResult expected_result,
|
| const std::string& crl_bundle,
|
| const base::Time& crl_time,
|
| const base::Time& cert_time,
|
| - bool crl_required) {
|
| + bool crl_required,
|
| + net::TrustStore* cast_trust_store,
|
| + net::TrustStore* crl_trust_store) {
|
| std::unique_ptr<CastCRL> crl;
|
| if (!crl_bundle.empty()) {
|
| - crl = ParseAndVerifyCRL(crl_bundle, crl_time);
|
| + if (crl_trust_store != nullptr) {
|
| + crl = ParseAndVerifyCRLForTest(crl_bundle, crl_time, crl_trust_store);
|
| + } else {
|
| + crl = ParseAndVerifyCRL(crl_bundle, crl_time);
|
| + }
|
| EXPECT_NE(crl.get(), nullptr);
|
| }
|
|
|
| @@ -78,8 +114,15 @@ bool TestVerifyRevocation(TestStepResult expected_result,
|
| CRLPolicy crl_policy = CRLPolicy::CRL_REQUIRED;
|
| if (!crl_required)
|
| crl_policy = CRLPolicy::CRL_OPTIONAL;
|
| - int result = VerifyDeviceCert(certificate_chain, cert_time, &context, &policy,
|
| - crl.get(), crl_policy);
|
| + int result;
|
| + if (cast_trust_store != nullptr) {
|
| + result =
|
| + VerifyDeviceCertForTest(certificate_chain, cert_time, &context, &policy,
|
| + crl.get(), crl_policy, cast_trust_store);
|
| + } else {
|
| + result = VerifyDeviceCert(certificate_chain, cert_time, &context, &policy,
|
| + crl.get(), crl_policy);
|
| + }
|
| if (expected_result != RESULT_SUCCESS) {
|
| EXPECT_FALSE(result);
|
| return !result;
|
| @@ -90,22 +133,18 @@ bool TestVerifyRevocation(TestStepResult expected_result,
|
|
|
| // Runs a single test case.
|
| bool RunTest(const DeviceCertTest& test_case) {
|
| - bool use_test_trust_anchors = test_case.use_test_trust_anchors();
|
| - if (use_test_trust_anchors) {
|
| - const auto crl_test_root =
|
| - cast_certificate::testing::ReadCertificateChainFromFile(
|
| - "certificates/cast_crl_test_root_ca.pem");
|
| - EXPECT_EQ(crl_test_root.size(), 1u);
|
| - EXPECT_TRUE(SetCRLTrustAnchorForTest(crl_test_root[0]));
|
| - const auto cast_test_root =
|
| - cast_certificate::testing::ReadCertificateChainFromFile(
|
| - "certificates/cast_test_root_ca.pem");
|
| - EXPECT_EQ(cast_test_root.size(), 1u);
|
| - EXPECT_TRUE(SetTrustAnchorForTest(cast_test_root[0]));
|
| + std::unique_ptr<net::TrustStore> crl_trust_store;
|
| + std::unique_ptr<net::TrustStore> cast_trust_store;
|
| + if (test_case.use_test_trust_anchors()) {
|
| + crl_trust_store =
|
| + CreateTrustStoreFromFile("certificates/cast_crl_test_root_ca.pem");
|
| + cast_trust_store =
|
| + CreateTrustStoreFromFile("certificates/cast_test_root_ca.pem");
|
| +
|
| + EXPECT_TRUE(crl_trust_store.get());
|
| + EXPECT_TRUE(cast_trust_store.get());
|
| }
|
|
|
| - VerificationResult expected_result = test_case.expected_result();
|
| -
|
| std::vector<std::string> certificate_chain;
|
| for (auto const& cert : test_case.der_cert_path()) {
|
| certificate_chain.push_back(cert);
|
| @@ -121,38 +160,49 @@ bool RunTest(const DeviceCertTest& test_case) {
|
| crl_verification_time = cert_verification_time;
|
|
|
| std::string crl_bundle = test_case.crl_bundle();
|
| - switch (expected_result) {
|
| + switch (test_case.expected_result()) {
|
| case PATH_VERIFICATION_FAILED:
|
| return TestVerifyCertificate(RESULT_FAIL, certificate_chain,
|
| - cert_verification_time);
|
| + cert_verification_time,
|
| + cast_trust_store.get());
|
| break;
|
| case CRL_VERIFICATION_FAILED:
|
| - return TestVerifyCRL(RESULT_FAIL, crl_bundle, crl_verification_time);
|
| + return TestVerifyCRL(RESULT_FAIL, crl_bundle, crl_verification_time,
|
| + crl_trust_store.get());
|
| break;
|
| case REVOCATION_CHECK_FAILED_WITHOUT_CRL:
|
| return TestVerifyCertificate(RESULT_SUCCESS, certificate_chain,
|
| - cert_verification_time) &&
|
| - TestVerifyCRL(RESULT_FAIL, crl_bundle, crl_verification_time) &&
|
| + cert_verification_time,
|
| + cast_trust_store.get()) &&
|
| + TestVerifyCRL(RESULT_FAIL, crl_bundle, crl_verification_time,
|
| + crl_trust_store.get()) &&
|
| TestVerifyRevocation(RESULT_FAIL, certificate_chain, crl_bundle,
|
| crl_verification_time, cert_verification_time,
|
| - true);
|
| + true, cast_trust_store.get(),
|
| + crl_trust_store.get());
|
| break;
|
| case REVOCATION_CHECK_FAILED:
|
| return TestVerifyCertificate(RESULT_SUCCESS, certificate_chain,
|
| - cert_verification_time) &&
|
| - TestVerifyCRL(RESULT_SUCCESS, crl_bundle, crl_verification_time) &&
|
| + cert_verification_time,
|
| + cast_trust_store.get()) &&
|
| + TestVerifyCRL(RESULT_SUCCESS, crl_bundle, crl_verification_time,
|
| + crl_trust_store.get()) &&
|
| TestVerifyRevocation(RESULT_FAIL, certificate_chain, crl_bundle,
|
| crl_verification_time, cert_verification_time,
|
| - false);
|
| + false, cast_trust_store.get(),
|
| + crl_trust_store.get());
|
| break;
|
| case SUCCESS:
|
| - return (crl_bundle.empty() || TestVerifyCRL(RESULT_SUCCESS, crl_bundle,
|
| - crl_verification_time)) &&
|
| + return (crl_bundle.empty() ||
|
| + TestVerifyCRL(RESULT_SUCCESS, crl_bundle, crl_verification_time,
|
| + crl_trust_store.get())) &&
|
| TestVerifyCertificate(RESULT_SUCCESS, certificate_chain,
|
| - cert_verification_time) &&
|
| + cert_verification_time,
|
| + cast_trust_store.get()) &&
|
| TestVerifyRevocation(RESULT_SUCCESS, certificate_chain, crl_bundle,
|
| crl_verification_time, cert_verification_time,
|
| - !crl_bundle.empty());
|
| + !crl_bundle.empty(), cast_trust_store.get(),
|
| + crl_trust_store.get());
|
| break;
|
| case UNSPECIFIED:
|
| return false;
|
|
|