Advertisement
Guest User

Untitled

a guest
May 7th, 2012
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function getWpaPskKeyFromPassphrase(pass, salt) {
  2.  
  3.   /* pad string to 64 bytes and convert to 16 32-bit words */
  4.   function stringtowords(s, padi) {
  5.     /* return a 80-word array for later use in the SHA1 code */
  6.     var z = new Array(80);
  7.     var j = -1, k = 0;
  8.     var n = s.length;
  9.     for (var i = 0; i < 64; i++) {
  10.       var c = 0;
  11.       if (i < n) {
  12.         c = s.charCodeAt(i);
  13.       } else if (padi) {
  14.         /* add 4-byte PBKDF2 block index and
  15.        standard padding for the final SHA1 input block */
  16.     if (i == n) c = (padi >>> 24) & 0xff;
  17.     else if (i == n + 1) c = (padi >>> 16) & 0xff;
  18.     else if (i == n + 2) c = (padi >>> 8) & 0xff;
  19.     else if (i == n + 3) c = padi & 0xff;
  20.     else if (i == n + 4) c = 0x80;
  21.       }
  22.       if (k == 0) { j++; z[j] = 0; k = 32; }
  23.       k -= 8;
  24.       z[j] = z[j] | (c << k);
  25.     }
  26.     if (padi) z[15] = 8 * (64 + n + 4);
  27.     return z;
  28.   }
  29.  
  30.   /* compute the intermediate SHA1 state after processing just
  31.      the 64-byte padded HMAC key */
  32.   function initsha(w, padbyte) {
  33.     var pw = (padbyte << 24) | (padbyte << 16) | (padbyte << 8) | padbyte;
  34.     for (var t = 0; t < 16; t++) w[t] ^= pw;
  35.     var s = [ 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 ];
  36.     var a = s[0], b = s[1], c = s[2], d = s[3], e = s[4];
  37.     var t;
  38.     for (var k = 16; k < 80; k++) {
  39.       t = w[k-3] ^ w[k-8] ^ w[k-14] ^ w[k-16];
  40.       w[k] = (t<<1) | (t>>>31);
  41.     }
  42.     for (var k = 0; k < 20; k++) {
  43.       t = ((a<<5) | (a>>>27)) + e + w[k] + 0x5A827999 + ((b&c)|((~b)&d));
  44.       e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
  45.     }
  46.     for (var k = 20; k < 40; k++) {
  47.       t = ((a<<5) | (a>>>27)) + e + w[k] + 0x6ED9EBA1 + (b^c^d);
  48.       e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
  49.     }
  50.     for (var k = 40; k < 60; k++) {
  51.       t = ((a<<5) | (a>>>27)) + e + w[k] + 0x8F1BBCDC + ((b&c)|(b&d)|(c&d));
  52.       e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
  53.     }
  54.     for (var k = 60; k < 80; k++) {
  55.       t = ((a<<5) | (a>>>27)) + e + w[k] + 0xCA62C1D6 + (b^c^d);
  56.       e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
  57.     }
  58.     s[0] = (s[0] + a) & 0xffffffff;
  59.     s[1] = (s[1] + b) & 0xffffffff;
  60.     s[2] = (s[2] + c) & 0xffffffff;
  61.     s[3] = (s[3] + d) & 0xffffffff;
  62.     s[4] = (s[4] + e) & 0xffffffff;
  63.     return s;
  64.   }
  65.  
  66.   /* compute the intermediate SHA1 state of the inner and outer parts
  67.      of the HMAC algorithm after processing the padded HMAC key */
  68.   var hmac_istate = initsha(stringtowords(pass, 0), 0x36);
  69.   var hmac_ostate = initsha(stringtowords(pass, 0), 0x5c);
  70.  
  71.   /* output is created in blocks of 20 bytes at a time and collected
  72.      in a string as hexadecimal digits */
  73.   var hash = '';
  74.   var i = 0;
  75.   while (hash.length < 64) {
  76.     /* prepare 20-byte (5-word) output vector */
  77.     var u = [ 0, 0, 0, 0, 0 ];
  78.     /* prepare input vector for the first SHA1 update (salt + block number) */
  79.     i++;
  80.     var w = stringtowords(salt, i);
  81.     /* iterate 4096 times an inner and an outer SHA1 operation */
  82.     for (var j = 0; j < 2 * 4096; j++) {
  83.       /* alternate inner and outer SHA1 operations */
  84.       var s = (j & 1) ? hmac_ostate : hmac_istate;
  85.       /* inline the SHA1 update operation */
  86.       var a = s[0], b = s[1], c = s[2], d = s[3], e = s[4];
  87.       var t;
  88.       for (var k = 16; k < 80; k++) {
  89.         t = w[k-3] ^ w[k-8] ^ w[k-14] ^ w[k-16];
  90.         w[k] = (t<<1) | (t>>>31);
  91.       }
  92.       for (var k = 0; k < 20; k++) {
  93.         t = ((a<<5) | (a>>>27)) + e + w[k] + 0x5A827999 + ((b&c)|((~b)&d));
  94.         e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
  95.       }
  96.       for (var k = 20; k < 40; k++) {
  97.         t = ((a<<5) | (a>>>27)) + e + w[k] + 0x6ED9EBA1 + (b^c^d);
  98.         e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
  99.       }
  100.       for (var k = 40; k < 60; k++) {
  101.         t = ((a<<5) | (a>>>27)) + e + w[k] + 0x8F1BBCDC + ((b&c)|(b&d)|(c&d));
  102.         e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
  103.       }
  104.       for (var k = 60; k < 80; k++) {
  105.         t = ((a<<5) | (a>>>27)) + e + w[k] + 0xCA62C1D6 + (b^c^d);
  106.         e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
  107.       }
  108.       /* stuff the SHA1 output back into the input vector */
  109.       w[0] = (s[0] + a) & 0xffffffff;
  110.       w[1] = (s[1] + b) & 0xffffffff;
  111.       w[2] = (s[2] + c) & 0xffffffff;
  112.       w[3] = (s[3] + d) & 0xffffffff;
  113.       w[4] = (s[4] + e) & 0xffffffff;
  114.       if (j & 1) {
  115.         /* XOR the result of each complete HMAC-SHA1 operation into u */
  116.     u[0] ^= w[0]; u[1] ^= w[1]; u[2] ^= w[2]; u[3] ^= w[3]; u[4] ^= w[4];
  117.       } else if (j == 0) {
  118.         /* pad the new 20-byte input vector for subsequent SHA1 operations */
  119.     w[5] = 0x80000000;
  120.     for (var k = 6; k < 15; k++) w[k] = 0;
  121.     w[15] = 8 * (64 + 20);
  122.       }
  123.     }
  124.     /* convert output vector u to hex and append to output string */
  125.     for (var j = 0; j < 5; j++)
  126.       for (var k = 0; k < 8; k++) {
  127.         var t = (u[j] >>> (28 - 4 * k)) & 0x0f;
  128.     hash += (t < 10) ? t : String.fromCharCode(87 + t);
  129.       }
  130.   }
  131.  
  132.   /* return the first 32 key bytes as a hexadecimal string */
  133.   return hash.substring(0, 64);
  134. }
  135.  
  136. function fshowkey(s) {
  137.   if (s == "") { for (var i = 0; i < 64; i++) s += "\u00a0"; }
  138.   var elem = document.getElementById("fhexkey");
  139.   while (elem.hasChildNodes()) elem.removeChild(elem.firstChild);
  140.   elem.appendChild(document.createTextNode(s));
  141. }
  142.  
  143. function fcalc() {
  144.   var ssid = document.getElementById("fssid").value;
  145.   var pass = document.getElementById("fpass").value;
  146.   fshowkey("");
  147.   if (ssid.length < 1) {
  148.     alert("ERROR: You must enter the network SSID string.");
  149.     document.getElementById("fssid").focus();
  150.     return;
  151.   }
  152.   if (ssid.length > 32) {
  153.     alert("ERROR: The SSID string must not be longer than 32 characters.");
  154.     document.getElementById("fssid").focus();
  155.     return;
  156.   }
  157.   if (pass.length < 1) {
  158.     alert("ERROR: Passphrase must be at least 8 characters.");
  159.     document.getElementById("fpass").focus();
  160.     return;
  161.   }
  162.   if (pass.length > 63) {
  163.     alert("ERROR: Passphrase must not be longer than 63 characters.");
  164.     document.getElementById("fpass").focus();
  165.     return;
  166.   }
  167.   for (var i = 0; i < pass.length; i++)
  168.     if (pass.charCodeAt(i) < 1 || pass.charCodeAt(i) > 126) {
  169.       alert("ERROR: Passphrase contains strange characters.");
  170.       document.getElementById("fpass").focus();
  171.       return;
  172.     }
  173.   for (var i = 0; i < ssid.length; i++)
  174.     if (ssid.charCodeAt(i) < 1 || ssid.charCodeAt(i) > 126) {
  175.       alert("ERROR: SSID string contains strange characters.");
  176.       document.getElementById("fssid").focus();
  177.       return;
  178.     }
  179.   var hash = getWpaPskKeyFromPassphrase(pass, ssid);
  180.   fshowkey(hash);
  181. }
  182.  
  183. function fclear() {
  184.   document.getElementById("fssid").value = "";
  185.   document.getElementById("fpass").value = "";
  186.   fshowkey("");
  187. }
  188.  
  189. function ftest() {
  190.   document.getElementById("fssid").value = "linksys54gh";
  191.   document.getElementById("fpass").value = "radiustest";
  192.   fcalc();
  193.   var n = document.getElementById("fhexkey");
  194.   if (n && n.firstChild && n.firstChild.data ==
  195.       "9e9988bde2cba74395c0289ffda07bc41ffa889a3309237a2240c934bcdc7ddb") {
  196.     alert("test passed succesfully");
  197.   } else {
  198.     alert("ERROR: test failed, please get a better webbrowser");
  199.   }
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement