Deprecate gfe2_reloadable_flag_quic_use_proof_source_get_cert_chains

PiperOrigin-RevId: 895448563
diff --git a/quiche/common/quiche_feature_flags_list.h b/quiche/common/quiche_feature_flags_list.h
index 559f978..f950acf 100755
--- a/quiche/common/quiche_feature_flags_list.h
+++ b/quiche/common/quiche_feature_flags_list.h
@@ -66,7 +66,6 @@
 QUICHE_FLAG(bool, quiche_reloadable_flag_quic_testonly_default_false, false, false, "A testonly reloadable flag that will always default to false.")
 QUICHE_FLAG(bool, quiche_reloadable_flag_quic_testonly_default_true, true, true, "A testonly reloadable flag that will always default to true.")
 QUICHE_FLAG(bool, quiche_reloadable_flag_quic_update_max_datagram, false, true, "If true, updates the maximum datagram size after flushing pending packets.")
-QUICHE_FLAG(bool, quiche_reloadable_flag_quic_use_proof_source_get_cert_chains, true, true, "When true, quic::TlsServerHandshaker will use ProofSource::GetCertChains() instead of ProofSource::GetCertChain()")
 QUICHE_FLAG(bool, quiche_reloadable_flag_quic_use_received_client_addresses_cache, true, true, "If true, use a LRU cache to record client addresses of packets received on server's original address.")
 QUICHE_FLAG(bool, quiche_restart_flag_quic_dispatcher_close_connection_on_invalid_ack, false, false, "An invalid ack is an ack that the peer sent for a packet that was not sent by the dispatcher. If true, the dispatcher will close the connection if it receives an invalid ack.")
 QUICHE_FLAG(bool, quiche_restart_flag_quic_shed_tls_handshake_config, false, false, "If true, QUIC connections will call SSL_set_shed_handshake_config to drop BoringSSL handshake state after the handshake finishes in order to save memory.")
diff --git a/quiche/quic/core/crypto/proof_source.h b/quiche/quic/core/crypto/proof_source.h
index b66a18b..698ca36 100644
--- a/quiche/quic/core/crypto/proof_source.h
+++ b/quiche/quic/core/crypto/proof_source.h
@@ -344,20 +344,11 @@
   //
   // When called asynchronously(is_sync=false), this method will be responsible
   // to continue the handshake from where it left off.
-  //
-  // Callers that pass a `LocalSSLConfig` in `ssl_config` must use the result of
-  // `DoesOnSelectCertificateDoneExpectChains()` to decide which fields to
-  // populate.
   virtual void OnSelectCertificateDone(bool ok, bool is_sync,
                                        SSLConfig ssl_config,
                                        absl::string_view ticket_encryption_key,
                                        bool cert_matched_sni) = 0;
 
-  // Returns true when `OnSelectCertificateDone()` reads the
-  // `LocalSSLConfig::chains` field. Otherwise, it may read
-  // `LocalSSLConfig::chain`.
-  virtual bool DoesOnSelectCertificateDoneExpectChains() const = 0;
-
   // Called when a ProofSourceHandle::ComputeSignature operation completes.
   virtual void OnComputeSignatureDone(
       bool ok, bool is_sync, std::string signature,
diff --git a/quiche/quic/core/tls_server_handshaker.cc b/quiche/quic/core/tls_server_handshaker.cc
index a0fa3c8..b22d855 100644
--- a/quiche/quic/core/tls_server_handshaker.cc
+++ b/quiche/quic/core/tls_server_handshaker.cc
@@ -115,39 +115,17 @@
     return QUIC_FAILURE;
   }
 
-  if (handshaker_->DoesOnSelectCertificateDoneExpectChains()) {
-    QUIC_RELOADABLE_FLAG_COUNT_N(quic_use_proof_source_get_cert_chains, 1, 2);
-
-    ProofSource::CertChainsResult cert_chains_result =
-        proof_source_->GetCertChains(server_address, client_address, hostname);
-
-    handshaker_->OnSelectCertificateDone(
-        /*ok=*/true, /*is_sync=*/true,
-        ProofSourceHandleCallback::LocalSSLConfig(cert_chains_result.chains,
-                                                  QuicDelayedSSLConfig()),
-        /*ticket_encryption_key=*/absl::string_view(),
-        /*cert_matched_sni=*/cert_chains_result.chains_match_sni);
-    if (!handshaker_->select_cert_status().has_value()) {
-      QUIC_BUG(select_cert_status_valueless_after_sync_select_cert);
-      // Return success to continue the handshake.
-      return QUIC_SUCCESS;
-    }
-    return *handshaker_->select_cert_status();
-  }
-
-  bool cert_matched_sni;
-  quiche::QuicheReferenceCountedPointer<ProofSource::Chain> chain =
-      proof_source_->GetCertChain(server_address, client_address, hostname,
-                                  &cert_matched_sni);
+  ProofSource::CertChainsResult cert_chains_result =
+      proof_source_->GetCertChains(server_address, client_address, hostname);
 
   handshaker_->OnSelectCertificateDone(
       /*ok=*/true, /*is_sync=*/true,
-      ProofSourceHandleCallback::LocalSSLConfig{chain.get(),
-                                                QuicDelayedSSLConfig()},
-      /*ticket_encryption_key=*/absl::string_view(), cert_matched_sni);
+      ProofSourceHandleCallback::LocalSSLConfig(cert_chains_result.chains,
+                                                QuicDelayedSSLConfig()),
+      /*ticket_encryption_key=*/absl::string_view(),
+      /*cert_matched_sni=*/cert_chains_result.chains_match_sni);
   if (!handshaker_->select_cert_status().has_value()) {
-    QUIC_BUG(quic_bug_12423_1)
-        << "select_cert_status() has no value after a synchronous select cert";
+    QUIC_BUG(select_cert_status_valueless_after_sync_select_cert);
     // Return success to continue the handshake.
     return QUIC_SUCCESS;
   }
@@ -243,8 +221,6 @@
       QuicCryptoServerStreamBase(session),
       proof_source_(crypto_config->proof_source()),
       proof_verifier_(crypto_config->proof_verifier()),
-      use_proof_source_get_cert_chains_(
-          GetQuicReloadableFlag(quic_use_proof_source_get_cert_chains)),
       pre_shared_key_(crypto_config->pre_shared_key()),
       crypto_negotiated_params_(new QuicCryptoNegotiatedParameters),
       tls_connection_(crypto_config->ssl_ctx(), this, session->GetSSLConfig()),
@@ -1156,22 +1132,13 @@
   if (ok) {
     if (auto* local_config = std::get_if<LocalSSLConfig>(&ssl_config);
         local_config != nullptr) {
-      if (!use_proof_source_get_cert_chains_ && local_config->chain &&
-          !local_config->chain->certs.empty()) {
-        tls_connection_.AddCertChain(
-            local_config->chain->ToCryptoBuffers().value,
-            local_config->chain->trust_anchor_id);
-        select_cert_status_ = QUIC_SUCCESS;
-      } else if (use_proof_source_get_cert_chains_ &&
-                 !local_config->chains.empty() &&
-                 // Cert selection fails when there are no chains with certs.
-                 absl::c_any_of(local_config->chains,
-                                [](const quiche::QuicheReferenceCountedPointer<
-                                    ProofSource::Chain> absl_nonnull& chain) {
-                                  return !chain->certs.empty();
-                                })) {
-        QUIC_RELOADABLE_FLAG_COUNT_N(quic_use_proof_source_get_cert_chains, 2,
-                                     2);
+      if (!local_config->chains.empty() &&
+          // Cert selection fails when there are no chains with certs.
+          absl::c_any_of(local_config->chains,
+                         [](const quiche::QuicheReferenceCountedPointer<
+                             ProofSource::Chain> absl_nonnull& chain) {
+                           return !chain->certs.empty();
+                         })) {
         for (const quiche::QuicheReferenceCountedPointer<
                  ProofSource::Chain> absl_nonnull& chain :
              local_config->chains) {
diff --git a/quiche/quic/core/tls_server_handshaker.h b/quiche/quic/core/tls_server_handshaker.h
index 7267aaf..aece463 100644
--- a/quiche/quic/core/tls_server_handshaker.h
+++ b/quiche/quic/core/tls_server_handshaker.h
@@ -208,9 +208,6 @@
   void OnSelectCertificateDone(bool ok, bool is_sync, SSLConfig ssl_config,
                                absl::string_view ticket_encryption_key,
                                bool cert_matched_sni) override;
-  bool DoesOnSelectCertificateDoneExpectChains() const override {
-    return use_proof_source_get_cert_chains_;
-  }
 
   void OnComputeSignatureDone(
       bool ok, bool is_sync, std::string signature,
@@ -265,9 +262,7 @@
     // Close the handle. Cancel the pending signature operation, if any.
     void CloseHandle() override;
 
-    // Delegates to `proof_source_->GetCertChains()` when
-    // `handshaker_->use_proof_source_get_cert_chains()` is true. Otherwise,
-    // delegates to `proof_source_->GetCertChain()`.
+    // Delegates to `proof_source_->GetCertChains()`.
     //
     // Returns `QUIC_SUCCESS` or `QUIC_FAILURE`. Never returns `QUIC_PENDING`.
     QuicAsyncStatus SelectCertificate(
@@ -402,10 +397,6 @@
   // True if new ALPS codepoint in the ClientHello.
   bool alps_new_codepoint_received_ = false;
 
-  // The value of the reloadable flag `quic_use_proof_source_get_cert_chains` at
-  // the time of construction.
-  const bool use_proof_source_get_cert_chains_;
-
   // nullopt means select cert hasn't started.
   std::optional<QuicAsyncStatus> select_cert_status_;
 
diff --git a/quiche/quic/core/tls_server_handshaker_test.cc b/quiche/quic/core/tls_server_handshaker_test.cc
index 9e03220..fa33070 100644
--- a/quiche/quic/core/tls_server_handshaker_test.cc
+++ b/quiche/quic/core/tls_server_handshaker_test.cc
@@ -75,15 +75,12 @@
 struct TestParams {
   ParsedQuicVersion version;
   bool disable_resumption;
-  bool enable_get_cert_chains;
 };
 
 ABSL_ATTRIBUTE_UNUSED  // Used by ::testing::PrintToStringParamName().
     std::string PrintToString(const TestParams& p) {
   return absl::StrCat(ParsedQuicVersionToString(p.version), "AndResumption",
-                      (p.disable_resumption ? "Disabled" : "Enabled"),
-                      "AndGetCertChains",
-                      (p.enable_get_cert_chains ? "Enabled" : "Disabled"));
+                      (p.disable_resumption ? "Disabled" : "Enabled"));
 }
 
 // Constructs test permutations.
@@ -91,10 +88,7 @@
   std::vector<TestParams> params;
   for (const auto& version : AllSupportedVersionsWithTls()) {
     for (bool disable_resumption : {false, true}) {
-      for (bool enable_get_cert_chains : {false, true}) {
-        params.push_back(
-            TestParams{version, disable_resumption, enable_get_cert_chains});
-      }
+      params.push_back(TestParams{version, disable_resumption});
     }
   }
   return params;
@@ -165,15 +159,14 @@
       FakeProofSourceHandle::Action compute_signature_action,
       QuicDelayedSSLConfig dealyed_ssl_config = QuicDelayedSSLConfig()) {
     EXPECT_CALL(*this, MaybeCreateProofSourceHandle())
-        .WillOnce(
-            [this, select_cert_action, compute_signature_action,
-             dealyed_ssl_config]() {
-              auto handle = std::make_unique<FakeProofSourceHandle>(
-                  proof_source_, this, select_cert_action,
-                  compute_signature_action, dealyed_ssl_config);
-              fake_proof_source_handle_ = handle.get();
-              return handle;
-            });
+        .WillOnce([this, select_cert_action, compute_signature_action,
+                   dealyed_ssl_config]() {
+          auto handle = std::make_unique<FakeProofSourceHandle>(
+              proof_source_, this, select_cert_action, compute_signature_action,
+              dealyed_ssl_config);
+          fake_proof_source_handle_ = handle.get();
+          return handle;
+        });
   }
 
   FakeProofSourceHandle* fake_proof_source_handle() {
@@ -255,8 +248,6 @@
         supported_versions_({GetParam().version}) {
     SetQuicFlag(quic_disable_server_tls_resumption,
                 GetParam().disable_resumption);
-    SetQuicReloadableFlag(quic_use_proof_source_get_cert_chains,
-                          GetParam().enable_get_cert_chains);
 
     client_crypto_config_ = std::make_unique<QuicCryptoClientConfig>(
         crypto_test_utils::ProofVerifierForTesting(),
@@ -758,41 +749,23 @@
 }
 
 TEST_P(TlsServerHandshakerTest, SelectCertificateCallsGetCertChains) {
-  if (GetQuicReloadableFlag(quic_use_proof_source_get_cert_chains)) {
-    EXPECT_CALL(*proof_source_, GetCertChains(_, _, kServerHostname));
-    // Although the default implementation of `ProofSource::GetCertChains()`
-    // uses `ProofSource::GetCertChain()`, we're using a `FakeProofSource` that
-    // delegates to a `TestProofSource`, which does not have this behavior.
-    EXPECT_CALL(*proof_source_, GetCertChain).Times(0);
-  } else {
-    EXPECT_CALL(*proof_source_, GetCertChains).Times(0);
-    EXPECT_CALL(*proof_source_, GetCertChain(_, _, kServerHostname, _));
-  }
+  EXPECT_CALL(*proof_source_, GetCertChains(_, _, kServerHostname));
+  // Although the default implementation of `ProofSource::GetCertChains()` uses
+  // `ProofSource::GetCertChain()`, we're using a `FakeProofSource` that
+  // delegates to a `TestProofSource`, which does not have this behavior.
+  EXPECT_CALL(*proof_source_, GetCertChain).Times(0);
 
   CompleteCryptoHandshake();
   ExpectHandshakeSuccessful();
 }
 
 TEST_P(TlsServerHandshakerTest, ZeroCertChainsFailsHandshake) {
-  if (GetQuicReloadableFlag(quic_use_proof_source_get_cert_chains)) {
-    EXPECT_CALL(*proof_source_, GetCertChains(_, _, kServerHostname))
-        .WillOnce(Return(ProofSource::CertChainsResult{
-            .chains_match_sni = false,
-            .chains = {},
-        }));
-    EXPECT_CALL(*proof_source_, GetCertChain).Times(0);
-  } else {
-    EXPECT_CALL(*proof_source_, GetCertChain)
-        .WillOnce([&](const QuicSocketAddress&, const QuicSocketAddress&,
-                      const std::string&, bool* cert_matched_sni)
-                      -> quiche::QuicheReferenceCountedPointer<
-                          ProofSource::Chain> {
-          *cert_matched_sni = false;
-          return  // quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
-              nullptr;
-        });
-    EXPECT_CALL(*proof_source_, GetCertChains).Times(0);
-  }
+  EXPECT_CALL(*proof_source_, GetCertChains(_, _, kServerHostname))
+      .WillOnce(Return(ProofSource::CertChainsResult{
+          .chains_match_sni = false,
+          .chains = {},
+      }));
+  EXPECT_CALL(*proof_source_, GetCertChain).Times(0);
 
   AdvanceHandshakeWithFakeClient();
 
@@ -812,41 +785,33 @@
   // this test would incorrectly exercise `FakeProofSourceHandle` instead of
   // `DefaultProofSourceHandle`.
 
-  if (GetQuicReloadableFlag(quic_use_proof_source_get_cert_chains)) {
-    // Return chains that claim not to match SNI. (Whether the certificate in
-    // `quic::test::kTestCertificate` actually matches `kServerHostname` is
-    // irrelevant.)
-    EXPECT_CALL(*proof_source_, GetCertChains(_, _, kServerHostname))
-        .WillOnce(Return(ProofSource::CertChainsResult{
-            .chains_match_sni = false,
-            .chains =
-                std::vector<
-                    quiche::QuicheReferenceCountedPointer<ProofSource::Chain>>{
-                    quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
-                        new ProofSource::Chain(
-                            /*certs=*/{std::string(
-                                quic::test::kTestCertificate)},
-                            /*trust_anchor_id=*/"")),
-                    quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
-                        new ProofSource::Chain(
-                            /*certs=*/{std::string(
-                                quic::test::kTestCertificate)},
-                            /*trust_anchor_id=*/"")),
-                },
-        }));
+  // Return chains that claim not to match SNI. (Whether the certificate in
+  // `quic::test::kTestCertificate` actually matches `kServerHostname` is
+  // irrelevant.)
+  EXPECT_CALL(*proof_source_, GetCertChains(_, _, kServerHostname))
+      .WillOnce(Return(ProofSource::CertChainsResult{
+          .chains_match_sni = false,
+          .chains =
+              std::vector<
+                  quiche::QuicheReferenceCountedPointer<ProofSource::Chain>>{
+                  quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
+                      new ProofSource::Chain(
+                          /*certs=*/{std::string(quic::test::kTestCertificate)},
+                          /*trust_anchor_id=*/"")),
+                  quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
+                      new ProofSource::Chain(
+                          /*certs=*/{std::string(quic::test::kTestCertificate)},
+                          /*trust_anchor_id=*/"")),
+              },
+      }));
 
-    EXPECT_CALL(*proof_source_, GetCertChain).Times(0);
+  EXPECT_CALL(*proof_source_, GetCertChain).Times(0);
 
-    EXPECT_CALL(*server_handshaker_, OnSelectCertificateDone(
-                                         /*ok=*/true, /*is_sync=*/_,
-                                         /*ssl_config=*/_,
-                                         /*ticket_encryption_key=*/_,
-                                         /*cert_matched_sni=*/false));
-  } else {
-    EXPECT_CALL(*proof_source_, GetCertChains).Times(0);
-    EXPECT_CALL(*proof_source_, GetCertChain(_, _, kServerHostname, _));
-    EXPECT_CALL(*server_handshaker_, OnSelectCertificateDone);
-  }
+  EXPECT_CALL(*server_handshaker_, OnSelectCertificateDone(
+                                       /*ok=*/true, /*is_sync=*/_,
+                                       /*ssl_config=*/_,
+                                       /*ticket_encryption_key=*/_,
+                                       /*cert_matched_sni=*/false));
 
   CompleteCryptoHandshake();
 }
@@ -866,54 +831,43 @@
   // this test would incorrectly exercise `FakeProofSourceHandle` instead of
   // `DefaultProofSourceHandle`.
 
-  if (GetQuicReloadableFlag(quic_use_proof_source_get_cert_chains)) {
-    using LocalSSLConfig = ProofSourceHandleCallback::LocalSSLConfig;
+  using LocalSSLConfig = ProofSourceHandleCallback::LocalSSLConfig;
 
-    std::vector<quiche::QuicheReferenceCountedPointer<ProofSource::Chain>>
-        chains = {
-            quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
-                new ProofSource::Chain(
-                    /*certs=*/{std::string(quic::test::kTestCertificate)},
-                    /*trust_anchor_id=*/"\x11\x22\x33")),
-            quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
-                new ProofSource::Chain(
-                    /*certs=*/{std::string(quic::test::kTestCertificate)},
-                    /*trust_anchor_id=*/"")),
-        };
-    EXPECT_CALL(*proof_source_, GetCertChains(_, _, kServerHostname))
-        .WillOnce(Return(ProofSource::CertChainsResult{
-            .chains_match_sni = true,
-            .chains = chains,
-        }));
-    EXPECT_CALL(*proof_source_, GetCertChain).Times(0);
-    // `DefaultProofSourceHandle::SelectCertificate()` should pick only the
-    // chains that claim to match SNI.
-    EXPECT_CALL(*server_handshaker_,
-                OnSelectCertificateDone(
-                    /*ok=*/true, /*is_sync=*/_,
-                    VariantWith<LocalSSLConfig>(
-                        AllOf(Field(&LocalSSLConfig::chain, IsNull()),
-                              Field(&LocalSSLConfig::chains,
-                                    ElementsAre(chains[0], chains[1])),
-                              Field(&LocalSSLConfig::delayed_ssl_config,
-                                    Eq(QuicDelayedSSLConfig())))),
-                    /*ticket_encryption_key=*/_,
-                    /*cert_matched_sni=*/true));
-  } else {
-    EXPECT_CALL(*proof_source_, GetCertChains).Times(0);
-    EXPECT_CALL(*proof_source_, GetCertChain(_, _, kServerHostname, _));
-    EXPECT_CALL(*server_handshaker_, OnSelectCertificateDone(
-                                         /*ok=*/true, /*is_sync=*/_,
-                                         /*ssl_config=*/_,
-                                         /*ticket_encryption_key=*/_,
-                                         /*cert_matched_sni=*/false));
-  }
+  std::vector<quiche::QuicheReferenceCountedPointer<ProofSource::Chain>>
+      chains = {
+          quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
+              new ProofSource::Chain(
+                  /*certs=*/{std::string(quic::test::kTestCertificate)},
+                  /*trust_anchor_id=*/"\x11\x22\x33")),
+          quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
+              new ProofSource::Chain(
+                  /*certs=*/{std::string(quic::test::kTestCertificate)},
+                  /*trust_anchor_id=*/"")),
+      };
+  EXPECT_CALL(*proof_source_, GetCertChains(_, _, kServerHostname))
+      .WillOnce(Return(ProofSource::CertChainsResult{
+          .chains_match_sni = true,
+          .chains = chains,
+      }));
+  EXPECT_CALL(*proof_source_, GetCertChain).Times(0);
+  // `DefaultProofSourceHandle::SelectCertificate()` should pick only the
+  // chains that claim to match SNI.
+  EXPECT_CALL(
+      *server_handshaker_,
+      OnSelectCertificateDone(
+          /*ok=*/true, /*is_sync=*/_,
+          VariantWith<LocalSSLConfig>(AllOf(
+              Field(&LocalSSLConfig::chain, IsNull()),
+              Field(&LocalSSLConfig::chains, ElementsAre(chains[0], chains[1])),
+              Field(&LocalSSLConfig::delayed_ssl_config,
+                    Eq(QuicDelayedSSLConfig())))),
+          /*ticket_encryption_key=*/_,
+          /*cert_matched_sni=*/true));
 
   CompleteCryptoHandshake();
   ExpectHandshakeSuccessful();
 
-  EXPECT_EQ(client_stream()->MatchedTrustAnchorIdForTesting(),
-            GetQuicReloadableFlag(quic_use_proof_source_get_cert_chains));
+  EXPECT_TRUE(client_stream()->MatchedTrustAnchorIdForTesting());
 }
 
 // Test that `DefaultProofSourceHandle::SelectCertificate()` passes through
@@ -934,54 +888,43 @@
   // this test would incorrectly exercise `FakeProofSourceHandle` instead of
   // `DefaultProofSourceHandle`.
 
-  if (GetQuicReloadableFlag(quic_use_proof_source_get_cert_chains)) {
-    using LocalSSLConfig = ProofSourceHandleCallback::LocalSSLConfig;
+  using LocalSSLConfig = ProofSourceHandleCallback::LocalSSLConfig;
 
-    std::vector<quiche::QuicheReferenceCountedPointer<ProofSource::Chain>>
-        chains = {
-            quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
-                new ProofSource::Chain(
-                    /*certs=*/{std::string(quic::test::kTestCertificate)},
-                    /*trust_anchor_id=*/"\x07\x08")),
-            quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
-                new ProofSource::Chain(
-                    /*certs=*/{std::string(quic::test::kTestCertificate)},
-                    /*trust_anchor_id=*/"\x11\x22\x33")),
-        };
-    EXPECT_CALL(*proof_source_, GetCertChains(_, _, kServerHostname))
-        .WillOnce(Return(ProofSource::CertChainsResult{
-            .chains_match_sni = true,
-            .chains = chains,
-        }));
-    EXPECT_CALL(*proof_source_, GetCertChain).Times(0);
-    // `DefaultProofSourceHandle::SelectCertificate()` should pick only the
-    // chains that claim to match SNI.
-    EXPECT_CALL(*server_handshaker_,
-                OnSelectCertificateDone(
-                    /*ok=*/true, /*is_sync=*/_,
-                    VariantWith<LocalSSLConfig>(
-                        AllOf(Field(&LocalSSLConfig::chain, IsNull()),
-                              Field(&LocalSSLConfig::chains,
-                                    ElementsAre(chains[0], chains[1])),
-                              Field(&LocalSSLConfig::delayed_ssl_config,
-                                    Eq(QuicDelayedSSLConfig())))),
-                    /*ticket_encryption_key=*/_,
-                    /*cert_matched_sni=*/true));
-  } else {
-    EXPECT_CALL(*proof_source_, GetCertChains).Times(0);
-    EXPECT_CALL(*proof_source_, GetCertChain(_, _, kServerHostname, _));
-    EXPECT_CALL(*server_handshaker_, OnSelectCertificateDone(
-                                         /*ok=*/true, /*is_sync=*/_,
-                                         /*ssl_config=*/_,
-                                         /*ticket_encryption_key=*/_,
-                                         /*cert_matched_sni=*/false));
-  }
+  std::vector<quiche::QuicheReferenceCountedPointer<ProofSource::Chain>>
+      chains = {
+          quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
+              new ProofSource::Chain(
+                  /*certs=*/{std::string(quic::test::kTestCertificate)},
+                  /*trust_anchor_id=*/"\x07\x08")),
+          quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
+              new ProofSource::Chain(
+                  /*certs=*/{std::string(quic::test::kTestCertificate)},
+                  /*trust_anchor_id=*/"\x11\x22\x33")),
+      };
+  EXPECT_CALL(*proof_source_, GetCertChains(_, _, kServerHostname))
+      .WillOnce(Return(ProofSource::CertChainsResult{
+          .chains_match_sni = true,
+          .chains = chains,
+      }));
+  EXPECT_CALL(*proof_source_, GetCertChain).Times(0);
+  // `DefaultProofSourceHandle::SelectCertificate()` should pick only the
+  // chains that claim to match SNI.
+  EXPECT_CALL(
+      *server_handshaker_,
+      OnSelectCertificateDone(
+          /*ok=*/true, /*is_sync=*/_,
+          VariantWith<LocalSSLConfig>(AllOf(
+              Field(&LocalSSLConfig::chain, IsNull()),
+              Field(&LocalSSLConfig::chains, ElementsAre(chains[0], chains[1])),
+              Field(&LocalSSLConfig::delayed_ssl_config,
+                    Eq(QuicDelayedSSLConfig())))),
+          /*ticket_encryption_key=*/_,
+          /*cert_matched_sni=*/true));
 
   CompleteCryptoHandshake();
   ExpectHandshakeSuccessful();
 
-  EXPECT_EQ(client_stream()->MatchedTrustAnchorIdForTesting(),
-            GetQuicReloadableFlag(quic_use_proof_source_get_cert_chains));
+  EXPECT_TRUE(client_stream()->MatchedTrustAnchorIdForTesting());
 }
 
 // Test that the handshake fails when all chains returned by
@@ -1002,58 +945,44 @@
   // this test would incorrectly exercise `FakeProofSourceHandle` instead of
   // `DefaultProofSourceHandle`.
 
-  if (GetQuicReloadableFlag(quic_use_proof_source_get_cert_chains)) {
-    using LocalSSLConfig = ProofSourceHandleCallback::LocalSSLConfig;
+  using LocalSSLConfig = ProofSourceHandleCallback::LocalSSLConfig;
 
-    std::vector<quiche::QuicheReferenceCountedPointer<ProofSource::Chain>>
-        chains = {
-            quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
-                new ProofSource::Chain(
-                    /*certs=*/{std::string(quic::test::kTestCertificate)},
-                    /*trust_anchor_id=*/"\x07\x08")),
-            quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
-                new ProofSource::Chain(
-                    /*certs=*/{std::string(quic::test::kTestCertificate)},
-                    /*trust_anchor_id=*/"\x42")),
-        };
-    EXPECT_CALL(*proof_source_, GetCertChains(_, _, kServerHostname))
-        .WillOnce(Return(ProofSource::CertChainsResult{
-            .chains_match_sni = true,
-            .chains = chains,
-        }));
-    EXPECT_CALL(*proof_source_, GetCertChain).Times(0);
-    // `DefaultProofSourceHandle::SelectCertificate()` should pick only the
-    // chains that claim to match SNI.
-    EXPECT_CALL(*server_handshaker_,
-                OnSelectCertificateDone(
-                    /*ok=*/true, /*is_sync=*/_,
-                    VariantWith<LocalSSLConfig>(
-                        AllOf(Field(&LocalSSLConfig::chain, IsNull()),
-                              Field(&LocalSSLConfig::chains,
-                                    ElementsAre(chains[0], chains[1])),
-                              Field(&LocalSSLConfig::delayed_ssl_config,
-                                    Eq(QuicDelayedSSLConfig())))),
-                    /*ticket_encryption_key=*/_,
-                    /*cert_matched_sni=*/true));
-    AdvanceHandshakeWithFakeClient();
+  std::vector<quiche::QuicheReferenceCountedPointer<ProofSource::Chain>>
+      chains = {
+          quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
+              new ProofSource::Chain(
+                  /*certs=*/{std::string(quic::test::kTestCertificate)},
+                  /*trust_anchor_id=*/"\x07\x08")),
+          quiche::QuicheReferenceCountedPointer<ProofSource::Chain>(
+              new ProofSource::Chain(
+                  /*certs=*/{std::string(quic::test::kTestCertificate)},
+                  /*trust_anchor_id=*/"\x42")),
+      };
+  EXPECT_CALL(*proof_source_, GetCertChains(_, _, kServerHostname))
+      .WillOnce(Return(ProofSource::CertChainsResult{
+          .chains_match_sni = true,
+          .chains = chains,
+      }));
+  EXPECT_CALL(*proof_source_, GetCertChain).Times(0);
+  // `DefaultProofSourceHandle::SelectCertificate()` should pick only the
+  // chains that claim to match SNI.
+  EXPECT_CALL(
+      *server_handshaker_,
+      OnSelectCertificateDone(
+          /*ok=*/true, /*is_sync=*/_,
+          VariantWith<LocalSSLConfig>(AllOf(
+              Field(&LocalSSLConfig::chain, IsNull()),
+              Field(&LocalSSLConfig::chains, ElementsAre(chains[0], chains[1])),
+              Field(&LocalSSLConfig::delayed_ssl_config,
+                    Eq(QuicDelayedSSLConfig())))),
+          /*ticket_encryption_key=*/_,
+          /*cert_matched_sni=*/true));
+  AdvanceHandshakeWithFakeClient();
 
-    EXPECT_FALSE(client_stream()->one_rtt_keys_available());
-    EXPECT_FALSE(client_stream()->encryption_established());
-    EXPECT_FALSE(server_stream()->one_rtt_keys_available());
-    EXPECT_FALSE(server_stream()->encryption_established());
-
-  } else {
-    EXPECT_CALL(*proof_source_, GetCertChains).Times(0);
-    EXPECT_CALL(*proof_source_, GetCertChain(_, _, kServerHostname, _));
-    EXPECT_CALL(*server_handshaker_, OnSelectCertificateDone(
-                                         /*ok=*/true, /*is_sync=*/_,
-                                         /*ssl_config=*/_,
-                                         /*ticket_encryption_key=*/_,
-                                         /*cert_matched_sni=*/false));
-
-    CompleteCryptoHandshake();
-    ExpectHandshakeSuccessful();
-  }
+  EXPECT_FALSE(client_stream()->one_rtt_keys_available());
+  EXPECT_FALSE(client_stream()->encryption_established());
+  EXPECT_FALSE(server_stream()->one_rtt_keys_available());
+  EXPECT_FALSE(server_stream()->encryption_established());
 
   EXPECT_FALSE(client_stream()->MatchedTrustAnchorIdForTesting());
 }
@@ -1065,8 +994,10 @@
   // Send a zero-length ClientHello from client to server.
   char bogus_handshake_message[] = {
       // Handshake struct (RFC 8446 appendix B.3)
-      1,        // HandshakeType client_hello
-      0, 0, 0,  // uint24 length
+      1,  // HandshakeType client_hello
+      0,
+      0,
+      0,  // uint24 length
   };
 
   // Install a packet flusher such that the packets generated by
diff --git a/quiche/quic/test_tools/fake_proof_source_handle.cc b/quiche/quic/test_tools/fake_proof_source_handle.cc
index fc33158..56cee5c 100644
--- a/quiche/quic/test_tools/fake_proof_source_handle.cc
+++ b/quiche/quic/test_tools/fake_proof_source_handle.cc
@@ -121,31 +121,16 @@
   }
 
   QUICHE_DCHECK(select_cert_action_ == Action::DELEGATE_SYNC);
-  if (GetQuicReloadableFlag(quic_use_proof_source_get_cert_chains)) {
-    ProofSource::CertChainsResult chains_result =
-        delegate_->GetCertChains(server_address, client_address, hostname);
-    const bool ok = !chains_result.chains.empty();
-    callback_->OnSelectCertificateDone(
-        ok, /*is_sync=*/true,
-        ProofSourceHandleCallback::LocalSSLConfig(
-            absl::MakeConstSpan(chains_result.chains), delayed_ssl_config_),
-        /*ticket_encryption_key=*/absl::string_view(),
-        /*cert_matched_sni=*/chains_result.chains_match_sni);
-    return ok ? QUIC_SUCCESS : QUIC_FAILURE;
-  }
 
-  bool cert_matched_sni;
-  quiche::QuicheReferenceCountedPointer<ProofSource::Chain> chain =
-      delegate_->GetCertChain(server_address, client_address, hostname,
-                              &cert_matched_sni);
-
-  bool ok = chain && !chain->certs.empty();
+  ProofSource::CertChainsResult chains_result =
+      delegate_->GetCertChains(server_address, client_address, hostname);
+  const bool ok = !chains_result.chains.empty();
   callback_->OnSelectCertificateDone(
       ok, /*is_sync=*/true,
-      ProofSourceHandleCallback::LocalSSLConfig{chain.get(),
-                                                delayed_ssl_config_},
+      ProofSourceHandleCallback::LocalSSLConfig(
+          absl::MakeConstSpan(chains_result.chains), delayed_ssl_config_),
       /*ticket_encryption_key=*/absl::string_view(),
-      /*cert_matched_sni=*/cert_matched_sni);
+      /*cert_matched_sni=*/chains_result.chains_match_sni);
   return ok ? QUIC_SUCCESS : QUIC_FAILURE;
 }
 
@@ -222,37 +207,20 @@
     callback_->OnSelectCertificateDone(
         /*ok=*/false,
         /*is_sync=*/false,
-        callback_->DoesOnSelectCertificateDoneExpectChains()
-            ? ProofSourceHandleCallback::LocalSSLConfig(
-                  /*chains=*/{}, delayed_ssl_config_)
-            : ProofSourceHandleCallback::LocalSSLConfig(/*chain=*/nullptr,
-                                                        delayed_ssl_config_),
+        ProofSourceHandleCallback::LocalSSLConfig(
+            /*chains=*/{}, delayed_ssl_config_),
         /*ticket_encryption_key=*/absl::string_view(),
         /*cert_matched_sni=*/false);
   } else if (action_ == Action::DELEGATE_ASYNC) {
-    if (GetQuicReloadableFlag(quic_use_proof_source_get_cert_chains)) {
-      ProofSource::CertChainsResult chains_result = delegate_->GetCertChains(
-          args_.server_address, args_.client_address, args_.hostname);
-      const bool ok = !chains_result.chains.empty();
-      callback_->OnSelectCertificateDone(
-          ok, /*is_sync=*/false,
-          ProofSourceHandleCallback::LocalSSLConfig(
-              absl::MakeConstSpan(chains_result.chains), delayed_ssl_config_),
-          /*ticket_encryption_key=*/absl::string_view(),
-          /*cert_matched_sni=*/chains_result.chains_match_sni);
-    } else {
-      bool cert_matched_sni;
-      quiche::QuicheReferenceCountedPointer<ProofSource::Chain> chain =
-          delegate_->GetCertChain(args_.server_address, args_.client_address,
-                                  args_.hostname, &cert_matched_sni);
-      bool ok = chain && !chain->certs.empty();
-      callback_->OnSelectCertificateDone(
-          ok, /*is_sync=*/false,
-          ProofSourceHandleCallback::LocalSSLConfig{chain.get(),
-                                                    delayed_ssl_config_},
-          /*ticket_encryption_key=*/absl::string_view(),
-          /*cert_matched_sni=*/cert_matched_sni);
-    }
+    ProofSource::CertChainsResult chains_result = delegate_->GetCertChains(
+        args_.server_address, args_.client_address, args_.hostname);
+    const bool ok = !chains_result.chains.empty();
+    callback_->OnSelectCertificateDone(
+        ok, /*is_sync=*/false,
+        ProofSourceHandleCallback::LocalSSLConfig(
+            absl::MakeConstSpan(chains_result.chains), delayed_ssl_config_),
+        /*ticket_encryption_key=*/absl::string_view(),
+        /*cert_matched_sni=*/chains_result.chains_match_sni);
   } else {
     QUIC_BUG(quic_bug_10139_1)
         << "Unexpected action: " << static_cast<int>(action_);