157 lines
4.6 KiB
C++
157 lines
4.6 KiB
C++
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|||
|
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
|||
|
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|||
|
// PARTICULAR PURPOSE.
|
|||
|
//
|
|||
|
// Copyright (C) Microsoft. All rights reserved.
|
|||
|
/*++
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Sample program for SHA 256 hashing using CNG
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include <windows.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <bcrypt.h>
|
|||
|
|
|||
|
//#pragma comment(lib, "Ncrypt.lib")
|
|||
|
|
|||
|
#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
|
|||
|
#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)
|
|||
|
|
|||
|
|
|||
|
static const BYTE rgbMsg[] =
|
|||
|
{
|
|||
|
0x61, 0x62, 0x63
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
void __cdecl hmac_sha256()
|
|||
|
{
|
|||
|
|
|||
|
BCRYPT_ALG_HANDLE hAlg = NULL;
|
|||
|
BCRYPT_HASH_HANDLE hHash = NULL;
|
|||
|
NTSTATUS status = STATUS_UNSUCCESSFUL;
|
|||
|
DWORD cbData = 0,
|
|||
|
cbHash = 0,
|
|||
|
cbHashObject = 0;
|
|||
|
PBYTE pbHashObject = NULL;
|
|||
|
PBYTE pbHash = NULL;
|
|||
|
|
|||
|
//open an algorithm handle
|
|||
|
if(!NT_SUCCESS(status = BCryptOpenAlgorithmProvider(
|
|||
|
&hAlg,
|
|||
|
BCRYPT_SHA256_ALGORITHM,
|
|||
|
NULL,
|
|||
|
BCRYPT_ALG_HANDLE_HMAC_FLAG)))
|
|||
|
{
|
|||
|
wprintf(L"**** Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
//calculate the size of the buffer to hold the hash object
|
|||
|
if(!NT_SUCCESS(status = BCryptGetProperty(
|
|||
|
hAlg,
|
|||
|
BCRYPT_OBJECT_LENGTH,
|
|||
|
(PBYTE)&cbHashObject,
|
|||
|
sizeof(DWORD),
|
|||
|
&cbData,
|
|||
|
0)))
|
|||
|
{
|
|||
|
wprintf(L"**** Error 0x%x returned by BCryptGetProperty\n", status);
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
//allocate the hash object on the heap
|
|||
|
pbHashObject = (PBYTE)HeapAlloc (GetProcessHeap (), 0, cbHashObject);
|
|||
|
if(NULL == pbHashObject)
|
|||
|
{
|
|||
|
wprintf(L"**** memory allocation failed\n");
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
//calculate the length of the hash
|
|||
|
if(!NT_SUCCESS(status = BCryptGetProperty(
|
|||
|
hAlg,
|
|||
|
BCRYPT_HASH_LENGTH,
|
|||
|
(PBYTE)&cbHash,
|
|||
|
sizeof(DWORD),
|
|||
|
&cbData,
|
|||
|
0)))
|
|||
|
{
|
|||
|
wprintf(L"**** Error 0x%x returned by BCryptGetProperty\n", status);
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
//allocate the hash buffer on the heap
|
|||
|
pbHash = (PBYTE)HeapAlloc (GetProcessHeap (), 0, cbHash);
|
|||
|
if(NULL == pbHash)
|
|||
|
{
|
|||
|
wprintf(L"**** memory allocation failed\n");
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
//create a hash
|
|||
|
if(!NT_SUCCESS(status = BCryptCreateHash(
|
|||
|
hAlg,
|
|||
|
&hHash,
|
|||
|
pbHashObject,
|
|||
|
cbHashObject,
|
|||
|
NULL,
|
|||
|
0,
|
|||
|
0)))
|
|||
|
{
|
|||
|
wprintf(L"**** Error 0x%x returned by BCryptCreateHash\n", status);
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//hash some data
|
|||
|
if(!NT_SUCCESS(status = BCryptHashData(
|
|||
|
hHash,
|
|||
|
(PBYTE)rgbMsg,
|
|||
|
sizeof(rgbMsg),
|
|||
|
0)))
|
|||
|
{
|
|||
|
wprintf(L"**** Error 0x%x returned by BCryptHashData\n", status);
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
//close the hash
|
|||
|
if(!NT_SUCCESS(status = BCryptFinishHash(
|
|||
|
hHash,
|
|||
|
pbHash,
|
|||
|
cbHash,
|
|||
|
0)))
|
|||
|
{
|
|||
|
wprintf(L"**** Error 0x%x returned by BCryptFinishHash\n", status);
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
wprintf(L"Success!\n");
|
|||
|
|
|||
|
Cleanup:
|
|||
|
|
|||
|
if(hAlg)
|
|||
|
{
|
|||
|
BCryptCloseAlgorithmProvider(hAlg,0);
|
|||
|
}
|
|||
|
|
|||
|
if (hHash)
|
|||
|
{
|
|||
|
BCryptDestroyHash(hHash);
|
|||
|
}
|
|||
|
|
|||
|
if(pbHashObject)
|
|||
|
{
|
|||
|
HeapFree(GetProcessHeap(), 0, pbHashObject);
|
|||
|
}
|
|||
|
|
|||
|
if(pbHash)
|
|||
|
{
|
|||
|
HeapFree(GetProcessHeap(), 0, pbHash);
|
|||
|
}
|
|||
|
|
|||
|
}
|