我正在使用符合PKCS11的密码设备,以保护我的私钥。该密码设备能够产生每秒500个RSA-2048位签名。我用C#.NET编写了一个应用程序,该应用程序与PKCS11Interop包装器接口。这是我的代码:
#region Initialization
Pkcs11 pkcs11 = new Pkcs11(pkcsLibraryPath, true);
Slot slot = pkcs11.GetSlotList(true)[slotIndex];
Session session = slot.OpenSession(false);
session.Login(CKU.CKU_USER, hsmPIN);
List<ObjectAttribute> searchObject = new List<ObjectAttribute>(2);
searchObject.Add(new ObjectAttribute(CKA.CKA_CLASS,(uint)CKO.CKO_PRIVATE_KEY));
searchObject.Add(new ObjectAttribute(CKA.CKA_LABEL, keyLabelName));
ObjectHandle privateKeyHandle = session.FindAllObjects(searchObject)[0];
byte[] dataToBeSigned = new byte[500];
byte[] signature = new byte[dataToBeSigned.Length];
#endregion Initialization
#region SEQUENTIAL Signing Loop
for(int i = 0; i<500;i++)
{
signature[i] = session.Sign(new Mechanism(CKM.CKM_SHA256_RSA_PKCS_PSS) , privateKeyHandle , dataToBeSigned[i]);
}
#endregion SEQUENTIAL Signing Loop
#region UNMANAGED Parallel Loop
Parallel.For(0, dataToBeSigned.Length, index =>
{
signature[index] = session.Sign(new Mechanism(CKM.CKM_SHA256_RSA_PKCS_PSS) , privateKeyHandle , dataToBeSigned[index]);
});
#endregion UNMANAGED Parallel Loop
#region MANAGED Parallel Loop
Parallel.For(0, dataToBeSigned.Length, index =>
{
lock(session)
{
signature[index] = session.Sign(new Mechanism(CKM.CKM_SHA256_RSA_PKCS_PSS) , privateKeyHandle , dataToBeSigned[index]);
}
});
#endregion MANAGED Parallel Loop 给你!!
我请本论坛的专家就上述6点作出澄清。
非常感谢。
卡鲁普
发布于 2017-04-04 14:47:19
您需要为每个签名操作创建新的Session。
请阅读PKCS#11 v2.20规范的“第6章-总览”。这里解释了PKCS#11 API的所有基本概念(包括会话提供的线程/操作隔离)。
在完成此强制阅读之后,您可以查看Pkcs11Interop.PDF项目中的Pkcs11Interop.PDF类以获得工作代码示例。
https://stackoverflow.com/questions/43203573
复制相似问题