PKCS#11:C_Decrypt已撤销CKR_OPERATION_NOT_INITIALIZED

时间:2018-10-04 05:43:53

标签: smartcard pkcs#11

我一直在尝试使用智能卡解密文件,但收到奇怪的消息。

我正在使用PKCS11Interop来调用使用pkcs11.h的dll文件中的C_Decrypt 与智能卡进行通信。

这是代码:

public byte[] Decrypt(byte[] encData)
    {
        byte[] decrypt = null;

        using (Session session = _slot.OpenSession(SessionType.ReadOnly))
        using (Mechanism mechanism = new Mechanism(CKM.CKM_RSA_PKCS))
        {
            decrypt = session.Decrypt(mechanism, _privateKeyHandle, encData);
        }

        return decrypt;
    }

奇怪的是,当我将Yubico smart card与opensc-pkcs11.dll一起使用时,它工作正常。当我将HSID5000与hsid-pkcs11.dll一起使用时,它将失败,并显示消息“ C_Decrypt返回了CKR_OPERATION_NOT_INITIALIZED”

当我使用相同的智能卡(HSID5000)但在pkcs11-tool中而不是Pkcs11Interop时,它起作用:

pkcs11-tool --id 01 --decrypt -p ******** -m RSA-PKCS --module hsid-pkcs11.dll --input-file input.enc

这是在两种情况下(Opensc智能卡和HSID智能卡)由Pkcs11Interop生成的pkcs11-logger文件

Yubico opensc智能卡日志文件:

0x00000b04 : 0x00000734 : Calling C_Decrypt
0x00000b04 : 0x00000734 : Input
0x00000b04 : 0x00000734 :  hSession: 35424832
0x00000b04 : 0x00000734 :  pEncryptedData: 0000000002E334C0
0x00000b04 : 0x00000734 :  *pEncryptedData: HEX(793...D99)
0x00000b04 : 0x00000734 :  ulEncryptedDataLen: 256
0x00000b04 : 0x00000734 :  pData: 0000000002E346E0
0x00000b04 : 0x00000734 :  pulDataLen: 000000000042EB48
0x00000b04 : 0x00000734 :  *pulDataLen: 7
0x00000b04 : 0x00000734 : Output
0x00000b04 : 0x00000734 :  pData: 0000000002E346E0
0x00000b04 : 0x00000734 :  pulDataLen: 000000000042EB48
0x00000b04 : 0x00000734 :  *pData: HEX(730D0A730D0A73)
0x00000b04 : 0x00000734 :  *pulDataLen: 7
0x00000b04 : 0x00000734 : Returning 0 (CKR_OK)

HSID智能卡日志文件:

0x00001b90 : 0x00000d94 : Calling C_Decrypt
0x00001b90 : 0x00000d94 : Input
0x00001b90 : 0x00000d94 :  hSession: 12274064
0x00001b90 : 0x00000d94 :  pEncryptedData: 0000000002E6A300
0x00001b90 : 0x00000d94 :  *pEncryptedData: HEX(49B....527)
0x00001b90 : 0x00000d94 :  ulEncryptedDataLen: 256
0x00001b90 : 0x00000d94 :  pData: 0000000002E6B520
0x00001b90 : 0x00000d94 :  pulDataLen: 00000000004AE938
0x00001b90 : 0x00000d94 :  *pulDataLen: 256
0x00001b90 : 0x00000d94 : Returning 145 (CKR_OPERATION_NOT_INITIALIZED)

有人可以帮我吗?

更新#1:

hsid-pkcs11.dll的完整日志文件为here

更新#2 :(解决方案!)

经过jariq的非凡评论后,HSID令牌不喜欢多次调用C_Decrypt,因此我使用了他的包装器,但没有使用HighLevel库,而是使用了Lowlevel库,只调用了一次C_Decrypt。而且有效!

谢谢大家。

1 个答案:

答案 0 :(得分:2)

当使用PKCS#11函数中的--decrypt个自变量pkcs11-tool调用(请参见source code)执行时:

  • C_DecryptInit初始化操作
  • C_Decrypt,带有分配的输出缓冲区,以接收解密的数据
在实现session.Decrypt()的PKCS#11函数之后,

Pkcs11Interop调用(请参见source code):

  • C_DecryptInit初始化操作
  • C_Decrypt,但未分配输出缓冲区来确定解密数据的长度
  • C_Decrypt,带有分配的输出缓冲区,以接收解密的数据

当应用程序两次调用hsid-pkcs11.dll时,C_Decrypt不喜欢它,就像Pkcs11Interop一样。但是,两次调用C_Decrypt完全没问题,PKCS#11 v2.20 specification的第11.2章介绍了此技术。

第145页上的说明完全相同:

  

C_Decrypt使用第11.2节中描述的关于产生输出的约定。

IMO,您需要联系非托管PKCS#11库的供应商,并要求他提供修复或至少说明。