5 if len (sys.argv) != 2:
6 print 'Usage: ' + sys.argv [0] + 'file.der'
7 print 'Output: MEANING: TAG ###CONTLEN @TAGOFS ^NESTING, CLASS, PRIMCONSTR'
10 der = open (sys.argv [1], 'r').read (65537)
15 return ofs >= len (der)
20 print 'ATTEMPTED READ BEYOND EOF (RETURNING 0x00)'
24 return ord (der [ofs-1])
48 7: 'Object-Descriptor',
60 19: 'PrintableString',
65 24: 'GeneralizedTime',
69 28: 'UniversalString',
70 29: 'CHARACTER STRING',
77 while nesting != [] and ofs >= nesting [-1]:
78 if ofs > nesting [-1]:
79 print 'READ OFFSET %d EXCEEDS ENCAPSULATION %d (RETURNING)' % (ofs, nesting [-1])
83 tag_class = (tag & 0xc0) >> 6
84 tag_pc = (tag & 0x20) != 0
88 if lenlen & 0x80 == 0:
92 lenlen = lenlen - 0x80 + 1
97 leng = leng + read1 ()
101 meaning = universal2str [tag_num]
103 meaning = '[APPLICATION ' + str (tag_num) + ']'
105 meaning = '[' + str (tag_num) + ']'
107 meaning = '[PRIVATE ' + str (tag_num) + ']'
109 print '%s%s: tag 0x%02x %s%d @%d ^%d, %s, %s' % (
115 class2str [tag_class],
118 if tag_pc == 0 and leng > 0:
119 print ' ' * ( len (nesting) + 1 ),
128 cstr = cstr + chr (ch)
132 ival = -1 if ch >= 128 else 0
134 ival = (ival << 8) | ch
136 ostr = str (ch / 40) + '.' + str (ch % 40)
139 oval = (oval << 7) | (ch & 0x7f)
141 ostr = ostr + '.' + str (oval)
152 # print 'Now at', ofs, 'adding', leng, 'pushing', ofs + leng
153 nesting.append (ofs + leng)
156 if ofs != nesting [-1]:
157 print 'NESTING NOT ENDED CORRECTLY, OFFSET IS %d INSTEAD OF %d (CONTINUING)' % (ofs, nesting [-1])