Deprecate QUIC version Draft25

This CL also refactors QuicDispatcherTestOneVersion.RejectDeprecatedVersionsWithVersionNegotiation to allow verifying the parameters passed to SendVersionNegotiationPacket.

Deprecate gfe2_reloadable_flag_quic_disable_version_draft_25

PiperOrigin-RevId: 325886982
Change-Id: I43a188fc64f82e374886a5c3dee3dfb14f10ff60
diff --git a/quic/core/crypto/crypto_utils.cc b/quic/core/crypto/crypto_utils.cc
index 3be4286..fe1a5ee 100644
--- a/quic/core/crypto/crypto_utils.cc
+++ b/quic/core/crypto/crypto_utils.cc
@@ -115,10 +115,8 @@
 
 namespace {
 
-// Salt from https://tools.ietf.org/html/draft-ietf-quic-tls-25#section-5.2
-// and https://tools.ietf.org/html/draft-ietf-quic-tls-27#section-5.2
-// and https://tools.ietf.org/html/draft-ietf-quic-tls-28#section-5.2
-const uint8_t kDraft25InitialSalt[] = {0xc3, 0xee, 0xf7, 0x12, 0xc7, 0x2e, 0xbb,
+// Salt from https://tools.ietf.org/html/draft-ietf-quic-tls-27#section-5.2
+const uint8_t kDraft27InitialSalt[] = {0xc3, 0xee, 0xf7, 0x12, 0xc7, 0x2e, 0xbb,
                                        0x5a, 0x11, 0xa7, 0xd2, 0x43, 0x2b, 0xb4,
                                        0x63, 0x65, 0xbe, 0xf9, 0xf5, 0x02};
 
@@ -145,16 +143,15 @@
 
 const uint8_t* InitialSaltForVersion(const ParsedQuicVersion& version,
                                      size_t* out_len) {
-  static_assert(SupportedVersions().size() == 8u,
+  static_assert(SupportedVersions().size() == 7u,
                 "Supported versions out of sync with initial encryption salts");
   if (version == ParsedQuicVersion::Draft29()) {
     *out_len = QUICHE_ARRAYSIZE(kDraft29InitialSalt);
     return kDraft29InitialSalt;
   } else if (version == ParsedQuicVersion::Draft27() ||
-             version == ParsedQuicVersion::Draft25() ||
              version == ParsedQuicVersion::ReservedForNegotiation()) {
-    *out_len = QUICHE_ARRAYSIZE(kDraft25InitialSalt);
-    return kDraft25InitialSalt;
+    *out_len = QUICHE_ARRAYSIZE(kDraft27InitialSalt);
+    return kDraft27InitialSalt;
   } else if (version == ParsedQuicVersion::T051()) {
     *out_len = QUICHE_ARRAYSIZE(kT051Salt);
     return kT051Salt;
@@ -166,20 +163,18 @@
     return kQ050Salt;
   }
   QUIC_BUG << "No initial obfuscation salt for version " << version;
-  *out_len = QUICHE_ARRAYSIZE(kDraft25InitialSalt);
-  return kDraft25InitialSalt;
+  *out_len = QUICHE_ARRAYSIZE(kDraft27InitialSalt);
+  return kDraft27InitialSalt;
 }
 
 const char kPreSharedKeyLabel[] = "QUIC PSK";
 
 // Retry Integrity Protection Keys and Nonces.
-// https://tools.ietf.org/html/draft-ietf-quic-tls-25#section-5.8
 // https://tools.ietf.org/html/draft-ietf-quic-tls-27#section-5.8
-// https://tools.ietf.org/html/draft-ietf-quic-tls-28#section-5.8
-const uint8_t kDraft25RetryIntegrityKey[] = {0x4d, 0x32, 0xec, 0xdb, 0x2a, 0x21,
+const uint8_t kDraft27RetryIntegrityKey[] = {0x4d, 0x32, 0xec, 0xdb, 0x2a, 0x21,
                                              0x33, 0xc8, 0x41, 0xe4, 0x04, 0x3d,
                                              0xf2, 0x7d, 0x44, 0x30};
-const uint8_t kDraft25RetryIntegrityNonce[] = {
+const uint8_t kDraft27RetryIntegrityNonce[] = {
     0x4d, 0x16, 0x11, 0xd0, 0x55, 0x13, 0xa5, 0x52, 0xc5, 0x87, 0xd5, 0x75};
 
 // https://tools.ietf.org/html/draft-ietf-quic-tls-29#section-5.8
@@ -207,7 +202,7 @@
 bool RetryIntegrityKeysForVersion(const ParsedQuicVersion& version,
                                   quiche::QuicheStringPiece* key,
                                   quiche::QuicheStringPiece* nonce) {
-  static_assert(SupportedVersions().size() == 8u,
+  static_assert(SupportedVersions().size() == 7u,
                 "Supported versions out of sync with retry integrity keys");
   if (!version.HasRetryIntegrityTag()) {
     QUIC_BUG << "Attempted to get retry integrity keys for invalid version "
@@ -221,14 +216,13 @@
         reinterpret_cast<const char*>(kDraft29RetryIntegrityNonce),
         QUICHE_ARRAYSIZE(kDraft29RetryIntegrityNonce));
     return true;
-  } else if (version == ParsedQuicVersion::Draft25() ||
-             version == ParsedQuicVersion::Draft27()) {
+  } else if (version == ParsedQuicVersion::Draft27()) {
     *key = quiche::QuicheStringPiece(
-        reinterpret_cast<const char*>(kDraft25RetryIntegrityKey),
-        QUICHE_ARRAYSIZE(kDraft25RetryIntegrityKey));
+        reinterpret_cast<const char*>(kDraft27RetryIntegrityKey),
+        QUICHE_ARRAYSIZE(kDraft27RetryIntegrityKey));
     *nonce = quiche::QuicheStringPiece(
-        reinterpret_cast<const char*>(kDraft25RetryIntegrityNonce),
-        QUICHE_ARRAYSIZE(kDraft25RetryIntegrityNonce));
+        reinterpret_cast<const char*>(kDraft27RetryIntegrityNonce),
+        QUICHE_ARRAYSIZE(kDraft27RetryIntegrityNonce));
     return true;
   } else if (version == ParsedQuicVersion::T051()) {
     *key = quiche::QuicheStringPiece(
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index c547d19..49c5c4d 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -10517,10 +10517,6 @@
   }
 
   // These values come from draft-ietf-quic-tls Appendix A.4.
-  char retry_packet25[] = {
-      0xff, 0xff, 0x00, 0x00, 0x19, 0x00, 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a,
-      0x42, 0x62, 0xb5, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x1e, 0x5e, 0xc5, 0xb0,
-      0x14, 0xcb, 0xb1, 0xf0, 0xfd, 0x93, 0xdf, 0x40, 0x48, 0xc4, 0x46, 0xa6};
   char retry_packet27[] = {
       0xff, 0xff, 0x00, 0x00, 0x1b, 0x00, 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a,
       0x42, 0x62, 0xb5, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0xa5, 0x23, 0xcb, 0x5b,
@@ -10538,9 +10534,6 @@
   } else if (version() == ParsedQuicVersion::Draft27()) {
     retry_packet = retry_packet27;
     retry_packet_length = QUICHE_ARRAYSIZE(retry_packet27);
-  } else if (version() == ParsedQuicVersion::Draft25()) {
-    retry_packet = retry_packet25;
-    retry_packet_length = QUICHE_ARRAYSIZE(retry_packet25);
   } else {
     // TODO(dschinazi) generate retry packets for all versions once we have
     // server-side support for generating these programmatically.
diff --git a/quic/core/quic_dispatcher_test.cc b/quic/core/quic_dispatcher_test.cc
index 8d06ce5..1fa601f 100644
--- a/quic/core/quic_dispatcher_test.cc
+++ b/quic/core/quic_dispatcher_test.cc
@@ -1084,78 +1084,129 @@
 }
 
 TEST_P(QuicDispatcherTestOneVersion,
-       RejectDeprecatedVersionsWithVersionNegotiation) {
-  static_assert(quic::SupportedVersions().size() == 8u,
-                "Please add deprecated versions to this test");
+       RejectDeprecatedVersionDraft28WithVersionNegotiation) {
   QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
   CreateTimeWaitListManager();
-
-  {
-    char packet49[kMinPacketSizeForVersionNegotiation] = {
-        0xC0, 'Q', '0', '4', '9', /*connection ID length byte*/ 0x50};
-    QuicReceivedPacket received_packet49(
-        packet49, kMinPacketSizeForVersionNegotiation, QuicTime::Zero());
-    EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
-    EXPECT_CALL(*time_wait_list_manager_,
-                SendVersionNegotiationPacket(_, _, _, _, _, _, _, _))
-        .Times(1);
-    dispatcher_->ProcessPacket(server_address_, client_address,
-                               received_packet49);
-  }
-
-  {
-    char packet48[kMinPacketSizeForVersionNegotiation] = {
-        0xC0, 'Q', '0', '4', '8', /*connection ID length byte*/ 0x50};
-    QuicReceivedPacket received_packet48(
-        packet48, kMinPacketSizeForVersionNegotiation, QuicTime::Zero());
-    EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
-    EXPECT_CALL(*time_wait_list_manager_,
-                SendVersionNegotiationPacket(_, _, _, _, _, _, _, _))
-        .Times(1);
-    dispatcher_->ProcessPacket(server_address_, client_address,
-                               received_packet48);
-  }
-
-  {
-    char packet47[kMinPacketSizeForVersionNegotiation] = {
-        0xC0, 'Q', '0', '4', '7', /*connection ID length byte*/ 0x50};
-    QuicReceivedPacket received_packet47(
-        packet47, kMinPacketSizeForVersionNegotiation, QuicTime::Zero());
-    EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
-    EXPECT_CALL(*time_wait_list_manager_,
-                SendVersionNegotiationPacket(_, _, _, _, _, _, _, _))
-        .Times(1);
-    dispatcher_->ProcessPacket(server_address_, client_address,
-                               received_packet47);
-  }
-
-  {
-    char packet45[kMinPacketSizeForVersionNegotiation] = {
-        0xC0, 'Q', '0', '4', '5', /*connection ID length byte*/ 0x50};
-    QuicReceivedPacket received_packet45(
-        packet45, kMinPacketSizeForVersionNegotiation, QuicTime::Zero());
-    EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
-    EXPECT_CALL(*time_wait_list_manager_,
-                SendVersionNegotiationPacket(_, _, _, _, _, _, _, _))
-        .Times(1);
-    dispatcher_->ProcessPacket(server_address_, client_address,
-                               received_packet45);
-  }
-
-  {
-    char packet44[kMinPacketSizeForVersionNegotiation] = {
-        0xFF, 'Q', '0', '4', '4', /*connection ID length byte*/ 0x50};
-    QuicReceivedPacket received_packet44(
-        packet44, kMinPacketSizeForVersionNegotiation, QuicTime::Zero());
-    EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
-    EXPECT_CALL(*time_wait_list_manager_,
-                SendVersionNegotiationPacket(_, _, _, _, _, _, _, _))
-        .Times(1);
-    dispatcher_->ProcessPacket(server_address_, client_address,
-                               received_packet44);
-  }
+  char packet[kMinPacketSizeForVersionNegotiation] = {
+      0xC0, 0xFF, 0x00, 0x00, 28, /*destination connection ID length*/ 0x08};
+  QuicReceivedPacket received_packet(packet, QUICHE_ARRAYSIZE(packet),
+                                     QuicTime::Zero());
+  EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
+  EXPECT_CALL(
+      *time_wait_list_manager_,
+      SendVersionNegotiationPacket(_, _, /*ietf_quic=*/true,
+                                   /*use_length_prefix=*/true, _, _, _, _))
+      .Times(1);
+  dispatcher_->ProcessPacket(server_address_, client_address, received_packet);
 }
 
+TEST_P(QuicDispatcherTestOneVersion,
+       RejectDeprecatedVersionDraft25WithVersionNegotiation) {
+  QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
+  CreateTimeWaitListManager();
+  char packet[kMinPacketSizeForVersionNegotiation] = {
+      0xC0, 0xFF, 0x00, 0x00, 25, /*destination connection ID length*/ 0x08};
+  QuicReceivedPacket received_packet(packet, QUICHE_ARRAYSIZE(packet),
+                                     QuicTime::Zero());
+  EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
+  EXPECT_CALL(
+      *time_wait_list_manager_,
+      SendVersionNegotiationPacket(_, _, /*ietf_quic=*/true,
+                                   /*use_length_prefix=*/true, _, _, _, _))
+      .Times(1);
+  dispatcher_->ProcessPacket(server_address_, client_address, received_packet);
+}
+
+TEST_P(QuicDispatcherTestOneVersion,
+       RejectDeprecatedVersionQ049WithVersionNegotiation) {
+  QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
+  CreateTimeWaitListManager();
+  char packet[kMinPacketSizeForVersionNegotiation] = {
+      0xC0, 'Q', '0', '4', '9', /*destination connection ID length*/ 0x08};
+  QuicReceivedPacket received_packet(packet, QUICHE_ARRAYSIZE(packet),
+                                     QuicTime::Zero());
+  EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
+  EXPECT_CALL(
+      *time_wait_list_manager_,
+      SendVersionNegotiationPacket(_, _, /*ietf_quic=*/true,
+                                   /*use_length_prefix=*/true, _, _, _, _))
+      .Times(1);
+  dispatcher_->ProcessPacket(server_address_, client_address, received_packet);
+}
+
+TEST_P(QuicDispatcherTestOneVersion,
+       RejectDeprecatedVersionQ048WithVersionNegotiation) {
+  QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
+  CreateTimeWaitListManager();
+  char packet[kMinPacketSizeForVersionNegotiation] = {
+      0xC0, 'Q', '0', '4', '8', /*connection ID length byte*/ 0x50};
+  QuicReceivedPacket received_packet(packet, QUICHE_ARRAYSIZE(packet),
+                                     QuicTime::Zero());
+  EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
+  EXPECT_CALL(
+      *time_wait_list_manager_,
+      SendVersionNegotiationPacket(_, _, /*ietf_quic=*/true,
+                                   /*use_length_prefix=*/false, _, _, _, _))
+      .Times(1);
+  dispatcher_->ProcessPacket(server_address_, client_address, received_packet);
+}
+
+TEST_P(QuicDispatcherTestOneVersion,
+       RejectDeprecatedVersionQ047WithVersionNegotiation) {
+  QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
+  CreateTimeWaitListManager();
+  char packet[kMinPacketSizeForVersionNegotiation] = {
+      0xC0, 'Q', '0', '4', '7', /*connection ID length byte*/ 0x50};
+  QuicReceivedPacket received_packet(packet, QUICHE_ARRAYSIZE(packet),
+                                     QuicTime::Zero());
+  EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
+  EXPECT_CALL(
+      *time_wait_list_manager_,
+      SendVersionNegotiationPacket(_, _, /*ietf_quic=*/true,
+                                   /*use_length_prefix=*/false, _, _, _, _))
+      .Times(1);
+  dispatcher_->ProcessPacket(server_address_, client_address, received_packet);
+}
+
+TEST_P(QuicDispatcherTestOneVersion,
+       RejectDeprecatedVersionQ045WithVersionNegotiation) {
+  QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
+  CreateTimeWaitListManager();
+  char packet[kMinPacketSizeForVersionNegotiation] = {
+      0xC0, 'Q', '0', '4', '5', /*connection ID length byte*/ 0x50};
+  QuicReceivedPacket received_packet(packet, QUICHE_ARRAYSIZE(packet),
+                                     QuicTime::Zero());
+  EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
+  EXPECT_CALL(
+      *time_wait_list_manager_,
+      SendVersionNegotiationPacket(_, _, /*ietf_quic=*/true,
+                                   /*use_length_prefix=*/false, _, _, _, _))
+      .Times(1);
+  dispatcher_->ProcessPacket(server_address_, client_address, received_packet);
+}
+
+TEST_P(QuicDispatcherTestOneVersion,
+       RejectDeprecatedVersionQ044WithVersionNegotiation) {
+  QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
+  CreateTimeWaitListManager();
+  char packet44[kMinPacketSizeForVersionNegotiation] = {
+      0xFF, 'Q', '0', '4', '4', /*connection ID length byte*/ 0x50};
+  QuicReceivedPacket received_packet44(
+      packet44, kMinPacketSizeForVersionNegotiation, QuicTime::Zero());
+  EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
+  EXPECT_CALL(
+      *time_wait_list_manager_,
+      SendVersionNegotiationPacket(_, _, /*ietf_quic=*/true,
+                                   /*use_length_prefix=*/false, _, _, _, _))
+      .Times(1);
+  dispatcher_->ProcessPacket(server_address_, client_address,
+                             received_packet44);
+}
+
+static_assert(quic::SupportedVersions().size() == 7u,
+              "Please add new RejectDeprecatedVersion tests above this assert "
+              "when deprecating versions");
+
 TEST_P(QuicDispatcherTestOneVersion, VersionNegotiationProbeOld) {
   SetQuicFlag(FLAGS_quic_prober_uses_length_prefixed_connection_ids, false);
   QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
diff --git a/quic/core/quic_version_manager.cc b/quic/core/quic_version_manager.cc
index 57db3c9..52bb9a2 100644
--- a/quic/core/quic_version_manager.cc
+++ b/quic/core/quic_version_manager.cc
@@ -19,15 +19,13 @@
           GetQuicReloadableFlag(quic_disable_version_draft_29)),
       disable_version_draft_27_(
           GetQuicReloadableFlag(quic_disable_version_draft_27)),
-      disable_version_draft_25_(
-          GetQuicReloadableFlag(quic_disable_version_draft_25)),
       enable_version_t051_(GetQuicReloadableFlag(quic_enable_version_t051)),
       disable_version_t050_(GetQuicReloadableFlag(quic_disable_version_t050)),
       disable_version_q050_(GetQuicReloadableFlag(quic_disable_version_q050)),
       disable_version_q046_(GetQuicReloadableFlag(quic_disable_version_q046)),
       disable_version_q043_(GetQuicReloadableFlag(quic_disable_version_q043)),
       allowed_supported_versions_(std::move(supported_versions)) {
-  static_assert(SupportedVersions().size() == 8u,
+  static_assert(SupportedVersions().size() == 7u,
                 "Supported versions out of sync");
   RefilterSupportedVersions();
 }
@@ -57,14 +55,12 @@
 }
 
 void QuicVersionManager::MaybeRefilterSupportedVersions() {
-  static_assert(SupportedVersions().size() == 8u,
+  static_assert(SupportedVersions().size() == 7u,
                 "Supported versions out of sync");
   if (disable_version_draft_29_ !=
           GetQuicReloadableFlag(quic_disable_version_draft_29) ||
       disable_version_draft_27_ !=
           GetQuicReloadableFlag(quic_disable_version_draft_27) ||
-      disable_version_draft_25_ !=
-          GetQuicReloadableFlag(quic_disable_version_draft_25) ||
       enable_version_t051_ != GetQuicReloadableFlag(quic_enable_version_t051) ||
       disable_version_t050_ !=
           GetQuicReloadableFlag(quic_disable_version_t050) ||
@@ -78,8 +74,6 @@
         GetQuicReloadableFlag(quic_disable_version_draft_29);
     disable_version_draft_27_ =
         GetQuicReloadableFlag(quic_disable_version_draft_27);
-    disable_version_draft_25_ =
-        GetQuicReloadableFlag(quic_disable_version_draft_25);
     enable_version_t051_ = GetQuicReloadableFlag(quic_enable_version_t051);
     disable_version_t050_ = GetQuicReloadableFlag(quic_disable_version_t050);
     disable_version_q050_ = GetQuicReloadableFlag(quic_disable_version_q050);
diff --git a/quic/core/quic_version_manager.h b/quic/core/quic_version_manager.h
index 9eb69ed..cbf5de1 100644
--- a/quic/core/quic_version_manager.h
+++ b/quic/core/quic_version_manager.h
@@ -56,8 +56,6 @@
   bool disable_version_draft_29_;
   // quic_disable_version_draft_27 flag
   bool disable_version_draft_27_;
-  // quic_disable_version_draft_25 flag
-  bool disable_version_draft_25_;
   // quic_enable_version_t051 flag
   bool enable_version_t051_;
   // quic_disable_version_t050 flag
diff --git a/quic/core/quic_version_manager_test.cc b/quic/core/quic_version_manager_test.cc
index eec910c..c91ad99 100644
--- a/quic/core/quic_version_manager_test.cc
+++ b/quic/core/quic_version_manager_test.cc
@@ -18,14 +18,13 @@
 class QuicVersionManagerTest : public QuicTest {};
 
 TEST_F(QuicVersionManagerTest, QuicVersionManager) {
-  static_assert(SupportedVersions().size() == 8u,
+  static_assert(SupportedVersions().size() == 7u,
                 "Supported versions out of sync");
   for (const ParsedQuicVersion& version : AllSupportedVersions()) {
     QuicEnableVersion(version);
   }
   QuicDisableVersion(ParsedQuicVersion::Draft29());
   QuicDisableVersion(ParsedQuicVersion::Draft27());
-  QuicDisableVersion(ParsedQuicVersion::Draft25());
   QuicVersionManager manager(AllSupportedVersions());
 
   ParsedQuicVersionVector expected_parsed_versions;
@@ -74,19 +73,6 @@
   EXPECT_THAT(manager.GetSupportedAlpns(),
               ElementsAre("h3-29", "h3-27", "h3-T051", "h3-T050", "h3-Q050",
                           "h3-Q046", "h3-Q043"));
-
-  offset++;
-  QuicEnableVersion(ParsedQuicVersion::Draft25());
-  expected_parsed_versions.insert(expected_parsed_versions.begin() + offset,
-                                  ParsedQuicVersion::Draft25());
-  EXPECT_EQ(expected_parsed_versions, manager.GetSupportedVersions());
-  EXPECT_EQ(expected_parsed_versions.size() - 3 - offset,
-            manager.GetSupportedVersionsWithQuicCrypto().size());
-  EXPECT_EQ(CurrentSupportedVersionsWithQuicCrypto(),
-            manager.GetSupportedVersionsWithQuicCrypto());
-  EXPECT_THAT(manager.GetSupportedAlpns(),
-              ElementsAre("h3-29", "h3-27", "h3-25", "h3-T051", "h3-T050",
-                          "h3-Q050", "h3-Q046", "h3-Q043"));
 }
 
 }  // namespace
diff --git a/quic/core/quic_versions.cc b/quic/core/quic_versions.cc
index 93b5748..4b10cb7 100644
--- a/quic/core/quic_versions.cc
+++ b/quic/core/quic_versions.cc
@@ -40,7 +40,7 @@
 }
 
 void SetVersionFlag(const ParsedQuicVersion& version, bool should_enable) {
-  static_assert(SupportedVersions().size() == 8u,
+  static_assert(SupportedVersions().size() == 7u,
                 "Supported versions out of sync");
   const bool enable = should_enable;
   const bool disable = !should_enable;
@@ -48,8 +48,6 @@
     SetQuicReloadableFlag(quic_disable_version_draft_29, disable);
   } else if (version == ParsedQuicVersion::Draft27()) {
     SetQuicReloadableFlag(quic_disable_version_draft_27, disable);
-  } else if (version == ParsedQuicVersion::Draft25()) {
-    SetQuicReloadableFlag(quic_disable_version_draft_25, disable);
   } else if (version == ParsedQuicVersion::T051()) {
     SetQuicReloadableFlag(quic_enable_version_t051, enable);
   } else if (version == ParsedQuicVersion::T050()) {
@@ -187,8 +185,7 @@
   DCHECK(IsKnown());
   // Variable-length integer transport parameters are supported in T051 and
   // all IETF drafts since draft-27.
-  return UsesTls() && transport_version > QUIC_VERSION_50 &&
-         transport_version != QUIC_VERSION_IETF_DRAFT_25;
+  return UsesTls() && transport_version > QUIC_VERSION_50;
 }
 
 bool ParsedQuicVersion::AuthenticatesHandshakeConnectionIds() const {
@@ -196,7 +193,6 @@
   // Authentication of handshake connection IDs is supported in T051 and
   // all IETF drafts since draft-28.
   return UsesTls() && transport_version > QUIC_VERSION_50 &&
-         transport_version != QUIC_VERSION_IETF_DRAFT_25 &&
          transport_version != QUIC_VERSION_IETF_DRAFT_27;
 }
 
@@ -241,14 +237,12 @@
 }
 
 QuicVersionLabel CreateQuicVersionLabel(ParsedQuicVersion parsed_version) {
-  static_assert(SupportedVersions().size() == 8u,
+  static_assert(SupportedVersions().size() == 7u,
                 "Supported versions out of sync");
   if (parsed_version == ParsedQuicVersion::Draft29()) {
     return MakeVersionLabel(0xff, 0x00, 0x00, 29);
   } else if (parsed_version == ParsedQuicVersion::Draft27()) {
     return MakeVersionLabel(0xff, 0x00, 0x00, 27);
-  } else if (parsed_version == ParsedQuicVersion::Draft25()) {
-    return MakeVersionLabel(0xff, 0x00, 0x00, 25);
   } else if (parsed_version == ParsedQuicVersion::T051()) {
     return MakeVersionLabel('T', '0', '5', '1');
   } else if (parsed_version == ParsedQuicVersion::T050()) {
@@ -429,10 +423,6 @@
       if (!GetQuicReloadableFlag(quic_disable_version_draft_27)) {
         filtered_versions.push_back(version);
       }
-    } else if (version == ParsedQuicVersion::Draft25()) {
-      if (!GetQuicReloadableFlag(quic_disable_version_draft_25)) {
-        filtered_versions.push_back(version);
-      }
     } else if (version == ParsedQuicVersion::T051()) {
       if (GetQuicReloadableFlag(quic_enable_version_t051)) {
         filtered_versions.push_back(version);
@@ -541,14 +531,13 @@
     return #x
 
 std::string QuicVersionToString(QuicTransportVersion transport_version) {
-  static_assert(SupportedTransportVersions().size() == 7u,
+  static_assert(SupportedTransportVersions().size() == 6u,
                 "Supported versions out of sync");
   switch (transport_version) {
     RETURN_STRING_LITERAL(QUIC_VERSION_43);
     RETURN_STRING_LITERAL(QUIC_VERSION_46);
     RETURN_STRING_LITERAL(QUIC_VERSION_50);
     RETURN_STRING_LITERAL(QUIC_VERSION_51);
-    RETURN_STRING_LITERAL(QUIC_VERSION_IETF_DRAFT_25);
     RETURN_STRING_LITERAL(QUIC_VERSION_IETF_DRAFT_27);
     RETURN_STRING_LITERAL(QUIC_VERSION_IETF_DRAFT_29);
     RETURN_STRING_LITERAL(QUIC_VERSION_UNSUPPORTED);
@@ -569,7 +558,7 @@
 }
 
 std::string ParsedQuicVersionToString(ParsedQuicVersion version) {
-  static_assert(SupportedVersions().size() == 8u,
+  static_assert(SupportedVersions().size() == 7u,
                 "Supported versions out of sync");
   if (version == UnsupportedQuicVersion()) {
     return "0";
@@ -582,9 +571,6 @@
     } else if (version == ParsedQuicVersion::Draft27()) {
       DCHECK(version.UsesHttp3());
       return "draft27";
-    } else if (version == ParsedQuicVersion::Draft25()) {
-      DCHECK(version.UsesHttp3());
-      return "draft25";
     }
   }
   return QuicVersionLabelToString(CreateQuicVersionLabel(version));
@@ -675,8 +661,6 @@
     return "h3-29";
   } else if (parsed_version == ParsedQuicVersion::Draft27()) {
     return "h3-27";
-  } else if (parsed_version == ParsedQuicVersion::Draft25()) {
-    return "h3-25";
   }
   return "h3-" + ParsedQuicVersionToString(parsed_version);
 }
diff --git a/quic/core/quic_versions.h b/quic/core/quic_versions.h
index 7ea590a..77b3359 100644
--- a/quic/core/quic_versions.h
+++ b/quic/core/quic_versions.h
@@ -118,7 +118,7 @@
   // header format from draft-ietf-quic-invariants-06
   QUIC_VERSION_50 = 50,  // Header protection and initial obfuscators.
   QUIC_VERSION_51 = 51,  // draft-29 features but with GoogleQUIC frames.
-  QUIC_VERSION_IETF_DRAFT_25 = 70,  // draft-ietf-quic-transport-25.
+  // Number 70 used to represent draft-ietf-quic-transport-25.
   QUIC_VERSION_IETF_DRAFT_27 = 71,  // draft-ietf-quic-transport-27.
   // Number 72 used to represent draft-ietf-quic-transport-28.
   QUIC_VERSION_IETF_DRAFT_29 = 73,  // draft-ietf-quic-transport-29.
@@ -136,10 +136,9 @@
 
 // This array contains QUIC transport versions which we currently support.
 // DEPRECATED. Use SupportedVersions() instead.
-constexpr std::array<QuicTransportVersion, 7> SupportedTransportVersions() {
+constexpr std::array<QuicTransportVersion, 6> SupportedTransportVersions() {
   return {QUIC_VERSION_IETF_DRAFT_29,
           QUIC_VERSION_IETF_DRAFT_27,
-          QUIC_VERSION_IETF_DRAFT_25,
           QUIC_VERSION_51,
           QUIC_VERSION_50,
           QUIC_VERSION_46,
@@ -200,7 +199,6 @@
     case PROTOCOL_QUIC_CRYPTO:
       return transport_version != QUIC_VERSION_UNSUPPORTED &&
              transport_version != QUIC_VERSION_51 &&
-             transport_version != QUIC_VERSION_IETF_DRAFT_25 &&
              transport_version != QUIC_VERSION_IETF_DRAFT_27 &&
              transport_version != QUIC_VERSION_IETF_DRAFT_29;
     case PROTOCOL_TLS1_3:
@@ -258,10 +256,6 @@
     return ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_27);
   }
 
-  static constexpr ParsedQuicVersion Draft25() {
-    return ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_25);
-  }
-
   static constexpr ParsedQuicVersion T051() {
     return ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_51);
   }
@@ -422,12 +416,12 @@
   return {PROTOCOL_TLS1_3, PROTOCOL_QUIC_CRYPTO};
 }
 
-constexpr std::array<ParsedQuicVersion, 8> SupportedVersions() {
+constexpr std::array<ParsedQuicVersion, 7> SupportedVersions() {
   return {
       ParsedQuicVersion::Draft29(), ParsedQuicVersion::Draft27(),
-      ParsedQuicVersion::Draft25(), ParsedQuicVersion::T051(),
-      ParsedQuicVersion::T050(),    ParsedQuicVersion::Q050(),
-      ParsedQuicVersion::Q046(),    ParsedQuicVersion::Q043(),
+      ParsedQuicVersion::T051(),    ParsedQuicVersion::T050(),
+      ParsedQuicVersion::Q050(),    ParsedQuicVersion::Q046(),
+      ParsedQuicVersion::Q043(),
   };
 }
 
@@ -499,14 +493,14 @@
 ParseQuicVersionLabel(QuicVersionLabel version_label);
 
 // Parses a QUIC version string such as "Q043" or "T050". Also supports parsing
-// ALPN such as "h3-25" or "h3-Q050". For PROTOCOL_QUIC_CRYPTO versions, also
+// ALPN such as "h3-29" or "h3-Q050". For PROTOCOL_QUIC_CRYPTO versions, also
 // supports parsing numbers such as "46".
 QUIC_EXPORT_PRIVATE ParsedQuicVersion
 ParseQuicVersionString(quiche::QuicheStringPiece version_string);
 
 // Parses a comma-separated list of QUIC version strings. Supports parsing by
 // label, ALPN and numbers for PROTOCOL_QUIC_CRYPTO. Skips unknown versions.
-// For example: "h3-25,Q050,46".
+// For example: "h3-29,Q050,46".
 QUIC_EXPORT_PRIVATE ParsedQuicVersionVector
 ParseQuicVersionVectorString(quiche::QuicheStringPiece versions_string);
 
diff --git a/quic/core/quic_versions_test.cc b/quic/core/quic_versions_test.cc
index a79be65..1eff47a 100644
--- a/quic/core/quic_versions_test.cc
+++ b/quic/core/quic_versions_test.cc
@@ -245,11 +245,6 @@
     EXPECT_EQ(ParsedQuicVersion::Draft27(), ParseQuicVersionString("draft27"));
   }
   EXPECT_EQ(ParsedQuicVersion::Draft27(), ParseQuicVersionString("h3-27"));
-  EXPECT_EQ(ParsedQuicVersion::Draft25(), ParseQuicVersionString("ff000019"));
-  if (GetQuicReloadableFlag(quic_fix_print_draft_version)) {
-    EXPECT_EQ(ParsedQuicVersion::Draft25(), ParseQuicVersionString("draft25"));
-  }
-  EXPECT_EQ(ParsedQuicVersion::Draft25(), ParseQuicVersionString("h3-25"));
 
   for (const ParsedQuicVersion& version : AllSupportedVersions()) {
     EXPECT_EQ(version,
@@ -261,8 +256,6 @@
   ParsedQuicVersion version_q046(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46);
   ParsedQuicVersion version_q050(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_50);
   ParsedQuicVersion version_t050(PROTOCOL_TLS1_3, QUIC_VERSION_50);
-  ParsedQuicVersion version_draft_25(PROTOCOL_TLS1_3,
-                                     QUIC_VERSION_IETF_DRAFT_25);
   ParsedQuicVersion version_draft_27(PROTOCOL_TLS1_3,
                                      QUIC_VERSION_IETF_DRAFT_27);
   ParsedQuicVersion version_draft_29 = ParsedQuicVersion::Draft29();
@@ -276,16 +269,14 @@
   EXPECT_THAT(ParseQuicVersionVectorString("h3-T050"),
               ElementsAre(version_t050));
 
-  EXPECT_THAT(ParseQuicVersionVectorString("h3-25, h3-27"),
-              ElementsAre(version_draft_25, version_draft_27));
-  EXPECT_THAT(ParseQuicVersionVectorString("h3-25,h3-27"),
-              ElementsAre(version_draft_25, version_draft_27));
-  EXPECT_THAT(ParseQuicVersionVectorString("h3-25,h3-27,h3-25"),
-              ElementsAre(version_draft_25, version_draft_27));
-  EXPECT_THAT(ParseQuicVersionVectorString("h3-25,h3-27, h3-25"),
-              ElementsAre(version_draft_25, version_draft_27));
-  EXPECT_THAT(ParseQuicVersionVectorString("h3-27,h3-25"),
-              ElementsAre(version_draft_27, version_draft_25));
+  EXPECT_THAT(ParseQuicVersionVectorString("h3-27, h3-29"),
+              ElementsAre(version_draft_27, version_draft_29));
+  EXPECT_THAT(ParseQuicVersionVectorString("h3-29,h3-27,h3-29"),
+              ElementsAre(version_draft_29, version_draft_27));
+  EXPECT_THAT(ParseQuicVersionVectorString("h3-29,h3-27, h3-29"),
+              ElementsAre(version_draft_29, version_draft_27));
+  EXPECT_THAT(ParseQuicVersionVectorString("h3-27,h3-29"),
+              ElementsAre(version_draft_27, version_draft_29));
   EXPECT_THAT(ParseQuicVersionVectorString("h3-29,h3-27"),
               ElementsAre(version_draft_29, version_draft_27));
 
@@ -328,8 +319,8 @@
   EXPECT_THAT(ParseQuicVersionVectorString("99"), IsEmpty());
   EXPECT_THAT(ParseQuicVersionVectorString("70"), IsEmpty());
   EXPECT_THAT(ParseQuicVersionVectorString("h3-01"), IsEmpty());
-  EXPECT_THAT(ParseQuicVersionVectorString("h3-01,h3-25"),
-              ElementsAre(version_draft_25));
+  EXPECT_THAT(ParseQuicVersionVectorString("h3-01,h3-29"),
+              ElementsAre(version_draft_29));
 }
 
 TEST_F(QuicVersionsTest, CreateQuicVersionLabel) {
@@ -417,15 +408,11 @@
   EXPECT_EQ("Q050", ParsedQuicVersionToString(ParsedQuicVersion::Q050()));
   EXPECT_EQ("T050", ParsedQuicVersionToString(ParsedQuicVersion::T050()));
   if (GetQuicReloadableFlag(quic_fix_print_draft_version)) {
-    EXPECT_EQ("draft25",
-              ParsedQuicVersionToString(ParsedQuicVersion::Draft25()));
     EXPECT_EQ("draft27",
               ParsedQuicVersionToString(ParsedQuicVersion::Draft27()));
     EXPECT_EQ("draft29",
               ParsedQuicVersionToString(ParsedQuicVersion::Draft29()));
   } else {
-    EXPECT_EQ("ff000019",
-              ParsedQuicVersionToString(ParsedQuicVersion::Draft25()));
     EXPECT_EQ("ff00001b",
               ParsedQuicVersionToString(ParsedQuicVersion::Draft27()));
     EXPECT_EQ("ff00001d",
@@ -520,26 +507,24 @@
 // yet a typo was made in doing the #defines and it was caught
 // only in some test far removed from here... Better safe than sorry.
 TEST_F(QuicVersionsTest, CheckTransportVersionNumbersForTypos) {
-  static_assert(SupportedTransportVersions().size() == 7u,
+  static_assert(SupportedTransportVersions().size() == 6u,
                 "Supported versions out of sync");
   EXPECT_EQ(QUIC_VERSION_43, 43);
   EXPECT_EQ(QUIC_VERSION_46, 46);
   EXPECT_EQ(QUIC_VERSION_50, 50);
   EXPECT_EQ(QUIC_VERSION_51, 51);
-  EXPECT_EQ(QUIC_VERSION_IETF_DRAFT_25, 70);
   EXPECT_EQ(QUIC_VERSION_IETF_DRAFT_27, 71);
   EXPECT_EQ(QUIC_VERSION_IETF_DRAFT_29, 73);
 }
 
 TEST_F(QuicVersionsTest, AlpnForVersion) {
-  static_assert(SupportedVersions().size() == 8u,
+  static_assert(SupportedVersions().size() == 7u,
                 "Supported versions out of sync");
   EXPECT_EQ("h3-Q043", AlpnForVersion(ParsedQuicVersion::Q043()));
   EXPECT_EQ("h3-Q046", AlpnForVersion(ParsedQuicVersion::Q046()));
   EXPECT_EQ("h3-Q050", AlpnForVersion(ParsedQuicVersion::Q050()));
   EXPECT_EQ("h3-T050", AlpnForVersion(ParsedQuicVersion::T050()));
   EXPECT_EQ("h3-T051", AlpnForVersion(ParsedQuicVersion::T051()));
-  EXPECT_EQ("h3-25", AlpnForVersion(ParsedQuicVersion::Draft25()));
   EXPECT_EQ("h3-27", AlpnForVersion(ParsedQuicVersion::Draft27()));
   EXPECT_EQ("h3-29", AlpnForVersion(ParsedQuicVersion::Draft29()));
 }