📄 cryptcfg.c
字号:
return( CRYPT_ERROR_TIMEOUT );
optionInfoPtr->intValue = CRYPT_ERROR;
return( OK_SPECIAL );
}
/* Set the value and remember that the config options have been changed */
if( fixedOptionInfoPtr->type == OPTION_BOOLEAN )
/* Turn a generic zero/nonzero boolean into TRUE or FALSE */
optionInfoPtr->intValue = ( value ) ? TRUE : FALSE;
else
optionInfoPtr->intValue = value;
optionInfoPtr->dirty = TRUE;
optionList[ CRYPT_OPTION_CONFIGCHANGED - \
CRYPT_OPTION_FIRST ].intValue = TRUE;
return( CRYPT_OK );
}
int setOptionString( OPTION_INFO *optionList,
const CRYPT_ATTRIBUTE_TYPE option, const char *value,
const int valueLength )
{
const FIXED_OPTION_INFO *fixedOptionInfoPtr;
OPTION_INFO *optionInfoPtr;
char *valuePtr;
/* Get a pointer to the option information and make sure that everything
is OK */
assert( option > CRYPT_OPTION_FIRST && option < CRYPT_OPTION_LAST );
optionInfoPtr = &optionList[ option - CRYPT_OPTION_FIRST ];
fixedOptionInfoPtr = &fixedOptionInfo[ option - CRYPT_OPTION_FIRST ];
assert( fixedOptionInfoPtr->type == OPTION_STRING );
/* If there's no value given, we're deleting the option rather than
setting it. These options don't have default values so we check for
a setting of NULL rather than equivalence to a default string value */
if( value == NULL )
{
assert( fixedOptionInfoPtr->strDefault == NULL );
if( optionInfoPtr->strValue == NULL )
return( CRYPT_ERROR_NOTFOUND );
zeroise( optionInfoPtr->strValue, strlen( optionInfoPtr->strValue ) );
clFree( "setOptionString", optionInfoPtr->strValue );
optionInfoPtr->strValue = NULL;
optionInfoPtr->dirty = TRUE;
optionList[ CRYPT_OPTION_CONFIGCHANGED - \
CRYPT_OPTION_FIRST ].intValue = TRUE;
return( CRYPT_OK );
}
assert( value != NULL && valueLength > 0 );
/* If the value is the same as the current one, there's nothing to do */
if( optionInfoPtr->strValue != NULL && \
strlen( optionInfoPtr->strValue ) == valueLength && \
!memcmp( optionInfoPtr->strValue, value, valueLength ) )
return( CRYPT_OK );
/* If we're resetting a value to its default setting, just reset the
string pointers rather than storing the value */
if( fixedOptionInfoPtr->strDefault != NULL && \
strlen( fixedOptionInfoPtr->strDefault ) == valueLength && \
!memcmp( fixedOptionInfoPtr->strDefault, value, valueLength ) )
{
if( optionInfoPtr->strValue != fixedOptionInfoPtr->strDefault )
{
zeroise( optionInfoPtr->strValue,
strlen( optionInfoPtr->strValue ) );
clFree( "setOptionString", optionInfoPtr->strValue );
}
optionInfoPtr->strValue = ( char * ) fixedOptionInfoPtr->strDefault;
optionInfoPtr->dirty = TRUE;
optionList[ CRYPT_OPTION_CONFIGCHANGED - \
CRYPT_OPTION_FIRST ].intValue = TRUE;
return( CRYPT_OK );
}
/* Try and allocate room for the new option */
if( ( valuePtr = clAlloc( "setOptionString", valueLength + 1 ) ) == NULL )
return( CRYPT_ERROR_MEMORY );
memcpy( valuePtr, value, valueLength );
valuePtr[ valueLength ] = '\0';
/* If the string value that's currently set isn't the default setting,
clear and free it */
if( optionInfoPtr->strValue != fixedOptionInfoPtr->strDefault )
{
zeroise( optionInfoPtr->strValue, strlen( optionInfoPtr->strValue ) );
clFree( "setOptionString", optionInfoPtr->strValue );
}
/* Set the value and remember that the config options have been changed */
optionInfoPtr->strValue = valuePtr;
optionInfoPtr->dirty = TRUE;
optionList[ CRYPT_OPTION_CONFIGCHANGED - \
CRYPT_OPTION_FIRST ].intValue = TRUE;
return( CRYPT_OK );
}
/* Query the value of a numeric or string option */
int getOption( OPTION_INFO *optionList, const CRYPT_ATTRIBUTE_TYPE option )
{
assert( option > CRYPT_OPTION_FIRST && option < CRYPT_OPTION_LAST );
assert( fixedOptionInfo[ option - \
CRYPT_OPTION_FIRST ].type == OPTION_NUMERIC || \
fixedOptionInfo[ option - \
CRYPT_OPTION_FIRST ].type == OPTION_BOOLEAN );
return( optionList[ option - CRYPT_OPTION_FIRST ].intValue );
}
char *getOptionString( OPTION_INFO *optionList,
const CRYPT_ATTRIBUTE_TYPE option )
{
assert( option > CRYPT_OPTION_FIRST && option < CRYPT_OPTION_LAST );
assert( fixedOptionInfo[ option - \
CRYPT_OPTION_FIRST ].type == OPTION_STRING );
return( optionList[ option - CRYPT_OPTION_FIRST ].strValue );
}
/* Initialise/shut down the config option handling */
int initOptions( OPTION_INFO **optionListPtr )
{
OPTION_INFO *optionList;
int i;
/* Perform a consistency check on the options */
FORALL( i, 1, CRYPT_OPTION_LAST - CRYPT_OPTION_FIRST,
fixedOptionInfo[ i ].option == i + CRYPT_OPTION_FIRST );
/* Allocate storage for the variable config data */
if( ( optionList = clAlloc( "initOptions", OPTION_INFO_SIZE ) ) == NULL )
return( CRYPT_ERROR_MEMORY );
memset( optionList, 0, OPTION_INFO_SIZE );
/* Walk through the config table setting up each option to contain
its default value */
for( i = 1; fixedOptionInfo[ i ].option != CRYPT_ATTRIBUTE_NONE; i++ )
if( fixedOptionInfo[ i ].type == OPTION_STRING )
optionList[ i ].strValue = \
( char * ) fixedOptionInfo[ i ].strDefault;
else
optionList[ i ].intValue = fixedOptionInfo[ i ].intDefault;
*optionListPtr = optionList;
return( CRYPT_OK );
}
void endOptions( OPTION_INFO *optionList )
{
int i;
/* Walk through the config table clearing and freeing each option */
for( i = 1; fixedOptionInfo[ i ].option != CRYPT_ATTRIBUTE_NONE; i++ )
{
const FIXED_OPTION_INFO *fixedOptionInfoPtr = &fixedOptionInfo[ i ];
OPTION_INFO *optionInfoPtr = &optionList[ i ];
if( fixedOptionInfoPtr->type == OPTION_STRING )
{
/* If the string value that's currently set isn't the default
setting, clear and free it */
if( optionInfoPtr->strValue != fixedOptionInfoPtr->strDefault )
{
zeroise( optionInfoPtr->strValue,
strlen( optionInfoPtr->strValue ) );
clFree( "endOptions", optionInfoPtr->strValue );
}
}
}
/* Clear and free the config table */
memset( optionList, 0, OPTION_INFO_SIZE );
clFree( "endOptions", optionList );
}
/****************************************************************************
* *
* Read and Write the Config Options *
* *
****************************************************************************/
/* Read any user-defined configuration options. Since the config file is an
untrusted source, we set the values in it via external messages rather than
manipulating the config info directly, which means that everything read is
subject to the usual ACL checks */
static int readTrustedCerts( const CRYPT_KEYSET iCryptKeyset,
void *trustInfoPtr )
{
RESOURCE_DATA msgData;
BYTE buffer[ CRYPT_MAX_PKCSIZE + 1536 ];
int status;
/* Read each trusted cert from the keyset */
setMessageData( &msgData, buffer, CRYPT_MAX_PKCSIZE + 1536 );
status = krnlSendMessage( iCryptKeyset, IMESSAGE_GETATTRIBUTE_S,
&msgData, CRYPT_IATTRIBUTE_TRUSTEDCERT );
while( cryptStatusOK( status ) )
{
/* Add the cert data as a trusted cert item and look for the next
one */
addTrustEntry( trustInfoPtr, CRYPT_UNUSED, msgData.data,
msgData.length );
setMessageData( &msgData, buffer, CRYPT_MAX_PKCSIZE + 1536 );
status = krnlSendMessage( iCryptKeyset, IMESSAGE_GETATTRIBUTE_S,
&msgData, CRYPT_IATTRIBUTE_TRUSTEDCERT_NEXT );
}
return( ( status == CRYPT_ERROR_NOTFOUND ) ? CRYPT_OK : status );
}
int readConfig( const CRYPT_USER iCryptUser, const char *fileName,
void *trustInfoPtr )
{
CRYPT_KEYSET iCryptKeyset;
MESSAGE_CREATEOBJECT_INFO createInfo;
RESOURCE_DATA msgData;
STREAM stream;
DYNBUF configDB;
char configFilePath[ MAX_PATH_LENGTH + 128 ]; /* Protection for Windows */
int status;
/* Try and open the config file. If we can't open it, it means the that
file doesn't exist, which isn't an error */
fileBuildCryptlibPath( configFilePath, fileName, BUILDPATH_GETPATH );
setMessageCreateObjectInfo( &createInfo, CRYPT_KEYSET_FILE );
createInfo.arg2 = CRYPT_KEYOPT_READONLY;
createInfo.strArg1 = configFilePath;
createInfo.strArgLen1 = strlen( configFilePath );
status = krnlSendMessage( SYSTEM_OBJECT_HANDLE, IMESSAGE_DEV_CREATEOBJECT,
&createInfo, OBJECT_TYPE_KEYSET );
if( cryptStatusError( status ) )
return( CRYPT_OK ); /* No config data present */
iCryptKeyset = createInfo.cryptHandle;
/* Get the config info from the keyset */
status = dynCreate( &configDB, iCryptKeyset,
CRYPT_IATTRIBUTE_CONFIGDATA );
if( status == CRYPT_ERROR_NOTFOUND )
{
/* No config options present, there may still be trusted certs */
status = readTrustedCerts( iCryptKeyset, trustInfoPtr );
krnlSendNotifier( iCryptKeyset, IMESSAGE_DECREFCOUNT );
return( status );
}
if( cryptStatusOK( status ) )
status = readTrustedCerts( iCryptKeyset, trustInfoPtr );
krnlSendNotifier( iCryptKeyset, IMESSAGE_DECREFCOUNT );
if( cryptStatusError( status ) )
{
dynDestroy( &configDB );
return( status );
}
/* Read each config option */
sMemConnect( &stream, dynData( configDB ), dynLength( configDB ) );
while( cryptStatusOK( status ) && \
stell( &stream ) < dynLength( configDB ) )
{
CRYPT_ATTRIBUTE_TYPE attributeType;
long option;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -