| Index: net/quic/crypto/quic_crypto_server_config.cc
|
| diff --git a/net/quic/crypto/quic_crypto_server_config.cc b/net/quic/crypto/quic_crypto_server_config.cc
|
| index 62810431000963538f7087304a5d507e5c2b452c..712c38b31f2e7ce4212cbb215d776b521120d141 100644
|
| --- a/net/quic/crypto/quic_crypto_server_config.cc
|
| +++ b/net/quic/crypto/quic_crypto_server_config.cc
|
| @@ -18,6 +18,7 @@
|
| #include "net/quic/crypto/chacha20_poly1305_encrypter.h"
|
| #include "net/quic/crypto/channel_id.h"
|
| #include "net/quic/crypto/crypto_framer.h"
|
| +#include "net/quic/crypto/crypto_handshake_message.h"
|
| #include "net/quic/crypto/crypto_server_config_protobuf.h"
|
| #include "net/quic/crypto/crypto_utils.h"
|
| #include "net/quic/crypto/curve25519_key_exchange.h"
|
| @@ -61,49 +62,6 @@ string DeriveSourceAddressTokenKey(StringPiece source_address_token_secret) {
|
|
|
| } // namespace
|
|
|
| -// ClientHelloInfo contains information about a client hello message that is
|
| -// only kept for as long as it's being processed.
|
| -struct ClientHelloInfo {
|
| - ClientHelloInfo(const IPEndPoint& in_client_ip, QuicWallTime in_now)
|
| - : client_ip(in_client_ip),
|
| - now(in_now),
|
| - valid_source_address_token(false),
|
| - client_nonce_well_formed(false),
|
| - unique(false) {}
|
| -
|
| - // Inputs to EvaluateClientHello.
|
| - const IPEndPoint client_ip;
|
| - const QuicWallTime now;
|
| -
|
| - // Outputs from EvaluateClientHello.
|
| - bool valid_source_address_token;
|
| - bool client_nonce_well_formed;
|
| - bool unique;
|
| - StringPiece sni;
|
| - StringPiece client_nonce;
|
| - StringPiece server_nonce;
|
| - StringPiece user_agent_id;
|
| -
|
| - // Errors from EvaluateClientHello.
|
| - vector<uint32> reject_reasons;
|
| - COMPILE_ASSERT(sizeof(QuicTag) == sizeof(uint32), header_out_of_sync);
|
| -};
|
| -
|
| -struct ValidateClientHelloResultCallback::Result {
|
| - Result(const CryptoHandshakeMessage& in_client_hello,
|
| - IPEndPoint in_client_ip,
|
| - QuicWallTime in_now)
|
| - : client_hello(in_client_hello),
|
| - info(in_client_ip, in_now),
|
| - error_code(QUIC_NO_ERROR) {
|
| - }
|
| -
|
| - CryptoHandshakeMessage client_hello;
|
| - ClientHelloInfo info;
|
| - QuicErrorCode error_code;
|
| - string error_details;
|
| -};
|
| -
|
| class ValidateClientHelloHelper {
|
| public:
|
| ValidateClientHelloHelper(ValidateClientHelloResultCallback::Result* result,
|
| @@ -199,12 +157,36 @@ class VerifyNonceIsValidAndUniqueCallback
|
| // static
|
| const char QuicCryptoServerConfig::TESTING[] = "secret string for testing";
|
|
|
| +ClientHelloInfo::ClientHelloInfo(const IPEndPoint& in_client_ip,
|
| + QuicWallTime in_now)
|
| + : client_ip(in_client_ip),
|
| + now(in_now),
|
| + valid_source_address_token(false),
|
| + client_nonce_well_formed(false),
|
| + unique(false) {
|
| +}
|
| +
|
| +ClientHelloInfo::~ClientHelloInfo() {
|
| +}
|
| +
|
| PrimaryConfigChangedCallback::PrimaryConfigChangedCallback() {
|
| }
|
|
|
| PrimaryConfigChangedCallback::~PrimaryConfigChangedCallback() {
|
| }
|
|
|
| +ValidateClientHelloResultCallback::Result::Result(
|
| + const CryptoHandshakeMessage& in_client_hello,
|
| + IPEndPoint in_client_ip,
|
| + QuicWallTime in_now)
|
| + : client_hello(in_client_hello),
|
| + info(in_client_ip, in_now),
|
| + error_code(QUIC_NO_ERROR) {
|
| +}
|
| +
|
| +ValidateClientHelloResultCallback::Result::~Result() {
|
| +}
|
| +
|
| ValidateClientHelloResultCallback::ValidateClientHelloResultCallback() {
|
| }
|
|
|
| @@ -603,8 +585,9 @@ QuicErrorCode QuicCryptoServerConfig::ProcessClientHello(
|
| !info.client_nonce_well_formed ||
|
| !info.unique ||
|
| !requested_config.get()) {
|
| - BuildRejection(
|
| - *primary_config.get(), client_hello, info, rand, params, out);
|
| + BuildRejection(*primary_config.get(), client_hello, info,
|
| + validate_chlo_result.cached_network_params, rand, params,
|
| + out);
|
| return QUIC_NO_ERROR;
|
| }
|
|
|
| @@ -949,8 +932,12 @@ void QuicCryptoServerConfig::EvaluateClientHello(
|
| HandshakeFailureReason source_address_token_error;
|
| StringPiece srct;
|
| if (client_hello.GetStringPiece(kSourceAddressTokenTag, &srct)) {
|
| - source_address_token_error = ValidateSourceAddressToken(
|
| - *requested_config.get(), srct, info->client_ip, info->now);
|
| + source_address_token_error =
|
| + ValidateSourceAddressToken(*requested_config.get(),
|
| + srct,
|
| + info->client_ip,
|
| + info->now,
|
| + &client_hello_state->cached_network_params);
|
| info->valid_source_address_token =
|
| (source_address_token_error == HANDSHAKE_OK);
|
| } else {
|
| @@ -1083,6 +1070,7 @@ void QuicCryptoServerConfig::BuildRejection(
|
| const Config& config,
|
| const CryptoHandshakeMessage& client_hello,
|
| const ClientHelloInfo& info,
|
| + const CachedNetworkParameters& cached_network_params,
|
| QuicRandom* rand,
|
| QuicCryptoNegotiatedParameters *params,
|
| CryptoHandshakeMessage* out) const {
|
| @@ -1094,7 +1082,7 @@ void QuicCryptoServerConfig::BuildRejection(
|
| info.client_ip,
|
| rand,
|
| info.now,
|
| - nullptr));
|
| + &cached_network_params));
|
| if (replay_protection_) {
|
| out->SetStringPiece(kServerNonceTag, NewServerNonce(rand, info.now));
|
| }
|
| @@ -1437,7 +1425,8 @@ HandshakeFailureReason QuicCryptoServerConfig::ValidateSourceAddressToken(
|
| const Config& config,
|
| StringPiece token,
|
| const IPEndPoint& ip,
|
| - QuicWallTime now) const {
|
| + QuicWallTime now,
|
| + CachedNetworkParameters* cached_network_params) const {
|
| string storage;
|
| StringPiece plaintext;
|
| if (!config.source_address_token_boxer->Unbox(token, &storage, &plaintext)) {
|
| @@ -1473,6 +1462,11 @@ HandshakeFailureReason QuicCryptoServerConfig::ValidateSourceAddressToken(
|
| return SOURCE_ADDRESS_TOKEN_EXPIRED_FAILURE;
|
| }
|
|
|
| + if (FLAGS_quic_store_cached_network_params_from_chlo &&
|
| + source_address_token.has_cached_network_parameters()) {
|
| + *cached_network_params = source_address_token.cached_network_parameters();
|
| + }
|
| +
|
| return HANDSHAKE_OK;
|
| }
|
|
|
|
|