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

Side by Side Diff: net/http/transport_security_state.cc

Issue 2910473005: Deprecate NonThreadSafe in net/ in favor of SequenceChecker/ThreadChecker. (Closed)
Patch Set: rebase on r476634 Created 3 years, 6 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
« no previous file with comments | « net/http/transport_security_state.h ('k') | net/log/net_log_util.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "net/http/transport_security_state.h" 5 #include "net/http/transport_security_state.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after
744 enable_static_expect_staple_(true), 744 enable_static_expect_staple_(true),
745 enable_pkp_bypass_for_local_trust_anchors_(true), 745 enable_pkp_bypass_for_local_trust_anchors_(true),
746 sent_hpkp_reports_cache_(kMaxReportCacheEntries), 746 sent_hpkp_reports_cache_(kMaxReportCacheEntries),
747 sent_expect_ct_reports_cache_(kMaxReportCacheEntries) { 747 sent_expect_ct_reports_cache_(kMaxReportCacheEntries) {
748 // Static pinning is only enabled for official builds to make sure that 748 // Static pinning is only enabled for official builds to make sure that
749 // others don't end up with pins that cannot be easily updated. 749 // others don't end up with pins that cannot be easily updated.
750 #if !defined(GOOGLE_CHROME_BUILD) || defined(OS_ANDROID) || defined(OS_IOS) 750 #if !defined(GOOGLE_CHROME_BUILD) || defined(OS_ANDROID) || defined(OS_IOS)
751 enable_static_pins_ = false; 751 enable_static_pins_ = false;
752 enable_static_expect_ct_ = false; 752 enable_static_expect_ct_ = false;
753 #endif 753 #endif
754 DCHECK(CalledOnValidThread()); 754 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
755 } 755 }
756 756
757 // Both HSTS and HPKP cause fatal SSL errors, so return true if a 757 // Both HSTS and HPKP cause fatal SSL errors, so return true if a
758 // host has either. 758 // host has either.
759 bool TransportSecurityState::ShouldSSLErrorsBeFatal(const std::string& host) { 759 bool TransportSecurityState::ShouldSSLErrorsBeFatal(const std::string& host) {
760 STSState sts_state; 760 STSState sts_state;
761 PKPState pkp_state; 761 PKPState pkp_state;
762 if (GetStaticDomainState(host, &sts_state, &pkp_state)) 762 if (GetStaticDomainState(host, &sts_state, &pkp_state))
763 return true; 763 return true;
764 if (GetDynamicSTSState(host, &sts_state)) 764 if (GetDynamicSTSState(host, &sts_state))
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
806 806
807 UMA_HISTOGRAM_BOOLEAN("Net.PublicKeyPinSuccess", 807 UMA_HISTOGRAM_BOOLEAN("Net.PublicKeyPinSuccess",
808 pin_validity == PKPStatus::OK); 808 pin_validity == PKPStatus::OK);
809 return pin_validity; 809 return pin_validity;
810 } 810 }
811 811
812 void TransportSecurityState::CheckExpectStaple( 812 void TransportSecurityState::CheckExpectStaple(
813 const HostPortPair& host_port_pair, 813 const HostPortPair& host_port_pair,
814 const SSLInfo& ssl_info, 814 const SSLInfo& ssl_info,
815 base::StringPiece ocsp_response) { 815 base::StringPiece ocsp_response) {
816 DCHECK(CalledOnValidThread()); 816 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
817 if (!enable_static_expect_staple_ || !report_sender_ || 817 if (!enable_static_expect_staple_ || !report_sender_ ||
818 !ssl_info.is_issued_by_known_root) { 818 !ssl_info.is_issued_by_known_root) {
819 return; 819 return;
820 } 820 }
821 821
822 // Determine if the host is on the Expect-Staple preload list. If the build is 822 // Determine if the host is on the Expect-Staple preload list. If the build is
823 // not timely (i.e. the preload list is not fresh), this will fail and return 823 // not timely (i.e. the preload list is not fresh), this will fail and return
824 // false. 824 // false.
825 ExpectStapleState expect_staple_state; 825 ExpectStapleState expect_staple_state;
826 if (!GetStaticExpectStapleState(host_port_pair.host(), &expect_staple_state)) 826 if (!GetStaticExpectStapleState(host_port_pair.host(), &expect_staple_state))
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
969 // No exception found. This certificate must conform to the CT policy. 969 // No exception found. This certificate must conform to the CT policy.
970 return CT_REQUIREMENTS_NOT_MET; 970 return CT_REQUIREMENTS_NOT_MET;
971 } 971 }
972 } 972 }
973 973
974 return default_response; 974 return default_response;
975 } 975 }
976 976
977 void TransportSecurityState::SetDelegate( 977 void TransportSecurityState::SetDelegate(
978 TransportSecurityState::Delegate* delegate) { 978 TransportSecurityState::Delegate* delegate) {
979 DCHECK(CalledOnValidThread()); 979 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
980 delegate_ = delegate; 980 delegate_ = delegate;
981 } 981 }
982 982
983 void TransportSecurityState::SetReportSender( 983 void TransportSecurityState::SetReportSender(
984 TransportSecurityState::ReportSenderInterface* report_sender) { 984 TransportSecurityState::ReportSenderInterface* report_sender) {
985 DCHECK(CalledOnValidThread()); 985 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
986 report_sender_ = report_sender; 986 report_sender_ = report_sender;
987 } 987 }
988 988
989 void TransportSecurityState::SetExpectCTReporter( 989 void TransportSecurityState::SetExpectCTReporter(
990 ExpectCTReporter* expect_ct_reporter) { 990 ExpectCTReporter* expect_ct_reporter) {
991 DCHECK(CalledOnValidThread()); 991 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
992 expect_ct_reporter_ = expect_ct_reporter; 992 expect_ct_reporter_ = expect_ct_reporter;
993 } 993 }
994 994
995 void TransportSecurityState::SetRequireCTDelegate(RequireCTDelegate* delegate) { 995 void TransportSecurityState::SetRequireCTDelegate(RequireCTDelegate* delegate) {
996 DCHECK(CalledOnValidThread()); 996 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
997 require_ct_delegate_ = delegate; 997 require_ct_delegate_ = delegate;
998 } 998 }
999 999
1000 void TransportSecurityState::AddHSTSInternal( 1000 void TransportSecurityState::AddHSTSInternal(
1001 const std::string& host, 1001 const std::string& host,
1002 TransportSecurityState::STSState::UpgradeMode upgrade_mode, 1002 TransportSecurityState::STSState::UpgradeMode upgrade_mode,
1003 const base::Time& expiry, 1003 const base::Time& expiry,
1004 bool include_subdomains) { 1004 bool include_subdomains) {
1005 DCHECK(CalledOnValidThread()); 1005 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1006 1006
1007 STSState sts_state; 1007 STSState sts_state;
1008 sts_state.last_observed = base::Time::Now(); 1008 sts_state.last_observed = base::Time::Now();
1009 sts_state.include_subdomains = include_subdomains; 1009 sts_state.include_subdomains = include_subdomains;
1010 sts_state.expiry = expiry; 1010 sts_state.expiry = expiry;
1011 sts_state.upgrade_mode = upgrade_mode; 1011 sts_state.upgrade_mode = upgrade_mode;
1012 1012
1013 EnableSTSHost(host, sts_state); 1013 EnableSTSHost(host, sts_state);
1014 } 1014 }
1015 1015
1016 void TransportSecurityState::AddHPKPInternal(const std::string& host, 1016 void TransportSecurityState::AddHPKPInternal(const std::string& host,
1017 const base::Time& last_observed, 1017 const base::Time& last_observed,
1018 const base::Time& expiry, 1018 const base::Time& expiry,
1019 bool include_subdomains, 1019 bool include_subdomains,
1020 const HashValueVector& hashes, 1020 const HashValueVector& hashes,
1021 const GURL& report_uri) { 1021 const GURL& report_uri) {
1022 DCHECK(CalledOnValidThread()); 1022 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1023 1023
1024 PKPState pkp_state; 1024 PKPState pkp_state;
1025 pkp_state.last_observed = last_observed; 1025 pkp_state.last_observed = last_observed;
1026 pkp_state.expiry = expiry; 1026 pkp_state.expiry = expiry;
1027 pkp_state.include_subdomains = include_subdomains; 1027 pkp_state.include_subdomains = include_subdomains;
1028 pkp_state.spki_hashes = hashes; 1028 pkp_state.spki_hashes = hashes;
1029 pkp_state.report_uri = report_uri; 1029 pkp_state.report_uri = report_uri;
1030 1030
1031 EnablePKPHost(host, pkp_state); 1031 EnablePKPHost(host, pkp_state);
1032 } 1032 }
1033 1033
1034 void TransportSecurityState::AddExpectCTInternal( 1034 void TransportSecurityState::AddExpectCTInternal(
1035 const std::string& host, 1035 const std::string& host,
1036 const base::Time& last_observed, 1036 const base::Time& last_observed,
1037 const base::Time& expiry, 1037 const base::Time& expiry,
1038 bool enforce, 1038 bool enforce,
1039 const GURL& report_uri) { 1039 const GURL& report_uri) {
1040 DCHECK(CalledOnValidThread()); 1040 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1041 1041
1042 ExpectCTState expect_ct_state; 1042 ExpectCTState expect_ct_state;
1043 expect_ct_state.last_observed = last_observed; 1043 expect_ct_state.last_observed = last_observed;
1044 expect_ct_state.expiry = expiry; 1044 expect_ct_state.expiry = expiry;
1045 expect_ct_state.enforce = enforce; 1045 expect_ct_state.enforce = enforce;
1046 expect_ct_state.report_uri = report_uri; 1046 expect_ct_state.report_uri = report_uri;
1047 1047
1048 EnableExpectCTHost(host, expect_ct_state); 1048 EnableExpectCTHost(host, expect_ct_state);
1049 } 1049 }
1050 1050
1051 void TransportSecurityState:: 1051 void TransportSecurityState::
1052 SetEnablePublicKeyPinningBypassForLocalTrustAnchors(bool value) { 1052 SetEnablePublicKeyPinningBypassForLocalTrustAnchors(bool value) {
1053 enable_pkp_bypass_for_local_trust_anchors_ = value; 1053 enable_pkp_bypass_for_local_trust_anchors_ = value;
1054 } 1054 }
1055 1055
1056 void TransportSecurityState::EnableSTSHost(const std::string& host, 1056 void TransportSecurityState::EnableSTSHost(const std::string& host,
1057 const STSState& state) { 1057 const STSState& state) {
1058 DCHECK(CalledOnValidThread()); 1058 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1059 1059
1060 const std::string canonicalized_host = CanonicalizeHost(host); 1060 const std::string canonicalized_host = CanonicalizeHost(host);
1061 if (canonicalized_host.empty()) 1061 if (canonicalized_host.empty())
1062 return; 1062 return;
1063 1063
1064 // Only store new state when HSTS is explicitly enabled. If it is 1064 // Only store new state when HSTS is explicitly enabled. If it is
1065 // disabled, remove the state from the enabled hosts. 1065 // disabled, remove the state from the enabled hosts.
1066 if (state.ShouldUpgradeToSSL()) { 1066 if (state.ShouldUpgradeToSSL()) {
1067 STSState sts_state(state); 1067 STSState sts_state(state);
1068 // No need to store this value since it is redundant. (|canonicalized_host| 1068 // No need to store this value since it is redundant. (|canonicalized_host|
1069 // is the map key.) 1069 // is the map key.)
1070 sts_state.domain.clear(); 1070 sts_state.domain.clear();
1071 1071
1072 enabled_sts_hosts_[HashHost(canonicalized_host)] = sts_state; 1072 enabled_sts_hosts_[HashHost(canonicalized_host)] = sts_state;
1073 } else { 1073 } else {
1074 const std::string hashed_host = HashHost(canonicalized_host); 1074 const std::string hashed_host = HashHost(canonicalized_host);
1075 enabled_sts_hosts_.erase(hashed_host); 1075 enabled_sts_hosts_.erase(hashed_host);
1076 } 1076 }
1077 1077
1078 DirtyNotify(); 1078 DirtyNotify();
1079 } 1079 }
1080 1080
1081 void TransportSecurityState::EnablePKPHost(const std::string& host, 1081 void TransportSecurityState::EnablePKPHost(const std::string& host,
1082 const PKPState& state) { 1082 const PKPState& state) {
1083 DCHECK(CalledOnValidThread()); 1083 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1084 1084
1085 const std::string canonicalized_host = CanonicalizeHost(host); 1085 const std::string canonicalized_host = CanonicalizeHost(host);
1086 if (canonicalized_host.empty()) 1086 if (canonicalized_host.empty())
1087 return; 1087 return;
1088 1088
1089 // Only store new state when HPKP is explicitly enabled. If it is 1089 // Only store new state when HPKP is explicitly enabled. If it is
1090 // disabled, remove the state from the enabled hosts. 1090 // disabled, remove the state from the enabled hosts.
1091 if (state.HasPublicKeyPins()) { 1091 if (state.HasPublicKeyPins()) {
1092 PKPState pkp_state(state); 1092 PKPState pkp_state(state);
1093 // No need to store this value since it is redundant. (|canonicalized_host| 1093 // No need to store this value since it is redundant. (|canonicalized_host|
1094 // is the map key.) 1094 // is the map key.)
1095 pkp_state.domain.clear(); 1095 pkp_state.domain.clear();
1096 1096
1097 enabled_pkp_hosts_[HashHost(canonicalized_host)] = pkp_state; 1097 enabled_pkp_hosts_[HashHost(canonicalized_host)] = pkp_state;
1098 } else { 1098 } else {
1099 const std::string hashed_host = HashHost(canonicalized_host); 1099 const std::string hashed_host = HashHost(canonicalized_host);
1100 enabled_pkp_hosts_.erase(hashed_host); 1100 enabled_pkp_hosts_.erase(hashed_host);
1101 } 1101 }
1102 1102
1103 DirtyNotify(); 1103 DirtyNotify();
1104 } 1104 }
1105 1105
1106 void TransportSecurityState::EnableExpectCTHost(const std::string& host, 1106 void TransportSecurityState::EnableExpectCTHost(const std::string& host,
1107 const ExpectCTState& state) { 1107 const ExpectCTState& state) {
1108 DCHECK(CalledOnValidThread()); 1108 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1109 if (!IsDynamicExpectCTEnabled()) 1109 if (!IsDynamicExpectCTEnabled())
1110 return; 1110 return;
1111 1111
1112 const std::string canonicalized_host = CanonicalizeHost(host); 1112 const std::string canonicalized_host = CanonicalizeHost(host);
1113 if (canonicalized_host.empty()) 1113 if (canonicalized_host.empty())
1114 return; 1114 return;
1115 1115
1116 // Only store new state when Expect-CT is explicitly enabled. If it is 1116 // Only store new state when Expect-CT is explicitly enabled. If it is
1117 // disabled, remove the state from the enabled hosts. 1117 // disabled, remove the state from the enabled hosts.
1118 if (state.enforce || !state.report_uri.is_empty()) { 1118 if (state.enforce || !state.report_uri.is_empty()) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1181 1181
1182 report_sender_->Send(pkp_state.report_uri, "application/json; charset=utf-8", 1182 report_sender_->Send(pkp_state.report_uri, "application/json; charset=utf-8",
1183 serialized_report, base::Callback<void()>(), 1183 serialized_report, base::Callback<void()>(),
1184 base::Bind(RecordUMAForHPKPReportFailure)); 1184 base::Bind(RecordUMAForHPKPReportFailure));
1185 return PKPStatus::VIOLATED; 1185 return PKPStatus::VIOLATED;
1186 } 1186 }
1187 1187
1188 bool TransportSecurityState::GetStaticExpectCTState( 1188 bool TransportSecurityState::GetStaticExpectCTState(
1189 const std::string& host, 1189 const std::string& host,
1190 ExpectCTState* expect_ct_state) const { 1190 ExpectCTState* expect_ct_state) const {
1191 DCHECK(CalledOnValidThread()); 1191 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1192 1192
1193 if (!IsBuildTimely()) 1193 if (!IsBuildTimely())
1194 return false; 1194 return false;
1195 1195
1196 PreloadResult result; 1196 PreloadResult result;
1197 if (!DecodeHSTSPreload(host, &result)) 1197 if (!DecodeHSTSPreload(host, &result))
1198 return false; 1198 return false;
1199 1199
1200 if (!enable_static_expect_ct_ || !result.expect_ct) 1200 if (!enable_static_expect_ct_ || !result.expect_ct)
1201 return false; 1201 return false;
(...skipping 27 matching lines...) Expand all
1229 base::TimeDelta::FromMinutes(kTimeToRememberReportsMins)); 1229 base::TimeDelta::FromMinutes(kTimeToRememberReportsMins));
1230 1230
1231 expect_ct_reporter_->OnExpectCTFailed( 1231 expect_ct_reporter_->OnExpectCTFailed(
1232 host_port_pair, report_uri, validated_certificate_chain, 1232 host_port_pair, report_uri, validated_certificate_chain,
1233 served_certificate_chain, signed_certificate_timestamps); 1233 served_certificate_chain, signed_certificate_timestamps);
1234 } 1234 }
1235 1235
1236 bool TransportSecurityState::GetStaticExpectStapleState( 1236 bool TransportSecurityState::GetStaticExpectStapleState(
1237 const std::string& host, 1237 const std::string& host,
1238 ExpectStapleState* expect_staple_state) const { 1238 ExpectStapleState* expect_staple_state) const {
1239 DCHECK(CalledOnValidThread()); 1239 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1240 1240
1241 if (!IsBuildTimely()) 1241 if (!IsBuildTimely())
1242 return false; 1242 return false;
1243 1243
1244 PreloadResult result; 1244 PreloadResult result;
1245 if (!DecodeHSTSPreload(host, &result)) 1245 if (!DecodeHSTSPreload(host, &result))
1246 return false; 1246 return false;
1247 1247
1248 if (!enable_static_expect_staple_ || !result.expect_staple) 1248 if (!enable_static_expect_staple_ || !result.expect_staple)
1249 return false; 1249 return false;
1250 1250
1251 expect_staple_state->domain = host.substr(result.hostname_offset); 1251 expect_staple_state->domain = host.substr(result.hostname_offset);
1252 expect_staple_state->include_subdomains = 1252 expect_staple_state->include_subdomains =
1253 result.expect_staple_include_subdomains; 1253 result.expect_staple_include_subdomains;
1254 expect_staple_state->report_uri = 1254 expect_staple_state->report_uri =
1255 GURL(g_hsts_source 1255 GURL(g_hsts_source
1256 ->expect_staple_report_uris[result.expect_staple_report_uri_id]); 1256 ->expect_staple_report_uris[result.expect_staple_report_uri_id]);
1257 return true; 1257 return true;
1258 } 1258 }
1259 1259
1260 bool TransportSecurityState::DeleteDynamicDataForHost(const std::string& host) { 1260 bool TransportSecurityState::DeleteDynamicDataForHost(const std::string& host) {
1261 DCHECK(CalledOnValidThread()); 1261 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1262 1262
1263 const std::string canonicalized_host = CanonicalizeHost(host); 1263 const std::string canonicalized_host = CanonicalizeHost(host);
1264 if (canonicalized_host.empty()) 1264 if (canonicalized_host.empty())
1265 return false; 1265 return false;
1266 1266
1267 const std::string hashed_host = HashHost(canonicalized_host); 1267 const std::string hashed_host = HashHost(canonicalized_host);
1268 bool deleted = false; 1268 bool deleted = false;
1269 STSStateMap::iterator sts_interator = enabled_sts_hosts_.find(hashed_host); 1269 STSStateMap::iterator sts_interator = enabled_sts_hosts_.find(hashed_host);
1270 if (sts_interator != enabled_sts_hosts_.end()) { 1270 if (sts_interator != enabled_sts_hosts_.end()) {
1271 enabled_sts_hosts_.erase(sts_interator); 1271 enabled_sts_hosts_.erase(sts_interator);
(...skipping 12 matching lines...) Expand all
1284 enabled_expect_ct_hosts_.erase(expect_ct_iterator); 1284 enabled_expect_ct_hosts_.erase(expect_ct_iterator);
1285 deleted = true; 1285 deleted = true;
1286 } 1286 }
1287 1287
1288 if (deleted) 1288 if (deleted)
1289 DirtyNotify(); 1289 DirtyNotify();
1290 return deleted; 1290 return deleted;
1291 } 1291 }
1292 1292
1293 void TransportSecurityState::ClearDynamicData() { 1293 void TransportSecurityState::ClearDynamicData() {
1294 DCHECK(CalledOnValidThread()); 1294 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1295 enabled_sts_hosts_.clear(); 1295 enabled_sts_hosts_.clear();
1296 enabled_pkp_hosts_.clear(); 1296 enabled_pkp_hosts_.clear();
1297 enabled_expect_ct_hosts_.clear(); 1297 enabled_expect_ct_hosts_.clear();
1298 } 1298 }
1299 1299
1300 void TransportSecurityState::DeleteAllDynamicDataSince(const base::Time& time) { 1300 void TransportSecurityState::DeleteAllDynamicDataSince(const base::Time& time) {
1301 DCHECK(CalledOnValidThread()); 1301 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1302 1302
1303 bool dirtied = false; 1303 bool dirtied = false;
1304 STSStateMap::iterator sts_iterator = enabled_sts_hosts_.begin(); 1304 STSStateMap::iterator sts_iterator = enabled_sts_hosts_.begin();
1305 while (sts_iterator != enabled_sts_hosts_.end()) { 1305 while (sts_iterator != enabled_sts_hosts_.end()) {
1306 if (sts_iterator->second.last_observed >= time) { 1306 if (sts_iterator->second.last_observed >= time) {
1307 dirtied = true; 1307 dirtied = true;
1308 enabled_sts_hosts_.erase(sts_iterator++); 1308 enabled_sts_hosts_.erase(sts_iterator++);
1309 continue; 1309 continue;
1310 } 1310 }
1311 1311
(...skipping 21 matching lines...) Expand all
1333 } 1333 }
1334 1334
1335 ++expect_ct_iterator; 1335 ++expect_ct_iterator;
1336 } 1336 }
1337 1337
1338 if (dirtied) 1338 if (dirtied)
1339 DirtyNotify(); 1339 DirtyNotify();
1340 } 1340 }
1341 1341
1342 TransportSecurityState::~TransportSecurityState() { 1342 TransportSecurityState::~TransportSecurityState() {
1343 DCHECK(CalledOnValidThread()); 1343 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1344 } 1344 }
1345 1345
1346 void TransportSecurityState::DirtyNotify() { 1346 void TransportSecurityState::DirtyNotify() {
1347 DCHECK(CalledOnValidThread()); 1347 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1348 1348
1349 if (delegate_) 1349 if (delegate_)
1350 delegate_->StateIsDirty(this); 1350 delegate_->StateIsDirty(this);
1351 } 1351 }
1352 1352
1353 bool TransportSecurityState::AddHSTSHeader(const std::string& host, 1353 bool TransportSecurityState::AddHSTSHeader(const std::string& host,
1354 const std::string& value) { 1354 const std::string& value) {
1355 DCHECK(CalledOnValidThread()); 1355 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1356 1356
1357 base::Time now = base::Time::Now(); 1357 base::Time now = base::Time::Now();
1358 base::TimeDelta max_age; 1358 base::TimeDelta max_age;
1359 bool include_subdomains; 1359 bool include_subdomains;
1360 if (!ParseHSTSHeader(value, &max_age, &include_subdomains)) { 1360 if (!ParseHSTSHeader(value, &max_age, &include_subdomains)) {
1361 return false; 1361 return false;
1362 } 1362 }
1363 1363
1364 // Handle max-age == 0. 1364 // Handle max-age == 0.
1365 STSState::UpgradeMode upgrade_mode; 1365 STSState::UpgradeMode upgrade_mode;
1366 if (max_age.InSeconds() == 0) { 1366 if (max_age.InSeconds() == 0) {
1367 upgrade_mode = STSState::MODE_DEFAULT; 1367 upgrade_mode = STSState::MODE_DEFAULT;
1368 } else { 1368 } else {
1369 upgrade_mode = STSState::MODE_FORCE_HTTPS; 1369 upgrade_mode = STSState::MODE_FORCE_HTTPS;
1370 } 1370 }
1371 1371
1372 AddHSTSInternal(host, upgrade_mode, now + max_age, include_subdomains); 1372 AddHSTSInternal(host, upgrade_mode, now + max_age, include_subdomains);
1373 return true; 1373 return true;
1374 } 1374 }
1375 1375
1376 bool TransportSecurityState::AddHPKPHeader(const std::string& host, 1376 bool TransportSecurityState::AddHPKPHeader(const std::string& host,
1377 const std::string& value, 1377 const std::string& value,
1378 const SSLInfo& ssl_info) { 1378 const SSLInfo& ssl_info) {
1379 DCHECK(CalledOnValidThread()); 1379 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1380 1380
1381 base::Time now = base::Time::Now(); 1381 base::Time now = base::Time::Now();
1382 base::TimeDelta max_age; 1382 base::TimeDelta max_age;
1383 bool include_subdomains; 1383 bool include_subdomains;
1384 HashValueVector spki_hashes; 1384 HashValueVector spki_hashes;
1385 GURL report_uri; 1385 GURL report_uri;
1386 1386
1387 if (!ParseHPKPHeader(value, ssl_info.public_key_hashes, &max_age, 1387 if (!ParseHPKPHeader(value, ssl_info.public_key_hashes, &max_age,
1388 &include_subdomains, &spki_hashes, &report_uri)) { 1388 &include_subdomains, &spki_hashes, &report_uri)) {
1389 return false; 1389 return false;
1390 } 1390 }
1391 // Handle max-age == 0. 1391 // Handle max-age == 0.
1392 if (max_age.InSeconds() == 0) 1392 if (max_age.InSeconds() == 0)
1393 spki_hashes.clear(); 1393 spki_hashes.clear();
1394 AddHPKPInternal(host, now, now + max_age, include_subdomains, spki_hashes, 1394 AddHPKPInternal(host, now, now + max_age, include_subdomains, spki_hashes,
1395 report_uri); 1395 report_uri);
1396 return true; 1396 return true;
1397 } 1397 }
1398 1398
1399 void TransportSecurityState::AddHSTS(const std::string& host, 1399 void TransportSecurityState::AddHSTS(const std::string& host,
1400 const base::Time& expiry, 1400 const base::Time& expiry,
1401 bool include_subdomains) { 1401 bool include_subdomains) {
1402 DCHECK(CalledOnValidThread()); 1402 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1403 AddHSTSInternal(host, STSState::MODE_FORCE_HTTPS, expiry, include_subdomains); 1403 AddHSTSInternal(host, STSState::MODE_FORCE_HTTPS, expiry, include_subdomains);
1404 } 1404 }
1405 1405
1406 void TransportSecurityState::AddHPKP(const std::string& host, 1406 void TransportSecurityState::AddHPKP(const std::string& host,
1407 const base::Time& expiry, 1407 const base::Time& expiry,
1408 bool include_subdomains, 1408 bool include_subdomains,
1409 const HashValueVector& hashes, 1409 const HashValueVector& hashes,
1410 const GURL& report_uri) { 1410 const GURL& report_uri) {
1411 DCHECK(CalledOnValidThread()); 1411 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1412 AddHPKPInternal(host, base::Time::Now(), expiry, include_subdomains, hashes, 1412 AddHPKPInternal(host, base::Time::Now(), expiry, include_subdomains, hashes,
1413 report_uri); 1413 report_uri);
1414 } 1414 }
1415 1415
1416 void TransportSecurityState::AddExpectCT(const std::string& host, 1416 void TransportSecurityState::AddExpectCT(const std::string& host,
1417 const base::Time& expiry, 1417 const base::Time& expiry,
1418 bool enforce, 1418 bool enforce,
1419 const GURL& report_uri) { 1419 const GURL& report_uri) {
1420 DCHECK(CalledOnValidThread()); 1420 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1421 AddExpectCTInternal(host, base::Time::Now(), expiry, enforce, report_uri); 1421 AddExpectCTInternal(host, base::Time::Now(), expiry, enforce, report_uri);
1422 } 1422 }
1423 1423
1424 bool TransportSecurityState::ProcessHPKPReportOnlyHeader( 1424 bool TransportSecurityState::ProcessHPKPReportOnlyHeader(
1425 const std::string& value, 1425 const std::string& value,
1426 const HostPortPair& host_port_pair, 1426 const HostPortPair& host_port_pair,
1427 const SSLInfo& ssl_info) { 1427 const SSLInfo& ssl_info) {
1428 DCHECK(CalledOnValidThread()); 1428 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1429 1429
1430 base::Time now = base::Time::Now(); 1430 base::Time now = base::Time::Now();
1431 bool include_subdomains; 1431 bool include_subdomains;
1432 HashValueVector spki_hashes; 1432 HashValueVector spki_hashes;
1433 GURL report_uri; 1433 GURL report_uri;
1434 std::string unused_failure_log; 1434 std::string unused_failure_log;
1435 1435
1436 if (!ParseHPKPReportOnlyHeader(value, &include_subdomains, &spki_hashes, 1436 if (!ParseHPKPReportOnlyHeader(value, &include_subdomains, &spki_hashes,
1437 &report_uri) || 1437 &report_uri) ||
1438 !report_uri.is_valid() || report_uri.is_empty()) { 1438 !report_uri.is_valid() || report_uri.is_empty()) {
(...skipping 12 matching lines...) Expand all
1451 host_port_pair, ssl_info.is_issued_by_known_root, pkp_state, 1451 host_port_pair, ssl_info.is_issued_by_known_root, pkp_state,
1452 ssl_info.public_key_hashes, ssl_info.unverified_cert.get(), 1452 ssl_info.public_key_hashes, ssl_info.unverified_cert.get(),
1453 ssl_info.cert.get(), ENABLE_PIN_REPORTS, &unused_failure_log); 1453 ssl_info.cert.get(), ENABLE_PIN_REPORTS, &unused_failure_log);
1454 return true; 1454 return true;
1455 } 1455 }
1456 1456
1457 void TransportSecurityState::ProcessExpectCTHeader( 1457 void TransportSecurityState::ProcessExpectCTHeader(
1458 const std::string& value, 1458 const std::string& value,
1459 const HostPortPair& host_port_pair, 1459 const HostPortPair& host_port_pair,
1460 const SSLInfo& ssl_info) { 1460 const SSLInfo& ssl_info) {
1461 DCHECK(CalledOnValidThread()); 1461 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1462 1462
1463 // If a site sends `Expect-CT: preload` and appears on the preload list, they 1463 // If a site sends `Expect-CT: preload` and appears on the preload list, they
1464 // are in the experimental preload-list-only, report-only version of 1464 // are in the experimental preload-list-only, report-only version of
1465 // Expect-CT. 1465 // Expect-CT.
1466 if (value == "preload") { 1466 if (value == "preload") {
1467 if (!expect_ct_reporter_) 1467 if (!expect_ct_reporter_)
1468 return; 1468 return;
1469 if (!IsBuildTimely()) 1469 if (!IsBuildTimely())
1470 return; 1470 return;
1471 if (!ssl_info.is_issued_by_known_root) 1471 if (!ssl_info.is_issued_by_known_root)
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1565 DCHECK(found_state); 1565 DCHECK(found_state);
1566 return CheckPinsAndMaybeSendReport( 1566 return CheckPinsAndMaybeSendReport(
1567 host_port_pair, is_issued_by_known_root, pkp_state, hashes, 1567 host_port_pair, is_issued_by_known_root, pkp_state, hashes,
1568 served_certificate_chain, validated_certificate_chain, report_status, 1568 served_certificate_chain, validated_certificate_chain, report_status,
1569 failure_log); 1569 failure_log);
1570 } 1570 }
1571 1571
1572 bool TransportSecurityState::GetStaticDomainState(const std::string& host, 1572 bool TransportSecurityState::GetStaticDomainState(const std::string& host,
1573 STSState* sts_state, 1573 STSState* sts_state,
1574 PKPState* pkp_state) const { 1574 PKPState* pkp_state) const {
1575 DCHECK(CalledOnValidThread()); 1575 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1576 1576
1577 sts_state->upgrade_mode = STSState::MODE_FORCE_HTTPS; 1577 sts_state->upgrade_mode = STSState::MODE_FORCE_HTTPS;
1578 sts_state->include_subdomains = false; 1578 sts_state->include_subdomains = false;
1579 pkp_state->include_subdomains = false; 1579 pkp_state->include_subdomains = false;
1580 1580
1581 if (!IsBuildTimely()) 1581 if (!IsBuildTimely())
1582 return false; 1582 return false;
1583 1583
1584 PreloadResult result; 1584 PreloadResult result;
1585 if (!DecodeHSTSPreload(host, &result)) 1585 if (!DecodeHSTSPreload(host, &result))
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1620 sha256_hash++; 1620 sha256_hash++;
1621 } 1621 }
1622 } 1622 }
1623 } 1623 }
1624 1624
1625 return true; 1625 return true;
1626 } 1626 }
1627 1627
1628 bool TransportSecurityState::GetDynamicSTSState(const std::string& host, 1628 bool TransportSecurityState::GetDynamicSTSState(const std::string& host,
1629 STSState* result) { 1629 STSState* result) {
1630 DCHECK(CalledOnValidThread()); 1630 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1631 1631
1632 const std::string canonicalized_host = CanonicalizeHost(host); 1632 const std::string canonicalized_host = CanonicalizeHost(host);
1633 if (canonicalized_host.empty()) 1633 if (canonicalized_host.empty())
1634 return false; 1634 return false;
1635 1635
1636 base::Time current_time(base::Time::Now()); 1636 base::Time current_time(base::Time::Now());
1637 1637
1638 for (size_t i = 0; canonicalized_host[i]; i += canonicalized_host[i] + 1) { 1638 for (size_t i = 0; canonicalized_host[i]; i += canonicalized_host[i] + 1) {
1639 std::string host_sub_chunk(&canonicalized_host[i], 1639 std::string host_sub_chunk(&canonicalized_host[i],
1640 canonicalized_host.size() - i); 1640 canonicalized_host.size() - i);
(...skipping 20 matching lines...) Expand all
1661 1661
1662 break; 1662 break;
1663 } 1663 }
1664 } 1664 }
1665 1665
1666 return false; 1666 return false;
1667 } 1667 }
1668 1668
1669 bool TransportSecurityState::GetDynamicPKPState(const std::string& host, 1669 bool TransportSecurityState::GetDynamicPKPState(const std::string& host,
1670 PKPState* result) { 1670 PKPState* result) {
1671 DCHECK(CalledOnValidThread()); 1671 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1672 1672
1673 const std::string canonicalized_host = CanonicalizeHost(host); 1673 const std::string canonicalized_host = CanonicalizeHost(host);
1674 if (canonicalized_host.empty()) 1674 if (canonicalized_host.empty())
1675 return false; 1675 return false;
1676 1676
1677 base::Time current_time(base::Time::Now()); 1677 base::Time current_time(base::Time::Now());
1678 1678
1679 for (size_t i = 0; canonicalized_host[i]; i += canonicalized_host[i] + 1) { 1679 for (size_t i = 0; canonicalized_host[i]; i += canonicalized_host[i] + 1) {
1680 std::string host_sub_chunk(&canonicalized_host[i], 1680 std::string host_sub_chunk(&canonicalized_host[i],
1681 canonicalized_host.size() - i); 1681 canonicalized_host.size() - i);
(...skipping 20 matching lines...) Expand all
1702 1702
1703 break; 1703 break;
1704 } 1704 }
1705 } 1705 }
1706 1706
1707 return false; 1707 return false;
1708 } 1708 }
1709 1709
1710 bool TransportSecurityState::GetDynamicExpectCTState(const std::string& host, 1710 bool TransportSecurityState::GetDynamicExpectCTState(const std::string& host,
1711 ExpectCTState* result) { 1711 ExpectCTState* result) {
1712 DCHECK(CalledOnValidThread()); 1712 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1713 1713
1714 const std::string canonicalized_host = CanonicalizeHost(host); 1714 const std::string canonicalized_host = CanonicalizeHost(host);
1715 if (canonicalized_host.empty()) 1715 if (canonicalized_host.empty())
1716 return false; 1716 return false;
1717 1717
1718 base::Time current_time(base::Time::Now()); 1718 base::Time current_time(base::Time::Now());
1719 ExpectCTStateMap::iterator j = 1719 ExpectCTStateMap::iterator j =
1720 enabled_expect_ct_hosts_.find(HashHost(canonicalized_host)); 1720 enabled_expect_ct_hosts_.find(HashHost(canonicalized_host));
1721 if (j == enabled_expect_ct_hosts_.end()) 1721 if (j == enabled_expect_ct_hosts_.end())
1722 return false; 1722 return false;
1723 // If the entry is invalid, drop it. 1723 // If the entry is invalid, drop it.
1724 if (current_time > j->second.expiry) { 1724 if (current_time > j->second.expiry) {
1725 enabled_expect_ct_hosts_.erase(j); 1725 enabled_expect_ct_hosts_.erase(j);
1726 DirtyNotify(); 1726 DirtyNotify();
1727 return false; 1727 return false;
1728 } 1728 }
1729 1729
1730 *result = j->second; 1730 *result = j->second;
1731 return true; 1731 return true;
1732 } 1732 }
1733 1733
1734 void TransportSecurityState::AddOrUpdateEnabledSTSHosts( 1734 void TransportSecurityState::AddOrUpdateEnabledSTSHosts(
1735 const std::string& hashed_host, 1735 const std::string& hashed_host,
1736 const STSState& state) { 1736 const STSState& state) {
1737 DCHECK(CalledOnValidThread()); 1737 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1738 DCHECK(state.ShouldUpgradeToSSL()); 1738 DCHECK(state.ShouldUpgradeToSSL());
1739 enabled_sts_hosts_[hashed_host] = state; 1739 enabled_sts_hosts_[hashed_host] = state;
1740 } 1740 }
1741 1741
1742 void TransportSecurityState::AddOrUpdateEnabledPKPHosts( 1742 void TransportSecurityState::AddOrUpdateEnabledPKPHosts(
1743 const std::string& hashed_host, 1743 const std::string& hashed_host,
1744 const PKPState& state) { 1744 const PKPState& state) {
1745 DCHECK(CalledOnValidThread()); 1745 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1746 DCHECK(state.HasPublicKeyPins()); 1746 DCHECK(state.HasPublicKeyPins());
1747 enabled_pkp_hosts_[hashed_host] = state; 1747 enabled_pkp_hosts_[hashed_host] = state;
1748 } 1748 }
1749 1749
1750 void TransportSecurityState::AddOrUpdateEnabledExpectCTHosts( 1750 void TransportSecurityState::AddOrUpdateEnabledExpectCTHosts(
1751 const std::string& hashed_host, 1751 const std::string& hashed_host,
1752 const ExpectCTState& state) { 1752 const ExpectCTState& state) {
1753 DCHECK(CalledOnValidThread()); 1753 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
1754 DCHECK(state.enforce || !state.report_uri.is_empty()); 1754 DCHECK(state.enforce || !state.report_uri.is_empty());
1755 enabled_expect_ct_hosts_[hashed_host] = state; 1755 enabled_expect_ct_hosts_[hashed_host] = state;
1756 } 1756 }
1757 1757
1758 TransportSecurityState::STSState::STSState() 1758 TransportSecurityState::STSState::STSState()
1759 : upgrade_mode(MODE_DEFAULT), include_subdomains(false) { 1759 : upgrade_mode(MODE_DEFAULT), include_subdomains(false) {
1760 } 1760 }
1761 1761
1762 TransportSecurityState::STSState::~STSState() { 1762 TransportSecurityState::STSState::~STSState() {
1763 } 1763 }
(...skipping 20 matching lines...) Expand all
1784 } 1784 }
1785 1785
1786 TransportSecurityState::ExpectCTState::ExpectCTState() : enforce(false) {} 1786 TransportSecurityState::ExpectCTState::ExpectCTState() : enforce(false) {}
1787 1787
1788 TransportSecurityState::ExpectCTState::~ExpectCTState() {} 1788 TransportSecurityState::ExpectCTState::~ExpectCTState() {}
1789 1789
1790 TransportSecurityState::ExpectCTStateIterator::ExpectCTStateIterator( 1790 TransportSecurityState::ExpectCTStateIterator::ExpectCTStateIterator(
1791 const TransportSecurityState& state) 1791 const TransportSecurityState& state)
1792 : iterator_(state.enabled_expect_ct_hosts_.begin()), 1792 : iterator_(state.enabled_expect_ct_hosts_.begin()),
1793 end_(state.enabled_expect_ct_hosts_.end()) { 1793 end_(state.enabled_expect_ct_hosts_.end()) {
1794 DCHECK(state.CalledOnValidThread()); 1794 state.AssertCalledOnValidThread();
1795 } 1795 }
1796 1796
1797 TransportSecurityState::ExpectCTStateIterator::~ExpectCTStateIterator() {} 1797 TransportSecurityState::ExpectCTStateIterator::~ExpectCTStateIterator() {}
1798 1798
1799 TransportSecurityState::ExpectStapleState::ExpectStapleState() 1799 TransportSecurityState::ExpectStapleState::ExpectStapleState()
1800 : include_subdomains(false) {} 1800 : include_subdomains(false) {}
1801 1801
1802 TransportSecurityState::ExpectStapleState::~ExpectStapleState() {} 1802 TransportSecurityState::ExpectStapleState::~ExpectStapleState() {}
1803 1803
1804 bool TransportSecurityState::PKPState::CheckPublicKeyPins( 1804 bool TransportSecurityState::PKPState::CheckPublicKeyPins(
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1843 TransportSecurityState::PKPStateIterator::PKPStateIterator( 1843 TransportSecurityState::PKPStateIterator::PKPStateIterator(
1844 const TransportSecurityState& state) 1844 const TransportSecurityState& state)
1845 : iterator_(state.enabled_pkp_hosts_.begin()), 1845 : iterator_(state.enabled_pkp_hosts_.begin()),
1846 end_(state.enabled_pkp_hosts_.end()) { 1846 end_(state.enabled_pkp_hosts_.end()) {
1847 } 1847 }
1848 1848
1849 TransportSecurityState::PKPStateIterator::~PKPStateIterator() { 1849 TransportSecurityState::PKPStateIterator::~PKPStateIterator() {
1850 } 1850 }
1851 1851
1852 } // namespace net 1852 } // namespace net
OLDNEW
« no previous file with comments | « net/http/transport_security_state.h ('k') | net/log/net_log_util.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698