// 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 |