@@ -3233,10 +3233,14 @@ void Hmac::HmacInit(const char* hash_type, const char* key, int key_len) {
32333233 return env ()->ThrowError (" Unknown message digest" );
32343234 }
32353235 HMAC_CTX_init (&ctx_);
3236+ int result = 0 ;
32363237 if (key_len == 0 ) {
3237- HMAC_Init (&ctx_, " " , 0 , md_);
3238+ result = HMAC_Init (&ctx_, " " , 0 , md_);
32383239 } else {
3239- HMAC_Init (&ctx_, key, key_len, md_);
3240+ result = HMAC_Init (&ctx_, key, key_len, md_);
3241+ }
3242+ if (!result) {
3243+ return ThrowCryptoError (env (), ERR_get_error ());
32403244 }
32413245 initialised_ = true ;
32423246}
@@ -3357,7 +3361,8 @@ void Hash::New(const FunctionCallbackInfo<Value>& args) {
33573361
33583362 Hash* hash = new Hash (env, args.This ());
33593363 if (!hash->HashInit (*hash_type)) {
3360- return env->ThrowError (" Digest method not supported" );
3364+ return ThrowCryptoError (env, ERR_get_error (),
3365+ " Digest method not supported" );
33613366 }
33623367}
33633368
@@ -3369,6 +3374,9 @@ bool Hash::HashInit(const char* hash_type) {
33693374 return false ;
33703375 EVP_MD_CTX_init (&mdctx_);
33713376 EVP_DigestInit_ex (&mdctx_, md_, nullptr );
3377+ if (0 != ERR_peek_error ()) {
3378+ return false ;
3379+ }
33723380 initialised_ = true ;
33733381 return true ;
33743382}
@@ -4050,7 +4058,8 @@ void DiffieHellman::Initialize(Environment* env, Local<Object> target) {
40504058
40514059bool DiffieHellman::Init (int primeLength, int g) {
40524060 dh = DH_new ();
4053- DH_generate_parameters_ex (dh, primeLength, g, 0 );
4061+ if (!DH_generate_parameters_ex (dh, primeLength, g, 0 ))
4062+ return false ;
40544063 bool result = VerifyContext ();
40554064 if (!result)
40564065 return false ;
@@ -4143,7 +4152,7 @@ void DiffieHellman::New(const FunctionCallbackInfo<Value>& args) {
41434152 }
41444153
41454154 if (!initialized) {
4146- return env-> ThrowError ( " Initialization failed" );
4155+ return ThrowCryptoError ( env, ERR_get_error (), " Initialization failed" );
41474156 }
41484157}
41494158
@@ -4154,11 +4163,11 @@ void DiffieHellman::GenerateKeys(const FunctionCallbackInfo<Value>& args) {
41544163 DiffieHellman* diffieHellman = Unwrap<DiffieHellman>(args.Holder ());
41554164
41564165 if (!diffieHellman->initialised_ ) {
4157- return env-> ThrowError ( " Not initialized" );
4166+ return ThrowCryptoError ( env, ERR_get_error (), " Not initialized" );
41584167 }
41594168
41604169 if (!DH_generate_key (diffieHellman->dh )) {
4161- return env-> ThrowError ( " Key generation failed" );
4170+ return ThrowCryptoError ( env, ERR_get_error (), " Key generation failed" );
41624171 }
41634172
41644173 int dataSize = BN_num_bytes (diffieHellman->dh ->pub_key );
@@ -4177,7 +4186,7 @@ void DiffieHellman::GetPrime(const FunctionCallbackInfo<Value>& args) {
41774186 DiffieHellman* diffieHellman = Unwrap<DiffieHellman>(args.Holder ());
41784187
41794188 if (!diffieHellman->initialised_ ) {
4180- return env-> ThrowError ( " Not initialized" );
4189+ return ThrowCryptoError ( env, ERR_get_error (), " Not initialized" );
41814190 }
41824191
41834192 int dataSize = BN_num_bytes (diffieHellman->dh ->p );
@@ -4195,7 +4204,7 @@ void DiffieHellman::GetGenerator(const FunctionCallbackInfo<Value>& args) {
41954204 DiffieHellman* diffieHellman = Unwrap<DiffieHellman>(args.Holder ());
41964205
41974206 if (!diffieHellman->initialised_ ) {
4198- return env-> ThrowError ( " Not initialized" );
4207+ return ThrowCryptoError ( env, ERR_get_error (), " Not initialized" );
41994208 }
42004209
42014210 int dataSize = BN_num_bytes (diffieHellman->dh ->g );
@@ -4213,7 +4222,7 @@ void DiffieHellman::GetPublicKey(const FunctionCallbackInfo<Value>& args) {
42134222 DiffieHellman* diffieHellman = Unwrap<DiffieHellman>(args.Holder ());
42144223
42154224 if (!diffieHellman->initialised_ ) {
4216- return env-> ThrowError ( " Not initialized" );
4225+ return ThrowCryptoError ( env, ERR_get_error (), " Not initialized" );
42174226 }
42184227
42194228 if (diffieHellman->dh ->pub_key == nullptr ) {
@@ -4236,7 +4245,7 @@ void DiffieHellman::GetPrivateKey(const FunctionCallbackInfo<Value>& args) {
42364245 DiffieHellman* diffieHellman = Unwrap<DiffieHellman>(args.Holder ());
42374246
42384247 if (!diffieHellman->initialised_ ) {
4239- return env-> ThrowError ( " Not initialized" );
4248+ return ThrowCryptoError ( env, ERR_get_error (), " Not initialized" );
42404249 }
42414250
42424251 if (diffieHellman->dh ->priv_key == nullptr ) {
@@ -4259,7 +4268,7 @@ void DiffieHellman::ComputeSecret(const FunctionCallbackInfo<Value>& args) {
42594268 DiffieHellman* diffieHellman = Unwrap<DiffieHellman>(args.Holder ());
42604269
42614270 if (!diffieHellman->initialised_ ) {
4262- return env-> ThrowError ( " Not initialized" );
4271+ return ThrowCryptoError ( env, ERR_get_error (), " Not initialized" );
42634272 }
42644273
42654274 ClearErrorOnReturn clear_error_on_return;
@@ -4292,7 +4301,7 @@ void DiffieHellman::ComputeSecret(const FunctionCallbackInfo<Value>& args) {
42924301 delete[] data;
42934302
42944303 if (!checked) {
4295- return env-> ThrowError ( " Invalid key " );
4304+ return ThrowCryptoError ( env, ERR_get_error (), " Invalid Key " );
42964305 } else if (checkResult) {
42974306 if (checkResult & DH_CHECK_PUBKEY_TOO_SMALL) {
42984307 return env->ThrowError (" Supplied key is too small" );
@@ -4329,7 +4338,7 @@ void DiffieHellman::SetPublicKey(const FunctionCallbackInfo<Value>& args) {
43294338 Environment* env = diffieHellman->env ();
43304339
43314340 if (!diffieHellman->initialised_ ) {
4332- return env-> ThrowError ( " Not initialized" );
4341+ return ThrowCryptoError ( env, ERR_get_error (), " Not initialized" );
43334342 }
43344343
43354344 if (args.Length () == 0 ) {
@@ -4348,7 +4357,7 @@ void DiffieHellman::SetPrivateKey(const FunctionCallbackInfo<Value>& args) {
43484357 Environment* env = diffieHellman->env ();
43494358
43504359 if (!diffieHellman->initialised_ ) {
4351- return env-> ThrowError ( " Not initialized" );
4360+ return ThrowCryptoError ( env, ERR_get_error (), " Not initialized" );
43524361 }
43534362
43544363 if (args.Length () == 0 ) {
@@ -4370,7 +4379,8 @@ void DiffieHellman::VerifyErrorGetter(Local<String> property,
43704379 DiffieHellman* diffieHellman = Unwrap<DiffieHellman>(args.Holder ());
43714380
43724381 if (!diffieHellman->initialised_ )
4373- return diffieHellman->env ()->ThrowError (" Not initialized" );
4382+ return ThrowCryptoError (diffieHellman->env (), ERR_get_error (),
4383+ " Not initialized" );
43744384
43754385 args.GetReturnValue ().Set (diffieHellman->verifyError_ );
43764386}
0 commit comments