diff --git a/.covignore b/.covignore index 016f806..1933786 100644 --- a/.covignore +++ b/.covignore @@ -1 +1 @@ -/tests/ +/test/ diff --git a/CHANGELOG.md b/CHANGELOG.md index bbbf7d2..0066bdc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# v0.1.1 / 2015-02-26 + +* Improve performance. + # v0.1.0 / 2015-02-23 * Initial release diff --git a/README.md b/README.md index 6a6476e..ac565b8 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,12 @@ [![NPM](https://nodei.co/npm/js-sha3.png?stars&downloads)](https://nodei.co/npm/js-sha3/) A simple SHA-3 / Keccak hash function for JavaScript supports UTF-8 encoding. +## Demo +[SHA3-512 Online](http://emn178.github.io/online-tools/sha3_512.html) +[SHA3-384 Online](http://emn178.github.io/online-tools/sha3_384.html) +[SHA3-256 Online](http://emn178.github.io/online-tools/sha3_256.html) +[SHA3-224 Online](http://emn178.github.io/online-tools/sha3_224.html) + ## Download [Compress](https://raw.github.com/emn178/js-sha3/master/build/sha3.min.js) [Uncompress](https://raw.github.com/emn178/js-sha3/master/src/sha3.js) @@ -80,6 +86,10 @@ Output 70a2b6579047f0a977fcb5e9120a4e07067bea9abb6916fbc2d13ffb9a4e4eee f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd +## Benchmark +[UTF8](http://jsperf.com/sha3/3) +[ASCII](http://jsperf.com/sha3/2) + ## Extensions ### jQuery If you prefer jQuery style, you can add following code to add a jQuery extension. diff --git a/bower.json b/bower.json index 8471670..7ef8748 100644 --- a/bower.json +++ b/bower.json @@ -1,9 +1,9 @@ { "name": "js-sha3", - "version": "0.1.0", + "version": "0.1.1", "main": ["build/sha3.min.js"], "ignore": [ "samples", - "tests" + "test" ] } diff --git a/build/sha3.min.js b/build/sha3.min.js index bc59ea6..b47862c 100644 --- a/build/sha3.min.js +++ b/build/sha3.min.js @@ -1,5 +1,22 @@ -(function(m,E){var w="undefined"!=typeof module;w&&(m=global);var p="0123456789abcdef".split(""),F=[1,256,65536,16777216],r=[0,8,16,24],G=[0,1,62,28,27,36,44,6,55,20,3,10,43,25,39,41,45,15,21,8,18,2,61,56,14],A=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648, -32896,2147483648,2147483649,0,2147516424,2147483648],c=[],b=[],l=[],q=[],B=function(b){return n(b,224)},C=function(b){return n(b,256)},D=function(b){return n(b,384)},n=function(m,n){n===E&&(n=512);var x,d,u=!1,t=0,w=0,y=m.length,e,g,f,k,a,h,v=(1600-2*n)/32,z=4*v;for(a=0;50>a;++a)b[a]=0;x=0;do{c[0]=x;for(a=1;ad?c[a>>2]|=d<d?c[a>>2]|=(192|d>>6)<d||57344<=d?c[a>>2]|=(224|d>>12)<>2]|=(240|d>>18)<>2]|=(128|d>>12&63)<>2]|=(128|d>>6&63)<>2]|=(128|d&63)<>2]|=F[a&3],++t);x=c[v];t>y&&ad;d++){for(e=0;5>e;e++)f=2*e,q[f]=b[f]^b[f+10]^b[f+20]^b[f+30]^b[f+40],q[f+1]=b[f+1]^b[f+11]^b[f+21]^b[f+31]^b[f+41];for(e=0;5>e;e++)for(f=2*e,a=(e+4)%5*2,h=(e+1)%5*2,k=q[a]^(q[h]<<1|q[h+1]>>>31),h=q[a+1]^(q[h+1]<<1|q[h]>>>31),g=0;5> -g;g++)a=f+10*g,b[a]^=k,b[a+1]^=h;for(e=0;5>e;e++)for(f=2*e,g=0;5>g;g++)a=f+10*g,h=2*g+(f+3*g)%5*10,k=G[e+5*g],0===k?(l[h]=b[a],l[h+1]=b[a+1]):32>k?(l[h]=b[a]<>>32-k,l[h+1]=b[a+1]<>>32-k):(l[h]=b[a+1]<>>64-k,l[h+1]=b[a]<>>64-k);for(e=0;5>e;e++)for(f=2*e,g=0;5>g;g++)a=f+10*g,h=2*((e+1)%5+5*g),k=2*((e+2)%5+5*g),b[a]=l[a]^~l[h]&l[k],b[a+1]=l[a+1]^~l[h+1]&l[k+1];b[0]^=A[2*d];b[1]^=A[2*d+1]}}while(!u);u="";a=0;for(d=n/32;a>4&15]+p[b[a]&15]+p[b[a]>> -12&15]+p[b[a]>>8&15]+p[b[a]>>20&15]+p[b[a]>>16&15]+p[b[a]>>28&15]+p[b[a]>>24&15];return u};!m.JS_SHA3_TEST&&w?module.exports={sha3_512:n,sha3_384:D,sha3_256:C,sha3_224:B}:m&&(m.sha3_512=n,m.sha3_384=D,m.sha3_256=C,m.sha3_224=B)})(this); +/* + * js-sha3 v0.1.1 + * https://github.com/emn178/js-sha3 + * + * Copyright 2015, emn178@gmail.com + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ +(function(h,va){var qa="undefined"!=typeof module;qa&&(h=global);var b="0123456789abcdef".split(""),wa=[1,256,65536,16777216],y=[0,8,16,24],ra=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648],f=[],a=[], +sa=function(a){return l(a,224)},ta=function(a){return l(a,256)},ua=function(a){return l(a,384)},l=function(h,A){A===va&&(A=512);var g,k=!1,z=0,l=0,oa=h.length,c,d,e,m,n,p,q,r,t,u,v,w,x,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,aa,ba,ca,da,ea,fa,ga,ha,ia,ja,ka,la,ma,na,B=(1600-2*A)/32,pa=4*B;for(c=0;50>c;++c)a[c]=0;g=0;do{f[0]=g;for(c=1;cg?f[c>>2]|=g<g?f[c>>2]|=(192|g>>6)<g||57344<=g?f[c>>2]|=(224|g>> +12)<>2]|=(240|g>>18)<>2]|=(128|g>>12&63)<>2]|=(128|g>>6&63)<>2]|=(128|g&63)<>2]|=wa[c&3],++z);g=f[B];z>oa&&cc;c+=2)m=a[0]^a[10]^a[20]^a[30]^a[40],n=a[1]^a[11]^a[21]^a[31]^a[41],p=a[2]^a[12]^a[22]^a[32]^a[42],q=a[3]^a[13]^a[23]^a[33]^a[43],r=a[4]^a[14]^a[24]^a[34]^a[44],t=a[5]^a[15]^a[25]^a[35]^a[45], +u=a[6]^a[16]^a[26]^a[36]^a[46],v=a[7]^a[17]^a[27]^a[37]^a[47],w=a[8]^a[18]^a[28]^a[38]^a[48],x=a[9]^a[19]^a[29]^a[39]^a[49],d=w^(p<<1|q>>>31),e=x^(q<<1|p>>>31),a[0]^=d,a[1]^=e,a[10]^=d,a[11]^=e,a[20]^=d,a[21]^=e,a[30]^=d,a[31]^=e,a[40]^=d,a[41]^=e,d=m^(r<<1|t>>>31),e=n^(t<<1|r>>>31),a[2]^=d,a[3]^=e,a[12]^=d,a[13]^=e,a[22]^=d,a[23]^=e,a[32]^=d,a[33]^=e,a[42]^=d,a[43]^=e,d=p^(u<<1|v>>>31),e=q^(v<<1|u>>>31),a[4]^=d,a[5]^=e,a[14]^=d,a[15]^=e,a[24]^=d,a[25]^=e,a[34]^=d,a[35]^=e,a[44]^=d,a[45]^=e,d=r^(w<< +1|x>>>31),e=t^(x<<1|w>>>31),a[6]^=d,a[7]^=e,a[16]^=d,a[17]^=e,a[26]^=d,a[27]^=e,a[36]^=d,a[37]^=e,a[46]^=d,a[47]^=e,d=u^(m<<1|n>>>31),e=v^(n<<1|m>>>31),a[8]^=d,a[9]^=e,a[18]^=d,a[19]^=e,a[28]^=d,a[29]^=e,a[38]^=d,a[39]^=e,a[48]^=d,a[49]^=e,d=a[0],e=a[1],W=a[11]<<4|a[10]>>>28,X=a[10]<<4|a[11]>>>28,E=a[20]<<3|a[21]>>>29,F=a[21]<<3|a[20]>>>29,ka=a[31]<<9|a[30]>>>23,la=a[30]<<9|a[31]>>>23,S=a[40]<<18|a[41]>>>14,T=a[41]<<18|a[40]>>>14,K=a[2]<<1|a[3]>>>31,L=a[3]<<1|a[2]>>>31,m=a[13]<<12|a[12]>>>20,n=a[12]<< +12|a[13]>>>20,Y=a[22]<<10|a[23]>>>22,Z=a[23]<<10|a[22]>>>22,G=a[33]<<13|a[32]>>>19,H=a[32]<<13|a[33]>>>19,ma=a[42]<<2|a[43]>>>30,na=a[43]<<2|a[42]>>>30,ea=a[5]<<30|a[4]>>>2,fa=a[4]<<30|a[5]>>>2,M=a[14]<<6|a[15]>>>26,N=a[15]<<6|a[14]>>>26,p=a[25]<<11|a[24]>>>21,q=a[24]<<11|a[25]>>>21,aa=a[34]<<15|a[35]>>>17,ba=a[35]<<15|a[34]>>>17,I=a[45]<<29|a[44]>>>3,J=a[44]<<29|a[45]>>>3,w=a[6]<<28|a[7]>>>4,x=a[7]<<28|a[6]>>>4,ga=a[17]<<23|a[16]>>>9,ha=a[16]<<23|a[17]>>>9,O=a[26]<<25|a[27]>>>7,P=a[27]<<25|a[26]>>> +7,r=a[36]<<21|a[37]>>>11,t=a[37]<<21|a[36]>>>11,ca=a[47]<<24|a[46]>>>8,da=a[46]<<24|a[47]>>>8,U=a[8]<<27|a[9]>>>5,V=a[9]<<27|a[8]>>>5,C=a[18]<<20|a[19]>>>12,D=a[19]<<20|a[18]>>>12,ia=a[29]<<7|a[28]>>>25,ja=a[28]<<7|a[29]>>>25,Q=a[38]<<8|a[39]>>>24,R=a[39]<<8|a[38]>>>24,u=a[48]<<14|a[49]>>>18,v=a[49]<<14|a[48]>>>18,a[0]=d^~m&p,a[1]=e^~n&q,a[10]=w^~C&E,a[11]=x^~D&F,a[20]=K^~M&O,a[21]=L^~N&P,a[30]=U^~W&Y,a[31]=V^~X&Z,a[40]=ea^~ga&ia,a[41]=fa^~ha&ja,a[2]=m^~p&r,a[3]=n^~q&t,a[12]=C^~E&G,a[13]=D^~F&H,a[22]= +M^~O&Q,a[23]=N^~P&R,a[32]=W^~Y&aa,a[33]=X^~Z&ba,a[42]=ga^~ia&ka,a[43]=ha^~ja&la,a[4]=p^~r&u,a[5]=q^~t&v,a[14]=E^~G&I,a[15]=F^~H&J,a[24]=O^~Q&S,a[25]=P^~R&T,a[34]=Y^~aa&ca,a[35]=Z^~ba&da,a[44]=ia^~ka&ma,a[45]=ja^~la&na,a[6]=r^~u&d,a[7]=t^~v&e,a[16]=G^~I&w,a[17]=H^~J&x,a[26]=Q^~S&K,a[27]=R^~T&L,a[36]=aa^~ca&U,a[37]=ba^~da&V,a[46]=ka^~ma&ea,a[47]=la^~na&fa,a[8]=u^~d&m,a[9]=v^~e&n,a[18]=I^~w&C,a[19]=J^~x&D,a[28]=S^~K&M,a[29]=T^~L&N,a[38]=ca^~U&W,a[39]=da^~V&X,a[48]=ma^~ea&ga,a[49]=na^~fa&ha,a[0]^=ra[c], +a[1]^=ra[c+1]}while(!k);k=""+(b[a[0]>>4&15]+b[a[0]&15]+b[a[0]>>12&15]+b[a[0]>>8&15]+b[a[0]>>20&15]+b[a[0]>>16&15]+b[a[0]>>28&15]+b[a[0]>>24&15]+b[a[1]>>4&15]+b[a[1]&15]+b[a[1]>>12&15]+b[a[1]>>8&15]+b[a[1]>>20&15]+b[a[1]>>16&15]+b[a[1]>>28&15]+b[a[1]>>24&15]+b[a[2]>>4&15]+b[a[2]&15]+b[a[2]>>12&15]+b[a[2]>>8&15]+b[a[2]>>20&15]+b[a[2]>>16&15]+b[a[2]>>28&15]+b[a[2]>>24&15]+b[a[3]>>4&15]+b[a[3]&15]+b[a[3]>>12&15]+b[a[3]>>8&15]+b[a[3]>>20&15]+b[a[3]>>16&15]+b[a[3]>>28&15]+b[a[3]>>24&15]+b[a[4]>>4&15]+b[a[4]& +15]+b[a[4]>>12&15]+b[a[4]>>8&15]+b[a[4]>>20&15]+b[a[4]>>16&15]+b[a[4]>>28&15]+b[a[4]>>24&15]+b[a[5]>>4&15]+b[a[5]&15]+b[a[5]>>12&15]+b[a[5]>>8&15]+b[a[5]>>20&15]+b[a[5]>>16&15]+b[a[5]>>28&15]+b[a[5]>>24&15]+b[a[6]>>4&15]+b[a[6]&15]+b[a[6]>>12&15]+b[a[6]>>8&15]+b[a[6]>>20&15]+b[a[6]>>16&15]+b[a[6]>>28&15]+b[a[6]>>24&15]);256<=A&&(k+=b[a[7]>>4&15]+b[a[7]&15]+b[a[7]>>12&15]+b[a[7]>>8&15]+b[a[7]>>20&15]+b[a[7]>>16&15]+b[a[7]>>28&15]+b[a[7]>>24&15]);384<=A&&(k+=b[a[8]>>4&15]+b[a[8]&15]+b[a[8]>>12&15]+ +b[a[8]>>8&15]+b[a[8]>>20&15]+b[a[8]>>16&15]+b[a[8]>>28&15]+b[a[8]>>24&15]+b[a[9]>>4&15]+b[a[9]&15]+b[a[9]>>12&15]+b[a[9]>>8&15]+b[a[9]>>20&15]+b[a[9]>>16&15]+b[a[9]>>28&15]+b[a[9]>>24&15]+b[a[10]>>4&15]+b[a[10]&15]+b[a[10]>>12&15]+b[a[10]>>8&15]+b[a[10]>>20&15]+b[a[10]>>16&15]+b[a[10]>>28&15]+b[a[10]>>24&15]+b[a[11]>>4&15]+b[a[11]&15]+b[a[11]>>12&15]+b[a[11]>>8&15]+b[a[11]>>20&15]+b[a[11]>>16&15]+b[a[11]>>28&15]+b[a[11]>>24&15]);512==A&&(k+=b[a[12]>>4&15]+b[a[12]&15]+b[a[12]>>12&15]+b[a[12]>>8&15]+ +b[a[12]>>20&15]+b[a[12]>>16&15]+b[a[12]>>28&15]+b[a[12]>>24&15]+b[a[13]>>4&15]+b[a[13]&15]+b[a[13]>>12&15]+b[a[13]>>8&15]+b[a[13]>>20&15]+b[a[13]>>16&15]+b[a[13]>>28&15]+b[a[13]>>24&15]+b[a[14]>>4&15]+b[a[14]&15]+b[a[14]>>12&15]+b[a[14]>>8&15]+b[a[14]>>20&15]+b[a[14]>>16&15]+b[a[14]>>28&15]+b[a[14]>>24&15]+b[a[15]>>4&15]+b[a[15]&15]+b[a[15]>>12&15]+b[a[15]>>8&15]+b[a[15]>>20&15]+b[a[15]>>16&15]+b[a[15]>>28&15]+b[a[15]>>24&15]);return k};!h.JS_SHA3_TEST&&qa?module.exports={sha3_512:l,sha3_384:ua,sha3_256:ta, +sha3_224:sa}:h&&(h.sha3_512=l,h.sha3_384=ua,h.sha3_256=ta,h.sha3_224=sa)})(this); diff --git a/package.json b/package.json index b570874..2fd8f7c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "js-sha3", - "version": "0.1.0", + "version": "0.1.1", "description": "A simple SHA-3 / Keccak hash function for JavaScript supports UTF-8 encoding.", "main": "src/sha3.js", "devDependencies": { @@ -8,8 +8,8 @@ "jscoverage": "~0.5.9" }, "scripts": { - "test": "mocha tests/node-test.js -r jscoverage", - "coveralls": "mocha tests/node-test.js -R mocha-lcov-reporter -r jscoverage | coveralls" + "test": "mocha test/node-test.js -r jscoverage", + "coveralls": "mocha test/node-test.js -R mocha-lcov-reporter -r jscoverage | coveralls" }, "repository": { "type": "git", diff --git a/src/sha3.js b/src/sha3.js index a144103..f140b7a 100644 --- a/src/sha3.js +++ b/src/sha3.js @@ -1,5 +1,5 @@ /* - * js-sha3 v0.1.0 + * js-sha3 v0.1.1 * https://github.com/emn178/js-sha3 * * Copyright 2015, emn178@gmail.com @@ -17,14 +17,13 @@ var HEX_CHARS = '0123456789abcdef'.split(''); var EXTRA = [1, 256, 65536, 16777216]; var SHIFT = [0, 8, 16, 24]; - var R = [0, 1, 62, 28, 27, 36, 44, 6, 55, 20, 3, 10, 43, 25, 39, 41, 45, 15, 21, 8, 18, 2, 61, 56, 14]; var RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649, 0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0, 2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771, 2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648, 2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648]; - var blocks = [], s = [], b = [], c = []; + var blocks = [], s = []; var sha3_224 = function(message) { return sha3(message, 224); @@ -44,7 +43,10 @@ } var block, code, end = false, index = 0, start = 0, length = message.length, - n, x, y, x2, r, i, j, k, h, l; + n, i, h, l, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, + b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, + b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, + b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49; var blockCount = (1600 - bits * 2) / 32; var byteCount = blockCount * 4; @@ -92,66 +94,257 @@ s[i] ^= blocks[i]; } - for(n = 0; n < 24; n++) { - for (x = 0; x < 5; x++) { - x2 = x * 2; - c[x2] = s[x2] ^ s[x2 + 10] ^ s[x2 + 20] ^ s[x2 + 30] ^ s[x2 + 40]; - c[x2 + 1] = s[x2 + 1] ^ s[x2 + 11] ^ s[x2 + 21] ^ s[x2 + 31] ^ s[x2 + 41]; - } + for(n = 0; n < 48; n += 2) { + c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40]; + c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41]; + c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42]; + c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43]; + c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44]; + c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45]; + c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46]; + c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47]; + c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48]; + c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49]; - for (x = 0; x < 5; x++) { - x2 = x * 2; - i = ((x + 4) % 5) * 2; - j = ((x + 1) % 5) * 2; - h = c[i] ^ ((c[j] << 1) | (c[j + 1] >>> 31)); - l = c[i + 1] ^ ((c[j + 1] << 1) | (c[j] >>> 31)); - for (y = 0; y < 5; y++) { - i = x2 + y * 10; - s[i] ^= h; - s[i + 1] ^= l; - } - } + h = c8 ^ ((c2 << 1) | (c3 >>> 31)); + l = c9 ^ ((c3 << 1) | (c2 >>> 31)); + s[0] ^= h; + s[1] ^= l; + s[10] ^= h; + s[11] ^= l; + s[20] ^= h; + s[21] ^= l; + s[30] ^= h; + s[31] ^= l; + s[40] ^= h; + s[41] ^= l; + h = c0 ^ ((c4 << 1) | (c5 >>> 31)); + l = c1 ^ ((c5 << 1) | (c4 >>> 31)); + s[2] ^= h; + s[3] ^= l; + s[12] ^= h; + s[13] ^= l; + s[22] ^= h; + s[23] ^= l; + s[32] ^= h; + s[33] ^= l; + s[42] ^= h; + s[43] ^= l; + h = c2 ^ ((c6 << 1) | (c7 >>> 31)); + l = c3 ^ ((c7 << 1) | (c6 >>> 31)); + s[4] ^= h; + s[5] ^= l; + s[14] ^= h; + s[15] ^= l; + s[24] ^= h; + s[25] ^= l; + s[34] ^= h; + s[35] ^= l; + s[44] ^= h; + s[45] ^= l; + h = c4 ^ ((c8 << 1) | (c9 >>> 31)); + l = c5 ^ ((c9 << 1) | (c8 >>> 31)); + s[6] ^= h; + s[7] ^= l; + s[16] ^= h; + s[17] ^= l; + s[26] ^= h; + s[27] ^= l; + s[36] ^= h; + s[37] ^= l; + s[46] ^= h; + s[47] ^= l; + h = c6 ^ ((c0 << 1) | (c1 >>> 31)); + l = c7 ^ ((c1 << 1) | (c0 >>> 31)); + s[8] ^= h; + s[9] ^= l; + s[18] ^= h; + s[19] ^= l; + s[28] ^= h; + s[29] ^= l; + s[38] ^= h; + s[39] ^= l; + s[48] ^= h; + s[49] ^= l; - for (x = 0; x < 5; x++) { - x2 = x * 2; - for (y = 0; y < 5; y++) { - i = x2 + y * 10; - j = y * 2 + ((x2 + 3 * y) % 5) * 10; - r = R[x + y * 5]; - if(r === 0) { - b[j] = s[i]; - b[j + 1] = s[i + 1]; - } else if (r < 32) { - b[j] = (s[i] << r) | (s[i + 1] >>> (32 - r)); - b[j + 1] = (s[i + 1] << r) | (s[i] >>> (32 - r)); - } else { - b[j] = (s[i + 1] << (r - 32)) | (s[i] >>> (64 - r)); - b[j + 1] = (s[i] << (r - 32)) | (s[i + 1] >>> (64 - r)); - } - } - } + b0 = s[0]; + b1 = s[1]; + b32 = (s[11] << 4) | (s[10] >>> 28); + b33 = (s[10] << 4) | (s[11] >>> 28); + b14 = (s[20] << 3) | (s[21] >>> 29); + b15 = (s[21] << 3) | (s[20] >>> 29); + b46 = (s[31] << 9) | (s[30] >>> 23); + b47 = (s[30] << 9) | (s[31] >>> 23); + b28 = (s[40] << 18) | (s[41] >>> 14); + b29 = (s[41] << 18) | (s[40] >>> 14); + b20 = (s[2] << 1) | (s[3] >>> 31); + b21 = (s[3] << 1) | (s[2] >>> 31); + b2 = (s[13] << 12) | (s[12] >>> 20); + b3 = (s[12] << 12) | (s[13] >>> 20); + b34 = (s[22] << 10) | (s[23] >>> 22); + b35 = (s[23] << 10) | (s[22] >>> 22); + b16 = (s[33] << 13) | (s[32] >>> 19); + b17 = (s[32] << 13) | (s[33] >>> 19); + b48 = (s[42] << 2) | (s[43] >>> 30); + b49 = (s[43] << 2) | (s[42] >>> 30); + b40 = (s[5] << 30) | (s[4] >>> 2); + b41 = (s[4] << 30) | (s[5] >>> 2); + b22 = (s[14] << 6) | (s[15] >>> 26); + b23 = (s[15] << 6) | (s[14] >>> 26); + b4 = (s[25] << 11) | (s[24] >>> 21); + b5 = (s[24] << 11) | (s[25] >>> 21); + b36 = (s[34] << 15) | (s[35] >>> 17); + b37 = (s[35] << 15) | (s[34] >>> 17); + b18 = (s[45] << 29) | (s[44] >>> 3); + b19 = (s[44] << 29) | (s[45] >>> 3); + b10 = (s[6] << 28) | (s[7] >>> 4); + b11 = (s[7] << 28) | (s[6] >>> 4); + b42 = (s[17] << 23) | (s[16] >>> 9); + b43 = (s[16] << 23) | (s[17] >>> 9); + b24 = (s[26] << 25) | (s[27] >>> 7); + b25 = (s[27] << 25) | (s[26] >>> 7); + b6 = (s[36] << 21) | (s[37] >>> 11); + b7 = (s[37] << 21) | (s[36] >>> 11); + b38 = (s[47] << 24) | (s[46] >>> 8); + b39 = (s[46] << 24) | (s[47] >>> 8); + b30 = (s[8] << 27) | (s[9] >>> 5); + b31 = (s[9] << 27) | (s[8] >>> 5); + b12 = (s[18] << 20) | (s[19] >>> 12); + b13 = (s[19] << 20) | (s[18] >>> 12); + b44 = (s[29] << 7) | (s[28] >>> 25); + b45 = (s[28] << 7) | (s[29] >>> 25); + b26 = (s[38] << 8) | (s[39] >>> 24); + b27 = (s[39] << 8) | (s[38] >>> 24); + b8 = (s[48] << 14) | (s[49] >>> 18); + b9 = (s[49] << 14) | (s[48] >>> 18); - for (x = 0; x < 5; x++) { - x2 = x * 2; - for (y = 0; y < 5; y++) { - i = x2 + y * 10; - j = (((x + 1) % 5) + 5 * y) * 2; - k = (((x + 2) % 5) + 5 * y) * 2; - s[i] = b[i] ^ (~b[j] & b[k]); - s[i + 1] = b[i + 1] ^ (~b[j + 1] & b[k + 1]); - } - } - s[0] ^= RC[n * 2]; - s[1] ^= RC[n * 2 + 1]; + s[0] = b0 ^ (~b2 & b4); + s[1] = b1 ^ (~b3 & b5); + s[10] = b10 ^ (~b12 & b14); + s[11] = b11 ^ (~b13 & b15); + s[20] = b20 ^ (~b22 & b24); + s[21] = b21 ^ (~b23 & b25); + s[30] = b30 ^ (~b32 & b34); + s[31] = b31 ^ (~b33 & b35); + s[40] = b40 ^ (~b42 & b44); + s[41] = b41 ^ (~b43 & b45); + s[2] = b2 ^ (~b4 & b6); + s[3] = b3 ^ (~b5 & b7); + s[12] = b12 ^ (~b14 & b16); + s[13] = b13 ^ (~b15 & b17); + s[22] = b22 ^ (~b24 & b26); + s[23] = b23 ^ (~b25 & b27); + s[32] = b32 ^ (~b34 & b36); + s[33] = b33 ^ (~b35 & b37); + s[42] = b42 ^ (~b44 & b46); + s[43] = b43 ^ (~b45 & b47); + s[4] = b4 ^ (~b6 & b8); + s[5] = b5 ^ (~b7 & b9); + s[14] = b14 ^ (~b16 & b18); + s[15] = b15 ^ (~b17 & b19); + s[24] = b24 ^ (~b26 & b28); + s[25] = b25 ^ (~b27 & b29); + s[34] = b34 ^ (~b36 & b38); + s[35] = b35 ^ (~b37 & b39); + s[44] = b44 ^ (~b46 & b48); + s[45] = b45 ^ (~b47 & b49); + s[6] = b6 ^ (~b8 & b0); + s[7] = b7 ^ (~b9 & b1); + s[16] = b16 ^ (~b18 & b10); + s[17] = b17 ^ (~b19 & b11); + s[26] = b26 ^ (~b28 & b20); + s[27] = b27 ^ (~b29 & b21); + s[36] = b36 ^ (~b38 & b30); + s[37] = b37 ^ (~b39 & b31); + s[46] = b46 ^ (~b48 & b40); + s[47] = b47 ^ (~b49 & b41); + s[8] = b8 ^ (~b0 & b2); + s[9] = b9 ^ (~b1 & b3); + s[18] = b18 ^ (~b10 & b12); + s[19] = b19 ^ (~b11 & b13); + s[28] = b28 ^ (~b20 & b22); + s[29] = b29 ^ (~b21 & b23); + s[38] = b38 ^ (~b30 & b32); + s[39] = b39 ^ (~b31 & b33); + s[48] = b48 ^ (~b40 & b42); + s[49] = b49 ^ (~b41 & b43); + + s[0] ^= RC[n]; + s[1] ^= RC[n + 1]; } } while(!end); var hex = ''; - for(i = 0, n = bits / 32;i < n;++i) { - hex += HEX_CHARS[(s[i] >> 4) & 0x0F] + HEX_CHARS[s[i] & 0x0F] + - HEX_CHARS[(s[i] >> 12) & 0x0F] + HEX_CHARS[(s[i] >> 8) & 0x0F] + - HEX_CHARS[(s[i] >> 20) & 0x0F] + HEX_CHARS[(s[i] >> 16) & 0x0F] + - HEX_CHARS[(s[i] >> 28) & 0x0F] + HEX_CHARS[(s[i] >> 24) & 0x0F]; + hex += HEX_CHARS[(s[0] >> 4) & 0x0F] + HEX_CHARS[s[0] & 0x0F] + + HEX_CHARS[(s[0] >> 12) & 0x0F] + HEX_CHARS[(s[0] >> 8) & 0x0F] + + HEX_CHARS[(s[0] >> 20) & 0x0F] + HEX_CHARS[(s[0] >> 16) & 0x0F] + + HEX_CHARS[(s[0] >> 28) & 0x0F] + HEX_CHARS[(s[0] >> 24) & 0x0F] + + HEX_CHARS[(s[1] >> 4) & 0x0F] + HEX_CHARS[s[1] & 0x0F] + + HEX_CHARS[(s[1] >> 12) & 0x0F] + HEX_CHARS[(s[1] >> 8) & 0x0F] + + HEX_CHARS[(s[1] >> 20) & 0x0F] + HEX_CHARS[(s[1] >> 16) & 0x0F] + + HEX_CHARS[(s[1] >> 28) & 0x0F] + HEX_CHARS[(s[1] >> 24) & 0x0F] + + HEX_CHARS[(s[2] >> 4) & 0x0F] + HEX_CHARS[s[2] & 0x0F] + + HEX_CHARS[(s[2] >> 12) & 0x0F] + HEX_CHARS[(s[2] >> 8) & 0x0F] + + HEX_CHARS[(s[2] >> 20) & 0x0F] + HEX_CHARS[(s[2] >> 16) & 0x0F] + + HEX_CHARS[(s[2] >> 28) & 0x0F] + HEX_CHARS[(s[2] >> 24) & 0x0F] + + HEX_CHARS[(s[3] >> 4) & 0x0F] + HEX_CHARS[s[3] & 0x0F] + + HEX_CHARS[(s[3] >> 12) & 0x0F] + HEX_CHARS[(s[3] >> 8) & 0x0F] + + HEX_CHARS[(s[3] >> 20) & 0x0F] + HEX_CHARS[(s[3] >> 16) & 0x0F] + + HEX_CHARS[(s[3] >> 28) & 0x0F] + HEX_CHARS[(s[3] >> 24) & 0x0F] + + HEX_CHARS[(s[4] >> 4) & 0x0F] + HEX_CHARS[s[4] & 0x0F] + + HEX_CHARS[(s[4] >> 12) & 0x0F] + HEX_CHARS[(s[4] >> 8) & 0x0F] + + HEX_CHARS[(s[4] >> 20) & 0x0F] + HEX_CHARS[(s[4] >> 16) & 0x0F] + + HEX_CHARS[(s[4] >> 28) & 0x0F] + HEX_CHARS[(s[4] >> 24) & 0x0F] + + HEX_CHARS[(s[5] >> 4) & 0x0F] + HEX_CHARS[s[5] & 0x0F] + + HEX_CHARS[(s[5] >> 12) & 0x0F] + HEX_CHARS[(s[5] >> 8) & 0x0F] + + HEX_CHARS[(s[5] >> 20) & 0x0F] + HEX_CHARS[(s[5] >> 16) & 0x0F] + + HEX_CHARS[(s[5] >> 28) & 0x0F] + HEX_CHARS[(s[5] >> 24) & 0x0F] + + HEX_CHARS[(s[6] >> 4) & 0x0F] + HEX_CHARS[s[6] & 0x0F] + + HEX_CHARS[(s[6] >> 12) & 0x0F] + HEX_CHARS[(s[6] >> 8) & 0x0F] + + HEX_CHARS[(s[6] >> 20) & 0x0F] + HEX_CHARS[(s[6] >> 16) & 0x0F] + + HEX_CHARS[(s[6] >> 28) & 0x0F] + HEX_CHARS[(s[6] >> 24) & 0x0F]; + + if(bits >= 256) { + hex += HEX_CHARS[(s[7] >> 4) & 0x0F] + HEX_CHARS[s[7] & 0x0F] + + HEX_CHARS[(s[7] >> 12) & 0x0F] + HEX_CHARS[(s[7] >> 8) & 0x0F] + + HEX_CHARS[(s[7] >> 20) & 0x0F] + HEX_CHARS[(s[7] >> 16) & 0x0F] + + HEX_CHARS[(s[7] >> 28) & 0x0F] + HEX_CHARS[(s[7] >> 24) & 0x0F]; + } + if(bits >= 384) { + hex += HEX_CHARS[(s[8] >> 4) & 0x0F] + HEX_CHARS[s[8] & 0x0F] + + HEX_CHARS[(s[8] >> 12) & 0x0F] + HEX_CHARS[(s[8] >> 8) & 0x0F] + + HEX_CHARS[(s[8] >> 20) & 0x0F] + HEX_CHARS[(s[8] >> 16) & 0x0F] + + HEX_CHARS[(s[8] >> 28) & 0x0F] + HEX_CHARS[(s[8] >> 24) & 0x0F] + + HEX_CHARS[(s[9] >> 4) & 0x0F] + HEX_CHARS[s[9] & 0x0F] + + HEX_CHARS[(s[9] >> 12) & 0x0F] + HEX_CHARS[(s[9] >> 8) & 0x0F] + + HEX_CHARS[(s[9] >> 20) & 0x0F] + HEX_CHARS[(s[9] >> 16) & 0x0F] + + HEX_CHARS[(s[9] >> 28) & 0x0F] + HEX_CHARS[(s[9] >> 24) & 0x0F] + + HEX_CHARS[(s[10] >> 4) & 0x0F] + HEX_CHARS[s[10] & 0x0F] + + HEX_CHARS[(s[10] >> 12) & 0x0F] + HEX_CHARS[(s[10] >> 8) & 0x0F] + + HEX_CHARS[(s[10] >> 20) & 0x0F] + HEX_CHARS[(s[10] >> 16) & 0x0F] + + HEX_CHARS[(s[10] >> 28) & 0x0F] + HEX_CHARS[(s[10] >> 24) & 0x0F] + + HEX_CHARS[(s[11] >> 4) & 0x0F] + HEX_CHARS[s[11] & 0x0F] + + HEX_CHARS[(s[11] >> 12) & 0x0F] + HEX_CHARS[(s[11] >> 8) & 0x0F] + + HEX_CHARS[(s[11] >> 20) & 0x0F] + HEX_CHARS[(s[11] >> 16) & 0x0F] + + HEX_CHARS[(s[11] >> 28) & 0x0F] + HEX_CHARS[(s[11] >> 24) & 0x0F]; + } + if(bits == 512) { + hex += HEX_CHARS[(s[12] >> 4) & 0x0F] + HEX_CHARS[s[12] & 0x0F] + + HEX_CHARS[(s[12] >> 12) & 0x0F] + HEX_CHARS[(s[12] >> 8) & 0x0F] + + HEX_CHARS[(s[12] >> 20) & 0x0F] + HEX_CHARS[(s[12] >> 16) & 0x0F] + + HEX_CHARS[(s[12] >> 28) & 0x0F] + HEX_CHARS[(s[12] >> 24) & 0x0F] + + HEX_CHARS[(s[13] >> 4) & 0x0F] + HEX_CHARS[s[13] & 0x0F] + + HEX_CHARS[(s[13] >> 12) & 0x0F] + HEX_CHARS[(s[13] >> 8) & 0x0F] + + HEX_CHARS[(s[13] >> 20) & 0x0F] + HEX_CHARS[(s[13] >> 16) & 0x0F] + + HEX_CHARS[(s[13] >> 28) & 0x0F] + HEX_CHARS[(s[13] >> 24) & 0x0F] + + HEX_CHARS[(s[14] >> 4) & 0x0F] + HEX_CHARS[s[14] & 0x0F] + + HEX_CHARS[(s[14] >> 12) & 0x0F] + HEX_CHARS[(s[14] >> 8) & 0x0F] + + HEX_CHARS[(s[14] >> 20) & 0x0F] + HEX_CHARS[(s[14] >> 16) & 0x0F] + + HEX_CHARS[(s[14] >> 28) & 0x0F] + HEX_CHARS[(s[14] >> 24) & 0x0F] + + HEX_CHARS[(s[15] >> 4) & 0x0F] + HEX_CHARS[s[15] & 0x0F] + + HEX_CHARS[(s[15] >> 12) & 0x0F] + HEX_CHARS[(s[15] >> 8) & 0x0F] + + HEX_CHARS[(s[15] >> 20) & 0x0F] + HEX_CHARS[(s[15] >> 16) & 0x0F] + + HEX_CHARS[(s[15] >> 28) & 0x0F] + HEX_CHARS[(s[15] >> 24) & 0x0F]; } return hex; }; diff --git a/tests/index.html b/test/index.html similarity index 100% rename from tests/index.html rename to test/index.html diff --git a/tests/node-test.js b/test/node-test.js similarity index 100% rename from tests/node-test.js rename to test/node-test.js diff --git a/tests/test.js b/test/test.js similarity index 100% rename from tests/test.js rename to test/test.js