📄 testlib.c
字号:
#endif /* Systems with threading support */
/****************************************************************************
* *
* Utility Routines *
* *
****************************************************************************/
/* Set the label for a device object */
static BOOLEAN setLabel( const CRYPT_CONTEXT cryptContext, const char *label )
{
if( cryptSetAttributeString( cryptContext, CRYPT_CTXINFO_LABEL,
label, strlen( label ) ) == CRYPT_ERROR_DUPLICATE )
{
printf( "A key object with the label '%s' already exists inside the\n"
"device. To perform this test, you need to delete the "
"existing object so\nthat cryptlib can create a new one.\n",
label );
return( FALSE );
}
return( TRUE );
}
/* Load RSA, DSA, and Elgamal PKC encrytion contexts */
static int loadRSAPublicKey( const CRYPT_DEVICE cryptDevice,
CRYPT_CONTEXT *cryptContext,
const char *cryptContextLabel,
CRYPT_PKCINFO_RSA *rsaKey,
const BOOLEAN isDevice,
const BOOLEAN useLargeKey )
{
const RSA_KEY *rsaKeyTemplate = useLargeKey ? \
&rsa1024TestKey : &rsa512TestKey;
int status;
if( isDevice )
status = cryptDeviceCreateContext( cryptDevice, cryptContext,
CRYPT_ALGO_RSA );
else
status = cryptCreateContext( cryptContext, CRYPT_UNUSED,
CRYPT_ALGO_RSA );
if( cryptStatusError( status ) )
{
printf( "crypt%sCreateContext() failed with error code %d.\n",
isDevice ? "Device" : "", status );
return( status );
}
if( !setLabel( *cryptContext, cryptContextLabel ) )
{
cryptDestroyContext( *cryptContext );
return( status );
}
cryptInitComponents( rsaKey, CRYPT_KEYTYPE_PUBLIC );
cryptSetComponent( rsaKey->n, rsaKeyTemplate->n, rsaKeyTemplate->nLen );
cryptSetComponent( rsaKey->e, rsaKeyTemplate->e, rsaKeyTemplate->eLen );
status = cryptSetAttributeString( *cryptContext,
CRYPT_CTXINFO_KEY_COMPONENTS, rsaKey,
sizeof( CRYPT_PKCINFO_RSA ) );
cryptDestroyComponents( rsaKey );
if( cryptStatusError( status ) )
cryptDestroyContext( *cryptContext );
return( status );
}
BOOLEAN loadRSAContextsEx( const CRYPT_DEVICE cryptDevice,
CRYPT_CONTEXT *cryptContext,
CRYPT_CONTEXT *decryptContext,
const char *cryptContextLabel,
const char *decryptContextLabel )
{
CRYPT_PKCINFO_RSA *rsaKey;
const RSA_KEY *rsaKeyTemplate = &rsa512TestKey;
const BOOLEAN isDevice = ( cryptDevice != CRYPT_UNUSED ) ? TRUE : FALSE;
BOOLEAN useLargeKey = FALSE;
int status;
/* Allocate room for the public-key components */
if( ( rsaKey = ( CRYPT_PKCINFO_RSA * ) malloc( sizeof( CRYPT_PKCINFO_RSA ) ) ) == NULL )
return( CRYPT_ERROR_MEMORY );
/* Some devices only support a single key size which isn't the same as
the built-in one so we adjust the key size being used if necessary */
if( isDevice )
{
CRYPT_QUERY_INFO cryptQueryInfo;
status = cryptDeviceQueryCapability( cryptDevice, CRYPT_ALGO_RSA,
&cryptQueryInfo );
if( cryptStatusError( status ) )
return( FALSE );
if( cryptQueryInfo.keySize != 64 )
{
if( cryptQueryInfo.keySize != 128 )
{
printf( "Device requires a %d-bit key which doesn't "
"correspond to any built-in\ncryptlib key.\n",
cryptQueryInfo.keySize );
return( FALSE );
}
rsaKeyTemplate = &rsa1024TestKey;
useLargeKey = TRUE;
}
}
/* Create the encryption context */
if( cryptContext != NULL )
{
status = loadRSAPublicKey( cryptDevice, cryptContext,
cryptContextLabel, rsaKey, isDevice,
useLargeKey );
if( status == CRYPT_ERROR_NOTAVAIL && isDevice )
{
/* The device doesn't support public-key ops, use a native
context for the public key */
puts( " Warning: Device doesn't support public-key operations, "
"using a cryptlib\n native context instead." );
status = loadRSAPublicKey( CRYPT_UNUSED, cryptContext,
cryptContextLabel, rsaKey, FALSE,
useLargeKey );
}
if( cryptStatusError( status ) )
{
free( rsaKey );
printf( "Key load failed with error code %d.\n", status );
return( FALSE );
}
if( decryptContext == NULL )
{
/* We're only using a public-key context, return */
free( rsaKey );
return( TRUE );
}
}
/* Create the decryption context */
if( isDevice )
status = cryptDeviceCreateContext( cryptDevice, decryptContext,
CRYPT_ALGO_RSA );
else
status = cryptCreateContext( decryptContext, CRYPT_UNUSED,
CRYPT_ALGO_RSA );
if( cryptStatusError( status ) )
{
free( rsaKey );
if( cryptContext != NULL )
{
cryptDestroyContext( *cryptContext );
if( isDevice )
cryptDeleteKey( cryptDevice, CRYPT_KEYID_NAME,
cryptContextLabel );
}
printf( "crypt%sCreateContext() failed with error code %d.\n",
isDevice ? "Device" : "", status );
return( FALSE );
}
if( !setLabel( *decryptContext, decryptContextLabel ) )
{
free( rsaKey );
cryptDestroyContext( *decryptContext );
if( cryptContext != NULL )
{
cryptDestroyContext( *cryptContext );
if( isDevice )
cryptDeleteKey( cryptDevice, CRYPT_KEYID_NAME,
cryptContextLabel );
}
return( FALSE );
}
cryptInitComponents( rsaKey, CRYPT_KEYTYPE_PRIVATE );
cryptSetComponent( rsaKey->n, rsaKeyTemplate->n, rsaKeyTemplate->nLen );
cryptSetComponent( rsaKey->e, rsaKeyTemplate->e, rsaKeyTemplate->eLen );
cryptSetComponent( rsaKey->d, rsaKeyTemplate->d, rsaKeyTemplate->dLen );
cryptSetComponent( rsaKey->p, rsaKeyTemplate->p, rsaKeyTemplate->pLen );
cryptSetComponent( rsaKey->q, rsaKeyTemplate->q, rsaKeyTemplate->qLen );
cryptSetComponent( rsaKey->u, rsaKeyTemplate->u, rsaKeyTemplate->uLen );
cryptSetComponent( rsaKey->e1, rsaKeyTemplate->e1, rsaKeyTemplate->e1Len );
cryptSetComponent( rsaKey->e2, rsaKeyTemplate->e2, rsaKeyTemplate->e2Len );
status = cryptSetAttributeString( *decryptContext,
CRYPT_CTXINFO_KEY_COMPONENTS, rsaKey,
sizeof( CRYPT_PKCINFO_RSA ) );
cryptDestroyComponents( rsaKey );
free( rsaKey );
if( cryptStatusError( status ) )
{
if( cryptContext != NULL )
{
cryptDestroyContext( *cryptContext );
if( isDevice )
cryptDeleteKey( cryptDevice, CRYPT_KEYID_NAME,
cryptContextLabel );
}
cryptDestroyContext( *decryptContext );
if( isDevice )
cryptDeleteKey( cryptDevice, CRYPT_KEYID_NAME,
decryptContextLabel );
printf( "Key load failed with error code %d.\n", status );
return( FALSE );
}
return( TRUE );
}
BOOLEAN loadRSAContexts( const CRYPT_DEVICE cryptDevice,
CRYPT_CONTEXT *cryptContext,
CRYPT_CONTEXT *decryptContext )
{
return( loadRSAContextsEx( cryptDevice, cryptContext, decryptContext,
RSA_PUBKEY_LABEL, RSA_PRIVKEY_LABEL ) );
}
BOOLEAN loadDSAContextsEx( const CRYPT_DEVICE cryptDevice,
CRYPT_CONTEXT *signContext,
CRYPT_CONTEXT *sigCheckContext,
const char *signContextLabel,
const char *sigCheckContextLabel )
{
CRYPT_PKCINFO_DLP *dsaKey;
const BOOLEAN isDevice = ( cryptDevice != CRYPT_UNUSED ) ? TRUE : FALSE;
int status;
/* Allocate room for the public-key components */
if( ( dsaKey = ( CRYPT_PKCINFO_DLP * ) malloc( sizeof( CRYPT_PKCINFO_DLP ) ) ) == NULL )
return( CRYPT_ERROR_MEMORY );
/* Create the encryption context */
if( signContext != NULL )
{
if( isDevice )
status = cryptDeviceCreateContext( cryptDevice, signContext,
CRYPT_ALGO_DSA );
else
status = cryptCreateContext( signContext, CRYPT_UNUSED,
CRYPT_ALGO_DSA );
if( cryptStatusError( status ) )
{
free( dsaKey );
printf( "cryptCreateContext() failed with error code %d.\n",
status );
return( FALSE );
}
if( !setLabel( *signContext, signContextLabel ) )
{
free( dsaKey );
cryptDestroyContext( *signContext );
return( FALSE );
}
cryptInitComponents( dsaKey, CRYPT_KEYTYPE_PRIVATE );
cryptSetComponent( dsaKey->p, dlpTestKey.p, dlpTestKey.pLen );
cryptSetComponent( dsaKey->q, dlpTestKey.q, dlpTestKey.qLen );
cryptSetComponent( dsaKey->g, dlpTestKey.g, dlpTestKey.gLen );
cryptSetComponent( dsaKey->x, dlpTestKey.x, dlpTestKey.xLen );
cryptSetComponent( dsaKey->y, dlpTestKey.y, dlpTestKey.yLen );
status = cryptSetAttributeString( *signContext,
CRYPT_CTXINFO_KEY_COMPONENTS, dsaKey,
sizeof( CRYPT_PKCINFO_DLP ) );
cryptDestroyComponents( dsaKey );
if( cryptStatusError( status ) )
{
free( dsaKey );
cryptDestroyContext( *signContext );
printf( "Key load failed with error code %d.\n", status );
return( FALSE );
}
if( sigCheckContext == NULL )
{
free( dsaKey );
return( TRUE );
}
}
/* Create the decryption context */
if( isDevice )
status = cryptDeviceCreateContext( cryptDevice, sigCheckContext,
CRYPT_ALGO_DSA );
else
status = cryptCreateContext( sigCheckContext, CRYPT_UNUSED,
CRYPT_ALGO_DSA );
if( cryptStatusError( status ) )
{
free( dsaKey );
if( signContext != NULL )
{
cryptDestroyContext( *signContext );
if( isDevice )
cryptDeleteKey( cryptDevice, CRYPT_KEYID_NAME,
signContextLabel );
}
printf( "cryptCreateContext() failed with error code %d.\n", status );
return( FALSE );
}
if( !setLabel( *sigCheckContext, sigCheckContextLabel ) )
{
if( signContext != NULL )
{
cryptDestroyContext( *signContext );
if( isDevice )
cryptDeleteKey( cryptDevice, CRYPT_KEYID_NAME,
signContextLabel );
}
cryptDestroyContext( *sigCheckContext );
return( FALSE );
}
cryptInitComponents( dsaKey, CRYPT_KEYTYPE_PUBLIC );
cryptSetComponent( dsaKey->p, dlpTestKey.p, dlpTestKey.pLen );
cryptSetComponent( dsaKey->q, dlpTestKey.q, dlpTestKey.qLen );
cryptSetComponent( dsaKey->g, dlpTestKey.g, dlpTestKey.gLen );
cryptSetComponent( dsaKey->y, dlpTestKey.y, dlpTestKey.yLen );
status = cryptSetAttributeString( *sigCheckContext,
CRYPT_CTXINFO_KEY_COMPONENTS, dsaKey,
sizeof( CRYPT_PKCINFO_DLP ) );
cryptDestroyComponents( dsaKey );
free( dsaKey );
if( cryptStatusError( status ) )
{
if( signContext != NULL )
{
cryptDestroyContext( *signContext );
if( isDevice )
cryptDeleteKey( cryptDevice, CRYPT_KEYID_NAME,
signContextLabel );
}
cryptDestroyContext( *sigCheckContext );
if( isDevice )
cryptDeleteKey( cryptDevice, CRYPT_KEYID_NAME,
sigCheckContextLabel );
printf( "Key load failed with error code %d.\n", status );
return( FALSE );
}
return( TRUE );
}
BOOLEAN loadDSAContexts( const CRYPT_DEVICE cryptDevice,
CRYPT_CONTEXT *signContext,
CRYPT_CONTEXT *sigCheckContext )
{
return( loadDSAContextsEx( cryptDevice, signContext, sigCheckContext,
DSA_PRIVKEY_LABEL, DSA_PUBKEY_LABEL ) );
}
BOOLEAN loadElgamalContexts( CRYPT_CONTEXT *cryptContext,
CRYPT_CONTEXT *decryptContext )
{
CRYPT_PKCINFO_DLP *elgamalKey;
int status;
/* Allocate room for the public-key components */
if( ( elgamalKey = ( CRYPT_PKCINFO_DLP * ) malloc( sizeof( CRYPT_PKCINFO_DLP ) ) ) == NULL )
return( CRYPT_ERROR_MEMORY );
/* Create the encryption context */
if( cryptContext != NULL )
{
status = cryptCreateContext( cryptContext, CRYPT_UNUSED,
CRYPT_ALGO_ELGAMAL );
if( cryptStatusError( status ) )
{
free( elgamalKey );
printf( "cryptCreateContext() failed with error code %d.\n", status );
return( FALSE );
}
if( !setLabel( *cryptContext, ELGAMAL_PUBKEY_LABEL ) )
{
free( elgamalKey );
cryptDestroyContext( *cryptContext );
return( FALSE );
}
cryptInitComponents( elgamalKey, CRYPT_KEYTYPE_PUBLIC );
cryptSetComponent( elgamalKey->p, dlpTestKey.p, dlpTestKey.pLen );
cryptSetComponent( elgamalKey->g, dlpTestKey.g, dlpTestKey.gLen );
cryptSetComponent( elgamalKey->q, dlpTestKey.q, dlpTestKey.qLen );
cryptSetComponent( elgamalKey->y, dlpTestKey.y, dlpTestKey.yLen );
status = cryptSetAttributeString( *cryptContext,
CRYPT_CTXINFO_KEY_COMPONENTS, elgamalKey,
sizeof( CRYPT_PKCINFO_DLP ) );
cryptDestroyComponents( elgamalKey );
if( cryptStatusError( status ) )
{
free( elgamalKey );
cryptDestroyContext( *cryptContext );
printf( "Key load failed with error code %d.\n", status );
return( FALSE );
}
if( decryptContext == NULL )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -