diff options
Diffstat (limited to 'chromium/net/third_party/quiche/src/quic/core/crypto/transport_parameters_test.cc')
-rw-r--r-- | chromium/net/third_party/quiche/src/quic/core/crypto/transport_parameters_test.cc | 440 |
1 files changed, 440 insertions, 0 deletions
diff --git a/chromium/net/third_party/quiche/src/quic/core/crypto/transport_parameters_test.cc b/chromium/net/third_party/quiche/src/quic/core/crypto/transport_parameters_test.cc new file mode 100644 index 00000000000..23b18e54bbc --- /dev/null +++ b/chromium/net/third_party/quiche/src/quic/core/crypto/transport_parameters_test.cc @@ -0,0 +1,440 @@ +// Copyright (c) 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/third_party/quiche/src/quic/core/crypto/transport_parameters.h" + +#include "third_party/boringssl/src/include/openssl/mem.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_test.h" + +namespace quic { +namespace test { + +class TransportParametersTest : public QuicTest {}; + +TEST_F(TransportParametersTest, RoundTripClient) { + TransportParameters orig_params; + orig_params.perspective = Perspective::IS_CLIENT; + orig_params.initial_max_stream_data = 12; + orig_params.initial_max_data = 34; + orig_params.idle_timeout = 56; + orig_params.initial_max_bidi_streams.present = true; + orig_params.initial_max_bidi_streams.value = 2000; + orig_params.initial_max_uni_streams.present = true; + orig_params.initial_max_uni_streams.value = 3000; + orig_params.max_packet_size.present = true; + orig_params.max_packet_size.value = 9001; + orig_params.ack_delay_exponent.present = true; + orig_params.ack_delay_exponent.value = 10; + orig_params.version = 0xff000005; + + std::vector<uint8_t> serialized; + ASSERT_TRUE(SerializeTransportParameters(orig_params, &serialized)); + + TransportParameters new_params; + ASSERT_TRUE(ParseTransportParameters(serialized.data(), serialized.size(), + Perspective::IS_CLIENT, &new_params)); + + EXPECT_EQ(new_params.initial_max_stream_data, + orig_params.initial_max_stream_data); + EXPECT_EQ(new_params.initial_max_data, orig_params.initial_max_data); + EXPECT_EQ(new_params.idle_timeout, orig_params.idle_timeout); + EXPECT_EQ(new_params.version, orig_params.version); + EXPECT_TRUE(new_params.initial_max_bidi_streams.present); + EXPECT_EQ(new_params.initial_max_bidi_streams.value, + orig_params.initial_max_bidi_streams.value); + EXPECT_TRUE(new_params.initial_max_uni_streams.present); + EXPECT_EQ(new_params.initial_max_uni_streams.value, + orig_params.initial_max_uni_streams.value); + EXPECT_TRUE(new_params.max_packet_size.present); + EXPECT_EQ(new_params.max_packet_size.value, + orig_params.max_packet_size.value); + EXPECT_TRUE(new_params.ack_delay_exponent.present); + EXPECT_EQ(new_params.ack_delay_exponent.value, + orig_params.ack_delay_exponent.value); +} + +TEST_F(TransportParametersTest, RoundTripServer) { + TransportParameters orig_params; + orig_params.perspective = Perspective::IS_SERVER; + orig_params.initial_max_stream_data = 12; + orig_params.initial_max_data = 34; + orig_params.idle_timeout = 56; + orig_params.stateless_reset_token.resize(16); + orig_params.version = 0xff000005; + orig_params.supported_versions.push_back(0xff000005); + orig_params.supported_versions.push_back(0xff000004); + + std::vector<uint8_t> serialized; + ASSERT_TRUE(SerializeTransportParameters(orig_params, &serialized)); + + TransportParameters new_params; + ASSERT_TRUE(ParseTransportParameters(serialized.data(), serialized.size(), + Perspective::IS_SERVER, &new_params)); + + EXPECT_EQ(new_params.initial_max_stream_data, + orig_params.initial_max_stream_data); + EXPECT_EQ(new_params.initial_max_data, orig_params.initial_max_data); + EXPECT_EQ(new_params.idle_timeout, orig_params.idle_timeout); + EXPECT_EQ(new_params.stateless_reset_token, + orig_params.stateless_reset_token); + EXPECT_EQ(new_params.version, orig_params.version); + ASSERT_EQ(new_params.supported_versions, orig_params.supported_versions); +} + +TEST_F(TransportParametersTest, IsValid) { + TransportParameters empty_params; + empty_params.perspective = Perspective::IS_CLIENT; + EXPECT_TRUE(empty_params.is_valid()); + + { + TransportParameters params; + params.perspective = Perspective::IS_CLIENT; + EXPECT_TRUE(params.is_valid()); + params.idle_timeout = 600; + EXPECT_TRUE(params.is_valid()); + params.idle_timeout = 601; + EXPECT_FALSE(params.is_valid()); + } + { + TransportParameters params; + params.perspective = Perspective::IS_CLIENT; + EXPECT_TRUE(params.is_valid()); + params.max_packet_size.present = true; + params.max_packet_size.value = 0; + EXPECT_FALSE(params.is_valid()); + params.max_packet_size.value = 1200; + EXPECT_TRUE(params.is_valid()); + params.max_packet_size.value = 65527; + EXPECT_TRUE(params.is_valid()); + params.max_packet_size.value = 65535; + EXPECT_FALSE(params.is_valid()); + } + { + TransportParameters params; + params.perspective = Perspective::IS_CLIENT; + EXPECT_TRUE(params.is_valid()); + params.ack_delay_exponent.present = true; + params.ack_delay_exponent.value = 0; + EXPECT_TRUE(params.is_valid()); + params.ack_delay_exponent.value = 20; + EXPECT_TRUE(params.is_valid()); + params.ack_delay_exponent.value = 21; + EXPECT_FALSE(params.is_valid()); + } +} + +TEST_F(TransportParametersTest, NoServerParamsWithoutStatelessResetToken) { + TransportParameters orig_params; + orig_params.perspective = Perspective::IS_SERVER; + orig_params.initial_max_stream_data = 12; + orig_params.initial_max_data = 34; + orig_params.idle_timeout = 56; + orig_params.version = 0xff000005; + orig_params.supported_versions.push_back(0xff000005); + orig_params.supported_versions.push_back(0xff000004); + + std::vector<uint8_t> out; + ASSERT_FALSE(SerializeTransportParameters(orig_params, &out)); +} + +TEST_F(TransportParametersTest, NoClientParamsWithStatelessResetToken) { + TransportParameters orig_params; + orig_params.perspective = Perspective::IS_CLIENT; + orig_params.initial_max_stream_data = 12; + orig_params.initial_max_data = 34; + orig_params.idle_timeout = 56; + orig_params.stateless_reset_token.resize(16); + orig_params.version = 0xff000005; + + std::vector<uint8_t> out; + ASSERT_FALSE(SerializeTransportParameters(orig_params, &out)); +} + +TEST_F(TransportParametersTest, ParseClientParams) { + const uint8_t kClientParams[] = { + 0xff, 0x00, 0x00, 0x05, // initial version + 0x00, 0x16, // length parameters array that follows + // initial_max_stream_data + 0x00, 0x00, // parameter id + 0x00, 0x04, // length + 0x00, 0x00, 0x00, 0x0c, // value + // initial_max_data + 0x00, 0x01, // parameter id + 0x00, 0x04, // length + 0x00, 0x00, 0x00, 0x22, // value + // idle_timeout + 0x00, 0x03, // parameter id + 0x00, 0x02, // length + 0x00, 0x38, // value + }; + + TransportParameters out_params; + ASSERT_TRUE(ParseTransportParameters(kClientParams, + QUIC_ARRAYSIZE(kClientParams), + Perspective::IS_CLIENT, &out_params)); +} + +TEST_F(TransportParametersTest, ParseClientParamsFailsWithStatelessResetToken) { + TransportParameters out_params; + + // clang-format off + const uint8_t kClientParamsWithFullToken[] = { + 0xff, 0x00, 0x00, 0x05, // initial version + 0x00, 0x2a, // length parameters array that follows + // initial_max_stream_data + 0x00, 0x00, // parameter id + 0x00, 0x04, // length + 0x00, 0x00, 0x00, 0x0c, // value + // initial_max_data + 0x00, 0x01, // parameter id + 0x00, 0x04, // length + 0x00, 0x00, 0x00, 0x22, // value + // idle_timeout + 0x00, 0x03, // parameter id + 0x00, 0x02, // length + 0x00, 0x38, // value + // stateless_reset_token + 0x00, 0x06, // parameter id + 0x00, 0x10, // length + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + }; + // clang-format on + + ASSERT_FALSE(ParseTransportParameters( + kClientParamsWithFullToken, QUIC_ARRAYSIZE(kClientParamsWithFullToken), + Perspective::IS_CLIENT, &out_params)); + + const uint8_t kClientParamsWithEmptyToken[] = { + 0xff, 0x00, 0x00, 0x05, // initial version + 0x00, 0x1a, // length parameters array that follows + // initial_max_stream_data + 0x00, 0x00, // parameter id + 0x00, 0x04, // length + 0x00, 0x00, 0x00, 0x0c, // value + // initial_max_data + 0x00, 0x01, // parameter id + 0x00, 0x04, // length + 0x00, 0x00, 0x00, 0x22, // value + // idle_timeout + 0x00, 0x03, // parameter id + 0x00, 0x02, // length + 0x00, 0x38, // value + // stateless_reset_token + 0x00, 0x06, // parameter id + 0x00, 0x00, // length + }; + + ASSERT_FALSE(ParseTransportParameters( + kClientParamsWithEmptyToken, QUIC_ARRAYSIZE(kClientParamsWithEmptyToken), + Perspective::IS_CLIENT, &out_params)); +} + +TEST_F(TransportParametersTest, ParseClientParametersWithInvalidParams) { + TransportParameters out_params; + + const uint8_t kClientParamsRepeated[] = { + 0xff, 0x00, 0x00, 0x05, // initial version + 0x00, 0x1c, // length parameters array that follows + // initial_max_stream_data + 0x00, 0x00, // parameter id + 0x00, 0x04, // length + 0x00, 0x00, 0x00, 0x0c, // value + // initial_max_data + 0x00, 0x01, // parameter id + 0x00, 0x04, // length + 0x00, 0x00, 0x00, 0x22, // value + // idle_timeout + 0x00, 0x03, // parameter id + 0x00, 0x02, // length + 0x00, 0x38, // value + // idle_timeout (repeat) + 0x00, 0x03, // parameter id + 0x00, 0x02, // length + 0x00, 0x38, // value + }; + ASSERT_FALSE(ParseTransportParameters(kClientParamsRepeated, + QUIC_ARRAYSIZE(kClientParamsRepeated), + Perspective::IS_CLIENT, &out_params)); + + const uint8_t kClientParamsMissing[] = { + 0xff, 0x00, 0x00, 0x05, // initial version + 0x00, 0x10, // length parameters array that follows + // initial_max_stream_data + 0x00, 0x00, // parameter id + 0x00, 0x04, // length + 0x00, 0x00, 0x00, 0x0c, // value + // initial_max_data + 0x00, 0x01, // parameter id + 0x00, 0x04, // length + 0x00, 0x00, 0x00, 0x22, // value + }; + ASSERT_FALSE(ParseTransportParameters(kClientParamsMissing, + QUIC_ARRAYSIZE(kClientParamsMissing), + Perspective::IS_CLIENT, &out_params)); +} + +TEST_F(TransportParametersTest, ParseServerParams) { + // clang-format off + const uint8_t kServerParams[] = { + 0xff, 0x00, 0x00, 0x05, // negotiated_version + 0x08, // length of supported versions array + 0xff, 0x00, 0x00, 0x05, + 0xff, 0x00, 0x00, 0x04, + 0x00, 0x2a, // length of parameters array that follows + // initial_max_stream_data + 0x00, 0x00, + 0x00, 0x04, + 0x00, 0x00, 0x00, 0x0c, + // initial_max_data + 0x00, 0x01, + 0x00, 0x04, + 0x00, 0x00, 0x00, 0x22, + // idle_timeout + 0x00, 0x03, + 0x00, 0x02, + 0x00, 0x38, + // stateless_reset_token + 0x00, 0x06, + 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + // clang-format on + + TransportParameters out_params; + ASSERT_TRUE(ParseTransportParameters(kServerParams, + QUIC_ARRAYSIZE(kServerParams), + Perspective::IS_SERVER, &out_params)); +} + +TEST_F(TransportParametersTest, ParseServerParamsWithoutToken) { + // clang-format off + const uint8_t kServerParams[] = { + 0xff, 0x00, 0x00, 0x05, // negotiated_version + 0x08, // length of supported versions array + 0xff, 0x00, 0x00, 0x05, + 0xff, 0x00, 0x00, 0x04, + 0x00, 0x16, // length of parameters array that follows + // initial_max_stream_data + 0x00, 0x00, + 0x00, 0x04, + 0x00, 0x00, 0x00, 0x0c, + // initial_max_data + 0x00, 0x01, + 0x00, 0x04, + 0x00, 0x00, 0x00, 0x22, + // idle_timeout + 0x00, 0x03, + 0x00, 0x02, + 0x00, 0x38, + }; + // clang-format on + + TransportParameters out_params; + ASSERT_FALSE(ParseTransportParameters(kServerParams, + QUIC_ARRAYSIZE(kServerParams), + Perspective::IS_SERVER, &out_params)); +} + +TEST_F(TransportParametersTest, ParseServerParametersWithInvalidParams) { + TransportParameters out_params; + + // clang-format off + const uint8_t kServerParamsRepeated[] = { + 0xff, 0x00, 0x00, 0x05, // negotiated_version + 0x08, // length of supported versions array + 0xff, 0x00, 0x00, 0x05, + 0xff, 0x00, 0x00, 0x04, + 0x00, 0x30, // length of parameters array that follows + // initial_max_stream_data + 0x00, 0x00, + 0x00, 0x04, + 0x00, 0x00, 0x00, 0x0c, + // initial_max_data + 0x00, 0x01, + 0x00, 0x04, + 0x00, 0x00, 0x00, 0x22, + // idle_timeout + 0x00, 0x03, + 0x00, 0x02, + 0x00, 0x38, + // idle_timeout (repeat) + 0x00, 0x03, + 0x00, 0x02, + 0x00, 0x38, + // stateless_reset_token + 0x00, 0x06, + 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + // clang-format on + ASSERT_FALSE(ParseTransportParameters(kServerParamsRepeated, + QUIC_ARRAYSIZE(kServerParamsRepeated), + Perspective::IS_SERVER, &out_params)); + + // clang-format off + const uint8_t kServerParamsMissing[] = { + 0xff, 0x00, 0x00, 0x05, // negotiated_version + 0x08, // length of supported versions array + 0xff, 0x00, 0x00, 0x05, + 0xff, 0x00, 0x00, 0x04, + 0x00, 0x24, // length of parameters array that follows + // initial_max_stream_data + 0x00, 0x00, + 0x00, 0x04, + 0x00, 0x00, 0x00, 0x0c, + // initial_max_data + 0x00, 0x01, + 0x00, 0x04, + 0x00, 0x00, 0x00, 0x22, + // stateless_reset_token + 0x00, 0x06, + 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + // clang-format on + ASSERT_FALSE(ParseTransportParameters(kServerParamsMissing, + QUIC_ARRAYSIZE(kServerParamsMissing), + Perspective::IS_SERVER, &out_params)); +} + +TEST_F(TransportParametersTest, CryptoHandshakeMessageRoundtrip) { + TransportParameters orig_params; + orig_params.perspective = Perspective::IS_CLIENT; + orig_params.initial_max_stream_data = 12; + orig_params.initial_max_data = 34; + orig_params.idle_timeout = 56; + + orig_params.google_quic_params = QuicMakeUnique<CryptoHandshakeMessage>(); + const std::string kTestString = "test string"; + orig_params.google_quic_params->SetStringPiece(42, kTestString); + const uint32_t kTestValue = 12; + orig_params.google_quic_params->SetValue(1337, kTestValue); + + std::vector<uint8_t> serialized; + ASSERT_TRUE(SerializeTransportParameters(orig_params, &serialized)); + + TransportParameters new_params; + ASSERT_TRUE(ParseTransportParameters(serialized.data(), serialized.size(), + Perspective::IS_CLIENT, &new_params)); + + ASSERT_NE(new_params.google_quic_params.get(), nullptr); + EXPECT_EQ(new_params.google_quic_params->tag(), + orig_params.google_quic_params->tag()); + QuicStringPiece test_string; + EXPECT_TRUE(new_params.google_quic_params->GetStringPiece(42, &test_string)); + EXPECT_EQ(test_string, kTestString); + uint32_t test_value; + EXPECT_EQ(new_params.google_quic_params->GetUint32(1337, &test_value), + QUIC_NO_ERROR); + EXPECT_EQ(test_value, kTestValue); +} + +} // namespace test +} // namespace quic |