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