我在使用 cryptoki 库编写一个小测试程序时遇到了一些问题。我想(必须)掌握 RSA 私钥(所有参数)。我考虑过要么生成密钥然后提取参数,要么使用已经生成的参数手动设置密钥。到目前为止,我没有得到任何工作。代码在文章末尾。
萃取
我知道有C_GetAttributeValue()可以用来提取公共指数或模数等属性。这适用于公钥和私钥对象,但是当我尝试从私钥对象中提取私有参数时出现CKR_ATTRIBUTE_SENSITIVE错误。有没有办法提取这些属性?登录会话或初始化期间可以/是否必须设置某些参数?
手动设置密钥
我的第二种方法是从文件中读取密钥材料(使用 OPENSSL 生成),并使用它通过C_CreateObject()生成密钥对象。该文件包含所有 RSA 参数 (n,e,d,p,q,dmp1,dmq1,iqmp)。阅读后,我将它们从 ASCII 转换为十六进制表示并将它们存储在CK_BYTE[]中。到目前为止,一切都很好。现在,当我将所有这些传递给C_CreateObject()以创建私钥时,我会收到CKR_ATTRIBUTE_VALUE_INVALID错误消息。使用公共参数创建公共密钥对象的方法相同。我验证了在创建的公钥对象上使用C_GetAttributeValue() 。如果以这种方式甚至可以生成私钥对象,我还缺少什么?我想无论是否提供密钥材料,C_GenerateKeyPair()总是会生成新的密钥,对吧?
C代码
这就是我尝试使用以下方法创建私钥对象的方法:
CK_OBJECT_HANDLE hPrivateKeys[NUMKEYS];
CK_KEY_TYPE kType= CKK_RSA;
CK_OBJECT_CLASS kClass = CKO_PRIVATE_KEY;
CK_BYTE id[] = {123};
CK_UTF8CHAR label[] = "An RSA private key object";
// sn,sd,se, etc contain the length of the respective parameter
CK_ATTRIBUTE privateKeyTemplate[] = {
{CKA_CLASS, &kClass, sizeof(kClass)},
{CKA_KEY_TYPE, &kType, sizeof(kType)},
{CKA_TOKEN, &false, sizeof(false)},
{CKA_PRIVATE, &false, sizeof(false)},
{CKA_SENSITIVE, &false, sizeof(false)},
{CKA_EXTRACTABLE, &true, sizeof(true)},
{CKA_ID, id, sizeof(id)},
{CKA_SUBJECT, NULL_PTR, 0},
{CKA_DECRYPT, &true, sizeof(true)},
{CKA_SIGN, &true, sizeof(true)},
{CKA_LABEL, label, sizeof(label)-1},
{CKA_ID, id, sizeof(id)},
{CKA_MODULUS, modulus, sn},
{CKA_PUBLIC_EXPONENT, publicExponent, se},
{CKA_PRIVATE_EXPONENT, privateExponent, sd},
{CKA_PRIME_1, prime1, sp},
{CKA_PRIME_2, prime2, sq},
{CKA_EXPONENT_1, exponent1, sdmp1},
{CKA_EXPONENT_2, exponent2, sdmq1},
{CKA_COEFFICIENT, coefficient, siqmp}
};
CK_ATTRIBUTE publicKeyTemplate[] = {
{CKA_ENCRYPT, &true, sizeof(true)},
{CKA_VERIFY, &true, sizeof(true)},
{CKA_WRAP, &true, sizeof(true)},
{CKA_MODULUS_BITS, &modulusBits, sizeof(modulusBits)},
{CKA_PUBLIC_EXPONENT, publicExponent, se},
{CKA_MODULUS, modulus, sn}
};
rv = pFunctionList->C_CreateObject(hSession, privateKeyTemplate, NUM_ELEM(privateKeyTemplate), &hPrivateKeys[j]);