1*f6dc9357SAndroid Build Coastguard Worker // Crypto/Rar5Aes.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_CRYPTO_RAR5_AES_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_CRYPTO_RAR5_AES_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/Sha256.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyBuffer.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #include "MyAes.h" 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker namespace NCrypto { 13*f6dc9357SAndroid Build Coastguard Worker namespace NRar5 { 14*f6dc9357SAndroid Build Coastguard Worker 15*f6dc9357SAndroid Build Coastguard Worker const unsigned kSaltSize = 16; 16*f6dc9357SAndroid Build Coastguard Worker const unsigned kPswCheckSize32 = 2; 17*f6dc9357SAndroid Build Coastguard Worker const unsigned kAesKeySize = 32; 18*f6dc9357SAndroid Build Coastguard Worker 19*f6dc9357SAndroid Build Coastguard Worker namespace NCryptoFlags 20*f6dc9357SAndroid Build Coastguard Worker { 21*f6dc9357SAndroid Build Coastguard Worker const unsigned kPswCheck = 1 << 0; 22*f6dc9357SAndroid Build Coastguard Worker const unsigned kUseMAC = 1 << 1; 23*f6dc9357SAndroid Build Coastguard Worker } 24*f6dc9357SAndroid Build Coastguard Worker 25*f6dc9357SAndroid Build Coastguard Worker struct CKeyBase 26*f6dc9357SAndroid Build Coastguard Worker { 27*f6dc9357SAndroid Build Coastguard Worker protected: 28*f6dc9357SAndroid Build Coastguard Worker UInt32 _key32[kAesKeySize / 4]; 29*f6dc9357SAndroid Build Coastguard Worker UInt32 _hashKey32[SHA256_NUM_DIGEST_WORDS]; 30*f6dc9357SAndroid Build Coastguard Worker UInt32 _check_Calced32[kPswCheckSize32]; 31*f6dc9357SAndroid Build Coastguard Worker WipeCKeyBase32*f6dc9357SAndroid Build Coastguard Worker void Wipe() 33*f6dc9357SAndroid Build Coastguard Worker { 34*f6dc9357SAndroid Build Coastguard Worker memset(this, 0, sizeof(*this)); 35*f6dc9357SAndroid Build Coastguard Worker } 36*f6dc9357SAndroid Build Coastguard Worker CopyCalcedKeysFromCKeyBase37*f6dc9357SAndroid Build Coastguard Worker void CopyCalcedKeysFrom(const CKeyBase &k) 38*f6dc9357SAndroid Build Coastguard Worker { 39*f6dc9357SAndroid Build Coastguard Worker *this = k; 40*f6dc9357SAndroid Build Coastguard Worker } 41*f6dc9357SAndroid Build Coastguard Worker }; 42*f6dc9357SAndroid Build Coastguard Worker 43*f6dc9357SAndroid Build Coastguard Worker struct CKey: public CKeyBase 44*f6dc9357SAndroid Build Coastguard Worker { 45*f6dc9357SAndroid Build Coastguard Worker CByteBuffer _password; 46*f6dc9357SAndroid Build Coastguard Worker bool _needCalc; 47*f6dc9357SAndroid Build Coastguard Worker unsigned _numIterationsLog; 48*f6dc9357SAndroid Build Coastguard Worker Byte _salt[kSaltSize]; 49*f6dc9357SAndroid Build Coastguard Worker IsKeyEqualToCKey50*f6dc9357SAndroid Build Coastguard Worker bool IsKeyEqualTo(const CKey &key) 51*f6dc9357SAndroid Build Coastguard Worker { 52*f6dc9357SAndroid Build Coastguard Worker return _numIterationsLog == key._numIterationsLog 53*f6dc9357SAndroid Build Coastguard Worker && memcmp(_salt, key._salt, sizeof(_salt)) == 0 54*f6dc9357SAndroid Build Coastguard Worker && _password == key._password; 55*f6dc9357SAndroid Build Coastguard Worker } 56*f6dc9357SAndroid Build Coastguard Worker 57*f6dc9357SAndroid Build Coastguard Worker CKey(); 58*f6dc9357SAndroid Build Coastguard Worker ~CKey(); 59*f6dc9357SAndroid Build Coastguard Worker 60*f6dc9357SAndroid Build Coastguard Worker void Wipe(); 61*f6dc9357SAndroid Build Coastguard Worker 62*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_CPP_IS_SUPPORTED_default 63*f6dc9357SAndroid Build Coastguard Worker // CKey(const CKey &) = default; 64*f6dc9357SAndroid Build Coastguard Worker CKey& operator =(const CKey &) = default; 65*f6dc9357SAndroid Build Coastguard Worker #endif 66*f6dc9357SAndroid Build Coastguard Worker }; 67*f6dc9357SAndroid Build Coastguard Worker 68*f6dc9357SAndroid Build Coastguard Worker 69*f6dc9357SAndroid Build Coastguard Worker class CDecoder Z7_final: 70*f6dc9357SAndroid Build Coastguard Worker public CAesCbcDecoder, 71*f6dc9357SAndroid Build Coastguard Worker public CKey 72*f6dc9357SAndroid Build Coastguard Worker { 73*f6dc9357SAndroid Build Coastguard Worker UInt32 _check32[kPswCheckSize32]; 74*f6dc9357SAndroid Build Coastguard Worker bool _canCheck; 75*f6dc9357SAndroid Build Coastguard Worker UInt64 Flags; 76*f6dc9357SAndroid Build Coastguard Worker IsThereCheck()77*f6dc9357SAndroid Build Coastguard Worker bool IsThereCheck() const { return (Flags & NCryptoFlags::kPswCheck) != 0; } 78*f6dc9357SAndroid Build Coastguard Worker public: 79*f6dc9357SAndroid Build Coastguard Worker Byte _iv[AES_BLOCK_SIZE]; 80*f6dc9357SAndroid Build Coastguard Worker 81*f6dc9357SAndroid Build Coastguard Worker CDecoder(); 82*f6dc9357SAndroid Build Coastguard Worker 83*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMP(Init()) 84*f6dc9357SAndroid Build Coastguard Worker 85*f6dc9357SAndroid Build Coastguard Worker void SetPassword(const Byte *data, size_t size); 86*f6dc9357SAndroid Build Coastguard Worker HRESULT SetDecoderProps(const Byte *data, unsigned size, bool includeIV, bool isService); 87*f6dc9357SAndroid Build Coastguard Worker 88*f6dc9357SAndroid Build Coastguard Worker bool CalcKey_and_CheckPassword(); 89*f6dc9357SAndroid Build Coastguard Worker UseMAC()90*f6dc9357SAndroid Build Coastguard Worker bool UseMAC() const { return (Flags & NCryptoFlags::kUseMAC) != 0; } 91*f6dc9357SAndroid Build Coastguard Worker UInt32 Hmac_Convert_Crc32(UInt32 crc) const; 92*f6dc9357SAndroid Build Coastguard Worker void Hmac_Convert_32Bytes(Byte *data) const; 93*f6dc9357SAndroid Build Coastguard Worker }; 94*f6dc9357SAndroid Build Coastguard Worker 95*f6dc9357SAndroid Build Coastguard Worker }} 96*f6dc9357SAndroid Build Coastguard Worker 97*f6dc9357SAndroid Build Coastguard Worker #endif 98