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 deletev 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 }