From 2b8e6b4c954f6b72dcaa24d85179a753938264a3 Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Wed, 21 Nov 2018 17:25:05 -0700 Subject: [PATCH] fix nested parsing bug --- bin/rasha.js | 53 +++++++++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/bin/rasha.js b/bin/rasha.js index 26560a6..9aea770 100755 --- a/bin/rasha.js +++ b/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)"); } var asn1 = { - type: buf[0] - , length: 0 - , lengthLength: buf[1] - , totalLength: 0 + index: 2 // start after type (0) and lengthSize (1) + , type: buf[0] + , length: buf[1] + , lengthSize: 0 , value: null , children: [] }; console.log(depth, buf.byteLength, buf); - var index = 2; var child; var i = 0; - if (0x80 & asn1.lengthLength) { - asn1.lengthLength = 0x7f & asn1.lengthLength; - // to not worry about Endianness: - console.log('lenlen:', buf.slice(index, index + asn1.lengthLength).toString('hex')); - asn1.length = parseInt(buf.slice(index, index + asn1.lengthLength).toString('hex'), 16); - index += asn1.lengthLength; - } else { - asn1.length = asn1.lengthLength; - asn1.lengthLength = 0; + if (0x80 & asn1.length) { + asn1.lengthSize = 0x7f & asn1.length; + // I think that buf->hex->int solves the problem of Endianness... not sure + console.log('lenlen:', buf.slice(asn1.index, asn1.index + asn1.lengthSize).toString('hex')); + asn1.length = parseInt(buf.slice(asn1.index, asn1.index + asn1.lengthSize).toString('hex'), 16); + // add back the original byte indicating lengthSize + //asn1.lengthSize += 1; + //asn1.index += asn1.lengthSize; + asn1.index += 1; } - asn1.totalLength += asn1.lengthLength + 1; - console.log('asn1:' - , Buffer.from([asn1.type]).toString('hex') - , Buffer.from([asn1.totalLength]) - , asn1.length - , asn1.type <= 0x06 - ); + + console.log('asn1', 'type', Buffer.from([asn1.type]).toString('hex') + , 'ls', Buffer.from([asn1.lengthSize]).toString('hex'), 'len', asn1.length + , 'ch', asn1.children.length, 'vlen', asn1.value && asn1.value.length || null); // this is a primitive value type if (asn1.type <= 0x06) { i += 1; - asn1.value = buf.slice(index, 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')); + asn1.value = buf.slice(asn1.index, asn1.index + asn1.length); return asn1; } - while (i < 12 && index < buf.byteLength) { - child = ASN1(buf.slice(index), depth += 1); - index += 1 /*child.type.length*/ + child.totalLength + child.length; - console.log("New Index is:", index, "New buf.byteLength:", buf.byteLength); + while (i < 12 && asn1.index < buf.byteLength) { + var childbuf = buf.slice(asn1.index); + child = ASN1(childbuf, depth += 1); + 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); }