Add support for accepting 0-RTT in TlsServerHandshaker This adds support at the crypto handshake layer for supporting 0-RTT TLS handshakes on the server. Part of this support includes receiving a signal from the application layer, via a new method QuicCryptoStream::SetServerApplicationStateForResumption. This method replaces the previously client-only QuicCryptoClientStream::OnApplicationState. Introduce quic 0-rtt tls support, protected by quic_enable_zero_rtt_for_tls PiperOrigin-RevId: 315331343 Change-Id: Ife83cf526be38bd4f5c8a3de0e6cd4c40be6f7ae
diff --git a/quic/core/tls_server_handshaker.cc b/quic/core/tls_server_handshaker.cc index 60aa64f..057e86d 100644 --- a/quic/core/tls_server_handshaker.cc +++ b/quic/core/tls_server_handshaker.cc
@@ -15,6 +15,7 @@ #include "net/third_party/quiche/src/quic/platform/api/quic_logging.h" #include "net/third_party/quiche/src/common/platform/api/quiche_arraysize.h" #include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_text_utils.h" namespace quic { @@ -95,15 +96,6 @@ // Configure the SSL to be a server. SSL_set_accept_state(ssl()); - - if (GetQuicReloadableFlag(quic_enable_zero_rtt_for_tls)) { - // TODO(b/152551499): Properly set early data context. This change is to - // temporarily unblock QuicSpdyClientSessionTest.IetfZeroRttSetup which - // assumes that the server will sent an early data capable ticket, and then - // accept early data on resumption. - uint8_t context[] = {0}; - SSL_set_quic_early_data_context(ssl(), context, QUICHE_ARRAYSIZE(context)); - } } TlsServerHandshaker::~TlsServerHandshaker() { @@ -133,8 +125,7 @@ } bool TlsServerHandshaker::IsZeroRtt() const { - // TODO(nharper): Support 0-RTT with TLS 1.3 in QUIC. - return false; + return SSL_early_data_accepted(ssl()); } bool TlsServerHandshaker::IsResumption() const { @@ -207,6 +198,11 @@ return HANDSHAKE_START; } +void TlsServerHandshaker::SetServerApplicationStateForResumption( + std::unique_ptr<ApplicationState> state) { + application_state_ = std::move(state); +} + size_t TlsServerHandshaker::BufferSizeLimitForLevel( EncryptionLevel level) const { return TlsHandshaker::BufferSizeLimitForLevel(level); @@ -329,6 +325,17 @@ server_params_bytes.size()) != 1) { return false; } + if (application_state_) { + std::vector<uint8_t> early_data_context; + if (!SerializeTransportParametersForTicket( + server_params, *application_state_, &early_data_context)) { + QUIC_BUG << "Failed to serialize Transport Parameters for ticket."; + return false; + } + SSL_set_quic_early_data_context(ssl(), early_data_context.data(), + early_data_context.size()); + application_state_.reset(nullptr); + } return true; }