00001
00032 #include "linden_common.h"
00033
00034 #include "llxorcipher.h"
00035
00036 #include "llerror.h"
00037
00041
00042 LLXORCipher::LLXORCipher(const U8* pad, U32 pad_len) :
00043 mPad(NULL),
00044 mHead(NULL),
00045 mPadLen(0)
00046 {
00047 init(pad, pad_len);
00048 }
00049
00050
00051 LLXORCipher::~LLXORCipher()
00052 {
00053 init(NULL, 0);
00054 }
00055
00056 LLXORCipher::LLXORCipher(const LLXORCipher& cipher) :
00057 mPad(NULL),
00058 mHead(NULL),
00059 mPadLen(0)
00060 {
00061 init(cipher.mPad, cipher.mPadLen);
00062 }
00063
00064 LLXORCipher& LLXORCipher::operator=(const LLXORCipher& cipher)
00065 {
00066 if(this == &cipher) return *this;
00067 init(cipher.mPad, cipher.mPadLen);
00068 return *this;
00069 }
00070
00071 U32 LLXORCipher::encrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len)
00072 {
00073 if(!src || !src_len || !dst || !dst_len || !mPad) return 0;
00074 U8* pad_end = mPad + mPadLen;
00075 U32 count = src_len;
00076 while(count--)
00077 {
00078 *dst++ = *src++ ^ *mHead++;
00079 if(mHead >= pad_end) mHead = mPad;
00080 }
00081 return src_len;
00082 }
00083
00084 U32 LLXORCipher::decrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len)
00085 {
00086
00087 return encrypt(src, src_len, dst, dst_len);
00088 }
00089
00090 U32 LLXORCipher::requiredEncryptionSpace(U32 len) const
00091 {
00092 return len;
00093 }
00094
00095 void LLXORCipher::init(const U8* pad, U32 pad_len)
00096 {
00097 if(mPad)
00098 {
00099 delete [] mPad;
00100 mPad = NULL;
00101 mPadLen = 0;
00102 }
00103 if(pad && pad_len)
00104 {
00105 mPadLen = pad_len;
00106 mPad = new U8[mPadLen];
00107 if (mPad != NULL)
00108 {
00109 memcpy(mPad, pad, mPadLen);
00110 }
00111 }
00112 mHead = mPad;
00113 }
00114
00115 #ifdef _DEBUG
00116
00117 BOOL LLXORCipher::testHarness()
00118 {
00119 const U32 PAD_LEN = 3;
00120 const U8 PAD[] = "abc";
00121 const S32 MSG_LENGTH = 12;
00122 const char MESSAGE[MSG_LENGTH+1] = "gesundheight";
00123 U8 encrypted[MSG_LENGTH];
00124 U8 decrypted[MSG_LENGTH];
00125
00126 LLXORCipher cipher(PAD, PAD_LEN);
00127 cipher.encrypt((U8*)MESSAGE, MSG_LENGTH, encrypted, MSG_LENGTH);
00128 cipher.decrypt(encrypted, MSG_LENGTH, decrypted, MSG_LENGTH);
00129
00130 if(0 != memcmp((void*)MESSAGE, decrypted, MSG_LENGTH)) return FALSE;
00131 return TRUE;
00132 }
00133 #endif