📄 init.c
字号:
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
return( FALSE );
}
/* Verify the ability to transition a state = low object to state =
high */
setMessageData( &msgData, ( void * ) key, 8 );
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE_S, &msgData,
CRYPT_CTXINFO_KEY ) != CRYPT_OK )
{
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
return( FALSE );
}
/* Verify the inability to write a read-only attribute, read a write-
only attribute, or delete a non-deletable attribute */
value = CRYPT_MODE_CBC;
setMessageData( &msgData, NULL, 0 );
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_CTXINFO_BLOCKSIZE ) != CRYPT_ERROR_PERMISSION || \
krnlSendMessage( cryptHandle, IMESSAGE_GETATTRIBUTE_S, &msgData,
CRYPT_CTXINFO_KEY ) != CRYPT_ERROR_PERMISSION || \
krnlSendMessage( cryptHandle, IMESSAGE_DELETEATTRIBUTE, NULL,
CRYPT_CTXINFO_MODE ) != CRYPT_ERROR_PERMISSION )
{
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
return( FALSE );
}
/* Verify the inability to perform state = low operations on a state =
high object */
setMessageData( &msgData, ( void * ) key, 8 );
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE_S, &msgData,
CRYPT_CTXINFO_KEY ) != CRYPT_ERROR_PERMISSION || \
krnlSendNotifier( cryptHandle,
IMESSAGE_CTX_GENKEY ) != CRYPT_ERROR_PERMISSION )
{
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
return( FALSE );
}
/* Verify the inability to perform an internal-only action externally
but still perform it internally. We also repeat the internal-only
attribute test from earlier on, this access is now stopped at the
attribute check level rather than the object-check level.
The object will become very briefly visible externally at this point,
but there's nothing that can be done with it because of the
permission settings */
value = \
MK_ACTION_PERM( MESSAGE_CTX_ENCRYPT, ACTION_PERM_NONE_EXTERNAL ) | \
MK_ACTION_PERM( MESSAGE_CTX_DECRYPT, ACTION_PERM_NONE_EXTERNAL );
memset( buffer, 0, 16 );
krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_IATTRIBUTE_ACTIONPERMS );
krnlSendMessage( createInfo.cryptHandle, IMESSAGE_SETATTRIBUTE,
MESSAGE_VALUE_FALSE, CRYPT_IATTRIBUTE_INTERNAL );
if( krnlSendMessage( cryptHandle, MESSAGE_CTX_ENCRYPT,
buffer, 8 ) != CRYPT_ERROR_PERMISSION || \
krnlSendMessage( cryptHandle, IMESSAGE_CTX_ENCRYPT,
buffer, 8 ) != CRYPT_OK )
{
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
return( FALSE );
}
if( krnlSendMessage( cryptHandle, MESSAGE_GETATTRIBUTE, &value,
CRYPT_IATTRIBUTE_TYPE ) != CRYPT_ARGERROR_VALUE )
{
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
return( FALSE );
}
krnlSendMessage( createInfo.cryptHandle, IMESSAGE_SETATTRIBUTE,
MESSAGE_VALUE_TRUE, CRYPT_IATTRIBUTE_INTERNAL );
/* Verify the ability to use an object with a finite usage count, the
inability to increment the count, the ability to decrement the count,
and the inability to exceed the usage count */
status = CRYPT_OK;
value = 10;
memset( buffer, 0, 16 );
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_PROPERTY_USAGECOUNT ) != CRYPT_OK || \
krnlSendMessage( cryptHandle, IMESSAGE_CTX_ENCRYPT,
buffer, 8 ) != CRYPT_OK )
status = CRYPT_ERROR;
value = 20;
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_PROPERTY_USAGECOUNT ) != CRYPT_ERROR_PERMISSION )
status = CRYPT_ERROR;
value = 1;
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_PROPERTY_USAGECOUNT ) != CRYPT_OK || \
krnlSendMessage( cryptHandle, IMESSAGE_CTX_ENCRYPT,
buffer, 8 ) != CRYPT_OK || \
krnlSendMessage( cryptHandle, IMESSAGE_CTX_ENCRYPT,
buffer, 8 ) != CRYPT_ERROR_PERMISSION )
status = CRYPT_ERROR;
if( cryptStatusError( status ) )
{
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
return( FALSE );
}
/* Verify the ability to lock an object and the inability to change
security parameters once it's locked */
value = 5;
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_PROPERTY_FORWARDCOUNT ) != CRYPT_OK || \
krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE,
MESSAGE_VALUE_TRUE,
CRYPT_PROPERTY_HIGHSECURITY ) != CRYPT_OK )
{
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
return( FALSE );
}
if( krnlSendMessage( cryptHandle, IMESSAGE_GETATTRIBUTE, &value,
CRYPT_PROPERTY_LOCKED ) != CRYPT_OK || \
value != TRUE || \
krnlSendMessage( cryptHandle, IMESSAGE_GETATTRIBUTE, &value,
CRYPT_PROPERTY_FORWARDCOUNT ) != CRYPT_ERROR_PERMISSION )
{
/* Object should be locked, forwardcount should be inaccessible */
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
return( FALSE );
}
value = 1;
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_PROPERTY_FORWARDCOUNT ) != CRYPT_ERROR_PERMISSION )
{
/* Security parameters shouldn't be writeable */
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
return( FALSE );
}
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
/* The following checks require that use of certificates be enabled in
order to perform them. This is because these attribute types are
only valid for certificates (or, by extension, certificate-using
object types like envelopes and sessions). So although these
attribute ACLs won't be tested if certificates aren't enabled, they
also won't be used if certificates aren't enabled */
#ifdef USE_CERTIFICATES
/* Create a cert object for the remaining kernel range checks */
setMessageCreateObjectInfo( &createInfo, CRYPT_CERTTYPE_CERTIFICATE );
status = krnlSendMessage( SYSTEM_OBJECT_HANDLE, IMESSAGE_DEV_CREATEOBJECT,
&createInfo, OBJECT_TYPE_CERTIFICATE );
if( cryptStatusError( status ) )
return( FALSE );
cryptHandle = createInfo.cryptHandle;
/* Verify functioning of the kernel range checking, phase 3: Boolean
values. Any value should be OK, with conversion to TRUE/FALSE */
status = CRYPT_OK;
value = 0; /* FALSE */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_CERTINFO_SELFSIGNED ) != CRYPT_OK )
status = CRYPT_ERROR;
if( krnlSendMessage( cryptHandle, IMESSAGE_GETATTRIBUTE, &value,
CRYPT_CERTINFO_SELFSIGNED ) != CRYPT_OK || \
value != FALSE )
status = CRYPT_ERROR;
value = 1; /* TRUE */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_CERTINFO_SELFSIGNED ) != CRYPT_OK )
status = CRYPT_ERROR;
if( krnlSendMessage( cryptHandle, IMESSAGE_GETATTRIBUTE, &value,
CRYPT_CERTINFO_SELFSIGNED ) != CRYPT_OK || \
value != TRUE )
status = CRYPT_ERROR;
value = 10000; /* Positive true-equivalent */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_CERTINFO_SELFSIGNED ) != CRYPT_OK )
status = CRYPT_ERROR;
if( krnlSendMessage( cryptHandle, IMESSAGE_GETATTRIBUTE, &value,
CRYPT_CERTINFO_SELFSIGNED ) != CRYPT_OK || \
value != TRUE )
status = CRYPT_ERROR;
value = -1; /* Negative true-equivalent */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_CERTINFO_SELFSIGNED ) != CRYPT_OK )
status = CRYPT_ERROR;
if( krnlSendMessage( cryptHandle, IMESSAGE_GETATTRIBUTE, &value,
CRYPT_CERTINFO_SELFSIGNED ) != CRYPT_OK || \
value != TRUE )
status = CRYPT_ERROR;
if( cryptStatusError( status ) )
{
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
return( FALSE );
}
/* Verify functioning of the kernel range checking, phase 4: Time
values. Any value above the initial cutoff date should be OK */
status = CRYPT_OK;
setMessageData( &msgData, &timeVal, sizeof( time_t ) );
timeVal = 10; /* Below */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE_S, &msgData,
CRYPT_CERTINFO_VALIDFROM ) != CRYPT_ARGERROR_STR1 )
status = CRYPT_ERROR;
timeVal = MIN_TIME_VALUE; /* Lower bound fencepost error */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE_S, &msgData,
CRYPT_CERTINFO_VALIDFROM ) != CRYPT_ARGERROR_STR1 )
status = CRYPT_ERROR;
timeVal = MIN_TIME_VALUE + 1; /* Lower bound */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE_S, &msgData,
CRYPT_CERTINFO_VALIDFROM ) != CRYPT_OK )
status = CRYPT_ERROR;
timeVal = 0x40000000L; /* Mid-range */
krnlSendMessage( cryptHandle, IMESSAGE_DELETEATTRIBUTE, NULL,
CRYPT_CERTINFO_VALIDFROM );
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE_S, &msgData,
CRYPT_CERTINFO_VALIDFROM ) != CRYPT_OK )
status = CRYPT_ERROR;
if( cryptStatusError( status ) )
{
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
return( FALSE );
}
/* Verify functioning of kernel range-checking, phase 6: Special-case
checks, allowed values. Valid values are either a 4-byte IPv4
address or a 16-byte IPv6 address */
value = CRYPT_CERTINFO_SUBJECTALTNAME;
memset( buffer, 0, 16 );
setMessageData( &msgData, buffer, 3 ); /* Below, allowed value 1 */
krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_ATTRIBUTE_CURRENT );
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE_S, &msgData,
CRYPT_CERTINFO_IPADDRESS ) != CRYPT_ARGERROR_NUM1 )
status = CRYPT_ERROR;
setMessageData( &msgData, buffer, 4 ); /* Equal, allowed value 1 */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE_S, &msgData,
CRYPT_CERTINFO_IPADDRESS ) != CRYPT_OK )
status = CRYPT_ERROR;
krnlSendMessage( cryptHandle, IMESSAGE_DELETEATTRIBUTE, NULL,
CRYPT_CERTINFO_IPADDRESS );
krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_ATTRIBUTE_CURRENT );
setMessageData( &msgData, buffer, 5 ); /* Above, allowed value 1 */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE_S, &msgData,
CRYPT_CERTINFO_IPADDRESS ) != CRYPT_ARGERROR_NUM1 )
status = CRYPT_ERROR;
setMessageData( &msgData, buffer, 15 ); /* Below, allowed value 2 */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE_S, &msgData,
CRYPT_CERTINFO_IPADDRESS ) != CRYPT_ARGERROR_NUM1 )
status = CRYPT_ERROR;
setMessageData( &msgData, buffer, 16 ); /* Equal, allowed value 2 */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE_S, &msgData,
CRYPT_CERTINFO_IPADDRESS ) != CRYPT_OK )
status = CRYPT_ERROR;
krnlSendMessage( cryptHandle, IMESSAGE_DELETEATTRIBUTE, NULL,
CRYPT_CERTINFO_IPADDRESS );
krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_ATTRIBUTE_CURRENT );
setMessageData( &msgData, buffer, 17 ); /* Above, allowed value 2 */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE_S, &msgData,
CRYPT_CERTINFO_IPADDRESS ) != CRYPT_ARGERROR_NUM1 )
status = CRYPT_ERROR;
if( cryptStatusError( status ) )
{
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
return( FALSE );
}
/* Verify functioning of kernel range-checking, phase 6: Special-case
checks, subranges. Valid values are either CRYPT_CURSOR_FIRST ...
CRYPT_CURSOR_LAST or an extension ID. Since the cursor movement codes
are negative values, an out-of-bounds value is MIN + 1 or MAX - 1, not
the other way round */
value = CRYPT_CURSOR_FIRST + 1; /* Below, subrange 1 */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_ATTRIBUTE_CURRENT_GROUP ) != CRYPT_ARGERROR_NUM1 )
status = CRYPT_ERROR;
value = CRYPT_CURSOR_FIRST; /* Low bound, subrange 1 */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_ATTRIBUTE_CURRENT_GROUP ) != CRYPT_ERROR_NOTFOUND )
status = CRYPT_ERROR;
value = CRYPT_CURSOR_LAST; /* High bound, subrange 1 */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_ATTRIBUTE_CURRENT_GROUP ) != CRYPT_ERROR_NOTFOUND )
status = CRYPT_ERROR;
value = CRYPT_CURSOR_LAST - 1; /* Above, subrange 1 */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_ATTRIBUTE_CURRENT_GROUP ) != CRYPT_ARGERROR_NUM1 )
status = CRYPT_ERROR;
value = CRYPT_CERTINFO_FIRST_EXTENSION - 1; /* Below, subrange 2 */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_ATTRIBUTE_CURRENT_GROUP ) != CRYPT_ARGERROR_NUM1 )
status = CRYPT_ERROR;
value = CRYPT_CERTINFO_FIRST_EXTENSION; /* Low bound, subrange 2 */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_ATTRIBUTE_CURRENT_GROUP ) != CRYPT_ERROR_NOTFOUND )
status = CRYPT_ERROR;
value = CRYPT_CERTINFO_LAST_EXTENSION; /* High bound, subrange 2 */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_ATTRIBUTE_CURRENT_GROUP ) != CRYPT_ERROR_NOTFOUND )
status = CRYPT_ERROR;
value = CRYPT_CERTINFO_LAST_EXTENSION + 1; /* Above, subrange 2 */
if( krnlSendMessage( cryptHandle, IMESSAGE_SETATTRIBUTE, &value,
CRYPT_ATTRIBUTE_CURRENT_GROUP ) != CRYPT_ARGERROR_NUM1 )
status = CRYPT_ERROR;
krnlSendNotifier( cryptHandle, IMESSAGE_DECREFCOUNT );
if( cryptStatusError( status ) )
return( FALSE );
#endif /* USE_CERTIFICATES */
return( TRUE );
}
int testKernel( void )
{
ENSURES( testGeneralAlgorithms() );
ENSURES( testKernelMechanisms() );
return( CRYPT_OK );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -