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 "components/security_state/security_state_model.h" | 5 #include "components/security_state/security_state_model.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/metrics/field_trial.h" | 10 #include "base/metrics/field_trial.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 static const int64_t kJanuary2017 = INT64_C(13127702400000000); | 65 static const int64_t kJanuary2017 = INT64_C(13127702400000000); |
66 if (cert->valid_expiry() >= base::Time::FromInternalValue(kJanuary2017)) | 66 if (cert->valid_expiry() >= base::Time::FromInternalValue(kJanuary2017)) |
67 return SecurityStateModel::DEPRECATED_SHA1_MAJOR; | 67 return SecurityStateModel::DEPRECATED_SHA1_MAJOR; |
68 static const int64_t kJanuary2016 = INT64_C(13096080000000000); | 68 static const int64_t kJanuary2016 = INT64_C(13096080000000000); |
69 if (cert->valid_expiry() >= base::Time::FromInternalValue(kJanuary2016)) | 69 if (cert->valid_expiry() >= base::Time::FromInternalValue(kJanuary2016)) |
70 return SecurityStateModel::DEPRECATED_SHA1_MINOR; | 70 return SecurityStateModel::DEPRECATED_SHA1_MINOR; |
71 | 71 |
72 return SecurityStateModel::NO_DEPRECATED_SHA1; | 72 return SecurityStateModel::NO_DEPRECATED_SHA1; |
73 } | 73 } |
74 | 74 |
75 SecurityStateModel::ContentStatus GetMixedContentStatus( | 75 SecurityStateModel::ContentStatus GetContentStatus(bool displayed, bool ran) { |
76 const SecurityStateModel::VisibleSecurityState& visible_security_state) { | 76 if (ran && displayed) |
77 bool ran_insecure_content = visible_security_state.ran_mixed_content; | |
78 bool displayed_insecure_content = | |
79 visible_security_state.displayed_mixed_content; | |
80 if (ran_insecure_content && displayed_insecure_content) | |
81 return SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN; | 77 return SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN; |
82 if (ran_insecure_content) | 78 if (ran) |
83 return SecurityStateModel::CONTENT_STATUS_RAN; | 79 return SecurityStateModel::CONTENT_STATUS_RAN; |
84 if (displayed_insecure_content) | 80 if (displayed) |
85 return SecurityStateModel::CONTENT_STATUS_DISPLAYED; | 81 return SecurityStateModel::CONTENT_STATUS_DISPLAYED; |
86 | |
87 return SecurityStateModel::CONTENT_STATUS_NONE; | 82 return SecurityStateModel::CONTENT_STATUS_NONE; |
88 } | 83 } |
89 | 84 |
90 SecurityStateModel::SecurityLevel GetSecurityLevelForRequest( | 85 SecurityStateModel::SecurityLevel GetSecurityLevelForRequest( |
91 const SecurityStateModel::VisibleSecurityState& visible_security_state, | 86 const SecurityStateModel::VisibleSecurityState& visible_security_state, |
92 SecurityStateModelClient* client, | 87 SecurityStateModelClient* client, |
93 const scoped_refptr<net::X509Certificate>& cert, | 88 const scoped_refptr<net::X509Certificate>& cert, |
94 SecurityStateModel::SHA1DeprecationStatus sha1_status, | 89 SecurityStateModel::SHA1DeprecationStatus sha1_status, |
95 SecurityStateModel::ContentStatus mixed_content_status) { | 90 SecurityStateModel::ContentStatus mixed_content_status, |
| 91 SecurityStateModel::ContentStatus content_with_cert_errors_status) { |
96 DCHECK(visible_security_state.initialized); | 92 DCHECK(visible_security_state.initialized); |
97 GURL url = visible_security_state.url; | 93 GURL url = visible_security_state.url; |
98 switch (visible_security_state.initial_security_level) { | 94 switch (visible_security_state.initial_security_level) { |
99 case SecurityStateModel::NONE: { | 95 case SecurityStateModel::NONE: { |
100 if (!client->IsOriginSecure(url) && url.IsStandard()) | 96 if (!client->IsOriginSecure(url) && url.IsStandard()) |
101 return GetSecurityLevelForNonSecureFieldTrial(); | 97 return GetSecurityLevelForNonSecureFieldTrial(); |
102 return SecurityStateModel::NONE; | 98 return SecurityStateModel::NONE; |
103 } | 99 } |
104 | 100 |
105 case SecurityStateModel::SECURITY_ERROR: | 101 case SecurityStateModel::SECURITY_ERROR: |
106 return SecurityStateModel::SECURITY_ERROR; | 102 return SecurityStateModel::SECURITY_ERROR; |
107 | 103 |
108 case SecurityStateModel::SECURITY_WARNING: | 104 case SecurityStateModel::SECURITY_WARNING: |
109 case SecurityStateModel::SECURITY_POLICY_WARNING: | 105 case SecurityStateModel::SECURITY_POLICY_WARNING: |
110 return visible_security_state.initial_security_level; | 106 return visible_security_state.initial_security_level; |
111 | 107 |
112 case SecurityStateModel::SECURE: | 108 case SecurityStateModel::SECURE: |
113 case SecurityStateModel::EV_SECURE: { | 109 case SecurityStateModel::EV_SECURE: { |
114 // Major cert errors and active mixed content will generally be | 110 // Major cert errors and active mixed content will generally be |
115 // downgraded by the embedder to SECURITY_ERROR and handled above, | 111 // downgraded by the embedder to SECURITY_ERROR and handled above, |
116 // but downgrade here just in case. | 112 // but downgrade here just in case. |
117 net::CertStatus cert_status = visible_security_state.cert_status; | 113 net::CertStatus cert_status = visible_security_state.cert_status; |
118 if (net::IsCertStatusError(cert_status) && | 114 if (net::IsCertStatusError(cert_status) && |
119 !net::IsCertStatusMinorError(cert_status)) { | 115 !net::IsCertStatusMinorError(cert_status)) { |
120 return SecurityStateModel::SECURITY_ERROR; | 116 return SecurityStateModel::SECURITY_ERROR; |
121 } | 117 } |
122 if (mixed_content_status == SecurityStateModel::CONTENT_STATUS_RAN || | 118 if (mixed_content_status == SecurityStateModel::CONTENT_STATUS_RAN || |
123 mixed_content_status == | 119 mixed_content_status == |
| 120 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN || |
| 121 content_with_cert_errors_status == |
| 122 SecurityStateModel::CONTENT_STATUS_RAN || |
| 123 content_with_cert_errors_status == |
124 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN) { | 124 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN) { |
125 return SecurityStateModel::kRanInsecureContentLevel; | 125 return SecurityStateModel::kRanInsecureContentLevel; |
126 } | 126 } |
127 | 127 |
128 // Report if there is a policy cert first, before reporting any other | 128 // Report if there is a policy cert first, before reporting any other |
129 // authenticated-but-with-errors cases. A policy cert is a strong | 129 // authenticated-but-with-errors cases. A policy cert is a strong |
130 // indicator of a MITM being present (the enterprise), while the | 130 // indicator of a MITM being present (the enterprise), while the |
131 // other authenticated-but-with-errors indicate something may | 131 // other authenticated-but-with-errors indicate something may |
132 // be wrong, or may be wrong in the future, but is unclear now. | 132 // be wrong, or may be wrong in the future, but is unclear now. |
133 if (client->UsedPolicyInstalledCertificate()) | 133 if (client->UsedPolicyInstalledCertificate()) |
134 return SecurityStateModel::SECURITY_POLICY_WARNING; | 134 return SecurityStateModel::SECURITY_POLICY_WARNING; |
135 | 135 |
136 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MAJOR) | 136 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MAJOR) |
137 return SecurityStateModel::SECURITY_ERROR; | 137 return SecurityStateModel::SECURITY_ERROR; |
138 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MINOR) | 138 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MINOR) |
139 return SecurityStateModel::NONE; | 139 return SecurityStateModel::NONE; |
140 | 140 |
141 // Active mixed content is handled above. | 141 // Active mixed content is handled above. |
142 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_RAN, mixed_content_status); | 142 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_RAN, mixed_content_status); |
143 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN, | 143 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN, |
144 mixed_content_status); | 144 mixed_content_status); |
145 if (mixed_content_status == SecurityStateModel::CONTENT_STATUS_DISPLAYED) | 145 if (mixed_content_status == |
| 146 SecurityStateModel::CONTENT_STATUS_DISPLAYED || |
| 147 content_with_cert_errors_status == |
| 148 SecurityStateModel::CONTENT_STATUS_DISPLAYED) |
146 return SecurityStateModel::kDisplayedInsecureContentLevel; | 149 return SecurityStateModel::kDisplayedInsecureContentLevel; |
147 | 150 |
148 if (net::IsCertStatusError(cert_status)) { | 151 if (net::IsCertStatusError(cert_status)) { |
149 // Major cert errors are handled above. | 152 // Major cert errors are handled above. |
150 DCHECK(net::IsCertStatusMinorError(cert_status)); | 153 DCHECK(net::IsCertStatusMinorError(cert_status)); |
151 return SecurityStateModel::NONE; | 154 return SecurityStateModel::NONE; |
152 } | 155 } |
153 if (net::SSLConnectionStatusToVersion( | 156 if (net::SSLConnectionStatusToVersion( |
154 visible_security_state.connection_status) == | 157 visible_security_state.connection_status) == |
155 net::SSL_CONNECTION_VERSION_SSL3) { | 158 net::SSL_CONNECTION_VERSION_SSL3) { |
(...skipping 15 matching lines...) Expand all Loading... |
171 const scoped_refptr<net::X509Certificate>& cert, | 174 const scoped_refptr<net::X509Certificate>& cert, |
172 SecurityStateModel::SecurityInfo* security_info) { | 175 SecurityStateModel::SecurityInfo* security_info) { |
173 if (!visible_security_state.initialized) { | 176 if (!visible_security_state.initialized) { |
174 *security_info = SecurityStateModel::SecurityInfo(); | 177 *security_info = SecurityStateModel::SecurityInfo(); |
175 return; | 178 return; |
176 } | 179 } |
177 security_info->cert_id = visible_security_state.cert_id; | 180 security_info->cert_id = visible_security_state.cert_id; |
178 security_info->sha1_deprecation_status = | 181 security_info->sha1_deprecation_status = |
179 GetSHA1DeprecationStatus(cert, visible_security_state); | 182 GetSHA1DeprecationStatus(cert, visible_security_state); |
180 security_info->mixed_content_status = | 183 security_info->mixed_content_status = |
181 GetMixedContentStatus(visible_security_state); | 184 GetContentStatus(visible_security_state.displayed_mixed_content, |
| 185 visible_security_state.ran_mixed_content); |
| 186 security_info->content_with_cert_errors_status = GetContentStatus( |
| 187 visible_security_state.displayed_content_with_cert_errors, |
| 188 visible_security_state.ran_content_with_cert_errors); |
182 security_info->security_bits = visible_security_state.security_bits; | 189 security_info->security_bits = visible_security_state.security_bits; |
183 security_info->connection_status = visible_security_state.connection_status; | 190 security_info->connection_status = visible_security_state.connection_status; |
184 security_info->cert_status = visible_security_state.cert_status; | 191 security_info->cert_status = visible_security_state.cert_status; |
185 security_info->scheme_is_cryptographic = | 192 security_info->scheme_is_cryptographic = |
186 visible_security_state.url.SchemeIsCryptographic(); | 193 visible_security_state.url.SchemeIsCryptographic(); |
187 security_info->pkp_bypassed = visible_security_state.pkp_bypassed; | 194 security_info->pkp_bypassed = visible_security_state.pkp_bypassed; |
188 security_info->is_secure_protocol_and_ciphersuite = | 195 security_info->is_secure_protocol_and_ciphersuite = |
189 (net::SSLConnectionStatusToVersion(security_info->connection_status) >= | 196 (net::SSLConnectionStatusToVersion(security_info->connection_status) >= |
190 net::SSL_CONNECTION_VERSION_TLS1_2 && | 197 net::SSL_CONNECTION_VERSION_TLS1_2 && |
191 net::IsSecureTLSCipherSuite(net::SSLConnectionStatusToCipherSuite( | 198 net::IsSecureTLSCipherSuite(net::SSLConnectionStatusToCipherSuite( |
192 security_info->connection_status))); | 199 security_info->connection_status))); |
193 | 200 |
194 security_info->sct_verify_statuses = | 201 security_info->sct_verify_statuses = |
195 visible_security_state.sct_verify_statuses; | 202 visible_security_state.sct_verify_statuses; |
196 | 203 |
197 security_info->security_level = | 204 security_info->security_level = GetSecurityLevelForRequest( |
198 GetSecurityLevelForRequest(visible_security_state, client, cert, | 205 visible_security_state, client, cert, |
199 security_info->sha1_deprecation_status, | 206 security_info->sha1_deprecation_status, |
200 security_info->mixed_content_status); | 207 security_info->mixed_content_status, |
| 208 security_info->content_with_cert_errors_status); |
201 } | 209 } |
202 | 210 |
203 } // namespace | 211 } // namespace |
204 | 212 |
205 const SecurityStateModel::SecurityLevel | 213 const SecurityStateModel::SecurityLevel |
206 SecurityStateModel::kDisplayedInsecureContentLevel = | 214 SecurityStateModel::kDisplayedInsecureContentLevel = |
207 SecurityStateModel::NONE; | 215 SecurityStateModel::NONE; |
208 const SecurityStateModel::SecurityLevel | 216 const SecurityStateModel::SecurityLevel |
209 SecurityStateModel::kRanInsecureContentLevel = | 217 SecurityStateModel::kRanInsecureContentLevel = |
210 SecurityStateModel::SECURITY_ERROR; | 218 SecurityStateModel::SECURITY_ERROR; |
211 | 219 |
212 SecurityStateModel::SecurityInfo::SecurityInfo() | 220 SecurityStateModel::SecurityInfo::SecurityInfo() |
213 : security_level(SecurityStateModel::NONE), | 221 : security_level(SecurityStateModel::NONE), |
214 sha1_deprecation_status(SecurityStateModel::NO_DEPRECATED_SHA1), | 222 sha1_deprecation_status(SecurityStateModel::NO_DEPRECATED_SHA1), |
215 mixed_content_status(SecurityStateModel::CONTENT_STATUS_NONE), | 223 mixed_content_status(SecurityStateModel::CONTENT_STATUS_NONE), |
| 224 content_with_cert_errors_status(SecurityStateModel::CONTENT_STATUS_NONE), |
216 scheme_is_cryptographic(false), | 225 scheme_is_cryptographic(false), |
217 cert_status(0), | 226 cert_status(0), |
218 cert_id(0), | 227 cert_id(0), |
219 security_bits(-1), | 228 security_bits(-1), |
220 connection_status(0), | 229 connection_status(0), |
221 is_secure_protocol_and_ciphersuite(false), | 230 is_secure_protocol_and_ciphersuite(false), |
222 pkp_bypassed(false) {} | 231 pkp_bypassed(false) {} |
223 | 232 |
224 SecurityStateModel::SecurityInfo::~SecurityInfo() {} | 233 SecurityStateModel::SecurityInfo::~SecurityInfo() {} |
225 | 234 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 | 268 |
260 SecurityStateModel::VisibleSecurityState::VisibleSecurityState() | 269 SecurityStateModel::VisibleSecurityState::VisibleSecurityState() |
261 : initialized(false), | 270 : initialized(false), |
262 initial_security_level(SecurityStateModel::NONE), | 271 initial_security_level(SecurityStateModel::NONE), |
263 cert_id(0), | 272 cert_id(0), |
264 cert_status(0), | 273 cert_status(0), |
265 connection_status(0), | 274 connection_status(0), |
266 security_bits(-1), | 275 security_bits(-1), |
267 displayed_mixed_content(false), | 276 displayed_mixed_content(false), |
268 ran_mixed_content(false), | 277 ran_mixed_content(false), |
| 278 displayed_content_with_cert_errors(false), |
| 279 ran_content_with_cert_errors(false), |
269 pkp_bypassed(false) {} | 280 pkp_bypassed(false) {} |
270 | 281 |
271 SecurityStateModel::VisibleSecurityState::~VisibleSecurityState() {} | 282 SecurityStateModel::VisibleSecurityState::~VisibleSecurityState() {} |
272 | 283 |
273 bool SecurityStateModel::VisibleSecurityState::operator==( | 284 bool SecurityStateModel::VisibleSecurityState::operator==( |
274 const SecurityStateModel::VisibleSecurityState& other) const { | 285 const SecurityStateModel::VisibleSecurityState& other) const { |
275 return (url == other.url && | 286 return (url == other.url && |
276 initial_security_level == other.initial_security_level && | 287 initial_security_level == other.initial_security_level && |
277 cert_id == other.cert_id && cert_status == other.cert_status && | 288 cert_id == other.cert_id && cert_status == other.cert_status && |
278 connection_status == other.connection_status && | 289 connection_status == other.connection_status && |
279 security_bits == other.security_bits && | 290 security_bits == other.security_bits && |
280 sct_verify_statuses == other.sct_verify_statuses && | 291 sct_verify_statuses == other.sct_verify_statuses && |
281 displayed_mixed_content == other.displayed_mixed_content && | 292 displayed_mixed_content == other.displayed_mixed_content && |
282 ran_mixed_content == other.ran_mixed_content && | 293 ran_mixed_content == other.ran_mixed_content && |
| 294 displayed_content_with_cert_errors == |
| 295 other.displayed_content_with_cert_errors && |
| 296 ran_content_with_cert_errors == other.ran_content_with_cert_errors && |
283 pkp_bypassed == other.pkp_bypassed); | 297 pkp_bypassed == other.pkp_bypassed); |
284 } | 298 } |
285 | 299 |
286 } // namespace security_state | 300 } // namespace security_state |
OLD | NEW |