diff --git a/.travis.yml b/.travis.yml index f5cd45c..aabe614 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,10 +3,11 @@ node_js: - "0.11" - "0.10" - "0.8" -install: +before_install: - npm install mocha -g - npm install coveralls -g - npm install mocha-lcov-reporter -g - - npm install -script: - - npm run-script coveralls +script: npm run-script coveralls +branches: + only: + - master diff --git a/CHANGELOG.md b/CHANGELOG.md index 9abcd63..32a9bb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# v0.2.0 / 2015-02-02 + +* Add test cases. +* Improve performance. + # v0.1.3 / 2015-01-26 * Add test cases. diff --git a/README.md b/README.md index 9799a82..16c7af8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # js-sha512 -[![Build Status](https://api.travis-ci.org/emn178/js-sha512.png?branch=master)](https://travis-ci.org/emn178/js-sha512) -[![Build Status](https://coveralls.io/repos/emn178/js-sha512/badge.png?branch=master)](https://coveralls.io/r/emn178/js-sha512?branch=master) +[![Build Status](https://travis-ci.org/emn178/js-sha512.svg?branch=master)](https://travis-ci.org/emn178/js-sha512) +[![Coverage Status](https://coveralls.io/repos/emn178/js-sha512/badge.svg?branch=master)](https://coveralls.io/r/emn178/js-sha512?branch=master) [![NPM](https://nodei.co/npm/js-sha512.png?stars&downloads)](https://nodei.co/npm/js-sha512/) A simple SHA-512, SHA-384, SHA-512/224, SHA-512/256 hash functions for JavaScript supports UTF-8 encoding. diff --git a/bower.json b/bower.json index 65ec646..2606b9e 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "js-sha512", - "version": "0.1.3", + "version": "0.2.0", "main": ["build/sha512.min.js"], "ignore": [ "samples", diff --git a/build/sha512.min.js b/build/sha512.min.js index 9cb5da7..2191080 100644 --- a/build/sha512.min.js +++ b/build/sha512.min.js @@ -1,14 +1,14 @@ -(function(l,J){var y="undefined"!=typeof module;y&&(l=global);var g="0123456789abcdef".split(""),B=[24,16,8,0],a=function(a,h){this.high=a<<0;this.low=h<<0};l.JS_SHA512_TEST&&(l.Long=a);a.prototype.and=function(c){return new a(this.high&c.high,this.low&c.low)};a.prototype.xor=function(c){return new a(this.high^c.high,this.low^c.low)};a.prototype.not=function(){return new a(~this.high,~this.low)};a.prototype.shiftRightUnsigned=function(c){c&=63;return 0===c?new a(this.high,this.low):32>c?new a(this.high>>> -c,this.low>>>c|this.high<<32-c):32==c?new a(0,this.high):new a(0,this.high>>>c-32)};a.prototype.rightRotate=function(c){c&=63;return 0===c?new a(this.high,this.low):32>c?new a(this.high>>>c|this.low<<32-c,this.low>>>c|this.high<<32-c):32==c?new a(this.low,this.high):new a(this.low>>>c-32|this.high<<64-c,this.high>>>c-32|this.low<<64-c)};a.prototype.add=function(c){var h=(this.low&65535)+(c.low&65535),f=(this.low>>>16)+(c.low>>>16)+(h>>>16),k=(this.high&65535)+(c.high&65535)+(f>>>16);return new a((this.high>>> -16)+(c.high>>>16)+(k>>>16)<<16|k&65535,f<<16|h&65535)};a.prototype.toHexString=function(){return g[this.high>>28&15]+g[this.high>>24&15]+g[this.high>>20&15]+g[this.high>>16&15]+g[this.high>>12&15]+g[this.high>>8&15]+g[this.high>>4&15]+g[this.high&15]+g[this.low>>28&15]+g[this.low>>24&15]+g[this.low>>20&15]+g[this.low>>16&15]+g[this.low>>12&15]+g[this.low>>8&15]+g[this.low>>4&15]+g[this.low&15]};var I=[new a(1116352408,3609767458),new a(1899447441,602891725),new a(3049323471,3964484399),new a(3921009573, -2173295548),new a(961987163,4081628472),new a(1508970993,3053834265),new a(2453635748,2937671579),new a(2870763221,3664609560),new a(3624381080,2734883394),new a(310598401,1164996542),new a(607225278,1323610764),new a(1426881987,3590304994),new a(1925078388,4068182383),new a(2162078206,991336113),new a(2614888103,633803317),new a(3248222580,3479774868),new a(3835390401,2666613458),new a(4022224774,944711139),new a(264347078,2341262773),new a(604807628,2007800933),new a(770255983,1495990901),new a(1249150122, -1856431235),new a(1555081692,3175218132),new a(1996064986,2198950837),new a(2554220882,3999719339),new a(2821834349,766784016),new a(2952996808,2566594879),new a(3210313671,3203337956),new a(3336571891,1034457026),new a(3584528711,2466948901),new a(113926993,3758326383),new a(338241895,168717936),new a(666307205,1188179964),new a(773529912,1546045734),new a(1294757372,1522805485),new a(1396182291,2643833823),new a(1695183700,2343527390),new a(1986661051,1014477480),new a(2177026350,1206759142),new a(2456956037, -344077627),new a(2730485921,1290863460),new a(2820302411,3158454273),new a(3259730800,3505952657),new a(3345764771,106217008),new a(3516065817,3606008344),new a(3600352804,1432725776),new a(4094571909,1467031594),new a(275423344,851169720),new a(430227734,3100823752),new a(506948616,1363258195),new a(659060556,3750685593),new a(883997877,3785050280),new a(958139571,3318307427),new a(1322822218,3812723403),new a(1537002063,2003034995),new a(1747873779,3602036899),new a(1955562222,1575990012),new a(2024104815, -1125592928),new a(2227730452,2716904306),new a(2361852424,442776044),new a(2428436474,593698344),new a(2756734187,3733110249),new a(3204031479,2999351573),new a(3329325298,3815920427),new a(3391569614,3928383900),new a(3515267271,566280711),new a(3940187606,3454069534),new a(4118630271,4000239992),new a(116418474,1914138554),new a(174292421,2731055270),new a(289380356,3203993006),new a(460393269,320620315),new a(685471733,587496836),new a(852142971,1086792851),new a(1017036298,365543100),new a(1126000580, -2618297676),new a(1288033470,3409855158),new a(1501505948,4234509866),new a(1607167915,987167468),new a(1816402316,1246189591)],m=function(a,h){return p(a,512,h)},F=function(a,h){return p(a,384,h)},G=function(a,h){return p(a,256,h)},H=function(a,h){return p(a,224,h)},p=function(c,h,f){var k,g,l,q,r,t,u,v;if(!f&&/[^\x00-\x7F]/.test(c)){f=[];for(var e=0,b=0;bd?f[e++]=d:(2048>d?f[e++]=192|d>>6:(55296>d||57344<=d?f[e++]=224|d>>12:(d=65536+((d&1023)<<10|c.charCodeAt(++b)& -1023),f[e++]=240|d>>18,f[e++]=128|d>>12&63),f[e++]=128|d>>6&63),f[e++]=128|d&63)}d=f.length;c=(d+16>>7)+1<<5;e=[];for(b=0;b>2]|=f[b]<>2]|=128<>1]=new a(e[b],e[b+1]);c=f}else{d=c.length;f=(d+16>>7)+1<<5;e=[];for(b=0;b>2]|=c.charCodeAt(b)<>2]|=128<>1]=new a(e[b],e[b+1])}512==h?(k=new a(1779033703,4089235720),g=new a(3144134277, -2227873595),l=new a(1013904242,4271175723),q=new a(2773480762,1595750129),r=new a(1359893119,2917565137),t=new a(2600822924,725511199),u=new a(528734635,4215389547),v=new a(1541459225,327033209)):384==h?(k=new a(3418070365,3238371032),g=new a(1654270250,914150663),l=new a(2438529370,812702999),q=new a(355462360,4144912697),r=new a(1731405415,4290775857),t=new a(2394180231,1750603025),u=new a(3675008525,1694076839),v=new a(1203062813,3204075428)):256==h?(k=new a(573645204,4230739756),g=new a(2673172387, -3360449730),l=new a(596883563,1867755857),q=new a(2520282905,1497426621),r=new a(2519219938,2827943907),t=new a(3193839141,1401305490),u=new a(721525244,746961066),v=new a(246885852,2177182882)):224==h&&(k=new a(2352822216,424955298),g=new a(1944164710,2312950998),l=new a(502970286,855612546),q=new a(1738396948,1479516111),r=new a(258812777,2077511080),t=new a(2011393907,79989058),u=new a(1067287976,1780299464),v=new a(286451373,2446758561));f=0;for(e=c.length;fd;++d)b[d]= -c[f+d];for(d=16;80>d;++d)m=b[d-15].rightRotate(1).xor(b[d-15].rightRotate(8)).xor(b[d-15].shiftRightUnsigned(7)),n=b[d-2].rightRotate(19).xor(b[d-2].rightRotate(61)).xor(b[d-2].shiftRightUnsigned(6)),b[d]=b[d-16].add(m).add(b[d-7]).add(n);for(var w=k,z=g,A=l,p=q,x=r,C=t,D=u,E=v,y,d=0;80>d;++d)m=w.rightRotate(28).xor(w.rightRotate(34)).xor(w.rightRotate(39)),n=w.and(z).xor(w.and(A)).xor(z.and(A)),m=m.add(n),n=x.rightRotate(14).xor(x.rightRotate(18)).xor(x.rightRotate(41)),y=x.and(C).xor(x.not().and(D)), -n=E.add(n).add(y).add(I[d]).add(b[d]),E=D,D=C,C=x,x=p.add(n),p=A,A=z,z=w,w=n.add(m);k=k.add(w);g=g.add(z);l=l.add(A);q=q.add(p);r=r.add(x);t=t.add(C);u=u.add(D);v=v.add(E)}k=k.toHexString()+g.toHexString()+l.toHexString()+q.toHexString();if(224==h)return k.substr(0,k.length-8);384<=h&&(k+=r.toHexString()+t.toHexString());512==h&&(k+=u.toHexString()+v.toHexString());return k};!l.JS_SHA512_TEST&&y?(m.sha512=m,m.sha384=F,m.sha512_256=G,m.sha512_224=H,module.exports=m):l&&(l.sha512=m,l.sha384=F,l.sha512_256= -G,l.sha512_224=H)})(this); \ No newline at end of file +(function(q,ha){var ca="undefined"!=typeof module;ca&&(q=global);var p="0123456789abcdef".split(""),ba=[24,16,8,0],da=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139, +264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411, +3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900, +3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],r=function(f,l){return Q(f,512,l)},ea=function(f,l){return Q(f,384,l)},fa=function(f,l){return Q(f,256,l)},ga=function(f,l){return Q(f,224,l)},Q=function(f,p,m){var n,A,B,C,D,E,F,G, +H,I,J,K,L,M,N,O;if(!m&&/[^\x00-\x7F]/.test(f)){m=[];for(var t=0,d=0;da?m[t++]=a:(2048>a?m[t++]=192|a>>6:(55296>a||57344<=a?m[t++]=224|a>>12:(a=65536+((a&1023)<<10|f.charCodeAt(++d)&1023),m[t++]=240|a>>18,m[t++]=128|a>>12&63),m[t++]=128|a>>6&63),m[t++]=128|a&63)}f=m.length;t=(f+16>>7)+1<<5;d=[];for(a=0;a>2]|=m[a]<>2]|=128<>7)+1<<5;d=[];for(a=0;a>2]|=f.charCodeAt(a)<>2]|=128<h;++h)d[h]=f[m+h];for(h=32;160>h;h+=2)g=d[h-30],k=d[h-29],P=(g>>>1|k<<31)^(g>>>8|k<<24)^g>>>7,b=(k>>>1|g<<31)^(k>>>8|g<<24)^(k>>>7|g<<25),g=d[h-4],k=d[h-3],y=(g>>>19|k<<13)^(k>>>29|g<<3)^g>>>6,z=(k>>>19|g<<13)^(g>>>29|k<<3)^(k>>>6|g<<26),g=d[h-32],k=d[h-31],a=(k&65535)+(b&65535)+(z&65535),b=(k>>>16)+(b>>>16)+(z>>>16),c=(g&65535)+(P&65535)+(y&65535),e=(g>>>16)+(P>>>16)+(y>>>16),g=d[h-14],k=d[h-13],a+=k&65535,b+=(k>>>16)+(a>>>16),c+=(g&65535)+(b>>>16),e+=(g>>>16)+(c>>>16),d[h]= +e<<16|c&65535,d[h+1]=b<<16|a&65535;u=n;v=A;q=B;r=C;R=D;S=E;T=F;U=G;w=H;x=I;V=J;W=K;X=L;Y=M;Z=N;aa=O;for(h=0;160>h;h+=2)P=(u>>>28|v<<4)^(v>>>2|u<<30)^(v>>>7|u<<25),b=(v>>>28|u<<4)^(u>>>2|v<<30)^(u>>>7|v<<25),y=(w>>>14|x<<18)^(w>>>18|x<<14)^(x>>>9|w<<23),z=(x>>>14|w<<18)^(x>>>18|w<<14)^(w>>>9|x<<23),g=u&q^u&R^q&R,c=v&r^v&S^r&S,a=(c&65535)+(b&65535),b=(c>>>16)+(b>>>16)+(a>>>16),c=(g&65535)+(P&65535)+(b>>>16),e=(g>>>16)+(P>>>16)+(c>>>16),P=e<<16|c&65535,Q=b<<16|a&65535,e=w&V^~w&X,b=x&W^~x&Y,g=d[h],k= +d[h+1],a=(k&65535)+(b&65535)+(z&65535)+(aa&65535),b=(k>>>16)+(b>>>16)+(z>>>16)+(aa>>>16),c=(g&65535)+(e&65535)+(y&65535)+(Z&65535),e=(g>>>16)+(e>>>16)+(y>>>16)+(Z>>>16),g=da[h],k=da[h+1],a+=k&65535,b+=(k>>>16)+(a>>>16),c+=(g&65535)+(b>>>16),e+=(g>>>16)+(c>>>16),y=e<<16|c&65535,z=b<<16|a&65535,Z=X,aa=Y,X=V,Y=W,V=w,W=x,a=(U&65535)+(z&65535),b=(U>>>16)+(z>>>16)+(a>>>16),c=(T&65535)+(y&65535)+(b>>>16),e=(T>>>16)+(y>>>16)+(c>>>16),w=e<<16|c&65535,x=b<<16|a&65535,T=R,U=S,R=q,S=r,q=u,r=v,a=(Q&65535)+(z& +65535),b=(Q>>>16)+(z>>>16)+(a>>>16),c=(P&65535)+(y&65535)+(b>>>16),e=(P>>>16)+(y>>>16)+(c>>>16),u=e<<16|c&65535,v=b<<16|a&65535;a=(A&65535)+(v&65535);b=(A>>>16)+(v>>>16)+(a>>>16);c=(n&65535)+(u&65535)+(b>>>16);e=(n>>>16)+(u>>>16)+(c>>>16);n=e<<16|c&65535;A=b<<16|a&65535;a=(C&65535)+(r&65535);b=(C>>>16)+(r>>>16)+(a>>>16);c=(B&65535)+(q&65535)+(b>>>16);e=(B>>>16)+(q>>>16)+(c>>>16);B=e<<16|c&65535;C=b<<16|a&65535;a=(E&65535)+(S&65535);b=(E>>>16)+(S>>>16)+(a>>>16);c=(D&65535)+(R&65535)+(b>>>16);e=(D>>> +16)+(R>>>16)+(c>>>16);D=e<<16|c&65535;E=b<<16|a&65535;a=(G&65535)+(U&65535);b=(G>>>16)+(U>>>16)+(a>>>16);c=(F&65535)+(T&65535)+(b>>>16);e=(F>>>16)+(T>>>16)+(c>>>16);F=e<<16|c&65535;G=b<<16|a&65535;a=(I&65535)+(x&65535);b=(I>>>16)+(x>>>16)+(a>>>16);c=(H&65535)+(w&65535)+(b>>>16);e=(H>>>16)+(w>>>16)+(c>>>16);H=e<<16|c&65535;I=b<<16|a&65535;a=(K&65535)+(W&65535);b=(K>>>16)+(W>>>16)+(a>>>16);c=(J&65535)+(V&65535)+(b>>>16);e=(J>>>16)+(V>>>16)+(c>>>16);J=e<<16|c&65535;K=b<<16|a&65535;a=(M&65535)+(Y&65535); +b=(M>>>16)+(Y>>>16)+(a>>>16);c=(L&65535)+(X&65535)+(b>>>16);e=(L>>>16)+(X>>>16)+(c>>>16);L=e<<16|c&65535;M=b<<16|a&65535;a=(O&65535)+(aa&65535);b=(O>>>16)+(aa>>>16)+(a>>>16);c=(N&65535)+(Z&65535)+(b>>>16);e=(N>>>16)+(Z>>>16)+(c>>>16);N=e<<16|c&65535;O=b<<16|a&65535}n=l(n)+l(A)+l(B)+l(C)+l(D)+l(E)+l(F)+l(G);if(224==p)return n.substr(0,n.length-8);384<=p&&(n+=l(H)+l(I)+l(J)+l(K));512==p&&(n+=l(L)+l(M)+l(N)+l(O));return n},l=function(f){return p[f>>28&15]+p[f>>24&15]+p[f>>20&15]+p[f>>16&15]+p[f>>12& +15]+p[f>>8&15]+p[f>>4&15]+p[f&15]};!q.JS_SHA512_TEST&&ca?(r.sha512=r,r.sha384=ea,r.sha512_256=fa,r.sha512_224=ga,module.exports=r):q&&(q.sha512=r,q.sha384=ea,q.sha512_256=fa,q.sha512_224=ga)})(this); diff --git a/package.json b/package.json index 549d730..da2e289 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "js-sha512", - "version": "0.1.3", + "version": "0.2.0", "description": "This is a simple SHA-512, SHA-384, SHA-512/224, SHA-512/256 hash functions for JavaScript supports UTF-8 encoding.", "main": "src/sha512.js", "devDependencies": { diff --git a/src/sha512.js b/src/sha512.js index 83013f0..8f32cdd 100644 --- a/src/sha512.js +++ b/src/sha512.js @@ -1,5 +1,5 @@ /* - * js-sha512 v0.1.3 + * js-sha512 v0.2.0 * https://github.com/emn178/js-sha512 * * Copyright 2014-2015, emn178@gmail.com @@ -17,125 +17,46 @@ var HEX_CHARS = '0123456789abcdef'.split(''); var SHIFT = [24, 16, 8, 0]; - // Class Long - var Long = function(high, low) { - this.high = high << 0; - this.low = low << 0; - }; - - if(root.JS_SHA512_TEST) { - root.Long = Long; - } - - Long.prototype.and = function(other) { - return new Long(this.high & other.high, this.low & other.low); - }; - - Long.prototype.xor = function(other) { - return new Long(this.high ^ other.high, this.low ^ other.low); - }; - - Long.prototype.not = function() { - return new Long(~this.high, ~this.low); - }; - - Long.prototype.shiftRightUnsigned = function(numBits) { - numBits &= 63; - if(numBits === 0) { - return new Long(this.high, this.low); - } - if(numBits < 32) { - return new Long(this.high >>> numBits, (this.low >>> numBits) | (this.high << (32 - numBits))); - } else if(numBits == 32) { - return new Long(0, this.high); - } else { - return new Long(0, this.high >>> (numBits - 32)); - } - }; - - Long.prototype.rightRotate = function(numBits) { - numBits &= 63; - if(numBits === 0) { - return new Long(this.high, this.low); - } - if(numBits < 32) { - return new Long((this.high >>> numBits) | (this.low << (32 - numBits)), (this.low >>> numBits) | (this.high << (32 - numBits))); - } else if(numBits == 32) { - return new Long(this.low, this.high); - } else { - return new Long((this.low >>> (numBits - 32)) | (this.high << (64 - numBits)), (this.high >>> (numBits - 32)) | (this.low << (64 - numBits))); - } - }; - - Long.prototype.add = function(other) { - var a1 = this.low & 0xFFFF; - var a2 = this.low >>> 16; - var a3 = this.high & 0xFFFF; - var a4 = this.high >>> 16; - - var b1 = other.low & 0xFFFF; - var b2 = other.low >>> 16; - var b3 = other.high & 0xFFFF; - var b4 = other.high >>> 16; - - var c1 = a1 + b1; - var c2 = a2 + b2 + (c1 >>> 16); - var c3 = a3 + b3 + (c2 >>> 16); - var c4 = a4 + b4 + (c3 >>> 16); - return new Long((c4 << 16) | (c3 & 0xFFFF), (c2 << 16) | (c1 & 0xFFFF)); - }; - - Long.prototype.toHexString = function() { - return HEX_CHARS[(this.high >> 28) & 0x0F] + HEX_CHARS[(this.high >> 24) & 0x0F] + - HEX_CHARS[(this.high >> 20) & 0x0F] + HEX_CHARS[(this.high >> 16) & 0x0F] + - HEX_CHARS[(this.high >> 12) & 0x0F] + HEX_CHARS[(this.high >> 8) & 0x0F] + - HEX_CHARS[(this.high >> 4) & 0x0F] + HEX_CHARS[this.high & 0x0F] + - HEX_CHARS[(this.low >> 28) & 0x0F] + HEX_CHARS[(this.low >> 24) & 0x0F] + - HEX_CHARS[(this.low >> 20) & 0x0F] + HEX_CHARS[(this.low >> 16) & 0x0F] + - HEX_CHARS[(this.low >> 12) & 0x0F] + HEX_CHARS[(this.low >> 8) & 0x0F] + - HEX_CHARS[(this.low >> 4) & 0x0F] + HEX_CHARS[this.low & 0x0F]; - }; - - var K =[new Long(0x428A2F98, 0xD728AE22), new Long(0x71374491, 0x23EF65CD), - new Long(0xB5C0FBCF, 0xEC4D3B2F), new Long(0xE9B5DBA5, 0x8189DBBC), - new Long(0x3956C25B, 0xF348B538), new Long(0x59F111F1, 0xB605D019), - new Long(0x923F82A4, 0xAF194F9B), new Long(0xAB1C5ED5, 0xDA6D8118), - new Long(0xD807AA98, 0xA3030242), new Long(0x12835B01, 0x45706FBE), - new Long(0x243185BE, 0x4EE4B28C), new Long(0x550C7DC3, 0xD5FFB4E2), - new Long(0x72BE5D74, 0xF27B896F), new Long(0x80DEB1FE, 0x3B1696B1), - new Long(0x9BDC06A7, 0x25C71235), new Long(0xC19BF174, 0xCF692694), - new Long(0xE49B69C1, 0x9EF14AD2), new Long(0xEFBE4786, 0x384F25E3), - new Long(0x0FC19DC6, 0x8B8CD5B5), new Long(0x240CA1CC, 0x77AC9C65), - new Long(0x2DE92C6F, 0x592B0275), new Long(0x4A7484AA, 0x6EA6E483), - new Long(0x5CB0A9DC, 0xBD41FBD4), new Long(0x76F988DA, 0x831153B5), - new Long(0x983E5152, 0xEE66DFAB), new Long(0xA831C66D, 0x2DB43210), - new Long(0xB00327C8, 0x98FB213F), new Long(0xBF597FC7, 0xBEEF0EE4), - new Long(0xC6E00BF3, 0x3DA88FC2), new Long(0xD5A79147, 0x930AA725), - new Long(0x06CA6351, 0xE003826F), new Long(0x14292967, 0x0A0E6E70), - new Long(0x27B70A85, 0x46D22FFC), new Long(0x2E1B2138, 0x5C26C926), - new Long(0x4D2C6DFC, 0x5AC42AED), new Long(0x53380D13, 0x9D95B3DF), - new Long(0x650A7354, 0x8BAF63DE), new Long(0x766A0ABB, 0x3C77B2A8), - new Long(0x81C2C92E, 0x47EDAEE6), new Long(0x92722C85, 0x1482353B), - new Long(0xA2BFE8A1, 0x4CF10364), new Long(0xA81A664B, 0xBC423001), - new Long(0xC24B8B70, 0xD0F89791), new Long(0xC76C51A3, 0x0654BE30), - new Long(0xD192E819, 0xD6EF5218), new Long(0xD6990624, 0x5565A910), - new Long(0xF40E3585, 0x5771202A), new Long(0x106AA070, 0x32BBD1B8), - new Long(0x19A4C116, 0xB8D2D0C8), new Long(0x1E376C08, 0x5141AB53), - new Long(0x2748774C, 0xDF8EEB99), new Long(0x34B0BCB5, 0xE19B48A8), - new Long(0x391C0CB3, 0xC5C95A63), new Long(0x4ED8AA4A, 0xE3418ACB), - new Long(0x5B9CCA4F, 0x7763E373), new Long(0x682E6FF3, 0xD6B2B8A3), - new Long(0x748F82EE, 0x5DEFB2FC), new Long(0x78A5636F, 0x43172F60), - new Long(0x84C87814, 0xA1F0AB72), new Long(0x8CC70208, 0x1A6439EC), - new Long(0x90BEFFFA, 0x23631E28), new Long(0xA4506CEB, 0xDE82BDE9), - new Long(0xBEF9A3F7, 0xB2C67915), new Long(0xC67178F2, 0xE372532B), - new Long(0xCA273ECE, 0xEA26619C), new Long(0xD186B8C7, 0x21C0C207), - new Long(0xEADA7DD6, 0xCDE0EB1E), new Long(0xF57D4F7F, 0xEE6ED178), - new Long(0x06F067AA, 0x72176FBA), new Long(0x0A637DC5, 0xA2C898A6), - new Long(0x113F9804, 0xBEF90DAE), new Long(0x1B710B35, 0x131C471B), - new Long(0x28DB77F5, 0x23047D84), new Long(0x32CAAB7B, 0x40C72493), - new Long(0x3C9EBE0A, 0x15C9BEBC), new Long(0x431D67C4, 0x9C100D4C), - new Long(0x4CC5D4BE, 0xCB3E42B6), new Long(0x597F299C, 0xFC657E2A), - new Long(0x5FCB6FAB, 0x3AD6FAEC), new Long(0x6C44198C, 0x4A475817)]; + var K =[0x428A2F98, 0xD728AE22, 0x71374491, 0x23EF65CD, + 0xB5C0FBCF, 0xEC4D3B2F, 0xE9B5DBA5, 0x8189DBBC, + 0x3956C25B, 0xF348B538, 0x59F111F1, 0xB605D019, + 0x923F82A4, 0xAF194F9B, 0xAB1C5ED5, 0xDA6D8118, + 0xD807AA98, 0xA3030242, 0x12835B01, 0x45706FBE, + 0x243185BE, 0x4EE4B28C, 0x550C7DC3, 0xD5FFB4E2, + 0x72BE5D74, 0xF27B896F, 0x80DEB1FE, 0x3B1696B1, + 0x9BDC06A7, 0x25C71235, 0xC19BF174, 0xCF692694, + 0xE49B69C1, 0x9EF14AD2, 0xEFBE4786, 0x384F25E3, + 0x0FC19DC6, 0x8B8CD5B5, 0x240CA1CC, 0x77AC9C65, + 0x2DE92C6F, 0x592B0275, 0x4A7484AA, 0x6EA6E483, + 0x5CB0A9DC, 0xBD41FBD4, 0x76F988DA, 0x831153B5, + 0x983E5152, 0xEE66DFAB, 0xA831C66D, 0x2DB43210, + 0xB00327C8, 0x98FB213F, 0xBF597FC7, 0xBEEF0EE4, + 0xC6E00BF3, 0x3DA88FC2, 0xD5A79147, 0x930AA725, + 0x06CA6351, 0xE003826F, 0x14292967, 0x0A0E6E70, + 0x27B70A85, 0x46D22FFC, 0x2E1B2138, 0x5C26C926, + 0x4D2C6DFC, 0x5AC42AED, 0x53380D13, 0x9D95B3DF, + 0x650A7354, 0x8BAF63DE, 0x766A0ABB, 0x3C77B2A8, + 0x81C2C92E, 0x47EDAEE6, 0x92722C85, 0x1482353B, + 0xA2BFE8A1, 0x4CF10364, 0xA81A664B, 0xBC423001, + 0xC24B8B70, 0xD0F89791, 0xC76C51A3, 0x0654BE30, + 0xD192E819, 0xD6EF5218, 0xD6990624, 0x5565A910, + 0xF40E3585, 0x5771202A, 0x106AA070, 0x32BBD1B8, + 0x19A4C116, 0xB8D2D0C8, 0x1E376C08, 0x5141AB53, + 0x2748774C, 0xDF8EEB99, 0x34B0BCB5, 0xE19B48A8, + 0x391C0CB3, 0xC5C95A63, 0x4ED8AA4A, 0xE3418ACB, + 0x5B9CCA4F, 0x7763E373, 0x682E6FF3, 0xD6B2B8A3, + 0x748F82EE, 0x5DEFB2FC, 0x78A5636F, 0x43172F60, + 0x84C87814, 0xA1F0AB72, 0x8CC70208, 0x1A6439EC, + 0x90BEFFFA, 0x23631E28, 0xA4506CEB, 0xDE82BDE9, + 0xBEF9A3F7, 0xB2C67915, 0xC67178F2, 0xE372532B, + 0xCA273ECE, 0xEA26619C, 0xD186B8C7, 0x21C0C207, + 0xEADA7DD6, 0xCDE0EB1E, 0xF57D4F7F, 0xEE6ED178, + 0x06F067AA, 0x72176FBA, 0x0A637DC5, 0xA2C898A6, + 0x113F9804, 0xBEF90DAE, 0x1B710B35, 0x131C471B, + 0x28DB77F5, 0x23047D84, 0x32CAAB7B, 0x40C72493, + 0x3C9EBE0A, 0x15C9BEBC, 0x431D67C4, 0x9C100D4C, + 0x4CC5D4BE, 0xCB3E42B6, 0x597F299C, 0xFC657E2A, + 0x5FCB6FAB, 0x3AD6FAEC, 0x6C44198C, 0x4A475817]; var sha512 = function(message, asciiOnly) { return sha2(message, 512, asciiOnly); @@ -154,7 +75,8 @@ }; var sha2 = function(message, tbit, asciiOnly) { - var blocks, h0, h1, h2, h3, h4, h5, h6, h7; + var blocks, h0h, h0l, h1h, h1l, h2h, h2l, h3h, h3l, + h4h, h4l, h5h, h5l, h6h, h6l, h7h, h7l; if(!asciiOnly && /[^\x00-\x7F]/.test(message)) { blocks = getBlocksFromUtf8(message); } else { @@ -162,105 +84,286 @@ } if(tbit == 512) { - h0 = new Long(0x6A09E667, 0xF3BCC908); - h1 = new Long(0xBB67AE85, 0x84CAA73B); - h2 = new Long(0x3C6EF372, 0xFE94F82B); - h3 = new Long(0xA54FF53A, 0x5F1D36F1); - h4 = new Long(0x510E527F, 0xADE682D1); - h5 = new Long(0x9B05688C, 0x2B3E6C1F); - h6 = new Long(0x1F83D9AB, 0xFB41BD6B); - h7 = new Long(0x5BE0CD19, 0x137E2179); + h0h = 0x6A09E667; + h0l = 0xF3BCC908; + h1h = 0xBB67AE85; + h1l = 0x84CAA73B; + h2h = 0x3C6EF372; + h2l = 0xFE94F82B; + h3h = 0xA54FF53A; + h3l = 0x5F1D36F1; + h4h = 0x510E527F; + h4l = 0xADE682D1; + h5h = 0x9B05688C; + h5l = 0x2B3E6C1F; + h6h = 0x1F83D9AB; + h6l = 0xFB41BD6B; + h7h = 0x5BE0CD19; + h7l = 0x137E2179; } else if(tbit == 384) { - h0 = new Long(0xCBBB9D5D, 0xC1059ED8); - h1 = new Long(0x629A292A, 0x367CD507); - h2 = new Long(0x9159015A, 0x3070DD17); - h3 = new Long(0x152FECD8, 0xF70E5939); - h4 = new Long(0x67332667, 0xFFC00B31); - h5 = new Long(0x8EB44A87, 0x68581511); - h6 = new Long(0xDB0C2E0D, 0x64F98FA7); - h7 = new Long(0x47B5481D, 0xBEFA4FA4); + h0h = 0xCBBB9D5D; + h0l = 0xC1059ED8; + h1h = 0x629A292A; + h1l = 0x367CD507; + h2h = 0x9159015A; + h2l = 0x3070DD17; + h3h = 0x152FECD8; + h3l = 0xF70E5939; + h4h = 0x67332667; + h4l = 0xFFC00B31; + h5h = 0x8EB44A87; + h5l = 0x68581511; + h6h = 0xDB0C2E0D; + h6l = 0x64F98FA7; + h7h = 0x47B5481D; + h7l = 0xBEFA4FA4; } else if(tbit == 256) { - h0 = new Long(0x22312194, 0xFC2BF72C); - h1 = new Long(0x9F555FA3, 0xC84C64C2); - h2 = new Long(0x2393B86B, 0x6F53B151); - h3 = new Long(0x96387719, 0x5940EABD); - h4 = new Long(0x96283EE2, 0xA88EFFE3); - h5 = new Long(0xBE5E1E25, 0x53863992); - h6 = new Long(0x2B0199FC, 0x2C85B8AA); - h7 = new Long(0x0EB72DDC, 0x81C52CA2); + h0h = 0x22312194; + h0l = 0xFC2BF72C; + h1h = 0x9F555FA3; + h1l = 0xC84C64C2; + h2h = 0x2393B86B; + h2l = 0x6F53B151; + h3h = 0x96387719; + h3l = 0x5940EABD; + h4h = 0x96283EE2; + h4l = 0xA88EFFE3; + h5h = 0xBE5E1E25; + h5l = 0x53863992; + h6h = 0x2B0199FC; + h6l = 0x2C85B8AA; + h7h = 0x0EB72DDC; + h7l = 0x81C52CA2; } else if(tbit == 224) { - h0 = new Long(0x8C3D37C8, 0x19544DA2); - h1 = new Long(0x73E19966, 0x89DCD4D6); - h2 = new Long(0x1DFAB7AE, 0x32FF9C82); - h3 = new Long(0x679DD514, 0x582F9FCF); - h4 = new Long(0x0F6D2B69, 0x7BD44DA8); - h5 = new Long(0x77E36F73, 0x04C48942); - h6 = new Long(0x3F9D85A8, 0x6A1D36C8); - h7 = new Long(0x1112E6AD, 0x91D692A1); + h0h = 0x8C3D37C8; + h0l = 0x19544DA2; + h1h = 0x73E19966; + h1l = 0x89DCD4D6; + h2h = 0x1DFAB7AE; + h2l = 0x32FF9C82; + h3h = 0x679DD514; + h3l = 0x582F9FCF; + h4h = 0x0F6D2B69; + h4l = 0x7BD44DA8; + h5h = 0x77E36F73; + h5l = 0x04C48942; + h6h = 0x3F9D85A8; + h6l = 0x6A1D36C8; + h7h = 0x1112E6AD; + h7l = 0x91D692A1; } - for(var i = 0, length = blocks.length;i < length;i += 16) { - var w = [], s0, s1, j; - for(j = 0;j < 16;++j) { + for(var i = 0, length = blocks.length;i < length;i += 32) { + var w = [], s0h, s0l, s1h, s1l, th, tl, c1, c2, c3, c4, j, + ah, al, bh, bl, ch, cl, dh, dl, eh, el, fh, fl, gh, gl, hh, hl, + majh, majl, t1h, t1l, t2h, t2l, chh, chl; + for(j = 0;j < 32;++j) { w[j] = blocks[i + j]; } - for(j = 16;j < 80;++j) { - s0 = w[j - 15].rightRotate(1).xor(w[j - 15].rightRotate(8)).xor(w[j - 15].shiftRightUnsigned(7)); - s1 = w[j - 2].rightRotate(19).xor(w[j - 2].rightRotate(61)).xor(w[j - 2].shiftRightUnsigned(6)); - w[j] = w[j - 16].add(s0).add(w[j - 7]).add(s1); + for(j = 32;j < 160;j += 2) { + th = w[j - 30]; + tl = w[j - 29]; + s0h = ((th >>> 1) | (tl << 31)) ^ ((th >>> 8) | (tl << 24)) ^ (th >>> 7); + s0l = ((tl >>> 1) | (th << 31)) ^ ((tl >>> 8) | (th << 24)) ^ ((tl >>> 7) | th << 25); + + th = w[j - 4]; + tl = w[j - 3]; + s1h = ((th >>> 19) | (tl << 13)) ^ ((tl >>> 29) | (th << 3)) ^ (th >>> 6); + s1l = ((tl >>> 19) | (th << 13)) ^ ((th >>> 29) | (tl << 3)) ^ ((tl >>> 6) | th << 26); + + th = w[j - 32]; + tl = w[j - 31]; + + c1 = (tl & 0xFFFF) + (s0l & 0xFFFF) + (s1l & 0xFFFF); + c2 = (tl >>> 16) + (s0l >>> 16) + (s1l >>> 16); + c3 = (th & 0xFFFF) + (s0h & 0xFFFF) + (s1h & 0xFFFF); + c4 = (th >>> 16) + (s0h >>> 16) + (s1h >>> 16); + + th = w[j - 14]; + tl = w[j - 13]; + + c1 += (tl & 0xFFFF); + c2 += (tl >>> 16) + (c1 >>> 16); + c3 += (th & 0xFFFF) + (c2 >>> 16); + c4 += (th >>> 16) + (c3 >>> 16); + + w[j] = (c4 << 16) | (c3 & 0xFFFF); + w[j + 1] = (c2 << 16) | (c1 & 0xFFFF); } - var a = h0; - var b = h1; - var c = h2; - var d = h3; - var e = h4; - var f = h5; - var g = h6; - var h = h7; - var maj, t1, t2, ch; - - for(j = 0;j < 80;++j) { - s0 = a.rightRotate(28).xor(a.rightRotate(34)).xor(a.rightRotate(39)); - maj = a.and(b).xor(a.and(c)).xor(b.and(c)); - t2 = s0.add(maj); - s1 = e.rightRotate(14).xor(e.rightRotate(18)).xor(e.rightRotate(41)); - ch = e.and(f).xor(e.not().and(g)); - t1 = h.add(s1).add(ch).add(K[j]).add(w[j]); - - h = g; - g = f; - f = e; - e = d.add(t1); - d = c; - c = b; - b = a; - a = t1.add(t2); + ah = h0h; + al = h0l; + bh = h1h; + bl = h1l; + ch = h2h; + cl = h2l; + dh = h3h; + dl = h3l; + eh = h4h; + el = h4l; + fh = h5h; + fl = h5l; + gh = h6h; + gl = h6l; + hh = h7h; + hl = h7l; + for(j = 0;j < 160;j += 2) { + s0h = ((ah >>> 28) | (al << 4)) ^ ((al >>> 2) | (ah << 30)) ^ ((al >>> 7) | (ah << 25)); + s0l = ((al >>> 28) | (ah << 4)) ^ ((ah >>> 2) | (al << 30)) ^ ((ah >>> 7) | (al << 25)); + + s1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((el >>> 9) | (eh << 23)); + s1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((eh >>> 9) | (el << 23)); + + majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); + majl = (al & bl) ^ (al & cl) ^ (bl & cl); + + c1 = (majl & 0xFFFF) + (s0l & 0xFFFF); + c2 = (majl >>> 16) + (s0l >>> 16) + (c1 >>> 16); + c3 = (majh & 0xFFFF) + (s0h & 0xFFFF) + (c2 >>> 16); + c4 = (majh >>> 16) + (s0h >>> 16) + (c3 >>> 16); + + t2h = (c4 << 16) | (c3 & 0xFFFF); + t2l = (c2 << 16) | (c1 & 0xFFFF); + + chh = (eh & fh) ^ (~eh & gh); + chl = (el & fl) ^ (~el & gl); + + th = w[j]; + tl = w[j + 1]; + + c1 = (tl & 0xFFFF) + (chl & 0xFFFF) + (s1l & 0xFFFF) + (hl & 0xFFFF); + c2 = (tl >>> 16) + (chl >>> 16) + (s1l >>> 16) + (hl >>> 16); + c3 = (th & 0xFFFF) + (chh & 0xFFFF) + (s1h & 0xFFFF) + (hh & 0xFFFF); + c4 = (th >>> 16) + (chh >>> 16) + (s1h >>> 16) + (hh >>> 16); + + th = K[j]; + tl = K[j + 1]; + + c1 += (tl & 0xFFFF); + c2 += (tl >>> 16) + (c1 >>> 16); + c3 += (th & 0xFFFF) + (c2 >>> 16); + c4 += (th >>> 16) + (c3 >>> 16); + + t1h = (c4 << 16) | (c3 & 0xFFFF); + t1l = (c2 << 16) | (c1 & 0xFFFF); + + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + + c1 = (dl & 0xFFFF) + (t1l & 0xFFFF); + c2 = (dl >>> 16) + (t1l >>> 16) + (c1 >>> 16); + c3 = (dh & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16); + c4 = (dh >>> 16) + (t1h >>> 16) + (c3 >>> 16); + + eh = (c4 << 16) | (c3 & 0xFFFF); + el = (c2 << 16) | (c1 & 0xFFFF); + + dh = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + + c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF); + c2 = (t2l >>> 16) + (t1l >>> 16) + (c1 >>> 16); + c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16); + c4 = (t2h >>> 16) + (t1h >>> 16) + (c3 >>> 16); + + ah = (c4 << 16) | (c3 & 0xFFFF); + al = (c2 << 16) | (c1 & 0xFFFF); } - h0 = h0.add(a); - h1 = h1.add(b); - h2 = h2.add(c); - h3 = h3.add(d); - h4 = h4.add(e); - h5 = h5.add(f); - h6 = h6.add(g); - h7 = h7.add(h); + c1 = (h0l & 0xFFFF) + (al & 0xFFFF); + c2 = (h0l >>> 16) + (al >>> 16) + (c1 >>> 16); + c3 = (h0h & 0xFFFF) + (ah & 0xFFFF) + (c2 >>> 16); + c4 = (h0h >>> 16) + (ah >>> 16) + (c3 >>> 16); + + h0h = (c4 << 16) | (c3 & 0xFFFF); + h0l = (c2 << 16) | (c1 & 0xFFFF); + + c1 = (h1l & 0xFFFF) + (bl & 0xFFFF); + c2 = (h1l >>> 16) + (bl >>> 16) + (c1 >>> 16); + c3 = (h1h & 0xFFFF) + (bh & 0xFFFF) + (c2 >>> 16); + c4 = (h1h >>> 16) + (bh >>> 16) + (c3 >>> 16); + + h1h = (c4 << 16) | (c3 & 0xFFFF); + h1l = (c2 << 16) | (c1 & 0xFFFF); + + c1 = (h2l & 0xFFFF) + (cl & 0xFFFF); + c2 = (h2l >>> 16) + (cl >>> 16) + (c1 >>> 16); + c3 = (h2h & 0xFFFF) + (ch & 0xFFFF) + (c2 >>> 16); + c4 = (h2h >>> 16) + (ch >>> 16) + (c3 >>> 16); + + h2h = (c4 << 16) | (c3 & 0xFFFF); + h2l = (c2 << 16) | (c1 & 0xFFFF); + + c1 = (h3l & 0xFFFF) + (dl & 0xFFFF); + c2 = (h3l >>> 16) + (dl >>> 16) + (c1 >>> 16); + c3 = (h3h & 0xFFFF) + (dh & 0xFFFF) + (c2 >>> 16); + c4 = (h3h >>> 16) + (dh >>> 16) + (c3 >>> 16); + + h3h = (c4 << 16) | (c3 & 0xFFFF); + h3l = (c2 << 16) | (c1 & 0xFFFF); + + c1 = (h4l & 0xFFFF) + (el & 0xFFFF); + c2 = (h4l >>> 16) + (el >>> 16) + (c1 >>> 16); + c3 = (h4h & 0xFFFF) + (eh & 0xFFFF) + (c2 >>> 16); + c4 = (h4h >>> 16) + (eh >>> 16) + (c3 >>> 16); + + h4h = (c4 << 16) | (c3 & 0xFFFF); + h4l = (c2 << 16) | (c1 & 0xFFFF); + + c1 = (h5l & 0xFFFF) + (fl & 0xFFFF); + c2 = (h5l >>> 16) + (fl >>> 16) + (c1 >>> 16); + c3 = (h5h & 0xFFFF) + (fh & 0xFFFF) + (c2 >>> 16); + c4 = (h5h >>> 16) + (fh >>> 16) + (c3 >>> 16); + + h5h = (c4 << 16) | (c3 & 0xFFFF); + h5l = (c2 << 16) | (c1 & 0xFFFF); + + c1 = (h6l & 0xFFFF) + (gl & 0xFFFF); + c2 = (h6l >>> 16) + (gl >>> 16) + (c1 >>> 16); + c3 = (h6h & 0xFFFF) + (gh & 0xFFFF) + (c2 >>> 16); + c4 = (h6h >>> 16) + (gh >>> 16) + (c3 >>> 16); + + h6h = (c4 << 16) | (c3 & 0xFFFF); + h6l = (c2 << 16) | (c1 & 0xFFFF); + + c1 = (h7l & 0xFFFF) + (hl & 0xFFFF); + c2 = (h7l >>> 16) + (hl >>> 16) + (c1 >>> 16); + c3 = (h7h & 0xFFFF) + (hh & 0xFFFF) + (c2 >>> 16); + c4 = (h7h >>> 16) + (hh >>> 16) + (c3 >>> 16); + + h7h = (c4 << 16) | (c3 & 0xFFFF); + h7l = (c2 << 16) | (c1 & 0xFFFF); } - var hex = h0.toHexString() + h1.toHexString() + h2.toHexString() + h3.toHexString(); + var hex = toHexString(h0h) + toHexString(h0l) + toHexString(h1h) + toHexString(h1l) + + toHexString(h2h) + toHexString(h2l) + toHexString(h3h) + toHexString(h3l); if(tbit == 224) { return hex.substr(0, hex.length - 8); } if(tbit >= 384) { - hex += h4.toHexString() + h5.toHexString(); + hex += toHexString(h4h) + toHexString(h4l) + toHexString(h5h) + toHexString(h5l); } if(tbit == 512) { - hex += h6.toHexString() + h7.toHexString(); + hex += toHexString(h6h) + toHexString(h6l) + toHexString(h7h) + toHexString(h7l); } return hex; }; + var toHexString = function(v) { + return HEX_CHARS[(v >> 28) & 0x0F] + HEX_CHARS[(v >> 24) & 0x0F] + + HEX_CHARS[(v >> 20) & 0x0F] + HEX_CHARS[(v >> 16) & 0x0F] + + HEX_CHARS[(v >> 12) & 0x0F] + HEX_CHARS[(v >> 8) & 0x0F] + + HEX_CHARS[(v >> 4) & 0x0F] + HEX_CHARS[v & 0x0F]; + }; + var getBytesFromUtf8 = function(str) { var bytes = [], index = 0; for (var i = 0;i < str.length; i++) { @@ -299,11 +402,7 @@ } blocks[i >> 2] |= 0x80 << SHIFT[i & 3]; blocks[blockCount - 1] = length << 3; // length * 8 - var blocks64 = []; - for(i = 0;i < blockCount;i += 2) { - blocks64[i >> 1] = new Long(blocks[i], blocks[i + 1]); - } - return blocks64; + return blocks; }; var getBlocksFromUtf8 = function(message) { @@ -320,11 +419,7 @@ } blocks[i >> 2] |= 0x80 << SHIFT[i & 3]; blocks[blockCount - 1] = length << 3; // length * 8 - var blocks64 = []; - for(i = 0;i < blockCount;i += 2) { - blocks64[i >> 1] = new Long(blocks[i], blocks[i + 1]); - } - return blocks64; + return blocks; }; if(!root.JS_SHA512_TEST && NODE_JS) { diff --git a/tests/node-test.js b/tests/node-test.js index 7ee7fcf..17b1a08 100644 --- a/tests/node-test.js +++ b/tests/node-test.js @@ -15,30 +15,3 @@ sha512_224 = null; JS_SHA512_TEST = true; require('../src/sha512.js'); require('./test.js'); - -describe('Long', function() { - var l = new Long(0xff, 0xff00); - describe('shiftRightUnsigned', function() { - it('should be not change', function() { - expect(l.shiftRightUnsigned(0).toHexString()).to.be('000000ff0000ff00'); - }); - - it('should be equal to high', function() { - expect(l.shiftRightUnsigned(32).toHexString()).to.be('00000000000000ff'); - }); - - it('should be sucessful', function() { - expect(l.shiftRightUnsigned(36).toHexString()).to.be('000000000000000f'); - }); - }); - - describe('rightRotate', function() { - it('should be not change', function() { - expect(l.rightRotate(0).toHexString()).to.be('000000ff0000ff00'); - }); - - it('should exchange', function() { - expect(l.rightRotate(32).toHexString()).to.be('0000ff00000000ff'); - }); - }); -}); diff --git a/tests/test.js b/tests/test.js index c1840fa..9c21662 100644 --- a/tests/test.js +++ b/tests/test.js @@ -5,12 +5,16 @@ describe('sha512', function() { expect(sha512('')).to.be('cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e'); expect(sha512('The quick brown fox jumps over the lazy dog')).to.be('07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6'); expect(sha512('The quick brown fox jumps over the lazy dog.', true)).to.be('91ea1245f20d46ae9a037a989f54f1f790f0a47607eeb8a14d12890cea77a1bbc6c7ed9cf205e67b7f2b8fd4c7dfd3a7a8617e45f3c463d481c7e586c39ac1ed'); + expect(sha512('01234567801234567801234567801234567801234567801234567801234')).to.be('20caf4b6d9df9eb55dedd917bbb22ca81f1629c3877501fc33fd6d58729d7fe917dae36901fa45ea682c7660f68a4593c7594f538828ded46a1f6cf33ff97c25'); + expect(sha512('012345678012345678012345678012345678012345678012345678012345')).to.be('78a3041f566c0fa6573251dd584cf8532406cbe643e7198f093ce7f07eca1bc8852e8d25c2d50cfacb781c488a1517fba4b34c05e5c21ac3699c48328dd12c22'); }); }); describe('more than 64 bytes', function() { it('should be successful', function() { expect(sha512('The MD5 message-digest algorithm is a widely used cryptographic hash function producing a 128-bit (16-byte) hash value, typically expressed in text format as a 32 digit hexadecimal number. MD5 has been utilized in a wide variety of cryptographic applications, and is also commonly used to verify data integrity.')).to.be('a8dedff31e3be9df6413ef5b4ecb93d62d3fbcb04297552eab5370e04afd45927854a4373037e81a50186e678d818c9ba824f4c850f3d0f02764af0252076979'); + expect(sha512('123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567')).to.be('4555ce42c2e19f9a09a34b3e40f85178c22cde939ac42de4d33ca0e08e3c6a2e531a3abd9265a72cc22a19d085eb2c468c20d6cfb022d8914b53d6a2b485b7c9'); + expect(sha512('1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678')).to.be('8bfa769385fe4b7d4aabf304498522d5aefa5356e42e9ae5ac9fa6b00a483685586cc0fa44da3df335719cbb524b12433afda18361d70e4c584ea81a927c670c'); }); }); }); @@ -26,6 +30,7 @@ describe('sha512', function() { describe('more than 64 bytes', function() { it('should be successful', function() { + expect(sha512('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('6cb7f6d3381a187edadb43c7cdcfbbed4d2c213a7dce8ea08fe42b9882b64e643202b4974a6db94f94650ab9173d97c58bd59f6d19d27e01aab76d8d08855c65'); expect(sha512('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('d24af1901aaf1458f089a6eddf784ce61c3012aee0df98bdb67ad2dc6b41a3b4051d40caac524373930ae396a2dde99a9204871b40892eea3e5f3c8d46da0c3c'); }); }); @@ -39,12 +44,16 @@ describe('sha384', function() { expect(sha384('')).to.be('38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b'); expect(sha384('The quick brown fox jumps over the lazy dog')).to.be('ca737f1014a48f4c0b6dd43cb177b0afd9e5169367544c494011e3317dbf9a509cb1e5dc1e85a941bbee3d7f2afbc9b1'); expect(sha384('The quick brown fox jumps over the lazy dog.', true)).to.be('ed892481d8272ca6df370bf706e4d7bc1b5739fa2177aae6c50e946678718fc67a7af2819a021c2fc34e91bdb63409d7'); + expect(sha384('01234567801234567801234567801234567801234567801234567801234')).to.be('1a5b170da97d4042ae4759f0b8966a3007d8d1132e1881785bd8ac1b07b5f6dc427fc6bdf14104305abb8cafb071625f'); + expect(sha384('012345678012345678012345678012345678012345678012345678012345')).to.be('c285661ebb1b808a8e6dc3f4c5252bb3cd2b2d74cffa91ad0b7009402a088b9032476320791398ab438bfd66ec3e90c8'); }); }); describe('more than 64 bytes', function() { it('should be successful', function() { expect(sha384('The MD5 message-digest algorithm is a widely used cryptographic hash function producing a 128-bit (16-byte) hash value, typically expressed in text format as a 32 digit hexadecimal number. MD5 has been utilized in a wide variety of cryptographic applications, and is also commonly used to verify data integrity.')).to.be('3ab853dee5785c19346e8578d9cdb3b7258a8212c15fdf25d3055b4fbbc892a529e552788992fdae68dfa34f13f0af4e'); + expect(sha384('123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567')).to.be('e4c83d6e5e18b4391a0b2e5fab84234ce9fc1071d87a9dcf38ca050ca3635781ef1d65ad4f9a835df26d186384105eac'); + expect(sha384('1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678')).to.be('d7f6874057808f9e2eaa4eddace032c7bd548fbe3989be6591910277a25dee5972e1297deced3ad7b4e3040de88855f6'); }); }); }); @@ -60,6 +69,7 @@ describe('sha384', function() { describe('more than 64 bytes', function() { it('should be successful', function() { + expect(sha384('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('143f4bb1a89e576ea05bd8433a3903352c199bf6ef35bfa30afa1505d6fcef77476d1b1824105da160a5164b7c792328'); expect(sha384('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('432a8d25efb1a8d463acc7bbbed57365cddc72de3cc19d42e1d260b1479770ecea9dd403fead2949d4fabb36939f263a'); }); }); @@ -73,12 +83,16 @@ describe('sha512/256', function() { expect(sha512_256('')).to.be('c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a'); expect(sha512_256('The quick brown fox jumps over the lazy dog')).to.be('dd9d67b371519c339ed8dbd25af90e976a1eeefd4ad3d889005e532fc5bef04d'); expect(sha512_256('The quick brown fox jumps over the lazy dog.', true)).to.be('1546741840f8a492b959d9b8b2344b9b0eb51b004bba35c0aebaac86d45264c3'); + expect(sha512_256('01234567801234567801234567801234567801234567801234567801234')).to.be('e137e353ba2d34a94341dbb8d69ed1f2eefb1f045ff48f5b61272be51dc4bb61'); + expect(sha512_256('012345678012345678012345678012345678012345678012345678012345')).to.be('a5dcc9632aba17ce3c38de2c9674b75389931bfb6dc4836f8c31643013e0cd7d'); }); }); describe('more than 64 bytes', function() { it('should be successful', function() { expect(sha512_256('The MD5 message-digest algorithm is a widely used cryptographic hash function producing a 128-bit (16-byte) hash value, typically expressed in text format as a 32 digit hexadecimal number. MD5 has been utilized in a wide variety of cryptographic applications, and is also commonly used to verify data integrity.')).to.be('21e2e940930b23f1de6377086d07e22033c6bbf3fd9fbf4b62ec66e6c08c25be'); + expect(sha512_256('123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567')).to.be('44da7ca023996ec4b4ded88410e4acc209ca26c34dc0f26550d28503974fe2d1'); + expect(sha512_256('1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678')).to.be('465859c0edc706a2a9c39d3175a715fdf6b764ccc43d45b5668c56f6d8aa9b9e'); }); }); }); @@ -94,6 +108,7 @@ describe('sha512/256', function() { describe('more than 64 bytes', function() { it('should be successful', function() { + expect(sha512_256('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('d32a41d9858e45b68402f77cf9f3c3f992c36a4bffd230f78d666c87f97eaf7e'); expect(sha512_256('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('bd1abad59e6b8ad69bc17b6e05aa13f0cb725467fbeb45b83d3e4094332d1367'); }); }); @@ -107,12 +122,16 @@ describe('sha512/224', function() { expect(sha512_224('')).to.be('6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4'); expect(sha512_224('The quick brown fox jumps over the lazy dog')).to.be('944cd2847fb54558d4775db0485a50003111c8e5daa63fe722c6aa37'); expect(sha512_224('The quick brown fox jumps over the lazy dog.', true)).to.be('6d6a9279495ec4061769752e7ff9c68b6b0b3c5a281b7917ce0572de'); + expect(sha512_224('01234567801234567801234567801234567801234567801234567801234')).to.be('1dfaaf5806ec0ceba60da809c2b4151e5dc5081c6a346e504ea556ea'); + expect(sha512_224('012345678012345678012345678012345678012345678012345678012345')).to.be('10dced83a53416883dbd7ace74955bb3d42de0b65b2087b902537c91'); }); }); describe('more than 64 bytes', function() { it('should be successful', function() { expect(sha512_224('The MD5 message-digest algorithm is a widely used cryptographic hash function producing a 128-bit (16-byte) hash value, typically expressed in text format as a 32 digit hexadecimal number. MD5 has been utilized in a wide variety of cryptographic applications, and is also commonly used to verify data integrity.')).to.be('2e962464977b198ee758d615bbc92251ad2e3c0960068e279fd21d2f'); + expect(sha512_224('123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567')).to.be('1d60954ce7bee0bf5d235fe6bfc928c0f32c0f1c4992451dbc0f4dbf'); + expect(sha512_224('1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678')).to.be('672aef84d579799cedf2fec090ce4ea0d72e0edd2788deaa8200fd67'); }); }); }); @@ -128,6 +147,7 @@ describe('sha512/224', function() { describe('more than 64 bytes', function() { it('should be successful', function() { + expect(sha512_224('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('f67e191a5d4ee67a272ccaf6cf597f0c4d6a0c46bd631be7cadb0944'); expect(sha512_224('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('009c3d1e3172d6df71344982eada855421592aea28acbf660ada7569'); }); });