rlm@1
|
1 // 7zAes.h
|
rlm@1
|
2
|
rlm@1
|
3 #ifndef __CRYPTO_7Z_AES_H
|
rlm@1
|
4 #define __CRYPTO_7Z_AES_H
|
rlm@1
|
5
|
rlm@1
|
6 #include "Common/Buffer.h"
|
rlm@1
|
7 #include "Common/MyCom.h"
|
rlm@1
|
8 #include "Common/MyVector.h"
|
rlm@1
|
9
|
rlm@1
|
10 #include "../ICoder.h"
|
rlm@1
|
11 #include "../IPassword.h"
|
rlm@1
|
12
|
rlm@1
|
13 namespace NCrypto {
|
rlm@1
|
14 namespace NSevenZ {
|
rlm@1
|
15
|
rlm@1
|
16 const int kKeySize = 32;
|
rlm@1
|
17
|
rlm@1
|
18 class CKeyInfo
|
rlm@1
|
19 {
|
rlm@1
|
20 public:
|
rlm@1
|
21 int NumCyclesPower;
|
rlm@1
|
22 UInt32 SaltSize;
|
rlm@1
|
23 Byte Salt[16];
|
rlm@1
|
24 CByteBuffer Password;
|
rlm@1
|
25 Byte Key[kKeySize];
|
rlm@1
|
26
|
rlm@1
|
27 bool IsEqualTo(const CKeyInfo &a) const;
|
rlm@1
|
28 void CalculateDigest();
|
rlm@1
|
29
|
rlm@1
|
30 CKeyInfo() { Init(); }
|
rlm@1
|
31 void Init()
|
rlm@1
|
32 {
|
rlm@1
|
33 NumCyclesPower = 0;
|
rlm@1
|
34 SaltSize = 0;
|
rlm@1
|
35 for (int i = 0; i < sizeof(Salt); i++)
|
rlm@1
|
36 Salt[i] = 0;
|
rlm@1
|
37 }
|
rlm@1
|
38 };
|
rlm@1
|
39
|
rlm@1
|
40 class CKeyInfoCache
|
rlm@1
|
41 {
|
rlm@1
|
42 int Size;
|
rlm@1
|
43 CObjectVector<CKeyInfo> Keys;
|
rlm@1
|
44 public:
|
rlm@1
|
45 CKeyInfoCache(int size): Size(size) {}
|
rlm@1
|
46 bool Find(CKeyInfo &key);
|
rlm@1
|
47 // HRESULT Calculate(CKeyInfo &key);
|
rlm@1
|
48 void Add(CKeyInfo &key);
|
rlm@1
|
49 };
|
rlm@1
|
50
|
rlm@1
|
51 class CBase
|
rlm@1
|
52 {
|
rlm@1
|
53 CKeyInfoCache _cachedKeys;
|
rlm@1
|
54 protected:
|
rlm@1
|
55 CKeyInfo _key;
|
rlm@1
|
56 Byte _iv[16];
|
rlm@1
|
57 UInt32 _ivSize;
|
rlm@1
|
58 void CalculateDigest();
|
rlm@1
|
59 CBase();
|
rlm@1
|
60 };
|
rlm@1
|
61
|
rlm@1
|
62 class CBaseCoder:
|
rlm@1
|
63 public ICompressFilter,
|
rlm@1
|
64 public ICryptoSetPassword,
|
rlm@1
|
65 public CMyUnknownImp,
|
rlm@1
|
66 public CBase
|
rlm@1
|
67 {
|
rlm@1
|
68 protected:
|
rlm@1
|
69 CMyComPtr<ICompressFilter> _aesFilter;
|
rlm@1
|
70
|
rlm@1
|
71 virtual HRESULT CreateFilter() = 0;
|
rlm@1
|
72 #ifndef CRYPTO_AES
|
rlm@1
|
73 HRESULT CreateFilterFromDLL(REFCLSID clsID);
|
rlm@1
|
74 #endif
|
rlm@1
|
75 public:
|
rlm@1
|
76 STDMETHOD(Init)();
|
rlm@1
|
77 STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
|
rlm@1
|
78
|
rlm@1
|
79 STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
|
rlm@1
|
80 };
|
rlm@1
|
81
|
rlm@1
|
82 #ifndef EXTRACT_ONLY
|
rlm@1
|
83
|
rlm@1
|
84 class CEncoder:
|
rlm@1
|
85 public CBaseCoder,
|
rlm@1
|
86 public ICompressWriteCoderProperties,
|
rlm@1
|
87 // public ICryptoResetSalt,
|
rlm@1
|
88 public ICryptoResetInitVector
|
rlm@1
|
89 {
|
rlm@1
|
90 virtual HRESULT CreateFilter();
|
rlm@1
|
91 public:
|
rlm@1
|
92 MY_UNKNOWN_IMP3(
|
rlm@1
|
93 ICryptoSetPassword,
|
rlm@1
|
94 ICompressWriteCoderProperties,
|
rlm@1
|
95 // ICryptoResetSalt,
|
rlm@1
|
96 ICryptoResetInitVector)
|
rlm@1
|
97 STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);
|
rlm@1
|
98 // STDMETHOD(ResetSalt)();
|
rlm@1
|
99 STDMETHOD(ResetInitVector)();
|
rlm@1
|
100 };
|
rlm@1
|
101 #endif
|
rlm@1
|
102
|
rlm@1
|
103 class CDecoder:
|
rlm@1
|
104 public CBaseCoder,
|
rlm@1
|
105 public ICompressSetDecoderProperties2
|
rlm@1
|
106 {
|
rlm@1
|
107 virtual HRESULT CreateFilter();
|
rlm@1
|
108 public:
|
rlm@1
|
109 MY_UNKNOWN_IMP2(
|
rlm@1
|
110 ICryptoSetPassword,
|
rlm@1
|
111 ICompressSetDecoderProperties2)
|
rlm@1
|
112 STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
|
rlm@1
|
113 };
|
rlm@1
|
114
|
rlm@1
|
115 }}
|
rlm@1
|
116
|
rlm@1
|
117 #endif
|