| // Sha256Reg.cpp |
| |
| #include "StdAfx.h" |
| |
| #include "../../C/Sha256.h" |
| |
| #include "../Common/MyBuffer2.h" |
| #include "../Common/MyCom.h" |
| |
| #include "../7zip/Common/RegisterCodec.h" |
| |
| Z7_CLASS_IMP_COM_2( |
| CSha256Hasher |
| , IHasher |
| , ICompressSetCoderProperties |
| ) |
| CAlignedBuffer1 _buf; |
| public: |
| Byte _mtDummy[1 << 7]; |
| |
| CSha256 *Sha() { return (CSha256 *)(void *)(Byte *)_buf; } |
| public: |
| CSha256Hasher(): |
| _buf(sizeof(CSha256)) |
| { |
| Sha256_SetFunction(Sha(), 0); |
| Sha256_InitState(Sha()); |
| } |
| }; |
| |
| Z7_COM7F_IMF2(void, CSha256Hasher::Init()) |
| { |
| Sha256_InitState(Sha()); |
| } |
| |
| Z7_COM7F_IMF2(void, CSha256Hasher::Update(const void *data, UInt32 size)) |
| { |
| Sha256_Update(Sha(), (const Byte *)data, size); |
| } |
| |
| Z7_COM7F_IMF2(void, CSha256Hasher::Final(Byte *digest)) |
| { |
| Sha256_Final(Sha(), digest); |
| } |
| |
| |
| Z7_COM7F_IMF(CSha256Hasher::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *coderProps, UInt32 numProps)) |
| { |
| unsigned algo = 0; |
| for (UInt32 i = 0; i < numProps; i++) |
| { |
| if (propIDs[i] == NCoderPropID::kDefaultProp) |
| { |
| const PROPVARIANT &prop = coderProps[i]; |
| if (prop.vt != VT_UI4) |
| return E_INVALIDARG; |
| if (prop.ulVal > 2) |
| return E_NOTIMPL; |
| algo = (unsigned)prop.ulVal; |
| } |
| } |
| if (!Sha256_SetFunction(Sha(), algo)) |
| return E_NOTIMPL; |
| return S_OK; |
| } |
| |
| REGISTER_HASHER(CSha256Hasher, 0xA, "SHA256", SHA256_DIGEST_SIZE) |