diff --git a/lib/pki_evp.cpp b/lib/pki_evp.cpp index 71bf6ee6..36c8cf0b 100644 --- a/lib/pki_evp.cpp +++ b/lib/pki_evp.cpp @@ -31,14 +31,12 @@ unsigned char *pki_evp::curve_flags = NULL; void pki_evp::erasePasswd() { - for (int i=0; i + + MainWindow - - + + 0 0 @@ -9,109 +10,102 @@ 511 - + MainWindow - - - + + + 6 - + 9 - - + + 0 - - + + Private Keys - - + + 6 - + 8 - + - - - + + + 0 0 - + QFrame::Box - + QFrame::Sunken - + - - + + &New Key - - + + &Export - - + + &Import - - + + Import PFX (PKCS#12) - - + + &Show Details - - + + &Delete - - - - Change password - - - - + Qt::Vertical - + QSizePolicy::Expanding - + 20 20 @@ -120,14 +114,14 @@ - - + + 200 94 - + true @@ -137,85 +131,85 @@ - - + + Certificate signing requests - - + + 6 - + 8 - + - - - + + + 0 0 - + QFrame::Box - + QFrame::Sunken - - + + 6 - + 8 - - + + &New Request - - + + &Export - - + + &Import - - + + &Show Details - - + + &Delete - + Qt::Vertical - + QSizePolicy::Expanding - + 20 20 @@ -224,14 +218,14 @@ - - + + 200 94 - + true @@ -241,100 +235,100 @@ - - + + Certificates - - + + 6 - + 8 - + - - + + QFrame::Box - + QFrame::Sunken - - + + 6 - + 11 - - + + &New Certificate - - + + &Export - - + + &Import - - + + &Show Details - - + + &Delete - - + + Import &PKCS#12 - - + + Import P&KCS#7 - - + + Plain View - + Qt::Vertical - + QSizePolicy::Expanding - + 20 20 @@ -343,14 +337,14 @@ - - + + 200 94 - + true @@ -360,83 +354,83 @@ - - + + Templates - - + + 6 - + 8 - - + + true - - + + QFrame::Box - + QFrame::Sunken - - + + 6 - + 11 - - + + &New template - - + + Ch&ange Template - - + + &Delete - - + + &Import - - + + &Export - + Qt::Vertical - + QSizePolicy::Expanding - + 20 20 @@ -445,14 +439,14 @@ - - + + 200 94 - + true @@ -462,72 +456,72 @@ - - + + Revocation lists - - + + 6 - + 9 - + - - + + QFrame::Box - + QFrame::Sunken - - + + 6 - + 9 - - + + &Export - - + + &Import - - + + &Show Details - - + + &Delete - + Qt::Vertical - + QSizePolicy::Expanding - + 20 20 @@ -536,14 +530,14 @@ - - + + 200 94 - + true diff --git a/widgets/MW_menu.cpp b/widgets/MW_menu.cpp index 014e24b8..50566fa8 100644 --- a/widgets/MW_menu.cpp +++ b/widgets/MW_menu.cpp @@ -25,22 +25,22 @@ void MainWindow::init_menu() QMenu *file, *help, *import; file = menuBar()->addMenu(tr("&File")); - file->addAction(tr("New &DataBase"), this, - SLOT(new_database()), Qt::CTRL+Qt::Key_N ); - file->addAction(tr("Open &DataBase"), this, - SLOT(load_database()), Qt::CTRL+Qt::Key_L ); + file->addAction(tr("&New DataBase"), this, SLOT(new_database())); + file->addAction(tr("&Open DataBase"), this, SLOT(load_database())); acList += file->addAction(tr("&Close DataBase"), this, - SLOT(close_database()), Qt::CTRL+Qt::Key_C ); + SLOT(close_database())); acList += file->addAction(tr("&Dump DataBase"), this, - SLOT(dump_database()), Qt::CTRL+Qt::Key_D ); + SLOT(dump_database())); + acList += file->addAction(tr("C&hange DataBase password"), this, + SLOT(changeDbPass())); acList += file->addAction(tr("&Import old db_dump"), this, - SLOT(import_dbdump()), Qt::CTRL+Qt::Key_I ); + SLOT(import_dbdump())); acList += file->addAction(tr("&Undelete items"), this, - SLOT(undelete()), Qt::CTRL+Qt::Key_U ); + SLOT(undelete())); file->addSeparator(); - acList += file->addAction(tr("Options"), this, SLOT(setOptions()) ); + acList += file->addAction(tr("Options"), this, SLOT(setOptions())); file->addSeparator(); - file->addAction(tr("E&xit"), qApp, SLOT(quit()), Qt::ALT+Qt::Key_F4 ); + file->addAction(tr("Exit"), qApp, SLOT(quit()), Qt::ALT+Qt::Key_F4); import = menuBar()->addMenu(tr("I&mport")); import->addAction(tr("Keys"), this, diff --git a/widgets/MainWindow.cpp b/widgets/MainWindow.cpp index 0c9ab5e4..c33c2cb8 100644 --- a/widgets/MainWindow.cpp +++ b/widgets/MainWindow.cpp @@ -162,9 +162,6 @@ MainWindow::MainWindow(QWidget *parent ) init_curves(); - // FIXME: Change pass isn't functional yet. - BNchangePass->setDisabled(true); - #ifdef MDEBUG CRYPTO_malloc_debug_init(); CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); @@ -450,6 +447,113 @@ QString makeSalt(void) return QString(saltbuf); } +void MainWindow::changeDbPass() +{ + + char pass[MAX_PASS_LENGTH]; + int keylen; + + pass_info p(tr("New Password"), tr("Please enter the new password " + "to encrypt your private keys in the database-file"), + this); + + keylen = passWrite(pass, MAX_PASS_LENGTH-1, 0, &p); + if (keylen < 0) + return; + memset(pass +keylen, 0, MAX_PASS_LENGTH -keylen); + + QString tempn = dbfile + "{new}"; + try { + if (!QFile::copy(dbfile, tempn)) + throw errorEx("Could not create temporary file: " + + tempn); + QString passhash = updateDbPassword(tempn, pass); + + QFile new_file(tempn); + db mydb(dbfile); + mydb.mv(new_file); + close_database(); + pki_evp::passHash = passhash; + memcpy(pki_evp::passwd, pass, MAX_PASS_LENGTH); + init_database(); + } catch (errorEx &ex) { + QFile::remove(tempn); + Error(ex); + } +} + +QString MainWindow::updateDbPassword(QString newdb, char *pass) +{ + db mydb(newdb); + + QString salt = makeSalt(); + QString passhash = pki_evp::sha512passwd(pass, salt); + mydb.set((const unsigned char *)CCHAR(passhash), + passhash.length()+1, 1, setting, "pwhash"); + + QList klist; + mydb.first(); + while (mydb.find(asym_key, QString()) == 0) { + QString s; + pki_evp *key; + unsigned char *p; + db_header_t head; + + p = mydb.load(&head); + if (!p) { + printf("Load was empty !\n"); + goto next; + } + key = new pki_evp(); + if (key->getVersion() < head.version) { + printf("Item[%s]: Version %d " + "> known version: %d -> ignored\n", + head.name, head.version, + key->getVersion() + ); + free(p); + delete key; + goto next; + } + key->setIntName(QString::fromUtf8(head.name)); + + try { + key->fromData(p, &head); + } + catch (errorEx &err) { + err.appendString(key->getIntName()); + Error(err); + delete key; + key = NULL; + } + free(p); + if (key && key->getOwnPass() == pki_key::ptCommon && + !key->isPubKey()) + { + EVP_PKEY *evp = key->decryptKey(); + key->set_evp_key(evp); + key->encryptKey(pass); + klist << key; + } else if (key) + delete key; +next: + if (mydb.next()) + break; + } + for (int i=0; i< klist.count(); i++) { + int size; + unsigned char *p; + pki_evp *key = klist[i]; + p = key->toData(&size); + check_oom(p); + mydb.set(p, size, key->getVersion(), + key->getType(), key->getIntName()); + OPENSSL_free(p); + delete key; + } + return passhash; +} + int MainWindow::initPass() { db mydb(dbfile); diff --git a/widgets/MainWindow.h b/widgets/MainWindow.h index 7843dff6..97c12d9b 100644 --- a/widgets/MainWindow.h +++ b/widgets/MainWindow.h @@ -78,6 +78,7 @@ class MainWindow: public QMainWindow, public Ui::MainWindow void setPath(QString path); bool mkDir(QString dir); void setItemEnabled(bool enable); + QString updateDbPassword(QString newdb, char *pass); public slots: void init_database(); @@ -93,6 +94,7 @@ class MainWindow: public QMainWindow, public Ui::MainWindow void undelete(); void loadPem(); void pastePem(); + void changeDbPass(); private slots: void setOptions();