From af89bfa000baefdee682902fd200871717161e1f Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Sat, 11 Feb 2017 15:41:01 -0700 Subject: [PATCH] begin packer and test --- dns.packer.js | 33 ++++++++++++++++++++++++++++++--- dns.parser.js | 2 +- test/packer.js | 44 +++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 74 insertions(+), 5 deletions(-) diff --git a/dns.packer.js b/dns.packer.js index 17c8ef2..dc2e5b9 100644 --- a/dns.packer.js +++ b/dns.packer.js @@ -1,9 +1,36 @@ (function (exports) { 'use strict'; -exports.DNS_PACKER = { - pack: function () { - throw new Error("DNS Packer Not Implemented"); +var dnspack = exports.DNS_PACKER = { + pack: function (packet) { + var total = 0; + var id = packet.header.id; // 2 bytes + total += 2; + var header = dnspack.packHeader(packet.header); // 2 bytes + total += 2; + + var ab = new ArrayBuffer(total); + var dv = new DataView(ab); + dv.setUint16(0, id, false); + dv.setUint16(2, header, false); + + return ab; + } +, packHeader: function(h) { + var val = 0; + + val += (h.qr << 15) & 0x8000; + val += (h.opcode << 11) & 0x7800; + val += (h.aa << 10) & 0x400; + val += (h.tc << 9) & 0x200; + val += (h.rd << 8) & 0x100; + val += (h.ra << 7) & 0x80; + val += (h.res1 << 6) & 0x40; + val += (h.res2 << 5) & 0x20; + val += (h.res3 << 4) & 0x10; + val += h.rcode & 0xF; + + return val; } }; diff --git a/dns.parser.js b/dns.parser.js index 858451a..237b389 100644 --- a/dns.parser.js +++ b/dns.parser.js @@ -46,7 +46,7 @@ pdns.unpackOpt = function (ab, packet, rec) { // TODO index into the correct place in the ArrayBuffer dv = new DataView(new ArrayBuffer(4)); // rec.ttl is actually 1 (extended_rcode), 1 (edns_version), 2:1 (DO), 2:7 (Z) - dv.setUint32(0, packet.ttl); + dv.setUint32(0, packet.ttl, false); // is xrcode this edns_options? packet.xrcode = '0x' + dv.getUint8(0, false).toString(16); if ('0x0' === packet.xrcode) { diff --git a/test/packer.js b/test/packer.js index 2c742c1..d012419 100644 --- a/test/packer.js +++ b/test/packer.js @@ -1,6 +1,48 @@ ;(function () { 'use strict'; - throw new Error("packer tests not written"); + var fs = require('fs'); + var path = require('path'); + var dnsjs = require('../').DNSPacket; + + var dirname = path.join(__dirname, 'fixtures'); + var expected; // shim + var onefile = process.argv[2]; + + var json = JSON.parse(fs.readFileSync(onefile, 'utf8')); + + var ab = dnsjs.write(json); + //console.log(ab); + var ui8 = new Uint8Array(ab); + //console.log(ui8); + var bytecount = 0; + var str = [].slice.call(ui8).map(function (i) { + var h = i.toString(16); + if (h.length < 2) { + h = '0' + h; + } + return h; + }).join('').match(/.{1,2}/g).join(' ').match(/.{1,47}/g).map(function (str) { + var lead = bytecount.toString(16); + bytecount += 10; + + while (lead.length < 8) { + lead = '0' + lead; + } + + return lead + ' ' + str; + }).join('\n'); + var trail = ab.byteLength.toString(16); + while (trail.length < 8) { + trail = '0' + trail; + } + + console.log(''); + console.log('DEBUG with hexdump: '); + console.log('hexdump ' + onefile.replace(/\.[^\.]*$/, '.bin')); + console.log(''); + console.log(str + '\n' + trail); + console.log(''); + }());