1*f6dc9357SAndroid Build Coastguard Worker // 7zAes.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_CRYPTO_7Z_AES_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_CRYPTO_7Z_AES_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyBuffer.h" 7*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h" 8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyVector.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #include "../ICoder.h" 11*f6dc9357SAndroid Build Coastguard Worker #include "../IPassword.h" 12*f6dc9357SAndroid Build Coastguard Worker 13*f6dc9357SAndroid Build Coastguard Worker namespace NCrypto { 14*f6dc9357SAndroid Build Coastguard Worker namespace N7z { 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker const unsigned kKeySize = 32; 17*f6dc9357SAndroid Build Coastguard Worker const unsigned kSaltSizeMax = 16; 18*f6dc9357SAndroid Build Coastguard Worker const unsigned kIvSizeMax = 16; // AES_BLOCK_SIZE; 19*f6dc9357SAndroid Build Coastguard Worker 20*f6dc9357SAndroid Build Coastguard Worker class CKeyInfo 21*f6dc9357SAndroid Build Coastguard Worker { 22*f6dc9357SAndroid Build Coastguard Worker public: 23*f6dc9357SAndroid Build Coastguard Worker unsigned NumCyclesPower; 24*f6dc9357SAndroid Build Coastguard Worker unsigned SaltSize; 25*f6dc9357SAndroid Build Coastguard Worker Byte Salt[kSaltSizeMax]; 26*f6dc9357SAndroid Build Coastguard Worker CByteBuffer Password; 27*f6dc9357SAndroid Build Coastguard Worker Byte Key[kKeySize]; 28*f6dc9357SAndroid Build Coastguard Worker 29*f6dc9357SAndroid Build Coastguard Worker bool IsEqualTo(const CKeyInfo &a) const; 30*f6dc9357SAndroid Build Coastguard Worker void CalcKey(); 31*f6dc9357SAndroid Build Coastguard Worker CKeyInfo()32*f6dc9357SAndroid Build Coastguard Worker CKeyInfo() { ClearProps(); } ClearProps()33*f6dc9357SAndroid Build Coastguard Worker void ClearProps() 34*f6dc9357SAndroid Build Coastguard Worker { 35*f6dc9357SAndroid Build Coastguard Worker NumCyclesPower = 0; 36*f6dc9357SAndroid Build Coastguard Worker SaltSize = 0; 37*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < sizeof(Salt); i++) 38*f6dc9357SAndroid Build Coastguard Worker Salt[i] = 0; 39*f6dc9357SAndroid Build Coastguard Worker } 40*f6dc9357SAndroid Build Coastguard Worker Wipe()41*f6dc9357SAndroid Build Coastguard Worker void Wipe() 42*f6dc9357SAndroid Build Coastguard Worker { 43*f6dc9357SAndroid Build Coastguard Worker Password.Wipe(); 44*f6dc9357SAndroid Build Coastguard Worker NumCyclesPower = 0; 45*f6dc9357SAndroid Build Coastguard Worker SaltSize = 0; 46*f6dc9357SAndroid Build Coastguard Worker Z7_memset_0_ARRAY(Salt); 47*f6dc9357SAndroid Build Coastguard Worker Z7_memset_0_ARRAY(Key); 48*f6dc9357SAndroid Build Coastguard Worker } 49*f6dc9357SAndroid Build Coastguard Worker 50*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_CPP_IS_SUPPORTED_default 51*f6dc9357SAndroid Build Coastguard Worker CKeyInfo(const CKeyInfo &) = default; 52*f6dc9357SAndroid Build Coastguard Worker #endif ~CKeyInfo()53*f6dc9357SAndroid Build Coastguard Worker ~CKeyInfo() { Wipe(); } 54*f6dc9357SAndroid Build Coastguard Worker }; 55*f6dc9357SAndroid Build Coastguard Worker 56*f6dc9357SAndroid Build Coastguard Worker class CKeyInfoCache 57*f6dc9357SAndroid Build Coastguard Worker { 58*f6dc9357SAndroid Build Coastguard Worker unsigned Size; 59*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CKeyInfo> Keys; 60*f6dc9357SAndroid Build Coastguard Worker public: CKeyInfoCache(unsigned size)61*f6dc9357SAndroid Build Coastguard Worker CKeyInfoCache(unsigned size): Size(size) {} 62*f6dc9357SAndroid Build Coastguard Worker bool GetKey(CKeyInfo &key); 63*f6dc9357SAndroid Build Coastguard Worker void Add(const CKeyInfo &key); 64*f6dc9357SAndroid Build Coastguard Worker void FindAndAdd(const CKeyInfo &key); 65*f6dc9357SAndroid Build Coastguard Worker }; 66*f6dc9357SAndroid Build Coastguard Worker 67*f6dc9357SAndroid Build Coastguard Worker class CBase 68*f6dc9357SAndroid Build Coastguard Worker { 69*f6dc9357SAndroid Build Coastguard Worker CKeyInfoCache _cachedKeys; 70*f6dc9357SAndroid Build Coastguard Worker protected: 71*f6dc9357SAndroid Build Coastguard Worker CKeyInfo _key; 72*f6dc9357SAndroid Build Coastguard Worker Byte _iv[kIvSizeMax]; 73*f6dc9357SAndroid Build Coastguard Worker unsigned _ivSize; 74*f6dc9357SAndroid Build Coastguard Worker 75*f6dc9357SAndroid Build Coastguard Worker void PrepareKey(); 76*f6dc9357SAndroid Build Coastguard Worker CBase(); 77*f6dc9357SAndroid Build Coastguard Worker }; 78*f6dc9357SAndroid Build Coastguard Worker 79*f6dc9357SAndroid Build Coastguard Worker class CBaseCoder: 80*f6dc9357SAndroid Build Coastguard Worker public ICompressFilter, 81*f6dc9357SAndroid Build Coastguard Worker public ICryptoSetPassword, 82*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp, 83*f6dc9357SAndroid Build Coastguard Worker public CBase 84*f6dc9357SAndroid Build Coastguard Worker { 85*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICompressFilter) Z7_IFACE_COM7_IMP(ICryptoSetPassword)86*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICryptoSetPassword) 87*f6dc9357SAndroid Build Coastguard Worker protected: 88*f6dc9357SAndroid Build Coastguard Worker virtual ~CBaseCoder() {} 89*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressFilter> _aesFilter; 90*f6dc9357SAndroid Build Coastguard Worker }; 91*f6dc9357SAndroid Build Coastguard Worker 92*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_EXTRACT_ONLY 93*f6dc9357SAndroid Build Coastguard Worker 94*f6dc9357SAndroid Build Coastguard Worker class CEncoder Z7_final: 95*f6dc9357SAndroid Build Coastguard Worker public CBaseCoder, 96*f6dc9357SAndroid Build Coastguard Worker public ICompressWriteCoderProperties, 97*f6dc9357SAndroid Build Coastguard Worker // public ICryptoResetSalt, 98*f6dc9357SAndroid Build Coastguard Worker public ICryptoResetInitVector 99*f6dc9357SAndroid Build Coastguard Worker { 100*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_4( 101*f6dc9357SAndroid Build Coastguard Worker ICompressFilter, 102*f6dc9357SAndroid Build Coastguard Worker ICryptoSetPassword, 103*f6dc9357SAndroid Build Coastguard Worker ICompressWriteCoderProperties, 104*f6dc9357SAndroid Build Coastguard Worker // ICryptoResetSalt, 105*f6dc9357SAndroid Build Coastguard Worker ICryptoResetInitVector) 106*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICompressWriteCoderProperties) 107*f6dc9357SAndroid Build Coastguard Worker // Z7_IFACE_COM7_IMP(ICryptoResetSalt) 108*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICryptoResetInitVector) 109*f6dc9357SAndroid Build Coastguard Worker public: 110*f6dc9357SAndroid Build Coastguard Worker CEncoder(); 111*f6dc9357SAndroid Build Coastguard Worker }; 112*f6dc9357SAndroid Build Coastguard Worker 113*f6dc9357SAndroid Build Coastguard Worker #endif 114*f6dc9357SAndroid Build Coastguard Worker 115*f6dc9357SAndroid Build Coastguard Worker class CDecoder Z7_final: 116*f6dc9357SAndroid Build Coastguard Worker public CBaseCoder, 117*f6dc9357SAndroid Build Coastguard Worker public ICompressSetDecoderProperties2 118*f6dc9357SAndroid Build Coastguard Worker { 119*f6dc9357SAndroid Build Coastguard Worker Z7_COM_UNKNOWN_IMP_3( 120*f6dc9357SAndroid Build Coastguard Worker ICompressFilter, 121*f6dc9357SAndroid Build Coastguard Worker ICryptoSetPassword, 122*f6dc9357SAndroid Build Coastguard Worker ICompressSetDecoderProperties2) 123*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICompressSetDecoderProperties2) 124*f6dc9357SAndroid Build Coastguard Worker public: 125*f6dc9357SAndroid Build Coastguard Worker CDecoder(); 126*f6dc9357SAndroid Build Coastguard Worker }; 127*f6dc9357SAndroid Build Coastguard Worker 128*f6dc9357SAndroid Build Coastguard Worker }} 129*f6dc9357SAndroid Build Coastguard Worker 130*f6dc9357SAndroid Build Coastguard Worker #endif 131