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/crypto/crypto_utils.cc b/quic/core/crypto/crypto_utils.cc index b6c6b7a..94d738a 100644 --- a/quic/core/crypto/crypto_utils.cc +++ b/quic/core/crypto/crypto_utils.cc
@@ -117,6 +117,7 @@ // 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, 0x5a, 0x11, 0xa7, 0xd2, 0x43, 0x2b, 0xb4, 0x63, 0x65, 0xbe, 0xf9, 0xf5, 0x02}; @@ -135,7 +136,7 @@ const uint8_t* InitialSaltForVersion(const ParsedQuicVersion& version, size_t* out_len) { - static_assert(SupportedVersions().size() == 8u, + static_assert(SupportedVersions().size() == 9u, "Supported versions out of sync with initial encryption salts"); switch (version.handshake_protocol) { case PROTOCOL_QUIC_CRYPTO: @@ -166,6 +167,10 @@ // draft-27 uses the same salt as draft-25. *out_len = QUICHE_ARRAYSIZE(kDraft25InitialSalt); return kDraft25InitialSalt; + case QUIC_VERSION_IETF_DRAFT_28: + // draft-28 uses the same salt as draft-25. + *out_len = QUICHE_ARRAYSIZE(kDraft25InitialSalt); + return kDraft25InitialSalt; default: QUIC_BUG << "No initial obfuscation salt for version " << version; } @@ -183,6 +188,7 @@ // 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, 0x33, 0xc8, 0x41, 0xe4, 0x04, 0x3d, 0xf2, 0x7d, 0x44, 0x30}; @@ -218,7 +224,9 @@ if (version == ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_25) || version == - ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_27)) { + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_27) || + version == + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_28)) { *key = quiche::QuicheStringPiece( reinterpret_cast<const char*>(kDraft25RetryIntegrityKey), QUICHE_ARRAYSIZE(kDraft25RetryIntegrityKey));
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc index bb61130..34a4b4c 100644 --- a/quic/core/quic_connection_test.cc +++ b/quic/core/quic_connection_test.cc
@@ -10384,11 +10384,19 @@ 0xff, 0xff, 0x00, 0x00, 0x1b, 0x00, 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0xa5, 0x23, 0xcb, 0x5b, 0xa5, 0x24, 0x69, 0x5f, 0x65, 0x69, 0xf2, 0x93, 0xa1, 0x35, 0x9d, 0x8e}; + char retry_packet28[] = { + 0xff, 0xff, 0x00, 0x00, 0x1c, 0x00, 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, + 0x42, 0x62, 0xb5, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0xf7, 0x1a, 0x5f, 0x12, + 0xaf, 0xe3, 0xec, 0xf8, 0x00, 0x1a, 0x92, 0x0e, 0x6f, 0xdf, 0x1d, 0x63}; char* retry_packet; size_t retry_packet_length; if (version() == - ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_27)) { + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_28)) { + retry_packet = retry_packet28; + retry_packet_length = QUICHE_ARRAYSIZE(retry_packet28); + } else if (version() == + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_27)) { retry_packet = retry_packet27; retry_packet_length = QUICHE_ARRAYSIZE(retry_packet27); } else if (version() ==
diff --git a/quic/core/quic_dispatcher_test.cc b/quic/core/quic_dispatcher_test.cc index 38cf329..b1fbbab 100644 --- a/quic/core/quic_dispatcher_test.cc +++ b/quic/core/quic_dispatcher_test.cc
@@ -1029,7 +1029,7 @@ TEST_P(QuicDispatcherTestOneVersion, RejectDeprecatedVersionsWithVersionNegotiation) { - static_assert(quic::SupportedVersions().size() == 8u, + static_assert(quic::SupportedVersions().size() == 9u, "Please add deprecated versions to this test"); QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1); CreateTimeWaitListManager(); @@ -2309,7 +2309,7 @@ // Regression test for b/117874922. TEST_P(BufferedPacketStoreTest, ProcessBufferedChloWithDifferentVersion) { // Ensure the preferred version is not supported by the server. - SetQuicReloadableFlag(quic_enable_version_draft_27, false); + SetQuicReloadableFlag(quic_enable_version_draft_28, false); uint64_t last_connection_id = kMaxNumSessionsToCreate + 5; ParsedQuicVersionVector supported_versions = CurrentSupportedVersions(); for (uint64_t conn_id = 1; conn_id <= last_connection_id; ++conn_id) {
diff --git a/quic/core/quic_version_manager.cc b/quic/core/quic_version_manager.cc index 0a014be..d4cc329 100644 --- a/quic/core/quic_version_manager.cc +++ b/quic/core/quic_version_manager.cc
@@ -15,7 +15,9 @@ QuicVersionManager::QuicVersionManager( ParsedQuicVersionVector supported_versions) - : enable_version_draft_27_( + : enable_version_draft_28_( + GetQuicReloadableFlag(quic_enable_version_draft_28)), + enable_version_draft_27_( GetQuicReloadableFlag(quic_enable_version_draft_27)), enable_version_draft_25_( GetQuicReloadableFlag(quic_enable_version_draft_25_v3)), @@ -26,7 +28,7 @@ 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() == 9u, "Supported versions out of sync"); RefilterSupportedVersions(); } @@ -56,9 +58,11 @@ } void QuicVersionManager::MaybeRefilterSupportedVersions() { - static_assert(SupportedVersions().size() == 8u, + static_assert(SupportedVersions().size() == 9u, "Supported versions out of sync"); - if (enable_version_draft_27_ != + if (enable_version_draft_28_ != + GetQuicReloadableFlag(quic_enable_version_draft_28) || + enable_version_draft_27_ != GetQuicReloadableFlag(quic_enable_version_draft_27) || enable_version_draft_25_ != GetQuicReloadableFlag(quic_enable_version_draft_25_v3) || @@ -74,6 +78,8 @@ GetQuicReloadableFlag(quic_disable_version_q046) || disable_version_q043_ != GetQuicReloadableFlag(quic_disable_version_q043)) { + enable_version_draft_28_ = + GetQuicReloadableFlag(quic_enable_version_draft_28); enable_version_draft_27_ = GetQuicReloadableFlag(quic_enable_version_draft_27); enable_version_draft_25_ =
diff --git a/quic/core/quic_version_manager.h b/quic/core/quic_version_manager.h index c5111ed..6a1afd2 100644 --- a/quic/core/quic_version_manager.h +++ b/quic/core/quic_version_manager.h
@@ -52,6 +52,8 @@ private: // Cached value of reloadable flags. + // quic_enable_version_draft_28 flag + bool enable_version_draft_28_; // quic_enable_version_draft_27 flag bool enable_version_draft_27_; // quic_enable_version_draft_25_v3 flag
diff --git a/quic/core/quic_version_manager_test.cc b/quic/core/quic_version_manager_test.cc index 3a8e98f..7fbd2d1 100644 --- a/quic/core/quic_version_manager_test.cc +++ b/quic/core/quic_version_manager_test.cc
@@ -18,8 +18,9 @@ class QuicVersionManagerTest : public QuicTest {}; TEST_F(QuicVersionManagerTest, QuicVersionManager) { - static_assert(SupportedVersions().size() == 8u, + static_assert(SupportedVersions().size() == 9u, "Supported versions out of sync"); + SetQuicReloadableFlag(quic_enable_version_draft_28, false); SetQuicReloadableFlag(quic_enable_version_draft_27, false); SetQuicReloadableFlag(quic_enable_version_draft_25_v3, false); SetQuicReloadableFlag(quic_enable_version_t050_v2, false); @@ -54,10 +55,10 @@ manager.GetSupportedAlpns(), ElementsAre("h3-Q050", "h3-Q049", "h3-Q048", "h3-Q046", "h3-Q043")); - SetQuicReloadableFlag(quic_enable_version_draft_27, true); + SetQuicReloadableFlag(quic_enable_version_draft_28, true); expected_parsed_versions.insert( expected_parsed_versions.begin(), - ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_27)); + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_28)); EXPECT_EQ(expected_parsed_versions, manager.GetSupportedVersions()); EXPECT_EQ(expected_parsed_versions.size() - 1, manager.GetSupportedVersionsWithQuicCrypto().size()); @@ -66,36 +67,51 @@ EXPECT_EQ(CurrentSupportedVersionsWithQuicCrypto(), manager.GetSupportedVersionsWithQuicCrypto()); EXPECT_THAT(manager.GetSupportedAlpns(), - ElementsAre("h3-27", "h3-Q050", "h3-Q049", "h3-Q048", "h3-Q046", + ElementsAre("h3-28", "h3-Q050", "h3-Q049", "h3-Q048", "h3-Q046", "h3-Q043")); - SetQuicReloadableFlag(quic_enable_version_draft_25_v3, true); + SetQuicReloadableFlag(quic_enable_version_draft_27, true); expected_parsed_versions.insert( expected_parsed_versions.begin() + 1, - ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_25)); + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_27)); EXPECT_EQ(expected_parsed_versions, manager.GetSupportedVersions()); EXPECT_EQ(expected_parsed_versions.size() - 2, manager.GetSupportedVersionsWithQuicCrypto().size()); - EXPECT_EQ(CurrentSupportedVersionsWithQuicCrypto(), - manager.GetSupportedVersionsWithQuicCrypto()); - EXPECT_THAT(manager.GetSupportedAlpns(), - ElementsAre("h3-27", "h3-25", "h3-Q050", "h3-Q049", "h3-Q048", - "h3-Q046", "h3-Q043")); - - SetQuicReloadableFlag(quic_enable_version_t050_v2, true); - expected_parsed_versions.insert( - expected_parsed_versions.begin() + 2, - ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_50)); - EXPECT_EQ(expected_parsed_versions, manager.GetSupportedVersions()); - EXPECT_EQ(expected_parsed_versions.size() - 3, - manager.GetSupportedVersionsWithQuicCrypto().size()); EXPECT_EQ(FilterSupportedVersions(AllSupportedVersions()), manager.GetSupportedVersions()); EXPECT_EQ(CurrentSupportedVersionsWithQuicCrypto(), manager.GetSupportedVersionsWithQuicCrypto()); EXPECT_THAT(manager.GetSupportedAlpns(), - ElementsAre("h3-27", "h3-25", "h3-T050", "h3-Q050", "h3-Q049", + ElementsAre("h3-28", "h3-27", "h3-Q050", "h3-Q049", "h3-Q048", + "h3-Q046", "h3-Q043")); + + SetQuicReloadableFlag(quic_enable_version_draft_25_v3, true); + expected_parsed_versions.insert( + expected_parsed_versions.begin() + 2, + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_25)); + EXPECT_EQ(expected_parsed_versions, manager.GetSupportedVersions()); + EXPECT_EQ(expected_parsed_versions.size() - 3, + manager.GetSupportedVersionsWithQuicCrypto().size()); + EXPECT_EQ(CurrentSupportedVersionsWithQuicCrypto(), + manager.GetSupportedVersionsWithQuicCrypto()); + EXPECT_THAT(manager.GetSupportedAlpns(), + ElementsAre("h3-28", "h3-27", "h3-25", "h3-Q050", "h3-Q049", "h3-Q048", "h3-Q046", "h3-Q043")); + + SetQuicReloadableFlag(quic_enable_version_t050_v2, true); + expected_parsed_versions.insert( + expected_parsed_versions.begin() + 3, + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_50)); + EXPECT_EQ(expected_parsed_versions, manager.GetSupportedVersions()); + EXPECT_EQ(expected_parsed_versions.size() - 4, + manager.GetSupportedVersionsWithQuicCrypto().size()); + EXPECT_EQ(FilterSupportedVersions(AllSupportedVersions()), + manager.GetSupportedVersions()); + EXPECT_EQ(CurrentSupportedVersionsWithQuicCrypto(), + manager.GetSupportedVersionsWithQuicCrypto()); + EXPECT_THAT(manager.GetSupportedAlpns(), + ElementsAre("h3-28", "h3-27", "h3-25", "h3-T050", "h3-Q050", + "h3-Q049", "h3-Q048", "h3-Q046", "h3-Q043")); } } // namespace
diff --git a/quic/core/quic_versions.cc b/quic/core/quic_versions.cc index bf93e83..7e09d2f 100644 --- a/quic/core/quic_versions.cc +++ b/quic/core/quic_versions.cc
@@ -158,6 +158,11 @@ return transport_version >= QUIC_VERSION_IETF_DRAFT_27; } +bool ParsedQuicVersion::AuthenticatesHandshakeConnectionIds() const { + DCHECK(IsKnown()); + return transport_version >= QUIC_VERSION_IETF_DRAFT_28; +} + bool ParsedQuicVersion::UsesTls() const { DCHECK(IsKnown()); return handshake_protocol == PROTOCOL_TLS1_3; @@ -211,7 +216,7 @@ << parsed_version.handshake_protocol; return 0; } - static_assert(SupportedVersions().size() == 8u, + static_assert(SupportedVersions().size() == 9u, "Supported versions out of sync"); switch (parsed_version.transport_version) { case QUIC_VERSION_43: @@ -236,6 +241,12 @@ } QUIC_BUG << "QUIC_VERSION_IETF_DRAFT_27 requires TLS"; return 0; + case QUIC_VERSION_IETF_DRAFT_28: + if (parsed_version.handshake_protocol == PROTOCOL_TLS1_3) { + return MakeVersionLabel(0xff, 0x00, 0x00, 28); + } + QUIC_BUG << "QUIC_VERSION_IETF_DRAFT_28 requires TLS"; + return 0; case QUIC_VERSION_RESERVED_FOR_NEGOTIATION: return CreateRandomVersionLabelForNegotiation(); default: @@ -391,8 +402,13 @@ ParsedQuicVersionVector versions) { ParsedQuicVersionVector filtered_versions; filtered_versions.reserve(versions.size()); - for (ParsedQuicVersion version : versions) { - if (version.transport_version == QUIC_VERSION_IETF_DRAFT_27) { + for (const ParsedQuicVersion& version : versions) { + if (version.transport_version == QUIC_VERSION_IETF_DRAFT_28) { + QUIC_BUG_IF(version.handshake_protocol != PROTOCOL_TLS1_3); + if (GetQuicReloadableFlag(quic_enable_version_draft_28)) { + filtered_versions.push_back(version); + } + } else if (version.transport_version == QUIC_VERSION_IETF_DRAFT_27) { QUIC_BUG_IF(version.handshake_protocol != PROTOCOL_TLS1_3); if (GetQuicReloadableFlag(quic_enable_version_draft_27)) { filtered_versions.push_back(version); @@ -518,7 +534,7 @@ return #x std::string QuicVersionToString(QuicTransportVersion transport_version) { - static_assert(SupportedTransportVersions().size() == 7u, + static_assert(SupportedTransportVersions().size() == 8u, "Supported versions out of sync"); switch (transport_version) { RETURN_STRING_LITERAL(QUIC_VERSION_43); @@ -528,6 +544,7 @@ RETURN_STRING_LITERAL(QUIC_VERSION_50); RETURN_STRING_LITERAL(QUIC_VERSION_IETF_DRAFT_25); RETURN_STRING_LITERAL(QUIC_VERSION_IETF_DRAFT_27); + RETURN_STRING_LITERAL(QUIC_VERSION_IETF_DRAFT_28); RETURN_STRING_LITERAL(QUIC_VERSION_UNSUPPORTED); RETURN_STRING_LITERAL(QUIC_VERSION_RESERVED_FOR_NEGOTIATION); } @@ -631,11 +648,12 @@ std::string AlpnForVersion(ParsedQuicVersion parsed_version) { if (parsed_version.handshake_protocol == PROTOCOL_TLS1_3) { - if (parsed_version.transport_version == QUIC_VERSION_IETF_DRAFT_25) { - return "h3-25"; - } - if (parsed_version.transport_version == QUIC_VERSION_IETF_DRAFT_27) { + if (parsed_version.transport_version == QUIC_VERSION_IETF_DRAFT_28) { + return "h3-28"; + } else if (parsed_version.transport_version == QUIC_VERSION_IETF_DRAFT_27) { return "h3-27"; + } else if (parsed_version.transport_version == QUIC_VERSION_IETF_DRAFT_25) { + return "h3-25"; } } return "h3-" + ParsedQuicVersionToString(parsed_version); @@ -646,9 +664,12 @@ } void QuicEnableVersion(ParsedQuicVersion parsed_version) { - static_assert(SupportedVersions().size() == 8u, + static_assert(SupportedVersions().size() == 9u, "Supported versions out of sync"); - if (parsed_version.transport_version == QUIC_VERSION_IETF_DRAFT_27) { + if (parsed_version.transport_version == QUIC_VERSION_IETF_DRAFT_28) { + QUIC_BUG_IF(parsed_version.handshake_protocol != PROTOCOL_TLS1_3); + SetQuicReloadableFlag(quic_enable_version_draft_28, true); + } else if (parsed_version.transport_version == QUIC_VERSION_IETF_DRAFT_27) { QUIC_BUG_IF(parsed_version.handshake_protocol != PROTOCOL_TLS1_3); SetQuicReloadableFlag(quic_enable_version_draft_27, true); } else if (parsed_version.transport_version == QUIC_VERSION_IETF_DRAFT_25) {
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),
diff --git a/quic/core/quic_versions_test.cc b/quic/core/quic_versions_test.cc index 3a07221..52278f7 100644 --- a/quic/core/quic_versions_test.cc +++ b/quic/core/quic_versions_test.cc
@@ -248,6 +248,10 @@ ParseQuicVersionString("T050")); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_50), ParseQuicVersionString("h3-T050")); + EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_28), + ParseQuicVersionString("ff00001c")); + EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_28), + ParseQuicVersionString("h3-28")); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_27), ParseQuicVersionString("ff00001b")); EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_27), @@ -266,6 +270,8 @@ QUIC_VERSION_IETF_DRAFT_25); ParsedQuicVersion version_draft_27(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_27); + ParsedQuicVersion version_draft_28(PROTOCOL_TLS1_3, + QUIC_VERSION_IETF_DRAFT_28); EXPECT_THAT(ParseQuicVersionVectorString(""), IsEmpty()); @@ -286,6 +292,8 @@ 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-28,h3-27"), + ElementsAre(version_draft_28, version_draft_27)); EXPECT_THAT(ParseQuicVersionVectorString("h3-27,50"), ElementsAre(version_draft_27, version_q050)); @@ -442,8 +450,47 @@ } TEST_F(QuicVersionsTest, FilterSupportedVersionsAllVersions) { - static_assert(SupportedVersions().size() == 8u, + static_assert(SupportedVersions().size() == 9u, "Supported versions out of sync"); + SetQuicReloadableFlag(quic_enable_version_draft_28, true); + SetQuicReloadableFlag(quic_enable_version_draft_27, true); + SetQuicReloadableFlag(quic_enable_version_draft_25_v3, true); + SetQuicReloadableFlag(quic_enable_version_t050_v2, true); + SetQuicReloadableFlag(quic_disable_version_q050, false); + SetQuicReloadableFlag(quic_disable_version_q049, false); + SetQuicReloadableFlag(quic_disable_version_q048, false); + SetQuicReloadableFlag(quic_disable_version_q046, false); + SetQuicReloadableFlag(quic_disable_version_q043, false); + + ParsedQuicVersionVector expected_parsed_versions; + expected_parsed_versions.push_back( + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_28)); + expected_parsed_versions.push_back( + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_27)); + expected_parsed_versions.push_back( + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_25)); + expected_parsed_versions.push_back( + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_50)); + expected_parsed_versions.push_back( + ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_50)); + expected_parsed_versions.push_back( + ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_49)); + expected_parsed_versions.push_back( + ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48)); + expected_parsed_versions.push_back( + ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46)); + expected_parsed_versions.push_back( + ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43)); + + ASSERT_EQ(expected_parsed_versions, + FilterSupportedVersions(AllSupportedVersions())); + ASSERT_EQ(expected_parsed_versions, AllSupportedVersions()); +} + +TEST_F(QuicVersionsTest, FilterSupportedVersionsWithoutFirstVersion) { + static_assert(SupportedVersions().size() == 9u, + "Supported versions out of sync"); + SetQuicReloadableFlag(quic_enable_version_draft_28, false); SetQuicReloadableFlag(quic_enable_version_draft_27, true); SetQuicReloadableFlag(quic_enable_version_draft_25_v3, true); SetQuicReloadableFlag(quic_enable_version_t050_v2, true); @@ -473,44 +520,12 @@ ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(AllSupportedVersions())); - ASSERT_EQ(expected_parsed_versions, AllSupportedVersions()); } -TEST_F(QuicVersionsTest, FilterSupportedVersionsNo99) { - static_assert(SupportedVersions().size() == 8u, +TEST_F(QuicVersionsTest, FilterSupportedVersionsNoEnabledFlags) { + static_assert(SupportedVersions().size() == 9u, "Supported versions out of sync"); - SetQuicReloadableFlag(quic_enable_version_draft_27, false); - SetQuicReloadableFlag(quic_enable_version_draft_25_v3, true); - SetQuicReloadableFlag(quic_enable_version_t050_v2, true); - SetQuicReloadableFlag(quic_disable_version_q050, false); - SetQuicReloadableFlag(quic_disable_version_q049, false); - SetQuicReloadableFlag(quic_disable_version_q048, false); - SetQuicReloadableFlag(quic_disable_version_q046, false); - SetQuicReloadableFlag(quic_disable_version_q043, false); - - ParsedQuicVersionVector expected_parsed_versions; - expected_parsed_versions.push_back( - ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_25)); - expected_parsed_versions.push_back( - ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_50)); - expected_parsed_versions.push_back( - ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_50)); - expected_parsed_versions.push_back( - ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_49)); - expected_parsed_versions.push_back( - ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48)); - expected_parsed_versions.push_back( - ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46)); - expected_parsed_versions.push_back( - ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43)); - - ASSERT_EQ(expected_parsed_versions, - FilterSupportedVersions(AllSupportedVersions())); -} - -TEST_F(QuicVersionsTest, FilterSupportedVersionsNoFlags) { - static_assert(SupportedVersions().size() == 8u, - "Supported versions out of sync"); + SetQuicReloadableFlag(quic_enable_version_draft_28, false); SetQuicReloadableFlag(quic_enable_version_draft_27, false); SetQuicReloadableFlag(quic_enable_version_draft_25_v3, false); SetQuicReloadableFlag(quic_enable_version_t050_v2, false); @@ -575,7 +590,7 @@ // 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() == 8u, "Supported versions out of sync"); EXPECT_EQ(QUIC_VERSION_43, 43); EXPECT_EQ(QUIC_VERSION_46, 46); @@ -584,10 +599,11 @@ EXPECT_EQ(QUIC_VERSION_50, 50); EXPECT_EQ(QUIC_VERSION_IETF_DRAFT_25, 70); EXPECT_EQ(QUIC_VERSION_IETF_DRAFT_27, 71); + EXPECT_EQ(QUIC_VERSION_IETF_DRAFT_28, 72); } TEST_F(QuicVersionsTest, AlpnForVersion) { - static_assert(SupportedVersions().size() == 8u, + static_assert(SupportedVersions().size() == 9u, "Supported versions out of sync"); ParsedQuicVersion parsed_version_q048 = ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48); @@ -601,6 +617,8 @@ ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_25); ParsedQuicVersion parsed_version_draft_27 = ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_27); + ParsedQuicVersion parsed_version_draft_28 = + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_28); EXPECT_EQ("h3-Q048", AlpnForVersion(parsed_version_q048)); EXPECT_EQ("h3-Q049", AlpnForVersion(parsed_version_q049)); @@ -608,11 +626,14 @@ EXPECT_EQ("h3-T050", AlpnForVersion(parsed_version_t050)); EXPECT_EQ("h3-25", AlpnForVersion(parsed_version_draft_25)); EXPECT_EQ("h3-27", AlpnForVersion(parsed_version_draft_27)); + EXPECT_EQ("h3-28", AlpnForVersion(parsed_version_draft_28)); } TEST_F(QuicVersionsTest, QuicEnableVersion) { - static_assert(SupportedVersions().size() == 8u, + static_assert(SupportedVersions().size() == 9u, "Supported versions out of sync"); + ParsedQuicVersion parsed_version_draft_28 = + ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_28); ParsedQuicVersion parsed_version_draft_27 = ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_27); ParsedQuicVersion parsed_version_draft_25 = @@ -624,6 +645,13 @@ { QuicFlagSaver flag_saver; + SetQuicReloadableFlag(quic_enable_version_draft_28, false); + QuicEnableVersion(parsed_version_draft_28); + EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_draft_28)); + } + + { + QuicFlagSaver flag_saver; SetQuicReloadableFlag(quic_enable_version_draft_27, false); QuicEnableVersion(parsed_version_draft_27); EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_draft_27));
diff --git a/quic/test_tools/quic_test_utils.cc b/quic/test_tools/quic_test_utils.cc index aecec0e..44e2d34 100644 --- a/quic/test_tools/quic_test_utils.cc +++ b/quic/test_tools/quic_test_utils.cc
@@ -841,6 +841,7 @@ } void DisableQuicVersionsWithTls() { + SetQuicReloadableFlag(quic_enable_version_draft_28, false); SetQuicReloadableFlag(quic_enable_version_draft_27, false); SetQuicReloadableFlag(quic_enable_version_draft_25_v3, false); SetQuicReloadableFlag(quic_enable_version_t050_v2, false);