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 <map> | 8 #include <map> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
14 #include "base/strings/string_piece.h" | 14 #include "base/strings/string_piece.h" |
15 #include "base/synchronization/lock.h" | 15 #include "base/synchronization/lock.h" |
16 #include "net/base/ip_endpoint.h" | 16 #include "net/base/ip_endpoint.h" |
17 #include "net/base/net_export.h" | 17 #include "net/base/net_export.h" |
18 #include "net/quic/crypto/cached_network_parameters.h" | 18 #include "net/quic/crypto/cached_network_parameters.h" |
19 #include "net/quic/crypto/crypto_handshake.h" | 19 #include "net/quic/crypto/crypto_handshake.h" |
20 #include "net/quic/crypto/crypto_handshake_message.h" | 20 #include "net/quic/crypto/crypto_handshake_message.h" |
21 #include "net/quic/crypto/crypto_protocol.h" | 21 #include "net/quic/crypto/crypto_protocol.h" |
22 #include "net/quic/crypto/crypto_secret_boxer.h" | 22 #include "net/quic/crypto/crypto_secret_boxer.h" |
| 23 #include "net/quic/crypto/source_address_token.h" |
23 #include "net/quic/quic_time.h" | 24 #include "net/quic/quic_time.h" |
24 | 25 |
25 namespace net { | 26 namespace net { |
26 | 27 |
27 class CryptoHandshakeMessage; | 28 class CryptoHandshakeMessage; |
28 class EphemeralKeySource; | 29 class EphemeralKeySource; |
29 class KeyExchange; | 30 class KeyExchange; |
30 class ProofSource; | 31 class ProofSource; |
31 class QuicClock; | 32 class QuicClock; |
32 class QuicDecrypter; | 33 class QuicDecrypter; |
(...skipping 14 matching lines...) Expand all Loading... |
47 const QuicWallTime now; | 48 const QuicWallTime now; |
48 | 49 |
49 // Outputs from EvaluateClientHello. | 50 // Outputs from EvaluateClientHello. |
50 bool valid_source_address_token; | 51 bool valid_source_address_token; |
51 bool client_nonce_well_formed; | 52 bool client_nonce_well_formed; |
52 bool unique; | 53 bool unique; |
53 base::StringPiece sni; | 54 base::StringPiece sni; |
54 base::StringPiece client_nonce; | 55 base::StringPiece client_nonce; |
55 base::StringPiece server_nonce; | 56 base::StringPiece server_nonce; |
56 base::StringPiece user_agent_id; | 57 base::StringPiece user_agent_id; |
| 58 SourceAddressTokens source_address_tokens; |
57 | 59 |
58 // Errors from EvaluateClientHello. | 60 // Errors from EvaluateClientHello. |
59 std::vector<uint32> reject_reasons; | 61 std::vector<uint32> reject_reasons; |
60 COMPILE_ASSERT(sizeof(QuicTag) == sizeof(uint32), header_out_of_sync); | 62 COMPILE_ASSERT(sizeof(QuicTag) == sizeof(uint32), header_out_of_sync); |
61 }; | 63 }; |
62 | 64 |
63 namespace test { | 65 namespace test { |
64 class QuicCryptoServerConfigPeer; | 66 class QuicCryptoServerConfigPeer; |
65 } // namespace test | 67 } // namespace test |
66 | 68 |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 CryptoHandshakeMessage* out, | 252 CryptoHandshakeMessage* out, |
251 std::string* error_details) const; | 253 std::string* error_details) const; |
252 | 254 |
253 // BuildServerConfigUpdateMessage sets |out| to be a SCUP message containing | 255 // BuildServerConfigUpdateMessage sets |out| to be a SCUP message containing |
254 // the current primary config, an up to date source-address token, and cert | 256 // the current primary config, an up to date source-address token, and cert |
255 // chain and proof in the case of secure QUIC. Returns true if successfully | 257 // chain and proof in the case of secure QUIC. Returns true if successfully |
256 // filled |out|. | 258 // filled |out|. |
257 // | 259 // |
258 // |cached_network_params| is optional, and can be nullptr. | 260 // |cached_network_params| is optional, and can be nullptr. |
259 bool BuildServerConfigUpdateMessage( | 261 bool BuildServerConfigUpdateMessage( |
| 262 const SourceAddressTokens& previous_source_address_tokens, |
260 const IPEndPoint& server_ip, | 263 const IPEndPoint& server_ip, |
261 const IPEndPoint& client_ip, | 264 const IPEndPoint& client_ip, |
262 const QuicClock* clock, | 265 const QuicClock* clock, |
263 QuicRandom* rand, | 266 QuicRandom* rand, |
264 const QuicCryptoNegotiatedParameters& params, | 267 const QuicCryptoNegotiatedParameters& params, |
265 const CachedNetworkParameters* cached_network_params, | 268 const CachedNetworkParameters* cached_network_params, |
266 CryptoHandshakeMessage* out) const; | 269 CryptoHandshakeMessage* out) const; |
267 | 270 |
268 // SetProofSource installs |proof_source| as the ProofSource for handshakes. | 271 // SetProofSource installs |proof_source| as the ProofSource for handshakes. |
269 // This object takes ownership of |proof_source|. | 272 // This object takes ownership of |proof_source|. |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
435 | 438 |
436 // ParseConfigProtobuf parses the given config protobuf and returns a | 439 // ParseConfigProtobuf parses the given config protobuf and returns a |
437 // scoped_refptr<Config> if successful. The caller adopts the reference to the | 440 // scoped_refptr<Config> if successful. The caller adopts the reference to the |
438 // Config. On error, ParseConfigProtobuf returns nullptr. | 441 // Config. On error, ParseConfigProtobuf returns nullptr. |
439 scoped_refptr<Config> ParseConfigProtobuf(QuicServerConfigProtobuf* protobuf); | 442 scoped_refptr<Config> ParseConfigProtobuf(QuicServerConfigProtobuf* protobuf); |
440 | 443 |
441 // NewSourceAddressToken returns a fresh source address token for the given | 444 // NewSourceAddressToken returns a fresh source address token for the given |
442 // IP address. |cached_network_params| is optional, and can be nullptr. | 445 // IP address. |cached_network_params| is optional, and can be nullptr. |
443 std::string NewSourceAddressToken( | 446 std::string NewSourceAddressToken( |
444 const Config& config, | 447 const Config& config, |
| 448 const SourceAddressTokens& previous_tokens, |
445 const IPEndPoint& ip, | 449 const IPEndPoint& ip, |
446 QuicRandom* rand, | 450 QuicRandom* rand, |
447 QuicWallTime now, | 451 QuicWallTime now, |
448 const CachedNetworkParameters* cached_network_params) const; | 452 const CachedNetworkParameters* cached_network_params) const; |
449 | 453 |
450 // ValidateSourceAddressToken returns HANDSHAKE_OK if the source address token | 454 // ParseSourceAddressToken parses the source address tokens contained in |
451 // in |token| is a valid and timely token for the IP address |ip| given that | 455 // the encrypted |token|, and populates |tokens| with the parsed tokens. |
452 // the current time is |now|. Otherwise it returns the reason for failure. | 456 // Returns HANDSHAKE_OK if |token| could be parsed, or the reason for the |
453 // |cached_network_params| is populated if |token| contains a | 457 // failure. |
454 // CachedNetworkParameters proto. | 458 HandshakeFailureReason ParseSourceAddressToken( |
| 459 const Config& config, |
| 460 base::StringPiece token, |
| 461 SourceAddressTokens* tokens) const; |
| 462 |
| 463 // ValidateSourceAddressToken returns HANDSHAKE_OK if the source address |
| 464 // tokens in |tokens| contain a valid and timely token for the IP address |
| 465 // |ip| given that the current time is |now|. Otherwise it returns the |
| 466 // reason for failure. |cached_network_params| is populated if the valid |
| 467 // token contains a CachedNetworkParameters proto. |
| 468 // TODO(rch): remove this method when we remove: |
| 469 // FLAGS_quic_use_multiple_address_in_source_tokens. |
455 HandshakeFailureReason ValidateSourceAddressToken( | 470 HandshakeFailureReason ValidateSourceAddressToken( |
456 const Config& config, | 471 const Config& config, |
457 base::StringPiece token, | 472 base::StringPiece token, |
458 const IPEndPoint& ip, | 473 const IPEndPoint& ip, |
459 QuicWallTime now, | 474 QuicWallTime now, |
460 CachedNetworkParameters* cached_network_params) const; | 475 CachedNetworkParameters* cached_network_params) const; |
461 | 476 |
| 477 // ValidateSourceAddressTokens returns HANDSHAKE_OK if the source address |
| 478 // tokens in |tokens| contain a valid and timely token for the IP address |
| 479 // |ip| given that the current time is |now|. Otherwise it returns the |
| 480 // reason for failure. |cached_network_params| is populated if the valid |
| 481 // token contains a CachedNetworkParameters proto. |
| 482 HandshakeFailureReason ValidateSourceAddressTokens( |
| 483 const SourceAddressTokens& tokens, |
| 484 const IPEndPoint& ip, |
| 485 QuicWallTime now, |
| 486 CachedNetworkParameters* cached_network_params) const; |
| 487 |
| 488 // ValidateSingleSourceAddressToken returns HANDSHAKE_OK if the source |
| 489 // address token in |token| is a timely token for the IP address |ip| |
| 490 // given that the current time is |now|. Otherwise it returns the reason |
| 491 // for failure. |
| 492 HandshakeFailureReason ValidateSingleSourceAddressToken( |
| 493 const SourceAddressToken& token, |
| 494 const IPEndPoint& ip, |
| 495 QuicWallTime now) const; |
| 496 |
| 497 // Returns HANDSHAKE_OK if the source address token in |token| is a timely |
| 498 // token given that the current time is |now|. Otherwise it returns the |
| 499 // reason for failure. |
| 500 HandshakeFailureReason ValidateSourceAddressTokenTimestamp( |
| 501 const SourceAddressToken& token, |
| 502 QuicWallTime now) const; |
| 503 |
462 // NewServerNonce generates and encrypts a random nonce. | 504 // NewServerNonce generates and encrypts a random nonce. |
463 std::string NewServerNonce(QuicRandom* rand, QuicWallTime now) const; | 505 std::string NewServerNonce(QuicRandom* rand, QuicWallTime now) const; |
464 | 506 |
465 // ValidateServerNonce decrypts |token| and verifies that it hasn't been | 507 // ValidateServerNonce decrypts |token| and verifies that it hasn't been |
466 // previously used and is recent enough that it is plausible that it was part | 508 // previously used and is recent enough that it is plausible that it was part |
467 // of a very recently provided rejection ("recent" will be on the order of | 509 // of a very recently provided rejection ("recent" will be on the order of |
468 // 10-30 seconds). If so, it records that it has been used and returns | 510 // 10-30 seconds). If so, it records that it has been used and returns |
469 // HANDSHAKE_OK. Otherwise it returns the reason for failure. | 511 // HANDSHAKE_OK. Otherwise it returns the reason for failure. |
470 HandshakeFailureReason ValidateServerNonce( | 512 HandshakeFailureReason ValidateServerNonce( |
471 base::StringPiece echoed_server_nonce, | 513 base::StringPiece echoed_server_nonce, |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 uint32 source_address_token_lifetime_secs_; | 577 uint32 source_address_token_lifetime_secs_; |
536 uint32 server_nonce_strike_register_max_entries_; | 578 uint32 server_nonce_strike_register_max_entries_; |
537 uint32 server_nonce_strike_register_window_secs_; | 579 uint32 server_nonce_strike_register_window_secs_; |
538 | 580 |
539 DISALLOW_COPY_AND_ASSIGN(QuicCryptoServerConfig); | 581 DISALLOW_COPY_AND_ASSIGN(QuicCryptoServerConfig); |
540 }; | 582 }; |
541 | 583 |
542 } // namespace net | 584 } // namespace net |
543 | 585 |
544 #endif // NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ | 586 #endif // NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ |
OLD | NEW |