diff --git a/MainWindow.cpp b/MainWindow.cpp index c7991f96..fbc3f165 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -16,14 +16,14 @@ MainWindow::MainWindow(QWidget *parent, const char *name) if (!d.mkdir(baseDir)) cerr << "Couldnt create: " << baseDir.latin1() << "\n"; } - QString dbfile = baseDir + "/xca.db"; - keys = new db_key(dbenv, dbfile.latin1(), "keydb", keyList); - reqs = new db_x509req(dbenv, dbfile.latin1(), "reqdb", reqList); - certs = new db_x509(dbenv, dbfile.latin1(), "certdb", certList); + dbfile = baseDir + "/xca.db"; ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); - - + loadSettings(); + initPass(); + keys = new db_key(dbenv, dbfile.latin1(), "keydb", keyList, passwd); + reqs = new db_x509req(dbenv, dbfile.latin1(), "reqdb", reqList); + certs = new db_x509(dbenv, dbfile.latin1(), "certdb", certList); }; @@ -36,8 +36,79 @@ MainWindow::~MainWindow() delete(certs); } +void MainWindow::loadSettings() +{ + int x; + Dbc *cursor; + Db *data = new Db(dbenv, 0); + Dbt *k = new Dbt(); + Dbt *d = new Dbt(); + if ((x = data->open(dbfile.latin1(), "settings", DB_BTREE, DB_CREATE, 0600))) + data->err(x,"DB open"); + if ((x = data->cursor(NULL, &cursor, 0))) + data->err(x,"DB new Cursor"); + cerr <<"laden" <get(k, d, DB_NEXT)) { + cerr << "in Whileload: "<< endl; + if (x) data->err(x,"DB Error get"); + else { + settings.insert((char *)k->get_data(), (char *)d->get_data()); + } + } + cerr <<"pwhash " << settings["pwhash"] <close(0); + delete(d); + delete(k); + delete(data); +} -// Static Password Callback functions +void MainWindow::saveSettings() +{ + int x; + Dbc *cursor; + Db *data = new Db(dbenv, 0); + if ((x = data->open(dbfile.latin1(), "settings", DB_BTREE, DB_CREATE, 0600))) + data->err(x,"DB open"); + if ((x = data->cursor(NULL, &cursor, 0))) + data->err(x,"DB new Cursor"); + QAsciiDictIterator it(settings); + for ( ; it.current(); ++it ) { + cerr << "in save: "<< it.current() << endl; + Dbt k( (void *)it.currentKey(), strlen(it.currentKey()) +1 ); + Dbt d( (void *)it.current(), strlen(it.current()) +1 ); + cerr << it.currentKey() << " -- " << it.current() <put(NULL, &k, &d, 0); + if (x) data->err(x,"DB Error put"); + } + data->close(0); + delete(data); +} + +void MainWindow::initPass() +{ + if (!settings["pwhash"]) { + int keylen = passWrite(passwd, sizeof(passwd), 0, NULL); + if (keylen == 0) { + qFatal("Ohne Passwort laeuft hier gaaarnix :-)"); + } + passwd[keylen]='\0'; + settings.insert( "pwhash", passwd ); + settings.insert( "meier", "aaaa"); + settings.insert( "mueller", "bbbbb"); + saveSettings(); + } + else { + while (strncmp(passwd, settings["pwhash"], sizeof(passwd))) { + int keylen = passRead(passwd, sizeof(passwd), 0, NULL); + if (keylen == 0) { + qFatal("Ohne Passwort laeuft hier gaaarnix :-)"); + } + passwd[keylen]='\0'; + cerr << passwd << " - " << settings["pwhash"] << endl; + } + } +} + // Static Password Callback functions int MainWindow::passRead(char *buf, int size, int rwflag, void *userdata) { diff --git a/MainWindow.h b/MainWindow.h index 3eaa99e0..5bd6b6be 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include #include @@ -27,6 +27,7 @@ #include #include #include +#include #include #ifndef MAINWINDOW_H @@ -43,11 +44,16 @@ class MainWindow: public MainWindow_UI db_x509req *reqs; db_key *keys; DbEnv *dbenv; + char passwd[30]; public: - QString baseDir; + QAsciiDict settings; + QString baseDir, dbfile; static const int sizeList[]; MainWindow(QWidget *parent, const char *name); ~MainWindow(); + void loadSettings(); + void saveSettings(); + void initPass(); void showDetailsKey(pki_key *key); static int passRead(char *buf, int size, int rwflag, void *userdata); static int passWrite(char *buf, int size, int rwflag, void *userdata); diff --git a/MainWindow.ui b/MainWindow.ui index 15358533..038a4b3a 100644 --- a/MainWindow.ui +++ b/MainWindow.ui @@ -11,7 +11,7 @@ 0 0 - 607 + 599 533 @@ -237,7 +237,21 @@ - QListBox + QListView + + + text + Schlüssel + + + clickable + true + + + resizeable + true + + name keyList @@ -245,9 +259,9 @@ geometry - 20 + 10 20 - 280 + 290 390 @@ -412,7 +426,21 @@ - QListBox + QListView + + + text + Anfragen + + + clickable + true + + + resizeable + true + + name reqList @@ -420,9 +448,9 @@ geometry - 20 + 10 20 - 280 + 290 390 @@ -587,7 +615,21 @@ - QListBox + QListView + + + text + Zertifikate + + + clickable + true + + + resizeable + true + + name certList @@ -595,9 +637,9 @@ geometry - 20 + 10 20 - 280 + 290 390 @@ -771,12 +813,6 @@ MainWindow_UI showDetailsKey() - - keyList - doubleClicked(QListBoxItem*) - MainWindow_UI - showDetailsKey() - PushButton13 clicked() @@ -789,12 +825,6 @@ MainWindow_UI showDetailsReq() - - reqList - doubleClicked(QListBoxItem*) - MainWindow_UI - showDetailsReq() - PushButton26 clicked() @@ -861,12 +891,6 @@ MainWindow_UI deleteKey() - - certList - doubleClicked(QListBoxItem*) - MainWindow_UI - showDetailsCert() - deleteCert() deleteKey() deleteReq() diff --git a/Makefile b/Makefile index 23386fe7..7e77d67b 100644 --- a/Makefile +++ b/Makefile @@ -5,17 +5,28 @@ TARGET=xca-$(VERSION) PREFIX=/usr/X11R6 GCC=g++ CFLAGS=-Wall -g -QTDIR=$(shell ./configure) -QTDIR=/usr/lib/qt -DEBQT=/usr/include/qt -export INC=-I$(QTDIR)/include -I$(DEBQT) +########################### +# LFS + +QTDIR=/usr/lib/qt +export INC=-I$(QTDIR)/include LPATH=-L$(QTDIR)/lib -Llib LIBS=-lqt -lcrypto -ldb_cxx -lxcadb -lpki - MOC=$(QTDIR)/bin/moc UIC=$(QTDIR)/bin/uic +########################### +# debian woody + +#export INC=-I/usr/include/qt +#LPATH=-Llib +#LIBS=-lqt -lcrypto -ldb3_cxx -lxcadb -lpki +#MOC=/usr/bin/moc +#UIC=/usr/bin/uic + +################################### + OBJS=NewKey_UI.o NewKey_UI_MOC.o \ KeyDetail_UI.o KeyDetail_UI_MOC.o \ ReqDetail_UI.o ReqDetail_UI_MOC.o \ diff --git a/lib/db_base.cpp b/lib/db_base.cpp index 621c5b1e..2b492197 100644 --- a/lib/db_base.cpp +++ b/lib/db_base.cpp @@ -1,7 +1,7 @@ #include "db_base.h" -db_base::db_base(DbEnv *dbe, string DBfile, string DB, QListBox *l) +db_base::db_base(DbEnv *dbe, string DBfile, string DB, QListView *l) { listView = l; dbenv = dbe; @@ -10,6 +10,7 @@ db_base::db_base(DbEnv *dbe, string DBfile, string DB, QListBox *l) int x; if (( x = data->open(DBfile.c_str(), DB.c_str(), DB_BTREE, DB_CREATE, 0600))) data->err(x,"DB open"); + passwd = NULL; } @@ -28,15 +29,19 @@ void db_base::loadContainer() Dbt *d = new Dbt(); string desc; pki_base *pki; + container.clear(); while (!cursor->get(k, d, DB_NEXT)) { desc = (char *)k->get_data(); p = (unsigned char *)d->get_data(); int size = d->get_size(); pki = newPKI(); - pki->fromData(p, size); + if (pki == NULL) continue; cerr << desc.c_str() << endl; - pki->setDescription(desc); - container.append(pki); + if (pki->fromData(passwd, p, size)) { + pki->setDescription(desc); + container.append(pki); + } + else delete(pki); } delete (k); delete (d); @@ -47,8 +52,11 @@ bool db_base::updateView() { listView->clear(); pki_base *pki; - for ( pki = container.first(); pki != 0; pki = container.next() ) { - listView->insertItem(pki->getDescription().c_str()); + if (container.isEmpty()) return false; + QListIterator it(container); + for ( ; it.current(); ++it ) { + pki = it.current(); + listView->insertItem(new QListViewItem(listView, pki->getDescription().c_str())); } return true; } @@ -61,7 +69,7 @@ bool db_base::insertPKI(pki_base *pki) int size=0; char field[10]; unsigned char *p; - p = pki->toData(&size); + p = pki->toData(passwd, &size); int cnt=0; int x = DB_KEYEXIST; while (x == DB_KEYEXIST) { @@ -93,15 +101,20 @@ bool db_base::deletePKI(pki_base *pki) string desc = pki->getDescription(); Dbt k((void *)desc.c_str(), desc.length() + 1); int x = data->del(NULL, &k, 0); - updateView(); if (x){ data->err(x,"DB Error del"); return false; } - container.remove(pki); + remFromCont(pki); + updateView(); return true; } +void db_base::remFromCont(pki_base *pki) +{ + container.remove(pki); +} + bool db_base::updatePKI(pki_base *pki, string desc) { if (deletePKI(pki)){ @@ -116,15 +129,20 @@ pki_base *db_base::getSelectedPKI(string desc) { if (desc == "" ) return NULL; pki_base *pki; - for ( pki = container.first(); pki != 0; pki = container.next() ) + QListIterator it(container); + for ( ; it.current(); ++it ) { + pki = it.current(); if (pki->getDescription() == desc) return pki; + } } pki_base *db_base::getSelectedPKI() { const char *tp; string desc = ""; - if ((tp = listView->currentText().latin1())) desc = tp; + QListViewItem *lvi; + if ((lvi = listView->selectedItem()) == NULL) return NULL; + if ((tp = lvi->text(0).latin1())) desc = tp; cerr << "desc = '"< it(container); + for ( ; it.current(); ++it ) { + pki = it.current(); if (refpki->compare(pki)) return pki; + } return NULL; } diff --git a/lib/db_base.h b/lib/db_base.h index 49c61f25..dcbca6a9 100644 --- a/lib/db_base.h +++ b/lib/db_base.h @@ -1,5 +1,5 @@ #include -#include +#include #include #include "pki_base.h" @@ -12,10 +12,11 @@ class db_base protected: Db *data; DbEnv *dbenv; - QListBox *listView; + QListView *listView; QList container; + char *passwd; public: - db_base(DbEnv *dbe, string DBfile, string db, QListBox *l); + db_base(DbEnv *dbe, string DBfile, string db, QListView *l); virtual ~db_base(); virtual pki_base *newPKI(){ cerr<<"VIRTUAL CALLED: newPKI\n"; return NULL;} @@ -27,6 +28,7 @@ class db_base pki_base *getSelectedPKI(); pki_base *findPKI(pki_base *refpki); virtual void loadContainer(); + virtual void remFromCont(pki_base *pki); }; #endif diff --git a/lib/db_key.cpp b/lib/db_key.cpp index 4edf2e11..d7e72ba4 100644 --- a/lib/db_key.cpp +++ b/lib/db_key.cpp @@ -1,9 +1,10 @@ #include "db_key.h" -db_key::db_key(DbEnv *dbe, string DBfile, string DB, QListBox *l) +db_key::db_key(DbEnv *dbe, string DBfile, string DB, QListView *l, char *pass) :db_base(dbe, DBfile, DB, l) { + passwd = pass; loadContainer(); updateView(); } diff --git a/lib/db_key.h b/lib/db_key.h index d52c202a..bc5b56c9 100644 --- a/lib/db_key.h +++ b/lib/db_key.h @@ -10,7 +10,7 @@ class db_key: public db_base { public: - db_key(DbEnv *dbe, string DBfile, string DB, QListBox *l); + db_key(DbEnv *dbe, string DBfile, string DB, QListView *l, char * pass); pki_base *newPKI(); QStringList getPrivateDesc(); }; diff --git a/lib/db_x509.cpp b/lib/db_x509.cpp index 3a13ec0b..e2bc7a61 100644 --- a/lib/db_x509.cpp +++ b/lib/db_x509.cpp @@ -1,7 +1,7 @@ #include "db_x509.h" -db_x509::db_x509(DbEnv *dbe, string DBfile, string DB, QListBox *l) +db_x509::db_x509(DbEnv *dbe, string DBfile, string DB, QListView *l) :db_base(dbe, DBfile, DB, l) { loadContainer(); @@ -14,55 +14,77 @@ pki_base *db_x509::newPKI(){ pki_x509 *db_x509::findsigner(pki_x509 *client) { - unsigned char *p; - Dbc *cursor; - if (int x = data->cursor(NULL, &cursor, 0)) - data->err(x,"DB new Cursor"); - Dbt *k = new Dbt(); - Dbt *d = new Dbt(); - string desc; - pki_x509 *signer; - while (!cursor->get(k, d, DB_NEXT)) { - desc = (char *)k->get_data(); - p = (unsigned char *)d->get_data(); - int size = d->get_size(); - signer = (pki_x509 *)newPKI(); - signer->fromData(p, size); - cerr << "verifying " << signer->getDescription().c_str() << endl; - signer->setDescription(desc); + pki_x509 *signer; + if ((signer = client->getSigner()) != NULL) return signer; + QListIterator it(container); + for ( ; it.current(); ++it ) { + signer = (pki_x509 *)it.current(); if (client->verify(signer)) { - delete (k); - delete (d); + cerr << "SIGNER found" <clear(); - Dbc *cursor; - if (int x = data->cursor(NULL, &cursor, 0)) - data->err(x,"DB new Cursor"); - Dbt *key = new Dbt(); - Dbt *data = new Dbt(); - pki_x509 *client; - QString desc; - while (!cursor->get(key, data, DB_NEXT)) { - desc = (char *)key->get_data(); - p = (unsigned char *)d->get_data(); - int size = d->get_size(); - client = (pki_x509 *)newPKI(); - client->fromData(p, size); - signer = findsigner(client); - - listView->insertItem(desc); - } + listView->clear(); + listView->setRootIsDecorated(true); + pki_x509 *pki; + pki_x509 *signer; + QListViewItem *parentitem; + QListViewItem *current; + cerr <<"myupdate"< mycont = container; + for ( pki = (pki_x509 *)container.first(); pki != NULL; pki = (pki_x509 *)container.next() ) pki->delPointer(); + int f=0; + while (! mycont.isEmpty() ) { + cerr << "-----------------------------------------------------------------Round "<< f++ < it(mycont); + for ( ; it.current(); ++it ) { + pki = (pki_x509 *)it.current(); + parentitem = NULL; + signer = findsigner(pki); + cerr << "ARound "<< pki <<" - "<< signer << endl; + if ((signer != pki) && (signer != NULL)) // foreign signed + parentitem = (QListViewItem *)signer->getPointer(); + if (signer == NULL); // do something for unknown signers... + if (((parentitem != NULL) || (signer == pki) || (signer == NULL)) && (pki->getPointer() == 0 )) { + // create the listview item + if (parentitem != NULL) { + current = new QListViewItem(parentitem, pki->getDescription().c_str()); + cerr<< "Adding as client: "<getDescription().c_str()<getDescription().c_str()); + cerr<< "Adding as parent: "<getDescription().c_str()<setPointer(current); + mycont.remove(pki); + it.toFirst(); + listView->setOpen(current, true); + cerr << "CRound " < it(container); + for ( ; it.current(); ++it ) { + pkiit = (pki_x509 *)it.current(); + if (pkiit->getSigner()==pki) { + pkiit->delSigner(); + return; + } + } + return; +} diff --git a/lib/db_x509.h b/lib/db_x509.h index da5b6478..b85a93c8 100644 --- a/lib/db_x509.h +++ b/lib/db_x509.h @@ -1,3 +1,4 @@ +#include #include #include "db_base.h" #include "pki_x509.h" @@ -9,9 +10,11 @@ class db_x509: public db_base { public: - db_x509(DbEnv *dbe, string DBfile, string DB, QListBox *l); + db_x509(DbEnv *dbe, string DBfile, string DB, QListView *l); pki_base *newPKI(); pki_x509 *findsigner(pki_x509 *client); + bool updateView(); + void remFromCont(pki_base *pki); }; #endif diff --git a/lib/db_x509req.cpp b/lib/db_x509req.cpp index cbef1846..a0739597 100644 --- a/lib/db_x509req.cpp +++ b/lib/db_x509req.cpp @@ -1,7 +1,7 @@ #include "db_x509req.h" -db_x509req::db_x509req(DbEnv *dbe, string DBfile, string DB, QListBox *l) +db_x509req::db_x509req(DbEnv *dbe, string DBfile, string DB, QListView *l) :db_base(dbe, DBfile, DB, l) { loadContainer(); @@ -14,35 +14,18 @@ pki_base *db_x509req::newPKI(){ QStringList db_x509req::gethasPrivateDesc(db_base *keydb) { - unsigned char *p; - Dbc *cursor; - if (int x = data->cursor(NULL, &cursor, 0)) - data->err(x,"DB new Cursor"); - Dbt *k = new Dbt(); - Dbt *d = new Dbt(); - string desc; - QStringList x; + pki_x509req *pki; pki_key *key, *refkey; - pki_x509req *req = (pki_x509req *)newPKI(); - //cerr << "before While loop\n"; - while (!cursor->get(k, d, DB_NEXT)) { - //cerr << "in loop\n"; - desc = (char *)k->get_data(); - p = (unsigned char *)d->get_data(); - int size = d->get_size(); - req->fromData(p, size); - key = req->getKey(); + QStringList x; + if ( container.isEmpty() ) return x; + for ( pki = (pki_x509req *)container.first(); pki != 0; pki = (pki_x509req *)container.next() ) { + key = pki->getKey(); if ((refkey = (pki_key *)keydb->findPKI(key))!= NULL) { if (refkey->isPrivKey()){ - x.append(desc.data()); - cerr << desc <getDescription().c_str()); + cerr << "found" <type == EVP_PKEY_RSA) { - rsakey = d2i_RSAPrivateKey(NULL, &p, size); + rsakey = d2i_RSAPrivateKey(NULL, &pdec, decsize); if (openssl_error()) { - rsakey = d2i_RSA_PUBKEY(NULL, &sik, size); + rsakey = d2i_RSA_PUBKEY(NULL, &sik, decsize); } - openssl_error(); + if (openssl_error()) return false; if (rsakey) EVP_PKEY_set1_RSA(key, rsakey); } - OPENSSL_free(sik); + OPENSSL_free(sik1); + OPENSSL_free(pdec1); + return true; } -unsigned char *pki_key::toData(int *size) +unsigned char *pki_key::toData(char *passwd, int *size) { cerr << "KEY toData " << getDescription()<< endl; - unsigned char *p = NULL , *p1; + unsigned char *p, *p1, *penc; + int outl, encsize=0; + EVP_CIPHER_CTX ctx; + + EVP_CIPHER_CTX_init (&ctx); + EVP_EncryptInit( &ctx, EVP_des_ede3_cbc(),(unsigned char *)passwd , NULL); if (key->type == EVP_PKEY_RSA) { if (isPubKey()) { *size = i2d_RSA_PUBKEY(key->pkey.rsa, NULL); cerr << "Sizeofpubkey: " << *size <pkey.rsa, &p1); - openssl_error(); + EVP_EncryptUpdate( &ctx, penc, &outl, p, *size ); + encsize = outl; + openssl_error(); + } else { *size = i2d_RSAPrivateKey(key->pkey.rsa, NULL); cerr << "Sizeofprivkey: " << *size <pkey.rsa, &p1); + EVP_EncryptUpdate( &ctx, penc, &outl, p, *size ); + encsize = outl; openssl_error(); } } - cerr << "KEY toData end ...\n"; - return p; + EVP_EncryptFinal( &ctx, penc + encsize, &outl ); + encsize += outl; + OPENSSL_free(p); + + cerr << "KEY toData end ..."<< encsize << "--"<<*size <cert); - int i = X509_verify(cert,pkey); - EVP_PKEY_free(pkey); - openssl_error(); - if (i>0) return true; - return false; + if (psigner == signer) return true; + if (psigner != NULL) return false; + if (getDNi(NID_commonName) != signer->getDNs(NID_commonName)) { + return false; + } + EVP_PKEY *pkey = X509_get_pubkey(signer->cert); + int i = X509_verify(cert,pkey); + openssl_error(); + if (i>0) { + cerr << "psigner set for: " << getDescription().c_str() << endl; + psigner = signer; + return true; + } + return false; } pki_key *pki_x509::getKey() { - EVP_PKEY *pkey = X509_get_pubkey(cert); - pki_key *key = new pki_key(pkey); - return key; + EVP_PKEY *pkey = X509_get_pubkey(cert); + pki_key *key = new pki_key(pkey); + return key; } + +pki_x509 *pki_x509::getSigner() +{ + cerr << "getSigner..." << psigner << endl; + return (psigner); +} + +void pki_x509::delSigner() +{ + cerr << "delSigner..." << psigner << endl; + psigner=NULL; +} + diff --git a/lib/pki_x509.h b/lib/pki_x509.h index 3cb48503..f5cc5cd7 100644 --- a/lib/pki_x509.h +++ b/lib/pki_x509.h @@ -9,9 +9,9 @@ class pki_x509 : public pki_base { - pki_x509 *parent; // the signer bool trust; X509 *cert; + pki_x509 *psigner; public: pki_x509(pki_key *key, const string cn, const string c, const string l, @@ -20,8 +20,8 @@ class pki_x509 : public pki_base const string d, int days=365); pki_x509(); pki_x509(const string fname); - virtual void fromData(unsigned char *p, int size); - virtual unsigned char *toData(int *size); + virtual bool fromData(char *passwd, unsigned char *p, int size); + virtual unsigned char *toData(char *passwd, int *size); virtual bool compare(pki_base *refcert); string getDNs(int nid); string getDNi(int nid); @@ -30,6 +30,8 @@ class pki_x509 : public pki_base pki_key *getKey(); string notAfter(); string notBefore(); + pki_x509 *getSigner(); + void pki_x509::delSigner(); }; #endif diff --git a/lib/pki_x509req.cpp b/lib/pki_x509req.cpp index a00d78b6..12889506 100644 --- a/lib/pki_x509req.cpp +++ b/lib/pki_x509req.cpp @@ -74,10 +74,11 @@ pki_x509req::pki_x509req(const string fname) } -void pki_x509req::fromData(unsigned char *p, int size) +bool pki_x509req::fromData(char *passwd, unsigned char *p, int size) { request = d2i_X509_REQ(NULL, &p, size); - openssl_error(); + if (openssl_error()) return false; + return true; } @@ -92,7 +93,7 @@ string pki_x509req::getDN(int nid) } -unsigned char *pki_x509req::toData(int *size) +unsigned char *pki_x509req::toData(char *passwd, int *size) { unsigned char *p, *p1; *size = i2d_X509_REQ(request, NULL); @@ -147,8 +148,6 @@ int pki_x509req::verify() pki_key *pki_x509req::getKey() { EVP_PKEY *pkey = X509_REQ_get_pubkey(request); - pki_key *key = new pki_key(""); - key->key=pkey; - key->onlyPubKey=true; + pki_key *key = new pki_key(pkey); return key; } diff --git a/lib/pki_x509req.h b/lib/pki_x509req.h index e08d18fd..fc3aca58 100644 --- a/lib/pki_x509req.h +++ b/lib/pki_x509req.h @@ -17,8 +17,8 @@ class pki_x509req : public pki_base const string d); pki_x509req(); pki_x509req(const string fname); - virtual void fromData(unsigned char *p, int size); - virtual unsigned char *toData(int *size); + virtual bool fromData(char *passwd, unsigned char *p, int size); + virtual unsigned char *toData(char *passwd, int *size); virtual bool compare(pki_base *refreq); string getDN(int nid); void writeReq(const string fname, bool PEM);