Add -item option to asn1parse
authorDr. Stephen Henson <steve@openssl.org>
Tue, 27 Sep 2016 21:25:08 +0000 (22:25 +0100)
committerDr. Stephen Henson <steve@openssl.org>
Thu, 29 Sep 2016 15:21:46 +0000 (16:21 +0100)
Reviewed-by: Rich Salz <rsalz@openssl.org>
apps/asn1pars.c
doc/apps/asn1parse.pod

index 1ac261c7629ecbb14b051d40e80e87343dc35ab3..0bc48e3f5e2a07e0814d7781efc07e36bc5a86f9 100644 (file)
 #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:
index 10a5aba51d8d5939a9df9400d10fb350cdfafffd..ee09a83cf788378c8b353db5e550e7e4dbb3f531 100644 (file)
@@ -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