xca/MainWindowX509.cpp
chris a782c37b8f Signatures can be done with requests and from scratch,
Certificate for signing can be self or foreign,
password is saved as md5sum,
bugs in displaying requests in list, and showing their keys solved
same with certs
2002-07-13 20:57:50 +00:00

239 lines
6.9 KiB
C++
Raw Blame History

#include "MainWindow.h"
void MainWindow::newCert()
{
pki_x509 *cert = NULL;
pki_x509 *signcert = NULL;
pki_x509req *req = NULL;
pki_key *signkey = NULL, *key = NULL;
int serial = 42; // :-)
// Step 1
NewX509 *dlg1 = new NewX509(this, NULL, keys, reqs);
if (! dlg1->exec()) return;
if (dlg1->fromDataRB->isChecked()) {
key = (pki_key *)keys->getSelectedPKI(dlg1->keyList->currentText().latin1());
string cn = dlg1->commonName->text().latin1();
string c = dlg1->countryName->text().latin1();
string l = dlg1->localityName->text().latin1();
string st = dlg1->stateOrProvinceName->text().latin1();
string o = dlg1->organisationName->text().latin1();
string ou = dlg1->organisationalUnitName->text().latin1();
string email = dlg1->emailAddress->text().latin1();
string desc = dlg1->description->text().latin1();
req = new pki_x509req(key, cn,c,l,st,o,ou,email,desc,"");
}
else {
req = (pki_x509req *)reqs->getSelectedPKI(dlg1->reqList->currentText().latin1());
}
// Step 2
NewX509_1_UI *dlg2 = new NewX509_1_UI(this, NULL, true ,0);
dlg2->certList->insertStringList(certs->getPrivateDesc());
if (dlg1->fromDataRB->isChecked())
dlg2->selfSignRB->setChecked(true);
else
dlg2->foreignSignRB->setChecked(true);
if (! dlg2->exec()) return;
if (dlg2->foreignSignRB->isChecked()) {
signcert = (pki_x509 *)certs->getSelectedPKI(dlg2->certList->currentText().latin1());
signkey = certs->findKey(signcert);
}
else {
signkey = key;
string serialstr = dlg2->serialNr->text().latin1();
serial = atoi(serialstr.c_str());
}
// Step 3
NewX509_2_UI *dlg3 = new NewX509_2_UI(this, NULL, true ,0);
if (! dlg3->exec()) return;
string daystr = dlg3->validNumber->text().latin1();
int x = atoi(daystr.c_str());
int days = dlg3->validRange->currentItem();
if (days == 1) x *= 30;
if (days == 2) x *= 365;
cert = new pki_x509(req->getDescription(), req, signcert, signkey, x, serial);
string e;
if (! cert ) {
QMessageBox::information(this,"Zertifikat erstellen",
("Beim Erstellen des Zertifikats trat folgender Fehler auf:\n'" +
e + "'\nund wurde daher nicht erstellt").c_str(), "OK");
//delete(cert);
return;
}
insertCert(cert);
}
void MainWindow::showDetailsCert()
{
pki_x509 *cert = (pki_x509 *)certs->getSelectedPKI();
showDetailsCert(cert);
}
void MainWindow::showDetailsCert(QListViewItem *item)
{
string cert = item->text(0).latin1();
showDetailsCert((pki_x509 *)certs->getSelectedPKI(cert));
}
void MainWindow::showDetailsCert(pki_x509 *cert)
{
if (!cert) return;
CertDetail_UI *dlg = new CertDetail_UI(this,0,true);
dlg->descr->setText(cert->getDescription().c_str());
// examine the key
pki_key *key= (pki_key *)keys->findPKI(cert->getKey());
if (key)
if (key->isPrivKey()) {
dlg->privKey->setText(key->getDescription().c_str());
dlg->privKey->setDisabled(false);
}
// examine the signature
if ( cert->getSigner() == NULL) {
dlg->verify->setText("NOT TRUSTED");
dlg->verify->setDisabled(true);
}
else if ( cert->compare(cert->getSigner()) ) {
dlg->verify->setText("SELF SIGNED");
}
else {
dlg->verify->setText(cert->getSigner()->getDescription().c_str());
}
// details of subject
string land = cert->getDNs(NID_countryName);
string land1 = cert->getDNs(NID_stateOrProvinceName);
if (land != "" && land1 != "")
land += " / " +land1;
else
land+=land1;
dlg->dnCN->setText(cert->getDNs(NID_commonName).c_str() );
dlg->dnC->setText(land.c_str());
dlg->dnL->setText(cert->getDNs(NID_localityName).c_str());
dlg->dnO->setText(cert->getDNs(NID_organizationName).c_str());
dlg->dnOU->setText(cert->getDNs(NID_organizationalUnitName).c_str());
dlg->dnEmail->setText(cert->getDNs(NID_pkcs9_emailAddress).c_str());
// same for issuer....
land = cert->getDNi(NID_countryName);
land1 = cert->getDNi(NID_stateOrProvinceName);
if (land != "" && land1 != "")
land += " / " +land1;
else
land+=land1;
dlg->dnCN_2->setText(cert->getDNi(NID_commonName).c_str() );
dlg->dnC_2->setText(land.c_str());
dlg->dnL_2->setText(cert->getDNi(NID_localityName).c_str());
dlg->dnO_2->setText(cert->getDNi(NID_organizationName).c_str());
dlg->dnOU_2->setText(cert->getDNi(NID_organizationalUnitName).c_str());
dlg->dnEmail_2->setText(cert->getDNi(NID_pkcs9_emailAddress).c_str());
dlg->notBefore->setText(cert->notBefore().c_str());
dlg->notAfter->setText(cert->notAfter().c_str());
if (cert->checkDate() == -1) {
dlg->dateValid->setText("Abgelaufen");
dlg->dateValid->setDisabled(true);
}
if (cert->checkDate() == +1) {
dlg->dateValid->setText("Noch nicht g<>ltig");
dlg->dateValid->setDisabled(true);
}
// the fingerprints
dlg->fpMD5->setText(cert->fingerprint(EVP_md5()).c_str());
dlg->fpSHA1->setText(cert->fingerprint(EVP_sha1()).c_str());
// V3 extensions
dlg->v3Extensions->setText(cert->printV3ext().c_str());
// show it to the user...
if ( !dlg->exec()) return;
string ndesc = dlg->descr->text().latin1();
if (ndesc != cert->getDescription()) {
certs->updatePKI(cert, ndesc);
}
}
void MainWindow::deleteCert()
{
pki_x509 *cert = (pki_x509 *)certs->getSelectedPKI();
if (!cert) return;
if (QMessageBox::information(this,"Zertifikat l<>schen",
("M<EFBFBD>chten Sie das Zertifikat: '" +
cert->getDescription() +
"'\nwirklich l<>schen ?\n").c_str(),
"L<EFBFBD>schen", "Abbrechen")
) return;
certs->deletePKI(cert);
}
void MainWindow::loadCert()
{
QStringList filt;
filt.append( "Zertifikate ( *.pem *.der *.crt *.cer)");
filt.append("Alle Dateien ( *.* )");
string s;
QFileDialog *dlg = new QFileDialog(this,0,true);
dlg->setCaption("Zertifikat importieren");
dlg->setFilters(filt);
if (dlg->exec())
s = dlg->selectedFile().latin1();
if (s == "") return;
pki_x509 *cert = new pki_x509(s);
string errtxt;
if ((errtxt = cert->getError()) != "") {
QMessageBox::warning(this,"Datei Fehler",
("Das Zertifikat: '" + s +
"'\nkonnte nicht geladen werden:\n" + errtxt).c_str());
return;
}
insertCert(cert);
}
void MainWindow::insertCert(pki_x509 *cert)
{
pki_x509 *oldcert = (pki_x509 *)certs->findPKI(cert);
if (oldcert) {
QMessageBox::information(this,"Zertifikats import",
("Das Zertifikat ist bereits vorhanden als:\n'" +
oldcert->getDescription() +
"'\nund wurde daher nicht importiert").c_str(), "OK");
delete(cert);
return;
}
certs->insertPKI(cert);
}
void MainWindow::writeCert()
{
QStringList filt;
filt.append( "Zertifikat ( *.pem *.der )");
filt.append("Alle Dateien ( *.* )");
string s;
QFileDialog *dlg = new QFileDialog(this,0,true);
dlg->setCaption("Zertifikat exportieren");
dlg->setFilters(filt);
if (dlg->exec())
s = dlg->selectedFile().latin1();
if (s == "") return;
pki_x509 *cert = (pki_x509 *)certs->getSelectedPKI();
if (cert) {
cert->writeCert(s,true);
string errtxt;
if ((errtxt = cert->getError()) != "") {
QMessageBox::warning(this,"Datei Fehler",
("Das Zertifikat: '" + s +
"'\nkonnte nicht gespeichert werden:\n" + errtxt).c_str());
return;
}
}
}