aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/asn1
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2016-02-10 23:54:52 +0000
committerDr. Stephen Henson <steve@openssl.org>2016-02-11 00:59:48 +0000
commit2ab7af7b08c5213ae85c2a4aa1c15fe8dfe92137 (patch)
treefe040a77ac7b8c25beeeeedc6efc3904dd232c46 /crypto/asn1
parente3e6a72ec800cd112e42ec654cfb9d715c544eb0 (diff)
downloadopenssl-2ab7af7b08c5213ae85c2a4aa1c15fe8dfe92137.tar.gz
Print out bad content octets.
If asn1parse doesn't like a structure print out the content octets for diagnostic purposes. Reviewed-by: Richard Levitte <levitte@openssl.org>
Diffstat (limited to 'crypto/asn1')
-rw-r--r--crypto/asn1/asn1_par.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/crypto/asn1/asn1_par.c b/crypto/asn1/asn1_par.c
index e65dacd83a..d0de27207a 100644
--- a/crypto/asn1/asn1_par.c
+++ b/crypto/asn1/asn1_par.c
@@ -124,7 +124,7 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length,
ASN1_OBJECT *o = NULL;
ASN1_OCTET_STRING *os = NULL;
/* ASN1_BMPSTRING *bmp=NULL; */
- int dump_indent;
+ int dump_indent, dump_cont = 0;
if (depth > ASN1_PARSE_MAXDEPTH) {
BIO_puts(bp, "BAD RECURSION DEPTH\n");
@@ -221,11 +221,13 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length,
} else {
if (BIO_write(bp, ":BAD OBJECT", 11) <= 0)
goto end;
+ dump_cont = 1;
}
} else if (tag == V_ASN1_BOOLEAN) {
if (len != 1) {
- if (BIO_write(bp, "Bad boolean\n", 12) <= 0)
+ if (BIO_puts(bp, "BAD BOOLEAN") <= 0)
goto end;
+ dump_cont = 1;
}
BIO_printf(bp, ":%u", p[0]);
} else if (tag == V_ASN1_BMPSTRING) {
@@ -309,6 +311,7 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length,
} else {
if (BIO_write(bp, "BAD INTEGER", 11) <= 0)
goto end;
+ dump_cont = 1;
}
ASN1_INTEGER_free(bs);
} else if (tag == V_ASN1_ENUMERATED) {
@@ -334,6 +337,7 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length,
} else {
if (BIO_write(bp, "BAD ENUMERATED", 14) <= 0)
goto end;
+ dump_cont = 1;
}
ASN1_ENUMERATED_free(bs);
} else if (len > 0 && dump) {
@@ -347,6 +351,18 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length,
goto end;
nl = 1;
}
+ if (dump_cont) {
+ int i;
+ const unsigned char *tmp = op + hl;
+ if (BIO_puts(bp, ":[") <= 0)
+ goto end;
+ for (i = 0; i < len; i++) {
+ if (BIO_printf(bp, "%02X", tmp[i]) <= 0)
+ goto end;
+ }
+ if (BIO_puts(bp, "]") <= 0)
+ goto end;
+ }
if (!nl) {
if (BIO_write(bp, "\n", 1) <= 0)