From 79e976f665a70b8906961a19e4f5c1b634f76c27 Mon Sep 17 00:00:00 2001 From: Daplie Date: Fri, 20 Jan 2017 17:10:00 -0700 Subject: [PATCH] added the test code that AJ wrote --- README.md | 113 ++++++++++++++++++++++++- parse-binary-test.js | 195 +++++++++++++++++++++++++++++++++++++------ 2 files changed, 279 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 03b6921..01b2650 100644 --- a/README.md +++ b/README.md @@ -132,8 +132,116 @@ the binary output comes out as: 00000000 ``` +In order to figure out where the dnspacket code is going wrong, +We will have to write our own test code to see if the dns code +is doing what it's supposed to be doing. + +Looking at the code below: + +```javascript +// parses through the flags +// val can be 1 or 0 +// (val & 0x8000) >> 15 does the following +// val = 0000 0000 0000 0001 +// & 1001 0000 0000 0000 +// _______________________ +// 0000 0000 0000 0000 +// same if val were 0 +// but if val were 0x8000 +// then +// (val & 0x8000) >> 15 does the following +// val = 1001 0000 0000 0001 +// & 1001 0000 0000 0000 +// _______________________ +// 1001 0000 0000 0000 +// >>15= 0000 0000 0000 0001 + +function parseFlags(val, packet) { + packet.header.qr = (val & 0x8000) >> 15; + packet.header.opcode = (val & 0x7800) >> 11; + packet.header.aa = (val & 0x400) >> 10; + packet.header.tc = (val & 0x200) >> 9; + packet.header.rd = (val & 0x100) >> 8; + packet.header.ra = (val & 0x80) >> 7; + packet.header.res1 = (val & 0x40) >> 6; + packet.header.res2 = (val & 0x20) >> 5; + packet.header.res3 = (val & 0x10) >> 4; + packet.header.rcode = (val & 0xF); +} +``` + +One effective way to check is to create a dns packet, pass it to +a custom packer and parser function and compare the input and output: + +```javascript +'use strict'; + +// order one http://www.binarytides.com/dns-query-code-in-c-with-linux-sockets/ +// order two http://www.zytrax.com/books/dns/ch15/ + +function parse(i) { + var header = { + // first byte appears to be reverse + qr: (i & 0x8000) >> 15 + , opcode: (i & 0x7800) >> 11 + , aa: (i & 0x400) >> 10 + , tc: (i & 0x200) >> 9 + , rd: (i & 0x100) >> 8 + + // second byte appears to be second byte, but also in reverse + , ra: (i & 0x80) >> 7 + , res1: (i & 0x40) >> 6 // z + , res2: (i & 0x20) >> 5 // ad + , res3: (i & 0x10) >> 4 // cd + , rcode: (i & 0x1F) + }; + + return header; +} + +function pack(header) { + var val = 0; + + val += (header.qr << 15) & 0x8000; + val += (header.opcode << 11) & 0x7800; + val += (header.aa << 10) & 0x400; + val += (header.tc << 9) & 0x200; + val += (header.rd << 8) & 0x100; + val += (header.ra << 7) & 0x80; + val += (header.res1 << 6) & 0x40; + val += (header.res2 << 5) & 0x20; + val += (header.res3 << 4) & 0x10; + val += header.rcode & 0x1F; + + return val; +} + +var start = { + qr: 1 +, opcode: 12 +, aa: 0 +, tc: 0 +, rd: 1 +, ra: 0 +, res1: 0 +, res2: 0 +, res3: 0 +, rcode: 0 +}; + +var i = pack(start); + +var obj = parse(i); + +console.log(i); +console.log(start); +console.log(obj); +// does a recursive check to see if start and obj are equal +require('assert').deepEqual(start, obj); + +``` + -What are the possible problems? How to print out hex values of the DNS message in node.js? @@ -150,4 +258,5 @@ socket.on('message', function (message, rinfo) { DNS sec: security -puts a signature on a DNS packet and imprints a signature so that the sender of the packet is confirmed +puts a signature on a DNS packet and imprints a signature so that the sender of +the packet is confirmed diff --git a/parse-binary-test.js b/parse-binary-test.js index 6be02be..bfee546 100644 --- a/parse-binary-test.js +++ b/parse-binary-test.js @@ -4,6 +4,94 @@ // This test code is meant to take a binary sample from the crash of listen.js // example and parse through it to spot where the error occurs. + + + + + + +/*************** ********** Functions *******************/ +/**************************************************************/ + + +// Number generator function: this function should be able to generate +// and output all the the binary combinations of a 8 bits and returns a buffer. +// ex '00000000' - '11111111' + +function cycleThroughHex(){ + // Fill the array from 0 - 65535, so the 65535 case will + // have to be hardcoded + var current_val = 0; + var end_val = 65536; + var i = 0; + var array_size = 65536; + var arr = new Uint16Array(array_size); + // var buf = new Buffer.alloc(array_size); + while (current_val <= end_val){ + + console.log(arr[i]); + arr[i] = current_val;val += header.rcode & 0val += header.rcode & 0xF;xF; + current_val++; + } + var buf = Buffer.from(arr.buffer); + // console.log(buf); + // console.log(buf.length); + // console.log(buf[buf.length]); + + // for (var i = 0; i < buf.length; i++){ + // console.log(buf[i]); + // } + + // return buf; + // this is printing out 10,000 for some reason? +} + + +// message packer: + + +// message parser: +function hasError(output, int, flag){ + var hasError = 0; + if (output > 0x0001 || output < 0x0000){ + console.log("There was an error with" + flag + " at index ", i , ". Output: " + output); + hasError = 1; + } + return hasError; + +} + + +function main (){ + + // var val1 = '00000000'; + // var val2 = '11111111'; + // var val3 = '10101010'; + // var val4 = '01010101'; + var output = 0; + var buf = cycleThroughHex(); + var val = 0; + for (var i = 0; i < buf.length; i++){ + + val = buf[i]; + output = (val & 0x8000) >> 15; // test for qr + hasError(output, i, 'qr') + output = (val & 0x400) >> 10; // test for aa + hasError(output, i, 'aa'); + output = (val & 0x200) >> 9; // test for tc + hasError(output,i, 'tc'); + output = (val & 0x100) >> 8; // test for rd + hasError(output, i , 'rd'); + output = (val & 0x80) >> 7; // test for ra + hasError(output, i, 'ra'); + + } + + console.log("test successful"); + +} + + // ex: pad('11111', 8, '0') function pad(str, len, ch) { @@ -25,21 +113,6 @@ function bin2hex(str){ return hex; } -// ex: hex2ascii('A92F') -function hex2ascii(str){ - - var hex = str.toString(); - var ascii = ''; - for (var n = 0; n < hex.length; n+=2) { - ascii += String.fromCharCode(parseInt(hex.substr(n,2), 16)); - } - - - return ascii; - - } - - function binaryAgent(str) { var binString = ''; @@ -50,22 +123,90 @@ str.split(' ').map(function(bin) { return binString; } -var str = binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100'); -console.log(str); +// binary Agent test + +// var str = binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100'); + +// console.log(str); + +// cycleThroughHex(); +// var hex = (0x8000 & 0x8000) >> 15; +// console.log(hex.toString(16)); + +// main(); + + + + + +'use strict'; + +// order one http://www.binarytides.com/dns-query-code-in-c-with-linux-sockets/ +// order two http://www.zytrax.com/books/dns/ch15/ + +function parse(i) { + var header = { + // first byte appears to be reverse + qr: (i & 0x8000) >> 15 + , opcode: (i & 0x7800) >> 11 + , aa: (i & 0x400) >> 10 + , tc: (i & 0x200) >> 9 + , rd: (i & 0x100) >> 8 + + // second byte appears to be second byte, but also in reverse + , ra: (i & 0x80) >> 7 + , res1: (i & 0x40) >> 6 // z + , res2: (i & 0x20) >> 5 // ad + , res3: (i & 0x10) >> 4 // cd + , rcode: (i & 0x1F) + }; + + return header; +} + +function pack(header) { + var val = 0; + + val += (header.qr << 15) & 0x8000; + val += (header.opcode << 11) & 0x7800; + val += (header.aa << 10) & 0x400; + val += (header.tc << 9) & 0x200; + val += (header.rd << 8) & 0x100; + val += (header.ra << 7) & 0x80; + val += (header.res1 << 6) & 0x40; + val += (header.res2 << 5) & 0x20; + val += (header.res3 << 4) & 0x10; + val += header.rcode & 0x1F; + + return val; +} + +var start = { + qr: 1 +, opcode: 12 +, aa: 0 +, tc: 0 +, rd: 1 +, ra: 0 +, res1: 0 +, res2: 0 +, res3: 0 +, rcode: 0 +}; + +var i = pack(start); + +var obj = parse(i); + +console.log(i); +console.log(start); +console.log(obj); +// does a recursive check to see if start and obj are equal +require('assert').deepEqual(start, obj); -parse -//translates to "Aren't" -// // binary to hex convestion -// var bin = '00001111'; -// var hex = bin2hex(bin); -// // hex to ascii character converstion -// console.log('binary: ' + bin + ' Hex: ' + hex); -// var hex = ''; -// var ascii = hex2ascii(hex); -// console.log('Hex: ' + hex + ' ascii: ' + ascii);