| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "ios/web/net/crw_cert_verification_controller.h" | 5 #include "ios/web/net/crw_cert_verification_controller.h" |
| 6 | 6 |
| 7 #include "base/mac/bind_objc_block.h" | 7 #include "base/mac/bind_objc_block.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/test/ios/wait_util.h" | 9 #include "base/test/ios/wait_util.h" |
| 10 #include "ios/web/public/web_thread.h" | 10 #include "ios/web/public/web_thread.h" |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 // Returns NSArray of SecCertificateRef objects for the given |cert|. | 58 // Returns NSArray of SecCertificateRef objects for the given |cert|. |
| 59 NSArray* GetChain(const scoped_refptr<net::X509Certificate>& cert) const { | 59 NSArray* GetChain(const scoped_refptr<net::X509Certificate>& cert) const { |
| 60 NSMutableArray* result = [NSMutableArray | 60 NSMutableArray* result = [NSMutableArray |
| 61 arrayWithObject:static_cast<id>(cert->os_cert_handle())]; | 61 arrayWithObject:static_cast<id>(cert->os_cert_handle())]; |
| 62 for (SecCertificateRef intermediate : cert->GetIntermediateCertificates()) { | 62 for (SecCertificateRef intermediate : cert->GetIntermediateCertificates()) { |
| 63 [result addObject:static_cast<id>(intermediate)]; | 63 [result addObject:static_cast<id>(intermediate)]; |
| 64 } | 64 } |
| 65 return result; | 65 return result; |
| 66 } | 66 } |
| 67 | 67 |
| 68 // Synchronously returns result of decidePolicyForCert:host:completionHandler: | 68 // Synchronously returns result of |
| 69 // call. | 69 // decideLoadPolicyForTrust:host:completionHandler: call. |
| 70 void DecidePolicy(const scoped_refptr<net::X509Certificate>& cert, | 70 void DecidePolicy(const base::ScopedCFTypeRef<SecTrustRef>& trust, |
| 71 NSString* host, | 71 NSString* host, |
| 72 web::CertAcceptPolicy* policy, | 72 web::CertAcceptPolicy* policy, |
| 73 net::CertStatus* status) { | 73 net::CertStatus* status) { |
| 74 __block bool completion_handler_called = false; | 74 __block bool completion_handler_called = false; |
| 75 [controller_ decidePolicyForCert:cert | 75 [controller_ |
| 76 host:host | 76 decideLoadPolicyForTrust:trust |
| 77 completionHandler:^(web::CertAcceptPolicy callback_policy, | 77 host:host |
| 78 net::CertStatus callback_status) { | 78 completionHandler:^(web::CertAcceptPolicy callback_policy, |
| 79 *policy = callback_policy; | 79 net::CertStatus callback_status) { |
| 80 *status = callback_status; | 80 *policy = callback_policy; |
| 81 completion_handler_called = true; | 81 *status = callback_status; |
| 82 }]; | 82 completion_handler_called = true; |
| 83 }]; |
| 83 base::test::ios::WaitUntilCondition(^{ | 84 base::test::ios::WaitUntilCondition(^{ |
| 84 return completion_handler_called; | 85 return completion_handler_called; |
| 85 }, base::MessageLoop::current(), base::TimeDelta()); | 86 }, base::MessageLoop::current(), base::TimeDelta()); |
| 86 } | 87 } |
| 87 | 88 |
| 88 // Synchronously returns result of | 89 // Synchronously returns result of |
| 89 // querySSLStatusForTrust:host:completionHandler: call. | 90 // querySSLStatusForTrust:host:completionHandler: call. |
| 90 void QueryStatus(const base::ScopedCFTypeRef<SecTrustRef>& trust, | 91 void QueryStatus(const base::ScopedCFTypeRef<SecTrustRef>& trust, |
| 91 NSString* host, | 92 NSString* host, |
| 92 SecurityStyle* style, | 93 SecurityStyle* style, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 105 }, base::MessageLoop::current(), base::TimeDelta()); | 106 }, base::MessageLoop::current(), base::TimeDelta()); |
| 106 } | 107 } |
| 107 | 108 |
| 108 scoped_refptr<net::X509Certificate> cert_; | 109 scoped_refptr<net::X509Certificate> cert_; |
| 109 base::ScopedCFTypeRef<SecTrustRef> valid_trust_; | 110 base::ScopedCFTypeRef<SecTrustRef> valid_trust_; |
| 110 base::ScopedCFTypeRef<SecTrustRef> invalid_trust_; | 111 base::ScopedCFTypeRef<SecTrustRef> invalid_trust_; |
| 111 net::MockCertVerifier cert_verifier_; | 112 net::MockCertVerifier cert_verifier_; |
| 112 base::scoped_nsobject<CRWCertVerificationController> controller_; | 113 base::scoped_nsobject<CRWCertVerificationController> controller_; |
| 113 }; | 114 }; |
| 114 | 115 |
| 115 // Tests cert policy with a valid cert. | 116 // Tests cert policy with a valid trust. |
| 116 TEST_F(CRWCertVerificationControllerTest, PolicyForValidCert) { | 117 TEST_F(CRWCertVerificationControllerTest, PolicyForValidTrust) { |
| 117 net::CertVerifyResult verify_result; | 118 net::CertVerifyResult verify_result; |
| 118 verify_result.cert_status = net::CERT_STATUS_NO_REVOCATION_MECHANISM; | 119 verify_result.cert_status = net::CERT_STATUS_NO_REVOCATION_MECHANISM; |
| 119 verify_result.verified_cert = cert_; | 120 verify_result.verified_cert = cert_; |
| 120 cert_verifier_.AddResultForCertAndHost(cert_.get(), kHostName.UTF8String, | 121 cert_verifier_.AddResultForCertAndHost(cert_.get(), kHostName.UTF8String, |
| 121 verify_result, net::OK); | 122 verify_result, net::OK); |
| 122 web::CertAcceptPolicy policy = CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR; | 123 web::CertAcceptPolicy policy = CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR; |
| 123 net::CertStatus status; | 124 net::CertStatus status; |
| 124 DecidePolicy(cert_, kHostName, &policy, &status); | 125 DecidePolicy(valid_trust_, kHostName, &policy, &status); |
| 125 EXPECT_EQ(CERT_ACCEPT_POLICY_ALLOW, policy); | 126 EXPECT_EQ(CERT_ACCEPT_POLICY_ALLOW, policy); |
| 126 EXPECT_EQ(verify_result.cert_status, status); | 127 EXPECT_FALSE(status); |
| 127 } | 128 } |
| 128 | 129 |
| 129 // Tests cert policy with an invalid cert. | 130 // Tests cert policy with an invalid trust not accepted by user. |
| 130 TEST_F(CRWCertVerificationControllerTest, PolicyForInvalidCert) { | 131 TEST_F(CRWCertVerificationControllerTest, PolicyForInvalidTrust) { |
| 132 net::CertVerifyResult result; |
| 133 result.cert_status = net::CERT_STATUS_COMMON_NAME_INVALID; |
| 134 result.verified_cert = cert_; |
| 135 cert_verifier_.AddResultForCertAndHost(cert_.get(), kHostName.UTF8String, |
| 136 result, |
| 137 net::ERR_CERT_COMMON_NAME_INVALID); |
| 138 |
| 131 web::CertAcceptPolicy policy = CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR; | 139 web::CertAcceptPolicy policy = CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR; |
| 132 net::CertStatus status; | 140 net::CertStatus status; |
| 133 DecidePolicy(cert_, kHostName, &policy, &status); | 141 DecidePolicy(invalid_trust_, kHostName, &policy, &status); |
| 134 EXPECT_EQ(CERT_ACCEPT_POLICY_RECOVERABLE_ERROR, policy); | 142 EXPECT_EQ(CERT_ACCEPT_POLICY_RECOVERABLE_ERROR_UNDECIDED_BY_USER, policy); |
| 143 EXPECT_EQ(net::CERT_STATUS_COMMON_NAME_INVALID, status); |
| 135 } | 144 } |
| 136 | 145 |
| 137 // Tests cert policy with null cert. | 146 // Tests cert policy with an invalid trust accepted by user. |
| 138 TEST_F(CRWCertVerificationControllerTest, PolicyForNullCert) { | 147 TEST_F(CRWCertVerificationControllerTest, PolicyForInvalidTrustAcceptedByUser) { |
| 148 net::CertVerifyResult result; |
| 149 result.cert_status = net::CERT_STATUS_DATE_INVALID; |
| 150 result.verified_cert = cert_; |
| 151 cert_verifier_.AddResultForCertAndHost(cert_.get(), kHostName.UTF8String, |
| 152 result, net::ERR_CERT_DATE_INVALID); |
| 153 |
| 154 [controller_ allowCert:cert_.get() |
| 155 forHost:kHostName |
| 156 status:net::CERT_STATUS_ALL_ERRORS]; |
| 139 web::CertAcceptPolicy policy = CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR; | 157 web::CertAcceptPolicy policy = CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR; |
| 140 net::CertStatus status; | 158 net::CertStatus status; |
| 141 DecidePolicy(nullptr, kHostName, &policy, &status); | 159 DecidePolicy(invalid_trust_, kHostName, &policy, &status); |
| 142 EXPECT_EQ(CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR, policy); | 160 EXPECT_EQ(CERT_ACCEPT_POLICY_RECOVERABLE_ERROR_ACCEPTED_BY_USER, policy); |
| 161 EXPECT_EQ(net::CERT_STATUS_DATE_INVALID, status); |
| 143 } | 162 } |
| 144 | 163 |
| 145 // Tests cert policy with null cert and null host. | 164 // Tests that allowCert:forHost:status: strips all intermidiate certs. |
| 165 TEST_F(CRWCertVerificationControllerTest, AllowCertIgnoresIntermidiateCerts) { |
| 166 scoped_refptr<net::X509Certificate> cert( |
| 167 net::X509Certificate::CreateFromHandle(cert_->os_cert_handle(), |
| 168 {cert_->os_cert_handle()})); |
| 169 net::CertVerifyResult result; |
| 170 result.cert_status = net::CERT_STATUS_DATE_INVALID; |
| 171 result.verified_cert = cert_; |
| 172 cert_verifier_.AddResultForCertAndHost(cert_.get(), kHostName.UTF8String, |
| 173 result, net::ERR_CERT_DATE_INVALID); |
| 174 |
| 175 [controller_ allowCert:cert.get() |
| 176 forHost:kHostName |
| 177 status:net::CERT_STATUS_ALL_ERRORS]; |
| 178 web::CertAcceptPolicy policy = CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR; |
| 179 net::CertStatus status; |
| 180 DecidePolicy(invalid_trust_, kHostName, &policy, &status); |
| 181 EXPECT_EQ(CERT_ACCEPT_POLICY_RECOVERABLE_ERROR_ACCEPTED_BY_USER, policy); |
| 182 EXPECT_EQ(net::CERT_STATUS_DATE_INVALID, status); |
| 183 } |
| 184 |
| 185 // Tests cert policy with null trust. |
| 186 TEST_F(CRWCertVerificationControllerTest, PolicyForNullTrust) { |
| 187 web::CertAcceptPolicy policy = CERT_ACCEPT_POLICY_ALLOW; |
| 188 net::CertStatus status; |
| 189 base::ScopedCFTypeRef<SecTrustRef> null_trust; |
| 190 DecidePolicy(null_trust, kHostName, &policy, &status); |
| 191 EXPECT_EQ(CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR, policy); |
| 192 EXPECT_FALSE(status); |
| 193 } |
| 194 |
| 195 // Tests cert policy with invalid trust and null host. |
| 146 TEST_F(CRWCertVerificationControllerTest, PolicyForNullHost) { | 196 TEST_F(CRWCertVerificationControllerTest, PolicyForNullHost) { |
| 147 web::CertAcceptPolicy policy = CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR; | 197 web::CertAcceptPolicy policy = CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR; |
| 148 net::CertStatus status; | 198 net::CertStatus status; |
| 149 DecidePolicy(cert_, nil, &policy, &status); | 199 DecidePolicy(invalid_trust_, nil, &policy, &status); |
| 150 EXPECT_EQ(CERT_ACCEPT_POLICY_NON_RECOVERABLE_ERROR, policy); | 200 EXPECT_EQ(CERT_ACCEPT_POLICY_RECOVERABLE_ERROR_UNDECIDED_BY_USER, policy); |
| 201 EXPECT_FALSE(status); |
| 151 } | 202 } |
| 152 | 203 |
| 153 // Tests SSL status with valid trust. | 204 // Tests SSL status with valid trust. |
| 154 TEST_F(CRWCertVerificationControllerTest, SSLStatusForValidTrust) { | 205 TEST_F(CRWCertVerificationControllerTest, SSLStatusForValidTrust) { |
| 155 SecurityStyle style = SECURITY_STYLE_UNKNOWN; | 206 SecurityStyle style = SECURITY_STYLE_UNKNOWN; |
| 156 net::CertStatus status = net::CERT_STATUS_ALL_ERRORS; | 207 net::CertStatus status = net::CERT_STATUS_ALL_ERRORS; |
| 157 | 208 |
| 158 QueryStatus(valid_trust_, kHostName, &style, &status); | 209 QueryStatus(valid_trust_, kHostName, &style, &status); |
| 159 EXPECT_EQ(SECURITY_STYLE_AUTHENTICATED, style); | 210 EXPECT_EQ(SECURITY_STYLE_AUTHENTICATED, style); |
| 160 EXPECT_FALSE(status); | 211 EXPECT_FALSE(status); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 187 | 238 |
| 188 SecurityStyle style = SECURITY_STYLE_UNKNOWN; | 239 SecurityStyle style = SECURITY_STYLE_UNKNOWN; |
| 189 net::CertStatus status = net::CERT_STATUS_ALL_ERRORS; | 240 net::CertStatus status = net::CERT_STATUS_ALL_ERRORS; |
| 190 | 241 |
| 191 QueryStatus(invalid_trust_, kHostName, &style, &status); | 242 QueryStatus(invalid_trust_, kHostName, &style, &status); |
| 192 EXPECT_EQ(SECURITY_STYLE_AUTHENTICATION_BROKEN, style); | 243 EXPECT_EQ(SECURITY_STYLE_AUTHENTICATION_BROKEN, style); |
| 193 EXPECT_EQ(net::CERT_STATUS_DATE_INVALID, status); | 244 EXPECT_EQ(net::CERT_STATUS_DATE_INVALID, status); |
| 194 } | 245 } |
| 195 | 246 |
| 196 } // namespace web | 247 } // namespace web |
| OLD | NEW |