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.
450 lines
12 KiB
450 lines
12 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows NT Security
|
|
// Copyright (C) Microsoft Corporation, 1997 - 1999
|
|
//
|
|
// File: async.cpp
|
|
//
|
|
// Contents: Async Parameter Management
|
|
//
|
|
// History: 05-Aug-97 kirtd Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
#include <global.hxx>
|
|
#include <async.h>
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CryptCreateAsyncHandle
|
|
//
|
|
// Synopsis: create async param handle
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
BOOL WINAPI
|
|
CryptCreateAsyncHandle (
|
|
IN DWORD dwFlags,
|
|
OUT PHCRYPTASYNC phAsync
|
|
)
|
|
{
|
|
CCryptAsyncHandle* pAsyncHandle;
|
|
|
|
pAsyncHandle = new CCryptAsyncHandle( dwFlags );
|
|
if ( pAsyncHandle == NULL )
|
|
{
|
|
SetLastError( (DWORD) E_OUTOFMEMORY );
|
|
return( FALSE );
|
|
}
|
|
|
|
*phAsync = pAsyncHandle;
|
|
return( TRUE );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CryptSetAsyncParam
|
|
//
|
|
// Synopsis: set async parameter
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
BOOL WINAPI
|
|
CryptSetAsyncParam (
|
|
IN HCRYPTASYNC hAsync,
|
|
IN LPSTR pszParamOid,
|
|
IN LPVOID pvParam,
|
|
IN OPTIONAL PFN_CRYPT_ASYNC_PARAM_FREE_FUNC pfnFree
|
|
)
|
|
{
|
|
return( ( ( CCryptAsyncHandle* )hAsync )->SetAsyncParam(
|
|
pszParamOid,
|
|
pvParam,
|
|
pfnFree
|
|
) );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CryptGetAsyncParam
|
|
//
|
|
// Synopsis: get async parameter
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
BOOL WINAPI
|
|
CryptGetAsyncParam (
|
|
IN HCRYPTASYNC hAsync,
|
|
IN LPSTR pszParamOid,
|
|
OUT LPVOID* ppvParam,
|
|
OUT OPTIONAL PFN_CRYPT_ASYNC_PARAM_FREE_FUNC* ppfnFree
|
|
)
|
|
{
|
|
return( ( ( CCryptAsyncHandle* )hAsync )->GetAsyncParam(
|
|
pszParamOid,
|
|
ppvParam,
|
|
ppfnFree
|
|
) );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CryptCloseAsyncHandle
|
|
//
|
|
// Synopsis: close async handle
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
BOOL WINAPI
|
|
CryptCloseAsyncHandle (
|
|
IN HCRYPTASYNC hAsync
|
|
)
|
|
{
|
|
delete ( CCryptAsyncHandle * )hAsync;
|
|
return( TRUE );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CCryptAsyncHandle::CCryptAsyncHandle, public
|
|
//
|
|
// Synopsis: Constructor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
CCryptAsyncHandle::CCryptAsyncHandle (DWORD dwFlags)
|
|
{
|
|
m_pConstOidList = NULL;
|
|
m_pStrOidList = NULL;
|
|
Pki_InitializeCriticalSection( &m_AsyncLock );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CCryptAsyncHandle::~CCryptAsyncHandle, public
|
|
//
|
|
// Synopsis: Destructor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
CCryptAsyncHandle::~CCryptAsyncHandle ()
|
|
{
|
|
FreeOidList( m_pConstOidList, TRUE );
|
|
FreeOidList( m_pStrOidList, FALSE );
|
|
DeleteCriticalSection( &m_AsyncLock );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CCryptAsyncHandle::SetAsyncParam, public
|
|
//
|
|
// Synopsis: set an async parameter, if the pvParam is NULL then
|
|
// the parameter is removed and freed if a free function
|
|
// has been specified
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
BOOL
|
|
CCryptAsyncHandle::SetAsyncParam (
|
|
LPSTR pszParamOid,
|
|
LPVOID pvParam,
|
|
PFN_CRYPT_ASYNC_PARAM_FREE_FUNC pfnFree
|
|
)
|
|
{
|
|
BOOL fReturn = FALSE;
|
|
PCRYPT_ASYNC_PARAM pParam = NULL;
|
|
BOOL fConstOid = ( (DWORD_PTR)pszParamOid <= 0xFFFF );
|
|
|
|
EnterCriticalSection( &m_AsyncLock );
|
|
|
|
pParam = FindAsyncParam( pszParamOid, fConstOid );
|
|
|
|
if ( pvParam == NULL )
|
|
{
|
|
if ( pParam != NULL )
|
|
{
|
|
RemoveAsyncParam( pParam );
|
|
FreeAsyncParam( pParam, fConstOid );
|
|
fReturn = TRUE;
|
|
}
|
|
else
|
|
{
|
|
SetLastError( (DWORD) E_INVALIDARG );
|
|
}
|
|
|
|
LeaveCriticalSection( &m_AsyncLock );
|
|
return( fReturn );
|
|
}
|
|
|
|
if ( pParam != NULL )
|
|
{
|
|
if ( pParam->pfnFree != NULL )
|
|
{
|
|
(*pParam->pfnFree)( pszParamOid, pvParam );
|
|
}
|
|
|
|
pParam->pvParam = pvParam;
|
|
|
|
LeaveCriticalSection( &m_AsyncLock );
|
|
return( TRUE );
|
|
}
|
|
|
|
if ( AllocAsyncParam(
|
|
pszParamOid,
|
|
fConstOid,
|
|
pvParam,
|
|
pfnFree,
|
|
&pParam
|
|
) == TRUE )
|
|
{
|
|
AddAsyncParam( pParam, fConstOid );
|
|
fReturn = TRUE;
|
|
}
|
|
else
|
|
{
|
|
fReturn = FALSE;
|
|
}
|
|
|
|
LeaveCriticalSection( &m_AsyncLock );
|
|
return( fReturn );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CCryptAsyncHandle::GetAsyncParam, public
|
|
//
|
|
// Synopsis: get an async parameter
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
BOOL
|
|
CCryptAsyncHandle::GetAsyncParam (
|
|
LPSTR pszParamOid,
|
|
LPVOID* ppvParam,
|
|
PFN_CRYPT_ASYNC_PARAM_FREE_FUNC* ppfnFree
|
|
)
|
|
{
|
|
PCRYPT_ASYNC_PARAM pFoundParam = NULL;
|
|
BOOL fConstOid = ( (DWORD_PTR)pszParamOid <= 0xFFFF );
|
|
|
|
EnterCriticalSection( &m_AsyncLock );
|
|
|
|
pFoundParam = FindAsyncParam( pszParamOid, fConstOid );
|
|
if ( pFoundParam == NULL )
|
|
{
|
|
LeaveCriticalSection( &m_AsyncLock );
|
|
SetLastError( (DWORD) E_INVALIDARG );
|
|
return( FALSE );
|
|
}
|
|
|
|
*ppvParam = pFoundParam->pvParam;
|
|
if ( ppfnFree != NULL )
|
|
{
|
|
*ppfnFree = pFoundParam->pfnFree;
|
|
}
|
|
|
|
LeaveCriticalSection( &m_AsyncLock );
|
|
return( TRUE );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CCryptAsyncHandle::AllocAsyncParam, private
|
|
//
|
|
// Synopsis: allocate an async parameter block
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
BOOL
|
|
CCryptAsyncHandle::AllocAsyncParam (
|
|
LPSTR pszParamOid,
|
|
BOOL fConstOid,
|
|
LPVOID pvParam,
|
|
PFN_CRYPT_ASYNC_PARAM_FREE_FUNC pfnFree,
|
|
PCRYPT_ASYNC_PARAM* ppParam
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
PCRYPT_ASYNC_PARAM pParam;
|
|
|
|
pParam = new CRYPT_ASYNC_PARAM;
|
|
if ( pParam != NULL )
|
|
{
|
|
memset( pParam, 0, sizeof( CRYPT_ASYNC_PARAM ) );
|
|
if ( fConstOid == FALSE )
|
|
{
|
|
pParam->pszOid = new CHAR [strlen( pszParamOid ) + 1];
|
|
if ( pParam->pszOid != NULL )
|
|
{
|
|
strcpy( pParam->pszOid, pszParamOid );
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pParam->pszOid = pszParamOid;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
if ( hr != S_OK )
|
|
{
|
|
SetLastError( hr );
|
|
return( FALSE );
|
|
}
|
|
|
|
pParam->pvParam = pvParam,
|
|
pParam->pfnFree = pfnFree;
|
|
*ppParam = pParam;
|
|
|
|
return( TRUE );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CCryptAsyncHandle::FreeAsyncParam, private
|
|
//
|
|
// Synopsis: free an async param
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
VOID
|
|
CCryptAsyncHandle::FreeAsyncParam (
|
|
PCRYPT_ASYNC_PARAM pParam,
|
|
BOOL fConstOid
|
|
)
|
|
{
|
|
if ( pParam->pfnFree != NULL )
|
|
{
|
|
(*pParam->pfnFree)( pParam->pszOid, pParam->pvParam );
|
|
}
|
|
|
|
if ( fConstOid == FALSE )
|
|
{
|
|
delete pParam->pszOid;
|
|
}
|
|
|
|
delete pParam;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CCryptAsyncHandle::AddAsyncParam, private
|
|
//
|
|
// Synopsis: add an async parameter
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
VOID
|
|
CCryptAsyncHandle::AddAsyncParam (
|
|
PCRYPT_ASYNC_PARAM pParam,
|
|
BOOL fConstOid
|
|
)
|
|
{
|
|
PCRYPT_ASYNC_PARAM* ppOidList;
|
|
|
|
if ( fConstOid == TRUE )
|
|
{
|
|
ppOidList = &m_pConstOidList;
|
|
}
|
|
else
|
|
{
|
|
ppOidList = &m_pStrOidList;
|
|
}
|
|
|
|
pParam->pNext = *ppOidList;
|
|
pParam->pPrev = NULL;
|
|
*ppOidList = pParam;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CCryptAsyncHandle::RemoveAsyncParam, private
|
|
//
|
|
// Synopsis: remove an async parameter
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
VOID
|
|
CCryptAsyncHandle::RemoveAsyncParam (
|
|
PCRYPT_ASYNC_PARAM pParam
|
|
)
|
|
{
|
|
if ( pParam->pPrev != NULL )
|
|
{
|
|
pParam->pPrev->pNext = pParam->pNext;
|
|
}
|
|
|
|
if ( pParam->pNext != NULL )
|
|
{
|
|
pParam->pNext->pPrev = pParam->pPrev;
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CCryptAsyncHandle::FindAsyncParam, private
|
|
//
|
|
// Synopsis: find an async parameter
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
PCRYPT_ASYNC_PARAM
|
|
CCryptAsyncHandle::FindAsyncParam (
|
|
LPSTR pszParamOid,
|
|
BOOL fConstOid
|
|
)
|
|
{
|
|
PCRYPT_ASYNC_PARAM pParam;
|
|
|
|
if ( fConstOid == TRUE )
|
|
{
|
|
pParam = m_pConstOidList;
|
|
}
|
|
else
|
|
{
|
|
pParam = m_pStrOidList;
|
|
}
|
|
|
|
while ( pParam != NULL )
|
|
{
|
|
if ( fConstOid == TRUE )
|
|
{
|
|
if ( pParam->pszOid == pszParamOid )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( _stricmp( pParam->pszOid, pszParamOid ) == 0 )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
pParam = pParam->pNext;
|
|
}
|
|
|
|
return( pParam );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CCryptAsyncHandle::FreeOidList, private
|
|
//
|
|
// Synopsis: free an OID list
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
VOID
|
|
CCryptAsyncHandle::FreeOidList (
|
|
PCRYPT_ASYNC_PARAM pOidList,
|
|
BOOL fConstOidList
|
|
)
|
|
{
|
|
PCRYPT_ASYNC_PARAM pParam;
|
|
PCRYPT_ASYNC_PARAM pParamNext;
|
|
|
|
pParam = pOidList;
|
|
|
|
while ( pParam != NULL )
|
|
{
|
|
pParamNext = pParam->pNext;
|
|
FreeAsyncParam( pParam, fConstOidList );
|
|
pParam = pParamNext;
|
|
}
|
|
}
|
|
|
|
|
|
|