xref: /aosp_15_r20/external/lzma/CPP/7zip/Crypto/7zAes.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // 7zAes.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/CpuArch.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/Sha256.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/ComTry.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyBuffer2.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
12*f6dc9357SAndroid Build Coastguard Worker #include "../../Windows/Synchronization.h"
13*f6dc9357SAndroid Build Coastguard Worker #endif
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker #include "../Common/StreamUtils.h"
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker #include "7zAes.h"
18*f6dc9357SAndroid Build Coastguard Worker #include "MyAes.h"
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_EXTRACT_ONLY
21*f6dc9357SAndroid Build Coastguard Worker #include "RandGen.h"
22*f6dc9357SAndroid Build Coastguard Worker #endif
23*f6dc9357SAndroid Build Coastguard Worker 
24*f6dc9357SAndroid Build Coastguard Worker namespace NCrypto {
25*f6dc9357SAndroid Build Coastguard Worker namespace N7z {
26*f6dc9357SAndroid Build Coastguard Worker 
27*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_NumCyclesPower_Supported_MAX = 24;
28*f6dc9357SAndroid Build Coastguard Worker 
IsEqualTo(const CKeyInfo & a) const29*f6dc9357SAndroid Build Coastguard Worker bool CKeyInfo::IsEqualTo(const CKeyInfo &a) const
30*f6dc9357SAndroid Build Coastguard Worker {
31*f6dc9357SAndroid Build Coastguard Worker   if (SaltSize != a.SaltSize || NumCyclesPower != a.NumCyclesPower)
32*f6dc9357SAndroid Build Coastguard Worker     return false;
33*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < SaltSize; i++)
34*f6dc9357SAndroid Build Coastguard Worker     if (Salt[i] != a.Salt[i])
35*f6dc9357SAndroid Build Coastguard Worker       return false;
36*f6dc9357SAndroid Build Coastguard Worker   return (Password == a.Password);
37*f6dc9357SAndroid Build Coastguard Worker }
38*f6dc9357SAndroid Build Coastguard Worker 
CalcKey()39*f6dc9357SAndroid Build Coastguard Worker void CKeyInfo::CalcKey()
40*f6dc9357SAndroid Build Coastguard Worker {
41*f6dc9357SAndroid Build Coastguard Worker   if (NumCyclesPower == 0x3F)
42*f6dc9357SAndroid Build Coastguard Worker   {
43*f6dc9357SAndroid Build Coastguard Worker     unsigned pos;
44*f6dc9357SAndroid Build Coastguard Worker     for (pos = 0; pos < SaltSize; pos++)
45*f6dc9357SAndroid Build Coastguard Worker       Key[pos] = Salt[pos];
46*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < Password.Size() && pos < kKeySize; i++)
47*f6dc9357SAndroid Build Coastguard Worker       Key[pos++] = Password[i];
48*f6dc9357SAndroid Build Coastguard Worker     for (; pos < kKeySize; pos++)
49*f6dc9357SAndroid Build Coastguard Worker       Key[pos] = 0;
50*f6dc9357SAndroid Build Coastguard Worker   }
51*f6dc9357SAndroid Build Coastguard Worker   else
52*f6dc9357SAndroid Build Coastguard Worker   {
53*f6dc9357SAndroid Build Coastguard Worker     const unsigned kUnrPow = 6;
54*f6dc9357SAndroid Build Coastguard Worker     const UInt32 numUnroll = (UInt32)1 << (NumCyclesPower <= kUnrPow ? (unsigned)NumCyclesPower : kUnrPow);
55*f6dc9357SAndroid Build Coastguard Worker 
56*f6dc9357SAndroid Build Coastguard Worker     const size_t bufSize = 8 + SaltSize + Password.Size();
57*f6dc9357SAndroid Build Coastguard Worker     const size_t unrollSize = bufSize * numUnroll;
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker     // MY_ALIGN (16)
60*f6dc9357SAndroid Build Coastguard Worker     // CSha256 sha;
61*f6dc9357SAndroid Build Coastguard Worker     const size_t shaAllocSize = sizeof(CSha256) + unrollSize + bufSize * 2;
62*f6dc9357SAndroid Build Coastguard Worker     CAlignedBuffer1 sha(shaAllocSize);
63*f6dc9357SAndroid Build Coastguard Worker     Byte *buf = sha + sizeof(CSha256);
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker     memcpy(buf, Salt, SaltSize);
66*f6dc9357SAndroid Build Coastguard Worker     memcpy(buf + SaltSize, Password, Password.Size());
67*f6dc9357SAndroid Build Coastguard Worker     memset(buf + bufSize - 8, 0, 8);
68*f6dc9357SAndroid Build Coastguard Worker 
69*f6dc9357SAndroid Build Coastguard Worker     Sha256_Init((CSha256 *)(void *)(Byte *)sha);
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker     {
72*f6dc9357SAndroid Build Coastguard Worker       {
73*f6dc9357SAndroid Build Coastguard Worker         Byte *dest = buf;
74*f6dc9357SAndroid Build Coastguard Worker         for (UInt32 i = 1; i < numUnroll; i++)
75*f6dc9357SAndroid Build Coastguard Worker         {
76*f6dc9357SAndroid Build Coastguard Worker           dest += bufSize;
77*f6dc9357SAndroid Build Coastguard Worker           memcpy(dest, buf, bufSize);
78*f6dc9357SAndroid Build Coastguard Worker         }
79*f6dc9357SAndroid Build Coastguard Worker       }
80*f6dc9357SAndroid Build Coastguard Worker 
81*f6dc9357SAndroid Build Coastguard Worker       const UInt32 numRounds = (UInt32)1 << NumCyclesPower;
82*f6dc9357SAndroid Build Coastguard Worker       UInt32 r = 0;
83*f6dc9357SAndroid Build Coastguard Worker       do
84*f6dc9357SAndroid Build Coastguard Worker       {
85*f6dc9357SAndroid Build Coastguard Worker         Byte *dest = buf + bufSize - 8;
86*f6dc9357SAndroid Build Coastguard Worker         UInt32 i = r;
87*f6dc9357SAndroid Build Coastguard Worker         r += numUnroll;
88*f6dc9357SAndroid Build Coastguard Worker         do
89*f6dc9357SAndroid Build Coastguard Worker         {
90*f6dc9357SAndroid Build Coastguard Worker           SetUi32(dest, i)  i++; dest += bufSize;
91*f6dc9357SAndroid Build Coastguard Worker           // SetUi32(dest, i)  i++; dest += bufSize;
92*f6dc9357SAndroid Build Coastguard Worker         }
93*f6dc9357SAndroid Build Coastguard Worker         while (i < r);
94*f6dc9357SAndroid Build Coastguard Worker         Sha256_Update((CSha256 *)(void *)(Byte *)sha, buf, unrollSize);
95*f6dc9357SAndroid Build Coastguard Worker       }
96*f6dc9357SAndroid Build Coastguard Worker       while (r < numRounds);
97*f6dc9357SAndroid Build Coastguard Worker     }
98*f6dc9357SAndroid Build Coastguard Worker     /*
99*f6dc9357SAndroid Build Coastguard Worker     UInt64 numRounds = (UInt64)1 << NumCyclesPower;
100*f6dc9357SAndroid Build Coastguard Worker 
101*f6dc9357SAndroid Build Coastguard Worker     do
102*f6dc9357SAndroid Build Coastguard Worker     {
103*f6dc9357SAndroid Build Coastguard Worker       Sha256_Update((CSha256 *)(Byte *)sha, buf, bufSize);
104*f6dc9357SAndroid Build Coastguard Worker       for (unsigned i = 0; i < 8; i++)
105*f6dc9357SAndroid Build Coastguard Worker         if (++(ctr[i]) != 0)
106*f6dc9357SAndroid Build Coastguard Worker           break;
107*f6dc9357SAndroid Build Coastguard Worker     }
108*f6dc9357SAndroid Build Coastguard Worker     while (--numRounds != 0);
109*f6dc9357SAndroid Build Coastguard Worker     */
110*f6dc9357SAndroid Build Coastguard Worker 
111*f6dc9357SAndroid Build Coastguard Worker     Sha256_Final((CSha256 *)(void *)(Byte *)sha, Key);
112*f6dc9357SAndroid Build Coastguard Worker     memset(sha, 0, shaAllocSize);
113*f6dc9357SAndroid Build Coastguard Worker   }
114*f6dc9357SAndroid Build Coastguard Worker }
115*f6dc9357SAndroid Build Coastguard Worker 
GetKey(CKeyInfo & key)116*f6dc9357SAndroid Build Coastguard Worker bool CKeyInfoCache::GetKey(CKeyInfo &key)
117*f6dc9357SAndroid Build Coastguard Worker {
118*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, Keys)
119*f6dc9357SAndroid Build Coastguard Worker   {
120*f6dc9357SAndroid Build Coastguard Worker     const CKeyInfo &cached = Keys[i];
121*f6dc9357SAndroid Build Coastguard Worker     if (key.IsEqualTo(cached))
122*f6dc9357SAndroid Build Coastguard Worker     {
123*f6dc9357SAndroid Build Coastguard Worker       for (unsigned j = 0; j < kKeySize; j++)
124*f6dc9357SAndroid Build Coastguard Worker         key.Key[j] = cached.Key[j];
125*f6dc9357SAndroid Build Coastguard Worker       if (i != 0)
126*f6dc9357SAndroid Build Coastguard Worker         Keys.MoveToFront(i);
127*f6dc9357SAndroid Build Coastguard Worker       return true;
128*f6dc9357SAndroid Build Coastguard Worker     }
129*f6dc9357SAndroid Build Coastguard Worker   }
130*f6dc9357SAndroid Build Coastguard Worker   return false;
131*f6dc9357SAndroid Build Coastguard Worker }
132*f6dc9357SAndroid Build Coastguard Worker 
FindAndAdd(const CKeyInfo & key)133*f6dc9357SAndroid Build Coastguard Worker void CKeyInfoCache::FindAndAdd(const CKeyInfo &key)
134*f6dc9357SAndroid Build Coastguard Worker {
135*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, Keys)
136*f6dc9357SAndroid Build Coastguard Worker   {
137*f6dc9357SAndroid Build Coastguard Worker     const CKeyInfo &cached = Keys[i];
138*f6dc9357SAndroid Build Coastguard Worker     if (key.IsEqualTo(cached))
139*f6dc9357SAndroid Build Coastguard Worker     {
140*f6dc9357SAndroid Build Coastguard Worker       if (i != 0)
141*f6dc9357SAndroid Build Coastguard Worker         Keys.MoveToFront(i);
142*f6dc9357SAndroid Build Coastguard Worker       return;
143*f6dc9357SAndroid Build Coastguard Worker     }
144*f6dc9357SAndroid Build Coastguard Worker   }
145*f6dc9357SAndroid Build Coastguard Worker   Add(key);
146*f6dc9357SAndroid Build Coastguard Worker }
147*f6dc9357SAndroid Build Coastguard Worker 
Add(const CKeyInfo & key)148*f6dc9357SAndroid Build Coastguard Worker void CKeyInfoCache::Add(const CKeyInfo &key)
149*f6dc9357SAndroid Build Coastguard Worker {
150*f6dc9357SAndroid Build Coastguard Worker   if (Keys.Size() >= Size)
151*f6dc9357SAndroid Build Coastguard Worker     Keys.DeleteBack();
152*f6dc9357SAndroid Build Coastguard Worker   Keys.Insert(0, key);
153*f6dc9357SAndroid Build Coastguard Worker }
154*f6dc9357SAndroid Build Coastguard Worker 
155*f6dc9357SAndroid Build Coastguard Worker static CKeyInfoCache g_GlobalKeyCache(32);
156*f6dc9357SAndroid Build Coastguard Worker 
157*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
158*f6dc9357SAndroid Build Coastguard Worker   static NWindows::NSynchronization::CCriticalSection g_GlobalKeyCacheCriticalSection;
159*f6dc9357SAndroid Build Coastguard Worker   #define MT_LOCK NWindows::NSynchronization::CCriticalSectionLock lock(g_GlobalKeyCacheCriticalSection);
160*f6dc9357SAndroid Build Coastguard Worker #else
161*f6dc9357SAndroid Build Coastguard Worker   #define MT_LOCK
162*f6dc9357SAndroid Build Coastguard Worker #endif
163*f6dc9357SAndroid Build Coastguard Worker 
CBase()164*f6dc9357SAndroid Build Coastguard Worker CBase::CBase():
165*f6dc9357SAndroid Build Coastguard Worker   _cachedKeys(16),
166*f6dc9357SAndroid Build Coastguard Worker   _ivSize(0)
167*f6dc9357SAndroid Build Coastguard Worker {
168*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < sizeof(_iv); i++)
169*f6dc9357SAndroid Build Coastguard Worker     _iv[i] = 0;
170*f6dc9357SAndroid Build Coastguard Worker }
171*f6dc9357SAndroid Build Coastguard Worker 
PrepareKey()172*f6dc9357SAndroid Build Coastguard Worker void CBase::PrepareKey()
173*f6dc9357SAndroid Build Coastguard Worker {
174*f6dc9357SAndroid Build Coastguard Worker   // BCJ2 threads use same password. So we use long lock.
175*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
176*f6dc9357SAndroid Build Coastguard Worker 
177*f6dc9357SAndroid Build Coastguard Worker   bool finded = false;
178*f6dc9357SAndroid Build Coastguard Worker   if (!_cachedKeys.GetKey(_key))
179*f6dc9357SAndroid Build Coastguard Worker   {
180*f6dc9357SAndroid Build Coastguard Worker     finded = g_GlobalKeyCache.GetKey(_key);
181*f6dc9357SAndroid Build Coastguard Worker     if (!finded)
182*f6dc9357SAndroid Build Coastguard Worker       _key.CalcKey();
183*f6dc9357SAndroid Build Coastguard Worker     _cachedKeys.Add(_key);
184*f6dc9357SAndroid Build Coastguard Worker   }
185*f6dc9357SAndroid Build Coastguard Worker   if (!finded)
186*f6dc9357SAndroid Build Coastguard Worker     g_GlobalKeyCache.FindAndAdd(_key);
187*f6dc9357SAndroid Build Coastguard Worker }
188*f6dc9357SAndroid Build Coastguard Worker 
189*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_EXTRACT_ONLY
190*f6dc9357SAndroid Build Coastguard Worker 
191*f6dc9357SAndroid Build Coastguard Worker /*
192*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CEncoder::ResetSalt())
193*f6dc9357SAndroid Build Coastguard Worker {
194*f6dc9357SAndroid Build Coastguard Worker   _key.SaltSize = 4;
195*f6dc9357SAndroid Build Coastguard Worker   g_RandomGenerator.Generate(_key.Salt, _key.SaltSize);
196*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
197*f6dc9357SAndroid Build Coastguard Worker }
198*f6dc9357SAndroid Build Coastguard Worker */
199*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CEncoder::ResetInitVector ())200*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CEncoder::ResetInitVector())
201*f6dc9357SAndroid Build Coastguard Worker {
202*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < sizeof(_iv); i++)
203*f6dc9357SAndroid Build Coastguard Worker     _iv[i] = 0;
204*f6dc9357SAndroid Build Coastguard Worker   _ivSize = 16;
205*f6dc9357SAndroid Build Coastguard Worker   MY_RAND_GEN(_iv, _ivSize);
206*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
207*f6dc9357SAndroid Build Coastguard Worker }
208*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CEncoder::WriteCoderProperties (ISequentialOutStream * outStream))209*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CEncoder::WriteCoderProperties(ISequentialOutStream *outStream))
210*f6dc9357SAndroid Build Coastguard Worker {
211*f6dc9357SAndroid Build Coastguard Worker   Byte props[2 + sizeof(_key.Salt) + sizeof(_iv)];
212*f6dc9357SAndroid Build Coastguard Worker   unsigned propsSize = 1;
213*f6dc9357SAndroid Build Coastguard Worker 
214*f6dc9357SAndroid Build Coastguard Worker   props[0] = (Byte)(_key.NumCyclesPower
215*f6dc9357SAndroid Build Coastguard Worker       | (_key.SaltSize == 0 ? 0 : (1 << 7))
216*f6dc9357SAndroid Build Coastguard Worker       | (_ivSize       == 0 ? 0 : (1 << 6)));
217*f6dc9357SAndroid Build Coastguard Worker 
218*f6dc9357SAndroid Build Coastguard Worker   if (_key.SaltSize != 0 || _ivSize != 0)
219*f6dc9357SAndroid Build Coastguard Worker   {
220*f6dc9357SAndroid Build Coastguard Worker     props[1] = (Byte)(
221*f6dc9357SAndroid Build Coastguard Worker         ((_key.SaltSize == 0 ? 0 : _key.SaltSize - 1) << 4)
222*f6dc9357SAndroid Build Coastguard Worker         | (_ivSize      == 0 ? 0 : _ivSize - 1));
223*f6dc9357SAndroid Build Coastguard Worker     memcpy(props + 2, _key.Salt, _key.SaltSize);
224*f6dc9357SAndroid Build Coastguard Worker     propsSize = 2 + _key.SaltSize;
225*f6dc9357SAndroid Build Coastguard Worker     memcpy(props + propsSize, _iv, _ivSize);
226*f6dc9357SAndroid Build Coastguard Worker     propsSize += _ivSize;
227*f6dc9357SAndroid Build Coastguard Worker   }
228*f6dc9357SAndroid Build Coastguard Worker 
229*f6dc9357SAndroid Build Coastguard Worker   return WriteStream(outStream, props, propsSize);
230*f6dc9357SAndroid Build Coastguard Worker }
231*f6dc9357SAndroid Build Coastguard Worker 
CEncoder()232*f6dc9357SAndroid Build Coastguard Worker CEncoder::CEncoder()
233*f6dc9357SAndroid Build Coastguard Worker {
234*f6dc9357SAndroid Build Coastguard Worker   // _key.SaltSize = 4; g_RandomGenerator.Generate(_key.Salt, _key.SaltSize);
235*f6dc9357SAndroid Build Coastguard Worker   // _key.NumCyclesPower = 0x3F;
236*f6dc9357SAndroid Build Coastguard Worker   _key.NumCyclesPower = 19;
237*f6dc9357SAndroid Build Coastguard Worker   _aesFilter = new CAesCbcEncoder(kKeySize);
238*f6dc9357SAndroid Build Coastguard Worker }
239*f6dc9357SAndroid Build Coastguard Worker 
240*f6dc9357SAndroid Build Coastguard Worker #endif
241*f6dc9357SAndroid Build Coastguard Worker 
CDecoder()242*f6dc9357SAndroid Build Coastguard Worker CDecoder::CDecoder()
243*f6dc9357SAndroid Build Coastguard Worker {
244*f6dc9357SAndroid Build Coastguard Worker   _aesFilter = new CAesCbcDecoder(kKeySize);
245*f6dc9357SAndroid Build Coastguard Worker }
246*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CDecoder::SetDecoderProperties2 (const Byte * data,UInt32 size))247*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size))
248*f6dc9357SAndroid Build Coastguard Worker {
249*f6dc9357SAndroid Build Coastguard Worker   _key.ClearProps();
250*f6dc9357SAndroid Build Coastguard Worker 
251*f6dc9357SAndroid Build Coastguard Worker   _ivSize = 0;
252*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
253*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < sizeof(_iv); i++)
254*f6dc9357SAndroid Build Coastguard Worker     _iv[i] = 0;
255*f6dc9357SAndroid Build Coastguard Worker 
256*f6dc9357SAndroid Build Coastguard Worker   if (size == 0)
257*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
258*f6dc9357SAndroid Build Coastguard Worker 
259*f6dc9357SAndroid Build Coastguard Worker   const unsigned b0 = data[0];
260*f6dc9357SAndroid Build Coastguard Worker   _key.NumCyclesPower = b0 & 0x3F;
261*f6dc9357SAndroid Build Coastguard Worker   if ((b0 & 0xC0) == 0)
262*f6dc9357SAndroid Build Coastguard Worker     return size == 1 ? S_OK : E_INVALIDARG;
263*f6dc9357SAndroid Build Coastguard Worker   if (size <= 1)
264*f6dc9357SAndroid Build Coastguard Worker     return E_INVALIDARG;
265*f6dc9357SAndroid Build Coastguard Worker 
266*f6dc9357SAndroid Build Coastguard Worker   const unsigned b1 = data[1];
267*f6dc9357SAndroid Build Coastguard Worker   const unsigned saltSize = ((b0 >> 7) & 1) + (b1 >> 4);
268*f6dc9357SAndroid Build Coastguard Worker   const unsigned ivSize   = ((b0 >> 6) & 1) + (b1 & 0x0F);
269*f6dc9357SAndroid Build Coastguard Worker 
270*f6dc9357SAndroid Build Coastguard Worker   if (size != 2 + saltSize + ivSize)
271*f6dc9357SAndroid Build Coastguard Worker     return E_INVALIDARG;
272*f6dc9357SAndroid Build Coastguard Worker   _key.SaltSize = saltSize;
273*f6dc9357SAndroid Build Coastguard Worker   data += 2;
274*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < saltSize; i++)
275*f6dc9357SAndroid Build Coastguard Worker     _key.Salt[i] = *data++;
276*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < ivSize; i++)
277*f6dc9357SAndroid Build Coastguard Worker     _iv[i] = *data++;
278*f6dc9357SAndroid Build Coastguard Worker   return (_key.NumCyclesPower <= k_NumCyclesPower_Supported_MAX
279*f6dc9357SAndroid Build Coastguard Worker       || _key.NumCyclesPower == 0x3F) ? S_OK : E_NOTIMPL;
280*f6dc9357SAndroid Build Coastguard Worker }
281*f6dc9357SAndroid Build Coastguard Worker 
282*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CBaseCoder::CryptoSetPassword (const Byte * data,UInt32 size))283*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CBaseCoder::CryptoSetPassword(const Byte *data, UInt32 size))
284*f6dc9357SAndroid Build Coastguard Worker {
285*f6dc9357SAndroid Build Coastguard Worker   COM_TRY_BEGIN
286*f6dc9357SAndroid Build Coastguard Worker 
287*f6dc9357SAndroid Build Coastguard Worker   _key.Password.Wipe();
288*f6dc9357SAndroid Build Coastguard Worker   _key.Password.CopyFrom(data, (size_t)size);
289*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
290*f6dc9357SAndroid Build Coastguard Worker 
291*f6dc9357SAndroid Build Coastguard Worker   COM_TRY_END
292*f6dc9357SAndroid Build Coastguard Worker }
293*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CBaseCoder::Init ())294*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CBaseCoder::Init())
295*f6dc9357SAndroid Build Coastguard Worker {
296*f6dc9357SAndroid Build Coastguard Worker   COM_TRY_BEGIN
297*f6dc9357SAndroid Build Coastguard Worker 
298*f6dc9357SAndroid Build Coastguard Worker   PrepareKey();
299*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ICryptoProperties> cp;
300*f6dc9357SAndroid Build Coastguard Worker   RINOK(_aesFilter.QueryInterface(IID_ICryptoProperties, &cp))
301*f6dc9357SAndroid Build Coastguard Worker   if (!cp)
302*f6dc9357SAndroid Build Coastguard Worker     return E_FAIL;
303*f6dc9357SAndroid Build Coastguard Worker   RINOK(cp->SetKey(_key.Key, kKeySize))
304*f6dc9357SAndroid Build Coastguard Worker   RINOK(cp->SetInitVector(_iv, sizeof(_iv)))
305*f6dc9357SAndroid Build Coastguard Worker   return _aesFilter->Init();
306*f6dc9357SAndroid Build Coastguard Worker 
307*f6dc9357SAndroid Build Coastguard Worker   COM_TRY_END
308*f6dc9357SAndroid Build Coastguard Worker }
309*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF2(UInt32,CBaseCoder::Filter (Byte * data,UInt32 size))310*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(UInt32, CBaseCoder::Filter(Byte *data, UInt32 size))
311*f6dc9357SAndroid Build Coastguard Worker {
312*f6dc9357SAndroid Build Coastguard Worker   return _aesFilter->Filter(data, size);
313*f6dc9357SAndroid Build Coastguard Worker }
314*f6dc9357SAndroid Build Coastguard Worker 
315*f6dc9357SAndroid Build Coastguard Worker }}
316