Change the version label for QUIC v99 + TLS from T099
to \xff\x00\x00\x16 to match the IETF draft 22 version label.
Remove --quic_ietf_draft_version.
gfe-relnote: n/a - QUIC v99 only
PiperOrigin-RevId: 266466333
Change-Id: Iddffd25585012807dc2bb9c291a9a16e39649c5b
diff --git a/quic/core/crypto/crypto_server_test.cc b/quic/core/crypto/crypto_server_test.cc
index 5cc4d36..3216ea8 100644
--- a/quic/core/crypto/crypto_server_test.cc
+++ b/quic/core/crypto/crypto_server_test.cc
@@ -103,7 +103,10 @@
config_.set_enable_serving_sct(true);
client_version_ = supported_versions_.front();
- client_version_string_ = ParsedQuicVersionToString(client_version_);
+ client_version_label_ = CreateQuicVersionLabel(client_version_);
+ client_version_string_ =
+ std::string(reinterpret_cast<const char*>(&client_version_label_),
+ sizeof(client_version_label_));
}
void SetUp() override {
@@ -265,7 +268,6 @@
} else {
ASSERT_NE(error, QUIC_NO_ERROR)
<< "Message didn't fail: " << result_->client_hello.DebugString();
-
EXPECT_TRUE(error_details.find(error_substr_) != std::string::npos)
<< error_substr_ << " not in " << error_details;
}
@@ -341,6 +343,7 @@
QuicSocketAddress client_address_;
ParsedQuicVersionVector supported_versions_;
ParsedQuicVersion client_version_;
+ QuicVersionLabel client_version_label_;
std::string client_version_string_;
QuicCryptoServerConfig config_;
QuicCryptoServerConfigPeer peer_;
@@ -497,9 +500,8 @@
TEST_P(CryptoServerTest, TooSmall) {
ShouldFailMentioning(
- "too small",
- crypto_test_utils::CreateCHLO(
- {{"PDMD", "X509"}, {"VER\0", client_version_string_.c_str()}}));
+ "too small", crypto_test_utils::CreateCHLO(
+ {{"PDMD", "X509"}, {"VER\0", client_version_string_}}));
const HandshakeFailureReason kRejectReasons[] = {
SERVER_CONFIG_INCHOATE_HELLO_FAILURE};
diff --git a/quic/core/crypto/crypto_utils.cc b/quic/core/crypto/crypto_utils.cc
index 085a65a..642799e 100644
--- a/quic/core/crypto/crypto_utils.cc
+++ b/quic/core/crypto/crypto_utils.cc
@@ -88,6 +88,8 @@
namespace {
+static_assert(kQuicIetfDraftVersion == 22, "Salts do not match draft version");
+// Salt from https://tools.ietf.org/html/draft-ietf-quic-tls-22#section-5.2
const uint8_t kInitialSalt[] = {0x7f, 0xbc, 0xdb, 0x0e, 0x7c, 0x66, 0xbb,
0xe9, 0x19, 0x3a, 0x96, 0xcd, 0x21, 0x51,
0x9e, 0xbd, 0x7a, 0x02, 0x64, 0x4a};
diff --git a/quic/core/http/end_to_end_test.cc b/quic/core/http/end_to_end_test.cc
index 9aab379..3a6d514 100644
--- a/quic/core/http/end_to_end_test.cc
+++ b/quic/core/http/end_to_end_test.cc
@@ -939,7 +939,7 @@
ASSERT_TRUE(Initialize());
return;
}
- QuicVersionInitializeSupportForIetfDraft(1);
+ QuicVersionInitializeSupportForIetfDraft();
ASSERT_TRUE(Initialize());
EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
diff --git a/quic/core/quic_framer_test.cc b/quic/core/quic_framer_test.cc
index ce040f2..b13f7e1 100644
--- a/quic/core/quic_framer_test.cc
+++ b/quic/core/quic_framer_test.cc
@@ -605,21 +605,9 @@
}
// Helper function to get unsigned char representation of the handshake
- // protocol byte of the current QUIC version number.
- unsigned char GetQuicVersionProtocolByte() {
- return (CreateQuicVersionLabel(version_) >> 24) & 0xff;
- }
-
- // Helper function to get unsigned char representation of digit in the
- // units place of the current QUIC version number.
- unsigned char GetQuicVersionDigitOnes() {
- return CreateQuicVersionLabel(version_) & 0xff;
- }
-
- // Helper function to get unsigned char representation of digit in the
- // tens place of the current QUIC version number.
- unsigned char GetQuicVersionDigitTens() {
- return (CreateQuicVersionLabel(version_) >> 8) & 0xff;
+ // protocol byte at position |pos| of the current QUIC version number.
+ unsigned char GetQuicVersionByte(int pos) {
+ return (CreateQuicVersionLabel(version_) >> 8 * (3 - pos)) & 0xff;
}
bool CheckEncryption(QuicPacketNumber packet_number, QuicPacket* packet) {
@@ -818,9 +806,9 @@
// testing, and these byte arrays contain the QUIC version. This macro explodes
// the 32-bit version into four bytes in network order. Since it uses methods of
// QuicFramerTest, it is only valid to use this in a QuicFramerTest.
-#define QUIC_VERSION_BYTES \
- GetQuicVersionProtocolByte(), '0', GetQuicVersionDigitTens(), \
- GetQuicVersionDigitOnes()
+#define QUIC_VERSION_BYTES \
+ GetQuicVersionByte(0), GetQuicVersionByte(1), GetQuicVersionByte(2), \
+ GetQuicVersionByte(3)
// Run all framer tests with all supported versions of QUIC.
INSTANTIATE_TEST_SUITE_P(QuicFramerTests,
diff --git a/quic/core/quic_versions.cc b/quic/core/quic_versions.cc
index 3808e95..8281b68 100644
--- a/quic/core/quic_versions.cc
+++ b/quic/core/quic_versions.cc
@@ -120,10 +120,8 @@
case QUIC_VERSION_48:
return MakeVersionLabel(proto, '0', '4', '8');
case QUIC_VERSION_99:
- if (parsed_version.handshake_protocol == PROTOCOL_TLS1_3 &&
- GetQuicFlag(FLAGS_quic_ietf_draft_version) != 0) {
- return MakeVersionLabel(0xff, 0x00, 0x00,
- GetQuicFlag(FLAGS_quic_ietf_draft_version));
+ if (parsed_version.handshake_protocol == PROTOCOL_TLS1_3) {
+ return MakeVersionLabel(0xff, 0x00, 0x00, kQuicIetfDraftVersion);
}
return MakeVersionLabel(proto, '0', '9', '9');
case QUIC_VERSION_RESERVED_FOR_NEGOTIATION:
@@ -449,26 +447,13 @@
std::string AlpnForVersion(ParsedQuicVersion parsed_version) {
if (parsed_version.handshake_protocol == PROTOCOL_TLS1_3 &&
- parsed_version.transport_version == QUIC_VERSION_99 &&
- GetQuicFlag(FLAGS_quic_ietf_draft_version) != 0) {
- return "h3-" + QuicTextUtils::Uint64ToString(
- GetQuicFlag(FLAGS_quic_ietf_draft_version));
+ parsed_version.transport_version == QUIC_VERSION_99) {
+ return "h3-" + QuicTextUtils::Uint64ToString(kQuicIetfDraftVersion);
}
return "h3-" + ParsedQuicVersionToString(parsed_version);
}
-void QuicVersionInitializeSupportForIetfDraft(int32_t draft_version) {
- if (draft_version < 0 || draft_version >= 256) {
- QUIC_LOG(FATAL) << "Invalid IETF draft version " << draft_version;
- return;
- }
-
- SetQuicFlag(FLAGS_quic_ietf_draft_version, draft_version);
-
- if (draft_version == 0) {
- return;
- }
-
+void QuicVersionInitializeSupportForIetfDraft() {
// Enable necessary flags.
SetQuicFlag(FLAGS_quic_supports_tls_handshake, true);
SetQuicReloadableFlag(quic_simplify_stop_waiting, true);
diff --git a/quic/core/quic_versions.h b/quic/core/quic_versions.h
index 2702c60..5b2a6ed 100644
--- a/quic/core/quic_versions.h
+++ b/quic/core/quic_versions.h
@@ -116,6 +116,9 @@
QUIC_VERSION_RESERVED_FOR_NEGOTIATION = 999,
};
+// IETF draft version most closely approximated by TLS + v99.
+static const int kQuicIetfDraftVersion = 22;
+
// The crypto handshake protocols that can be used with QUIC.
enum HandshakeProtocol {
PROTOCOL_UNSUPPORTED,
@@ -439,10 +442,9 @@
QUIC_EXPORT_PRIVATE std::string AlpnForVersion(
ParsedQuicVersion parsed_version);
-// Initializes support for the provided IETF draft version by setting flags
-// and the version label.
-QUIC_EXPORT_PRIVATE void QuicVersionInitializeSupportForIetfDraft(
- int32_t draft_version);
+// Initializes support for the provided IETF draft version by setting the
+// correct flags.
+QUIC_EXPORT_PRIVATE void QuicVersionInitializeSupportForIetfDraft();
// Enables the flags required to support this version of QUIC.
QUIC_EXPORT_PRIVATE void QuicEnableVersion(ParsedQuicVersion parsed_version);
diff --git a/quic/core/quic_versions_test.cc b/quic/core/quic_versions_test.cc
index 09d6a3e..f5b0dd2 100644
--- a/quic/core/quic_versions_test.cc
+++ b/quic/core/quic_versions_test.cc
@@ -469,32 +469,7 @@
EXPECT_EQ("h3-T047", AlpnForVersion(parsed_version_t047));
EXPECT_EQ("h3-Q048", AlpnForVersion(parsed_version_q048));
EXPECT_EQ("h3-T048", AlpnForVersion(parsed_version_t048));
- EXPECT_EQ("h3-T099", AlpnForVersion(parsed_version_t099));
-}
-
-TEST_F(QuicVersionsTest, InitializeSupportForIetfDraft) {
- ParsedQuicVersion parsed_version_t099 =
- ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_99);
- EXPECT_EQ(MakeVersionLabel('T', '0', '9', '9'),
- CreateQuicVersionLabel(parsed_version_t099));
- EXPECT_EQ("h3-T099", AlpnForVersion(parsed_version_t099));
-
- QuicVersionInitializeSupportForIetfDraft(0);
- EXPECT_EQ(MakeVersionLabel('T', '0', '9', '9'),
- CreateQuicVersionLabel(parsed_version_t099));
- EXPECT_EQ("h3-T099", AlpnForVersion(parsed_version_t099));
- EXPECT_FALSE(GetQuicFlag(FLAGS_quic_supports_tls_handshake));
-
- QuicVersionInitializeSupportForIetfDraft(18);
- EXPECT_TRUE(GetQuicFlag(FLAGS_quic_supports_tls_handshake));
- EXPECT_EQ(MakeVersionLabel(0xff, 0, 0, 18),
- CreateQuicVersionLabel(parsed_version_t099));
- EXPECT_EQ("h3-18", AlpnForVersion(parsed_version_t099));
-
- QuicVersionInitializeSupportForIetfDraft(0);
- EXPECT_EQ(MakeVersionLabel('T', '0', '9', '9'),
- CreateQuicVersionLabel(parsed_version_t099));
- EXPECT_EQ("h3-T099", AlpnForVersion(parsed_version_t099));
+ EXPECT_EQ("h3-22", AlpnForVersion(parsed_version_t099));
}
TEST_F(QuicVersionsTest, QuicEnableVersion) {
diff --git a/quic/tools/quic_client_interop_test_bin.cc b/quic/tools/quic_client_interop_test_bin.cc
index d972678..39f8ff9 100644
--- a/quic/tools/quic_client_interop_test_bin.cc
+++ b/quic/tools/quic_client_interop_test_bin.cc
@@ -19,14 +19,6 @@
DEFINE_QUIC_COMMAND_LINE_FLAG(int32_t, port, 0, "The port to connect to.");
-DEFINE_QUIC_COMMAND_LINE_FLAG(
- int32_t,
- quic_ietf_draft,
- 0,
- "QUIC IETF draft number to use over the wire, e.g. 18. "
- "By default this sets quic_version to T099. "
- "This also enables required internal QUIC flags.");
-
namespace quic {
enum class Feature {
@@ -118,11 +110,9 @@
return features;
}
-std::set<Feature> ServerSupport(std::string host,
- int port,
- int32_t ietf_draft) {
+std::set<Feature> ServerSupport(std::string host, int port) {
// Configure version list.
- QuicVersionInitializeSupportForIetfDraft(ietf_draft);
+ QuicVersionInitializeSupportForIetfDraft();
ParsedQuicVersion version =
ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_99);
ParsedQuicVersionVector versions = {version};
@@ -160,13 +150,12 @@
}
std::string host = GetQuicFlag(FLAGS_host);
int port = GetQuicFlag(FLAGS_port);
- const int32_t quic_ietf_draft = GetQuicFlag(FLAGS_quic_ietf_draft);
- if (host.empty() || port == 0 || quic_ietf_draft == 0) {
+ if (host.empty() || port == 0) {
quic::QuicPrintCommandLineFlagHelp(usage);
exit(1);
}
- auto supported_features = quic::ServerSupport(host, port, quic_ietf_draft);
+ auto supported_features = quic::ServerSupport(host, port);
std::cout << "Supported features: ";
for (auto feature : supported_features) {
std::cout << MatrixLetter(feature);
diff --git a/quic/tools/quic_toy_client.cc b/quic/tools/quic_toy_client.cc
index ed05600..09e7a50 100644
--- a/quic/tools/quic_toy_client.cc
+++ b/quic/tools/quic_toy_client.cc
@@ -111,13 +111,11 @@
"versions are offered in the handshake. Also supports wire versions "
"such as Q043 or T099.");
-DEFINE_QUIC_COMMAND_LINE_FLAG(
- int32_t,
- quic_ietf_draft,
- 0,
- "QUIC IETF draft number to use over the wire, e.g. 18. "
- "By default this sets quic_version to T099. "
- "This also enables required internal QUIC flags.");
+DEFINE_QUIC_COMMAND_LINE_FLAG(bool,
+ quic_ietf_draft,
+ false,
+ "Use the IETF draft version. This also enables "
+ "required internal QUIC flags.");
DEFINE_QUIC_COMMAND_LINE_FLAG(
bool,
@@ -183,14 +181,12 @@
quic::ParsedQuicVersionVector versions = quic::CurrentSupportedVersions();
std::string quic_version_string = GetQuicFlag(FLAGS_quic_version);
- const int32_t quic_ietf_draft = GetQuicFlag(FLAGS_quic_ietf_draft);
- if (quic_ietf_draft > 0) {
- quic::QuicVersionInitializeSupportForIetfDraft(quic_ietf_draft);
- if (quic_version_string.length() == 0) {
- quic_version_string = "T099";
- }
- }
- if (quic_version_string.length() > 0) {
+ if (GetQuicFlag(FLAGS_quic_ietf_draft)) {
+ quic::QuicVersionInitializeSupportForIetfDraft();
+ versions = {{quic::PROTOCOL_TLS1_3, quic::QUIC_VERSION_99}};
+ quic::QuicEnableVersion(versions[0]);
+
+ } else if (!quic_version_string.empty()) {
if (quic_version_string[0] == 'T') {
// ParseQuicVersionString checks quic_supports_tls_handshake.
SetQuicFlag(FLAGS_quic_supports_tls_handshake, true);
@@ -201,8 +197,7 @@
quic::QUIC_VERSION_UNSUPPORTED) {
return 1;
}
- versions.clear();
- versions.push_back(parsed_quic_version);
+ versions = {parsed_quic_version};
quic::QuicEnableVersion(parsed_quic_version);
}
diff --git a/quic/tools/quic_toy_server.cc b/quic/tools/quic_toy_server.cc
index 633b465..9fb15eb 100644
--- a/quic/tools/quic_toy_server.cc
+++ b/quic/tools/quic_toy_server.cc
@@ -26,12 +26,11 @@
"construction to seed the cache. Cache directory can be "
"generated using `wget -p --save-headers <url>`");
-DEFINE_QUIC_COMMAND_LINE_FLAG(
- int32_t,
- quic_ietf_draft,
- 0,
- "QUIC IETF draft number to use over the wire, e.g. 18. "
- "This also enables required internal QUIC flags.");
+DEFINE_QUIC_COMMAND_LINE_FLAG(bool,
+ quic_ietf_draft,
+ false,
+ "Use the IETF draft version. This also enables "
+ "required internal QUIC flags.");
namespace quic {
@@ -50,9 +49,8 @@
: backend_factory_(backend_factory), server_factory_(server_factory) {}
int QuicToyServer::Start() {
- const int32_t quic_ietf_draft = GetQuicFlag(FLAGS_quic_ietf_draft);
- if (quic_ietf_draft > 0) {
- quic::QuicVersionInitializeSupportForIetfDraft(quic_ietf_draft);
+ if (GetQuicFlag(FLAGS_quic_ietf_draft)) {
+ QuicVersionInitializeSupportForIetfDraft();
quic::QuicEnableVersion(
quic::ParsedQuicVersion(quic::PROTOCOL_TLS1_3, quic::QUIC_VERSION_99));
}