You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
514 lines
15 KiB
514 lines
15 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows NT Security
|
|
// Copyright (C) Microsoft Corporation, 1997 - 1999
|
|
//
|
|
// File: init.cpp
|
|
//
|
|
// Contents: Initialization for Remote Object Retrieval
|
|
//
|
|
// History: 23-Jul-97 kirtd Created
|
|
// 01-Jan-02 philh Changed to internally use UNICODE Urls
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
#include <global.hxx>
|
|
|
|
//
|
|
// Remote Object Retrieval Function Set definitions
|
|
//
|
|
|
|
HCRYPTOIDFUNCSET hSchemeRetrieveFuncSet;
|
|
HCRYPTOIDFUNCSET hContextCreateFuncSet;
|
|
HCRYPTOIDFUNCSET hGetObjectUrlFuncSet;
|
|
HCRYPTOIDFUNCSET hGetTimeValidObjectFuncSet;
|
|
HCRYPTOIDFUNCSET hFlushTimeValidObjectFuncSet;
|
|
|
|
static const CRYPT_OID_FUNC_ENTRY SchemeRetrieveFuncTable[] = {
|
|
LDAP_SCHEME, LdapRetrieveEncodedObject,
|
|
HTTP_SCHEME, InetRetrieveEncodedObject,
|
|
FILE_SCHEME, FileRetrieveEncodedObject
|
|
};
|
|
|
|
static const CRYPT_OID_FUNC_ENTRY ContextCreateFuncTable[] = {
|
|
CONTEXT_OID_CERTIFICATE, CertificateCreateObjectContext,
|
|
CONTEXT_OID_CTL, CTLCreateObjectContext,
|
|
CONTEXT_OID_CRL, CRLCreateObjectContext,
|
|
CONTEXT_OID_PKCS7, Pkcs7CreateObjectContext,
|
|
CONTEXT_OID_CAPI2_ANY, Capi2CreateObjectContext
|
|
};
|
|
|
|
static const CRYPT_OID_FUNC_ENTRY GetObjectUrlFuncTable[] = {
|
|
URL_OID_CERTIFICATE_ISSUER, CertificateIssuerGetObjectUrl,
|
|
URL_OID_CERTIFICATE_CRL_DIST_POINT, CertificateCrlDistPointGetObjectUrl,
|
|
URL_OID_CTL_ISSUER, CtlIssuerGetObjectUrl,
|
|
URL_OID_CTL_NEXT_UPDATE, CtlNextUpdateGetObjectUrl,
|
|
URL_OID_CRL_ISSUER, CrlIssuerGetObjectUrl,
|
|
URL_OID_CERTIFICATE_FRESHEST_CRL, CertificateFreshestCrlGetObjectUrl,
|
|
URL_OID_CRL_FRESHEST_CRL, CrlFreshestCrlGetObjectUrl,
|
|
URL_OID_CROSS_CERT_DIST_POINT, CertificateCrossCertDistPointGetObjectUrl
|
|
};
|
|
|
|
static const CRYPT_OID_FUNC_ENTRY GetTimeValidObjectFuncTable[] = {
|
|
TIME_VALID_OID_GET_CTL, CtlGetTimeValidObject,
|
|
TIME_VALID_OID_GET_CRL, CrlGetTimeValidObject,
|
|
TIME_VALID_OID_GET_CRL_FROM_CERT, CrlFromCertGetTimeValidObject,
|
|
TIME_VALID_OID_GET_FRESHEST_CRL_FROM_CERT, FreshestCrlFromCertGetTimeValidObject,
|
|
TIME_VALID_OID_GET_FRESHEST_CRL_FROM_CRL, FreshestCrlFromCrlGetTimeValidObject
|
|
};
|
|
|
|
static const CRYPT_OID_FUNC_ENTRY FlushTimeValidObjectFuncTable[] = {
|
|
TIME_VALID_OID_FLUSH_CTL, CtlFlushTimeValidObject,
|
|
TIME_VALID_OID_FLUSH_CRL, CrlFlushTimeValidObject,
|
|
TIME_VALID_OID_FLUSH_CRL_FROM_CERT, CrlFromCertFlushTimeValidObject,
|
|
TIME_VALID_OID_FLUSH_FRESHEST_CRL_FROM_CERT, FreshestCrlFromCertFlushTimeValidObject,
|
|
TIME_VALID_OID_FLUSH_FRESHEST_CRL_FROM_CRL, FreshestCrlFromCrlFlushTimeValidObject
|
|
};
|
|
|
|
#define SCHEME_RETRIEVE_FUNC_COUNT (sizeof(SchemeRetrieveFuncTable)/ \
|
|
sizeof(SchemeRetrieveFuncTable[0]))
|
|
|
|
#define CONTEXT_CREATE_FUNC_COUNT (sizeof(ContextCreateFuncTable)/ \
|
|
sizeof(ContextCreateFuncTable[0]))
|
|
|
|
#define GET_OBJECT_URL_FUNC_COUNT (sizeof(GetObjectUrlFuncTable)/ \
|
|
sizeof(GetObjectUrlFuncTable[0]))
|
|
|
|
#define GET_TIME_VALID_OBJECT_FUNC_COUNT (sizeof(GetTimeValidObjectFuncTable)/ \
|
|
sizeof(GetTimeValidObjectFuncTable[0]))
|
|
|
|
#define FLUSH_TIME_VALID_OBJECT_FUNC_COUNT (sizeof(FlushTimeValidObjectFuncTable)/ \
|
|
sizeof(FlushTimeValidObjectFuncTable[0]))
|
|
|
|
HCRYPTTLS hCryptNetCancelTls;
|
|
|
|
CTVOAgent* g_pProcessTVOAgent = NULL;
|
|
|
|
CRITICAL_SECTION MSCtlDefaultStoresCriticalSection;
|
|
extern void MSCtlCloseDefaultStores ();
|
|
|
|
|
|
static
|
|
VOID
|
|
WINAPI
|
|
CancelRetrievalFree(
|
|
IN LPVOID pv
|
|
)
|
|
{
|
|
if (pv)
|
|
free(pv);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CryptInstallCancelRetrieval
|
|
//
|
|
// Synopsis: Install the call back function to cancel object retrieval
|
|
// by HTTP, HTTPS, GOPHER, and FTP protocols.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
BOOL
|
|
WINAPI
|
|
CryptInstallCancelRetrieval(
|
|
IN PFN_CRYPT_CANCEL_RETRIEVAL pfnCancel,
|
|
IN const void *pvArg,
|
|
IN DWORD dwFlags,
|
|
IN void *pvReserved
|
|
)
|
|
{
|
|
PCRYPTNET_CANCEL_BLOCK pCancelBlock=NULL;
|
|
|
|
if(NULL == pfnCancel)
|
|
{
|
|
SetLastError((DWORD) E_INVALIDARG);
|
|
return FALSE;
|
|
}
|
|
|
|
pCancelBlock = (PCRYPTNET_CANCEL_BLOCK)malloc(sizeof(CRYPTNET_CANCEL_BLOCK));
|
|
|
|
if(NULL == pCancelBlock)
|
|
{
|
|
SetLastError((DWORD) E_OUTOFMEMORY);
|
|
return FALSE;
|
|
}
|
|
|
|
pCancelBlock->pfnCancel=pfnCancel;
|
|
pCancelBlock->pvArg=(void *)pvArg;
|
|
|
|
//uninstall the previous one
|
|
if(!CryptUninstallCancelRetrieval(0, NULL))
|
|
{
|
|
free(pCancelBlock);
|
|
return FALSE;
|
|
}
|
|
|
|
if(!I_CryptSetTls(hCryptNetCancelTls, pCancelBlock))
|
|
{
|
|
free(pCancelBlock);
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CryptUninstallCancelRetrieval
|
|
//
|
|
// Synopsis: Uninstall the call back function to cancel object retrieval
|
|
// by HTTP, HTTPS, GOPHER, and FTP protocols.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
BOOL
|
|
WINAPI
|
|
CryptUninstallCancelRetrieval(
|
|
IN DWORD dwFlags,
|
|
IN void *pvReserved
|
|
)
|
|
{
|
|
PCRYPTNET_CANCEL_BLOCK pCancelBlock=NULL;
|
|
|
|
//we just free the memory if there is one
|
|
pCancelBlock = (PCRYPTNET_CANCEL_BLOCK)I_CryptGetTls(hCryptNetCancelTls);
|
|
|
|
if(pCancelBlock)
|
|
{
|
|
free(pCancelBlock);
|
|
I_CryptSetTls(hCryptNetCancelTls, NULL);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: RPORDllMain
|
|
//
|
|
// Synopsis: DLL Main like initialization of Remote PKI object retrieval
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
BOOL WINAPI RPORDllMain (
|
|
HMODULE hModule,
|
|
ULONG ulReason,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
switch ( ulReason )
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
|
|
hSchemeRetrieveFuncSet = CryptInitOIDFunctionSet(
|
|
SCHEME_OID_RETRIEVE_ENCODED_OBJECTW_FUNC,
|
|
0
|
|
);
|
|
|
|
hContextCreateFuncSet = CryptInitOIDFunctionSet(
|
|
CONTEXT_OID_CREATE_OBJECT_CONTEXT_FUNC,
|
|
0
|
|
);
|
|
|
|
hGetObjectUrlFuncSet = CryptInitOIDFunctionSet(
|
|
URL_OID_GET_OBJECT_URL_FUNC,
|
|
0
|
|
);
|
|
|
|
hGetTimeValidObjectFuncSet = CryptInitOIDFunctionSet(
|
|
TIME_VALID_OID_GET_OBJECT_FUNC,
|
|
0
|
|
);
|
|
|
|
hFlushTimeValidObjectFuncSet = CryptInitOIDFunctionSet(
|
|
TIME_VALID_OID_FLUSH_OBJECT_FUNC,
|
|
0
|
|
);
|
|
|
|
if ( ( hSchemeRetrieveFuncSet == NULL ) ||
|
|
( hContextCreateFuncSet == NULL ) ||
|
|
( hGetObjectUrlFuncSet == NULL ) ||
|
|
( hGetTimeValidObjectFuncSet == NULL ) ||
|
|
( hFlushTimeValidObjectFuncSet == NULL ) )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
|
|
if ( CryptInstallOIDFunctionAddress(
|
|
hModule,
|
|
X509_ASN_ENCODING,
|
|
SCHEME_OID_RETRIEVE_ENCODED_OBJECTW_FUNC,
|
|
SCHEME_RETRIEVE_FUNC_COUNT,
|
|
SchemeRetrieveFuncTable,
|
|
0
|
|
) == FALSE )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
|
|
if ( CryptInstallOIDFunctionAddress(
|
|
hModule,
|
|
X509_ASN_ENCODING,
|
|
CONTEXT_OID_CREATE_OBJECT_CONTEXT_FUNC,
|
|
CONTEXT_CREATE_FUNC_COUNT,
|
|
ContextCreateFuncTable,
|
|
0
|
|
) == FALSE )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
|
|
if ( CryptInstallOIDFunctionAddress(
|
|
hModule,
|
|
X509_ASN_ENCODING,
|
|
URL_OID_GET_OBJECT_URL_FUNC,
|
|
GET_OBJECT_URL_FUNC_COUNT,
|
|
GetObjectUrlFuncTable,
|
|
0
|
|
) == FALSE )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
|
|
if ( CryptInstallOIDFunctionAddress(
|
|
hModule,
|
|
X509_ASN_ENCODING,
|
|
TIME_VALID_OID_GET_OBJECT_FUNC,
|
|
GET_TIME_VALID_OBJECT_FUNC_COUNT,
|
|
GetTimeValidObjectFuncTable,
|
|
0
|
|
) == FALSE )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
|
|
if ( CryptInstallOIDFunctionAddress(
|
|
hModule,
|
|
X509_ASN_ENCODING,
|
|
TIME_VALID_OID_FLUSH_OBJECT_FUNC,
|
|
FLUSH_TIME_VALID_OBJECT_FUNC_COUNT,
|
|
FlushTimeValidObjectFuncTable,
|
|
0
|
|
) == FALSE )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
|
|
hCryptNetCancelTls = I_CryptAllocTls();
|
|
|
|
if (hCryptNetCancelTls == NULL )
|
|
return( FALSE );
|
|
|
|
InitializeOfflineUrlCache();
|
|
|
|
InitializeCryptRetrieveObjectByUrl(hModule);
|
|
|
|
if ( CreateProcessTVOAgent( &g_pProcessTVOAgent ) == FALSE )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
|
|
if ( !Pki_InitializeCriticalSection(
|
|
&MSCtlDefaultStoresCriticalSection ) )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
|
|
return( TRUE );
|
|
break;
|
|
case DLL_THREAD_ATTACH:
|
|
break;
|
|
case DLL_PROCESS_DETACH:
|
|
I_CryptFreeTls( hCryptNetCancelTls, CancelRetrievalFree );
|
|
delete g_pProcessTVOAgent;
|
|
|
|
DeleteCryptRetrieveObjectByUrl();
|
|
|
|
DeleteOfflineUrlCache();
|
|
|
|
MSCtlCloseDefaultStores();
|
|
DeleteCriticalSection( &MSCtlDefaultStoresCriticalSection );
|
|
break;
|
|
|
|
case DLL_THREAD_DETACH:
|
|
CancelRetrievalFree(I_CryptDetachTls(hCryptNetCancelTls));
|
|
|
|
break;
|
|
}
|
|
|
|
return( TRUE );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: RPORDllRegisterServer
|
|
//
|
|
// Synopsis: DllRegisterServer like registration of RPOR functions
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
STDAPI RPORDllRegisterServer (HMODULE hModule)
|
|
{
|
|
CHAR pszDll[MAX_PATH+1];
|
|
WCHAR pwszDll[MAX_PATH+1];
|
|
LPSTR pszDllRel = NULL;
|
|
|
|
if ( GetModuleFileNameA( hModule, pszDll, MAX_PATH ) == 0 )
|
|
{
|
|
return( HRESULT_FROM_WIN32( GetLastError() ) );
|
|
}
|
|
pszDll[MAX_PATH] = '\0';
|
|
|
|
pszDllRel = strrchr( pszDll, '\\' );
|
|
|
|
assert( pszDllRel != NULL );
|
|
|
|
pszDllRel += 1;
|
|
|
|
if ( MultiByteToWideChar(
|
|
CP_ACP,
|
|
0,
|
|
pszDllRel,
|
|
-1,
|
|
pwszDll,
|
|
MAX_PATH+1
|
|
) == 0 )
|
|
{
|
|
return( HRESULT_FROM_WIN32( GetLastError() ) );
|
|
}
|
|
|
|
if ( ( CryptRegisterDefaultOIDFunction(
|
|
X509_ASN_ENCODING,
|
|
CRYPT_OID_VERIFY_REVOCATION_FUNC,
|
|
CRYPT_REGISTER_FIRST_INDEX,
|
|
pwszDll
|
|
) == FALSE ) && ( GetLastError() != ERROR_FILE_EXISTS ) )
|
|
{
|
|
return( HRESULT_FROM_WIN32( GetLastError() ) );
|
|
}
|
|
|
|
if ( ( CryptRegisterDefaultOIDFunction(
|
|
X509_ASN_ENCODING,
|
|
CRYPT_OID_VERIFY_CTL_USAGE_FUNC,
|
|
CRYPT_REGISTER_FIRST_INDEX,
|
|
pwszDll
|
|
) == FALSE ) && ( GetLastError() != ERROR_FILE_EXISTS ) )
|
|
{
|
|
return( HRESULT_FROM_WIN32( GetLastError() ) );
|
|
}
|
|
|
|
if ( ( CryptRegisterOIDFunction(
|
|
0,
|
|
CRYPT_OID_OPEN_STORE_PROV_FUNC,
|
|
sz_CERT_STORE_PROV_LDAP,
|
|
pwszDll,
|
|
LDAP_OPEN_STORE_PROV_FUNC
|
|
) == FALSE ) && ( GetLastError() != ERROR_FILE_EXISTS ) )
|
|
{
|
|
return( GetLastError() );
|
|
}
|
|
|
|
if ( ( CryptRegisterOIDFunction(
|
|
0,
|
|
CRYPT_OID_OPEN_STORE_PROV_FUNC,
|
|
CERT_STORE_PROV_LDAP,
|
|
pwszDll,
|
|
LDAP_OPEN_STORE_PROV_FUNC
|
|
) == FALSE ) && ( GetLastError() != ERROR_FILE_EXISTS ) )
|
|
{
|
|
return( GetLastError() );
|
|
}
|
|
|
|
return( S_OK );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: RPORDllUnregisterServer
|
|
//
|
|
// Synopsis: DllUnregisterServer like registration of RPOR functions
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
STDAPI RPORDllUnregisterServer (HMODULE hModule)
|
|
{
|
|
CHAR pszDll[MAX_PATH+1];
|
|
WCHAR pwszDll[MAX_PATH+1];
|
|
LPSTR pszDllRel = NULL;
|
|
|
|
if ( GetModuleFileNameA( hModule, pszDll, MAX_PATH ) == 0 )
|
|
{
|
|
return( HRESULT_FROM_WIN32( GetLastError() ) );
|
|
}
|
|
pszDll[MAX_PATH] = '\0';
|
|
|
|
pszDllRel = strrchr( pszDll, '\\' );
|
|
|
|
assert( pszDllRel != NULL );
|
|
|
|
pszDllRel += 1;
|
|
|
|
if ( MultiByteToWideChar(
|
|
CP_ACP,
|
|
0,
|
|
pszDllRel,
|
|
-1,
|
|
pwszDll,
|
|
MAX_PATH+1
|
|
) == 0 )
|
|
{
|
|
return( HRESULT_FROM_WIN32( GetLastError() ) );
|
|
}
|
|
|
|
if ( ( CryptUnregisterDefaultOIDFunction(
|
|
X509_ASN_ENCODING,
|
|
CRYPT_OID_VERIFY_REVOCATION_FUNC,
|
|
pwszDll
|
|
) == FALSE ) && ( GetLastError() != ERROR_FILE_NOT_FOUND ) )
|
|
{
|
|
return( HRESULT_FROM_WIN32( GetLastError() ) );
|
|
}
|
|
|
|
if ( ( CryptUnregisterDefaultOIDFunction(
|
|
X509_ASN_ENCODING,
|
|
CRYPT_OID_VERIFY_CTL_USAGE_FUNC,
|
|
pwszDll
|
|
) == FALSE ) && ( GetLastError() != ERROR_FILE_NOT_FOUND ) )
|
|
{
|
|
return( HRESULT_FROM_WIN32( GetLastError() ) );
|
|
}
|
|
|
|
if ( ( CryptUnregisterOIDFunction(
|
|
0,
|
|
CRYPT_OID_OPEN_STORE_PROV_FUNC,
|
|
sz_CERT_STORE_PROV_LDAP
|
|
) == FALSE ) && ( GetLastError() != ERROR_FILE_NOT_FOUND ) )
|
|
{
|
|
return( GetLastError() );
|
|
}
|
|
|
|
if ( ( CryptUnregisterOIDFunction(
|
|
0,
|
|
CRYPT_OID_OPEN_STORE_PROV_FUNC,
|
|
CERT_STORE_PROV_LDAP
|
|
) == FALSE ) && ( GetLastError() != ERROR_FILE_NOT_FOUND ) )
|
|
{
|
|
return( GetLastError() );
|
|
}
|
|
|
|
return( S_OK );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: RPORDllRegUnregServer
|
|
//
|
|
// Synopsis: reg unreg server entry point for RPOR
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
HRESULT WINAPI RPORDllRegUnregServer (HMODULE hModule, BOOL fRegUnreg)
|
|
{
|
|
if ( fRegUnreg == TRUE )
|
|
{
|
|
return( RPORDllRegisterServer( hModule ) );
|
|
}
|
|
|
|
return( RPORDllUnregisterServer( hModule ) );
|
|
}
|
|
|