Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1868)

Unified Diff: net/base/x509_certificate_mac.cc

Issue 6879095: Address post-review feedback for r81702 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Disable even cached revocation checking Created 9 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | third_party/apple_apsl/README.chromium » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/x509_certificate_mac.cc
diff --git a/net/base/x509_certificate_mac.cc b/net/base/x509_certificate_mac.cc
index 4bb9adf66b58371d8d2d1b94b5a2a2a8163142cc..845249c2ad60fc8c020def36936f69fdab0d271f 100644
--- a/net/base/x509_certificate_mac.cc
+++ b/net/base/x509_certificate_mac.cc
@@ -289,13 +289,19 @@ OSStatus CreatePolicy(const CSSM_OID* policy_OID,
}
// Creates a series of SecPolicyRefs to be added to a SecTrustRef used to
-// validate a certificate for an SSL peer. |hostname| contains the name of
-// the SSL peer that the certificate should be verified against. |flags| is
+// validate a certificate for an SSL server. |hostname| contains the name of
+// the SSL server that the certificate should be verified against. |flags| is
// a bitwise-OR of VerifyFlags that can further alter how trust is
// validated, such as how revocation is checked. If successful, returns
// noErr, and stores the resultant array of SecPolicyRefs in |policies|.
OSStatus CreateTrustPolicies(const std::string& hostname, int flags,
ScopedCFTypeRef<CFArrayRef>* policies) {
+ CFMutableArrayRef local_policies =
+ CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
+ if (!local_policies)
+ return memFullErr;
+ ScopedCFTypeRef<CFMutableArrayRef> scoped_local_policies(local_policies);
wtc 2011/04/21 22:04:38 Please rewrite this as: ScopedCFTypeRef<CFMutabl
+
// Create an SSL SecPolicyRef, and configure it to perform hostname
// validation. The hostname check does 99% of what we want, with the
// exception of dotted IPv4 addreses, which we handle ourselves below.
@@ -310,35 +316,29 @@ OSStatus CreateTrustPolicies(const std::string& hostname, int flags,
sizeof(tp_ssl_options), &ssl_policy);
if (status)
return status;
- ScopedCFTypeRef<SecPolicyRef> scoped_ssl_policy(ssl_policy);
+ CFArrayAppendValue(scoped_local_policies, ssl_policy);
+ CFRelease(ssl_policy);
- // Manually add OCSP and CRL policies. If neither an OCSP or CRL policy is
- // specified, the Apple TP module will add whatever the system settings
- // are, which is not desirable here.
- //
- // Note that this causes any locally configured OCSP responder URL to be
- // ignored.
+ // Manually add revocation policies. If no revocation policy is specified,
+ // the Apple TP module will add whatever the system settings are, which is
+ // not desirable here.
wtc 2011/04/21 22:04:38 It would be nice to stress that we need to specify
Ryan Sleevi 2011/04/21 23:59:17 Wording has been updated.
CSSM_APPLE_TP_OCSP_OPTIONS tp_ocsp_options;
memset(&tp_ocsp_options, 0, sizeof(tp_ocsp_options));
tp_ocsp_options.Version = CSSM_APPLE_TP_OCSP_OPTS_VERSION;
- CSSM_APPLE_TP_CRL_OPTIONS tp_crl_options;
- memset(&tp_crl_options, 0, sizeof(tp_crl_options));
- tp_crl_options.Version = CSSM_APPLE_TP_CRL_OPTS_VERSION;
-
if (flags & X509Certificate::VERIFY_REV_CHECKING_ENABLED) {
// If an OCSP responder is available, use it, and avoid fetching any
// CRLs for that certificate if possible, as they may be much larger.
tp_ocsp_options.Flags = CSSM_TP_ACTION_OCSP_SUFFICIENT;
- // Ensure that CRLs can be fetched if a crlDistributionPoint extension
- // is found. Otherwise, only the local CRL cache will be consulted.
- tp_crl_options.CrlFlags |= CSSM_TP_ACTION_FETCH_CRL_FROM_NET;
} else {
- // Disable OCSP network fetching, but still permit cached OCSP responses
- // to be used. This is equivalent to the Windows code's usage of
- // CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY.
- tp_ocsp_options.Flags = CSSM_TP_ACTION_OCSP_DISABLE_NET;
- // The default CrlFlags will ensure only cached CRLs are used.
+ // If the Apple TP believes the certificate being verified may be an EV
+ // certificate, it will attempt to force OCSP checking. In order to
+ // reliably disable revocation checking, disable access to both the
+ // network and the cache. Note that when this happens, the Apple TP will
+ // report an error error that OCSP was unavailable, but this will be
wtc 2011/04/21 22:04:38 Typo: error error => error
+ // handled and suppressed in X509Certificate::Verify().
+ tp_ocsp_options.Flags = CSSM_TP_ACTION_OCSP_DISABLE_NET |
+ CSSM_TP_ACTION_OCSP_CACHE_READ_DISABLE;
}
SecPolicyRef ocsp_policy;
@@ -346,23 +346,30 @@ OSStatus CreateTrustPolicies(const std::string& hostname, int flags,
sizeof(tp_ocsp_options), &ocsp_policy);
if (status)
return status;
- ScopedCFTypeRef<SecPolicyRef> scoped_ocsp_policy(ocsp_policy);
+ CFArrayAppendValue(scoped_local_policies, ocsp_policy);
+ CFRelease(ocsp_policy);
+
+ if (!(flags & X509Certificate::VERIFY_REV_CHECKING_ENABLED)) {
+ policies->reset(scoped_local_policies.release());
+ return noErr;
wtc 2011/04/21 22:04:38 Nit: you can put lines 357-370 inside a if (flag
+ }
+
+ CSSM_APPLE_TP_CRL_OPTIONS tp_crl_options;
+ memset(&tp_crl_options, 0, sizeof(tp_crl_options));
+ tp_crl_options.Version = CSSM_APPLE_TP_CRL_OPTS_VERSION;
+ // Ensure that CRLs can be fetched if a crlDistributionPoint extension
+ // is found. Otherwise, only the local CRL cache will be consulted.
+ tp_crl_options.CrlFlags |= CSSM_TP_ACTION_FETCH_CRL_FROM_NET;
SecPolicyRef crl_policy;
status = CreatePolicy(&CSSMOID_APPLE_TP_REVOCATION_CRL, &tp_crl_options,
sizeof(tp_crl_options), &crl_policy);
if (status)
return status;
- ScopedCFTypeRef<SecPolicyRef> scoped_crl_policy(crl_policy);
-
- CFTypeRef local_policies[] = { ssl_policy, ocsp_policy, crl_policy };
- CFArrayRef policy_array = CFArrayCreate(kCFAllocatorDefault, local_policies,
- arraysize(local_policies),
- &kCFTypeArrayCallBacks);
- if (!policy_array)
- return memFullErr;
+ CFArrayAppendValue(scoped_local_policies, crl_policy);
+ CFRelease(crl_policy);
- policies->reset(policy_array);
+ policies->reset(scoped_local_policies.release());
wtc 2011/04/21 22:04:38 We can use 'swap' here. Would that be better?
Ryan Sleevi 2011/04/21 23:59:17 We can't. ScopedCFType<CFArrayRef> is a different
return noErr;
}
@@ -856,7 +863,7 @@ int X509Certificate::Verify(const std::string& hostname, int flags,
} else {
// EV requires revocation checking.
// Note, under the hood, SecTrustEvaluate() will modify the OCSP options
- // so as to attempt OCSP fetching if it believes a certificate may chain
+ // so as to attempt OCSP checking if it believes a certificate may chain
// to an EV root. However, because network fetches are disabled in
// CreateTrustPolicies() when revocation checking is disabled, these
// will only go against the local cache.
« no previous file with comments | « no previous file | third_party/apple_apsl/README.chromium » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698