77 lines
1.8 KiB
C++
77 lines
1.8 KiB
C++
#ifndef _CRYPT
|
|
#define _CRYPT
|
|
|
|
#include "aes.hpp"
|
|
|
|
class crypt : public aes {
|
|
private:
|
|
EVP_CIPHER_CTX* aesEncryptCtx;
|
|
|
|
public:
|
|
crypt(std::string filename);
|
|
crypt(const crypt& a);
|
|
void init_all();
|
|
int aesEncrypt(const unsigned char *msg, size_t msgLen, unsigned char **encMsg);
|
|
~crypt();
|
|
};
|
|
|
|
crypt::crypt(std::string filename) : aes(filename) {
|
|
aesEncryptCtx = EVP_CIPHER_CTX_new();
|
|
//aesEncryptCtx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX));
|
|
if(aesEncryptCtx == NULL) {
|
|
exit(FAILURE);
|
|
}
|
|
init_all();
|
|
}
|
|
|
|
crypt::crypt(const crypt& _a) : aes::aes() {
|
|
this->clone(_a);
|
|
aesEncryptCtx = EVP_CIPHER_CTX_new();
|
|
//aesEncryptCtx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX));
|
|
if(aesEncryptCtx == NULL) {
|
|
exit(FAILURE);
|
|
}
|
|
|
|
int res = EVP_CIPHER_CTX_copy(aesEncryptCtx, _a.aesEncryptCtx);
|
|
if(!res)
|
|
exit(FAILURE);
|
|
}
|
|
|
|
void crypt::init_all() {
|
|
setExtension(".enc");
|
|
aes::init_all();
|
|
EVP_CIPHER_CTX_init(aesEncryptCtx);
|
|
}
|
|
|
|
int crypt::aesEncrypt(const unsigned char *msg, size_t msgLen, unsigned char **encMsg) {
|
|
size_t blockLen = 0;
|
|
size_t encMsgLen = 0;
|
|
|
|
*encMsg = (unsigned char*)malloc(msgLen + AES_BLOCK_SIZE);
|
|
if(encMsg == NULL) return FAILURE;
|
|
|
|
if(!EVP_EncryptInit_ex(aesEncryptCtx, EVP_aes_256_cbc(), NULL, aes::aesKey, aes::aesIV)) {
|
|
return FAILURE;
|
|
}
|
|
|
|
if(!EVP_EncryptUpdate(aesEncryptCtx, *encMsg, (int*)&blockLen, (unsigned char*)msg, msgLen)) {
|
|
return FAILURE;
|
|
}
|
|
encMsgLen += blockLen;
|
|
|
|
if(!EVP_EncryptFinal_ex(aesEncryptCtx, *encMsg + encMsgLen, (int*)&blockLen)) {
|
|
return FAILURE;
|
|
}
|
|
|
|
return encMsgLen + blockLen;
|
|
}
|
|
|
|
crypt::~crypt() {
|
|
aes::clear_all();
|
|
EVP_CIPHER_CTX_cleanup(aesEncryptCtx);
|
|
EVP_CIPHER_CTX_free(aesEncryptCtx);
|
|
//free(aesEncryptCtx);
|
|
}
|
|
|
|
#endif
|