Close #142: Support Ed25519 Keygen

Support generating ED25519 keys
This commit is contained in:
Christian Hohnstaedt 2021-02-13 22:39:31 +01:00 committed by Christian Hohnstädt
parent 1a0ef9c9ee
commit dbb3c48ef3
3 changed files with 32 additions and 15 deletions

View File

@ -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

View File

@ -31,21 +31,28 @@ class keytype
static QList<keytype> types()
{
return QList<keytype> {
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;

View File

@ -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<keyListItem>();
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);
}
}