PKCS#11:C_Decrypt 返回 CKR_OPERATION_NOT_INITIALIZED

PKCS#11: C_Decrypt retured CKR_OPERATION_NOT_INITIALIZED

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

我正在使用 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 with opensc-pkcs11.dll, it works fine. When I use HSID5000 与 hsid-pkcs11.dll 一起使用时,它失败并显示消息 "C_Decrypt returned 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 只有一次。它奏效了!

谢谢大家。

当使用 --decrypt 参数执行时 pkcs11-tool 调用(参见 source code)以下 PKCS#11 函数:

  • C_DecryptInit初始化操作
  • C_Decrypt 已分配输出缓冲区以接收解密数据

Pkcs11Interop 调用(参见 source code)遵循 PKCS#11 函数实现 session.Decrypt():

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

似乎 hsid-pkcs11.dll 不喜欢应用程序调用 C_Decrypt 两次,就像 Pkcs11Interop 那样。但是调用 C_Decrypt 两次完全没问题,PKCS#11 v2.20 specification.

的第 11.2 章描述了这种技术。

与第 145 页上的规格完全相同:

C_Decrypt uses the convention described in Section 11.2 on producing output.

IMO,您需要联系非托管 PKCS#11 库的供应商并要求他进行修复或至少进行解释。