Initial implementation of Bare Metal Mode for NaCl.
[chromium-blink-merge.git] / net / cert / cert_verify_proc_unittest.cc
blob71a0c0ee9904ac5583d2ad35838d32a715dea347
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "net/cert/cert_verify_proc.h"
7 #include <vector>
9 #include "base/callback_helpers.h"
10 #include "base/files/file_path.h"
11 #include "base/logging.h"
12 #include "base/sha1.h"
13 #include "base/strings/string_number_conversions.h"
14 #include "crypto/sha2.h"
15 #include "net/base/net_errors.h"
16 #include "net/base/test_data_directory.h"
17 #include "net/cert/asn1_util.h"
18 #include "net/cert/cert_status_flags.h"
19 #include "net/cert/cert_verifier.h"
20 #include "net/cert/cert_verify_result.h"
21 #include "net/cert/crl_set.h"
22 #include "net/cert/test_root_certs.h"
23 #include "net/cert/x509_certificate.h"
24 #include "net/test/cert_test_util.h"
25 #include "net/test/test_certificate_data.h"
26 #include "testing/gtest/include/gtest/gtest.h"
28 #if defined(OS_WIN)
29 #include "base/win/windows_version.h"
30 #elif defined(OS_MACOSX) && !defined(OS_IOS)
31 #include "base/mac/mac_util.h"
32 #endif
34 using base::HexEncode;
36 namespace net {
38 namespace {
40 // A certificate for www.paypal.com with a NULL byte in the common name.
41 // From http://www.gossamer-threads.com/lists/fulldisc/full-disclosure/70363
42 unsigned char paypal_null_fingerprint[] = {
43 0x4c, 0x88, 0x9e, 0x28, 0xd7, 0x7a, 0x44, 0x1e, 0x13, 0xf2, 0x6a, 0xba,
44 0x1f, 0xe8, 0x1b, 0xd6, 0xab, 0x7b, 0xe8, 0xd7
47 // Mock CertVerifyProc that will set |verify_result->is_issued_by_known_root|
48 // for all certificates that are Verified.
49 class WellKnownCaCertVerifyProc : public CertVerifyProc {
50 public:
51 // Initialize a CertVerifyProc that will set
52 // |verify_result->is_issued_by_known_root| to |is_well_known|.
53 explicit WellKnownCaCertVerifyProc(bool is_well_known)
54 : is_well_known_(is_well_known) {}
56 // CertVerifyProc implementation:
57 virtual bool SupportsAdditionalTrustAnchors() const OVERRIDE { return false; }
59 protected:
60 virtual ~WellKnownCaCertVerifyProc() {}
62 private:
63 virtual int VerifyInternal(X509Certificate* cert,
64 const std::string& hostname,
65 int flags,
66 CRLSet* crl_set,
67 const CertificateList& additional_trust_anchors,
68 CertVerifyResult* verify_result) OVERRIDE;
70 const bool is_well_known_;
72 DISALLOW_COPY_AND_ASSIGN(WellKnownCaCertVerifyProc);
75 int WellKnownCaCertVerifyProc::VerifyInternal(
76 X509Certificate* cert,
77 const std::string& hostname,
78 int flags,
79 CRLSet* crl_set,
80 const CertificateList& additional_trust_anchors,
81 CertVerifyResult* verify_result) {
82 verify_result->is_issued_by_known_root = is_well_known_;
83 return OK;
86 } // namespace
88 class CertVerifyProcTest : public testing::Test {
89 public:
90 CertVerifyProcTest()
91 : verify_proc_(CertVerifyProc::CreateDefault()) {
93 virtual ~CertVerifyProcTest() {}
95 protected:
96 bool SupportsAdditionalTrustAnchors() {
97 return verify_proc_->SupportsAdditionalTrustAnchors();
100 int Verify(X509Certificate* cert,
101 const std::string& hostname,
102 int flags,
103 CRLSet* crl_set,
104 const CertificateList& additional_trust_anchors,
105 CertVerifyResult* verify_result) {
106 return verify_proc_->Verify(cert, hostname, flags, crl_set,
107 additional_trust_anchors, verify_result);
110 const CertificateList empty_cert_list_;
111 scoped_refptr<CertVerifyProc> verify_proc_;
114 TEST_F(CertVerifyProcTest, DISABLED_WithoutRevocationChecking) {
115 // Check that verification without revocation checking works.
116 CertificateList certs = CreateCertificateListFromFile(
117 GetTestCertsDirectory(),
118 "googlenew.chain.pem",
119 X509Certificate::FORMAT_PEM_CERT_SEQUENCE);
121 X509Certificate::OSCertHandles intermediates;
122 intermediates.push_back(certs[1]->os_cert_handle());
124 scoped_refptr<X509Certificate> google_full_chain =
125 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(),
126 intermediates);
128 CertVerifyResult verify_result;
129 EXPECT_EQ(OK,
130 Verify(google_full_chain.get(),
131 "www.google.com",
132 0 /* flags */,
133 NULL,
134 empty_cert_list_,
135 &verify_result));
138 #if defined(OS_ANDROID) || defined(USE_OPENSSL)
139 // TODO(jnd): http://crbug.com/117478 - EV verification is not yet supported.
140 #define MAYBE_EVVerification DISABLED_EVVerification
141 #else
142 #define MAYBE_EVVerification EVVerification
143 #endif
144 TEST_F(CertVerifyProcTest, MAYBE_EVVerification) {
145 CertificateList certs = CreateCertificateListFromFile(
146 GetTestCertsDirectory(),
147 "comodo.chain.pem",
148 X509Certificate::FORMAT_PEM_CERT_SEQUENCE);
149 ASSERT_EQ(3U, certs.size());
151 X509Certificate::OSCertHandles intermediates;
152 intermediates.push_back(certs[1]->os_cert_handle());
153 intermediates.push_back(certs[2]->os_cert_handle());
155 scoped_refptr<X509Certificate> comodo_chain =
156 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(),
157 intermediates);
159 scoped_refptr<CRLSet> crl_set(CRLSet::ForTesting(false, NULL, ""));
160 CertVerifyResult verify_result;
161 int flags = CertVerifier::VERIFY_EV_CERT;
162 int error = Verify(comodo_chain.get(),
163 "comodo.com",
164 flags,
165 crl_set.get(),
166 empty_cert_list_,
167 &verify_result);
168 EXPECT_EQ(OK, error);
169 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_IS_EV);
172 TEST_F(CertVerifyProcTest, PaypalNullCertParsing) {
173 scoped_refptr<X509Certificate> paypal_null_cert(
174 X509Certificate::CreateFromBytes(
175 reinterpret_cast<const char*>(paypal_null_der),
176 sizeof(paypal_null_der)));
178 ASSERT_NE(static_cast<X509Certificate*>(NULL), paypal_null_cert);
180 const SHA1HashValue& fingerprint =
181 paypal_null_cert->fingerprint();
182 for (size_t i = 0; i < 20; ++i)
183 EXPECT_EQ(paypal_null_fingerprint[i], fingerprint.data[i]);
185 int flags = 0;
186 CertVerifyResult verify_result;
187 int error = Verify(paypal_null_cert.get(),
188 "www.paypal.com",
189 flags,
190 NULL,
191 empty_cert_list_,
192 &verify_result);
193 #if defined(USE_NSS) || defined(OS_IOS) || defined(OS_ANDROID)
194 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error);
195 #else
196 // TOOD(bulach): investigate why macosx and win aren't returning
197 // ERR_CERT_INVALID or ERR_CERT_COMMON_NAME_INVALID.
198 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error);
199 #endif
200 // Either the system crypto library should correctly report a certificate
201 // name mismatch, or our certificate blacklist should cause us to report an
202 // invalid certificate.
203 #if defined(USE_NSS) || defined(OS_WIN) || defined(OS_IOS)
204 EXPECT_TRUE(verify_result.cert_status &
205 (CERT_STATUS_COMMON_NAME_INVALID | CERT_STATUS_INVALID));
206 #endif
209 // A regression test for http://crbug.com/31497.
210 #if defined(OS_ANDROID)
211 // Disabled on Android, as the Android verification libraries require an
212 // explicit policy to be specified, even when anyPolicy is permitted.
213 #define MAYBE_IntermediateCARequireExplicitPolicy \
214 DISABLED_IntermediateCARequireExplicitPolicy
215 #else
216 #define MAYBE_IntermediateCARequireExplicitPolicy \
217 IntermediateCARequireExplicitPolicy
218 #endif
219 TEST_F(CertVerifyProcTest, MAYBE_IntermediateCARequireExplicitPolicy) {
220 base::FilePath certs_dir = GetTestCertsDirectory();
222 CertificateList certs = CreateCertificateListFromFile(
223 certs_dir, "explicit-policy-chain.pem",
224 X509Certificate::FORMAT_AUTO);
225 ASSERT_EQ(3U, certs.size());
227 X509Certificate::OSCertHandles intermediates;
228 intermediates.push_back(certs[1]->os_cert_handle());
230 scoped_refptr<X509Certificate> cert =
231 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(),
232 intermediates);
233 ASSERT_TRUE(cert.get());
235 ScopedTestRoot scoped_root(certs[2].get());
237 int flags = 0;
238 CertVerifyResult verify_result;
239 int error = Verify(cert.get(),
240 "policy_test.example",
241 flags,
242 NULL,
243 empty_cert_list_,
244 &verify_result);
245 EXPECT_EQ(OK, error);
246 EXPECT_EQ(0u, verify_result.cert_status);
249 // Test for bug 58437.
250 // This certificate will expire on 2011-12-21. The test will still
251 // pass if error == ERR_CERT_DATE_INVALID.
252 // This test is DISABLED because it appears that we cannot do
253 // certificate revocation checking when running all of the net unit tests.
254 // This test passes when run individually, but when run with all of the net
255 // unit tests, the call to PKIXVerifyCert returns the NSS error -8180, which is
256 // SEC_ERROR_REVOKED_CERTIFICATE. This indicates a lack of revocation
257 // status, i.e. that the revocation check is failing for some reason.
258 TEST_F(CertVerifyProcTest, DISABLED_GlobalSignR3EVTest) {
259 base::FilePath certs_dir = GetTestCertsDirectory();
261 scoped_refptr<X509Certificate> server_cert =
262 ImportCertFromFile(certs_dir, "2029_globalsign_com_cert.pem");
263 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert);
265 scoped_refptr<X509Certificate> intermediate_cert =
266 ImportCertFromFile(certs_dir, "globalsign_ev_sha256_ca_cert.pem");
267 ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate_cert);
269 X509Certificate::OSCertHandles intermediates;
270 intermediates.push_back(intermediate_cert->os_cert_handle());
271 scoped_refptr<X509Certificate> cert_chain =
272 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(),
273 intermediates);
275 CertVerifyResult verify_result;
276 int flags = CertVerifier::VERIFY_REV_CHECKING_ENABLED |
277 CertVerifier::VERIFY_EV_CERT;
278 int error = Verify(cert_chain.get(),
279 "2029.globalsign.com",
280 flags,
281 NULL,
282 empty_cert_list_,
283 &verify_result);
284 if (error == OK)
285 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_IS_EV);
286 else
287 EXPECT_EQ(ERR_CERT_DATE_INVALID, error);
290 // Test that verifying an ECDSA certificate doesn't crash on XP. (See
291 // crbug.com/144466).
292 TEST_F(CertVerifyProcTest, ECDSA_RSA) {
293 base::FilePath certs_dir = GetTestCertsDirectory();
295 scoped_refptr<X509Certificate> cert =
296 ImportCertFromFile(certs_dir,
297 "prime256v1-ecdsa-ee-by-1024-rsa-intermediate.pem");
299 CertVerifyResult verify_result;
300 Verify(cert.get(), "127.0.0.1", 0, NULL, empty_cert_list_, &verify_result);
302 // We don't check verify_result because the certificate is signed by an
303 // unknown CA and will be considered invalid on XP because of the ECDSA
304 // public key.
307 // Currently, only RSA and DSA keys are checked for weakness, and our example
308 // weak size is 768. These could change in the future.
310 // Note that this means there may be false negatives: keys for other
311 // algorithms and which are weak will pass this test.
312 static bool IsWeakKeyType(const std::string& key_type) {
313 size_t pos = key_type.find("-");
314 std::string size = key_type.substr(0, pos);
315 std::string type = key_type.substr(pos + 1);
317 if (type == "rsa" || type == "dsa")
318 return size == "768";
320 return false;
323 TEST_F(CertVerifyProcTest, RejectWeakKeys) {
324 base::FilePath certs_dir = GetTestCertsDirectory();
325 typedef std::vector<std::string> Strings;
326 Strings key_types;
328 // generate-weak-test-chains.sh currently has:
329 // key_types="768-rsa 1024-rsa 2048-rsa prime256v1-ecdsa"
330 // We must use the same key types here. The filenames generated look like:
331 // 2048-rsa-ee-by-768-rsa-intermediate.pem
332 key_types.push_back("768-rsa");
333 key_types.push_back("1024-rsa");
334 key_types.push_back("2048-rsa");
336 bool use_ecdsa = true;
337 #if defined(OS_WIN)
338 use_ecdsa = base::win::GetVersion() > base::win::VERSION_XP;
339 #endif
341 if (use_ecdsa)
342 key_types.push_back("prime256v1-ecdsa");
344 // Add the root that signed the intermediates for this test.
345 scoped_refptr<X509Certificate> root_cert =
346 ImportCertFromFile(certs_dir, "2048-rsa-root.pem");
347 ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert);
348 ScopedTestRoot scoped_root(root_cert.get());
350 // Now test each chain.
351 for (Strings::const_iterator ee_type = key_types.begin();
352 ee_type != key_types.end(); ++ee_type) {
353 for (Strings::const_iterator signer_type = key_types.begin();
354 signer_type != key_types.end(); ++signer_type) {
355 std::string basename = *ee_type + "-ee-by-" + *signer_type +
356 "-intermediate.pem";
357 SCOPED_TRACE(basename);
358 scoped_refptr<X509Certificate> ee_cert =
359 ImportCertFromFile(certs_dir, basename);
360 ASSERT_NE(static_cast<X509Certificate*>(NULL), ee_cert);
362 basename = *signer_type + "-intermediate.pem";
363 scoped_refptr<X509Certificate> intermediate =
364 ImportCertFromFile(certs_dir, basename);
365 ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate);
367 X509Certificate::OSCertHandles intermediates;
368 intermediates.push_back(intermediate->os_cert_handle());
369 scoped_refptr<X509Certificate> cert_chain =
370 X509Certificate::CreateFromHandle(ee_cert->os_cert_handle(),
371 intermediates);
373 CertVerifyResult verify_result;
374 int error = Verify(cert_chain.get(),
375 "127.0.0.1",
377 NULL,
378 empty_cert_list_,
379 &verify_result);
381 if (IsWeakKeyType(*ee_type) || IsWeakKeyType(*signer_type)) {
382 EXPECT_NE(OK, error);
383 EXPECT_EQ(CERT_STATUS_WEAK_KEY,
384 verify_result.cert_status & CERT_STATUS_WEAK_KEY);
385 EXPECT_NE(CERT_STATUS_INVALID,
386 verify_result.cert_status & CERT_STATUS_INVALID);
387 } else {
388 EXPECT_EQ(OK, error);
389 EXPECT_EQ(0U, verify_result.cert_status & CERT_STATUS_WEAK_KEY);
395 // Regression test for http://crbug.com/108514.
396 #if defined(OS_MACOSX) && !defined(OS_IOS)
397 // Disabled on OS X - Security.framework doesn't ignore superflous certificates
398 // provided by servers. See CertVerifyProcTest.CybertrustGTERoot for further
399 // details.
400 #define MAYBE_ExtraneousMD5RootCert DISABLED_ExtraneousMD5RootCert
401 #elif defined(USE_OPENSSL) || defined(OS_ANDROID)
402 // Disabled for OpenSSL / Android - Android and OpenSSL do not attempt to find
403 // a minimal certificate chain, thus prefer the MD5 root over the SHA-1 root.
404 #define MAYBE_ExtraneousMD5RootCert DISABLED_ExtraneousMD5RootCert
405 #else
406 #define MAYBE_ExtraneousMD5RootCert ExtraneousMD5RootCert
407 #endif
408 TEST_F(CertVerifyProcTest, MAYBE_ExtraneousMD5RootCert) {
409 base::FilePath certs_dir = GetTestCertsDirectory();
411 scoped_refptr<X509Certificate> server_cert =
412 ImportCertFromFile(certs_dir, "cross-signed-leaf.pem");
413 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert.get());
415 scoped_refptr<X509Certificate> extra_cert =
416 ImportCertFromFile(certs_dir, "cross-signed-root-md5.pem");
417 ASSERT_NE(static_cast<X509Certificate*>(NULL), extra_cert.get());
419 scoped_refptr<X509Certificate> root_cert =
420 ImportCertFromFile(certs_dir, "cross-signed-root-sha1.pem");
421 ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert.get());
423 ScopedTestRoot scoped_root(root_cert.get());
425 X509Certificate::OSCertHandles intermediates;
426 intermediates.push_back(extra_cert->os_cert_handle());
427 scoped_refptr<X509Certificate> cert_chain =
428 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(),
429 intermediates);
431 CertVerifyResult verify_result;
432 int flags = 0;
433 int error = Verify(cert_chain.get(),
434 "127.0.0.1",
435 flags,
436 NULL,
437 empty_cert_list_,
438 &verify_result);
439 EXPECT_EQ(OK, error);
441 // The extra MD5 root should be discarded
442 ASSERT_TRUE(verify_result.verified_cert.get());
443 ASSERT_EQ(1u,
444 verify_result.verified_cert->GetIntermediateCertificates().size());
445 EXPECT_TRUE(X509Certificate::IsSameOSCert(
446 verify_result.verified_cert->GetIntermediateCertificates().front(),
447 root_cert->os_cert_handle()));
449 EXPECT_FALSE(verify_result.has_md5);
452 // Test for bug 94673.
453 TEST_F(CertVerifyProcTest, GoogleDigiNotarTest) {
454 base::FilePath certs_dir = GetTestCertsDirectory();
456 scoped_refptr<X509Certificate> server_cert =
457 ImportCertFromFile(certs_dir, "google_diginotar.pem");
458 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert);
460 scoped_refptr<X509Certificate> intermediate_cert =
461 ImportCertFromFile(certs_dir, "diginotar_public_ca_2025.pem");
462 ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate_cert);
464 X509Certificate::OSCertHandles intermediates;
465 intermediates.push_back(intermediate_cert->os_cert_handle());
466 scoped_refptr<X509Certificate> cert_chain =
467 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(),
468 intermediates);
470 CertVerifyResult verify_result;
471 int flags = CertVerifier::VERIFY_REV_CHECKING_ENABLED;
472 int error = Verify(cert_chain.get(),
473 "mail.google.com",
474 flags,
475 NULL,
476 empty_cert_list_,
477 &verify_result);
478 EXPECT_NE(OK, error);
480 // Now turn off revocation checking. Certificate verification should still
481 // fail.
482 flags = 0;
483 error = Verify(cert_chain.get(),
484 "mail.google.com",
485 flags,
486 NULL,
487 empty_cert_list_,
488 &verify_result);
489 EXPECT_NE(OK, error);
492 TEST_F(CertVerifyProcTest, DigiNotarCerts) {
493 static const char* const kDigiNotarFilenames[] = {
494 "diginotar_root_ca.pem",
495 "diginotar_cyber_ca.pem",
496 "diginotar_services_1024_ca.pem",
497 "diginotar_pkioverheid.pem",
498 "diginotar_pkioverheid_g2.pem",
499 NULL,
502 base::FilePath certs_dir = GetTestCertsDirectory();
504 for (size_t i = 0; kDigiNotarFilenames[i]; i++) {
505 scoped_refptr<X509Certificate> diginotar_cert =
506 ImportCertFromFile(certs_dir, kDigiNotarFilenames[i]);
507 std::string der_bytes;
508 ASSERT_TRUE(X509Certificate::GetDEREncoded(
509 diginotar_cert->os_cert_handle(), &der_bytes));
511 base::StringPiece spki;
512 ASSERT_TRUE(asn1::ExtractSPKIFromDERCert(der_bytes, &spki));
514 std::string spki_sha1 = base::SHA1HashString(spki.as_string());
516 HashValueVector public_keys;
517 HashValue hash(HASH_VALUE_SHA1);
518 ASSERT_EQ(hash.size(), spki_sha1.size());
519 memcpy(hash.data(), spki_sha1.data(), spki_sha1.size());
520 public_keys.push_back(hash);
522 EXPECT_TRUE(CertVerifyProc::IsPublicKeyBlacklisted(public_keys)) <<
523 "Public key not blocked for " << kDigiNotarFilenames[i];
527 TEST_F(CertVerifyProcTest, NameConstraintsOk) {
528 CertificateList ca_cert_list =
529 CreateCertificateListFromFile(GetTestCertsDirectory(),
530 "root_ca_cert.pem",
531 X509Certificate::FORMAT_AUTO);
532 ASSERT_EQ(1U, ca_cert_list.size());
533 ScopedTestRoot test_root(ca_cert_list[0]);
535 CertificateList cert_list = CreateCertificateListFromFile(
536 GetTestCertsDirectory(), "name_constraint_ok.crt",
537 X509Certificate::FORMAT_AUTO);
538 ASSERT_EQ(1U, cert_list.size());
540 X509Certificate::OSCertHandles intermediates;
541 scoped_refptr<X509Certificate> leaf =
542 X509Certificate::CreateFromHandle(cert_list[0]->os_cert_handle(),
543 intermediates);
545 int flags = 0;
546 CertVerifyResult verify_result;
547 int error = Verify(leaf.get(),
548 "test.example.com",
549 flags,
550 NULL,
551 empty_cert_list_,
552 &verify_result);
553 EXPECT_EQ(OK, error);
554 EXPECT_EQ(0U, verify_result.cert_status);
557 #if defined(OS_ANDROID)
558 // Disabled because Android isn't filling in SPKI hashes: crbug.com/116838.
559 #define MAYBE_NameConstraintsFailure DISABLED_NameConstraintsFailure
560 #else
561 #define MAYBE_NameConstraintsFailure NameConstraintsFailure
562 #endif
563 TEST_F(CertVerifyProcTest, MAYBE_NameConstraintsFailure) {
564 CertificateList ca_cert_list =
565 CreateCertificateListFromFile(GetTestCertsDirectory(),
566 "root_ca_cert.pem",
567 X509Certificate::FORMAT_AUTO);
568 ASSERT_EQ(1U, ca_cert_list.size());
569 ScopedTestRoot test_root(ca_cert_list[0]);
571 CertificateList cert_list = CreateCertificateListFromFile(
572 GetTestCertsDirectory(), "name_constraint_bad.crt",
573 X509Certificate::FORMAT_AUTO);
574 ASSERT_EQ(1U, cert_list.size());
576 X509Certificate::OSCertHandles intermediates;
577 scoped_refptr<X509Certificate> leaf =
578 X509Certificate::CreateFromHandle(cert_list[0]->os_cert_handle(),
579 intermediates);
581 int flags = 0;
582 CertVerifyResult verify_result;
583 int error = Verify(leaf.get(),
584 "test.example.com",
585 flags,
586 NULL,
587 empty_cert_list_,
588 &verify_result);
589 EXPECT_EQ(ERR_CERT_NAME_CONSTRAINT_VIOLATION, error);
590 EXPECT_EQ(CERT_STATUS_NAME_CONSTRAINT_VIOLATION,
591 verify_result.cert_status & CERT_STATUS_NAME_CONSTRAINT_VIOLATION);
594 // The certse.pem certificate has been revoked. crbug.com/259723.
595 TEST_F(CertVerifyProcTest, TestKnownRoot) {
596 base::FilePath certs_dir = GetTestCertsDirectory();
597 CertificateList certs = CreateCertificateListFromFile(
598 certs_dir, "satveda.pem", X509Certificate::FORMAT_AUTO);
599 ASSERT_EQ(2U, certs.size());
601 X509Certificate::OSCertHandles intermediates;
602 intermediates.push_back(certs[1]->os_cert_handle());
604 scoped_refptr<X509Certificate> cert_chain =
605 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(),
606 intermediates);
608 int flags = 0;
609 CertVerifyResult verify_result;
610 // This will blow up, May 24th, 2019. Sorry! Please disable and file a bug
611 // against agl. See also PublicKeyHashes.
612 int error = Verify(cert_chain.get(),
613 "satveda.com",
614 flags,
615 NULL,
616 empty_cert_list_,
617 &verify_result);
618 EXPECT_EQ(OK, error);
619 EXPECT_EQ(0U, verify_result.cert_status);
620 EXPECT_TRUE(verify_result.is_issued_by_known_root);
623 // The certse.pem certificate has been revoked. crbug.com/259723.
624 TEST_F(CertVerifyProcTest, PublicKeyHashes) {
625 base::FilePath certs_dir = GetTestCertsDirectory();
626 CertificateList certs = CreateCertificateListFromFile(
627 certs_dir, "satveda.pem", X509Certificate::FORMAT_AUTO);
628 ASSERT_EQ(2U, certs.size());
630 X509Certificate::OSCertHandles intermediates;
631 intermediates.push_back(certs[1]->os_cert_handle());
633 scoped_refptr<X509Certificate> cert_chain =
634 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(),
635 intermediates);
636 int flags = 0;
637 CertVerifyResult verify_result;
639 // This will blow up, May 24th, 2019. Sorry! Please disable and file a bug
640 // against agl. See also TestKnownRoot.
641 int error = Verify(cert_chain.get(),
642 "satveda.com",
643 flags,
644 NULL,
645 empty_cert_list_,
646 &verify_result);
647 EXPECT_EQ(OK, error);
648 EXPECT_EQ(0U, verify_result.cert_status);
649 ASSERT_LE(2U, verify_result.public_key_hashes.size());
651 HashValueVector sha1_hashes;
652 for (size_t i = 0; i < verify_result.public_key_hashes.size(); ++i) {
653 if (verify_result.public_key_hashes[i].tag != HASH_VALUE_SHA1)
654 continue;
655 sha1_hashes.push_back(verify_result.public_key_hashes[i]);
657 ASSERT_LE(2u, sha1_hashes.size());
659 for (size_t i = 0; i < 2; ++i) {
660 EXPECT_EQ(HexEncode(kSatvedaSPKIs[i], base::kSHA1Length),
661 HexEncode(sha1_hashes[i].data(), base::kSHA1Length));
664 HashValueVector sha256_hashes;
665 for (size_t i = 0; i < verify_result.public_key_hashes.size(); ++i) {
666 if (verify_result.public_key_hashes[i].tag != HASH_VALUE_SHA256)
667 continue;
668 sha256_hashes.push_back(verify_result.public_key_hashes[i]);
670 ASSERT_LE(2u, sha256_hashes.size());
672 for (size_t i = 0; i < 2; ++i) {
673 EXPECT_EQ(HexEncode(kSatvedaSPKIsSHA256[i], crypto::kSHA256Length),
674 HexEncode(sha256_hashes[i].data(), crypto::kSHA256Length));
678 // A regression test for http://crbug.com/70293.
679 // The Key Usage extension in this RSA SSL server certificate does not have
680 // the keyEncipherment bit.
681 TEST_F(CertVerifyProcTest, InvalidKeyUsage) {
682 base::FilePath certs_dir = GetTestCertsDirectory();
684 scoped_refptr<X509Certificate> server_cert =
685 ImportCertFromFile(certs_dir, "invalid_key_usage_cert.der");
686 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert);
688 int flags = 0;
689 CertVerifyResult verify_result;
690 int error = Verify(server_cert.get(),
691 "jira.aquameta.com",
692 flags,
693 NULL,
694 empty_cert_list_,
695 &verify_result);
696 #if defined(USE_OPENSSL) && !defined(OS_ANDROID)
697 // This certificate has two errors: "invalid key usage" and "untrusted CA".
698 // However, OpenSSL returns only one (the latter), and we can't detect
699 // the other errors.
700 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error);
701 #else
702 EXPECT_EQ(ERR_CERT_INVALID, error);
703 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID);
704 #endif
705 // TODO(wtc): fix http://crbug.com/75520 to get all the certificate errors
706 // from NSS.
707 #if !defined(USE_NSS) && !defined(OS_IOS) && !defined(OS_ANDROID)
708 // The certificate is issued by an unknown CA.
709 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_AUTHORITY_INVALID);
710 #endif
713 // Basic test for returning the chain in CertVerifyResult. Note that the
714 // returned chain may just be a reflection of the originally supplied chain;
715 // that is, if any errors occur, the default chain returned is an exact copy
716 // of the certificate to be verified. The remaining VerifyReturn* tests are
717 // used to ensure that the actual, verified chain is being returned by
718 // Verify().
719 TEST_F(CertVerifyProcTest, VerifyReturnChainBasic) {
720 base::FilePath certs_dir = GetTestCertsDirectory();
721 CertificateList certs = CreateCertificateListFromFile(
722 certs_dir, "x509_verify_results.chain.pem",
723 X509Certificate::FORMAT_AUTO);
724 ASSERT_EQ(3U, certs.size());
726 X509Certificate::OSCertHandles intermediates;
727 intermediates.push_back(certs[1]->os_cert_handle());
728 intermediates.push_back(certs[2]->os_cert_handle());
730 ScopedTestRoot scoped_root(certs[2].get());
732 scoped_refptr<X509Certificate> google_full_chain =
733 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(),
734 intermediates);
735 ASSERT_NE(static_cast<X509Certificate*>(NULL), google_full_chain);
736 ASSERT_EQ(2U, google_full_chain->GetIntermediateCertificates().size());
738 CertVerifyResult verify_result;
739 EXPECT_EQ(static_cast<X509Certificate*>(NULL), verify_result.verified_cert);
740 int error = Verify(google_full_chain.get(),
741 "127.0.0.1",
743 NULL,
744 empty_cert_list_,
745 &verify_result);
746 EXPECT_EQ(OK, error);
747 ASSERT_NE(static_cast<X509Certificate*>(NULL), verify_result.verified_cert);
749 EXPECT_NE(google_full_chain, verify_result.verified_cert);
750 EXPECT_TRUE(X509Certificate::IsSameOSCert(
751 google_full_chain->os_cert_handle(),
752 verify_result.verified_cert->os_cert_handle()));
753 const X509Certificate::OSCertHandles& return_intermediates =
754 verify_result.verified_cert->GetIntermediateCertificates();
755 ASSERT_EQ(2U, return_intermediates.size());
756 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[0],
757 certs[1]->os_cert_handle()));
758 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[1],
759 certs[2]->os_cert_handle()));
762 #if defined(OS_ANDROID)
763 // TODO(ppi): Disabled because is_issued_by_known_root is incorrect on Android.
764 // Once this is fixed, re-enable this check for android. crbug.com/116838
765 #define MAYBE_IntranetHostsRejected DISABLED_IntranetHostsRejected
766 #else
767 #define MAYBE_IntranetHostsRejected IntranetHostsRejected
768 #endif
770 // Test that certificates issued for 'intranet' names (that is, containing no
771 // known public registry controlled domain information) issued by well-known
772 // CAs are flagged appropriately, while certificates that are issued by
773 // internal CAs are not flagged.
774 TEST_F(CertVerifyProcTest, MAYBE_IntranetHostsRejected) {
775 CertificateList cert_list = CreateCertificateListFromFile(
776 GetTestCertsDirectory(), "ok_cert.pem",
777 X509Certificate::FORMAT_AUTO);
778 ASSERT_EQ(1U, cert_list.size());
779 scoped_refptr<X509Certificate> cert(cert_list[0]);
781 CertVerifyResult verify_result;
782 int error = 0;
784 // Intranet names for public CAs should be flagged:
785 verify_proc_ = new WellKnownCaCertVerifyProc(true);
786 error =
787 Verify(cert.get(), "intranet", 0, NULL, empty_cert_list_, &verify_result);
788 EXPECT_EQ(OK, error);
789 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_NON_UNIQUE_NAME);
791 // However, if the CA is not well known, these should not be flagged:
792 verify_proc_ = new WellKnownCaCertVerifyProc(false);
793 error =
794 Verify(cert.get(), "intranet", 0, NULL, empty_cert_list_, &verify_result);
795 EXPECT_EQ(OK, error);
796 EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_NON_UNIQUE_NAME);
799 // Test that the certificate returned in CertVerifyResult is able to reorder
800 // certificates that are not ordered from end-entity to root. While this is
801 // a protocol violation if sent during a TLS handshake, if multiple sources
802 // of intermediate certificates are combined, it's possible that order may
803 // not be maintained.
804 TEST_F(CertVerifyProcTest, VerifyReturnChainProperlyOrdered) {
805 base::FilePath certs_dir = GetTestCertsDirectory();
806 CertificateList certs = CreateCertificateListFromFile(
807 certs_dir, "x509_verify_results.chain.pem",
808 X509Certificate::FORMAT_AUTO);
809 ASSERT_EQ(3U, certs.size());
811 // Construct the chain out of order.
812 X509Certificate::OSCertHandles intermediates;
813 intermediates.push_back(certs[2]->os_cert_handle());
814 intermediates.push_back(certs[1]->os_cert_handle());
816 ScopedTestRoot scoped_root(certs[2].get());
818 scoped_refptr<X509Certificate> google_full_chain =
819 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(),
820 intermediates);
821 ASSERT_NE(static_cast<X509Certificate*>(NULL), google_full_chain);
822 ASSERT_EQ(2U, google_full_chain->GetIntermediateCertificates().size());
824 CertVerifyResult verify_result;
825 EXPECT_EQ(static_cast<X509Certificate*>(NULL), verify_result.verified_cert);
826 int error = Verify(google_full_chain.get(),
827 "127.0.0.1",
829 NULL,
830 empty_cert_list_,
831 &verify_result);
832 EXPECT_EQ(OK, error);
833 ASSERT_NE(static_cast<X509Certificate*>(NULL), verify_result.verified_cert);
835 EXPECT_NE(google_full_chain, verify_result.verified_cert);
836 EXPECT_TRUE(X509Certificate::IsSameOSCert(
837 google_full_chain->os_cert_handle(),
838 verify_result.verified_cert->os_cert_handle()));
839 const X509Certificate::OSCertHandles& return_intermediates =
840 verify_result.verified_cert->GetIntermediateCertificates();
841 ASSERT_EQ(2U, return_intermediates.size());
842 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[0],
843 certs[1]->os_cert_handle()));
844 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[1],
845 certs[2]->os_cert_handle()));
848 // Test that Verify() filters out certificates which are not related to
849 // or part of the certificate chain being verified.
850 TEST_F(CertVerifyProcTest, VerifyReturnChainFiltersUnrelatedCerts) {
851 base::FilePath certs_dir = GetTestCertsDirectory();
852 CertificateList certs = CreateCertificateListFromFile(
853 certs_dir, "x509_verify_results.chain.pem",
854 X509Certificate::FORMAT_AUTO);
855 ASSERT_EQ(3U, certs.size());
856 ScopedTestRoot scoped_root(certs[2].get());
858 scoped_refptr<X509Certificate> unrelated_certificate =
859 ImportCertFromFile(certs_dir, "duplicate_cn_1.pem");
860 scoped_refptr<X509Certificate> unrelated_certificate2 =
861 ImportCertFromFile(certs_dir, "aia-cert.pem");
862 ASSERT_NE(static_cast<X509Certificate*>(NULL), unrelated_certificate);
863 ASSERT_NE(static_cast<X509Certificate*>(NULL), unrelated_certificate2);
865 // Interject unrelated certificates into the list of intermediates.
866 X509Certificate::OSCertHandles intermediates;
867 intermediates.push_back(unrelated_certificate->os_cert_handle());
868 intermediates.push_back(certs[1]->os_cert_handle());
869 intermediates.push_back(unrelated_certificate2->os_cert_handle());
870 intermediates.push_back(certs[2]->os_cert_handle());
872 scoped_refptr<X509Certificate> google_full_chain =
873 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(),
874 intermediates);
875 ASSERT_NE(static_cast<X509Certificate*>(NULL), google_full_chain);
876 ASSERT_EQ(4U, google_full_chain->GetIntermediateCertificates().size());
878 CertVerifyResult verify_result;
879 EXPECT_EQ(static_cast<X509Certificate*>(NULL), verify_result.verified_cert);
880 int error = Verify(google_full_chain.get(),
881 "127.0.0.1",
883 NULL,
884 empty_cert_list_,
885 &verify_result);
886 EXPECT_EQ(OK, error);
887 ASSERT_NE(static_cast<X509Certificate*>(NULL), verify_result.verified_cert);
889 EXPECT_NE(google_full_chain, verify_result.verified_cert);
890 EXPECT_TRUE(X509Certificate::IsSameOSCert(
891 google_full_chain->os_cert_handle(),
892 verify_result.verified_cert->os_cert_handle()));
893 const X509Certificate::OSCertHandles& return_intermediates =
894 verify_result.verified_cert->GetIntermediateCertificates();
895 ASSERT_EQ(2U, return_intermediates.size());
896 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[0],
897 certs[1]->os_cert_handle()));
898 EXPECT_TRUE(X509Certificate::IsSameOSCert(return_intermediates[1],
899 certs[2]->os_cert_handle()));
902 TEST_F(CertVerifyProcTest, AdditionalTrustAnchors) {
903 if (!SupportsAdditionalTrustAnchors()) {
904 LOG(INFO) << "Skipping this test in this platform.";
905 return;
908 // |ca_cert| is the issuer of |cert|.
909 CertificateList ca_cert_list = CreateCertificateListFromFile(
910 GetTestCertsDirectory(), "root_ca_cert.pem",
911 X509Certificate::FORMAT_AUTO);
912 ASSERT_EQ(1U, ca_cert_list.size());
913 scoped_refptr<X509Certificate> ca_cert(ca_cert_list[0]);
915 CertificateList cert_list = CreateCertificateListFromFile(
916 GetTestCertsDirectory(), "ok_cert.pem",
917 X509Certificate::FORMAT_AUTO);
918 ASSERT_EQ(1U, cert_list.size());
919 scoped_refptr<X509Certificate> cert(cert_list[0]);
921 // Verification of |cert| fails when |ca_cert| is not in the trust anchors
922 // list.
923 int flags = 0;
924 CertVerifyResult verify_result;
925 int error = Verify(
926 cert.get(), "127.0.0.1", flags, NULL, empty_cert_list_, &verify_result);
927 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error);
928 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status);
929 EXPECT_FALSE(verify_result.is_issued_by_additional_trust_anchor);
931 // Now add the |ca_cert| to the |trust_anchors|, and verification should pass.
932 CertificateList trust_anchors;
933 trust_anchors.push_back(ca_cert);
934 error = Verify(
935 cert.get(), "127.0.0.1", flags, NULL, trust_anchors, &verify_result);
936 EXPECT_EQ(OK, error);
937 EXPECT_EQ(0U, verify_result.cert_status);
938 EXPECT_TRUE(verify_result.is_issued_by_additional_trust_anchor);
940 // Clearing the |trust_anchors| makes verification fail again (the cache
941 // should be skipped).
942 error = Verify(
943 cert.get(), "127.0.0.1", flags, NULL, empty_cert_list_, &verify_result);
944 EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, error);
945 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status);
946 EXPECT_FALSE(verify_result.is_issued_by_additional_trust_anchor);
949 #if defined(OS_MACOSX) && !defined(OS_IOS)
950 // Tests that, on OS X, issues with a cross-certified Baltimore CyberTrust
951 // Root can be successfully worked around once Apple completes removing the
952 // older GTE CyberTrust Root from its trusted root store.
954 // The issue is caused by servers supplying the cross-certified intermediate
955 // (necessary for certain mobile platforms), which OS X does not recognize
956 // as already existing within its trust store.
957 TEST_F(CertVerifyProcTest, CybertrustGTERoot) {
958 CertificateList certs = CreateCertificateListFromFile(
959 GetTestCertsDirectory(),
960 "cybertrust_omniroot_chain.pem",
961 X509Certificate::FORMAT_PEM_CERT_SEQUENCE);
962 ASSERT_EQ(2U, certs.size());
964 X509Certificate::OSCertHandles intermediates;
965 intermediates.push_back(certs[1]->os_cert_handle());
967 scoped_refptr<X509Certificate> cybertrust_basic =
968 X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(),
969 intermediates);
970 ASSERT_TRUE(cybertrust_basic.get());
972 scoped_refptr<X509Certificate> baltimore_root =
973 ImportCertFromFile(GetTestCertsDirectory(),
974 "cybertrust_baltimore_root.pem");
975 ASSERT_TRUE(baltimore_root.get());
977 ScopedTestRoot scoped_root(baltimore_root.get());
979 // Ensure that ONLY the Baltimore CyberTrust Root is trusted. This
980 // simulates Keychain removing support for the GTE CyberTrust Root.
981 TestRootCerts::GetInstance()->SetAllowSystemTrust(false);
982 base::ScopedClosureRunner reset_system_trust(
983 base::Bind(&TestRootCerts::SetAllowSystemTrust,
984 base::Unretained(TestRootCerts::GetInstance()),
985 true));
987 // First, make sure a simple certificate chain from
988 // EE -> Public SureServer SV -> Baltimore CyberTrust
989 // works. Only the first two certificates are included in the chain.
990 int flags = 0;
991 CertVerifyResult verify_result;
992 int error = Verify(cybertrust_basic.get(),
993 "cacert.omniroot.com",
994 flags,
995 NULL,
996 empty_cert_list_,
997 &verify_result);
998 EXPECT_EQ(OK, error);
999 EXPECT_EQ(0U, verify_result.cert_status);
1001 // Attempt to verify with the first known cross-certified intermediate
1002 // provided.
1003 scoped_refptr<X509Certificate> baltimore_intermediate_1 =
1004 ImportCertFromFile(GetTestCertsDirectory(),
1005 "cybertrust_baltimore_cross_certified_1.pem");
1006 ASSERT_TRUE(baltimore_intermediate_1.get());
1008 X509Certificate::OSCertHandles intermediate_chain_1 =
1009 cybertrust_basic->GetIntermediateCertificates();
1010 intermediate_chain_1.push_back(baltimore_intermediate_1->os_cert_handle());
1012 scoped_refptr<X509Certificate> baltimore_chain_1 =
1013 X509Certificate::CreateFromHandle(cybertrust_basic->os_cert_handle(),
1014 intermediate_chain_1);
1015 error = Verify(baltimore_chain_1.get(),
1016 "cacert.omniroot.com",
1017 flags,
1018 NULL,
1019 empty_cert_list_,
1020 &verify_result);
1021 EXPECT_EQ(OK, error);
1022 EXPECT_EQ(0U, verify_result.cert_status);
1024 // Attempt to verify with the second known cross-certified intermediate
1025 // provided.
1026 scoped_refptr<X509Certificate> baltimore_intermediate_2 =
1027 ImportCertFromFile(GetTestCertsDirectory(),
1028 "cybertrust_baltimore_cross_certified_2.pem");
1029 ASSERT_TRUE(baltimore_intermediate_2.get());
1031 X509Certificate::OSCertHandles intermediate_chain_2 =
1032 cybertrust_basic->GetIntermediateCertificates();
1033 intermediate_chain_2.push_back(baltimore_intermediate_2->os_cert_handle());
1035 scoped_refptr<X509Certificate> baltimore_chain_2 =
1036 X509Certificate::CreateFromHandle(cybertrust_basic->os_cert_handle(),
1037 intermediate_chain_2);
1038 error = Verify(baltimore_chain_2.get(),
1039 "cacert.omniroot.com",
1040 flags,
1041 NULL,
1042 empty_cert_list_,
1043 &verify_result);
1044 EXPECT_EQ(OK, error);
1045 EXPECT_EQ(0U, verify_result.cert_status);
1047 // Attempt to verify when both a cross-certified intermediate AND
1048 // the legacy GTE root are provided.
1049 scoped_refptr<X509Certificate> cybertrust_root =
1050 ImportCertFromFile(GetTestCertsDirectory(),
1051 "cybertrust_gte_root.pem");
1052 ASSERT_TRUE(cybertrust_root.get());
1054 intermediate_chain_2.push_back(cybertrust_root->os_cert_handle());
1055 scoped_refptr<X509Certificate> baltimore_chain_with_root =
1056 X509Certificate::CreateFromHandle(cybertrust_basic->os_cert_handle(),
1057 intermediate_chain_2);
1058 error = Verify(baltimore_chain_with_root.get(),
1059 "cacert.omniroot.com",
1060 flags,
1061 NULL,
1062 empty_cert_list_,
1063 &verify_result);
1064 EXPECT_EQ(OK, error);
1065 EXPECT_EQ(0U, verify_result.cert_status);
1068 #endif
1070 #if defined(USE_NSS) || defined(OS_IOS) || defined(OS_WIN) || defined(OS_MACOSX)
1071 static const uint8 kCRLSetLeafSPKIBlocked[] = {
1072 0x8e, 0x00, 0x7b, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a,
1073 0x30, 0x2c, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70,
1074 0x65, 0x22, 0x3a, 0x22, 0x43, 0x52, 0x4c, 0x53, 0x65, 0x74, 0x22, 0x2c, 0x22,
1075 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x3a, 0x30, 0x2c, 0x22,
1076 0x44, 0x65, 0x6c, 0x74, 0x61, 0x46, 0x72, 0x6f, 0x6d, 0x22, 0x3a, 0x30, 0x2c,
1077 0x22, 0x4e, 0x75, 0x6d, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3a,
1078 0x30, 0x2c, 0x22, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x53, 0x50, 0x4b,
1079 0x49, 0x73, 0x22, 0x3a, 0x5b, 0x22, 0x43, 0x38, 0x4d, 0x4a, 0x46, 0x55, 0x55,
1080 0x5a, 0x38, 0x43, 0x79, 0x54, 0x2b, 0x4e, 0x57, 0x64, 0x68, 0x69, 0x7a, 0x51,
1081 0x68, 0x54, 0x49, 0x65, 0x46, 0x49, 0x37, 0x76, 0x41, 0x77, 0x7a, 0x64, 0x54,
1082 0x79, 0x52, 0x59, 0x45, 0x6e, 0x78, 0x6c, 0x33, 0x62, 0x67, 0x3d, 0x22, 0x5d,
1083 0x7d,
1086 static const uint8 kCRLSetLeafSerialBlocked[] = {
1087 0x60, 0x00, 0x7b, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a,
1088 0x30, 0x2c, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70,
1089 0x65, 0x22, 0x3a, 0x22, 0x43, 0x52, 0x4c, 0x53, 0x65, 0x74, 0x22, 0x2c, 0x22,
1090 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x3a, 0x30, 0x2c, 0x22,
1091 0x44, 0x65, 0x6c, 0x74, 0x61, 0x46, 0x72, 0x6f, 0x6d, 0x22, 0x3a, 0x30, 0x2c,
1092 0x22, 0x4e, 0x75, 0x6d, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3a,
1093 0x31, 0x2c, 0x22, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x53, 0x50, 0x4b,
1094 0x49, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x7d, 0x0f, 0x87, 0xe4, 0xc7, 0x75, 0xea,
1095 0x46, 0x7e, 0xf3, 0xfd, 0x82, 0xb7, 0x46, 0x7b, 0x10, 0xda, 0xc5, 0xbf, 0xd8,
1096 0xd1, 0x29, 0xb2, 0xc6, 0xac, 0x7f, 0x51, 0x42, 0x15, 0x28, 0x51, 0x06, 0x7f,
1097 0x01, 0x00, 0x00, 0x00, // number of serials
1098 0x01, 0xed, // serial 0xed
1101 static const uint8 kCRLSetQUICSerialBlocked[] = {
1102 0x60, 0x00, 0x7b, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a,
1103 0x30, 0x2c, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70,
1104 0x65, 0x22, 0x3a, 0x22, 0x43, 0x52, 0x4c, 0x53, 0x65, 0x74, 0x22, 0x2c, 0x22,
1105 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x3a, 0x30, 0x2c, 0x22,
1106 0x44, 0x65, 0x6c, 0x74, 0x61, 0x46, 0x72, 0x6f, 0x6d, 0x22, 0x3a, 0x30, 0x2c,
1107 0x22, 0x4e, 0x75, 0x6d, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3a,
1108 0x31, 0x2c, 0x22, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x53, 0x50, 0x4b,
1109 0x49, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x7d,
1110 // Issuer SPKI SHA-256 hash:
1111 0xe4, 0x3a, 0xa3, 0xdb, 0x98, 0x31, 0x61, 0x05, 0xdd, 0x57, 0x6d, 0xc6, 0x2f,
1112 0x71, 0x26, 0xba, 0xdd, 0xf4, 0x98, 0x3e, 0x62, 0x22, 0xf8, 0xf9, 0xe4, 0x18,
1113 0x62, 0x77, 0x79, 0xdb, 0x9b, 0x31,
1114 0x01, 0x00, 0x00, 0x00, // number of serials
1115 0x01, 0x03, // serial 3
1118 // Test that CRLSets are effective in making a certificate appear to be
1119 // revoked.
1120 TEST_F(CertVerifyProcTest, CRLSet) {
1121 CertificateList ca_cert_list =
1122 CreateCertificateListFromFile(GetTestCertsDirectory(),
1123 "root_ca_cert.pem",
1124 X509Certificate::FORMAT_AUTO);
1125 ASSERT_EQ(1U, ca_cert_list.size());
1126 ScopedTestRoot test_root(ca_cert_list[0]);
1128 CertificateList cert_list = CreateCertificateListFromFile(
1129 GetTestCertsDirectory(), "ok_cert.pem", X509Certificate::FORMAT_AUTO);
1130 ASSERT_EQ(1U, cert_list.size());
1131 scoped_refptr<X509Certificate> cert(cert_list[0]);
1133 int flags = 0;
1134 CertVerifyResult verify_result;
1135 int error = Verify(
1136 cert.get(), "127.0.0.1", flags, NULL, empty_cert_list_, &verify_result);
1137 EXPECT_EQ(OK, error);
1138 EXPECT_EQ(0U, verify_result.cert_status);
1140 // First test blocking by SPKI.
1141 base::StringPiece crl_set_bytes(
1142 reinterpret_cast<const char*>(kCRLSetLeafSPKIBlocked),
1143 sizeof(kCRLSetLeafSPKIBlocked));
1144 scoped_refptr<CRLSet> crl_set;
1145 ASSERT_TRUE(CRLSet::Parse(crl_set_bytes, &crl_set));
1147 error = Verify(cert.get(),
1148 "127.0.0.1",
1149 flags,
1150 crl_set.get(),
1151 empty_cert_list_,
1152 &verify_result);
1153 EXPECT_EQ(ERR_CERT_REVOKED, error);
1155 // Second, test revocation by serial number of a cert directly under the
1156 // root.
1157 crl_set_bytes =
1158 base::StringPiece(reinterpret_cast<const char*>(kCRLSetLeafSerialBlocked),
1159 sizeof(kCRLSetLeafSerialBlocked));
1160 ASSERT_TRUE(CRLSet::Parse(crl_set_bytes, &crl_set));
1162 error = Verify(cert.get(),
1163 "127.0.0.1",
1164 flags,
1165 crl_set.get(),
1166 empty_cert_list_,
1167 &verify_result);
1168 EXPECT_EQ(ERR_CERT_REVOKED, error);
1171 TEST_F(CertVerifyProcTest, CRLSetLeafSerial) {
1172 CertificateList ca_cert_list =
1173 CreateCertificateListFromFile(GetTestCertsDirectory(),
1174 "quic_root.crt",
1175 X509Certificate::FORMAT_AUTO);
1176 ASSERT_EQ(1U, ca_cert_list.size());
1177 ScopedTestRoot test_root(ca_cert_list[0]);
1179 CertificateList intermediate_cert_list =
1180 CreateCertificateListFromFile(GetTestCertsDirectory(),
1181 "quic_intermediate.crt",
1182 X509Certificate::FORMAT_AUTO);
1183 ASSERT_EQ(1U, intermediate_cert_list.size());
1184 X509Certificate::OSCertHandles intermediates;
1185 intermediates.push_back(intermediate_cert_list[0]->os_cert_handle());
1187 CertificateList cert_list = CreateCertificateListFromFile(
1188 GetTestCertsDirectory(), "quic_test.example.com.crt",
1189 X509Certificate::FORMAT_AUTO);
1190 ASSERT_EQ(1U, cert_list.size());
1192 scoped_refptr<X509Certificate> leaf =
1193 X509Certificate::CreateFromHandle(cert_list[0]->os_cert_handle(),
1194 intermediates);
1196 int flags = 0;
1197 CertVerifyResult verify_result;
1198 int error = Verify(leaf.get(),
1199 "test.example.com",
1200 flags,
1201 NULL,
1202 empty_cert_list_,
1203 &verify_result);
1204 EXPECT_EQ(OK, error);
1205 EXPECT_EQ(0U, verify_result.cert_status);
1207 // Test revocation by serial number of a certificate not under the root.
1208 scoped_refptr<CRLSet> crl_set;
1209 base::StringPiece crl_set_bytes =
1210 base::StringPiece(reinterpret_cast<const char*>(kCRLSetQUICSerialBlocked),
1211 sizeof(kCRLSetQUICSerialBlocked));
1212 ASSERT_TRUE(CRLSet::Parse(crl_set_bytes, &crl_set));
1214 error = Verify(leaf.get(),
1215 "test.example.com",
1216 flags,
1217 crl_set.get(),
1218 empty_cert_list_,
1219 &verify_result);
1220 EXPECT_EQ(ERR_CERT_REVOKED, error);
1222 #endif
1224 struct WeakDigestTestData {
1225 const char* root_cert_filename;
1226 const char* intermediate_cert_filename;
1227 const char* ee_cert_filename;
1228 bool expected_has_md5;
1229 bool expected_has_md4;
1230 bool expected_has_md2;
1233 // GTest 'magic' pretty-printer, so that if/when a test fails, it knows how
1234 // to output the parameter that was passed. Without this, it will simply
1235 // attempt to print out the first twenty bytes of the object, which depending
1236 // on platform and alignment, may result in an invalid read.
1237 void PrintTo(const WeakDigestTestData& data, std::ostream* os) {
1238 *os << "root: "
1239 << (data.root_cert_filename ? data.root_cert_filename : "none")
1240 << "; intermediate: " << data.intermediate_cert_filename
1241 << "; end-entity: " << data.ee_cert_filename;
1244 class CertVerifyProcWeakDigestTest
1245 : public CertVerifyProcTest,
1246 public testing::WithParamInterface<WeakDigestTestData> {
1247 public:
1248 CertVerifyProcWeakDigestTest() {}
1249 virtual ~CertVerifyProcWeakDigestTest() {}
1252 TEST_P(CertVerifyProcWeakDigestTest, Verify) {
1253 WeakDigestTestData data = GetParam();
1254 base::FilePath certs_dir = GetTestCertsDirectory();
1256 ScopedTestRoot test_root;
1257 if (data.root_cert_filename) {
1258 scoped_refptr<X509Certificate> root_cert =
1259 ImportCertFromFile(certs_dir, data.root_cert_filename);
1260 ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert);
1261 test_root.Reset(root_cert.get());
1264 scoped_refptr<X509Certificate> intermediate_cert =
1265 ImportCertFromFile(certs_dir, data.intermediate_cert_filename);
1266 ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate_cert);
1267 scoped_refptr<X509Certificate> ee_cert =
1268 ImportCertFromFile(certs_dir, data.ee_cert_filename);
1269 ASSERT_NE(static_cast<X509Certificate*>(NULL), ee_cert);
1271 X509Certificate::OSCertHandles intermediates;
1272 intermediates.push_back(intermediate_cert->os_cert_handle());
1274 scoped_refptr<X509Certificate> ee_chain =
1275 X509Certificate::CreateFromHandle(ee_cert->os_cert_handle(),
1276 intermediates);
1277 ASSERT_NE(static_cast<X509Certificate*>(NULL), ee_chain);
1279 int flags = 0;
1280 CertVerifyResult verify_result;
1281 int rv = Verify(ee_chain.get(),
1282 "127.0.0.1",
1283 flags,
1284 NULL,
1285 empty_cert_list_,
1286 &verify_result);
1287 EXPECT_EQ(data.expected_has_md5, verify_result.has_md5);
1288 EXPECT_EQ(data.expected_has_md4, verify_result.has_md4);
1289 EXPECT_EQ(data.expected_has_md2, verify_result.has_md2);
1290 EXPECT_FALSE(verify_result.is_issued_by_additional_trust_anchor);
1292 // Ensure that MD4 and MD2 are tagged as invalid.
1293 if (data.expected_has_md4 || data.expected_has_md2) {
1294 EXPECT_EQ(CERT_STATUS_INVALID,
1295 verify_result.cert_status & CERT_STATUS_INVALID);
1298 // Ensure that MD5 is flagged as weak.
1299 if (data.expected_has_md5) {
1300 EXPECT_EQ(
1301 CERT_STATUS_WEAK_SIGNATURE_ALGORITHM,
1302 verify_result.cert_status & CERT_STATUS_WEAK_SIGNATURE_ALGORITHM);
1305 // If a root cert is present, then check that the chain was rejected if any
1306 // weak algorithms are present. This is only checked when a root cert is
1307 // present because the error reported for incomplete chains with weak
1308 // algorithms depends on which implementation was used to validate (NSS,
1309 // OpenSSL, CryptoAPI, Security.framework) and upon which weak algorithm
1310 // present (MD2, MD4, MD5).
1311 if (data.root_cert_filename) {
1312 if (data.expected_has_md4 || data.expected_has_md2) {
1313 EXPECT_EQ(ERR_CERT_INVALID, rv);
1314 } else if (data.expected_has_md5) {
1315 EXPECT_EQ(ERR_CERT_WEAK_SIGNATURE_ALGORITHM, rv);
1316 } else {
1317 EXPECT_EQ(OK, rv);
1322 // Unlike TEST/TEST_F, which are macros that expand to further macros,
1323 // INSTANTIATE_TEST_CASE_P is a macro that expands directly to code that
1324 // stringizes the arguments. As a result, macros passed as parameters (such as
1325 // prefix or test_case_name) will not be expanded by the preprocessor. To work
1326 // around this, indirect the macro for INSTANTIATE_TEST_CASE_P, so that the
1327 // pre-processor will expand macros such as MAYBE_test_name before
1328 // instantiating the test.
1329 #define WRAPPED_INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
1330 INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator)
1332 // The signature algorithm of the root CA should not matter.
1333 const WeakDigestTestData kVerifyRootCATestData[] = {
1334 { "weak_digest_md5_root.pem", "weak_digest_sha1_intermediate.pem",
1335 "weak_digest_sha1_ee.pem", false, false, false },
1336 #if defined(USE_OPENSSL) || defined(OS_WIN)
1337 // MD4 is not supported by OS X / NSS
1338 { "weak_digest_md4_root.pem", "weak_digest_sha1_intermediate.pem",
1339 "weak_digest_sha1_ee.pem", false, false, false },
1340 #endif
1341 { "weak_digest_md2_root.pem", "weak_digest_sha1_intermediate.pem",
1342 "weak_digest_sha1_ee.pem", false, false, false },
1344 INSTANTIATE_TEST_CASE_P(VerifyRoot, CertVerifyProcWeakDigestTest,
1345 testing::ValuesIn(kVerifyRootCATestData));
1347 // The signature algorithm of intermediates should be properly detected.
1348 const WeakDigestTestData kVerifyIntermediateCATestData[] = {
1349 { "weak_digest_sha1_root.pem", "weak_digest_md5_intermediate.pem",
1350 "weak_digest_sha1_ee.pem", true, false, false },
1351 #if defined(USE_OPENSSL) || defined(OS_WIN)
1352 // MD4 is not supported by OS X / NSS
1353 { "weak_digest_sha1_root.pem", "weak_digest_md4_intermediate.pem",
1354 "weak_digest_sha1_ee.pem", false, true, false },
1355 #endif
1356 { "weak_digest_sha1_root.pem", "weak_digest_md2_intermediate.pem",
1357 "weak_digest_sha1_ee.pem", false, false, true },
1359 // Disabled on NSS - MD4 is not supported, and MD2 and MD5 are disabled.
1360 #if defined(USE_NSS) || defined(OS_IOS)
1361 #define MAYBE_VerifyIntermediate DISABLED_VerifyIntermediate
1362 #else
1363 #define MAYBE_VerifyIntermediate VerifyIntermediate
1364 #endif
1365 WRAPPED_INSTANTIATE_TEST_CASE_P(
1366 MAYBE_VerifyIntermediate,
1367 CertVerifyProcWeakDigestTest,
1368 testing::ValuesIn(kVerifyIntermediateCATestData));
1370 // The signature algorithm of end-entity should be properly detected.
1371 const WeakDigestTestData kVerifyEndEntityTestData[] = {
1372 { "weak_digest_sha1_root.pem", "weak_digest_sha1_intermediate.pem",
1373 "weak_digest_md5_ee.pem", true, false, false },
1374 #if defined(USE_OPENSSL) || defined(OS_WIN)
1375 // MD4 is not supported by OS X / NSS
1376 { "weak_digest_sha1_root.pem", "weak_digest_sha1_intermediate.pem",
1377 "weak_digest_md4_ee.pem", false, true, false },
1378 #endif
1379 { "weak_digest_sha1_root.pem", "weak_digest_sha1_intermediate.pem",
1380 "weak_digest_md2_ee.pem", false, false, true },
1382 // Disabled on NSS - NSS caches chains/signatures in such a way that cannot
1383 // be cleared until NSS is cleanly shutdown, which is not presently supported
1384 // in Chromium.
1385 #if defined(USE_NSS) || defined(OS_IOS)
1386 #define MAYBE_VerifyEndEntity DISABLED_VerifyEndEntity
1387 #else
1388 #define MAYBE_VerifyEndEntity VerifyEndEntity
1389 #endif
1390 WRAPPED_INSTANTIATE_TEST_CASE_P(MAYBE_VerifyEndEntity,
1391 CertVerifyProcWeakDigestTest,
1392 testing::ValuesIn(kVerifyEndEntityTestData));
1394 // Incomplete chains should still report the status of the intermediate.
1395 const WeakDigestTestData kVerifyIncompleteIntermediateTestData[] = {
1396 { NULL, "weak_digest_md5_intermediate.pem", "weak_digest_sha1_ee.pem",
1397 true, false, false },
1398 #if defined(USE_OPENSSL) || defined(OS_WIN)
1399 // MD4 is not supported by OS X / NSS
1400 { NULL, "weak_digest_md4_intermediate.pem", "weak_digest_sha1_ee.pem",
1401 false, true, false },
1402 #endif
1403 { NULL, "weak_digest_md2_intermediate.pem", "weak_digest_sha1_ee.pem",
1404 false, false, true },
1406 // Disabled on NSS - libpkix does not return constructed chains on error,
1407 // preventing us from detecting/inspecting the verified chain.
1408 #if defined(USE_NSS) || defined(OS_IOS)
1409 #define MAYBE_VerifyIncompleteIntermediate \
1410 DISABLED_VerifyIncompleteIntermediate
1411 #else
1412 #define MAYBE_VerifyIncompleteIntermediate VerifyIncompleteIntermediate
1413 #endif
1414 WRAPPED_INSTANTIATE_TEST_CASE_P(
1415 MAYBE_VerifyIncompleteIntermediate,
1416 CertVerifyProcWeakDigestTest,
1417 testing::ValuesIn(kVerifyIncompleteIntermediateTestData));
1419 // Incomplete chains should still report the status of the end-entity.
1420 const WeakDigestTestData kVerifyIncompleteEETestData[] = {
1421 { NULL, "weak_digest_sha1_intermediate.pem", "weak_digest_md5_ee.pem",
1422 true, false, false },
1423 #if defined(USE_OPENSSL) || defined(OS_WIN)
1424 // MD4 is not supported by OS X / NSS
1425 { NULL, "weak_digest_sha1_intermediate.pem", "weak_digest_md4_ee.pem",
1426 false, true, false },
1427 #endif
1428 { NULL, "weak_digest_sha1_intermediate.pem", "weak_digest_md2_ee.pem",
1429 false, false, true },
1431 // Disabled on NSS - libpkix does not return constructed chains on error,
1432 // preventing us from detecting/inspecting the verified chain.
1433 #if defined(USE_NSS) || defined(OS_IOS)
1434 #define MAYBE_VerifyIncompleteEndEntity DISABLED_VerifyIncompleteEndEntity
1435 #else
1436 #define MAYBE_VerifyIncompleteEndEntity VerifyIncompleteEndEntity
1437 #endif
1438 WRAPPED_INSTANTIATE_TEST_CASE_P(
1439 MAYBE_VerifyIncompleteEndEntity,
1440 CertVerifyProcWeakDigestTest,
1441 testing::ValuesIn(kVerifyIncompleteEETestData));
1443 // Differing algorithms between the intermediate and the EE should still be
1444 // reported.
1445 const WeakDigestTestData kVerifyMixedTestData[] = {
1446 { "weak_digest_sha1_root.pem", "weak_digest_md5_intermediate.pem",
1447 "weak_digest_md2_ee.pem", true, false, true },
1448 { "weak_digest_sha1_root.pem", "weak_digest_md2_intermediate.pem",
1449 "weak_digest_md5_ee.pem", true, false, true },
1450 #if defined(USE_OPENSSL) || defined(OS_WIN)
1451 // MD4 is not supported by OS X / NSS
1452 { "weak_digest_sha1_root.pem", "weak_digest_md4_intermediate.pem",
1453 "weak_digest_md2_ee.pem", false, true, true },
1454 #endif
1456 // NSS does not support MD4 and does not enable MD2 by default, making all
1457 // permutations invalid.
1458 #if defined(USE_NSS) || defined(OS_IOS)
1459 #define MAYBE_VerifyMixed DISABLED_VerifyMixed
1460 #else
1461 #define MAYBE_VerifyMixed VerifyMixed
1462 #endif
1463 WRAPPED_INSTANTIATE_TEST_CASE_P(
1464 MAYBE_VerifyMixed,
1465 CertVerifyProcWeakDigestTest,
1466 testing::ValuesIn(kVerifyMixedTestData));
1468 // For the list of valid hostnames, see
1469 // net/cert/data/ssl/certificates/subjectAltName_sanity_check.pem
1470 static const struct CertVerifyProcNameData {
1471 const char* hostname;
1472 bool valid; // Whether or not |hostname| matches a subjectAltName.
1473 } kVerifyNameData[] = {
1474 { "127.0.0.1", false }, // Don't match the common name
1475 { "127.0.0.2", true }, // Matches the iPAddress SAN (IPv4)
1476 { "FE80:0:0:0:0:0:0:1", true }, // Matches the iPAddress SAN (IPv6)
1477 { "[FE80:0:0:0:0:0:0:1]", false }, // Should not match the iPAddress SAN
1478 { "FE80::1", true }, // Compressed form matches the iPAddress SAN (IPv6)
1479 { "::127.0.0.2", false }, // IPv6 mapped form should NOT match iPAddress SAN
1480 { "test.example", true }, // Matches the dNSName SAN
1481 { "test.example.", true }, // Matches the dNSName SAN (trailing . ignored)
1482 { "www.test.example", false }, // Should not match the dNSName SAN
1483 { "test..example", false }, // Should not match the dNSName SAN
1484 { "test.example..", false }, // Should not match the dNSName SAN
1485 { ".test.example.", false }, // Should not match the dNSName SAN
1486 { ".test.example", false }, // Should not match the dNSName SAN
1489 // GTest 'magic' pretty-printer, so that if/when a test fails, it knows how
1490 // to output the parameter that was passed. Without this, it will simply
1491 // attempt to print out the first twenty bytes of the object, which depending
1492 // on platform and alignment, may result in an invalid read.
1493 void PrintTo(const CertVerifyProcNameData& data, std::ostream* os) {
1494 *os << "Hostname: " << data.hostname << "; valid=" << data.valid;
1497 class CertVerifyProcNameTest
1498 : public CertVerifyProcTest,
1499 public testing::WithParamInterface<CertVerifyProcNameData> {
1500 public:
1501 CertVerifyProcNameTest() {}
1502 virtual ~CertVerifyProcNameTest() {}
1505 TEST_P(CertVerifyProcNameTest, VerifyCertName) {
1506 CertVerifyProcNameData data = GetParam();
1508 CertificateList cert_list = CreateCertificateListFromFile(
1509 GetTestCertsDirectory(), "subjectAltName_sanity_check.pem",
1510 X509Certificate::FORMAT_AUTO);
1511 ASSERT_EQ(1U, cert_list.size());
1512 scoped_refptr<X509Certificate> cert(cert_list[0]);
1514 ScopedTestRoot scoped_root(cert.get());
1516 CertVerifyResult verify_result;
1517 int error = Verify(cert.get(), data.hostname, 0, NULL, empty_cert_list_,
1518 &verify_result);
1519 if (data.valid) {
1520 EXPECT_EQ(OK, error);
1521 EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_COMMON_NAME_INVALID);
1522 } else {
1523 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error);
1524 EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_COMMON_NAME_INVALID);
1528 WRAPPED_INSTANTIATE_TEST_CASE_P(
1529 VerifyName,
1530 CertVerifyProcNameTest,
1531 testing::ValuesIn(kVerifyNameData));
1533 } // namespace net