69,371
社区成员
发帖
与我相关
我的任务
分享
/*RSA密钥对生*/ ret = GM_SDF_GenerateKeyPair_RSA(hSessionHandle,*pbits, &ucPublicKey, &ucPrivateKey); if(0!=ret) return ret;
我把这里的hSessionHandle 换成了 (void *)hSession
然后把上面强制类型转换去掉了 也是那样
你说的感觉不太可能 我也感觉不可能啊 怎么会出现这样的问题 但是你看我截的第一张图 确实就是这样的情况 。。。。
CK_RV C_GenerateKeyPair ( CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism,
CK_ATTRIBUTE_PTR pPublicKeyTemplate,
CK_ULONG ulPublicKeyAttributeCount,
CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
CK_ULONG ulPrivateKeyAttributeCount,
CK_OBJECT_HANDLE_PTR phPublicKey,
CK_OBJECT_HANDLE_PTR phPrivateKey
)
{
CK_RV ret=0;
CK_ULONG i=0;
CK_MECHANISM Mec;
CK_ULONG_PTR pbits=NULL;
CK_ULONG_PTR ppubclass=NULL;
CK_ULONG_PTR ppubtype=NULL;
CK_ULONG_PTR ppritype=NULL;
CK_ULONG_PTR ppriclass=NULL;
void * hSessionHandle = (void *)hSession;
if(NULL==pMechanism)
{
return CKR_MECHANISM_INVALID;
}
Mec=*pMechanism;
if((NULL==pPublicKeyTemplate)||(NULL==pPrivateKeyTemplate)||(ulPublicKeyAttributeCount<1)||(ulPrivateKeyAttributeCount<1))
{
return CKR_TEMPLATE_INCOMPLETE;
}
for(i=0;i<ulPublicKeyAttributeCount;i++)
{
if(pPublicKeyTemplate[i].type==CKA_CLASS)
{
ppubclass=(CK_ULONG_PTR)(pPublicKeyTemplate[i].pValue);
}
if(pPublicKeyTemplate[i].type==CKA_KEY_TYPE)
{
ppubtype=(CK_ULONG_PTR)(pPublicKeyTemplate[i].pValue);
}
if(pPublicKeyTemplate[i].type==CKA_MODULUS_BITS)
{
pbits=(CK_ULONG_PTR)(pPublicKeyTemplate[i].pValue);
}
}
for(i=0;i<ulPrivateKeyAttributeCount;i++)
{
if(pPrivateKeyTemplate[i].type==CKA_CLASS)
{
ppriclass=(CK_ULONG_PTR)(pPrivateKeyTemplate[i].pValue);
}
if(pPrivateKeyTemplate[i].type==CKA_KEY_TYPE)
{
ppritype=(CK_ULONG_PTR)(pPrivateKeyTemplate[i].pValue);
}
}
/*入参检测*/
if(CKM_RSA_PKCS_KEY_PAIR_GEN==(Mec.mechanism))
{
if((NULL == ppubclass))
return CKR_TEMPLATE_INCOMPLETE;
if((CKO_PUBLIC_KEY != (*ppubclass)) && (NULL != ppubclass))
return CKR_TEMPLATE_INCONSISTENT;
if((CKO_PRIVATE_KEY != (*ppriclass)) && (NULL != ppriclass))
return CKR_TEMPLATE_INCONSISTENT;
if(NULL != ppubtype)
{
if(CKK_RSA != (*ppubtype))
return CKR_TEMPLATE_INCONSISTENT;
}
if(NULL != ppritype)
{
if(CKK_RSA != (*ppritype))
return CKR_TEMPLATE_INCONSISTENT;
}
if(NULL == pbits)
return CKR_TEMPLATE_INCOMPLETE;
if(1024 != (*pbits)||2048 != (*pbits))
return CKR_TEMPLATE_INCONSISTENT;
}
else
{
return CKR_MECHANISM_INVALID;
}
/*密钥对生成*/
if(CKM_RSA_PKCS_KEY_PAIR_GEN == Mec.mechanism) //RSA密钥对生成
{
RSArefPublicKey ucPublicKey;
RSArefPrivateKey ucPrivateKey;
A_PBASICATTRIBUTES paSt;
B_PKEYATTRIBUTES pbSt;
C_PRSAPUBKEY pcStPub;
C_PRSAPRIKEY pcStPri;
/*RSA密钥对生*/
ret = GM_SDF_GenerateKeyPair_RSA(hSessionHandle,*pbits, &ucPublicKey, &ucPrivateKey);
if(0!=ret)
return ret;
/*将国密公钥与P11结构体串相匹配*/
paSt = (A_PBASICATTRIBUTES)calloc(1,sizeof(A_BASICATTRIBUTES));
paSt->ulClass = CKO_PUBLIC_KEY;
pbSt=(B_PKEYATTRIBUTES)calloc(1,sizeof(B_KEYATTRIBUTES));
pbSt->bLocal = FALSE;
pbSt->ulType = CKK_RSA;
pcStPub = (C_PRSAPUBKEY)calloc(1,sizeof(C_RSAPUBKEY));
pcStPub->bEnctrue = TRUE;
pcStPub->bVerctrue = TRUE;
pcStPub->ulModulusbits = ucPublicKey.bits;
memcpy(pcStPub->byPublicExponent,ucPublicKey.e,MAX_PUBLIC_EXPONENT_LEN);
memcpy(pcStPub->byModulus,ucPublicKey.m,MAX_MODULUS_LEN);
pbSt->pSt = pcStPub;
paSt->pSt = pbSt;
*phPublicKey = (CK_OBJECT_HANDLE)paSt;
/*将国密私钥与P11结构体串相匹配*/
paSt = (A_PBASICATTRIBUTES)calloc(1,sizeof(A_BASICATTRIBUTES));
paSt->ulClass = CKO_PRIVATE_KEY;
pbSt = (B_PKEYATTRIBUTES)calloc(1,sizeof(B_KEYATTRIBUTES));
pbSt->bLocal=FALSE;
pbSt->ulType=CKK_RSA;
pcStPri = (C_PRSAPRIKEY)calloc(1,sizeof(C_RSAPRIKEY));
pcStPri->bDectrue = TRUE;
pcStPri->bSigtrue = TRUE;
pcStPri->ulModulusbits = ucPrivateKey.bits;
memcpy(pcStPri->byPublicExponent,ucPrivateKey.e,MAX_PUBLIC_EXPONENT_LEN);
memcpy(pcStPri->byModulus,ucPrivateKey.m,MAX_MODULUS_LEN);
memcpy(pcStPri->byPrivateExponent,ucPrivateKey.d,MAX_PRIVATE_EXPONENT_LEN);
memcpy(pcStPri->byCoefficient,ucPrivateKey.coef,MAX_COEFFOCOEMT_LEN);
memcpy(pcStPri->bPrime1,ucPrivateKey.prime[0],MAX_PRIME_LEN);
memcpy(pcStPri->bPrime2,ucPrivateKey.prime[1],MAX_PRIME_LEN);
memcpy(pcStPri->byExponent1,ucPrivateKey.pexp[0],MAX_EXPONENT_LEN);
memcpy(pcStPri->byExponent2,ucPrivateKey.pexp[1],MAX_EXPONENT_LEN);
pbSt->pSt = pcStPri;
paSt->pSt = pbSt;
*phPrivateKey = (CK_OBJECT_HANDLE)paSt;
}
else
{
return CKR_TEMPLATE_INCONSISTENT;
}
return CKR_OK;
}