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