Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 630 bool found; | 630 bool found; |
| 631 if (!DecodeHSTSPreloadRaw(hostname, &found, out)) { | 631 if (!DecodeHSTSPreloadRaw(hostname, &found, out)) { |
| 632 DCHECK(false) << "Internal error in DecodeHSTSPreloadRaw for hostname " | 632 DCHECK(false) << "Internal error in DecodeHSTSPreloadRaw for hostname " |
| 633 << hostname; | 633 << hostname; |
| 634 return false; | 634 return false; |
| 635 } | 635 } |
| 636 | 636 |
| 637 return found; | 637 return found; |
| 638 } | 638 } |
| 639 | 639 |
| 640 // Serializes an OCSPVerifyResult::ResponseStatus to a string enum, suitable for | |
| 641 // the |response-status| field in an Expect-Staple report. | |
| 642 std::string SerializeExpectStapleResponseStatus( | |
| 643 OCSPVerifyResult::ResponseStatus status) { | |
| 644 switch (status) { | |
| 645 case OCSPVerifyResult::MISSING: | |
| 646 return "MISSING"; | |
| 647 case OCSPVerifyResult::PROVIDED: | |
| 648 return "PROVIDED"; | |
| 649 case OCSPVerifyResult::ERROR_RESPONSE: | |
| 650 return "ERROR_RESPONSE"; | |
| 651 case OCSPVerifyResult::BAD_PRODUCED_AT: | |
| 652 return "BAD_PRODUCED_AT"; | |
| 653 case OCSPVerifyResult::NO_MATCHING_RESPONSE: | |
| 654 return "NO_MATCHING_RESPONSE"; | |
| 655 case OCSPVerifyResult::INVALID_DATE: | |
| 656 return "INVALID_DATE"; | |
| 657 case OCSPVerifyResult::PARSE_RESPONSE_ERROR: | |
| 658 return "PARSE_RESPONSE_ERROR"; | |
| 659 case OCSPVerifyResult::PARSE_RESPONSE_DATA_ERROR: | |
| 660 return "PARSE_RESPONSE_DATA_ERROR"; | |
| 661 } | |
| 662 } | |
| 663 | |
| 664 // Serializes an OCSPRevocationStatus to a string enum, suitable for the | |
| 665 // |cert-status| field in an Expect-Staple report. | |
| 666 std::string SerializeExpectStapleRevocationStatus( | |
| 667 const OCSPRevocationStatus& status) { | |
| 668 switch (status) { | |
| 669 case OCSPRevocationStatus::GOOD: | |
| 670 return "GOOD"; | |
| 671 case OCSPRevocationStatus::REVOKED: | |
| 672 return "REVOKED"; | |
| 673 case OCSPRevocationStatus::UNKNOWN: | |
| 674 return "UNKNOWN"; | |
| 675 } | |
| 676 } | |
| 677 | |
| 678 bool SerializeExpectStapleReport(const HostPortPair& host_port_pair, | |
| 679 const SSLInfo& ssl_info, | |
| 680 const std::string& ocsp_response, | |
| 681 std::string* out_serialized_report) { | |
| 682 base::DictionaryValue report; | |
| 683 report.SetString("date-time", TimeToISO8601(base::Time::Now())); | |
| 684 report.SetString("hostname", host_port_pair.host()); | |
| 685 report.SetInteger("port", host_port_pair.port()); | |
| 686 report.SetString("response-status", | |
| 687 SerializeExpectStapleResponseStatus( | |
| 688 ssl_info.ocsp_result.response_status)); | |
| 689 | |
| 690 if (!ocsp_response.empty()) { | |
| 691 std::string encoded_ocsp_response; | |
| 692 base::Base64Encode(ocsp_response, &encoded_ocsp_response); | |
| 693 report.SetString("ocsp-response", encoded_ocsp_response); | |
| 694 } | |
| 695 if (ssl_info.ocsp_result.response_status == OCSPVerifyResult::PROVIDED) { | |
| 696 report.SetString("cert-status", | |
| 697 SerializeExpectStapleRevocationStatus( | |
| 698 ssl_info.ocsp_result.revocation_status)); | |
| 699 } | |
| 700 if (ssl_info.is_issued_by_known_root) { | |
| 701 report.Set("served-certificate-chain", | |
| 702 GetPEMEncodedChainAsList(ssl_info.unverified_cert.get())); | |
| 703 report.Set("validated-certificate-chain", | |
| 704 GetPEMEncodedChainAsList(ssl_info.cert.get())); | |
| 705 } | |
| 706 | |
| 707 if (!base::JSONWriter::Write(report, out_serialized_report)) | |
| 708 return false; | |
| 709 return true; | |
| 710 } | |
| 711 | |
| 640 } // namespace | 712 } // namespace |
| 641 | 713 |
| 642 TransportSecurityState::TransportSecurityState() | 714 TransportSecurityState::TransportSecurityState() |
| 643 : enable_static_pins_(true), | 715 : enable_static_pins_(true), |
| 644 enable_static_expect_ct_(true), | 716 enable_static_expect_ct_(true), |
| 645 enable_static_expect_staple_(false), | 717 enable_static_expect_staple_(false), |
| 646 enable_pkp_bypass_for_local_trust_anchors_(true), | 718 enable_pkp_bypass_for_local_trust_anchors_(true), |
| 647 sent_reports_cache_(kMaxHPKPReportCacheEntries) { | 719 sent_reports_cache_(kMaxHPKPReportCacheEntries) { |
| 648 // Static pinning is only enabled for official builds to make sure that | 720 // Static pinning is only enabled for official builds to make sure that |
| 649 // others don't end up with pins that cannot be easily updated. | 721 // others don't end up with pins that cannot be easily updated. |
| (...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1208 } | 1280 } |
| 1209 | 1281 |
| 1210 ExpectCTState state; | 1282 ExpectCTState state; |
| 1211 if (!GetStaticExpectCTState(host_port_pair.host(), &state)) | 1283 if (!GetStaticExpectCTState(host_port_pair.host(), &state)) |
| 1212 return; | 1284 return; |
| 1213 | 1285 |
| 1214 expect_ct_reporter_->OnExpectCTFailed(host_port_pair, state.report_uri, | 1286 expect_ct_reporter_->OnExpectCTFailed(host_port_pair, state.report_uri, |
| 1215 ssl_info); | 1287 ssl_info); |
| 1216 } | 1288 } |
| 1217 | 1289 |
| 1290 void TransportSecurityState::ProcessExpectStaple( | |
| 1291 const HostPortPair& host_port_pair, | |
| 1292 const SSLInfo& ssl_info, | |
| 1293 const std::string& ocsp_response) { | |
| 1294 DCHECK(CalledOnValidThread()); | |
| 1295 if (!enable_static_expect_staple_ || !report_sender_) | |
| 1296 return; | |
| 1297 | |
| 1298 ExpectStapleState expect_staple_state; | |
| 1299 if (!GetStaticExpectStapleState(host_port_pair.host(), &expect_staple_state)) | |
|
Ryan Sleevi
2016/07/19 19:11:04
In terms of matching conditions to documentation,
dadrian
2016/07/19 21:21:45
Done.
| |
| 1300 return; | |
| 1301 | |
| 1302 // No report needed if a stapled OCSP response was provided. | |
| 1303 if (ssl_info.ocsp_result.response_status == OCSPVerifyResult::PROVIDED && | |
| 1304 ssl_info.ocsp_result.revocation_status == OCSPRevocationStatus::GOOD) { | |
| 1305 return; | |
| 1306 } | |
| 1307 | |
| 1308 std::string serialized_report; | |
| 1309 if (!SerializeExpectStapleReport(host_port_pair, ssl_info, ocsp_response, | |
| 1310 &serialized_report)) { | |
| 1311 return; | |
| 1312 } | |
| 1313 report_sender_->Send(expect_staple_state.report_uri, serialized_report); | |
| 1314 } | |
| 1315 | |
| 1218 // static | 1316 // static |
| 1219 void TransportSecurityState::ReportUMAOnPinFailure(const std::string& host) { | 1317 void TransportSecurityState::ReportUMAOnPinFailure(const std::string& host) { |
| 1220 PreloadResult result; | 1318 PreloadResult result; |
| 1221 if (!DecodeHSTSPreload(host, &result) || | 1319 if (!DecodeHSTSPreload(host, &result) || |
| 1222 !result.has_pins) { | 1320 !result.has_pins) { |
| 1223 return; | 1321 return; |
| 1224 } | 1322 } |
| 1225 | 1323 |
| 1226 DCHECK(result.domain_id != DOMAIN_NOT_PINNED); | 1324 DCHECK(result.domain_id != DOMAIN_NOT_PINNED); |
| 1227 | 1325 |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1521 TransportSecurityState::PKPStateIterator::PKPStateIterator( | 1619 TransportSecurityState::PKPStateIterator::PKPStateIterator( |
| 1522 const TransportSecurityState& state) | 1620 const TransportSecurityState& state) |
| 1523 : iterator_(state.enabled_pkp_hosts_.begin()), | 1621 : iterator_(state.enabled_pkp_hosts_.begin()), |
| 1524 end_(state.enabled_pkp_hosts_.end()) { | 1622 end_(state.enabled_pkp_hosts_.end()) { |
| 1525 } | 1623 } |
| 1526 | 1624 |
| 1527 TransportSecurityState::PKPStateIterator::~PKPStateIterator() { | 1625 TransportSecurityState::PKPStateIterator::~PKPStateIterator() { |
| 1528 } | 1626 } |
| 1529 | 1627 |
| 1530 } // namespace | 1628 } // namespace |
| OLD | NEW |