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