home *** CD-ROM | disk | FTP | other *** search
/ Il Mio Computer 2006 May / Mico05CD.bin / Utility / CryptoMX / sha256.js < prev    next >
Encoding:
Text File  |  2006-01-05  |  6.4 KB  |  139 lines

  1. var chrsz   = 8; 
  2. var hexcase = 0;
  3.  
  4. function safe_add (x, y) {
  5.   var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  6.   var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  7.   return (msw << 16) | (lsw & 0xFFFF);
  8. }
  9.  
  10. function S (X, n) {return ( X >>> n ) | (X << (32 - n));}
  11.  
  12. function R (X, n) {return ( X >>> n );}
  13.  
  14. function Ch(x, y, z) {return ((x & y) ^ ((~x) & z));}
  15.  
  16. function Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));}
  17.  
  18. function Sigma0256(x) {return (S(x, 2) ^ S(x, 13) ^ S(x, 22));}
  19.  
  20. function Sigma1256(x) {return (S(x, 6) ^ S(x, 11) ^ S(x, 25));}
  21.  
  22. function Gamma0256(x) {return (S(x, 7) ^ S(x, 18) ^ R(x, 3));}
  23.  
  24. function Gamma1256(x) {return (S(x, 17) ^ S(x, 19) ^ R(x, 10));}
  25.  
  26. function Sigma0512(x) {return (S(x, 28) ^ S(x, 34) ^ S(x, 39));}
  27.  
  28. function Sigma1512(x) {return (S(x, 14) ^ S(x, 18) ^ S(x, 41));}
  29.  
  30. function Gamma0512(x) {return (S(x, 1) ^ S(x, 8) ^ R(x, 7));}
  31.  
  32. function Gamma1512(x) {return (S(x, 19) ^ S(x, 61) ^ R(x, 6));}
  33.  
  34. function core_sha256 (m, l) {
  35.     var K = new Array(0x428A2F98,0x71374491,0xB5C0FBCF,0xE9B5DBA5,0x3956C25B,0x59F111F1,0x923F82A4,0xAB1C5ED5,0xD807AA98,0x12835B01,0x243185BE,0x550C7DC3,0x72BE5D74,0x80DEB1FE,0x9BDC06A7,0xC19BF174,0xE49B69C1,0xEFBE4786,0xFC19DC6,0x240CA1CC,0x2DE92C6F,0x4A7484AA,0x5CB0A9DC,0x76F988DA,0x983E5152,0xA831C66D,0xB00327C8,0xBF597FC7,0xC6E00BF3,0xD5A79147,0x6CA6351,0x14292967,0x27B70A85,0x2E1B2138,0x4D2C6DFC,0x53380D13,0x650A7354,0x766A0ABB,0x81C2C92E,0x92722C85,0xA2BFE8A1,0xA81A664B,0xC24B8B70,0xC76C51A3,0xD192E819,0xD6990624,0xF40E3585,0x106AA070,0x19A4C116,0x1E376C08,0x2748774C,0x34B0BCB5,0x391C0CB3,0x4ED8AA4A,0x5B9CCA4F,0x682E6FF3,0x748F82EE,0x78A5636F,0x84C87814,0x8CC70208,0x90BEFFFA,0xA4506CEB,0xBEF9A3F7,0xC67178F2);
  36.     var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
  37.     var W = new Array(64);
  38.     var a, b, c, d, e, f, g, h, i, j;
  39.     var T1, T2;
  40.  
  41.     m[l >> 5] |= 0x80 << (24 - l % 32);
  42.     m[((l + 64 >> 9) << 4) + 15] = l;
  43.  
  44.     for ( var i = 0; i<m.length; i+=16 ) {
  45.         a = HASH[0];
  46.         b = HASH[1];
  47.         c = HASH[2];
  48.         d = HASH[3];
  49.         e = HASH[4];
  50.         f = HASH[5];
  51.         g = HASH[6];
  52.         h = HASH[7];
  53.  
  54.         for ( var j = 0; j<64; j++) {
  55.             if (j < 16) W[j] = m[j + i];
  56.             else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
  57.  
  58.             T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
  59.             T2 = safe_add(Sigma0256(a), Maj(a, b, c));
  60.  
  61.             h = g;
  62.             g = f;
  63.             f = e;
  64.             e = safe_add(d, T1);
  65.             d = c;
  66.             c = b;
  67.             b = a;
  68.             a = safe_add(T1, T2);
  69.         }
  70.         
  71.         HASH[0] = safe_add(a, HASH[0]);
  72.         HASH[1] = safe_add(b, HASH[1]);
  73.         HASH[2] = safe_add(c, HASH[2]);
  74.         HASH[3] = safe_add(d, HASH[3]);
  75.         HASH[4] = safe_add(e, HASH[4]);
  76.         HASH[5] = safe_add(f, HASH[5]);
  77.         HASH[6] = safe_add(g, HASH[6]);
  78.         HASH[7] = safe_add(h, HASH[7]);
  79.     }
  80.     return HASH;
  81. }
  82.  
  83. function core_sha512 (m, l) {
  84.     var K = new Array(0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, 0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b, 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, 0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817);
  85.     var HASH = new Array(0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179);
  86.     var W = new Array(80);
  87.     var a, b, c, d, e, f, g, h, i, j;
  88.     var T1, T2;
  89.  
  90. }
  91.  
  92. function str2binb (str) {
  93.   var bin = Array();
  94.   var mask = (1 << chrsz) - 1;
  95.   for(var i = 0; i < str.length * chrsz; i += chrsz)
  96.     bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
  97.   return bin;
  98. }
  99.  
  100. function binb2str (bin) {
  101.   var str = "";
  102.   var mask = (1 << chrsz) - 1;
  103.   for(var i = 0; i < bin.length * 32; i += chrsz)
  104.     str += String.fromCharCode((bin[i>>5] >>> (24 - i%32)) & mask);
  105.   return str;
  106. }
  107.  
  108. function binb2hex (binarray) {
  109.   var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  110.   var str = "";
  111.   for(var i = 0; i < binarray.length * 4; i++)
  112.   {
  113.     str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
  114.            hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
  115.   }
  116.   return str;
  117. }
  118.  
  119. function binb2b64 (binarray) {
  120.   var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  121.   var str = "";
  122.   for(var i = 0; i < binarray.length * 4; i += 3)
  123.   {
  124.     var triplet = (((binarray[i   >> 2] >> 8 * (3 -  i   %4)) & 0xFF) << 16)
  125.                 | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
  126.                 |  ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
  127.     for(var j = 0; j < 4; j++)
  128.     {
  129.       if(i * 8 + j * 6 > binarray.length * 32) str += "";
  130.       else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
  131.     }
  132.   }
  133.   return str;
  134. }
  135.  
  136. function hex_sha2(s){return binb2hex(core_sha256(str2binb(s),s.length * chrsz));}
  137. function b64_sha2(s){return binb2b64(core_sha256(str2binb(s),s.length * chrsz));}
  138. function str_sha2(s){return binb2str(core_sha256(str2binb(s),s.length * chrsz));}
  139.