Use QUIC-internal subject parser instead of the platform one.

Protected by FLAGS_quic_reloadable_flag_quic_extract_x509_subject_using_certificate_view.

PiperOrigin-RevId: 340319671
Change-Id: Ifac913a54c7fd002ac0e156d33463a92f1fafd9a
diff --git a/quic/core/crypto/quic_crypto_server_config.cc b/quic/core/crypto/quic_crypto_server_config.cc
index 5169f9b..b929dcc 100644
--- a/quic/core/crypto/quic_crypto_server_config.cc
+++ b/quic/core/crypto/quic_crypto_server_config.cc
@@ -13,11 +13,13 @@
 #include "absl/base/attributes.h"
 #include "absl/strings/escaping.h"
 #include "absl/strings/string_view.h"
+#include "absl/types/optional.h"
 #include "third_party/boringssl/src/include/openssl/sha.h"
 #include "third_party/boringssl/src/include/openssl/ssl.h"
 #include "net/third_party/quiche/src/quic/core/crypto/aes_128_gcm_12_decrypter.h"
 #include "net/third_party/quiche/src/quic/core/crypto/aes_128_gcm_12_encrypter.h"
 #include "net/third_party/quiche/src/quic/core/crypto/cert_compressor.h"
+#include "net/third_party/quiche/src/quic/core/crypto/certificate_view.h"
 #include "net/third_party/quiche/src/quic/core/crypto/chacha20_poly1305_encrypter.h"
 #include "net/third_party/quiche/src/quic/core/crypto/channel_id.h"
 #include "net/third_party/quiche/src/quic/core/crypto/crypto_framer.h"
@@ -1509,9 +1511,29 @@
         // This is for debugging b/28342827.
         const std::vector<std::string>& certs =
             context.signed_config()->chain->certs;
-        absl::string_view ca_subject;
+        std::string ca_subject;
         if (!certs.empty()) {
-          QuicCertUtils::ExtractSubjectNameFromDERCert(certs[0], &ca_subject);
+          if (GetQuicReloadableFlag(
+                  quic_extract_x509_subject_using_certificate_view)) {
+            QUIC_RELOADABLE_FLAG_COUNT_N(
+                quic_extract_x509_subject_using_certificate_view, 1, 2);
+            std::unique_ptr<CertificateView> view =
+                CertificateView::ParseSingleCertificate(certs[0]);
+            if (view != nullptr) {
+              absl::optional<std::string> maybe_ca_subject =
+                  view->GetHumanReadableSubject();
+              if (maybe_ca_subject.has_value()) {
+                QUIC_RELOADABLE_FLAG_COUNT_N(
+                    quic_extract_x509_subject_using_certificate_view, 2, 2);
+                ca_subject = *maybe_ca_subject;
+              }
+            }
+          } else {
+            absl::string_view ca_subject_view;
+            QuicCertUtils::ExtractSubjectNameFromDERCert(certs[0],
+                                                         &ca_subject_view);
+            ca_subject = std::string(ca_subject_view);
+          }
         }
         QUIC_LOG_EVERY_N_SEC(WARNING, 60)
             << "SCT is expected but it is empty. sni: '"
diff --git a/quic/core/quic_flags_list.h b/quic/core/quic_flags_list.h
index ec44d48..4d9c0b5 100644
--- a/quic/core/quic_flags_list.h
+++ b/quic/core/quic_flags_list.h
@@ -45,6 +45,7 @@
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_enable_aead_limits, true)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_enable_mtu_discovery_at_server, false)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_encrypted_control_frames, false)
+QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_extract_x509_subject_using_certificate_view, false)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_fix_address_validation, true)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_fix_arm_pto_for_application_data, true)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_fix_http3_goaway_stream_id, true)