1*f6dc9357SAndroid Build Coastguard Worker // Sha512Reg.cpp 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h" 4*f6dc9357SAndroid Build Coastguard Worker 5*f6dc9357SAndroid Build Coastguard Worker #include "../../C/Sha512.h" 6*f6dc9357SAndroid Build Coastguard Worker 7*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyBuffer2.h" 8*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyCom.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #include "../7zip/Common/RegisterCodec.h" 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_2( 13*f6dc9357SAndroid Build Coastguard Worker CSha512Hasher 14*f6dc9357SAndroid Build Coastguard Worker , IHasher 15*f6dc9357SAndroid Build Coastguard Worker , ICompressSetCoderProperties 16*f6dc9357SAndroid Build Coastguard Worker ) 17*f6dc9357SAndroid Build Coastguard Worker unsigned _digestSize; 18*f6dc9357SAndroid Build Coastguard Worker CAlignedBuffer1 _buf; 19*f6dc9357SAndroid Build Coastguard Worker public: 20*f6dc9357SAndroid Build Coastguard Worker Byte _mtDummy[1 << 7]; 21*f6dc9357SAndroid Build Coastguard Worker 22*f6dc9357SAndroid Build Coastguard Worker CSha512 *Sha() { return (CSha512 *)(void *)(Byte *)_buf; } 23*f6dc9357SAndroid Build Coastguard Worker public: 24*f6dc9357SAndroid Build Coastguard Worker CSha512Hasher(unsigned digestSize): 25*f6dc9357SAndroid Build Coastguard Worker _digestSize(digestSize), 26*f6dc9357SAndroid Build Coastguard Worker _buf(sizeof(CSha512)) 27*f6dc9357SAndroid Build Coastguard Worker { 28*f6dc9357SAndroid Build Coastguard Worker Sha512_SetFunction(Sha(), 0); 29*f6dc9357SAndroid Build Coastguard Worker Sha512_InitState(Sha(), _digestSize); 30*f6dc9357SAndroid Build Coastguard Worker } 31*f6dc9357SAndroid Build Coastguard Worker }; 32*f6dc9357SAndroid Build Coastguard Worker 33*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CSha512Hasher::Init()) 34*f6dc9357SAndroid Build Coastguard Worker { 35*f6dc9357SAndroid Build Coastguard Worker Sha512_InitState(Sha(), _digestSize); 36*f6dc9357SAndroid Build Coastguard Worker } 37*f6dc9357SAndroid Build Coastguard Worker 38*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CSha512Hasher::Update(const void *data, UInt32 size)) 39*f6dc9357SAndroid Build Coastguard Worker { 40*f6dc9357SAndroid Build Coastguard Worker Sha512_Update(Sha(), (const Byte *)data, size); 41*f6dc9357SAndroid Build Coastguard Worker } 42*f6dc9357SAndroid Build Coastguard Worker 43*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CSha512Hasher::Final(Byte *digest)) 44*f6dc9357SAndroid Build Coastguard Worker { 45*f6dc9357SAndroid Build Coastguard Worker Sha512_Final(Sha(), digest, _digestSize); 46*f6dc9357SAndroid Build Coastguard Worker } 47*f6dc9357SAndroid Build Coastguard Worker 48*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(UInt32, CSha512Hasher::GetDigestSize()) 49*f6dc9357SAndroid Build Coastguard Worker { 50*f6dc9357SAndroid Build Coastguard Worker return (UInt32)_digestSize; 51*f6dc9357SAndroid Build Coastguard Worker } 52*f6dc9357SAndroid Build Coastguard Worker 53*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CSha512Hasher::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *coderProps, UInt32 numProps)) 54*f6dc9357SAndroid Build Coastguard Worker { 55*f6dc9357SAndroid Build Coastguard Worker unsigned algo = 0; 56*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < numProps; i++) 57*f6dc9357SAndroid Build Coastguard Worker { 58*f6dc9357SAndroid Build Coastguard Worker if (propIDs[i] == NCoderPropID::kDefaultProp) 59*f6dc9357SAndroid Build Coastguard Worker { 60*f6dc9357SAndroid Build Coastguard Worker const PROPVARIANT &prop = coderProps[i]; 61*f6dc9357SAndroid Build Coastguard Worker if (prop.vt != VT_UI4) 62*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG; 63*f6dc9357SAndroid Build Coastguard Worker if (prop.ulVal > 2) 64*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL; 65*f6dc9357SAndroid Build Coastguard Worker algo = (unsigned)prop.ulVal; 66*f6dc9357SAndroid Build Coastguard Worker } 67*f6dc9357SAndroid Build Coastguard Worker } 68*f6dc9357SAndroid Build Coastguard Worker if (!Sha512_SetFunction(Sha(), algo)) 69*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL; 70*f6dc9357SAndroid Build Coastguard Worker return S_OK; 71*f6dc9357SAndroid Build Coastguard Worker } 72*f6dc9357SAndroid Build Coastguard Worker 73*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_SHA512_HASHER(cls, id, name, size) \ 74*f6dc9357SAndroid Build Coastguard Worker namespace N ## cls { \ 75*f6dc9357SAndroid Build Coastguard Worker static IHasher *CreateHasherSpec() { return new CSha512Hasher(size); } \ 76*f6dc9357SAndroid Build Coastguard Worker static const CHasherInfo g_HasherInfo = { CreateHasherSpec, id, name, size }; \ 77*f6dc9357SAndroid Build Coastguard Worker struct REGISTER_HASHER_NAME(cls) { REGISTER_HASHER_NAME(cls)() { RegisterHasher(&g_HasherInfo); }}; \ 78*f6dc9357SAndroid Build Coastguard Worker static REGISTER_HASHER_NAME(cls) g_RegisterHasher; } 79*f6dc9357SAndroid Build Coastguard Worker 80*f6dc9357SAndroid Build Coastguard Worker // REGISTER_SHA512_HASHER (Sha512_224_Hasher, 0x220, "SHA512-224", SHA512_224_DIGEST_SIZE) 81*f6dc9357SAndroid Build Coastguard Worker // REGISTER_SHA512_HASHER (Sha512_256_Hasher, 0x221, "SHA512-256", SHA512_256_DIGEST_SIZE) 82*f6dc9357SAndroid Build Coastguard Worker REGISTER_SHA512_HASHER (Sha384Hasher, 0x222, "SHA384", SHA512_384_DIGEST_SIZE) 83*f6dc9357SAndroid Build Coastguard Worker REGISTER_SHA512_HASHER (Sha512Hasher, 0x223, "SHA512", SHA512_DIGEST_SIZE) 84