Chromium Code Reviews| 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 c6bb0e71bc5f8fc2701fdc030ef9c6f8bffd02ad..38aef6555f0abdd5d53431d4dbfed44a2ce10787 100644 |
| --- a/net/cert/cert_verify_proc_unittest.cc |
| +++ b/net/cert/cert_verify_proc_unittest.cc |
| @@ -1662,19 +1662,9 @@ TEST_F(CertVerifyProcTest, RejectsPrivateSHA1UnlessFlag) { |
| EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT); |
| } |
| -enum ExpectedAlgorithms { |
| - EXPECT_MD2 = 1 << 0, |
| - EXPECT_MD4 = 1 << 1, |
| - EXPECT_MD5 = 1 << 2, |
| - EXPECT_SHA1 = 1 << 3, |
| - EXPECT_SHA1_LEAF = 1 << 4, |
| -}; |
| - |
| struct WeakDigestTestData { |
| - const char* root_cert_filename; |
| - const char* intermediate_cert_filename; |
| - const char* ee_cert_filename; |
| - int expected_algorithms; |
| + const char* cert_filename; |
| + X509Certificate::SignatureHashAlgorithm expected_algorithm; |
| }; |
| // GTest 'magic' pretty-printer, so that if/when a test fails, it knows how |
| @@ -1682,10 +1672,7 @@ struct WeakDigestTestData { |
| // attempt to print out the first twenty bytes of the object, which depending |
| // on platform and alignment, may result in an invalid read. |
| void PrintTo(const WeakDigestTestData& data, std::ostream* os) { |
| - *os << "root: " |
| - << (data.root_cert_filename ? data.root_cert_filename : "none") |
| - << "; intermediate: " << data.intermediate_cert_filename |
| - << "; end-entity: " << data.ee_cert_filename; |
| + *os << "cert: " << data.cert_filename; |
| } |
| class CertVerifyProcWeakDigestTest |
| @@ -1697,196 +1684,59 @@ class 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. |
| +// algorithm used in a certificate. |
| TEST_P(CertVerifyProcWeakDigestTest, VerifyDetectsAlgorithm) { |
|
Ryan Sleevi
2017/01/06 02:27:14
So, a few behaviour changes worth calling out:
1)
|
| WeakDigestTestData data = GetParam(); |
| base::FilePath certs_dir = GetTestCertsDirectory(); |
| - ScopedTestRoot test_root; |
| - if (data.root_cert_filename) { |
| - scoped_refptr<X509Certificate> root_cert = |
| - ImportCertFromFile(certs_dir, data.root_cert_filename); |
| - ASSERT_TRUE(root_cert); |
| - test_root.Reset(root_cert.get()); |
| - } |
| + scoped_refptr<X509Certificate> cert = |
| + ImportCertFromFile(certs_dir, data.cert_filename); |
| + ASSERT_TRUE(cert); |
| - scoped_refptr<X509Certificate> intermediate_cert = |
| - ImportCertFromFile(certs_dir, data.intermediate_cert_filename); |
| - ASSERT_TRUE(intermediate_cert); |
| - scoped_refptr<X509Certificate> ee_cert = |
| - ImportCertFromFile(certs_dir, data.ee_cert_filename); |
| - ASSERT_TRUE(ee_cert); |
| + bool expected_has_md2 = |
| + data.expected_algorithm == X509Certificate::kSignatureHashAlgorithmMd2; |
| + bool expected_has_md4 = |
| + data.expected_algorithm == X509Certificate::kSignatureHashAlgorithmMd4; |
| + bool expected_has_md5 = |
| + data.expected_algorithm == X509Certificate::kSignatureHashAlgorithmMd5; |
| + bool expected_has_sha1 = |
| + data.expected_algorithm == X509Certificate::kSignatureHashAlgorithmSha1; |
| + |
| + // Try verifying with both is_leaf=true, and is_leaf=false. |
| + for (bool is_leaf : {true, false}) { |
| + // Fill the weak hash algorithm information using a default-initialized |
| + // CertVerifyResult (each of has_XXX will be false). |
| + CertVerifyResult verify_result; |
| + X509Certificate::SignatureHashAlgorithm hash_algorithm = |
| + FillCertVerifyResultWeakSignature(cert->os_cert_handle(), is_leaf, |
| + &verify_result); |
| - X509Certificate::OSCertHandles intermediates; |
| - intermediates.push_back(intermediate_cert->os_cert_handle()); |
| + EXPECT_EQ(data.expected_algorithm, hash_algorithm); |
| - scoped_refptr<X509Certificate> ee_chain = |
| - X509Certificate::CreateFromHandle(ee_cert->os_cert_handle(), |
| - intermediates); |
| - ASSERT_TRUE(ee_chain); |
| + EXPECT_EQ(expected_has_md2, verify_result.has_md2); |
| + EXPECT_EQ(expected_has_md4, verify_result.has_md4); |
| + EXPECT_EQ(expected_has_md5, verify_result.has_md5); |
| + EXPECT_EQ(expected_has_sha1, verify_result.has_sha1); |
| + EXPECT_EQ(expected_has_sha1 && is_leaf, verify_result.has_sha1_leaf); |
| + } |
| - int flags = 0; |
| - CertVerifyResult verify_result; |
| - 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); |
| + // TODO(eroman): Verify that values are not re-set to false when not |
| + // applicable. |
|
Ryan Sleevi
2017/01/06 02:27:14
I'm not sure why this TODO?
|
| } |
| -// Unlike TEST/TEST_F, which are macros that expand to further macros, |
| -// INSTANTIATE_TEST_CASE_P is a macro that expands directly to code that |
| -// stringizes the arguments. As a result, macros passed as parameters (such as |
| -// prefix or test_case_name) will not be expanded by the preprocessor. To work |
| -// around this, indirect the macro for INSTANTIATE_TEST_CASE_P, so that the |
| -// pre-processor will expand macros such as MAYBE_test_name before |
| -// instantiating the test. |
| -#define WRAPPED_INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \ |
| - INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) |
| - |
| -// The signature algorithm of the root CA should not matter. |
| -const WeakDigestTestData kVerifyRootCATestData[] = { |
| - {"weak_digest_md5_root.pem", "weak_digest_sha1_intermediate.pem", |
| - "weak_digest_sha1_ee.pem", EXPECT_SHA1 | EXPECT_SHA1_LEAF}, |
| -#if defined(USE_OPENSSL_CERTS) || defined(OS_WIN) |
| - // MD4 is not supported by OS X / NSS |
| - {"weak_digest_md4_root.pem", "weak_digest_sha1_intermediate.pem", |
| - "weak_digest_sha1_ee.pem", EXPECT_SHA1 | EXPECT_SHA1_LEAF}, |
| -#endif |
| - {"weak_digest_md2_root.pem", "weak_digest_sha1_intermediate.pem", |
| - "weak_digest_sha1_ee.pem", EXPECT_SHA1 | EXPECT_SHA1_LEAF}, |
| +const WeakDigestTestData kVerifyWeakSignatureData[] = { |
| + {"weak_digest_md5_intermediate.pem", |
| + X509Certificate::kSignatureHashAlgorithmMd5}, |
| + {"weak_digest_md4_intermediate.pem", |
| + X509Certificate::kSignatureHashAlgorithmMd4}, |
| + {"weak_digest_md2_intermediate.pem", |
| + X509Certificate::kSignatureHashAlgorithmMd2}, |
| + {"weak_digest_sha1_ee.pem", X509Certificate::kSignatureHashAlgorithmSha1}, |
| }; |
| -INSTANTIATE_TEST_CASE_P(VerifyRoot, |
| + |
| +INSTANTIATE_TEST_CASE_P(, |
| CertVerifyProcWeakDigestTest, |
| - testing::ValuesIn(kVerifyRootCATestData)); |
| - |
| -// The signature algorithm of intermediates should be properly detected. |
| -const WeakDigestTestData kVerifyIntermediateCATestData[] = { |
| - {"weak_digest_sha1_root.pem", "weak_digest_md5_intermediate.pem", |
| - "weak_digest_sha1_ee.pem", EXPECT_MD5 | EXPECT_SHA1 | EXPECT_SHA1_LEAF}, |
| -#if defined(USE_OPENSSL_CERTS) || defined(OS_WIN) |
| - // MD4 is not supported by OS X / NSS |
| - {"weak_digest_sha1_root.pem", "weak_digest_md4_intermediate.pem", |
| - "weak_digest_sha1_ee.pem", EXPECT_MD4 | EXPECT_SHA1 | EXPECT_SHA1_LEAF}, |
| -#endif |
| - {"weak_digest_sha1_root.pem", "weak_digest_md2_intermediate.pem", |
| - "weak_digest_sha1_ee.pem", EXPECT_MD2 | EXPECT_SHA1 | EXPECT_SHA1_LEAF}, |
| -}; |
| -// Disabled on NSS - MD4 is not supported, and MD2 and MD5 are disabled. |
| -#if defined(USE_NSS_CERTS) || defined(OS_IOS) |
| -#define MAYBE_VerifyIntermediate DISABLED_VerifyIntermediate |
| -#else |
| -#define MAYBE_VerifyIntermediate VerifyIntermediate |
| -#endif |
| -WRAPPED_INSTANTIATE_TEST_CASE_P( |
| - MAYBE_VerifyIntermediate, |
| - CertVerifyProcWeakDigestTest, |
| - testing::ValuesIn(kVerifyIntermediateCATestData)); |
| - |
| -// The signature algorithm of end-entity should be properly detected. |
| -const WeakDigestTestData kVerifyEndEntityTestData[] = { |
| - { "weak_digest_sha1_root.pem", "weak_digest_sha1_intermediate.pem", |
| - "weak_digest_md5_ee.pem", EXPECT_MD5 | EXPECT_SHA1 }, |
| -#if defined(USE_OPENSSL_CERTS) || defined(OS_WIN) |
| - // MD4 is not supported by OS X / NSS |
| - { "weak_digest_sha1_root.pem", "weak_digest_sha1_intermediate.pem", |
| - "weak_digest_md4_ee.pem", EXPECT_MD4 | EXPECT_SHA1 }, |
| -#endif |
| - { "weak_digest_sha1_root.pem", "weak_digest_sha1_intermediate.pem", |
| - "weak_digest_md2_ee.pem", EXPECT_MD2 | EXPECT_SHA1 }, |
| -}; |
| -// Disabled on NSS - NSS caches chains/signatures in such a way that cannot |
| -// be cleared until NSS is cleanly shutdown, which is not presently supported |
| -// in Chromium. |
| -// OSX 10.12+ stops building the chain at the first weak digest. |
| -#if defined(USE_NSS_CERTS) || defined(OS_IOS) || defined(OS_MACOSX) |
| -#define MAYBE_VerifyEndEntity DISABLED_VerifyEndEntity |
| -#else |
| -#define MAYBE_VerifyEndEntity VerifyEndEntity |
| -#endif |
| -WRAPPED_INSTANTIATE_TEST_CASE_P(MAYBE_VerifyEndEntity, |
| - CertVerifyProcWeakDigestTest, |
| - testing::ValuesIn(kVerifyEndEntityTestData)); |
| - |
| -// Incomplete chains should still report the status of the intermediate. |
| -const WeakDigestTestData kVerifyIncompleteIntermediateTestData[] = { |
| - {NULL, "weak_digest_md5_intermediate.pem", "weak_digest_sha1_ee.pem", |
| - EXPECT_MD5 | EXPECT_SHA1 | EXPECT_SHA1_LEAF}, |
| -#if defined(USE_OPENSSL_CERTS) || defined(OS_WIN) |
| - // MD4 is not supported by OS X / NSS |
| - {NULL, "weak_digest_md4_intermediate.pem", "weak_digest_sha1_ee.pem", |
| - EXPECT_MD4 | EXPECT_SHA1 | EXPECT_SHA1_LEAF}, |
| -#endif |
| - {NULL, "weak_digest_md2_intermediate.pem", "weak_digest_sha1_ee.pem", |
| - EXPECT_MD2 | EXPECT_SHA1 | EXPECT_SHA1_LEAF}, |
| -}; |
| -// Disabled on NSS - libpkix does not return constructed chains on error, |
| -// preventing us from detecting/inspecting the verified chain. |
| -#if defined(USE_NSS_CERTS) || defined(OS_IOS) |
| -#define MAYBE_VerifyIncompleteIntermediate \ |
| - DISABLED_VerifyIncompleteIntermediate |
| -#else |
| -#define MAYBE_VerifyIncompleteIntermediate VerifyIncompleteIntermediate |
| -#endif |
| -WRAPPED_INSTANTIATE_TEST_CASE_P( |
| - MAYBE_VerifyIncompleteIntermediate, |
| - CertVerifyProcWeakDigestTest, |
| - testing::ValuesIn(kVerifyIncompleteIntermediateTestData)); |
| - |
| -// Incomplete chains should still report the status of the end-entity. |
| -const WeakDigestTestData kVerifyIncompleteEETestData[] = { |
| - { NULL, "weak_digest_sha1_intermediate.pem", "weak_digest_md5_ee.pem", |
| - EXPECT_MD5 | EXPECT_SHA1 }, |
| -#if defined(USE_OPENSSL_CERTS) || defined(OS_WIN) |
| - // MD4 is not supported by OS X / NSS |
| - { NULL, "weak_digest_sha1_intermediate.pem", "weak_digest_md4_ee.pem", |
| - EXPECT_MD4 | EXPECT_SHA1 }, |
| -#endif |
| - { NULL, "weak_digest_sha1_intermediate.pem", "weak_digest_md2_ee.pem", |
| - EXPECT_MD2 | EXPECT_SHA1 }, |
| -}; |
| -// Disabled on NSS - libpkix does not return constructed chains on error, |
| -// preventing us from detecting/inspecting the verified chain. |
| -// OSX 10.12+ stops building the chain at the first weak digest. |
| -#if defined(USE_NSS_CERTS) || defined(OS_IOS) || defined(OS_MACOSX) |
| -#define MAYBE_VerifyIncompleteEndEntity DISABLED_VerifyIncompleteEndEntity |
| -#else |
| -#define MAYBE_VerifyIncompleteEndEntity VerifyIncompleteEndEntity |
| -#endif |
| -WRAPPED_INSTANTIATE_TEST_CASE_P( |
| - MAYBE_VerifyIncompleteEndEntity, |
| - CertVerifyProcWeakDigestTest, |
| - testing::ValuesIn(kVerifyIncompleteEETestData)); |
| - |
| -// Differing algorithms between the intermediate and the EE should still be |
| -// reported. |
| -const WeakDigestTestData kVerifyMixedTestData[] = { |
| - { "weak_digest_sha1_root.pem", "weak_digest_md5_intermediate.pem", |
| - "weak_digest_md2_ee.pem", EXPECT_MD2 | EXPECT_MD5 }, |
| - { "weak_digest_sha1_root.pem", "weak_digest_md2_intermediate.pem", |
| - "weak_digest_md5_ee.pem", EXPECT_MD2 | EXPECT_MD5 }, |
| -#if defined(USE_OPENSSL_CERTS) || defined(OS_WIN) |
| - // MD4 is not supported by OS X / NSS |
| - { "weak_digest_sha1_root.pem", "weak_digest_md4_intermediate.pem", |
| - "weak_digest_md2_ee.pem", EXPECT_MD2 | EXPECT_MD4 }, |
| -#endif |
| -}; |
| -// NSS does not support MD4 and does not enable MD2 by default, making all |
| -// permutations invalid. |
| -// OSX 10.12+ stops building the chain at the first weak digest. |
| -#if defined(USE_NSS_CERTS) || defined(OS_IOS) || defined(OS_MACOSX) |
| -#define MAYBE_VerifyMixed DISABLED_VerifyMixed |
| -#else |
| -#define MAYBE_VerifyMixed VerifyMixed |
| -#endif |
| -WRAPPED_INSTANTIATE_TEST_CASE_P( |
| - MAYBE_VerifyMixed, |
| - CertVerifyProcWeakDigestTest, |
| - testing::ValuesIn(kVerifyMixedTestData)); |
| + testing::ValuesIn(kVerifyWeakSignatureData)); |
| // For the list of valid hostnames, see |
| // net/cert/data/ssl/certificates/subjectAltName_sanity_check.pem |
| @@ -1948,10 +1798,9 @@ TEST_P(CertVerifyProcNameTest, VerifyCertName) { |
| } |
| } |
| -WRAPPED_INSTANTIATE_TEST_CASE_P( |
| - VerifyName, |
| - CertVerifyProcNameTest, |
| - testing::ValuesIn(kVerifyNameData)); |
| +INSTANTIATE_TEST_CASE_P(VerifyName, |
| + CertVerifyProcNameTest, |
| + testing::ValuesIn(kVerifyNameData)); |
| #if defined(OS_MACOSX) && !defined(OS_IOS) |
| // Test that CertVerifyProcMac reacts appropriately when Apple's certificate |