Ошибка создания пары ключей ECDSA с помощью pkcs11interop

Я подключаюсь к Gemalto HSM, который поддерживает secp256r1. У меня есть следующий код для создания пары ключей ECDSA с использованием Pkcs11interop. Я получаю paramsBytes, используя BouncyCastle NistNamedCurves и X962Parameters.

HSM продолжает возвращаться с CKR_ATTRIBUTE_TYPE_INVALID. Я новичок в ECDSA, поэтому, возможно, что-то пропустил. Есть идеи?

                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);

2 ответа

Решение

Узнал, что происходит. HSM не понравился

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

на закрытый ключ. PKCS утверждает, что параметры ECDSA должны быть в открытом ключе и не могут быть в закрытом ключе, и эта реализация обеспечила это.

В CKA_ECDSA_PARAMS вы можете вставить byte[], который специфичен для любого имени кривой. список доступных имен и связанный с ними byte[] представлен здесь , в проекте SSL GitHub.

Другое дело, добавь(CKA.TOKEN, true)как другие атрибуты закрытого ключа.

Другие вопросы по тегам