Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/cert/cert_verify_proc.h" | 5 #include "net/cert/cert_verify_proc.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 362 #if defined(OS_WIN) | 362 #if defined(OS_WIN) |
| 363 // TODO(rsleevi): Remove this once https://crbug.com/588789 is resolved | 363 // TODO(rsleevi): Remove this once https://crbug.com/588789 is resolved |
| 364 // for Windows 7/2008 users. | 364 // for Windows 7/2008 users. |
| 365 // Note: This must be kept in sync with cert_verify_proc_unittest.cc | 365 // Note: This must be kept in sync with cert_verify_proc_unittest.cc |
| 366 return base::win::GetVersion() < base::win::VERSION_WIN8; | 366 return base::win::GetVersion() < base::win::VERSION_WIN8; |
| 367 #else | 367 #else |
| 368 return false; | 368 return false; |
| 369 #endif | 369 #endif |
| 370 }; | 370 }; |
| 371 | 371 |
| 372 // Sets the weak signature hash fields of |verify_result| to true if | |
| 373 // applicable for |cert|, otherwise does not modify them. | |
| 374 void FillCertVerifyResultWeakHashAlgorithms(X509Certificate::OSCertHandle cert, | |
| 375 bool is_leaf, | |
|
Ryan Sleevi
2017/01/10 01:53:24
Two suggested changes:
1) It seems like using the
eroman
2017/01/10 02:48:46
Done.
| |
| 376 CertVerifyResult* verify_result) { | |
| 377 X509Certificate::SignatureHashAlgorithm hash = | |
| 378 X509Certificate::GetSignatureHashAlgorithm(cert); | |
| 379 switch (hash) { | |
| 380 case X509Certificate::kSignatureHashAlgorithmMd2: | |
| 381 verify_result->has_md2 = true; | |
| 382 break; | |
| 383 case X509Certificate::kSignatureHashAlgorithmMd4: | |
| 384 verify_result->has_md4 = true; | |
| 385 break; | |
| 386 case X509Certificate::kSignatureHashAlgorithmMd5: | |
| 387 verify_result->has_md5 = true; | |
| 388 break; | |
| 389 case X509Certificate::kSignatureHashAlgorithmSha1: | |
| 390 verify_result->has_sha1 = true; | |
| 391 if (is_leaf) | |
| 392 verify_result->has_sha1_leaf = true; | |
| 393 break; | |
| 394 case X509Certificate::kSignatureHashAlgorithmOther: | |
| 395 break; | |
| 396 } | |
| 397 } | |
| 398 | |
| 399 // Fills in the booleans on |verify_result| relating to weak hashing algorithms | |
| 400 // used by the certificate chain: | |
| 401 void CheckWeakHashAlgorithms(CertVerifyResult* verify_result) { | |
|
Ryan Sleevi
2017/01/10 01:53:24
Naming wise, I think CheckWeakHashAlgorithms and F
eroman
2017/01/10 02:48:46
Done.
| |
| 402 const X509Certificate::OSCertHandles& intermediates = | |
| 403 verify_result->verified_cert->GetIntermediateCertificates(); | |
| 404 | |
| 405 // Consider weak hash algorithms in all certificates except trusted | |
| 406 // certificates. | |
| 407 // | |
| 408 // There is some loss of information as to which certificate is the trust | |
| 409 // anchor: | |
| 410 // | |
| 411 // * If verification was successful, and |!intermediates.empty()|, the trust | |
| 412 // anchor is |intermediates.back()|. | |
| 413 // | |
| 414 // * If verification was successful, and |intermediates.empty()|, the leaf | |
| 415 // certificate is trusted. | |
| 416 // | |
| 417 // * However, if verification was not successful, there may or may not be a | |
| 418 // trust anchor. | |
| 419 // | |
| 420 // The following code assumes that the final certificate in the chain is the | |
| 421 // trust anchor (which may not be true for the case of failed verifications, | |
| 422 // when a partial chain was returned). | |
| 423 // | |
| 424 // This inaccuracy should not be harmful, as it just impacts the final error. | |
| 425 if (!intermediates.empty()) { | |
|
Ryan Sleevi
2017/01/10 01:53:24
Does it make sense to make this error-short circui
eroman
2017/01/10 02:48:46
Done.
| |
| 426 for (size_t i = 0; i + 1 < intermediates.size(); ++i) { | |
| 427 FillCertVerifyResultWeakHashAlgorithms(intermediates[i], | |
| 428 false /*is_leaf*/, verify_result); | |
| 429 } | |
| 430 | |
| 431 FillCertVerifyResultWeakHashAlgorithms( | |
| 432 verify_result->verified_cert->os_cert_handle(), true /*is_leaf*/, | |
| 433 verify_result); | |
| 434 } | |
| 435 } | |
| 436 | |
| 372 } // namespace | 437 } // namespace |
| 373 | 438 |
| 374 // static | 439 // static |
| 375 CertVerifyProc* CertVerifyProc::CreateDefault() { | 440 CertVerifyProc* CertVerifyProc::CreateDefault() { |
| 376 #if defined(USE_NSS_CERTS) | 441 #if defined(USE_NSS_CERTS) |
| 377 return new CertVerifyProcNSS(); | 442 return new CertVerifyProcNSS(); |
| 378 #elif defined(USE_OPENSSL_CERTS) && !defined(OS_ANDROID) | 443 #elif defined(USE_OPENSSL_CERTS) && !defined(OS_ANDROID) |
| 379 return new CertVerifyProcOpenSSL(); | 444 return new CertVerifyProcOpenSSL(); |
| 380 #elif defined(OS_ANDROID) | 445 #elif defined(OS_ANDROID) |
| 381 return new CertVerifyProcAndroid(); | 446 return new CertVerifyProcAndroid(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 413 // We do online revocation checking for EV certificates that aren't covered | 478 // We do online revocation checking for EV certificates that aren't covered |
| 414 // by a fresh CRLSet. | 479 // by a fresh CRLSet. |
| 415 // TODO(rsleevi): http://crbug.com/142974 - Allow preferences to fully | 480 // TODO(rsleevi): http://crbug.com/142974 - Allow preferences to fully |
| 416 // disable revocation checking. | 481 // disable revocation checking. |
| 417 if (flags & CertVerifier::VERIFY_EV_CERT) | 482 if (flags & CertVerifier::VERIFY_EV_CERT) |
| 418 flags |= CertVerifier::VERIFY_REV_CHECKING_ENABLED_EV_ONLY; | 483 flags |= CertVerifier::VERIFY_REV_CHECKING_ENABLED_EV_ONLY; |
| 419 | 484 |
| 420 int rv = VerifyInternal(cert, hostname, ocsp_response, flags, crl_set, | 485 int rv = VerifyInternal(cert, hostname, ocsp_response, flags, crl_set, |
| 421 additional_trust_anchors, verify_result); | 486 additional_trust_anchors, verify_result); |
| 422 | 487 |
| 488 // Fill in verify_result->has_md2 and related booleans early so that | |
| 489 // subsequent code can rely on it being meaningful. | |
|
Ryan Sleevi
2017/01/10 01:53:24
Seems like an unnecessary comment (or perhaps unne
eroman
2017/01/10 02:48:46
Done.
| |
| 490 CheckWeakHashAlgorithms(verify_result); | |
| 491 | |
| 423 UMA_HISTOGRAM_BOOLEAN("Net.CertCommonNameFallback", | 492 UMA_HISTOGRAM_BOOLEAN("Net.CertCommonNameFallback", |
| 424 verify_result->common_name_fallback_used); | 493 verify_result->common_name_fallback_used); |
| 425 if (!verify_result->is_issued_by_known_root) { | 494 if (!verify_result->is_issued_by_known_root) { |
| 426 UMA_HISTOGRAM_BOOLEAN("Net.CertCommonNameFallbackPrivateCA", | 495 UMA_HISTOGRAM_BOOLEAN("Net.CertCommonNameFallbackPrivateCA", |
| 427 verify_result->common_name_fallback_used); | 496 verify_result->common_name_fallback_used); |
| 428 } | 497 } |
| 429 | 498 |
| 430 CheckOCSP(ocsp_response, *verify_result->verified_cert, | 499 CheckOCSP(ocsp_response, *verify_result->verified_cert, |
| 431 &verify_result->ocsp_result); | 500 &verify_result->ocsp_result); |
| 432 | 501 |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 767 if (start >= time_2015_04_01 && month_diff > 39) | 836 if (start >= time_2015_04_01 && month_diff > 39) |
| 768 return true; | 837 return true; |
| 769 | 838 |
| 770 return false; | 839 return false; |
| 771 } | 840 } |
| 772 | 841 |
| 773 // static | 842 // static |
| 774 const base::Feature CertVerifyProc::kSHA1LegacyMode{ | 843 const base::Feature CertVerifyProc::kSHA1LegacyMode{ |
| 775 "SHA1LegacyMode", base::FEATURE_DISABLED_BY_DEFAULT}; | 844 "SHA1LegacyMode", base::FEATURE_DISABLED_BY_DEFAULT}; |
| 776 | 845 |
| 777 X509Certificate::SignatureHashAlgorithm FillCertVerifyResultWeakSignature( | |
| 778 X509Certificate::OSCertHandle cert, | |
| 779 bool is_leaf, | |
| 780 CertVerifyResult* verify_result) { | |
| 781 X509Certificate::SignatureHashAlgorithm hash = | |
| 782 X509Certificate::GetSignatureHashAlgorithm(cert); | |
| 783 switch (hash) { | |
| 784 case X509Certificate::kSignatureHashAlgorithmMd2: | |
| 785 verify_result->has_md2 = true; | |
| 786 break; | |
| 787 case X509Certificate::kSignatureHashAlgorithmMd4: | |
| 788 verify_result->has_md4 = true; | |
| 789 break; | |
| 790 case X509Certificate::kSignatureHashAlgorithmMd5: | |
| 791 verify_result->has_md5 = true; | |
| 792 break; | |
| 793 case X509Certificate::kSignatureHashAlgorithmSha1: | |
| 794 verify_result->has_sha1 = true; | |
| 795 if (is_leaf) | |
| 796 verify_result->has_sha1_leaf = true; | |
| 797 break; | |
| 798 case X509Certificate::kSignatureHashAlgorithmOther: | |
| 799 break; | |
| 800 } | |
| 801 | |
| 802 return hash; | |
| 803 } | |
| 804 | |
| 805 } // namespace net | 846 } // namespace net |
| OLD | NEW |