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