124 lines
2.7 KiB
C++
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;
|
|
}
|