Skip to content

Commit cb3b0ec

Browse files
panvatargos
authored andcommitted
crypto: generateKeyPair('ec') should not support NODE-ED* and NODE-X*
Fixes #37055 PR-URL: #37063 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com>
1 parent 1710016 commit cb3b0ec

File tree

5 files changed

+55
-14
lines changed

5 files changed

+55
-14
lines changed

lib/internal/crypto/ec.js

+21-1
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,27 @@ async function ecGenerateKey(algorithm, extractable, keyUsages) {
166166
// Fall through
167167
}
168168
return new Promise((resolve, reject) => {
169-
generateKeyPair('ec', { namedCurve }, (err, pubKey, privKey) => {
169+
let genKeyType;
170+
let genOpts;
171+
switch (namedCurve) {
172+
case 'NODE-ED25519':
173+
genKeyType = 'ed25519';
174+
break;
175+
case 'NODE-ED448':
176+
genKeyType = 'ed448';
177+
break;
178+
case 'NODE-X25519':
179+
genKeyType = 'x25519';
180+
break;
181+
case 'NODE-X448':
182+
genKeyType = 'x448';
183+
break;
184+
default:
185+
genKeyType = 'ec';
186+
genOpts = { namedCurve };
187+
break;
188+
}
189+
generateKeyPair(genKeyType, genOpts, (err, pubKey, privKey) => {
170190
if (err) {
171191
return reject(lazyDOMException(
172192
'The operation failed for an operation-specific reason',

src/crypto/crypto_ec.cc

+16-12
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,21 @@ int GetCurveFromName(const char* name) {
3636
int nid = EC_curve_nist2nid(name);
3737
if (nid == NID_undef)
3838
nid = OBJ_sn2nid(name);
39-
// If there is still no match, check manually for known curves
40-
if (nid == NID_undef) {
41-
if (strcmp(name, "NODE-ED25519") == 0) {
42-
nid = EVP_PKEY_ED25519;
43-
} else if (strcmp(name, "NODE-ED448") == 0) {
44-
nid = EVP_PKEY_ED448;
45-
} else if (strcmp(name, "NODE-X25519") == 0) {
46-
nid = EVP_PKEY_X25519;
47-
} else if (strcmp(name, "NODE-X448") == 0) {
48-
nid = EVP_PKEY_X448;
49-
}
39+
return nid;
40+
}
41+
42+
int GetOKPCurveFromName(const char* name) {
43+
int nid;
44+
if (strcmp(name, "NODE-ED25519") == 0) {
45+
nid = EVP_PKEY_ED25519;
46+
} else if (strcmp(name, "NODE-ED448") == 0) {
47+
nid = EVP_PKEY_ED448;
48+
} else if (strcmp(name, "NODE-X25519") == 0) {
49+
nid = EVP_PKEY_X25519;
50+
} else if (strcmp(name, "NODE-X448") == 0) {
51+
nid = EVP_PKEY_X448;
52+
} else {
53+
nid = NID_undef;
5054
}
5155
return nid;
5256
}
@@ -443,7 +447,7 @@ Maybe<bool> ECDHBitsTraits::AdditionalConfig(
443447
return Nothing<bool>();
444448
}
445449

446-
params->id_ = GetCurveFromName(*name);
450+
params->id_ = GetOKPCurveFromName(*name);
447451
params->private_ = private_key->Data();
448452
params->public_ = public_key->Data();
449453

src/crypto/crypto_ec.h

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
namespace node {
1818
namespace crypto {
1919
int GetCurveFromName(const char* name);
20+
int GetOKPCurveFromName(const char* name);
2021

2122
class ECDH final : public BaseObject {
2223
public:

src/crypto/crypto_keys.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1058,7 +1058,7 @@ void KeyObjectHandle::InitEDRaw(const FunctionCallbackInfo<Value>& args) {
10581058
? EVP_PKEY_new_raw_private_key
10591059
: EVP_PKEY_new_raw_public_key;
10601060

1061-
int id = GetCurveFromName(*name);
1061+
int id = GetOKPCurveFromName(*name);
10621062

10631063
switch (id) {
10641064
case EVP_PKEY_X25519:

test/parallel/test-crypto-keygen.js

+16
Original file line numberDiff line numberDiff line change
@@ -1283,3 +1283,19 @@ const sec1EncExp = (cipher) => getRegExpForPEM('EC PRIVATE KEY', cipher);
12831283
}));
12841284
}
12851285
}
1286+
1287+
{
1288+
// Proprietary Web Cryptography API ECDH/ECDSA namedCurve parameters
1289+
// should not be recognized in this API.
1290+
// See https://github.com/nodejs/node/issues/37055
1291+
const curves = ['NODE-ED25519', 'NODE-ED448', 'NODE-X25519', 'NODE-X448'];
1292+
for (const namedCurve of curves) {
1293+
assert.throws(
1294+
() => generateKeyPair('ec', { namedCurve }, common.mustNotCall()),
1295+
{
1296+
name: 'TypeError',
1297+
message: 'Invalid EC curve name'
1298+
}
1299+
);
1300+
}
1301+
}

0 commit comments

Comments
 (0)