/* vi: set sw=4 ts=4: * * Copyright (C) 2001 - 2007 Christian Hohnstaedt. * * All rights reserved. */ #include "load_obj.h" #include "pki_x509.h" #include "pki_key.h" #include "pki_x509req.h" #include "pki_pkcs7.h" #include "pki_pkcs12.h" #include "widgets/MainWindow.h" load_base::load_base() { filter = QObject::tr("All files ( *.* )"); caption = ""; } pki_base * load_base::loadItem(QString) { return NULL; } load_base::~load_base() { } /* Keys */ load_key::load_key() :load_base() { filter = QObject::tr("PKI Keys ( *.pem *.der *.key );;" "PKCS#8 Keys ( *.p8 *.pk8 );;") + filter; caption = QObject::tr("Import RSA key"); } pki_base * load_key::loadItem(QString s) { pki_key *lkey = new pki_key(); if (!lkey) return NULL; try { lkey->fload(s); } catch (errorEx &err){ delete lkey; throw err; } return lkey; }; /* Requests */ load_req::load_req() :load_base() { filter = QObject::tr("PKCS#10 CSR ( *.pem *.der *.csr );;" "Netscape Request ( *.spkac *.spc );;") + filter; caption = QObject::tr("Import Request"); } pki_base * load_req::loadItem(QString s) { pki_x509req *req = new pki_x509req(s); if (!req) return NULL; try { req->fload(s); } catch (errorEx &err){ delete req; throw err; } return req; }; /* Certificates */ load_cert::load_cert() :load_base() { filter = QObject::tr("Certificates ( *.pem *.der *.crt *.cer );;") + filter; caption = QObject::tr("Import X.509 Certificate"); } pki_base * load_cert::loadItem(QString s) { pki_x509 *crt = new pki_x509(s); if (!crt) return NULL; try { crt->fload(s); } catch (errorEx &err){ delete crt; throw err; } return crt; }; /* PKCS#7 Certificates */ load_pkcs7::load_pkcs7() :load_base() { filter = QObject::tr("PKCS#7 data ( *.p7s *.p7m *.p7b );;") + filter; caption = QObject::tr("Import PKCS#7 Certificates"); } pki_base * load_pkcs7::loadItem(QString s) { pki_pkcs7 *p7 = new pki_pkcs7(s); if (!p7) return NULL; try { p7->fload(s); } catch (errorEx &err){ delete p7; throw err; } return p7; }; /* PKCS#12 Certificates */ load_pkcs12::load_pkcs12() :load_base() { filter = QObject::tr("PKCS#12 Certificates ( *.p12 *.pfx );;") + filter; caption = QObject::tr("Import PKCS#12 Private Certificate"); } pki_base * load_pkcs12::loadItem(QString s) { pki_base *p12 = new pki_pkcs12(s, MainWindow::passRead); return p12; }; /* Templates */ load_temp::load_temp() :load_base() { filter = QObject::tr("XCA templates ( *.xca );;") + filter; caption = QObject::tr("Import XCA Templates"); } pki_base * load_temp::loadItem(QString s) { pki_temp *temp = new pki_temp(s); if (!temp) return NULL; try { temp->loadTemp(s); } catch (errorEx &err){ delete temp; throw err; } return temp; }; /* CRLs */ load_crl::load_crl() :load_base() { filter = QObject::tr("Revocation lists ( *.pem *.der *.crl );;") + filter; caption = QObject::tr("Import Certificate Revocation List"); } pki_base * load_crl::loadItem(QString s) { pki_crl *crl = new pki_crl(s); if (!crl) return NULL; try { crl->fload(s); } catch (errorEx &err){ delete crl; throw err; } return crl; }; /* Database */ load_db::load_db() :load_base() { filter = QObject::tr("XCA Databases ( *.xdb );;") + filter; caption = QObject::tr("Open XCA Database"); } /* General PEM loader */ static load_base *getload(QString text) { int pos; #define D5 "-----" pos = text.indexOf(D5 "BEGIN "); if (pos <0) return NULL; text = text.remove(0, pos + 11); if (text.startsWith(PEM_STRING_X509_OLD D5) || text.startsWith(PEM_STRING_X509 D5) || text.startsWith(PEM_STRING_X509_TRUSTED D5)) return new load_cert(); if (text.startsWith(PEM_STRING_PKCS7 D5)) return new load_pkcs7(); if (text.startsWith(PEM_STRING_X509_REQ_OLD D5) || text.startsWith(PEM_STRING_X509_REQ D5)) return new load_req(); if (text.startsWith(PEM_STRING_X509_CRL D5)) return new load_crl(); if (text.startsWith(PEM_STRING_EVP_PKEY D5) || text.startsWith(PEM_STRING_PUBLIC D5) || text.startsWith(PEM_STRING_RSA D5) || text.startsWith(PEM_STRING_RSA_PUBLIC D5) || text.startsWith(PEM_STRING_DSA D5) || text.startsWith(PEM_STRING_DSA_PUBLIC D5) || text.startsWith(PEM_STRING_PKCS8 D5) || text.startsWith(PEM_STRING_PKCS8INF D5)) return new load_key(); return NULL; } load_pem::load_pem() :load_base() { filter = QObject::tr("PEM files ( *.pem );;") + filter; caption = QObject::tr("Load PEM encoded file"); } pki_base * load_pem::loadItem(QString fname) { char buf[100]; int len; FILE * fp; QString text; pki_base *item = NULL; load_base *lb = NULL; try { fp = fopen(CCHAR(fname), "r"); if (!fp) throw errorEx(QObject::tr("File open error: ") + fname); len = fread(buf, 1, 99, fp); fclose(fp); if (len < 11) throw errorEx(QObject::tr("File corrupted: ") + fname); buf[len] = '\0'; text = buf; lb = getload(text); if (!lb) throw errorEx(QObject::tr("Unknown PEM file: ") + fname); item = lb->loadItem(fname); delete lb; } catch (errorEx &err) { MainWindow::Error(err); if (item) delete item; item = NULL; if (lb) delete lb; } return item; };