#pragma once

typedef DWORD SHA_WORD;
#define SHA1_MESSAGE_BYTE_LENGTH        ( 512/8 )

typedef struct _tagFASTSHA1_STATE
{
    DWORD           cbStruct;
    BOOL            bIsSha1Locked;
    SHA_WORD        dwHValues[5];
    BYTE            bLatestMessage[SHA1_MESSAGE_BYTE_LENGTH];
    DWORD           bLatestMessageSize;
    LARGE_INTEGER   cbTotalMessageSizeInBytes;
}
FASTSHA1_STATE, *PFASTSHA1_STATE;

#ifdef __cplusplus
extern "C" {
#endif

BOOL
InitializeFastSHA1State(
    DWORD dwFlags,
    PFASTSHA1_STATE pState
);


BOOL
FinalizeFastSHA1State(
    DWORD dwFlags,
    PFASTSHA1_STATE pState
);



BOOL
GetFastSHA1Result(
    PFASTSHA1_STATE pState,
    PBYTE pdwDestination,
    PSIZE_T cbDestination
);


BOOL
HashMoreFastSHA1Data(
    PFASTSHA1_STATE pState,
    PBYTE pbData,
    SIZE_T cbData
);

BOOL
CompareFashSHA1Hashes(
    PFASTSHA1_STATE pStateLeft,
    PFASTSHA1_STATE pStateRight,
    BOOL *pbComparesEqual
);

#ifdef __cplusplus
};
#endif