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/Rar20/Rar20Cipher.cpp')
-rwxr-xr-xCPP/7zip/Crypto/Rar20/Rar20Cipher.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/CPP/7zip/Crypto/Rar20/Rar20Cipher.cpp b/CPP/7zip/Crypto/Rar20/Rar20Cipher.cpp
new file mode 100755
index 00000000..27ccc493
--- /dev/null
+++ b/CPP/7zip/Crypto/Rar20/Rar20Cipher.cpp
@@ -0,0 +1,76 @@
+// Crypto/Rar20Cipher.cpp
+
+#include "StdAfx.h"
+
+#include "Rar20Cipher.h"
+#include "Windows/Defs.h"
+
+namespace NCrypto {
+namespace NRar20 {
+
+static const int kBufferSize = 1 << 17;
+
+STDMETHODIMP CDecoder::CryptoSetPassword(const Byte *data, UInt32 size)
+{
+ _coder.SetPassword(data, size);
+ return S_OK;
+}
+
+STDMETHODIMP CDecoder::Init()
+{
+ return S_OK;
+}
+
+STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size)
+{
+ const UInt16 kBlockSize = 16;
+ if (size > 0 && size < kBlockSize)
+ return kBlockSize;
+ UInt32 i;
+ for (i = 0; i + kBlockSize <= size; i += kBlockSize)
+ {
+ _coder.DecryptBlock(data + i);
+ }
+ return i;
+}
+
+/*
+STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream,
+ ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
+ ICompressProgressInfo *progress)
+{
+ UInt64 nowPos = 0;
+ UInt32 bufferPos = 0;
+ UInt32 processedSize;
+ for (;;)
+ {
+ UInt32 size = kBufferSize - bufferPos;
+ RINOK(inStream->Read(_buffer + bufferPos, size, &processedSize));
+
+ UInt32 anEndPos = bufferPos + processedSize;
+ for (;bufferPos + 16 <= anEndPos; bufferPos += 16)
+ _coder.DecryptBlock(_buffer + bufferPos);
+
+ if (bufferPos == 0)
+ return S_OK;
+
+ if (outSize != NULL && nowPos + bufferPos > *outSize)
+ bufferPos = UInt32(*outSize - nowPos);
+
+ RINOK(outStream->Write(_buffer, bufferPos, &processedSize));
+ if (bufferPos != processedSize)
+ return E_FAIL;
+
+ nowPos += processedSize;
+ if (outSize != NULL && nowPos == *outSize)
+ return S_OK;
+
+ int i = 0;
+ while(bufferPos < anEndPos)
+ _buffer[i++] = _buffer[bufferPos++];
+ bufferPos = i;
+ }
+}
+*/
+
+}}