start certificate export to templates

This commit is contained in:
Christian Hohnstaedt 2009-12-03 23:32:23 +01:00 committed by Christian Hohnstaedt
parent dcab379554
commit b5667920bd
8 changed files with 138 additions and 19 deletions

View File

@ -581,6 +581,7 @@ void db_x509::showContextMenu(QContextMenuEvent *e, const QModelIndex &index)
this, SLOT(toRequest()));
itemScard = subExport->addAction(tr("Smart Card"),
this, SLOT(toScard()));
subExport->addAction(tr("Template"), this, SLOT(toTemplate()));
menu->addAction(tr("Delete"), this, SLOT(delete_ask()));
itemTrust = menu->addAction(tr("Trust"), this, SLOT(setTrust()));
@ -1020,9 +1021,10 @@ void db_x509::toRequest()
try {
pki_x509req *req = new pki_x509req();
check_oom(req);
req->setIntName(cert->getIntName());
req->createReq(cert->getRefKey(), cert->getSubject(),
cert->getRefKey()->getDefaultMD(), cert->getExt());
cert->getRefKey()->getDefaultMD(), cert->getV3ext());
mainwin->reqs->insert(req);
}
catch (errorEx &err) {
@ -1042,6 +1044,24 @@ void db_x509::toScard()
}
}
void db_x509::toTemplate()
{
pki_x509 *cert = static_cast<pki_x509*>(currentIdx.internalPointer());
if (!cert)
return;
try {
pki_temp *temp = new pki_temp();
check_oom(temp);
temp->setIntName(cert->getIntName());
temp->fromCert(cert);
mainwin->temps->insert(temp);
}
catch (errorEx &err) {
mainwin->Error(err);
}
}
void db_x509::caProperties()
{
Ui::CaProperties ui;

View File

@ -67,6 +67,7 @@ class db_x509: public db_x509super
void caProperties();
void toRequest();
void toScard();
void toTemplate();
void newCert(pki_temp *);
void newCert(pki_x509req *);
void loadPKCS12();

View File

@ -89,6 +89,48 @@ pki_temp::pki_temp(const QString d)
noWellDefined=false;
}
static QString extVtoString(extList &el, int nid)
{
int i = el.idxByNid(nid);
if (i != -1) {
QStringList sl = el[i].i2v();
printf("extVtoString: %d '%s'\n", nid, CCHAR(sl.join(", ")));
el.removeAt(i);
return sl.join(", ");
}
return QString();
}
static QString extToString(extList &el, int nid)
{
int i = el.idxByNid(nid);
if (i != -1) {
QString s = el[i].i2s();
printf("extToString: %d '%s'\n", nid, CCHAR(s));
el.removeAt(i);
return s;
}
return QString();
}
void pki_temp::fromCert(pki_x509 *cert)
{
extList el = cert->getV3ext();
xname = cert->getSubject();
subAltName = extVtoString(el, NID_subject_alt_name);
issAltName = extVtoString(el, NID_issuer_alt_name);
crlDist = extVtoString(el, NID_crl_distribution_points);
authInfAcc = extVtoString(el, NID_info_access);
nsComment = extToString(el, NID_netscape_comment);
nsBaseUrl = extToString(el, NID_netscape_base_url);
nsRevocationUrl = extToString(el, NID_netscape_revocation_url);
nsCARevocationUrl = extToString(el, NID_netscape_ca_revocation_url);
nsRenewalUrl = extToString(el, NID_netscape_renewal_url);
nsCaPolicyUrl = extToString(el, NID_netscape_ca_policy_url);
nsSslServerName = extToString(el, NID_netscape_ssl_server_name);
}
void pki_temp::fromData(const unsigned char *p, db_header_t *head )
{
@ -257,7 +299,6 @@ pki_temp::~pki_temp()
}
int pki_temp::dataSize()
{
int s = 9 * sizeof(int) + 9 * sizeof(char) +
@ -279,7 +320,6 @@ int pki_temp::dataSize()
return s;
}
bool pki_temp::compare(pki_base *)
{
// we don't care if templates with identical contents

View File

@ -11,6 +11,7 @@
#include "pki_base.h"
#include "x509name.h"
#include "asn1time.h"
#include "pki_x509.h"
class pki_temp: public pki_base
{
@ -29,6 +30,7 @@ class pki_temp: public pki_base
int validN, validM;
// methods
void fromCert(pki_x509 *cert);
pki_temp(const pki_temp *pk);
pki_temp(const QString d = QString());

View File

@ -558,21 +558,12 @@ extList pki_x509::getV3ext()
x509v3ext pki_x509::getExtByNid(int nid)
{
extList el = getExt();
x509v3ext e;
extList el = getV3ext();
int i = el.idxByNid(nid);
for (int i=0; i< el.count(); i++){
if (el[i].nid() == nid) return el[i];
}
return e;
}
extList pki_x509::getExt()
{
extList el;
el.setStack(cert->cert_info->extensions);
return el;
if (i == -1)
return x509v3ext();
return el[i];
}
pki_x509 *pki_x509::getSigner()
@ -606,7 +597,6 @@ void pki_x509::setEffTrust(int t)
efftrust = t;
}
bool pki_x509::isRevoked()
{
return isrevoked ;

View File

@ -103,7 +103,6 @@ class pki_x509 : public pki_x509super
QString getSigAlg();
x509v3ext getExtByNid(int nid);
const EVP_MD *getDigest();
extList getExt();
QVariant column_data(int col);
QVariant getIcon(int column);
};

View File

@ -111,6 +111,70 @@ QString x509v3ext::getValue() const
return text;
}
static void *ext_str_new(X509_EXTENSION *ext)
{
const X509V3_EXT_METHOD *method = X509V3_EXT_get(ext);
const unsigned char *p = ext->value->data;
void *ext_str;
if(method->it)
ext_str = ASN1_item_d2i(NULL, &p, ext->value->length, ASN1_ITEM_ptr(method->it));
else
ext_str = method->d2i(NULL, &p, ext->value->length);
return ext_str;
}
static void ext_str_free(X509_EXTENSION *ext, void *ext_str)
{
const X509V3_EXT_METHOD *method = X509V3_EXT_get(ext);
if (method->it)
ASN1_item_free((ASN1_VALUE*)ext_str,ASN1_ITEM_ptr(method->it));
else
method->ext_free(ext_str);
}
QString x509v3ext::i2s()
{
QString str;
X509V3_EXT_METHOD *method = X509V3_EXT_get(ext);
void *ext_str = ext_str_new(ext);
if (!ext_str)
return str;
if (method->i2s)
str = QString(method->i2s(method, ext_str));
ext_str_free(ext, ext_str);
return str;
}
QStringList x509v3ext::i2v()
{
X509V3_EXT_METHOD *method = X509V3_EXT_get(ext);
void *ext_str = ext_str_new(ext);
QStringList sl;
if (!ext_str)
return sl;
if (method->i2v) {
STACK_OF(CONF_VALUE) *val = method->i2v(method, ext_str, NULL);
for (int i = 0; i < sk_CONF_VALUE_num(val); i++) {
CONF_VALUE *nval = sk_CONF_VALUE_value(val, i);
if (!nval->name)
sl << QString(nval->value);
else if (!nval->value)
sl << QString(nval->name);
else
sl << QString("%1:%2").arg(nval->name).arg(nval->value);
}
sk_CONF_VALUE_pop_free(val, X509V3_conf_free);
}
ext_str_free(ext, ext_str);
return sl;
}
QString x509v3ext::getHtml() const
{
QString html;

View File

@ -11,6 +11,7 @@
#include <qlist.h>
#include <openssl/x509.h>
#include <openssl/x509v3.h>
#include <qstringlist.h>
class QString;
@ -35,6 +36,8 @@ class x509v3ext
bool isValid() const;
int nid() const;
void *d2i();
QString i2s();
QStringList i2v();
};
class extList : public QList<x509v3ext>