md5.js
  1  (function(){
  2    var crypt = require('crypt'),
  3        utf8 = require('charenc').utf8,
  4        isBuffer = require('is-buffer'),
  5        bin = require('charenc').bin,
  6  
  7    // The core
  8    md5 = function (message, options) {
  9      // Convert to byte array
 10      if (message.constructor == String)
 11        if (options && options.encoding === 'binary')
 12          message = bin.stringToBytes(message);
 13        else
 14          message = utf8.stringToBytes(message);
 15      else if (isBuffer(message))
 16        message = Array.prototype.slice.call(message, 0);
 17      else if (!Array.isArray(message) && message.constructor !== Uint8Array)
 18        message = message.toString();
 19      // else, assume byte array already
 20  
 21      var m = crypt.bytesToWords(message),
 22          l = message.length * 8,
 23          a =  1732584193,
 24          b = -271733879,
 25          c = -1732584194,
 26          d =  271733878;
 27  
 28      // Swap endian
 29      for (var i = 0; i < m.length; i++) {
 30        m[i] = ((m[i] <<  8) | (m[i] >>> 24)) & 0x00FF00FF |
 31               ((m[i] << 24) | (m[i] >>>  8)) & 0xFF00FF00;
 32      }
 33  
 34      // Padding
 35      m[l >>> 5] |= 0x80 << (l % 32);
 36      m[(((l + 64) >>> 9) << 4) + 14] = l;
 37  
 38      // Method shortcuts
 39      var FF = md5._ff,
 40          GG = md5._gg,
 41          HH = md5._hh,
 42          II = md5._ii;
 43  
 44      for (var i = 0; i < m.length; i += 16) {
 45  
 46        var aa = a,
 47            bb = b,
 48            cc = c,
 49            dd = d;
 50  
 51        a = FF(a, b, c, d, m[i+ 0],  7, -680876936);
 52        d = FF(d, a, b, c, m[i+ 1], 12, -389564586);
 53        c = FF(c, d, a, b, m[i+ 2], 17,  606105819);
 54        b = FF(b, c, d, a, m[i+ 3], 22, -1044525330);
 55        a = FF(a, b, c, d, m[i+ 4],  7, -176418897);
 56        d = FF(d, a, b, c, m[i+ 5], 12,  1200080426);
 57        c = FF(c, d, a, b, m[i+ 6], 17, -1473231341);
 58        b = FF(b, c, d, a, m[i+ 7], 22, -45705983);
 59        a = FF(a, b, c, d, m[i+ 8],  7,  1770035416);
 60        d = FF(d, a, b, c, m[i+ 9], 12, -1958414417);
 61        c = FF(c, d, a, b, m[i+10], 17, -42063);
 62        b = FF(b, c, d, a, m[i+11], 22, -1990404162);
 63        a = FF(a, b, c, d, m[i+12],  7,  1804603682);
 64        d = FF(d, a, b, c, m[i+13], 12, -40341101);
 65        c = FF(c, d, a, b, m[i+14], 17, -1502002290);
 66        b = FF(b, c, d, a, m[i+15], 22,  1236535329);
 67  
 68        a = GG(a, b, c, d, m[i+ 1],  5, -165796510);
 69        d = GG(d, a, b, c, m[i+ 6],  9, -1069501632);
 70        c = GG(c, d, a, b, m[i+11], 14,  643717713);
 71        b = GG(b, c, d, a, m[i+ 0], 20, -373897302);
 72        a = GG(a, b, c, d, m[i+ 5],  5, -701558691);
 73        d = GG(d, a, b, c, m[i+10],  9,  38016083);
 74        c = GG(c, d, a, b, m[i+15], 14, -660478335);
 75        b = GG(b, c, d, a, m[i+ 4], 20, -405537848);
 76        a = GG(a, b, c, d, m[i+ 9],  5,  568446438);
 77        d = GG(d, a, b, c, m[i+14],  9, -1019803690);
 78        c = GG(c, d, a, b, m[i+ 3], 14, -187363961);
 79        b = GG(b, c, d, a, m[i+ 8], 20,  1163531501);
 80        a = GG(a, b, c, d, m[i+13],  5, -1444681467);
 81        d = GG(d, a, b, c, m[i+ 2],  9, -51403784);
 82        c = GG(c, d, a, b, m[i+ 7], 14,  1735328473);
 83        b = GG(b, c, d, a, m[i+12], 20, -1926607734);
 84  
 85        a = HH(a, b, c, d, m[i+ 5],  4, -378558);
 86        d = HH(d, a, b, c, m[i+ 8], 11, -2022574463);
 87        c = HH(c, d, a, b, m[i+11], 16,  1839030562);
 88        b = HH(b, c, d, a, m[i+14], 23, -35309556);
 89        a = HH(a, b, c, d, m[i+ 1],  4, -1530992060);
 90        d = HH(d, a, b, c, m[i+ 4], 11,  1272893353);
 91        c = HH(c, d, a, b, m[i+ 7], 16, -155497632);
 92        b = HH(b, c, d, a, m[i+10], 23, -1094730640);
 93        a = HH(a, b, c, d, m[i+13],  4,  681279174);
 94        d = HH(d, a, b, c, m[i+ 0], 11, -358537222);
 95        c = HH(c, d, a, b, m[i+ 3], 16, -722521979);
 96        b = HH(b, c, d, a, m[i+ 6], 23,  76029189);
 97        a = HH(a, b, c, d, m[i+ 9],  4, -640364487);
 98        d = HH(d, a, b, c, m[i+12], 11, -421815835);
 99        c = HH(c, d, a, b, m[i+15], 16,  530742520);
100        b = HH(b, c, d, a, m[i+ 2], 23, -995338651);
101  
102        a = II(a, b, c, d, m[i+ 0],  6, -198630844);
103        d = II(d, a, b, c, m[i+ 7], 10,  1126891415);
104        c = II(c, d, a, b, m[i+14], 15, -1416354905);
105        b = II(b, c, d, a, m[i+ 5], 21, -57434055);
106        a = II(a, b, c, d, m[i+12],  6,  1700485571);
107        d = II(d, a, b, c, m[i+ 3], 10, -1894986606);
108        c = II(c, d, a, b, m[i+10], 15, -1051523);
109        b = II(b, c, d, a, m[i+ 1], 21, -2054922799);
110        a = II(a, b, c, d, m[i+ 8],  6,  1873313359);
111        d = II(d, a, b, c, m[i+15], 10, -30611744);
112        c = II(c, d, a, b, m[i+ 6], 15, -1560198380);
113        b = II(b, c, d, a, m[i+13], 21,  1309151649);
114        a = II(a, b, c, d, m[i+ 4],  6, -145523070);
115        d = II(d, a, b, c, m[i+11], 10, -1120210379);
116        c = II(c, d, a, b, m[i+ 2], 15,  718787259);
117        b = II(b, c, d, a, m[i+ 9], 21, -343485551);
118  
119        a = (a + aa) >>> 0;
120        b = (b + bb) >>> 0;
121        c = (c + cc) >>> 0;
122        d = (d + dd) >>> 0;
123      }
124  
125      return crypt.endian([a, b, c, d]);
126    };
127  
128    // Auxiliary functions
129    md5._ff  = function (a, b, c, d, x, s, t) {
130      var n = a + (b & c | ~b & d) + (x >>> 0) + t;
131      return ((n << s) | (n >>> (32 - s))) + b;
132    };
133    md5._gg  = function (a, b, c, d, x, s, t) {
134      var n = a + (b & d | c & ~d) + (x >>> 0) + t;
135      return ((n << s) | (n >>> (32 - s))) + b;
136    };
137    md5._hh  = function (a, b, c, d, x, s, t) {
138      var n = a + (b ^ c ^ d) + (x >>> 0) + t;
139      return ((n << s) | (n >>> (32 - s))) + b;
140    };
141    md5._ii  = function (a, b, c, d, x, s, t) {
142      var n = a + (c ^ (b | ~d)) + (x >>> 0) + t;
143      return ((n << s) | (n >>> (32 - s))) + b;
144    };
145  
146    // Package private blocksize
147    md5._blocksize = 16;
148    md5._digestsize = 16;
149  
150    module.exports = function (message, options) {
151      if (message === undefined || message === null)
152        throw new Error('Illegal argument ' + message);
153  
154      var digestbytes = crypt.wordsToBytes(md5(message, options));
155      return options && options.asBytes ? digestbytes :
156          options && options.asString ? bin.bytesToString(digestbytes) :
157          crypt.bytesToHex(digestbytes);
158    };
159  
160  })();