| Index: net/http/transport_security_state.h
|
| diff --git a/net/http/transport_security_state.h b/net/http/transport_security_state.h
|
| index 5d3c126dcc2090015107eec88bc71ae0e9c3b7d7..e469d70aabe51a71fc24244ae3e7bb2c30cc51fa 100644
|
| --- a/net/http/transport_security_state.h
|
| +++ b/net/http/transport_security_state.h
|
| @@ -11,6 +11,7 @@
|
| #include <string>
|
|
|
| #include "base/callback.h"
|
| +#include "base/feature_list.h"
|
| #include "base/gtest_prod_util.h"
|
| #include "base/macros.h"
|
| #include "base/strings/string_piece.h"
|
| @@ -235,6 +236,29 @@ class NET_EXPORT TransportSecurityState
|
| // The URI to which reports should be sent if valid CT info is not
|
| // provided.
|
| GURL report_uri;
|
| + // True if connections should be closed if they do not comply with the CT
|
| + // policy. If false, noncompliant connections will be allowed but reports
|
| + // will be sent about the violation.
|
| + bool enforce;
|
| + // The absolute time (UTC) when the Expect-CT state was last observed.
|
| + base::Time last_observed;
|
| + // The absolute time (UTC) when the Expect-CT state expires.
|
| + base::Time expiry;
|
| + };
|
| +
|
| + class NET_EXPORT ExpectCTStateIterator {
|
| + public:
|
| + explicit ExpectCTStateIterator(const TransportSecurityState& state);
|
| + ~ExpectCTStateIterator();
|
| +
|
| + bool HasNext() const { return iterator_ != end_; }
|
| + void Advance() { ++iterator_; }
|
| + const std::string& hostname() const { return iterator_->first; }
|
| + const ExpectCTState& domain_state() const { return iterator_->second; }
|
| +
|
| + private:
|
| + std::map<std::string, ExpectCTState>::const_iterator iterator_;
|
| + std::map<std::string, ExpectCTState>::const_iterator end_;
|
| };
|
|
|
| // An ExpectStapleState describes a site that expects valid OCSP information
|
| @@ -293,6 +317,10 @@ class NET_EXPORT TransportSecurityState
|
| // report if a violation is detected.
|
| enum PublicKeyPinReportStatus { ENABLE_PIN_REPORTS, DISABLE_PIN_REPORTS };
|
|
|
| + // Feature that controls whether Expect-CT HTTP headers are parsed, processed,
|
| + // and stored.
|
| + static const base::Feature kDynamicExpectCTFeature;
|
| +
|
| TransportSecurityState();
|
| ~TransportSecurityState();
|
|
|
| @@ -382,6 +410,13 @@ class NET_EXPORT TransportSecurityState
|
| void AddOrUpdateEnabledPKPHosts(const std::string& hashed_host,
|
| const PKPState& state);
|
|
|
| + // Inserts |state| into |enabled_expect_ct_hosts_| under the key
|
| + // |hashed_host|. |hashed_host| is already in the internal representation.
|
| + // Note: This is only used for serializing/deserializing the
|
| + // TransportSecurityState.
|
| + void AddOrUpdateEnabledExpectCTHosts(const std::string& hashed_host,
|
| + const ExpectCTState& state);
|
| +
|
| // Deletes all dynamic data (e.g. HSTS or HPKP data) created since a given
|
| // time.
|
| //
|
| @@ -411,14 +446,15 @@ class NET_EXPORT TransportSecurityState
|
| // deployed.
|
| bool IsGooglePinnedHost(const std::string& host) const;
|
|
|
| - // Returns true and updates |*result| iff |host| has HSTS (respectively, HPKP)
|
| - // state. If multiple HSTS (respectively, HPKP) entries match |host|, the
|
| - // most specific match determines the HSTS (respectively, HPKP) return value.
|
| + // Returns true and updates |*result| iff |host| has HSTS/HPKP/Expect-CT
|
| + // (respectively) state. If multiple entries match |host|, the most specific
|
| + // match determines the return value.
|
| //
|
| // Note that these methods are not const because they opportunistically remove
|
| // entries that have expired.
|
| bool GetDynamicSTSState(const std::string& host, STSState* result);
|
| bool GetDynamicPKPState(const std::string& host, PKPState* result);
|
| + bool GetDynamicExpectCTState(const std::string& host, ExpectCTState* result);
|
|
|
| // Processes an HSTS header value from the host, adding entries to
|
| // dynamic state if necessary.
|
| @@ -446,6 +482,16 @@ class NET_EXPORT TransportSecurityState
|
| const HashValueVector& hashes,
|
| const GURL& report_uri);
|
|
|
| + // Adds explicitly-specified data as if it was processed from an Expect-CT
|
| + // header.
|
| + // Note: This method will persist the Expect-CT data if a Delegate is present.
|
| + // Make sure that the delegate is nullptr if the persistence is not
|
| + // desired. See |SetDelegate| method for more details.
|
| + void AddExpectCT(const std::string& host,
|
| + const base::Time& expiry,
|
| + bool enforce,
|
| + const GURL& report_uri);
|
| +
|
| // Enables or disables public key pinning bypass for local trust anchors.
|
| // Disabling the bypass for local trust anchors is highly discouraged.
|
| // This method is used by Cronet only and *** MUST NOT *** be used by any
|
| @@ -489,6 +535,7 @@ class NET_EXPORT TransportSecurityState
|
|
|
| typedef std::map<std::string, STSState> STSStateMap;
|
| typedef std::map<std::string, PKPState> PKPStateMap;
|
| + typedef std::map<std::string, ExpectCTState> ExpectCTStateMap;
|
|
|
| // Send an UMA report on pin validation failure, if the host is in a
|
| // statically-defined list of domains.
|
| @@ -533,12 +580,20 @@ class NET_EXPORT TransportSecurityState
|
| const HashValueVector& hashes,
|
| const GURL& report_uri);
|
|
|
| + // Adds Expect-CT state to |host|.
|
| + void AddExpectCTInternal(const std::string& host,
|
| + const base::Time& last_observed,
|
| + const base::Time& expiry,
|
| + bool enforce,
|
| + const GURL& report_uri);
|
| +
|
| // Enable TransportSecurity for |host|. |state| supercedes any previous
|
| // state for the |host|, including static entries.
|
| //
|
| // The new state for |host| is persisted using the Delegate (if any).
|
| void EnableSTSHost(const std::string& host, const STSState& state);
|
| void EnablePKPHost(const std::string& host, const PKPState& state);
|
| + void EnableExpectCTHost(const std::string& host, const ExpectCTState& state);
|
|
|
| // Returns true if a request to |host_port_pair| with the given
|
| // SubjectPublicKeyInfo |hashes| satisfies the pins in |pkp_state|,
|
| @@ -571,12 +626,13 @@ class NET_EXPORT TransportSecurityState
|
| ExpectStapleState* expect_staple_result) const;
|
|
|
| // The sets of hosts that have enabled TransportSecurity. |domain| will always
|
| - // be empty for a STSState or PKPState in these maps; the domain
|
| - // comes from the map keys instead. In addition, |upgrade_mode| in the
|
| + // be empty for a STSState, PKPState, or ExpectCTState in these maps; the
|
| + // domain comes from the map keys instead. In addition, |upgrade_mode| in the
|
| // STSState is never MODE_DEFAULT and |HasPublicKeyPins| in the PKPState
|
| // always returns true.
|
| STSStateMap enabled_sts_hosts_;
|
| PKPStateMap enabled_pkp_hosts_;
|
| + ExpectCTStateMap enabled_expect_ct_hosts_;
|
|
|
| Delegate* delegate_ = nullptr;
|
|
|
|
|