// 7zAes.h #ifndef __CRYPTO_7Z_AES_H #define __CRYPTO_7Z_AES_H #include "../../Common/MyBuffer.h" #include "../../Common/MyCom.h" #include "../../Common/MyVector.h" #include "../ICoder.h" #include "../IPassword.h" namespace NCrypto { namespace NSevenZ { const int kKeySize = 32; class CKeyInfo { public: int NumCyclesPower; UInt32 SaltSize; Byte Salt[16]; CByteBuffer Password; Byte Key[kKeySize]; bool IsEqualTo(const CKeyInfo &a) const; void CalculateDigest(); CKeyInfo() { Init(); } void Init() { NumCyclesPower = 0; SaltSize = 0; for (int i = 0; i < sizeof(Salt); i++) Salt[i] = 0; } }; class CKeyInfoCache { unsigned Size; CObjectVector<CKeyInfo> Keys; public: CKeyInfoCache(unsigned size): Size(size) {} bool Find(CKeyInfo &key); // HRESULT Calculate(CKeyInfo &key); void Add(CKeyInfo &key); }; class CBase { CKeyInfoCache _cachedKeys; protected: CKeyInfo _key; Byte _iv[16]; UInt32 _ivSize; void CalculateDigest(); CBase(); }; class CBaseCoder: public ICompressFilter, public ICryptoSetPassword, public CMyUnknownImp, public CBase { protected: CMyComPtr<ICompressFilter> _aesFilter; virtual HRESULT CreateFilter() = 0; #ifndef CRYPTO_AES HRESULT CreateFilterFromDLL(REFCLSID clsID); #endif public: STDMETHOD(Init)(); STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size); }; #ifndef EXTRACT_ONLY class CEncoder: public CBaseCoder, public ICompressWriteCoderProperties, // public ICryptoResetSalt, public ICryptoResetInitVector { virtual HRESULT CreateFilter(); public: MY_UNKNOWN_IMP3( ICryptoSetPassword, ICompressWriteCoderProperties, // ICryptoResetSalt, ICryptoResetInitVector) STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); // STDMETHOD(ResetSalt)(); STDMETHOD(ResetInitVector)(); }; #endif class CDecoder: public CBaseCoder, public ICompressSetDecoderProperties2 { virtual HRESULT CreateFilter(); public: MY_UNKNOWN_IMP2( ICryptoSetPassword, ICompressSetDecoderProperties2) STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); }; }} #endif