| Index: net/quic/crypto/quic_crypto_server_config_test.cc
|
| diff --git a/net/quic/crypto/quic_crypto_server_config_test.cc b/net/quic/crypto/quic_crypto_server_config_test.cc
|
| index 4453b76452f47849584aa8290e7917cf638a21ca..69481651e49c4f9e942a8ebc462c7880bec3c8c6 100644
|
| --- a/net/quic/crypto/quic_crypto_server_config_test.cc
|
| +++ b/net/quic/crypto/quic_crypto_server_config_test.cc
|
| @@ -13,6 +13,7 @@
|
| #include "net/quic/crypto/crypto_server_config_protobuf.h"
|
| #include "net/quic/crypto/quic_random.h"
|
| #include "net/quic/crypto/strike_register_client.h"
|
| +#include "net/quic/quic_flags.h"
|
| #include "net/quic/quic_time.h"
|
| #include "net/quic/test_tools/mock_clock.h"
|
| #include "net/quic/test_tools/quic_test_utils.h"
|
| @@ -50,22 +51,31 @@ class QuicCryptoServerConfigPeer {
|
| &(server_config_->default_source_address_token_boxer_);
|
| }
|
|
|
| - string NewSourceAddressToken(
|
| - string config_id,
|
| - const IPEndPoint& ip,
|
| - QuicRandom* rand,
|
| - QuicWallTime now) {
|
| + string NewSourceAddressToken(string config_id,
|
| + const IPEndPoint& ip,
|
| + QuicRandom* rand,
|
| + QuicWallTime now) {
|
| return NewSourceAddressToken(config_id, ip, rand, now, NULL);
|
| }
|
|
|
| - string NewSourceAddressToken(
|
| - string config_id,
|
| - const IPEndPoint& ip,
|
| - QuicRandom* rand,
|
| - QuicWallTime now,
|
| - CachedNetworkParameters* cached_network_params) {
|
| + string NewSourceAddressToken(string config_id,
|
| + const IPEndPoint& ip,
|
| + QuicRandom* rand,
|
| + QuicWallTime now,
|
| + const SourceAddressTokens& previous_tokens) {
|
| return server_config_->NewSourceAddressToken(
|
| - *GetConfig(config_id), ip, rand, now, cached_network_params);
|
| + *GetConfig(config_id), previous_tokens, ip, rand, now, NULL);
|
| + }
|
| +
|
| + string NewSourceAddressToken(string config_id,
|
| + const IPEndPoint& ip,
|
| + QuicRandom* rand,
|
| + QuicWallTime now,
|
| + CachedNetworkParameters* cached_network_params) {
|
| + SourceAddressTokens previous_tokens;
|
| + return server_config_->NewSourceAddressToken(*GetConfig(config_id),
|
| + previous_tokens, ip, rand, now,
|
| + cached_network_params);
|
| }
|
|
|
| HandshakeFailureReason ValidateSourceAddressToken(string config_id,
|
| @@ -85,6 +95,30 @@ class QuicCryptoServerConfigPeer {
|
| *GetConfig(config_id), srct, ip, now, cached_network_params);
|
| }
|
|
|
| + HandshakeFailureReason ValidateSourceAddressTokens(string config_id,
|
| + StringPiece srct,
|
| + const IPEndPoint& ip,
|
| + QuicWallTime now) {
|
| + return ValidateSourceAddressTokens(config_id, srct, ip, now, NULL);
|
| + }
|
| +
|
| + HandshakeFailureReason ValidateSourceAddressTokens(
|
| + string config_id,
|
| + StringPiece srct,
|
| + const IPEndPoint& ip,
|
| + QuicWallTime now,
|
| + CachedNetworkParameters* cached_network_params) {
|
| + SourceAddressTokens tokens;
|
| + HandshakeFailureReason reason = server_config_->ParseSourceAddressToken(
|
| + *GetConfig(config_id), srct, &tokens);
|
| + if (reason != HANDSHAKE_OK) {
|
| + return reason;
|
| + }
|
| +
|
| + return server_config_->ValidateSourceAddressTokens(tokens, ip, now,
|
| + cached_network_params);
|
| + }
|
| +
|
| string NewServerNonce(QuicRandom* rand, QuicWallTime now) const {
|
| return server_config_->NewServerNonce(rand, now);
|
| }
|
| @@ -257,110 +291,294 @@ TEST(QuicCryptoServerConfigTest, GetOrbitIsCalledWithoutTheStrikeRegisterLock) {
|
| EXPECT_TRUE(strike_register->is_known_orbit_called());
|
| }
|
|
|
| -TEST(QuicCryptoServerConfigTest, SourceAddressTokens) {
|
| +class SourceAddressTokenTest : public ::testing::Test {
|
| + public:
|
| + SourceAddressTokenTest()
|
| + : ip4_(IPEndPoint(Loopback4(), 1)),
|
| + ip4_dual_(ConvertIPv4NumberToIPv6Number(ip4_.address()), 1),
|
| + ip6_(IPEndPoint(Loopback6(), 2)),
|
| + original_time_(QuicWallTime::Zero()),
|
| + rand_(QuicRandom::GetInstance()),
|
| + server_(QuicCryptoServerConfig::TESTING, rand_),
|
| + peer_(&server_) {
|
| + // Advance the clock to some non-zero time.
|
| + clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1000000));
|
| + original_time_ = clock_.WallNow();
|
| +
|
| + primary_config_.reset(server_.AddDefaultConfig(
|
| + rand_, &clock_, QuicCryptoServerConfig::ConfigOptions()));
|
| +
|
| + // Add a config that overrides the default boxer.
|
| + QuicCryptoServerConfig::ConfigOptions options;
|
| + options.id = kOverride;
|
| + override_config_protobuf_.reset(
|
| + QuicCryptoServerConfig::GenerateConfig(rand_, &clock_, options));
|
| + override_config_protobuf_->set_source_address_token_secret_override(
|
| + "a secret key");
|
| + // Lower priority than the default config.
|
| + override_config_protobuf_->set_priority(1);
|
| + override_config_.reset(
|
| + server_.AddConfig(override_config_protobuf_.get(), original_time_));
|
| + }
|
| +
|
| const string kPrimary = "<primary>";
|
| const string kOverride = "Config with custom source address token key";
|
|
|
| - MockClock clock;
|
| - clock.AdvanceTime(QuicTime::Delta::FromSeconds(1000000));
|
| + IPEndPoint ip4_;
|
| + IPEndPoint ip4_dual_;
|
| + IPEndPoint ip6_;
|
|
|
| - QuicWallTime now = clock.WallNow();
|
| - const QuicWallTime original_time = now;
|
| + MockClock clock_;
|
| + QuicWallTime original_time_;
|
| + QuicRandom* rand_ = QuicRandom::GetInstance();
|
| + QuicCryptoServerConfig server_;
|
| + QuicCryptoServerConfigPeer peer_;
|
| + // Stores the primary config.
|
| + scoped_ptr<CryptoHandshakeMessage> primary_config_;
|
| + scoped_ptr<QuicServerConfigProtobuf> override_config_protobuf_;
|
| + scoped_ptr<CryptoHandshakeMessage> override_config_;
|
| +};
|
|
|
| - QuicRandom* rand = QuicRandom::GetInstance();
|
| - QuicCryptoServerConfig server(QuicCryptoServerConfig::TESTING, rand);
|
| - QuicCryptoServerConfigPeer peer(&server);
|
| +TEST_F(SourceAddressTokenTest, SourceAddressToken) {
|
| + ValueRestore<bool> old_flag(&FLAGS_quic_use_multiple_address_in_source_tokens,
|
| + false);
|
|
|
| - scoped_ptr<CryptoHandshakeMessage>(
|
| - server.AddDefaultConfig(rand, &clock,
|
| - QuicCryptoServerConfig::ConfigOptions()));
|
| + QuicWallTime now = clock_.WallNow();
|
|
|
| - // Add a config that overrides the default boxer.
|
| - QuicCryptoServerConfig::ConfigOptions options;
|
| - options.id = kOverride;
|
| - scoped_ptr<QuicServerConfigProtobuf> protobuf(
|
| - QuicCryptoServerConfig::GenerateConfig(rand, &clock, options));
|
| - protobuf->set_source_address_token_secret_override("a secret key");
|
| - // Lower priority than the default config.
|
| - protobuf->set_priority(1);
|
| - scoped_ptr<CryptoHandshakeMessage>(
|
| - server.AddConfig(protobuf.get(), now));
|
| + EXPECT_TRUE(peer_.ConfigHasDefaultSourceAddressTokenBoxer(kPrimary));
|
| + EXPECT_FALSE(peer_.ConfigHasDefaultSourceAddressTokenBoxer(kOverride));
|
| +
|
| + // Primary config generates configs that validate successfully.
|
| + const string token4 = peer_.NewSourceAddressToken(kPrimary, ip4_, rand_, now);
|
| + const string token4d =
|
| + peer_.NewSourceAddressToken(kPrimary, ip4_dual_, rand_, now);
|
| + const string token6 = peer_.NewSourceAddressToken(kPrimary, ip6_, rand_, now);
|
| + EXPECT_EQ(HANDSHAKE_OK,
|
| + peer_.ValidateSourceAddressToken(kPrimary, token4, ip4_, now));
|
| + ASSERT_EQ(HANDSHAKE_OK,
|
| + peer_.ValidateSourceAddressToken(kPrimary, token4, ip4_dual_, now));
|
| + ASSERT_EQ(SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE,
|
| + peer_.ValidateSourceAddressToken(kPrimary, token4, ip6_, now));
|
| + ASSERT_EQ(HANDSHAKE_OK,
|
| + peer_.ValidateSourceAddressToken(kPrimary, token4d, ip4_, now));
|
| + ASSERT_EQ(HANDSHAKE_OK, peer_.ValidateSourceAddressToken(kPrimary, token4d,
|
| + ip4_dual_, now));
|
| + ASSERT_EQ(SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE,
|
| + peer_.ValidateSourceAddressToken(kPrimary, token4d, ip6_, now));
|
| + ASSERT_EQ(HANDSHAKE_OK,
|
| + peer_.ValidateSourceAddressToken(kPrimary, token6, ip6_, now));
|
| +
|
| + // Override config generates configs that validate successfully.
|
| + const string override_token4 =
|
| + peer_.NewSourceAddressToken(kOverride, ip4_, rand_, now);
|
| + const string override_token6 =
|
| + peer_.NewSourceAddressToken(kOverride, ip6_, rand_, now);
|
| + ASSERT_EQ(HANDSHAKE_OK, peer_.ValidateSourceAddressToken(
|
| + kOverride, override_token4, ip4_, now));
|
| + ASSERT_EQ(
|
| + SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE,
|
| + peer_.ValidateSourceAddressToken(kOverride, override_token4, ip6_, now));
|
| + ASSERT_EQ(HANDSHAKE_OK, peer_.ValidateSourceAddressToken(
|
| + kOverride, override_token6, ip6_, now));
|
| +
|
| + // Tokens generated by the primary config do not validate
|
| + // successfully against the override config, and vice versa.
|
| + ASSERT_EQ(SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE,
|
| + peer_.ValidateSourceAddressToken(kOverride, token4, ip4_, now));
|
| + ASSERT_EQ(SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE,
|
| + peer_.ValidateSourceAddressToken(kOverride, token6, ip6_, now));
|
| + ASSERT_EQ(
|
| + SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE,
|
| + peer_.ValidateSourceAddressToken(kPrimary, override_token4, ip4_, now));
|
| + ASSERT_EQ(
|
| + SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE,
|
| + peer_.ValidateSourceAddressToken(kPrimary, override_token6, ip6_, now));
|
| +}
|
| +
|
| +TEST_F(SourceAddressTokenTest, SourceAddressTokenExpiration) {
|
| + ValueRestore<bool> old_flag(&FLAGS_quic_use_multiple_address_in_source_tokens,
|
| + false);
|
| +
|
| + QuicWallTime now = clock_.WallNow();
|
| +
|
| + const string token = peer_.NewSourceAddressToken(kPrimary, ip4_, rand_, now);
|
| +
|
| + // Validation fails after tokens expire.
|
| + now = original_time_.Add(QuicTime::Delta::FromSeconds(86400 * 7));
|
| + ASSERT_EQ(SOURCE_ADDRESS_TOKEN_EXPIRED_FAILURE,
|
| + peer_.ValidateSourceAddressToken(kPrimary, token, ip4_, now));
|
| +
|
| + now = original_time_.Subtract(QuicTime::Delta::FromSeconds(3600 * 2));
|
| + ASSERT_EQ(SOURCE_ADDRESS_TOKEN_CLOCK_SKEW_FAILURE,
|
| + peer_.ValidateSourceAddressToken(kPrimary, token, ip4_, now));
|
| +}
|
| +
|
| +TEST_F(SourceAddressTokenTest, SourceAddressTokenWithNetworkParams) {
|
| + ValueRestore<bool> old_flag(&FLAGS_quic_use_multiple_address_in_source_tokens,
|
| + false);
|
| +
|
| + QuicWallTime now = clock_.WallNow();
|
| +
|
| + // Make sure that if the source address token contains CachedNetworkParameters
|
| + // that this gets written to ValidateSourceAddressToken output argument.
|
| + CachedNetworkParameters cached_network_params_input;
|
| + cached_network_params_input.set_bandwidth_estimate_bytes_per_second(1234);
|
| + const string token4_with_cached_network_params = peer_.NewSourceAddressToken(
|
| + kPrimary, ip4_, rand_, now, &cached_network_params_input);
|
|
|
| - EXPECT_TRUE(peer.ConfigHasDefaultSourceAddressTokenBoxer(kPrimary));
|
| - EXPECT_FALSE(peer.ConfigHasDefaultSourceAddressTokenBoxer(kOverride));
|
| + CachedNetworkParameters cached_network_params_output;
|
| +#if 0
|
| + // TODO(rtenneti): For server, enable the following check after serialization
|
| + // of optional CachedNetworkParameters is implemented.
|
| + EXPECT_NE(cached_network_params_output.DebugString(),
|
| + cached_network_params_input.DebugString());
|
| +#endif
|
| + peer_.ValidateSourceAddressToken(kPrimary, token4_with_cached_network_params,
|
| + ip4_, now, &cached_network_params_output);
|
| +#if 0
|
| + // TODO(rtenneti): For server, enable the following check after serialization
|
| + // of optional CachedNetworkParameters is implemented.
|
| + EXPECT_EQ(cached_network_params_output.DebugString(),
|
| + cached_network_params_input.DebugString());
|
| +#endif
|
| +}
|
| +
|
| +// Test basic behavior of source address tokens including being specific
|
| +// to a single IP address and server config.
|
| +//
|
| +// TODO(rtenneti): For server, enable the following test after serialization of
|
| +// SourceAddressTokens is implemented.
|
| +TEST_F(SourceAddressTokenTest, DISABLED_NewSourceAddressToken) {
|
| + ValueRestore<bool> old_flag(&FLAGS_quic_use_multiple_address_in_source_tokens,
|
| + true);
|
|
|
| - IPEndPoint ip4 = IPEndPoint(Loopback4(), 1);
|
| - IPEndPoint ip4d = IPEndPoint(ConvertIPv4NumberToIPv6Number(ip4.address()), 1);
|
| - IPEndPoint ip6 = IPEndPoint(Loopback6(), 2);
|
| + QuicWallTime now = clock_.WallNow();
|
|
|
| // Primary config generates configs that validate successfully.
|
| - const string token4 = peer.NewSourceAddressToken(kPrimary, ip4, rand, now);
|
| - const string token4d = peer.NewSourceAddressToken(kPrimary, ip4d, rand, now);
|
| - const string token6 = peer.NewSourceAddressToken(kPrimary, ip6, rand, now);
|
| - EXPECT_EQ(HANDSHAKE_OK, peer.ValidateSourceAddressToken(
|
| - kPrimary, token4, ip4, now));
|
| - DCHECK_EQ(HANDSHAKE_OK, peer.ValidateSourceAddressToken(
|
| - kPrimary, token4, ip4d, now));
|
| - DCHECK_EQ(SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE,
|
| - peer.ValidateSourceAddressToken(kPrimary, token4, ip6, now));
|
| - DCHECK_EQ(HANDSHAKE_OK, peer.ValidateSourceAddressToken(
|
| - kPrimary, token4d, ip4, now));
|
| - DCHECK_EQ(HANDSHAKE_OK, peer.ValidateSourceAddressToken(
|
| - kPrimary, token4d, ip4d, now));
|
| - DCHECK_EQ(SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE,
|
| - peer.ValidateSourceAddressToken(kPrimary, token4d, ip6, now));
|
| - DCHECK_EQ(HANDSHAKE_OK, peer.ValidateSourceAddressToken(
|
| - kPrimary, token6, ip6, now));
|
| + const string token4 = peer_.NewSourceAddressToken(kPrimary, ip4_, rand_, now);
|
| + const string token4d =
|
| + peer_.NewSourceAddressToken(kPrimary, ip4_dual_, rand_, now);
|
| + const string token6 = peer_.NewSourceAddressToken(kPrimary, ip6_, rand_, now);
|
| + EXPECT_EQ(HANDSHAKE_OK,
|
| + peer_.ValidateSourceAddressTokens(kPrimary, token4, ip4_, now));
|
| + ASSERT_EQ(HANDSHAKE_OK, peer_.ValidateSourceAddressTokens(kPrimary, token4,
|
| + ip4_dual_, now));
|
| + ASSERT_EQ(SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE,
|
| + peer_.ValidateSourceAddressTokens(kPrimary, token4, ip6_, now));
|
| + ASSERT_EQ(HANDSHAKE_OK,
|
| + peer_.ValidateSourceAddressTokens(kPrimary, token4d, ip4_, now));
|
| + ASSERT_EQ(HANDSHAKE_OK, peer_.ValidateSourceAddressTokens(kPrimary, token4d,
|
| + ip4_dual_, now));
|
| + ASSERT_EQ(SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE,
|
| + peer_.ValidateSourceAddressTokens(kPrimary, token4d, ip6_, now));
|
| + ASSERT_EQ(HANDSHAKE_OK,
|
| + peer_.ValidateSourceAddressTokens(kPrimary, token6, ip6_, now));
|
|
|
| // Override config generates configs that validate successfully.
|
| - const string override_token4 = peer.NewSourceAddressToken(
|
| - kOverride, ip4, rand, now);
|
| - const string override_token6 = peer.NewSourceAddressToken(
|
| - kOverride, ip6, rand, now);
|
| - DCHECK_EQ(HANDSHAKE_OK, peer.ValidateSourceAddressToken(
|
| - kOverride, override_token4, ip4, now));
|
| - DCHECK_EQ(SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE,
|
| - peer.ValidateSourceAddressToken(kOverride, override_token4, ip6,
|
| - now));
|
| - DCHECK_EQ(HANDSHAKE_OK, peer.ValidateSourceAddressToken(
|
| - kOverride, override_token6, ip6, now));
|
| + const string override_token4 =
|
| + peer_.NewSourceAddressToken(kOverride, ip4_, rand_, now);
|
| + const string override_token6 =
|
| + peer_.NewSourceAddressToken(kOverride, ip6_, rand_, now);
|
| + ASSERT_EQ(HANDSHAKE_OK, peer_.ValidateSourceAddressTokens(
|
| + kOverride, override_token4, ip4_, now));
|
| + ASSERT_EQ(
|
| + SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE,
|
| + peer_.ValidateSourceAddressTokens(kOverride, override_token4, ip6_, now));
|
| + ASSERT_EQ(HANDSHAKE_OK, peer_.ValidateSourceAddressTokens(
|
| + kOverride, override_token6, ip6_, now));
|
|
|
| // Tokens generated by the primary config do not validate
|
| // successfully against the override config, and vice versa.
|
| - DCHECK_EQ(SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE,
|
| - peer.ValidateSourceAddressToken(kOverride, token4, ip4, now));
|
| - DCHECK_EQ(SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE,
|
| - peer.ValidateSourceAddressToken(kOverride, token6, ip6, now));
|
| - DCHECK_EQ(SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE,
|
| - peer.ValidateSourceAddressToken(kPrimary, override_token4, ip4,
|
| - now));
|
| - DCHECK_EQ(SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE,
|
| - peer.ValidateSourceAddressToken(kPrimary, override_token6, ip6,
|
| - now));
|
| + ASSERT_EQ(SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE,
|
| + peer_.ValidateSourceAddressTokens(kOverride, token4, ip4_, now));
|
| + ASSERT_EQ(SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE,
|
| + peer_.ValidateSourceAddressTokens(kOverride, token6, ip6_, now));
|
| + ASSERT_EQ(
|
| + SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE,
|
| + peer_.ValidateSourceAddressTokens(kPrimary, override_token4, ip4_, now));
|
| + ASSERT_EQ(
|
| + SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE,
|
| + peer_.ValidateSourceAddressTokens(kPrimary, override_token6, ip6_, now));
|
| +}
|
| +
|
| +// TODO(rtenneti): For server, enable the following test after serialization of
|
| +// SourceAddressTokens is implemented.
|
| +TEST_F(SourceAddressTokenTest, DISABLED_NewSourceAddressTokenExpiration) {
|
| + ValueRestore<bool> old_flag(&FLAGS_quic_use_multiple_address_in_source_tokens,
|
| + true);
|
| +
|
| + QuicWallTime now = clock_.WallNow();
|
| +
|
| + const string token = peer_.NewSourceAddressToken(kPrimary, ip4_, rand_, now);
|
|
|
| // Validation fails after tokens expire.
|
| - now = original_time.Add(QuicTime::Delta::FromSeconds(86400 * 7));
|
| - DCHECK_EQ(SOURCE_ADDRESS_TOKEN_EXPIRED_FAILURE,
|
| - peer.ValidateSourceAddressToken(kPrimary, token4, ip4, now));
|
| + now = original_time_.Add(QuicTime::Delta::FromSeconds(86400 * 7));
|
| + ASSERT_EQ(SOURCE_ADDRESS_TOKEN_EXPIRED_FAILURE,
|
| + peer_.ValidateSourceAddressTokens(kPrimary, token, ip4_, now));
|
| +
|
| + now = original_time_.Subtract(QuicTime::Delta::FromSeconds(3600 * 2));
|
| + ASSERT_EQ(SOURCE_ADDRESS_TOKEN_CLOCK_SKEW_FAILURE,
|
| + peer_.ValidateSourceAddressTokens(kPrimary, token, ip4_, now));
|
| +}
|
|
|
| - now = original_time.Subtract(QuicTime::Delta::FromSeconds(3600 * 2));
|
| - DCHECK_EQ(SOURCE_ADDRESS_TOKEN_CLOCK_SKEW_FAILURE,
|
| - peer.ValidateSourceAddressToken(kPrimary, token4, ip4, now));
|
| +TEST_F(SourceAddressTokenTest, NewSourceAddressTokenWithNetworkParams) {
|
| + ValueRestore<bool> old_flag(&FLAGS_quic_use_multiple_address_in_source_tokens,
|
| + true);
|
| +
|
| + QuicWallTime now = clock_.WallNow();
|
|
|
| // Make sure that if the source address token contains CachedNetworkParameters
|
| // that this gets written to ValidateSourceAddressToken output argument.
|
| CachedNetworkParameters cached_network_params_input;
|
| cached_network_params_input.set_bandwidth_estimate_bytes_per_second(1234);
|
| - const string token4_with_cached_network_params = peer.NewSourceAddressToken(
|
| - kPrimary, ip4, rand, now, &cached_network_params_input);
|
| + const string token4_with_cached_network_params = peer_.NewSourceAddressToken(
|
| + kPrimary, ip4_, rand_, now, &cached_network_params_input);
|
|
|
| CachedNetworkParameters cached_network_params_output;
|
| - EXPECT_NE(cached_network_params_output, cached_network_params_input);
|
| - peer.ValidateSourceAddressToken(kPrimary, token4_with_cached_network_params,
|
| - ip4, now, &cached_network_params_output);
|
| +#if 0
|
| // TODO(rtenneti): For server, enable the following check after serialization
|
| // of optional CachedNetworkParameters is implemented.
|
| - // EXPECT_EQ(cached_network_params_output, cached_network_params_input);
|
| + EXPECT_NE(cached_network_params_output.DebugString(),
|
| + cached_network_params_input.DebugString());
|
| +#endif
|
| + peer_.ValidateSourceAddressTokens(kPrimary, token4_with_cached_network_params,
|
| + ip4_, now, &cached_network_params_output);
|
| +#if 0
|
| + // TODO(rtenneti): For server, enable the following check after serialization
|
| + // of optional CachedNetworkParameters is implemented.
|
| + EXPECT_EQ(cached_network_params_output.DebugString(),
|
| + cached_network_params_input.DebugString());
|
| +#endif
|
| +}
|
| +
|
| +// Test the ability for a source address token to be valid for multiple
|
| +// addresses.
|
| +//
|
| +// TODO(rtenneti): For server, enable the following test after serialization of
|
| +// SourceAddressTokens is implemented.
|
| +TEST_F(SourceAddressTokenTest, DISABLED_SourceAddressTokenMultipleAddresses) {
|
| + ValueRestore<bool> old_flag(&FLAGS_quic_use_multiple_address_in_source_tokens,
|
| + true);
|
| +
|
| + QuicWallTime now = clock_.WallNow();
|
| +
|
| + // Now create a token which is usable for both addresses.
|
| + SourceAddressToken previous_token;
|
| + IPAddressNumber ip_address = ip6_.address();
|
| + if (ip6_.GetSockAddrFamily() == AF_INET) {
|
| + ip_address = ConvertIPv4NumberToIPv6Number(ip_address);
|
| + }
|
| + previous_token.set_ip(IPAddressToPackedString(ip_address));
|
| + previous_token.set_timestamp(now.ToUNIXSeconds());
|
| + SourceAddressTokens previous_tokens;
|
| + (*previous_tokens.add_tokens()) = previous_token;
|
| + const string token4or6 =
|
| + peer_.NewSourceAddressToken(kPrimary, ip4_, rand_, now, previous_tokens);
|
| +
|
| + EXPECT_EQ(HANDSHAKE_OK,
|
| + peer_.ValidateSourceAddressTokens(kPrimary, token4or6, ip4_, now));
|
| + ASSERT_EQ(HANDSHAKE_OK,
|
| + peer_.ValidateSourceAddressTokens(kPrimary, token4or6, ip6_, now));
|
| }
|
|
|
| TEST(QuicCryptoServerConfigTest, ValidateServerNonce) {
|
|
|