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

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

Issue 2910473005: Deprecate NonThreadSafe in net/ in favor of SequenceChecker/ThreadChecker. (Closed)
Patch Set: another compile nit Created 3 years, 7 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 (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 731 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 enable_static_expect_ct_(true), 742 enable_static_expect_ct_(true),
743 enable_static_expect_staple_(true), 743 enable_static_expect_staple_(true),
744 enable_pkp_bypass_for_local_trust_anchors_(true), 744 enable_pkp_bypass_for_local_trust_anchors_(true),
745 sent_reports_cache_(kMaxHPKPReportCacheEntries) { 745 sent_reports_cache_(kMaxHPKPReportCacheEntries) {
746 // Static pinning is only enabled for official builds to make sure that 746 // Static pinning is only enabled for official builds to make sure that
747 // others don't end up with pins that cannot be easily updated. 747 // others don't end up with pins that cannot be easily updated.
748 #if !defined(GOOGLE_CHROME_BUILD) || defined(OS_ANDROID) || defined(OS_IOS) 748 #if !defined(GOOGLE_CHROME_BUILD) || defined(OS_ANDROID) || defined(OS_IOS)
749 enable_static_pins_ = false; 749 enable_static_pins_ = false;
750 enable_static_expect_ct_ = false; 750 enable_static_expect_ct_ = false;
751 #endif 751 #endif
752 DCHECK(CalledOnValidThread()); 752 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
753 } 753 }
754 754
755 // Both HSTS and HPKP cause fatal SSL errors, so return true if a 755 // Both HSTS and HPKP cause fatal SSL errors, so return true if a
756 // host has either. 756 // host has either.
757 bool TransportSecurityState::ShouldSSLErrorsBeFatal(const std::string& host) { 757 bool TransportSecurityState::ShouldSSLErrorsBeFatal(const std::string& host) {
758 STSState sts_state; 758 STSState sts_state;
759 PKPState pkp_state; 759 PKPState pkp_state;
760 if (GetStaticDomainState(host, &sts_state, &pkp_state)) 760 if (GetStaticDomainState(host, &sts_state, &pkp_state))
761 return true; 761 return true;
762 if (GetDynamicSTSState(host, &sts_state)) 762 if (GetDynamicSTSState(host, &sts_state))
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
804 804
805 UMA_HISTOGRAM_BOOLEAN("Net.PublicKeyPinSuccess", 805 UMA_HISTOGRAM_BOOLEAN("Net.PublicKeyPinSuccess",
806 pin_validity == PKPStatus::OK); 806 pin_validity == PKPStatus::OK);
807 return pin_validity; 807 return pin_validity;
808 } 808 }
809 809
810 void TransportSecurityState::CheckExpectStaple( 810 void TransportSecurityState::CheckExpectStaple(
811 const HostPortPair& host_port_pair, 811 const HostPortPair& host_port_pair,
812 const SSLInfo& ssl_info, 812 const SSLInfo& ssl_info,
813 base::StringPiece ocsp_response) { 813 base::StringPiece ocsp_response) {
814 DCHECK(CalledOnValidThread()); 814 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
815 if (!enable_static_expect_staple_ || !report_sender_ || 815 if (!enable_static_expect_staple_ || !report_sender_ ||
816 !ssl_info.is_issued_by_known_root) { 816 !ssl_info.is_issued_by_known_root) {
817 return; 817 return;
818 } 818 }
819 819
820 // Determine if the host is on the Expect-Staple preload list. If the build is 820 // Determine if the host is on the Expect-Staple preload list. If the build is
821 // not timely (i.e. the preload list is not fresh), this will fail and return 821 // not timely (i.e. the preload list is not fresh), this will fail and return
822 // false. 822 // false.
823 ExpectStapleState expect_staple_state; 823 ExpectStapleState expect_staple_state;
824 if (!GetStaticExpectStapleState(host_port_pair.host(), &expect_staple_state)) 824 if (!GetStaticExpectStapleState(host_port_pair.host(), &expect_staple_state))
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 // No exception found. This certificate must conform to the CT policy. 967 // No exception found. This certificate must conform to the CT policy.
968 return CT_REQUIREMENTS_NOT_MET; 968 return CT_REQUIREMENTS_NOT_MET;
969 } 969 }
970 } 970 }
971 971
972 return default_response; 972 return default_response;
973 } 973 }
974 974
975 void TransportSecurityState::SetDelegate( 975 void TransportSecurityState::SetDelegate(
976 TransportSecurityState::Delegate* delegate) { 976 TransportSecurityState::Delegate* delegate) {
977 DCHECK(CalledOnValidThread()); 977 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
978 delegate_ = delegate; 978 delegate_ = delegate;
979 } 979 }
980 980
981 void TransportSecurityState::SetReportSender( 981 void TransportSecurityState::SetReportSender(
982 TransportSecurityState::ReportSenderInterface* report_sender) { 982 TransportSecurityState::ReportSenderInterface* report_sender) {
983 DCHECK(CalledOnValidThread()); 983 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
984 report_sender_ = report_sender; 984 report_sender_ = report_sender;
985 } 985 }
986 986
987 void TransportSecurityState::SetExpectCTReporter( 987 void TransportSecurityState::SetExpectCTReporter(
988 ExpectCTReporter* expect_ct_reporter) { 988 ExpectCTReporter* expect_ct_reporter) {
989 DCHECK(CalledOnValidThread()); 989 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
990 expect_ct_reporter_ = expect_ct_reporter; 990 expect_ct_reporter_ = expect_ct_reporter;
991 } 991 }
992 992
993 void TransportSecurityState::SetRequireCTDelegate(RequireCTDelegate* delegate) { 993 void TransportSecurityState::SetRequireCTDelegate(RequireCTDelegate* delegate) {
994 DCHECK(CalledOnValidThread()); 994 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
995 require_ct_delegate_ = delegate; 995 require_ct_delegate_ = delegate;
996 } 996 }
997 997
998 void TransportSecurityState::AddHSTSInternal( 998 void TransportSecurityState::AddHSTSInternal(
999 const std::string& host, 999 const std::string& host,
1000 TransportSecurityState::STSState::UpgradeMode upgrade_mode, 1000 TransportSecurityState::STSState::UpgradeMode upgrade_mode,
1001 const base::Time& expiry, 1001 const base::Time& expiry,
1002 bool include_subdomains) { 1002 bool include_subdomains) {
1003 DCHECK(CalledOnValidThread()); 1003 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1004 1004
1005 STSState sts_state; 1005 STSState sts_state;
1006 sts_state.last_observed = base::Time::Now(); 1006 sts_state.last_observed = base::Time::Now();
1007 sts_state.include_subdomains = include_subdomains; 1007 sts_state.include_subdomains = include_subdomains;
1008 sts_state.expiry = expiry; 1008 sts_state.expiry = expiry;
1009 sts_state.upgrade_mode = upgrade_mode; 1009 sts_state.upgrade_mode = upgrade_mode;
1010 1010
1011 EnableSTSHost(host, sts_state); 1011 EnableSTSHost(host, sts_state);
1012 } 1012 }
1013 1013
1014 void TransportSecurityState::AddHPKPInternal(const std::string& host, 1014 void TransportSecurityState::AddHPKPInternal(const std::string& host,
1015 const base::Time& last_observed, 1015 const base::Time& last_observed,
1016 const base::Time& expiry, 1016 const base::Time& expiry,
1017 bool include_subdomains, 1017 bool include_subdomains,
1018 const HashValueVector& hashes, 1018 const HashValueVector& hashes,
1019 const GURL& report_uri) { 1019 const GURL& report_uri) {
1020 DCHECK(CalledOnValidThread()); 1020 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1021 1021
1022 PKPState pkp_state; 1022 PKPState pkp_state;
1023 pkp_state.last_observed = last_observed; 1023 pkp_state.last_observed = last_observed;
1024 pkp_state.expiry = expiry; 1024 pkp_state.expiry = expiry;
1025 pkp_state.include_subdomains = include_subdomains; 1025 pkp_state.include_subdomains = include_subdomains;
1026 pkp_state.spki_hashes = hashes; 1026 pkp_state.spki_hashes = hashes;
1027 pkp_state.report_uri = report_uri; 1027 pkp_state.report_uri = report_uri;
1028 1028
1029 EnablePKPHost(host, pkp_state); 1029 EnablePKPHost(host, pkp_state);
1030 } 1030 }
1031 1031
1032 void TransportSecurityState::AddExpectCTInternal( 1032 void TransportSecurityState::AddExpectCTInternal(
1033 const std::string& host, 1033 const std::string& host,
1034 const base::Time& last_observed, 1034 const base::Time& last_observed,
1035 const base::Time& expiry, 1035 const base::Time& expiry,
1036 bool enforce, 1036 bool enforce,
1037 const GURL& report_uri) { 1037 const GURL& report_uri) {
1038 DCHECK(CalledOnValidThread()); 1038 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1039 1039
1040 ExpectCTState expect_ct_state; 1040 ExpectCTState expect_ct_state;
1041 expect_ct_state.last_observed = last_observed; 1041 expect_ct_state.last_observed = last_observed;
1042 expect_ct_state.expiry = expiry; 1042 expect_ct_state.expiry = expiry;
1043 expect_ct_state.enforce = enforce; 1043 expect_ct_state.enforce = enforce;
1044 expect_ct_state.report_uri = report_uri; 1044 expect_ct_state.report_uri = report_uri;
1045 1045
1046 EnableExpectCTHost(host, expect_ct_state); 1046 EnableExpectCTHost(host, expect_ct_state);
1047 } 1047 }
1048 1048
1049 void TransportSecurityState:: 1049 void TransportSecurityState::
1050 SetEnablePublicKeyPinningBypassForLocalTrustAnchors(bool value) { 1050 SetEnablePublicKeyPinningBypassForLocalTrustAnchors(bool value) {
1051 enable_pkp_bypass_for_local_trust_anchors_ = value; 1051 enable_pkp_bypass_for_local_trust_anchors_ = value;
1052 } 1052 }
1053 1053
1054 void TransportSecurityState::EnableSTSHost(const std::string& host, 1054 void TransportSecurityState::EnableSTSHost(const std::string& host,
1055 const STSState& state) { 1055 const STSState& state) {
1056 DCHECK(CalledOnValidThread()); 1056 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1057 1057
1058 const std::string canonicalized_host = CanonicalizeHost(host); 1058 const std::string canonicalized_host = CanonicalizeHost(host);
1059 if (canonicalized_host.empty()) 1059 if (canonicalized_host.empty())
1060 return; 1060 return;
1061 1061
1062 // Only store new state when HSTS is explicitly enabled. If it is 1062 // Only store new state when HSTS is explicitly enabled. If it is
1063 // disabled, remove the state from the enabled hosts. 1063 // disabled, remove the state from the enabled hosts.
1064 if (state.ShouldUpgradeToSSL()) { 1064 if (state.ShouldUpgradeToSSL()) {
1065 STSState sts_state(state); 1065 STSState sts_state(state);
1066 // No need to store this value since it is redundant. (|canonicalized_host| 1066 // No need to store this value since it is redundant. (|canonicalized_host|
1067 // is the map key.) 1067 // is the map key.)
1068 sts_state.domain.clear(); 1068 sts_state.domain.clear();
1069 1069
1070 enabled_sts_hosts_[HashHost(canonicalized_host)] = sts_state; 1070 enabled_sts_hosts_[HashHost(canonicalized_host)] = sts_state;
1071 } else { 1071 } else {
1072 const std::string hashed_host = HashHost(canonicalized_host); 1072 const std::string hashed_host = HashHost(canonicalized_host);
1073 enabled_sts_hosts_.erase(hashed_host); 1073 enabled_sts_hosts_.erase(hashed_host);
1074 } 1074 }
1075 1075
1076 DirtyNotify(); 1076 DirtyNotify();
1077 } 1077 }
1078 1078
1079 void TransportSecurityState::EnablePKPHost(const std::string& host, 1079 void TransportSecurityState::EnablePKPHost(const std::string& host,
1080 const PKPState& state) { 1080 const PKPState& state) {
1081 DCHECK(CalledOnValidThread()); 1081 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1082 1082
1083 const std::string canonicalized_host = CanonicalizeHost(host); 1083 const std::string canonicalized_host = CanonicalizeHost(host);
1084 if (canonicalized_host.empty()) 1084 if (canonicalized_host.empty())
1085 return; 1085 return;
1086 1086
1087 // Only store new state when HPKP is explicitly enabled. If it is 1087 // Only store new state when HPKP is explicitly enabled. If it is
1088 // disabled, remove the state from the enabled hosts. 1088 // disabled, remove the state from the enabled hosts.
1089 if (state.HasPublicKeyPins()) { 1089 if (state.HasPublicKeyPins()) {
1090 PKPState pkp_state(state); 1090 PKPState pkp_state(state);
1091 // No need to store this value since it is redundant. (|canonicalized_host| 1091 // No need to store this value since it is redundant. (|canonicalized_host|
1092 // is the map key.) 1092 // is the map key.)
1093 pkp_state.domain.clear(); 1093 pkp_state.domain.clear();
1094 1094
1095 enabled_pkp_hosts_[HashHost(canonicalized_host)] = pkp_state; 1095 enabled_pkp_hosts_[HashHost(canonicalized_host)] = pkp_state;
1096 } else { 1096 } else {
1097 const std::string hashed_host = HashHost(canonicalized_host); 1097 const std::string hashed_host = HashHost(canonicalized_host);
1098 enabled_pkp_hosts_.erase(hashed_host); 1098 enabled_pkp_hosts_.erase(hashed_host);
1099 } 1099 }
1100 1100
1101 DirtyNotify(); 1101 DirtyNotify();
1102 } 1102 }
1103 1103
1104 void TransportSecurityState::EnableExpectCTHost(const std::string& host, 1104 void TransportSecurityState::EnableExpectCTHost(const std::string& host,
1105 const ExpectCTState& state) { 1105 const ExpectCTState& state) {
1106 DCHECK(CalledOnValidThread()); 1106 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1107 if (!IsDynamicExpectCTEnabled()) 1107 if (!IsDynamicExpectCTEnabled())
1108 return; 1108 return;
1109 1109
1110 const std::string canonicalized_host = CanonicalizeHost(host); 1110 const std::string canonicalized_host = CanonicalizeHost(host);
1111 if (canonicalized_host.empty()) 1111 if (canonicalized_host.empty())
1112 return; 1112 return;
1113 1113
1114 // Only store new state when Expect-CT is explicitly enabled. If it is 1114 // Only store new state when Expect-CT is explicitly enabled. If it is
1115 // disabled, remove the state from the enabled hosts. 1115 // disabled, remove the state from the enabled hosts.
1116 if (state.enforce || !state.report_uri.is_empty()) { 1116 if (state.enforce || !state.report_uri.is_empty()) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1179 1179
1180 report_sender_->Send(pkp_state.report_uri, "application/json; charset=utf-8", 1180 report_sender_->Send(pkp_state.report_uri, "application/json; charset=utf-8",
1181 serialized_report, base::Callback<void()>(), 1181 serialized_report, base::Callback<void()>(),
1182 base::Bind(RecordUMAForHPKPReportFailure)); 1182 base::Bind(RecordUMAForHPKPReportFailure));
1183 return PKPStatus::VIOLATED; 1183 return PKPStatus::VIOLATED;
1184 } 1184 }
1185 1185
1186 bool TransportSecurityState::GetStaticExpectCTState( 1186 bool TransportSecurityState::GetStaticExpectCTState(
1187 const std::string& host, 1187 const std::string& host,
1188 ExpectCTState* expect_ct_state) const { 1188 ExpectCTState* expect_ct_state) const {
1189 DCHECK(CalledOnValidThread()); 1189 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1190 1190
1191 if (!IsBuildTimely()) 1191 if (!IsBuildTimely())
1192 return false; 1192 return false;
1193 1193
1194 PreloadResult result; 1194 PreloadResult result;
1195 if (!DecodeHSTSPreload(host, &result)) 1195 if (!DecodeHSTSPreload(host, &result))
1196 return false; 1196 return false;
1197 1197
1198 if (!enable_static_expect_ct_ || !result.expect_ct) 1198 if (!enable_static_expect_ct_ || !result.expect_ct)
1199 return false; 1199 return false;
1200 1200
1201 expect_ct_state->domain = host.substr(result.hostname_offset); 1201 expect_ct_state->domain = host.substr(result.hostname_offset);
1202 expect_ct_state->report_uri = GURL( 1202 expect_ct_state->report_uri = GURL(
1203 g_hsts_source->expect_ct_report_uris[result.expect_ct_report_uri_id]); 1203 g_hsts_source->expect_ct_report_uris[result.expect_ct_report_uri_id]);
1204 return true; 1204 return true;
1205 } 1205 }
1206 1206
1207 bool TransportSecurityState::GetStaticExpectStapleState( 1207 bool TransportSecurityState::GetStaticExpectStapleState(
1208 const std::string& host, 1208 const std::string& host,
1209 ExpectStapleState* expect_staple_state) const { 1209 ExpectStapleState* expect_staple_state) const {
1210 DCHECK(CalledOnValidThread()); 1210 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1211 1211
1212 if (!IsBuildTimely()) 1212 if (!IsBuildTimely())
1213 return false; 1213 return false;
1214 1214
1215 PreloadResult result; 1215 PreloadResult result;
1216 if (!DecodeHSTSPreload(host, &result)) 1216 if (!DecodeHSTSPreload(host, &result))
1217 return false; 1217 return false;
1218 1218
1219 if (!enable_static_expect_staple_ || !result.expect_staple) 1219 if (!enable_static_expect_staple_ || !result.expect_staple)
1220 return false; 1220 return false;
1221 1221
1222 expect_staple_state->domain = host.substr(result.hostname_offset); 1222 expect_staple_state->domain = host.substr(result.hostname_offset);
1223 expect_staple_state->include_subdomains = 1223 expect_staple_state->include_subdomains =
1224 result.expect_staple_include_subdomains; 1224 result.expect_staple_include_subdomains;
1225 expect_staple_state->report_uri = 1225 expect_staple_state->report_uri =
1226 GURL(g_hsts_source 1226 GURL(g_hsts_source
1227 ->expect_staple_report_uris[result.expect_staple_report_uri_id]); 1227 ->expect_staple_report_uris[result.expect_staple_report_uri_id]);
1228 return true; 1228 return true;
1229 } 1229 }
1230 1230
1231 bool TransportSecurityState::DeleteDynamicDataForHost(const std::string& host) { 1231 bool TransportSecurityState::DeleteDynamicDataForHost(const std::string& host) {
1232 DCHECK(CalledOnValidThread()); 1232 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1233 1233
1234 const std::string canonicalized_host = CanonicalizeHost(host); 1234 const std::string canonicalized_host = CanonicalizeHost(host);
1235 if (canonicalized_host.empty()) 1235 if (canonicalized_host.empty())
1236 return false; 1236 return false;
1237 1237
1238 const std::string hashed_host = HashHost(canonicalized_host); 1238 const std::string hashed_host = HashHost(canonicalized_host);
1239 bool deleted = false; 1239 bool deleted = false;
1240 STSStateMap::iterator sts_interator = enabled_sts_hosts_.find(hashed_host); 1240 STSStateMap::iterator sts_interator = enabled_sts_hosts_.find(hashed_host);
1241 if (sts_interator != enabled_sts_hosts_.end()) { 1241 if (sts_interator != enabled_sts_hosts_.end()) {
1242 enabled_sts_hosts_.erase(sts_interator); 1242 enabled_sts_hosts_.erase(sts_interator);
(...skipping 12 matching lines...) Expand all
1255 enabled_expect_ct_hosts_.erase(expect_ct_iterator); 1255 enabled_expect_ct_hosts_.erase(expect_ct_iterator);
1256 deleted = true; 1256 deleted = true;
1257 } 1257 }
1258 1258
1259 if (deleted) 1259 if (deleted)
1260 DirtyNotify(); 1260 DirtyNotify();
1261 return deleted; 1261 return deleted;
1262 } 1262 }
1263 1263
1264 void TransportSecurityState::ClearDynamicData() { 1264 void TransportSecurityState::ClearDynamicData() {
1265 DCHECK(CalledOnValidThread()); 1265 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1266 enabled_sts_hosts_.clear(); 1266 enabled_sts_hosts_.clear();
1267 enabled_pkp_hosts_.clear(); 1267 enabled_pkp_hosts_.clear();
1268 enabled_expect_ct_hosts_.clear(); 1268 enabled_expect_ct_hosts_.clear();
1269 } 1269 }
1270 1270
1271 void TransportSecurityState::DeleteAllDynamicDataSince(const base::Time& time) { 1271 void TransportSecurityState::DeleteAllDynamicDataSince(const base::Time& time) {
1272 DCHECK(CalledOnValidThread()); 1272 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1273 1273
1274 bool dirtied = false; 1274 bool dirtied = false;
1275 STSStateMap::iterator sts_iterator = enabled_sts_hosts_.begin(); 1275 STSStateMap::iterator sts_iterator = enabled_sts_hosts_.begin();
1276 while (sts_iterator != enabled_sts_hosts_.end()) { 1276 while (sts_iterator != enabled_sts_hosts_.end()) {
1277 if (sts_iterator->second.last_observed >= time) { 1277 if (sts_iterator->second.last_observed >= time) {
1278 dirtied = true; 1278 dirtied = true;
1279 enabled_sts_hosts_.erase(sts_iterator++); 1279 enabled_sts_hosts_.erase(sts_iterator++);
1280 continue; 1280 continue;
1281 } 1281 }
1282 1282
(...skipping 21 matching lines...) Expand all
1304 } 1304 }
1305 1305
1306 ++expect_ct_iterator; 1306 ++expect_ct_iterator;
1307 } 1307 }
1308 1308
1309 if (dirtied) 1309 if (dirtied)
1310 DirtyNotify(); 1310 DirtyNotify();
1311 } 1311 }
1312 1312
1313 TransportSecurityState::~TransportSecurityState() { 1313 TransportSecurityState::~TransportSecurityState() {
1314 DCHECK(CalledOnValidThread()); 1314 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1315 } 1315 }
1316 1316
1317 void TransportSecurityState::DirtyNotify() { 1317 void TransportSecurityState::DirtyNotify() {
1318 DCHECK(CalledOnValidThread()); 1318 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1319 1319
1320 if (delegate_) 1320 if (delegate_)
1321 delegate_->StateIsDirty(this); 1321 delegate_->StateIsDirty(this);
1322 } 1322 }
1323 1323
1324 bool TransportSecurityState::AddHSTSHeader(const std::string& host, 1324 bool TransportSecurityState::AddHSTSHeader(const std::string& host,
1325 const std::string& value) { 1325 const std::string& value) {
1326 DCHECK(CalledOnValidThread()); 1326 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1327 1327
1328 base::Time now = base::Time::Now(); 1328 base::Time now = base::Time::Now();
1329 base::TimeDelta max_age; 1329 base::TimeDelta max_age;
1330 bool include_subdomains; 1330 bool include_subdomains;
1331 if (!ParseHSTSHeader(value, &max_age, &include_subdomains)) { 1331 if (!ParseHSTSHeader(value, &max_age, &include_subdomains)) {
1332 return false; 1332 return false;
1333 } 1333 }
1334 1334
1335 // Handle max-age == 0. 1335 // Handle max-age == 0.
1336 STSState::UpgradeMode upgrade_mode; 1336 STSState::UpgradeMode upgrade_mode;
1337 if (max_age.InSeconds() == 0) { 1337 if (max_age.InSeconds() == 0) {
1338 upgrade_mode = STSState::MODE_DEFAULT; 1338 upgrade_mode = STSState::MODE_DEFAULT;
1339 } else { 1339 } else {
1340 upgrade_mode = STSState::MODE_FORCE_HTTPS; 1340 upgrade_mode = STSState::MODE_FORCE_HTTPS;
1341 } 1341 }
1342 1342
1343 AddHSTSInternal(host, upgrade_mode, now + max_age, include_subdomains); 1343 AddHSTSInternal(host, upgrade_mode, now + max_age, include_subdomains);
1344 return true; 1344 return true;
1345 } 1345 }
1346 1346
1347 bool TransportSecurityState::AddHPKPHeader(const std::string& host, 1347 bool TransportSecurityState::AddHPKPHeader(const std::string& host,
1348 const std::string& value, 1348 const std::string& value,
1349 const SSLInfo& ssl_info) { 1349 const SSLInfo& ssl_info) {
1350 DCHECK(CalledOnValidThread()); 1350 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1351 1351
1352 base::Time now = base::Time::Now(); 1352 base::Time now = base::Time::Now();
1353 base::TimeDelta max_age; 1353 base::TimeDelta max_age;
1354 bool include_subdomains; 1354 bool include_subdomains;
1355 HashValueVector spki_hashes; 1355 HashValueVector spki_hashes;
1356 GURL report_uri; 1356 GURL report_uri;
1357 1357
1358 if (!ParseHPKPHeader(value, ssl_info.public_key_hashes, &max_age, 1358 if (!ParseHPKPHeader(value, ssl_info.public_key_hashes, &max_age,
1359 &include_subdomains, &spki_hashes, &report_uri)) { 1359 &include_subdomains, &spki_hashes, &report_uri)) {
1360 return false; 1360 return false;
1361 } 1361 }
1362 // Handle max-age == 0. 1362 // Handle max-age == 0.
1363 if (max_age.InSeconds() == 0) 1363 if (max_age.InSeconds() == 0)
1364 spki_hashes.clear(); 1364 spki_hashes.clear();
1365 AddHPKPInternal(host, now, now + max_age, include_subdomains, spki_hashes, 1365 AddHPKPInternal(host, now, now + max_age, include_subdomains, spki_hashes,
1366 report_uri); 1366 report_uri);
1367 return true; 1367 return true;
1368 } 1368 }
1369 1369
1370 void TransportSecurityState::AddHSTS(const std::string& host, 1370 void TransportSecurityState::AddHSTS(const std::string& host,
1371 const base::Time& expiry, 1371 const base::Time& expiry,
1372 bool include_subdomains) { 1372 bool include_subdomains) {
1373 DCHECK(CalledOnValidThread()); 1373 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1374 AddHSTSInternal(host, STSState::MODE_FORCE_HTTPS, expiry, include_subdomains); 1374 AddHSTSInternal(host, STSState::MODE_FORCE_HTTPS, expiry, include_subdomains);
1375 } 1375 }
1376 1376
1377 void TransportSecurityState::AddHPKP(const std::string& host, 1377 void TransportSecurityState::AddHPKP(const std::string& host,
1378 const base::Time& expiry, 1378 const base::Time& expiry,
1379 bool include_subdomains, 1379 bool include_subdomains,
1380 const HashValueVector& hashes, 1380 const HashValueVector& hashes,
1381 const GURL& report_uri) { 1381 const GURL& report_uri) {
1382 DCHECK(CalledOnValidThread()); 1382 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1383 AddHPKPInternal(host, base::Time::Now(), expiry, include_subdomains, hashes, 1383 AddHPKPInternal(host, base::Time::Now(), expiry, include_subdomains, hashes,
1384 report_uri); 1384 report_uri);
1385 } 1385 }
1386 1386
1387 void TransportSecurityState::AddExpectCT(const std::string& host, 1387 void TransportSecurityState::AddExpectCT(const std::string& host,
1388 const base::Time& expiry, 1388 const base::Time& expiry,
1389 bool enforce, 1389 bool enforce,
1390 const GURL& report_uri) { 1390 const GURL& report_uri) {
1391 DCHECK(CalledOnValidThread()); 1391 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1392 AddExpectCTInternal(host, base::Time::Now(), expiry, enforce, report_uri); 1392 AddExpectCTInternal(host, base::Time::Now(), expiry, enforce, report_uri);
1393 } 1393 }
1394 1394
1395 bool TransportSecurityState::ProcessHPKPReportOnlyHeader( 1395 bool TransportSecurityState::ProcessHPKPReportOnlyHeader(
1396 const std::string& value, 1396 const std::string& value,
1397 const HostPortPair& host_port_pair, 1397 const HostPortPair& host_port_pair,
1398 const SSLInfo& ssl_info) { 1398 const SSLInfo& ssl_info) {
1399 DCHECK(CalledOnValidThread()); 1399 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1400 1400
1401 base::Time now = base::Time::Now(); 1401 base::Time now = base::Time::Now();
1402 bool include_subdomains; 1402 bool include_subdomains;
1403 HashValueVector spki_hashes; 1403 HashValueVector spki_hashes;
1404 GURL report_uri; 1404 GURL report_uri;
1405 std::string unused_failure_log; 1405 std::string unused_failure_log;
1406 1406
1407 if (!ParseHPKPReportOnlyHeader(value, &include_subdomains, &spki_hashes, 1407 if (!ParseHPKPReportOnlyHeader(value, &include_subdomains, &spki_hashes,
1408 &report_uri) || 1408 &report_uri) ||
1409 !report_uri.is_valid() || report_uri.is_empty()) { 1409 !report_uri.is_valid() || report_uri.is_empty()) {
(...skipping 12 matching lines...) Expand all
1422 host_port_pair, ssl_info.is_issued_by_known_root, pkp_state, 1422 host_port_pair, ssl_info.is_issued_by_known_root, pkp_state,
1423 ssl_info.public_key_hashes, ssl_info.unverified_cert.get(), 1423 ssl_info.public_key_hashes, ssl_info.unverified_cert.get(),
1424 ssl_info.cert.get(), ENABLE_PIN_REPORTS, &unused_failure_log); 1424 ssl_info.cert.get(), ENABLE_PIN_REPORTS, &unused_failure_log);
1425 return true; 1425 return true;
1426 } 1426 }
1427 1427
1428 void TransportSecurityState::ProcessExpectCTHeader( 1428 void TransportSecurityState::ProcessExpectCTHeader(
1429 const std::string& value, 1429 const std::string& value,
1430 const HostPortPair& host_port_pair, 1430 const HostPortPair& host_port_pair,
1431 const SSLInfo& ssl_info) { 1431 const SSLInfo& ssl_info) {
1432 DCHECK(CalledOnValidThread()); 1432 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1433 1433
1434 // If a site sends `Expect-CT: preload` and appears on the preload list, they 1434 // If a site sends `Expect-CT: preload` and appears on the preload list, they
1435 // are in the experimental preload-list-only, report-only version of 1435 // are in the experimental preload-list-only, report-only version of
1436 // Expect-CT. 1436 // Expect-CT.
1437 if (value == "preload") { 1437 if (value == "preload") {
1438 if (!expect_ct_reporter_) 1438 if (!expect_ct_reporter_)
1439 return; 1439 return;
1440 if (!IsBuildTimely()) 1440 if (!IsBuildTimely())
1441 return; 1441 return;
1442 if (!ssl_info.is_issued_by_known_root) 1442 if (!ssl_info.is_issued_by_known_root)
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1532 DCHECK(found_state); 1532 DCHECK(found_state);
1533 return CheckPinsAndMaybeSendReport( 1533 return CheckPinsAndMaybeSendReport(
1534 host_port_pair, is_issued_by_known_root, pkp_state, hashes, 1534 host_port_pair, is_issued_by_known_root, pkp_state, hashes,
1535 served_certificate_chain, validated_certificate_chain, report_status, 1535 served_certificate_chain, validated_certificate_chain, report_status,
1536 failure_log); 1536 failure_log);
1537 } 1537 }
1538 1538
1539 bool TransportSecurityState::GetStaticDomainState(const std::string& host, 1539 bool TransportSecurityState::GetStaticDomainState(const std::string& host,
1540 STSState* sts_state, 1540 STSState* sts_state,
1541 PKPState* pkp_state) const { 1541 PKPState* pkp_state) const {
1542 DCHECK(CalledOnValidThread()); 1542 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1543 1543
1544 sts_state->upgrade_mode = STSState::MODE_FORCE_HTTPS; 1544 sts_state->upgrade_mode = STSState::MODE_FORCE_HTTPS;
1545 sts_state->include_subdomains = false; 1545 sts_state->include_subdomains = false;
1546 pkp_state->include_subdomains = false; 1546 pkp_state->include_subdomains = false;
1547 1547
1548 if (!IsBuildTimely()) 1548 if (!IsBuildTimely())
1549 return false; 1549 return false;
1550 1550
1551 PreloadResult result; 1551 PreloadResult result;
1552 if (!DecodeHSTSPreload(host, &result)) 1552 if (!DecodeHSTSPreload(host, &result))
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1586 AddHash(*sha256_hash, &pkp_state->bad_spki_hashes); 1586 AddHash(*sha256_hash, &pkp_state->bad_spki_hashes);
1587 sha256_hash++; 1587 sha256_hash++;
1588 } 1588 }
1589 } 1589 }
1590 } 1590 }
1591 1591
1592 return true; 1592 return true;
1593 } 1593 }
1594 1594
1595 bool TransportSecurityState::IsGooglePinnedHost(const std::string& host) const { 1595 bool TransportSecurityState::IsGooglePinnedHost(const std::string& host) const {
1596 DCHECK(CalledOnValidThread()); 1596 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1597 1597
1598 if (!IsBuildTimely()) 1598 if (!IsBuildTimely())
1599 return false; 1599 return false;
1600 1600
1601 PreloadResult result; 1601 PreloadResult result;
1602 if (!DecodeHSTSPreload(host, &result)) 1602 if (!DecodeHSTSPreload(host, &result))
1603 return false; 1603 return false;
1604 1604
1605 if (!result.has_pins) 1605 if (!result.has_pins)
1606 return false; 1606 return false;
1607 1607
1608 if (result.pinset_id >= arraysize(kPinsets)) 1608 if (result.pinset_id >= arraysize(kPinsets))
1609 return false; 1609 return false;
1610 1610
1611 return kPinsets[result.pinset_id].accepted_pins == kGoogleAcceptableCerts; 1611 return kPinsets[result.pinset_id].accepted_pins == kGoogleAcceptableCerts;
1612 } 1612 }
1613 1613
1614 bool TransportSecurityState::GetDynamicSTSState(const std::string& host, 1614 bool TransportSecurityState::GetDynamicSTSState(const std::string& host,
1615 STSState* result) { 1615 STSState* result) {
1616 DCHECK(CalledOnValidThread()); 1616 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1617 1617
1618 const std::string canonicalized_host = CanonicalizeHost(host); 1618 const std::string canonicalized_host = CanonicalizeHost(host);
1619 if (canonicalized_host.empty()) 1619 if (canonicalized_host.empty())
1620 return false; 1620 return false;
1621 1621
1622 base::Time current_time(base::Time::Now()); 1622 base::Time current_time(base::Time::Now());
1623 1623
1624 for (size_t i = 0; canonicalized_host[i]; i += canonicalized_host[i] + 1) { 1624 for (size_t i = 0; canonicalized_host[i]; i += canonicalized_host[i] + 1) {
1625 std::string host_sub_chunk(&canonicalized_host[i], 1625 std::string host_sub_chunk(&canonicalized_host[i],
1626 canonicalized_host.size() - i); 1626 canonicalized_host.size() - i);
(...skipping 20 matching lines...) Expand all
1647 1647
1648 break; 1648 break;
1649 } 1649 }
1650 } 1650 }
1651 1651
1652 return false; 1652 return false;
1653 } 1653 }
1654 1654
1655 bool TransportSecurityState::GetDynamicPKPState(const std::string& host, 1655 bool TransportSecurityState::GetDynamicPKPState(const std::string& host,
1656 PKPState* result) { 1656 PKPState* result) {
1657 DCHECK(CalledOnValidThread()); 1657 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1658 1658
1659 const std::string canonicalized_host = CanonicalizeHost(host); 1659 const std::string canonicalized_host = CanonicalizeHost(host);
1660 if (canonicalized_host.empty()) 1660 if (canonicalized_host.empty())
1661 return false; 1661 return false;
1662 1662
1663 base::Time current_time(base::Time::Now()); 1663 base::Time current_time(base::Time::Now());
1664 1664
1665 for (size_t i = 0; canonicalized_host[i]; i += canonicalized_host[i] + 1) { 1665 for (size_t i = 0; canonicalized_host[i]; i += canonicalized_host[i] + 1) {
1666 std::string host_sub_chunk(&canonicalized_host[i], 1666 std::string host_sub_chunk(&canonicalized_host[i],
1667 canonicalized_host.size() - i); 1667 canonicalized_host.size() - i);
(...skipping 20 matching lines...) Expand all
1688 1688
1689 break; 1689 break;
1690 } 1690 }
1691 } 1691 }
1692 1692
1693 return false; 1693 return false;
1694 } 1694 }
1695 1695
1696 bool TransportSecurityState::GetDynamicExpectCTState(const std::string& host, 1696 bool TransportSecurityState::GetDynamicExpectCTState(const std::string& host,
1697 ExpectCTState* result) { 1697 ExpectCTState* result) {
1698 DCHECK(CalledOnValidThread()); 1698 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1699 1699
1700 const std::string canonicalized_host = CanonicalizeHost(host); 1700 const std::string canonicalized_host = CanonicalizeHost(host);
1701 if (canonicalized_host.empty()) 1701 if (canonicalized_host.empty())
1702 return false; 1702 return false;
1703 1703
1704 base::Time current_time(base::Time::Now()); 1704 base::Time current_time(base::Time::Now());
1705 ExpectCTStateMap::iterator j = 1705 ExpectCTStateMap::iterator j =
1706 enabled_expect_ct_hosts_.find(HashHost(canonicalized_host)); 1706 enabled_expect_ct_hosts_.find(HashHost(canonicalized_host));
1707 if (j == enabled_expect_ct_hosts_.end()) 1707 if (j == enabled_expect_ct_hosts_.end())
1708 return false; 1708 return false;
1709 // If the entry is invalid, drop it. 1709 // If the entry is invalid, drop it.
1710 if (current_time > j->second.expiry) { 1710 if (current_time > j->second.expiry) {
1711 enabled_expect_ct_hosts_.erase(j); 1711 enabled_expect_ct_hosts_.erase(j);
1712 DirtyNotify(); 1712 DirtyNotify();
1713 return false; 1713 return false;
1714 } 1714 }
1715 1715
1716 *result = j->second; 1716 *result = j->second;
1717 return true; 1717 return true;
1718 } 1718 }
1719 1719
1720 void TransportSecurityState::AddOrUpdateEnabledSTSHosts( 1720 void TransportSecurityState::AddOrUpdateEnabledSTSHosts(
1721 const std::string& hashed_host, 1721 const std::string& hashed_host,
1722 const STSState& state) { 1722 const STSState& state) {
1723 DCHECK(CalledOnValidThread()); 1723 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1724 DCHECK(state.ShouldUpgradeToSSL()); 1724 DCHECK(state.ShouldUpgradeToSSL());
1725 enabled_sts_hosts_[hashed_host] = state; 1725 enabled_sts_hosts_[hashed_host] = state;
1726 } 1726 }
1727 1727
1728 void TransportSecurityState::AddOrUpdateEnabledPKPHosts( 1728 void TransportSecurityState::AddOrUpdateEnabledPKPHosts(
1729 const std::string& hashed_host, 1729 const std::string& hashed_host,
1730 const PKPState& state) { 1730 const PKPState& state) {
1731 DCHECK(CalledOnValidThread()); 1731 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1732 DCHECK(state.HasPublicKeyPins()); 1732 DCHECK(state.HasPublicKeyPins());
1733 enabled_pkp_hosts_[hashed_host] = state; 1733 enabled_pkp_hosts_[hashed_host] = state;
1734 } 1734 }
1735 1735
1736 void TransportSecurityState::AddOrUpdateEnabledExpectCTHosts( 1736 void TransportSecurityState::AddOrUpdateEnabledExpectCTHosts(
1737 const std::string& hashed_host, 1737 const std::string& hashed_host,
1738 const ExpectCTState& state) { 1738 const ExpectCTState& state) {
1739 DCHECK(CalledOnValidThread()); 1739 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
1740 DCHECK(state.enforce || !state.report_uri.is_empty()); 1740 DCHECK(state.enforce || !state.report_uri.is_empty());
1741 enabled_expect_ct_hosts_[hashed_host] = state; 1741 enabled_expect_ct_hosts_[hashed_host] = state;
1742 } 1742 }
1743 1743
1744 TransportSecurityState::STSState::STSState() 1744 TransportSecurityState::STSState::STSState()
1745 : upgrade_mode(MODE_DEFAULT), include_subdomains(false) { 1745 : upgrade_mode(MODE_DEFAULT), include_subdomains(false) {
1746 } 1746 }
1747 1747
1748 TransportSecurityState::STSState::~STSState() { 1748 TransportSecurityState::STSState::~STSState() {
1749 } 1749 }
(...skipping 20 matching lines...) Expand all
1770 } 1770 }
1771 1771
1772 TransportSecurityState::ExpectCTState::ExpectCTState() : enforce(false) {} 1772 TransportSecurityState::ExpectCTState::ExpectCTState() : enforce(false) {}
1773 1773
1774 TransportSecurityState::ExpectCTState::~ExpectCTState() {} 1774 TransportSecurityState::ExpectCTState::~ExpectCTState() {}
1775 1775
1776 TransportSecurityState::ExpectCTStateIterator::ExpectCTStateIterator( 1776 TransportSecurityState::ExpectCTStateIterator::ExpectCTStateIterator(
1777 const TransportSecurityState& state) 1777 const TransportSecurityState& state)
1778 : iterator_(state.enabled_expect_ct_hosts_.begin()), 1778 : iterator_(state.enabled_expect_ct_hosts_.begin()),
1779 end_(state.enabled_expect_ct_hosts_.end()) { 1779 end_(state.enabled_expect_ct_hosts_.end()) {
1780 DCHECK(state.CalledOnValidThread()); 1780 state.AssertCalledOnValidSequence();
1781 } 1781 }
1782 1782
1783 TransportSecurityState::ExpectCTStateIterator::~ExpectCTStateIterator() {} 1783 TransportSecurityState::ExpectCTStateIterator::~ExpectCTStateIterator() {}
1784 1784
1785 TransportSecurityState::ExpectStapleState::ExpectStapleState() 1785 TransportSecurityState::ExpectStapleState::ExpectStapleState()
1786 : include_subdomains(false) {} 1786 : include_subdomains(false) {}
1787 1787
1788 TransportSecurityState::ExpectStapleState::~ExpectStapleState() {} 1788 TransportSecurityState::ExpectStapleState::~ExpectStapleState() {}
1789 1789
1790 bool TransportSecurityState::PKPState::CheckPublicKeyPins( 1790 bool TransportSecurityState::PKPState::CheckPublicKeyPins(
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1829 TransportSecurityState::PKPStateIterator::PKPStateIterator( 1829 TransportSecurityState::PKPStateIterator::PKPStateIterator(
1830 const TransportSecurityState& state) 1830 const TransportSecurityState& state)
1831 : iterator_(state.enabled_pkp_hosts_.begin()), 1831 : iterator_(state.enabled_pkp_hosts_.begin()),
1832 end_(state.enabled_pkp_hosts_.end()) { 1832 end_(state.enabled_pkp_hosts_.end()) {
1833 } 1833 }
1834 1834
1835 TransportSecurityState::PKPStateIterator::~PKPStateIterator() { 1835 TransportSecurityState::PKPStateIterator::~PKPStateIterator() {
1836 } 1836 }
1837 1837
1838 } // namespace net 1838 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698