1 // 2 // This file is part of the aMule Project. 3 // 4 // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) 5 // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) 6 // 7 // Any parts of this program derived from the xMule, lMule or eMule project, 8 // or contributed by third-party developers are copyrighted by their 9 // respective authors. 10 // 11 // This program is free software; you can redistribute it and/or modify 12 // it under the terms of the GNU General Public License as published by 13 // the Free Software Foundation; either version 2 of the License, or 14 // (at your option) any later version. 15 // 16 // This program is distributed in the hope that it will be useful, 17 // but WITHOUT ANY WARRANTY; without even the implied warranty of 18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 // GNU General Public License for more details. 20 // 21 // You should have received a copy of the GNU General Public License 22 // along with this program; if not, write to the Free Software 23 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 24 // 25 26 #ifndef __RC4ENCRYPT_H__ 27 #define __RC4ENCRYPT_H__ 28 29 30 #include <vector> 31 32 33 #include "Types.h" 34 #include <common/StringFunctions.h> 35 #include "MemFile.h" 36 37 // Helper class 38 39 class MD5Sum; 40 41 struct RC4_Key_Struct 42 { 43 uint8 abyState[256]; 44 uint8 byX; 45 uint8 byY; 46 }; 47 48 49 class CRC4EncryptableBuffer : public CMemFile 50 { 51 public: 52 // Create, empty 53 CRC4EncryptableBuffer(); 54 55 // Clear memory 56 ~CRC4EncryptableBuffer(); 57 58 // Appends to the end, checking encrypted state. 59 void Append(const uint8* buffer, int n); 60 61 // Sets the encryption key 62 void SetKey(const MD5Sum& keyhash, bool bSkipDiscard = false); 63 64 // RC4 encrypts the internal buffer. Marks it as encrypted, any other further call 65 // to add data, as Append(), must assert if the inner data is encrypted. 66 // Make sure to check SetKey has been called! 67 void Encrypt(); 68 69 // RC4 encrypts an external buffer with the current key. 70 void RC4Crypt(const uint8 *pachIn, uint8 *pachOut, uint32 nLen); 71 72 // Returns a uint8* buffer with a copy of the internal data, and clears the internal one. 73 uint8* Detach(); 74 75 // Also clears the encryption flag 76 void ResetData(); 77 78 // Resets everything, as if the object has just been created. 79 void FullReset(); 80 81 private: 82 bool m_encrypted; 83 bool m_hasKey; 84 RC4_Key_Struct m_key; 85 86 void RC4CreateKey(const uint8* pachKeyData, uint32 nLen, bool bSkipDiscard); 87 }; 88 89 #endif // __RC4ENCRYPT_H__ 90