From 595300617f63dc62081b7c8d2423ae8a7ae906ff Mon Sep 17 00:00:00 2001 From: Christian Hohnstaedt Date: Fri, 3 Apr 2015 14:46:13 +0200 Subject: [PATCH] SF Feat. Req. #80 Create new certificate, based on existing certificate --- lib/db_x509.cpp | 23 +++++++++++++++++++++++ lib/db_x509.h | 2 ++ widgets/NewX509.cpp | 27 +++++++++++++++++++++++++++ widgets/NewX509.h | 1 + widgets/hashBox.cpp | 18 ++++++++++++++++++ widgets/hashBox.h | 1 + 6 files changed, 72 insertions(+) diff --git a/lib/db_x509.cpp b/lib/db_x509.cpp index 3a75ac08..228a989f 100644 --- a/lib/db_x509.cpp +++ b/lib/db_x509.cpp @@ -436,6 +436,18 @@ void db_x509::newCert(pki_temp *temp) delete dlg; } +void db_x509::newCert(pki_x509 *cert) +{ + NewX509 *dlg = new NewX509(mainwin); + emit connNewX509(dlg); + dlg->setCert(); + dlg->defineCert(cert); + if (dlg->exec()) { + newCert(dlg); + } + delete dlg; +} + void db_x509::newCert(NewX509 *dlg) { pki_x509 *cert = NULL; @@ -647,6 +659,8 @@ void db_x509::showContextMenu(QContextMenuEvent *e, const QModelIndex &index) transform->addAction(tr("Request"), this, SLOT(toRequest()))-> setEnabled(privkey && privkey->isPrivKey()); + transform->addAction(tr("Similar Certificate"), + this, SLOT(toCertificate())); transform->addAction(tr("Template"), this, SLOT(toTemplate())); menu->addAction(tr("Delete"), this, SLOT(delete_ask())); @@ -1081,6 +1095,15 @@ void db_x509::genCrl() mainwin->crls->newItem(cert); } +void db_x509::toCertificate() +{ + pki_x509 *cert = static_cast(currentIdx.internalPointer()); + if (!cert) + return; + if (!cert->getRefKey()) + extractPubkey(); + newCert(cert); +} void db_x509::toRequest() { diff --git a/lib/db_x509.h b/lib/db_x509.h index 3e836caa..5762520e 100644 --- a/lib/db_x509.h +++ b/lib/db_x509.h @@ -47,6 +47,7 @@ class db_x509: public db_x509super pki_x509 *getBySubject(const x509name &xname, pki_x509 *last = NULL); pki_base *insert(pki_base *item); void newCert(NewX509 *dlg); + void newCert(pki_x509 *cert); void writePKCS12(pki_x509 *cert, QString s, bool chain); void writePKCS7(pki_x509 *cert, QString s, int type); void showContextMenu(QContextMenuEvent *e, const QModelIndex &index); @@ -70,6 +71,7 @@ class db_x509: public db_x509super void genCrl(); void caProperties(); void toRequest(); + void toCertificate(); void toToken(); void toOtherToken(); void newCert(pki_temp *); diff --git a/widgets/NewX509.cpp b/widgets/NewX509.cpp index e0eeb5b1..044731c8 100644 --- a/widgets/NewX509.cpp +++ b/widgets/NewX509.cpp @@ -368,6 +368,33 @@ void NewX509::defineRequest(pki_x509req *req) on_fromReqCB_clicked(); } +void NewX509::defineCert(pki_x509 *cert) +{ + pki_temp *temp = new pki_temp(""); + temp->fromCert(cert); + description->setText(cert->getIntName()); + pki_x509 *signer = cert->getSigner(); + if (signer == cert) { + foreignSignRB->setChecked(false); + } else if (signer) { + defineSigner(signer); + } + defineTemplate(temp); + delete temp; + + pki_key *key = cert->getRefKey(); + if (key) { + usedKeysToo->setChecked(true); + keyList->setCurrentIndex(private_keys.indexOf( + key->getIntNameWithType())); + } + + notBefore->setDate(cert->getNotBefore()); + notAfter->setDate(cert->getNotAfter()); + + hashAlgo->setCurrentMD(cert->getDigest()); +} + void NewX509::defineSigner(pki_x509 *defcert) { int index; diff --git a/widgets/NewX509.h b/widgets/NewX509.h index b096cd29..aa64cc02 100644 --- a/widgets/NewX509.h +++ b/widgets/NewX509.h @@ -74,6 +74,7 @@ class NewX509: public QDialog, public Ui::NewX509 void toTemplate(pki_temp *temp); void fromTemplate(pki_temp *temp); void defineTemplate(pki_temp *temp); + void defineCert(pki_x509 *cert); void defineRequest(pki_x509req *req); void defineSigner(pki_x509 *defcert); void templateChanged(pki_temp *templ); diff --git a/widgets/hashBox.cpp b/widgets/hashBox.cpp index 61f5808a..67a28bd1 100644 --- a/widgets/hashBox.cpp +++ b/widgets/hashBox.cpp @@ -73,6 +73,24 @@ void hashBox::setCurrentString(QString md) } } +void hashBox::setCurrentMD(const EVP_MD *md) +{ + int hash_nid; + unsigned idx; + + if (!md) + return; + + if (!OBJ_find_sigid_algs(EVP_MD_type(md), &hash_nid, NULL)) + hash_nid = EVP_MD_type(md); + for (idx = 0; idx nids) { QString md = currentText(); diff --git a/widgets/hashBox.h b/widgets/hashBox.h index 1f36beff..e3632b60 100644 --- a/widgets/hashBox.h +++ b/widgets/hashBox.h @@ -24,6 +24,7 @@ class hashBox: public QComboBox void setKeyType(int type); const EVP_MD *currentHash(); QString currentHashName(); + void setCurrentMD(const EVP_MD *md); void setCurrentAsDefault(); void setDefaultHash(); void setupHashes(QList nids);