290 lines
8.4 KiB
JavaScript
290 lines
8.4 KiB
JavaScript
|
var Lab = require('lab');
|
||
|
var lab = exports.lab = Lab.script();
|
||
|
|
||
|
var describe = lab.describe;
|
||
|
var it = lab.it;
|
||
|
//var before = lab.before;
|
||
|
//var after = lab.after;
|
||
|
var Code = require('code'); // assertion library
|
||
|
var expect = Code.expect;
|
||
|
|
||
|
//var debug = require('debug')('mdns-packet:test:dns');
|
||
|
var path = require('path');
|
||
|
//var fs = require('fs');
|
||
|
|
||
|
var helper = require('./helper');
|
||
|
var dns = require('../');
|
||
|
var DNSRecord = dns.DNSRecord;
|
||
|
var DNSPacket = dns.DNSPacket;
|
||
|
|
||
|
var fixtureDir = path.join(__dirname, 'fixtures');
|
||
|
var nativeFixtureDir = path.join(__dirname, '..', 'node_modules',
|
||
|
'native-dns-packet', 'test', 'fixtures');
|
||
|
|
||
|
var NativePacket = require('native-dns-packet');
|
||
|
|
||
|
|
||
|
describe('DNSPacket', function () {
|
||
|
|
||
|
it('should be able to create a wildcard query', function (done) {
|
||
|
var packet = new dns.DNSPacket();
|
||
|
packet.header.rd = 0;
|
||
|
var query = new dns.DNSRecord(
|
||
|
'_services._dns-sd._udp.local',
|
||
|
dns.DNSRecord.Type.PTR,
|
||
|
1
|
||
|
);
|
||
|
packet.question.push(query);
|
||
|
var buf = dns.DNSPacket.toBuffer(packet);
|
||
|
|
||
|
//compare fixture
|
||
|
expect(buf.toString('hex'), 'Not as from fixture').to.equal(
|
||
|
helper.readBin(
|
||
|
path.join(fixtureDir, 'mdns-outbound-wildcard-query.bin')
|
||
|
).toString('hex'));
|
||
|
|
||
|
var np = new NativePacket();
|
||
|
np.header.rd = 0;
|
||
|
np.question.push(query);
|
||
|
var nb = new Buffer(4096);
|
||
|
var written = NativePacket.write(nb, np);
|
||
|
nb = nb.slice(0, written);
|
||
|
|
||
|
expect(buf.toString('hex'), 'Not as from native').to.equal(
|
||
|
nb.toString('hex'));
|
||
|
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
it('should be able to create PTR answer', function (done) {
|
||
|
var packet = new dns.DNSPacket();
|
||
|
packet.header.rd = 0;
|
||
|
packet.header.qr = 1;
|
||
|
packet.header.aa = 1;
|
||
|
//query
|
||
|
var query = new dns.DNSRecord(
|
||
|
'_services._dns-sd._udp.local',
|
||
|
dns.DNSRecord.Type.PTR,
|
||
|
1
|
||
|
);
|
||
|
packet.question.push(query);
|
||
|
|
||
|
//answer
|
||
|
packet.answer.push({
|
||
|
name: '_services._dns-sd._udp.local', //reference to first record name
|
||
|
type: dns.DNSRecord.Type.PTR,
|
||
|
class: 1,
|
||
|
ttl: 10,
|
||
|
data: '_workstation._tcp.local'
|
||
|
});
|
||
|
|
||
|
packet.answer.push({
|
||
|
name: '_services._dns-sd._udp.local', //reference to first record name
|
||
|
type: dns.DNSRecord.Type.PTR,
|
||
|
class: 1,
|
||
|
ttl: 10,
|
||
|
data: '_udisks-ssh._tcp.local'
|
||
|
});
|
||
|
|
||
|
var buf = dns.DNSPacket.toBuffer(packet);
|
||
|
|
||
|
var pr = dns.DNSPacket.parse(buf);
|
||
|
var fixture = helper.readBin(
|
||
|
path.join(fixtureDir, 'mdns-inbound-linux_workstation.bin')
|
||
|
);
|
||
|
|
||
|
helper.equalDeep(pr, dns.DNSPacket.parse(fixture));
|
||
|
|
||
|
//helper.equalBuffer(fixture, buf, 8);
|
||
|
// //expect(buf.toString('hex')).to.equal(fixStr);
|
||
|
// var parsed = dns.DNSPacket.parse(buf);
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
|
||
|
it('new packet with flags as input', function (done) {
|
||
|
var p = new dns.DNSPacket(0x40);
|
||
|
expect(p.header.res1).to.equal(1);
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
|
||
|
it('should parse SOA', function (done) {
|
||
|
var inbound = helper.readBin('test/fixtures/dns-soa.bin');
|
||
|
var packet = dns.DNSPacket.parse(inbound);
|
||
|
expect(packet.authority).to.have.length(1);
|
||
|
|
||
|
var auth = packet.authority[0];
|
||
|
|
||
|
expect(auth.type).to.equal(6);
|
||
|
expect(auth.typeName).to.equal('SOA');
|
||
|
|
||
|
expect(auth.primary).to.equal('ns1.google.com');
|
||
|
expect(auth.admin).to.equal('dns-admin.google.com');
|
||
|
expect(auth.serial).to.equal(1576192);
|
||
|
expect(auth.refresh).to.equal(7200);
|
||
|
expect(auth.retry).to.equal(1800);
|
||
|
expect(auth.expiration).to.equal(1209600);
|
||
|
expect(auth.minimum).to.equal(300);
|
||
|
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
it('throw when question does not exist', function (done) {
|
||
|
var buf = new Buffer('0000840000010000000000000000000000', 'hex');
|
||
|
expect(fn).to.throw(dns.errors.MalformedPacket, 'Record.type is empty');
|
||
|
|
||
|
buf = new Buffer('0000840000010000000000000001000000', 'hex');
|
||
|
expect(fn).to.throw(dns.errors.MalformedPacket, 'Record.class is empty');
|
||
|
|
||
|
done();
|
||
|
function fn() {
|
||
|
dns.parse(buf);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
it('should create reverse lookup', function (done) {
|
||
|
var expected = '2aa601000001000000000000013801380138013807696e2d61646472046172706100000c0001';
|
||
|
var packet = new dns.DNSPacket();
|
||
|
packet.header.id = 0x2aa6;
|
||
|
packet.question.push(new dns.DNSRecord(
|
||
|
'8.8.8.8.in-addr.arpa',
|
||
|
dns.DNSRecord.Type.PTR,
|
||
|
dns.DNSRecord.Class.IN));
|
||
|
var buf = dns.DNSPacket.toBuffer(packet);
|
||
|
expect(buf.toString('hex')).to.equal(expected);
|
||
|
packet = dns.DNSPacket.parse(buf);
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
it('should create another reverse lookup', function (done) {
|
||
|
var expected = '10920100000100000000000002353103313637033231310331343007696e2d61646472046172706100000c0001';
|
||
|
var packet = new dns.DNSPacket();
|
||
|
packet.header.id = 4242;
|
||
|
packet.question.push(new dns.DNSRecord(
|
||
|
'51.167.211.140.in-addr.arpa.',
|
||
|
dns.DNSRecord.Type.PTR,
|
||
|
dns.DNSRecord.Class.IN)
|
||
|
);
|
||
|
expect(packet.question[0].type).to.equal(dns.DNSRecord.Type.PTR);
|
||
|
|
||
|
var buf = dns.DNSPacket.toBuffer(packet);
|
||
|
expect(buf.toString('hex')).to.equal(expected);
|
||
|
//roundtrpip
|
||
|
packet = dns.DNSPacket.parse(buf);
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
it('same regardless of id', function (done) {
|
||
|
var expected1 = '10920100000100000000000002353103313637033231310331343007696e2d61646472046172706100000c0001';
|
||
|
var expected2 = '00000100000100000000000002353103313637033231310331343007696e2d61646472046172706100000c0001';
|
||
|
// 00000100000100000000000002353103313637033231310331343007696e2d6164647204617270610000000c0001;
|
||
|
|
||
|
var r = new DNSRecord(
|
||
|
'51.167.211.140.in-addr.arpa.',
|
||
|
DNSRecord.Type.PTR,
|
||
|
DNSRecord.Class.IN);
|
||
|
|
||
|
//packet with id
|
||
|
var p1 = new DNSPacket();
|
||
|
p1.header.id = 4242;
|
||
|
p1.question.push(r);
|
||
|
// console.log('with');
|
||
|
var buf1 = DNSPacket.toBuffer(p1);
|
||
|
expect(buf1.toString('hex'), 'buf1').to.equal(expected1);
|
||
|
|
||
|
//packet without id
|
||
|
var p2 = new DNSPacket();
|
||
|
p2.question.push(r);
|
||
|
// console.log('without');
|
||
|
var buf2 = DNSPacket.toBuffer(p2);
|
||
|
expect(buf2.toString('hex'), 'buf2').to.equal(expected2);
|
||
|
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
describe('parsing fixtures', function () {
|
||
|
|
||
|
describe('basic tests', function () {
|
||
|
helper.createParsingTests(lab, fixtureDir);
|
||
|
});
|
||
|
|
||
|
// it('should do edns OPT RR', {only: true}, function (done) {
|
||
|
// var bin = helper.readBin('test/fixtures/mdns-inbound-apple-mobdev.bin');
|
||
|
// var p = dns.parse(bin);
|
||
|
// //check for opt
|
||
|
// expect(p.additional).to.have.length(1);
|
||
|
// var opt = p.additional[0].opt;
|
||
|
// expect(opt).to.include(['code', 'z', 'version', 'rcode', 'data', 'do']);
|
||
|
// expect(opt.code, 'code').to.equal(4);
|
||
|
// expect(opt.z, 'z').to.equal(4500);
|
||
|
// done();
|
||
|
// });
|
||
|
|
||
|
});
|
||
|
|
||
|
describe('parsing fixtures with roundtrip', function () {
|
||
|
helper.createFileParsingTest(lab,
|
||
|
'test/fixtures/www.nodejs.org.cname.bin', true);
|
||
|
|
||
|
helper.createFileParsingTest(lab,
|
||
|
'test/fixtures/dns-soa.bin', true);
|
||
|
});
|
||
|
|
||
|
// describe('create fixtures', {skip:true}, function () {
|
||
|
// helper.createWritingTests(lab, fixtureDir);
|
||
|
// });
|
||
|
|
||
|
describe('parsing exploits', function () {
|
||
|
it('zlip-1', function (done) {
|
||
|
var bin = helper.readBin('test/fixtures/exploits/zlip-1.bin');
|
||
|
expect(fn).to.throw(dns.errors.MalformedPacket,
|
||
|
'Unexpectedly big section count: 83258. Missing at least 416225 bytes.'
|
||
|
);
|
||
|
done();
|
||
|
function fn() {
|
||
|
dns.parse(bin);
|
||
|
done('should fail');
|
||
|
}
|
||
|
});
|
||
|
|
||
|
it('zlip-2', function (done) {
|
||
|
var bin = helper.readBin('test/fixtures/exploits/zlip-2.bin');
|
||
|
expect(fn).to.throw(dns.errors.MalformedPacket,
|
||
|
'Unexpectedly big section count: 83258. Missing at least 416225 bytes.'
|
||
|
);
|
||
|
done();
|
||
|
function fn() {
|
||
|
dns.parse(bin);
|
||
|
done('should fail');
|
||
|
}
|
||
|
});
|
||
|
|
||
|
it('zlip-3', function (done) {
|
||
|
var bin = helper.readBin('test/fixtures/exploits/zlip-3.bin');
|
||
|
expect(fn).to.throw(dns.errors.MalformedPacket,
|
||
|
'Unexpectedly big section count: 83258. Missing at least 416155 bytes.'
|
||
|
);
|
||
|
done();
|
||
|
function fn() {
|
||
|
dns.parse(bin);
|
||
|
done('should fail');
|
||
|
}
|
||
|
});
|
||
|
});//exploits
|
||
|
|
||
|
// describe('create fixtures', {skip: true}, function () {
|
||
|
// helper.createWritingTests(lab, fixtureDir);
|
||
|
// });
|
||
|
|
||
|
describe('fixtures from native-dns-packet', function () {
|
||
|
describe('parsing', function () {
|
||
|
helper.createParsingTests(lab, nativeFixtureDir);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
});
|