| 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 #ifndef NET_HTTP_TRANSPORT_SECURITY_STATE_H_ | 5 #ifndef NET_HTTP_TRANSPORT_SECURITY_STATE_H_ |
| 6 #define NET_HTTP_TRANSPORT_SECURITY_STATE_H_ | 6 #define NET_HTTP_TRANSPORT_SECURITY_STATE_H_ |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <map> | 10 #include <map> |
| 11 #include <string> | 11 #include <string> |
| 12 #include <utility> | 12 #include <utility> |
| 13 #include <vector> | 13 #include <vector> |
| 14 | 14 |
| 15 #include "base/gtest_prod_util.h" | 15 #include "base/gtest_prod_util.h" |
| 16 #include "base/threading/non_thread_safe.h" | 16 #include "base/threading/non_thread_safe.h" |
| 17 #include "base/time/time.h" | 17 #include "base/time/time.h" |
| 18 #include "net/base/net_export.h" | 18 #include "net/base/net_export.h" |
| 19 #include "net/cert/x509_cert_types.h" | 19 #include "net/cert/x509_cert_types.h" |
| 20 #include "net/cert/x509_certificate.h" | 20 #include "net/cert/x509_certificate.h" |
| 21 #include "url/gurl.h" | 21 #include "url/gurl.h" |
| 22 | 22 |
| 23 class GURL; | 23 class GURL; |
| 24 | 24 |
| 25 class GURL; |
| 26 |
| 25 namespace net { | 27 namespace net { |
| 26 | 28 |
| 27 class SSLInfo; | 29 class SSLInfo; |
| 28 | 30 |
| 29 // Tracks which hosts have enabled strict transport security and/or public | 31 // Tracks which hosts have enabled strict transport security and/or public |
| 30 // key pins. | 32 // key pins. |
| 31 // | 33 // |
| 32 // This object manages the in-memory store. Register a Delegate with | 34 // This object manages the in-memory store. Register a Delegate with |
| 33 // |SetDelegate| to persist the state to disk. | 35 // |SetDelegate| to persist the state to disk. |
| 34 // | 36 // |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 std::map<std::string, PKPState>::const_iterator iterator_; | 180 std::map<std::string, PKPState>::const_iterator iterator_; |
| 179 std::map<std::string, PKPState>::const_iterator end_; | 181 std::map<std::string, PKPState>::const_iterator end_; |
| 180 }; | 182 }; |
| 181 | 183 |
| 182 class NET_EXPORT Reporter { | 184 class NET_EXPORT Reporter { |
| 183 public: | 185 public: |
| 184 // Determines if a HPKP violation report should be sent for the | 186 // Determines if a HPKP violation report should be sent for the |
| 185 // given |hostname|, which was found to violate the pins in | 187 // given |hostname|, which was found to violate the pins in |
| 186 // |pkp_state|. Returns true if the report should be sent, with the | 188 // |pkp_state|. Returns true if the report should be sent, with the |
| 187 // report URI in |report_uri| and the serialized report in | 189 // report URI in |report_uri| and the serialized report in |
| 188 // |serialized_report|, and false otherwise. Allows embedders to | 190 // |serialized_report|, and false otherwise. Allows the reporter to |
| 189 // override the report uri and/or format for some pins. | 191 // override the reporting state in some cases (for example, if |
| 192 // reports should always be sent for certain hostnames regardless of |
| 193 // the HPKP state). |
| 190 // | 194 // |
| 191 // Additional information to be included in the report (beyond | 195 // Additional information to be included in the report (beyond |
| 192 // fields in |pkp_state|): | 196 // fields in |pkp_state|): |
| 193 // | 197 // |
| 194 // - The |port| of the request that violated the pin. | 198 // - The |port| of the request that violated the pin. |
| 195 // - |served_certificate_chain| and |validated_certificate_chain|, | 199 // - |served_certificate_chain| and |validated_certificate_chain|, |
| 196 // the certificate chains as received by the client and as built | 200 // the certificate chains as received by the client and as built |
| 197 // during certificate verification. | 201 // during certificate verification. |
| 198 virtual bool GetHPKPReport( | 202 virtual bool GetHPKPReport( |
| 199 const std::string& hostname, | 203 const std::string& hostname, |
| 200 const PKPState& pkp_state, | 204 const PKPState& pkp_state, |
| 201 bool is_static_pin, | 205 bool is_static_pin, |
| 202 uint16_t port, | 206 uint16_t port, |
| 203 const X509Certificate* served_certificate_chain, | 207 const X509Certificate* served_certificate_chain, |
| 204 const X509Certificate* validated_certificate_chain, | 208 const X509Certificate* validated_certificate_chain, |
| 205 GURL* report_uri, | 209 GURL* report_uri, |
| 206 std::string* serialized_report) = 0; | 210 std::string* serialized_report) = 0; |
| 207 | 211 |
| 208 // Sends the given serialized |report| to |report_uri|. | 212 // Sends the given serialized |report| to |report_uri|. |
| 209 virtual void SendHPKPReport(const GURL& report_uri, | 213 virtual void SendHPKPReport(const GURL& report_uri, |
| 210 const std::string& report) = 0; | 214 const std::string& report) = 0; |
| 211 | 215 |
| 212 protected: | 216 protected: |
| 213 virtual ~Reporter() {} | 217 virtual ~Reporter() {} |
| 214 }; | 218 }; |
| 215 | 219 |
| 220 // Indicates whether or not a public key pin check should send a |
| 221 // report if a violation is detected. |
| 222 enum PublicKeyPinReportStatus { ENABLE_PIN_REPORTS, DISABLE_PIN_REPORTS }; |
| 223 |
| 216 TransportSecurityState(); | 224 TransportSecurityState(); |
| 217 ~TransportSecurityState(); | 225 ~TransportSecurityState(); |
| 218 | 226 |
| 219 // These functions search for static and dynamic STS and PKP states, and | 227 // These functions search for static and dynamic STS and PKP states, and |
| 220 // invoke the functions of the same name on them. These functions are the | 228 // invoke the functions of the same name on them. These functions are the |
| 221 // primary public interface; direct access to STS and PKP states is best | 229 // primary public interface; direct access to STS and PKP states is best |
| 222 // left to tests. | 230 // left to tests. |
| 223 bool ShouldSSLErrorsBeFatal(const std::string& host); | 231 bool ShouldSSLErrorsBeFatal(const std::string& host); |
| 224 bool ShouldUpgradeToSSL(const std::string& host); | 232 bool ShouldUpgradeToSSL(const std::string& host); |
| 225 bool CheckPublicKeyPins(const std::string& host, | 233 bool CheckPublicKeyPins(const std::string& host, |
| 226 bool is_issued_by_known_root, | 234 bool is_issued_by_known_root, |
| 227 const HashValueVector& hashes, | 235 const HashValueVector& hashes, |
| 236 uint16_t port, |
| 237 const X509Certificate* served_certificate_chain, |
| 238 const X509Certificate* validated_certificate_chain, |
| 239 const PublicKeyPinReportStatus report_status, |
| 228 std::string* failure_log); | 240 std::string* failure_log); |
| 229 bool HasPublicKeyPins(const std::string& host); | 241 bool HasPublicKeyPins(const std::string& host); |
| 230 | 242 |
| 231 // Assign a |Delegate| for persisting the transport security state. If | 243 // Assign a |Delegate| for persisting the transport security state. If |
| 232 // |NULL|, state will not be persisted. The caller retains | 244 // |NULL|, state will not be persisted. The caller retains |
| 233 // ownership of |delegate|. | 245 // ownership of |delegate|. |
| 234 // Note: This is only used for serializing/deserializing the | 246 // Note: This is only used for serializing/deserializing the |
| 235 // TransportSecurityState. | 247 // TransportSecurityState. |
| 236 void SetDelegate(Delegate* delegate); | 248 void SetDelegate(Delegate* delegate); |
| 237 | 249 |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 // representation of first-class DomainStates, and exposing the preloads | 356 // representation of first-class DomainStates, and exposing the preloads |
| 345 // to the caller with |GetStaticDomainState|. | 357 // to the caller with |GetStaticDomainState|. |
| 346 static void ReportUMAOnPinFailure(const std::string& host); | 358 static void ReportUMAOnPinFailure(const std::string& host); |
| 347 | 359 |
| 348 // IsBuildTimely returns true if the current build is new enough ensure that | 360 // IsBuildTimely returns true if the current build is new enough ensure that |
| 349 // built in security information (i.e. HSTS preloading and pinning | 361 // built in security information (i.e. HSTS preloading and pinning |
| 350 // information) is timely. | 362 // information) is timely. |
| 351 static bool IsBuildTimely(); | 363 static bool IsBuildTimely(); |
| 352 | 364 |
| 353 // Helper method for actually checking pins. | 365 // Helper method for actually checking pins. |
| 354 bool CheckPublicKeyPinsImpl(const std::string& host, | 366 bool CheckPublicKeyPinsImpl( |
| 355 const HashValueVector& hashes, | 367 const std::string& host, |
| 356 std::string* failure_log); | 368 const HashValueVector& hashes, |
| 369 uint16_t port, |
| 370 const X509Certificate* served_certificate_chain, |
| 371 const X509Certificate* validated_certificate_chain, |
| 372 const PublicKeyPinReportStatus report_status, |
| 373 std::string* failure_log); |
| 357 | 374 |
| 358 // If a Delegate is present, notify it that the internal state has | 375 // If a Delegate is present, notify it that the internal state has |
| 359 // changed. | 376 // changed. |
| 360 void DirtyNotify(); | 377 void DirtyNotify(); |
| 361 | 378 |
| 362 // Adds HSTS state to |host|. | 379 // Adds HSTS state to |host|. |
| 363 void AddHSTSInternal(const std::string& host, | 380 void AddHSTSInternal(const std::string& host, |
| 364 STSState::UpgradeMode upgrade_mode, | 381 STSState::UpgradeMode upgrade_mode, |
| 365 const base::Time& expiry, | 382 const base::Time& expiry, |
| 366 bool include_subdomains); | 383 bool include_subdomains); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 394 | 411 |
| 395 // True if static pins should be used. | 412 // True if static pins should be used. |
| 396 bool enable_static_pins_; | 413 bool enable_static_pins_; |
| 397 | 414 |
| 398 DISALLOW_COPY_AND_ASSIGN(TransportSecurityState); | 415 DISALLOW_COPY_AND_ASSIGN(TransportSecurityState); |
| 399 }; | 416 }; |
| 400 | 417 |
| 401 } // namespace net | 418 } // namespace net |
| 402 | 419 |
| 403 #endif // NET_HTTP_TRANSPORT_SECURITY_STATE_H_ | 420 #endif // NET_HTTP_TRANSPORT_SECURITY_STATE_H_ |
| OLD | NEW |