Библиотека PKCS для Safenet 5100
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 ответ
Кажется, вы затрагиваете наиболее распространенную проблему, и в результате вы используете шаблон поиска, который является слишком широким. С помощью шаблона поиска вы найдете все объекты, которые имеют 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.