| 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/base/cert_verify_proc_mac.h" | 5 #include "net/base/cert_verify_proc_mac.h" |
| 6 | 6 |
| 7 #include <CommonCrypto/CommonDigest.h> | 7 #include <CommonCrypto/CommonDigest.h> |
| 8 #include <CoreServices/CoreServices.h> | 8 #include <CoreServices/CoreServices.h> |
| 9 #include <Security/Security.h> | 9 #include <Security/Security.h> |
| 10 | 10 |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/mac/mac_logging.h" | 12 #include "base/mac/mac_logging.h" |
| 13 #include "base/mac/scoped_cftyperef.h" | 13 #include "base/mac/scoped_cftyperef.h" |
| 14 #include "base/sha1.h" | 14 #include "base/sha1.h" |
| 15 #include "base/string_piece.h" | 15 #include "base/string_piece.h" |
| 16 #include "crypto/nss_util.h" | 16 #include "crypto/nss_util.h" |
| 17 #include "crypto/sha2.h" | 17 #include "crypto/sha2.h" |
| 18 #include "net/base/asn1_util.h" | 18 #include "net/base/asn1_util.h" |
| 19 #include "net/base/cert_status_flags.h" | 19 #include "net/base/cert_status_flags.h" |
| 20 #include "net/base/cert_verifier.h" |
| 20 #include "net/base/cert_verify_result.h" | 21 #include "net/base/cert_verify_result.h" |
| 21 #include "net/base/crl_set.h" | 22 #include "net/base/crl_set.h" |
| 22 #include "net/base/net_errors.h" | 23 #include "net/base/net_errors.h" |
| 23 #include "net/base/test_root_certs.h" | 24 #include "net/base/test_root_certs.h" |
| 24 #include "net/base/x509_certificate.h" | 25 #include "net/base/x509_certificate.h" |
| 25 #include "net/base/x509_certificate_known_roots_mac.h" | 26 #include "net/base/x509_certificate_known_roots_mac.h" |
| 26 #include "net/base/x509_util_mac.h" | 27 #include "net/base/x509_util_mac.h" |
| 27 | 28 |
| 28 // From 10.7.2 libsecurity_keychain-55035/lib/SecTrustPriv.h, for use with | 29 // From 10.7.2 libsecurity_keychain-55035/lib/SecTrustPriv.h, for use with |
| 29 // SecTrustCopyExtendedResult. | 30 // SecTrustCopyExtendedResult. |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 OSStatus status = x509_util::CreateSSLServerPolicy(hostname, &ssl_policy); | 150 OSStatus status = x509_util::CreateSSLServerPolicy(hostname, &ssl_policy); |
| 150 if (status) | 151 if (status) |
| 151 return status; | 152 return status; |
| 152 CFArrayAppendValue(local_policies, ssl_policy); | 153 CFArrayAppendValue(local_policies, ssl_policy); |
| 153 CFRelease(ssl_policy); | 154 CFRelease(ssl_policy); |
| 154 | 155 |
| 155 // Explicitly add revocation policies, in order to override system | 156 // Explicitly add revocation policies, in order to override system |
| 156 // revocation checking policies and instead respect the application-level | 157 // revocation checking policies and instead respect the application-level |
| 157 // revocation preference. | 158 // revocation preference. |
| 158 status = x509_util::CreateRevocationPolicies( | 159 status = x509_util::CreateRevocationPolicies( |
| 159 (flags & X509Certificate::VERIFY_REV_CHECKING_ENABLED), | 160 (flags & CertVerifier::VERIFY_REV_CHECKING_ENABLED), |
| 160 (flags & X509Certificate::VERIFY_REV_CHECKING_ENABLED_EV_ONLY), | 161 (flags & CertVerifier::VERIFY_REV_CHECKING_ENABLED_EV_ONLY), |
| 161 local_policies); | 162 local_policies); |
| 162 if (status) | 163 if (status) |
| 163 return status; | 164 return status; |
| 164 | 165 |
| 165 policies->reset(local_policies.release()); | 166 policies->reset(local_policies.release()); |
| 166 return noErr; | 167 return noErr; |
| 167 } | 168 } |
| 168 | 169 |
| 169 // Saves some information about the certificate chain |cert_chain| in | 170 // Saves some information about the certificate chain |cert_chain| in |
| 170 // |*verify_result|. The caller MUST initialize |*verify_result| before | 171 // |*verify_result|. The caller MUST initialize |*verify_result| before |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 CSSM_APPLE_TP_ACTION_DATA tp_action_data; | 377 CSSM_APPLE_TP_ACTION_DATA tp_action_data; |
| 377 memset(&tp_action_data, 0, sizeof(tp_action_data)); | 378 memset(&tp_action_data, 0, sizeof(tp_action_data)); |
| 378 tp_action_data.Version = CSSM_APPLE_TP_ACTION_VERSION; | 379 tp_action_data.Version = CSSM_APPLE_TP_ACTION_VERSION; |
| 379 // Allow CSSM to download any missing intermediate certificates if an | 380 // Allow CSSM to download any missing intermediate certificates if an |
| 380 // authorityInfoAccess extension or issuerAltName extension is present. | 381 // authorityInfoAccess extension or issuerAltName extension is present. |
| 381 tp_action_data.ActionFlags = CSSM_TP_ACTION_FETCH_CERT_FROM_NET | | 382 tp_action_data.ActionFlags = CSSM_TP_ACTION_FETCH_CERT_FROM_NET | |
| 382 CSSM_TP_ACTION_TRUST_SETTINGS; | 383 CSSM_TP_ACTION_TRUST_SETTINGS; |
| 383 | 384 |
| 384 // Note: For EV certificates, the Apple TP will handle setting these flags | 385 // Note: For EV certificates, the Apple TP will handle setting these flags |
| 385 // as part of EV evaluation. | 386 // as part of EV evaluation. |
| 386 if (flags & X509Certificate::VERIFY_REV_CHECKING_ENABLED) { | 387 if (flags & CertVerifier::VERIFY_REV_CHECKING_ENABLED) { |
| 387 // Require a positive result from an OCSP responder or a CRL (or both) | 388 // Require a positive result from an OCSP responder or a CRL (or both) |
| 388 // for every certificate in the chain. The Apple TP automatically | 389 // for every certificate in the chain. The Apple TP automatically |
| 389 // excludes the self-signed root from this requirement. If a certificate | 390 // excludes the self-signed root from this requirement. If a certificate |
| 390 // is missing both a crlDistributionPoints extension and an | 391 // is missing both a crlDistributionPoints extension and an |
| 391 // authorityInfoAccess extension with an OCSP responder URL, then we | 392 // authorityInfoAccess extension with an OCSP responder URL, then we |
| 392 // will get a kSecTrustResultRecoverableTrustFailure back from | 393 // will get a kSecTrustResultRecoverableTrustFailure back from |
| 393 // SecTrustEvaluate(), with a | 394 // SecTrustEvaluate(), with a |
| 394 // CSSMERR_APPLETP_INCOMPLETE_REVOCATION_CHECK error code. In that case, | 395 // CSSMERR_APPLETP_INCOMPLETE_REVOCATION_CHECK error code. In that case, |
| 395 // we'll set our own result to include | 396 // we'll set our own result to include |
| 396 // CERT_STATUS_NO_REVOCATION_MECHANISM. If one or both extensions are | 397 // CERT_STATUS_NO_REVOCATION_MECHANISM. If one or both extensions are |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 verify_result->cert_status |= CERT_STATUS_COMMON_NAME_INVALID; | 530 verify_result->cert_status |= CERT_STATUS_COMMON_NAME_INVALID; |
| 530 | 531 |
| 531 // TODO(wtc): Suppress CERT_STATUS_NO_REVOCATION_MECHANISM for now to be | 532 // TODO(wtc): Suppress CERT_STATUS_NO_REVOCATION_MECHANISM for now to be |
| 532 // compatible with Windows, which in turn implements this behavior to be | 533 // compatible with Windows, which in turn implements this behavior to be |
| 533 // compatible with WinHTTP, which doesn't report this error (bug 3004). | 534 // compatible with WinHTTP, which doesn't report this error (bug 3004). |
| 534 verify_result->cert_status &= ~CERT_STATUS_NO_REVOCATION_MECHANISM; | 535 verify_result->cert_status &= ~CERT_STATUS_NO_REVOCATION_MECHANISM; |
| 535 | 536 |
| 536 if (IsCertStatusError(verify_result->cert_status)) | 537 if (IsCertStatusError(verify_result->cert_status)) |
| 537 return MapCertStatusToNetError(verify_result->cert_status); | 538 return MapCertStatusToNetError(verify_result->cert_status); |
| 538 | 539 |
| 539 if (flags & X509Certificate::VERIFY_EV_CERT) { | 540 if (flags & CertVerifier::VERIFY_EV_CERT) { |
| 540 // Determine the certificate's EV status using SecTrustCopyExtendedResult(), | 541 // Determine the certificate's EV status using SecTrustCopyExtendedResult(), |
| 541 // which we need to look up because the function wasn't added until | 542 // which we need to look up because the function wasn't added until |
| 542 // Mac OS X 10.5.7. | 543 // Mac OS X 10.5.7. |
| 543 // Note: "ExtendedResult" means extended validation results. | 544 // Note: "ExtendedResult" means extended validation results. |
| 544 CFBundleRef bundle = | 545 CFBundleRef bundle = |
| 545 CFBundleGetBundleWithIdentifier(CFSTR("com.apple.security")); | 546 CFBundleGetBundleWithIdentifier(CFSTR("com.apple.security")); |
| 546 if (bundle) { | 547 if (bundle) { |
| 547 SecTrustCopyExtendedResultFuncPtr copy_extended_result = | 548 SecTrustCopyExtendedResultFuncPtr copy_extended_result = |
| 548 reinterpret_cast<SecTrustCopyExtendedResultFuncPtr>( | 549 reinterpret_cast<SecTrustCopyExtendedResultFuncPtr>( |
| 549 CFBundleGetFunctionPointerForName(bundle, | 550 CFBundleGetFunctionPointerForName(bundle, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 560 // releases, SecTrustCopyExtendedResult would only return noErr and | 561 // releases, SecTrustCopyExtendedResult would only return noErr and |
| 561 // populate ev_dict for EV certificates, but would always include | 562 // populate ev_dict for EV certificates, but would always include |
| 562 // kSecEVOrganizationName in that case, so checking for this key is | 563 // kSecEVOrganizationName in that case, so checking for this key is |
| 563 // appropriate for all known versions of SecTrustCopyExtendedResult. | 564 // appropriate for all known versions of SecTrustCopyExtendedResult. |
| 564 // The actual organization name is unneeded here and can be accessed | 565 // The actual organization name is unneeded here and can be accessed |
| 565 // through other means. All that matters here is the OS' conception | 566 // through other means. All that matters here is the OS' conception |
| 566 // of whether or not the certificate is EV. | 567 // of whether or not the certificate is EV. |
| 567 if (CFDictionaryContainsKey(ev_dict, | 568 if (CFDictionaryContainsKey(ev_dict, |
| 568 kSecEVOrganizationName)) { | 569 kSecEVOrganizationName)) { |
| 569 verify_result->cert_status |= CERT_STATUS_IS_EV; | 570 verify_result->cert_status |= CERT_STATUS_IS_EV; |
| 570 if (flags & X509Certificate::VERIFY_REV_CHECKING_ENABLED_EV_ONLY) | 571 if (flags & CertVerifier::VERIFY_REV_CHECKING_ENABLED_EV_ONLY) |
| 571 verify_result->cert_status |= CERT_STATUS_REV_CHECKING_ENABLED; | 572 verify_result->cert_status |= CERT_STATUS_REV_CHECKING_ENABLED; |
| 572 } | 573 } |
| 573 } | 574 } |
| 574 } | 575 } |
| 575 } | 576 } |
| 576 } | 577 } |
| 577 | 578 |
| 578 AppendPublicKeyHashes(completed_chain, &verify_result->public_key_hashes); | 579 AppendPublicKeyHashes(completed_chain, &verify_result->public_key_hashes); |
| 579 verify_result->is_issued_by_known_root = IsIssuedByKnownRoot(completed_chain); | 580 verify_result->is_issued_by_known_root = IsIssuedByKnownRoot(completed_chain); |
| 580 | 581 |
| 581 return OK; | 582 return OK; |
| 582 } | 583 } |
| 583 | 584 |
| 584 } // namespace net | 585 } // namespace net |
| OLD | NEW |