misc cleanup

This commit is contained in:
AJ ONeal 2018-11-23 22:02:29 -07:00
parent bbb7fc99ec
commit 6e1a9a4e2a
3 changed files with 40 additions and 17 deletions

View file

@ -76,13 +76,14 @@ ASN1.BitStr = function BITSTR() {
// //
ASN1.ELOOP = "uASN1.js Error: iterated over 15+ elements (probably a malformed file)"; ASN1.ELOOP = "uASN1.js Error: iterated over 15+ elements (probably a malformed file)";
ASN1.EDEEP = "uASN1.js Error: element nested 10+ layers deep (probably a malformed file)"; ASN1.EDEEP = "uASN1.js Error: element nested 20+ layers deep (probably a malformed file)";
// Container Types are Sequence 0x30, Octect String 0x04, Array? (0xA0, 0xA1) // Container Types are Sequence 0x30, Octect String 0x04, Array? (0xA0, 0xA1)
// Value Types are Integer 0x02, Bit String 0x03, Null 0x05, Object ID 0x06, // Value Types are Integer 0x02, Bit String 0x03, Null 0x05, Object ID 0x06,
// Sometimes Bit String is used as a container (RSA Pub Spki) // Sometimes Bit String is used as a container (RSA Pub Spki)
ASN1.VTYPES = [ 0x02, 0x03, 0x05, 0x06 ]; ASN1.VTYPES = [ 0x02, 0x03, 0x05, 0x06, 0x0c, 0x82 ];
ASN1.parse = function parseAsn1(buf, depth) { ASN1.parse = function parseAsn1(buf, depth, ws) {
if (depth >= 10) { throw new Error(ASN1.EDEEP); } if (!ws) { ws = ''; }
if (depth >= 20) { throw new Error(ASN1.EDEEP); }
var index = 2; // we know, at minimum, data starts after type (0) and lengthSize (1) var index = 2; // we know, at minimum, data starts after type (0) and lengthSize (1)
var asn1 = { type: buf[0], lengthSize: 0, length: buf[1] }; var asn1 = { type: buf[0], lengthSize: 0, length: buf[1] };
@ -108,9 +109,10 @@ ASN1.parse = function parseAsn1(buf, depth) {
adjust = -1; adjust = -1;
} }
} }
adjustedLen = asn1.length + adjust; adjustedLen = asn1.length + adjust;
//console.warn(ws + '0x' + Enc.numToHex(asn1.type), index, 'len:', asn1.length, asn1);
// this is a primitive value type // this is a primitive value type
if (-1 !== ASN1.VTYPES.indexOf(asn1.type)) { if (-1 !== ASN1.VTYPES.indexOf(asn1.type)) {
asn1.value = buf.slice(index, index + adjustedLen); asn1.value = buf.slice(index, index + adjustedLen);
@ -118,11 +120,28 @@ ASN1.parse = function parseAsn1(buf, depth) {
} }
asn1.children = []; asn1.children = [];
while (iters < 15 && index <= asn1.length) { //console.warn('1 len:', (2 + asn1.lengthSize + asn1.length), 'idx:', index, 'clen:', 0);
while (iters < 15 && index < (2 + asn1.length + asn1.lengthSize)) {
iters += 1; iters += 1;
child = ASN1.parse(buf.slice(index, index + adjustedLen), (depth || 0) + 1); child = ASN1.parse(buf.slice(index, index + adjustedLen), (depth || 0) + 1, ws + ' ');
// The numbers don't match up exactly and I don't remember why...
// probably something with adjustedLen or some such, but the tests pass
index += (2 + child.lengthSize + child.length); index += (2 + child.lengthSize + child.length);
//console.warn('2 len:', (2 + asn1.lengthSize + asn1.length), 'idx:', index, 'clen:', (2 + child.lengthSize + child.length));
if (index > (2 + asn1.lengthSize + asn1.length)) {
console.error(JSON.stringify(asn1, function (k, v) {
if ('value' === k) { return '0x' + Enc.bufToHex(v.data); } return v;
}, 2));
throw new Error("Parse error: child value length (" + child.length
+ ") is greater than remaining parent length (" + (asn1.length - index)
+ " = " + asn1.length + " - " + index + ")");
}
asn1.children.push(child); asn1.children.push(child);
//console.warn(ws + '0x' + Enc.numToHex(asn1.type), index, 'len:', asn1.length, asn1);
}
if (index !== (2 + asn1.lengthSize + asn1.length)) {
console.warn('index:', index, 'length:', (2 + asn1.lengthSize + asn1.length))
throw new Error("premature end-of-file");
} }
if (iters >= 15) { throw new Error(ASN1.ELOOP); } if (iters >= 15) { throw new Error(ASN1.ELOOP); }
@ -153,7 +172,8 @@ ASN1._stringify = function(asn1) {
ASN1.tpl = function (asn1) { ASN1.tpl = function (asn1) {
//console.log(JSON.stringify(asn1, null, 2)); //console.log(JSON.stringify(asn1, null, 2));
//console.log(asn1); //console.log(asn1);
var ws = '\t'; var sp = ' ';
var ws = sp;
var i = 0; var i = 0;
var vars = []; var vars = [];
var str = ws; var str = ws;
@ -177,7 +197,7 @@ ASN1.tpl = function (asn1) {
if (0x05 !== asn1.type) { if (0x05 !== asn1.type) {
if (0x06 !== asn1.type) { if (0x06 !== asn1.type) {
val = asn1.value || new Uint8Array(0); val = asn1.value || new Uint8Array(0);
vars.push("// 0x" + Enc.numToHex(val.byteLength) + " (" + val.byteLength + " bytes)\nopts.tpl" + i + " = '" vars.push("\n// 0x" + Enc.numToHex(val.byteLength) + " (" + val.byteLength + " bytes)\nopts.tpl" + i + " = '"
+ Enc.bufToHex(val) + "';"); + Enc.bufToHex(val) + "';");
if (0x02 !== asn1.type && 0x03 !== asn1.type) { if (0x02 !== asn1.type && 0x03 !== asn1.type) {
str += ", "; str += ", ";
@ -186,15 +206,17 @@ ASN1.tpl = function (asn1) {
} else { } else {
str += ", '" + Enc.bufToHex(asn1.value) + "'"; str += ", '" + Enc.bufToHex(asn1.value) + "'";
} }
} else {
console.warn("XXXXXXXXXXXXXXXXXXXXX");
} }
str += ")"; str += ")";
return ; return ;
} }
asn1.children.forEach(function (a, j) { asn1.children.forEach(function (a, j) {
i += 1; i += 1;
ws += '\t'; ws += sp;
write(a, j); write(a, j);
ws = ws.slice(1); ws = ws.slice(sp.length);
}); });
str += "\n" + ws + ")"; str += "\n" + ws + ")";
} }
@ -204,8 +226,10 @@ ASN1.tpl = function (asn1) {
console.log(vars.join('\n') + '\n'); console.log(vars.join('\n') + '\n');
console.log(); console.log();
console.log('function buildSchema(opts) {'); console.log('function buildSchema(opts) {');
console.log('\treturn Enc.hexToBuf(' + str.slice(3) + ');'); console.log(sp + 'return Enc.hexToBuf(' + str.slice(3) + ');');
console.log('}'); console.log('}');
console.log();
console.log('buildSchema(opts);');
}; };
module.exports = ASN1; module.exports = ASN1;

View file

@ -5,8 +5,9 @@ var Enc = module.exports;
Enc.bufToHex = function toHex(u8) { Enc.bufToHex = function toHex(u8) {
var hex = []; var hex = [];
var i, h; var i, h;
var len = (u8.byteLength || u8.length);
for (i = 0; i < u8.byteLength; i += 1) { for (i = 0; i < len; i += 1) {
h = u8[i].toString(16); h = u8[i].toString(16);
if (2 !== h.length) { h = '0' + h; } if (2 !== h.length) { h = '0' + h; }
hex.push(h); hex.push(h);

View file

@ -135,9 +135,7 @@ rndkey 1024
rndkey 2048 # first secure key size rndkey 2048 # first secure key size
#rndkey 3072 #rndkey 3072
#rndkey 4096 # largest reasonable key size #rndkey 4096 # largest reasonable key size
if [ -z "$keyid" ]; then echo "Pass"
echo "Pass"
fi
echo "" echo ""
echo "Note:" echo "Note:"
echo "Keys larger than 2048 have been tested and work, but are omitted from automated tests to save time." echo "Keys larger than 2048 have been tested and work, but are omitted from automated tests to save time."