Index: net/http/transport_security_state.cc |
diff --git a/net/http/transport_security_state.cc b/net/http/transport_security_state.cc |
index f33c2ec1d90436864f7a08718fb8709c2c8a90a3..37879a8490ffa885ccaa872e876c8aa4a0d3ab2a 100644 |
--- a/net/http/transport_security_state.cc |
+++ b/net/http/transport_security_state.cc |
@@ -637,6 +637,73 @@ bool DecodeHSTSPreload(const std::string& hostname, PreloadResult* out) { |
return found; |
} |
+std::string ResponseStatusToString(OCSPVerifyResult::ResponseStatus status) { |
Ryan Sleevi
2016/07/19 00:02:49
Documentation needed :)
For example, are these st
dadrian
2016/07/19 18:48:39
Done.
|
+ switch (status) { |
+ case OCSPVerifyResult::MISSING: |
+ return "MISSING"; |
+ case OCSPVerifyResult::PROVIDED: |
+ return "PROVIDED"; |
+ case OCSPVerifyResult::ERROR_RESPONSE: |
+ return "ERROR_RESPONSE"; |
+ case OCSPVerifyResult::BAD_PRODUCED_AT: |
+ return "BAD_PRODUCED_AT"; |
+ case OCSPVerifyResult::NO_MATCHING_RESPONSE: |
+ return "NO_MATCHING_RESPONSE"; |
+ case OCSPVerifyResult::INVALID_DATE: |
+ return "INVALID_DATE"; |
+ case OCSPVerifyResult::PARSE_RESPONSE_ERROR: |
+ return "PARSE_RESPONSE_ERROR"; |
+ case OCSPVerifyResult::PARSE_RESPONSE_DATA_ERROR: |
+ return "PARSE_RESPONSE_DATA_ERROR"; |
+ } |
+ return ""; |
Ryan Sleevi
2016/07/19 00:02:49
return std::string()
dadrian
2016/07/19 18:48:39
Done.
|
+} |
+ |
+std::string RevocationStatusToString(const OCSPRevocationStatus& status) { |
+ switch (status) { |
+ case OCSPRevocationStatus::GOOD: |
+ return "GOOD"; |
+ case OCSPRevocationStatus::REVOKED: |
+ return "REVOKED"; |
+ case OCSPRevocationStatus::UNKNOWN: |
+ return "UNKNOWN"; |
+ } |
Ryan Sleevi
2016/07/19 00:02:49
Why do you return "" on 659, but not return "" (or
dadrian
2016/07/19 00:18:54
I meant to do it this way---does MSVC 2015 catch t
Ryan Sleevi
2016/07/19 01:17:22
Right, I *think* all our compilers now handle know
dadrian
2016/07/19 18:48:39
Done.
|
+} |
+ |
+bool SerializeExpectStapleReport(const HostPortPair& host_port_pair, |
+ const SSLInfo& ssl_info, |
+ const std::string& ocsp_response, |
+ std::string* out_serialized_report) { |
+ base::DictionaryValue report; |
+ report.SetString("date-time", TimeToISO8601(base::Time::Now())); |
+ report.SetString("hostname", host_port_pair.host()); |
+ report.SetInteger("port", host_port_pair.port()); |
+ report.SetString( |
+ "response-status", |
+ ResponseStatusToString(ssl_info.ocsp_result.response_status)); |
+ |
+ if (!ocsp_response.empty()) { |
+ std::string encoded_ocsp_response; |
+ base::Base64Encode(ocsp_response, &encoded_ocsp_response); |
+ report.SetString("ocsp-response", encoded_ocsp_response); |
+ } |
+ if (ssl_info.ocsp_result.response_status == OCSPVerifyResult::PROVIDED) { |
+ report.SetString( |
+ "cert-status", |
+ RevocationStatusToString(ssl_info.ocsp_result.revocation_status)); |
+ } |
+ if (ssl_info.is_issued_by_known_root) { |
+ report.Set("served-certificate-chain", |
+ GetPEMEncodedChainAsList(ssl_info.unverified_cert.get())); |
+ report.Set("validated-certificate-chain", |
+ GetPEMEncodedChainAsList(ssl_info.cert.get())); |
+ } |
+ |
+ if (!base::JSONWriter::Write(report, out_serialized_report)) |
+ return false; |
+ return true; |
+} |
+ |
} // namespace |
TransportSecurityState::TransportSecurityState() |
@@ -1215,6 +1282,32 @@ void TransportSecurityState::ProcessExpectCTHeader( |
ssl_info); |
} |
+void TransportSecurityState::ProcessExpectStaple( |
+ const HostPortPair& host_port_pair, |
+ const SSLInfo& ssl_info, |
+ const std::string& ocsp_response) { |
+ DCHECK(CalledOnValidThread()); |
+ if (!enable_static_expect_staple_ || !report_sender_) |
+ return; |
+ |
+ ExpectStapleState expect_staple_state; |
+ if (!GetStaticExpectStapleState(host_port_pair.host(), &expect_staple_state)) |
+ return; |
+ |
+ // No report needed if a stapled OCSP response was provided. |
+ if (ssl_info.ocsp_result.response_status == OCSPVerifyResult::PROVIDED && |
+ ssl_info.ocsp_result.revocation_status == OCSPRevocationStatus::GOOD) { |
+ return; |
+ } |
+ |
+ std::string serialized_report; |
+ if (!SerializeExpectStapleReport(host_port_pair, ssl_info, ocsp_response, |
+ &serialized_report)) { |
+ return; |
+ } |
+ report_sender_->Send(expect_staple_state.report_uri, serialized_report); |
+} |
+ |
// static |
void TransportSecurityState::ReportUMAOnPinFailure(const std::string& host) { |
PreloadResult result; |