Chromium Code Reviews| 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/core/security_state.h" | 5 #include "components/security_state/core/security_state.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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 77 // nonsecure defaults to neutral. | 77 // nonsecure defaults to neutral. |
| 78 status = NEUTRAL; | 78 status = NEUTRAL; |
| 79 level = NONE; | 79 level = NONE; |
| 80 } | 80 } |
| 81 } | 81 } |
| 82 | 82 |
| 83 UMA_HISTOGRAM_ENUMERATION(kEnumeration, status, LAST_STATUS); | 83 UMA_HISTOGRAM_ENUMERATION(kEnumeration, status, LAST_STATUS); |
| 84 return level; | 84 return level; |
| 85 } | 85 } |
| 86 | 86 |
| 87 SHA1DeprecationStatus GetSHA1DeprecationStatus( | 87 bool GetSHA1InChain(const VisibleSecurityState& visible_security_state) { |
| 88 const VisibleSecurityState& visible_security_state) { | |
| 89 if (!visible_security_state.certificate || | 88 if (!visible_security_state.certificate || |
| 90 !(visible_security_state.cert_status & | 89 !(visible_security_state.cert_status & |
| 91 net::CERT_STATUS_SHA1_SIGNATURE_PRESENT)) | 90 net::CERT_STATUS_SHA1_SIGNATURE_PRESENT)) |
| 92 return NO_DEPRECATED_SHA1; | 91 return false; |
| 93 | 92 |
| 94 // The internal representation of the dates for UI treatment of SHA-1. | 93 return true; |
|
estark
2017/01/08 16:39:58
nit: could simplify as
return visible_security_st
elawrence
2017/01/09 18:13:11
Done.
| |
| 95 // See http://crbug.com/401365 for details. | |
| 96 static const int64_t kJanuary2017 = INT64_C(13127702400000000); | |
| 97 if (visible_security_state.certificate->valid_expiry() >= | |
| 98 base::Time::FromInternalValue(kJanuary2017)) | |
| 99 return DEPRECATED_SHA1_MAJOR; | |
| 100 static const int64_t kJanuary2016 = INT64_C(13096080000000000); | |
| 101 if (visible_security_state.certificate->valid_expiry() >= | |
| 102 base::Time::FromInternalValue(kJanuary2016)) | |
| 103 return DEPRECATED_SHA1_MINOR; | |
| 104 | |
| 105 return NO_DEPRECATED_SHA1; | |
| 106 } | 94 } |
| 107 | 95 |
| 108 ContentStatus GetContentStatus(bool displayed, bool ran) { | 96 ContentStatus GetContentStatus(bool displayed, bool ran) { |
| 109 if (ran && displayed) | 97 if (ran && displayed) |
| 110 return CONTENT_STATUS_DISPLAYED_AND_RAN; | 98 return CONTENT_STATUS_DISPLAYED_AND_RAN; |
| 111 if (ran) | 99 if (ran) |
| 112 return CONTENT_STATUS_RAN; | 100 return CONTENT_STATUS_RAN; |
| 113 if (displayed) | 101 if (displayed) |
| 114 return CONTENT_STATUS_DISPLAYED; | 102 return CONTENT_STATUS_DISPLAYED; |
| 115 return CONTENT_STATUS_NONE; | 103 return CONTENT_STATUS_NONE; |
| 116 } | 104 } |
| 117 | 105 |
| 118 SecurityLevel GetSecurityLevelForRequest( | 106 SecurityLevel GetSecurityLevelForRequest( |
| 119 const VisibleSecurityState& visible_security_state, | 107 const VisibleSecurityState& visible_security_state, |
| 120 bool used_policy_installed_certificate, | 108 bool used_policy_installed_certificate, |
| 121 const IsOriginSecureCallback& is_origin_secure_callback, | 109 const IsOriginSecureCallback& is_origin_secure_callback, |
| 122 SHA1DeprecationStatus sha1_status, | 110 bool sha1_in_chain, |
| 123 ContentStatus mixed_content_status, | 111 ContentStatus mixed_content_status, |
| 124 ContentStatus content_with_cert_errors_status) { | 112 ContentStatus content_with_cert_errors_status) { |
| 125 DCHECK(visible_security_state.connection_info_initialized || | 113 DCHECK(visible_security_state.connection_info_initialized || |
| 126 visible_security_state.malicious_content_status != | 114 visible_security_state.malicious_content_status != |
| 127 MALICIOUS_CONTENT_STATUS_NONE); | 115 MALICIOUS_CONTENT_STATUS_NONE); |
| 128 | 116 |
| 129 // Override the connection security information if the website failed the | 117 // Override the connection security information if the website failed the |
| 130 // browser's malware checks. | 118 // browser's malware checks. |
| 131 if (visible_security_state.malicious_content_status != | 119 if (visible_security_state.malicious_content_status != |
| 132 MALICIOUS_CONTENT_STATUS_NONE) { | 120 MALICIOUS_CONTENT_STATUS_NONE) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 | 153 |
| 166 // Report if there is a policy cert first, before reporting any other | 154 // Report if there is a policy cert first, before reporting any other |
| 167 // authenticated-but-with-errors cases. A policy cert is a strong | 155 // authenticated-but-with-errors cases. A policy cert is a strong |
| 168 // indicator of a MITM being present (the enterprise), while the | 156 // indicator of a MITM being present (the enterprise), while the |
| 169 // other authenticated-but-with-errors indicate something may | 157 // other authenticated-but-with-errors indicate something may |
| 170 // be wrong, or may be wrong in the future, but is unclear now. | 158 // be wrong, or may be wrong in the future, but is unclear now. |
| 171 if (used_policy_installed_certificate) | 159 if (used_policy_installed_certificate) |
| 172 return SECURE_WITH_POLICY_INSTALLED_CERT; | 160 return SECURE_WITH_POLICY_INSTALLED_CERT; |
| 173 | 161 |
| 174 // In most cases, SHA1 use is treated as a certificate error, in which case | 162 // In most cases, SHA1 use is treated as a certificate error, in which case |
| 175 // DANGEROUS will have been returned above. If SHA1 is permitted, we downgrade | 163 // DANGEROUS will have been returned above. If SHA1 was permitted by policy, |
| 176 // the security level to Neutral or Dangerous depending on policy. | 164 // downgrade the security level to Neutral. |
| 177 if (sha1_status == DEPRECATED_SHA1_MAJOR || | 165 if (sha1_in_chain) |
| 178 sha1_status == DEPRECATED_SHA1_MINOR) { | 166 return NONE; |
| 179 return (visible_security_state.display_sha1_from_local_anchors_as_neutral) | |
| 180 ? NONE | |
| 181 : DANGEROUS; | |
| 182 } | |
| 183 | 167 |
| 184 // Active mixed content is handled above. | 168 // Active mixed content is handled above. |
| 185 DCHECK_NE(CONTENT_STATUS_RAN, mixed_content_status); | 169 DCHECK_NE(CONTENT_STATUS_RAN, mixed_content_status); |
| 186 DCHECK_NE(CONTENT_STATUS_DISPLAYED_AND_RAN, mixed_content_status); | 170 DCHECK_NE(CONTENT_STATUS_DISPLAYED_AND_RAN, mixed_content_status); |
| 187 | 171 |
| 188 if (mixed_content_status == CONTENT_STATUS_DISPLAYED || | 172 if (mixed_content_status == CONTENT_STATUS_DISPLAYED || |
| 189 content_with_cert_errors_status == CONTENT_STATUS_DISPLAYED) { | 173 content_with_cert_errors_status == CONTENT_STATUS_DISPLAYED) { |
| 190 return kDisplayedInsecureContentLevel; | 174 return kDisplayedInsecureContentLevel; |
| 191 } | 175 } |
| 192 | 176 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 209 const IsOriginSecureCallback& is_origin_secure_callback, | 193 const IsOriginSecureCallback& is_origin_secure_callback, |
| 210 SecurityInfo* security_info) { | 194 SecurityInfo* security_info) { |
| 211 if (!visible_security_state.connection_info_initialized) { | 195 if (!visible_security_state.connection_info_initialized) { |
| 212 *security_info = SecurityInfo(); | 196 *security_info = SecurityInfo(); |
| 213 security_info->malicious_content_status = | 197 security_info->malicious_content_status = |
| 214 visible_security_state.malicious_content_status; | 198 visible_security_state.malicious_content_status; |
| 215 if (security_info->malicious_content_status != | 199 if (security_info->malicious_content_status != |
| 216 MALICIOUS_CONTENT_STATUS_NONE) { | 200 MALICIOUS_CONTENT_STATUS_NONE) { |
| 217 security_info->security_level = GetSecurityLevelForRequest( | 201 security_info->security_level = GetSecurityLevelForRequest( |
| 218 visible_security_state, used_policy_installed_certificate, | 202 visible_security_state, used_policy_installed_certificate, |
| 219 is_origin_secure_callback, UNKNOWN_SHA1, CONTENT_STATUS_UNKNOWN, | 203 is_origin_secure_callback, false, CONTENT_STATUS_UNKNOWN, |
| 220 CONTENT_STATUS_UNKNOWN); | 204 CONTENT_STATUS_UNKNOWN); |
| 221 } | 205 } |
| 222 return; | 206 return; |
| 223 } | 207 } |
| 224 security_info->certificate = visible_security_state.certificate; | 208 security_info->certificate = visible_security_state.certificate; |
| 225 security_info->sha1_deprecation_status = | 209 security_info->sha1_in_chain = GetSHA1InChain(visible_security_state); |
| 226 GetSHA1DeprecationStatus(visible_security_state); | |
| 227 security_info->mixed_content_status = | 210 security_info->mixed_content_status = |
| 228 GetContentStatus(visible_security_state.displayed_mixed_content, | 211 GetContentStatus(visible_security_state.displayed_mixed_content, |
| 229 visible_security_state.ran_mixed_content); | 212 visible_security_state.ran_mixed_content); |
| 230 security_info->content_with_cert_errors_status = GetContentStatus( | 213 security_info->content_with_cert_errors_status = GetContentStatus( |
| 231 visible_security_state.displayed_content_with_cert_errors, | 214 visible_security_state.displayed_content_with_cert_errors, |
| 232 visible_security_state.ran_content_with_cert_errors); | 215 visible_security_state.ran_content_with_cert_errors); |
| 233 security_info->security_bits = visible_security_state.security_bits; | 216 security_info->security_bits = visible_security_state.security_bits; |
| 234 security_info->connection_status = visible_security_state.connection_status; | 217 security_info->connection_status = visible_security_state.connection_status; |
| 235 security_info->key_exchange_group = visible_security_state.key_exchange_group; | 218 security_info->key_exchange_group = visible_security_state.key_exchange_group; |
| 236 security_info->cert_status = visible_security_state.cert_status; | 219 security_info->cert_status = visible_security_state.cert_status; |
| 237 security_info->scheme_is_cryptographic = | 220 security_info->scheme_is_cryptographic = |
| 238 visible_security_state.url.SchemeIsCryptographic(); | 221 visible_security_state.url.SchemeIsCryptographic(); |
| 239 security_info->obsolete_ssl_status = | 222 security_info->obsolete_ssl_status = |
| 240 net::ObsoleteSSLStatus(security_info->connection_status); | 223 net::ObsoleteSSLStatus(security_info->connection_status); |
| 241 security_info->pkp_bypassed = visible_security_state.pkp_bypassed; | 224 security_info->pkp_bypassed = visible_security_state.pkp_bypassed; |
| 242 security_info->sct_verify_statuses = | 225 security_info->sct_verify_statuses = |
| 243 visible_security_state.sct_verify_statuses; | 226 visible_security_state.sct_verify_statuses; |
| 244 | 227 |
| 245 security_info->malicious_content_status = | 228 security_info->malicious_content_status = |
| 246 visible_security_state.malicious_content_status; | 229 visible_security_state.malicious_content_status; |
| 247 | 230 |
| 248 security_info->displayed_password_field_on_http = | 231 security_info->displayed_password_field_on_http = |
| 249 visible_security_state.displayed_password_field_on_http; | 232 visible_security_state.displayed_password_field_on_http; |
| 250 security_info->displayed_credit_card_field_on_http = | 233 security_info->displayed_credit_card_field_on_http = |
| 251 visible_security_state.displayed_credit_card_field_on_http; | 234 visible_security_state.displayed_credit_card_field_on_http; |
| 252 | 235 |
| 253 security_info->security_level = GetSecurityLevelForRequest( | 236 security_info->security_level = GetSecurityLevelForRequest( |
| 254 visible_security_state, used_policy_installed_certificate, | 237 visible_security_state, used_policy_installed_certificate, |
| 255 is_origin_secure_callback, security_info->sha1_deprecation_status, | 238 is_origin_secure_callback, security_info->sha1_in_chain, |
| 256 security_info->mixed_content_status, | 239 security_info->mixed_content_status, |
| 257 security_info->content_with_cert_errors_status); | 240 security_info->content_with_cert_errors_status); |
| 258 } | 241 } |
| 259 | 242 |
| 260 } // namespace | 243 } // namespace |
| 261 | 244 |
| 262 const base::Feature kHttpFormWarningFeature{"HttpFormWarning", | 245 const base::Feature kHttpFormWarningFeature{"HttpFormWarning", |
| 263 base::FEATURE_DISABLED_BY_DEFAULT}; | 246 base::FEATURE_DISABLED_BY_DEFAULT}; |
| 264 | 247 |
| 265 SecurityInfo::SecurityInfo() | 248 SecurityInfo::SecurityInfo() |
| 266 : security_level(NONE), | 249 : security_level(NONE), |
| 267 malicious_content_status(MALICIOUS_CONTENT_STATUS_NONE), | 250 malicious_content_status(MALICIOUS_CONTENT_STATUS_NONE), |
| 268 sha1_deprecation_status(NO_DEPRECATED_SHA1), | 251 sha1_in_chain(false), |
| 269 mixed_content_status(CONTENT_STATUS_NONE), | 252 mixed_content_status(CONTENT_STATUS_NONE), |
| 270 content_with_cert_errors_status(CONTENT_STATUS_NONE), | 253 content_with_cert_errors_status(CONTENT_STATUS_NONE), |
| 271 scheme_is_cryptographic(false), | 254 scheme_is_cryptographic(false), |
| 272 cert_status(0), | 255 cert_status(0), |
| 273 security_bits(-1), | 256 security_bits(-1), |
| 274 connection_status(0), | 257 connection_status(0), |
| 275 key_exchange_group(0), | 258 key_exchange_group(0), |
| 276 obsolete_ssl_status(net::OBSOLETE_SSL_NONE), | 259 obsolete_ssl_status(net::OBSOLETE_SSL_NONE), |
| 277 pkp_bypassed(false), | 260 pkp_bypassed(false), |
| 278 displayed_password_field_on_http(false), | 261 displayed_password_field_on_http(false), |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 300 cert_status(0), | 283 cert_status(0), |
| 301 connection_status(0), | 284 connection_status(0), |
| 302 key_exchange_group(0), | 285 key_exchange_group(0), |
| 303 security_bits(-1), | 286 security_bits(-1), |
| 304 displayed_mixed_content(false), | 287 displayed_mixed_content(false), |
| 305 ran_mixed_content(false), | 288 ran_mixed_content(false), |
| 306 displayed_content_with_cert_errors(false), | 289 displayed_content_with_cert_errors(false), |
| 307 ran_content_with_cert_errors(false), | 290 ran_content_with_cert_errors(false), |
| 308 pkp_bypassed(false), | 291 pkp_bypassed(false), |
| 309 displayed_password_field_on_http(false), | 292 displayed_password_field_on_http(false), |
| 310 displayed_credit_card_field_on_http(false), | 293 displayed_credit_card_field_on_http(false) {} |
| 311 display_sha1_from_local_anchors_as_neutral(false) {} | |
| 312 | 294 |
| 313 VisibleSecurityState::~VisibleSecurityState() {} | 295 VisibleSecurityState::~VisibleSecurityState() {} |
| 314 | 296 |
| 315 bool VisibleSecurityState::operator==(const VisibleSecurityState& other) const { | 297 bool VisibleSecurityState::operator==(const VisibleSecurityState& other) const { |
| 316 return (url == other.url && | 298 return (url == other.url && |
| 317 malicious_content_status == other.malicious_content_status && | 299 malicious_content_status == other.malicious_content_status && |
| 318 !!certificate == !!other.certificate && | 300 !!certificate == !!other.certificate && |
| 319 (certificate ? certificate->Equals(other.certificate.get()) : true) && | 301 (certificate ? certificate->Equals(other.certificate.get()) : true) && |
| 320 connection_status == other.connection_status && | 302 connection_status == other.connection_status && |
| 321 key_exchange_group == other.key_exchange_group && | 303 key_exchange_group == other.key_exchange_group && |
| 322 security_bits == other.security_bits && | 304 security_bits == other.security_bits && |
| 323 sct_verify_statuses == other.sct_verify_statuses && | 305 sct_verify_statuses == other.sct_verify_statuses && |
| 324 displayed_mixed_content == other.displayed_mixed_content && | 306 displayed_mixed_content == other.displayed_mixed_content && |
| 325 ran_mixed_content == other.ran_mixed_content && | 307 ran_mixed_content == other.ran_mixed_content && |
| 326 displayed_content_with_cert_errors == | 308 displayed_content_with_cert_errors == |
| 327 other.displayed_content_with_cert_errors && | 309 other.displayed_content_with_cert_errors && |
| 328 ran_content_with_cert_errors == other.ran_content_with_cert_errors && | 310 ran_content_with_cert_errors == other.ran_content_with_cert_errors && |
| 329 pkp_bypassed == other.pkp_bypassed && | 311 pkp_bypassed == other.pkp_bypassed && |
| 330 displayed_password_field_on_http == | 312 displayed_password_field_on_http == |
| 331 other.displayed_password_field_on_http && | 313 other.displayed_password_field_on_http && |
| 332 displayed_credit_card_field_on_http == | 314 displayed_credit_card_field_on_http == |
| 333 other.displayed_credit_card_field_on_http && | 315 other.displayed_credit_card_field_on_http); |
| 334 display_sha1_from_local_anchors_as_neutral == | |
| 335 other.display_sha1_from_local_anchors_as_neutral); | |
| 336 } | 316 } |
| 337 | 317 |
| 338 } // namespace security_state | 318 } // namespace security_state |
| OLD | NEW |