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 39class MD5Sum; 40 41class RC4_Key_Struct 42{ 43public: 44 uint8 abyState[256]; 45 uint8 byX; 46 uint8 byY; 47 48public: 49 RC4_Key_Struct() {} 50 ~RC4_Key_Struct() {} 51}; 52 53 54class CRC4EncryptableBuffer : public CMemFile 55{ 56public: 57 // Create, empty 58 CRC4EncryptableBuffer(); 59 60 // Clear memory 61 ~CRC4EncryptableBuffer(); 62 63 // Appends to the end, checking encrypted state. 64 void Append(const uint8* buffer, int n); 65 66 // Sets the encryption key 67 void SetKey(const MD5Sum& keyhash, bool bSkipDiscard = false); 68 69 // RC4 encrypts the internal buffer. Marks it as encrypted, any other further call 70 // to add data, as Append(), must assert if the inner data is encrypted. 71 // Make sure to check SetKey has been called! 72 void Encrypt(); 73 74 // RC4 encrypts an external buffer with the current key. 75 void RC4Crypt(const uint8 *pachIn, uint8 *pachOut, uint32 nLen); 76 77 // Returns a uint8* buffer with a copy of the internal data, and clears the internal one. 78 uint8* Detach(); 79 80 // Also clears the encryption flag 81 void ResetData(); 82 83 // Resets everything, as if the object has just been created. 84 void FullReset(); 85 86private: 87 bool m_encrypted; 88 bool m_hasKey; 89 RC4_Key_Struct m_key; 90 91 void RC4CreateKey(const uint8* pachKeyData, uint32 nLen, bool bSkipDiscard); 92}; 93 94#endif // __RC4ENCRYPT_H__ 95