Ошибка шифрования AES GCM — CKR_MECHANISM_PARAM_INVALIDC#

Место общения программистов C#
Anonymous
Ошибка шифрования AES GCM — CKR_MECHANISM_PARAM_INVALID

Сообщение Anonymous »

Я пытаюсь выполнить шифрование AES-GCM с использованием PKCS11Interop v5 для HSM, но C_EncryptInit завершается неудачно:

Код: Выделить всё

Method C_EncryptInit returned CKR_MECHANISM_PARAM_INVALID
Я тестировал несколько комбинаций ivBit и tagBit:



ivBits
tagBits
aadBytes




96UL
128UL
null / со значением


0UL
128UL
null / со значением


16UL
0UL
null / со значением


0UL
0UL
null / со значением



I проверил это:
  • Код: Выделить всё

    CKM_AES_GCM
    поддерживается HSM
  • Флаги шифрования/дешифрования включены
  • Размер ключа AES действителен
  • Платформа соответствует x64
  • AES-CBC успешно работает с тем же ключом/сессией
Вот пример шифрования с использованием CKM_AES_GCM, который выдает ошибку при шифровании

Код: Выделить всё

using Net.Pkcs11Interop.Common;
using Net.Pkcs11Interop.HighLevelAPI;
using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;

class Program
{
private const string Pkcs11Library =
@"C:\Program Files\Microsoft Azure Cloud HSM Client SDK\libs\pkcs11\azcloudhsm_pkcs11.dll";

static void Main()
{
using (var pkcs11 = new Pkcs11(Pkcs11Library, AppType.MultiThreaded))
{
var slot = pkcs11.GetSlotList(SlotsType.WithTokenPresent).First();

using (var session = slot.OpenSession(SessionType.ReadWrite))
{
session.Login(CKU.CKU_USER, "password");

// AES key already exists on HSM
var key = session.FindAllObjects(new List
{
new ObjectAttribute(CKA.CKA_LABEL, "TestAESKey")
}).First();

byte[] plaintext = Encoding.UTF8.GetBytes("test");

byte[] iv = new byte[12];

using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(iv);
}

var gcmParams =
session.Factories.MechanismParamsFactory.CreateCkGcmParams(
iv,
96UL,
null,
128UL);

var mechanism =
session.Factories.MechanismFactory.Create(
CKM.CKM_AES_GCM,
gcmParams);

byte[] encrypted =
session.Encrypt(
mechanism,
key,
plaintext);

Console.WriteLine(Convert.ToBase64String(encrypted));
}
}
}
}
Для сравнения, AES-CBC корректно работает с тем же ключом

Код: Выделить всё

using Net.Pkcs11Interop.Common;
using Net.Pkcs11Interop.HighLevelAPI;
using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;

class Program
{
private const string Pkcs11Library =
@"C:\Program Files\Microsoft Azure Cloud HSM Client SDK\libs\pkcs11\azcloudhsm_pkcs11.dll";

static void Main()
{
using (var pkcs11 = new Pkcs11(Pkcs11Library, AppType.MultiThreaded))
{
var slot = pkcs11.GetSlotList(SlotsType.WithTokenPresent).First();

using (var session = slot.OpenSession(SessionType.ReadWrite))
{
session.Login(CKU.CKU_USER, "password");

// AES key already exists on HSM
var key = session.FindAllObjects(new List
{
new ObjectAttribute(CKA.CKA_LABEL,  "TestAESKey")
}).First();

byte[] plaintext = Encoding.UTF8.GetBytes("test");

var iv = new byte[16];

using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(iv);
}

var mechanism =
session.Factories.MechanismFactory.Create(
CKM.CKM_AES_CBC_PAD,
iv);

byte[] encrypted =
session.Encrypt(
mechanism,
key,
plaintext);

Console.WriteLine(Convert.ToBase64String(encrypted));
}
}
}
}
Кто-нибудь сталкивался с CKR_MECHANISM_PARAM_INVALID конкретно с CKM_AES_GCM в PKCS11Interop v5 или Azure Cloud HSM? Будем признательны за любые рекомендации.
ps. Благодаря искусственному интеллекту я все еще получаю эту ошибку

Вернуться в «C#»