218 lines
6.3 KiB
C++
218 lines
6.3 KiB
C++
// COnlineAuthority
|
|
// copyright 1997 Microsoft Corp
|
|
// created 5/19/97 by boydm
|
|
|
|
#include "stdafx.h"
|
|
#define INITGUID
|
|
#include "keyring.h"
|
|
|
|
#include "certcli.h"
|
|
#include "OnlnAuth.h"
|
|
|
|
|
|
DEFINE_GUID(IID_ICertGetConfig,
|
|
0xc7ea09c0, 0xce17, 0x11d0, 0x88, 0x33, 0x00, 0xa0, 0xc9, 0x03, 0xb8, 0x3c);
|
|
|
|
//DEFINE_GUID(IID_ICertConfig,
|
|
// 0x372fce34, 0x4324, 0x11d0, 0x88, 0x10, 0x00, 0xa0, 0xc9, 0x03, 0xb8, 0x3c);
|
|
|
|
DEFINE_GUID(IID_ICertRequest,
|
|
0x014e4840, 0x5523, 0x11d0, 0x88, 0x12, 0x00, 0xa0, 0xc9, 0x03, 0xb8, 0x3c);
|
|
|
|
// defines to get the class factory ids out of the registry
|
|
#define SZREG_CERTGETCONFIG _T("CertGetConfig")
|
|
#define SZREG_CERTREQUEST _T("CertRequest")
|
|
|
|
//---------------------------------------------------------------------------
|
|
COnlineAuthority::COnlineAuthority():
|
|
pIConfig(NULL),
|
|
pIRequest(NULL)
|
|
{
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
COnlineAuthority::~COnlineAuthority()
|
|
{
|
|
// if we already have interfaces - release them
|
|
if ( pIConfig )
|
|
pIConfig->Release();
|
|
if ( pIRequest )
|
|
pIRequest->Release();
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
// initialize the class with an interface string
|
|
BOOL COnlineAuthority::FInitSZ( CString szCA )
|
|
{
|
|
HRESULT hresError;
|
|
IID iidConfig, iidRequest;
|
|
OLECHAR* poch = NULL;
|
|
CString szConfig, szRequest;
|
|
|
|
CString szRegKeyName;
|
|
DWORD dwType;
|
|
DWORD cbBuff;
|
|
DWORD err;
|
|
HKEY hKey;
|
|
|
|
// load the base registry key name
|
|
szRegKeyName.LoadString( IDS_CA_LOCATION );
|
|
|
|
// add the CA
|
|
szRegKeyName += _T("\\");
|
|
szRegKeyName += szCA;
|
|
|
|
// open the registry key, if it exists
|
|
err = RegOpenKeyEx(
|
|
HKEY_LOCAL_MACHINE, // handle of open key
|
|
szRegKeyName, // address of name of subkey to open
|
|
0, // reserved
|
|
KEY_READ, // security access mask
|
|
&hKey // address of handle of open key
|
|
);
|
|
|
|
// if we did not open the key for any reason (say... it doesn't exist)
|
|
// then leave right away
|
|
if ( err != ERROR_SUCCESS )
|
|
return FALSE;
|
|
|
|
// get the config value
|
|
cbBuff = MAX_PATH;
|
|
err = RegQueryValueEx(
|
|
hKey, // handle of key to query
|
|
SZREG_CERTGETCONFIG,// address of name of value to query
|
|
NULL, // reserved
|
|
&dwType, // address of buffer for value type
|
|
(PUCHAR)szConfig.GetBuffer(cbBuff+1), // address of data buffer
|
|
&cbBuff // address of data buffer size
|
|
);
|
|
szConfig.ReleaseBuffer();
|
|
if ( err != ERROR_SUCCESS )
|
|
{
|
|
RegCloseKey( hKey );
|
|
return FALSE;
|
|
}
|
|
|
|
// get the request value
|
|
cbBuff = MAX_PATH;
|
|
err = RegQueryValueEx(
|
|
hKey, // handle of key to query
|
|
SZREG_CERTREQUEST, // address of name of value to query
|
|
NULL, // reserved
|
|
&dwType, // address of buffer for value type
|
|
(PUCHAR)szRequest.GetBuffer(cbBuff+1), // address of data buffer
|
|
&cbBuff // address of data buffer size
|
|
);
|
|
szRequest.ReleaseBuffer();
|
|
if ( err != ERROR_SUCCESS )
|
|
{
|
|
RegCloseKey( hKey );
|
|
return FALSE;
|
|
}
|
|
|
|
// all done, close the key before leaving
|
|
RegCloseKey( hKey );
|
|
|
|
//======= first, convert the szGuid to a real binary GUID
|
|
// allocate the name buffer
|
|
poch = (OLECHAR*)GlobalAlloc( GPTR, MAX_PATH * 2 );
|
|
|
|
// unicodize the name into the buffer
|
|
if ( poch )
|
|
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szConfig, -1,
|
|
poch, MAX_PATH * 2 );
|
|
|
|
// convert the string to an IID that we can use
|
|
hresError = CLSIDFromString( poch, &iidConfig );
|
|
|
|
// unicodize the name into the buffer
|
|
if ( poch )
|
|
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szRequest, -1,
|
|
poch, MAX_PATH * 2 );
|
|
|
|
// convert the string to an IID that we can use
|
|
hresError = CLSIDFromString( poch, &iidRequest );
|
|
|
|
// cleanup
|
|
GlobalFree( poch );
|
|
if ( FAILED(hresError) )
|
|
{
|
|
AfxMessageBox( IDS_CA_INVALID );
|
|
return FALSE;
|
|
}
|
|
|
|
//======= if we already have interfaces - release them
|
|
if ( pIConfig )
|
|
pIConfig->Release();
|
|
pIConfig = NULL;
|
|
if ( pIRequest )
|
|
pIRequest->Release();
|
|
pIRequest = NULL;
|
|
|
|
//======= start by obtaining the class factory pointer
|
|
IClassFactory* pcsfFactory = NULL;
|
|
COSERVERINFO csiMachineName;
|
|
|
|
//fill the structure for CoGetClassObject
|
|
ZeroMemory( &csiMachineName, sizeof(csiMachineName) );
|
|
// csiMachineName.pAuthInfo = NULL;
|
|
// csiMachineName.dwFlags = 0;
|
|
// csiMachineName.pServerInfoExt = NULL;
|
|
csiMachineName.pwszName = NULL;
|
|
|
|
// get the class factory
|
|
hresError = CoGetClassObject( iidConfig, CLSCTX_INPROC, NULL,
|
|
IID_IClassFactory, (void**) &pcsfFactory);
|
|
if (FAILED(hresError))
|
|
return FALSE;
|
|
|
|
//======= now we get the interfaces themselves
|
|
hresError = pcsfFactory->CreateInstance(NULL, IID_ICertGetConfig, (void **)&pIConfig);
|
|
if (FAILED(hresError))
|
|
{
|
|
pcsfFactory->Release();
|
|
return FALSE;
|
|
}
|
|
|
|
// release the factory
|
|
pcsfFactory->Release();
|
|
|
|
// get the class factory
|
|
hresError = CoGetClassObject( iidRequest, CLSCTX_INPROC, NULL,
|
|
IID_IClassFactory, (void**) &pcsfFactory);
|
|
if (FAILED(hresError))
|
|
return FALSE;
|
|
|
|
hresError = pcsfFactory->CreateInstance(NULL, IID_ICertRequest, (void **)&pIRequest);
|
|
if (FAILED(hresError))
|
|
{
|
|
pIConfig->Release();
|
|
pcsfFactory->Release();
|
|
return FALSE;
|
|
}
|
|
|
|
// release the factory
|
|
pcsfFactory->Release();
|
|
|
|
// success
|
|
return TRUE;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
// stored property strings
|
|
BOOL COnlineAuthority::FSetPropertyString( BSTR bstr )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
BOOL COnlineAuthority::FGetPropertyString( BSTR* pBstr )
|
|
{
|
|
HRESULT hErr;
|
|
|
|
// make the call
|
|
hErr = pIConfig->GetConfig( 0, pBstr);
|
|
|
|
return SUCCEEDED(hErr);
|
|
}
|