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

Unified Diff: ios/web/net/crw_cert_verification_controller.mm

Issue 2225483002: [ios] Removed CertVerifierBlockAdapter. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Updated includes Created 4 years, 4 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
Index: ios/web/net/crw_cert_verification_controller.mm
diff --git a/ios/web/net/crw_cert_verification_controller.mm b/ios/web/net/crw_cert_verification_controller.mm
index ac202064be94a0a740abbf9ab3fc23cbcd1d2ae1..3e427e0dab5fc7cecbebc159d872fff9eec20477 100644
--- a/ios/web/net/crw_cert_verification_controller.mm
+++ b/ios/web/net/crw_cert_verification_controller.mm
@@ -9,194 +9,52 @@
#include "base/ios/block_types.h"
#include "base/logging.h"
#include "base/mac/bind_objc_block.h"
-#include "base/mac/scoped_block.h"
#import "base/memory/ref_counted.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/rand_util.h"
#include "base/strings/sys_string_conversions.h"
#include "base/threading/worker_pool.h"
-#include "ios/web/net/cert_verifier_block_adapter.h"
#include "ios/web/public/browser_state.h"
#include "ios/web/public/certificate_policy_cache.h"
#include "ios/web/public/web_thread.h"
#import "ios/web/web_state/wk_web_view_security_util.h"
-#include "net/cert/cert_verify_result.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_getter.h"
-
-namespace {
-
-// Enum for Web.CertVerifyAgreement UMA metric to report certificate
-// verification mismatch between SecTrust API and CertVerifier. SecTrust API is
-// used for making load/no-load decision and CertVerifier is used for getting
-// the reason of verification failure. It is expected that mismatches will
-// happen for those 2 approaches (e.g. SecTrust API accepts the cert but
-// CertVerifier rejects it). This metric helps to understand how common
-// mismatches are.
-// Note: This enum is used to back an UMA histogram, and should be treated as
-// append-only.
-enum CertVerifyAgreement {
- // There is no mismach. Both SecTrust API and CertVerifier accepted this cert.
- CERT_VERIFY_AGREEMENT_ACCEPTED_BY_BOTH = 0,
- // There is no mismach. Both SecTrust API and CertVerifier rejected this cert.
- CERT_VERIFY_AGREEMENT_REJECTED_BY_BOTH,
- // SecTrust API accepted the cert, but CertVerifier rejected it (e.g. MDM cert
- // or CertVerifier was more strict during verification), this mismach is
- // expected to be common because of MDM certs.
- CERT_VERIFY_AGREEMENT_ACCEPTED_ONLY_BY_IOS,
- // SecTrust API rejected the cert, but CertVerifier accepted it. This mismatch
- // is expected to be uncommon.
- CERT_VERIFY_AGREEMENT_ACCEPTED_ONLY_BY_NSS,
- CERT_VERIFY_AGREEMENT_COUNT,
-};
-
-// This class takes ownership of block and releases it on UI thread, even if
-// |BlockHolder| is destructed on a background thread. On destruction calls its
-// block with default arguments, if block was not called before. This way
-// BlockHolder guarantees that block is always called to satisfy API contract
-// for CRWCertVerificationController (completion handlers are always called).
-template <class T>
-class BlockHolder : public base::RefCountedThreadSafe<BlockHolder<T>> {
- public:
- // Takes ownership of |block|, which must not be null. On destruction calls
- // this block with |DefaultArgs|, if block was not called before.
- // |DefaultArgs| must be passed by value, not by ponter or reference.
- template <typename... Arguments>
- BlockHolder(T block, Arguments... DefaultArgs)
- : block_([block copy]),
- called_(false),
- default_block_([^{
- block(DefaultArgs...);
- } copy]) {
- DCHECK(block_);
- }
-
- // Calls underlying block with the given variadic arguments.
- template <typename... Arguments>
- void call(Arguments... Args) {
- block_(Args...);
- called_ = true;
- }
-
- private:
- BlockHolder() = delete;
- friend class base::RefCountedThreadSafe<BlockHolder>;
-
- // Finalizes object's destruction on UI thread by calling |default_block| (if
- // |block| has not been called yet) and releasing all blocks. Must be called
- // on UI thread.
- static void Finalize(id block,
- ProceduralBlock default_block,
- bool block_was_called) {
- DCHECK_CURRENTLY_ON(web::WebThread::UI);
- // By calling default_block, BlockHolder guarantees that block is always
- // called to satisfy API contract for CRWCertVerificationController
- // (completion handlers are always called).
- if (!block_was_called)
- default_block();
- [block release];
- [default_block release];
- }
-
- // Releases underlying |block_| on UI thread, calls |default_block_| if
- // |block_| has not been called yet.
- ~BlockHolder() {
- if (web::WebThread::CurrentlyOn(web::WebThread::UI)) {
- Finalize(block_, default_block_, called_);
- } else {
- web::WebThread::PostTask(
- web::WebThread::UI, FROM_HERE,
- base::Bind(&BlockHolder::Finalize, block_, default_block_, called_));
- }
- }
-
- T block_;
- // true if this |block_| has already been called.
- bool called_;
- // Called on destruction if |block_| was not called.
- ProceduralBlock default_block_;
-};
-
-typedef scoped_refptr<BlockHolder<web::PolicyDecisionHandler>>
- PolicyDecisionHandlerHolder;
-
-} // namespace
+#include "net/cert/cert_verify_proc_ios.h"
@interface CRWCertVerificationController () {
- // Cert verification object which wraps |net::CertVerifier|. Must be created,
- // used and destroyed on IO Thread.
- std::unique_ptr<web::CertVerifierBlockAdapter> _certVerifier;
-
- // URLRequestContextGetter for obtaining net layer objects.
- net::URLRequestContextGetter* _contextGetter;
-
// Used to remember user exceptions to invalid certs.
scoped_refptr<web::CertificatePolicyCache> _certPolicyCache;
}
-// Cert verification flags. Must be used on IO Thread.
-@property(nonatomic, readonly) int certVerifyFlags;
-
-// Returns YES if CertVerifier should be run (even if SecTrust API considers
-// cert as valid) and Web.CertVerifyAgreement UMA metric should be reported.
-// The result of this method is random and nondeterministic.
-- (BOOL)shouldReportCertVerifyAgreement;
-
-// Reports Web.CertVerifyAgreement UMA metric.
-- (void)reportUMAForCertVerifyAgreement:(CertVerifyAgreement)agreement;
-
-// Creates _certVerifier object on IO thread.
-- (void)createCertVerifier;
+// Returns cert status for the given |trust|.
+- (net::CertStatus)certStatusFromTrustResult:(SecTrustResultType)trustResult
+ serverTrust:
+ (base::ScopedCFTypeRef<SecTrustRef>)trust;
// Decides the policy for the given |trust| which was rejected by iOS and the
-// given |host| and calls |handler| on completion.
+// given |host| and calls |handler| on completion. Must be called on UI thread.
+// |handler| can not be null and will be called on UI thread.
- (void)
decideLoadPolicyForRejectedTrustResult:(SecTrustResultType)trustResult
serverTrust:(base::ScopedCFTypeRef<SecTrustRef>)trust
host:(NSString*)host
- completionHandler:(PolicyDecisionHandlerHolder)handler;
-
-// Decides the policy for the given |trust| which was accepted by iOS and the
-// given |host| and calls |handler| on completion.
-- (void)
-decideLoadPolicyForAcceptedTrustResult:(SecTrustResultType)trustResult
- serverTrust:(base::ScopedCFTypeRef<SecTrustRef>)trust
- host:(NSString*)host
- completionHandler:(PolicyDecisionHandlerHolder)handler;
-
-// Verifies the given |cert| for the given |host| using |net::CertVerifier| and
-// calls |completionHandler| on completion. This method can be called on any
-// thread. |completionHandler| cannot be null and will be called asynchronously
-// on IO thread or will never be called if IO task can't start or complete.
-- (void)verifyCert:(const scoped_refptr<net::X509Certificate>&)cert
- forHost:(NSString*)host
- completionHandler:(void (^)(net::CertVerifyResult))completionHandler;
+ completionHandler:(web::PolicyDecisionHandler)handler;
// Verifies the given |trust| using SecTrustRef API. |completionHandler| cannot
-// be null and will be either called asynchronously on Worker thread or will
-// never be called if the worker task can't start or complete.
+// be null and will be called on UI thread or never be called if the worker task
+// can't start or complete. Must be called on UI thread.
- (void)verifyTrust:(base::ScopedCFTypeRef<SecTrustRef>)trust
completionHandler:(void (^)(SecTrustResultType))completionHandler;
// Returns cert accept policy for the given SecTrust result. |trustResult| must
// not be for a valid cert. Must be called on IO thread.
Ryan Sleevi 2016/08/12 00:16:23 Just trying to make sure I understand why the thre
Eugene But (OOO till 7-30) 2016/08/12 16:16:39 Correct CertPolicyCache is constructed and owned b
- (web::CertAcceptPolicy)
- loadPolicyForRejectedTrustResult:(SecTrustResultType)trustResult
- certVerifierResult:(net::CertVerifyResult)certVerifierResult
- serverTrust:(SecTrustRef)trust
- host:(NSString*)host;
+loadPolicyForRejectedTrustResult:(SecTrustResultType)trustResult
+ certStatus:(net::CertStatus)certStatus
+ serverTrust:(SecTrustRef)trust
+ host:(NSString*)host;
@end
@implementation CRWCertVerificationController
-#pragma mark - Superclass
-
-- (void)dealloc {
- DCHECK(!_certVerifier);
- [super dealloc];
-}
-
#pragma mark - Public
- (instancetype)init {
@@ -209,12 +67,8 @@ decideLoadPolicyForAcceptedTrustResult:(SecTrustResultType)trustResult
DCHECK_CURRENTLY_ON(web::WebThread::UI);
self = [super init];
if (self) {
- _contextGetter = browserState->GetRequestContext();
- DCHECK(_contextGetter);
_certPolicyCache =
web::BrowserState::GetCertificatePolicyCache(browserState);
-
- [self createCertVerifier];
}
return self;
}
@@ -223,30 +77,20 @@ decideLoadPolicyForAcceptedTrustResult:(SecTrustResultType)trustResult
host:(NSString*)host
completionHandler:(web::PolicyDecisionHandler)completionHandler {
DCHECK_CURRENTLY_ON(web::WebThread::UI);
- // completionHandler of |verifyCert:forHost:completionHandler:| is called on
- // IO thread and then bounces back to UI thread. As a result all objects
- // captured by completionHandler may be released on either UI or IO thread.
- // Since |completionHandler| can potentially capture multiple thread unsafe
- // objects (like Web Controller) |completionHandler| itself should never be
- // released on background thread and |BlockHolder| ensures that.
- __block PolicyDecisionHandlerHolder handlerHolder(
- new BlockHolder<web::PolicyDecisionHandler>(
- completionHandler, web::CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR,
- net::CertStatus()));
+ DCHECK(completionHandler);
+
[self verifyTrust:trust
completionHandler:^(SecTrustResultType trustResult) {
+ DCHECK_CURRENTLY_ON(web::WebThread::UI);
if (web::GetSecurityStyleFromTrustResult(trustResult) ==
web::SECURITY_STYLE_AUTHENTICATED) {
Ryan Sleevi 2016/08/12 00:16:23 COMMENT: It's unclear to me why we indirect throug
Eugene But (OOO till 7-30) 2016/08/12 16:16:39 |web::GetSecurityStyleFromTrustResult(trustResult)
Ryan Sleevi 2016/08/12 16:28:33 Right, I understood that part perfectly :)
Eugene But (OOO till 7-30) 2016/08/12 22:33:02 Yes, that's my reasoning.
- [self decideLoadPolicyForAcceptedTrustResult:trustResult
- serverTrust:trust
- host:host
- completionHandler:handlerHolder];
- } else {
- [self decideLoadPolicyForRejectedTrustResult:trustResult
- serverTrust:trust
- host:host
- completionHandler:handlerHolder];
+ completionHandler(web::CERT_ACCEPT_POLICY_ALLOW, net::CertStatus());
+ return;
}
+ [self decideLoadPolicyForRejectedTrustResult:trustResult
+ serverTrust:trust
+ host:host
+ completionHandler:completionHandler];
}];
}
@@ -254,39 +98,16 @@ decideLoadPolicyForAcceptedTrustResult:(SecTrustResultType)trustResult
host:(NSString*)host
completionHandler:(web::StatusQueryHandler)completionHandler {
DCHECK_CURRENTLY_ON(web::WebThread::UI);
+ DCHECK(completionHandler);
- // The completion handlers of |verifyCert:forHost:completionHandler:| and
- // |verifyTrust:completionHandler:| will be deallocated on background thread.
- // |completionHandler| itself should never be released on background thread
- // and |BlockHolder| ensures that.
- __block scoped_refptr<BlockHolder<web::StatusQueryHandler>> handlerHolder(
- new BlockHolder<web::StatusQueryHandler>(
- completionHandler, web::SECURITY_STYLE_UNKNOWN, net::CertStatus()));
[self verifyTrust:trust
completionHandler:^(SecTrustResultType trustResult) {
web::SecurityStyle securityStyle =
web::GetSecurityStyleFromTrustResult(trustResult);
- if (securityStyle == web::SECURITY_STYLE_AUTHENTICATED) {
- // SecTrust API considers this cert as valid.
- dispatch_async(dispatch_get_main_queue(), ^{
- handlerHolder->call(securityStyle, net::CertStatus());
- });
- return;
- }
- // Retrieve the net::CertStatus for invalid certificates to determine
- // the rejection reason, it is possible that rejection reason could not
- // be determined and |cert_status| will be empty.
- scoped_refptr<net::X509Certificate> cert(
- web::CreateCertFromTrust(trust));
- [self verifyCert:cert
- forHost:host
- completionHandler:^(net::CertVerifyResult certVerifierResult) {
- dispatch_async(dispatch_get_main_queue(), ^{
- handlerHolder->call(securityStyle,
- certVerifierResult.cert_status);
- });
- }];
+ net::CertStatus certStatus =
+ [self certStatusFromTrustResult:trustResult serverTrust:trust];
+ completionHandler(securityStyle, certStatus);
}];
}
@@ -310,144 +131,57 @@ decideLoadPolicyForAcceptedTrustResult:(SecTrustResultType)trustResult
}));
}
-- (void)shutDown {
- DCHECK_CURRENTLY_ON(web::WebThread::UI);
- web::WebThread::PostTask(web::WebThread::IO, FROM_HERE, base::BindBlock(^{
- // This block captures |self| delaying its deallocation and causing dealloc
- // to happen on either IO or UI thread (which is fine for this class).
- _certVerifier.reset();
- }));
-}
-
#pragma mark - Private
-- (int)certVerifyFlags {
- DCHECK(web::WebThread::CurrentlyOn(web::WebThread::IO));
- DCHECK(_contextGetter);
- // |net::URLRequestContextGetter| lifetime is expected to be at least the same
- // or longer than |BrowserState| lifetime.
- net::URLRequestContext* context = _contextGetter->GetURLRequestContext();
- DCHECK(context);
- net::SSLConfigService* SSLConfigService = context->ssl_config_service();
- DCHECK(SSLConfigService);
- net::SSLConfig config;
- SSLConfigService->GetSSLConfig(&config);
- return config.GetCertVerifyFlags();
-}
-
-- (BOOL)shouldReportCertVerifyAgreement {
- // Cert verification is an expensive operation. Since extra verification will
- // be used only for UMA reporting purposes, do that only for 1% of cases.
- return base::RandGenerator(100) == 0;
-}
-
-- (void)reportUMAForCertVerifyAgreement:(CertVerifyAgreement)agreement {
- UMA_HISTOGRAM_ENUMERATION("Web.CertVerifyAgreement", agreement,
- CERT_VERIFY_AGREEMENT_COUNT);
-}
-
-- (void)createCertVerifier {
- web::WebThread::PostTask(web::WebThread::IO, FROM_HERE, base::BindBlock(^{
- net::URLRequestContext* context = _contextGetter->GetURLRequestContext();
- _certVerifier.reset(new web::CertVerifierBlockAdapter(
- context->cert_verifier(), context->net_log()));
- }));
+- (net::CertStatus)certStatusFromTrustResult:(SecTrustResultType)trustResult
+ serverTrust:
+ (base::ScopedCFTypeRef<SecTrustRef>)trust {
+ web::SecurityStyle securityStyle =
+ web::GetSecurityStyleFromTrustResult(trustResult);
+ if (securityStyle == web::SECURITY_STYLE_AUTHENTICATED)
Ryan Sleevi 2016/08/12 00:16:22 It's a little weird that you check securityStyle h
Eugene But (OOO till 7-30) 2016/08/12 16:16:39 I didn't want to use |trustResult| here because if
Ryan Sleevi 2016/08/12 16:28:33 I guess I disagree (see the other comment :P) Ulti
Eugene But (OOO till 7-30) 2016/08/12 22:33:02 Done.
+ return net::CertStatus();
+
+ if (trustResult == kSecTrustResultDeny)
+ return net::CERT_STATUS_AUTHORITY_INVALID;
Ryan Sleevi 2016/08/12 00:16:23 Having this short-circuit *seems* like it means we
Eugene But (OOO till 7-30) 2016/08/12 16:16:39 Yes, this is from CertVerifyProciOS https://cs.chr
Ryan Sleevi 2016/08/12 16:28:33 In general, I would strongly discourage extracting
Eugene But (OOO till 7-30) 2016/08/12 22:33:02 CVPIOS has a switch-case so I matched that.
+
+ net::CertStatus certStatus =
+ net::CertVerifyProcIOS::GetCertFailureStatusFromTrust(trust);
+ if (!net::IsCertStatusError(certStatus)) {
+ // |cert_status| must not be no-error if SecTrust API considers the
+ // cert as invalid. Otherwise there will be issues with errors
+ // reporting and recovery.
+ certStatus = net::CERT_STATUS_INVALID;
+ }
+ return certStatus;
}
- (void)
decideLoadPolicyForRejectedTrustResult:(SecTrustResultType)trustResult
serverTrust:(base::ScopedCFTypeRef<SecTrustRef>)trust
host:(NSString*)host
- completionHandler:(PolicyDecisionHandlerHolder)handler {
- // SecTrust API considers this cert as invalid. Check the reason and
- // whether or not user has decided to proceed with this bad cert.
- scoped_refptr<net::X509Certificate> cert(web::CreateCertFromTrust(trust));
- [self verifyCert:cert
- forHost:host
- completionHandler:^(net::CertVerifyResult certVerifierResult) {
- if (!net::IsCertStatusError(certVerifierResult.cert_status)) {
- // |cert_status| must not be no-error if SecTrust API considers the
- // cert as invalid. Otherwise there will be issues with errors
- // reporting and recovery.
- certVerifierResult.cert_status = net::CERT_STATUS_INVALID;
- }
+ completionHandler:(web::PolicyDecisionHandler)handler {
+ DCHECK_CURRENTLY_ON(web::WebThread::UI);
+ DCHECK(handler);
+ web::WebThread::PostTask(
+ web::WebThread::IO, FROM_HERE, base::BindBlock(^{
Ryan Sleevi 2016/08/12 00:16:22 Making sure I've grokked the reasoning for this:
Eugene But (OOO till 7-30) 2016/08/12 16:16:39 Correct. I added comments to the code.
+ net::CertStatus certStatus =
+ [self certStatusFromTrustResult:trustResult serverTrust:trust];
web::CertAcceptPolicy policy =
[self loadPolicyForRejectedTrustResult:trustResult
- certVerifierResult:certVerifierResult
+ certStatus:certStatus
serverTrust:trust.get()
host:host];
dispatch_async(dispatch_get_main_queue(), ^{
- if ([self shouldReportCertVerifyAgreement]) {
- CertVerifyAgreement agreement =
- net::IsCertStatusError(certVerifierResult.cert_status)
- ? CERT_VERIFY_AGREEMENT_REJECTED_BY_BOTH
- : CERT_VERIFY_AGREEMENT_ACCEPTED_ONLY_BY_NSS;
- [self reportUMAForCertVerifyAgreement:agreement];
- }
- handler->call(policy, certVerifierResult.cert_status);
+ handler(policy, certStatus);
});
- }];
-}
-
-- (void)
-decideLoadPolicyForAcceptedTrustResult:(SecTrustResultType)trustResult
- serverTrust:(base::ScopedCFTypeRef<SecTrustRef>)trust
- host:(NSString*)host
- completionHandler:(PolicyDecisionHandlerHolder)handler {
- // SecTrust API considers this cert as valid.
- dispatch_async(dispatch_get_main_queue(), ^{
- handler->call(web::CERT_ACCEPT_POLICY_ALLOW, net::CertStatus());
- });
-
- if ([self shouldReportCertVerifyAgreement]) {
- // Execute CertVerifier::Verify to collect CertVerifyAgreement UMA.
- scoped_refptr<net::X509Certificate> cert(web::CreateCertFromTrust(trust));
- [self verifyCert:cert
- forHost:host
- completionHandler:^(net::CertVerifyResult certVerifierResult) {
- // SecTrust API accepted this cert and |PolicyDecisionHandler| has
- // been called already. |CertVerifier| verification is executed only
- // to collect CertVerifyAgreement UMA.
- dispatch_async(dispatch_get_main_queue(), ^{
- CertVerifyAgreement agreement =
- net::IsCertStatusError(certVerifierResult.cert_status)
- ? CERT_VERIFY_AGREEMENT_ACCEPTED_ONLY_BY_IOS
- : CERT_VERIFY_AGREEMENT_ACCEPTED_BY_BOTH;
- [self reportUMAForCertVerifyAgreement:agreement];
- });
- }];
- }
-}
-
-- (void)verifyCert:(const scoped_refptr<net::X509Certificate>&)cert
- forHost:(NSString*)host
- completionHandler:(void (^)(net::CertVerifyResult))completionHandler {
- DCHECK(completionHandler);
- __block scoped_refptr<net::X509Certificate> blockCert = cert;
- web::WebThread::PostTask(web::WebThread::IO, FROM_HERE, base::BindBlock(^{
- // WeakNSObject does not work across different threads, hence this block
- // retains self.
- if (!_certVerifier) {
- completionHandler(net::CertVerifyResult());
- return;
- }
-
- web::CertVerifierBlockAdapter::Params params(std::move(blockCert),
- base::SysNSStringToUTF8(host));
- params.flags = self.certVerifyFlags;
- // OCSP response is not provided by iOS API.
- // CRLSets are not used, as the OS is used to make load/no-load
- // decisions, not the CertVerifier.
- _certVerifier->Verify(params, ^(net::CertVerifyResult result, int) {
- completionHandler(result);
- });
- }));
+ }));
}
- (void)verifyTrust:(base::ScopedCFTypeRef<SecTrustRef>)trust
completionHandler:(void (^)(SecTrustResultType))completionHandler {
+ DCHECK_CURRENTLY_ON(web::WebThread::UI);
DCHECK(completionHandler);
// SecTrustEvaluate performs trust evaluation synchronously, possibly making
// network requests. The UI thread should not be blocked by that operation.
@@ -456,15 +190,17 @@ decideLoadPolicyForAcceptedTrustResult:(SecTrustResultType)trustResult
if (SecTrustEvaluate(trust.get(), &trustResult) != errSecSuccess) {
Ryan Sleevi 2016/08/12 00:16:23 Curious: Is there any reason we don't/didn't use S
Eugene But (OOO till 7-30) 2016/08/12 16:16:39 SecTrustEvaluateAsync takes GCD queue as param and
Ryan Sleevi 2016/08/12 16:28:33 That feels like a very strange response to me, con
Eugene But (OOO till 7-30) 2016/08/12 22:33:02 |dispatch_async(dispatch_get_main_queue()| is equi
trustResult = kSecTrustResultInvalid;
}
- completionHandler(trustResult);
+ dispatch_async(dispatch_get_main_queue(), ^{
+ completionHandler(trustResult);
+ });
}), false /* task_is_slow */);
}
- (web::CertAcceptPolicy)
- loadPolicyForRejectedTrustResult:(SecTrustResultType)trustResult
- certVerifierResult:(net::CertVerifyResult)certVerifierResult
- serverTrust:(SecTrustRef)trust
- host:(NSString*)host {
+loadPolicyForRejectedTrustResult:(SecTrustResultType)trustResult
+ certStatus:(net::CertStatus)certStatus
+ serverTrust:(SecTrustRef)trust
+ host:(NSString*)host {
DCHECK_CURRENTLY_ON(web::WebThread::IO);
DCHECK_NE(web::SECURITY_STYLE_AUTHENTICATED,
web::GetSecurityStyleFromTrustResult(trustResult));
@@ -482,8 +218,7 @@ decideLoadPolicyForAcceptedTrustResult:(SecTrustResultType)trustResult
net::X509Certificate::OSCertHandles());
web::CertPolicy::Judgment judgment = _certPolicyCache->QueryPolicy(
- leafCert.get(), base::SysNSStringToUTF8(host),
- certVerifierResult.cert_status);
+ leafCert.get(), base::SysNSStringToUTF8(host), certStatus);
return (judgment == web::CertPolicy::ALLOWED)
? web::CERT_ACCEPT_POLICY_RECOVERABLE_ERROR_ACCEPTED_BY_USER

Powered by Google App Engine
This is Rietveld 408576698