1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
// 7zAes.h
#ifndef ZIP7_INC_CRYPTO_7Z_AES_H
#define ZIP7_INC_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 N7z {
const unsigned kKeySize = 32;
const unsigned kSaltSizeMax = 16;
const unsigned kIvSizeMax = 16; // AES_BLOCK_SIZE;
class CKeyInfo
{
public:
unsigned NumCyclesPower;
unsigned SaltSize;
Byte Salt[kSaltSizeMax];
CByteBuffer Password;
Byte Key[kKeySize];
bool IsEqualTo(const CKeyInfo &a) const;
void CalcKey();
CKeyInfo() { ClearProps(); }
void ClearProps()
{
NumCyclesPower = 0;
SaltSize = 0;
for (unsigned i = 0; i < sizeof(Salt); i++)
Salt[i] = 0;
}
void Wipe()
{
Password.Wipe();
NumCyclesPower = 0;
SaltSize = 0;
Z7_memset_0_ARRAY(Salt);
Z7_memset_0_ARRAY(Key);
}
#ifdef Z7_CPP_IS_SUPPORTED_default
CKeyInfo(const CKeyInfo &) = default;
#endif
~CKeyInfo() { Wipe(); }
};
class CKeyInfoCache
{
unsigned Size;
CObjectVector<CKeyInfo> Keys;
public:
CKeyInfoCache(unsigned size): Size(size) {}
bool GetKey(CKeyInfo &key);
void Add(const CKeyInfo &key);
void FindAndAdd(const CKeyInfo &key);
};
class CBase
{
CKeyInfoCache _cachedKeys;
protected:
CKeyInfo _key;
Byte _iv[kIvSizeMax];
unsigned _ivSize;
void PrepareKey();
CBase();
};
class CBaseCoder:
public ICompressFilter,
public ICryptoSetPassword,
public CMyUnknownImp,
public CBase
{
Z7_IFACE_COM7_IMP(ICompressFilter)
Z7_IFACE_COM7_IMP(ICryptoSetPassword)
protected:
virtual ~CBaseCoder() {}
CMyComPtr<ICompressFilter> _aesFilter;
};
#ifndef Z7_EXTRACT_ONLY
class CEncoder Z7_final:
public CBaseCoder,
public ICompressWriteCoderProperties,
// public ICryptoResetSalt,
public ICryptoResetInitVector
{
Z7_COM_UNKNOWN_IMP_4(
ICompressFilter,
ICryptoSetPassword,
ICompressWriteCoderProperties,
// ICryptoResetSalt,
ICryptoResetInitVector)
Z7_IFACE_COM7_IMP(ICompressWriteCoderProperties)
// Z7_IFACE_COM7_IMP(ICryptoResetSalt)
Z7_IFACE_COM7_IMP(ICryptoResetInitVector)
public:
CEncoder();
};
#endif
class CDecoder Z7_final:
public CBaseCoder,
public ICompressSetDecoderProperties2
{
Z7_COM_UNKNOWN_IMP_3(
ICompressFilter,
ICryptoSetPassword,
ICompressSetDecoderProperties2)
Z7_IFACE_COM7_IMP(ICompressSetDecoderProperties2)
public:
CDecoder();
};
}}
#endif
|