crypto: harden bignum-to-binary conversions
PR-URL: https://github.com/nodejs/node/pull/24719 Refs: https://github.com/nodejs/node/issues/24645 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
5b90902b8b
commit
3513b0c3d9
@ -4211,9 +4211,11 @@ void DiffieHellman::GenerateKeys(const FunctionCallbackInfo<Value>& args) {
|
|||||||
|
|
||||||
const BIGNUM* pub_key;
|
const BIGNUM* pub_key;
|
||||||
DH_get0_key(diffieHellman->dh_.get(), &pub_key, nullptr);
|
DH_get0_key(diffieHellman->dh_.get(), &pub_key, nullptr);
|
||||||
size_t size = BN_num_bytes(pub_key);
|
const int size = BN_num_bytes(pub_key);
|
||||||
|
CHECK_GE(size, 0);
|
||||||
char* data = Malloc(size);
|
char* data = Malloc(size);
|
||||||
BN_bn2bin(pub_key, reinterpret_cast<unsigned char*>(data));
|
CHECK_EQ(size,
|
||||||
|
BN_bn2binpad(pub_key, reinterpret_cast<unsigned char*>(data), size));
|
||||||
args.GetReturnValue().Set(Buffer::New(env, data, size).ToLocalChecked());
|
args.GetReturnValue().Set(Buffer::New(env, data, size).ToLocalChecked());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4229,9 +4231,11 @@ void DiffieHellman::GetField(const FunctionCallbackInfo<Value>& args,
|
|||||||
const BIGNUM* num = get_field(dh->dh_.get());
|
const BIGNUM* num = get_field(dh->dh_.get());
|
||||||
if (num == nullptr) return env->ThrowError(err_if_null);
|
if (num == nullptr) return env->ThrowError(err_if_null);
|
||||||
|
|
||||||
size_t size = BN_num_bytes(num);
|
const int size = BN_num_bytes(num);
|
||||||
|
CHECK_GE(size, 0);
|
||||||
char* data = Malloc(size);
|
char* data = Malloc(size);
|
||||||
BN_bn2bin(num, reinterpret_cast<unsigned char*>(data));
|
CHECK_EQ(size,
|
||||||
|
BN_bn2binpad(num, reinterpret_cast<unsigned char*>(data), size));
|
||||||
args.GetReturnValue().Set(Buffer::New(env, data, size).ToLocalChecked());
|
args.GetReturnValue().Set(Buffer::New(env, data, size).ToLocalChecked());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4567,13 +4571,9 @@ void ECDH::GetPrivateKey(const FunctionCallbackInfo<Value>& args) {
|
|||||||
if (b == nullptr)
|
if (b == nullptr)
|
||||||
return env->ThrowError("Failed to get ECDH private key");
|
return env->ThrowError("Failed to get ECDH private key");
|
||||||
|
|
||||||
int size = BN_num_bytes(b);
|
const int size = BN_num_bytes(b);
|
||||||
unsigned char* out = node::Malloc<unsigned char>(size);
|
unsigned char* out = node::Malloc<unsigned char>(size);
|
||||||
|
CHECK_EQ(size, BN_bn2binpad(b, out, size));
|
||||||
if (size != BN_bn2bin(b, out)) {
|
|
||||||
free(out);
|
|
||||||
return env->ThrowError("Failed to convert ECDH private key to Buffer");
|
|
||||||
}
|
|
||||||
|
|
||||||
Local<Object> buf =
|
Local<Object> buf =
|
||||||
Buffer::New(env, reinterpret_cast<char*>(out), size).ToLocalChecked();
|
Buffer::New(env, reinterpret_cast<char*>(out), size).ToLocalChecked();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user