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_win.h" | 5 #include "net/cert/cert_verify_proc_win.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 628 NULL, // reserved | 628 NULL, // reserved |
| 629 &chain_context)) { | 629 &chain_context)) { |
| 630 verify_result->cert_status |= CERT_STATUS_INVALID; | 630 verify_result->cert_status |= CERT_STATUS_INVALID; |
| 631 return MapSecurityError(GetLastError()); | 631 return MapSecurityError(GetLastError()); |
| 632 } | 632 } |
| 633 | 633 |
| 634 CRLSetResult crl_set_result = kCRLSetUnknown; | 634 CRLSetResult crl_set_result = kCRLSetUnknown; |
| 635 if (crl_set) | 635 if (crl_set) |
| 636 crl_set_result = CheckRevocationWithCRLSet(chain_context, crl_set); | 636 crl_set_result = CheckRevocationWithCRLSet(chain_context, crl_set); |
| 637 | 637 |
| 638 // redo_with_revocation_checking controls whether we verify the chain a | |
| 639 // second time, but with online revocation checking. If | |
| 640 // hard_fail_revocation_checking_when_redoing is also true then revocation | |
| 641 // information must be returned. | |
| 642 bool redo_with_revocation_checking = false; | |
| 643 bool hard_fail_revocation_checking_when_redoing = false; | |
| 644 | |
| 638 if (crl_set_result == kCRLSetRevoked) { | 645 if (crl_set_result == kCRLSetRevoked) { |
| 639 verify_result->cert_status |= CERT_STATUS_REVOKED; | 646 verify_result->cert_status |= CERT_STATUS_REVOKED; |
| 640 } else if (crl_set_result == kCRLSetUnknown && | 647 } else if (crl_set_result == kCRLSetUnknown && |
| 641 (flags & CertVerifier::VERIFY_REV_CHECKING_ENABLED_EV_ONLY) && | 648 (flags & CertVerifier::VERIFY_REV_CHECKING_ENABLED_EV_ONLY) && |
| 642 !rev_checking_enabled && | 649 !rev_checking_enabled && |
| 643 ev_policy_oid != NULL) { | 650 ev_policy_oid != NULL) { |
| 644 // We don't have fresh information about this chain from the CRLSet and | 651 // We don't have fresh information about this chain from the CRLSet and |
| 645 // it's probably an EV certificate. Retry with online revocation checking. | 652 // it's probably an EV certificate. Retry with online revocation checking. |
| 646 rev_checking_enabled = true; | 653 redo_with_revocation_checking = true; |
| 647 chain_flags &= ~CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY; | |
| 648 verify_result->cert_status |= CERT_STATUS_REV_CHECKING_ENABLED; | |
| 649 | |
| 650 if (!CertGetCertificateChain( | |
| 651 chain_engine, | |
| 652 cert_list.get(), | |
| 653 NULL, // current system time | |
| 654 cert_list->hCertStore, | |
| 655 &chain_para, | |
| 656 chain_flags, | |
| 657 NULL, // reserved | |
| 658 &chain_context)) { | |
| 659 verify_result->cert_status |= CERT_STATUS_INVALID; | |
| 660 return MapSecurityError(GetLastError()); | |
| 661 } | |
| 662 } | 654 } |
| 663 | 655 |
| 664 if (chain_context->TrustStatus.dwErrorStatus & | 656 if (chain_context->TrustStatus.dwErrorStatus & |
|
Ryan Sleevi
2013/08/27 19:25:07
So, there's a slight side-effect of changing the o
agl
2013/08/28 16:42:58
Ok, that's a fair point and I was really shuffling
| |
| 665 CERT_TRUST_IS_NOT_VALID_FOR_USAGE) { | 657 CERT_TRUST_IS_NOT_VALID_FOR_USAGE) { |
| 666 ev_policy_oid = NULL; | 658 ev_policy_oid = NULL; |
| 667 chain_para.RequestedIssuancePolicy.Usage.cUsageIdentifier = 0; | 659 chain_para.RequestedIssuancePolicy.Usage.cUsageIdentifier = 0; |
| 668 chain_para.RequestedIssuancePolicy.Usage.rgpszUsageIdentifier = NULL; | 660 chain_para.RequestedIssuancePolicy.Usage.rgpszUsageIdentifier = NULL; |
| 669 CertFreeCertificateChain(chain_context); | 661 CertFreeCertificateChain(chain_context); |
| 670 if (!CertGetCertificateChain( | 662 if (!CertGetCertificateChain( |
| 671 chain_engine, | 663 chain_engine, |
| 672 cert_list.get(), | 664 cert_list.get(), |
| 673 NULL, // current system time | 665 NULL, // current system time |
| 674 cert_list->hCertStore, | 666 cert_list->hCertStore, |
| 675 &chain_para, | 667 &chain_para, |
| 676 chain_flags, | 668 chain_flags, |
| 677 NULL, // reserved | 669 NULL, // reserved |
| 678 &chain_context)) { | 670 &chain_context)) { |
| 679 verify_result->cert_status |= CERT_STATUS_INVALID; | 671 verify_result->cert_status |= CERT_STATUS_INVALID; |
| 680 return MapSecurityError(GetLastError()); | 672 return MapSecurityError(GetLastError()); |
| 681 } | 673 } |
| 682 } | 674 } |
| 683 | 675 |
| 684 CertVerifyResult temp_verify_result = *verify_result; | 676 CertVerifyResult temp_verify_result = *verify_result; |
| 685 GetCertChainInfo(chain_context, verify_result); | 677 GetCertChainInfo(chain_context, verify_result); |
| 686 if (!verify_result->is_issued_by_known_root && | 678 if (!verify_result->is_issued_by_known_root && |
| 687 (flags & CertVerifier::VERIFY_REV_CHECKING_REQUIRED_LOCAL_ANCHORS)) { | 679 (flags & CertVerifier::VERIFY_REV_CHECKING_REQUIRED_LOCAL_ANCHORS)) { |
| 680 // Hard-fail revocation checking has been requested for locally installed | |
| 681 // CAs. | |
| 682 redo_with_revocation_checking = true; | |
| 683 hard_fail_revocation_checking_when_redoing = true; | |
| 684 } | |
| 685 | |
| 686 if (redo_with_revocation_checking) { | |
| 688 *verify_result = temp_verify_result; | 687 *verify_result = temp_verify_result; |
| 689 | 688 |
| 690 rev_checking_enabled = true; | 689 rev_checking_enabled = true; |
| 691 verify_result->cert_status |= CERT_STATUS_REV_CHECKING_ENABLED; | 690 verify_result->cert_status |= CERT_STATUS_REV_CHECKING_ENABLED; |
| 692 chain_flags &= ~CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY; | 691 chain_flags &= ~CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY; |
| 693 | 692 |
| 694 CertFreeCertificateChain(chain_context); | 693 CertFreeCertificateChain(chain_context); |
| 695 if (!CertGetCertificateChain( | 694 if (!CertGetCertificateChain( |
| 696 chain_engine, | 695 chain_engine, |
| 697 cert_list.get(), | 696 cert_list.get(), |
| 698 NULL, // current system time | 697 NULL, // current system time |
| 699 cert_list->hCertStore, | 698 cert_list->hCertStore, |
| 700 &chain_para, | 699 &chain_para, |
| 701 chain_flags, | 700 chain_flags, |
| 702 NULL, // reserved | 701 NULL, // reserved |
| 703 &chain_context)) { | 702 &chain_context)) { |
| 704 verify_result->cert_status |= CERT_STATUS_INVALID; | 703 verify_result->cert_status |= CERT_STATUS_INVALID; |
| 705 return MapSecurityError(GetLastError()); | 704 return MapSecurityError(GetLastError()); |
| 706 } | 705 } |
| 707 GetCertChainInfo(chain_context, verify_result); | 706 GetCertChainInfo(chain_context, verify_result); |
| 708 | 707 |
| 709 if (chain_context->TrustStatus.dwErrorStatus & | 708 if (hard_fail_revocation_checking_when_redoing && |
| 710 CERT_TRUST_IS_OFFLINE_REVOCATION) { | 709 (chain_context->TrustStatus.dwErrorStatus & |
| 710 CERT_TRUST_IS_OFFLINE_REVOCATION)) { | |
| 711 verify_result->cert_status |= CERT_STATUS_REVOKED; | 711 verify_result->cert_status |= CERT_STATUS_REVOKED; |
| 712 } | 712 } |
| 713 } | 713 } |
| 714 | 714 |
| 715 ScopedPCCERT_CHAIN_CONTEXT scoped_chain_context(chain_context); | 715 ScopedPCCERT_CHAIN_CONTEXT scoped_chain_context(chain_context); |
| 716 | 716 |
| 717 verify_result->cert_status |= MapCertChainErrorStatusToCertStatus( | 717 verify_result->cert_status |= MapCertChainErrorStatusToCertStatus( |
| 718 chain_context->TrustStatus.dwErrorStatus); | 718 chain_context->TrustStatus.dwErrorStatus); |
| 719 | 719 |
| 720 // Flag certificates that have a Subject common name with a NULL character. | 720 // Flag certificates that have a Subject common name with a NULL character. |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 781 return MapCertStatusToNetError(verify_result->cert_status); | 781 return MapCertStatusToNetError(verify_result->cert_status); |
| 782 | 782 |
| 783 if (ev_policy_oid && | 783 if (ev_policy_oid && |
| 784 CheckEV(chain_context, rev_checking_enabled, ev_policy_oid)) { | 784 CheckEV(chain_context, rev_checking_enabled, ev_policy_oid)) { |
| 785 verify_result->cert_status |= CERT_STATUS_IS_EV; | 785 verify_result->cert_status |= CERT_STATUS_IS_EV; |
| 786 } | 786 } |
| 787 return OK; | 787 return OK; |
| 788 } | 788 } |
| 789 | 789 |
| 790 } // namespace net | 790 } // namespace net |
| OLD | NEW |