dojo.require("dojo.crypto"); dojo.provide("dojo.crypto.SHA1"); dojo.require("dojo.experimental"); /* * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined * in FIPS PUB 180-1 * * Version 2.1a Copyright Paul Johnston 2000 - 2002. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * Distributed under the BSD License * See http://pajhome.org.uk/crypt/md5 for details. * * Dojo port by Tom Trenka */ dojo.experimental("dojo.crypto.SHA1"); dojo.crypto.SHA1 = 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(""); } // math 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(x,n){ return (x<>>(32-n)); } // SHA rounds function f(u,v,w){ return ((u&v)|(~u&w)); } function g(u,v,w){ return ((u&v)|(u&w)|(v&w)); } function h(u,v,w){ return (u^v^w); } function fn(i,u,v,w){ if(i<20) return f(u,v,w); if(i<40) return h(u,v,w); if(i<60) return g(u,v,w); return h(u,v,w); } function cnst(i){ if(i<20) return 1518500249; if(i<40) return 1859775393; if(i<60) return -1894007588; return -899497514; } function core(x,len){ x[len>>5]|=0x80<<(24-len%32); x[((len+64>>9)<<4)+15]=len; var w=[]; var a= 1732584193; // 0x67452301 var b=-271733879; // 0xefcdab89 var c=-1732584194; // 0x98badcfe var d= 271733878; // 0x10325476 var e=-1009589776; // 0xc3d2e1f0 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); } 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)); } } }; }();