#include "HashDataProvider.h"
CHashDataProvider::CHashDataProvider(void)
{
InitializeData();
}
CHashDataProvider::~CHashDataProvider(void)
{
}
bool
CHashDataProvider::HashData(ALG_ID algorithmID,
LPCTSTR plainText,
LPTSTR hashedText)
{
InitializeData();
bool rc = true;
DWORD dwDataLen = 0;
if (!CryptAcquireContext(
&m_hProv,
NULL,
NULL,
PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT))
{
AfxMessageBox("Error in AcquireContext 0x%08x n", GetLastError());
rc = false;
FreeResources();
}
if (!CryptCreateHash(
m_hProv,
algorithmID,
0,
0,
&m_hHash))
{
AfxMessageBox("Error in CryptCreateHash 0x%08x n", GetLastError());
rc = false;
FreeResources();
}
if (!CryptHashData(
m_hHash,
(const BYTE *) plainText,
_tcslen(plainText)*sizeof(TCHAR),
0))
{
AfxMessageBox("Error in CryptHashData 0x%08x n", GetLastError());
rc = false;
FreeResources();
}
if (!CryptGetHashParam(
m_hHash,
HP_HASHVAL,
NULL,
&dwDataLen,
0))
{
AfxMessageBox("Error in CryptGetHashParam 0x%08x n", GetLastError());
rc = false;
FreeResources();
}
m_pbHash = (BYTE\*)malloc(dwDataLen);
if(NULL == m_pbHash)
{
AfxMessageBox("unable to allocate memoryn");
rc = false;
FreeResources();
}
if (!CryptGetHashParam(
m_hHash,
HP_HASHVAL,
m_pbHash,
&dwDataLen,
0))
{
AfxMessageBox("Error in CryptGetHashParam 0x%08x n", GetLastError());
rc = false;
FreeResources();
}
hashedText = FormatData(m_pbHash, dwDataLen, hashedText);
FreeResources();
return rc;
}
void CHashDataProvider::FreeResources()
{
if(m_hHash)
CryptDestroyHash(m_hHash);
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
if(m_pbHash)
free(m_pbHash);
}
void CHashDataProvider::InitializeData()
{
m_hProv = NULL;
m_hHash = NULL;
m_pbHash = NULL;
}
LPTSTR CHashDataProvider::FormatData(PBYTE pbHash, DWORD dwDataLen, LPTSTR hashedText)
{
TCHAR rstData[BUFFER_SIZE]= {0};
TCHAR tmpBuffer[3] = {0};
for (DWORD i = 0 ; i < dwDataLen ; i++)
{
tmpBuffer[0] = 0;
tmpBuffer[1] = 0;
tmpBuffer[2] = 0;
_stprintf_s(tmpBuffer, _T("%2.2x"), pbHash\[i\]);
_tcscat_s(rstData, tmpBuffer);
}
_tcscpy(hashedText, rstData);
return hashedText;
}