2025-04-27 07:49:33 -04:00

416 lines
12 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: thunks.cpp
//
//--------------------------------------------------------------------------
#define _CRYPT32_
#include <windows.h>
#include "unicode.h"
#include "crypthlp.h"
#include <stdlib.h>
#include <assert.h>
typedef PCCERT_CONTEXT
(WINAPI * PFNCertCreateSelfSignCertificate) (
IN HCRYPTPROV hProv,
IN PCERT_NAME_BLOB pSubjectIssuerBlob,
IN DWORD dwFlags,
OPTIONAL PCRYPT_KEY_PROV_INFO pKeyProvInfo,
OPTIONAL PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
OPTIONAL PSYSTEMTIME pStartTime,
OPTIONAL PSYSTEMTIME pEndTime,
OPTIONAL PCERT_EXTENSIONS pExtensions
);
PFNCertCreateSelfSignCertificate pfnCertCreateSelfSignCertificate = CertCreateSelfSignCertificate;
typedef PCCRYPT_OID_INFO
(WINAPI * PFNCryptFindOIDInfo) (
IN DWORD dwKeyType,
IN void *pvKey,
IN DWORD dwGroupId // 0 => any group
);
PFNCryptFindOIDInfo pfnCryptFindOIDInfo = CryptFindOIDInfo;
typedef BOOL
(WINAPI * PFNCryptQueryObject) (DWORD dwObjectType,
const void *pvObject,
DWORD dwExpectedContentTypeFlags,
DWORD dwExpectedFormatTypeFlags,
DWORD dwFlags,
DWORD *pdwMsgAndCertEncodingType,
DWORD *pdwContentType,
DWORD *pdwFormatType,
HCERTSTORE *phCertStore,
HCRYPTMSG *phMsg,
const void **ppvContext);
PFNCryptQueryObject pfnCryptQueryObject = CryptQueryObject;
typedef BOOL
(WINAPI * PFNCertStrToNameW) (
IN DWORD dwCertEncodingType,
IN LPCWSTR pwszX500,
IN DWORD dwStrType,
IN OPTIONAL void *pvReserved,
OUT BYTE *pbEncoded,
IN OUT DWORD *pcbEncoded,
OUT OPTIONAL LPCWSTR *ppwszError
);
PFNCertStrToNameW pfnCertStrToNameW = CertStrToNameW;
typedef BOOL
(WINAPI * PFNCryptVerifyMessageSignature)
(IN PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
IN DWORD dwSignerIndex,
IN BYTE const *pbSignedBlob,
IN DWORD cbSignedBlob,
OUT BYTE *pbDecoded,
IN OUT DWORD *pcbDecoded,
OUT OPTIONAL PCCERT_CONTEXT *ppSignerCert);
PFNCryptVerifyMessageSignature pfnCryptVerifyMessageSignature = CryptVerifyMessageSignature;
BOOL
WINAPI
PFXIsPFXBlob(
CRYPT_DATA_BLOB* pPFX)
{
return FALSE;
}
// Stubs to functions called from oidinfo.cpp
BOOL WINAPI
ChainIsConnected()
{
return(FALSE);
}
BOOL WINAPI
ChainRetrieveObjectByUrlW (
IN LPCWSTR pszUrl,
IN LPCSTR pszObjectOid,
IN DWORD dwRetrievalFlags,
IN DWORD dwTimeout,
OUT LPVOID* ppvObject,
IN HCRYPTASYNC hAsyncRetrieve,
IN PCRYPT_CREDENTIALS pCredentials,
IN LPVOID pvVerify,
IN OPTIONAL PCRYPT_RETRIEVE_AUX_INFO pAuxInfo
)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return(FALSE);
}
extern "C" {
BOOL
WINAPI
CertAddEncodedCTLToStore(
IN HCERTSTORE hCertStore,
IN DWORD dwMsgAndCertEncodingType,
IN const BYTE *pbCtlEncoded,
IN DWORD cbCtlEncoded,
IN DWORD dwAddDisposition,
OUT OPTIONAL PCCTL_CONTEXT *ppCtlContext
) {
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return(FALSE);
}
BOOL
WINAPI
CertFreeCTLContext(
IN PCCTL_CONTEXT pCtlContext
)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return(FALSE);
}
BOOL
WINAPI
CryptSIPLoad(
const GUID *pgSubject,
DWORD dwFlags,
void *psSipTable
)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return(FALSE);
}
BOOL
WINAPI
CryptSIPRetrieveSubjectGuid(
IN LPCWSTR FileName,
IN OPTIONAL HANDLE hFileIn,
OUT GUID *pgSubject)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return(FALSE);
}
} // end of extern C
// Thunk routines for function not in IE3.02Upd
PCCERT_CONTEXT
WINAPI
MyCertCreateSelfSignCertificate(
IN HCRYPTPROV hProv,
IN PCERT_NAME_BLOB pSubjectIssuerBlob,
IN DWORD dwFlags,
OPTIONAL PCRYPT_KEY_PROV_INFO pKeyProvInfo,
OPTIONAL PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
OPTIONAL PSYSTEMTIME pStartTime,
OPTIONAL PSYSTEMTIME pEndTime,
OPTIONAL PCERT_EXTENSIONS pExtensions
)
{
return(pfnCertCreateSelfSignCertificate(
hProv,
pSubjectIssuerBlob,
dwFlags,
pKeyProvInfo,
pSignatureAlgorithm,
pStartTime,
pEndTime,
pExtensions));
}
PCCRYPT_OID_INFO
WINAPI
xeCryptFindOIDInfo(
IN DWORD dwKeyType,
IN void *pvKey,
IN DWORD dwGroupId // 0 => any group
)
{
return(pfnCryptFindOIDInfo(
dwKeyType,
pvKey,
dwGroupId));
}
BOOL
WINAPI
MyCryptQueryObject(DWORD dwObjectType,
const void *pvObject,
DWORD dwExpectedContentTypeFlags,
DWORD dwExpectedFormatTypeFlags,
DWORD dwFlags,
DWORD *pdwMsgAndCertEncodingType,
DWORD *pdwContentType,
DWORD *pdwFormatType,
HCERTSTORE *phCertStore,
HCRYPTMSG *phMsg,
const void **ppvContext)
{
return(pfnCryptQueryObject(
dwObjectType,
pvObject,
dwExpectedContentTypeFlags,
dwExpectedFormatTypeFlags,
dwFlags,
pdwMsgAndCertEncodingType,
pdwContentType,
pdwFormatType,
phCertStore,
phMsg,
ppvContext));
}
BOOL
WINAPI
MyCertStrToNameW(
IN DWORD dwCertEncodingType,
IN LPCWSTR pwszX500,
IN DWORD dwStrType,
IN OPTIONAL void * pvReserved,
OUT BYTE * pbEncoded,
IN OUT DWORD * pcbEncoded,
OUT OPTIONAL LPCWSTR * ppwszError
)
{
return(pfnCertStrToNameW(
dwCertEncodingType,
pwszX500,
dwStrType,
pvReserved,
pbEncoded,
pcbEncoded,
ppwszError));
}
BOOL
WINAPI
MyCryptVerifyMessageSignature
(IN PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
IN DWORD dwSignerIndex,
IN BYTE const *pbSignedBlob,
IN DWORD cbSignedBlob,
OUT BYTE *pbDecoded,
IN OUT DWORD *pcbDecoded,
OUT OPTIONAL PCCERT_CONTEXT *ppSignerCert)
{
return pfnCryptVerifyMessageSignature
(pVerifyPara,
dwSignerIndex,
pbSignedBlob,
cbSignedBlob,
pbDecoded,
pcbDecoded,
ppSignerCert);
}
extern "C"
BOOL WINAPI InitIE302UpdThunks(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
HMODULE hModCrypt32 = NULL;
FARPROC fproc;
DWORD verCrypt32MS;
DWORD verCrypt32LS;
DWORD verXEnrollMS;
DWORD verXEnrollLS;
char szFileName[_MAX_PATH];
LPWSTR wszFilePathCrypt32 = NULL;
LPWSTR wszFilePathXEnroll = NULL;
if (dwReason == DLL_PROCESS_ATTACH) {
// this can't fail because it is already loaded
hModCrypt32 = GetModuleHandleA("Crypt32.dll");
assert(hModCrypt32);
// Get Filever of crypt32 and XEnroll, only copy go to crypt32 if it is newer than xenroll
if( 0 != GetModuleFileNameA(hModCrypt32, szFileName, sizeof(szFileName)) &&
NULL != (wszFilePathCrypt32 = MkWStr(szFileName)) &&
I_CryptGetFileVersion(wszFilePathCrypt32, &verCrypt32MS, &verCrypt32LS) &&
0 != GetModuleFileNameA(hInstance, szFileName, sizeof(szFileName)) &&
NULL != (wszFilePathXEnroll = MkWStr(szFileName)) &&
I_CryptGetFileVersion(wszFilePathXEnroll, &verXEnrollMS, &verXEnrollLS) &&
( (verCrypt32MS > verXEnrollMS) ||
((verCrypt32MS == verXEnrollMS) && verCrypt32LS >= verXEnrollLS) ) ) {
// crypt32 must be newer, use his functions
if(NULL != (fproc = GetProcAddress(hModCrypt32, "CertCreateSelfSignCertificate")))
pfnCertCreateSelfSignCertificate = (PFNCertCreateSelfSignCertificate) fproc;
if(NULL != (fproc = GetProcAddress(hModCrypt32, "CryptFindOIDInfo")))
pfnCryptFindOIDInfo = (PFNCryptFindOIDInfo) fproc;
if(NULL != (fproc = GetProcAddress(hModCrypt32, "CryptQueryObject")))
pfnCryptQueryObject = (PFNCryptQueryObject) fproc;
if(NULL != (fproc = GetProcAddress(hModCrypt32, "CertStrToNameW")))
pfnCertStrToNameW = (PFNCertStrToNameW) fproc;
if(NULL != (fproc = GetProcAddress(hModCrypt32, "CryptVerifyMessageSignature")))
pfnCryptVerifyMessageSignature = (PFNCryptVerifyMessageSignature) fproc;
}
// free allocated handles
if(wszFilePathCrypt32 != NULL)
FreeWStr(wszFilePathCrypt32);
if(wszFilePathXEnroll != NULL)
FreeWStr(wszFilePathXEnroll);
}
return(TRUE);
}
BOOL
MyCryptStringToBinaryA(
IN LPCSTR pszString,
IN DWORD cchString,
IN DWORD dwFlags,
IN BYTE *pbBinary,
IN OUT DWORD *pcbBinary,
OUT DWORD *pdwSkip, //OPTIONAL
OUT DWORD *pdwFlags //OPTIONAL
)
{
return CryptStringToBinaryA(
pszString,
cchString,
dwFlags,
pbBinary,
pcbBinary,
pdwSkip,
pdwFlags);
}
BOOL
MyCryptStringToBinaryW(
IN LPCWSTR pszString,
IN DWORD cchString,
IN DWORD dwFlags,
IN BYTE *pbBinary,
IN OUT DWORD *pcbBinary,
OUT DWORD *pdwSkip, //OPTIONAL
OUT DWORD *pdwFlags //OPTIONAL
)
{
return CryptStringToBinaryW(
pszString,
cchString,
dwFlags,
pbBinary,
pcbBinary,
pdwSkip,
pdwFlags);
}
BOOL
MyCryptBinaryToStringA(
IN CONST BYTE *pbBinary,
IN DWORD cbBinary,
IN DWORD dwFlags,
IN LPSTR pszString,
IN OUT DWORD *pcchString
)
{
return CryptBinaryToStringA(
pbBinary,
cbBinary,
dwFlags,
pszString,
pcchString);
}
BOOL
MyCryptBinaryToStringW(
IN CONST BYTE *pbBinary,
IN DWORD cbBinary,
IN DWORD dwFlags,
IN LPWSTR pszString,
IN OUT DWORD *pcchString
)
{
return CryptBinaryToStringW(
pbBinary,
cbBinary,
dwFlags,
pszString,
pcchString);
}