/* * Copyright (c) 2004, 2005, 2006 Lev Walkin . * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */ #include "asn1_common.h" #include "libasn1_unber_tool.h" #undef COPYRIGHT #define COPYRIGHT "Copyright (c) 2004-2019 Lev Walkin \n" static void usage(const char *av0); /* Print the Usage screen and exit */ int main(int ac, char **av) { int ch; /* Command line character */ /* * Process command-line options. */ while((ch = getopt(ac, av, "1hi:mps:t:v")) != -1) { switch(ch) { case '1': set_single_type_decoding(1); break; case 'i': if(set_indent_size(atoi(optarg)) != 0) { fprintf(stderr, "-i %s: Invalid indent value\n", optarg); exit(EX_USAGE); } break; case 'm': set_minimalistic_output(1); break; case 'p': set_pretty_printing(0); break; case 's': if(set_skip_bytes(atol(optarg)) != 0) { fprintf(stderr, "-s %s: positive value expected\n", optarg); exit(EX_USAGE); } break; case 't': if(decode_tlv_from_hex_string(optarg)) exit(EX_DATAERR); exit(0); case 'v': fprintf(stderr, "ASN.1 BER Decoder, v" VERSION "\n" COPYRIGHT); exit(0); break; case 'h': default: usage(av[0]); } } /* * Ensure that there are some input files present. */ if(ac > optind) { ac -= optind; av += optind; } else { fprintf(stderr, "%s: No input files specified\n", av[0]); exit(1); } setvbuf(stdout, 0, _IOLBF, 0); /* * Iterate over input files and parse each. * All syntax trees from all files will be bundled together. */ for(int i = 0; i < ac; i++) { if(unber_file(av[i])) exit(EX_DATAERR); } return 0; } /* * Print the usage screen and exit(EX_USAGE). */ static void usage(const char *av0) { /* clang-format off */ fprintf(stderr, "ASN.1 BER Decoder, v" VERSION "\n" COPYRIGHT "Usage: %s [options] [-] [file ...]\n" "Options:\n" " -1 Decode only the first BER structure (otherwise, until EOF)\n" " -i Amount of spaces for output indentation (default is 4)\n" " -m Minimalistic mode: print as little as possible\n" " -p Do not attempt pretty-printing of known ASN.1 types\n" " -s Ignore first bytes of input\n" " -t Decode the given tag[/length] sequence (e.g. -t \"bf20\")\n" "\n" "The XML opening tag format is as follows:\n" " \n" "Where:\n" " tform Which form the value is in: constructed (\"C\", \"I\") or primitive (\"P\")\n" " off Offset of the encoded element in the unber input stream\n" " tag The tag class and value in human readable form\n" " tl_len The length of the TL (BER Tag and Length) encoding\n" " v_len The length of the value (V, encoded by the L), may be \"Indefinite\"\n" " type Likely name of the underlying ASN.1 type (for [UNIVERSAL n] tags)\n" " [F] Indicates that the value was reformatted (pretty-printed)\n" "See the manual page for details\n" , av0); /* clang-format on */ exit(EX_USAGE); }