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);
+}