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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 class QuicRandom; | 42 class QuicRandom; |
43 class QuicServerConfigProtobuf; | 43 class QuicServerConfigProtobuf; |
44 class StrikeRegister; | 44 class StrikeRegister; |
45 class StrikeRegisterClient; | 45 class StrikeRegisterClient; |
46 struct QuicCryptoProof; | 46 struct QuicCryptoProof; |
47 | 47 |
48 // ClientHelloInfo contains information about a client hello message that is | 48 // ClientHelloInfo contains information about a client hello message that is |
49 // only kept for as long as it's being processed. | 49 // only kept for as long as it's being processed. |
50 struct ClientHelloInfo { | 50 struct ClientHelloInfo { |
51 ClientHelloInfo(const IPAddress& in_client_ip, QuicWallTime in_now); | 51 ClientHelloInfo(const IPAddress& in_client_ip, QuicWallTime in_now); |
| 52 ClientHelloInfo(const ClientHelloInfo& other); |
52 ~ClientHelloInfo(); | 53 ~ClientHelloInfo(); |
53 | 54 |
54 // Inputs to EvaluateClientHello. | 55 // Inputs to EvaluateClientHello. |
55 const IPAddress client_ip; | 56 const IPAddress client_ip; |
56 const QuicWallTime now; | 57 const QuicWallTime now; |
57 | 58 |
58 // Outputs from EvaluateClientHello. | 59 // Outputs from EvaluateClientHello. |
59 bool valid_source_address_token; | 60 bool valid_source_address_token; |
60 base::StringPiece sni; | 61 base::StringPiece sni; |
61 base::StringPiece client_nonce; | 62 base::StringPiece client_nonce; |
(...skipping 19 matching lines...) Expand all Loading... |
81 | 82 |
82 private: | 83 private: |
83 DISALLOW_COPY_AND_ASSIGN(PrimaryConfigChangedCallback); | 84 DISALLOW_COPY_AND_ASSIGN(PrimaryConfigChangedCallback); |
84 }; | 85 }; |
85 | 86 |
86 // Callback used to accept the result of the |client_hello| validation step. | 87 // Callback used to accept the result of the |client_hello| validation step. |
87 class NET_EXPORT_PRIVATE ValidateClientHelloResultCallback { | 88 class NET_EXPORT_PRIVATE ValidateClientHelloResultCallback { |
88 public: | 89 public: |
89 // Opaque token that holds information about the client_hello and | 90 // Opaque token that holds information about the client_hello and |
90 // its validity. Can be interpreted by calling ProcessClientHello. | 91 // its validity. Can be interpreted by calling ProcessClientHello. |
91 struct Result { | 92 struct NET_EXPORT_PRIVATE Result { |
92 Result(const CryptoHandshakeMessage& in_client_hello, | 93 Result(const CryptoHandshakeMessage& in_client_hello, |
93 IPAddress in_client_ip, | 94 IPAddress in_client_ip, |
94 QuicWallTime in_now); | 95 QuicWallTime in_now); |
95 ~Result(); | 96 ~Result(); |
96 | 97 |
97 CryptoHandshakeMessage client_hello; | 98 CryptoHandshakeMessage client_hello; |
98 ClientHelloInfo info; | 99 ClientHelloInfo info; |
99 QuicErrorCode error_code; | 100 QuicErrorCode error_code; |
100 std::string error_details; | 101 std::string error_details; |
101 | 102 |
102 // Populated if the CHLO STK contained a CachedNetworkParameters proto. | 103 // Populated if the CHLO STK contained a CachedNetworkParameters proto. |
103 CachedNetworkParameters cached_network_params; | 104 CachedNetworkParameters cached_network_params; |
104 }; | 105 }; |
105 | 106 |
106 ValidateClientHelloResultCallback(); | 107 ValidateClientHelloResultCallback(); |
107 virtual ~ValidateClientHelloResultCallback(); | 108 virtual ~ValidateClientHelloResultCallback(); |
108 void Run(const Result* result, std::unique_ptr<ProofSource::Details> details); | 109 virtual void Run(std::unique_ptr<Result> result, |
109 | 110 std::unique_ptr<ProofSource::Details> details) = 0; |
110 protected: | |
111 virtual void RunImpl(const CryptoHandshakeMessage& client_hello, | |
112 const Result& result, | |
113 std::unique_ptr<ProofSource::Details> details) = 0; | |
114 | 111 |
115 private: | 112 private: |
116 DISALLOW_COPY_AND_ASSIGN(ValidateClientHelloResultCallback); | 113 DISALLOW_COPY_AND_ASSIGN(ValidateClientHelloResultCallback); |
117 }; | 114 }; |
118 | 115 |
119 // Callback used to receive the results of a call to | 116 // Callback used to receive the results of a call to |
120 // BuildServerConfigUpdateMessage. | 117 // BuildServerConfigUpdateMessage. |
121 class BuildServerConfigUpdateMessageResultCallback { | 118 class BuildServerConfigUpdateMessageResultCallback { |
122 public: | 119 public: |
123 BuildServerConfigUpdateMessageResultCallback() = default; | 120 BuildServerConfigUpdateMessageResultCallback() = default; |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 // certificate selection. | 232 // certificate selection. |
236 // version: protocol version used for this connection. | 233 // version: protocol version used for this connection. |
237 // clock: used to validate client nonces and ephemeral keys. | 234 // clock: used to validate client nonces and ephemeral keys. |
238 // crypto_proof: output structure containing the crypto proof used in reply to | 235 // crypto_proof: output structure containing the crypto proof used in reply to |
239 // a proof demand. | 236 // a proof demand. |
240 // done_cb: single-use callback that accepts an opaque | 237 // done_cb: single-use callback that accepts an opaque |
241 // ValidatedClientHelloMsg token that holds information about | 238 // ValidatedClientHelloMsg token that holds information about |
242 // the client hello. The callback will always be called exactly | 239 // the client hello. The callback will always be called exactly |
243 // once, either under the current call stack, or after the | 240 // once, either under the current call stack, or after the |
244 // completion of an asynchronous operation. | 241 // completion of an asynchronous operation. |
245 void ValidateClientHello(const CryptoHandshakeMessage& client_hello, | 242 void ValidateClientHello( |
246 const IPAddress& client_ip, | 243 const CryptoHandshakeMessage& client_hello, |
247 const IPAddress& server_ip, | 244 const IPAddress& client_ip, |
248 QuicVersion version, | 245 const IPAddress& server_ip, |
249 const QuicClock* clock, | 246 QuicVersion version, |
250 QuicCryptoProof* crypto_proof, | 247 const QuicClock* clock, |
251 ValidateClientHelloResultCallback* done_cb) const; | 248 QuicCryptoProof* crypto_proof, |
| 249 std::unique_ptr<ValidateClientHelloResultCallback> done_cb) const; |
252 | 250 |
253 // ProcessClientHello processes |client_hello| and decides whether to accept | 251 // ProcessClientHello processes |client_hello| and decides whether to accept |
254 // or reject the connection. If the connection is to be accepted, |out| is | 252 // or reject the connection. If the connection is to be accepted, |out| is |
255 // set to the contents of the ServerHello, |out_params| is completed and | 253 // set to the contents of the ServerHello, |out_params| is completed and |
256 // QUIC_NO_ERROR is returned. Otherwise |out| is set to be a REJ or SREJ | 254 // QUIC_NO_ERROR is returned. Otherwise |out| is set to be a REJ or SREJ |
257 // message and QUIC_NO_ERROR is returned. | 255 // message and QUIC_NO_ERROR is returned. |
258 // | 256 // |
259 // validate_chlo_result: Output from the asynchronous call to | 257 // validate_chlo_result: Output from the asynchronous call to |
260 // ValidateClientHello. Contains the client hello message and | 258 // ValidateClientHello. Contains the client hello message and |
261 // information about it. | 259 // information about it. |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 // nonces from. Setting a larger value allows for clients to delay follow-up | 410 // nonces from. Setting a larger value allows for clients to delay follow-up |
413 // client hellos for longer and still use server nonces as proofs of | 411 // client hellos for longer and still use server nonces as proofs of |
414 // uniqueness. | 412 // uniqueness. |
415 void set_server_nonce_strike_register_window_secs(uint32_t window_secs); | 413 void set_server_nonce_strike_register_window_secs(uint32_t window_secs); |
416 | 414 |
417 // set_enable_serving_sct enables or disables serving signed cert timestamp | 415 // set_enable_serving_sct enables or disables serving signed cert timestamp |
418 // (RFC6962) in server hello. | 416 // (RFC6962) in server hello. |
419 void set_enable_serving_sct(bool enable_serving_sct); | 417 void set_enable_serving_sct(bool enable_serving_sct); |
420 | 418 |
421 // Set and take ownership of the callback to invoke on primary config changes. | 419 // Set and take ownership of the callback to invoke on primary config changes. |
422 void AcquirePrimaryConfigChangedCb(PrimaryConfigChangedCallback* cb); | 420 void AcquirePrimaryConfigChangedCb( |
| 421 std::unique_ptr<PrimaryConfigChangedCallback> cb); |
423 | 422 |
424 // Returns the number of configs this object owns. | 423 // Returns the number of configs this object owns. |
425 int NumberOfConfigs() const; | 424 int NumberOfConfigs() const; |
426 | 425 |
427 private: | 426 private: |
428 friend class test::QuicCryptoServerConfigPeer; | 427 friend class test::QuicCryptoServerConfigPeer; |
429 friend struct QuicCryptoProof; | 428 friend struct QuicCryptoProof; |
430 | 429 |
431 // Config represents a server config: a collection of preferences and | 430 // Config represents a server config: a collection of preferences and |
432 // Diffie-Hellman public values. | 431 // Diffie-Hellman public values. |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
512 // EvaluateClientHello checks |client_hello| for gross errors and determines | 511 // EvaluateClientHello checks |client_hello| for gross errors and determines |
513 // whether it can be shown to be fresh (i.e. not a replay). The results are | 512 // whether it can be shown to be fresh (i.e. not a replay). The results are |
514 // written to |info|. | 513 // written to |info|. |
515 void EvaluateClientHello( | 514 void EvaluateClientHello( |
516 const IPAddress& server_ip, | 515 const IPAddress& server_ip, |
517 QuicVersion version, | 516 QuicVersion version, |
518 const uint8_t* primary_orbit, | 517 const uint8_t* primary_orbit, |
519 scoped_refptr<Config> requested_config, | 518 scoped_refptr<Config> requested_config, |
520 scoped_refptr<Config> primary_config, | 519 scoped_refptr<Config> primary_config, |
521 QuicCryptoProof* crypto_proof, | 520 QuicCryptoProof* crypto_proof, |
522 ValidateClientHelloResultCallback::Result* client_hello_state, | 521 std::unique_ptr<ValidateClientHelloResultCallback::Result> |
523 ValidateClientHelloResultCallback* done_cb) const; | 522 client_hello_state, |
| 523 std::unique_ptr<ValidateClientHelloResultCallback> done_cb) const; |
524 | 524 |
525 // Callback class for bridging between EvaluateClientHello and | 525 // Callback class for bridging between EvaluateClientHello and |
526 // EvaluateClientHelloAfterGetProof | 526 // EvaluateClientHelloAfterGetProof |
527 friend class EvaluateClientHelloCallback; | 527 friend class EvaluateClientHelloCallback; |
528 | 528 |
529 // Continuation of EvaluateClientHello after the call to | 529 // Continuation of EvaluateClientHello after the call to |
530 // ProofSource::GetProof. |found_error| indicates whether an error was | 530 // ProofSource::GetProof. |found_error| indicates whether an error was |
531 // detected in EvaluateClientHello, and |get_proof_failed| indicates whether | 531 // detected in EvaluateClientHello, and |get_proof_failed| indicates whether |
532 // GetProof failed. If GetProof was not run, then |get_proof_failed| will be | 532 // GetProof failed. If GetProof was not run, then |get_proof_failed| will be |
533 // set to false. | 533 // set to false. |
534 void EvaluateClientHelloAfterGetProof( | 534 void EvaluateClientHelloAfterGetProof( |
535 bool found_error, | 535 bool found_error, |
536 const IPAddress& server_ip, | 536 const IPAddress& server_ip, |
537 QuicVersion version, | 537 QuicVersion version, |
538 const uint8_t* primary_orbit, | 538 const uint8_t* primary_orbit, |
539 scoped_refptr<Config> requested_config, | 539 scoped_refptr<Config> requested_config, |
540 scoped_refptr<Config> primary_config, | 540 scoped_refptr<Config> primary_config, |
541 QuicCryptoProof* crypto_proof, | 541 QuicCryptoProof* crypto_proof, |
542 std::unique_ptr<ProofSource::Details> proof_source_details, | 542 std::unique_ptr<ProofSource::Details> proof_source_details, |
543 bool get_proof_failed, | 543 bool get_proof_failed, |
544 ValidateClientHelloResultCallback::Result* client_hello_state, | 544 std::unique_ptr<ValidateClientHelloResultCallback::Result> |
545 ValidateClientHelloResultCallback* done_cb) const; | 545 client_hello_state, |
| 546 std::unique_ptr<ValidateClientHelloResultCallback> done_cb) const; |
546 | 547 |
547 // BuildRejection sets |out| to be a REJ message in reply to |client_hello|. | 548 // BuildRejection sets |out| to be a REJ message in reply to |client_hello|. |
548 void BuildRejection(QuicVersion version, | 549 void BuildRejection(QuicVersion version, |
549 QuicWallTime now, | 550 QuicWallTime now, |
550 const Config& config, | 551 const Config& config, |
551 const CryptoHandshakeMessage& client_hello, | 552 const CryptoHandshakeMessage& client_hello, |
552 const ClientHelloInfo& info, | 553 const ClientHelloInfo& info, |
553 const CachedNetworkParameters& cached_network_params, | 554 const CachedNetworkParameters& cached_network_params, |
554 bool use_stateless_rejects, | 555 bool use_stateless_rejects, |
555 QuicConnectionId server_designated_connection_id, | 556 QuicConnectionId server_designated_connection_id, |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 const QuicVersion version_; | 683 const QuicVersion version_; |
683 QuicCompressedCertsCache* compressed_certs_cache_; | 684 QuicCompressedCertsCache* compressed_certs_cache_; |
684 const CommonCertSets* common_cert_sets_; | 685 const CommonCertSets* common_cert_sets_; |
685 const std::string client_common_set_hashes_; | 686 const std::string client_common_set_hashes_; |
686 const std::string client_cached_cert_hashes_; | 687 const std::string client_cached_cert_hashes_; |
687 const bool sct_supported_by_client_; | 688 const bool sct_supported_by_client_; |
688 CryptoHandshakeMessage message_; | 689 CryptoHandshakeMessage message_; |
689 std::unique_ptr<BuildServerConfigUpdateMessageResultCallback> cb_; | 690 std::unique_ptr<BuildServerConfigUpdateMessageResultCallback> cb_; |
690 }; | 691 }; |
691 | 692 |
692 // Invoked by BuildServerConfigUpdateMessageProofSourceCallback::RunImpl once | 693 // Invoked by BuildServerConfigUpdateMessageProofSourceCallback::Run once |
693 // the proof has been acquired. Finishes building the server config update | 694 // the proof has been acquired. Finishes building the server config update |
694 // message and invokes |cb|. | 695 // message and invokes |cb|. |
695 void FinishBuildServerConfigUpdateMessage( | 696 void FinishBuildServerConfigUpdateMessage( |
696 QuicVersion version, | 697 QuicVersion version, |
697 QuicCompressedCertsCache* compressed_certs_cache, | 698 QuicCompressedCertsCache* compressed_certs_cache, |
698 const CommonCertSets* common_cert_sets, | 699 const CommonCertSets* common_cert_sets, |
699 const std::string& client_common_set_hashes, | 700 const std::string& client_common_set_hashes, |
700 const std::string& client_cached_cert_hashes, | 701 const std::string& client_cached_cert_hashes, |
701 bool sct_supported_by_client, | 702 bool sct_supported_by_client, |
702 bool ok, | 703 bool ok, |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 std::string cert_sct; | 791 std::string cert_sct; |
791 // The server config that is used for this proof (and the rest of the | 792 // The server config that is used for this proof (and the rest of the |
792 // request). | 793 // request). |
793 scoped_refptr<QuicCryptoServerConfig::Config> config; | 794 scoped_refptr<QuicCryptoServerConfig::Config> config; |
794 std::string primary_scid; | 795 std::string primary_scid; |
795 }; | 796 }; |
796 | 797 |
797 } // namespace net | 798 } // namespace net |
798 | 799 |
799 #endif // NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ | 800 #endif // NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ |
OLD | NEW |