880 lines
16 KiB
C++
880 lines
16 KiB
C++
/*++
|
||
|
||
Copyright (c) 1997 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
storage.cxx
|
||
|
||
Abstract:
|
||
|
||
This module implements the IIS_CRYPTO_STORAGE class.
|
||
|
||
Author:
|
||
|
||
Keith Moore (keithmo) 02-Dec-1996
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
|
||
#include "precomp.hxx"
|
||
#pragma hdrstop
|
||
|
||
|
||
//
|
||
// Private constants.
|
||
//
|
||
|
||
|
||
//
|
||
// Private types.
|
||
//
|
||
|
||
|
||
//
|
||
// Private globals.
|
||
//
|
||
|
||
|
||
//
|
||
// Private prototypes.
|
||
//
|
||
|
||
|
||
//
|
||
// Public functions.
|
||
//
|
||
|
||
|
||
IIS_CRYPTO_STORAGE::IIS_CRYPTO_STORAGE()
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
IIS_CRYPTO_STORAGE class constructor. Just sets the member variables
|
||
to known values; does nothing that can actually fail. All of the
|
||
hard work is in the Initialize() methods.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
//
|
||
// Set the handles to known values so we know what to cleanup
|
||
// in the destructor.
|
||
//
|
||
|
||
m_hSessionKey = CRYPT_NULL;
|
||
|
||
} // IIS_CRYPTO_STORAGE::IIS_CRYPTO_STORAGE
|
||
|
||
|
||
IIS_CRYPTO_STORAGE::~IIS_CRYPTO_STORAGE()
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
IIS_CRYPTO_STORAGE class destructor. Performs any necessary cleanup.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
//
|
||
// Close any open keys.
|
||
//
|
||
|
||
CLOSE_KEY( m_hSessionKey );
|
||
|
||
} // IIS_CRYPTO_STORAGE::~IIS_CRYPTO_STORAGE
|
||
|
||
|
||
HRESULT
|
||
IIS_CRYPTO_STORAGE::Initialize(
|
||
IN BOOL fUseMachineKeyset,
|
||
IN HCRYPTPROV hProv
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Generates a new (random) session key.
|
||
|
||
Arguments:
|
||
|
||
fUseMachineKeyset - TRUE if the per-machine keyset container should
|
||
be used, as opposed to the per-user keyset container.
|
||
|
||
hProv - Optional handle to a pre-opened crypto provider.
|
||
|
||
Return Value:
|
||
|
||
HRESULT - Completion status, 0 if successful, !0 otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
HRESULT result;
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( m_hSessionKey == CRYPT_NULL );
|
||
|
||
//
|
||
// Initialize the base class.
|
||
//
|
||
|
||
result = IIS_CRYPTO_BASE::Initialize(
|
||
hProv,
|
||
CRYPT_NULL,
|
||
CRYPT_NULL,
|
||
fUseMachineKeyset
|
||
);
|
||
|
||
if( SUCCEEDED(result) ) {
|
||
|
||
//
|
||
// Generate the session key.
|
||
//
|
||
|
||
result = ::IISCryptoGenerateSessionKey(
|
||
&m_hSessionKey,
|
||
m_hProv
|
||
);
|
||
if( FAILED(result) ) {
|
||
DBGPRINTF(( DBG_CONTEXT,"IIS_CRYPTO_STORAGE::Initialize IISCryptoGenerateSessionKey err=0x%x.\n",result));
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
// something failed.
|
||
DBGPRINTF(( DBG_CONTEXT,"IIS_CRYPTO_STORAGE::Initialize:IIS_CRYPTO_BASE::Initialize Failed err=0x%x.\n",result));
|
||
}
|
||
|
||
return result;
|
||
|
||
} // IIS_CRYPTO_STORAGE::Initialize
|
||
|
||
HRESULT
|
||
IIS_CRYPTO_STORAGE2::Initialize(
|
||
IN HCRYPTPROV hProv
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Generates a new (random) session key.
|
||
|
||
Arguments:
|
||
|
||
hProv - Optional handle to a pre-opened crypto provider.
|
||
|
||
Return Value:
|
||
|
||
HRESULT - Completion status, 0 if successful, !0 otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
HRESULT result;
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( m_hSessionKey == CRYPT_NULL );
|
||
|
||
//
|
||
// Initialize the base class.
|
||
//
|
||
|
||
result = Initialize2( hProv );
|
||
|
||
if( SUCCEEDED(result) ) {
|
||
|
||
//
|
||
// Generate the session key.
|
||
//
|
||
|
||
result = ::IISCryptoGenerateSessionKey(
|
||
&m_hSessionKey,
|
||
m_hProv
|
||
);
|
||
if( FAILED(result) ) {
|
||
DBGPRINTF(( DBG_CONTEXT,"IIS_CRYPTO_STORAGE::Initialize IISCryptoGenerateSessionKey err=0x%x.\n",result));
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
// something failed.
|
||
DBGPRINTF(( DBG_CONTEXT,"IIS_CRYPTO_STORAGE::Initialize:IIS_CRYPTO_BASE::Initialize Failed err=0x%x.\n",result));
|
||
}
|
||
|
||
return result;
|
||
|
||
} // IIS_CRYPTO_STORAGE2::Initialize
|
||
|
||
|
||
HRESULT
|
||
IIS_CRYPTO_STORAGE::Initialize(
|
||
IN PIIS_CRYPTO_BLOB pSessionKeyBlob,
|
||
IN BOOL fUseMachineKeyset,
|
||
IN HCRYPTPROV hProv
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Imports the specified session key blob.
|
||
|
||
Arguments:
|
||
|
||
pSessionKeyBlob - Points to the secure key blob to import.
|
||
|
||
fUseMachineKeyset - TRUE if the per-machine keyset container should
|
||
be used, as opposed to the per-user keyset container.
|
||
|
||
hProv - Optional handle to a pre-opened crypto provider.
|
||
|
||
Return Value:
|
||
|
||
HRESULT - Completion status, 0 if successful, !0 otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
HRESULT result;
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( m_hSessionKey == CRYPT_NULL );
|
||
DBG_ASSERT( pSessionKeyBlob != NULL );
|
||
|
||
//
|
||
// Initialize the base class.
|
||
//
|
||
|
||
result = IIS_CRYPTO_BASE::Initialize(
|
||
hProv,
|
||
CRYPT_NULL,
|
||
CRYPT_NULL,
|
||
fUseMachineKeyset
|
||
);
|
||
|
||
if( SUCCEEDED(result) ) {
|
||
|
||
//
|
||
// Import the session key blob.
|
||
//
|
||
|
||
result = SafeImportSessionKeyBlob(
|
||
&m_hSessionKey,
|
||
pSessionKeyBlob,
|
||
m_hProv,
|
||
m_hSignatureKey
|
||
);
|
||
if( FAILED(result) ) {
|
||
DBGPRINTF(( DBG_CONTEXT,"IIS_CRYPTO_STORAGE::Initialize SafeImportSessionKeyBlob failed err=0x%x.\n",result));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
DBGPRINTF(( DBG_CONTEXT,"IIS_CRYPTO_STORAGE::Initialize IIS_CRYPTO_BASE::Initialize failed err=0x%x.\n",result));
|
||
}
|
||
|
||
return result;
|
||
|
||
} // IIS_CRYPTO_STORAGE::Initialize
|
||
|
||
HRESULT
|
||
IIS_CRYPTO_STORAGE2::Initialize(
|
||
IN PIIS_CRYPTO_BLOB pSessionKeyBlob,
|
||
IN LPSTR pszPasswd,
|
||
IN HCRYPTPROV hProv
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Imports the specified session key blob.
|
||
|
||
Arguments:
|
||
|
||
pSessionKeyBlob - Points to the secure key blob to import.
|
||
|
||
hProv - Optional handle to a pre-opened crypto provider.
|
||
|
||
Return Value:
|
||
|
||
HRESULT - Completion status, 0 if successful, !0 otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
HRESULT result;
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( m_hSessionKey == CRYPT_NULL );
|
||
DBG_ASSERT( pszPasswd != NULL );
|
||
DBG_ASSERT( pSessionKeyBlob != NULL );
|
||
|
||
//
|
||
// Initialize the base class.
|
||
//
|
||
|
||
result = IIS_CRYPTO_BASE::Initialize( hProv );
|
||
|
||
if( SUCCEEDED(result) ) {
|
||
|
||
//
|
||
// Import the session key blob.
|
||
//
|
||
|
||
result = SafeImportSessionKeyBlob2(
|
||
&m_hSessionKey,
|
||
pSessionKeyBlob,
|
||
m_hProv,
|
||
pszPasswd
|
||
);
|
||
if( FAILED(result) ) {
|
||
DBGPRINTF(( DBG_CONTEXT,"IIS_CRYPTO_STORAGE::Initialize SafeImportSessionKeyBlob failed err=0x%x.\n",result));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
DBGPRINTF(( DBG_CONTEXT,"IIS_CRYPTO_STORAGE::Initialize IIS_CRYPTO_BASE::Initialize failed err=0x%x.\n",result));
|
||
}
|
||
|
||
return result;
|
||
|
||
} // IIS_CRYPTO_STORAGE2::Initialize
|
||
|
||
|
||
HRESULT
|
||
IIS_CRYPTO_STORAGE::Initialize(
|
||
IN HCRYPTPROV hProv,
|
||
IN HCRYPTKEY hSessionKey,
|
||
IN HCRYPTKEY hKeyExchangeKey,
|
||
IN HCRYPTKEY hSignatureKey,
|
||
IN BOOL fUseMachineKeyset
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Initializes the object using pre-created provider and session key.
|
||
|
||
Arguments:
|
||
|
||
hProv - An open handle to a crypto provider.
|
||
|
||
hSessionKey - The session key for the object.
|
||
|
||
hKeyExchangeKey - A pre-opened key exchange key.
|
||
|
||
hSignatureKey - A pre-opened signature key.
|
||
|
||
fUseMachineKeyset - TRUE if the per-machine keyset container should
|
||
be used, as opposed to the per-user keyset container.
|
||
|
||
Return Value:
|
||
|
||
HRESULT - Completion status, 0 if successful, !0 otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
HRESULT result;
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( m_hSessionKey == CRYPT_NULL );
|
||
DBG_ASSERT( hSessionKey != CRYPT_NULL );
|
||
|
||
//
|
||
// Initialize the base class.
|
||
//
|
||
|
||
result = IIS_CRYPTO_BASE::Initialize(
|
||
hProv,
|
||
hKeyExchangeKey,
|
||
hSignatureKey,
|
||
fUseMachineKeyset
|
||
);
|
||
|
||
if( SUCCEEDED(result) ) {
|
||
|
||
//
|
||
// Save the session key.
|
||
//
|
||
|
||
m_hSessionKey = hSessionKey;
|
||
}
|
||
else
|
||
{
|
||
DBGPRINTF(( DBG_CONTEXT,"IIS_CRYPTO_STORAGE::Initialize IIS_CRYPTO_BASE::Initialize failed err=0x%x.\n",result));
|
||
}
|
||
|
||
return result;
|
||
|
||
} // IIS_CRYPTO_STORAGE::Initialize
|
||
|
||
|
||
HRESULT
|
||
IIS_CRYPTO_STORAGE::GetSessionKeyBlob(
|
||
OUT PIIS_CRYPTO_BLOB * ppSessionKeyBlob
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Exports the session key as a secure key blob.
|
||
|
||
Arguments:
|
||
|
||
ppSessionKeyBlob - Receives a pointer to the session key secure
|
||
blob if successful.
|
||
|
||
Return Value:
|
||
|
||
HRESULT - Completion status, 0 if successful, !0 otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
HRESULT result;
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( ValidateState() );
|
||
DBG_ASSERT( ppSessionKeyBlob != NULL );
|
||
|
||
//
|
||
// Let the IIS Crypto APIs do the dirty work.
|
||
//
|
||
|
||
result = SafeExportSessionKeyBlob(
|
||
ppSessionKeyBlob,
|
||
m_hProv,
|
||
m_hSessionKey,
|
||
m_hKeyExchangeKey
|
||
);
|
||
|
||
return result;
|
||
|
||
} // IIS_CRYPTO_STORAGE::GetSessionKeyBlob
|
||
|
||
HRESULT
|
||
IIS_CRYPTO_STORAGE2::GetSessionKeyBlob(
|
||
IN LPSTR pszPasswd,
|
||
OUT PIIS_CRYPTO_BLOB * ppSessionKeyBlob
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Exports the session key as a secure key blob.
|
||
|
||
Arguments:
|
||
|
||
ppSessionKeyBlob - Receives a pointer to the session key secure
|
||
blob if successful.
|
||
|
||
Return Value:
|
||
|
||
HRESULT - Completion status, 0 if successful, !0 otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
HRESULT result;
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( ValidateState() );
|
||
DBG_ASSERT( ppSessionKeyBlob != NULL );
|
||
|
||
//
|
||
// Let the IIS Crypto APIs do the dirty work.
|
||
//
|
||
|
||
result = SafeExportSessionKeyBlob2(
|
||
ppSessionKeyBlob,
|
||
m_hProv,
|
||
m_hSessionKey,
|
||
pszPasswd
|
||
);
|
||
|
||
return result;
|
||
|
||
} // IIS_CRYPTO_STORAGE2::GetSessionKeyBlob
|
||
|
||
|
||
HRESULT
|
||
IIS_CRYPTO_STORAGE::EncryptData(
|
||
OUT PIIS_CRYPTO_BLOB * ppDataBlob,
|
||
IN PVOID pBuffer,
|
||
IN DWORD dwBufferLength,
|
||
IN DWORD dwRegType
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Encrypts a block of data and produces a secure data blob.
|
||
|
||
Arguments:
|
||
|
||
ppDataBlob - Receives a pointer to the secure data blob if
|
||
successful.
|
||
|
||
pBuffer - Pointer to the buffer to encrypt.
|
||
|
||
dwBufferLength - The length of the data buffer.
|
||
|
||
dwRegType - The REG_* type for the data.
|
||
|
||
Return Value:
|
||
|
||
HRESULT - Completion status, 0 if successful, !0 otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
HRESULT result;
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( ValidateState() );
|
||
DBG_ASSERT( ppDataBlob != NULL );
|
||
DBG_ASSERT( pBuffer != NULL );
|
||
|
||
//
|
||
// Let the IIS Crypto APIs do the dirty work.
|
||
//
|
||
|
||
result = SafeEncryptDataBlob(
|
||
ppDataBlob,
|
||
pBuffer,
|
||
dwBufferLength,
|
||
dwRegType,
|
||
m_hProv,
|
||
m_hSessionKey
|
||
);
|
||
|
||
return result;
|
||
|
||
} // IIS_CRYPTO_STORAGE::EncryptData
|
||
|
||
HRESULT
|
||
IIS_CRYPTO_STORAGE2::EncryptData(
|
||
OUT PIIS_CRYPTO_BLOB * ppDataBlob,
|
||
IN PVOID pBuffer,
|
||
IN DWORD dwBufferLength,
|
||
IN DWORD dwRegType
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Encrypts a block of data and produces a secure data blob.
|
||
|
||
Arguments:
|
||
|
||
ppDataBlob - Receives a pointer to the secure data blob if
|
||
successful.
|
||
|
||
pBuffer - Pointer to the buffer to encrypt.
|
||
|
||
dwBufferLength - The length of the data buffer.
|
||
|
||
dwRegType - The REG_* type for the data.
|
||
|
||
Return Value:
|
||
|
||
HRESULT - Completion status, 0 if successful, !0 otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
HRESULT result;
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( ValidateState() );
|
||
DBG_ASSERT( ppDataBlob != NULL );
|
||
DBG_ASSERT( pBuffer != NULL );
|
||
|
||
//
|
||
// Let the IIS Crypto APIs do the dirty work.
|
||
//
|
||
|
||
result = SafeEncryptDataBlob2(
|
||
ppDataBlob,
|
||
pBuffer,
|
||
dwBufferLength,
|
||
dwRegType,
|
||
m_hProv,
|
||
m_hSessionKey
|
||
);
|
||
|
||
return result;
|
||
|
||
} // IIS_CRYPTO_STORAGE2::EncryptData
|
||
|
||
|
||
HRESULT
|
||
IIS_CRYPTO_STORAGE::DecryptData(
|
||
OUT PVOID * ppBuffer,
|
||
OUT LPDWORD pdwBufferLength,
|
||
OUT LPDWORD pdwRegType,
|
||
IN PIIS_CRYPTO_BLOB pDataBlob
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Decrypts a secure data blob, producing a data pointer and data
|
||
length.
|
||
|
||
Arguments:
|
||
|
||
ppBuffer - Receives a pointer to the decrypted data if succesful.
|
||
|
||
pdwBufferLength - Receives the length of the data buffer.
|
||
|
||
pdwRegType - Receives the REG_* type of the data.
|
||
|
||
pDataBlob - A pointer to the data blob to decrypt.
|
||
|
||
Return Value:
|
||
|
||
HRESULT - Completion status, 0 if successful, !0 otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
HRESULT result;
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( ValidateState() );
|
||
DBG_ASSERT( ppBuffer != NULL );
|
||
DBG_ASSERT( pdwBufferLength != NULL );
|
||
DBG_ASSERT( pdwRegType != NULL );
|
||
DBG_ASSERT( pDataBlob != NULL );
|
||
|
||
//
|
||
// Let the IIS Crypto APIs do the dirty work.
|
||
//
|
||
|
||
result = ::IISCryptoDecryptDataBlob(
|
||
ppBuffer,
|
||
pdwBufferLength,
|
||
pdwRegType,
|
||
pDataBlob,
|
||
m_hProv,
|
||
m_hSessionKey,
|
||
m_hSignatureKey
|
||
);
|
||
|
||
return result;
|
||
|
||
} // IIS_CRYPTO_STORAGE::DecryptData
|
||
|
||
HRESULT
|
||
IIS_CRYPTO_STORAGE2::DecryptData(
|
||
OUT PVOID * ppBuffer,
|
||
OUT LPDWORD pdwBufferLength,
|
||
OUT LPDWORD pdwRegType,
|
||
IN PIIS_CRYPTO_BLOB pDataBlob
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Decrypts a secure data blob, producing a data pointer and data
|
||
length.
|
||
|
||
Arguments:
|
||
|
||
ppBuffer - Receives a pointer to the decrypted data if succesful.
|
||
|
||
pdwBufferLength - Receives the length of the data buffer.
|
||
|
||
pdwRegType - Receives the REG_* type of the data.
|
||
|
||
pDataBlob - A pointer to the data blob to decrypt.
|
||
|
||
Return Value:
|
||
|
||
HRESULT - Completion status, 0 if successful, !0 otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
HRESULT result;
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( ValidateState() );
|
||
DBG_ASSERT( ppBuffer != NULL );
|
||
DBG_ASSERT( pdwBufferLength != NULL );
|
||
DBG_ASSERT( pdwRegType != NULL );
|
||
DBG_ASSERT( pDataBlob != NULL );
|
||
|
||
//
|
||
// Let the IIS Crypto APIs do the dirty work.
|
||
//
|
||
|
||
result = ::IISCryptoDecryptDataBlob2(
|
||
ppBuffer,
|
||
pdwBufferLength,
|
||
pdwRegType,
|
||
pDataBlob,
|
||
m_hProv,
|
||
m_hSessionKey
|
||
);
|
||
|
||
return result;
|
||
|
||
} // IIS_CRYPTO_STORAGE2::DecryptData
|
||
|
||
|
||
//
|
||
// Private functions.
|
||
//
|
||
|
||
|
||
#if DBG
|
||
|
||
BOOL
|
||
IIS_CRYPTO_STORAGE::ValidateState()
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This debug-only routine validates the current object state.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
BOOL - TRUE if state is valid, FALSE otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
if( m_hSessionKey != CRYPT_NULL ) {
|
||
|
||
return IIS_CRYPTO_BASE::ValidateState();
|
||
|
||
}
|
||
|
||
return FALSE;
|
||
|
||
} // IIS_CRYPTO_STORAGE::ValidateState
|
||
|
||
BOOL
|
||
IIS_CRYPTO_STORAGE2::ValidateState()
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This debug-only routine validates the current object state.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
BOOL - TRUE if state is valid, FALSE otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
if( m_hSessionKey != CRYPT_NULL ) {
|
||
|
||
return IIS_CRYPTO_BASE::ValidateState2();
|
||
|
||
}
|
||
|
||
return FALSE;
|
||
|
||
} // IIS_CRYPTO_STORAGE::ValidateState
|
||
|
||
#endif // DBG
|
||
|