diff --git a/lib/internal/crypto/ec.js b/lib/internal/crypto/ec.js index 248bba57ad2c3f..c8a1f834b93f9f 100644 --- a/lib/internal/crypto/ec.js +++ b/lib/internal/crypto/ec.js @@ -166,7 +166,25 @@ async function ecGenerateKey(algorithm, extractable, keyUsages) { // Fall through } return new Promise((resolve, reject) => { - generateKeyPair('ec', { namedCurve }, (err, pubKey, privKey) => { + let generate; + switch (namedCurve) { + case 'NODE-ED25519': + generate = generateKeyPair.bind(undefined, 'ed25519'); + break; + case 'NODE-ED448': + generate = generateKeyPair.bind(undefined, 'ed448'); + break; + case 'NODE-X25519': + generate = generateKeyPair.bind(undefined, 'x25519'); + break; + case 'NODE-X448': + generate = generateKeyPair.bind(undefined, 'x448'); + break; + default: + generate = generateKeyPair.bind(undefined, 'ec', { namedCurve }); + break; + } + generate((err, pubKey, privKey) => { if (err) { return reject(lazyDOMException( 'The operation failed for an operation-specific reason', diff --git a/src/crypto/crypto_ec.cc b/src/crypto/crypto_ec.cc index c764124bdd0d6f..b0bbda2294b66e 100644 --- a/src/crypto/crypto_ec.cc +++ b/src/crypto/crypto_ec.cc @@ -36,18 +36,6 @@ int GetCurveFromName(const char* name) { int nid = EC_curve_nist2nid(name); if (nid == NID_undef) nid = OBJ_sn2nid(name); - // If there is still no match, check manually for known curves - if (nid == NID_undef) { - if (strcmp(name, "NODE-ED25519") == 0) { - nid = EVP_PKEY_ED25519; - } else if (strcmp(name, "NODE-ED448") == 0) { - nid = EVP_PKEY_ED448; - } else if (strcmp(name, "NODE-X25519") == 0) { - nid = EVP_PKEY_X25519; - } else if (strcmp(name, "NODE-X448") == 0) { - nid = EVP_PKEY_X448; - } - } return nid; } diff --git a/test/parallel/test-crypto-keygen.js b/test/parallel/test-crypto-keygen.js index c27d5fe166220e..b80b35135743d9 100644 --- a/test/parallel/test-crypto-keygen.js +++ b/test/parallel/test-crypto-keygen.js @@ -1283,3 +1283,19 @@ const sec1EncExp = (cipher) => getRegExpForPEM('EC PRIVATE KEY', cipher); })); } } + +{ + // Proprietary Web Cryptography API ECDH/ECDSA namedCurve parameters + // should not be recognized in this API. + // See https://github.com/nodejs/node/issues/37055 + const curves = ['NODE-ED25519', 'NODE-ED448', 'NODE-X25519', 'NODE-X448']; + for (const namedCurve of curves) { + assert.throws( + () => generateKeyPair('ec', { namedCurve }, common.mustNotCall()), + { + name: 'TypeError', + message: 'Invalid EC curve name' + } + ); + } +}