gfe-relnote: Stop using SetDefaultEncryptionLevel in TLS handshake. Instead, use OnOneRttKeysAvailable. Refactor only, no functional change expected, not protected.
PiperOrigin-RevId: 301928754
Change-Id: I8751cb610f1454fc2d61646c50a1fbed8dae926c
diff --git a/quic/core/handshaker_delegate_interface.h b/quic/core/handshaker_delegate_interface.h
index 03b3af9..0e8e045 100644
--- a/quic/core/handshaker_delegate_interface.h
+++ b/quic/core/handshaker_delegate_interface.h
@@ -30,9 +30,14 @@
EncryptionLevel level,
std::unique_ptr<QuicEncrypter> encrypter) = 0;
- // Called to set default encryption level to |level|.
+ // Called to set default encryption level to |level|. Only used in QUIC
+ // crypto.
virtual void SetDefaultEncryptionLevel(EncryptionLevel level) = 0;
+ // Called when both 1-RTT read and write keys are available. Only used in TLS
+ // handshake.
+ virtual void OnOneRttKeysAvailable() = 0;
+
// Called to discard old decryption keys to stop processing packets of
// encryption |level|.
virtual void DiscardOldDecryptionKey(EncryptionLevel level) = 0;
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc
index 8467797..d545b05 100644
--- a/quic/core/http/quic_spdy_session.cc
+++ b/quic/core/http/quic_spdy_session.cc
@@ -764,6 +764,11 @@
SendInitialData();
}
+void QuicSpdySession::OnOneRttKeysAvailable() {
+ QuicSession::OnOneRttKeysAvailable();
+ SendInitialData();
+}
+
// True if there are open HTTP requests.
bool QuicSpdySession::ShouldKeepConnectionAlive() const {
if (!VersionUsesHttp3(transport_version())) {
diff --git a/quic/core/http/quic_spdy_session.h b/quic/core/http/quic_spdy_session.h
index e7fa037..d1136ff 100644
--- a/quic/core/http/quic_spdy_session.h
+++ b/quic/core/http/quic_spdy_session.h
@@ -323,6 +323,7 @@
QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener);
void SetDefaultEncryptionLevel(quic::EncryptionLevel level) override;
+ void OnOneRttKeysAvailable() override;
// Optional, enables instrumentation related to go/quic-hpack.
void SetHpackEncoderDebugVisitor(
diff --git a/quic/core/http/quic_spdy_session_test.cc b/quic/core/http/quic_spdy_session_test.cc
index b14db0b..a7c36d7 100644
--- a/quic/core/http/quic_spdy_session_test.cc
+++ b/quic/core/http/quic_spdy_session_test.cc
@@ -105,7 +105,12 @@
}
EXPECT_THAT(error, IsQuicNoError());
session()->OnConfigNegotiated();
- session()->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
+ if (session()->connection()->version().handshake_protocol ==
+ PROTOCOL_TLS1_3) {
+ session()->OnOneRttKeysAvailable();
+ } else {
+ session()->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
+ }
session()->DiscardOldEncryptionKey(ENCRYPTION_INITIAL);
}
diff --git a/quic/core/http/quic_spdy_stream_test.cc b/quic/core/http/quic_spdy_stream_test.cc
index 707964c..eef43cd 100644
--- a/quic/core/http/quic_spdy_stream_test.cc
+++ b/quic/core/http/quic_spdy_stream_test.cc
@@ -89,7 +89,12 @@
}
EXPECT_THAT(error, IsQuicNoError());
session()->OnConfigNegotiated();
- session()->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
+ if (session()->connection()->version().handshake_protocol ==
+ PROTOCOL_TLS1_3) {
+ session()->OnOneRttKeysAvailable();
+ } else {
+ session()->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
+ }
session()->DiscardOldEncryptionKey(ENCRYPTION_INITIAL);
}
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index 32e01cb..468bdec 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -1334,6 +1334,7 @@
}
void QuicSession::SetDefaultEncryptionLevel(EncryptionLevel level) {
+ DCHECK_EQ(PROTOCOL_QUIC_CRYPTO, connection_->version().handshake_protocol);
QUIC_DVLOG(1) << ENDPOINT << "Set default encryption level to "
<< EncryptionLevelToString(level);
connection()->SetDefaultEncryptionLevel(level);
@@ -1353,19 +1354,8 @@
case ENCRYPTION_HANDSHAKE:
break;
case ENCRYPTION_FORWARD_SECURE:
- if (connection_->version().handshake_protocol == PROTOCOL_TLS1_3) {
- QUIC_BUG_IF(!GetCryptoStream()->crypto_negotiated_params().cipher_suite)
- << ENDPOINT
- << "Handshake confirmed without cipher suite negotiation.";
- }
QUIC_BUG_IF(!config_.negotiated())
<< ENDPOINT << "Handshake confirmed without parameter negotiation.";
- if (connection()->version().HasHandshakeDone() &&
- perspective_ == Perspective::IS_SERVER) {
- // Server sends HANDSHAKE_DONE to signal confirmation of the handshake
- // to the client.
- control_frame_manager_.WriteOrBufferHandshakeDone();
- }
if (!GetQuicReloadableFlag(quic_bw_sampler_app_limited_starting_value)) {
connection_->ResetHasNonAppLimitedSampleAfterHandshakeCompletion();
}
@@ -1376,6 +1366,27 @@
}
}
+void QuicSession::OnOneRttKeysAvailable() {
+ DCHECK_EQ(PROTOCOL_TLS1_3, connection_->version().handshake_protocol);
+ QUIC_DVLOG(1) << ENDPOINT << "Set default encryption level to "
+ << EncryptionLevelToString(ENCRYPTION_FORWARD_SECURE);
+ connection()->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
+
+ QUIC_BUG_IF(!GetCryptoStream()->crypto_negotiated_params().cipher_suite)
+ << ENDPOINT << "Handshake completes without cipher suite negotiation.";
+ QUIC_BUG_IF(!config_.negotiated())
+ << ENDPOINT << "Handshake completes without parameter negotiation.";
+ if (connection()->version().HasHandshakeDone() &&
+ perspective_ == Perspective::IS_SERVER) {
+ // Server sends HANDSHAKE_DONE to signal confirmation of the handshake
+ // to the client.
+ control_frame_manager_.WriteOrBufferHandshakeDone();
+ }
+ if (!GetQuicReloadableFlag(quic_bw_sampler_app_limited_starting_value)) {
+ connection_->ResetHasNonAppLimitedSampleAfterHandshakeCompletion();
+ }
+}
+
void QuicSession::DiscardOldDecryptionKey(EncryptionLevel level) {
if (!connection()->version().KnowsWhichDecrypterToUse()) {
return;
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h
index 37c00f7..06dfd0a 100644
--- a/quic/core/quic_session.h
+++ b/quic/core/quic_session.h
@@ -242,6 +242,7 @@
EncryptionLevel level,
std::unique_ptr<QuicEncrypter> encrypter) override;
void SetDefaultEncryptionLevel(EncryptionLevel level) override;
+ void OnOneRttKeysAvailable() override;
void DiscardOldDecryptionKey(EncryptionLevel level) override;
void DiscardOldEncryptionKey(EncryptionLevel level) override;
void NeuterUnencryptedData() override;
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc
index e3289e9..25237c4 100644
--- a/quic/core/quic_session_test.cc
+++ b/quic/core/quic_session_test.cc
@@ -91,7 +91,12 @@
}
EXPECT_THAT(error, IsQuicNoError());
session()->OnConfigNegotiated();
- session()->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
+ if (session()->connection()->version().handshake_protocol ==
+ PROTOCOL_TLS1_3) {
+ session()->OnOneRttKeysAvailable();
+ } else {
+ session()->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
+ }
session()->DiscardOldEncryptionKey(ENCRYPTION_INITIAL);
}
diff --git a/quic/core/tls_client_handshaker.cc b/quic/core/tls_client_handshaker.cc
index 4600986..3782ab5 100644
--- a/quic/core/tls_client_handshaker.cc
+++ b/quic/core/tls_client_handshaker.cc
@@ -400,7 +400,7 @@
crypto_negotiated_params_->peer_signature_algorithm =
SSL_get_peer_signature_algorithm(ssl());
- handshaker_delegate()->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
+ handshaker_delegate()->OnOneRttKeysAvailable();
}
enum ssl_verify_result_t TlsClientHandshaker::VerifyCert(uint8_t* out_alert) {
diff --git a/quic/core/tls_server_handshaker.cc b/quic/core/tls_server_handshaker.cc
index 346e872..715a200 100644
--- a/quic/core/tls_server_handshaker.cc
+++ b/quic/core/tls_server_handshaker.cc
@@ -310,7 +310,7 @@
app_data_read_secret_.clear();
}
- handshaker_delegate()->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
+ handshaker_delegate()->OnOneRttKeysAvailable();
handshaker_delegate()->DiscardOldEncryptionKey(ENCRYPTION_HANDSHAKE);
handshaker_delegate()->DiscardOldDecryptionKey(ENCRYPTION_HANDSHAKE);
}
diff --git a/quic/quartc/quartc_session.cc b/quic/quartc/quartc_session.cc
index 6715ee2..a93f410 100644
--- a/quic/quartc/quartc_session.cc
+++ b/quic/quartc/quartc_session.cc
@@ -185,6 +185,18 @@
}
}
+void QuartcSession::OnOneRttKeysAvailable() {
+ QuicSession::OnOneRttKeysAvailable();
+ // On the server, handshake confirmed is the first time when you can start
+ // writing packets.
+ DCHECK(IsEncryptionEstablished());
+ DCHECK(OneRttKeysAvailable());
+
+ DCHECK(session_delegate_);
+ session_delegate_->OnConnectionWritable();
+ session_delegate_->OnCryptoHandshakeComplete();
+}
+
void QuartcSession::CancelStream(QuicStreamId stream_id) {
ResetStream(stream_id, QuicRstStreamErrorCode::QUIC_STREAM_CANCELLED);
}
diff --git a/quic/quartc/quartc_session.h b/quic/quartc/quartc_session.h
index 7d0c773..db988a0 100644
--- a/quic/quartc/quartc_session.h
+++ b/quic/quartc/quartc_session.h
@@ -75,6 +75,7 @@
}
void SetDefaultEncryptionLevel(EncryptionLevel level) override;
+ void OnOneRttKeysAvailable() override;
// QuicConnectionVisitorInterface overrides.
void OnCongestionWindowChange(QuicTime now) override;
diff --git a/quic/quic_transport/quic_transport_client_session.cc b/quic/quic_transport/quic_transport_client_session.cc
index ae15371..a35d084 100644
--- a/quic/quic_transport/quic_transport_client_session.cc
+++ b/quic/quic_transport/quic_transport_client_session.cc
@@ -104,6 +104,11 @@
}
}
+void QuicTransportClientSession::OnOneRttKeysAvailable() {
+ QuicSession::OnOneRttKeysAvailable();
+ SendClientIndication();
+}
+
QuicTransportStream*
QuicTransportClientSession::AcceptIncomingBidirectionalStream() {
if (incoming_bidirectional_streams_.empty()) {
diff --git a/quic/quic_transport/quic_transport_client_session.h b/quic/quic_transport/quic_transport_client_session.h
index e4cc15d..56b29e4 100644
--- a/quic/quic_transport/quic_transport_client_session.h
+++ b/quic/quic_transport/quic_transport_client_session.h
@@ -95,6 +95,7 @@
}
void SetDefaultEncryptionLevel(EncryptionLevel level) override;
+ void OnOneRttKeysAvailable() override;
void OnMessageReceived(quiche::QuicheStringPiece message) override;
// Return the earliest incoming stream that has been received by the session