mirror of
https://github.com/chris2511/xca.git
synced 2026-09-12 19:51:05 +05:00
SF. Bug. #107 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
Gracefully handle malformed Netscape extensions i.e. Expected IA5 strings not IA5 tagged
This commit is contained in:
parent
fe969553c3
commit
2f61c8c711
@ -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];
|
||||
|
||||
@ -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("<ERROR>");
|
||||
}
|
||||
|
||||
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("<ERROR: NOT IA5 but %1>%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("<ERROR>");
|
||||
ASN1_OCTET_STRING *v = ext->value;
|
||||
|
||||
for (int i=0; i<v->length; i++)
|
||||
|
||||
@ -19,6 +19,7 @@ class x509v3ext
|
||||
{
|
||||
private:
|
||||
X509_EXTENSION *ext;
|
||||
const ASN1_OBJECT *object() const;
|
||||
public:
|
||||
x509v3ext();
|
||||
x509v3ext(const X509_EXTENSION *n);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user