Introduce QUIC version draft-28

This CL adds a new QUIC version and plumbs it where needed. It doesn't add any features specific to draft-28; those will come in subsequent CLs. The flag is marked enabling_blocked_by until then.

Introduce quic draft-28, protected by blocked flag gfe2_reloadable_flag_quic_enable_version_draft_28

PiperOrigin-RevId: 312770917
Change-Id: I89f8f41f902b1465b1c6d269177682865e7aae21
diff --git a/quic/core/quic_versions.h b/quic/core/quic_versions.h
index 8456a98..9e6a184 100644
--- a/quic/core/quic_versions.h
+++ b/quic/core/quic_versions.h
@@ -119,6 +119,7 @@
   QUIC_VERSION_50 = 50,  // Header protection and initial obfuscators.
   QUIC_VERSION_IETF_DRAFT_25 = 70,  // draft-ietf-quic-transport-25.
   QUIC_VERSION_IETF_DRAFT_27 = 71,  // draft-ietf-quic-transport-27.
+  QUIC_VERSION_IETF_DRAFT_28 = 72,  // draft-ietf-quic-transport-28.
   // Version 99 was a dumping ground for IETF QUIC changes which were not yet
   // yet ready for production between 2018-02 and 2020-02.
 
@@ -133,8 +134,9 @@
 
 // This array contains QUIC transport versions which we currently support.
 // DEPRECATED. Use SupportedVersions() instead.
-constexpr std::array<QuicTransportVersion, 7> SupportedTransportVersions() {
-  return {QUIC_VERSION_IETF_DRAFT_27,
+constexpr std::array<QuicTransportVersion, 8> SupportedTransportVersions() {
+  return {QUIC_VERSION_IETF_DRAFT_28,
+          QUIC_VERSION_IETF_DRAFT_27,
           QUIC_VERSION_IETF_DRAFT_25,
           QUIC_VERSION_50,
           QUIC_VERSION_49,
@@ -196,7 +198,8 @@
     case PROTOCOL_QUIC_CRYPTO:
       return transport_version != QUIC_VERSION_UNSUPPORTED &&
              transport_version != QUIC_VERSION_IETF_DRAFT_25 &&
-             transport_version != QUIC_VERSION_IETF_DRAFT_27;
+             transport_version != QUIC_VERSION_IETF_DRAFT_27 &&
+             transport_version != QUIC_VERSION_IETF_DRAFT_28;
     case PROTOCOL_TLS1_3:
       // The TLS handshake is only deployable if CRYPTO frames are also used.
       // We explicitly removed support for T048 and T049 to reduce test load.
@@ -336,6 +339,10 @@
   // encoding transport parameter types and lengths.
   bool HasVarIntTransportParams() const;
 
+  // Returns true if this version uses transport parameters to authenticate all
+  // the connection IDs used during the handshake.
+  bool AuthenticatesHandshakeConnectionIds() const;
+
   // Returns whether this version uses PROTOCOL_TLS1_3.
   bool UsesTls() const;
 
@@ -370,8 +377,9 @@
   return {PROTOCOL_TLS1_3, PROTOCOL_QUIC_CRYPTO};
 }
 
-constexpr std::array<ParsedQuicVersion, 8> SupportedVersions() {
+constexpr std::array<ParsedQuicVersion, 9> SupportedVersions() {
   return {
+      ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_28),
       ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_27),
       ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_25),
       ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_50),