fix nested parsing bug
This commit is contained in:
parent
90b4b26ffb
commit
2b8e6b4c95
1 changed files with 25 additions and 28 deletions
53
bin/rasha.js
53
bin/rasha.js
|
@ -21,48 +21,45 @@ function ASN1(buf, depth) {
|
||||||
throw new Error("We got stuck in a loop (or this is actually more than 15 layers deep, which we never expected)");
|
throw new Error("We got stuck in a loop (or this is actually more than 15 layers deep, which we never expected)");
|
||||||
}
|
}
|
||||||
var asn1 = {
|
var asn1 = {
|
||||||
type: buf[0]
|
index: 2 // start after type (0) and lengthSize (1)
|
||||||
, length: 0
|
, type: buf[0]
|
||||||
, lengthLength: buf[1]
|
, length: buf[1]
|
||||||
, totalLength: 0
|
, lengthSize: 0
|
||||||
, value: null
|
, value: null
|
||||||
, children: []
|
, children: []
|
||||||
};
|
};
|
||||||
console.log(depth, buf.byteLength, buf);
|
console.log(depth, buf.byteLength, buf);
|
||||||
var index = 2;
|
|
||||||
var child;
|
var child;
|
||||||
var i = 0;
|
var i = 0;
|
||||||
if (0x80 & asn1.lengthLength) {
|
if (0x80 & asn1.length) {
|
||||||
asn1.lengthLength = 0x7f & asn1.lengthLength;
|
asn1.lengthSize = 0x7f & asn1.length;
|
||||||
// to not worry about Endianness:
|
// I think that buf->hex->int solves the problem of Endianness... not sure
|
||||||
console.log('lenlen:', buf.slice(index, index + asn1.lengthLength).toString('hex'));
|
console.log('lenlen:', buf.slice(asn1.index, asn1.index + asn1.lengthSize).toString('hex'));
|
||||||
asn1.length = parseInt(buf.slice(index, index + asn1.lengthLength).toString('hex'), 16);
|
asn1.length = parseInt(buf.slice(asn1.index, asn1.index + asn1.lengthSize).toString('hex'), 16);
|
||||||
index += asn1.lengthLength;
|
// add back the original byte indicating lengthSize
|
||||||
} else {
|
//asn1.lengthSize += 1;
|
||||||
asn1.length = asn1.lengthLength;
|
//asn1.index += asn1.lengthSize;
|
||||||
asn1.lengthLength = 0;
|
asn1.index += 1;
|
||||||
}
|
}
|
||||||
asn1.totalLength += asn1.lengthLength + 1;
|
|
||||||
console.log('asn1:'
|
console.log('asn1', 'type', Buffer.from([asn1.type]).toString('hex')
|
||||||
, Buffer.from([asn1.type]).toString('hex')
|
, 'ls', Buffer.from([asn1.lengthSize]).toString('hex'), 'len', asn1.length
|
||||||
, Buffer.from([asn1.totalLength])
|
, 'ch', asn1.children.length, 'vlen', asn1.value && asn1.value.length || null);
|
||||||
, asn1.length
|
|
||||||
, asn1.type <= 0x06
|
|
||||||
);
|
|
||||||
|
|
||||||
// this is a primitive value type
|
// this is a primitive value type
|
||||||
if (asn1.type <= 0x06) {
|
if (asn1.type <= 0x06) {
|
||||||
i += 1;
|
i += 1;
|
||||||
asn1.value = buf.slice(index, index + asn1.length);
|
asn1.value = buf.slice(asn1.index, asn1.index + asn1.length);
|
||||||
console.log("type is less than or equal to 0x06 and value size is", asn1.value.byteLength
|
|
||||||
, Buffer.from(asn1.value.slice(asn1.value.byteLength - 3)).toString('hex'));
|
|
||||||
return asn1;
|
return asn1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (i < 12 && index < buf.byteLength) {
|
while (i < 12 && asn1.index < buf.byteLength) {
|
||||||
child = ASN1(buf.slice(index), depth += 1);
|
var childbuf = buf.slice(asn1.index);
|
||||||
index += 1 /*child.type.length*/ + child.totalLength + child.length;
|
child = ASN1(childbuf, depth += 1);
|
||||||
console.log("New Index is:", index, "New buf.byteLength:", buf.byteLength);
|
console.log('child', 'type', Buffer.from([child.type]).toString('hex')
|
||||||
|
, 'ls', Buffer.from([child.lengthSize]).toString('hex'), 'len', child.length
|
||||||
|
, 'ch', child.children.length, 'vlen', child.value && child.value.length || null);
|
||||||
|
asn1.index += 2 /*child.type.length*/ + child.lengthSize + child.length;
|
||||||
asn1.children.push(child);
|
asn1.children.push(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue