| 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 069c5238478a8a83c5da2b39426f46fe7f48c559..22bfd2c6cc6c120c8e8d5ea0dc73aea6bd60221f 100644
|
| --- a/net/quic/crypto/quic_crypto_server_config_test.cc
|
| +++ b/net/quic/crypto/quic_crypto_server_config_test.cc
|
| @@ -9,6 +9,7 @@
|
| #include "base/stl_util.h"
|
| #include "net/quic/crypto/aes_128_gcm_12_encrypter.h"
|
| #include "net/quic/crypto/crypto_handshake_message.h"
|
| +#include "net/quic/crypto/crypto_secret_boxer.h"
|
| #include "net/quic/crypto/crypto_server_config_protobuf.h"
|
| #include "net/quic/crypto/quic_random.h"
|
| #include "net/quic/crypto/strike_register_client.h"
|
| @@ -58,14 +59,23 @@ class QuicCryptoServerConfigPeer {
|
| *GetConfig(config_id), ip, rand, now);
|
| }
|
|
|
| - bool ValidateSourceAddressToken(string config_id,
|
| - StringPiece srct,
|
| - IPEndPoint ip,
|
| - QuicWallTime now) {
|
| + HandshakeFailureReason ValidateSourceAddressToken(string config_id,
|
| + StringPiece srct,
|
| + IPEndPoint ip,
|
| + QuicWallTime now) {
|
| return server_config_->ValidateSourceAddressToken(
|
| *GetConfig(config_id), srct, ip, now);
|
| }
|
|
|
| + string NewServerNonce(QuicRandom* rand, QuicWallTime now) const {
|
| + return server_config_->NewServerNonce(rand, now);
|
| + }
|
| +
|
| + HandshakeFailureReason ValidateServerNonce(StringPiece token,
|
| + QuicWallTime now) {
|
| + return server_config_->ValidateServerNonce(token, now);
|
| + }
|
| +
|
| base::Lock* GetStrikeRegisterClientLock() {
|
| return &server_config_->strike_register_client_lock_;
|
| }
|
| @@ -270,41 +280,84 @@ TEST(QuicCryptoServerConfigTest, SourceAddressTokens) {
|
| 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_TRUE(peer.ValidateSourceAddressToken(kPrimary, token4, ip4, now));
|
| - EXPECT_TRUE(peer.ValidateSourceAddressToken(kPrimary, token4, ip4d, now));
|
| - EXPECT_FALSE(peer.ValidateSourceAddressToken(kPrimary, token4, ip6, now));
|
| - EXPECT_TRUE(peer.ValidateSourceAddressToken(kPrimary, token4d, ip4, now));
|
| - EXPECT_TRUE(peer.ValidateSourceAddressToken(kPrimary, token4d, ip4d, now));
|
| - EXPECT_FALSE(peer.ValidateSourceAddressToken(kPrimary, token4d, ip6, now));
|
| - EXPECT_TRUE(peer.ValidateSourceAddressToken(kPrimary, token6, ip6, 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));
|
|
|
| // 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);
|
| - EXPECT_TRUE(peer.ValidateSourceAddressToken(
|
| + DCHECK_EQ(HANDSHAKE_OK, peer.ValidateSourceAddressToken(
|
| kOverride, override_token4, ip4, now));
|
| - EXPECT_FALSE(peer.ValidateSourceAddressToken(
|
| - kOverride, override_token4, ip6, now));
|
| - EXPECT_TRUE(peer.ValidateSourceAddressToken(
|
| + 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));
|
|
|
| // Tokens generated by the primary config do not validate
|
| // successfully against the override config, and vice versa.
|
| - EXPECT_FALSE(peer.ValidateSourceAddressToken(kOverride, token4, ip4, now));
|
| - EXPECT_FALSE(peer.ValidateSourceAddressToken(kOverride, token6, ip6, now));
|
| - EXPECT_FALSE(peer.ValidateSourceAddressToken(
|
| - kPrimary, override_token4, ip4, now));
|
| - EXPECT_FALSE(peer.ValidateSourceAddressToken(
|
| - kPrimary, override_token6, ip6, now));
|
| + 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));
|
|
|
| // Validation fails after tokens expire.
|
| now = original_time.Add(QuicTime::Delta::FromSeconds(86400 * 7));
|
| - EXPECT_FALSE(peer.ValidateSourceAddressToken(kPrimary, token4, ip4, now));
|
| + DCHECK_EQ(SOURCE_ADDRESS_TOKEN_EXPIRED_FAILURE,
|
| + peer.ValidateSourceAddressToken(kPrimary, token4, ip4, now));
|
|
|
| now = original_time.Subtract(QuicTime::Delta::FromSeconds(3600 * 2));
|
| - EXPECT_FALSE(peer.ValidateSourceAddressToken(kPrimary, token4, ip4, now));
|
| + DCHECK_EQ(SOURCE_ADDRESS_TOKEN_CLOCK_SKEW_FAILURE,
|
| + peer.ValidateSourceAddressToken(kPrimary, token4, ip4, now));
|
| +}
|
| +
|
| +TEST(QuicCryptoServerConfigTest, ValidateServerNonce) {
|
| + QuicRandom* rand = QuicRandom::GetInstance();
|
| + QuicCryptoServerConfig server(QuicCryptoServerConfig::TESTING, rand);
|
| + QuicCryptoServerConfigPeer peer(&server);
|
| +
|
| + StringPiece message("hello world");
|
| + const size_t key_size = CryptoSecretBoxer::GetKeySize();
|
| + scoped_ptr<uint8[]> key(new uint8[key_size]);
|
| + memset(key.get(), 0x11, key_size);
|
| +
|
| + CryptoSecretBoxer boxer;
|
| + boxer.SetKey(StringPiece(reinterpret_cast<char*>(key.get()), key_size));
|
| + const string box = boxer.Box(rand, message);
|
| + MockClock clock;
|
| + QuicWallTime now = clock.WallNow();
|
| + const QuicWallTime original_time = now;
|
| + EXPECT_EQ(SERVER_NONCE_DECRYPTION_FAILURE,
|
| + peer.ValidateServerNonce(box, now));
|
| +
|
| + string server_nonce = peer.NewServerNonce(rand, now);
|
| + EXPECT_EQ(HANDSHAKE_OK, peer.ValidateServerNonce(server_nonce, now));
|
| + EXPECT_EQ(SERVER_NONCE_NOT_UNIQUE_FAILURE,
|
| + peer.ValidateServerNonce(server_nonce, now));
|
| +
|
| + now = original_time.Add(QuicTime::Delta::FromSeconds(1000 * 7));
|
| + server_nonce = peer.NewServerNonce(rand, now);
|
| + EXPECT_EQ(HANDSHAKE_OK, peer.ValidateServerNonce(server_nonce, now));
|
| }
|
|
|
| class CryptoServerConfigsTest : public ::testing::Test {
|
|
|