diff options
Diffstat (limited to 'CPP/7zip/Crypto/AES/MyAES.cpp')
-rwxr-xr-x | CPP/7zip/Crypto/AES/MyAES.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/CPP/7zip/Crypto/AES/MyAES.cpp b/CPP/7zip/Crypto/AES/MyAES.cpp new file mode 100755 index 00000000..359caa25 --- /dev/null +++ b/CPP/7zip/Crypto/AES/MyAES.cpp @@ -0,0 +1,94 @@ +// 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); } |