WindowsXP-SP1/enduser/netmeeting/nmutil/hash.cpp

118 lines
2.9 KiB
C++

// HASH.CPP
//
// Hash utility functions for use in NetMeeting components.
#include "precomp.h"
#include <oprahcom.h>
#include "nb30.h"
#include "regentry.h"
#include "confreg.h"
CHash::CHash() : m_hProv(0), m_hHash(0), m_pbHashedData(NULL), m_cbHashedData(0), m_fReady(FALSE)
{
if (!CryptAcquireContext(&m_hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET))
{
// Create new if can not get default
if (!CryptAcquireContext(&m_hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET))
{
goto ErrorExit;
}
}
m_fReady = TRUE;
return;
ErrorExit:
m_fReady = FALSE;
}
CHash::~CHash()
{
if (m_pbHashedData) delete []m_pbHashedData;
CryptAcquireContext(&m_hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET | CRYPT_MACHINE_KEYSET);
if (m_hHash) CryptDestroyHash(m_hHash);
if (m_hProv) CryptReleaseContext(m_hProv, 0);
}
DWORD CHash::GetHashedData(PBYTE pbData, DWORD cbData, void ** ppvHashedData)
{
ASSERT(NULL != ppvHashedData);
ASSERT(NULL != pbData);
DWORD dwCount;
RegEntry re(WINDOWS_KEY, HKEY_LOCAL_MACHINE);
if (FALSE == m_fReady)
{
goto ErrorExit;
}
if (0 == cbData) {
goto ErrorExit;
}
if (m_hHash) CryptDestroyHash(m_hHash);
if (!CryptCreateHash(m_hProv, CALG_MD5, 0, 0, &m_hHash))
{
ERROR_OUT(("CHash::GetHashData() - Error creating crypt hash object."));
goto ErrorExit;
}
if (!CryptHashData(m_hHash, pbData, cbData, 0))
{
ERROR_OUT(("CHash::GetHashData() - Error hashing data."));
goto ErrorExit;
}
if (!CryptHashData(m_hHash, (PBYTE) re.GetString(REGVAL_REGISTERED_USER),
lstrlen(re.GetString(REGVAL_REGISTERED_USER)), 0))
{
ERROR_OUT(("CHash::GetHashData() - Error hashing extra data."));
goto ErrorExit;
}
NCB ncb;
BYTE buf[sizeof(NCB) + 256];
ZeroMemory ( &ncb, sizeof(ncb));
ncb.ncb_command = NCBASTAT;
ncb.ncb_buffer = buf;
ncb.ncb_length = sizeof(buf);
memcpy ( (PBYTE)ncb.ncb_callname, (PBYTE)"* ", NCBNAMSZ );
if ( NRC_GOODRET == Netbios(&ncb) )
{
//
// NOTE: the buffer filled by the Netbios ASTAT command starts
// with a 6-byte encoded adapter address: just use the raw
// buffer rather than casting back to PBYTE
//
if (!CryptHashData(m_hHash, buf, 6, 0 ))
{
ERROR_OUT(("CHash::GetHashData() - Error hashing ncb data."));
goto ErrorExit;
}
}
else
{
WARNING_OUT(("CHash::GetHashData: Netbios failed %x", ncb.ncb_retcode));
}
dwCount = sizeof(DWORD);
if (!CryptGetHashParam(m_hHash, HP_HASHSIZE, (BYTE *)&m_cbHashedData, &dwCount, 0))
{
goto ErrorExit;
}
if (m_pbHashedData) delete [] m_pbHashedData;
if (NULL == (m_pbHashedData = new BYTE[m_cbHashedData]))
{
goto ErrorExit;
}
if (!CryptGetHashParam(m_hHash, HP_HASHVAL, m_pbHashedData, &m_cbHashedData, 0)) {
goto ErrorExit;
}
*ppvHashedData = m_pbHashedData;
return m_cbHashedData;
ErrorExit:
return 0; // Hash data failed
}