crypto: avoid EC raw export reconstruction · nodejs/node@fab5ddd · GitHub
Skip to content

Commit fab5ddd

Browse files
panvaaduh95
authored andcommitted
crypto: avoid EC raw export reconstruction
Read private scalars and matching uncompressed provider encodings directly. Assisted-by: GitHub Copilot Signed-off-by: Filip Skokan <panva.ip@gmail.com> PR-URL: #65908 Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de>
1 parent 220a499 commit fab5ddd

4 files changed

Lines changed: 95 additions & 52 deletions

File tree

‎benchmark/crypto/ec-raw-export.js‎

Lines changed: 23 additions & 0 deletions

‎deps/ncrypto/ncrypto.cc‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6933,6 +6933,51 @@ int Ec::getCurve() const {
69336933
return EC_GROUP_get_curve_name(getGroup());
69346934
}
69356935

6936+
DataPointer Ec::TryExportPublic(const EVPKeyPointer& key,
6937+
point_conversion_form_t form) {
6938+
if (form != POINT_CONVERSION_UNCOMPRESSED) return {};
6939+
#if NCRYPTO_USE_OPENSSL3_PROVIDER
6940+
{
6941+
MarkPopErrorOnReturn pop_errors;
6942+
size_t length = 0;
6943+
if (EVP_PKEY_get_octet_string_param(
6944+
key.get(), OSSL_PKEY_PARAM_PUB_KEY, nullptr, 0, &length) == 1) {
6945+
auto bytes = DataPointer::Alloc(length);
6946+
if (bytes && length != 0 &&
6947+
EVP_PKEY_get_octet_string_param(key.get(),
6948+
OSSL_PKEY_PARAM_PUB_KEY,
6949+
bytes.get<unsigned char>(),
6950+
length,
6951+
&length) == 1 &&
6952+
(bytes.get<unsigned char>()[0] & ~1) == form) {
6953+
return bytes.resize(length);
6954+
}
6955+
}
6956+
}
6957+
#endif
6958+
return {};
6959+
}
6960+
6961+
DataPointer Ec::ExportPrivate(const EVPKeyPointer& key) {
6962+
#if NCRYPTO_USE_OPENSSL3_PROVIDER
6963+
{
6964+
MarkPopErrorOnReturn pop_errors;
6965+
BignumPointer priv;
6966+
BignumPointer order;
6967+
if (GetPKeyBnParam(key.get(), OSSL_PKEY_PARAM_PRIV_KEY, &priv) &&
6968+
GetPKeyBnParam(key.get(), OSSL_PKEY_PARAM_EC_ORDER, &order)) {
6969+
return priv.encodePadded(order.byteLength());
6970+
}
6971+
}
6972+
#endif
6973+
ECKeyPointer ec(key);
6974+
if (!ec || ec.getPrivateKey() == nullptr) return {};
6975+
auto order = BignumPointer::New();
6976+
if (!order || !EC_GROUP_get_order(ec.getGroup(), order.get(), nullptr))
6977+
return {};
6978+
return BignumPointer::EncodePadded(ec.getPrivateKey(), order.byteLength());
6979+
}
6980+
69366981
bool Ec::GetKeyComponents(const EVPKeyPointer& key,
69376982
BignumPointer* x,
69386983
BignumPointer* y,

‎deps/ncrypto/ncrypto.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,9 @@ class Ec final {
813813

814814
static int GetCurveIdFromName(const char* name);
815815
static int GetCurveId(const EVPKeyPointer& key);
816+
static DataPointer TryExportPublic(const EVPKeyPointer& key,
817+
point_conversion_form_t form);
818+
static DataPointer ExportPrivate(const EVPKeyPointer& key);
816819
static bool GetKeyComponents(const EVPKeyPointer& key,
817820
BignumPointer* x,
818821
BignumPointer* y,

‎src/crypto/crypto_keys.cc‎

Lines changed: 24 additions & 52 deletions

0 commit comments

Comments
 (0)