Fix A & AAAA, add CNAME Tests
This commit is contained in:
parent
737b31fcc2
commit
f44d8eed71
|
@ -9,7 +9,8 @@ exports.DNS_PACKER_TYPE_A = function (ab, dv, total, record) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// RDLENGTH
|
// RDLENGTH
|
||||||
dv.setUint16(total, 4, false);
|
var IP_LEN = 4;
|
||||||
|
dv.setUint16(total, IP_LEN, false);
|
||||||
total += 2;
|
total += 2;
|
||||||
|
|
||||||
// RDATA
|
// RDATA
|
||||||
|
|
|
@ -25,7 +25,8 @@ exports.DNS_PACKER_TYPE_AAAA = function (ab, dv, total, record) {
|
||||||
});
|
});
|
||||||
|
|
||||||
// RDLENGTH
|
// RDLENGTH
|
||||||
dv.setUint16(total, 16, false);
|
var IP_LEN = 16;
|
||||||
|
dv.setUint16(total, IP_LEN, false);
|
||||||
total += 2;
|
total += 2;
|
||||||
|
|
||||||
// RDATA
|
// RDATA
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
(function (exports) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// A 'CNAME' record is a 32-bit value representing the IP address
|
||||||
|
|
||||||
|
exports.DNS_PACKER_TYPE_CNAME = function (ab, dv, total, record) {
|
||||||
|
if (!record.data) {
|
||||||
|
throw new Error("no data for CNAME record");
|
||||||
|
}
|
||||||
|
|
||||||
|
var cnameLen = 0;
|
||||||
|
var rdLenIndex = total;
|
||||||
|
total += 2;
|
||||||
|
|
||||||
|
// RDATA
|
||||||
|
// i.e. 127.0.0.1 => 0x7F, 0x00, 0x00, 0x01
|
||||||
|
record.data.split('.').forEach(function (label) {
|
||||||
|
cnameLen += 1 + label.length;
|
||||||
|
|
||||||
|
dv.setUint8(total, label.length, false);
|
||||||
|
total += 1;
|
||||||
|
|
||||||
|
label.split('').forEach(function (ch) {
|
||||||
|
dv.setUint8(total, ch.charCodeAt(0), false);
|
||||||
|
total += 1;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// RDLENGTH
|
||||||
|
dv.setUint16(rdLenIndex, record.data.length + 1, false);
|
||||||
|
|
||||||
|
return total;
|
||||||
|
};
|
||||||
|
|
||||||
|
}('undefined' !== typeof window ? window : exports));
|
|
@ -1,7 +1,7 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var packer = require('../dns.packer.type.a.js').DNS_PACKER_TYPE_A;
|
var packer = require('../dns.packer.type.a.js').DNS_PACKER_TYPE_A;
|
||||||
var ab = new ArrayBuffer(4);
|
var ab = new ArrayBuffer(6); // 16-bit RDLENGTH + 32-bit address
|
||||||
var dv = new DataView(ab);
|
var dv = new DataView(ab);
|
||||||
var total;
|
var total;
|
||||||
|
|
||||||
|
@ -16,11 +16,12 @@ dv.setUint32(0x0, 0xDDDDDDDD, false);
|
||||||
].forEach(function (ipv4) {
|
].forEach(function (ipv4) {
|
||||||
total = 0;
|
total = 0;
|
||||||
total = packer(ab, dv, total, { address: ipv4 });
|
total = packer(ab, dv, total, { address: ipv4 });
|
||||||
if (0x04 !== total) {
|
if (0x06 !== total) {
|
||||||
console.error('unexpected total ' + total);
|
console.error('unexpected total ' + total);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
if (ipv4 !== new Uint8Array(ab).join('.')) {
|
// 0.4 is just a hacky way to account for the RDLENGTH
|
||||||
|
if ('0.4.' + ipv4 !== new Uint8Array(ab).join('.')) {
|
||||||
console.error("expected: ", ipv4);
|
console.error("expected: ", ipv4);
|
||||||
console.error("actual: ", new Uint8Array(ab).join('.'));
|
console.error("actual: ", new Uint8Array(ab).join('.'));
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var packer = require('../dns.packer.type.aaaa.js').DNS_PACKER_TYPE_AAAA;
|
var packer = require('../dns.packer.type.aaaa.js').DNS_PACKER_TYPE_AAAA;
|
||||||
var ab = new ArrayBuffer(20);
|
var ab = new ArrayBuffer(22);
|
||||||
var dv = new DataView(ab);
|
var dv = new DataView(ab);
|
||||||
var total = 0;
|
var total = 0;
|
||||||
|
|
||||||
|
@ -16,18 +16,19 @@ dv.setUint16(0xC, 0xDDDD, false);
|
||||||
dv.setUint16(0xE, 0xDDDD, false);
|
dv.setUint16(0xE, 0xDDDD, false);
|
||||||
dv.setUint16(0x10, 0xDDDD, false);
|
dv.setUint16(0x10, 0xDDDD, false);
|
||||||
dv.setUint16(0x12, 0xDDDD, false);
|
dv.setUint16(0x12, 0xDDDD, false);
|
||||||
|
dv.setUint16(0x14, 0xDDDD, false);
|
||||||
|
|
||||||
[ [ '::1'
|
[ [ '::1'
|
||||||
, [ 0xDD, 0xDD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0xDD, 0xDD ].join(' ') ]
|
, [ 0xDD, 0xDD, 0x00, 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0xDD, 0xDD ].join(' ') ]
|
||||||
, [ 'fe80::1'
|
, [ 'fe80::1'
|
||||||
, [ 0xDD, 0xDD, 0xFE, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0xDD, 0xDD ].join(' ') ]
|
, [ 0xDD, 0xDD, 0x00, 0x10, 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'
|
, [ 'fd41:50ca:2169:f4e:5020:f756:ca4e:c3b5'
|
||||||
, [ 0xDD, 0xDD, 0xFD, 0x41, 0x50, 0xCA, 0x21, 0x69, 0x0F, 0x4E
|
, [ 0xDD, 0xDD, 0x00, 0x10, 0xFD, 0x41, 0x50, 0xCA, 0x21, 0x69, 0x0F, 0x4E
|
||||||
, 0x50, 0x20, 0xF7, 0x56, 0xCA, 0x4E, 0xC3, 0xB5, 0xDD, 0xDD ].join(' ') ]
|
, 0x50, 0x20, 0xF7, 0x56, 0xCA, 0x4E, 0xC3, 0xB5, 0xDD, 0xDD ].join(' ') ]
|
||||||
].forEach(function (ipv6) {
|
].forEach(function (ipv6) {
|
||||||
total = 2; // leave leading 0x00
|
total = 2; // leave leading 0xDD
|
||||||
total = packer(ab, dv, total, { address: ipv6[0] });
|
total = packer(ab, dv, total, { address: ipv6[0] });
|
||||||
if (0x12 !== total) {
|
if (0x14 !== total) {
|
||||||
console.error('unexpected total ' + total);
|
console.error('unexpected total ' + total);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var packer = require('../dns.packer.type.cname.js').DNS_PACKER_TYPE_CNAME;
|
||||||
|
var ab = new ArrayBuffer(255); // max len per label is 63, max label sequence is 254 + null terminator
|
||||||
|
var dv = new DataView(ab);
|
||||||
|
var total = 0;
|
||||||
|
|
||||||
|
[ [ 'www.example.com'
|
||||||
|
, [ 0x00, 0x10, 0x03, 119, 119, 119, 0x07, 101, 120, 97, 109, 112, 108, 101, 0x03, 99, 111, 109 ].join(' ') ]
|
||||||
|
].forEach(function (cname) {
|
||||||
|
total = packer(ab, dv, total, { data: cname[0] });
|
||||||
|
ab = ab.slice(0, total);
|
||||||
|
// TODO: Check that total increments appropriately
|
||||||
|
if (cname[1] !== new Uint8Array(ab).join(' ')) {
|
||||||
|
console.error("expected: ", cname[1]);
|
||||||
|
console.error("actual: ", new Uint8Array(ab).join(' '));
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('PASS');
|
Loading…
Reference in New Issue