00001
00002
00003
00004
00005
00006
00007
00008
#include "wvxor.h"
00009
00010
00011
00012 WvXOREncoder::WvXOREncoder(
const void *_key, size_t _keylen) :
00013 keylen(_keylen), keyoff(0)
00014 {
00015 key =
new unsigned char[keylen];
00016 memcpy(key, _key, keylen);
00017 }
00018
00019
00020 WvXOREncoder::~WvXOREncoder()
00021 {
00022
delete[] key;
00023 }
00024
00025
00026 bool WvXOREncoder::_encode(
WvBuf &inbuf,
WvBuf &outbuf,
bool flush)
00027 {
00028 size_t len;
00029
while ((len = inbuf.
optgettable()) != 0)
00030 {
00031
const unsigned char *data = inbuf.
get(len);
00032
unsigned char *out = outbuf.
alloc(len);
00033
00034
00035
while (len-- > 0)
00036 {
00037 *out++ = (*data++) ^ key[keyoff++];
00038 keyoff %= keylen;
00039 }
00040 }
00041
return true;
00042 }
00043
00044
00045
00046 WvXORStream::WvXORStream(
WvStream *_cloned,
00047
const void *_key, size_t _keysize) :
00048
WvEncoderStream(_cloned)
00049 {
00050 readchain.
append(
new WvXOREncoder(_key, _keysize),
true);
00051 writechain.
append(
new WvXOREncoder(_key, _keysize),
true);
00052 }