1cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// XzCrc64Reg.cpp
2cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
3cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "StdAfx.h"
4cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
5cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../C/CpuArch.h"
6cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../C/XzCrc64.h"
7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
8cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../Common/MyCom.h"
9cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
10cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../7zip/ICoder.h"
11cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../7zip/Common/RegisterCodec.h"
12cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
13cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyclass CXzCrc64Hasher:
14cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  public IHasher,
15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  public CMyUnknownImp
16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
17cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 _crc;
18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckypublic:
19cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CXzCrc64Hasher(): _crc(CRC64_INIT_VAL) {}
20cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
21cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  MY_UNKNOWN_IMP
22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  STDMETHOD_(void, Init)();
24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  STDMETHOD_(void, Update)(const void *data, UInt32 size);
25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  STDMETHOD_(void, Final)(Byte *digest);
26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  STDMETHOD_(UInt32, GetDigestSize)();
27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky};
28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckySTDMETHODIMP_(void) CXzCrc64Hasher::Init()
30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  _crc = CRC64_INIT_VAL;
32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
33cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckySTDMETHODIMP_(void) CXzCrc64Hasher::Update(const void *data, UInt32 size)
35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  _crc = Crc64Update(_crc, data, size);
37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckySTDMETHODIMP_(void) CXzCrc64Hasher::Final(Byte *digest)
40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 val = CRC64_GET_DIGEST(_crc);
42cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  SetUi64(digest, val);
43cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
44cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
45cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckySTDMETHODIMP_(UInt32) CXzCrc64Hasher::GetDigestSize()
46cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
47cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return 8;
48cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
49cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
50cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic IHasher *CreateHasher() { return new CXzCrc64Hasher; }
51cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
52cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic CHasherInfo g_HasherInfo = { CreateHasher, 0x4, L"CRC64", 8 };
53cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyREGISTER_HASHER(Crc64)
55