You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
221 lines
4.1 KiB
221 lines
4.1 KiB
// CoMD5.cpp : Implementation of CCoMD5
|
|
#include "stdafx.h"
|
|
#include "ComMD5.h"
|
|
#include "CoMD5.h"
|
|
#include "pperr.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CCoMD5
|
|
|
|
VOID
|
|
ToHex(
|
|
LPBYTE pSrc,
|
|
UINT cSrc,
|
|
LPSTR pDst
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Convert binary data to ASCII hex representation
|
|
|
|
Arguments:
|
|
|
|
pSrc - binary data to convert
|
|
cSrc - length of binary data
|
|
pDst - buffer receiving ASCII representation of pSrc
|
|
|
|
Return Value:
|
|
|
|
Nothing
|
|
|
|
--*/
|
|
|
|
{
|
|
#define TOHEX(a) ((a)>=10 ? 'a'+(a)-10 : '0'+(a))
|
|
|
|
for ( UINT x = 0, y = 0 ; x < cSrc ; ++x )
|
|
{
|
|
UINT v;
|
|
v = pSrc[x]>>4;
|
|
pDst[y++] = TOHEX( v );
|
|
v = pSrc[x]&0x0f;
|
|
pDst[y++] = TOHEX( v );
|
|
}
|
|
pDst[y] = '\0';
|
|
}
|
|
|
|
LONG MD5(UCHAR* pBuf, UINT nBuf, UCHAR* digest)
|
|
{
|
|
MD5_CTX context;
|
|
|
|
if(pBuf==NULL || IsBadReadPtr((CONST VOID*)pBuf, (UINT)nBuf))
|
|
{
|
|
return ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
MD5Init (&context);
|
|
MD5Update (&context, pBuf, nBuf);
|
|
MD5Final (&context);
|
|
|
|
memcpy(digest, context.digest, 16);
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CCoMD5::MD5HashASCII(
|
|
BSTR bstrSource,
|
|
BSTR* pbstrDigest
|
|
)
|
|
{
|
|
HRESULT hr;
|
|
LONG lResult;
|
|
UCHAR achDigest[20];
|
|
CHAR achDigestStr[36];
|
|
|
|
if (NULL == pbstrDigest)
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
lResult = MD5((UCHAR*)(CHAR*)bstrSource,
|
|
::SysStringByteLen(bstrSource),
|
|
achDigest);
|
|
if(lResult != ERROR_SUCCESS)
|
|
{
|
|
hr = PP_E_MD5_HASH_FAILED;
|
|
goto Cleanup;
|
|
}
|
|
|
|
ToHex(achDigest, 16, achDigestStr);
|
|
|
|
*pbstrDigest = ::SysAllocStringByteLen(achDigestStr, ::strlen(achDigestStr));
|
|
if(*pbstrDigest == NULL)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto Cleanup;
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
Cleanup:
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CCoMD5::MD5Hash(
|
|
BSTR bstrSource,
|
|
BSTR* pbstrDigest
|
|
)
|
|
{
|
|
HRESULT hr;
|
|
BSTR asciiDigest = NULL;
|
|
|
|
if (NULL == pbstrDigest)
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
hr = MD5HashASCII(bstrSource, &asciiDigest);
|
|
|
|
if (S_OK != hr)
|
|
goto Cleanup;
|
|
|
|
*pbstrDigest = ::SysAllocString((WCHAR*)_bstr_t((CHAR*)asciiDigest));
|
|
if(*pbstrDigest == NULL)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto Cleanup;
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
Cleanup:
|
|
if (asciiDigest)
|
|
{
|
|
SysFreeString(asciiDigest);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
// this hashes only the half of the bstrSource. It is provided for backword compatility only
|
|
STDMETHODIMP CCoMD5::MD5HashAsp(
|
|
BSTR bstrSource,
|
|
BSTR* pbstrDigest
|
|
)
|
|
{
|
|
HRESULT hr;
|
|
LONG lResult;
|
|
UCHAR achDigest[20];
|
|
CHAR achDigestStr[36];
|
|
|
|
if (NULL == pbstrDigest)
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
lResult = MD5((UCHAR*)(
|
|
CHAR*)_bstr_t(bstrSource),
|
|
::SysStringLen(bstrSource),
|
|
achDigest);
|
|
if(lResult != ERROR_SUCCESS)
|
|
{
|
|
hr = E_FAIL;
|
|
goto Cleanup;
|
|
}
|
|
|
|
ToHex(achDigest, 16, achDigestStr);
|
|
|
|
*pbstrDigest = ::SysAllocString((WCHAR*)_bstr_t((CHAR*)achDigestStr));
|
|
if(*pbstrDigest == NULL)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto Cleanup;
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
Cleanup:
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// IPassportService implementation
|
|
|
|
STDMETHODIMP CCoMD5::Initialize(BSTR configfile, IServiceProvider* p)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CCoMD5::Shutdown()
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CCoMD5::ReloadState(IServiceProvider*)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CCoMD5::CommitState(IServiceProvider*)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CCoMD5::DumpState(BSTR* pbstrState)
|
|
{
|
|
ATLASSERT( *pbstrState != NULL &&
|
|
"CCoMD5:DumpState - "
|
|
"Are you sure you want to hand me a non-null BSTR?" );
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
return hr;
|
|
}
|