aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2016-09-27 22:25:08 +0100
committerDr. Stephen Henson <steve@openssl.org>2016-09-29 16:21:46 +0100
commit5fb1005987d3d0bc749d935e5af4a69323824b48 (patch)
tree7096d639bf47ba75a1628720a751c6364ccc9330
parent56501ebd09316941a6deba111e33ccc166641b25 (diff)
downloadopenssl-5fb1005987d3d0bc749d935e5af4a69323824b48.zip
openssl-5fb1005987d3d0bc749d935e5af4a69323824b48.tar.gz
openssl-5fb1005987d3d0bc749d935e5af4a69323824b48.tar.bz2
Add -item option to asn1parse
Reviewed-by: Rich Salz <rsalz@openssl.org>
-rw-r--r--apps/asn1pars.c45
-rw-r--r--doc/apps/asn1parse.pod6
2 files changed, 45 insertions, 6 deletions
diff --git a/apps/asn1pars.c b/apps/asn1pars.c
index 1ac261c..0bc48e3 100644
--- a/apps/asn1pars.c
+++ b/apps/asn1pars.c
@@ -20,12 +20,14 @@
#include <openssl/evp.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
+#include <openssl/asn1t.h>
typedef enum OPTION_choice {
OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
OPT_INFORM, OPT_IN, OPT_OUT, OPT_INDENT, OPT_NOOUT,
OPT_OID, OPT_OFFSET, OPT_LENGTH, OPT_DUMP, OPT_DLIMIT,
- OPT_STRPARSE, OPT_GENSTR, OPT_GENCONF, OPT_STRICTPEM
+ OPT_STRPARSE, OPT_GENSTR, OPT_GENCONF, OPT_STRICTPEM,
+ OPT_ITEM
} OPTION_CHOICE;
OPTIONS asn1parse_options[] = {
@@ -49,6 +51,7 @@ OPTIONS asn1parse_options[] = {
{OPT_MORE_STR, 0, 0, "(-inform will be ignored)"},
{"strictpem", OPT_STRICTPEM, 0,
"do not attempt base64 decode outside PEM markers"},
+ {"item", OPT_ITEM, 's', "item to parse and print"},
{NULL}
};
@@ -71,6 +74,7 @@ int asn1parse_main(int argc, char **argv)
unsigned char *tmpbuf;
unsigned int length = 0;
OPTION_CHOICE o;
+ const ASN1_ITEM *it = NULL;
prog = opt_init(argc, argv, asn1parse_options);
@@ -134,6 +138,22 @@ int asn1parse_main(int argc, char **argv)
strictpem = 1;
informat = FORMAT_PEM;
break;
+ case OPT_ITEM:
+ it = ASN1_ITEM_lookup(opt_arg());
+ if (it == NULL) {
+ size_t tmp;
+
+ BIO_printf(bio_err, "Unknown item name %s\n", opt_arg());
+ BIO_puts(bio_err, "Supported types:\n");
+ for (tmp = 0;; tmp++) {
+ it = ASN1_ITEM_get(tmp);
+ if (it == NULL)
+ break;
+ BIO_printf(bio_err, " %s\n", it->sname);
+ }
+ goto end;
+ }
+ break;
}
}
argc = opt_num_rest();
@@ -260,11 +280,24 @@ int asn1parse_main(int argc, char **argv)
goto end;
}
}
- if (!noout &&
- !ASN1_parse_dump(bio_out, &(str[offset]), length,
- indent, dump)) {
- ERR_print_errors(bio_err);
- goto end;
+ if (!noout) {
+ const unsigned char *p = str + offset;
+
+ if (it != NULL) {
+ ASN1_VALUE *value = ASN1_item_d2i(NULL, &p, length, it);
+ if (value == NULL) {
+ BIO_printf(bio_err, "Error parsing item %s\n", it->sname);
+ ERR_print_errors(bio_err);
+ goto end;
+ }
+ ASN1_item_print(bio_out, value, 0, it, NULL);
+ ASN1_item_free(value, it);
+ } else {
+ if (!ASN1_parse_dump(bio_out, p, length, indent, dump)) {
+ ERR_print_errors(bio_err);
+ goto end;
+ }
+ }
}
ret = 0;
end:
diff --git a/doc/apps/asn1parse.pod b/doc/apps/asn1parse.pod
index 10a5aba..ee09a83 100644
--- a/doc/apps/asn1parse.pod
+++ b/doc/apps/asn1parse.pod
@@ -22,6 +22,7 @@ B<openssl> B<asn1parse>
[B<-genstr string>]
[B<-genconf file>]
[B<-strictpem>]
+[B<-item name>]
=head1 DESCRIPTION
@@ -102,6 +103,11 @@ processed whether it has the normal PEM BEGIN and END markers or not. This
option will ignore any data prior to the start of the BEGIN marker, or after an
END marker in a PEM file.
+=item B<-item name>
+
+attempt to decode and print the data as B<ASN1_ITEM name>. This can be used to
+print out the fields of any supported ASN.1 structure if the type is known.
+
=back
=head2 Output