over-the-wire
Version:
Network inspection library for Node
79 lines (67 loc) • 2.8 kB
JavaScript
const { strict: assert } = require('node:assert');
const test = require('node:test');
const { DNS } = require('#lib/layers/DNS');
const { DNSRecordType, DNSRecordClass } = require('#lib/layers/DNSEnums');
// Sample DNS query packet for google.com
const queryBuf = Buffer.from('00000100000100000000000006676f6f676c6503636f6d0000010001', 'hex');
// Sample DNS response packet for google.com
const responseBuf = Buffer.from('00008180000100010000000006676f6f676c6503636f6d0000010001c00c000100010000012c0004d83ad6e7', 'hex');
function roundtrip(buf, Cls = DNS) {
const parsed = new Cls(buf);
const obj = parsed.toObject();
const reparsed = new Cls(obj);
if (Buffer.compare(parsed.buffer.slice(0, reparsed.buffer.length), reparsed.buffer)) {
console.log('roundtrip', obj, parsed.buffer.slice(0, reparsed.buffer.length), reparsed.buffer, reparsed.toObject());
}
assert.equal(Buffer.compare(parsed.buffer.slice(0, reparsed.buffer.length), reparsed.buffer), 0, 'buffer -> parse -> object -> buffer roundtrip');
assert.deepEqual(reparsed.toObject(), obj, 'object roundtrip');
}
test('DNS Query', async () => {
const dns = new DNS(queryBuf);
assert.equal(dns.id, 0);
assert.equal(dns.flags, 0x0100);
assert.equal(dns.qdcount, 1);
assert.equal(dns.ancount, 0);
assert.equal(dns.nscount, 0);
assert.equal(dns.arcount, 0);
assert.ok(dns.isQuery);
assert.equal(dns.opcode, 0);
assert.equal(dns.recursionDesired, true);
assert.equal(dns.recursionAvailable, false);
assert.equal(dns.responseCode, 0);
const query = dns.getFirstQuery();
assert.ok(query);
assert.equal(query.name, 'google.com');
assert.equal(query.type, DNSRecordType.A);
assert.equal(query.class, DNSRecordClass.IN);
roundtrip(queryBuf);
});
test('DNS Response', async () => {
const dns = new DNS(responseBuf);
assert.equal(dns.id, 0);
assert.equal(dns.flags, 0x8180);
assert.equal(dns.qdcount, 1);
assert.equal(dns.ancount, 1);
assert.equal(dns.nscount, 0);
assert.equal(dns.arcount, 0);
assert.ok(dns.isResponse);
assert.equal(dns.opcode, 0);
assert.equal(dns.authoritativeAnswer, false);
assert.equal(dns.truncation, false);
assert.equal(dns.recursionDesired, true);
assert.equal(dns.recursionAvailable, true);
assert.equal(dns.responseCode, 0);
const query = dns.getFirstQuery();
assert.ok(query);
assert.equal(query.name, 'google.com');
assert.equal(query.type, DNSRecordType.A);
assert.equal(query.class, DNSRecordClass.IN);
const answer = dns.getFirstAnswer();
assert.ok(answer);
assert.equal(answer.name, 'google.com');
assert.equal(answer.type, DNSRecordType.A);
assert.equal(answer.class, DNSRecordClass.IN);
assert.equal(answer.ttl, 300);
assert.equal(answer.data.toString('hex'), 'd83ad6e7');
roundtrip(responseBuf);
});