2017-07-31 3 views
1

Je me connecte à Gemalto HSM qui prend en charge secp256r1. J'ai le code suivant pour créer une paire de clés ECDSA en utilisant Pkcs11interop. J'obtiens le paramsBytes en utilisant BouncyCastle NistNamedCurves et X962Parameters.Erreur lors de la création d'une paire de clés ECDSA avec pkcs11interop

Le HSM continue de revenir avec CKR_ATTRIBUTE_TYPE_INVALID. Je suis nouveau à ECDSA donc j'ai peut-être manqué quelque chose. Des idées?

   X9ECParameters x9Ec = NistNamedCurves.GetByName("P-256"); 
       X962Parameters x962 = new X962Parameters(x9Ec); 
       byte[] paramsBytes = x962.GetDerEncoded(); 

       // The CKA_ID attribute is intended as a means of distinguishing multiple key pairs held by the same subject 
       byte[] ckaId = session.GenerateRandom(20); 

       // Prepare attribute template of new public key 
       List<ObjectAttribute> publicKeyAttributes = new List<ObjectAttribute>(); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE, false)); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, keyName)); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ID, ckaId)); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_VERIFY, true)); 
       publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ECDSA_PARAMS, paramsBytes)); 

       // Prepare attribute template of new private key 
       List<ObjectAttribute> privateKeyAttributes = new List<ObjectAttribute>(); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE, true)); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, keyName)); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ID, ckaId)); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_SENSITIVE, true)); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_SIGN, true)); 
       privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ECDSA_PARAMS, paramsBytes)); 

       // Generate key pair 
       Mechanism mechanism = new Mechanism(CKM.CKM_ECDSA_KEY_PAIR_GEN); 
       ObjectHandle publicKeyHandle = null; 
       ObjectHandle privateKeyHandle = null; 
       session.GenerateKeyPair(mechanism, publicKeyAttributes, privateKeyAttributes, out publicKeyHandle, 
        out privateKeyHandle); 

Répondre

1

Trouvé ce qui se passait. Le HSM n'a pas aimé le

privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ECDSA_PARAMS, paramsBytes)); 

sur la clé privée. PKCS stipule que les paramètres ECDSA doivent être sur la clé publique et ne peuvent pas être sur la clé privée et cette implémentation l'a appliquée.

+0

Augmentation de la bonne réponse. Bon travail! – jariq