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 .Sh SYNOPSIS
.Nm .Nm
.Bk -words .Bk -words
.Oo Fl i \*(Ba Xo .Oo Fl i \*(Ba Xo Fl Fl no-indent Xc Oc
.Fl Fl no-indent .Oo Fl I \*(Ba Xo Fl Fl inner Xc Oc
.Xc .Oo Fl l \*(Ba Xo Fl Fl list-types Xc Oc
.Oc .Oo Fl A \*(Ba Xo Fl Fl try-all-types Xc Oc
.Oo Fl I \*(Ba Xo .Oo Fl S \*(Ba Xo Fl Fl raw-sequence Xc Oc
.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 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-encode Xc Oc
.Oo Xo Fl Fl test-copy Xc Oc .Oo Xo Fl Fl test-copy Xc Oc
.Oo Fl l v \*(Ba Xo .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 is given, do not output a JSON representation of the value, just
attempt to decode it. attempt to decode it.
This is useful for fuzzing. 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 .It Fl Fl test-encode
Check that encoding produces the same value as decoding. Check that encoding produces the same value as decoding.
Useful for fuzzing. Useful for fuzzing.

View File

@@ -55,6 +55,7 @@
#include "rfc4108_asn1.h" #include "rfc4108_asn1.h"
#include "x690sample_asn1.h" #include "x690sample_asn1.h"
static int quiet_flag = 0;
static int print_flag = 1; static int print_flag = 1;
static int test_copy_flag; static int test_copy_flag;
static int test_encode_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); ret = sorted_types[i].decode(buf, len, v, &sz);
if (ret == 0) { if (ret == 0) {
matches++; matches++;
if (sz == len) { if (!quiet_flag && sz == len) {
fprintf(stderr, "Match: %s\n", typename); fprintf(stderr, "Match: %s\n", typename);
} else if (sequence_flag) { } else if (sequence_flag) {
*size = sz; *size = sz;
} else { } else if (!quiet_flag) {
fprintf(stderr, "Prefix match: %s\n", typename); fprintf(stderr, "Prefix match: %s\n", typename);
} }
if (print_flag) { if (print_flag) {
@@ -425,7 +426,8 @@ dotype(unsigned char *buf, size_t len, char **argv, size_t *size)
ret = errno; ret = errno;
err(1, "Could not print %s\n", typename); err(1, "Could not print %s\n", typename);
} }
fprintf(stdout, "%s\n", s); if (!quiet_flag)
printf("%s\n", s);
free(s); free(s);
} }
if (test_encode_flag) { if (test_encode_flag) {
@@ -604,6 +606,8 @@ struct getargs args[] = {
"\ttest copy operation (for memory debugging and fuzzing)", NULL }, "\ttest copy operation (for memory debugging and fuzzing)", NULL },
{ "print", 'n', arg_negative_flag, &print_flag, { "print", 'n', arg_negative_flag, &print_flag,
"\ttest copy operation (for memory debugging and fuzzing)", NULL }, "\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 }, { "version", 'v', arg_flag, &version_flag, NULL, NULL },
{ "help", 'h', arg_flag, &help_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) if (sequence_flag && try_all_flag)
errx(1, "--raw-sequence and --try-all-types are mutually exclusive"); 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) { if (list_types_flag) {
size_t i; size_t i;
if (argc) 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++) for (i = 0; i < sizeof(types)/sizeof(types[0]); i++)
printf("%s\n", types[i].name); printf("%s\n", types[i].name);
exit(0); exit(0);
} }
if (argc < 1) if (argc < 1)
usage(1); usage(1);
return doit(argv); return doit(argv);