|  | @@ -64,22 +64,16 @@ bool CCrypter::Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned
 | 
	
		
			
				|  |  |      int nCLen = nLen + AES_BLOCK_SIZE, nFLen = 0;
 | 
	
		
			
				|  |  |      vchCiphertext = std::vector<unsigned char> (nCLen);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    EVP_CIPHER_CTX *ctx;
 | 
	
		
			
				|  |  | +    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
 | 
	
		
			
				|  |  | +    if (!ctx) return false;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      bool fOk = true;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/*    EVP_CIPHER_CTX_init(&ctx);
 | 
	
		
			
				|  |  | -    if (fOk) fOk = EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);
 | 
	
		
			
				|  |  | -    if (fOk) fOk = EVP_EncryptUpdate(&ctx, &vchCiphertext[0], &nCLen, &vchPlaintext[0], nLen);
 | 
	
		
			
				|  |  | -    if (fOk) fOk = EVP_EncryptFinal_ex(&ctx, (&vchCiphertext[0])+nCLen, &nFLen);
 | 
	
		
			
				|  |  | -    EVP_CIPHER_CTX_cleanup(&ctx);
 | 
	
		
			
				|  |  | -*/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    EVP_CIPHER_CTX_init(ctx);
 | 
	
		
			
				|  |  |      if (fOk) fOk = EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);
 | 
	
		
			
				|  |  |      if (fOk) fOk = EVP_EncryptUpdate(ctx, &vchCiphertext[0], &nCLen, &vchPlaintext[0], nLen);
 | 
	
		
			
				|  |  | -    if (fOk) fOk = EVP_EncryptFinal_ex(ctx, (&vchCiphertext[0])+nCLen, &nFLen);
 | 
	
		
			
				|  |  | -    EVP_CIPHER_CTX_cleanup(ctx);
 | 
	
		
			
				|  |  | +    if (fOk) fOk = EVP_EncryptFinal_ex(ctx, &vchCiphertext[nCLen], &nFLen);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    EVP_CIPHER_CTX_free(ctx); // Free the context regardless of the outcome
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if (!fOk) return false;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -97,24 +91,16 @@ bool CCrypter::Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingM
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      vchPlaintext = CKeyingMaterial(nPLen);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    //EVP_CIPHER_CTX ctx;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
 | 
	
		
			
				|  |  | +    if (!ctx) return false;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      bool fOk = true;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/*    EVP_CIPHER_CTX_init(&ctx);
 | 
	
		
			
				|  |  | -    if (fOk) fOk = EVP_DecryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);
 | 
	
		
			
				|  |  | -    if (fOk) fOk = EVP_DecryptUpdate(&ctx, &vchPlaintext[0], &nPLen, &vchCiphertext[0], nLen);
 | 
	
		
			
				|  |  | -    if (fOk) fOk = EVP_DecryptFinal_ex(&ctx, (&vchPlaintext[0])+nPLen, &nFLen);
 | 
	
		
			
				|  |  | -    EVP_CIPHER_CTX_cleanup(&ctx);
 | 
	
		
			
				|  |  | -*/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    EVP_CIPHER_CTX_init(ctx);
 | 
	
		
			
				|  |  |      if (fOk) fOk = EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);
 | 
	
		
			
				|  |  |      if (fOk) fOk = EVP_DecryptUpdate(ctx, &vchPlaintext[0], &nPLen, &vchCiphertext[0], nLen);
 | 
	
		
			
				|  |  | -    if (fOk) fOk = EVP_DecryptFinal_ex(ctx, (&vchPlaintext[0])+nPLen, &nFLen);
 | 
	
		
			
				|  |  | -    EVP_CIPHER_CTX_cleanup(ctx);
 | 
	
		
			
				|  |  | +    if (fOk) fOk = EVP_DecryptFinal_ex(ctx, &vchPlaintext[nPLen], &nFLen);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    EVP_CIPHER_CTX_free(ctx); // Free the context regardless of the outcome
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if (!fOk) return false;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -122,7 +108,6 @@ bool CCrypter::Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingM
 | 
	
		
			
				|  |  |      return true;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  bool EncryptSecret(CKeyingMaterial& vMasterKey, const CSecret &vchPlaintext, const uint256& nIV, std::vector<unsigned char> &vchCiphertext)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      CCrypter cKeyCrypter;
 | 
	
	
		
			
				|  | @@ -142,3 +127,4 @@ bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned
 | 
	
		
			
				|  |  |          return false;
 | 
	
		
			
				|  |  |      return cKeyCrypter.Decrypt(vchCiphertext, *((CKeyingMaterial*)&vchPlaintext));
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 |