WvStreams
wvxor.cc
00001 /*
00002  * Worldvisions Tunnel Vision Software:
00003  *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
00004  * 
00005  * XOR cryptography abstractions.
00006  * Could use this to implement short one time pads.
00007  */
00008 #include "wvxor.h"
00009 
00010 /***** WvXOREncoder *****/
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         // FIXME: this loop is SLOW! (believe it or not)
00035         while (len-- > 0)
00036         {
00037             *out++ = (*data++) ^ key[keyoff++];
00038             keyoff %= keylen;
00039         }
00040     }
00041     return true;
00042 }
00043 
00044 /***** WvXORStream *****/
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 }