windows-nt/Source/XPSP1/NT/ds/security/cryptoapi/pkitrust/wintrust/usagedef.cpp
2020-09-26 16:20:57 +08:00

261 lines
7.3 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: usagedef.cpp
//
// Contents: Microsoft Internet Security Trust Provider Model
//
// Functions: WintrustAddDefaultForUsage
// WintrustGetDefaultForUsage
//
// History: 07-Sep-1997 pberkman created
//
//--------------------------------------------------------------------------
#include "global.hxx"
#include "cryptreg.h"
BOOL WINAPI WintrustAddDefaultForUsage(const char *pszUsageOID,
CRYPT_PROVIDER_REGDEFUSAGE *psDefUsage)
{
HKEY hKey;
WCHAR wsz[REG_MAX_KEY_NAME];
WCHAR wszUsage[REG_MAX_FUNC_NAME];
WCHAR wszGuid[REG_MAX_GUID_TEXT];
DWORD dwDisposition;
HRESULT hr;
int cchUsage;
if (!(pszUsageOID) ||
!(psDefUsage) ||
!(_ISINSTRUCT(CRYPT_PROVIDER_REGDEFUSAGE,
psDefUsage->cbStruct,
pwszFreeCallbackDataFunctionName)) ||
!(psDefUsage->pgActionID))
{
SetLastError(ERROR_INVALID_PARAMETER);
return(FALSE);
}
if (!(guid2wstr(psDefUsage->pgActionID, &wszGuid[0])))
{
SetLastError(ERROR_INVALID_PARAMETER);
return(FALSE);
}
wszUsage[0] = L'\0';
cchUsage = MultiByteToWideChar(0, 0, pszUsageOID, -1, &wszUsage[0],
REG_MAX_FUNC_NAME);
if (0 >= cchUsage)
{
SetLastError(ERROR_INVALID_PARAMETER);
return(FALSE);
}
if (REG_MAX_KEY_NAME < wcslen(REG_TRUST_USAGE_KEY) + 1 + cchUsage + 1)
{
SetLastError(ERROR_INVALID_PARAMETER);
return(FALSE);
}
wcscpy(&wsz[0], REG_TRUST_USAGE_KEY);
wcscat(&wsz[0], L"\\");
wcscat(&wsz[0], &wszUsage[0]);
if (RegCreateKeyExU(HKEY_LOCAL_MACHINE,
&wsz[0],
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
&hKey, &dwDisposition) != ERROR_SUCCESS)
{
return(FALSE);
}
hr = RegSetValueExU(hKey, REG_DEF_FOR_USAGE,
0, REG_SZ,
(BYTE *)&wszGuid[0],
(wcslen(&wszGuid[0]) + 1) * sizeof(WCHAR));
if (psDefUsage->pwszDllName)
{
hr |= RegSetValueExU(hKey, REG_DLL_NAME,
0, REG_SZ,
(BYTE *)psDefUsage->pwszDllName,
(wcslen(psDefUsage->pwszDllName) + 1) * sizeof(WCHAR));
if (psDefUsage->pwszLoadCallbackDataFunctionName)
{
hr |= RegSetValueExA(hKey, REG_DEF_CALLBACK_ALLOC,
0, REG_SZ,
(BYTE *)psDefUsage->pwszLoadCallbackDataFunctionName,
strlen(psDefUsage->pwszLoadCallbackDataFunctionName) + 1);
if (psDefUsage->pwszFreeCallbackDataFunctionName)
{
hr |= RegSetValueExA(hKey, REG_DEF_CALLBACK_FREE,
0, REG_SZ,
(BYTE *)psDefUsage->pwszFreeCallbackDataFunctionName,
strlen(psDefUsage->pwszFreeCallbackDataFunctionName) + 1);
}
}
}
RegCloseKey(hKey);
return((hr == ERROR_SUCCESS) ? TRUE : FALSE);
}
BOOL WINAPI WintrustGetDefaultForUsage(DWORD dwAction, const char *pszUsageOID,
CRYPT_PROVIDER_DEFUSAGE *psUsage)
{
BOOL fRet;
HKEY hKey;
WCHAR wsz[REG_MAX_KEY_NAME];
char szFunc[REG_MAX_FUNC_NAME];
WCHAR wszUsage[REG_MAX_FUNC_NAME];
WCHAR wszGuid[REG_MAX_GUID_TEXT];
DWORD dwType;
DWORD dwSize;
HINSTANCE hDll;
PFN_ALLOCANDFILLDEFUSAGE pfnAlloc;
PFN_FREEDEFUSAGE pfnFree;
int cchUsage;
fRet = TRUE;
hKey = NULL;
hDll = NULL;
pfnAlloc = NULL;
pfnFree = NULL;
if (!(pszUsageOID) ||
!(psUsage) ||
!(_ISINSTRUCT(CRYPT_PROVIDER_DEFUSAGE,
psUsage->cbStruct,
pDefSIPClientData)))
{
goto InvalidParamError;
}
memset(&psUsage->gActionID, 0x00, sizeof(GUID));
wszUsage[0] = L'\0';
cchUsage = MultiByteToWideChar(0, 0, pszUsageOID, -1, &wszUsage[0],
REG_MAX_FUNC_NAME);
if (0 >= cchUsage)
{
goto InvalidParamError;
}
if (REG_MAX_KEY_NAME < wcslen(REG_TRUST_USAGE_KEY) + 1 + cchUsage + 1)
{
goto InvalidParamError;
}
wcscpy(&wsz[0], REG_TRUST_USAGE_KEY);
wcscat(&wsz[0], L"\\");
wcscat(&wsz[0], &wszUsage[0]);
if (RegOpenKeyExU( HKEY_LOCAL_MACHINE,
&wsz[0],
0,
KEY_READ,
&hKey) != ERROR_SUCCESS)
{
goto RegOpenError;
}
//
// get the dll name and function entry points
//
dwType = 0;
dwSize = REG_MAX_KEY_NAME * sizeof(WCHAR);
if (RegQueryValueExU(hKey, REG_DLL_NAME, NULL, &dwType, (BYTE *)&wsz[0], &dwSize) == ERROR_SUCCESS)
{
if (hDll = LoadLibraryU(&wsz[0]))
{
dwType = 0;
dwSize = REG_MAX_FUNC_NAME;
if (RegQueryValueExA(hKey,
(dwAction == DWACTION_FREE) ? REG_DEF_CALLBACK_FREE : REG_DEF_CALLBACK_ALLOC,
NULL, &dwType, (BYTE *)&szFunc[0], &dwSize) == ERROR_SUCCESS)
{
if (dwAction == DWACTION_FREE)
{
pfnFree = (PFN_FREEDEFUSAGE)GetProcAddress(hDll, &szFunc[0]);
if (pfnFree)
{
(*pfnFree)(pszUsageOID, psUsage);
}
fRet = TRUE;
goto CommonReturn;
}
pfnAlloc = (PFN_ALLOCANDFILLDEFUSAGE)GetProcAddress(hDll, &szFunc[0]);
}
}
}
if (dwAction != DWACTION_ALLOCANDFILL)
{
goto CommonReturn;
}
dwType = 0;
dwSize = REG_MAX_GUID_TEXT * sizeof(WCHAR);
wszGuid[0] = NULL;
if (RegQueryValueExU( hKey,
REG_DEF_FOR_USAGE,
NULL,
&dwType,
(BYTE *)&wszGuid[0],
&dwSize) != ERROR_SUCCESS)
{
goto RegQueryError;
}
if (!(wstr2guid(&wszGuid[0], &psUsage->gActionID)))
{
goto GuidError;
}
if (pfnAlloc)
{
if (!(*pfnAlloc)(pszUsageOID, psUsage))
{
goto UsageAllocError;
}
}
CommonReturn:
if (hKey)
{
RegCloseKey(hKey);
}
if (hDll)
{
FreeLibrary(hDll);
}
return(fRet);
ErrorReturn:
fRet = FALSE;
goto CommonReturn;
TRACE_ERROR_EX(DBG_SS, RegOpenError);
TRACE_ERROR_EX(DBG_SS, RegQueryError);
TRACE_ERROR_EX(DBG_SS, GuidError);
TRACE_ERROR_EX(DBG_SS, UsageAllocError);
SET_ERROR_VAR_EX(DBG_SS, InvalidParamError, ERROR_INVALID_PARAMETER);
}