PKCS # 11: C_Decrypt восстановлен CKR_OPERATION_NOT_INITIALIZED - PullRequest
0 голосов
/ 04 октября 2018

Я пытался расшифровать файл с помощью смарт-карты, но получаю странное сообщение.

Я использую PKCS11Interop для вызова C_Decrypt в файле dll, который использует pkcs11.h для связи со смарт-картами.

Это код:

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 с 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

Вот файл pkcs11-logger, созданный с помощью Pkcs11Interop в обоих сценариях (смарт-карта Opensc и смарт-карта HSID)

Файл журнала смарт-карты 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 - здесь

Обновление № 2: (Решение!)

После замечательного комментария от jariq токен HSID не любит множественные вызовыC_Decrypt, поэтому я использовал его обертку, но вместо библиотеки HighLevel я использовал библиотеку Lowlevel и вызывал C_Decrypt только один раз.И это сработало!

Спасибо всем вам.

1 Ответ

0 голосов
/ 04 октября 2018

При выполнении с --decrypt аргумент pkcs11-tool вызывает (см. исходный код ) следующие функции PKCS # 11:

  • C_DecryptInit для инициализации операции
  • C_Decrypt с выделенным буфером вывода для получения расшифрованных данных

Pkcs11Interop вызывает (см. исходный код ) следующие функции PKCS # 11 при реализации session.Decrypt():

  • C_DecryptInit для инициализации операции
  • C_Decrypt без выделенного буфера вывода для определения длины дешифрованных данных
  • C_Decrypt с выделенным буфером вывода для приема дешифрованных данных

Кажется, что hsid-pkcs11.dll не нравится, когда приложение вызывает C_Decrypt дважды, как Pkcs11Interop.Однако дважды вызывать C_Decrypt вполне нормально, и этот метод описан в главе 11.2 спецификации PKCS # 11 v2.20 .

Точно такая же спецификация указывает на странице 145, что:

C_Decrypt использует соглашение, описанное в разделе 11.2, для получения выходных данных.

IMO, вам необходимо связаться с поставщиком вашей неуправляемой библиотеки PKCS # 11 и попросить его исправить илиНаименьшее объяснение.

...