Subversion Repositories cryptochat

Rev

View as "text/javascript" | Blame | Last modification | View Log | RSS feed

  1. /*
  2. CryptoJS v3.1.2
  3. code.google.com/p/crypto-js
  4. (c) 2009-2013 by Jeff Mott. All rights reserved.
  5. code.google.com/p/crypto-js/wiki/License
  6. */
  7. (function (Math) {
  8.     // Shortcuts
  9.     var C = CryptoJS;
  10.     var C_lib = C.lib;
  11.     var WordArray = C_lib.WordArray;
  12.     var Hasher = C_lib.Hasher;
  13.     var C_algo = C.algo;
  14.  
  15.     // Constants table
  16.     var T = [];
  17.  
  18.     // Compute constants
  19.     (function () {
  20.         for (var i = 0; i < 64; i++) {
  21.             T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
  22.         }
  23.     }());
  24.  
  25.     /**
  26.      * MD5 hash algorithm.
  27.      */
  28.     var MD5 = C_algo.MD5 = Hasher.extend({
  29.         _doReset: function () {
  30.             this._hash = new WordArray.init([
  31.                 0x67452301, 0xefcdab89,
  32.                 0x98badcfe, 0x10325476
  33.             ]);
  34.         },
  35.  
  36.         _doProcessBlock: function (M, offset) {
  37.             // Swap endian
  38.             for (var i = 0; i < 16; i++) {
  39.                 // Shortcuts
  40.                 var offset_i = offset + i;
  41.                 var M_offset_i = M[offset_i];
  42.  
  43.                 M[offset_i] = (
  44.                     (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
  45.                     (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
  46.                 );
  47.             }
  48.  
  49.             // Shortcuts
  50.             var H = this._hash.words;
  51.  
  52.             var M_offset_0  = M[offset + 0];
  53.             var M_offset_1  = M[offset + 1];
  54.             var M_offset_2  = M[offset + 2];
  55.             var M_offset_3  = M[offset + 3];
  56.             var M_offset_4  = M[offset + 4];
  57.             var M_offset_5  = M[offset + 5];
  58.             var M_offset_6  = M[offset + 6];
  59.             var M_offset_7  = M[offset + 7];
  60.             var M_offset_8  = M[offset + 8];
  61.             var M_offset_9  = M[offset + 9];
  62.             var M_offset_10 = M[offset + 10];
  63.             var M_offset_11 = M[offset + 11];
  64.             var M_offset_12 = M[offset + 12];
  65.             var M_offset_13 = M[offset + 13];
  66.             var M_offset_14 = M[offset + 14];
  67.             var M_offset_15 = M[offset + 15];
  68.  
  69.             // Working varialbes
  70.             var a = H[0];
  71.             var b = H[1];
  72.             var c = H[2];
  73.             var d = H[3];
  74.  
  75.             // Computation
  76.             a = FF(a, b, c, d, M_offset_0,  7,  T[0]);
  77.             d = FF(d, a, b, c, M_offset_1,  12, T[1]);
  78.             c = FF(c, d, a, b, M_offset_2,  17, T[2]);
  79.             b = FF(b, c, d, a, M_offset_3,  22, T[3]);
  80.             a = FF(a, b, c, d, M_offset_4,  7,  T[4]);
  81.             d = FF(d, a, b, c, M_offset_5,  12, T[5]);
  82.             c = FF(c, d, a, b, M_offset_6,  17, T[6]);
  83.             b = FF(b, c, d, a, M_offset_7,  22, T[7]);
  84.             a = FF(a, b, c, d, M_offset_8,  7,  T[8]);
  85.             d = FF(d, a, b, c, M_offset_9,  12, T[9]);
  86.             c = FF(c, d, a, b, M_offset_10, 17, T[10]);
  87.             b = FF(b, c, d, a, M_offset_11, 22, T[11]);
  88.             a = FF(a, b, c, d, M_offset_12, 7,  T[12]);
  89.             d = FF(d, a, b, c, M_offset_13, 12, T[13]);
  90.             c = FF(c, d, a, b, M_offset_14, 17, T[14]);
  91.             b = FF(b, c, d, a, M_offset_15, 22, T[15]);
  92.  
  93.             a = GG(a, b, c, d, M_offset_1,  5,  T[16]);
  94.             d = GG(d, a, b, c, M_offset_6,  9,  T[17]);
  95.             c = GG(c, d, a, b, M_offset_11, 14, T[18]);
  96.             b = GG(b, c, d, a, M_offset_0,  20, T[19]);
  97.             a = GG(a, b, c, d, M_offset_5,  5,  T[20]);
  98.             d = GG(d, a, b, c, M_offset_10, 9,  T[21]);
  99.             c = GG(c, d, a, b, M_offset_15, 14, T[22]);
  100.             b = GG(b, c, d, a, M_offset_4,  20, T[23]);
  101.             a = GG(a, b, c, d, M_offset_9,  5,  T[24]);
  102.             d = GG(d, a, b, c, M_offset_14, 9,  T[25]);
  103.             c = GG(c, d, a, b, M_offset_3,  14, T[26]);
  104.             b = GG(b, c, d, a, M_offset_8,  20, T[27]);
  105.             a = GG(a, b, c, d, M_offset_13, 5,  T[28]);
  106.             d = GG(d, a, b, c, M_offset_2,  9,  T[29]);
  107.             c = GG(c, d, a, b, M_offset_7,  14, T[30]);
  108.             b = GG(b, c, d, a, M_offset_12, 20, T[31]);
  109.  
  110.             a = HH(a, b, c, d, M_offset_5,  4,  T[32]);
  111.             d = HH(d, a, b, c, M_offset_8,  11, T[33]);
  112.             c = HH(c, d, a, b, M_offset_11, 16, T[34]);
  113.             b = HH(b, c, d, a, M_offset_14, 23, T[35]);
  114.             a = HH(a, b, c, d, M_offset_1,  4,  T[36]);
  115.             d = HH(d, a, b, c, M_offset_4,  11, T[37]);
  116.             c = HH(c, d, a, b, M_offset_7,  16, T[38]);
  117.             b = HH(b, c, d, a, M_offset_10, 23, T[39]);
  118.             a = HH(a, b, c, d, M_offset_13, 4,  T[40]);
  119.             d = HH(d, a, b, c, M_offset_0,  11, T[41]);
  120.             c = HH(c, d, a, b, M_offset_3,  16, T[42]);
  121.             b = HH(b, c, d, a, M_offset_6,  23, T[43]);
  122.             a = HH(a, b, c, d, M_offset_9,  4,  T[44]);
  123.             d = HH(d, a, b, c, M_offset_12, 11, T[45]);
  124.             c = HH(c, d, a, b, M_offset_15, 16, T[46]);
  125.             b = HH(b, c, d, a, M_offset_2,  23, T[47]);
  126.  
  127.             a = II(a, b, c, d, M_offset_0,  6,  T[48]);
  128.             d = II(d, a, b, c, M_offset_7,  10, T[49]);
  129.             c = II(c, d, a, b, M_offset_14, 15, T[50]);
  130.             b = II(b, c, d, a, M_offset_5,  21, T[51]);
  131.             a = II(a, b, c, d, M_offset_12, 6,  T[52]);
  132.             d = II(d, a, b, c, M_offset_3,  10, T[53]);
  133.             c = II(c, d, a, b, M_offset_10, 15, T[54]);
  134.             b = II(b, c, d, a, M_offset_1,  21, T[55]);
  135.             a = II(a, b, c, d, M_offset_8,  6,  T[56]);
  136.             d = II(d, a, b, c, M_offset_15, 10, T[57]);
  137.             c = II(c, d, a, b, M_offset_6,  15, T[58]);
  138.             b = II(b, c, d, a, M_offset_13, 21, T[59]);
  139.             a = II(a, b, c, d, M_offset_4,  6,  T[60]);
  140.             d = II(d, a, b, c, M_offset_11, 10, T[61]);
  141.             c = II(c, d, a, b, M_offset_2,  15, T[62]);
  142.             b = II(b, c, d, a, M_offset_9,  21, T[63]);
  143.  
  144.             // Intermediate hash value
  145.             H[0] = (H[0] + a) | 0;
  146.             H[1] = (H[1] + b) | 0;
  147.             H[2] = (H[2] + c) | 0;
  148.             H[3] = (H[3] + d) | 0;
  149.         },
  150.  
  151.         _doFinalize: function () {
  152.             // Shortcuts
  153.             var data = this._data;
  154.             var dataWords = data.words;
  155.  
  156.             var nBitsTotal = this._nDataBytes * 8;
  157.             var nBitsLeft = data.sigBytes * 8;
  158.  
  159.             // Add padding
  160.             dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
  161.  
  162.             var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
  163.             var nBitsTotalL = nBitsTotal;
  164.             dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
  165.                 (((nBitsTotalH << 8)  | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
  166.                 (((nBitsTotalH << 24) | (nBitsTotalH >>> 8))  & 0xff00ff00)
  167.             );
  168.             dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
  169.                 (((nBitsTotalL << 8)  | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
  170.                 (((nBitsTotalL << 24) | (nBitsTotalL >>> 8))  & 0xff00ff00)
  171.             );
  172.  
  173.             data.sigBytes = (dataWords.length + 1) * 4;
  174.  
  175.             // Hash final blocks
  176.             this._process();
  177.  
  178.             // Shortcuts
  179.             var hash = this._hash;
  180.             var H = hash.words;
  181.  
  182.             // Swap endian
  183.             for (var i = 0; i < 4; i++) {
  184.                 // Shortcut
  185.                 var H_i = H[i];
  186.  
  187.                 H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
  188.                        (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
  189.             }
  190.  
  191.             // Return final computed hash
  192.             return hash;
  193.         },
  194.  
  195.         clone: function () {
  196.             var clone = Hasher.clone.call(this);
  197.             clone._hash = this._hash.clone();
  198.  
  199.             return clone;
  200.         }
  201.     });
  202.  
  203.     function FF(a, b, c, d, x, s, t) {
  204.         var n = a + ((b & c) | (~b & d)) + x + t;
  205.         return ((n << s) | (n >>> (32 - s))) + b;
  206.     }
  207.  
  208.     function GG(a, b, c, d, x, s, t) {
  209.         var n = a + ((b & d) | (c & ~d)) + x + t;
  210.         return ((n << s) | (n >>> (32 - s))) + b;
  211.     }
  212.  
  213.     function HH(a, b, c, d, x, s, t) {
  214.         var n = a + (b ^ c ^ d) + x + t;
  215.         return ((n << s) | (n >>> (32 - s))) + b;
  216.     }
  217.  
  218.     function II(a, b, c, d, x, s, t) {
  219.         var n = a + (c ^ (b | ~d)) + x + t;
  220.         return ((n << s) | (n >>> (32 - s))) + b;
  221.     }
  222.  
  223.     /**
  224.      * Shortcut function to the hasher's object interface.
  225.      *
  226.      * @param {WordArray|string} message The message to hash.
  227.      *
  228.      * @return {WordArray} The hash.
  229.      *
  230.      * @static
  231.      *
  232.      * @example
  233.      *
  234.      *     var hash = CryptoJS.MD5('message');
  235.      *     var hash = CryptoJS.MD5(wordArray);
  236.      */
  237.     C.MD5 = Hasher._createHelper(MD5);
  238.  
  239.     /**
  240.      * Shortcut function to the HMAC's object interface.
  241.      *
  242.      * @param {WordArray|string} message The message to hash.
  243.      * @param {WordArray|string} key The secret key.
  244.      *
  245.      * @return {WordArray} The HMAC.
  246.      *
  247.      * @static
  248.      *
  249.      * @example
  250.      *
  251.      *     var hmac = CryptoJS.HmacMD5(message, key);
  252.      */
  253.     C.HmacMD5 = Hasher._createHmacHelper(MD5);
  254. }(Math));
  255.