343 lines
11 KiB
C++
343 lines
11 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// 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);
|
|
}
|
|
}
|