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 库的供应商并要求他进行修复或至少进行解释。
我一直在尝试使用智能卡解密文件,但收到奇怪的消息。
我正在使用 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.
与第 145 页上的规格完全相同:
C_Decrypt
uses the convention described in Section 11.2 on producing output.
IMO,您需要联系非托管 PKCS#11 库的供应商并要求他进行修复或至少进行解释。