Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/Crypto/AES/MyAES.cpp')
-rwxr-xr-xCPP/7zip/Crypto/AES/MyAES.cpp94
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); }