diff --git a/changelog b/changelog index bb0585af..eb54bf2e 100644 --- a/changelog +++ b/changelog @@ -1,4 +1,5 @@ + * add DH param generation menu entry * improve token handling and PIN changing dialogs * improve key-value table input for "additional DN entries" * PIN and PUK changing implemented diff --git a/lib/exception.h b/lib/exception.h index 0cb415a0..807bf5ae 100644 --- a/lib/exception.h +++ b/lib/exception.h @@ -45,5 +45,10 @@ class errorEx } }; -#define check_oom(ptr) if(!ptr){throw errorEx(QObject::tr("Out of Memory"));} +#define check_oom(ptr) \ + if(!ptr) { \ + throw errorEx(QObject::tr("Out of Memory at %1:%2").\ + arg(__FILE__).arg(__LINE__)); \ + } + #endif diff --git a/lib/func.cpp b/lib/func.cpp index f6242208..1c995560 100644 --- a/lib/func.cpp +++ b/lib/func.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #if defined(Q_WS_MAC) #include #endif @@ -339,3 +340,15 @@ bool _ign_openssl_error(const char *file, int line) return !errtxt.isEmpty(); } +void inc_progress_bar(int, int, void *p) +{ + QProgressBar *bar = (QProgressBar *)p; + int value = bar->value(); + + if (value == bar->maximum()) { + bar->reset(); + } else { + bar->setValue(value +1); + } +} + diff --git a/lib/func.h b/lib/func.h index d4ca1ca6..5045dff3 100644 --- a/lib/func.h +++ b/lib/func.h @@ -37,6 +37,7 @@ QString changeFilenameSuffix(QString fn, const QStringList &suffixlist, int selected); bool mayWriteFile(const QString &fname); +void inc_progress_bar(int, int, void *p); #define openssl_error(x) _openssl_error(QString(x), __FILE__, __LINE__) #define ign_openssl_error() _ign_openssl_error(__FILE__, __LINE__) diff --git a/lib/pki_evp.cpp b/lib/pki_evp.cpp index d8f7dfbf..0c073a58 100644 --- a/lib/pki_evp.cpp +++ b/lib/pki_evp.cpp @@ -61,12 +61,6 @@ void pki_evp::init(int type) cols=5; } -static void incProgress(int, int, void *progress) -{ - int i = ((QProgressBar *)progress)->value(); - ((QProgressBar *)progress)->setValue(++i); -} - QString pki_evp::removeTypeFromIntName(QString n) { if (n.right(1) != ")" ) @@ -114,14 +108,15 @@ void pki_evp::generate(int bits, int type, QProgressBar *progress, int curve_nid switch (type) { case EVP_PKEY_RSA: - rsakey = RSA_generate_key(bits, 0x10001, &incProgress,progress); + rsakey = RSA_generate_key(bits, 0x10001, inc_progress_bar, + progress); if (rsakey) EVP_PKEY_assign_RSA(key, rsakey); break; case EVP_PKEY_DSA: progress->setMaximum(500); dsakey = DSA_generate_parameters(bits, NULL, 0, NULL, NULL, - &incProgress, progress); + inc_progress_bar, progress); DSA_generate_key(dsakey); if (dsakey) EVP_PKEY_assign_DSA(key, dsakey); diff --git a/lib/pki_multi.cpp b/lib/pki_multi.cpp index 5ce46542..41dcbf66 100644 --- a/lib/pki_multi.cpp +++ b/lib/pki_multi.cpp @@ -175,6 +175,4 @@ void pki_multi::probeAnything(const QString fname) } while (!lbs.isEmpty()) delete lbs.takeFirst(); - -#warning delete lbs } diff --git a/lib/pki_scard.cpp b/lib/pki_scard.cpp index f1365998..0378ff9a 100644 --- a/lib/pki_scard.cpp +++ b/lib/pki_scard.cpp @@ -541,12 +541,7 @@ void pki_scard::generateKey_card(unsigned long slot, int size, QProgressBar *bar kt.p11 = &p11; kt.start(); while (!kt.wait(20)) { - int value = bar->value(); - if (value == bar->maximum()) { - bar->reset(); - } else { - bar->setValue(value +1); - } + inc_progress_bar(0, 0, bar); } if (!kt.err.isEmpty()) throw errorEx(kt.err); diff --git a/widgets/MW_menu.cpp b/widgets/MW_menu.cpp index de570288..751253d3 100644 --- a/widgets/MW_menu.cpp +++ b/widgets/MW_menu.cpp @@ -25,10 +25,12 @@ void MainWindow::init_menu() QMenu *file, *help, *import, *token; file = menuBar()->addMenu(tr("&File")); - file->addAction(tr("&New DataBase"), this, SLOT(new_database())); - file->addAction(tr("&Open DataBase"), this, SLOT(load_database())); + file->addAction(tr("&New DataBase"), this, SLOT(new_database())); + file->addAction(tr("&Open DataBase"), this, SLOT(load_database())); + file->addAction(tr("Generate DH parameter"), this, + SLOT(generateDHparam())); acList += file->addAction(tr("&Close DataBase"), this, - SLOT(close_database())); + SLOT(close_database())); acList += file->addAction(tr("&Dump DataBase"), this, SLOT(dump_database())); acList += file->addAction(tr("C&hange DataBase password"), this, diff --git a/widgets/MainWindow.cpp b/widgets/MainWindow.cpp index 022457a7..f09e1944 100644 --- a/widgets/MainWindow.cpp +++ b/widgets/MainWindow.cpp @@ -860,3 +860,48 @@ pki_multi *MainWindow::probeAnything(QString file) return pki; } +void MainWindow::generateDHparam() +{ + DH *dh = NULL; + FILE *fp = NULL; + QProgressBar *bar = NULL; + bool ok; + int num = QInputDialog::getInt(this, XCA_TITLE, tr("DH parameter bits"), + 1024, 1024, 4096, 1024, &ok); + + if (!ok) + return; + try { + QStatusBar *status = statusBar(); + bar = new QProgressBar(); + check_oom(bar); + bar->setMinimum(0); + bar->setMaximum(100); + status->addPermanentWidget(bar, 1); + dh = DH_generate_parameters(num, 2, inc_progress_bar, bar); + status->removeWidget(bar); + openssl_error(); + + QString fname = QString("%1/dh%2.pem").arg(homedir).arg(num); + fname = QFileDialog::getSaveFileName(this, QString(), + fname, "All files ( * )", NULL); + if (fname == "") + throw errorEx(""); + fp = fopen(QString2filename(fname), "w"); + if (fp == NULL) { + throw errorEx(tr("Error opening file: '%1': %2"). + arg(fname).arg(strerror(errno))); + } + PEM_write_DHparams(fp, dh); + openssl_error(); + } catch (errorEx &err) { + Error(err); + } + if (dh) + DH_free(dh); + if (fp) + fclose(fp); + if (bar) + delete bar; +} + diff --git a/widgets/MainWindow.h b/widgets/MainWindow.h index 92b548f9..6051a00d 100644 --- a/widgets/MainWindow.h +++ b/widgets/MainWindow.h @@ -108,6 +108,7 @@ class MainWindow: public QMainWindow, public Ui::MainWindow void changePin(bool so=false); void changeSoPin(); void initPin(); + void generateDHparam(); void on_keyView_doubleClicked(const QModelIndex &m); void on_reqView_doubleClicked(const QModelIndex &m);