dojo.require("dojo.crypto"); dojo.provide("dojo.crypto.MD5"); /* Return to a port of Paul Johnstone's MD5 implementation * http://pajhome.org.uk/crypt/md5/index.html * * Copyright (C) Paul Johnston 1999 - 2002. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * Distributed under the BSD License * * Dojo port by Tom Trenka * * 2005-12-7 * All conversions are internalized (no dependencies) * implemented getHMAC for message digest auth. */ dojo.crypto.MD5 = new function(){ var chrsz=8; var mask=(1<>5]|=(s.charCodeAt(i/chrsz)&mask)<<(i%32); return wa; } function toString(wa){ var s=[]; for(var i=0; i>5]>>>(i%32))&mask)); return s.join(""); } function toHex(wa) { var h="0123456789abcdef"; var s=[]; for(var i=0; i>2]>>((i%4)*8+4))&0xF)+h.charAt((wa[i>>2]>>((i%4)*8))&0xF)); } return s.join(""); } function toBase64(wa){ var p="="; var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var s=[]; for(var i=0; i>2]>>8*(i%4))&0xFF)<<16)|(((wa[i+1>>2]>>8*((i+1)%4))&0xFF)<<8)|((wa[i+2>>2]>>8*((i+2)%4))&0xFF); for(var j=0; j<4; j++){ if(i*8+j*6>wa.length*32) s.push(p); else s.push(tab.charAt((t>>6*(3-j))&0x3F)); } } return s.join(""); } function add(x,y) { var l=(x&0xFFFF)+(y&0xFFFF); var m=(x>>16)+(y>>16)+(l>>16); return (m<<16)|(l&0xFFFF); } function R(n,c){ return (n<>>(32-c)); } function C(q,a,b,x,s,t){ return add(R(add(add(a,q),add(x,t)),s),b); } function FF(a,b,c,d,x,s,t){ return C((b&c)|((~b)&d),a,b,x,s,t); } function GG(a,b,c,d,x,s,t){ return C((b&d)|(c&(~d)),a,b,x,s,t); } function HH(a,b,c,d,x,s,t){ return C(b^c^d,a,b,x,s,t); } function II(a,b,c,d,x,s,t){ return C(c^(b|(~d)),a,b,x,s,t); } function core(x,len){ 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; for(var i=0; i16) wa=core(wa,key.length*chrsz); var l=[], r=[]; for(var i=0; i<16; i++){ l[i]=wa[i]^0x36363636; r[i]=wa[i]^0x5c5c5c5c; } var h=core(l.concat(toWord(data)),512+data.length*chrsz); return core(r.concat(h),640); } // Public functions this.compute=function(data,outputType){ var out=outputType||dojo.crypto.outputTypes.Base64; switch(out){ case dojo.crypto.outputTypes.Hex:{ return toHex(core(toWord(data),data.length*chrsz)); } case dojo.crypto.outputTypes.String:{ return toString(core(toWord(data),data.length*chrsz)); } default:{ return toBase64(core(toWord(data),data.length*chrsz)); } } }; this.getHMAC=function(data,key,outputType){ var out=outputType||dojo.crypto.outputTypes.Base64; switch(out){ case dojo.crypto.outputTypes.Hex:{ return toHex(hmac(data,key)); } case dojo.crypto.outputTypes.String:{ return toString(hmac(data,key)); } default:{ return toBase64(hmac(data,key)); } } }; }();