#ifndef _DECRYPT #define _DECRYPT #include "aes.hpp" class decrypt : public aes { private: EVP_CIPHER_CTX* aesDecryptCtx; public: decrypt(std::string filename); decrypt(const aes& a); void init_all(); int aesDecrypt(unsigned char *encMsg, size_t encMsgLen, unsigned char **decMsg); ~decrypt(); }; decrypt::decrypt(std::string filename) : aes(filename) { aesDecryptCtx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX)); if(aesDecryptCtx == NULL) { exit(FAILURE); } init_all(); } decrypt::decrypt(const aes& _a) : aes(_a) { aesDecryptCtx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX)); if(aesDecryptCtx == NULL) { exit(FAILURE); } *aesDecryptCtx = (*(static_cast(_a)).aesDecryptCtx); } void decrypt::init_all() { aes::init_all(); EVP_CIPHER_CTX_init(aesDecryptCtx); } int decrypt::aesDecrypt(unsigned char *encMsg, size_t encMsgLen, unsigned char **decMsg) { size_t decLen = 0; size_t blockLen = 0; *decMsg = (unsigned char*)malloc(encMsgLen); if(*decMsg == NULL) return FAILURE; if(!EVP_DecryptInit_ex(aesDecryptCtx, EVP_aes_256_cbc(), NULL, aes::aesKey, aes::aesIV)) { return FAILURE; } if(!EVP_DecryptUpdate(aesDecryptCtx, (unsigned char*)*decMsg, (int*)&blockLen, encMsg, (int)encMsgLen)) { return FAILURE; } decLen += blockLen; if(!EVP_DecryptFinal_ex(aesDecryptCtx, (unsigned char*)*decMsg + decLen, (int*)&blockLen)) { return FAILURE; } decLen += blockLen; EVP_CIPHER_CTX_cleanup(aesDecryptCtx); return (int)decLen; } decrypt::~decrypt() { aes::clear_all(); EVP_CIPHER_CTX_cleanup(aesDecryptCtx); free(aesDecryptCtx); } #endif