Generación de firma multiproceso C #

Estoy usando un dispositivo criptográfico compatible con PKCS11 que asegura mi clave privada. El dispositivo criptográfico es capaz de generar 500 firmas de bits RSA-2048 por segundo. He escrito una aplicación en C # .NET en interfaz con PKCS11Interop Wrapper. Aquí está mi código:

#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  

¡¡Aqui tienes!!

Con la región de bucle de firma secuencial, puedo lograr solo 250-280 firmas, pero nunca la velocidad de 500 firmas según lo especificado por mi OEM Crypto. Al menos necesito 440 ~ 480 firmas por segundo. ¿Cómo puedo lograr esto usando un 'secuencial'para' ¿lazo?

¿Por qué mi bucle paralelo no administrado siempre produce una excepción? Incluso si manejo esas excepciones, el 40% de las firmas están fallando (la función session.Sign () devuelve nulo). ¿Por que es esto entonces?

Con el código "MANAGED Parallel Loop", puedo lograr una velocidad máxima de 280, como obtuve con Sequential Signing Loop. ¿Por qué mi ciclo paralelo GESTIONADO es lento? ¿Es por 'bloquear'? Si elimino elbloquear, se convierte en un bucle paralelo no administrado. ¿Cómo puedo manejar esto?

Si cree que mi codificación multiproceso (y toda la programación y operaciones PKCS11) es incorrecta, sugiérame algún método para lograr la velocidad máxima.

Si siente que podría haber un problema con PCKS11Interop Wrapper que no me permite alcanzar la velocidad, sugiera algunos otros envoltorios. Utilicé NCryptoki, Pkcs11.Net Wrappers, pero no pude alcanzar la velocidad máxima.

Estoy 100% seguro de que mi dispositivo compatible con PKCS11 es capaz de generar 500 Firmas. Confirmé esto con mi OEM. Solo que, cuando opero el dispositivo mediante programación (C # o Java), mi velocidad baja.

Solicito a los expertos de este foro que me aclaren sobre los 6 puntos anteriores.

Muchas gracias.

Karthick

Respuestas a la pregunta(1)

Su respuesta a la pregunta