llxorcipher.cpp

Go to the documentation of this file.
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 // Destroys the object
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         // xor is a symetric cipher, thus, just call the other function.
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); /* Flawfinder : ignore */
00110                 }
00111         }
00112         mHead = mPad;
00113 }
00114 
00115 #ifdef _DEBUG
00116 // static
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";              /* Flawfinder : ignore */
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

Generated on Thu Jul 1 06:09:49 2010 for Second Life Viewer by  doxygen 1.4.7