Leaked source code of windows server 2003
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

//+---------------------------------------------------------------------------
//
// 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 ) );
}