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

Unified Diff: net/base/x509_certificate_unittest.cc

Issue 3146034: Allow the constructed certificate chain to be returned in CertVerifyResult (Closed)
Patch Set: Created 10 years, 4 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/base/cert_verify_result.cc ('k') | net/base/x509_chain.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/x509_certificate_unittest.cc
diff --git a/net/base/x509_certificate_unittest.cc b/net/base/x509_certificate_unittest.cc
index 90a60e3be58a1aec88f2f59a4e15146f06f51dea..056b1a4d901bfde89636853ede0770dfe561d4e0 100644
--- a/net/base/x509_certificate_unittest.cc
+++ b/net/base/x509_certificate_unittest.cc
@@ -625,6 +625,169 @@ TEST(X509CertificateTest, IntermediateCertificates) {
X509Certificate::FreeOSCertHandle(google_handle);
}
+TEST(X509CertificateTest, VerifyReturnChainBasic) {
+ FilePath certs_dir = GetTestCertsDirectory();
+ CertificateList certs =
+ CreateCertificateListFromFile(certs_dir, "google.full_chain.pem",
+ X509Certificate::FORMAT_AUTO);
+ ASSERT_EQ(3U, certs.size());
+
+ X509Certificate::OSCertHandles intermediates;
+ intermediates.push_back(certs[1]->os_cert_handle());
+ intermediates.push_back(certs[2]->os_cert_handle());
+
+ scoped_refptr<X509Certificate> google_full_chain =
+ X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(),
+ intermediates);
+ ASSERT_NE(static_cast<X509Certificate*>(NULL), google_full_chain);
+ ASSERT_EQ(2U, google_full_chain->GetIntermediateCertificates().size());
+
+ int flags = x509_chain::VERIFY_RETURN_CHAIN;
+ CertVerifyResult verify_result;
+ EXPECT_EQ(static_cast<X509Certificate*>(NULL), verify_result.certificate);
+ int error = x509_chain::VerifySSLServer(google_full_chain,
+ "www.google.com", flags,
+ &verify_result);
+ EXPECT_EQ(OK, error);
+ ASSERT_NE(static_cast<X509Certificate*>(NULL), verify_result.certificate);
+
+ EXPECT_TRUE(X509Certificate::IsSameOSCert(
+ google_full_chain->os_cert_handle(),
+ verify_result.certificate->os_cert_handle()));
+ const X509Certificate::OSCertHandles& return_intermediates =
+ verify_result.certificate->GetIntermediateCertificates();
+ EXPECT_EQ(2U, return_intermediates.size());
+ EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[0],
+ certs[1]->os_cert_handle()));
+ EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[1],
+ certs[2]->os_cert_handle()));
+}
+
+// Test that the certificate returned in CertVerifyResult is an actual
+// certificate chain by supplying the original chain out of order, which
+// will not properly validate unless the underlying crypto library reorders
+// the certificates into a valid chain.
+TEST(X509CertificateTest, VerifyReturnChainProperlyOrders) {
+ FilePath certs_dir = GetTestCertsDirectory();
+ CertificateList certs =
+ CreateCertificateListFromFile(certs_dir, "google.full_chain.pem",
+ X509Certificate::FORMAT_AUTO);
+ ASSERT_EQ(3U, certs.size());
+
+ // Construct the chain out of order.
+ X509Certificate::OSCertHandles intermediates;
+ intermediates.push_back(certs[2]->os_cert_handle());
+ intermediates.push_back(certs[1]->os_cert_handle());
+
+ scoped_refptr<X509Certificate> google_full_chain =
+ X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(),
+ intermediates);
+ ASSERT_NE(static_cast<X509Certificate*>(NULL), google_full_chain);
+ ASSERT_EQ(2U, google_full_chain->GetIntermediateCertificates().size());
+
+ int flags = x509_chain::VERIFY_RETURN_CHAIN;
+ CertVerifyResult verify_result;
+ EXPECT_EQ(static_cast<X509Certificate*>(NULL), verify_result.certificate);
+ int error = x509_chain::VerifySSLServer(google_full_chain,
+ "www.google.com", flags,
+ &verify_result);
+ EXPECT_EQ(OK, error);
+ ASSERT_NE(static_cast<X509Certificate*>(NULL), verify_result.certificate);
+
+ EXPECT_TRUE(X509Certificate::IsSameOSCert(
+ google_full_chain->os_cert_handle(),
+ verify_result.certificate->os_cert_handle()));
+ const X509Certificate::OSCertHandles& return_intermediates =
+ verify_result.certificate->GetIntermediateCertificates();
+ EXPECT_EQ(2U, return_intermediates.size());
+ EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[0],
+ certs[1]->os_cert_handle()));
+ EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[1],
+ certs[2]->os_cert_handle()));
+}
+
+// Test that certificates supplied, but that are unrelated to the
+// certificate for which the chain is being constructed and verified, are
+// properly filtered out in the return chain.
+TEST(X509CertificateTest, VerifyReturnChainFiltersUnrelatedCerts) {
+ FilePath certs_dir = GetTestCertsDirectory();
+ CertificateList certs =
+ CreateCertificateListFromFile(certs_dir, "google.full_chain.pem",
+ X509Certificate::FORMAT_AUTO);
+ ASSERT_EQ(3U, certs.size());
+ scoped_refptr<X509Certificate> unrelated_dod_certificate =
+ ImportCertFromFile(certs_dir, "dod_ca_17_cert.der");
+ scoped_refptr<X509Certificate> unrelated_dod_certificate2 =
+ ImportCertFromFile(certs_dir, "dod_root_ca_2_cert.der");
+ ASSERT_NE(static_cast<X509Certificate*>(NULL), unrelated_dod_certificate);
+ ASSERT_NE(static_cast<X509Certificate*>(NULL), unrelated_dod_certificate2);
+
+ // Interject unrelated certificates into the list of intermediates.
+ X509Certificate::OSCertHandles intermediates;
+ intermediates.push_back(unrelated_dod_certificate->os_cert_handle());
+ intermediates.push_back(certs[1]->os_cert_handle());
+ intermediates.push_back(unrelated_dod_certificate2->os_cert_handle());
+ intermediates.push_back(certs[2]->os_cert_handle());
+
+ scoped_refptr<X509Certificate> google_full_chain =
+ X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(),
+ intermediates);
+ ASSERT_NE(static_cast<X509Certificate*>(NULL), google_full_chain);
+ ASSERT_EQ(4U, google_full_chain->GetIntermediateCertificates().size());
+
+ int flags = x509_chain::VERIFY_RETURN_CHAIN;
+ CertVerifyResult verify_result;
+ EXPECT_EQ(static_cast<X509Certificate*>(NULL), verify_result.certificate);
+ int error = x509_chain::VerifySSLServer(google_full_chain,
+ "www.google.com", flags,
+ &verify_result);
+ EXPECT_EQ(OK, error);
+ ASSERT_NE(static_cast<X509Certificate*>(NULL), verify_result.certificate);
+
+ EXPECT_TRUE(X509Certificate::IsSameOSCert(
+ google_full_chain->os_cert_handle(),
+ verify_result.certificate->os_cert_handle()));
+ const X509Certificate::OSCertHandles& return_intermediates =
+ verify_result.certificate->GetIntermediateCertificates();
+ EXPECT_EQ(2U, return_intermediates.size());
+ EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[0],
+ certs[1]->os_cert_handle()));
+ EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[1],
+ certs[2]->os_cert_handle()));
+}
+
+#if defined(ALLOW_EXTERNAL_ACCESS)
+// Test verification using only an end entity certificate, but one which has
+// an Authority Information Access extension containing a a location where
+// the intermediate certificate can be downloaded. It is not guaranteed that
+// the underlying crypto library will need to retrieve it using the AIA
+// extension, as it may already have a local copy installed or cached. In
+// order to keep this test reliable, however, and because it may make a
+// request to an external resource, this test is guarded by the define.
+TEST(X509CertificateTest, VerifyReturnsChainUsingAIA) {
+ FilePath certs_dir = GetTestCertsDirectory();
+ scoped_refptr<X509Certificate> google_cert =
+ ImportCertFromFile(certs_dir, "google.single.der");
+ ASSERT_NE(static_cast<X509Certificate*>(NULL), google_cert);
+ EXPECT_EQ(0U, google_cert->GetIntermediateCertificates().size());
+
+ int flags = x509_chain::VERIFY_RETURN_CHAIN;
+ CertVerifyResult verify_result;
+ EXPECT_EQ(static_cast<X509Certificate*>(NULL), verify_result.certificate);
+ int error = x509_chain::VerifySSLServer(google_cert, "www.google.com",
+ flags, &verify_result);
+ EXPECT_EQ(OK, error);
+ ASSERT_NE(static_cast<X509Certificate*>(NULL), verify_result.certificate);
+
+ EXPECT_TRUE(X509Certificate::IsSameOSCert(
+ google_cert->os_cert_handle(),
+ verify_result.certificate->os_cert_handle()));
+ const X509Certificate::OSCertHandles& intermediates =
+ verify_result.certificate->GetIntermediateCertificates();
+ EXPECT_EQ(2U, intermediates.size());
+}
+#endif
+
#if defined(OS_MACOSX)
TEST(X509CertificateTest, IsIssuedBy) {
FilePath certs_dir = GetTestCertsDirectory();
« no previous file with comments | « net/base/cert_verify_result.cc ('k') | net/base/x509_chain.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698