From 1fa1812d863a2cea6a6d37552e72e94269534da4 Mon Sep 17 00:00:00 2001 From: Chen Yi-Cyuan Date: Sat, 4 Apr 2015 22:04:00 +0800 Subject: [PATCH] * Implement NIST's May 2014 SHA-3 version. * Rename original methods to keccak. --- .covignore | 3 +- .gitignore | 1 + .npmignore | 4 + CHANGELOG.md | 5 ++ README.md | 133 ++++++++++++++++++++++++++----- bower.json | 6 +- build/sha3.min.js | 28 +++---- package.json | 6 +- src/sha3.js | 46 ++++++++--- {test => tests}/index.html | 1 + {test => tests}/node-test.js | 13 ++- tests/test-keccak.js | 148 +++++++++++++++++++++++++++++++++++ {test => tests}/test.js | 76 +++++++++--------- 13 files changed, 379 insertions(+), 91 deletions(-) create mode 100644 .npmignore rename {test => tests}/index.html (93%) rename {test => tests}/node-test.js (55%) create mode 100644 tests/test-keccak.js rename {test => tests}/test.js (56%) diff --git a/.covignore b/.covignore index 1933786..8c36f6f 100644 --- a/.covignore +++ b/.covignore @@ -1 +1,2 @@ -/test/ +/tests/ +node_modules/ diff --git a/.gitignore b/.gitignore index 2187be0..dc6d1eb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules/ covreporter +my_test diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..d69ed3a --- /dev/null +++ b/.npmignore @@ -0,0 +1,4 @@ +my_test +covreporter +build +tests diff --git a/CHANGELOG.md b/CHANGELOG.md index c19ed72..7e57b06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# v0.2.0 / 2015-04-04 + +* Implement NIST's May 2014 SHA-3 version. +* Rename original methods to keccak. + # v0.1.2 / 2015-02-27 * Improve performance. diff --git a/README.md b/README.md index ac565b8..b867a34 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,9 @@ [![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. +## Notice +Sha3 methods has been renamed to keccak since v0.2.0. It means that sha3 methods of v0.1.x are equal to keccak methods of v0.2.x and later. + ## 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) @@ -30,6 +33,10 @@ sha3_512('Message to hash'); sha3_384('Message to hash'); sha3_256('Message to hash'); sha3_224('Message to hash'); +keccak_512('Message to hash'); +keccak_384('Message to hash'); +keccak_256('Message to hash'); +keccak_224('Message to hash'); ``` If you use node.js, you should require the module first: ```JavaScript @@ -37,55 +44,115 @@ sha3_512 = require('js-sha3').sha3_512; sha3_384 = require('js-sha3').sha3_384; sha3_256 = require('js-sha3').sha3_256; sha3_224 = require('js-sha3').sha3_224; +keccak_512 = require('js-sha3').keccak_512; +keccak_384 = require('js-sha3').keccak_384; +keccak_256 = require('js-sha3').keccak_256; +keccak_224 = require('js-sha3').keccak_224; ``` ## Example Code ```JavaScript sha3_512(''); +// a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26 + sha3_512('The quick brown fox jumps over the lazy dog'); +// 01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450 + sha3_512('The quick brown fox jumps over the lazy dog.'); +// 18f4f4bd419603f95538837003d9d254c26c23765565162247483f65c50303597bc9ce4d289f21d1c2f1f458828e33dc442100331b35e7eb031b5d38ba6460f8 + sha3_384(''); +// 0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004 + sha3_384('The quick brown fox jumps over the lazy dog'); +// 7063465e08a93bce31cd89d2e3ca8f602498696e253592ed26f07bf7e703cf328581e1471a7ba7ab119b1a9ebdf8be41 + sha3_384('The quick brown fox jumps over the lazy dog.'); +// 1a34d81695b622df178bc74df7124fe12fac0f64ba5250b78b99c1273d4b080168e10652894ecad5f1f4d5b965437fb9 + sha3_256(''); +// a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a + sha3_256('The quick brown fox jumps over the lazy dog'); +// 69070dda01975c8c120c3aada1b282394e7f032fa9cf32f4cb2259a0897dfc04 + sha3_256('The quick brown fox jumps over the lazy dog.'); +// a80f839cd4f83f6c3dafc87feae470045e4eb0d366397d5c6ce34ba1739f734d + sha3_224(''); +// 6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7 + sha3_224('The quick brown fox jumps over the lazy dog'); +// d15dadceaa4d5d7bb3b48f446421d542e08ad8887305e28d58335795 + sha3_224('The quick brown fox jumps over the lazy dog.'); -``` -Output - - 0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e - d135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609 - ab7192d2b11f51c7dd744e7b3441febf397ca07bf812cceae122ca4ded6387889064f8db9230f173f6d1ab6e24b6e50f065b039f799f5592360a6558eb52d760 - 2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff - 283990fa9d5fb731d786c5bbee94ea4db4910f18c62c03d173fc0a5e494422e8a0b3da7574dae7fa0baf005e504063b3 - 9ad8e17325408eddb6edee6147f13856ad819bb7532668b605a24a2d958f88bd5c169e56dc4b2f89ffd325f6006d820b - c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 - 4d741b6f1eb29cb2a9b9911c82f56fa8d73b04959d3d9d222895df6c0b28aa15 - 578951e24efd62a3d63a86f7cd19aaa53c898fe287d2552133220370240b572d - f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd - 310aee6b30c47350576ac2873fa89fd190cdc488442f3ef654cf23fe - c59d4eaeac728671c635ff645014e2afa935bebffdb5fbd207ffdeab +// 2d0708903833afabdd232a20201176e8b58c5be8a6fe74265ac54db0 + +keccak_512(''); +// 0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e + +keccak_512('The quick brown fox jumps over the lazy dog'); +// d135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609 + +keccak_512('The quick brown fox jumps over the lazy dog.'); +// ab7192d2b11f51c7dd744e7b3441febf397ca07bf812cceae122ca4ded6387889064f8db9230f173f6d1ab6e24b6e50f065b039f799f5592360a6558eb52d760 + +keccak_384(''); +// 2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff + +keccak_384('The quick brown fox jumps over the lazy dog'); +// 283990fa9d5fb731d786c5bbee94ea4db4910f18c62c03d173fc0a5e494422e8a0b3da7574dae7fa0baf005e504063b3 +keccak_384('The quick brown fox jumps over the lazy dog.'); +// 9ad8e17325408eddb6edee6147f13856ad819bb7532668b605a24a2d958f88bd5c169e56dc4b2f89ffd325f6006d820b + +keccak_256(''); +// c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 + +keccak_256('The quick brown fox jumps over the lazy dog'); +// 4d741b6f1eb29cb2a9b9911c82f56fa8d73b04959d3d9d222895df6c0b28aa15 + +keccak_256('The quick brown fox jumps over the lazy dog.'); +// 578951e24efd62a3d63a86f7cd19aaa53c898fe287d2552133220370240b572d + +keccak_224(''); +// f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd + +keccak_224('The quick brown fox jumps over the lazy dog'); +// 310aee6b30c47350576ac2873fa89fd190cdc488442f3ef654cf23fe + +keccak_224('The quick brown fox jumps over the lazy dog.'); +// c59d4eaeac728671c635ff645014e2afa935bebffdb5fbd207ffdeab +``` It also supports UTF-8 encoding: Code ```JavaScript sha3_512('中文'); +// 059bbe2efc50cc30e4d8ec5a96be697e2108fcbf9193e1296192eddabc13b143c0120d059399a13d0d42651efe23a6c1ce2d1efb576c5b207fa2516050505af7 + sha3_384('中文'); +// 9fb5b99e3c546f2738dcd50a14e9aef9c313800c1bf8cf76bc9b2c3a23307841364c5a2d0794702662c5796fb72f5432 + sha3_256('中文'); +// ac5305da3d18be1aed44aa7c70ea548da243a59a5fd546f489348fd5718fb1a0 + sha3_224('中文'); -``` -Output +// 106d169e10b61c2a2a05554d3e631ec94467f8316640f29545d163ee + +keccak_512('中文'); +// 2f6a1bd50562230229af34b0ccf46b8754b89d23ae2c5bf7840b4acfcef86f87395edc0a00b2bfef53bafebe3b79de2e3e01cbd8169ddbb08bde888dcc893524 - 2f6a1bd50562230229af34b0ccf46b8754b89d23ae2c5bf7840b4acfcef86f87395edc0a00b2bfef53bafebe3b79de2e3e01cbd8169ddbb08bde888dcc893524 - 743f64bb7544c6ed923be4741b738dde18b7cee384a3a09c4e01acaaac9f19222cdee137702bd3aa05dc198373d87d6c - 70a2b6579047f0a977fcb5e9120a4e07067bea9abb6916fbc2d13ffb9a4e4eee - f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd +keccak_384('中文'); +// 743f64bb7544c6ed923be4741b738dde18b7cee384a3a09c4e01acaaac9f19222cdee137702bd3aa05dc198373d87d6c +keccak_256('中文'); +// 70a2b6579047f0a977fcb5e9120a4e07067bea9abb6916fbc2d13ffb9a4e4eee + +keccak_224('中文'); +// f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd +``` ## Benchmark [UTF8](http://jsperf.com/sha3/3) [ASCII](http://jsperf.com/sha3/2) @@ -100,6 +167,10 @@ jQuery.sha3_512 = sha3_512; jQuery.sha3_384 = sha3_384; jQuery.sha3_256 = sha3_256; jQuery.sha3_224 = sha3_224; +jQuery.keccak_512 = keccak_512; +jQuery.keccak_384 = keccak_384; +jQuery.keccak_256 = keccak_256; +jQuery.keccak_224 = keccak_224; ``` And then you could use like this: ```JavaScript @@ -107,6 +178,10 @@ $.sha3_512('message'); $.sha3_384('message'); $.sha3_256('message'); $.sha3_224('message'); +$.keccak_512('message'); +$.keccak_384('message'); +$.keccak_256('message'); +$.keccak_224('message'); ``` ### Prototype If you prefer prototype style, you can add following code to add a prototype extension. @@ -125,6 +200,18 @@ String.prototype.sha3_256 = function() { String.prototype.sha3_224 = function() { return sha3_224(this); }; +String.prototype.keccak_512 = function() { + return keccak_512(this); +}; +String.prototype.keccak_384 = function() { + return keccak_384(this); +}; +String.prototype.keccak_256 = function() { + return keccak_256(this); +}; +String.prototype.keccak_224 = function() { + return keccak_224(this); +}; ``` And then you could use like this: ```JavaScript @@ -132,6 +219,10 @@ And then you could use like this: 'message'.sha3_384(); 'message'.sha3_256(); 'message'.sha3_224(); +'message'.keccak_512(); +'message'.keccak_384(); +'message'.keccak_256(); +'message'.keccak_224(); ``` ## License The project is released under the [MIT license](http://www.opensource.org/licenses/MIT). diff --git a/bower.json b/bower.json index 4309632..ca06b90 100644 --- a/bower.json +++ b/bower.json @@ -1,9 +1,9 @@ { "name": "js-sha3", - "version": "0.1.2", - "main": ["build/sha3.min.js"], + "version": "0.2.0", + "main": ["src/sha3.js"], "ignore": [ "samples", - "test" + "tests" ] } diff --git a/build/sha3.min.js b/build/sha3.min.js index c8d6948..211641f 100644 --- a/build/sha3.min.js +++ b/build/sha3.min.js @@ -1,5 +1,5 @@ /* - * js-sha3 v0.1.2 + * js-sha3 v0.2.0 * https://github.com/emn178/js-sha3 * * Copyright 2015, emn178@gmail.com @@ -7,16 +7,16 @@ * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT */ -(function(u,ua){var E="undefined"!=typeof module;E&&(u=global,u.JS_SHA3_TEST&&(u.navigator={userAgent:"Chrome"}));var va=(u.JS_SHA3_TEST||!E)&&-1!=navigator.userAgent.indexOf("Chrome"),b="0123456789abcdef".split(""),wa=[1,256,65536,16777216],B=[0,8,16,24],qa=[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],e=[],a=[],ra=function(a){return A(a,224)},sa=function(a){return A(a,256)},ta=function(a){return A(a,384)},A=function(u,C){C===ua&&(C=512);var A,f,v=!1,D=0,E=0,oa=u.length,c,d,g,h,k,l,m,n,p,q,r,t,w,x,y,z,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,F=(1600-2*C)/32,pa=4*F;for(c=0;50>c;++c)a[c]=0;A=0;do{e[0]=A;for(c=1;cf?e[c>>2]|=f<f?e[c>>2]|=(192|f>>6)<f||57344<=f?e[c>>2]|=(224|f>>12)<>2]|=(240|f>>18)<>2]|=(128|f>>12&63)<>2]|=(128|f>>6&63)<>2]|=(128|f&63)<>2]|=wa[c&3],++D);A=e[F];D>oa&&cf;f+=2)g=a[0]^a[10]^a[20]^a[30]^a[40],h=a[1]^a[11]^a[21]^a[31]^a[41],k=a[2]^ -a[12]^a[22]^a[32]^a[42],l=a[3]^a[13]^a[23]^a[33]^a[43],m=a[4]^a[14]^a[24]^a[34]^a[44],n=a[5]^a[15]^a[25]^a[35]^a[45],p=a[6]^a[16]^a[26]^a[36]^a[46],q=a[7]^a[17]^a[27]^a[37]^a[47],r=a[8]^a[18]^a[28]^a[38]^a[48],t=a[9]^a[19]^a[29]^a[39]^a[49],d=r^(k<<1|l>>>31),c=t^(l<<1|k>>>31),a[0]^=d,a[1]^=c,a[10]^=d,a[11]^=c,a[20]^=d,a[21]^=c,a[30]^=d,a[31]^=c,a[40]^=d,a[41]^=c,d=g^(m<<1|n>>>31),c=h^(n<<1|m>>>31),a[2]^=d,a[3]^=c,a[12]^=d,a[13]^=c,a[22]^=d,a[23]^=c,a[32]^=d,a[33]^=c,a[42]^=d,a[43]^=c,d=k^(p<<1|q>>> -31),c=l^(q<<1|p>>>31),a[4]^=d,a[5]^=c,a[14]^=d,a[15]^=c,a[24]^=d,a[25]^=c,a[34]^=d,a[35]^=c,a[44]^=d,a[45]^=c,d=m^(r<<1|t>>>31),c=n^(t<<1|r>>>31),a[6]^=d,a[7]^=c,a[16]^=d,a[17]^=c,a[26]^=d,a[27]^=c,a[36]^=d,a[37]^=c,a[46]^=d,a[47]^=c,d=p^(g<<1|h>>>31),c=q^(h<<1|g>>>31),a[8]^=d,a[9]^=c,a[18]^=d,a[19]^=c,a[28]^=d,a[29]^=c,a[38]^=d,a[39]^=c,a[48]^=d,a[49]^=c,d=a[0],c=a[1],W=a[11]<<4|a[10]>>>28,X=a[10]<<4|a[11]>>>28,y=a[20]<<3|a[21]>>>29,z=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,g=a[13]<<12|a[12]>>>20,h=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,k=a[25]<<11|a[24]>>>21,l=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,r=a[6]<< -28|a[7]>>>4,t=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,m=a[36]<<21|a[37]>>>11,n=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,w=a[18]<<20|a[19]>>>12,x=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,p=a[48]<<14|a[49]>>>18,q=a[49]<<14|a[48]>>>18,a[0]=d^~g&k,a[1]=c^~h&l,a[10]=r^~w&y,a[11]=t^~x&z,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]=g^~k&m,a[3]=h^~l&n,a[12]=w^~y&G,a[13]=x^~z&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]=k^~m&p,a[5]=l^~n&q,a[14]=y^~G&I,a[15]=z^~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]=m^~p&d,a[7]=n^~q&c,a[16]=G^~I&r,a[17]=H^~J&t,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]=p^~d&g,a[9]=q^~c&h, -a[18]=I^~r&w,a[19]=J^~t&x,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]^=qa[f],a[1]^=qa[f+1]}while(!v);v="";if(va)d=a[0],c=a[1],g=a[2],h=a[3],k=a[4],l=a[5],m=a[6],n=a[7],p=a[8],q=a[9],r=a[10],t=a[11],w=a[12],x=a[13],y=a[14],z=a[15],v+=b[d>>4&15]+b[d&15]+b[d>>12&15]+b[d>>8&15]+b[d>>20&15]+b[d>>16&15]+b[d>>28&15]+b[d>>24&15]+b[c>>4&15]+b[c&15]+b[c>>12&15]+b[c>>8&15]+b[c>>20&15]+b[c>>16&15]+b[c>>28&15]+b[c>>24&15]+b[g>>4&15]+b[g&15]+b[g>>12&15]+b[g>>8&15]+ -b[g>>20&15]+b[g>>16&15]+b[g>>28&15]+b[g>>24&15]+b[h>>4&15]+b[h&15]+b[h>>12&15]+b[h>>8&15]+b[h>>20&15]+b[h>>16&15]+b[h>>28&15]+b[h>>24&15]+b[k>>4&15]+b[k&15]+b[k>>12&15]+b[k>>8&15]+b[k>>20&15]+b[k>>16&15]+b[k>>28&15]+b[k>>24&15]+b[l>>4&15]+b[l&15]+b[l>>12&15]+b[l>>8&15]+b[l>>20&15]+b[l>>16&15]+b[l>>28&15]+b[l>>24&15]+b[m>>4&15]+b[m&15]+b[m>>12&15]+b[m>>8&15]+b[m>>20&15]+b[m>>16&15]+b[m>>28&15]+b[m>>24&15],256<=C&&(v+=b[n>>4&15]+b[n&15]+b[n>>12&15]+b[n>>8&15]+b[n>>20&15]+b[n>>16&15]+b[n>>28&15]+b[n>> -24&15]),384<=C&&(v+=b[p>>4&15]+b[p&15]+b[p>>12&15]+b[p>>8&15]+b[p>>20&15]+b[p>>16&15]+b[p>>28&15]+b[p>>24&15]+b[q>>4&15]+b[q&15]+b[q>>12&15]+b[q>>8&15]+b[q>>20&15]+b[q>>16&15]+b[q>>28&15]+b[q>>24&15]+b[r>>4&15]+b[r&15]+b[r>>12&15]+b[r>>8&15]+b[r>>20&15]+b[r>>16&15]+b[r>>28&15]+b[r>>24&15]+b[t>>4&15]+b[t&15]+b[t>>12&15]+b[t>>8&15]+b[t>>20&15]+b[t>>16&15]+b[t>>28&15]+b[t>>24&15]),512==C&&(v+=b[w>>4&15]+b[w&15]+b[w>>12&15]+b[w>>8&15]+b[w>>20&15]+b[w>>16&15]+b[w>>28&15]+b[w>>24&15]+b[x>>4&15]+b[x&15]+ -b[x>>12&15]+b[x>>8&15]+b[x>>20&15]+b[x>>16&15]+b[x>>28&15]+b[x>>24&15]+b[y>>4&15]+b[y&15]+b[y>>12&15]+b[y>>8&15]+b[y>>20&15]+b[y>>16&15]+b[y>>28&15]+b[y>>24&15]+b[z>>4&15]+b[z&15]+b[z>>12&15]+b[z>>8&15]+b[z>>20&15]+b[z>>16&15]+b[z>>28&15]+b[z>>24&15]);else for(c=0,f=C/32;c>4&15]+b[d&15]+b[d>>12&15]+b[d>>8&15]+b[d>>20&15]+b[d>>16&15]+b[d>>28&15]+b[d>>24&15];return v};!u.JS_SHA3_TEST&&E?module.exports={sha3_512:A,sha3_384:ta,sha3_256:sa,sha3_224:ra}:u&&(u.sha3_512=A,u.sha3_384= -ta,u.sha3_256=sa,u.sha3_224=ra)})(this); +(function(e,za){var E="undefined"!=typeof module;E&&(e=global,e.JS_SHA3_TEST&&(e.navigator={userAgent:"Chrome"}));var Aa=(e.JS_SHA3_TEST||!E)&&-1!=navigator.userAgent.indexOf("Chrome"),b="0123456789abcdef".split(""),H=[1,256,65536,16777216],B=[6,1536,393216,100663296],C=[0,8,16,24],sa=[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=[],G=function(a){return A(a,224,H)},ta=function(a){return A(a,256,H)},ua=function(a){return A(a,384,H)},va=function(a){return A(a,224,B)},wa=function(a){return A(a,256,B)},xa=function(a){return A(a,384,B)},ya=function(a){return A(a,512,B)},A=function(v,e,A){e===za&&(e=512,A=H);var B,g,E=!1,D=0,G=0,qa=v.length,c,d,h,k,l,m,n,p,q,r,t,u,w,x,y,z,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,oa,pa,F=(1600-2*e)/32,ra=4*F;for(c=0;50>c;++c)a[c]=0;B=0;do{f[0]=B;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]|=A[c&3],++D);B=f[F];D>qa&&cg;g+=2)h=a[0]^a[10]^a[20]^a[30]^a[40],k=a[1]^a[11]^a[21]^a[31]^a[41],l=a[2]^a[12]^a[22]^a[32]^a[42],m=a[3]^a[13]^a[23]^a[33]^a[43],n=a[4]^a[14]^a[24]^a[34]^a[44],p=a[5]^a[15]^a[25]^a[35]^a[45],q=a[6]^a[16]^a[26]^a[36]^a[46],r=a[7]^a[17]^a[27]^a[37]^a[47],t=a[8]^a[18]^a[28]^a[38]^a[48],u=a[9]^a[19]^a[29]^a[39]^a[49],d=t^(l<<1|m>>>31),c=u^(m<<1|l>>>31),a[0]^=d,a[1]^=c,a[10]^=d,a[11]^=c,a[20]^=d,a[21]^= +c,a[30]^=d,a[31]^=c,a[40]^=d,a[41]^=c,d=h^(n<<1|p>>>31),c=k^(p<<1|n>>>31),a[2]^=d,a[3]^=c,a[12]^=d,a[13]^=c,a[22]^=d,a[23]^=c,a[32]^=d,a[33]^=c,a[42]^=d,a[43]^=c,d=l^(q<<1|r>>>31),c=m^(r<<1|q>>>31),a[4]^=d,a[5]^=c,a[14]^=d,a[15]^=c,a[24]^=d,a[25]^=c,a[34]^=d,a[35]^=c,a[44]^=d,a[45]^=c,d=n^(t<<1|u>>>31),c=p^(u<<1|t>>>31),a[6]^=d,a[7]^=c,a[16]^=d,a[17]^=c,a[26]^=d,a[27]^=c,a[36]^=d,a[37]^=c,a[46]^=d,a[47]^=c,d=q^(h<<1|k>>>31),c=r^(k<<1|h>>>31),a[8]^=d,a[9]^=c,a[18]^=d,a[19]^=c,a[28]^=d,a[29]^=c,a[38]^= +d,a[39]^=c,a[48]^=d,a[49]^=c,d=a[0],c=a[1],Y=a[11]<<4|a[10]>>>28,Z=a[10]<<4|a[11]>>>28,y=a[20]<<3|a[21]>>>29,z=a[21]<<3|a[20]>>>29,ma=a[31]<<9|a[30]>>>23,na=a[30]<<9|a[31]>>>23,U=a[40]<<18|a[41]>>>14,V=a[41]<<18|a[40]>>>14,M=a[2]<<1|a[3]>>>31,N=a[3]<<1|a[2]>>>31,h=a[13]<<12|a[12]>>>20,k=a[12]<<12|a[13]>>>20,aa=a[22]<<10|a[23]>>>22,ba=a[23]<<10|a[22]>>>22,I=a[33]<<13|a[32]>>>19,J=a[32]<<13|a[33]>>>19,oa=a[42]<<2|a[43]>>>30,pa=a[43]<<2|a[42]>>>30,ga=a[5]<<30|a[4]>>>2,ha=a[4]<<30|a[5]>>>2,O=a[14]<<6| +a[15]>>>26,P=a[15]<<6|a[14]>>>26,l=a[25]<<11|a[24]>>>21,m=a[24]<<11|a[25]>>>21,ca=a[34]<<15|a[35]>>>17,da=a[35]<<15|a[34]>>>17,K=a[45]<<29|a[44]>>>3,L=a[44]<<29|a[45]>>>3,t=a[6]<<28|a[7]>>>4,u=a[7]<<28|a[6]>>>4,ia=a[17]<<23|a[16]>>>9,ja=a[16]<<23|a[17]>>>9,Q=a[26]<<25|a[27]>>>7,R=a[27]<<25|a[26]>>>7,n=a[36]<<21|a[37]>>>11,p=a[37]<<21|a[36]>>>11,ea=a[47]<<24|a[46]>>>8,fa=a[46]<<24|a[47]>>>8,W=a[8]<<27|a[9]>>>5,X=a[9]<<27|a[8]>>>5,w=a[18]<<20|a[19]>>>12,x=a[19]<<20|a[18]>>>12,ka=a[29]<<7|a[28]>>>25, +la=a[28]<<7|a[29]>>>25,S=a[38]<<8|a[39]>>>24,T=a[39]<<8|a[38]>>>24,q=a[48]<<14|a[49]>>>18,r=a[49]<<14|a[48]>>>18,a[0]=d^~h&l,a[1]=c^~k&m,a[10]=t^~w&y,a[11]=u^~x&z,a[20]=M^~O&Q,a[21]=N^~P&R,a[30]=W^~Y&aa,a[31]=X^~Z&ba,a[40]=ga^~ia&ka,a[41]=ha^~ja&la,a[2]=h^~l&n,a[3]=k^~m&p,a[12]=w^~y&I,a[13]=x^~z&J,a[22]=O^~Q&S,a[23]=P^~R&T,a[32]=Y^~aa&ca,a[33]=Z^~ba&da,a[42]=ia^~ka&ma,a[43]=ja^~la&na,a[4]=l^~n&q,a[5]=m^~p&r,a[14]=y^~I&K,a[15]=z^~J&L,a[24]=Q^~S&U,a[25]=R^~T&V,a[34]=aa^~ca&ea,a[35]=ba^~da&fa,a[44]= +ka^~ma&oa,a[45]=la^~na&pa,a[6]=n^~q&d,a[7]=p^~r&c,a[16]=I^~K&t,a[17]=J^~L&u,a[26]=S^~U&M,a[27]=T^~V&N,a[36]=ca^~ea&W,a[37]=da^~fa&X,a[46]=ma^~oa&ga,a[47]=na^~pa&ha,a[8]=q^~d&h,a[9]=r^~c&k,a[18]=K^~t&w,a[19]=L^~u&x,a[28]=U^~M&O,a[29]=V^~N&P,a[38]=ea^~W&Y,a[39]=fa^~X&Z,a[48]=oa^~ga&ia,a[49]=pa^~ha&ja,a[0]^=sa[g],a[1]^=sa[g+1]}while(!E);v="";if(Aa)d=a[0],c=a[1],h=a[2],k=a[3],l=a[4],m=a[5],n=a[6],p=a[7],q=a[8],r=a[9],t=a[10],u=a[11],w=a[12],x=a[13],y=a[14],z=a[15],v+=b[d>>4&15]+b[d&15]+b[d>>12&15]+b[d>> +8&15]+b[d>>20&15]+b[d>>16&15]+b[d>>28&15]+b[d>>24&15]+b[c>>4&15]+b[c&15]+b[c>>12&15]+b[c>>8&15]+b[c>>20&15]+b[c>>16&15]+b[c>>28&15]+b[c>>24&15]+b[h>>4&15]+b[h&15]+b[h>>12&15]+b[h>>8&15]+b[h>>20&15]+b[h>>16&15]+b[h>>28&15]+b[h>>24&15]+b[k>>4&15]+b[k&15]+b[k>>12&15]+b[k>>8&15]+b[k>>20&15]+b[k>>16&15]+b[k>>28&15]+b[k>>24&15]+b[l>>4&15]+b[l&15]+b[l>>12&15]+b[l>>8&15]+b[l>>20&15]+b[l>>16&15]+b[l>>28&15]+b[l>>24&15]+b[m>>4&15]+b[m&15]+b[m>>12&15]+b[m>>8&15]+b[m>>20&15]+b[m>>16&15]+b[m>>28&15]+b[m>>24&15]+ +b[n>>4&15]+b[n&15]+b[n>>12&15]+b[n>>8&15]+b[n>>20&15]+b[n>>16&15]+b[n>>28&15]+b[n>>24&15],256<=e&&(v+=b[p>>4&15]+b[p&15]+b[p>>12&15]+b[p>>8&15]+b[p>>20&15]+b[p>>16&15]+b[p>>28&15]+b[p>>24&15]),384<=e&&(v+=b[q>>4&15]+b[q&15]+b[q>>12&15]+b[q>>8&15]+b[q>>20&15]+b[q>>16&15]+b[q>>28&15]+b[q>>24&15]+b[r>>4&15]+b[r&15]+b[r>>12&15]+b[r>>8&15]+b[r>>20&15]+b[r>>16&15]+b[r>>28&15]+b[r>>24&15]+b[t>>4&15]+b[t&15]+b[t>>12&15]+b[t>>8&15]+b[t>>20&15]+b[t>>16&15]+b[t>>28&15]+b[t>>24&15]+b[u>>4&15]+b[u&15]+b[u>>12& +15]+b[u>>8&15]+b[u>>20&15]+b[u>>16&15]+b[u>>28&15]+b[u>>24&15]),512==e&&(v+=b[w>>4&15]+b[w&15]+b[w>>12&15]+b[w>>8&15]+b[w>>20&15]+b[w>>16&15]+b[w>>28&15]+b[w>>24&15]+b[x>>4&15]+b[x&15]+b[x>>12&15]+b[x>>8&15]+b[x>>20&15]+b[x>>16&15]+b[x>>28&15]+b[x>>24&15]+b[y>>4&15]+b[y&15]+b[y>>12&15]+b[y>>8&15]+b[y>>20&15]+b[y>>16&15]+b[y>>28&15]+b[y>>24&15]+b[z>>4&15]+b[z&15]+b[z>>12&15]+b[z>>8&15]+b[z>>20&15]+b[z>>16&15]+b[z>>28&15]+b[z>>24&15]);else for(c=0,g=e/32;c>4&15]+b[d&15]+b[d>>12& +15]+b[d>>8&15]+b[d>>20&15]+b[d>>16&15]+b[d>>28&15]+b[d>>24&15];return v};!e.JS_SHA3_TEST&&E?module.exports={sha3_512:ya,sha3_384:xa,sha3_256:wa,sha3_224:va,keccak_512:A,keccak_384:ua,keccak_256:ta,keccak_224:G}:e&&(e.sha3_512=ya,e.sha3_384=xa,e.sha3_256=wa,e.sha3_224=va,e.keccak_512=A,e.keccak_384=ua,e.keccak_256=ta,e.keccak_224=G)})(this); diff --git a/package.json b/package.json index 88f1853..160cf5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "js-sha3", - "version": "0.1.2", + "version": "0.2.0", "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 test/node-test.js -r jscoverage", - "coveralls": "mocha test/node-test.js -R mocha-lcov-reporter -r jscoverage | coveralls" + "test": "mocha tests/node-test.js -r jscoverage", + "coveralls": "mocha tests/node-test.js -R mocha-lcov-reporter -r jscoverage | coveralls" }, "repository": { "type": "git", diff --git a/src/sha3.js b/src/sha3.js index 3a80fb8..97e8914 100644 --- a/src/sha3.js +++ b/src/sha3.js @@ -1,5 +1,5 @@ /* - * js-sha3 v0.1.2 + * js-sha3 v0.2.0 * https://github.com/emn178/js-sha3 * * Copyright 2015, emn178@gmail.com @@ -19,7 +19,8 @@ } var CHROME = (root.JS_SHA3_TEST || !NODE_JS) && navigator.userAgent.indexOf('Chrome') != -1; var HEX_CHARS = '0123456789abcdef'.split(''); - var EXTRA = [1, 256, 65536, 16777216]; + var KECCAK_PADDING = [1, 256, 65536, 16777216]; + var PADDING = [6, 1536, 393216, 100663296]; var SHIFT = [0, 8, 16, 24]; var RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649, 0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0, @@ -29,21 +30,38 @@ var blocks = [], s = []; + var keccak_224 = function(message) { + return keccak(message, 224, KECCAK_PADDING); + }; + + var keccak_256 = function(message) { + return keccak(message, 256, KECCAK_PADDING); + }; + + var keccak_384 = function(message) { + return keccak(message, 384, KECCAK_PADDING); + }; + var sha3_224 = function(message) { - return sha3(message, 224); + return keccak(message, 224, PADDING); }; var sha3_256 = function(message) { - return sha3(message, 256); + return keccak(message, 256, PADDING); }; var sha3_384 = function(message) { - return sha3(message, 384); + return keccak(message, 384, PADDING); + }; + + var sha3_512 = function(message) { + return keccak(message, 512, PADDING); }; - var sha3 = function(message, bits) { + var keccak = function(message, bits, padding) { if(bits === undefined) { bits = 512; + padding = KECCAK_PADDING; } var block, code, end = false, index = 0, start = 0, length = message.length, @@ -85,7 +103,7 @@ } start = i - byteCount; if(index == length) { - blocks[i >> 2] |= EXTRA[i & 3]; + blocks[i >> 2] |= padding[i & 3]; ++index; } block = blocks[blockCount]; @@ -381,15 +399,23 @@ if(!root.JS_SHA3_TEST && NODE_JS) { module.exports = { - sha3_512: sha3, + sha3_512: sha3_512, sha3_384: sha3_384, sha3_256: sha3_256, - sha3_224: sha3_224 + sha3_224: sha3_224, + keccak_512: keccak, + keccak_384: keccak_384, + keccak_256: keccak_256, + keccak_224: keccak_224 }; } else if(root) { - root.sha3_512 = sha3; + root.sha3_512 = sha3_512; root.sha3_384 = sha3_384; root.sha3_256 = sha3_256; root.sha3_224 = sha3_224; + root.keccak_512 = keccak; + root.keccak_384 = keccak_384; + root.keccak_256 = keccak_256; + root.keccak_224 = keccak_224; } }(this)); diff --git a/test/index.html b/tests/index.html similarity index 93% rename from test/index.html rename to tests/index.html index 6f4462f..17ff22d 100644 --- a/test/index.html +++ b/tests/index.html @@ -14,6 +14,7 @@ mocha.setup('bdd'); +