// 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); }