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