@@ -2581,6 +2581,7 @@ void CipherBase::Init(const char* cipher_type,
25812581int key_buf_len,
25822582unsigned int auth_tag_len){
25832583 HandleScope scope (env ()->isolate ());
2584+ MarkPopErrorOnReturn mark_pop_error_on_return;
25842585
25852586#ifdef NODE_FIPS_MODE
25862587if (FIPS_mode ()){
@@ -2605,6 +2606,7 @@ void CipherBase::Init(const char* cipher_type,
260526061 ,
26062607 key,
26072608 iv);
2609+ CHECK_NE (key_len, 0 );
26082610
26092611 ctx_.reset (EVP_CIPHER_CTX_new ());
26102612
@@ -2613,7 +2615,11 @@ void CipherBase::Init(const char* cipher_type,
26132615EVP_CIPHER_CTX_set_flags (ctx_.get (), EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
26142616
26152617const bool encrypt = (kind_ == kCipher );
2616- EVP_CipherInit_ex (ctx_.get (), cipher, nullptr , nullptr , nullptr , encrypt);
2618+ if (1 != EVP_CipherInit_ex (ctx_.get (), cipher, nullptr ,
2619+ nullptr , nullptr , encrypt)){
2620+ return ThrowCryptoError (env (), ERR_get_error (),
2621+ " Failed to initialize cipher" );
2622+ }
26172623
26182624if (encrypt && (mode == EVP_CIPH_CTR_MODE || mode == EVP_CIPH_GCM_MODE ||
26192625 mode == EVP_CIPH_CCM_MODE)){
@@ -2632,12 +2638,15 @@ void CipherBase::Init(const char* cipher_type,
26322638
26332639CHECK_EQ (1 , EVP_CIPHER_CTX_set_key_length (ctx_.get (), key_len));
26342640
2635- EVP_CipherInit_ex (ctx_.get (),
2636- nullptr ,
2637- nullptr ,
2638- reinterpret_cast <unsigned char *>(key),
2639- reinterpret_cast <unsigned char *>(iv),
2640- encrypt);
2641+ if (1 != EVP_CipherInit_ex (ctx_.get (),
2642+ nullptr ,
2643+ nullptr ,
2644+ reinterpret_cast <unsigned char *>(key),
2645+ reinterpret_cast <unsigned char *>(iv),
2646+ encrypt)){
2647+ return ThrowCryptoError (env (), ERR_get_error (),
2648+ " Failed to initialize cipher" );
2649+ }
26412650}
26422651
26432652
@@ -2672,6 +2681,7 @@ void CipherBase::InitIv(const char* cipher_type,
26722681int iv_len,
26732682unsigned int auth_tag_len){
26742683 HandleScope scope (env ()->isolate ());
2684+ MarkPopErrorOnReturn mark_pop_error_on_return;
26752685
26762686const EVP_CIPHER* const cipher = EVP_get_cipherbyname (cipher_type);
26772687if (cipher == nullptr ){
@@ -2702,7 +2712,11 @@ void CipherBase::InitIv(const char* cipher_type,
27022712EVP_CIPHER_CTX_set_flags (ctx_.get (), EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
27032713
27042714const bool encrypt = (kind_ == kCipher );
2705- EVP_CipherInit_ex (ctx_.get (), cipher, nullptr , nullptr , nullptr , encrypt);
2715+ if (1 != EVP_CipherInit_ex (ctx_.get (), cipher, nullptr ,
2716+ nullptr , nullptr , encrypt)){
2717+ return ThrowCryptoError (env (), ERR_get_error (),
2718+ " Failed to initialize cipher" );
2719+ }
27062720
27072721if (IsAuthenticatedMode ()){
27082722CHECK (has_iv);
@@ -2715,12 +2729,15 @@ void CipherBase::InitIv(const char* cipher_type,
27152729return env ()->ThrowError (" Invalid key length" );
27162730 }
27172731
2718- EVP_CipherInit_ex (ctx_.get (),
2719- nullptr ,
2720- nullptr ,
2721- reinterpret_cast <const unsigned char *>(key),
2722- reinterpret_cast <const unsigned char *>(iv),
2723- encrypt);
2732+ if (1 != EVP_CipherInit_ex (ctx_.get (),
2733+ nullptr ,
2734+ nullptr ,
2735+ reinterpret_cast <const unsigned char *>(key),
2736+ reinterpret_cast <const unsigned char *>(iv),
2737+ encrypt)){
2738+ return ThrowCryptoError (env (), ERR_get_error (),
2739+ " Failed to initialize cipher" );
2740+ }
27242741}
27252742
27262743
@@ -2765,6 +2782,7 @@ static bool IsValidGCMTagLength(unsigned int tag_len){
27652782bool CipherBase::InitAuthenticated (const char * cipher_type, int iv_len,
27662783unsigned int auth_tag_len){
27672784CHECK (IsAuthenticatedMode ());
2785+ MarkPopErrorOnReturn mark_pop_error_on_return;
27682786
27692787if (!EVP_CIPHER_CTX_ctrl (ctx_.get (),
27702788 EVP_CTRL_AEAD_SET_IVLEN,
@@ -2910,6 +2928,7 @@ void CipherBase::SetAuthTag(const FunctionCallbackInfo<Value>& args){
29102928bool CipherBase::SetAAD (const char * data, unsigned int len, int plaintext_len){
29112929if (!ctx_ || !IsAuthenticatedMode ())
29122930return false ;
2931+ MarkPopErrorOnReturn mark_pop_error_on_return;
29132932
29142933int outlen;
29152934const int mode = EVP_CIPHER_CTX_mode (ctx_.get ());
@@ -2969,6 +2988,7 @@ CipherBase::UpdateResult CipherBase::Update(const char* data,
29692988int * out_len){
29702989if (!ctx_)
29712990return kErrorState ;
2991+ MarkPopErrorOnReturn mark_pop_error_on_return;
29722992
29732993const int mode = EVP_CIPHER_CTX_mode (ctx_.get ());
29742994
@@ -2980,10 +3000,10 @@ CipherBase::UpdateResult CipherBase::Update(const char* data,
29803000// on first update:
29813001if (kind_ == kDecipher && IsAuthenticatedMode () && auth_tag_len_ > 0 &&
29823002 auth_tag_len_ != kNoAuthTagLength && !auth_tag_set_){
2983- EVP_CIPHER_CTX_ctrl (ctx_.get (),
2984- EVP_CTRL_GCM_SET_TAG,
2985- auth_tag_len_,
2986- reinterpret_cast <unsigned char *>(auth_tag_));
3003+ CHECK ( EVP_CIPHER_CTX_ctrl (ctx_.get (),
3004+ EVP_CTRL_GCM_SET_TAG,
3005+ auth_tag_len_,
3006+ reinterpret_cast <unsigned char *>(auth_tag_) ));
29873007 auth_tag_set_ = true ;
29883008 }
29893009
@@ -3061,6 +3081,7 @@ void CipherBase::Update(const FunctionCallbackInfo<Value>& args){
30613081bool CipherBase::SetAutoPadding (bool auto_padding){
30623082if (!ctx_)
30633083return false ;
3084+ MarkPopErrorOnReturn mark_pop_error_on_return;
30643085return EVP_CIPHER_CTX_set_padding (ctx_.get (), auto_padding);
30653086}
30663087
0 commit comments