diff options
author | lloyd <[email protected]> | 2008-11-08 19:46:52 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2008-11-08 19:46:52 +0000 |
commit | f1c459725da56fd8ed5766e7779300182fa26bcf (patch) | |
tree | 32295cec92df1155563ae8a535dc695d6800d7f6 /src/stream/arc4 | |
parent | 8dba7b5264403e781bbb86ff61850e4377dca7b9 (diff) |
Split ciphers into block and stream ciphers. Move base class headers
Diffstat (limited to 'src/stream/arc4')
-rw-r--r-- | src/stream/arc4/arc4.cpp | 103 | ||||
-rw-r--r-- | src/stream/arc4/arc4.h | 39 | ||||
-rw-r--r-- | src/stream/arc4/info.txt | 14 |
3 files changed, 156 insertions, 0 deletions
diff --git a/src/stream/arc4/arc4.cpp b/src/stream/arc4/arc4.cpp new file mode 100644 index 000000000..238567cdc --- /dev/null +++ b/src/stream/arc4/arc4.cpp @@ -0,0 +1,103 @@ +/************************************************* +* ARC4 Source File * +* (C) 1999-2007 Jack Lloyd * +*************************************************/ + +#include <botan/arc4.h> +#include <botan/xor_buf.h> +#include <botan/parsing.h> + +namespace Botan { + +/************************************************* +* Combine cipher stream with message * +*************************************************/ +void ARC4::cipher(const byte in[], byte out[], u32bit length) + { + while(length >= buffer.size() - position) + { + xor_buf(out, in, buffer.begin() + position, buffer.size() - position); + length -= (buffer.size() - position); + in += (buffer.size() - position); + out += (buffer.size() - position); + generate(); + } + xor_buf(out, in, buffer.begin() + position, length); + position += length; + } + +/************************************************* +* Generate cipher stream * +*************************************************/ +void ARC4::generate() + { + u32bit SX, SY; + for(u32bit j = 0; j != buffer.size(); j += 4) + { + SX = state[X+1]; Y = (Y + SX) % 256; SY = state[Y]; + state[X+1] = SY; state[Y] = SX; + buffer[j] = state[(SX + SY) % 256]; + + SX = state[X+2]; Y = (Y + SX) % 256; SY = state[Y]; + state[X+2] = SY; state[Y] = SX; + buffer[j+1] = state[(SX + SY) % 256]; + + SX = state[X+3]; Y = (Y + SX) % 256; SY = state[Y]; + state[X+3] = SY; state[Y] = SX; + buffer[j+2] = state[(SX + SY) % 256]; + + X = (X + 4) % 256; + SX = state[X]; Y = (Y + SX) % 256; SY = state[Y]; + state[X] = SY; state[Y] = SX; + buffer[j+3] = state[(SX + SY) % 256]; + } + position = 0; + } + +/************************************************* +* ARC4 Key Schedule * +*************************************************/ +void ARC4::key(const byte key[], u32bit length) + { + clear(); + for(u32bit j = 0; j != 256; ++j) + state[j] = j; + for(u32bit j = 0, state_index = 0; j != 256; ++j) + { + state_index = (state_index + key[j % length] + state[j]) % 256; + std::swap(state[j], state[state_index]); + } + for(u32bit j = 0; j <= SKIP; j += buffer.size()) + generate(); + position += (SKIP % buffer.size()); + } + +/************************************************* +* Return the name of this type * +*************************************************/ +std::string ARC4::name() const + { + if(SKIP == 0) return "ARC4"; + if(SKIP == 256) return "MARK-4"; + else return "RC4_skip(" + to_string(SKIP) + ")"; + } + +/************************************************* +* Clear memory of sensitive data * +*************************************************/ +void ARC4::clear() throw() + { + state.clear(); + buffer.clear(); + position = X = Y = 0; + } + +/************************************************* +* ARC4 Constructor * +*************************************************/ +ARC4::ARC4(u32bit s) : StreamCipher(1, 256), SKIP(s) + { + clear(); + } + +} diff --git a/src/stream/arc4/arc4.h b/src/stream/arc4/arc4.h new file mode 100644 index 000000000..0976ce7ea --- /dev/null +++ b/src/stream/arc4/arc4.h @@ -0,0 +1,39 @@ +/************************************************* +* ARC4 Header File * +* (C) 1999-2008 Jack Lloyd * +*************************************************/ + +#ifndef BOTAN_ARC4_H__ +#define BOTAN_ARC4_H__ + +#include <botan/stream_cipher.h> +#include <botan/types.h> + +namespace Botan { + +/************************************************* +* ARC4 * +*************************************************/ +class BOTAN_DLL ARC4 : public StreamCipher + { + public: + void clear() throw(); + std::string name() const; + StreamCipher* clone() const { return new ARC4(SKIP); } + ARC4(u32bit = 0); + ~ARC4() { clear(); } + private: + void cipher(const byte[], byte[], u32bit); + void key(const byte[], u32bit); + void generate(); + + const u32bit SKIP; + + SecureBuffer<byte, DEFAULT_BUFFERSIZE> buffer; + SecureBuffer<u32bit, 256> state; + u32bit X, Y, position; + }; + +} + +#endif diff --git a/src/stream/arc4/info.txt b/src/stream/arc4/info.txt new file mode 100644 index 000000000..e4689cf69 --- /dev/null +++ b/src/stream/arc4/info.txt @@ -0,0 +1,14 @@ +realname "ARC4" + +define ARC4 + +load_on auto + +<requires> +stream +</requires> + +<add> +arc4.cpp +arc4.h +</add> |