Files
2026-06-01 12:46:52 +02:00

124 lines
2.7 KiB
C++

#include <openssl/aes.h>
#include "../../include/cipher/XAES128cbc.h"
XAES128cbc::XAES128cbc()
{
EVP_CIPHER_CTX_init( &m_EnCTX );
EVP_CIPHER_CTX_init( &m_DnCTX );
}
XAES128cbc::~XAES128cbc()
{
EVP_CIPHER_CTX_cleanup( &m_EnCTX );
EVP_CIPHER_CTX_cleanup( &m_DnCTX );
}
bool XAES128cbc::Initialize( const unsigned char* pKey, const unsigned char* pIV )
{
if( pKey == NULL || pIV == NULL )
{
return false;
}
if( !EVP_EncryptInit_ex( &m_EnCTX, EVP_aes_128_cbc(), NULL, pKey, pIV ) )
{
return false;
}
if( !EVP_DecryptInit_ex( &m_DnCTX, EVP_aes_128_cbc(), NULL, pKey, pIV ) )
{
return false;
}
return true;
}
bool XAES128cbc::Initialize( const XAES_128_CBC_KEY& Key )
{
return Initialize( Key.byKey, Key.byIV );
}
size_t XAES128cbc::GetNeedEncryptSize( size_t nSrcSize ) const
{
return ((nSrcSize/AES_BLOCK_SIZE) + 1) * AES_BLOCK_SIZE;
}
bool XAES128cbc::Encrypt( const void* pSrc, size_t nSrcSize, void* pDest, size_t nDestSize, size_t* pEnSize )
{
if( pSrc == NULL || pDest == NULL || pEnSize == NULL )
{
return false;
}
size_t nNeedSize = GetNeedEncryptSize( nSrcSize );
if( nNeedSize > nDestSize )
{
return false;
}
const unsigned char* pIn = static_cast< const unsigned char* >( pSrc );
unsigned char* pOut = static_cast< unsigned char* >( pDest );
if( !EVP_EncryptInit_ex( &m_EnCTX, NULL, NULL, NULL, NULL ) )
{
return false;
}
int nOutSize = 0;
if( !EVP_EncryptUpdate( &m_EnCTX, pOut, &nOutSize, pIn, static_cast< int >( nSrcSize ) ) )
{
return false;
}
int nFinalSize = 0;
if( !EVP_EncryptFinal_ex( &m_EnCTX, pOut + nOutSize, &nFinalSize ) )
{
return false;
}
*pEnSize = nOutSize + nFinalSize;
return true;
}
bool XAES128cbc::Decrypt( const void* pSrc, size_t nSrcSize, void* pDest, size_t nDestSize, size_t* pDeSize )
{
if( pSrc == NULL || pDest == NULL || pDeSize == NULL )
{
return false;
}
// decrypt 할때는 암호화되기 전 사이즈보다 크다면 성공이지만,
// 암호화 되기 전 사이즈를 모르고 openssl은 dest 버퍼의 사이즈를 고려안해
// 버퍼 오버플로우가 발생하니 안전하게 가자.
if( nSrcSize > nDestSize )
{
return false;
}
const unsigned char* pIn = static_cast< const unsigned char* >( pSrc );
unsigned char* pOut = static_cast< unsigned char* >( pDest );
if( !EVP_DecryptInit_ex( &m_DnCTX, NULL, NULL, NULL, NULL ) )
{
return false;
}
int nOutSize = 0;
if( !EVP_DecryptUpdate( &m_DnCTX, pOut, &nOutSize, pIn, static_cast< int >( nSrcSize ) ) )
{
return false;
}
int nFinalSize = 0;
if( !EVP_DecryptFinal_ex( &m_DnCTX, pOut + nOutSize, &nFinalSize ) )
{
return false;
}
*pDeSize = nOutSize + nFinalSize;
return true;
}