mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-08 12:07:03 -06:00
95 lines
2.4 KiB
C++
Executable File
95 lines
2.4 KiB
C++
Executable File
// Crypto/AES/MyAES.cpp
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "windows.h"
|
|
|
|
#include "MyAES.h"
|
|
#include "Windows/Defs.h"
|
|
|
|
#include "AES_CBC.h"
|
|
|
|
static const int kAESBlockSize = 16;
|
|
|
|
extern "C"
|
|
{
|
|
#include "aesopt.h"
|
|
}
|
|
|
|
class CTabInit
|
|
{
|
|
public:
|
|
CTabInit() { gen_tabs();}
|
|
} g_TabInit;
|
|
|
|
STDMETHODIMP CAESFilter::Init() { return S_OK; }
|
|
|
|
STDMETHODIMP_(UInt32) CAESFilter::Filter(Byte *data, UInt32 size)
|
|
{
|
|
if (size > 0 && size < kAESBlockSize)
|
|
return kAESBlockSize;
|
|
UInt32 i;
|
|
for (i = 0; i + kAESBlockSize <= size; i += kAESBlockSize)
|
|
{
|
|
Byte outBlock[kAESBlockSize];
|
|
SubFilter(data + i, outBlock);
|
|
for (int j = 0; j < kAESBlockSize; j++)
|
|
data[i + j] = outBlock[j];
|
|
}
|
|
return i;
|
|
}
|
|
|
|
STDMETHODIMP CAESFilter::SetInitVector(const Byte *data, UInt32 size)
|
|
{
|
|
if (size != 16)
|
|
return E_INVALIDARG;
|
|
AES.Init(data);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CAESEncoder::SetKey(const Byte *data, UInt32 size)
|
|
{ return (AES.enc_key(data, size) == aes_good) ? S_OK: E_FAIL; }
|
|
|
|
void CAESEncoder::SubFilter(const Byte *inBlock, Byte *outBlock)
|
|
{ AES.Encode(inBlock, outBlock); }
|
|
|
|
STDMETHODIMP CAESDecoder::SetKey(const Byte *data, UInt32 size)
|
|
{ return (AES.dec_key(data, size) == aes_good) ? S_OK: E_FAIL; }
|
|
|
|
void CAESDecoder::SubFilter(const Byte *inBlock, Byte *outBlock)
|
|
{ AES.Decode(inBlock, outBlock); }
|
|
|
|
////////////////////////////
|
|
// ECB mode
|
|
|
|
STDMETHODIMP CAesEcbFilter::Init() { return S_OK; }
|
|
STDMETHODIMP CAesEcbFilter::SetInitVector(const Byte * /* data */, UInt32 size)
|
|
{ return (size == 0) ? S_OK: E_INVALIDARG; }
|
|
|
|
STDMETHODIMP_(UInt32) CAesEcbFilter::Filter(Byte *data, UInt32 size)
|
|
{
|
|
if (size > 0 && size < kAESBlockSize)
|
|
return kAESBlockSize;
|
|
UInt32 i;
|
|
for (i = 0; i + kAESBlockSize <= size; i += kAESBlockSize)
|
|
{
|
|
Byte outBlock[kAESBlockSize];
|
|
SubFilter(data + i, outBlock);
|
|
for (int j = 0; j < kAESBlockSize; j++)
|
|
data[i + j] = outBlock[j];
|
|
}
|
|
return i;
|
|
}
|
|
|
|
STDMETHODIMP CAesEcbEncoder::SetKey(const Byte *data, UInt32 size)
|
|
{ return (AES.enc_key(data, size) == aes_good) ? S_OK: E_FAIL; }
|
|
|
|
void CAesEcbEncoder::SubFilter(const Byte *inBlock, Byte *outBlock)
|
|
{ AES.enc_blk(inBlock, outBlock); }
|
|
|
|
STDMETHODIMP CAesEcbDecoder::SetKey(const Byte *data, UInt32 size)
|
|
{ return (AES.dec_key(data, size) == aes_good) ? S_OK: E_FAIL; }
|
|
|
|
void CAesEcbDecoder::SubFilter(const Byte *inBlock, Byte *outBlock)
|
|
{ AES.dec_blk(inBlock, outBlock); }
|