OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ | 5 #ifndef NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ |
6 #define NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ | 6 #define NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 23 matching lines...) Expand all Loading... |
34 | 34 |
35 class CryptoHandshakeMessage; | 35 class CryptoHandshakeMessage; |
36 class EphemeralKeySource; | 36 class EphemeralKeySource; |
37 class KeyExchange; | 37 class KeyExchange; |
38 class ProofSource; | 38 class ProofSource; |
39 class QuicClock; | 39 class QuicClock; |
40 class QuicDecrypter; | 40 class QuicDecrypter; |
41 class QuicEncrypter; | 41 class QuicEncrypter; |
42 class QuicRandom; | 42 class QuicRandom; |
43 class QuicServerConfigProtobuf; | 43 class QuicServerConfigProtobuf; |
44 class StrikeRegister; | |
45 class StrikeRegisterClient; | |
46 struct QuicSignedServerConfig; | 44 struct QuicSignedServerConfig; |
47 | 45 |
48 // ClientHelloInfo contains information about a client hello message that is | 46 // ClientHelloInfo contains information about a client hello message that is |
49 // only kept for as long as it's being processed. | 47 // only kept for as long as it's being processed. |
50 struct ClientHelloInfo { | 48 struct ClientHelloInfo { |
51 ClientHelloInfo(const IPAddress& in_client_ip, QuicWallTime in_now); | 49 ClientHelloInfo(const IPAddress& in_client_ip, QuicWallTime in_now); |
52 ClientHelloInfo(const ClientHelloInfo& other); | 50 ClientHelloInfo(const ClientHelloInfo& other); |
53 ~ClientHelloInfo(); | 51 ~ClientHelloInfo(); |
54 | 52 |
55 // Inputs to EvaluateClientHello. | 53 // Inputs to EvaluateClientHello. |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 const CachedNetworkParameters* cached_network_params, | 376 const CachedNetworkParameters* cached_network_params, |
379 const QuicTagVector& connection_options, | 377 const QuicTagVector& connection_options, |
380 std::unique_ptr<BuildServerConfigUpdateMessageResultCallback> cb) const; | 378 std::unique_ptr<BuildServerConfigUpdateMessageResultCallback> cb) const; |
381 | 379 |
382 // SetEphemeralKeySource installs an object that can cache ephemeral keys for | 380 // SetEphemeralKeySource installs an object that can cache ephemeral keys for |
383 // a short period of time. This object takes ownership of | 381 // a short period of time. This object takes ownership of |
384 // |ephemeral_key_source|. If not set then ephemeral keys will be generated | 382 // |ephemeral_key_source|. If not set then ephemeral keys will be generated |
385 // per-connection. | 383 // per-connection. |
386 void SetEphemeralKeySource(EphemeralKeySource* ephemeral_key_source); | 384 void SetEphemeralKeySource(EphemeralKeySource* ephemeral_key_source); |
387 | 385 |
388 // Install an externally created StrikeRegisterClient for use to | |
389 // interact with the strike register. This object takes ownership | |
390 // of the |strike_register_client|. | |
391 void SetStrikeRegisterClient(StrikeRegisterClient* strike_register_client); | |
392 | |
393 // set_replay_protection controls whether replay protection is enabled. If | 386 // set_replay_protection controls whether replay protection is enabled. If |
394 // replay protection is disabled then no strike registers are needed and | 387 // replay protection is disabled then no strike registers are needed and |
395 // frontends can share an orbit value without a shared strike-register. | 388 // frontends can share an orbit value without a shared strike-register. |
396 // However, an attacker can duplicate a handshake and cause a client's | 389 // However, an attacker can duplicate a handshake and cause a client's |
397 // request to be processed twice. | 390 // request to be processed twice. |
398 void set_replay_protection(bool on); | 391 void set_replay_protection(bool on); |
399 | 392 |
400 // set_chlo_multiplier specifies the multiple of the CHLO message size | 393 // set_chlo_multiplier specifies the multiple of the CHLO message size |
401 // that a REJ message must stay under when the client doesn't present a | 394 // that a REJ message must stay under when the client doesn't present a |
402 // valid source-address token. | 395 // valid source-address token. |
403 void set_chlo_multiplier(size_t multiplier); | 396 void set_chlo_multiplier(size_t multiplier); |
404 | 397 |
405 // set_strike_register_no_startup_period configures the strike register to | |
406 // not have a startup period. | |
407 void set_strike_register_no_startup_period(); | |
408 | |
409 // set_strike_register_max_entries sets the maximum number of entries that | |
410 // the internal strike register will hold. If the strike register fills up | |
411 // then the oldest entries (by the client's clock) will be dropped. | |
412 void set_strike_register_max_entries(uint32_t max_entries); | |
413 | |
414 // set_strike_register_window_secs sets the number of seconds around the | |
415 // current time that the strike register will attempt to be authoritative | |
416 // for. Setting a larger value allows for greater client clock-skew, but | |
417 // means that the quiescent startup period must be longer. | |
418 void set_strike_register_window_secs(uint32_t window_secs); | |
419 | |
420 // set_source_address_token_future_secs sets the number of seconds into the | 398 // set_source_address_token_future_secs sets the number of seconds into the |
421 // future that source-address tokens will be accepted from. Since | 399 // future that source-address tokens will be accepted from. Since |
422 // source-address tokens are authenticated, this should only happen if | 400 // source-address tokens are authenticated, this should only happen if |
423 // another, valid server has clock-skew. | 401 // another, valid server has clock-skew. |
424 void set_source_address_token_future_secs(uint32_t future_secs); | 402 void set_source_address_token_future_secs(uint32_t future_secs); |
425 | 403 |
426 // set_source_address_token_lifetime_secs sets the number of seconds that a | 404 // set_source_address_token_lifetime_secs sets the number of seconds that a |
427 // source-address token will be valid for. | 405 // source-address token will be valid for. |
428 void set_source_address_token_lifetime_secs(uint32_t lifetime_secs); | 406 void set_source_address_token_lifetime_secs(uint32_t lifetime_secs); |
429 | 407 |
430 // set_server_nonce_strike_register_max_entries sets the number of entries in | |
431 // the server-nonce strike-register. This is used to record that server nonce | |
432 // values have been used. If the number of entries is too small then clients | |
433 // which are depending on server nonces may fail to handshake because their | |
434 // nonce has expired in the amount of time it took to go from the server to | |
435 // the client and back. | |
436 void set_server_nonce_strike_register_max_entries(uint32_t max_entries); | |
437 | |
438 // set_server_nonce_strike_register_window_secs sets the number of seconds | |
439 // around the current time that the server-nonce strike-register will accept | |
440 // nonces from. Setting a larger value allows for clients to delay follow-up | |
441 // client hellos for longer and still use server nonces as proofs of | |
442 // uniqueness. | |
443 void set_server_nonce_strike_register_window_secs(uint32_t window_secs); | |
444 | |
445 // set_enable_serving_sct enables or disables serving signed cert timestamp | 408 // set_enable_serving_sct enables or disables serving signed cert timestamp |
446 // (RFC6962) in server hello. | 409 // (RFC6962) in server hello. |
447 void set_enable_serving_sct(bool enable_serving_sct); | 410 void set_enable_serving_sct(bool enable_serving_sct); |
448 | 411 |
449 // Set and take ownership of the callback to invoke on primary config changes. | 412 // Set and take ownership of the callback to invoke on primary config changes. |
450 void AcquirePrimaryConfigChangedCb( | 413 void AcquirePrimaryConfigChangedCb( |
451 std::unique_ptr<PrimaryConfigChangedCallback> cb); | 414 std::unique_ptr<PrimaryConfigChangedCallback> cb); |
452 | 415 |
453 // Returns the number of configs this object owns. | 416 // Returns the number of configs this object owns. |
454 int NumberOfConfigs() const; | 417 int NumberOfConfigs() const; |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
685 // Returns HANDSHAKE_OK if the source address token in |token| is a timely | 648 // Returns HANDSHAKE_OK if the source address token in |token| is a timely |
686 // token given that the current time is |now|. Otherwise it returns the | 649 // token given that the current time is |now|. Otherwise it returns the |
687 // reason for failure. | 650 // reason for failure. |
688 HandshakeFailureReason ValidateSourceAddressTokenTimestamp( | 651 HandshakeFailureReason ValidateSourceAddressTokenTimestamp( |
689 const SourceAddressToken& token, | 652 const SourceAddressToken& token, |
690 QuicWallTime now) const; | 653 QuicWallTime now) const; |
691 | 654 |
692 // NewServerNonce generates and encrypts a random nonce. | 655 // NewServerNonce generates and encrypts a random nonce. |
693 std::string NewServerNonce(QuicRandom* rand, QuicWallTime now) const; | 656 std::string NewServerNonce(QuicRandom* rand, QuicWallTime now) const; |
694 | 657 |
695 // ValidateServerNonce decrypts |token| and verifies that it hasn't been | |
696 // previously used and is recent enough that it is plausible that it was part | |
697 // of a very recently provided rejection ("recent" will be on the order of | |
698 // 10-30 seconds). If so, it records that it has been used and returns | |
699 // HANDSHAKE_OK. Otherwise it returns the reason for failure. | |
700 HandshakeFailureReason ValidateServerNonce( | |
701 base::StringPiece echoed_server_nonce, | |
702 QuicWallTime now) const; | |
703 | |
704 // ValidateExpectedLeafCertificate checks the |client_hello| to see if it has | 658 // ValidateExpectedLeafCertificate checks the |client_hello| to see if it has |
705 // an XLCT tag, and if so, verifies that its value matches the hash of the | 659 // an XLCT tag, and if so, verifies that its value matches the hash of the |
706 // server's leaf certificate. The certs field of |crypto_proof| is used to | 660 // server's leaf certificate. The certs field of |crypto_proof| is used to |
707 // compare against the XLCT value. This method returns true if the XLCT tag | 661 // compare against the XLCT value. This method returns true if the XLCT tag |
708 // is not present, or if the XLCT tag is present and valid. It returns false | 662 // is not present, or if the XLCT tag is present and valid. It returns false |
709 // otherwise. | 663 // otherwise. |
710 bool ValidateExpectedLeafCertificate( | 664 bool ValidateExpectedLeafCertificate( |
711 const CryptoHandshakeMessage& client_hello, | 665 const CryptoHandshakeMessage& client_hello, |
712 const QuicSignedServerConfig& crypto_proof) const; | 666 const QuicSignedServerConfig& crypto_proof) const; |
713 | 667 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 ConfigMap configs_; | 744 ConfigMap configs_; |
791 // primary_config_ points to a Config (which is also in |configs_|) which is | 745 // primary_config_ points to a Config (which is also in |configs_|) which is |
792 // the primary config - i.e. the one that we'll give out to new clients. | 746 // the primary config - i.e. the one that we'll give out to new clients. |
793 mutable scoped_refptr<Config> primary_config_; | 747 mutable scoped_refptr<Config> primary_config_; |
794 // next_config_promotion_time_ contains the nearest, future time when an | 748 // next_config_promotion_time_ contains the nearest, future time when an |
795 // active config will be promoted to primary. | 749 // active config will be promoted to primary. |
796 mutable QuicWallTime next_config_promotion_time_; | 750 mutable QuicWallTime next_config_promotion_time_; |
797 // Callback to invoke when the primary config changes. | 751 // Callback to invoke when the primary config changes. |
798 std::unique_ptr<PrimaryConfigChangedCallback> primary_config_changed_cb_; | 752 std::unique_ptr<PrimaryConfigChangedCallback> primary_config_changed_cb_; |
799 | 753 |
800 // Protects access to the pointer held by strike_register_client_. | |
801 mutable base::Lock strike_register_client_lock_; | |
802 // strike_register_ contains a data structure that keeps track of previously | |
803 // observed client nonces in order to prevent replay attacks. | |
804 mutable std::unique_ptr<StrikeRegisterClient> strike_register_client_; | |
805 | |
806 // Used to protect the source-address tokens that are given to clients. | 754 // Used to protect the source-address tokens that are given to clients. |
807 CryptoSecretBoxer source_address_token_boxer_; | 755 CryptoSecretBoxer source_address_token_boxer_; |
808 | 756 |
809 // server_nonce_boxer_ is used to encrypt and validate suggested server | 757 // server_nonce_boxer_ is used to encrypt and validate suggested server |
810 // nonces. | 758 // nonces. |
811 CryptoSecretBoxer server_nonce_boxer_; | 759 CryptoSecretBoxer server_nonce_boxer_; |
812 | 760 |
813 // server_nonce_orbit_ contains the random, per-server orbit values that this | 761 // server_nonce_orbit_ contains the random, per-server orbit values that this |
814 // server will use to generate server nonces (the moral equivalent of a SYN | 762 // server will use to generate server nonces (the moral equivalent of a SYN |
815 // cookies). | 763 // cookies). |
816 uint8_t server_nonce_orbit_[8]; | 764 uint8_t server_nonce_orbit_[8]; |
817 | 765 |
818 mutable base::Lock server_nonce_strike_register_lock_; | |
819 // server_nonce_strike_register_ contains a data structure that keeps track of | |
820 // previously observed server nonces from this server, in order to prevent | |
821 // replay attacks. | |
822 mutable std::unique_ptr<StrikeRegister> server_nonce_strike_register_; | |
823 | |
824 // proof_source_ contains an object that can provide certificate chains and | 766 // proof_source_ contains an object that can provide certificate chains and |
825 // signatures. | 767 // signatures. |
826 std::unique_ptr<ProofSource> proof_source_; | 768 std::unique_ptr<ProofSource> proof_source_; |
827 | 769 |
828 // ephemeral_key_source_ contains an object that caches ephemeral keys for a | 770 // ephemeral_key_source_ contains an object that caches ephemeral keys for a |
829 // short period of time. | 771 // short period of time. |
830 std::unique_ptr<EphemeralKeySource> ephemeral_key_source_; | 772 std::unique_ptr<EphemeralKeySource> ephemeral_key_source_; |
831 | 773 |
832 // These fields store configuration values. See the comments for their | 774 // These fields store configuration values. See the comments for their |
833 // respective setter functions. | 775 // respective setter functions. |
834 bool strike_register_no_startup_period_; | |
835 uint32_t strike_register_max_entries_; | |
836 uint32_t strike_register_window_secs_; | |
837 uint32_t source_address_token_future_secs_; | 776 uint32_t source_address_token_future_secs_; |
838 uint32_t source_address_token_lifetime_secs_; | 777 uint32_t source_address_token_lifetime_secs_; |
839 uint32_t server_nonce_strike_register_max_entries_; | |
840 uint32_t server_nonce_strike_register_window_secs_; | |
841 | 778 |
842 // Enable serving SCT or not. | 779 // Enable serving SCT or not. |
843 bool enable_serving_sct_; | 780 bool enable_serving_sct_; |
844 | 781 |
845 // Does not own this observer. | 782 // Does not own this observer. |
846 RejectionObserver* rejection_observer_; | 783 RejectionObserver* rejection_observer_; |
847 | 784 |
848 DISALLOW_COPY_AND_ASSIGN(QuicCryptoServerConfig); | 785 DISALLOW_COPY_AND_ASSIGN(QuicCryptoServerConfig); |
849 }; | 786 }; |
850 | 787 |
(...skipping 19 matching lines...) Expand all Loading... |
870 bool send_expect_ct_header; | 807 bool send_expect_ct_header; |
871 | 808 |
872 private: | 809 private: |
873 friend class base::RefCounted<QuicSignedServerConfig>; | 810 friend class base::RefCounted<QuicSignedServerConfig>; |
874 virtual ~QuicSignedServerConfig(); | 811 virtual ~QuicSignedServerConfig(); |
875 }; | 812 }; |
876 | 813 |
877 } // namespace net | 814 } // namespace net |
878 | 815 |
879 #endif // NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ | 816 #endif // NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ |
OLD | NEW |