AES GCM加密报错CKR_MECHANISM_PARAM_INVALID求助(PKCS11Interop v5+Azure HSM)
使用PKCS11Interop v5结合Azure云HSM执行AES-GCM加密时遇
CKR_MECHANISM_PARAM_INVALID错误 调用C_EncryptInit时返回错误:
Method C_EncryptInit returned CKR_MECHANISM_PARAM_INVALID
已测试多组ivBit与tagBit组合:
| ivBits | tagBits | aadBytes |
|---|---|---|
| 12UL | 128UL | null / 带值 |
| 96UL | 128UL | null / 带值 |
| 0UL | 128UL | null / 带值 |
| 16UL | 0UL | null / 带值 |
| 0UL | 0UL | null / 带值 |
已验证以下内容:
- HSM支持
CKM_AES_GCM - 加密/解密flag已启用
- AES密钥大小有效
- 平台为x64
- 相同密钥/会话下AES-CBC可正常工作
报错的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<ObjectAttribute> { 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<ObjectAttribute> { 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)); } } } }
是否有人在PKCS11Interop v5或Azure云HSM上遇到过CKM_AES_GCM对应的CKR_MECHANISM_PARAM_INVALID错误?恳请指导。
内容的提问来源于stack exchange,提问作者user3869349
相关产品推荐
相关产品推荐

