Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1136)

Side by Side Diff: components/security_state/security_state_model.cc

Issue 2400673003: Remove SSLStatus::security_style member and content::SecurityStyle (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698