forked from lapo-luchini/asn1js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdumpASN1.js
executable file
·75 lines (71 loc) · 2.19 KB
/
dumpASN1.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env node
'use strict';
const
fs = require('fs'),
Base64 = require('./base64.js'),
ASN1 = require('./asn1.js'),
rfc = require('./rfcasn1.json'),
colYellow = "\x1b[33m",
colReset = "\x1b[0m";
function translate(def) {
if (def?.type?.type)
def = def.type;
while (def?.type == 'defined') {
const name = def.name;
try {
def = rfc['1.3.6.1.5.5.7.0.18'].types[name].type;
} catch (e) {
throw 'Type not found: ' + name;
}
}
return def ?? {};
}
function print(value, def, indent) {
if (indent === undefined) indent = '';
// console.log(def);
let deftype = translate(def);
let tn = value.typeName();
if (deftype.name == 'CHOICE') {
for (let c of deftype.content) {
c = translate(c);
if (tn == c.name) {
deftype = translate(c);
break;
}
}
}
if (tn.replaceAll('_', ' ') != deftype.name && deftype.name != 'ANY')
def = null;
let name = '';
if (def) {
if (def.id) name += def.id;
if (def.type == 'defined') name = (name ? name + ' ' : '') + def.name;
if (name) name += ' ';
}
let s = indent + name + colYellow + value.typeName() + colReset + " @" + value.stream.pos;
if (value.length >= 0)
s += "+";
s += value.length;
if (value.tag.tagConstructed)
s += " (constructed)";
else if ((value.tag.isUniversal() && ((value.tag.tagNumber == 0x03) || (value.tag.tagNumber == 0x04))) && (value.sub !== null))
s += " (encapsulates)";
var content = value.content();
if (content)
s += ": " + content.replace(/\n/g, '|');
s += "\n";
if (value.sub !== null) {
indent += ' ';
for (var i = 0, max = value.sub.length; i < max; ++i)
s += print(value.sub[i], deftype?.content?.[deftype?.typeOf ? 0 : i], indent);
}
return s;
}
let content = fs.readFileSync(process.argv[2]);
try { // try PEM first
content = Base64.unarmor(content);
} catch (e) { // try DER/BER then
}
let result = ASN1.decode(content);
content = null;
console.log(print(result, rfc['1.3.6.1.5.5.7.0.18'].types.Certificate));