diff --git a/lib/pki_x509.cpp b/lib/pki_x509.cpp index 10de8728..d4a9c2a2 100644 --- a/lib/pki_x509.cpp +++ b/lib/pki_x509.cpp @@ -749,7 +749,11 @@ x509v3ext pki_x509::getExtByNid(int nid) extList el = getV3ext(); int i = el.idxByNid(nid); - pki_openssl_error(); + try { + pki_openssl_error(); + } catch(errorEx &err) { + XCA_WARN(err.getString()); + } if (i == -1) return x509v3ext(); return el[i]; diff --git a/lib/x509v3ext.cpp b/lib/x509v3ext.cpp index 62a1f83e..71f517c7 100644 --- a/lib/x509v3ext.cpp +++ b/lib/x509v3ext.cpp @@ -76,15 +76,29 @@ x509v3ext &x509v3ext::create_ia5(int nid, const QString &et, X509V3_CTX *ctx) } return create(nid, et, ctx); } -int x509v3ext::nid() const + +const ASN1_OBJECT *x509v3ext::object() const { ASN1_OBJECT *obj = X509_EXTENSION_get_object(ext); - return OBJ_obj2nid(obj); + try { + openssl_error(); + } catch (errorEx e) { + return NULL; + } + return obj; +} + +int x509v3ext::nid() const +{ + const ASN1_OBJECT *obj = object(); + return obj ? OBJ_obj2nid(obj) : NID_undef; } void *x509v3ext::d2i() const { - return X509V3_EXT_d2i(ext); + void *r = X509V3_EXT_d2i(ext); + ign_openssl_error(); + return r; } x509v3ext &x509v3ext::operator = (const x509v3ext &x) @@ -95,7 +109,8 @@ x509v3ext &x509v3ext::operator = (const x509v3ext &x) QString x509v3ext::getObject() const { - return OBJ_obj2QString(X509_EXTENSION_get_object(ext)); + const ASN1_OBJECT *obj = object(); + return obj ? OBJ_obj2QString(obj) : QString(""); } int x509v3ext::getCritical() const @@ -111,7 +126,10 @@ QString x509v3ext::getValue(bool html) const BIO *bio = BIO_new(BIO_s_mem()); ret = X509V3_EXT_print(bio, ext, X509V3_EXT_DEFAULT, 0); - if (ret) { + if (ign_openssl_error() || !ret) { + ret = M_ASN1_OCTET_STRING_print(bio, ext->value); + } + if (!ign_openssl_error() && ret) { long len = BIO_get_mem_data(bio, &p); text = QString::fromLocal8Bit(p, len); } @@ -142,23 +160,6 @@ static QString vlist2Section(QStringList vlist, QString tag, QString *sect) return QString("@%1_sect\n").arg(tag); } -bool x509v3ext::parse_ia5(QString *single, QString *adv) const -{ - ASN1_STRING *str = (ASN1_STRING *)d2i(); - QString ret; - - if (!str) - return false; - ret = QString(asn1ToQString(str)); - if (single) - *single = ret; - else if (adv) - *adv = QString("%1=%2\n").arg(OBJ_nid2sn(nid())).arg(ret) +*adv; - - ASN1_STRING_free(str); - return true; -} - static QString obj2SnOid(const ASN1_OBJECT *a) { QString obj; @@ -202,7 +203,7 @@ static const char *asn1Type2Name(int type) if (tags[i].tag == type) return tags[i].strnam; } - return NULL; + return "UNKNOWN"; } static bool asn1TypePrintable(int type) @@ -351,6 +352,35 @@ QString x509v3ext::parse_critical() const return QString(getCritical() ? "critical," : ""); } +#define TEXTS (\ + B_ASN1_TIME | B_ASN1_DIRECTORYSTRING | B_ASN1_DISPLAYTEXT | \ + B_ASN1_NUMERICSTRING | B_ASN1_T61STRING | B_ASN1_UNIVERSALSTRING) + +bool x509v3ext::parse_ia5(QString *single, QString *adv) const +{ + ASN1_STRING *str = (ASN1_STRING *)d2i(); + QString ret; + + if (!str) { + const unsigned char *p = ext->value->data; + str = d2i_ASN1_type_bytes(NULL, &p, ext->value->length, TEXTS); + if (ign_openssl_error() || !str) + return false; + ret = QString("%2"). + arg(asn1Type2Name(str->type)). + arg(QString(asn1ToQString(str))); + } else { + ret = QString(asn1ToQString(str)); + } + if (single) + *single = ret; + else if (adv) + *adv = QString("%1=%2\n").arg(OBJ_nid2sn(nid())).arg(ret) +*adv; + + ASN1_STRING_free(str); + return true; +} + bool x509v3ext::parse_generalName(QString *single, QString *adv) const { bool retval = true; @@ -734,7 +764,8 @@ bool x509v3ext::parse_aKeyId(QString *, QString *adv) const bool x509v3ext::parse_generic(QString *, QString *adv) const { - QString der, obj = obj2SnOid(X509_EXTENSION_get_object(ext)); + const ASN1_OBJECT *o = object(); + QString der, obj = o ? obj2SnOid(o) : QString(""); ASN1_OCTET_STRING *v = ext->value; for (int i=0; ilength; i++) diff --git a/lib/x509v3ext.h b/lib/x509v3ext.h index 95ba498b..6624e59e 100644 --- a/lib/x509v3ext.h +++ b/lib/x509v3ext.h @@ -19,6 +19,7 @@ class x509v3ext { private: X509_EXTENSION *ext; + const ASN1_OBJECT *object() const; public: x509v3ext(); x509v3ext(const X509_EXTENSION *n);