diff --git a/lib/pki_evp.cpp b/lib/pki_evp.cpp index 78b122c0..a391a0f2 100644 --- a/lib/pki_evp.cpp +++ b/lib/pki_evp.cpp @@ -119,7 +119,7 @@ void pki_evp::generate(const keyjob &task) break; } #ifndef OPENSSL_NO_EC - case EVP_PKEY_EC: + case EVP_PKEY_EC: { EC_KEY *eckey; EC_GROUP *group = EC_GROUP_new_by_curve_name(task.ec_nid); if (!group) @@ -140,6 +140,18 @@ void pki_evp::generate(const keyjob &task) EC_KEY_free(eckey); EC_GROUP_free(group); break; + } +#ifdef EVP_PKEY_ED25519 + case EVP_PKEY_ED25519: { + EVP_PKEY *pkey = NULL; + EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_ED25519, NULL); + EVP_PKEY_keygen_init(pctx); + EVP_PKEY_keygen(pctx, &pkey); + EVP_PKEY_CTX_free(pctx); + EVP_PKEY_free(key); + key = pkey; + } +#endif #endif } #if OPENSSL_VERSION_NUMBER >= 0x10100000L diff --git a/lib/pki_key.h b/lib/pki_key.h index 9b48ea0b..33e24819 100644 --- a/lib/pki_key.h +++ b/lib/pki_key.h @@ -31,21 +31,28 @@ class keytype static QList types() { return QList { - keytype(EVP_PKEY_RSA, "RSA", CKM_RSA_PKCS_KEY_PAIR_GEN), - keytype(EVP_PKEY_DSA, "DSA", CKM_DSA_KEY_PAIR_GEN), + keytype(EVP_PKEY_RSA, "RSA", CKM_RSA_PKCS_KEY_PAIR_GEN, + false, true), + keytype(EVP_PKEY_DSA, "DSA", CKM_DSA_KEY_PAIR_GEN, + false, true), #ifndef OPENSSL_NO_EC - keytype(EVP_PKEY_EC, "EC", CKM_EC_KEY_PAIR_GEN), + keytype(EVP_PKEY_EC, "EC", CKM_EC_KEY_PAIR_GEN, + true, false), +#ifdef EVP_PKEY_ED25519 + keytype(EVP_PKEY_ED25519, "ED25519", 0, false, false), +#endif #endif }; } int type; QString name; CK_MECHANISM_TYPE mech; + bool curve, length; - keytype(int t, const QString &n, CK_MECHANISM_TYPE m) - : type(t), name(n), mech(m) { } - keytype() : type(-1), name(QString()), mech(0) { } - + keytype(int t, const QString &n, CK_MECHANISM_TYPE m, bool c, bool l) + : type(t), name(n), mech(m), curve(c), length(l) { } + keytype() : type(-1), name(QString()), mech(0), + curve(false), length(true) { } bool isValid() { return type != -1; diff --git a/widgets/NewKey.cpp b/widgets/NewKey.cpp index 9500541c..3180f4e6 100644 --- a/widgets/NewKey.cpp +++ b/widgets/NewKey.cpp @@ -182,17 +182,15 @@ void NewKey::updateCurves(unsigned min, unsigned max, unsigned long ec_flags) void NewKey::on_keyType_currentIndexChanged(int idx) { - bool curve_enabled; keyListItem ki = keyType->itemData(idx).value(); - curve_enabled = ki.type() == EVP_PKEY_EC; - curveBox->setVisible(curve_enabled); - curveLabel->setVisible(curve_enabled); - keySizeLabel->setVisible(!curve_enabled); - keyLength->setVisible(!curve_enabled); + curveBox->setVisible(ki.ktype.curve); + curveLabel->setVisible(ki.ktype.curve); + keySizeLabel->setVisible(ki.ktype.length); + keyLength->setVisible(ki.ktype.length); rememberDefault->setEnabled(!ki.card); - if (curve_enabled && ki.card) { + if (ki.ktype.curve && ki.card) { updateCurves(ki.minKeySize, ki.maxKeySize, ki.ec_flags); } }