/* Original: Copyright (c) 1999 - 2002 Paul Johnston (paj [at] pajhome [dot] org [dot] uk) https://pajhome.org.uk/crypt/md5 Distributed under the BSD License Rewritten: 22-01-2003 Kai Meder (kai [at] meder [dot] info) https://stuff.meder.info/md5.js THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* EXAMPLE: // create an instance of the md5-algorithm var m = new md5(); // create standard md5-hash of a string var hash = m.hash('tiny-shiny-string'); // create HMAC var hmac = m.hmac('tiny-shiny-string' , 'my key'); */ function md5() { /* bits per input character. 8 - ASCII 16 - Unicode */ var char_size = 8; /** * @access private */ this.add = function(x , y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF); var msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 0xFFFF); } /** * @access private */ this.rotate_left = function(num , cnt) { return (num << cnt) | (num >>> (32 - cnt)); } /** * @access private */ this.cmn = function(q , a , b , x , s , t) { return this.add(this.rotate_left(this.add(this.add(a , q) , this.add(x , t)) , s),b); } /** * @access private */ this.ff = function(a , b , c , d , x , s , t) { return this.cmn((b & c) | ((~b) & d) , a , b , x , s , t); } /** * @access private */ this.gg = function(a , b , c , d , x , s , t) { return this.cmn((b & d) | (c & (~d)) , a , b , x , s , t); } /** * @access private */ this.hh = function(a , b , c , d , x , s , t) { return this.cmn(b ^ c ^ d , a , b , x , s , t); } /** * @access private */ this.ii = function(a , b , c , d , x , s , t) { return this.cmn(c ^ (b | (~d)) , a , b , x , s , t); } /** * @access private */ this.core = function(x , len) { /* append padding */ x[len >> 5] |= 0x80 << ((len) % 32); x[(((len + 64) >>> 9) << 4) + 14] = len; var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; var old_a , old_b , old_c , old_d; for(var i=0; i>5] |= (str.charCodeAt(i / this.char_size) & mask) << (i%32); return bin; } /** * @access private */ this.bin2hex = function(bin) { var tab = "0123456789abcdef"; var str = ""; for(var i=0; i>2] >> ((i%4)*8+4)) & 0xF) + tab.charAt((bin[i>>2] >> ((i%4)*8 )) & 0xF); } return str; } /** * computes the actual md5-hash * * @access public * * @param string data to encrypt * * @return hex-string md5-hash */ this.hash = function(data) { return this.bin2hex(this.core(this.str2bin(data) , data.length * this.char_size)); } /** * computes HMAC of data and a key * for detailed info to HMAC see following specs: * https://www.ietf.org/rfc/rfc2104.txt * * if you know any method to simulate this in PHP serverside, * please let me know ! (kai) * * @access public * * @param string data to encrypt * @param string key * * @return hex-string HMAC-hash */ this.hmac = function(data , key) { var bin_data = this.str2bin(data); var bin_key = this.str2bin(key); if(bin_key.length > 16) bin_key = this.core(bin_key , key.length * this.char_size); var i_pad = new Array(16); var o_pad = new Array(16); for(var i=0; i<16; i++) { i_pad[i] = bin_key[i] ^ 0x36363636; o_pad[i] = bin_key[i] ^ 0x5C5C5C5C; } var hash = this.core(i_pad.concat(bin_data) , 512 + (data.length * this.char_size)); return this.bin2hex(this.core(o_pad.concat(hash) , 512 + 128)); } }