Add knobs that enable QBONE to use IETF QUIC. Particularly, 1) --qbone_server_support_h3_loas defined in gfe_quic_dispatcher.cc enables QBONE server to support both gQUIC & IETF QUIC. 2) --qbone_client_use_h3_loas defined in bonnet_server.cc makes QBONE client to use IETF QUIC exclusively. These two flags are set up assuming: 1) --qbone_server_support_h3_loas can be enabled for all servers. 2) --qbone_client_support_h3_loas can then be enabled gradually for all clients. And the two flags should not be enabled until the following TODOs are done: 1) Add a special ProofSource that provides fake certificate. 2) Add code and test that handles messages/streams before LOAS2 authentication is done on the client side. 3) Set the idle timeout correctly in between TLS handshake done and LOAS2 handshake done. PiperOrigin-RevId: 415266155
diff --git a/quic/core/quic_crypto_stream.h b/quic/core/quic_crypto_stream.h index 86b6913..08cb189 100644 --- a/quic/core/quic_crypto_stream.h +++ b/quic/core/quic_crypto_stream.h
@@ -245,6 +245,10 @@ virtual void OnDataAvailableInSequencer(QuicStreamSequencer* sequencer, EncryptionLevel level); + QuicStreamSequencer* GetStreamSequencerForLevel(EncryptionLevel level) { + return &substreams_[level].sequencer; + } + private: // Data sent and received in CRYPTO frames is sent at multiple encryption // levels. Some of the state for the single logical crypto stream is split
diff --git a/quic/core/quic_error_codes.cc b/quic/core/quic_error_codes.cc index 74922c3..c7da0ae 100644 --- a/quic/core/quic_error_codes.cc +++ b/quic/core/quic_error_codes.cc
@@ -279,6 +279,7 @@ RETURN_STRING_LITERAL(QUIC_TLS_UNEXPECTED_KEYING_MATERIAL_EXPORT_LABEL); RETURN_STRING_LITERAL(QUIC_TLS_KEYING_MATERIAL_EXPORTS_MISMATCH); RETURN_STRING_LITERAL(QUIC_TLS_KEYING_MATERIAL_EXPORT_NOT_AVAILABLE); + RETURN_STRING_LITERAL(QUIC_UNEXPECTED_DATA_BEFORE_ENCRYPTION_ESTABLISHED); RETURN_STRING_LITERAL(QUIC_LAST_ERROR); // Intentionally have no default case, so we'll break the build @@ -784,6 +785,8 @@ return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)}; case QUIC_TLS_KEYING_MATERIAL_EXPORT_NOT_AVAILABLE: return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)}; + case QUIC_UNEXPECTED_DATA_BEFORE_ENCRYPTION_ESTABLISHED: + return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)}; case QUIC_LAST_ERROR: return {false, static_cast<uint64_t>(QUIC_LAST_ERROR)}; }
diff --git a/quic/core/quic_error_codes.h b/quic/core/quic_error_codes.h index 218b12f..0ecef01 100644 --- a/quic/core/quic_error_codes.h +++ b/quic/core/quic_error_codes.h
@@ -608,9 +608,10 @@ QUIC_TLS_UNEXPECTED_KEYING_MATERIAL_EXPORT_LABEL = 208, QUIC_TLS_KEYING_MATERIAL_EXPORTS_MISMATCH = 209, QUIC_TLS_KEYING_MATERIAL_EXPORT_NOT_AVAILABLE = 210, + QUIC_UNEXPECTED_DATA_BEFORE_ENCRYPTION_ESTABLISHED = 211, // No error. Used as bound while iterating. - QUIC_LAST_ERROR = 211, + QUIC_LAST_ERROR = 212, }; // QuicErrorCodes is encoded as four octets on-the-wire when doing Google QUIC, // or a varint62 when doing IETF QUIC. Ensure that its value does not exceed
diff --git a/quic/qbone/qbone_server_session.h b/quic/qbone/qbone_server_session.h index f5af8b4..f398f06 100644 --- a/quic/qbone/qbone_server_session.h +++ b/quic/qbone/qbone_server_session.h
@@ -82,9 +82,10 @@ // The packet processor. QbonePacketProcessor processor_; - private: // Config for QUIC crypto server stream, used by the server. const QuicCryptoServerConfig* quic_crypto_server_config_; + + private: // Used by QUIC crypto server stream to track most recently compressed certs. QuicCompressedCertsCache* compressed_certs_cache_; // This helper is needed when create QuicCryptoServerStream.