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/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 status = NEUTRAL; | 80 status = NEUTRAL; |
| 81 level = SecurityStateModel::NONE; | 81 level = SecurityStateModel::NONE; |
| 82 } | 82 } |
| 83 } | 83 } |
| 84 | 84 |
| 85 UMA_HISTOGRAM_ENUMERATION(kEnumeration, status, LAST_STATUS); | 85 UMA_HISTOGRAM_ENUMERATION(kEnumeration, status, LAST_STATUS); |
| 86 return level; | 86 return level; |
| 87 } | 87 } |
| 88 | 88 |
| 89 SecurityStateModel::SHA1DeprecationStatus GetSHA1DeprecationStatus( | 89 SecurityStateModel::SHA1DeprecationStatus GetSHA1DeprecationStatus( |
| 90 scoped_refptr<net::X509Certificate> cert, | |
| 91 const SecurityStateModel::VisibleSecurityState& visible_security_state) { | 90 const SecurityStateModel::VisibleSecurityState& visible_security_state) { |
| 92 if (!cert || | 91 if (!visible_security_state.certificate || |
| 93 !(visible_security_state.cert_status & | 92 !(visible_security_state.cert_status & |
| 94 net::CERT_STATUS_SHA1_SIGNATURE_PRESENT)) | 93 net::CERT_STATUS_SHA1_SIGNATURE_PRESENT)) |
| 95 return SecurityStateModel::NO_DEPRECATED_SHA1; | 94 return SecurityStateModel::NO_DEPRECATED_SHA1; |
| 96 | 95 |
| 97 // The internal representation of the dates for UI treatment of SHA-1. | 96 // The internal representation of the dates for UI treatment of SHA-1. |
| 98 // See http://crbug.com/401365 for details. | 97 // See http://crbug.com/401365 for details. |
| 99 static const int64_t kJanuary2017 = INT64_C(13127702400000000); | 98 static const int64_t kJanuary2017 = INT64_C(13127702400000000); |
| 100 if (cert->valid_expiry() >= base::Time::FromInternalValue(kJanuary2017)) | 99 if (visible_security_state.certificate->valid_expiry() >= |
| 100 base::Time::FromInternalValue(kJanuary2017)) | |
| 101 return SecurityStateModel::DEPRECATED_SHA1_MAJOR; | 101 return SecurityStateModel::DEPRECATED_SHA1_MAJOR; |
| 102 static const int64_t kJanuary2016 = INT64_C(13096080000000000); | 102 static const int64_t kJanuary2016 = INT64_C(13096080000000000); |
| 103 if (cert->valid_expiry() >= base::Time::FromInternalValue(kJanuary2016)) | 103 if (visible_security_state.certificate->valid_expiry() >= |
| 104 base::Time::FromInternalValue(kJanuary2016)) | |
| 104 return SecurityStateModel::DEPRECATED_SHA1_MINOR; | 105 return SecurityStateModel::DEPRECATED_SHA1_MINOR; |
| 105 | 106 |
| 106 return SecurityStateModel::NO_DEPRECATED_SHA1; | 107 return SecurityStateModel::NO_DEPRECATED_SHA1; |
| 107 } | 108 } |
| 108 | 109 |
| 109 SecurityStateModel::ContentStatus GetContentStatus(bool displayed, bool ran) { | 110 SecurityStateModel::ContentStatus GetContentStatus(bool displayed, bool ran) { |
| 110 if (ran && displayed) | 111 if (ran && displayed) |
| 111 return SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN; | 112 return SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN; |
| 112 if (ran) | 113 if (ran) |
| 113 return SecurityStateModel::CONTENT_STATUS_RAN; | 114 return SecurityStateModel::CONTENT_STATUS_RAN; |
| 114 if (displayed) | 115 if (displayed) |
| 115 return SecurityStateModel::CONTENT_STATUS_DISPLAYED; | 116 return SecurityStateModel::CONTENT_STATUS_DISPLAYED; |
| 116 return SecurityStateModel::CONTENT_STATUS_NONE; | 117 return SecurityStateModel::CONTENT_STATUS_NONE; |
| 117 } | 118 } |
| 118 | 119 |
| 119 SecurityStateModel::SecurityLevel GetSecurityLevelForRequest( | 120 SecurityStateModel::SecurityLevel GetSecurityLevelForRequest( |
|
felt
2016/10/07 03:30:48
The downside, I guess, is that this method gets sl
estark
2016/10/07 06:34:31
You think so? Oddly I find it easier to follow thi
| |
| 120 const SecurityStateModel::VisibleSecurityState& visible_security_state, | 121 const SecurityStateModel::VisibleSecurityState& visible_security_state, |
| 121 SecurityStateModelClient* client, | 122 SecurityStateModelClient* client, |
| 122 const scoped_refptr<net::X509Certificate>& cert, | |
| 123 SecurityStateModel::SHA1DeprecationStatus sha1_status, | 123 SecurityStateModel::SHA1DeprecationStatus sha1_status, |
| 124 SecurityStateModel::ContentStatus mixed_content_status, | 124 SecurityStateModel::ContentStatus mixed_content_status, |
| 125 SecurityStateModel::ContentStatus content_with_cert_errors_status) { | 125 SecurityStateModel::ContentStatus content_with_cert_errors_status) { |
| 126 DCHECK(visible_security_state.connection_info_initialized || | 126 DCHECK(visible_security_state.connection_info_initialized || |
| 127 visible_security_state.fails_malware_check); | 127 visible_security_state.fails_malware_check); |
| 128 | 128 |
| 129 // Override the connection security information if the website failed the | 129 // Override the connection security information if the website failed the |
| 130 // browser's malware checks. | 130 // browser's malware checks. |
| 131 if (visible_security_state.fails_malware_check) | 131 if (visible_security_state.fails_malware_check) |
| 132 return SecurityStateModel::DANGEROUS; | 132 return SecurityStateModel::DANGEROUS; |
| 133 | 133 |
| 134 GURL url = visible_security_state.url; | 134 GURL url = visible_security_state.url; |
| 135 switch (visible_security_state.initial_security_level) { | |
| 136 case SecurityStateModel::NONE: | |
| 137 case SecurityStateModel::HTTP_SHOW_WARNING: { | |
| 138 if (!client->IsOriginSecure(url) && url.IsStandard()) { | |
| 139 return GetSecurityLevelForNonSecureFieldTrial( | |
| 140 visible_security_state.displayed_password_field_on_http || | |
| 141 visible_security_state.displayed_credit_card_field_on_http); | |
| 142 } | |
| 143 return SecurityStateModel::NONE; | |
| 144 } | |
| 145 | 135 |
| 146 case SecurityStateModel::DANGEROUS: | 136 bool is_cryptographic_with_certificate = |
| 147 return SecurityStateModel::DANGEROUS; | 137 (url.SchemeIsCryptographic() && visible_security_state.certificate); |
| 148 | 138 |
| 149 case SecurityStateModel::SECURITY_WARNING: | 139 // Set the security level to DANGEROUS for major certificate errors. |
| 150 case SecurityStateModel::SECURE_WITH_POLICY_INSTALLED_CERT: | 140 if (is_cryptographic_with_certificate && |
| 151 return visible_security_state.initial_security_level; | 141 net::IsCertStatusError(visible_security_state.cert_status) && |
| 152 | 142 !net::IsCertStatusMinorError(visible_security_state.cert_status)) { |
| 153 case SecurityStateModel::SECURE: | 143 return SecurityStateModel::DANGEROUS; |
| 154 case SecurityStateModel::EV_SECURE: { | |
| 155 // Major cert errors and active mixed content will generally be | |
| 156 // downgraded by the embedder to DANGEROUS and handled above, | |
| 157 // but downgrade here just in case. | |
| 158 net::CertStatus cert_status = visible_security_state.cert_status; | |
| 159 if (net::IsCertStatusError(cert_status) && | |
| 160 !net::IsCertStatusMinorError(cert_status)) { | |
| 161 return SecurityStateModel::DANGEROUS; | |
| 162 } | |
| 163 if (mixed_content_status == SecurityStateModel::CONTENT_STATUS_RAN || | |
| 164 mixed_content_status == | |
| 165 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN || | |
| 166 content_with_cert_errors_status == | |
| 167 SecurityStateModel::CONTENT_STATUS_RAN || | |
| 168 content_with_cert_errors_status == | |
| 169 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN) { | |
| 170 return SecurityStateModel::kRanInsecureContentLevel; | |
| 171 } | |
| 172 | |
| 173 // Report if there is a policy cert first, before reporting any other | |
| 174 // authenticated-but-with-errors cases. A policy cert is a strong | |
| 175 // indicator of a MITM being present (the enterprise), while the | |
| 176 // other authenticated-but-with-errors indicate something may | |
| 177 // be wrong, or may be wrong in the future, but is unclear now. | |
| 178 if (client->UsedPolicyInstalledCertificate()) | |
| 179 return SecurityStateModel::SECURE_WITH_POLICY_INSTALLED_CERT; | |
| 180 | |
| 181 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MAJOR) | |
| 182 return SecurityStateModel::DANGEROUS; | |
| 183 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MINOR) | |
| 184 return SecurityStateModel::NONE; | |
| 185 | |
| 186 // Active mixed content is handled above. | |
| 187 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_RAN, mixed_content_status); | |
| 188 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN, | |
| 189 mixed_content_status); | |
| 190 | |
| 191 if (mixed_content_status == | |
| 192 SecurityStateModel::CONTENT_STATUS_DISPLAYED || | |
| 193 content_with_cert_errors_status == | |
| 194 SecurityStateModel::CONTENT_STATUS_DISPLAYED) { | |
| 195 return SecurityStateModel::kDisplayedInsecureContentLevel; | |
| 196 } | |
| 197 | |
| 198 if (net::IsCertStatusError(cert_status)) { | |
| 199 // Major cert errors are handled above. | |
| 200 DCHECK(net::IsCertStatusMinorError(cert_status)); | |
| 201 return SecurityStateModel::NONE; | |
| 202 } | |
| 203 if (net::SSLConnectionStatusToVersion( | |
| 204 visible_security_state.connection_status) == | |
| 205 net::SSL_CONNECTION_VERSION_SSL3) { | |
| 206 // SSLv3 will be removed in the future. | |
| 207 return SecurityStateModel::SECURITY_WARNING; | |
| 208 } | |
| 209 if ((cert_status & net::CERT_STATUS_IS_EV) && cert) | |
| 210 return SecurityStateModel::EV_SECURE; | |
| 211 return SecurityStateModel::SECURE; | |
| 212 } | |
| 213 } | 144 } |
| 214 | 145 |
| 215 return SecurityStateModel::NONE; | 146 // Choose the appropriate security level for HTTP requests. |
| 147 if (!is_cryptographic_with_certificate) { | |
| 148 if (!client->IsOriginSecure(url) && url.IsStandard()) { | |
| 149 return GetSecurityLevelForNonSecureFieldTrial( | |
| 150 visible_security_state.displayed_password_field_on_http || | |
| 151 visible_security_state.displayed_credit_card_field_on_http); | |
| 152 } | |
| 153 return SecurityStateModel::NONE; | |
| 154 } | |
| 155 | |
| 156 // Downgrade the security level for active insecure subresources. | |
| 157 if (mixed_content_status == SecurityStateModel::CONTENT_STATUS_RAN || | |
| 158 mixed_content_status == | |
| 159 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN || | |
| 160 content_with_cert_errors_status == | |
| 161 SecurityStateModel::CONTENT_STATUS_RAN || | |
| 162 content_with_cert_errors_status == | |
| 163 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN) { | |
| 164 return SecurityStateModel::kRanInsecureContentLevel; | |
|
felt
2016/10/07 03:30:48
Tangent: why do we have this constant instead of j
estark
2016/10/07 06:34:31
We send this constant to devtools so that devtools
felt
2016/10/07 15:08:10
Ah, right on.
| |
| 165 } | |
| 166 | |
| 167 // Report if there is a policy cert first, before reporting any other | |
| 168 // authenticated-but-with-errors cases. A policy cert is a strong | |
| 169 // indicator of a MITM being present (the enterprise), while the | |
| 170 // other authenticated-but-with-errors indicate something may | |
| 171 // be wrong, or may be wrong in the future, but is unclear now. | |
| 172 if (client->UsedPolicyInstalledCertificate()) | |
| 173 return SecurityStateModel::SECURE_WITH_POLICY_INSTALLED_CERT; | |
| 174 | |
| 175 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MAJOR) | |
| 176 return SecurityStateModel::DANGEROUS; | |
| 177 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MINOR) | |
| 178 return SecurityStateModel::NONE; | |
| 179 | |
| 180 // Active mixed content is handled above. | |
| 181 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_RAN, mixed_content_status); | |
| 182 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN, | |
| 183 mixed_content_status); | |
| 184 | |
| 185 if (mixed_content_status == SecurityStateModel::CONTENT_STATUS_DISPLAYED || | |
| 186 content_with_cert_errors_status == | |
| 187 SecurityStateModel::CONTENT_STATUS_DISPLAYED) { | |
| 188 return SecurityStateModel::kDisplayedInsecureContentLevel; | |
| 189 } | |
| 190 | |
| 191 if (net::IsCertStatusError(visible_security_state.cert_status)) { | |
| 192 // Major cert errors are handled above. | |
| 193 DCHECK(net::IsCertStatusMinorError(visible_security_state.cert_status)); | |
| 194 return SecurityStateModel::NONE; | |
| 195 } | |
| 196 | |
| 197 if ((visible_security_state.cert_status & net::CERT_STATUS_IS_EV) && | |
| 198 visible_security_state.certificate) { | |
| 199 return SecurityStateModel::EV_SECURE; | |
| 200 } | |
| 201 return SecurityStateModel::SECURE; | |
| 216 } | 202 } |
| 217 | 203 |
| 218 void SecurityInfoForRequest( | 204 void SecurityInfoForRequest( |
| 219 SecurityStateModelClient* client, | 205 SecurityStateModelClient* client, |
| 220 const SecurityStateModel::VisibleSecurityState& visible_security_state, | 206 const SecurityStateModel::VisibleSecurityState& visible_security_state, |
| 221 const scoped_refptr<net::X509Certificate>& cert, | |
| 222 SecurityStateModel::SecurityInfo* security_info) { | 207 SecurityStateModel::SecurityInfo* security_info) { |
| 223 if (!visible_security_state.connection_info_initialized) { | 208 if (!visible_security_state.connection_info_initialized) { |
| 224 *security_info = SecurityStateModel::SecurityInfo(); | 209 *security_info = SecurityStateModel::SecurityInfo(); |
| 225 security_info->fails_malware_check = | 210 security_info->fails_malware_check = |
| 226 visible_security_state.fails_malware_check; | 211 visible_security_state.fails_malware_check; |
| 227 if (security_info->fails_malware_check) { | 212 if (security_info->fails_malware_check) { |
| 228 security_info->security_level = GetSecurityLevelForRequest( | 213 security_info->security_level = GetSecurityLevelForRequest( |
| 229 visible_security_state, client, cert, | 214 visible_security_state, client, SecurityStateModel::UNKNOWN_SHA1, |
| 230 SecurityStateModel::UNKNOWN_SHA1, | |
| 231 SecurityStateModel::CONTENT_STATUS_UNKNOWN, | 215 SecurityStateModel::CONTENT_STATUS_UNKNOWN, |
| 232 SecurityStateModel::CONTENT_STATUS_UNKNOWN); | 216 SecurityStateModel::CONTENT_STATUS_UNKNOWN); |
| 233 } | 217 } |
| 234 return; | 218 return; |
| 235 } | 219 } |
| 236 security_info->certificate = visible_security_state.certificate; | 220 security_info->certificate = visible_security_state.certificate; |
| 237 security_info->sha1_deprecation_status = | 221 security_info->sha1_deprecation_status = |
| 238 GetSHA1DeprecationStatus(cert, visible_security_state); | 222 GetSHA1DeprecationStatus(visible_security_state); |
| 239 security_info->mixed_content_status = | 223 security_info->mixed_content_status = |
| 240 GetContentStatus(visible_security_state.displayed_mixed_content, | 224 GetContentStatus(visible_security_state.displayed_mixed_content, |
| 241 visible_security_state.ran_mixed_content); | 225 visible_security_state.ran_mixed_content); |
| 242 security_info->content_with_cert_errors_status = GetContentStatus( | 226 security_info->content_with_cert_errors_status = GetContentStatus( |
| 243 visible_security_state.displayed_content_with_cert_errors, | 227 visible_security_state.displayed_content_with_cert_errors, |
| 244 visible_security_state.ran_content_with_cert_errors); | 228 visible_security_state.ran_content_with_cert_errors); |
| 245 security_info->security_bits = visible_security_state.security_bits; | 229 security_info->security_bits = visible_security_state.security_bits; |
| 246 security_info->connection_status = visible_security_state.connection_status; | 230 security_info->connection_status = visible_security_state.connection_status; |
| 247 security_info->key_exchange_group = visible_security_state.key_exchange_group; | 231 security_info->key_exchange_group = visible_security_state.key_exchange_group; |
| 248 security_info->cert_status = visible_security_state.cert_status; | 232 security_info->cert_status = visible_security_state.cert_status; |
| 249 security_info->scheme_is_cryptographic = | 233 security_info->scheme_is_cryptographic = |
| 250 visible_security_state.url.SchemeIsCryptographic(); | 234 visible_security_state.url.SchemeIsCryptographic(); |
| 251 security_info->obsolete_ssl_status = | 235 security_info->obsolete_ssl_status = |
| 252 net::ObsoleteSSLStatus(security_info->connection_status); | 236 net::ObsoleteSSLStatus(security_info->connection_status); |
| 253 security_info->pkp_bypassed = visible_security_state.pkp_bypassed; | 237 security_info->pkp_bypassed = visible_security_state.pkp_bypassed; |
| 254 security_info->sct_verify_statuses = | 238 security_info->sct_verify_statuses = |
| 255 visible_security_state.sct_verify_statuses; | 239 visible_security_state.sct_verify_statuses; |
| 256 | 240 |
| 257 security_info->fails_malware_check = | 241 security_info->fails_malware_check = |
| 258 visible_security_state.fails_malware_check; | 242 visible_security_state.fails_malware_check; |
| 259 | 243 |
| 260 security_info->security_level = GetSecurityLevelForRequest( | 244 security_info->security_level = GetSecurityLevelForRequest( |
| 261 visible_security_state, client, cert, | 245 visible_security_state, client, security_info->sha1_deprecation_status, |
| 262 security_info->sha1_deprecation_status, | |
| 263 security_info->mixed_content_status, | 246 security_info->mixed_content_status, |
| 264 security_info->content_with_cert_errors_status); | 247 security_info->content_with_cert_errors_status); |
| 265 } | 248 } |
| 266 | 249 |
| 267 } // namespace | 250 } // namespace |
| 268 | 251 |
| 269 const SecurityStateModel::SecurityLevel | 252 const SecurityStateModel::SecurityLevel |
| 270 SecurityStateModel::kDisplayedInsecureContentLevel = | 253 SecurityStateModel::kDisplayedInsecureContentLevel = |
| 271 SecurityStateModel::NONE; | 254 SecurityStateModel::NONE; |
| 272 const SecurityStateModel::SecurityLevel | 255 const SecurityStateModel::SecurityLevel |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 288 pkp_bypassed(false) {} | 271 pkp_bypassed(false) {} |
| 289 | 272 |
| 290 SecurityStateModel::SecurityInfo::~SecurityInfo() {} | 273 SecurityStateModel::SecurityInfo::~SecurityInfo() {} |
| 291 | 274 |
| 292 SecurityStateModel::SecurityStateModel() {} | 275 SecurityStateModel::SecurityStateModel() {} |
| 293 | 276 |
| 294 SecurityStateModel::~SecurityStateModel() {} | 277 SecurityStateModel::~SecurityStateModel() {} |
| 295 | 278 |
| 296 void SecurityStateModel::GetSecurityInfo( | 279 void SecurityStateModel::GetSecurityInfo( |
| 297 SecurityStateModel::SecurityInfo* result) const { | 280 SecurityStateModel::SecurityInfo* result) const { |
| 298 scoped_refptr<net::X509Certificate> cert = nullptr; | |
| 299 client_->RetrieveCert(&cert); | |
| 300 | |
| 301 VisibleSecurityState new_visible_state; | 281 VisibleSecurityState new_visible_state; |
| 302 client_->GetVisibleSecurityState(&new_visible_state); | 282 client_->GetVisibleSecurityState(&new_visible_state); |
| 303 SecurityInfoForRequest(client_, new_visible_state, cert, result); | 283 SecurityInfoForRequest(client_, new_visible_state, result); |
| 304 } | 284 } |
| 305 | 285 |
| 306 void SecurityStateModel::SetClient(SecurityStateModelClient* client) { | 286 void SecurityStateModel::SetClient(SecurityStateModelClient* client) { |
| 307 client_ = client; | 287 client_ = client; |
| 308 } | 288 } |
| 309 | 289 |
| 310 SecurityStateModel::VisibleSecurityState::VisibleSecurityState() | 290 SecurityStateModel::VisibleSecurityState::VisibleSecurityState() |
| 311 : initial_security_level(SecurityStateModel::NONE), | 291 : fails_malware_check(false), |
| 312 fails_malware_check(false), | |
| 313 connection_info_initialized(false), | 292 connection_info_initialized(false), |
| 314 cert_status(0), | 293 cert_status(0), |
| 315 connection_status(0), | 294 connection_status(0), |
| 316 key_exchange_group(0), | 295 key_exchange_group(0), |
| 317 security_bits(-1), | 296 security_bits(-1), |
| 318 displayed_mixed_content(false), | 297 displayed_mixed_content(false), |
| 319 ran_mixed_content(false), | 298 ran_mixed_content(false), |
| 320 displayed_content_with_cert_errors(false), | 299 displayed_content_with_cert_errors(false), |
| 321 ran_content_with_cert_errors(false), | 300 ran_content_with_cert_errors(false), |
| 322 pkp_bypassed(false), | 301 pkp_bypassed(false), |
| 323 displayed_password_field_on_http(false), | 302 displayed_password_field_on_http(false), |
| 324 displayed_credit_card_field_on_http(false) {} | 303 displayed_credit_card_field_on_http(false) {} |
| 325 | 304 |
| 326 SecurityStateModel::VisibleSecurityState::~VisibleSecurityState() {} | 305 SecurityStateModel::VisibleSecurityState::~VisibleSecurityState() {} |
| 327 | 306 |
| 328 bool SecurityStateModel::VisibleSecurityState::operator==( | 307 bool SecurityStateModel::VisibleSecurityState::operator==( |
| 329 const SecurityStateModel::VisibleSecurityState& other) const { | 308 const SecurityStateModel::VisibleSecurityState& other) const { |
| 330 return (url == other.url && | 309 return (url == other.url && |
| 331 initial_security_level == other.initial_security_level && | |
| 332 fails_malware_check == other.fails_malware_check && | 310 fails_malware_check == other.fails_malware_check && |
| 333 !!certificate == !!other.certificate && | 311 !!certificate == !!other.certificate && |
| 334 (certificate ? certificate->Equals(other.certificate.get()) : true) && | 312 (certificate ? certificate->Equals(other.certificate.get()) : true) && |
| 335 connection_status == other.connection_status && | 313 connection_status == other.connection_status && |
| 336 key_exchange_group == other.key_exchange_group && | 314 key_exchange_group == other.key_exchange_group && |
| 337 security_bits == other.security_bits && | 315 security_bits == other.security_bits && |
| 338 sct_verify_statuses == other.sct_verify_statuses && | 316 sct_verify_statuses == other.sct_verify_statuses && |
| 339 displayed_mixed_content == other.displayed_mixed_content && | 317 displayed_mixed_content == other.displayed_mixed_content && |
| 340 ran_mixed_content == other.ran_mixed_content && | 318 ran_mixed_content == other.ran_mixed_content && |
| 341 displayed_content_with_cert_errors == | 319 displayed_content_with_cert_errors == |
| 342 other.displayed_content_with_cert_errors && | 320 other.displayed_content_with_cert_errors && |
| 343 ran_content_with_cert_errors == other.ran_content_with_cert_errors && | 321 ran_content_with_cert_errors == other.ran_content_with_cert_errors && |
| 344 pkp_bypassed == other.pkp_bypassed && | 322 pkp_bypassed == other.pkp_bypassed && |
| 345 displayed_password_field_on_http == | 323 displayed_password_field_on_http == |
| 346 other.displayed_password_field_on_http && | 324 other.displayed_password_field_on_http && |
| 347 displayed_credit_card_field_on_http == | 325 displayed_credit_card_field_on_http == |
| 348 other.displayed_credit_card_field_on_http); | 326 other.displayed_credit_card_field_on_http); |
| 349 } | 327 } |
| 350 | 328 |
| 351 } // namespace security_state | 329 } // namespace security_state |
| OLD | NEW |