我正在研究遵循PKCS#11标准的图书馆。
https://www.cryptsoft.com/pkcs11doc/v220/
库可以通过函数C_GenerateKeyPair在令牌中生成RSA Keypair,并返回带有返回值CKR_OK的相应对象句柄。
令牌(applet)不支持加载私钥/公钥,除了生成密钥对。 使用C_CreateObject创建RSA私钥/公钥的适当返回值是什么?
现在我要回CKR_GENERAL_ERROR了,可以吗?
允许的返回值为
CKR_ARGUMENTS_BAD,CKR_ATTRIBUTE_READ_ONLY, CKR_ATTRIBUTE_TYPE_INVALID,CKR_ATTRIBUTE_VALUE_INVALID, CKR_CRYPTOKI_NOT_INITIALIZED,CKR_DEVICE_ERROR,CKR_DEVICE_MEMORY, CKR_DEVICE_REMOVED,CKR_DOMAIN_PARAMS_INVALID,CKR_FUNCTION_FAILED, CKR_GENERAL_ERROR,CKR_HOST_MEMORY,CKR_OK,CKR_PIN_EXPIRED, CKR_SESSION_CLOSED,CKR_SESSION_HANDLE_INVALID,CKR_SESSION_READ_ONLY, CKR_TEMPLATE_INCOMPLETE,CKR_TEMPLATE_INCONSISTENT, CKR_TOKEN_WRITE_PROTECTED,CKR_USER_NOT_LOGGED_IN。
感谢您的帮助
更新
我有两种类型的applet,一种支持RSA私钥/公钥加载到令牌而另一种不支持。它只能识别令牌是否支持密钥加载是否是发送的APDU的响应。所以我不能只决定检查C_CreateObject的类属性。
答案 0 :(得分:0)
如果您的图书馆根本不支持C_CreateObject
,则最佳选择IMO为CKR_FUNCTION_NOT_SUPPORTED
。
PKCS#11 v2.20州的第11章:
Cryptoki库不需要支持Cryptoki API中的每个函数。但是,即使是不受支持的功能也必须具有" stub"在库中只返回值
CKR_FUNCTION_NOT_SUPPORTED
。
如果您的库支持C_CreateObject
创建其他对象类型(例如证书,数据对象等),则最佳选择IMO为CKR_ATTRIBUTE_VALUE_INVALID
。
在PKCS#11 v2.20州的第10.1.1章:
如果提供的模板为有效属性指定了无效值,则尝试将失败,并显示错误代码
CKR_ATTRIBUTE_VALUE_INVALID
。
现在您已在评论中分享了有关库的更多详细信息,我可以添加更详细的说明:
我似乎可以使用包含C_CreateObject
的模板调用您的CKA_CLASS=CKO_CERTIFICATE
实现,它将在此特定令牌上创建证书对象并返回CKR_OK
。如果我使用包含CKA_CLASS=CKO_PRIVATE_KEY
的模板调用它,那么您的代码将决定在评估此属性的提供值后立即返回错误。 IMO毫无疑问,PKCS#11 v2.20的第10.1.1章建议您在这种情况下返回CKR_ATTRIBUTE_VALUE_INVALID
。
但是,如果不愿意遵循规范建议的行为并且没有您喜欢的预定义错误代码,您可以引入自己的供应商定义代码(有关详细信息,请参阅my older answer):
#define CKR_TOKEN_OPERATION_NOT_SUPPORTED (CKR_VENDOR_DEFINED|0x0000001)
无论您返回的错误代码如何,对于没有经验的开发人员来说,IMO的混淆程度都是相同的。最后,他/她需要查阅您的图书馆制作的文档或日志,以找出他/她收到错误的真正原因。