#!/usr/bin/env python3 # A more useful verion of the 'unber' tool provided with asn1c: # Give a hierarchical decode of BER/DER-encoded ASN.1 TLVs import sys import argparse from pySim.utils import bertlv_parse_one, bertlv_encode_tag, b2h, h2b def process_one_level(content: bytes, indent: int): remainder = content while len(remainder): tdict, l, v, remainder = bertlv_parse_one(remainder) #print(tdict) rawtag = bertlv_encode_tag(tdict) if tdict['constructed']: print("%s%s l=%d" % (indent*" ", b2h(rawtag), l)) process_one_level(v, indent + 1) else: print("%s%s l=%d %s" % (indent*" ", b2h(rawtag), l, b2h(v))) option_parser = argparse.ArgumentParser(description='BER/DER data dumper') group = option_parser.add_mutually_exclusive_group(required=True) group.add_argument('--file', help='Input file') group.add_argument('--hex', help='Input hexstring') if __name__ == '__main__': opts = option_parser.parse_args() if opts.file: with open(opts.file, 'rb') as f: content = f.read() elif opts.hex: content = h2b(opts.hex) process_one_level(content, 0)