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));
   }