63 lines
1.4 KiB
C++
63 lines
1.4 KiB
C++
#ifndef _RAR_CRYPT_
|
|
#define _RAR_CRYPT_
|
|
|
|
enum { OLD_DECODE=0,OLD_ENCODE=1,NEW_CRYPT=2 };
|
|
|
|
|
|
struct CryptKeyCacheItem
|
|
{
|
|
#ifndef _SFX_RTL_
|
|
CryptKeyCacheItem()
|
|
{
|
|
*Password=0;
|
|
}
|
|
|
|
~CryptKeyCacheItem()
|
|
{
|
|
memset(AESKey,0,sizeof(AESKey));
|
|
memset(AESInit,0,sizeof(AESInit));
|
|
memset(Password,0,sizeof(Password));
|
|
}
|
|
#endif
|
|
byte AESKey[16],AESInit[16];
|
|
char Password[MAXPASSWORD];
|
|
bool SaltPresent;
|
|
byte Salt[SALT_SIZE];
|
|
bool HandsOffHash;
|
|
};
|
|
|
|
class CryptData
|
|
{
|
|
private:
|
|
void Encode13(byte *Data,uint Count);
|
|
void Decode13(byte *Data,uint Count);
|
|
void Crypt15(byte *Data,uint Count);
|
|
void UpdKeys(byte *Buf);
|
|
void Swap(byte *Ch1,byte *Ch2);
|
|
void SetOldKeys(const char *Password);
|
|
|
|
Rijndael rin;
|
|
|
|
byte SubstTable[256];
|
|
uint Key[4];
|
|
ushort OldKey[4];
|
|
byte PN1,PN2,PN3;
|
|
|
|
byte AESKey[16],AESInit[16];
|
|
|
|
static CryptKeyCacheItem Cache[4];
|
|
static int CachePos;
|
|
public:
|
|
void SetCryptKeys(const char *Password,const byte *Salt,bool Encrypt,bool OldOnly,bool HandsOffHash);
|
|
void SetAV15Encryption();
|
|
void SetCmt13Encryption();
|
|
void EncryptBlock20(byte *Buf);
|
|
void DecryptBlock20(byte *Buf);
|
|
void EncryptBlock(byte *Buf,size_t Size);
|
|
void DecryptBlock(byte *Buf,size_t Size);
|
|
void Crypt(byte *Data,uint Count,int Method);
|
|
static void SetSalt(byte *Salt,int SaltSize);
|
|
};
|
|
|
|
#endif
|