diff options
author | eugenebut <eugenebut@chromium.org> | 2016-02-03 00:03:49 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-03 08:04:53 +0000 |
commit | f531e094ae328f316e7ad3a08a4ce32f5b087e6b (patch) | |
tree | b3d8204ed32ca2738606a6a2a91250d4e616aa82 /ios/web/net | |
parent | ef49d533528742e7795c36fd717fd2b6a64c1627 (diff) | |
download | chromium_src-f531e094ae328f316e7ad3a08a4ce32f5b087e6b.zip chromium_src-f531e094ae328f316e7ad3a08a4ce32f5b087e6b.tar.gz chromium_src-f531e094ae328f316e7ad3a08a4ce32f5b087e6b.tar.bz2 |
[ios] Use CERT_STATUS_INVALID if cert is considered invalid by SecTrust.
CertificatePolicyCache does not store/retrieve user decision if
|cert_status| is 0, hence if SecTrust API thinks that cert is invalid
and CertVerifier thinks that cert is valid then error will not be
recoverable for 0 |cert_status|.
BUG=582373
Review URL: https://codereview.chromium.org/1662723002
Cr-Commit-Position: refs/heads/master@{#373196}
Diffstat (limited to 'ios/web/net')
-rw-r--r-- | ios/web/net/crw_cert_verification_controller.mm | 7 | ||||
-rw-r--r-- | ios/web/net/crw_cert_verification_controller_unittest.mm | 20 |
2 files changed, 25 insertions, 2 deletions
diff --git a/ios/web/net/crw_cert_verification_controller.mm b/ios/web/net/crw_cert_verification_controller.mm index 8089386..b5fe4010 100644 --- a/ios/web/net/crw_cert_verification_controller.mm +++ b/ios/web/net/crw_cert_verification_controller.mm @@ -364,6 +364,13 @@ decideLoadPolicyForRejectedTrustResult:(SecTrustResultType)trustResult [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; + } + web::CertAcceptPolicy policy = [self loadPolicyForRejectedTrustResult:trustResult certVerifierResult:certVerifierResult diff --git a/ios/web/net/crw_cert_verification_controller_unittest.mm b/ios/web/net/crw_cert_verification_controller_unittest.mm index 04dca59..edd53b7 100644 --- a/ios/web/net/crw_cert_verification_controller_unittest.mm +++ b/ios/web/net/crw_cert_verification_controller_unittest.mm @@ -161,6 +161,22 @@ TEST_F(CRWCertVerificationControllerTest, PolicyForInvalidTrustAcceptedByUser) { EXPECT_EQ(net::CERT_STATUS_DATE_INVALID, status); } +// Tests cert policy with an invalid trust when CertVerifier considers cert as +// valid. +TEST_F(CRWCertVerificationControllerTest, + PolicyForInvalidTrustWithNoErrorFromCertVerifier) { + net::CertVerifyResult result; + result.verified_cert = cert_; + cert_verifier_.AddResultForCertAndHost(cert_.get(), kHostName.UTF8String, + result, net::OK); + + web::CertAcceptPolicy policy = CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR; + net::CertStatus status; + DecidePolicy(invalid_trust_, kHostName, &policy, &status); + EXPECT_EQ(CERT_ACCEPT_POLICY_RECOVERABLE_ERROR_UNDECIDED_BY_USER, policy); + EXPECT_EQ(net::CERT_STATUS_INVALID, status); +} + // Tests that allowCert:forHost:status: strips all intermidiate certs. TEST_F(CRWCertVerificationControllerTest, AllowCertIgnoresIntermidiateCerts) { scoped_refptr<net::X509Certificate> cert( @@ -189,7 +205,7 @@ TEST_F(CRWCertVerificationControllerTest, PolicyForNullTrust) { base::ScopedCFTypeRef<SecTrustRef> null_trust; DecidePolicy(null_trust, kHostName, &policy, &status); EXPECT_EQ(CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR, policy); - EXPECT_FALSE(status); + EXPECT_EQ(net::CERT_STATUS_INVALID, status); } // Tests cert policy with invalid trust and null host. @@ -198,7 +214,7 @@ TEST_F(CRWCertVerificationControllerTest, PolicyForNullHost) { net::CertStatus status; DecidePolicy(invalid_trust_, nil, &policy, &status); EXPECT_EQ(CERT_ACCEPT_POLICY_RECOVERABLE_ERROR_UNDECIDED_BY_USER, policy); - EXPECT_FALSE(status); + EXPECT_EQ(net::CERT_STATUS_INVALID, status); } // Tests SSL status with valid trust. |