summaryrefslogtreecommitdiffstats
path: root/ios/web/net
diff options
context:
space:
mode:
authoreugenebut <eugenebut@chromium.org>2016-02-03 00:03:49 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-03 08:04:53 +0000
commitf531e094ae328f316e7ad3a08a4ce32f5b087e6b (patch)
treeb3d8204ed32ca2738606a6a2a91250d4e616aa82 /ios/web/net
parentef49d533528742e7795c36fd717fd2b6a64c1627 (diff)
downloadchromium_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.mm7
-rw-r--r--ios/web/net/crw_cert_verification_controller_unittest.mm20
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.