| 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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 if (ran_insecure_content && displayed_insecure_content) | 80 if (ran_insecure_content && displayed_insecure_content) |
| 81 return SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT; | 81 return SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT; |
| 82 if (ran_insecure_content) | 82 if (ran_insecure_content) |
| 83 return SecurityStateModel::RAN_MIXED_CONTENT; | 83 return SecurityStateModel::RAN_MIXED_CONTENT; |
| 84 if (displayed_insecure_content) | 84 if (displayed_insecure_content) |
| 85 return SecurityStateModel::DISPLAYED_MIXED_CONTENT; | 85 return SecurityStateModel::DISPLAYED_MIXED_CONTENT; |
| 86 | 86 |
| 87 return SecurityStateModel::NO_MIXED_CONTENT; | 87 return SecurityStateModel::NO_MIXED_CONTENT; |
| 88 } | 88 } |
| 89 | 89 |
| 90 SecurityStateModel::ContentWithCertErrorsStatus GetContentWithCertErrorsStatus( |
| 91 const SecurityStateModel::VisibleSecurityState& visible_security_state) { |
| 92 bool ran = visible_security_state.ran_content_with_certificate_errors; |
| 93 bool displayed = |
| 94 visible_security_state.displayed_content_with_certificate_errors; |
| 95 if (ran && displayed) |
| 96 return SecurityStateModel:: |
| 97 RAN_AND_DISPLAYED_CONTENT_WITH_CERTIFICATE_ERRORS; |
| 98 if (ran) |
| 99 return SecurityStateModel::RAN_CONTENT_WITH_CERTIFICATE_ERRORS; |
| 100 if (displayed) |
| 101 return SecurityStateModel::DISPLAYED_CONTENT_WITH_CERTIFICATE_ERRORS; |
| 102 |
| 103 return SecurityStateModel::NO_CONTENT_WITH_CERTIFICATE_ERRORS; |
| 104 } |
| 105 |
| 90 SecurityStateModel::SecurityLevel GetSecurityLevelForRequest( | 106 SecurityStateModel::SecurityLevel GetSecurityLevelForRequest( |
| 91 const SecurityStateModel::VisibleSecurityState& visible_security_state, | 107 const SecurityStateModel::VisibleSecurityState& visible_security_state, |
| 92 SecurityStateModelClient* client, | 108 SecurityStateModelClient* client, |
| 93 const scoped_refptr<net::X509Certificate>& cert, | 109 const scoped_refptr<net::X509Certificate>& cert, |
| 94 SecurityStateModel::SHA1DeprecationStatus sha1_status, | 110 SecurityStateModel::SHA1DeprecationStatus sha1_status, |
| 95 SecurityStateModel::MixedContentStatus mixed_content_status) { | 111 SecurityStateModel::MixedContentStatus mixed_content_status, |
| 112 SecurityStateModel::ContentWithCertErrorsStatus |
| 113 content_with_cert_errors_status) { |
| 96 DCHECK(visible_security_state.initialized); | 114 DCHECK(visible_security_state.initialized); |
| 97 GURL url = visible_security_state.url; | 115 GURL url = visible_security_state.url; |
| 98 switch (visible_security_state.initial_security_level) { | 116 switch (visible_security_state.initial_security_level) { |
| 99 case SecurityStateModel::NONE: { | 117 case SecurityStateModel::NONE: { |
| 100 if (!client->IsOriginSecure(url) && url.IsStandard()) | 118 if (!client->IsOriginSecure(url) && url.IsStandard()) |
| 101 return GetSecurityLevelForNonSecureFieldTrial(); | 119 return GetSecurityLevelForNonSecureFieldTrial(); |
| 102 return SecurityStateModel::NONE; | 120 return SecurityStateModel::NONE; |
| 103 } | 121 } |
| 104 | 122 |
| 105 case SecurityStateModel::SECURITY_ERROR: | 123 case SecurityStateModel::SECURITY_ERROR: |
| 106 return SecurityStateModel::SECURITY_ERROR; | 124 return SecurityStateModel::SECURITY_ERROR; |
| 107 | 125 |
| 108 case SecurityStateModel::SECURITY_WARNING: | 126 case SecurityStateModel::SECURITY_WARNING: |
| 109 case SecurityStateModel::SECURITY_POLICY_WARNING: | 127 case SecurityStateModel::SECURITY_POLICY_WARNING: |
| 110 return visible_security_state.initial_security_level; | 128 return visible_security_state.initial_security_level; |
| 111 | 129 |
| 112 case SecurityStateModel::SECURE: | 130 case SecurityStateModel::SECURE: |
| 113 case SecurityStateModel::EV_SECURE: { | 131 case SecurityStateModel::EV_SECURE: { |
| 114 // Major cert errors and active mixed content will generally be | 132 // Major cert errors and active mixed content will generally be |
| 115 // downgraded by the embedder to SECURITY_ERROR and handled above, | 133 // downgraded by the embedder to SECURITY_ERROR and handled above, |
| 116 // but downgrade here just in case. | 134 // but downgrade here just in case. |
| 117 net::CertStatus cert_status = visible_security_state.cert_status; | 135 net::CertStatus cert_status = visible_security_state.cert_status; |
| 118 if (net::IsCertStatusError(cert_status) && | 136 if (net::IsCertStatusError(cert_status) && |
| 119 !net::IsCertStatusMinorError(cert_status)) { | 137 !net::IsCertStatusMinorError(cert_status)) { |
| 120 return SecurityStateModel::SECURITY_ERROR; | 138 return SecurityStateModel::SECURITY_ERROR; |
| 121 } | 139 } |
| 122 if (mixed_content_status == SecurityStateModel::RAN_MIXED_CONTENT || | 140 if (mixed_content_status == SecurityStateModel::RAN_MIXED_CONTENT || |
| 123 mixed_content_status == | 141 mixed_content_status == |
| 124 SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT) { | 142 SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT || |
| 143 content_with_cert_errors_status == |
| 144 SecurityStateModel::RAN_CONTENT_WITH_CERTIFICATE_ERRORS || |
| 145 content_with_cert_errors_status == |
| 146 SecurityStateModel:: |
| 147 RAN_AND_DISPLAYED_CONTENT_WITH_CERTIFICATE_ERRORS) { |
| 125 return SecurityStateModel::kRanInsecureContentLevel; | 148 return SecurityStateModel::kRanInsecureContentLevel; |
| 126 } | 149 } |
| 127 | 150 |
| 128 // Report if there is a policy cert first, before reporting any other | 151 // Report if there is a policy cert first, before reporting any other |
| 129 // authenticated-but-with-errors cases. A policy cert is a strong | 152 // authenticated-but-with-errors cases. A policy cert is a strong |
| 130 // indicator of a MITM being present (the enterprise), while the | 153 // indicator of a MITM being present (the enterprise), while the |
| 131 // other authenticated-but-with-errors indicate something may | 154 // other authenticated-but-with-errors indicate something may |
| 132 // be wrong, or may be wrong in the future, but is unclear now. | 155 // be wrong, or may be wrong in the future, but is unclear now. |
| 133 if (client->UsedPolicyInstalledCertificate()) | 156 if (client->UsedPolicyInstalledCertificate()) |
| 134 return SecurityStateModel::SECURITY_POLICY_WARNING; | 157 return SecurityStateModel::SECURITY_POLICY_WARNING; |
| 135 | 158 |
| 136 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MAJOR) | 159 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MAJOR) |
| 137 return SecurityStateModel::SECURITY_ERROR; | 160 return SecurityStateModel::SECURITY_ERROR; |
| 138 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MINOR) | 161 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MINOR) |
| 139 return SecurityStateModel::NONE; | 162 return SecurityStateModel::NONE; |
| 140 | 163 |
| 141 // Active mixed content is handled above. | 164 // Active mixed content is handled above. |
| 142 DCHECK_NE(SecurityStateModel::RAN_MIXED_CONTENT, mixed_content_status); | 165 DCHECK_NE(SecurityStateModel::RAN_MIXED_CONTENT, mixed_content_status); |
| 143 DCHECK_NE(SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT, | 166 DCHECK_NE(SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT, |
| 144 mixed_content_status); | 167 mixed_content_status); |
| 145 if (mixed_content_status == SecurityStateModel::DISPLAYED_MIXED_CONTENT) | 168 if (mixed_content_status == SecurityStateModel::DISPLAYED_MIXED_CONTENT || |
| 169 content_with_cert_errors_status == |
| 170 SecurityStateModel::DISPLAYED_CONTENT_WITH_CERTIFICATE_ERRORS) |
| 146 return SecurityStateModel::kDisplayedInsecureContentLevel; | 171 return SecurityStateModel::kDisplayedInsecureContentLevel; |
| 147 | 172 |
| 148 if (net::IsCertStatusError(cert_status)) { | 173 if (net::IsCertStatusError(cert_status)) { |
| 149 // Major cert errors are handled above. | 174 // Major cert errors are handled above. |
| 150 DCHECK(net::IsCertStatusMinorError(cert_status)); | 175 DCHECK(net::IsCertStatusMinorError(cert_status)); |
| 151 return SecurityStateModel::NONE; | 176 return SecurityStateModel::NONE; |
| 152 } | 177 } |
| 153 if (net::SSLConnectionStatusToVersion( | 178 if (net::SSLConnectionStatusToVersion( |
| 154 visible_security_state.connection_status) == | 179 visible_security_state.connection_status) == |
| 155 net::SSL_CONNECTION_VERSION_SSL3) { | 180 net::SSL_CONNECTION_VERSION_SSL3) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 172 SecurityStateModel::SecurityInfo* security_info) { | 197 SecurityStateModel::SecurityInfo* security_info) { |
| 173 if (!visible_security_state.initialized) { | 198 if (!visible_security_state.initialized) { |
| 174 *security_info = SecurityStateModel::SecurityInfo(); | 199 *security_info = SecurityStateModel::SecurityInfo(); |
| 175 return; | 200 return; |
| 176 } | 201 } |
| 177 security_info->cert_id = visible_security_state.cert_id; | 202 security_info->cert_id = visible_security_state.cert_id; |
| 178 security_info->sha1_deprecation_status = | 203 security_info->sha1_deprecation_status = |
| 179 GetSHA1DeprecationStatus(cert, visible_security_state); | 204 GetSHA1DeprecationStatus(cert, visible_security_state); |
| 180 security_info->mixed_content_status = | 205 security_info->mixed_content_status = |
| 181 GetMixedContentStatus(visible_security_state); | 206 GetMixedContentStatus(visible_security_state); |
| 207 security_info->content_with_cert_errors_status = |
| 208 GetContentWithCertErrorsStatus(visible_security_state); |
| 182 security_info->security_bits = visible_security_state.security_bits; | 209 security_info->security_bits = visible_security_state.security_bits; |
| 183 security_info->connection_status = visible_security_state.connection_status; | 210 security_info->connection_status = visible_security_state.connection_status; |
| 184 security_info->cert_status = visible_security_state.cert_status; | 211 security_info->cert_status = visible_security_state.cert_status; |
| 185 security_info->scheme_is_cryptographic = | 212 security_info->scheme_is_cryptographic = |
| 186 visible_security_state.url.SchemeIsCryptographic(); | 213 visible_security_state.url.SchemeIsCryptographic(); |
| 187 security_info->pkp_bypassed = visible_security_state.pkp_bypassed; | 214 security_info->pkp_bypassed = visible_security_state.pkp_bypassed; |
| 188 security_info->is_secure_protocol_and_ciphersuite = | 215 security_info->is_secure_protocol_and_ciphersuite = |
| 189 (net::SSLConnectionStatusToVersion(security_info->connection_status) >= | 216 (net::SSLConnectionStatusToVersion(security_info->connection_status) >= |
| 190 net::SSL_CONNECTION_VERSION_TLS1_2 && | 217 net::SSL_CONNECTION_VERSION_TLS1_2 && |
| 191 net::IsSecureTLSCipherSuite(net::SSLConnectionStatusToCipherSuite( | 218 net::IsSecureTLSCipherSuite(net::SSLConnectionStatusToCipherSuite( |
| 192 security_info->connection_status))); | 219 security_info->connection_status))); |
| 193 | 220 |
| 194 security_info->sct_verify_statuses = | 221 security_info->sct_verify_statuses = |
| 195 visible_security_state.sct_verify_statuses; | 222 visible_security_state.sct_verify_statuses; |
| 196 | 223 |
| 197 security_info->security_level = | 224 security_info->security_level = GetSecurityLevelForRequest( |
| 198 GetSecurityLevelForRequest(visible_security_state, client, cert, | 225 visible_security_state, client, cert, |
| 199 security_info->sha1_deprecation_status, | 226 security_info->sha1_deprecation_status, |
| 200 security_info->mixed_content_status); | 227 security_info->mixed_content_status, |
| 228 security_info->content_with_cert_errors_status); |
| 201 } | 229 } |
| 202 | 230 |
| 203 } // namespace | 231 } // namespace |
| 204 | 232 |
| 205 const SecurityStateModel::SecurityLevel | 233 const SecurityStateModel::SecurityLevel |
| 206 SecurityStateModel::kDisplayedInsecureContentLevel = | 234 SecurityStateModel::kDisplayedInsecureContentLevel = |
| 207 SecurityStateModel::NONE; | 235 SecurityStateModel::NONE; |
| 208 const SecurityStateModel::SecurityLevel | 236 const SecurityStateModel::SecurityLevel |
| 209 SecurityStateModel::kRanInsecureContentLevel = | 237 SecurityStateModel::kRanInsecureContentLevel = |
| 210 SecurityStateModel::SECURITY_ERROR; | 238 SecurityStateModel::SECURITY_ERROR; |
| 211 | 239 |
| 212 SecurityStateModel::SecurityInfo::SecurityInfo() | 240 SecurityStateModel::SecurityInfo::SecurityInfo() |
| 213 : security_level(SecurityStateModel::NONE), | 241 : security_level(SecurityStateModel::NONE), |
| 214 sha1_deprecation_status(SecurityStateModel::NO_DEPRECATED_SHA1), | 242 sha1_deprecation_status(SecurityStateModel::NO_DEPRECATED_SHA1), |
| 215 mixed_content_status(SecurityStateModel::NO_MIXED_CONTENT), | 243 mixed_content_status(SecurityStateModel::NO_MIXED_CONTENT), |
| 244 content_with_cert_errors_status( |
| 245 SecurityStateModel::NO_CONTENT_WITH_CERTIFICATE_ERRORS), |
| 216 scheme_is_cryptographic(false), | 246 scheme_is_cryptographic(false), |
| 217 cert_status(0), | 247 cert_status(0), |
| 218 cert_id(0), | 248 cert_id(0), |
| 219 security_bits(-1), | 249 security_bits(-1), |
| 220 connection_status(0), | 250 connection_status(0), |
| 221 is_secure_protocol_and_ciphersuite(false), | 251 is_secure_protocol_and_ciphersuite(false), |
| 222 pkp_bypassed(false) {} | 252 pkp_bypassed(false) {} |
| 223 | 253 |
| 224 SecurityStateModel::SecurityInfo::~SecurityInfo() {} | 254 SecurityStateModel::SecurityInfo::~SecurityInfo() {} |
| 225 | 255 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 | 289 |
| 260 SecurityStateModel::VisibleSecurityState::VisibleSecurityState() | 290 SecurityStateModel::VisibleSecurityState::VisibleSecurityState() |
| 261 : initialized(false), | 291 : initialized(false), |
| 262 initial_security_level(SecurityStateModel::NONE), | 292 initial_security_level(SecurityStateModel::NONE), |
| 263 cert_id(0), | 293 cert_id(0), |
| 264 cert_status(0), | 294 cert_status(0), |
| 265 connection_status(0), | 295 connection_status(0), |
| 266 security_bits(-1), | 296 security_bits(-1), |
| 267 displayed_mixed_content(false), | 297 displayed_mixed_content(false), |
| 268 ran_mixed_content(false), | 298 ran_mixed_content(false), |
| 269 pkp_bypassed(false) {} | 299 pkp_bypassed(false), |
| 300 displayed_content_with_certificate_errors(false), |
| 301 ran_content_with_certificate_errors(false) {} |
| 270 | 302 |
| 271 SecurityStateModel::VisibleSecurityState::~VisibleSecurityState() {} | 303 SecurityStateModel::VisibleSecurityState::~VisibleSecurityState() {} |
| 272 | 304 |
| 273 bool SecurityStateModel::VisibleSecurityState::operator==( | 305 bool SecurityStateModel::VisibleSecurityState::operator==( |
| 274 const SecurityStateModel::VisibleSecurityState& other) const { | 306 const SecurityStateModel::VisibleSecurityState& other) const { |
| 275 return (url == other.url && | 307 return (url == other.url && |
| 276 initial_security_level == other.initial_security_level && | 308 initial_security_level == other.initial_security_level && |
| 277 cert_id == other.cert_id && cert_status == other.cert_status && | 309 cert_id == other.cert_id && cert_status == other.cert_status && |
| 278 connection_status == other.connection_status && | 310 connection_status == other.connection_status && |
| 279 security_bits == other.security_bits && | 311 security_bits == other.security_bits && |
| 280 sct_verify_statuses == other.sct_verify_statuses && | 312 sct_verify_statuses == other.sct_verify_statuses && |
| 281 displayed_mixed_content == other.displayed_mixed_content && | 313 displayed_mixed_content == other.displayed_mixed_content && |
| 282 ran_mixed_content == other.ran_mixed_content && | 314 ran_mixed_content == other.ran_mixed_content && |
| 283 pkp_bypassed == other.pkp_bypassed); | 315 pkp_bypassed == other.pkp_bypassed && |
| 316 displayed_content_with_certificate_errors == |
| 317 other.displayed_content_with_certificate_errors && |
| 318 ran_content_with_certificate_errors == |
| 319 other.ran_content_with_certificate_errors); |
| 284 } | 320 } |
| 285 | 321 |
| 286 } // namespace security_state | 322 } // namespace security_state |
| OLD | NEW |