aes/crypt.hpp

77 行
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