1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| #ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#define BUFFER_SIZE (1<<20)
ALG_ID hashIds[] = { CALG_MD5, CALG_SHA1/*, CALG_SHA_256*/ };
char const * hashNames[] = { "MD5 ", "SHA-1 ", "SHA-256" };
static BOOL DisplayHashValue(HCRYPTHASH hHash, LPCSTR name)
{
BOOL ret = FALSE;
DWORD cb = 0;
DWORD len = sizeof cb;
BOOL bCb = CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&cb, &len, 0);
if(bCb)
{
BYTE * hashVal = malloc(cb);
len = cb;
if(hashVal)
{
BOOL bVal = CryptGetHashParam(hHash, HP_HASHVAL, hashVal, &len, 0);
if(bVal)
{
size_t i;
printf("%s : ", name);
for(i=0 ; i<len ; i++)
{
printf("%02x", hashVal[i]);
}
putchar('\n');
ret = TRUE;
}
free(hashVal);
}
}
return ret;
}
static BOOL HashOneFile(LPCTSTR fileName, HCRYPTPROV hProv, LPVOID buf, DWORD size)
{
BOOL ret = FALSE;
HCRYPTHASH hHash[ARRAYSIZE(hashIds)] = {0};
BOOL bHashes = TRUE;
size_t iHash;
for(iHash=0 ; iHash < ARRAYSIZE(hashIds) && bHashes; iHash++)
bHashes = bHashes && CryptCreateHash(hProv, hashIds[iHash], 0, 0, &hHash[iHash]);
if(bHashes)
{
HANDLE hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
DWORD dwRead = 0;
BOOL bRead = FALSE;
bHashes = TRUE;
do
{
bRead = ReadFile(hFile, buf, size, &dwRead, NULL);
if(!bRead)
break;
for(iHash=0 ; iHash < ARRAYSIZE(hashIds) && bHashes; iHash++)
bHashes &= CryptHashData(hHash[iHash], buf, dwRead, 0);
} while(bRead && dwRead != 0 && bHashes);
if(bRead && bHashes)
{
ret = TRUE;
for(iHash=0 ; iHash < ARRAYSIZE(hashIds) ; iHash++)
ret &= DisplayHashValue(hHash[iHash], hashNames[iHash]);
}
CloseHandle(hFile);
}
for(iHash=0 ; iHash < ARRAYSIZE(hashIds) ; iHash++)
CryptDestroyHash(hHash[iHash]);
}
else
{
size_t nHashes = iHash;
for(iHash=0 ; iHash < nHashes ; iHash++)
CryptDestroyHash(hHash[iHash]);
}
return ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
int ret = EXIT_FAILURE;
HCRYPTPROV hProv = 0;
BOOL bProv = FALSE;
if(argc<2)
{
puts("Usage: HashFile <filename>");
return 1;
}
bProv = CryptAcquireContext(&hProv, NULL, NULL, PROV_DSS/*PROV_RSA_FULL*/, CRYPT_VERIFYCONTEXT);
if(!bProv)
{
fprintf(stderr, "CryptAcquireContext() failed with error %lu.\n", GetLastError());
}
else
{
LPVOID buf = VirtualAlloc(NULL, BUFFER_SIZE, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
if(buf==NULL)
{
fprintf(stderr, "VirtualAlloc() failed with error %lu.\n", GetLastError());
}
else
{
if(HashOneFile(argv[1], hProv, buf, BUFFER_SIZE))
ret = EXIT_SUCCESS;
else
fprintf(stderr, "HashOneFile() failed (last Win32 error: %lu).\n", GetLastError());
VirtualFree(buf, 0, MEM_RELEASE);
}
CryptReleaseContext(hProv, 0);
}
if(ret != EXIT_SUCCESS)
fprintf(stderr, "Failed.\n");
return ret;
} |
Partager