📄 system.c
字号:
RESOURCE_DATA msgData;
int status;
getHashParameters( CRYPT_ALGO_SHA, &systemInfo->hashFunction,
&systemInfo->hashSize );
setMessageData( &msgData, systemInfo->nonceData + \
systemInfo->hashSize, 8 );
status = krnlSendMessage( SYSTEM_OBJECT_HANDLE,
IMESSAGE_GETATTRIBUTE_S, &msgData,
CRYPT_IATTRIBUTE_RANDOM );
if( cryptStatusError( status ) )
status = krnlSendMessage( SYSTEM_OBJECT_HANDLE,
IMESSAGE_GETATTRIBUTE_S, &msgData,
CRYPT_IATTRIBUTE_RANDOM );
if( cryptStatusError( status ) )
{
const time_t theTime = getTime();
memcpy( systemInfo->nonceData + systemInfo->hashSize,
&theTime, sizeof( time_t ) );
}
systemInfo->nonceDataInitialised = TRUE;
}
/* Shuffle the public state and copy it to the output buffer until
it's full */
while( nonceLength > 0 )
{
const int bytesToCopy = min( nonceLength, systemInfo->hashSize );
/* Hash the state and copy the appropriate amount of data to the
output buffer */
systemInfo->hashFunction( NULL, systemInfo->nonceData,
systemInfo->nonceData,
systemInfo->hashSize + 8, HASH_ALL );
memcpy( noncePtr, systemInfo->nonceData, bytesToCopy );
/* Move on to the next block of the output buffer */
noncePtr += bytesToCopy;
nonceLength -= bytesToCopy;
}
return( CRYPT_OK );
}
/* Handle algorithm self-test. This tests either the algorithm indicated
by the caller, or all algorithms if CRYPT_USE_DEFAULT is given */
if( type == CRYPT_IATTRIBUTE_SELFTEST )
{
const CAPABILITY_INFO_LIST *capabilityInfoListPtr = \
deviceInfo->capabilityInfoList;
BOOLEAN algoTested = FALSE;
while( capabilityInfoListPtr != NULL )
{
const CAPABILITY_INFO *capabilityInfoPtr = capabilityInfoListPtr->info;
const CRYPT_ALGO_TYPE cryptAlgo = capabilityInfoPtr->cryptAlgo;
assert( capabilityInfoPtr->selfTestFunction != NULL );
/* Perform the self-test for this algorithm type and skip to the
next algorithm */
if( dataLength == CRYPT_USE_DEFAULT || \
capabilityInfoPtr->cryptAlgo == dataLength )
{
const int status = capabilityInfoPtr->selfTestFunction();
if( cryptStatusError( status ) )
return( status );
algoTested = TRUE;
}
while( capabilityInfoListPtr != NULL && \
capabilityInfoListPtr->info->cryptAlgo == cryptAlgo )
capabilityInfoListPtr = capabilityInfoListPtr->next;
}
return( algoTested ? CRYPT_OK : CRYPT_ERROR_NOTFOUND );
}
/* Handle high-reliability time */
if( type == CRYPT_IATTRIBUTE_TIME )
{
time_t *timePtr = ( time_t * ) data;
*timePtr = getTime();
return( CRYPT_OK );
}
assert( NOTREACHED );
return( CRYPT_ERROR ); /* Get rid of compiler warning */
}
/****************************************************************************
* *
* Device Capability Routines *
* *
****************************************************************************/
/* The cryptlib intrinsic capability list */
#define MAX_NO_CAPABILITIES 32
static const GETCAPABILITY_FUNCTION getCapabilityTable[] = {
get3DESCapability,
#ifdef USE_AES
getAESCapability,
#endif /* USE_AES */
#ifdef USE_BLOWFISH
getBlowfishCapability,
#endif /* USE_BLOWFISH */
#ifdef USE_CAST
getCASTCapability,
#endif /* USE_CAST */
getDESCapability,
#ifdef USE_IDEA
getIDEACapability,
#endif /* USE_IDEA */
#ifdef USE_RC2
getRC2Capability,
#endif /* USE_RC2 */
#ifdef USE_RC4
getRC4Capability,
#endif /* USE_RC4 */
#ifdef USE_RC5
getRC5Capability,
#endif /* USE_RC5 */
#ifdef USE_SKIPJACK
getSkipjackCapability,
#endif /* USE_SKIPJACK */
#ifdef USE_MD2
getMD2Capability,
#endif /* USE_MD2 */
#ifdef USE_MD4
getMD4Capability,
#endif /* USE_MD4 */
getMD5Capability,
#ifdef USE_RIPEMD160
getRipemd160Capability,
#endif /* USE_RIPEMD160 */
getSHA1Capability,
#ifdef USE_SHA2
getSHA2Capability,
#endif /* USE_SHA2 */
#ifdef USE_HMAC_MD5
getHmacMD5Capability,
#endif /* USE_HMAC_MD5 */
#ifdef USE_HMAC_RIPEMD160
getHmacRipemd160Capability,
#endif /* USE_HMAC_RIPEMD160 */
getHmacSHA1Capability,
getDHCapability,
getDSACapability,
#ifdef USE_ELGAMAL
getElgamalCapability,
#endif /* USE_ELGAMAL */
getRSACapability,
/* Vendors may want to use their own algorithms, which aren't part of the
general cryptlib suite. The following provides the ability to include
vendor-specific algorithm capabilities defined in the file
vendalgo.c */
#ifdef USE_VENDOR_ALGOS
#include "vendalgo.c"
#endif /* USE_VENDOR_ALGOS */
/* End-of-list marker */
NULL
};
static CAPABILITY_INFO_LIST capabilityInfoList[ MAX_NO_CAPABILITIES ];
/* Initialise the capability info */
static void initCapabilities( void )
{
int i;
/* Perform a consistency check on the encryption mode values, which
are used to index a table of per-mode function pointers */
assert( CRYPT_MODE_CBC == CRYPT_MODE_ECB + 1 && \
CRYPT_MODE_CFB == CRYPT_MODE_CBC + 1 && \
CRYPT_MODE_OFB == CRYPT_MODE_CFB + 1 && \
CRYPT_MODE_LAST == CRYPT_MODE_OFB + 1 );
/* Build the list of available capabilities */
memset( capabilityInfoList, 0,
sizeof( CAPABILITY_INFO_LIST ) * MAX_NO_CAPABILITIES );
for( i = 0; getCapabilityTable[ i ] != NULL; i++ )
{
const CAPABILITY_INFO *capabilityInfoPtr = getCapabilityTable[ i ]();
assert( capabilityInfoOK( capabilityInfoPtr, FALSE ) );
capabilityInfoList[ i ].info = capabilityInfoPtr;
capabilityInfoList[ i ].next = NULL;
if( i > 0 )
capabilityInfoList[ i - 1 ].next = &capabilityInfoList[ i ];
}
}
/****************************************************************************
* *
* Device Access Routines *
* *
****************************************************************************/
/* Set up the function pointers to the device methods */
int setDeviceSystem( DEVICE_INFO *deviceInfo )
{
deviceInfo->initFunction = initFunction;
deviceInfo->shutdownFunction = shutdownFunction;
deviceInfo->controlFunction = controlFunction;
deviceInfo->getRandomFunction = getRandomFunction;
deviceInfo->capabilityInfoList = capabilityInfoList;
deviceInfo->createObjectFunctions = createObjectFunctions;
deviceInfo->mechanismFunctions = mechanismFunctions;
return( CRYPT_OK );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -