59 lines
1.3 KiB
C
59 lines
1.3 KiB
C
|
// Circular Hash
|
||
|
//
|
||
|
// This code implements a circular hash algorithm, intended as a variable
|
||
|
// length hash function that is fast to update. (The hash function will be
|
||
|
// called many times.) This is done by SHA-1'ing each of the inputs, then
|
||
|
// circularly XORing this value into a buffer.
|
||
|
|
||
|
#ifndef __CIRCHASH_H__
|
||
|
#define __CIRCHASH_H__
|
||
|
|
||
|
typedef struct {
|
||
|
DWORD dwCircHashVer;
|
||
|
DWORD dwCircSize;
|
||
|
DWORD dwMode;
|
||
|
DWORD dwCircInc;
|
||
|
DWORD dwCurCircPos;
|
||
|
DWORD dwAlgId;
|
||
|
DWORD dwPad1;
|
||
|
DWORD dwPad2;
|
||
|
BYTE CircBuf[ 256 ];
|
||
|
} CircularHash;
|
||
|
|
||
|
|
||
|
// mode flags
|
||
|
#define CH_MODE_FEEDBACK 0x01
|
||
|
|
||
|
// alg flags
|
||
|
#define CH_ALG_SHA1_NS 0 // SHA-1 without endian transform
|
||
|
#define CH_ALG_MD4 1 // RSA MD4
|
||
|
|
||
|
BOOL
|
||
|
InitCircularHash(
|
||
|
IN CircularHash *NewHash,
|
||
|
IN DWORD dwUpdateInc,
|
||
|
IN DWORD dwAlgId,
|
||
|
IN DWORD dwMode
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
DestroyCircularHash(
|
||
|
IN CircularHash *OldHash
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
GetCircularHashValue(
|
||
|
IN CircularHash *CurrentHash,
|
||
|
OUT BYTE **ppbHashValue,
|
||
|
OUT DWORD *pcbHashValue
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
UpdateCircularHash(
|
||
|
IN CircularHash *CurrentHash,
|
||
|
IN VOID *pvData,
|
||
|
IN DWORD cbData
|
||
|
);
|
||
|
|
||
|
#endif // __CIRCHASH_H__
|