Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(584)

Unified Diff: net/cert/internal/path_builder_unittest.cc

Issue 2854263004: Add tests for PathBuilder when certificates are distrusted. (Closed)
Patch Set: address mattm's feedback Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/cert/internal/path_builder.cc ('k') | net/cert/internal/verify_certificate_chain.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « net/cert/internal/path_builder.cc ('k') | net/cert/internal/verify_certificate_chain.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698