553 lines
14 KiB
C++
553 lines
14 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1996 - 1999
|
|
//
|
|
// File: sipfuncs.cpp
|
|
//
|
|
// Contents: Microsoft Internet Security SIP Provider
|
|
//
|
|
// Functions: CryptSIPDllMain
|
|
// CryptSIPPutSignedDataMsg
|
|
// CryptSIPGetSignedDataMsg
|
|
// CryptSIPRemoveSignedDataMsg
|
|
// CryptSIPCreateIndirectData
|
|
// CryptSIPVerifyIndirectData
|
|
//
|
|
// *** local functions ***
|
|
// _Guid2Sz
|
|
// _LoadIsFuncs
|
|
// _EnumOIDCallback
|
|
//
|
|
// History: 01-Dec-1997 pberkman created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "global.hxx"
|
|
|
|
HCRYPTOIDFUNCSET hPutFuncSet;
|
|
HCRYPTOIDFUNCSET hGetFuncSet;
|
|
HCRYPTOIDFUNCSET hRemoveFuncSet;
|
|
HCRYPTOIDFUNCSET hCreateFuncSet;
|
|
HCRYPTOIDFUNCSET hVerifyFuncSet;
|
|
HCRYPTOIDFUNCSET hIsMyFileFuncSet;
|
|
HCRYPTOIDFUNCSET hIsMyFileFuncSet2;
|
|
|
|
CRITICAL_SECTION SIP_CriticalSection;
|
|
BOOL fLoadedIsFuncs = FALSE;
|
|
|
|
typedef struct ISFUNCREF_
|
|
{
|
|
DWORD cGuids;
|
|
GUID *pGuids;
|
|
|
|
} ISFUNCREF;
|
|
|
|
ISFUNCREF sIsGuids;
|
|
ISFUNCREF sIsGuids2;
|
|
|
|
void _LoadIsFuncs(void);
|
|
BOOL _CallIsMyFileType2(GUID *pgIn, WCHAR *pwszFile, GUID *pgOut);
|
|
BOOL _CallIsMyFileType(GUID *pgIn, HANDLE hFile, GUID *pgOut);
|
|
|
|
BOOL WINAPI _EnumOIDCallback(DWORD dwEncodingType, LPCSTR pszFuncName, LPCSTR pszOID,
|
|
DWORD cValue, const DWORD rgdwValueType[], LPCWSTR const rgpwszValueName[],
|
|
const BYTE * const rgpbValueData[], const DWORD rgcbValueData[],
|
|
void *pvArg);
|
|
|
|
BOOL WINAPI CryptSIPDllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved)
|
|
{
|
|
BOOL fRet;
|
|
|
|
fRet = TRUE;
|
|
|
|
switch (fdwReason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
|
|
memset(&sIsGuids, 0x00, sizeof(ISFUNCREF));
|
|
memset(&sIsGuids2, 0x00, sizeof(ISFUNCREF));
|
|
|
|
if (!(hPutFuncSet = CryptInitOIDFunctionSet(SIPFUNC_PUTSIGNATURE, 0)))
|
|
{
|
|
goto PutFuncSetFailed;
|
|
}
|
|
|
|
if (!(hGetFuncSet = CryptInitOIDFunctionSet(SIPFUNC_GETSIGNATURE, 0)))
|
|
{
|
|
goto GetFuncSetFailed;
|
|
}
|
|
|
|
if (!(hRemoveFuncSet = CryptInitOIDFunctionSet(SIPFUNC_REMSIGNATURE, 0)))
|
|
{
|
|
goto RemoveFuncSetFailed;
|
|
}
|
|
|
|
if (!(hCreateFuncSet = CryptInitOIDFunctionSet(SIPFUNC_CREATEINDIRECT, 0)))
|
|
{
|
|
goto CreateFuncSetFailed;
|
|
}
|
|
|
|
if (!(hVerifyFuncSet = CryptInitOIDFunctionSet(SIPFUNC_VERIFYINDIRECT, 0)))
|
|
{
|
|
goto VerifyFuncSetFailed;
|
|
}
|
|
|
|
if (!(hIsMyFileFuncSet = CryptInitOIDFunctionSet(SIPFUNC_ISMYTYPE, 0)))
|
|
{
|
|
goto VerifyFuncSetFailed;
|
|
}
|
|
|
|
if (!(hIsMyFileFuncSet2 = CryptInitOIDFunctionSet(SIPFUNC_ISMYTYPE2, 0)))
|
|
{
|
|
goto VerifyFuncSetFailed;
|
|
}
|
|
|
|
if (!Pki_InitializeCriticalSection(&SIP_CriticalSection))
|
|
{
|
|
goto InitCritSectionFailed;
|
|
}
|
|
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
|
|
if (fLoadedIsFuncs)
|
|
{
|
|
EnterCriticalSection(&SIP_CriticalSection);
|
|
DELETE_OBJECT(sIsGuids.pGuids);
|
|
DELETE_OBJECT(sIsGuids2.pGuids);
|
|
sIsGuids.cGuids = 0;
|
|
sIsGuids2.cGuids = 0;
|
|
fLoadedIsFuncs = FALSE;
|
|
LeaveCriticalSection(&SIP_CriticalSection);
|
|
}
|
|
|
|
DeleteCriticalSection(&SIP_CriticalSection);
|
|
break;
|
|
}
|
|
|
|
CommonReturn:
|
|
return(fRet);
|
|
|
|
ErrorReturn:
|
|
fRet = FALSE;
|
|
goto CommonReturn;
|
|
|
|
TRACE_ERROR_EX(DBG_SS, InitCritSectionFailed);
|
|
TRACE_ERROR_EX(DBG_SS, PutFuncSetFailed);
|
|
TRACE_ERROR_EX(DBG_SS, GetFuncSetFailed);
|
|
TRACE_ERROR_EX(DBG_SS, RemoveFuncSetFailed);
|
|
TRACE_ERROR_EX(DBG_SS, CreateFuncSetFailed);
|
|
TRACE_ERROR_EX(DBG_SS, VerifyFuncSetFailed);
|
|
}
|
|
|
|
|
|
BOOL WINAPI CryptSIPPutSignedDataMsg(SIP_SUBJECTINFO *pSubjectInfo,
|
|
DWORD dwEncodingType,
|
|
DWORD *pdwIndex,
|
|
DWORD cbSignedDataMsg,
|
|
BYTE *pbSignedDataMsg)
|
|
{
|
|
BOOL fRet;
|
|
|
|
if (!(pSubjectInfo) ||
|
|
!(pSubjectInfo->pgSubjectType))
|
|
{
|
|
goto InvalidParam;
|
|
}
|
|
|
|
HCRYPTOIDFUNCADDR hPfn;
|
|
pCryptSIPPutSignedDataMsg pfn;
|
|
char szGuid[REG_MAX_GUID_TEXT];
|
|
|
|
if (!(_Guid2Sz(pSubjectInfo->pgSubjectType, &szGuid[0])))
|
|
{
|
|
goto GuidConvertFailed;
|
|
}
|
|
|
|
if (!(CryptGetOIDFunctionAddress(hPutFuncSet, 0, &szGuid[0], 0, (void **)&pfn, &hPfn)))
|
|
{
|
|
goto GetFuncAddrFailed;
|
|
}
|
|
|
|
fRet = pfn(pSubjectInfo, dwEncodingType, pdwIndex, cbSignedDataMsg, pbSignedDataMsg);
|
|
|
|
CryptFreeOIDFunctionAddress(hPfn, 0);
|
|
|
|
CommonReturn:
|
|
return(fRet);
|
|
|
|
ErrorReturn:
|
|
fRet = FALSE;
|
|
goto CommonReturn;
|
|
|
|
SET_ERROR_VAR_EX(DBG_SS, GetFuncAddrFailed, TRUST_E_SUBJECT_FORM_UNKNOWN);
|
|
SET_ERROR_VAR_EX(DBG_SS, GuidConvertFailed, TRUST_E_SUBJECT_FORM_UNKNOWN);
|
|
|
|
SET_ERROR_VAR_EX(DBG_SS, InvalidParam, ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
|
|
BOOL WINAPI CryptSIPGetSignedDataMsg(SIP_SUBJECTINFO *pSubjectInfo,
|
|
DWORD *pdwEncodingType,
|
|
DWORD dwIndex,
|
|
DWORD *pcbSignedDataMsg,
|
|
BYTE *pbSignedDataMsg)
|
|
{
|
|
BOOL fRet;
|
|
|
|
if (!(pSubjectInfo) ||
|
|
!(pSubjectInfo->pgSubjectType))
|
|
{
|
|
goto InvalidParam;
|
|
}
|
|
|
|
HCRYPTOIDFUNCADDR hPfn;
|
|
pCryptSIPGetSignedDataMsg pfn;
|
|
char szGuid[REG_MAX_GUID_TEXT];
|
|
|
|
if (!(_Guid2Sz(pSubjectInfo->pgSubjectType, &szGuid[0])))
|
|
{
|
|
goto GuidConvertFailed;
|
|
}
|
|
|
|
if (!(CryptGetOIDFunctionAddress(hGetFuncSet, 0, &szGuid[0], 0, (void **)&pfn, &hPfn)))
|
|
{
|
|
goto GetFuncAddrFailed;
|
|
}
|
|
|
|
fRet = pfn(pSubjectInfo, pdwEncodingType, dwIndex, pcbSignedDataMsg, pbSignedDataMsg);
|
|
|
|
CryptFreeOIDFunctionAddress(hPfn, 0);
|
|
|
|
CommonReturn:
|
|
return(fRet);
|
|
|
|
ErrorReturn:
|
|
fRet = FALSE;
|
|
goto CommonReturn;
|
|
|
|
SET_ERROR_VAR_EX(DBG_SS, GetFuncAddrFailed, TRUST_E_SUBJECT_FORM_UNKNOWN);
|
|
SET_ERROR_VAR_EX(DBG_SS, GuidConvertFailed, TRUST_E_SUBJECT_FORM_UNKNOWN);
|
|
|
|
SET_ERROR_VAR_EX(DBG_SS, InvalidParam, ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
BOOL WINAPI CryptSIPRemoveSignedDataMsg(SIP_SUBJECTINFO *pSubjectInfo,
|
|
DWORD dwIndex)
|
|
{
|
|
BOOL fRet;
|
|
|
|
if (!(pSubjectInfo) ||
|
|
!(pSubjectInfo->pgSubjectType))
|
|
{
|
|
goto InvalidParam;
|
|
}
|
|
|
|
HCRYPTOIDFUNCADDR hPfn;
|
|
pCryptSIPRemoveSignedDataMsg pfn;
|
|
char szGuid[REG_MAX_GUID_TEXT];
|
|
|
|
if (!(_Guid2Sz(pSubjectInfo->pgSubjectType, &szGuid[0])))
|
|
{
|
|
goto GuidConvertFailed;
|
|
}
|
|
|
|
if (!(CryptGetOIDFunctionAddress(hRemoveFuncSet, 0, &szGuid[0], 0, (void **)&pfn, &hPfn)))
|
|
{
|
|
goto GetFuncAddrFailed;
|
|
}
|
|
|
|
fRet = pfn(pSubjectInfo, dwIndex);
|
|
|
|
CryptFreeOIDFunctionAddress(hPfn, 0);
|
|
|
|
CommonReturn:
|
|
return(fRet);
|
|
|
|
ErrorReturn:
|
|
fRet = FALSE;
|
|
goto CommonReturn;
|
|
|
|
SET_ERROR_VAR_EX(DBG_SS, GetFuncAddrFailed, TRUST_E_SUBJECT_FORM_UNKNOWN);
|
|
SET_ERROR_VAR_EX(DBG_SS, GuidConvertFailed, TRUST_E_SUBJECT_FORM_UNKNOWN);
|
|
|
|
SET_ERROR_VAR_EX(DBG_SS, InvalidParam, ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
BOOL WINAPI CryptSIPCreateIndirectData(SIP_SUBJECTINFO *pSubjectInfo,
|
|
DWORD *pcbIndirectData,
|
|
SIP_INDIRECT_DATA *pIndirectData)
|
|
{
|
|
BOOL fRet;
|
|
|
|
if (!(pSubjectInfo) ||
|
|
!(pSubjectInfo->pgSubjectType))
|
|
{
|
|
goto InvalidParam;
|
|
}
|
|
|
|
HCRYPTOIDFUNCADDR hPfn;
|
|
pCryptSIPCreateIndirectData pfn;
|
|
char szGuid[REG_MAX_GUID_TEXT];
|
|
|
|
if (!(_Guid2Sz(pSubjectInfo->pgSubjectType, &szGuid[0])))
|
|
{
|
|
goto GuidConvertFailed;
|
|
}
|
|
|
|
if (!(CryptGetOIDFunctionAddress(hCreateFuncSet, 0, &szGuid[0], 0, (void **)&pfn, &hPfn)))
|
|
{
|
|
goto GetFuncAddrFailed;
|
|
}
|
|
|
|
fRet = pfn(pSubjectInfo, pcbIndirectData, pIndirectData);
|
|
|
|
CryptFreeOIDFunctionAddress(hPfn, 0);
|
|
|
|
CommonReturn:
|
|
return(fRet);
|
|
|
|
ErrorReturn:
|
|
fRet = FALSE;
|
|
goto CommonReturn;
|
|
|
|
SET_ERROR_VAR_EX(DBG_SS, GetFuncAddrFailed, TRUST_E_SUBJECT_FORM_UNKNOWN);
|
|
SET_ERROR_VAR_EX(DBG_SS, GuidConvertFailed, TRUST_E_SUBJECT_FORM_UNKNOWN);
|
|
|
|
SET_ERROR_VAR_EX(DBG_SS, InvalidParam, ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
BOOL WINAPI CryptSIPVerifyIndirectData(SIP_SUBJECTINFO *pSubjectInfo,
|
|
SIP_INDIRECT_DATA *pIndirectData)
|
|
{
|
|
BOOL fRet;
|
|
|
|
if (!(pSubjectInfo) ||
|
|
!(pSubjectInfo->pgSubjectType))
|
|
{
|
|
goto InvalidParam;
|
|
}
|
|
|
|
HCRYPTOIDFUNCADDR hPfn;
|
|
pCryptSIPVerifyIndirectData pfn;
|
|
char szGuid[REG_MAX_GUID_TEXT];
|
|
|
|
if (!(_Guid2Sz(pSubjectInfo->pgSubjectType, &szGuid[0])))
|
|
{
|
|
goto GuidConvertFailed;
|
|
}
|
|
|
|
if (!(CryptGetOIDFunctionAddress(hVerifyFuncSet, 0, &szGuid[0], 0, (void **)&pfn, &hPfn)))
|
|
{
|
|
goto GetFuncAddrFailed;
|
|
}
|
|
|
|
fRet = pfn(pSubjectInfo, pIndirectData);
|
|
|
|
CryptFreeOIDFunctionAddress(hPfn, 0);
|
|
|
|
CommonReturn:
|
|
return(fRet);
|
|
|
|
ErrorReturn:
|
|
fRet = FALSE;
|
|
goto CommonReturn;
|
|
|
|
SET_ERROR_VAR_EX(DBG_SS, GetFuncAddrFailed, TRUST_E_SUBJECT_FORM_UNKNOWN);
|
|
SET_ERROR_VAR_EX(DBG_SS, GuidConvertFailed, TRUST_E_SUBJECT_FORM_UNKNOWN);
|
|
|
|
SET_ERROR_VAR_EX(DBG_SS, InvalidParam, ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
|
|
BOOL _Guid2Sz(GUID *pgGuid, char *pszGuid)
|
|
{
|
|
WCHAR wszGuid[REG_MAX_GUID_TEXT];
|
|
|
|
if (!(guid2wstr(pgGuid, &wszGuid[0])))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
if (WideCharToMultiByte(0, 0, &wszGuid[0], -1, pszGuid, REG_MAX_GUID_TEXT, NULL, NULL) == 0)
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
BOOL _QueryRegisteredIsMyFileType(HANDLE hFile, LPCWSTR pwszFile, GUID *pgSubject)
|
|
{
|
|
if (!(fLoadedIsFuncs))
|
|
{
|
|
EnterCriticalSection(&SIP_CriticalSection);
|
|
|
|
if (!(fLoadedIsFuncs))
|
|
{
|
|
CryptEnumOIDFunction(0, SIPFUNC_ISMYTYPE, NULL, 0, (void *)&sIsGuids, _EnumOIDCallback);
|
|
CryptEnumOIDFunction(0, SIPFUNC_ISMYTYPE2, NULL, 0, (void *)&sIsGuids2, _EnumOIDCallback);
|
|
fLoadedIsFuncs = TRUE;
|
|
}
|
|
|
|
LeaveCriticalSection(&SIP_CriticalSection);
|
|
}
|
|
|
|
|
|
DWORD i;
|
|
|
|
i = 0;
|
|
while (i < sIsGuids.cGuids)
|
|
{
|
|
if (_CallIsMyFileType(&sIsGuids.pGuids[i], hFile, pgSubject))
|
|
{
|
|
return(TRUE);
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
i = 0;
|
|
while (i < sIsGuids2.cGuids)
|
|
{
|
|
if (_CallIsMyFileType2(&sIsGuids2.pGuids[i], (WCHAR *)pwszFile, pgSubject))
|
|
{
|
|
return(TRUE);
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
BOOL _CallIsMyFileType(GUID *pgIn, HANDLE hFile, GUID *pgOut)
|
|
{
|
|
BOOL fRet;
|
|
|
|
HCRYPTOIDFUNCADDR hPfn;
|
|
pfnIsFileSupported pfn;
|
|
char szGuid[REG_MAX_GUID_TEXT];
|
|
|
|
if (!(_Guid2Sz(pgIn, &szGuid[0])))
|
|
{
|
|
goto GuidConvertFailed;
|
|
}
|
|
|
|
if (!(CryptGetOIDFunctionAddress(hIsMyFileFuncSet, 0, &szGuid[0], 0, (void **)&pfn, &hPfn)))
|
|
{
|
|
goto GetFuncAddrFailed;
|
|
}
|
|
|
|
fRet = pfn(hFile, pgOut);
|
|
|
|
CryptFreeOIDFunctionAddress(hPfn, 0);
|
|
|
|
CommonReturn:
|
|
return(fRet);
|
|
|
|
ErrorReturn:
|
|
fRet = FALSE;
|
|
goto CommonReturn;
|
|
|
|
TRACE_ERROR_EX(DBG_SS, GetFuncAddrFailed);
|
|
TRACE_ERROR_EX(DBG_SS, GuidConvertFailed);
|
|
}
|
|
|
|
BOOL _CallIsMyFileType2(GUID *pgIn, WCHAR *pwszFile, GUID *pgOut)
|
|
{
|
|
BOOL fRet;
|
|
|
|
HCRYPTOIDFUNCADDR hPfn;
|
|
pfnIsFileSupported pfn;
|
|
char szGuid[REG_MAX_GUID_TEXT];
|
|
|
|
if (!(_Guid2Sz(pgIn, &szGuid[0])))
|
|
{
|
|
goto GuidConvertFailed;
|
|
}
|
|
|
|
if (!(CryptGetOIDFunctionAddress(hIsMyFileFuncSet2, 0, &szGuid[0], 0, (void **)&pfn, &hPfn)))
|
|
{
|
|
goto GetFuncAddrFailed;
|
|
}
|
|
|
|
fRet = pfn(pwszFile, pgOut);
|
|
|
|
CryptFreeOIDFunctionAddress(hPfn, 0);
|
|
|
|
CommonReturn:
|
|
return(fRet);
|
|
|
|
ErrorReturn:
|
|
fRet = FALSE;
|
|
goto CommonReturn;
|
|
|
|
TRACE_ERROR_EX(DBG_SS, GetFuncAddrFailed);
|
|
TRACE_ERROR_EX(DBG_SS, GuidConvertFailed);
|
|
}
|
|
|
|
void *SIPRealloc(void *pvOrg, size_t cb)
|
|
{
|
|
void *pv;
|
|
|
|
pv = (pvOrg) ? realloc(pvOrg, cb) : malloc(cb);
|
|
|
|
if (!(pv))
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
}
|
|
|
|
return(pv);
|
|
}
|
|
|
|
|
|
BOOL WINAPI _EnumOIDCallback(IN DWORD dwEncodingType,
|
|
IN LPCSTR pszFuncName,
|
|
IN LPCSTR pszOID,
|
|
IN DWORD cValue,
|
|
IN const DWORD rgdwValueType[],
|
|
IN LPCWSTR const rgpwszValueName[],
|
|
IN const BYTE * const rgpbValueData[],
|
|
IN const DWORD rgcbValueData[],
|
|
IN void *pvArg)
|
|
{
|
|
WCHAR wszGuid[REG_MAX_GUID_TEXT];
|
|
GUID g;
|
|
|
|
wszGuid[0] = NULL;
|
|
MultiByteToWideChar(0, 0, pszOID, -1, &wszGuid[0], REG_MAX_GUID_TEXT);
|
|
|
|
if (wszGuid[0])
|
|
{
|
|
if (wstr2guid(&wszGuid[0], &g))
|
|
{
|
|
ISFUNCREF *pIsGuids;
|
|
|
|
pIsGuids = (ISFUNCREF *)pvArg;
|
|
|
|
if (!(pvArg))
|
|
{
|
|
return(TRUE);
|
|
}
|
|
|
|
pIsGuids->cGuids++;
|
|
pIsGuids->pGuids = (GUID *)SIPRealloc(pIsGuids->pGuids, pIsGuids->cGuids * sizeof(GUID));
|
|
|
|
if (!(pIsGuids->pGuids))
|
|
{
|
|
pIsGuids->cGuids = 0;
|
|
return(FALSE);
|
|
}
|
|
|
|
memcpy(&pIsGuids->pGuids[pIsGuids->cGuids - 1], &g, sizeof(GUID));
|
|
}
|
|
}
|
|
|
|
return(TRUE); // keep going!
|
|
}
|
|
|