crypto: use provider EC group names · nodejs/node@97828d9 · GitHub
Skip to content

Commit 97828d9

Browse files
panvaaduh95
authored andcommitted
crypto: use provider EC group names
Pass group names through EC key generation and report provider names in key details without requiring an OpenSSL NID. Preserve established curve aliases and synchronous invalid-curve errors. Filter built-in curves through EC parameter generation and refresh getCurves() results when FIPS properties change. Signed-off-by: Filip Skokan <panva.ip@gmail.com> Assisted-by: Codex PR-URL: #66108 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
1 parent 3de05da commit 97828d9

8 files changed

Lines changed: 336 additions & 19 deletions

File tree

‎deps/ncrypto/ncrypto.cc‎

Lines changed: 67 additions & 6 deletions

‎deps/ncrypto/ncrypto.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -771,6 +771,8 @@ class Ec final {
771771

772772
static int GetCurveIdFromName(const char* name);
773773
static int GetCurveId(const EVPKeyPointer& key);
774+
static std::optional<std::string> GetCurveName(const EVPKeyPointer& key);
775+
static bool CheckCurveName(const char* name);
774776
static DataPointer TryExportPublic(const EVPKeyPointer& key,
775777
point_conversion_form_t form);
776778
static DataPointer ExportPrivate(const EVPKeyPointer& key);
@@ -1150,6 +1152,7 @@ class EVPKeyCtxPointer final {
11501152
bool setDhParameters(int prime_size, uint32_t generator);
11511153
bool setDsaParameters(uint32_t bits, std::optional<int> q_bits);
11521154
bool setEcParameters(int curve, int encoding);
1155+
bool setEcParameters(const char* group_name, int encoding);
11531156

11541157
bool setRsaOaepMd(const Digest& md);
11551158
bool setRsaMgf1Md(const Digest& md);

‎lib/internal/crypto/util.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ const {
8080
const { Buffer } = require('buffer');
8181

8282
const {
83-
cachedResult,
8483
emitExperimentalWarning,
8584
filterDuplicateStrings,
8685
lazyDOMException,
@@ -192,7 +191,8 @@ const getMacs = cachedArrayByFipsGeneration(
192191
_macCache = undefined;
193192
});
194193

195-
const getCurves = cachedResult(() => filterDuplicateStrings(_getCurves()));
194+
const getCurves = cachedArrayByFipsGeneration(
195+
() => filterDuplicateStrings(_getCurves()));
196196

197197
function setEngine(id, flags) {
198198
validateString(id, 'id');

‎src/crypto/crypto_ec.cc‎

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -406,14 +406,18 @@ void ECDH::ConvertKey(const FunctionCallbackInfo<Value>& args) {
406406
}
407407
}
408408

409+
void EcKeyPairParams::MemoryInfo(MemoryTracker* tracker) const {
410+
tracker->TrackField("curve_name", curve_name);
411+
}
412+
409413
EVPKeyCtxPointer EcKeyGenTraits::Setup(EcKeyPairGenConfig* params) {
410414
EVPKeyCtxPointer key_ctx;
411415
if (params->params.algorithm != nullptr) {
412416
key_ctx = EVPKeyCtxPointer::NewFromAlgorithm(*params->params.algorithm);
413417
} else {
414418
auto param_ctx = EVPKeyCtxPointer::NewFromAlgorithm(KeyAlgorithm::EC);
415419
if (!param_ctx.initForParamgen() ||
416-
!param_ctx.setEcParameters(params->params.curve_nid,
420+
!param_ctx.setEcParameters(params->params.curve_name.c_str(),
417421
params->params.param_encoding)) {
418422
return {};
419423
}
@@ -447,11 +451,11 @@ Maybe<void> EcKeyGenTraits::AdditionalConfig(
447451
Utf8Value curve_name(env->isolate(), args[*offset]);
448452
params->params.algorithm = ncrypto::Ec::GetNamedKeyAlgorithm(*curve_name);
449453
if (params->params.algorithm == nullptr) {
450-
params->params.curve_nid = Ec::GetCurveIdFromName(*curve_name);
451-
if (params->params.curve_nid == NID_undef) {
454+
if (!Ec::CheckCurveName(*curve_name)) {
452455
THROW_ERR_CRYPTO_INVALID_CURVE(env);
453456
return Nothing<void>();
454457
}
458+
params->params.curve_name = *curve_name;
455459
}
456460

457461
// param encoding
@@ -624,13 +628,13 @@ bool GetEcKeyDetail(Environment* env,
624628
const auto& m_pkey = key.GetAsymmetricKey();
625629
DCHECK(m_pkey.isA(KeyAlgorithm::EC));
626630

627-
int nid = Ec::GetCurveId(m_pkey);
628-
if (nid == NID_undef) return true;
631+
const auto name = Ec::GetCurveName(m_pkey);
632+
if (!name) return true;
629633

630634
return target
631635
->Set(env->context(),
632636
env->named_curve_string(),
633-
OneByteString(env->isolate(), OBJ_nid2sn(nid)))
637+
OneByteString(env->isolate(), name.value()))
634638
.IsJust();
635639
}
636640

‎src/crypto/crypto_ec.h‎

Lines changed: 4 additions & 2 deletions

0 commit comments

Comments
 (0)