#define SAIO_CSP "SAIO SignCSP"
typedef enum Em_Algorithm_TYPE
{
AlgorithmType_SHA1 = 1,
AlgorithmType_SHA256 = 2
}ALGORITHM_TYPE, *PALGORITHM_TYPE;
BOOL GetFileHashParam(LPCSTR lpszCataFileName, PBYTE pbyHash, PDWORD pdwHashLen, ALGORITHM_TYPE emAlAlgorithmType)
{
BOOL bRet = FALSE;
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
HCRYPTKEY hKey = 0;
HANDLE hFile = NULL;
DWORD dwFileSize = 0, len;
BYTE byTempBuf[2049] = {0};
hFile = CreateFile(lpszCataFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
return FALSE;
}
DWORD dwProvType = PROV_RSA_AES;
ALG_ID hashAlgo = CALG_SHA_256;
if (AlgorithmType_SHA1 == emAlAlgorithmType)
{
dwProvType = PROV_RSA_FULL;
hashAlgo = CALG_SHA1;
}
if (!CryptAcquireContext(&hProv, SAIO_CSP, NULL, dwProvType, 0))
{
if (GetLastError() == NTE_BAD_KEYSET)
{
if(!CryptAcquireContext(&hProv,SAIO_CSP,NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET))
{
goto HashExit;
}
}
}
//
// Create a hash object.
//
DWORD dwError = 0;
if ( !CryptCreateHash(hProv, hashAlgo ,0 ,0 ,&hHash))
{
dwError = GetLastError();
goto HashExit;
}
dwFileSize = GetFileSize(hFile, NULL);
while(dwFileSize != 0)
{
bRet = ReadFile(hFile, byTempBuf, 2048, &len, NULL);
//
// Check for end of file.
//
if (bRet && len==0)
{
break;
}
CryptHashData(hHash, byTempBuf, len, 0);
dwFileSize -= len;
}
if (hFile != NULL)
{
CloseHandle(hFile);
}
len = 0;
DWORD dwCount = sizeof(DWORD);
if(!CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)pdwHashLen, &dwCount, 0))
{
*pdwHashLen = 0;
}
else
{
if (!CryptGetHashParam(hHash, HP_HASHVAL, pbyHash, pdwHashLen, 0))
{
*pdwHashLen = 0;
}
}
if (*pdwHashLen != 20
&& *pdwHashLen != 32)
{
bRet = FALSE;
}
HashExit:
if (hKey != NULL)
{
CryptDestroyKey(hKey);
}
if (hHash != NULL)
{
CryptDestroyHash(hHash);
}
if (hProv != NULL)
{
CryptReleaseContext(hProv, 0);
}
return bRet;
}
[MS Crypt API][原]计算文件hashParam
最新推荐文章于 2022-02-28 11:43:29 发布