JavaScript SHA512&SHA256加密算法详解
JavaScriptSHA512加密算法详细代码
/*
*AJavaScriptimplementationoftheSecureHashAlgorithm,SHA-512,asdefined
*inFIPS180-2
*Version2.2CopyrightAnonymousContributor,PaulJohnston2000-2009.
*Othercontributors:GregHolt,AndrewKepert,Ydnar,Lostinet
*DistributedundertheBSDLicense
*Seehttp://pajhome.org.uk/crypt/md5fordetails.
*/
/*
*Configurablevariables.Youmayneedtotweakthesetobecompatiblewith
*theserver-side,butthedefaultsworkinmostcases.
*/
varhexcase=0;/*hexoutputformat.0-lowercase;1-uppercase*/
varb64pad="";/*base-64padcharacter."="forstrictRFCcompliance*/
/*
*Thesearethefunctionsyou'llusuallywanttocall
*Theytakestringargumentsandreturneitherhexorbase-64encodedstrings
*/
functionhex_sha512(s){returnrstr2hex(rstr_sha512(str2rstr_utf8(s)));}
functionb64_sha512(s){returnrstr2b64(rstr_sha512(str2rstr_utf8(s)));}
functionany_sha512(s,e){returnrstr2any(rstr_sha512(str2rstr_utf8(s)),e);}
functionhex_hmac_sha512(k,d)
{returnrstr2hex(rstr_hmac_sha512(str2rstr_utf8(k),str2rstr_utf8(d)));}
functionb64_hmac_sha512(k,d)
{returnrstr2b64(rstr_hmac_sha512(str2rstr_utf8(k),str2rstr_utf8(d)));}
functionany_hmac_sha512(k,d,e)
{returnrstr2any(rstr_hmac_sha512(str2rstr_utf8(k),str2rstr_utf8(d)),e);}
/*
*Performasimpleself-testtoseeiftheVMisworking
*/
functionsha512_vm_test()
{
returnhex_sha512("abc").toLowerCase()==
"ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a"+
"2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f";
}
/*
*CalculatetheSHA-512ofarawstring
*/
functionrstr_sha512(s)
{
returnbinb2rstr(binb_sha512(rstr2binb(s),s.length*8));
}
/*
*CalculatetheHMAC-SHA-512ofakeyandsomedata(rawstrings)
*/
functionrstr_hmac_sha512(key,data)
{
varbkey=rstr2binb(key);
if(bkey.length>32)bkey=binb_sha512(bkey,key.length*8);
varipad=Array(32),opad=Array(32);
for(vari=0;i<32;i++)
{
ipad[i]=bkey[i]^0x36363636;
opad[i]=bkey[i]^0x5C5C5C5C;
}
varhash=binb_sha512(ipad.concat(rstr2binb(data)),1024+data.length*8);
returnbinb2rstr(binb_sha512(opad.concat(hash),1024+512));
}
/*
*Convertarawstringtoahexstring
*/
functionrstr2hex(input)
{
try{hexcase}catch(e){hexcase=0;}
varhex_tab=hexcase?"0123456789ABCDEF":"0123456789abcdef";
varoutput="";
varx;
for(vari=0;i<input.length;i++)
{
x=input.charCodeAt(i);
output+=hex_tab.charAt((x>>>4)&0x0F)
+hex_tab.charAt(x&0x0F);
}
returnoutput;
}
/*
*Convertarawstringtoabase-64string
*/
functionrstr2b64(input)
{
try{b64pad}catch(e){b64pad='';}
vartab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
varoutput="";
varlen=input.length;
for(vari=0;i<len;i+=3)
{
vartriplet=(input.charCodeAt(i)<<16)
|(i+1<len?input.charCodeAt(i+1)<<8:0)
|(i+2<len?input.charCodeAt(i+2):0);
for(varj=0;j<4;j++)
{
if(i*8+j*6>input.length*8)output+=b64pad;
elseoutput+=tab.charAt((triplet>>>6*(3-j))&0x3F);
}
}
returnoutput;
}
/*
*Convertarawstringtoanarbitrarystringencoding
*/
functionrstr2any(input,encoding)
{
vardivisor=encoding.length;
vari,j,q,x,quotient;
/*Converttoanarrayof16-bitbig-endianvalues,formingthedividend*/
vardividend=Array(Math.ceil(input.length/2));
for(i=0;i<dividend.length;i++)
{
dividend[i]=(input.charCodeAt(i*2)<<8)|input.charCodeAt(i*2+1);
}
/*
*Repeatedlyperformalongdivision.Thebinaryarrayformsthedividend,
*thelengthoftheencodingisthedivisor.Oncecomputed,thequotient
*formsthedividendforthenextstep.Allremaindersarestoredforlater
*use.
*/
varfull_length=Math.ceil(input.length*8/
(Math.log(encoding.length)/Math.log(2)));
varremainders=Array(full_length);
for(j=0;j<full_length;j++)
{
quotient=Array();
x=0;
for(i=0;i<dividend.length;i++)
{
x=(x<<16)+dividend[i];
q=Math.floor(x/divisor);
x-=q*divisor;
if(quotient.length>0||q>0)
quotient[quotient.length]=q;
}
remainders[j]=x;
dividend=quotient;
}
/*Converttheremainderstotheoutputstring*/
varoutput="";
for(i=remainders.length-1;i>=0;i--)
output+=encoding.charAt(remainders[i]);
returnoutput;
}
/*
*Encodeastringasutf-8.
*Forefficiency,thisassumestheinputisvalidutf-16.
*/
functionstr2rstr_utf8(input)
{
varoutput="";
vari=-1;
varx,y;
while(++i<input.length)
{
/*Decodeutf-16surrogatepairs*/
x=input.charCodeAt(i);
y=i+1<input.length?input.charCodeAt(i+1):0;
if(0xD800<=x&&x<=0xDBFF&&0xDC00<=y&&y<=0xDFFF)
{
x=0x10000+((x&0x03FF)<<10)+(y&0x03FF);
i++;
}
/*Encodeoutputasutf-8*/
if(x<=0x7F)
output+=String.fromCharCode(x);
elseif(x<=0x7FF)
output+=String.fromCharCode(0xC0|((x>>>6)&0x1F),
0x80|(x&0x3F));
elseif(x<=0xFFFF)
output+=String.fromCharCode(0xE0|((x>>>12)&0x0F),
0x80|((x>>>6)&0x3F),
0x80|(x&0x3F));
elseif(x<=0x1FFFFF)
output+=String.fromCharCode(0xF0|((x>>>18)&0x07),
0x80|((x>>>12)&0x3F),
0x80|((x>>>6)&0x3F),
0x80|(x&0x3F));
}
returnoutput;
}
/*
*Encodeastringasutf-16
*/
functionstr2rstr_utf16le(input)
{
varoutput="";
for(vari=0;i<input.length;i++)
output+=String.fromCharCode(input.charCodeAt(i)&0xFF,
(input.charCodeAt(i)>>>8)&0xFF);
returnoutput;
}
functionstr2rstr_utf16be(input)
{
varoutput="";
for(vari=0;i<input.length;i++)
output+=String.fromCharCode((input.charCodeAt(i)>>>8)&0xFF,
input.charCodeAt(i)&0xFF);
returnoutput;
}
/*
*Convertarawstringtoanarrayofbig-endianwords
*Characters>255havetheirhigh-bytesilentlyignored.
*/
functionrstr2binb(input)
{
varoutput=Array(input.length>>2);
for(vari=0;i<output.length;i++)
output[i]=0;
for(vari=0;i<input.length*8;i+=8)
output[i>>5]|=(input.charCodeAt(i/8)&0xFF)<<(24-i%32);
returnoutput;
}
/*
*Convertanarrayofbig-endianwordstoastring
*/
functionbinb2rstr(input)
{
varoutput="";
for(vari=0;i<input.length*32;i+=8)
output+=String.fromCharCode((input[i>>5]>>>(24-i%32))&0xFF);
returnoutput;
}
/*
*CalculatetheSHA-512ofanarrayofbig-endiandwords,andabitlength
*/
varsha512_k;
functionbinb_sha512(x,len)
{
if(sha512_k==undefined)
{
//SHA512constants
sha512_k=newArray(
newint64(0x428a2f98,-685199838),newint64(0x71374491,0x23ef65cd),
newint64(-1245643825,-330482897),newint64(-373957723,-2121671748),
newint64(0x3956c25b,-213338824),newint64(0x59f111f1,-1241133031),
newint64(-1841331548,-1357295717),newint64(-1424204075,-630357736),
newint64(-670586216,-1560083902),newint64(0x12835b01,0x45706fbe),
newint64(0x243185be,0x4ee4b28c),newint64(0x550c7dc3,-704662302),
newint64(0x72be5d74,-226784913),newint64(-2132889090,0x3b1696b1),
newint64(-1680079193,0x25c71235),newint64(-1046744716,-815192428),
newint64(-459576895,-1628353838),newint64(-272742522,0x384f25e3),
newint64(0xfc19dc6,-1953704523),newint64(0x240ca1cc,0x77ac9c65),
newint64(0x2de92c6f,0x592b0275),newint64(0x4a7484aa,0x6ea6e483),
newint64(0x5cb0a9dc,-1119749164),newint64(0x76f988da,-2096016459),
newint64(-1740746414,-295247957),newint64(-1473132947,0x2db43210),
newint64(-1341970488,-1728372417),newint64(-1084653625,-1091629340),
newint64(-958395405,0x3da88fc2),newint64(-710438585,-1828018395),
newint64(0x6ca6351,-536640913),newint64(0x14292967,0xa0e6e70),
newint64(0x27b70a85,0x46d22ffc),newint64(0x2e1b2138,0x5c26c926),
newint64(0x4d2c6dfc,0x5ac42aed),newint64(0x53380d13,-1651133473),
newint64(0x650a7354,-1951439906),newint64(0x766a0abb,0x3c77b2a8),
newint64(-2117940946,0x47edaee6),newint64(-1838011259,0x1482353b),
newint64(-1564481375,0x4cf10364),newint64(-1474664885,-1136513023),
newint64(-1035236496,-789014639),newint64(-949202525,0x654be30),
newint64(-778901479,-688958952),newint64(-694614492,0x5565a910),
newint64(-200395387,0x5771202a),newint64(0x106aa070,0x32bbd1b8),
newint64(0x19a4c116,-1194143544),newint64(0x1e376c08,0x5141ab53),
newint64(0x2748774c,-544281703),newint64(0x34b0bcb5,-509917016),
newint64(0x391c0cb3,-976659869),newint64(0x4ed8aa4a,-482243893),
newint64(0x5b9cca4f,0x7763e373),newint64(0x682e6ff3,-692930397),
newint64(0x748f82ee,0x5defb2fc),newint64(0x78a5636f,0x43172f60),
newint64(-2067236844,-1578062990),newint64(-1933114872,0x1a6439ec),
newint64(-1866530822,0x23631e28),newint64(-1538233109,-561857047),
newint64(-1090935817,-1295615723),newint64(-965641998,-479046869),
newint64(-903397682,-366583396),newint64(-779700025,0x21c0c207),
newint64(-354779690,-840897762),newint64(-176337025,-294727304),
newint64(0x6f067aa,0x72176fba),newint64(0xa637dc5,-1563912026),
newint64(0x113f9804,-1090974290),newint64(0x1b710b35,0x131c471b),
newint64(0x28db77f5,0x23047d84),newint64(0x32caab7b,0x40c72493),
newint64(0x3c9ebe0a,0x15c9bebc),newint64(0x431d67c4,-1676669620),
newint64(0x4cc5d4be,-885112138),newint64(0x597f299c,-60457430),
newint64(0x5fcb6fab,0x3ad6faec),newint64(0x6c44198c,0x4a475817));
}
//Initialhashvalues
varH=newArray(
newint64(0x6a09e667,-205731576),
newint64(-1150833019,-2067093701),
newint64(0x3c6ef372,-23791573),
newint64(-1521486534,0x5f1d36f1),
newint64(0x510e527f,-1377402159),
newint64(-1694144372,0x2b3e6c1f),
newint64(0x1f83d9ab,-79577749),
newint64(0x5be0cd19,0x137e2179));
varT1=newint64(0,0),
T2=newint64(0,0),
a=newint64(0,0),
b=newint64(0,0),
c=newint64(0,0),
d=newint64(0,0),
e=newint64(0,0),
f=newint64(0,0),
g=newint64(0,0),
h=newint64(0,0),
//Temporaryvariablesnotspecifiedbythedocument
s0=newint64(0,0),
s1=newint64(0,0),
Ch=newint64(0,0),
Maj=newint64(0,0),
r1=newint64(0,0),
r2=newint64(0,0),
r3=newint64(0,0);
varj,i;
varW=newArray(80);
for(i=0;i<80;i++)
W[i]=newint64(0,0);
//appendpaddingtothesourcestring.TheformatisdescribedintheFIPS.
x[len>>5]|=0x80<<(24-(len&0x1f));
x[((len+128>>10)<<5)+31]=len;
for(i=0;i<x.length;i+=32)//32dwordsistheblocksize
{
int64copy(a,H[0]);
int64copy(b,H[1]);
int64copy(c,H[2]);
int64copy(d,H[3]);
int64copy(e,H[4]);
int64copy(f,H[5]);
int64copy(g,H[6]);
int64copy(h,H[7]);
for(j=0;j<16;j++)
{
W[j].h=x[i+2*j];
W[j].l=x[i+2*j+1];
}
for(j=16;j<80;j++)
{
//sigma1
int64rrot(r1,W[j-2],19);
int64revrrot(r2,W[j-2],29);
int64shr(r3,W[j-2],6);
s1.l=r1.l^r2.l^r3.l;
s1.h=r1.h^r2.h^r3.h;
//sigma0
int64rrot(r1,W[j-15],1);
int64rrot(r2,W[j-15],8);
int64shr(r3,W[j-15],7);
s0.l=r1.l^r2.l^r3.l;
s0.h=r1.h^r2.h^r3.h;
int64add4(W[j],s1,W[j-7],s0,W[j-16]);
}
for(j=0;j<80;j++)
{
//Ch
Ch.l=(e.l&f.l)^(~e.l&g.l);
Ch.h=(e.h&f.h)^(~e.h&g.h);
//Sigma1
int64rrot(r1,e,14);
int64rrot(r2,e,18);
int64revrrot(r3,e,9);
s1.l=r1.l^r2.l^r3.l;
s1.h=r1.h^r2.h^r3.h;
//Sigma0
int64rrot(r1,a,28);
int64revrrot(r2,a,2);
int64revrrot(r3,a,7);
s0.l=r1.l^r2.l^r3.l;
s0.h=r1.h^r2.h^r3.h;
//Maj
Maj.l=(a.l&b.l)^(a.l&c.l)^(b.l&c.l);
Maj.h=(a.h&b.h)^(a.h&c.h)^(b.h&c.h);
int64add5(T1,h,s1,Ch,sha512_k[j],W[j]);
int64add(T2,s0,Maj);
int64copy(h,g);
int64copy(g,f);
int64copy(f,e);
int64add(e,d,T1);
int64copy(d,c);
int64copy(c,b);
int64copy(b,a);
int64add(a,T1,T2);
}
int64add(H[0],H[0],a);
int64add(H[1],H[1],b);
int64add(H[2],H[2],c);
int64add(H[3],H[3],d);
int64add(H[4],H[4],e);
int64add(H[5],H[5],f);
int64add(H[6],H[6],g);
int64add(H[7],H[7],h);
}
//representthehashasanarrayof32-bitdwords
varhash=newArray(16);
for(i=0;i<8;i++)
{
hash[2*i]=H[i].h;
hash[2*i+1]=H[i].l;
}
returnhash;
}
//Aconstructorfor64-bitnumbers
functionint64(h,l)
{
this.h=h;
this.l=l;
//this.toString=int64toString;
}
//Copiessrcintodst,assumingbothare64-bitnumbers
functionint64copy(dst,src)
{
dst.h=src.h;
dst.l=src.l;
}
//Right-rotatesa64-bitnumberbyshift
//Won'thandlecasesofshift>=32
//Thefunctionrevrrot()isforthat
functionint64rrot(dst,x,shift)
{
dst.l=(x.l>>>shift)|(x.h<<(32-shift));
dst.h=(x.h>>>shift)|(x.l<<(32-shift));
}
//Reversesthedwordsofthesourceandthenrotatesrightbyshift.
//Thisisequivalenttorotationby32+shift
functionint64revrrot(dst,x,shift)
{
dst.l=(x.h>>>shift)|(x.l<<(32-shift));
dst.h=(x.l>>>shift)|(x.h<<(32-shift));
}
//Bitwise-shiftsrighta64-bitnumberbyshift
//Won'thandleshift>=32,butit'sneverneededinSHA512
functionint64shr(dst,x,shift)
{
dst.l=(x.l>>>shift)|(x.h<<(32-shift));
dst.h=(x.h>>>shift);
}
//Addstwo64-bitnumbers
//Liketheoriginalimplementation,doesnotrelyon32-bitoperations
functionint64add(dst,x,y)
{
varw0=(x.l&0xffff)+(y.l&0xffff);
varw1=(x.l>>>16)+(y.l>>>16)+(w0>>>16);
varw2=(x.h&0xffff)+(y.h&0xffff)+(w1>>>16);
varw3=(x.h>>>16)+(y.h>>>16)+(w2>>>16);
dst.l=(w0&0xffff)|(w1<<16);
dst.h=(w2&0xffff)|(w3<<16);
}
//Same,exceptwith4addends.Worksfasterthanaddingthemonebyone.
functionint64add4(dst,a,b,c,d)
{
varw0=(a.l&0xffff)+(b.l&0xffff)+(c.l&0xffff)+(d.l&0xffff);
varw1=(a.l>>>16)+(b.l>>>16)+(c.l>>>16)+(d.l>>>16)+(w0>>>16);
varw2=(a.h&0xffff)+(b.h&0xffff)+(c.h&0xffff)+(d.h&0xffff)+(w1>>>16);
varw3=(a.h>>>16)+(b.h>>>16)+(c.h>>>16)+(d.h>>>16)+(w2>>>16);
dst.l=(w0&0xffff)|(w1<<16);
dst.h=(w2&0xffff)|(w3<<16);
}
//Same,exceptwith5addends
functionint64add5(dst,a,b,c,d,e)
{
varw0=(a.l&0xffff)+(b.l&0xffff)+(c.l&0xffff)+(d.l&0xffff)+(e.l&0xffff);
varw1=(a.l>>>16)+(b.l>>>16)+(c.l>>>16)+(d.l>>>16)+(e.l>>>16)+(w0>>>16);
varw2=(a.h&0xffff)+(b.h&0xffff)+(c.h&0xffff)+(d.h&0xffff)+(e.h&0xffff)+(w1>>>16);
varw3=(a.h>>>16)+(b.h>>>16)+(c.h>>>16)+(d.h>>>16)+(e.h>>>16)+(w2>>>16);
dst.l=(w0&0xffff)|(w1<<16);
dst.h=(w2&0xffff)|(w3<<16);
}
SHR256加密算法
/*
*AJavaScriptimplementationoftheSecureHashAlgorithm,SHA-256,asdefined
*inFIPS180-2
*Version2.2CopyrightAngelMarin,PaulJohnston2000-2009.
*Othercontributors:GregHolt,AndrewKepert,Ydnar,Lostinet
*DistributedundertheBSDLicense
*Seehttp://pajhome.org.uk/crypt/md5fordetails.
*Alsohttp://anmar.eu.org/projects/jssha2/
*/
/*
*Configurablevariables.Youmayneedtotweakthesetobecompatiblewith
*theserver-side,butthedefaultsworkinmostcases.
*/
varhexcase=0;/*hexoutputformat.0-lowercase;1-uppercase*/
varb64pad="";/*base-64padcharacter."="forstrictRFCcompliance*/
/*
*Thesearethefunctionsyou'llusuallywanttocall
*Theytakestringargumentsandreturneitherhexorbase-64encodedstrings
*/
functionhex_sha256(s){returnrstr2hex(rstr_sha256(str2rstr_utf8(s)));}
functionb64_sha256(s){returnrstr2b64(rstr_sha256(str2rstr_utf8(s)));}
functionany_sha256(s,e){returnrstr2any(rstr_sha256(str2rstr_utf8(s)),e);}
functionhex_hmac_sha256(k,d)
{returnrstr2hex(rstr_hmac_sha256(str2rstr_utf8(k),str2rstr_utf8(d)));}
functionb64_hmac_sha256(k,d)
{returnrstr2b64(rstr_hmac_sha256(str2rstr_utf8(k),str2rstr_utf8(d)));}
functionany_hmac_sha256(k,d,e)
{returnrstr2any(rstr_hmac_sha256(str2rstr_utf8(k),str2rstr_utf8(d)),e);}
/*
*Performasimpleself-testtoseeiftheVMisworking
*/
functionsha256_vm_test()
{
returnhex_sha256("abc").toLowerCase()==
"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad";
}
/*
*Calculatethesha256ofarawstring
*/
functionrstr_sha256(s)
{
returnbinb2rstr(binb_sha256(rstr2binb(s),s.length*8));
}
/*
*CalculatetheHMAC-sha256ofakeyandsomedata(rawstrings)
*/
functionrstr_hmac_sha256(key,data)
{
varbkey=rstr2binb(key);
if(bkey.length>16)bkey=binb_sha256(bkey,key.length*8);
varipad=Array(16),opad=Array(16);
for(vari=0;i<16;i++)
{
ipad[i]=bkey[i]^0x36363636;
opad[i]=bkey[i]^0x5C5C5C5C;
}
varhash=binb_sha256(ipad.concat(rstr2binb(data)),512+data.length*8);
returnbinb2rstr(binb_sha256(opad.concat(hash),512+256));
}
/*
*Convertarawstringtoahexstring
*/
functionrstr2hex(input)
{
try{hexcase}catch(e){hexcase=0;}
varhex_tab=hexcase?"0123456789ABCDEF":"0123456789abcdef";
varoutput="";
varx;
for(vari=0;i<input.length;i++)
{
x=input.charCodeAt(i);
output+=hex_tab.charAt((x>>>4)&0x0F)
+hex_tab.charAt(x&0x0F);
}
returnoutput;
}
/*
*Convertarawstringtoabase-64string
*/
functionrstr2b64(input)
{
try{b64pad}catch(e){b64pad='';}
vartab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
varoutput="";
varlen=input.length;
for(vari=0;i<len;i+=3)
{
vartriplet=(input.charCodeAt(i)<<16)
|(i+1<len?input.charCodeAt(i+1)<<8:0)
|(i+2<len?input.charCodeAt(i+2):0);
for(varj=0;j<4;j++)
{
if(i*8+j*6>input.length*8)output+=b64pad;
elseoutput+=tab.charAt((triplet>>>6*(3-j))&0x3F);
}
}
returnoutput;
}
/*
*Convertarawstringtoanarbitrarystringencoding
*/
functionrstr2any(input,encoding)
{
vardivisor=encoding.length;
varremainders=Array();
vari,q,x,quotient;
/*Converttoanarrayof16-bitbig-endianvalues,formingthedividend*/
vardividend=Array(Math.ceil(input.length/2));
for(i=0;i<dividend.length;i++)
{
dividend[i]=(input.charCodeAt(i*2)<<8)|input.charCodeAt(i*2+1);
}
/*
*Repeatedlyperformalongdivision.Thebinaryarrayformsthedividend,
*thelengthoftheencodingisthedivisor.Oncecomputed,thequotient
*formsthedividendforthenextstep.Westopwhenthedividendiszero.
*Allremaindersarestoredforlateruse.
*/
while(dividend.length>0)
{
quotient=Array();
x=0;
for(i=0;i<dividend.length;i++)
{
x=(x<<16)+dividend[i];
q=Math.floor(x/divisor);
x-=q*divisor;
if(quotient.length>0||q>0)
quotient[quotient.length]=q;
}
remainders[remainders.length]=x;
dividend=quotient;
}
/*Converttheremainderstotheoutputstring*/
varoutput="";
for(i=remainders.length-1;i>=0;i--)
output+=encoding.charAt(remainders[i]);
/*Appendleadingzeroequivalents*/
varfull_length=Math.ceil(input.length*8/
(Math.log(encoding.length)/Math.log(2)))
for(i=output.length;i<full_length;i++)
output=encoding[0]+output;
returnoutput;
}
/*
*Encodeastringasutf-8.
*Forefficiency,thisassumestheinputisvalidutf-16.
*/
functionstr2rstr_utf8(input)
{
varoutput="";
vari=-1;
varx,y;
while(++i<input.length)
{
/*Decodeutf-16surrogatepairs*/
x=input.charCodeAt(i);
y=i+1<input.length?input.charCodeAt(i+1):0;
if(0xD800<=x&&x<=0xDBFF&&0xDC00<=y&&y<=0xDFFF)
{
x=0x10000+((x&0x03FF)<<10)+(y&0x03FF);
i++;
}
/*Encodeoutputasutf-8*/
if(x<=0x7F)
output+=String.fromCharCode(x);
elseif(x<=0x7FF)
output+=String.fromCharCode(0xC0|((x>>>6)&0x1F),
0x80|(x&0x3F));
elseif(x<=0xFFFF)
output+=String.fromCharCode(0xE0|((x>>>12)&0x0F),
0x80|((x>>>6)&0x3F),
0x80|(x&0x3F));
elseif(x<=0x1FFFFF)
output+=String.fromCharCode(0xF0|((x>>>18)&0x07),
0x80|((x>>>12)&0x3F),
0x80|((x>>>6)&0x3F),
0x80|(x&0x3F));
}
returnoutput;
}
/*
*Encodeastringasutf-16
*/
functionstr2rstr_utf16le(input)
{
varoutput="";
for(vari=0;i<input.length;i++)
output+=String.fromCharCode(input.charCodeAt(i)&0xFF,
(input.charCodeAt(i)>>>8)&0xFF);
returnoutput;
}
functionstr2rstr_utf16be(input)
{
varoutput="";
for(vari=0;i<input.length;i++)
output+=String.fromCharCode((input.charCodeAt(i)>>>8)&0xFF,
input.charCodeAt(i)&0xFF);
returnoutput;
}
/*
*Convertarawstringtoanarrayofbig-endianwords
*Characters>255havetheirhigh-bytesilentlyignored.
*/
functionrstr2binb(input)
{
varoutput=Array(input.length>>2);
for(vari=0;i<output.length;i++)
output[i]=0;
for(vari=0;i<input.length*8;i+=8)
output[i>>5]|=(input.charCodeAt(i/8)&0xFF)<<(24-i%32);
returnoutput;
}
/*
*Convertanarrayofbig-endianwordstoastring
*/
functionbinb2rstr(input)
{
varoutput="";
for(vari=0;i<input.length*32;i+=8)
output+=String.fromCharCode((input[i>>5]>>>(24-i%32))&0xFF);
returnoutput;
}
/*
*Mainsha256function,withitssupportfunctions
*/
functionsha256_S(X,n){return(X>>>n)|(X<<(32-n));}
functionsha256_R(X,n){return(X>>>n);}
functionsha256_Ch(x,y,z){return((x&y)^((~x)&z));}
functionsha256_Maj(x,y,z){return((x&y)^(x&z)^(y&z));}
functionsha256_Sigma0256(x){return(sha256_S(x,2)^sha256_S(x,13)^sha256_S(x,22));}
functionsha256_Sigma1256(x){return(sha256_S(x,6)^sha256_S(x,11)^sha256_S(x,25));}
functionsha256_Gamma0256(x){return(sha256_S(x,7)^sha256_S(x,18)^sha256_R(x,3));}
functionsha256_Gamma1256(x){return(sha256_S(x,17)^sha256_S(x,19)^sha256_R(x,10));}
functionsha256_Sigma0512(x){return(sha256_S(x,28)^sha256_S(x,34)^sha256_S(x,39));}
functionsha256_Sigma1512(x){return(sha256_S(x,14)^sha256_S(x,18)^sha256_S(x,41));}
functionsha256_Gamma0512(x){return(sha256_S(x,1)^sha256_S(x,8)^sha256_R(x,7));}
functionsha256_Gamma1512(x){return(sha256_S(x,19)^sha256_S(x,61)^sha256_R(x,6));}
varsha256_K=newArray
(
1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,
-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,
1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,
264347078,604807628,770255983,1249150122,1555081692,1996064986,
-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,
113926993,338241895,666307205,773529912,1294757372,1396182291,
1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,
-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,
430227734,506948616,659060556,883997877,958139571,1322822218,
1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,
-1866530822,-1538233109,-1090935817,-965641998
);
functionbinb_sha256(m,l)
{
varHASH=newArray(1779033703,-1150833019,1013904242,-1521486534,
1359893119,-1694144372,528734635,1541459225);
varW=newArray(64);
vara,b,c,d,e,f,g,h;
vari,j,T1,T2;
/*appendpadding*/
m[l>>5]|=0x80<<(24-l%32);
m[((l+64>>9)<<4)+15]=l;
for(i=0;i<m.length;i+=16)
{
a=HASH[0];
b=HASH[1];
c=HASH[2];
d=HASH[3];
e=HASH[4];
f=HASH[5];
g=HASH[6];
h=HASH[7];
for(j=0;j<64;j++)
{
if(j<16)W[j]=m[j+i];
elseW[j]=safe_add(safe_add(safe_add(sha256_Gamma1256(W[j-2]),W[j-7]),
sha256_Gamma0256(W[j-15])),W[j-16]);
T1=safe_add(safe_add(safe_add(safe_add(h,sha256_Sigma1256(e)),sha256_Ch(e,f,g)),
sha256_K[j]),W[j]);
T2=safe_add(sha256_Sigma0256(a),sha256_Maj(a,b,c));
h=g;
g=f;
f=e;
e=safe_add(d,T1);
d=c;
c=b;
b=a;
a=safe_add(T1,T2);
}
HASH[0]=safe_add(a,HASH[0]);
HASH[1]=safe_add(b,HASH[1]);
HASH[2]=safe_add(c,HASH[2]);
HASH[3]=safe_add(d,HASH[3]);
HASH[4]=safe_add(e,HASH[4]);
HASH[5]=safe_add(f,HASH[5]);
HASH[6]=safe_add(g,HASH[6]);
HASH[7]=safe_add(h,HASH[7]);
}
returnHASH;
}
functionsafe_add(x,y)
{
varlsw=(x&0xFFFF)+(y&0xFFFF);
varmsw=(x>>16)+(y>>16)+(lsw>>16);
return(msw<<16)|(lsw&0xFFFF);
}