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 71a0c0ee9904ac5583d2ad35838d32a715dea347..9d7e7503ba4d62ed1c79cf1b741a88d0d9674c5b 100644 |
--- a/net/cert/cert_verify_proc_unittest.cc |
+++ b/net/cert/cert_verify_proc_unittest.cc |
@@ -29,6 +29,8 @@ |
#include "base/win/windows_version.h" |
#elif defined(OS_MACOSX) && !defined(OS_IOS) |
#include "base/mac/mac_util.h" |
+#elif defined(OS_ANDROID) |
+#include "base/android/build_info.h" |
#endif |
using base::HexEncode; |
@@ -83,6 +85,26 @@ int WellKnownCaCertVerifyProc::VerifyInternal( |
return OK; |
} |
+bool SupportsReturningVerifiedChain() { |
+#if defined(OS_ANDROID) |
+ // Before API level 17, Android does not expose the APIs necessary to get at |
+ // the verified certificate chain. |
+ if (base::android::BuildInfo::GetInstance()->sdk_int() < 17) |
+ return false; |
+#endif |
+ return true; |
+} |
+ |
+bool SupportsDetectingKnownRoots() { |
+#if defined(OS_ANDROID) |
+ // Before API level 17, Android does not expose the APIs necessary to get at |
+ // the verified certificate chain and detect known roots. |
+ if (base::android::BuildInfo::GetInstance()->sdk_int() < 17) |
+ return false; |
+#endif |
+ return true; |
+} |
+ |
} // namespace |
class CertVerifyProcTest : public testing::Test { |
@@ -398,14 +420,15 @@ TEST_F(CertVerifyProcTest, RejectWeakKeys) { |
// provided by servers. See CertVerifyProcTest.CybertrustGTERoot for further |
// details. |
#define MAYBE_ExtraneousMD5RootCert DISABLED_ExtraneousMD5RootCert |
-#elif defined(USE_OPENSSL) || defined(OS_ANDROID) |
-// Disabled for OpenSSL / Android - Android and OpenSSL do not attempt to find |
-// a minimal certificate chain, thus prefer the MD5 root over the SHA-1 root. |
-#define MAYBE_ExtraneousMD5RootCert DISABLED_ExtraneousMD5RootCert |
#else |
#define MAYBE_ExtraneousMD5RootCert ExtraneousMD5RootCert |
#endif |
TEST_F(CertVerifyProcTest, MAYBE_ExtraneousMD5RootCert) { |
+ if (!SupportsReturningVerifiedChain()) { |
+ LOG(INFO) << "Skipping this test in this platform."; |
+ return; |
+ } |
+ |
base::FilePath certs_dir = GetTestCertsDirectory(); |
scoped_refptr<X509Certificate> server_cert = |
@@ -554,13 +577,12 @@ TEST_F(CertVerifyProcTest, NameConstraintsOk) { |
EXPECT_EQ(0U, verify_result.cert_status); |
} |
-#if defined(OS_ANDROID) |
-// Disabled because Android isn't filling in SPKI hashes: crbug.com/116838. |
-#define MAYBE_NameConstraintsFailure DISABLED_NameConstraintsFailure |
-#else |
-#define MAYBE_NameConstraintsFailure NameConstraintsFailure |
-#endif |
-TEST_F(CertVerifyProcTest, MAYBE_NameConstraintsFailure) { |
+TEST_F(CertVerifyProcTest, NameConstraintsFailure) { |
+ if (!SupportsReturningVerifiedChain()) { |
+ LOG(INFO) << "Skipping this test in this platform."; |
+ return; |
+ } |
+ |
CertificateList ca_cert_list = |
CreateCertificateListFromFile(GetTestCertsDirectory(), |
"root_ca_cert.pem", |
@@ -591,8 +613,12 @@ TEST_F(CertVerifyProcTest, MAYBE_NameConstraintsFailure) { |
verify_result.cert_status & CERT_STATUS_NAME_CONSTRAINT_VIOLATION); |
} |
-// The certse.pem certificate has been revoked. crbug.com/259723. |
TEST_F(CertVerifyProcTest, TestKnownRoot) { |
+ if (!SupportsDetectingKnownRoots()) { |
+ LOG(INFO) << "Skipping this test in this platform."; |
+ return; |
+ } |
+ |
base::FilePath certs_dir = GetTestCertsDirectory(); |
CertificateList certs = CreateCertificateListFromFile( |
certs_dir, "satveda.pem", X509Certificate::FORMAT_AUTO); |
@@ -622,6 +648,11 @@ TEST_F(CertVerifyProcTest, TestKnownRoot) { |
// The certse.pem certificate has been revoked. crbug.com/259723. |
TEST_F(CertVerifyProcTest, PublicKeyHashes) { |
+ if (!SupportsReturningVerifiedChain()) { |
+ LOG(INFO) << "Skipping this test in this platform."; |
+ return; |
+ } |
+ |
base::FilePath certs_dir = GetTestCertsDirectory(); |
CertificateList certs = CreateCertificateListFromFile( |
certs_dir, "satveda.pem", X509Certificate::FORMAT_AUTO); |
@@ -717,6 +748,11 @@ TEST_F(CertVerifyProcTest, InvalidKeyUsage) { |
// used to ensure that the actual, verified chain is being returned by |
// Verify(). |
TEST_F(CertVerifyProcTest, VerifyReturnChainBasic) { |
+ if (!SupportsReturningVerifiedChain()) { |
+ LOG(INFO) << "Skipping this test in this platform."; |
+ return; |
+ } |
+ |
base::FilePath certs_dir = GetTestCertsDirectory(); |
CertificateList certs = CreateCertificateListFromFile( |
certs_dir, "x509_verify_results.chain.pem", |
@@ -759,19 +795,16 @@ TEST_F(CertVerifyProcTest, VerifyReturnChainBasic) { |
certs[2]->os_cert_handle())); |
} |
-#if defined(OS_ANDROID) |
-// TODO(ppi): Disabled because is_issued_by_known_root is incorrect on Android. |
-// Once this is fixed, re-enable this check for android. crbug.com/116838 |
-#define MAYBE_IntranetHostsRejected DISABLED_IntranetHostsRejected |
-#else |
-#define MAYBE_IntranetHostsRejected IntranetHostsRejected |
-#endif |
- |
// Test that certificates issued for 'intranet' names (that is, containing no |
// known public registry controlled domain information) issued by well-known |
// CAs are flagged appropriately, while certificates that are issued by |
// internal CAs are not flagged. |
-TEST_F(CertVerifyProcTest, MAYBE_IntranetHostsRejected) { |
+TEST_F(CertVerifyProcTest, IntranetHostsRejected) { |
+ if (!SupportsDetectingKnownRoots()) { |
+ LOG(INFO) << "Skipping this test in this platform."; |
+ return; |
+ } |
+ |
CertificateList cert_list = CreateCertificateListFromFile( |
GetTestCertsDirectory(), "ok_cert.pem", |
X509Certificate::FORMAT_AUTO); |
@@ -802,6 +835,11 @@ TEST_F(CertVerifyProcTest, MAYBE_IntranetHostsRejected) { |
// of intermediate certificates are combined, it's possible that order may |
// not be maintained. |
TEST_F(CertVerifyProcTest, VerifyReturnChainProperlyOrdered) { |
+ if (!SupportsReturningVerifiedChain()) { |
+ LOG(INFO) << "Skipping this test in this platform."; |
+ return; |
+ } |
+ |
base::FilePath certs_dir = GetTestCertsDirectory(); |
CertificateList certs = CreateCertificateListFromFile( |
certs_dir, "x509_verify_results.chain.pem", |
@@ -848,6 +886,11 @@ TEST_F(CertVerifyProcTest, VerifyReturnChainProperlyOrdered) { |
// Test that Verify() filters out certificates which are not related to |
// or part of the certificate chain being verified. |
TEST_F(CertVerifyProcTest, VerifyReturnChainFiltersUnrelatedCerts) { |
+ if (!SupportsReturningVerifiedChain()) { |
+ LOG(INFO) << "Skipping this test in this platform."; |
+ return; |
+ } |
+ |
base::FilePath certs_dir = GetTestCertsDirectory(); |
CertificateList certs = CreateCertificateListFromFile( |
certs_dir, "x509_verify_results.chain.pem", |
@@ -946,6 +989,32 @@ TEST_F(CertVerifyProcTest, AdditionalTrustAnchors) { |
EXPECT_FALSE(verify_result.is_issued_by_additional_trust_anchor); |
} |
+// Tests that certificates issued by user-supplied roots are not flagged as |
+// issued by a known root. This should pass whether or not the platform supports |
+// detecting known roots. |
+TEST_F(CertVerifyProcTest, IsIssuedByKnownRootIgnoresTestRoots) { |
+ // Load root_ca_cert.pem into the test root store. |
+ TestRootCerts* root_certs = TestRootCerts::GetInstance(); |
+ root_certs->AddFromFile( |
+ GetTestCertsDirectory().AppendASCII("root_ca_cert.pem")); |
+ |
+ CertificateList cert_list = CreateCertificateListFromFile( |
+ GetTestCertsDirectory(), "ok_cert.pem", |
+ X509Certificate::FORMAT_AUTO); |
+ ASSERT_EQ(1U, cert_list.size()); |
+ scoped_refptr<X509Certificate> cert(cert_list[0]); |
+ |
+ // Verification should pass. |
+ int flags = 0; |
+ CertVerifyResult verify_result; |
+ int error = Verify( |
+ cert.get(), "127.0.0.1", flags, NULL, empty_cert_list_, &verify_result); |
+ EXPECT_EQ(OK, error); |
+ EXPECT_EQ(0U, verify_result.cert_status); |
+ // But should not be marked as a known root. |
+ EXPECT_FALSE(verify_result.is_issued_by_known_root); |
+} |
+ |
#if defined(OS_MACOSX) && !defined(OS_IOS) |
// Tests that, on OS X, issues with a cross-certified Baltimore CyberTrust |
// Root can be successfully worked around once Apple completes removing the |