started fixing format to match native dns. Spotted bug in unpacking labels. Not fixed yet

This commit is contained in:
Daplie 2017-02-02 18:39:32 -07:00
parent 59d27abafa
commit 087dc9555d
14 changed files with 107 additions and 51 deletions

11
demo.css Normal file
View File

@ -0,0 +1,11 @@
/* style page for DNS demo*/
input {
width: 50%;
height: 150px;
padding: 12px 20px;
}

View File

@ -1,5 +1,9 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head>
<title>DNS Parser Demo</title>
<link rel="stylesheet" type="text/css" href="demo.css">
</head>
<body> <body>
<!-- <!--
@ -11,6 +15,25 @@
<!-- run `serve-https` to test at https://localhost.daplie.me:8443/demo.html --> <!-- run `serve-https` to test at https://localhost.daplie.me:8443/demo.html -->
<!-- put form here --> <!-- put form here -->
<form action="inputdata">
base64:<br>
<input type="textarea" name="base64" value="">
<br>
urlsafe base64:<br>
<input type="textarea" name="urlsafe base64" value="">
<br>
hex:<br>
<input type="textarea" name="hex" value="">
<br>
<!--
JSON (Uint8Array):<br>
<output type="text" name="hex" value="">
<br>-->
<!-- I added some of the library files for you --> <!-- I added some of the library files for you -->
<script src="./dns.types.js"></script> <script src="./dns.types.js"></script>
@ -21,10 +44,13 @@
<script src="./dns.parser.js"></script> <script src="./dns.parser.js"></script>
<script src="./dns.packer.js"></script> <script src="./dns.packer.js"></script>
<script src="./dns.js"></script> <script src="./dns.js"></script>
<script src="./browser.js"></script>
<!-- put jquery here --> <!-- put jquery here -->
<!-- application code in here --> <!-- application code in here -->
<script src="./browser.js"></script>
</body> </body>
</html> </html>

8
dns.js
View File

@ -6,7 +6,8 @@
var Parser = (exports.DNS_PARSER || require('./dns.parser.js').DNS_PARSER); var Parser = (exports.DNS_PARSER || require('./dns.parser.js').DNS_PARSER);
var Packer = (exports.DNS_PACKER || require('./dns.packer.js').DNS_PACKER); var Packer = (exports.DNS_PACKER || require('./dns.packer.js').DNS_PACKER);
var classes = exports.DNS_CLASSES || require('./dns.classes.js').DNS_CLASSES;
var types = exports.DNS_TYPES || require('./dns.types.js').DNS_TYPES;
exports.DNSPacket = { exports.DNSPacket = {
parse: function (nb) { parse: function (nb) {
// backwards compat with node buffer // backwards compat with node buffer
@ -14,11 +15,10 @@ exports.DNSPacket = {
var packet = Parser.unpack(ab); var packet = Parser.unpack(ab);
function tryParseRdata(record) { function tryParseRdata(record) {
record.data = null;
record.error = null;
try { try {
record.data = Parser.unpackRdata(ab, packet, record);
record = Parser.unpackRdata(ab, packet, record);
} catch (e) { } catch (e) {
console.error('[Error] unpackRdata: ' + e.message); console.error('[Error] unpackRdata: ' + e.message);
record.error = e; record.error = e;

View File

@ -106,8 +106,8 @@ pdns.unpack = function (ab) {
q.className = classes[q.class]; q.className = classes[q.class];
q.typeName = types[q.type]; q.typeName = types[q.type];
console.log('*********************'); // console.log('*********************');
console.log(q.typeName); // console.log(q.typeName);
return q; return q;
} }
@ -157,8 +157,8 @@ pdns.unpack = function (ab) {
// TODO actually parse RDATA // TODO actually parse RDATA
q.rdstart = total; q.rdstart = total;
console.log('q.rdata', q.rdlength, 'bytes:'); // console.log('q.rdata', q.rdlength, 'bytes:');
console.log(new Uint8Array(ab).slice(total, total + q.rdlength)); // console.log(new Uint8Array(ab).slice(total, total + q.rdlength));
//q.rdata = Array.prototype.slice.apply(q.rdata); //q.rdata = Array.prototype.slice.apply(q.rdata);
//q.rdend = q.rdstart + q.rdlength; //q.rdend = q.rdstart + q.rdlength;

View File

@ -37,6 +37,9 @@ exports.DNS_RDATA_PARSE = function (ab, packet, record) {
); );
} }
// NOTE: record will be modified
// Things that get added include:
// address, data, priority exchange, weight,
return parser(ab, packet, record); return parser(ab, packet, record);
}; };

View File

@ -6,8 +6,9 @@
exports.DNS_TYPE_A = function (ab, packet, record) { exports.DNS_TYPE_A = function (ab, packet, record) {
var ui8 = new Uint8Array(ab.slice(record.rdstart, record.rdstart + record.rdlength)); var ui8 = new Uint8Array(ab.slice(record.rdstart, record.rdstart + record.rdlength));
// i.e. 127.0.0.1 // i.e. 127.0.0.1
record.address = ui8[0] + '.' + ui8[1] + '.' + ui8[2] + '.' + ui8[3];
return ui8[0] + '.' + ui8[1] + '.' + ui8[2] + '.' + ui8[3]; return record;
}; };
}('undefined' !== typeof window ? window : exports)); }('undefined' !== typeof window ? window : exports));

View File

@ -27,7 +27,8 @@ exports.DNS_TYPE_AAAA = function (ab, packet, record) {
s += dv.getUint16(i, false).toString(16); s += dv.getUint16(i, false).toString(16);
} }
return s; record.address = s;
return record;
}; };
}('undefined' !== typeof window ? window : exports)); }('undefined' !== typeof window ? window : exports));

View File

@ -7,7 +7,8 @@
var unpackLabels = exports.DNS_UNPACK_LABELS || require('./dns.unpack-labels.js').DNS_UNPACK_LABELS; var unpackLabels = exports.DNS_UNPACK_LABELS || require('./dns.unpack-labels.js').DNS_UNPACK_LABELS;
exports.DNS_TYPE_CNAME = function (ab, packet, record) { exports.DNS_TYPE_CNAME = function (ab, packet, record) {
return unpackLabels(new Uint8Array(ab), record.rdstart, { byteLength: 0, cpcount: 0, labels: [], name: '' }).name; record.data = unpackLabels(new Uint8Array(ab), record.rdstart, { byteLength: 0, cpcount: 0, labels: [], name: '' }).name;
return record;
}; };
}('undefined' !== typeof window ? window : exports)); }('undefined' !== typeof window ? window : exports));

View File

@ -15,10 +15,10 @@ exports.DNS_TYPE_MX = function (ab, packet, record) {
var rdataAb = ab.slice(record.rdstart, record.rdstart + record.rdlength); var rdataAb = ab.slice(record.rdstart, record.rdstart + record.rdlength);
var dv = new DataView(rdataAb); var dv = new DataView(rdataAb);
return { record.priority = dv.getUint16(0, false);
priority: dv.getUint16(0, false) record.exchange = unpackLabels(new Uint8Array(ab), record.rdstart+2, { byteLength: 0, cpcount: 0, labels: [], name: '' }).name;
, exchange: unpackLabels(new Uint8Array(ab), record.rdstart+2, { byteLength: 0, cpcount: 0, labels: [], name: '' }).name
}; return record;
}; };

View File

@ -8,8 +8,8 @@ var unpackLabels = exports.DNS_UNPACK_LABELS || require('./dns.unpack-labels.js'
exports.DNS_TYPE_NS = function (ab , packet, record) { exports.DNS_TYPE_NS = function (ab , packet, record) {
record.data = unpackLabels(new Uint8Array(ab), record.rdstart, { byteLength: 0, cpcount: 0, labels: [], name: '' }).name;
return unpackLabels(new Uint8Array(ab), record.rdstart, { byteLength: 0, cpcount: 0, labels: [], name: '' }).name; return record;
}; };

View File

@ -11,7 +11,7 @@
var unpackLabels = exports.DNS_UNPACK_LABELS || require('./dns.unpack-labels.js').DNS_UNPACK_LABELS; var unpackLabels = exports.DNS_UNPACK_LABELS || require('./dns.unpack-labels.js').DNS_UNPACK_LABELS;
exports.DNS_TYPE_PTR = function (ab, pack, record) { exports.DNS_TYPE_PTR = function (ab, pack, record) {
record.data = unpackLabels(new Uint8Array(ab), record.rdstart, { byteLength: 0, cpcount: 0, labels: [], name: '' }).name;
return unpackLabels(new Uint8Array(ab), record.rdstart, { byteLength: 0, cpcount: 0, labels: [], name: '' }).name; return record;
}; };
}('undefined' !== typeof window ? window : exports)); }('undefined' !== typeof window ? window : exports));

View File

@ -11,31 +11,13 @@ exports.DNS_TYPE_SRV = function (ab, packet, record) {
var rdataAb = ab.slice(record.rdstart,record.rdstart + record.rdlength) var rdataAb = ab.slice(record.rdstart,record.rdstart + record.rdlength)
var dv = new DataView(rdataAb); var dv = new DataView(rdataAb);
// var string = '';
// var data = '';
// for (var i = 0; i < dv.byteLength; i+=1){
// data = dv.getUint8(i, false);
// string = String.fromCharCode(data); record.priority = dv.getUint16(0, false);
// console.log("data at index " + i + " is " + string); record.weight = dv.getUint16(2, false);
// } record.port = dv.getUint16(4, false);
record.target = unpackLabels(new Uint8Array(ab), record.rdstart+6, { byteLength: 0, cpcount: 0, labels: [], name: '' }).name;
console.log("***************************"); return record;
console.log("printing dataView!!!");
for (var i = 0; i < dv.byteLength; i+=1) {
console.log(dv.getUint8(i, false));
}
var s = {
priority: dv.getUint16(0, false)
, weight: dv.getUint16(2, false)
, port: dv.getUint16(4, false)
, target: unpackLabels(new Uint8Array(ab), record.rdstart+6, { byteLength: 0, cpcount: 0, labels: [], name: '' }).name
}
return s;
}; };
}('undefined' !== typeof window ? window : exports)); }('undefined' !== typeof window ? window : exports));

View File

@ -5,11 +5,30 @@
// with a host or other name, such as a human readable information about a server // with a host or other name, such as a human readable information about a server
// network, data center, and other accounting information. // network, data center, and other accounting information.
var unpackLabels = exports.DNS_UNPACK_LABELS || require('./dns.unpack-labels.js').DNS_UNPACK_LABELS; var unpackLabels = exports.DNS_UNPACK_LABELS || require('./dns.unpack-labels.js').DNS_UNPACK_LABELS;
exports.DNS_TYPE_TXT = function (ab, pack, record) { exports.DNS_TYPE_TXT = function (ab, packet, record) {
return unpackLabels(new Uint8Array(ab), record.rdstart, { byteLength: 0, cpcount: 0, labels: [], name: '' }).name;
var rdataAb = ab.slice(record.rdstart, record.rdstart + record.rdlength);
console.log(rdataAb);
var dv = new DataView(rdataAb);
// var d = '';
// var string = '';
// for (var i = 0; i < dv.byteLength; i+= 1){
// d = dv.getUint8(i, false);
// string = String.fromCharCode(d);
// console.log("data at: " + i + " is: " + string);
//
record.data = unpackLabels(new Uint8Array(ab), record.rdstart, { byteLength: 0, cpcount: 0, labels: [], name: '' }).name;
var l = unpackLabels(new Uint8Array(ab), record.rdstart, { byteLength: 0, cpcount: 0, labels: [], name: '' });
console.log("labels: " + JSON.stringify(l));
return record;
}; };
}('undefined' !== typeof window ? window : exports)); }('undefined' !== typeof window ? window : exports));

View File

@ -18,8 +18,13 @@ exports.DNS_UNPACK_LABELS = function (ui8, ptr, q) {
var label = []; var label = [];
do { do {
console.log("total: " + total);
label.length = 0; label.length = 0;
len = ui8[total]; len = ui8[total];
console.log("len: " + len);
if (len === undefined){
console.log("error!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
}
if (0xc0 === len) { if (0xc0 === len) {
var cpptr = ui8[total + 1]; var cpptr = ui8[total + 1];
@ -27,6 +32,8 @@ exports.DNS_UNPACK_LABELS = function (ui8, ptr, q) {
ptr = cpptr; ptr = cpptr;
q.cpcount += 1; q.cpcount += 1;
q.byteLength += 2; // cp and len q.byteLength += 2; // cp and len
// recursion
return exports.DNS_UNPACK_LABELS(ui8, ptr, q); return exports.DNS_UNPACK_LABELS(ui8, ptr, q);
} }
//str.length = 0; // fast empty array //str.length = 0; // fast empty array
@ -40,12 +47,17 @@ exports.DNS_UNPACK_LABELS = function (ui8, ptr, q) {
total += 1; total += 1;
// TODO check url-allowable characters // TODO check url-allowable characters
label.push(String.fromCharCode(ui8[total])); label.push(String.fromCharCode(ui8[total]));
console.log("pushed (ui8) " + ui8[total] + " to labels at i = " + i);
console.log("in char: " + String.fromCharCode(ui8[total]));
} }
if (label.length) { if (label.length) {
console.log("pushed a label " + q.labels + " at index " + i);
q.labels.push(label.join('')); q.labels.push(label.join(''));
} }
total += 1; total += 1;
//console.log('total', total, ui8[total], String.fromCharCode(ui8[total])); // console.log('total', total, ui8[total], String.fromCharCode(ui8[total]));
} while (len); } while (len);
//str.pop(); // remove trailing '.' //str.pop(); // remove trailing '.'
@ -54,7 +66,7 @@ exports.DNS_UNPACK_LABELS = function (ui8, ptr, q) {
if (0 === q.cpcount) { if (0 === q.cpcount) {
q.byteLength = total - ptr; q.byteLength = total - ptr;
} }
console.log("returning q! " + JSON.stringify(q));
return q; return q;
}; };