| Index: net/cert/cert_verify_proc_unittest.cc
|
| diff --git a/net/cert/cert_verify_proc_unittest.cc b/net/cert/cert_verify_proc_unittest.cc
|
| index b7460f4f8b264c639b4df683128ed9fd71e333a6..88cbff8fb3e3273c318c70ca6d22bc3d7460777e 100644
|
| --- a/net/cert/cert_verify_proc_unittest.cc
|
| +++ b/net/cert/cert_verify_proc_unittest.cc
|
| @@ -14,7 +14,6 @@
|
| #include "base/sha1.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/test/histogram_tester.h"
|
| -#include "base/test/scoped_feature_list.h"
|
| #include "build/build_config.h"
|
| #include "crypto/sha2.h"
|
| #include "net/base/net_errors.h"
|
| @@ -41,10 +40,6 @@
|
| #include "net/cert/test_keychain_search_list_mac.h"
|
| #endif
|
|
|
| -#if defined(OS_WIN)
|
| -#include "base/win/windows_version.h"
|
| -#endif
|
| -
|
| using net::test::IsError;
|
| using net::test::IsOk;
|
|
|
| @@ -876,18 +871,10 @@
|
| EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_NON_UNIQUE_NAME);
|
| }
|
|
|
| -// While all SHA-1 certificates should be rejected, in the event that there
|
| -// emerges some unexpected bug, test that the 'legacy' behaviour works
|
| -// correctly - rejecting all SHA-1 certificates from publicly trusted CAs
|
| -// that were issued after 1 January 2016, while still allowing those from
|
| -// before that date, with SHA-1 in the intermediate, or from an enterprise
|
| -// CA.
|
| -//
|
| -// TODO(rsleevi): This code should be removed in M57.
|
| -TEST_F(CertVerifyProcTest, VerifyRejectsSHA1AfterDeprecationLegacyMode) {
|
| - base::test::ScopedFeatureList scoped_feature_list;
|
| - scoped_feature_list.InitAndEnableFeature(CertVerifyProc::kSHA1LegacyMode);
|
| -
|
| +// Test that a SHA-1 certificate from a publicly trusted CA issued after
|
| +// 1 January 2016 is rejected, but those issued before that date, or with
|
| +// SHA-1 in the intermediate, is not rejected.
|
| +TEST_F(CertVerifyProcTest, VerifyRejectsSHA1AfterDeprecation) {
|
| CertVerifyResult dummy_result;
|
| CertVerifyResult verify_result;
|
| int error = 0;
|
| @@ -1525,131 +1512,6 @@
|
| }
|
| #endif
|
|
|
| -bool AreSHA1IntermediatesAllowed() {
|
| -#if defined(OS_WIN)
|
| - // TODO(rsleevi): Remove this once https://crbug.com/588789 is resolved
|
| - // for Windows 7/2008 users.
|
| - // Note: This must be kept in sync with cert_verify_proc.cc
|
| - return base::win::GetVersion() >= base::win::VERSION_WIN8;
|
| -#else
|
| - return false;
|
| -#endif
|
| -}
|
| -
|
| -TEST_F(CertVerifyProcTest, RejectsMD2) {
|
| - scoped_refptr<X509Certificate> cert(
|
| - ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
|
| - ASSERT_TRUE(cert);
|
| -
|
| - CertVerifyResult result;
|
| - result.has_md2 = true;
|
| - verify_proc_ = new MockCertVerifyProc(result);
|
| -
|
| - int flags = 0;
|
| - CertVerifyResult verify_result;
|
| - int error = Verify(cert.get(), "127.0.0.1", flags, nullptr /* crl_set */,
|
| - empty_cert_list_, &verify_result);
|
| - EXPECT_THAT(error, IsError(ERR_CERT_INVALID));
|
| - EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID);
|
| -}
|
| -
|
| -TEST_F(CertVerifyProcTest, RejectsMD4) {
|
| - scoped_refptr<X509Certificate> cert(
|
| - ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
|
| - ASSERT_TRUE(cert);
|
| -
|
| - CertVerifyResult result;
|
| - result.has_md4 = true;
|
| - verify_proc_ = new MockCertVerifyProc(result);
|
| -
|
| - int flags = 0;
|
| - CertVerifyResult verify_result;
|
| - int error = Verify(cert.get(), "127.0.0.1", flags, nullptr /* crl_set */,
|
| - empty_cert_list_, &verify_result);
|
| - EXPECT_THAT(error, IsError(ERR_CERT_INVALID));
|
| - EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID);
|
| -}
|
| -
|
| -TEST_F(CertVerifyProcTest, RejectsMD5) {
|
| - scoped_refptr<X509Certificate> cert(
|
| - ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
|
| - ASSERT_TRUE(cert);
|
| -
|
| - CertVerifyResult result;
|
| - result.has_md5 = true;
|
| - verify_proc_ = new MockCertVerifyProc(result);
|
| -
|
| - int flags = 0;
|
| - CertVerifyResult verify_result;
|
| - int error = Verify(cert.get(), "127.0.0.1", flags, nullptr /* crl_set */,
|
| - empty_cert_list_, &verify_result);
|
| - EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM));
|
| - EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_WEAK_SIGNATURE_ALGORITHM);
|
| -}
|
| -
|
| -TEST_F(CertVerifyProcTest, RejectsPublicSHA1Leaves) {
|
| - scoped_refptr<X509Certificate> cert(
|
| - ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
|
| - ASSERT_TRUE(cert);
|
| -
|
| - CertVerifyResult result;
|
| - result.has_sha1 = true;
|
| - result.has_sha1_leaf = true;
|
| - result.is_issued_by_known_root = true;
|
| - verify_proc_ = new MockCertVerifyProc(result);
|
| -
|
| - int flags = 0;
|
| - CertVerifyResult verify_result;
|
| - int error = Verify(cert.get(), "127.0.0.1", flags, nullptr /* crl_set */,
|
| - empty_cert_list_, &verify_result);
|
| - EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM));
|
| - EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_WEAK_SIGNATURE_ALGORITHM);
|
| -}
|
| -
|
| -TEST_F(CertVerifyProcTest, RejectsPublicSHA1IntermediatesUnlessAllowed) {
|
| - scoped_refptr<X509Certificate> cert(
|
| - ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
|
| - ASSERT_TRUE(cert);
|
| -
|
| - CertVerifyResult result;
|
| - result.has_sha1 = true;
|
| - result.has_sha1_leaf = false;
|
| - result.is_issued_by_known_root = true;
|
| - verify_proc_ = new MockCertVerifyProc(result);
|
| -
|
| - int flags = 0;
|
| - CertVerifyResult verify_result;
|
| - int error = Verify(cert.get(), "127.0.0.1", flags, nullptr /* crl_set */,
|
| - empty_cert_list_, &verify_result);
|
| - if (AreSHA1IntermediatesAllowed()) {
|
| - EXPECT_THAT(error, IsOk());
|
| - EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT);
|
| - } else {
|
| - EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM));
|
| - EXPECT_TRUE(verify_result.cert_status &
|
| - CERT_STATUS_WEAK_SIGNATURE_ALGORITHM);
|
| - }
|
| -}
|
| -
|
| -TEST_F(CertVerifyProcTest, AcceptsPrivateSHA1) {
|
| - scoped_refptr<X509Certificate> cert(
|
| - ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
|
| - ASSERT_TRUE(cert);
|
| -
|
| - CertVerifyResult result;
|
| - result.has_sha1 = true;
|
| - result.has_sha1_leaf = true;
|
| - result.is_issued_by_known_root = false;
|
| - verify_proc_ = new MockCertVerifyProc(result);
|
| -
|
| - int flags = 0;
|
| - CertVerifyResult verify_result;
|
| - int error = Verify(cert.get(), "127.0.0.1", flags, nullptr /* crl_set */,
|
| - empty_cert_list_, &verify_result);
|
| - EXPECT_THAT(error, IsOk());
|
| - EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT);
|
| -}
|
| -
|
| enum ExpectedAlgorithms {
|
| EXPECT_MD2 = 1 << 0,
|
| EXPECT_MD4 = 1 << 1,
|
| @@ -1684,10 +1546,7 @@
|
| virtual ~CertVerifyProcWeakDigestTest() {}
|
| };
|
|
|
| -// Test that the underlying cryptographic library properly surfaces the
|
| -// algorithms used in the chain. Some libraries, like NSS, don't return
|
| -// the failing chain on error, and thus not all tests can be run.
|
| -TEST_P(CertVerifyProcWeakDigestTest, VerifyDetectsAlgorithm) {
|
| +TEST_P(CertVerifyProcWeakDigestTest, Verify) {
|
| WeakDigestTestData data = GetParam();
|
| base::FilePath certs_dir = GetTestCertsDirectory();
|
|
|
| @@ -1695,16 +1554,16 @@
|
| if (data.root_cert_filename) {
|
| scoped_refptr<X509Certificate> root_cert =
|
| ImportCertFromFile(certs_dir, data.root_cert_filename);
|
| - ASSERT_TRUE(root_cert);
|
| + ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert.get());
|
| test_root.Reset(root_cert.get());
|
| }
|
|
|
| scoped_refptr<X509Certificate> intermediate_cert =
|
| ImportCertFromFile(certs_dir, data.intermediate_cert_filename);
|
| - ASSERT_TRUE(intermediate_cert);
|
| + ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate_cert.get());
|
| scoped_refptr<X509Certificate> ee_cert =
|
| ImportCertFromFile(certs_dir, data.ee_cert_filename);
|
| - ASSERT_TRUE(ee_cert);
|
| + ASSERT_NE(static_cast<X509Certificate*>(NULL), ee_cert.get());
|
|
|
| X509Certificate::OSCertHandles intermediates;
|
| intermediates.push_back(intermediate_cert->os_cert_handle());
|
| @@ -1712,18 +1571,53 @@
|
| scoped_refptr<X509Certificate> ee_chain =
|
| X509Certificate::CreateFromHandle(ee_cert->os_cert_handle(),
|
| intermediates);
|
| - ASSERT_TRUE(ee_chain);
|
| -
|
| - int flags = 0;
|
| - CertVerifyResult verify_result;
|
| - Verify(ee_chain.get(), "127.0.0.1", flags, NULL, empty_cert_list_,
|
| - &verify_result);
|
| + ASSERT_NE(static_cast<X509Certificate*>(NULL), ee_chain.get());
|
| +
|
| + int flags = 0;
|
| + CertVerifyResult verify_result;
|
| + int rv = Verify(ee_chain.get(),
|
| + "127.0.0.1",
|
| + flags,
|
| + NULL,
|
| + empty_cert_list_,
|
| + &verify_result);
|
| EXPECT_EQ(!!(data.expected_algorithms & EXPECT_MD2), verify_result.has_md2);
|
| EXPECT_EQ(!!(data.expected_algorithms & EXPECT_MD4), verify_result.has_md4);
|
| EXPECT_EQ(!!(data.expected_algorithms & EXPECT_MD5), verify_result.has_md5);
|
| EXPECT_EQ(!!(data.expected_algorithms & EXPECT_SHA1), verify_result.has_sha1);
|
| EXPECT_EQ(!!(data.expected_algorithms & EXPECT_SHA1_LEAF),
|
| verify_result.has_sha1_leaf);
|
| +
|
| + EXPECT_FALSE(verify_result.is_issued_by_additional_trust_anchor);
|
| +
|
| + // Ensure that MD4 and MD2 are tagged as invalid.
|
| + if (data.expected_algorithms & (EXPECT_MD2 | EXPECT_MD4)) {
|
| + EXPECT_EQ(CERT_STATUS_INVALID,
|
| + verify_result.cert_status & CERT_STATUS_INVALID);
|
| + }
|
| +
|
| + // Ensure that MD5 is flagged as weak.
|
| + if (data.expected_algorithms & EXPECT_MD5) {
|
| + EXPECT_EQ(
|
| + CERT_STATUS_WEAK_SIGNATURE_ALGORITHM,
|
| + verify_result.cert_status & CERT_STATUS_WEAK_SIGNATURE_ALGORITHM);
|
| + }
|
| +
|
| + // If a root cert is present, then check that the chain was rejected if any
|
| + // weak algorithms are present. This is only checked when a root cert is
|
| + // present because the error reported for incomplete chains with weak
|
| + // algorithms depends on which implementation was used to validate (NSS,
|
| + // OpenSSL, CryptoAPI, Security.framework) and upon which weak algorithm
|
| + // present (MD2, MD4, MD5).
|
| + if (data.root_cert_filename) {
|
| + if (data.expected_algorithms & (EXPECT_MD2 | EXPECT_MD4)) {
|
| + EXPECT_THAT(rv, IsError(ERR_CERT_INVALID));
|
| + } else if (data.expected_algorithms & EXPECT_MD5) {
|
| + EXPECT_THAT(rv, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM));
|
| + } else {
|
| + EXPECT_THAT(rv, IsOk());
|
| + }
|
| + }
|
| }
|
|
|
| // Unlike TEST/TEST_F, which are macros that expand to further macros,
|
| @@ -1974,9 +1868,9 @@
|
| base::HistogramTester histograms;
|
| scoped_refptr<X509Certificate> cert(
|
| ImportCertFromFile(GetTestCertsDirectory(), "tls_feature_extension.pem"));
|
| - ASSERT_TRUE(cert);
|
| CertVerifyResult result;
|
| result.is_issued_by_known_root = false;
|
| + result.verified_cert = cert;
|
| verify_proc_ = new MockCertVerifyProc(result);
|
|
|
| histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0);
|
| @@ -2000,9 +1894,9 @@
|
| base::HistogramTester histograms;
|
| scoped_refptr<X509Certificate> cert(
|
| ImportCertFromFile(GetTestCertsDirectory(), "tls_feature_extension.pem"));
|
| - ASSERT_TRUE(cert);
|
| CertVerifyResult result;
|
| result.is_issued_by_known_root = false;
|
| + result.verified_cert = cert;
|
| verify_proc_ = new MockCertVerifyProc(result);
|
|
|
| histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0);
|
| @@ -2027,9 +1921,9 @@
|
| base::HistogramTester histograms;
|
| scoped_refptr<X509Certificate> cert(
|
| ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
|
| - ASSERT_TRUE(cert);
|
| CertVerifyResult result;
|
| result.is_issued_by_known_root = false;
|
| + result.verified_cert = cert;
|
| verify_proc_ = new MockCertVerifyProc(result);
|
|
|
| histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0);
|
| @@ -2052,9 +1946,9 @@
|
| base::HistogramTester histograms;
|
| scoped_refptr<X509Certificate> cert(
|
| ImportCertFromFile(GetTestCertsDirectory(), "tls_feature_extension.pem"));
|
| - ASSERT_TRUE(cert);
|
| CertVerifyResult result;
|
| result.is_issued_by_known_root = true;
|
| + result.verified_cert = cert;
|
| verify_proc_ = new MockCertVerifyProc(result);
|
|
|
| histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0);
|
|
|