如果不支持令牌,C_CreateObject(在PKCS#11中)的返回值是多少?

时间:2018-02-26 13:10:20

标签: pkcs#11

我正在研究遵循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的类属性。

1 个答案:

答案 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的混淆程度都是相同的。最后,他/她需要查阅您的图书馆制作的文档或日志,以找出他/她收到错误的真正原因。