123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #ifndef _RAR_CRYPT_
- #define _RAR_CRYPT_
- enum CRYPT_METHOD {
- CRYPT_NONE,CRYPT_RAR13,CRYPT_RAR15,CRYPT_RAR20,CRYPT_RAR30,CRYPT_RAR50
- };
- #define SIZE_SALT50 16
- #define SIZE_SALT30 8
- #define SIZE_INITV 16
- #define SIZE_PSWCHECK 8
- #define SIZE_PSWCHECK_CSUM 4
- #define CRYPT_BLOCK_SIZE 16
- #define CRYPT_BLOCK_MASK (CRYPT_BLOCK_SIZE-1) // 0xf
- #define CRYPT5_KDF_LG2_COUNT 15 // LOG2 of PDKDF2 iteration count.
- #define CRYPT5_KDF_LG2_COUNT_MAX 24 // LOG2 of maximum accepted iteration count.
- #define CRYPT_VERSION 0 // Supported encryption version.
- class CryptData
- {
- struct KDF5CacheItem
- {
- SecPassword Pwd;
- byte Salt[SIZE_SALT50];
- byte Key[32];
- uint Lg2Count; // Log2 of PBKDF2 repetition count.
- byte PswCheckValue[SHA256_DIGEST_SIZE];
- byte HashKeyValue[SHA256_DIGEST_SIZE];
- };
- struct KDF3CacheItem
- {
- SecPassword Pwd;
- byte Salt[SIZE_SALT30];
- byte Key[16];
- byte Init[16];
- bool SaltPresent;
- };
- private:
- void SetKey13(const char *Password);
- void Decrypt13(byte *Data,size_t Count);
- void SetKey15(const char *Password);
- void Crypt15(byte *Data,size_t Count);
- void SetKey20(const char *Password);
- void Swap20(byte *Ch1,byte *Ch2);
- void UpdKeys20(byte *Buf);
- void EncryptBlock20(byte *Buf);
- void DecryptBlock20(byte *Buf);
- void SetKey30(bool Encrypt,SecPassword *Password,const wchar *PwdW,const byte *Salt);
- void SetKey50(bool Encrypt,SecPassword *Password,const wchar *PwdW,const byte *Salt,const byte *InitV,uint Lg2Cnt,byte *HashKey,byte *PswCheck);
- KDF3CacheItem KDF3Cache[4];
- uint KDF3CachePos;
-
- KDF5CacheItem KDF5Cache[4];
- uint KDF5CachePos;
- CRYPT_METHOD Method;
- Rijndael rin;
- uint CRCTab[256]; // For RAR 1.5 and RAR 2.0 encryption.
-
- byte SubstTable20[256];
- uint Key20[4];
- byte Key13[3];
- ushort Key15[4];
- public:
- CryptData();
- ~CryptData();
- bool SetCryptKeys(bool Encrypt,CRYPT_METHOD Method,SecPassword *Password,
- const byte *Salt,const byte *InitV,uint Lg2Cnt,
- byte *HashKey,byte *PswCheck);
- void SetAV15Encryption();
- void SetCmt13Encryption();
- void EncryptBlock(byte *Buf,size_t Size);
- void DecryptBlock(byte *Buf,size_t Size);
- static void SetSalt(byte *Salt,size_t SaltSize);
- };
- void GetRnd(byte *RndBuf,size_t BufSize);
- void hmac_sha256(const byte *Key,size_t KeyLength,const byte *Data,
- size_t DataLength,byte *ResDigest);
- void pbkdf2(const byte *pass, size_t pass_len, const byte *salt,
- size_t salt_len,byte *key, byte *Value1, byte *Value2,
- uint rounds);
- void ConvertHashToMAC(HashValue *Value,byte *Key);
- #endif
|