| Index: net/cert/internal/path_builder_unittest.cc
|
| diff --git a/net/cert/internal/path_builder_unittest.cc b/net/cert/internal/path_builder_unittest.cc
|
| index 2bfae78ae1928f5e6f9123ab15ce882bc4d41444..a69c629bb39904f011c4a68c7c21d85130496348 100644
|
| --- a/net/cert/internal/path_builder_unittest.cc
|
| +++ b/net/cert/internal/path_builder_unittest.cc
|
| @@ -433,9 +433,9 @@ class PathBuilderKeyRolloverTest : public ::testing::Test {
|
| ParsedCertificateList path;
|
|
|
| VerifyCertChainTest test;
|
| - ReadVerifyCertChainTestFromFile(
|
| + ASSERT_TRUE(ReadVerifyCertChainTestFromFile(
|
| "net/data/verify_certificate_chain_unittest/key-rollover/oldchain.test",
|
| - &test);
|
| + &test));
|
| path = test.chain;
|
| ASSERT_EQ(3U, path.size());
|
| target_ = path[0];
|
| @@ -446,10 +446,10 @@ class PathBuilderKeyRolloverTest : public ::testing::Test {
|
| ASSERT_TRUE(target_);
|
| ASSERT_TRUE(oldintermediate_);
|
|
|
| - ReadVerifyCertChainTestFromFile(
|
| + ASSERT_TRUE(ReadVerifyCertChainTestFromFile(
|
| "net/data/verify_certificate_chain_unittest/"
|
| "key-rollover/longrolloverchain.test",
|
| - &test);
|
| + &test));
|
| path = test.chain;
|
|
|
| ASSERT_EQ(5U, path.size());
|
| @@ -1097,6 +1097,119 @@ TEST_F(PathBuilderKeyRolloverTest, TestDuplicateAsyncIntermediates) {
|
| EXPECT_EQ(newroot_, path1.certs[2]);
|
| }
|
|
|
| +// Test fixture for running the path builder over a simple chain, while varying
|
| +// the trustedness of certain certificates.
|
| +class PathBuilderDistrustTest : public ::testing::Test {
|
| + public:
|
| + PathBuilderDistrustTest() {}
|
| +
|
| + protected:
|
| + void SetUp() override {
|
| + // Read a simple test chain comprised of a target, intermediate, and root.
|
| + ASSERT_TRUE(ReadVerifyCertChainTestFromFile(
|
| + "net/data/verify_certificate_chain_unittest/target-and-intermediate/"
|
| + "main.test",
|
| + &test_));
|
| + ASSERT_EQ(3u, test_.chain.size());
|
| + }
|
| +
|
| + // Runs the path builder for the target certificate while |distrusted_cert| is
|
| + // blacklisted.
|
| + void RunPathBuilderWithDistrustedCert(
|
| + const scoped_refptr<ParsedCertificate>& distrusted_cert,
|
| + CertPathBuilder::Result* result) {
|
| + ASSERT_EQ(3u, test_.chain.size());
|
| +
|
| + // Set up the trust store such that |distrusted_cert| is blacklisted, and
|
| + // the root is trusted (except if it was |distrusted_cert|).
|
| + TrustStoreInMemory trust_store;
|
| + if (distrusted_cert != test_.chain.back())
|
| + trust_store.AddTrustAnchor(test_.chain.back());
|
| + if (distrusted_cert)
|
| + trust_store.AddDistrustedCertificateForTest(distrusted_cert);
|
| +
|
| + // Add the single intermediate.
|
| + CertIssuerSourceStatic intermediates;
|
| + intermediates.AddCert(test_.chain[1]);
|
| +
|
| + SimpleSignaturePolicy signature_policy(1024);
|
| +
|
| + CertPathBuilder path_builder(test_.chain.front(), &trust_store,
|
| + &signature_policy, test_.time,
|
| + KeyPurpose::ANY_EKU, result);
|
| + path_builder.AddCertIssuerSource(&intermediates);
|
| + path_builder.Run();
|
| + }
|
| +
|
| + protected:
|
| + VerifyCertChainTest test_;
|
| +};
|
| +
|
| +// Tests that path building fails when the target, intermediate, or root are
|
| +// distrusted (but the path is otherwise valid).
|
| +TEST_F(PathBuilderDistrustTest, TargetIntermediateRoot) {
|
| + CertPathBuilder::Result result;
|
| + // First do a control test -- path building without any blacklisted
|
| + // certificates should work.
|
| + RunPathBuilderWithDistrustedCert(nullptr, &result);
|
| + {
|
| + EXPECT_TRUE(result.HasValidPath());
|
| + // The built path should be identical the the one read from disk.
|
| + const auto& path = result.GetBestValidPath()->path;
|
| + ASSERT_EQ(test_.chain.size(), path.certs.size());
|
| + for (size_t i = 0; i < test_.chain.size(); ++i)
|
| + EXPECT_EQ(test_.chain[i], path.certs[i]);
|
| + }
|
| +
|
| + // Try path building when only the target is blacklisted - should fail.
|
| + RunPathBuilderWithDistrustedCert(test_.chain[0], &result);
|
| + {
|
| + EXPECT_FALSE(result.HasValidPath());
|
| + ASSERT_LT(result.best_result_index, result.paths.size());
|
| + const auto& best_path = result.paths[result.best_result_index];
|
| +
|
| + // The built chain has length 1 since path building stopped once
|
| + // it encountered the blacklisted certificate (target).
|
| + ASSERT_EQ(1u, best_path->path.certs.size());
|
| + EXPECT_EQ(best_path->path.certs[0], test_.chain[0]);
|
| + EXPECT_TRUE(best_path->errors.ContainsHighSeverityErrors());
|
| + best_path->errors.ContainsError(kCertIsDistrusted);
|
| + }
|
| +
|
| + // Try path building when only the intermediate is blacklisted - should fail.
|
| + RunPathBuilderWithDistrustedCert(test_.chain[1], &result);
|
| + {
|
| + EXPECT_FALSE(result.HasValidPath());
|
| + ASSERT_LT(result.best_result_index, result.paths.size());
|
| + const auto& best_path = result.paths[result.best_result_index];
|
| +
|
| + // The built chain has length 2 since path building stopped once
|
| + // it encountered the blacklisted certificate (intermediate).
|
| + ASSERT_EQ(2u, best_path->path.certs.size());
|
| + EXPECT_EQ(best_path->path.certs[0], test_.chain[0]);
|
| + EXPECT_EQ(best_path->path.certs[1], test_.chain[1]);
|
| + EXPECT_TRUE(best_path->errors.ContainsHighSeverityErrors());
|
| + best_path->errors.ContainsError(kCertIsDistrusted);
|
| + }
|
| +
|
| + // Try path building when only the root is blacklisted - should fail.
|
| + RunPathBuilderWithDistrustedCert(test_.chain[2], &result);
|
| + {
|
| + EXPECT_FALSE(result.HasValidPath());
|
| + ASSERT_LT(result.best_result_index, result.paths.size());
|
| + const auto& best_path = result.paths[result.best_result_index];
|
| +
|
| + // The built chain has length 3 since path building stopped once
|
| + // it encountered the blacklisted certificate (root).
|
| + ASSERT_EQ(3u, best_path->path.certs.size());
|
| + EXPECT_EQ(best_path->path.certs[0], test_.chain[0]);
|
| + EXPECT_EQ(best_path->path.certs[1], test_.chain[1]);
|
| + EXPECT_EQ(best_path->path.certs[2], test_.chain[2]);
|
| + EXPECT_TRUE(best_path->errors.ContainsHighSeverityErrors());
|
| + best_path->errors.ContainsError(kCertIsDistrusted);
|
| + }
|
| +}
|
| +
|
| } // namespace
|
|
|
| } // namespace net
|
|
|