|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: provload.cpp
//
// Contents: Microsoft Internet Security Trust Provider
//
// Functions: WintrustLoadFunctionPointers
// WintrustFindProvider
// WintrustUnloadProviderList
//
// *** local functions ***
// _CheckLoadedProviders
// _CheckRegisteredProviders
// _provLoadDLL
// _provUnloadDLL
// _provLoadFunction
//
// History: 29-May-1997 pberkman created
//
//--------------------------------------------------------------------------
#include "global.hxx"
#include "cryptreg.h"
#include "eventlst.h"
LOADED_PROVIDER *_CheckLoadedProviders(GUID *pgActionID); LOADED_PROVIDER *_CheckRegisteredProviders(GUID *pgActionID);
BOOL _provLoadDLL(WCHAR *pwszDLL, HINSTANCE *phDLL); void _provUnloadDLL(HINSTANCE hDLL, WCHAR *pwszDLLName); BOOL _provLoadFunction(char *pszFunc, HINSTANCE hDLL, void **pfn);
LOADED_PROVIDER *pProviderList = NULL;
BOOL WINAPI WintrustLoadFunctionPointers(GUID *pgActionID, CRYPT_PROVIDER_FUNCTIONS *pPfns) { LOADED_PROVIDER *pProvFuncs;
if (!(pPfns) || !(WVT_IS_CBSTRUCT_GT_MEMBEROFFSET(CRYPT_PROVIDER_FUNCTIONS, pPfns->cbStruct, psUIpfns))) { return(FALSE); }
if (!(pProvFuncs = WintrustFindProvider(pgActionID))) { return(FALSE); }
pPfns->pfnAlloc = WVTNew; pPfns->pfnFree = WVTDelete; pPfns->pfnAddStore2Chain = WVTAddStore; pPfns->pfnAddSgnr2Chain = WVTAddSigner; pPfns->pfnAddCert2Chain = WVTAddCertContext; pPfns->pfnAddPrivData2Chain = WVTAddPrivateData;
pPfns->pfnInitialize = pProvFuncs->pfnInitialize; pPfns->pfnObjectTrust = pProvFuncs->pfnObjectTrust; pPfns->pfnSignatureTrust = pProvFuncs->pfnSignatureTrust; pPfns->pfnCertificateTrust = pProvFuncs->pfnCertificateTrust; pPfns->pfnFinalPolicy = pProvFuncs->pfnFinalPolicy; pPfns->pfnCertCheckPolicy = pProvFuncs->pfnCertCheckPolicy; pPfns->pfnTestFinalPolicy = pProvFuncs->pfnTestFinalPolicy; if (WVT_IS_CBSTRUCT_GT_MEMBEROFFSET(CRYPT_PROVIDER_FUNCTIONS, pPfns->cbStruct, pfnCleanupPolicy)) { pPfns->pfnCleanupPolicy = pProvFuncs->pfnCleanupPolicy; }
return(TRUE); }
LOADED_PROVIDER *WintrustFindProvider(GUID *pgActionID) { LOADED_PROVIDER *pProvider;
if (!(pProvider = _CheckLoadedProviders(pgActionID))) { # if (DBG)
DbgPrintf(DBG_SS, "Loading Provider: %08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X\n", pgActionID->Data1, pgActionID->Data2, pgActionID->Data3, pgActionID->Data4[0], pgActionID->Data4[1], pgActionID->Data4[2], pgActionID->Data4[3], pgActionID->Data4[4], pgActionID->Data4[5], pgActionID->Data4[6], pgActionID->Data4[7]); # endif // DBG
pProvider = _CheckRegisteredProviders(pgActionID); }
# if (DBG)
if (!(pProvider)) { DbgPrintf(DBG_SS, "PROV NOT FOUND: %08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X\n", pgActionID->Data1, pgActionID->Data2, pgActionID->Data3, pgActionID->Data4[0], pgActionID->Data4[1], pgActionID->Data4[2], pgActionID->Data4[3], pgActionID->Data4[4], pgActionID->Data4[5], pgActionID->Data4[6], pgActionID->Data4[7]); }
# endif
return(pProvider); }
LOADED_PROVIDER *_CheckLoadedProviders(GUID *pgActionID) { LOADED_PROVIDER *pProvider;
AcquireReadLock(sProvLock);
pProvider = pProviderList;
while (pProvider) { if (memcmp(pgActionID, &pProvider->gActionID, sizeof(GUID)) == 0) { ReleaseReadLock(sProvLock);
return(pProvider); }
pProvider = pProvider->pNext; }
ReleaseReadLock(sProvLock);
return(NULL); }
BOOL WintrustUnloadProviderList(void) { LOADED_PROVIDER *pProvider; LOADED_PROVIDER *pProvHold;
AcquireWriteLock(sProvLock);
pProvider = pProviderList;
while (pProvider) { if (pProvider->hInitDLL) FreeLibrary(pProvider->hInitDLL); if (pProvider->hObjectDLL) FreeLibrary(pProvider->hObjectDLL); if (pProvider->hSignatureDLL) FreeLibrary(pProvider->hSignatureDLL); if (pProvider->hCertTrustDLL) FreeLibrary(pProvider->hCertTrustDLL); if (pProvider->hFinalPolicyDLL) FreeLibrary(pProvider->hFinalPolicyDLL); if (pProvider->hCertPolicyDLL) FreeLibrary(pProvider->hCertPolicyDLL); if (pProvider->hTestFinalPolicyDLL) FreeLibrary(pProvider->hTestFinalPolicyDLL); if (pProvider->hCleanupPolicyDLL) FreeLibrary(pProvider->hCleanupPolicyDLL);
# if (DBG)
DbgPrintf(DBG_SS, "Unloading Provider: %08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X\n", pProvider->gActionID.Data1, pProvider->gActionID.Data2, pProvider->gActionID.Data3, pProvider->gActionID.Data4[0], pProvider->gActionID.Data4[1], pProvider->gActionID.Data4[2], pProvider->gActionID.Data4[3], pProvider->gActionID.Data4[4], pProvider->gActionID.Data4[5], pProvider->gActionID.Data4[6], pProvider->gActionID.Data4[7]); # endif // DBG
pProvHold = pProvider->pNext;
delete pProvider;
pProvider = pProvHold; }
pProviderList = NULL;
ReleaseWriteLock(sProvLock);
return(TRUE); }
LOADED_PROVIDER *_CheckRegisteredProviders(GUID *pgActionID) { LOADED_PROVIDER *pProvider; BOOL fRet;
WCHAR wszInitDLL[REG_MAX_KEY_NAME]; WCHAR wszObjTrustDLL[REG_MAX_KEY_NAME]; WCHAR wszSigTrustDLL[REG_MAX_KEY_NAME]; WCHAR wszCertTrustDLL[REG_MAX_KEY_NAME]; WCHAR wszCertPolDLL[REG_MAX_KEY_NAME]; WCHAR wszFinalPolDLL[REG_MAX_KEY_NAME]; WCHAR wszTestFinalPolDLL[REG_MAX_KEY_NAME]; WCHAR wszCleanupPolDLL[REG_MAX_KEY_NAME];
char szInitFunc[REG_MAX_FUNC_NAME]; char szObjTrustFunc[REG_MAX_FUNC_NAME]; char szSigTrustFunc[REG_MAX_FUNC_NAME]; char szCertTrustFunc[REG_MAX_FUNC_NAME]; char szCertPolFunc[REG_MAX_FUNC_NAME]; char szFinalPolFunc[REG_MAX_FUNC_NAME]; char szTestFinalPolFunc[REG_MAX_FUNC_NAME]; char szCleanupPolFunc[REG_MAX_FUNC_NAME]; if (!(GetRegProvider(pgActionID, REG_CERTTRUST_PROVIDER_KEY, &wszCertTrustDLL[0], &szCertTrustFunc[0]))) { return(NULL); }
if (!(GetRegProvider(pgActionID, REG_FINALPOL_PROVIDER_KEY, &wszFinalPolDLL[0], &szFinalPolFunc[0]))) { return(NULL); }
// optional!
GetRegProvider(pgActionID, REG_INIT_PROVIDER_KEY, &wszInitDLL[0], &szInitFunc[0]); GetRegProvider(pgActionID, REG_OBJTRUST_PROVIDER_KEY, &wszObjTrustDLL[0], &szObjTrustFunc[0]); GetRegProvider(pgActionID, REG_SIGTRUST_PROVIDER_KEY, &wszSigTrustDLL[0], &szSigTrustFunc[0]); GetRegProvider(pgActionID, REG_CERTPOL_PROVIDER_KEY, &wszCertPolDLL[0], &szCertPolFunc[0]); GetRegProvider(pgActionID, REG_TESTPOL_PROVIDER_KEY, &wszTestFinalPolDLL[0], &szTestFinalPolFunc[0]); GetRegProvider(pgActionID, REG_CLEANUP_PROVIDER_KEY, &wszCleanupPolDLL[0], &szCleanupPolFunc[0]);
AcquireWriteLock(sProvLock);
if (!(pProvider = (LOADED_PROVIDER *)WVTNew(sizeof(LOADED_PROVIDER)))) { ReleaseWriteLock(sProvLock); return(NULL); }
memset(pProvider, 0x00, sizeof(LOADED_PROVIDER));
memcpy(&pProvider->gActionID, pgActionID, sizeof(GUID));
fRet = TRUE;
fRet &= _provLoadDLL(&wszCertTrustDLL[0], &pProvider->hCertTrustDLL); fRet &= _provLoadDLL(&wszFinalPolDLL[0], &pProvider->hFinalPolicyDLL); // optional!
_provLoadDLL(&wszInitDLL[0], &pProvider->hInitDLL); _provLoadDLL(&wszObjTrustDLL[0], &pProvider->hObjectDLL); _provLoadDLL(&wszSigTrustDLL[0], &pProvider->hSignatureDLL); _provLoadDLL(&wszCertPolDLL[0], &pProvider->hCertPolicyDLL); _provLoadDLL(&wszTestFinalPolDLL[0], &pProvider->hTestFinalPolicyDLL); _provLoadDLL(&wszCleanupPolDLL[0], &pProvider->hCleanupPolicyDLL);
fRet &= _provLoadFunction(&szCertTrustFunc[0], pProvider->hCertTrustDLL, (void **)&pProvider->pfnCertificateTrust); fRet &= _provLoadFunction(&szFinalPolFunc[0], pProvider->hFinalPolicyDLL, (void **)&pProvider->pfnFinalPolicy);
// optional!
_provLoadFunction(&szInitFunc[0], pProvider->hInitDLL, (void **)&pProvider->pfnInitialize); _provLoadFunction(&szObjTrustFunc[0], pProvider->hObjectDLL, (void **)&pProvider->pfnObjectTrust); _provLoadFunction(&szSigTrustFunc[0], pProvider->hSignatureDLL, (void **)&pProvider->pfnSignatureTrust); _provLoadFunction(&szCertPolFunc[0], pProvider->hCertPolicyDLL, (void **)&pProvider->pfnCertCheckPolicy); _provLoadFunction(&szTestFinalPolFunc[0], pProvider->hTestFinalPolicyDLL, (void **)&pProvider->pfnTestFinalPolicy); _provLoadFunction(&szCleanupPolFunc[0], pProvider->hCleanupPolicyDLL, (void **)&pProvider->pfnCleanupPolicy);
if (!(fRet)) { ReleaseWriteLock(sProvLock);
_provUnloadDLL(pProvider->hInitDLL, &wszInitDLL[0]); _provUnloadDLL(pProvider->hObjectDLL, &wszObjTrustDLL[0]); _provUnloadDLL(pProvider->hSignatureDLL, &wszSigTrustDLL[0]); _provUnloadDLL(pProvider->hCertTrustDLL, &wszCertTrustDLL[0]); _provUnloadDLL(pProvider->hFinalPolicyDLL, &wszFinalPolDLL[0]); _provUnloadDLL(pProvider->hCertPolicyDLL, &wszCertPolDLL[0]); _provUnloadDLL(pProvider->hTestFinalPolicyDLL, &wszTestFinalPolDLL[0]); _provUnloadDLL(pProvider->hCleanupPolicyDLL, &wszCleanupPolDLL[0]);
delete pProvider; return(NULL); }
pProvider->pNext = pProviderList; pProvider->pPrev = NULL;
if (pProvider->pNext) { pProvider->pNext->pPrev = pProvider; }
pProviderList = pProvider;
ReleaseWriteLock(sProvLock);
return(pProvider); }
BOOL _provLoadDLL(WCHAR *pwszDLL, HINSTANCE *phDLL) { *phDLL = NULL;
if (!(pwszDLL[0])) { return(FALSE); }
if (_wcsicmp(pwszDLL, W_MY_NAME) == 0) { *phDLL = (HINSTANCE)hMeDLL; } else { *phDLL = LoadLibraryU(pwszDLL); }
if (*phDLL) { return(TRUE); }
return(FALSE); }
BOOL _provLoadFunction(char *pszFunc, HINSTANCE hDLL, void **pfn) { *pfn = NULL;
if (!(pszFunc[0]) || !(hDLL)) { return(FALSE); }
*pfn = (void *)GetProcAddress(hDLL, pszFunc);
if (*pfn) { return(TRUE); }
return(FALSE); }
void _provUnloadDLL(HINSTANCE hDLL, WCHAR *pwszDLLName) { if ((hDLL) && (_wcsicmp(pwszDLLName, W_MY_NAME) != 0)) { FreeLibrary(hDLL); } }
|