asn1: Add -q option to asn1_print

This commit is contained in:
Nicolas Williams
2021-03-06 14:46:52 -06:00
parent ff571d52a0
commit 7559f36415
2 changed files with 31 additions and 24 deletions

View File

@@ -40,27 +40,13 @@
.Sh SYNOPSIS
.Nm
.Bk -words
.Oo Fl i \*(Ba Xo
.Fl Fl no-indent
.Xc
.Oc
.Oo Fl I \*(Ba Xo
.Fl Fl inner
.Xc
.Oc
.Oo Fl l \*(Ba Xo
.Fl Fl list-types
.Xc
.Oc
.Oo Fl A \*(Ba Xo
.Fl Fl try-all-types
.Xc
.Oc
.Oo Fl S \*(Ba Xo
.Fl Fl raw-sequence
.Xc
.Oc
.Oo Fl i \*(Ba Xo Fl Fl no-indent Xc Oc
.Oo Fl I \*(Ba Xo Fl Fl inner Xc Oc
.Oo Fl l \*(Ba Xo Fl Fl list-types Xc Oc
.Oo Fl A \*(Ba Xo Fl Fl try-all-types Xc Oc
.Oo Fl S \*(Ba Xo Fl Fl raw-sequence Xc Oc
.Oo Fl n \*(Ba Xo Fl Fl no-print Xc Oc
.Oo Fl q \*(Ba Xo Fl Fl quiet Xc Oc
.Oo Xo Fl Fl test-encode Xc Oc
.Oo Xo Fl Fl test-copy Xc Oc
.Oo Fl l v \*(Ba Xo
@@ -126,6 +112,18 @@ or where a
is given, do not output a JSON representation of the value, just
attempt to decode it.
This is useful for fuzzing.
.It Fl q, Fl Fl quiet
Similar to
.Fl n, Fl Fl no-print
but JSON output will be formatted, just not output.
As with
.Fl n, Fl Fl no-print,
this option requires
.Fl A / Fl Fl try-all-types
or that a
.Ar TypeName
be given.
This is useful for fuzzing.
.It Fl Fl test-encode
Check that encoding produces the same value as decoding.
Useful for fuzzing.

View File

@@ -55,6 +55,7 @@
#include "rfc4108_asn1.h"
#include "x690sample_asn1.h"
static int quiet_flag = 0;
static int print_flag = 1;
static int test_copy_flag;
static int test_encode_flag;
@@ -410,11 +411,11 @@ dotype(unsigned char *buf, size_t len, char **argv, size_t *size)
ret = sorted_types[i].decode(buf, len, v, &sz);
if (ret == 0) {
matches++;
if (sz == len) {
if (!quiet_flag && sz == len) {
fprintf(stderr, "Match: %s\n", typename);
} else if (sequence_flag) {
*size = sz;
} else {
} else if (!quiet_flag) {
fprintf(stderr, "Prefix match: %s\n", typename);
}
if (print_flag) {
@@ -425,7 +426,8 @@ dotype(unsigned char *buf, size_t len, char **argv, size_t *size)
ret = errno;
err(1, "Could not print %s\n", typename);
}
fprintf(stdout, "%s\n", s);
if (!quiet_flag)
printf("%s\n", s);
free(s);
}
if (test_encode_flag) {
@@ -604,6 +606,8 @@ struct getargs args[] = {
"\ttest copy operation (for memory debugging and fuzzing)", NULL },
{ "print", 'n', arg_negative_flag, &print_flag,
"\ttest copy operation (for memory debugging and fuzzing)", NULL },
{ "quiet", 'q', arg_flag, &quiet_flag,
"\tOutput nothing (exit status 0 means type matched)", NULL },
{ "version", 'v', arg_flag, &version_flag, NULL, NULL },
{ "help", 'h', arg_flag, &help_flag, NULL, NULL }
};
@@ -636,17 +640,22 @@ main(int argc, char **argv)
if (sequence_flag && try_all_flag)
errx(1, "--raw-sequence and --try-all-types are mutually exclusive");
if (quiet_flag && !try_all_flag && argc < 2)
errx(1, "--quiet requires --try-all-types or that a TypeName be given");
if (!print_flag && !try_all_flag && argc < 2)
errx(1, "--no-print requires --try-all-types or that a TypeName be given");
if (list_types_flag) {
size_t i;
if (argc)
usage(1);
errx(1, "--list-types is exclusive of other options or arguments");
for (i = 0; i < sizeof(types)/sizeof(types[0]); i++)
printf("%s\n", types[i].name);
exit(0);
}
if (argc < 1)
usage(1);
return doit(argv);