diff options
author | Vadim Dashevskiy <watcherhd@gmail.com> | 2012-05-15 10:38:20 +0000 |
---|---|---|
committer | Vadim Dashevskiy <watcherhd@gmail.com> | 2012-05-15 10:38:20 +0000 |
commit | 48540940b6c28bb4378abfeb500ec45a625b37b6 (patch) | |
tree | 2ef294c0763e802f91d868bdef4229b6868527de /plugins/CryptoPP/crypto/arc4.cpp | |
parent | 5c350913f011e119127baeb32a6aedeb4f0d33bc (diff) |
initial commit
git-svn-id: http://svn.miranda-ng.org/main/trunk@2 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/CryptoPP/crypto/arc4.cpp')
-rw-r--r-- | plugins/CryptoPP/crypto/arc4.cpp | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/plugins/CryptoPP/crypto/arc4.cpp b/plugins/CryptoPP/crypto/arc4.cpp new file mode 100644 index 0000000000..ff9d587712 --- /dev/null +++ b/plugins/CryptoPP/crypto/arc4.cpp @@ -0,0 +1,120 @@ +// arc4.cpp - written and placed in the public domain by Wei Dai
+
+// The ARC4 algorithm was first revealed in an anonymous email to the
+// cypherpunks mailing list. This file originally contained some
+// code copied from this email. The code has since been rewritten in order
+// to clarify the copyright status of this file. It should now be
+// completely in the public domain.
+
+#include "pch.h"
+#define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1
+#include "arc4.h"
+
+NAMESPACE_BEGIN(CryptoPP)
+namespace Weak1 {
+
+void ARC4_TestInstantiations()
+{
+ ARC4 x;
+}
+
+ARC4_Base::~ARC4_Base()
+{
+ m_x = m_y = 0;
+}
+
+void ARC4_Base::UncheckedSetKey(const byte *key, unsigned int keyLen, const NameValuePairs ¶ms)
+{
+ AssertValidKeyLength(keyLen);
+
+ m_x = 1;
+ m_y = 0;
+
+ unsigned int i;
+ for (i=0; i<256; i++)
+ m_state[i] = i;
+
+ unsigned int keyIndex = 0, stateIndex = 0;
+ for (i=0; i<256; i++)
+ {
+ unsigned int a = m_state[i];
+ stateIndex += key[keyIndex] + a;
+ stateIndex &= 0xff;
+ m_state[i] = m_state[stateIndex];
+ m_state[stateIndex] = a;
+ if (++keyIndex >= keyLen)
+ keyIndex = 0;
+ }
+
+ int discardBytes = params.GetIntValueWithDefault("DiscardBytes", GetDefaultDiscardBytes());
+ DiscardBytes(discardBytes);
+}
+
+template <class T>
+static inline unsigned int MakeByte(T &x, T &y, byte *s)
+{
+ unsigned int a = s[x];
+ y = (y+a) & 0xff;
+ unsigned int b = s[y];
+ s[x] = b;
+ s[y] = a;
+ x = (x+1) & 0xff;
+ return s[(a+b) & 0xff];
+}
+
+void ARC4_Base::GenerateBlock(byte *output, size_t size)
+{
+ while (size--)
+ *output++ = MakeByte(m_x, m_y, m_state);
+}
+
+void ARC4_Base::ProcessData(byte *outString, const byte *inString, size_t length)
+{
+ if (length == 0)
+ return;
+
+ byte *const s = m_state;
+ unsigned int x = m_x;
+ unsigned int y = m_y;
+
+ if (inString == outString)
+ {
+ do
+ {
+ *outString++ ^= MakeByte(x, y, s);
+ } while (--length);
+ }
+ else
+ {
+ do
+ {
+ *outString++ = *inString++ ^ MakeByte(x, y, s);
+ }
+ while(--length);
+ }
+
+ m_x = x;
+ m_y = y;
+}
+
+void ARC4_Base::DiscardBytes(size_t length)
+{
+ if (length == 0)
+ return;
+
+ byte *const s = m_state;
+ unsigned int x = m_x;
+ unsigned int y = m_y;
+
+ do
+ {
+ MakeByte(x, y, s);
+ }
+ while(--length);
+
+ m_x = x;
+ m_y = y;
+}
+
+}
+NAMESPACE_END
|