xref: /aosp_15_r20/external/lzma/CPP/7zip/Crypto/Rar5Aes.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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