Enable ALPS in QUIC TLS client handshake and parse ACCEPT_CH frame. Protected by FLAGS_quic_reloadable_flag_quic_enable_alps_client. PiperOrigin-RevId: 353406160 Change-Id: I0de0c5b43c5aa03586a02cc99684a68ec4b93ce2
diff --git a/quic/core/quic_flags_list.h b/quic/core/quic_flags_list.h index 73ae73e..55e3c76 100644 --- a/quic/core/quic_flags_list.h +++ b/quic/core/quic_flags_list.h
@@ -38,6 +38,7 @@ QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_do_not_clip_received_error_code, true) QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_donot_reset_ideal_next_packet_send_time, false) QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_dont_defer_sending, false) +QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_enable_alps_client, true) QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_enable_alps_server, false) QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_enable_mtu_discovery_at_server, false) QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_enable_server_on_wire_ping, true)
diff --git a/quic/core/tls_client_handshaker.cc b/quic/core/tls_client_handshaker.cc index 862430b..e82e94d 100644 --- a/quic/core/tls_client_handshaker.cc +++ b/quic/core/tls_client_handshaker.cc
@@ -7,6 +7,7 @@ #include <cstring> #include <string> +#include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "third_party/boringssl/src/include/openssl/ssl.h" #include "quic/core/crypto/quic_crypto_client_config.h" @@ -167,6 +168,19 @@ alpn_writer.data(), alpn_writer.length())); return false; } + + // Enable ALPS. + if (enable_alps_) { + for (const std::string& alpn_string : alpns) { + if (SSL_add_application_settings( + ssl(), reinterpret_cast<const uint8_t*>(alpn_string.data()), + alpn_string.size(), nullptr, /* settings_len = */ 0) != 1) { + QUIC_BUG << "Failed to enable ALPS."; + return false; + } + } + } + QUIC_DLOG(INFO) << "Client using ALPN: '" << alpns[0] << "'"; return true; } @@ -475,6 +489,23 @@ session()->OnAlpnSelected(received_alpn_string); QUIC_DLOG(INFO) << "Client: server selected ALPN: '" << received_alpn_string << "'"; + + // Parse ALPS extension. + if (enable_alps_) { + const uint8_t* alps_data; + size_t alps_length; + SSL_get0_peer_application_settings(ssl(), &alps_data, &alps_length); + if (alps_length > 0) { + auto error = session()->OnAlpsData(alps_data, alps_length); + if (error) { + CloseConnection( + QUIC_HANDSHAKE_FAILED, + absl::StrCat("Error processing ALPS data: ", error.value())); + return; + } + } + } + state_ = HANDSHAKE_COMPLETE; handshaker_delegate()->OnTlsHandshakeComplete(); }
diff --git a/quic/core/tls_client_handshaker.h b/quic/core/tls_client_handshaker.h index e22ade7..71714e2 100644 --- a/quic/core/tls_client_handshaker.h +++ b/quic/core/tls_client_handshaker.h
@@ -164,6 +164,9 @@ std::unique_ptr<TransportParameters> received_transport_params_ = nullptr; std::unique_ptr<ApplicationState> received_application_state_ = nullptr; + + // Latched value of reloadable flag quic_enable_alps_client. + const bool enable_alps_ = GetQuicReloadableFlag(quic_enable_alps_client); }; } // namespace quic