//+------------------------------------------------------------------------- // // 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! }