Библиотека PKCS для Safenet 5100 - PullRequest
       86

Библиотека PKCS для Safenet 5100

0 голосов
/ 05 декабря 2018
static string pkcs11LibraryPath = @"C:\Windows\System32\eTPKCS11.dll";    
using (Pkcs11 pkcs11 = new Pkcs11(pkcs11LibraryPath, AppType.SingleThreaded))
{
    // Get list of available slots with token present
    List<Slot> slots = pkcs11.GetSlotList(SlotsType.WithTokenPresent);

    // Find first slot with token present
    Slot slot = slots[0];

    // Open RO session
    using (Session session = slot.OpenSession(SessionType.ReadWrite))
    {
        session.Login(CKU.CKU_USER, "654321");//HSM:123456

        for (int i = 0; i <= slot.GetMechanismList().Count - 1; i++)
        {
            Console.WriteLine(slot.GetMechanismList()[i].ToString());
        }

        // Prepare attribute template that defines search criteria
        List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>();
        //objectAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, "test"));//HSM:KEY_028_04
        objectAttributes.Add(new ObjectAttribute(CKA.CKA_TOKEN, true));

        // Initialize searching
        session.FindObjectsInit(objectAttributes);

        // Get search results
        List<ObjectHandle> foundObjects = session.FindObjects(2);

        // Terminate searching
        session.FindObjectsFinal();

        ObjectHandle objectHandle = foundObjects[0];

        byte[] iv = Encoding.UTF8.GetBytes("00000000");
        byte[] inputData = Encoding.UTF8.GetBytes("data to encrypt.");


         Mechanism mechanism = new Mechanism(CKM.CKM_DES3_CBC, iv);;//HSM: CKM_DES3_CBC

        byte[] result = session.Encrypt(mechanism, objectHandle, inputData);

        Console.WriteLine(Convert.ToBase64String(result));
    }
}

Я получил ошибку Net.Pkcs11Interop.Common.Pkcs11Exception: 'Method C_EncryptInit returned CKR_KEY_TYPE_INCONSISTENT' в byte[] result = session.Encrypt(mechanism, objectHandle, inputData);

Я использую Safenet 5100 etoken Не могли бы вы помочь?

1 Ответ

0 голосов
/ 06 декабря 2018

Кажется, вы решаете самую распространенную проблему , и в результате вы используете шаблон поиска, который является слишком широким.С помощью шаблона поиска вы найдете все объекты, для которых CKA_TOKEN установлено в значение CK_TRUE.Это означает, что все сертификаты, все асимметричные (например, RSA) ключи, все симметричные ключи (например, AES), все объекты данных и все другие вещи, которые хранятся на вашем устройстве.

Затем вы используете первый найденный объект(Ключ RSA? Ключ AES? Никто не знает ...) с механизмом CKM_DES3_CBC, который требует использования функций типа CKK_DES3 и C_EncryptInit, жалуется на то, что вы указали неверный тип ключа, возвращая ошибку CKR_KEY_TYPE_INCONSISTENT.

Если вы хотите быть уверены, что найдете только ключи 3DES, чем вам нужно использовать более конкретный шаблон поиска:

List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>();
objectAttributes.Add(new ObjectAttribute(CKA.CKA_TOKEN, true));
objectAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK_DES3));

Еще лучше использовать CKA_LABEL и / или CKA_ID для указанияровно один ключ, который вы хотите использовать.И не забудьте прочитать хотя бы «Глава 2 - Область применения», «Глава 6 - Общий обзор» и «Глава 10 - Объекты» спецификации PKCS # 11 v2.20.

...