WIP Packer
This commit is contained in:
parent
12fef62e09
commit
28b607857e
|
@ -77,16 +77,6 @@ var dnspack = exports.DNS_PACKER = {
|
||||||
total += 4; // two bytes type two bytes class
|
total += 4; // two bytes type two bytes class
|
||||||
}
|
}
|
||||||
|
|
||||||
function packRdata(a) {
|
|
||||||
dv.setUint16(total, 8, false);
|
|
||||||
total += 2;
|
|
||||||
dv.setUint32(total, 0xFFFFFFFF, false)
|
|
||||||
total += 4;
|
|
||||||
dv.setUint32(total, 0xFFFFFFFF, false)
|
|
||||||
total += 4;
|
|
||||||
//throw new Error('not implemented');
|
|
||||||
}
|
|
||||||
|
|
||||||
function packAnswer(a) {
|
function packAnswer(a) {
|
||||||
packQuestion(a);
|
packQuestion(a);
|
||||||
|
|
||||||
|
@ -107,7 +97,7 @@ var dnspack = exports.DNS_PACKER = {
|
||||||
total += 1;
|
total += 1;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
packRdata(a);
|
dnspack.packRdata(ab, dv, total, a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,5 +138,6 @@ var dnspack = exports.DNS_PACKER = {
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
dnspack.packRdata = exports.DNS_RDATA_PACK || require('./dns.rdata.pack.js').DNS_RDATA_PACK;
|
||||||
|
|
||||||
}('undefined' !== typeof window ? window : exports));
|
}('undefined' !== typeof window ? window : exports));
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
(function (exports) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// An 'A' record is a 32-bit value representing the IP address
|
||||||
|
|
||||||
|
exports.DNS_PACKER_TYPE_A = function (ab, dv, total, record) {
|
||||||
|
if (!record.address) {
|
||||||
|
throw new Error("no address on A record");
|
||||||
|
}
|
||||||
|
|
||||||
|
// i.e. 127.0.0.1 => 0x7F, 0x00, 0x00, 0x01
|
||||||
|
//record.rdlength = 4;
|
||||||
|
record.address.split('.').forEach(function (octet) {
|
||||||
|
dv.setUint8(total, parseInt(octet, 10), false);
|
||||||
|
total += 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
return total;
|
||||||
|
};
|
||||||
|
|
||||||
|
}('undefined' !== typeof window ? window : exports));
|
|
@ -0,0 +1,34 @@
|
||||||
|
(function (exports) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// 'AAAA'
|
||||||
|
// Value: IP Address
|
||||||
|
// Meaning:Use: 16 octets (8 sexdectets, 128 bits) represting the IP address
|
||||||
|
|
||||||
|
exports.DNS_PACKER_TYPE_AAAA = function (ab, dv, total, record) {
|
||||||
|
if (!record.address) {
|
||||||
|
throw new Error("no address on A record");
|
||||||
|
}
|
||||||
|
|
||||||
|
// i.e. ::1 => 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001
|
||||||
|
// i.e. FFFF:DDDD::1 => 0xFFFF, 0xDDDD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001
|
||||||
|
//record.rdlength = 16;
|
||||||
|
var address = '0' + record.address; // prevent case of two leading blanks, such as '::1'
|
||||||
|
var parts = address.split(':');
|
||||||
|
parts.forEach(function (sedectet, i) {
|
||||||
|
if (!sedectet) {
|
||||||
|
parts[i] = '0';
|
||||||
|
while (parts.length < 8) {
|
||||||
|
parts.splice(i + 1, 0, '0');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
parts.forEach(function (sedectet) {
|
||||||
|
dv.setUint16(total, parseInt(sedectet, 16), false);
|
||||||
|
total += 2;
|
||||||
|
});
|
||||||
|
|
||||||
|
return total;
|
||||||
|
};
|
||||||
|
|
||||||
|
}('undefined' !== typeof window ? window : exports));
|
|
@ -0,0 +1,45 @@
|
||||||
|
(function (exports) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var classes = exports.DNS_CLASSES || require('./dns.classes.js').DNS_CLASSES;
|
||||||
|
var types = exports.DNS_TYPES || require('./dns.types.js').DNS_TYPES;
|
||||||
|
|
||||||
|
exports.DNS_RDATA_PACK = function (ab, dv, total, record) {
|
||||||
|
// ab is needed if the rdata makes use of compression pointers
|
||||||
|
// packet is given for convenience
|
||||||
|
var packer;
|
||||||
|
var className = classes[record.class];
|
||||||
|
var typeName = types[record.type];
|
||||||
|
|
||||||
|
|
||||||
|
if (!className) {
|
||||||
|
throw new Error("Support for DNS Class 0x" + record.class.toString(16) + " (" + record.class + ")"
|
||||||
|
+ " is not implemented yet. Open an issue if you actually need support"
|
||||||
|
+ " (i.e. you're not working with a malformed packet)"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!typeName) {
|
||||||
|
throw new Error("Support for DNS Type 0x" + record.type.toString(16) + " (" + record.type + ")"
|
||||||
|
+ " is not implemented yet. Open an issue if you actually need support"
|
||||||
|
+ " (i.e. you're not working with a malformed packet)"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
packer = exports['DNS_PACKER_TYPE_' + typeName]
|
||||||
|
|| require('./dns.packer.type.' + typeName.toLowerCase())['DNS_PACKER_TYPE_' + typeName];
|
||||||
|
}
|
||||||
|
catch (e) { /*console.error(e)*/ }
|
||||||
|
|
||||||
|
if (!packer) {
|
||||||
|
throw new Error("Packer for DNS Type " + typeName + " could not be loaded."
|
||||||
|
+ " Did you include <script src=\"dns.packer.type." + typeName.toLowerCase() + ".js\"></script> ?"
|
||||||
|
+ " (or perhaps we plan to implement it and haven't yet - in which case please open an issue)"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return packer(ab, dv, total, record);
|
||||||
|
};
|
||||||
|
|
||||||
|
}('undefined' !== typeof window ? window : exports));
|
|
@ -1,9 +1,6 @@
|
||||||
(function (exports) {
|
(function (exports) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var classes = exports.DNS_CLASSES || require('./dns.classes.js').DNS_CLASSES;
|
|
||||||
var types = exports.DNS_TYPES || require('./dns.types.js').DNS_TYPES;
|
|
||||||
|
|
||||||
exports.DNS_RDATA_PARSE = function (ab, packet, record) {
|
exports.DNS_RDATA_PARSE = function (ab, packet, record) {
|
||||||
// ab is needed if the rdata makes use of compression pointers
|
// ab is needed if the rdata makes use of compression pointers
|
||||||
// packet is given for convenience
|
// packet is given for convenience
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var packer = require('../dns.packer.type.a.js').DNS_PACKER_TYPE_A;
|
||||||
|
var ab = new ArrayBuffer(4);
|
||||||
|
var dv = new DataView(ab);
|
||||||
|
var total;
|
||||||
|
|
||||||
|
// just to see that bytes are changed as a marker
|
||||||
|
dv.setUint32(0x0, 0xDDDDDDDD, false);
|
||||||
|
|
||||||
|
[ '0.0.0.0'
|
||||||
|
, '127.0.0.1'
|
||||||
|
, '192.168.1.100'
|
||||||
|
, '216.21.170.44'
|
||||||
|
, '255.255.255.255'
|
||||||
|
].forEach(function (ipv4) {
|
||||||
|
total = 0;
|
||||||
|
total = packer(ab, dv, total, { address: ipv4 });
|
||||||
|
if (0x04 !== total) {
|
||||||
|
console.error('unexpected total ' + total);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
if (ipv4 !== new Uint8Array(ab).join('.')) {
|
||||||
|
console.error("expected: ", ipv4);
|
||||||
|
console.error("actual: ", new Uint8Array(ab).join('.'));
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('PASS');
|
|
@ -0,0 +1,41 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var packer = require('../dns.packer.type.aaaa.js').DNS_PACKER_TYPE_AAAA;
|
||||||
|
var ab = new ArrayBuffer(20);
|
||||||
|
var dv = new DataView(ab);
|
||||||
|
var total = 0;
|
||||||
|
|
||||||
|
// just to see that bytes are changed as a marker
|
||||||
|
dv.setUint16(0x0, 0xDDDD, false);
|
||||||
|
dv.setUint16(0x2, 0xDDDD, false);
|
||||||
|
dv.setUint16(0x4, 0xDDDD, false);
|
||||||
|
dv.setUint16(0x6, 0xDDDD, false);
|
||||||
|
dv.setUint16(0x8, 0xDDDD, false);
|
||||||
|
dv.setUint16(0xA, 0xDDDD, false);
|
||||||
|
dv.setUint16(0xC, 0xDDDD, false);
|
||||||
|
dv.setUint16(0xE, 0xDDDD, false);
|
||||||
|
dv.setUint16(0x10, 0xDDDD, false);
|
||||||
|
dv.setUint16(0x12, 0xDDDD, false);
|
||||||
|
|
||||||
|
[ [ '::1'
|
||||||
|
, [ 0xDD, 0xDD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0xDD, 0xDD ].join(' ') ]
|
||||||
|
, [ 'fe80::1'
|
||||||
|
, [ 0xDD, 0xDD, 0xFE, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0xDD, 0xDD ].join(' ') ]
|
||||||
|
, [ 'fd41:50ca:2169:f4e:5020:f756:ca4e:c3b5'
|
||||||
|
, [ 0xDD, 0xDD, 0xFD, 0x41, 0x50, 0xCA, 0x21, 0x69, 0x0F, 0x4E
|
||||||
|
, 0x50, 0x20, 0xF7, 0x56, 0xCA, 0x4E, 0xC3, 0xB5, 0xDD, 0xDD ].join(' ') ]
|
||||||
|
].forEach(function (ipv6) {
|
||||||
|
total = 2; // leave leading 0x00
|
||||||
|
total = packer(ab, dv, total, { address: ipv6[0] });
|
||||||
|
if (0x12 !== total) {
|
||||||
|
console.error('unexpected total ' + total);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
if (ipv6[1] !== new Uint8Array(ab).join(' ')) {
|
||||||
|
console.error("expected: ", ipv6[1]);
|
||||||
|
console.error("actual: ", new Uint8Array(ab).join(' '));
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('PASS');
|
Loading…
Reference in New Issue