Skip to content

Commit 50f9062

Browse files
davidbendanbev
authored andcommitted
crypto: don't crash X509ToObject on error
Use MaybeLocal::ToLocal and don't crash X509ToObject on error. PR-URL: #25717 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Anna Henningsen <[email protected]>
1 parent ebda39a commit 50f9062

File tree

1 file changed

+22
-14
lines changed

1 file changed

+22
-14
lines changed

src/node_crypto.cc

+22-14
Original file line numberDiff line numberDiff line change
@@ -1640,24 +1640,27 @@ static void AddFingerprintDigest(const unsigned char* md,
16401640
}
16411641
}
16421642

1643+
16431644
static MaybeLocal<Object> ECPointToBuffer(Environment* env,
16441645
const EC_GROUP* group,
16451646
const EC_POINT* point,
1646-
point_conversion_form_t form) {
1647+
point_conversion_form_t form,
1648+
const char** error) {
16471649
size_t len = EC_POINT_point2oct(group, point, form, nullptr, 0, nullptr);
16481650
if (len == 0) {
1649-
env->ThrowError("Failed to get public key length");
1651+
if (error != nullptr) *error = "Failed to get public key length";
16501652
return MaybeLocal<Object>();
16511653
}
16521654
MallocedBuffer<unsigned char> buf(len);
16531655
len = EC_POINT_point2oct(group, point, form, buf.data, buf.size, nullptr);
16541656
if (len == 0) {
1655-
env->ThrowError("Failed to get public key");
1657+
if (error != nullptr) *error = "Failed to get public key";
16561658
return MaybeLocal<Object>();
16571659
}
16581660
return Buffer::New(env, buf.release(), len);
16591661
}
16601662

1663+
16611664
static Local<Object> X509ToObject(Environment* env, X509* cert) {
16621665
EscapableHandleScope scope(env->isolate());
16631666
Local<Context> context = env->context();
@@ -1775,10 +1778,11 @@ static Local<Object> X509ToObject(Environment* env, X509* cert) {
17751778
}
17761779

17771780
const EC_POINT* pubkey = EC_KEY_get0_public_key(ec.get());
1778-
if (pubkey != nullptr) {
1779-
Local<Object> buf =
1780-
ECPointToBuffer(env, group, pubkey, EC_KEY_get_conv_form(ec.get()))
1781-
.ToLocalChecked();
1781+
Local<Object> buf;
1782+
if (pubkey != nullptr &&
1783+
ECPointToBuffer(
1784+
env, group, pubkey, EC_KEY_get_conv_form(ec.get()), nullptr)
1785+
.ToLocal(&buf)) {
17821786
info->Set(context, env->pubkey_string(), buf).FromJust();
17831787
}
17841788

@@ -5275,6 +5279,7 @@ void ECDH::GetPublicKey(const FunctionCallbackInfo<Value>& args) {
52755279
ECDH* ecdh;
52765280
ASSIGN_OR_RETURN_UNWRAP(&ecdh, args.Holder());
52775281

5282+
const EC_GROUP* group = EC_KEY_get0_group(ecdh->key_.get());
52785283
const EC_POINT* pub = EC_KEY_get0_public_key(ecdh->key_.get());
52795284
if (pub == nullptr)
52805285
return env->ThrowError("Failed to get ECDH public key");
@@ -5283,10 +5288,11 @@ void ECDH::GetPublicKey(const FunctionCallbackInfo<Value>& args) {
52835288
uint32_t val = args[0].As<Uint32>()->Value();
52845289
point_conversion_form_t form = static_cast<point_conversion_form_t>(val);
52855290

5286-
MaybeLocal<Object> buf =
5287-
ECPointToBuffer(env, EC_KEY_get0_group(ecdh->key_.get()), pub, form);
5288-
if (buf.IsEmpty()) return;
5289-
args.GetReturnValue().Set(buf.ToLocalChecked());
5291+
const char* error;
5292+
Local<Object> buf;
5293+
if (!ECPointToBuffer(env, group, pub, form, &error).ToLocal(&buf))
5294+
return env->ThrowError(error);
5295+
args.GetReturnValue().Set(buf);
52905296
}
52915297

52925298

@@ -6174,9 +6180,11 @@ void ConvertKey(const FunctionCallbackInfo<Value>& args) {
61746180
uint32_t val = args[2].As<Uint32>()->Value();
61756181
point_conversion_form_t form = static_cast<point_conversion_form_t>(val);
61766182

6177-
MaybeLocal<Object> buf = ECPointToBuffer(env, group.get(), pub.get(), form);
6178-
if (buf.IsEmpty()) return;
6179-
args.GetReturnValue().Set(buf.ToLocalChecked());
6183+
const char* error;
6184+
Local<Object> buf;
6185+
if (!ECPointToBuffer(env, group.get(), pub.get(), form, &error).ToLocal(&buf))
6186+
return env->ThrowError(error);
6187+
args.GetReturnValue().Set(buf);
61806188
}
61816189

61826190

0 commit comments

Comments
 (0)