Files
Leviathan/Library/Internal/source/cipher/XRc4Cipher.cpp
T
2026-06-01 12:46:52 +02:00

64 lines
1.2 KiB
C++

#include "../../include/cipher/XRc4Cipher.h"
#include "../../include/cipher/rc4_cipher.h"
struct XRC4Cipher::TImpl : public RC4Cipher
{};
XRC4Cipher::XRC4Cipher()
: m_strKey( "Neat & Simple" )
{
m_pImpl = new TImpl();
Clear();
}
XRC4Cipher::~XRC4Cipher()
{
delete m_pImpl;
}
void XRC4Cipher::SetKey( const char* pKey )
{
m_strKey = pKey;
m_pImpl->init( m_strKey.c_str(), 0 );
}
void XRC4Cipher::tryCipher( const void* pSource, void* pTarget, unsigned len )
{
RC4Cipher::State backup;
m_pImpl->saveStateTo( backup );
doCipher( pSource, pTarget, len );
m_pImpl->loadStateFrom( backup );
}
void XRC4Cipher::doCipher( const void* pSource, void* pTarget, unsigned len )
{
m_pImpl->code( reinterpret_cast< const unsigned char* >( pSource ), reinterpret_cast< unsigned char* >( pTarget ), len );
}
void XRC4Cipher::Encode( const void* pSource, void* pTarget, unsigned len, bool bIsPeek )
{
if ( bIsPeek )
tryCipher( pSource, pTarget, len );
else
doCipher( pSource, pTarget, len );
}
void XRC4Cipher::Decode( const void* pSource, void* pTarget, unsigned len, bool bIsPeek )
{
if ( bIsPeek )
tryCipher( pSource, pTarget, len );
else
doCipher( pSource, pTarget, len );
}
void XRC4Cipher::Clear()
{
m_pImpl->init( m_strKey.c_str(), 0 );
}