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

  1. var RMDsize     = 160;
  2. var X = new Array();
  3.  
  4. function ROL(x, n)
  5. {
  6.     return new Number ((x << n) | ( x >>> (32 - n)));
  7. }
  8.  
  9. function F(x, y, z)
  10. {
  11.     return new Number(x ^ y ^ z);
  12. }
  13.  
  14. function G(x, y, z)
  15. {
  16.     return new Number((x & y) | (~x & z));
  17. }
  18.  
  19. function H(x, y, z)
  20. {
  21.     return new Number((x | ~y) ^ z);
  22. }
  23.  
  24. function I(x, y, z)
  25. {
  26.     return new Number((x & z) | (y & ~z));
  27. }
  28.  
  29. function J(x, y, z)
  30. {
  31.     return new Number(x ^ (y | ~z));
  32. }
  33.  
  34. function mixOneRound(a, b, c, d, e, x, s, roundNumber)
  35. {
  36.     switch (roundNumber)
  37.     {
  38.         case 0 : a += F(b, c, d) + x + 0x00000000; break;
  39.         case 1 : a += G(b, c, d) + x + 0x5a827999; break;
  40.         case 2 : a += H(b, c, d) + x + 0x6ed9eba1; break;
  41.         case 3 : a += I(b, c, d) + x + 0x8f1bbcdc; break;
  42.         case 4 : a += J(b, c, d) + x + 0xa953fd4e; break;
  43.         case 5 : a += J(b, c, d) + x + 0x50a28be6; break;
  44.         case 6 : a += I(b, c, d) + x + 0x5c4dd124; break;
  45.         case 7 : a += H(b, c, d) + x + 0x6d703ef3; break;
  46.         case 8 : a += G(b, c, d) + x + 0x7a6d76e9; break;
  47.         case 9 : a += F(b, c, d) + x + 0x00000000; break;
  48.         
  49.         default : document.write("Bogus round number"); break;
  50.     }    
  51.     
  52.     a = ROL(a, s) + e;
  53.     c = ROL(c, 10);
  54.  
  55.     a &= 0xffffffff;
  56.     b &= 0xffffffff;
  57.     c &= 0xffffffff;
  58.     d &= 0xffffffff;
  59.     e &= 0xffffffff;
  60.  
  61.     var retBlock = new Array();
  62.     retBlock[0] = a;
  63.     retBlock[1] = b;
  64.     retBlock[2] = c;
  65.     retBlock[3] = d;
  66.     retBlock[4] = e;
  67.     retBlock[5] = x;
  68.     retBlock[6] = s;
  69.  
  70.     return retBlock;
  71. }
  72.  
  73. function MDinit (MDbuf)
  74. {
  75.     MDbuf[0] = 0x67452301;
  76.     MDbuf[1] = 0xefcdab89;
  77.     MDbuf[2] = 0x98badcfe;
  78.     MDbuf[3] = 0x10325476;
  79.     MDbuf[4] = 0xc3d2e1f0;
  80. }
  81.  
  82. var ROLs = [
  83.     [11, 14, 15, 12,  5,  8,  7,  9, 11, 13, 14, 15,  6,  7,  9,  8],
  84.     [ 7,  6,  8, 13, 11,  9,  7, 15,  7, 12, 15,  9, 11,  7, 13, 12],
  85.     [11, 13,  6,  7, 14,  9, 13, 15, 14,  8, 13,  6,  5, 12,  7,  5],
  86.     [11, 12, 14, 15, 14, 15,  9,  8,  9, 14,  5,  6,  8,  6,  5, 12],
  87.     [ 9, 15,  5, 11,  6,  8, 13, 12,  5, 12, 13, 14, 11,  8,  5,  6],
  88.     [ 8,  9,  9, 11, 13, 15, 15,  5,  7,  7,  8, 11, 14, 14, 12,  6],
  89.     [ 9, 13, 15,  7, 12,  8,  9, 11,  7,  7, 12,  7,  6, 15, 13, 11],
  90.     [ 9,  7, 15, 11,  8,  6,  6, 14, 12, 13,  5, 14, 13, 13,  7,  5],
  91.     [15,  5,  8, 11, 14, 14,  6, 14,  6,  9, 12,  9, 12,  5, 15,  8],
  92.     [ 8,  5, 12,  9, 12,  5, 14,  6,  8, 13,  6,  5, 15, 13, 11, 11]
  93. ];
  94.  
  95. var indexes = [
  96.     [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15],
  97.     [ 7,  4, 13,  1, 10,  6, 15,  3, 12,  0,  9,  5,  2, 14, 11,  8],
  98.     [ 3, 10, 14,  4,  9, 15,  8,  1,  2,  7,  0,  6, 13, 11,  5, 12],
  99.     [ 1,  9, 11, 10,  0,  8, 12,  4, 13,  3,  7, 15, 14,  5,  6,  2],
  100.     [ 4,  0,  5,  9,  7, 12,  2, 10, 14,  1,  3,  8, 11,  6, 15, 13],
  101.     [ 5, 14,  7,  0,  9,  2, 11,  4, 13,  6, 15,  8,  1, 10,  3, 12],
  102.     [ 6, 11,  3,  7,  0, 13,  5, 10, 14, 15,  8, 12,  4,  9,  1,  2],
  103.     [15,  5,  1,  3,  7, 14,  6,  9, 11,  8, 12,  2, 10,  0,  4, 13],
  104.     [ 8,  6,  4,  1,  3, 11, 15,  0,  5, 12,  2, 13,  9,  7, 10, 14],
  105.     [12, 15, 10,  4,  1,  5,  8,  7,  6,  2, 13, 14,  0,  3,  9, 11]
  106. ];
  107.  
  108. function compress (MDbuf, X)
  109. {
  110.     blockA = new Array();
  111.     blockB = new Array();
  112.  
  113.     var retBlock;
  114.  
  115.     for (var i=0; i < 5; i++)
  116.     {
  117.         blockA[i] = new Number(MDbuf[i]);
  118.         blockB[i] = new Number(MDbuf[i]);
  119.     }
  120.  
  121.     var step = 0;
  122.     for (var j = 0; j < 5; j++)
  123.     {
  124.         for (var i = 0; i < 16; i++)
  125.         {
  126.             retBlock = mixOneRound(
  127.                 blockA[(step+0) % 5],
  128.                 blockA[(step+1) % 5],     
  129.                 blockA[(step+2) % 5],     
  130.                 blockA[(step+3) % 5],     
  131.                 blockA[(step+4) % 5],    
  132.                 X[indexes[j][i]], 
  133.                 ROLs[j][i],
  134.                 j
  135.             );
  136.  
  137.             blockA[(step+0) % 5] = retBlock[0];
  138.             blockA[(step+1) % 5] = retBlock[1];
  139.             blockA[(step+2) % 5] = retBlock[2];
  140.             blockA[(step+3) % 5] = retBlock[3];
  141.             blockA[(step+4) % 5] = retBlock[4];
  142.  
  143.             step += 4;
  144.         }
  145.     }
  146.  
  147.     step = 0;
  148.     for (var j = 5; j < 10; j++)
  149.     {
  150.         for (var i = 0; i < 16; i++)
  151.         {    
  152.             retBlock = mixOneRound(
  153.                 blockB[(step+0) % 5], 
  154.                 blockB[(step+1) % 5], 
  155.                 blockB[(step+2) % 5], 
  156.                 blockB[(step+3) % 5], 
  157.                 blockB[(step+4) % 5],    
  158.                 X[indexes[j][i]], 
  159.                 ROLs[j][i],
  160.                 j
  161.             );
  162.  
  163.             blockB[(step+0) % 5] = retBlock[0];
  164.             blockB[(step+1) % 5] = retBlock[1];
  165.             blockB[(step+2) % 5] = retBlock[2];
  166.             blockB[(step+3) % 5] = retBlock[3];
  167.             blockB[(step+4) % 5] = retBlock[4];
  168.  
  169.             step += 4;
  170.         }
  171.     }
  172.  
  173.     blockB[3] += blockA[2] + MDbuf[1];
  174.     MDbuf[1]  = MDbuf[2] + blockA[3] + blockB[4];
  175.     MDbuf[2]  = MDbuf[3] + blockA[4] + blockB[0];
  176.     MDbuf[3]  = MDbuf[4] + blockA[0] + blockB[1];
  177.     MDbuf[4]  = MDbuf[0] + blockA[1] + blockB[2];
  178.     MDbuf[0]  = blockB[3];
  179. }
  180.  
  181. function zeroX(X)
  182. {
  183.     for (var i = 0; i < 16; i++) { X[i] = 0; }
  184. }
  185.  
  186. function MDfinish (MDbuf, strptr, lswlen, mswlen)
  187. {
  188.     var X = new Array(16);
  189.     zeroX(X);
  190.  
  191.     var j = 0;
  192.     for (var i=0; i < (lswlen & 63); i++)
  193.     {
  194.         X[i >>> 2] ^= (strptr.charCodeAt(j++) & 255) << (8 * (i & 3));
  195.     }
  196.  
  197.     X[(lswlen >>> 2) & 15] ^= 1 << (8 * (lswlen & 3) + 7);
  198.  
  199.     if ((lswlen & 63) > 55)
  200.     {
  201.         compress(MDbuf, X);
  202.         var X = new Array(16);
  203.         zeroX(X);
  204.     }
  205.  
  206.     X[14] = lswlen << 3;
  207.     X[15] = (lswlen >>> 29) | (mswlen << 3);
  208.  
  209.     compress(MDbuf, X);
  210. }
  211.  
  212. function BYTES_TO_DWORD(fourChars)
  213. {
  214.     var tmp  = (fourChars.charCodeAt(3) & 255) << 24;
  215.     tmp     |= (fourChars.charCodeAt(2) & 255) << 16;
  216.     tmp     |= (fourChars.charCodeAt(1) & 255) << 8;
  217.     tmp     |= (fourChars.charCodeAt(0) & 255);    
  218.  
  219.     return tmp;
  220. }
  221.  
  222. function RMD(message)
  223. {
  224.     var MDbuf     = new Array(RMDsize / 32);
  225.     var hashcode     = new Array(RMDsize / 8);
  226.     var length;    
  227.     var nbytes;
  228.  
  229.     MDinit(MDbuf);
  230.     length = message.length;
  231.  
  232.     var X = new Array(16);
  233.     zeroX(X);
  234.  
  235.     var j=0;
  236.     for (var nbytes=length; nbytes > 63; nbytes -= 64)
  237.     {
  238.         for (var i=0; i < 16; i++)
  239.         {
  240.             X[i] = BYTES_TO_DWORD(message.substr(j, 4));
  241.             j += 4;
  242.         }
  243.         compress(MDbuf, X);
  244.     }
  245.  
  246.     MDfinish(MDbuf, message.substr(j), length, 0);
  247.  
  248.     for (var i=0; i < RMDsize / 8; i += 4)
  249.     {
  250.         hashcode[i]   =  MDbuf[i >>> 2]     & 255;
  251.         hashcode[i+1] = (MDbuf[i >>> 2] >>> 8)     & 255;
  252.         hashcode[i+2] = (MDbuf[i >>> 2] >>> 16) & 255;
  253.         hashcode[i+3] = (MDbuf[i >>> 2] >>> 24) & 255;
  254.     }
  255.  
  256.     return hashcode;
  257. }
  258.  
  259. function toHex32(x)
  260. {
  261.     var hexChars = "0123456789abcdef";
  262.     var hex = "";
  263.  
  264.     for (var i = 0; i < 2; i++)
  265.     {
  266.         hex = String(hexChars.charAt(x & 0xf)).concat(hex);
  267.         x >>>= 4;
  268.     }
  269.  
  270.     return hex;
  271. }
  272.  
  273. function toRMDstring(hashcode)
  274. {
  275.     var retString = "";
  276.  
  277.     for (var i=0; i < RMDsize/8; i++)
  278.     {
  279.         retString += toHex32(hashcode[i]);
  280.     }    
  281.  
  282.     return retString;    
  283. }
  284.  
  285.  
  286. function RMDstring(message)
  287. {
  288.     var hashcode = RMD(message);
  289.     var retString = "";
  290.  
  291.     for (var i=0; i < RMDsize/8; i++)
  292.     {
  293.         retString += toHex32(hashcode[i]);
  294.     }    
  295.  
  296.     return retString;    
  297. }
  298.