Commit f0f8115e10d for nodejs

commit f0f8115e10de3db6e6deb528d647b03b9b0a0c0c
Author: Lazizbek Ergashev <lazerg2@gmail.com>
Date:   Thu Oct 15 12:52:41 2026 +0500

    crypto: fix X509 curve name crash for non-NIST curves

    Signed-off-by: lazerg <lazerg2@gmail.com>
    Assisted-by: Claude Code
    PR-URL: https://github.com/nodejs/node/pull/66694
    Fixes: https://github.com/nodejs/node/issues/66681
    Reviewed-By: Filip Skokan <panva.ip@gmail.com>
    Reviewed-By: Tim Perry <pimterry@gmail.com>

diff --git a/src/crypto/crypto_x509.cc b/src/crypto/crypto_x509.cc
index 14825742e98..a1cbeb79453 100644
--- a/src/crypto/crypto_x509.cc
+++ b/src/crypto/crypto_x509.cc
@@ -699,9 +699,10 @@ MaybeLocal<Value> GetECGroupBits(Environment* env, const EC_GROUP* group) {

 template <const char* (*nid2string)(int nid)>
 MaybeLocal<Value> GetCurveName(Environment* env, const int nid) {
-  std::string_view name = nid2string(nid);
-  return name.size() ? MaybeLocal<Value>(OneByteString(env->isolate(), name))
-                     : MaybeLocal<Value>(Undefined(env->isolate()));
+  const char* name = nid2string(nid);
+  return name != nullptr
+             ? MaybeLocal<Value>(OneByteString(env->isolate(), name))
+             : MaybeLocal<Value>(Undefined(env->isolate()));
 }

 MaybeLocal<Object> X509ToObject(Environment* env, const X509View& cert) {
diff --git a/test/parallel/test-crypto-x509.js b/test/parallel/test-crypto-x509.js
index c8f44372f97..c2603354897 100644
--- a/test/parallel/test-crypto-x509.js
+++ b/test/parallel/test-crypto-x509.js
@@ -514,3 +514,22 @@ CQAAAAAAAAAAAA==
   assert.strictEqual(cert.signatureAlgorithm, undefined);
   assert.strictEqual(cert.signatureAlgorithmOid, '1.3.6.1.4.1.99999.1');
 }
+
+if (!isBoringSSL) {
+  // EC certificate on a curve without a NIST name (brainpoolP256r1).
+  const certPem = `-----BEGIN CERTIFICATE-----
+MIIBfzCCASagAwIBAgIUcZKohGvML9PeBwQtylddAdUU3nkwCgYIKoZIzj0EAwIw
+FDESMBAGA1UEAwwJYnJhaW5wb29sMCAXDTI2MTAxMjE0NDczMVoYDzIxMjYwOTE4
+MTQ0NzMxWjAUMRIwEAYDVQQDDAlicmFpbnBvb2wwWjAUBgcqhkjOPQIBBgkrJAMD
+AggBAQcDQgAEKnP14jKQEUyWxWhXrs+ql7OlMy0EW3mnYTvwkF8VyYsPB9dBUJOW
+8IHqIik0kjQVSVhtLH0j+hveyZvGd0aQq6NTMFEwHQYDVR0OBBYEFNx4uQEsAiNZ
+zcrKuAZ9/9d1eIeDMB8GA1UdIwQYMBaAFNx4uQEsAiNZzcrKuAZ9/9d1eIeDMA8G
+A1UdEwEB/wQFMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgHc4TOjOLOPXrvWXRQ44L
+jEVmV959vS0DtFIIsrGT3moCIBBRZWdLdd0YjFHUQshMZFM9BN2INpjFNUUxqPAC
+3qPo
+-----END CERTIFICATE-----`;
+
+  const legacyObject = new X509Certificate(certPem).toLegacyObject();
+  assert.ok([undefined, 'brainpoolP256r1'].includes(legacyObject.asn1Curve));
+  assert.strictEqual(legacyObject.nistCurve, undefined);
+}