📄 kg_ecc.c
字号:
"\xAA\x87\xCA\x22\xBE\x8B\x05\x37\x8E\xB1\xC7\x1E\xF3\x20\xAD\x74" \
"\x6E\x1D\x3B\x62\x8B\xA7\x9B\x98\x59\xF7\x41\xE0\x82\x54\x2A\x38" \
"\x55\x02\xF2\x5D\xBF\x55\x29\x6C\x3A\x54\x5E\x38\x72\x76\x0A\xB7",
"\x36\x17\xDE\x4A\x96\x26\x2C\x6F\x5D\x9E\x98\xBF\x92\x92\xDC\x29" \
"\xF8\xF4\x1D\xBD\x28\x9A\x14\x7C\xE9\xDA\x31\x13\xB5\xF0\xB8\xC0" \
"\x0A\x60\xB1\xCE\x1D\x7E\x81\x9D\x7A\x43\x1D\x7C\x90\xEA\x0E\x5F",
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC7\x63\x4D\x81\xF4\x37\x2D\xDF" \
"\x58\x1A\x0D\xB2\x48\xB0\xA7\x7A\xEC\xEC\x19\x6A\xCC\xC5\x29\x73" },
/* NIST P521 */
{ ECC_PARAM_P521, 521,
"\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\xFF\xFF",
"\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\xFF\xFC",
"\x00\x51\x95\x3E\xB9\x61\x8E\x1C\x9A\x1F\x92\x9A\x21\xA0\xB6\x85" \
"\x40\xEE\xA2\xDA\x72\x5B\x99\xB3\x15\xF3\xB8\xB4\x89\x91\x8E\xF1" \
"\x09\xE1\x56\x19\x39\x51\xEC\x7E\x93\x7B\x16\x52\xC0\xBD\x3B\xB1" \
"\xBF\x07\x35\x73\xDF\x88\x3D\x2C\x34\xF1\xEF\x45\x1F\xD4\x6B\x50" \
"\x3F\x00",
"\x00\xC6\x85\x8E\x06\xB7\x04\x04\xE9\xCD\x9E\x3E\xCB\x66\x23\x95" \
"\xB4\x42\x9C\x64\x81\x39\x05\x3F\xB5\x21\xF8\x28\xAF\x60\x6B\x4D" \
"\x3D\xBA\xA1\x4B\x5E\x77\xEF\xE7\x59\x28\xFE\x1D\xC1\x27\xA2\xFF" \
"\xA8\xDE\x33\x48\xB3\xC1\x85\x6A\x42\x9B\xF9\x7E\x7E\x31\xC2\xE5" \
"\xBD\x66",
"\x01\x18\x39\x29\x6A\x78\x9A\x3B\xC0\x04\x5C\x8A\x5F\xB4\x2C\x7D" \
"\x1B\xD9\x98\xF5\x44\x49\x57\x9B\x44\x68\x17\xAF\xBD\x17\x27\x3E" \
"\x66\x2C\x97\xEE\x72\x99\x5E\xF4\x26\x40\xC5\x50\xB9\x01\x3F\xAD" \
"\x07\x61\x35\x3C\x70\x86\xA2\x72\xC2\x40\x88\xBE\x94\x76\x9F\xD1" \
"\x66\x50",
"\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" \
"\xFF\xFA\x51\x86\x87\x83\xBF\x2F\x96\x6B\x7F\xCC\x01\x48\xF7\x09" \
"\xA5\xD0\x3B\xB5\xC9\xB8\x89\x9C\x47\xAE\xBB\x6F\xB7\x1E\x91\x38" \
"\x64\x09" },
#endif /* 0 */
{ ECC_PARAM_NONE, 0, NULL, NULL, NULL, NULL, NULL, NULL },
{ ECC_PARAM_NONE, 0, NULL, NULL, NULL, NULL, NULL, NULL }
};
/* Initialise the bignums for the domain parameter values
{ p, a, b, gx, gy, r } */
int loadECCparams( CONTEXT_INFO *contextInfoPtr,
const ECC_PARAM_TYPE eccParamType )
{
PKC_INFO *pkcInfo = contextInfoPtr->ctxPKC;
const ECC_DOMAIN_PARAMS *eccParams;
int curveSize, i, bnStatus = BN_STATUS;
assert( isWritePtr( contextInfoPtr, sizeof( CONTEXT_INFO ) ) );
assert( eccParamType > ECC_PARAM_NONE && eccParamType < ECC_PARAM_LAST );
/* Find the parameter info for this curve */
for( i = 0; i < domainParamTbl[ i ].paramType != ECC_PARAM_NONE && \
i < FAILSAFE_ARRAYSIZE( domainParamTbl, ECC_DOMAIN_PARAMS );
i++ )
{
if( domainParamTbl[ i ].paramType == eccParamType )
break;
}
if( i >= FAILSAFE_ARRAYSIZE( domainParamTbl, ECC_DOMAIN_PARAMS ) )
retIntError();
eccParams = &domainParamTbl[ i ];
curveSize = bitsToBytes( eccParams->curveSizeBits );
/* Load the parameters into the context bignums */
pkcInfo->eccParamType = eccParamType;
CKPTR( BN_bin2bn( eccParams->p, curveSize, &pkcInfo->eccParam_p ) );
CKPTR( BN_bin2bn( eccParams->a, curveSize, &pkcInfo->eccParam_a ) );
CKPTR( BN_bin2bn( eccParams->b, curveSize, &pkcInfo->eccParam_b ) );
CKPTR( BN_bin2bn( eccParams->gx, curveSize, &pkcInfo->eccParam_gx ) );
CKPTR( BN_bin2bn( eccParams->gy, curveSize, &pkcInfo->eccParam_gy ) );
return( getBnStatus( bnStatus ) );
}
/****************************************************************************
* *
* Generate an ECC Key *
* *
****************************************************************************/
/* Generate a generic ECC key */
int generateECCkey( CONTEXT_INFO *contextInfoPtr, const int keyBits )
{
assert( isWritePtr( contextInfoPtr, sizeof( CONTEXT_INFO ) ) );
return( CRYPT_ERROR_NOTAVAIL );
}
/****************************************************************************
* *
* Initialise/Check an ECC Key *
* *
****************************************************************************/
/* Check ECC parameters when loading a key */
int checkECCkey( const CONTEXT_INFO *contextInfoPtr )
{
PKC_INFO *pkcInfo = contextInfoPtr->ctxPKC;
BIGNUM *p = &pkcInfo->eccParam_p;
BIGNUM *a = &pkcInfo->eccParam_a, *b = &pkcInfo->eccParam_b;
BIGNUM *gx = &pkcInfo->eccParam_gx, *gy = &pkcInfo->eccParam_gy;
BIGNUM *qx = &pkcInfo->eccParam_qx, *qy = &pkcInfo->eccParam_qy;
int length;
assert( isReadPtr( contextInfoPtr, sizeof( CONTEXT_INFO ) ) );
/* Make sure that the necessary key parameters have been initialised */
if( BN_is_zero( p ) || BN_is_zero( a ) || BN_is_zero( b ) || \
BN_is_zero( gx ) || BN_is_zero( gy ) || \
BN_is_zero( &pkcInfo->eccParam_r ) )
return( CRYPT_ARGERROR_STR1 );
if( BN_is_zero( qx ) || BN_is_zero( qy ) )
return( CRYPT_ARGERROR_STR1 );
if( !( contextInfoPtr->flags & CONTEXT_ISPUBLICKEY ) && \
BN_is_zero( &pkcInfo->eccParam_d ) )
return( CRYPT_ARGERROR_STR1 );
/* Make sure that the key paramters are valid:
pLen >= MIN_PKCSIZE_ECC, pLen <= CRYPT_MAX_PKCSIZE_ECC
[...] */
length = BN_num_bytes( p );
if( length < MIN_PKCSIZE_ECC || length > CRYPT_MAX_PKCSIZE_ECC )
return( CRYPT_ARGERROR_STR1 );
/* Make sure that the private key value is valid */
if( !( contextInfoPtr->flags & CONTEXT_ISPUBLICKEY ) )
{
}
return( CRYPT_OK );
}
/* Initialise an ECC key */
int initECCkey( CONTEXT_INFO *contextInfoPtr )
{
PKC_INFO *pkcInfo = contextInfoPtr->ctxPKC;
BIGNUM *p = &pkcInfo->eccParam_p, *r = &pkcInfo->eccParam_r;
int xBits, yBits, bnStatus = BN_STATUS;
assert( isWritePtr( contextInfoPtr, sizeof( CONTEXT_INFO ) ) );
/* Evaluate the Montgomery forms */
BN_MONT_CTX_init( &pkcInfo->eccParam_mont_p );
BN_MONT_CTX_init( &pkcInfo->eccParam_mont_r );
CK( BN_MONT_CTX_set( &pkcInfo->eccParam_mont_p, p, pkcInfo->bnCTX ) );
if( bnStatusOK( bnStatus ) )
CK( BN_MONT_CTX_set( &pkcInfo->eccParam_mont_r, r, pkcInfo->bnCTX ) );
/* ECCs are somewhat wierd in that the nominal key size isn't defined by
the prime p but by the magnitude of the point Q on the curve (in fact
p is significantly larger than the Q components), so to get the key
size we have to check the x and y components of Q */
xBits = BN_num_bits( &pkcInfo->eccParam_qx );
yBits = BN_num_bits( &pkcInfo->eccParam_qy );
pkcInfo->keySizeBits = max( xBits, yBits );
if( bnStatusError( bnStatus ) )
return( getBnStatus( bnStatus ) );
return( CRYPT_OK );
}
#endif /* USE_ECC */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -