Compare commits

...
5 Commits
Author SHA1 Message Date
Yi-Cyuan 06a3fa8f52 * Fixed shake output incorrect in the special length. 2016-06-06 11:23:18 +08:00
Yi-Cyuan f22d720caa Update package.json and bower.json. 2015-10-27 14:34:23 +08:00
emn178 63f2823f49 Merge pull request #6 from adon-at-work/patch-1
Minor fix: declaring i in Keccak
2015-10-01 09:55:05 +08:00
adon fbedaa1f4c declaring i in Keccak 2015-09-28 16:13:39 -07:00
Yi-Cyuan 09db28deed Support update interface. 2015-09-23 17:13:07 +08:00
13 changed files with 633 additions and 575 deletions
+2
View File
@@ -1,5 +1,7 @@
language: node_js language: node_js
node_js: node_js:
- "4.1"
- "4.0"
- "0.12" - "0.12"
- "0.11" - "0.11"
- "0.10" - "0.10"
+12
View File
@@ -1,3 +1,15 @@
# v0.5.2 / 2016-06-06
* Fixed shake output incorrect in the special length.
# v0.5.1 / 2015-10-27
* Update package.json and bower.json.
# v0.5.0 / 2015-09-23
* Support update interface.
# v0.4.1 / 2015-09-18 # v0.4.1 / 2015-09-18
* Support to output Integer Array. * Support to output Integer Array.
+1 -3
View File
@@ -1,6 +1,4 @@
Copyright (c) 2015 Chen Yi-Cyuan Copyright 2015-2016 Chen, Yi-Cyuan
MIT License
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the
+20 -1
View File
@@ -1,6 +1,8 @@
# js-sha3 # js-sha3
[![Build Status](https://travis-ci.org/emn178/js-sha3.svg?branch=master)](https://travis-ci.org/emn178/js-sha3) [![Build Status](https://travis-ci.org/emn178/js-sha3.svg?branch=master)](https://travis-ci.org/emn178/js-sha3)
[![Coverage Status](https://coveralls.io/repos/emn178/js-sha3/badge.svg?branch=master)](https://coveralls.io/r/emn178/js-sha3?branch=master) [![Coverage Status](https://coveralls.io/repos/emn178/js-sha3/badge.svg?branch=master)](https://coveralls.io/r/emn178/js-sha3?branch=master)
A simple SHA-3 / Keccak / Shake hash function for JavaScript supports UTF-8 encoding. A simple SHA-3 / Keccak / Shake hash function for JavaScript supports UTF-8 encoding.
## Notice ## Notice
@@ -48,6 +50,23 @@ var buffer = keccak_224.buffer('Message to hash');
// Support Array output // Support Array output
var buffer = keccak_224.array('Message to hash'); var buffer = keccak_224.array('Message to hash');
// update hash
sha3_512.update('Message ').update('to ').update('hash').hex();
// specify shake output bits at first update
shake_128.update('Message ', 256).update('to ').update('hash').hex();
// or to use create
var hash = sha3_512.create();
hash.update('...');
hash.update('...');
hash.hex();
// specify shake output bits when creating
var hash = shake_128.create(256);
hash.update('...');
hash.update('...');
hash.hex();
``` ```
If you use node.js, you should require the module first: If you use node.js, you should require the module first:
```JavaScript ```JavaScript
@@ -262,4 +281,4 @@ The project is released under the [MIT license](http://www.opensource.org/licens
## Contact ## Contact
The project's website is located at https://github.com/emn178/js-sha3 The project's website is located at https://github.com/emn178/js-sha3
Author: emn178@gmail.com Author: Chen, Yi-Cyuan (emn178@gmail.com)
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "js-sha3", "name": "js-sha3",
"version": "0.4.1", "version": "0.5.2",
"main": ["src/sha3.js"], "main": ["src/sha3.js"],
"ignore": [ "ignore": [
"samples", "samples",
+20 -18
View File
@@ -1,20 +1,22 @@
/* /**
* js-sha3 v0.4.1 * [js-sha3]{@link https://github.com/emn178/js-sha3}
* https://github.com/emn178/js-sha3
* *
* Copyright 2015, emn178@gmail.com * @version 0.5.2
* * @author Chen, Yi-Cyuan [emn178@gmail.com]
* Licensed under the MIT license: * @copyright Chen, Yi-Cyuan 2015-2016
* http://www.opensource.org/licenses/MIT * @license MIT
*/ */
(function(E,Da){var xa="undefined"!=typeof module;xa&&(E=global,E.JS_SHA3_TEST&&(E.navigator={userAgent:"Chrome"}));for(var g="0123456789abcdef".split(""),r=[0,8,16,24],ya=[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, (function(r){function n(a,b,c){this.blocks=[];this.s=[];this.padding=b;this.outputBits=c;this.reset=!0;this.start=this.block=0;this.blockCount=1600-(a<<1)>>5;this.byteCount=this.blockCount<<2;this.outputBlocks=c>>5;this.extraBytes=(c&31)>>3;for(a=0;50>a;++a)this.s[a]=0}var ga="undefined"!=typeof module;ga&&(r=global);for(var l="0123456789abcdef".split(""),p=[0,8,16,24],ha=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,
2147483648],m=[224,256,384,512],za=["hex","buffer","shake"],p=function(a,e,l){return function(f){return Aa(f,a,e,a,l)}},m=[{name:"keccak",padding:[1,256,65536,16777216],bits:m,createMethod:p},{name:"sha3",padding:[6,1536,393216,100663296],bits:m,createMethod:p},{name:"shake",padding:[31,7936,2031616,520093696],bits:[128,256],createMethod:function(a,e,l){return function(f,g){return Aa(f,a,e,g,l)}}}],e=[],a=[],F={},ua=0;ua<m.length;++ua)for(var va=m[ua],Ba=va.bits,p=va.createMethod,wa=0;wa<Ba.length;++wa)(function(a, 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],t=[224,256,384,512],w=["hex","buffer","array"],ia=function(a,b,c){return function(e){return(new n(a,b,a)).update(e)[c]()}},ja=function(a,b,c){return function(e,g){return(new n(a,b,g)).update(e)[c]()}},q=function(a,b){var c=ia(a,b,"hex");c.create=function(){return new n(a,b,a)};c.update=
e){var g=p(e,a.padding,"hex");F[a.name+"_"+e]=g;for(var f=0;f<za.length;++f){var q=za[f];g[q]=p(e,a.padding,q)}})(va,Ba[wa]);var Aa=function(k,t,l,f,q){var m="string"!=typeof k;m&&k.constructor==E.ArrayBuffer&&(k=new Uint8Array(k));var p,h,F=!1,n=0;h=0;var G=k.length,b,c,d,u,v,w,x,y,z,A,B,C,D,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,oa,pa,qa,ra,sa;t=(1600-2*t)/32;var ta=4*t;for(b=0;50>b;++b)a[b]=0;p=0;do{e[0]=p;for(b=1;b<t+1;++b)e[b]=0;if(m)for(b=h;n<G&&b<ta;++n)e[b>> function(a){return c.create().update(a)};for(var e=0;e<w.length;++e){var g=w[e];c[g]=ia(a,b,g)}return c},t=[{name:"keccak",padding:[1,256,65536,16777216],bits:t,createMethod:q},{name:"sha3",padding:[6,1536,393216,100663296],bits:t,createMethod:q},{name:"shake",padding:[31,7936,2031616,520093696],bits:[128,256],createMethod:function(a,b){var c=ja(a,b,"hex");c.create=function(c){return new n(a,b,c)};c.update=function(a,b){return c.create(b).update(a)};for(var e=0;e<w.length;++e){var g=w[e];c[g]=ja(a,
2]|=k[n]<<r[b++&3];else for(b=h;n<G&&b<ta;++n)h=k.charCodeAt(n),128>h?e[b>>2]|=h<<r[b++&3]:(2048>h?e[b>>2]|=(192|h>>6)<<r[b++&3]:(55296>h||57344<=h?e[b>>2]|=(224|h>>12)<<r[b++&3]:(h=65536+((h&1023)<<10|k.charCodeAt(++n)&1023),e[b>>2]|=(240|h>>18)<<r[b++&3],e[b>>2]|=(128|h>>12&63)<<r[b++&3]),e[b>>2]|=(128|h>>6&63)<<r[b++&3]),e[b>>2]|=(128|h&63)<<r[b++&3]);h=b-ta;n==G&&(e[b>>2]|=l[b&3],++n);p=e[t];n>G&&b<ta&&(e[t-1]|=2147483648,F=!0);for(b=0;b<t;++b)a[b]^=e[b];for(b=0;48>b;b+=2)u=a[0]^a[10]^a[20]^a[30]^ b,g)}return c}}],x={},ea=0;ea<t.length;++ea)for(var u=t[ea],fa=u.bits,q=u.createMethod,q=0;q<fa.length;++q){var la=u.createMethod(fa[q],u.padding);x[u.name+"_"+fa[q]]=la}n.prototype.update=function(a){var b="string"!=typeof a;b&&a.constructor==r.ArrayBuffer&&(a=new Uint8Array(a));for(var c=a.length,e=this.blocks,g=this.byteCount,k=this.blockCount,h=0,f=this.s,d,m;h<c;){if(this.reset)for(this.reset=!1,e[0]=this.block,d=1;d<k+1;++d)e[d]=0;if(b)for(d=this.start;h<c&&d<g;++h)e[d>>2]|=a[h]<<p[d++&3];else for(d=
a[40],v=a[1]^a[11]^a[21]^a[31]^a[41],w=a[2]^a[12]^a[22]^a[32]^a[42],x=a[3]^a[13]^a[23]^a[33]^a[43],y=a[4]^a[14]^a[24]^a[34]^a[44],z=a[5]^a[15]^a[25]^a[35]^a[45],A=a[6]^a[16]^a[26]^a[36]^a[46],B=a[7]^a[17]^a[27]^a[37]^a[47],C=a[8]^a[18]^a[28]^a[38]^a[48],D=a[9]^a[19]^a[29]^a[39]^a[49],c=C^(w<<1|x>>>31),d=D^(x<<1|w>>>31),a[0]^=c,a[1]^=d,a[10]^=c,a[11]^=d,a[20]^=c,a[21]^=d,a[30]^=c,a[31]^=d,a[40]^=c,a[41]^=d,c=u^(y<<1|z>>>31),d=v^(z<<1|y>>>31),a[2]^=c,a[3]^=d,a[12]^=c,a[13]^=d,a[22]^=c,a[23]^=d,a[32]^= this.start;h<c&&d<g;++h)m=a.charCodeAt(h),128>m?e[d>>2]|=m<<p[d++&3]:(2048>m?e[d>>2]|=(192|m>>6)<<p[d++&3]:(55296>m||57344<=m?e[d>>2]|=(224|m>>12)<<p[d++&3]:(m=65536+((m&1023)<<10|a.charCodeAt(++h)&1023),e[d>>2]|=(240|m>>18)<<p[d++&3],e[d>>2]|=(128|m>>12&63)<<p[d++&3]),e[d>>2]|=(128|m>>6&63)<<p[d++&3]),e[d>>2]|=(128|m&63)<<p[d++&3]);this.lastByteIndex=d;if(d>=g){this.start=d-g;this.block=e[k];for(d=0;d<k;++d)f[d]^=e[d];v(f);this.reset=!0}else this.start=d}return this};n.prototype.finalize=function(){var a=
c,a[33]^=d,a[42]^=c,a[43]^=d,c=w^(A<<1|B>>>31),d=x^(B<<1|A>>>31),a[4]^=c,a[5]^=d,a[14]^=c,a[15]^=d,a[24]^=c,a[25]^=d,a[34]^=c,a[35]^=d,a[44]^=c,a[45]^=d,c=y^(C<<1|D>>>31),d=z^(D<<1|C>>>31),a[6]^=c,a[7]^=d,a[16]^=c,a[17]^=d,a[26]^=c,a[27]^=d,a[36]^=c,a[37]^=d,a[46]^=c,a[47]^=d,c=A^(u<<1|v>>>31),d=B^(v<<1|u>>>31),a[8]^=c,a[9]^=d,a[18]^=c,a[19]^=d,a[28]^=c,a[29]^=d,a[38]^=c,a[39]^=d,a[48]^=c,a[49]^=d,c=a[0],d=a[1],ba=a[11]<<4|a[10]>>>28,ca=a[10]<<4|a[11]>>>28,J=a[20]<<3|a[21]>>>29,K=a[21]<<3|a[20]>>> this.blocks,b=this.lastByteIndex,c=this.blockCount,e=this.s;a[b>>2]|=this.padding[b&3];if(this.lastByteIndex==this.byteCount)for(a[0]=a[c],b=1;b<c+1;++b)a[b]=0;a[c-1]|=2147483648;for(b=0;b<c;++b)e[b]^=a[b];v(e)};n.prototype.toString=n.prototype.hex=function(){this.finalize();for(var a=this.blockCount,b=this.s,c=this.outputBlocks,e=this.extraBytes,g=0,k=0,h="",f;k<c;){for(g=0;g<a&&k<c;++g,++k)f=b[g],h+=l[f>>4&15]+l[f&15]+l[f>>12&15]+l[f>>8&15]+l[f>>20&15]+l[f>>16&15]+l[f>>28&15]+l[f>>24&15];0==k%a&&
29,pa=a[31]<<9|a[30]>>>23,qa=a[30]<<9|a[31]>>>23,X=a[40]<<18|a[41]>>>14,Y=a[41]<<18|a[40]>>>14,P=a[2]<<1|a[3]>>>31,Q=a[3]<<1|a[2]>>>31,u=a[13]<<12|a[12]>>>20,v=a[12]<<12|a[13]>>>20,da=a[22]<<10|a[23]>>>22,ea=a[23]<<10|a[22]>>>22,L=a[33]<<13|a[32]>>>19,M=a[32]<<13|a[33]>>>19,ra=a[42]<<2|a[43]>>>30,sa=a[43]<<2|a[42]>>>30,ja=a[5]<<30|a[4]>>>2,ka=a[4]<<30|a[5]>>>2,R=a[14]<<6|a[15]>>>26,S=a[15]<<6|a[14]>>>26,w=a[25]<<11|a[24]>>>21,x=a[24]<<11|a[25]>>>21,fa=a[34]<<15|a[35]>>>17,ga=a[35]<<15|a[34]>>>17, (v(b),g=0)}e&&(f=b[g],0<e&&(h+=l[f>>4&15]+l[f&15]),1<e&&(h+=l[f>>12&15]+l[f>>8&15]),2<e&&(h+=l[f>>20&15]+l[f>>16&15]));return h};n.prototype.buffer=function(){this.finalize();var a=this.blockCount,b=this.s,c=this.outputBlocks,e=this.extraBytes,g=0,k=0,h=this.outputBits>>3,f;f=e?new ArrayBuffer(c+1<<2):new ArrayBuffer(h);for(var d=new Uint32Array(f);k<c;){for(g=0;g<a&&k<c;++g,++k)d[k]=b[g];0==k%a&&v(b)}e&&(d[g]=b[g],f=f.slice(0,h));return f};n.prototype.digest=n.prototype.array=function(){this.finalize();
N=a[45]<<29|a[44]>>>3,O=a[44]<<29|a[45]>>>3,C=a[6]<<28|a[7]>>>4,D=a[7]<<28|a[6]>>>4,la=a[17]<<23|a[16]>>>9,ma=a[16]<<23|a[17]>>>9,T=a[26]<<25|a[27]>>>7,U=a[27]<<25|a[26]>>>7,y=a[36]<<21|a[37]>>>11,z=a[37]<<21|a[36]>>>11,ha=a[47]<<24|a[46]>>>8,ia=a[46]<<24|a[47]>>>8,Z=a[8]<<27|a[9]>>>5,aa=a[9]<<27|a[8]>>>5,H=a[18]<<20|a[19]>>>12,I=a[19]<<20|a[18]>>>12,na=a[29]<<7|a[28]>>>25,oa=a[28]<<7|a[29]>>>25,V=a[38]<<8|a[39]>>>24,W=a[39]<<8|a[38]>>>24,A=a[48]<<14|a[49]>>>18,B=a[49]<<14|a[48]>>>18,a[0]=c^~u&w, for(var a=this.blockCount,b=this.s,c=this.outputBlocks,e=this.extraBytes,g=0,k=0,h=[],f,d;k<c;){for(g=0;g<a&&k<c;++g,++k)f=k<<2,d=b[g],h[f]=d&255,h[f+1]=d>>8&255,h[f+2]=d>>16&255,h[f+3]=d>>24&255;0==k%a&&v(b)}e&&(f=k<<2,d=b[g],0<e&&(h[f]=d&255),1<e&&(h[f+1]=d>>8&255),2<e&&(h[f+2]=d>>16&255));return h};var v=function(a){var b,c,e,g,k,h,f,d,m,l,n,p,q,r,t,u,v,w,x,y,z,A,B,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;for(e=0;48>e;e+=2)g=a[0]^a[10]^a[20]^a[30]^a[40],k=a[1]^a[11]^a[21]^a[31]^
a[1]=d^~v&x,a[10]=C^~H&J,a[11]=D^~I&K,a[20]=P^~R&T,a[21]=Q^~S&U,a[30]=Z^~ba&da,a[31]=aa^~ca&ea,a[40]=ja^~la&na,a[41]=ka^~ma&oa,a[2]=u^~w&y,a[3]=v^~x&z,a[12]=H^~J&L,a[13]=I^~K&M,a[22]=R^~T&V,a[23]=S^~U&W,a[32]=ba^~da&fa,a[33]=ca^~ea&ga,a[42]=la^~na&pa,a[43]=ma^~oa&qa,a[4]=w^~y&A,a[5]=x^~z&B,a[14]=J^~L&N,a[15]=K^~M&O,a[24]=T^~V&X,a[25]=U^~W&Y,a[34]=da^~fa&ha,a[35]=ea^~ga&ia,a[44]=na^~pa&ra,a[45]=oa^~qa&sa,a[6]=y^~A&c,a[7]=z^~B&d,a[16]=L^~N&C,a[17]=M^~O&D,a[26]=V^~X&P,a[27]=W^~Y&Q,a[36]=fa^~ha&Z,a[37]= a[41],h=a[2]^a[12]^a[22]^a[32]^a[42],f=a[3]^a[13]^a[23]^a[33]^a[43],d=a[4]^a[14]^a[24]^a[34]^a[44],m=a[5]^a[15]^a[25]^a[35]^a[45],l=a[6]^a[16]^a[26]^a[36]^a[46],n=a[7]^a[17]^a[27]^a[37]^a[47],p=a[8]^a[18]^a[28]^a[38]^a[48],q=a[9]^a[19]^a[29]^a[39]^a[49],b=p^(h<<1|f>>>31),c=q^(f<<1|h>>>31),a[0]^=b,a[1]^=c,a[10]^=b,a[11]^=c,a[20]^=b,a[21]^=c,a[30]^=b,a[31]^=c,a[40]^=b,a[41]^=c,b=g^(d<<1|m>>>31),c=k^(m<<1|d>>>31),a[2]^=b,a[3]^=c,a[12]^=b,a[13]^=c,a[22]^=b,a[23]^=c,a[32]^=b,a[33]^=c,a[42]^=b,a[43]^=c,
ga^~ia&aa,a[46]=pa^~ra&ja,a[47]=qa^~sa&ka,a[8]=A^~c&u,a[9]=B^~d&v,a[18]=N^~C&H,a[19]=O^~D&I,a[28]=X^~P&R,a[29]=Y^~Q&S,a[38]=ha^~Z&ba,a[39]=ia^~aa&ca,a[48]=ra^~ja&la,a[49]=sa^~ka&ma,a[0]^=ya[b],a[1]^=ya[b+1]}while(!F);k=parseInt(f/32);l=parseInt(f%32/8);if("buffer"==q){f/=8;q=l?new ArrayBuffer(4*(k+1)):new ArrayBuffer(f);m=new Uint32Array(q);for(b=0;b<k;++b)m[b]=a[b];l&&(m[b]=a[b],q=q.slice(0,f));return q}f="";for(b=0;b<k;++b)c=a[b],f+=g[c>>4&15]+g[c&15]+g[c>>12&15]+g[c>>8&15]+g[c>>20&15]+g[c>>16& b=h^(l<<1|n>>>31),c=f^(n<<1|l>>>31),a[4]^=b,a[5]^=c,a[14]^=b,a[15]^=c,a[24]^=b,a[25]^=c,a[34]^=b,a[35]^=c,a[44]^=b,a[45]^=c,b=d^(p<<1|q>>>31),c=m^(q<<1|p>>>31),a[6]^=b,a[7]^=c,a[16]^=b,a[17]^=c,a[26]^=b,a[27]^=c,a[36]^=b,a[37]^=c,a[46]^=b,a[47]^=c,b=l^(g<<1|k>>>31),c=n^(k<<1|g>>>31),a[8]^=b,a[9]^=c,a[18]^=b,a[19]^=c,a[28]^=b,a[29]^=c,a[38]^=b,a[39]^=c,a[48]^=b,a[49]^=c,b=a[0],c=a[1],M=a[11]<<4|a[10]>>>28,N=a[10]<<4|a[11]>>>28,u=a[20]<<3|a[21]>>>29,v=a[21]<<3|a[20]>>>29,aa=a[31]<<9|a[30]>>>23,ba=a[30]<<
15]+g[c>>28&15]+g[c>>24&15];l&&(c=a[b],0<l&&(f+=g[c>>4&15]+g[c&15]),1<l&&(f+=g[c>>12&15]+g[c>>8&15]),2<l&&(f+=g[c>>20&15]+g[c>>16&15]));return f};if(!E.JS_SHA3_TEST&&xa)module.exports=F;else if(E)for(var Ca in F)E[Ca]=F[Ca]})(this); 9|a[31]>>>23,I=a[40]<<18|a[41]>>>14,J=a[41]<<18|a[40]>>>14,A=a[2]<<1|a[3]>>>31,B=a[3]<<1|a[2]>>>31,g=a[13]<<12|a[12]>>>20,k=a[12]<<12|a[13]>>>20,O=a[22]<<10|a[23]>>>22,P=a[23]<<10|a[22]>>>22,w=a[33]<<13|a[32]>>>19,x=a[32]<<13|a[33]>>>19,ca=a[42]<<2|a[43]>>>30,da=a[43]<<2|a[42]>>>30,U=a[5]<<30|a[4]>>>2,V=a[4]<<30|a[5]>>>2,C=a[14]<<6|a[15]>>>26,D=a[15]<<6|a[14]>>>26,h=a[25]<<11|a[24]>>>21,f=a[24]<<11|a[25]>>>21,Q=a[34]<<15|a[35]>>>17,R=a[35]<<15|a[34]>>>17,y=a[45]<<29|a[44]>>>3,z=a[44]<<29|a[45]>>>
3,p=a[6]<<28|a[7]>>>4,q=a[7]<<28|a[6]>>>4,W=a[17]<<23|a[16]>>>9,X=a[16]<<23|a[17]>>>9,E=a[26]<<25|a[27]>>>7,F=a[27]<<25|a[26]>>>7,d=a[36]<<21|a[37]>>>11,m=a[37]<<21|a[36]>>>11,S=a[47]<<24|a[46]>>>8,T=a[46]<<24|a[47]>>>8,K=a[8]<<27|a[9]>>>5,L=a[9]<<27|a[8]>>>5,r=a[18]<<20|a[19]>>>12,t=a[19]<<20|a[18]>>>12,Y=a[29]<<7|a[28]>>>25,Z=a[28]<<7|a[29]>>>25,G=a[38]<<8|a[39]>>>24,H=a[39]<<8|a[38]>>>24,l=a[48]<<14|a[49]>>>18,n=a[49]<<14|a[48]>>>18,a[0]=b^~g&h,a[1]=c^~k&f,a[10]=p^~r&u,a[11]=q^~t&v,a[20]=A^~C&
E,a[21]=B^~D&F,a[30]=K^~M&O,a[31]=L^~N&P,a[40]=U^~W&Y,a[41]=V^~X&Z,a[2]=g^~h&d,a[3]=k^~f&m,a[12]=r^~u&w,a[13]=t^~v&x,a[22]=C^~E&G,a[23]=D^~F&H,a[32]=M^~O&Q,a[33]=N^~P&R,a[42]=W^~Y&aa,a[43]=X^~Z&ba,a[4]=h^~d&l,a[5]=f^~m&n,a[14]=u^~w&y,a[15]=v^~x&z,a[24]=E^~G&I,a[25]=F^~H&J,a[34]=O^~Q&S,a[35]=P^~R&T,a[44]=Y^~aa&ca,a[45]=Z^~ba&da,a[6]=d^~l&b,a[7]=m^~n&c,a[16]=w^~y&p,a[17]=x^~z&q,a[26]=G^~I&A,a[27]=H^~J&B,a[36]=Q^~S&K,a[37]=R^~T&L,a[46]=aa^~ca&U,a[47]=ba^~da&V,a[8]=l^~b&g,a[9]=n^~c&k,a[18]=y^~p&r,a[19]=
z^~q&t,a[28]=I^~A&C,a[29]=J^~B&D,a[38]=S^~K&M,a[39]=T^~L&N,a[48]=ca^~U&W,a[49]=da^~V&X,a[0]^=ha[e],a[1]^=ha[e+1]};if(!r.JS_SHA3_TEST&&ga)module.exports=x;else if(r)for(var ka in x)r[ka]=x[ka]})(this);
+3 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "js-sha3", "name": "js-sha3",
"version": "0.4.1", "version": "0.5.2",
"description": "A simple SHA-3 / Keccak / Shake hash function for JavaScript supports UTF-8 encoding.", "description": "A simple SHA-3 / Keccak / Shake hash function for JavaScript supports UTF-8 encoding.",
"main": "src/sha3.js", "main": "src/sha3.js",
"devDependencies": { "devDependencies": {
@@ -19,13 +19,14 @@
"keywords": [ "keywords": [
"sha3", "sha3",
"keccak", "keccak",
"shake",
"hash", "hash",
"encryption", "encryption",
"cryptography", "cryptography",
"HMAC" "HMAC"
], ],
"license": "MIT", "license": "MIT",
"author": "emn178 <emn178@gmail.com>", "author": "Chen, Yi-Cyuan <emn178@gmail.com>",
"homepage": "https://github.com/emn178/js-sha3", "homepage": "https://github.com/emn178/js-sha3",
"bugs": { "bugs": {
"url": "https://github.com/emn178/js-sha3/issues" "url": "https://github.com/emn178/js-sha3/issues"
+184 -125
View File
@@ -1,21 +1,17 @@
/* /**
* js-sha3 v0.4.1 * [js-sha3]{@link https://github.com/emn178/js-sha3}
* https://github.com/emn178/js-sha3
* *
* Copyright 2015, emn178@gmail.com * @version 0.5.2
* * @author Chen, Yi-Cyuan [emn178@gmail.com]
* Licensed under the MIT license: * @copyright Chen, Yi-Cyuan 2015-2016
* http://www.opensource.org/licenses/MIT * @license MIT
*/ */
;(function(root, undefined) { (function (root) {
'use strict'; 'use strict';
var NODE_JS = typeof(module) != 'undefined'; var NODE_JS = typeof(module) != 'undefined';
if(NODE_JS) { if (NODE_JS) {
root = global; root = global;
if(root.JS_SHA3_TEST) {
root.navigator = { userAgent: 'Chrome'};
}
} }
var HEX_CHARS = '0123456789abcdef'.split(''); var HEX_CHARS = '0123456789abcdef'.split('');
var SHAKE_PADDING = [31, 7936, 2031616, 520093696]; var SHAKE_PADDING = [31, 7936, 2031616, 520093696];
@@ -31,69 +27,106 @@
var SHAKE_BITS = [128, 256]; var SHAKE_BITS = [128, 256];
var OUTPUT_TYPES = ['hex', 'buffer', 'array']; var OUTPUT_TYPES = ['hex', 'buffer', 'array'];
var createMethod = function(bits, padding, outputType) { var createOutputMethod = function (bits, padding, outputType) {
return function(message) { return function (message) {
return keccak(message, bits, padding, bits, outputType); return new Keccak(bits, padding, bits).update(message)[outputType]();
} }
}; };
var createShakeMethod = function(bits, padding, outputType) { var createShakeOutputMethod = function (bits, padding, outputType) {
return function(message, outputBits) { return function (message, outputBits) {
return keccak(message, bits, padding, outputBits, outputType); return new Keccak(bits, padding, outputBits).update(message)[outputType]();
} }
}; };
var createMethod = function (bits, padding) {
var method = createOutputMethod(bits, padding, 'hex');
method.create = function () {
return new Keccak(bits, padding, bits);
};
method.update = function (message) {
return method.create().update(message);
};
for (var i = 0;i < OUTPUT_TYPES.length;++i) {
var type = OUTPUT_TYPES[i];
method[type] = createOutputMethod(bits, padding, type);
}
return method;
};
var createShakeMethod = function (bits, padding) {
var method = createShakeOutputMethod(bits, padding, 'hex');
method.create = function (outputBits) {
return new Keccak(bits, padding, outputBits);
};
method.update = function (message, outputBits) {
return method.create(outputBits).update(message);
};
for (var i = 0;i < OUTPUT_TYPES.length;++i) {
var type = OUTPUT_TYPES[i];
method[type] = createShakeOutputMethod(bits, padding, type);
}
return method;
};
var algorithms = [ var algorithms = [
{name: 'keccak', padding: KECCAK_PADDING, bits: BITS, createMethod: createMethod}, {name: 'keccak', padding: KECCAK_PADDING, bits: BITS, createMethod: createMethod},
{name: 'sha3', padding: PADDING, bits: BITS, createMethod: createMethod}, {name: 'sha3', padding: PADDING, bits: BITS, createMethod: createMethod},
{name: 'shake', padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod} {name: 'shake', padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod}
]; ];
var blocks = [], s = [], methods = {}; var methods = {};
for(var i = 0;i < algorithms.length;++i) { for (var i = 0;i < algorithms.length;++i) {
var algorithm = algorithms[i]; var algorithm = algorithms[i];
var bits = algorithm.bits; var bits = algorithm.bits;
var createMethod = algorithm.createMethod; var createMethod = algorithm.createMethod;
for(var j = 0;j < bits.length;++j) { for (var j = 0;j < bits.length;++j) {
(function(algorithm, bits) { var method = algorithm.createMethod(bits[j], algorithm.padding);
var method = createMethod(bits, algorithm.padding, 'hex'); methods[algorithm.name +'_' + bits[j]] = method;
methods[algorithm.name +'_' + bits] = method;
for(var k = 0;k < OUTPUT_TYPES.length;++k) {
var type = OUTPUT_TYPES[k];
method[type] = createMethod(bits, algorithm.padding, type);
}
})(algorithm, bits[j]);
} }
} }
var keccak = function(message, bits, padding, outputBits, outputType) { function Keccak(bits, padding, outputBits) {
this.blocks = [];
this.s = [];
this.padding = padding;
this.outputBits = outputBits;
this.reset = true;
this.block = 0;
this.start = 0;
this.blockCount = (1600 - (bits << 1)) >> 5;
this.byteCount = this.blockCount << 2;
this.outputBlocks = outputBits >> 5;
this.extraBytes = (outputBits & 31) >> 3;
for (var i = 0;i < 50;++i) {
this.s[i] = 0;
}
};
Keccak.prototype.update = function (message) {
var notString = typeof(message) != 'string'; var notString = typeof(message) != 'string';
if(notString && message.constructor == root.ArrayBuffer) { if (notString && message.constructor == root.ArrayBuffer) {
message = new Uint8Array(message); message = new Uint8Array(message);
} }
var length = message.length, blocks = this.blocks, byteCount = this.byteCount,
blockCount = this.blockCount, index = 0, s = this.s, i, code;
var block, code, end = false, index = 0, start = 0, length = message.length, while (index < length) {
i, j, h; if (this.reset) {
var blockCount = (1600 - (bits << 1)) >> 5; this.reset = false;
var byteCount = blockCount << 2; blocks[0] = this.block;
for (i = 1;i < blockCount + 1;++i) {
for(i = 0;i < 50;++i) {
s[i] = 0;
}
block = 0;
do {
blocks[0] = block;
for(i = 1;i < blockCount + 1;++i) {
blocks[i] = 0; blocks[i] = 0;
} }
if(notString) { }
for (i = start;index < length && i < byteCount; ++index) { if (notString) {
for (i = this.start;index < length && i < byteCount; ++index) {
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3]; blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
} }
} else { } else {
for (i = start;index < length && i < byteCount; ++index) { for (i = this.start;index < length && i < byteCount; ++index) {
code = message.charCodeAt(index); code = message.charCodeAt(index);
if (code < 0x80) { if (code < 0x80) {
blocks[i >> 2] |= code << SHIFT[i++ & 3]; blocks[i >> 2] |= code << SHIFT[i++ & 3];
@@ -113,114 +146,141 @@
} }
} }
} }
start = i - byteCount; this.lastByteIndex = i;
if(index == length) { if (i >= byteCount) {
blocks[i >> 2] |= padding[i & 3]; this.start = i - byteCount;
++index; this.block = blocks[blockCount];
} for (i = 0;i < blockCount;++i) {
block = blocks[blockCount];
if(index > length && i < byteCount) {
blocks[blockCount - 1] |= 0x80000000;
end = true;
}
for(i = 0;i < blockCount;++i) {
s[i] ^= blocks[i]; s[i] ^= blocks[i];
} }
f(s);
this.reset = true;
} else {
this.start = i;
}
}
return this;
};
f(); Keccak.prototype.finalize = function () {
} while(!end); var blocks = this.blocks, i = this.lastByteIndex, blockCount = this.blockCount, s = this.s;
blocks[i >> 2] |= this.padding[i & 3];
if (this.lastByteIndex == this.byteCount) {
blocks[0] = blocks[blockCount];
for (i = 1;i < blockCount + 1;++i) {
blocks[i] = 0;
}
}
blocks[blockCount - 1] |= 0x80000000;
for (i = 0;i < blockCount;++i) {
s[i] ^= blocks[i];
}
f(s);
};
var outputBlocks = outputBits >> 5; Keccak.prototype.toString = Keccak.prototype.hex = function () {
var extraBytes = (outputBits & 31) >> 3; this.finalize();
j = 0, i = 0;
if(outputType == 'buffer') { var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,
var bytes = outputBits >> 3; extraBytes = this.extraBytes, i = 0, j = 0;
var hex = '', block;
while (j < outputBlocks) {
for (i = 0;i < blockCount && j < outputBlocks;++i, ++j) {
block = s[i];
hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F] +
HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F] +
HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F] +
HEX_CHARS[(block >> 28) & 0x0F] + HEX_CHARS[(block >> 24) & 0x0F];
}
if (j % blockCount == 0) {
f(s);
i = 0;
}
}
if (extraBytes) {
block = s[i];
if (extraBytes > 0) {
hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F];
}
if (extraBytes > 1) {
hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F];
}
if (extraBytes > 2) {
hex += HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F];
}
}
return hex;
};
Keccak.prototype.buffer = function () {
this.finalize();
var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,
extraBytes = this.extraBytes, i = 0, j = 0;
var bytes = this.outputBits >> 3;
var buffer; var buffer;
if(extraBytes) { if (extraBytes) {
buffer = new ArrayBuffer((outputBlocks + 1) << 2); buffer = new ArrayBuffer((outputBlocks + 1) << 2);
} else { } else {
buffer = new ArrayBuffer(bytes); buffer = new ArrayBuffer(bytes);
} }
var array = new Uint32Array(buffer); var array = new Uint32Array(buffer);
while(j < outputBlocks) { while (j < outputBlocks) {
for(i = 0;i < blockCount && j < outputBlocks;++i, ++j) { for (i = 0;i < blockCount && j < outputBlocks;++i, ++j) {
array[j] = s[i]; array[j] = s[i];
} }
if(j % blockCount == 0) { if (j % blockCount == 0) {
f(); f(s);
} }
} }
if(extraBytes) { if (extraBytes) {
array[i] = s[i]; array[i] = s[i];
buffer = buffer.slice(0, bytes); buffer = buffer.slice(0, bytes);
} }
return buffer; return buffer;
} else if(outputType == 'array') { };
var array = [], offset;
while(j < outputBlocks) { Keccak.prototype.digest = Keccak.prototype.array = function () {
for(i = 0;i < blockCount && j < outputBlocks;++i, ++j) { this.finalize();
var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,
extraBytes = this.extraBytes, i = 0, j = 0;
var array = [], offset, block;
while (j < outputBlocks) {
for (i = 0;i < blockCount && j < outputBlocks;++i, ++j) {
offset = j << 2; offset = j << 2;
h = s[i]; block = s[i];
array[offset] = h & 0xFF; array[offset] = block & 0xFF;
array[offset + 1] = (h >> 8) & 0xFF; array[offset + 1] = (block >> 8) & 0xFF;
array[offset + 2] = (h >> 16) & 0xFF; array[offset + 2] = (block >> 16) & 0xFF;
array[offset + 3] = (h >> 24) & 0xFF; array[offset + 3] = (block >> 24) & 0xFF;
} }
if(j % blockCount == 0) { if (j % blockCount == 0) {
f(); f(s);
} }
} }
if(extraBytes) { if (extraBytes) {
offset = j << 2; offset = j << 2;
h = s[i]; block = s[i];
if(extraBytes > 0) { if (extraBytes > 0) {
array[offset] = h & 0xFF; array[offset] = block & 0xFF;
} }
if(extraBytes > 1) { if (extraBytes > 1) {
array[offset + 1] = (h >> 8) & 0xFF; array[offset + 1] = (block >> 8) & 0xFF;
} }
if(extraBytes > 2) { if (extraBytes > 2) {
array[offset + 2] = (h >> 16) & 0xFF; array[offset + 2] = (block >> 16) & 0xFF;
} }
} }
return array; return array;
} else {
var hex = '';
while(j < outputBlocks) {
for(i = 0;i < blockCount && j < outputBlocks;++i, ++j) {
h = s[i];
hex += HEX_CHARS[(h >> 4) & 0x0F] + HEX_CHARS[h & 0x0F] +
HEX_CHARS[(h >> 12) & 0x0F] + HEX_CHARS[(h >> 8) & 0x0F] +
HEX_CHARS[(h >> 20) & 0x0F] + HEX_CHARS[(h >> 16) & 0x0F] +
HEX_CHARS[(h >> 28) & 0x0F] + HEX_CHARS[(h >> 24) & 0x0F];
}
if(j % blockCount == 0) {
f();
}
}
if(extraBytes) {
h = s[i];
if(extraBytes > 0) {
hex += HEX_CHARS[(h >> 4) & 0x0F] + HEX_CHARS[h & 0x0F];
}
if(extraBytes > 1) {
hex += HEX_CHARS[(h >> 12) & 0x0F] + HEX_CHARS[(h >> 8) & 0x0F];
}
if(extraBytes > 2) {
hex += HEX_CHARS[(h >> 20) & 0x0F] + HEX_CHARS[(h >> 16) & 0x0F];
}
}
return hex;
}
}; };
var f = function() { var f = function (s) {
var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, var h, l, n, 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, 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, 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; b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49;
for(n = 0; n < 48; n += 2) { for (n = 0; n < 48; n += 2) {
c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40]; c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];
c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41]; c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];
c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42]; c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];
@@ -400,11 +460,10 @@
} }
} }
if (!root.JS_SHA3_TEST && NODE_JS) {
if(!root.JS_SHA3_TEST && NODE_JS) {
module.exports = methods; module.exports = methods;
} else if(root) { } else if (root) {
for(var key in methods) { for (var key in methods) {
root[key] = methods[key]; root[key] = methods[key];
} }
} }
-1
View File
@@ -14,7 +14,6 @@
mocha.setup('bdd'); mocha.setup('bdd');
</script> </script>
<script src="test.js"></script> <script src="test.js"></script>
<script src="test-keccak.js"></script>
<script src="test-shake.js"></script> <script src="test-shake.js"></script>
<script> <script>
mocha.checkLeaks(); mocha.checkLeaks();
+16 -17
View File
@@ -1,21 +1,21 @@
expect = require('expect.js'); expect = require('expect.js');
keccak_512 = require('../src/sha3.js').keccak_512; var sha3 = require('../src/sha3.js');
keccak_384 = require('../src/sha3.js').keccak_384; keccak_512 = sha3.keccak_512;
keccak_256 = require('../src/sha3.js').keccak_256; keccak_384 = sha3.keccak_384;
keccak_224 = require('../src/sha3.js').keccak_224; keccak_256 = sha3.keccak_256;
sha3_512 = require('../src/sha3.js').sha3_512; keccak_224 = sha3.keccak_224;
sha3_384 = require('../src/sha3.js').sha3_384; sha3_512 = sha3.sha3_512;
sha3_256 = require('../src/sha3.js').sha3_256; sha3_384 = sha3.sha3_384;
sha3_224 = require('../src/sha3.js').sha3_224; sha3_256 = sha3.sha3_256;
shake_128 = require('../src/sha3.js').shake_128; sha3_224 = sha3.sha3_224;
shake_256 = require('../src/sha3.js').shake_256; shake_128 = sha3.shake_128;
require('./test-keccak.js'); shake_256 = sha3.shake_256;
require('./test.js'); require('./test.js');
require('./test-shake.js');
delete require.cache[require.resolve('../src/sha3.js')] delete require.cache[require.resolve('../src/sha3.js')];
delete require.cache[require.resolve('./test.js')] delete require.cache[require.resolve('./test.js')];
delete require.cache[require.resolve('./test-keccak.js')] delete require.cache[require.resolve('./test-shake.js')];
delete require.cache[require.resolve('./test-shake.js')]
sha3_512 = null; sha3_512 = null;
sha3_384 = null; sha3_384 = null;
sha3_256 = null; sha3_256 = null;
@@ -29,6 +29,5 @@ shake_256 = null;
JS_SHA3_TEST = true; JS_SHA3_TEST = true;
require('../src/sha3.js'); require('../src/sha3.js');
require('./test-keccak.js');
require('./test-shake.js');
require('./test.js'); require('./test.js');
require('./test-shake.js');
-180
View File
@@ -1,180 +0,0 @@
(function(keccak_512, keccak_384, keccak_256, keccak_224) {
describe('keccak_512', function() {
context('when ascii', function() {
context('and less than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_512('')).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
expect(keccak_512('The quick brown fox jumps over the lazy dog')).to.be('d135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609');
expect(keccak_512('The quick brown fox jumps over the lazy dog.')).to.be('ab7192d2b11f51c7dd744e7b3441febf397ca07bf812cceae122ca4ded6387889064f8db9230f173f6d1ab6e24b6e50f065b039f799f5592360a6558eb52d760');
});
});
context('and more than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_512('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('10dcbf6389980ce3594547939bbc685363d28adbd6a05bc4abd7fc62e7693a1f6e33569fed5a380bfecb56ae811d25939b95823f39bb0f16a08740629d066d43');
});
});
});
context('when UTF8', function() {
context('and less than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_512('中文')).to.be('2f6a1bd50562230229af34b0ccf46b8754b89d23ae2c5bf7840b4acfcef86f87395edc0a00b2bfef53bafebe3b79de2e3e01cbd8169ddbb08bde888dcc893524');
expect(keccak_512('aécio')).to.be('c452ec93e83d4795fcab62a76eed0d88f2231a995ce108ac8f130246f87c4a11cb18a2c1a688a5695906a6f863e71bbe8997c6610319ab97f12d2e5bf0afe458');
expect(keccak_512('𠜎')).to.be('8a2d72022ce19d989dbe6a0017faccbf5dc2e22c162d1c5eb168864d32dd1a71e1b4782652c148cf6ca47b77a72c96fff682e72bdfef0566d4b7cca3c9ccc59d');
});
});
context('and more than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_512('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('6a67c28aa1946ca1be8382b861aac4aaf20052f495db9b6902d13adfa603eaba5d169f8896b86d461b2949283eb98e503c3f0640188ea7d6731526fc06568d37');
expect(keccak_512('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('d04ff5b0e85e9968be2a4d4e133c15c7ccee7497198bb651599a97d11d00bca6048d329ab75aa454566cd532648fa1cb4551985d9d645de9fa43a311a9ee8e4d');
});
});
});
context('when special length', function() {
it('should be equal', function() {
expect(keccak_512('012345678901234567890123456789012345678901234567890123456789012345678901')).to.be('90b1d032c3bf06dcc78a46fe52054bab1250600224bfc6dfbfb40a7877c55e89bb982799a2edf198568a4166f6736678b45e76b12fac813cfdf0a76714e5eae8');
expect(keccak_512('01234567890123456789012345678901234567890123456789012345678901234567890')).to.be('3173e7abc754a0b2909410d78986428a9183e996864af02f421d273d9fa1b4e4a5b14e2998b20767712f53a01ff8f6ae2c3e71e51e2c0f24257b03e6da09eb77');
});
});
context('when Array', function() {
it('should be equal', function() {
expect(keccak_512([])).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
expect(keccak_512([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103])).to.be('d135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609');
});
});
context('when Uint8Array', function() {
it('should be equal', function() {
expect(keccak_512(new Uint8Array([]))).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
expect(keccak_512(new Uint8Array([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103]))).to.be('d135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609');
});
});
context('when ArrayBuffer', function() {
it('should be equal', function() {
expect(keccak_512(new ArrayBuffer(0))).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
});
});
context('when output ArrayBuffer', function() {
it('should be equal', function() {
expect(keccak_512.buffer('').toHexString()).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
});
});
context('when output Array', function() {
it('should be equal', function() {
expect(keccak_512.array('').toHexString()).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
});
});
});
describe('keccak_384', function() {
context('when ascii', function() {
context('and less than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_384('')).to.be('2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff');
expect(keccak_384('The quick brown fox jumps over the lazy dog')).to.be('283990fa9d5fb731d786c5bbee94ea4db4910f18c62c03d173fc0a5e494422e8a0b3da7574dae7fa0baf005e504063b3');
expect(keccak_384('The quick brown fox jumps over the lazy dog.')).to.be('9ad8e17325408eddb6edee6147f13856ad819bb7532668b605a24a2d958f88bd5c169e56dc4b2f89ffd325f6006d820b');
});
});
context('and more than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_384('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('e7ec8976b4d96e43f50ae8ecdcf2d97a56236e6406e8dd00efd0d9abe885659db58a2f4b138a4ecfb1bd0052f6569516');
});
});
});
context('when UTF8', function() {
context('and less than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_384('中文')).to.be('743f64bb7544c6ed923be4741b738dde18b7cee384a3a09c4e01acaaac9f19222cdee137702bd3aa05dc198373d87d6c');
expect(keccak_384('aécio')).to.be('08990555e131af8597687614309da4c5053ce866f348544da0a0c2c78c2cc79680ebb57cfbe238286e78ea133a037897');
expect(keccak_384('𠜎')).to.be('2a80f59abf3111f38a35a3daa25123b495f90e9736bd300e35911d19abdd8806498c581333f198ccbbf2252b57c2925d');
});
});
context('and more than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_384('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('a3b043a2f69e4326a05d478fa4c8aa2bd7612453d775af37665a0b96ef2207cdc74c50cdba1629796a5136fe77300b05');
expect(keccak_384('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('66414c090cc3fe9c396d313cbaa100aefd335e851838b29382568b7f57357ada7c54b8fa8c17f859945bba88b2c2e332');
});
});
});
});
describe('keccak_256', function() {
context('when ascii', function() {
context('and less than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_256('')).to.be('c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470');
expect(keccak_256('The quick brown fox jumps over the lazy dog')).to.be('4d741b6f1eb29cb2a9b9911c82f56fa8d73b04959d3d9d222895df6c0b28aa15');
expect(keccak_256('The quick brown fox jumps over the lazy dog.')).to.be('578951e24efd62a3d63a86f7cd19aaa53c898fe287d2552133220370240b572d');
});
});
context('and more than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_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('af20018353ffb50d507f1555580f5272eca7fdab4f8295db4b1a9ad832c93f6d');
});
});
});
context('when UTF8', function() {
context('and less than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_256('中文')).to.be('70a2b6579047f0a977fcb5e9120a4e07067bea9abb6916fbc2d13ffb9a4e4eee');
expect(keccak_256('aécio')).to.be('d7d569202f04daf90432810d6163112b2695d7820da979327ebd894efb0276dc');
expect(keccak_256('𠜎')).to.be('16a7cc7a58444cbf7e939611910ddc82e7cba65a99d3e8e08cfcda53180a2180');
});
});
context('and more than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_256('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('d1021d2d4c5c7e88098c40f422af68493b4b64c913cbd68220bf5e6127c37a88');
expect(keccak_256('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('ffabf9bba2127c4928d360c9905cb4911f0ec21b9c3b89f3b242bccc68389e36');
});
});
});
});
describe('keccak_224', function() {
context('when ascii', function() {
context('and less than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_224('')).to.be('f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd');
expect(keccak_224('The quick brown fox jumps over the lazy dog')).to.be('310aee6b30c47350576ac2873fa89fd190cdc488442f3ef654cf23fe');
expect(keccak_224('The quick brown fox jumps over the lazy dog.')).to.be('c59d4eaeac728671c635ff645014e2afa935bebffdb5fbd207ffdeab');
});
});
context('and more than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_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('8dd58b706e3a08ec4f1f202af39295b38c355a39b23308ade7218a21');
});
});
});
context('when UTF8', function() {
context('and less than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_224('中文')).to.be('7bc2a0b6e7e0a055a61e4f731e2944b560f41ff98967dcbf4bbf77a5');
expect(keccak_224('aécio')).to.be('66f3db76bf8cb35726cb278bac412d187c3484ab2083dc50ef5ffb55');
expect(keccak_224('𠜎')).to.be('3bfa94845726f4cd5cf17d19b5eacac17b3694790e13a76d5c81c7c2');
});
});
context('and more than 128 bytes', function() {
it('should be equal', function() {
expect(keccak_224('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('d59eef8f394ef7d96967bb0bde578785c033f7f0a21913d6ba41ed1b');
expect(keccak_224('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('27123a2a3860d1041d4769778c4b078732bf4300f7e1c56536ab2644');
});
});
});
});
})(keccak_512, keccak_384, keccak_256, keccak_224);
+64 -41
View File
@@ -1,38 +1,86 @@
(function(shake_256, shake_128) { (function (shake_256, shake_128) {
describe('shake_128', function() { describe('#shake_128', function () {
context('with 256 output', function() { context('with 256 output', function () {
it('should be equal', function() { it('should be equal', function () {
expect(shake_128('', 256)).to.be('7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26'); expect(shake_128('', 256)).to.be('7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26');
expect(shake_128('The quick brown fox jumps over the lazy dog', 256)).to.be('f4202e3c5852f9182a0430fd8144f0a74b95e7417ecae17db0f8cfeed0e3e66e'); expect(shake_128('The quick brown fox jumps over the lazy dog', 256)).to.be('f4202e3c5852f9182a0430fd8144f0a74b95e7417ecae17db0f8cfeed0e3e66e');
expect(shake_128('The quick brown fox jumps over the lazy dof', 256)).to.be('853f4538be0db9621a6cea659a06c1107b1f83f02b13d18297bd39d7411cf10c'); expect(shake_128('The quick brown fox jumps over the lazy dof', 256)).to.be('853f4538be0db9621a6cea659a06c1107b1f83f02b13d18297bd39d7411cf10c');
}); });
}); });
context('with 8 output', function() { context('with 8 output', function () {
it('should be equal', function() { it('should be equal', function () {
expect(shake_128('', 8)).to.be('7f'); expect(shake_128('', 8)).to.be('7f');
expect(shake_128('The quick brown fox jumps over the lazy dog', 8)).to.be('f4'); expect(shake_128('The quick brown fox jumps over the lazy dog', 8)).to.be('f4');
expect(shake_128('The quick brown fox jumps over the lazy dof', 8)).to.be('85'); expect(shake_128('The quick brown fox jumps over the lazy dof', 8)).to.be('85');
}); });
}); });
context('with more output', function() { context('with 1368 output', function () {
it('should be equal', function() { it('should be equal', function () {
expect(shake_128('', 16)).to.be('7f9c'); expect(shake_128('AAA', 1368)).to.be('15e0fe495a05b74f9fd3eaa8a898a623488220dcbf9ba2f12d23d278b7cecfa4a5e4b8d0fccb0fdbc9e51cd0b4344a32a83f0ba40a514a7b86a77c854c61b836192849da9214c43c4f8bc09ec7a76af92b2fc56e4952024be65b1a47835e0bc014733b24d0e31197ca648f831caebbfd8a5b237ae6bdc9d6cc803a2c5e57dd9346eecf972bd85450f18a413dc6239982e1eb6e0c6df856385c9597d0320edb40b6fe60a74f07524015ad36');
expect(shake_128('', 24)).to.be('7f9c2b'); expect(shake_128('AAA', 1376)).to.be('15e0fe495a05b74f9fd3eaa8a898a623488220dcbf9ba2f12d23d278b7cecfa4a5e4b8d0fccb0fdbc9e51cd0b4344a32a83f0ba40a514a7b86a77c854c61b836192849da9214c43c4f8bc09ec7a76af92b2fc56e4952024be65b1a47835e0bc014733b24d0e31197ca648f831caebbfd8a5b237ae6bdc9d6cc803a2c5e57dd9346eecf972bd85450f18a413dc6239982e1eb6e0c6df856385c9597d0320edb40b6fe60a74f07524015ad36b6');
}); });
}); });
context('with 8 output ArrayBuffer', function() { context('with more output', function () {
it('should be equal', function() { it('should be equal', function () {
expect(shake_128('', 16)).to.be('7f9c');
expect(shake_128('', 24)).to.be('7f9c2b');
expect(shake_128.array('', 16)).to.eql([0x7f, 0x9c]);
expect(shake_128.array('', 24)).to.eql([0x7f, 0x9c, 0x2b]);
});
});
context('with 8 output ArrayBuffer', function () {
it('should be equal', function () {
expect(shake_128.buffer('', 8).toHexString()).to.be('7f'); expect(shake_128.buffer('', 8).toHexString()).to.be('7f');
expect(shake_128.buffer('The quick brown fox jumps over the lazy dog', 8).toHexString()).to.be('f4'); expect(shake_128.buffer('The quick brown fox jumps over the lazy dog', 8).toHexString()).to.be('f4');
expect(shake_128.buffer('The quick brown fox jumps over the lazy dof', 8).toHexString()).to.be('85'); expect(shake_128.buffer('The quick brown fox jumps over the lazy dof', 8).toHexString()).to.be('85');
}); });
}); });
context('with 4100 output ArrayBuffer', function() { context('#update', function () {
it('should be equal', function() { it('should be equal', function () {
expect(shake_128.update('', 256).hex()).to.be('7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26');
expect(shake_128.update('The quick brown fox ', 256).update('jumps over the lazy dog').hex()).to.be('f4202e3c5852f9182a0430fd8144f0a74b95e7417ecae17db0f8cfeed0e3e66e');
});
});
});
describe('#shake_256', function () {
context('with 512 output', function () {
it('should be equal', function () {
expect(shake_256('', 512)).to.be('46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be');
});
});
context('with 8 output', function () {
it('should be equal', function () {
expect(shake_256('', 8)).to.be('46');
});
});
context('with 1112 output', function () {
it('should be equal', function () {
expect(shake_256('AAA', 1112)).to.be('419614c8b247ee5e9f4a540f7aaa5ca5b44b119f47ab7f494c05095ae5a61ab6b62c84b8b27888813ce8a4d4dab3ed7617c6bab643aa01bb1b113e6d48c3e1eeb73e96f96ffaf12e0c36b190404982b856087acfcb467535e17152e5c15a4d62a18a15d8fe434b3a7274362b0d46b627df1e011a1d037e161d5b540df7ebadab351fb730904daa9a4f40fd');
expect(shake_256('AAA', 1120)).to.be('419614c8b247ee5e9f4a540f7aaa5ca5b44b119f47ab7f494c05095ae5a61ab6b62c84b8b27888813ce8a4d4dab3ed7617c6bab643aa01bb1b113e6d48c3e1eeb73e96f96ffaf12e0c36b190404982b856087acfcb467535e17152e5c15a4d62a18a15d8fe434b3a7274362b0d46b627df1e011a1d037e161d5b540df7ebadab351fb730904daa9a4f40fdb5');
});
});
context('with 4100 output', function () {
it('should be equal', function () {
// https://raw.githubusercontent.com/gvanas/KeccakCodePackage/master/TestVectors/ShortMsgKAT_SHAKE256.txt
// Len = 0, Msg = 00
expect(shake_256('', 4100)).to.be('46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be141e96616fb13957692cc7edd0b45ae3dc07223c8e92937bef84bc0eab862853349ec75546f58fb7c2775c38462c5010d846c185c15111e595522a6bcd16cf86f3d122109e3b1fdd943b6aec468a2d621a7c06c6a957c62b54dafc3be87567d677231395f6147293b68ceab7a9e0c58d864e8efde4e1b9a46cbe854713672f5caaae314ed9083dab4b099f8e300f01b8650f1f4b1d8fcf3f3cb53fb8e9eb2ea203bdc970f50ae55428a91f7f53ac266b28419c3778a15fd248d339ede785fb7f5a1aaa96d313eacc890936c173cdcd0fab882c45755feb3aed96d477ff96390bf9a66d1368b208e21f7c10d04a3dbd4e360633e5db4b602601c14cea737db3dcf722632cc77851cbdde2aaf0a33a07b373445df490cc8fc1e4160ff118378f11f0477de055a81a9eda57a4a2cfb0c83929d310912f729ec6cfa36c6ac6a75837143045d791cc85eff5b21932f23861bcf23a52b5da67eaf7baae0f5fb1369db78f3ac45f8c4ac5671d85735cdddb09d2b1e34a1fc066ff4a162cb263d6541274ae2fcc865f618abe27c124cd8b074ccd516301b91875824d09958f341ef274bdab0bae316339894304e35877b0c28a9b1fd166c796b9cc258a064a8f57e27f2a');
// Len = 2040
// Msg = 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1
expect(shake_256([0x3A,0x3A,0x81,0x9C,0x48,0xEF,0xDE,0x2A,0xD9,0x14,0xFB,0xF0,0x0E,0x18,0xAB,0x6B,0xC4,0xF1,0x45,0x13,0xAB,0x27,0xD0,0xC1,0x78,0xA1,0x88,0xB6,0x14,0x31,0xE7,0xF5,0x62,0x3C,0xB6,0x6B,0x23,0x34,0x67,0x75,0xD3,0x86,0xB5,0x0E,0x98,0x2C,0x49,0x3A,0xDB,0xBF,0xC5,0x4B,0x9A,0x3C,0xD3,0x83,0x38,0x23,0x36,0xA1,0xA0,0xB2,0x15,0x0A,0x15,0x35,0x8F,0x33,0x6D,0x03,0xAE,0x18,0xF6,0x66,0xC7,0x57,0x3D,0x55,0xC4,0xFD,0x18,0x1C,0x29,0xE6,0xCC,0xFD,0xE6,0x3E,0xA3,0x5F,0x0A,0xDF,0x58,0x85,0xCF,0xC0,0xA3,0xD8,0x4A,0x2B,0x2E,0x4D,0xD2,0x44,0x96,0xDB,0x78,0x9E,0x66,0x31,0x70,0xCE,0xF7,0x47,0x98,0xAA,0x1B,0xBC,0xD4,0x57,0x4E,0xA0,0xBB,0xA4,0x04,0x89,0xD7,0x64,0xB2,0xF8,0x3A,0xAD,0xC6,0x6B,0x14,0x8B,0x4A,0x0C,0xD9,0x52,0x46,0xC1,0x27,0xD5,0x87,0x1C,0x4F,0x11,0x41,0x86,0x90,0xA5,0xDD,0xF0,0x12,0x46,0xA0,0xC8,0x0A,0x43,0xC7,0x00,0x88,0xB6,0x18,0x36,0x39,0xDC,0xFD,0xA4,0x12,0x5B,0xD1,0x13,0xA8,0xF4,0x9E,0xE2,0x3E,0xD3,0x06,0xFA,0xAC,0x57,0x6C,0x3F,0xB0,0xC1,0xE2,0x56,0x67,0x1D,0x81,0x7F,0xC2,0x53,0x4A,0x52,0xF5,0xB4,0x39,0xF7,0x2E,0x42,0x4D,0xE3,0x76,0xF4,0xC5,0x65,0xCC,0xA8,0x23,0x07,0xDD,0x9E,0xF7,0x6D,0xA5,0xB7,0xC4,0xEB,0x7E,0x08,0x51,0x72,0xE3,0x28,0x80,0x7C,0x02,0xD0,0x11,0xFF,0xBF,0x33,0x78,0x53,0x78,0xD7,0x9D,0xC2,0x66,0xF6,0xA5,0xBE,0x6B,0xB0,0xE4,0xA9,0x2E,0xCE,0xEB,0xAE,0xB1], 4100)).to.be('8a5199b4a7e133e264a86202720655894d48cff344a928cf8347f48379cef347dfc5bcffab99b27b1f89aa2735e23d30088ffa03b9edb02b9635470ab9f1038985d55f9ca774572dd006470ea65145469609f9fa0831bf1ffd842dc24acade27bd9816e3b5bf2876cb112232a0eb4475f1dff9f5c713d9ffd4ccb89ae5607fe35731df06317949eef646e9591cf3be53add6b7dd2b6096e2b3fb06e662ec8b2d77422daad9463cd155204acdbd38e319613f39f99b6dfb35ca9365160066db19835888c2241ff9a731a4acbb5663727aac34a401247fbaa7499e7d5ee5b69d31025e63d04c35c798bca1262d5673a9cf0930b5ad89bd485599dc184528da4790f088ebd170b635d9581632d2ff90db79665ced430089af13c9f21f6d443a818064f17aec9e9c5457001fa8dc6afbadbe3138f388d89d0e6f22f66671255b210754ed63d81dce75ce8f189b534e6d6b3539aa51e837c42df9df59c71e6171cd4902fe1bdc73fb1775b5c754a1ed4ea7f3105fc543ee0418dad256f3f6118ea77114a16c15355b42877a1db2a7df0e155ae1d8670abcec3450f4e2eec9838f895423ef63d261138baaf5d9f104cb5a957aea06c0b9b8c78b0d441796dc0350ddeabb78a33b6f1f9e68ede3d1805c7b7e2cfd54e0fad62f0d8ca67a775dc4546af9096f2edb221db42843d65327861282dc946a0ba01a11863ab2d1dfd16e3973d4');
});
});
context('with 4100 output ArrayBuffer', function () {
it('should be equal', function () {
// https://raw.githubusercontent.com/gvanas/KeccakCodePackage/master/TestVectors/ShortMsgKAT_SHAKE256.txt // https://raw.githubusercontent.com/gvanas/KeccakCodePackage/master/TestVectors/ShortMsgKAT_SHAKE256.txt
// Len = 0, Msg = 00 // Len = 0, Msg = 00
expect(shake_256.buffer('', 4100).toHexString()).to.be('46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be141e96616fb13957692cc7edd0b45ae3dc07223c8e92937bef84bc0eab862853349ec75546f58fb7c2775c38462c5010d846c185c15111e595522a6bcd16cf86f3d122109e3b1fdd943b6aec468a2d621a7c06c6a957c62b54dafc3be87567d677231395f6147293b68ceab7a9e0c58d864e8efde4e1b9a46cbe854713672f5caaae314ed9083dab4b099f8e300f01b8650f1f4b1d8fcf3f3cb53fb8e9eb2ea203bdc970f50ae55428a91f7f53ac266b28419c3778a15fd248d339ede785fb7f5a1aaa96d313eacc890936c173cdcd0fab882c45755feb3aed96d477ff96390bf9a66d1368b208e21f7c10d04a3dbd4e360633e5db4b602601c14cea737db3dcf722632cc77851cbdde2aaf0a33a07b373445df490cc8fc1e4160ff118378f11f0477de055a81a9eda57a4a2cfb0c83929d310912f729ec6cfa36c6ac6a75837143045d791cc85eff5b21932f23861bcf23a52b5da67eaf7baae0f5fb1369db78f3ac45f8c4ac5671d85735cdddb09d2b1e34a1fc066ff4a162cb263d6541274ae2fcc865f618abe27c124cd8b074ccd516301b91875824d09958f341ef274bdab0bae316339894304e35877b0c28a9b1fd166c796b9cc258a064a8f57e27f2a'); expect(shake_256.buffer('', 4100).toHexString()).to.be('46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be141e96616fb13957692cc7edd0b45ae3dc07223c8e92937bef84bc0eab862853349ec75546f58fb7c2775c38462c5010d846c185c15111e595522a6bcd16cf86f3d122109e3b1fdd943b6aec468a2d621a7c06c6a957c62b54dafc3be87567d677231395f6147293b68ceab7a9e0c58d864e8efde4e1b9a46cbe854713672f5caaae314ed9083dab4b099f8e300f01b8650f1f4b1d8fcf3f3cb53fb8e9eb2ea203bdc970f50ae55428a91f7f53ac266b28419c3778a15fd248d339ede785fb7f5a1aaa96d313eacc890936c173cdcd0fab882c45755feb3aed96d477ff96390bf9a66d1368b208e21f7c10d04a3dbd4e360633e5db4b602601c14cea737db3dcf722632cc77851cbdde2aaf0a33a07b373445df490cc8fc1e4160ff118378f11f0477de055a81a9eda57a4a2cfb0c83929d310912f729ec6cfa36c6ac6a75837143045d791cc85eff5b21932f23861bcf23a52b5da67eaf7baae0f5fb1369db78f3ac45f8c4ac5671d85735cdddb09d2b1e34a1fc066ff4a162cb263d6541274ae2fcc865f618abe27c124cd8b074ccd516301b91875824d09958f341ef274bdab0bae316339894304e35877b0c28a9b1fd166c796b9cc258a064a8f57e27f2a');
@@ -43,8 +91,8 @@
}); });
}); });
context('with 4100 output Array', function() { context('with 4100 output Array', function () {
it('should be equal', function() { it('should be equal', function () {
// https://raw.githubusercontent.com/gvanas/KeccakCodePackage/master/TestVectors/ShortMsgKAT_SHAKE256.txt // https://raw.githubusercontent.com/gvanas/KeccakCodePackage/master/TestVectors/ShortMsgKAT_SHAKE256.txt
// Len = 0, Msg = 00 // Len = 0, Msg = 00
expect(shake_256.array('', 4100).toHexString()).to.be('46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be141e96616fb13957692cc7edd0b45ae3dc07223c8e92937bef84bc0eab862853349ec75546f58fb7c2775c38462c5010d846c185c15111e595522a6bcd16cf86f3d122109e3b1fdd943b6aec468a2d621a7c06c6a957c62b54dafc3be87567d677231395f6147293b68ceab7a9e0c58d864e8efde4e1b9a46cbe854713672f5caaae314ed9083dab4b099f8e300f01b8650f1f4b1d8fcf3f3cb53fb8e9eb2ea203bdc970f50ae55428a91f7f53ac266b28419c3778a15fd248d339ede785fb7f5a1aaa96d313eacc890936c173cdcd0fab882c45755feb3aed96d477ff96390bf9a66d1368b208e21f7c10d04a3dbd4e360633e5db4b602601c14cea737db3dcf722632cc77851cbdde2aaf0a33a07b373445df490cc8fc1e4160ff118378f11f0477de055a81a9eda57a4a2cfb0c83929d310912f729ec6cfa36c6ac6a75837143045d791cc85eff5b21932f23861bcf23a52b5da67eaf7baae0f5fb1369db78f3ac45f8c4ac5671d85735cdddb09d2b1e34a1fc066ff4a162cb263d6541274ae2fcc865f618abe27c124cd8b074ccd516301b91875824d09958f341ef274bdab0bae316339894304e35877b0c28a9b1fd166c796b9cc258a064a8f57e27f2a'); expect(shake_256.array('', 4100).toHexString()).to.be('46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be141e96616fb13957692cc7edd0b45ae3dc07223c8e92937bef84bc0eab862853349ec75546f58fb7c2775c38462c5010d846c185c15111e595522a6bcd16cf86f3d122109e3b1fdd943b6aec468a2d621a7c06c6a957c62b54dafc3be87567d677231395f6147293b68ceab7a9e0c58d864e8efde4e1b9a46cbe854713672f5caaae314ed9083dab4b099f8e300f01b8650f1f4b1d8fcf3f3cb53fb8e9eb2ea203bdc970f50ae55428a91f7f53ac266b28419c3778a15fd248d339ede785fb7f5a1aaa96d313eacc890936c173cdcd0fab882c45755feb3aed96d477ff96390bf9a66d1368b208e21f7c10d04a3dbd4e360633e5db4b602601c14cea737db3dcf722632cc77851cbdde2aaf0a33a07b373445df490cc8fc1e4160ff118378f11f0477de055a81a9eda57a4a2cfb0c83929d310912f729ec6cfa36c6ac6a75837143045d791cc85eff5b21932f23861bcf23a52b5da67eaf7baae0f5fb1369db78f3ac45f8c4ac5671d85735cdddb09d2b1e34a1fc066ff4a162cb263d6541274ae2fcc865f618abe27c124cd8b074ccd516301b91875824d09958f341ef274bdab0bae316339894304e35877b0c28a9b1fd166c796b9cc258a064a8f57e27f2a');
@@ -55,29 +103,4 @@
}); });
}); });
}); });
describe('shake_256', function() {
context('with 512 output', function() {
it('should be equal', function() {
expect(shake_256('', 512)).to.be('46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be');
});
});
context('with 8 output', function() {
it('should be equal', function() {
expect(shake_256('', 8)).to.be('46');
});
});
context('with 4100 output', function() {
it('should be equal', function() {
// https://raw.githubusercontent.com/gvanas/KeccakCodePackage/master/TestVectors/ShortMsgKAT_SHAKE256.txt
// Len = 0, Msg = 00
expect(shake_256('', 4100)).to.be('46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be141e96616fb13957692cc7edd0b45ae3dc07223c8e92937bef84bc0eab862853349ec75546f58fb7c2775c38462c5010d846c185c15111e595522a6bcd16cf86f3d122109e3b1fdd943b6aec468a2d621a7c06c6a957c62b54dafc3be87567d677231395f6147293b68ceab7a9e0c58d864e8efde4e1b9a46cbe854713672f5caaae314ed9083dab4b099f8e300f01b8650f1f4b1d8fcf3f3cb53fb8e9eb2ea203bdc970f50ae55428a91f7f53ac266b28419c3778a15fd248d339ede785fb7f5a1aaa96d313eacc890936c173cdcd0fab882c45755feb3aed96d477ff96390bf9a66d1368b208e21f7c10d04a3dbd4e360633e5db4b602601c14cea737db3dcf722632cc77851cbdde2aaf0a33a07b373445df490cc8fc1e4160ff118378f11f0477de055a81a9eda57a4a2cfb0c83929d310912f729ec6cfa36c6ac6a75837143045d791cc85eff5b21932f23861bcf23a52b5da67eaf7baae0f5fb1369db78f3ac45f8c4ac5671d85735cdddb09d2b1e34a1fc066ff4a162cb263d6541274ae2fcc865f618abe27c124cd8b074ccd516301b91875824d09958f341ef274bdab0bae316339894304e35877b0c28a9b1fd166c796b9cc258a064a8f57e27f2a');
// Len = 2040
// Msg = 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1
expect(shake_256([0x3A,0x3A,0x81,0x9C,0x48,0xEF,0xDE,0x2A,0xD9,0x14,0xFB,0xF0,0x0E,0x18,0xAB,0x6B,0xC4,0xF1,0x45,0x13,0xAB,0x27,0xD0,0xC1,0x78,0xA1,0x88,0xB6,0x14,0x31,0xE7,0xF5,0x62,0x3C,0xB6,0x6B,0x23,0x34,0x67,0x75,0xD3,0x86,0xB5,0x0E,0x98,0x2C,0x49,0x3A,0xDB,0xBF,0xC5,0x4B,0x9A,0x3C,0xD3,0x83,0x38,0x23,0x36,0xA1,0xA0,0xB2,0x15,0x0A,0x15,0x35,0x8F,0x33,0x6D,0x03,0xAE,0x18,0xF6,0x66,0xC7,0x57,0x3D,0x55,0xC4,0xFD,0x18,0x1C,0x29,0xE6,0xCC,0xFD,0xE6,0x3E,0xA3,0x5F,0x0A,0xDF,0x58,0x85,0xCF,0xC0,0xA3,0xD8,0x4A,0x2B,0x2E,0x4D,0xD2,0x44,0x96,0xDB,0x78,0x9E,0x66,0x31,0x70,0xCE,0xF7,0x47,0x98,0xAA,0x1B,0xBC,0xD4,0x57,0x4E,0xA0,0xBB,0xA4,0x04,0x89,0xD7,0x64,0xB2,0xF8,0x3A,0xAD,0xC6,0x6B,0x14,0x8B,0x4A,0x0C,0xD9,0x52,0x46,0xC1,0x27,0xD5,0x87,0x1C,0x4F,0x11,0x41,0x86,0x90,0xA5,0xDD,0xF0,0x12,0x46,0xA0,0xC8,0x0A,0x43,0xC7,0x00,0x88,0xB6,0x18,0x36,0x39,0xDC,0xFD,0xA4,0x12,0x5B,0xD1,0x13,0xA8,0xF4,0x9E,0xE2,0x3E,0xD3,0x06,0xFA,0xAC,0x57,0x6C,0x3F,0xB0,0xC1,0xE2,0x56,0x67,0x1D,0x81,0x7F,0xC2,0x53,0x4A,0x52,0xF5,0xB4,0x39,0xF7,0x2E,0x42,0x4D,0xE3,0x76,0xF4,0xC5,0x65,0xCC,0xA8,0x23,0x07,0xDD,0x9E,0xF7,0x6D,0xA5,0xB7,0xC4,0xEB,0x7E,0x08,0x51,0x72,0xE3,0x28,0x80,0x7C,0x02,0xD0,0x11,0xFF,0xBF,0x33,0x78,0x53,0x78,0xD7,0x9D,0xC2,0x66,0xF6,0xA5,0xBE,0x6B,0xB0,0xE4,0xA9,0x2E,0xCE,0xEB,0xAE,0xB1], 4100)).to.be('8a5199b4a7e133e264a86202720655894d48cff344a928cf8347f48379cef347dfc5bcffab99b27b1f89aa2735e23d30088ffa03b9edb02b9635470ab9f1038985d55f9ca774572dd006470ea65145469609f9fa0831bf1ffd842dc24acade27bd9816e3b5bf2876cb112232a0eb4475f1dff9f5c713d9ffd4ccb89ae5607fe35731df06317949eef646e9591cf3be53add6b7dd2b6096e2b3fb06e662ec8b2d77422daad9463cd155204acdbd38e319613f39f99b6dfb35ca9365160066db19835888c2241ff9a731a4acbb5663727aac34a401247fbaa7499e7d5ee5b69d31025e63d04c35c798bca1262d5673a9cf0930b5ad89bd485599dc184528da4790f088ebd170b635d9581632d2ff90db79665ced430089af13c9f21f6d443a818064f17aec9e9c5457001fa8dc6afbadbe3138f388d89d0e6f22f66671255b210754ed63d81dce75ce8f189b534e6d6b3539aa51e837c42df9df59c71e6171cd4902fe1bdc73fb1775b5c754a1ed4ea7f3105fc543ee0418dad256f3f6118ea77114a16c15355b42877a1db2a7df0e155ae1d8670abcec3450f4e2eec9838f895423ef63d261138baaf5d9f104cb5a957aea06c0b9b8c78b0d441796dc0350ddeabb78a33b6f1f9e68ede3d1805c7b7e2cfd54e0fad62f0d8ca67a775dc4546af9096f2edb221db42843d65327861282dc946a0ba01a11863ab2d1dfd16e3973d4');
});
});
});
})(shake_256, shake_128); })(shake_256, shake_128);
+273 -149
View File
@@ -1,189 +1,313 @@
(function(sha3_512, sha3_384, sha3_256, sha3_224) { (function (sha3_512, sha3_384, sha3_256, sha3_224, keccak_512, keccak_384, keccak_256, keccak_224) {
Array.prototype.toHexString = ArrayBuffer.prototype.toHexString = function() { Array.prototype.toHexString = ArrayBuffer.prototype.toHexString = function () {
var array = new Uint8Array(this); var array = new Uint8Array(this);
var hex = ''; var hex = '';
for(var i = 0;i < array.length;++i) { for (var i = 0;i < array.length;++i) {
var c = array[i].toString('16'); var c = array[i].toString('16');
hex += c.length == 1 ? '0' + c : c; hex += c.length == 1 ? '0' + c : c;
} }
return hex; return hex;
}; };
describe('sha3_512', function() {
context('when ascii', function() {
context('and less than 128 bytes', function() {
it('should be equal', function() {
expect(sha3_512('')).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
expect(sha3_512('The quick brown fox jumps over the lazy dog')).to.be('01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450');
expect(sha3_512('The quick brown fox jumps over the lazy dog.')).to.be('18f4f4bd419603f95538837003d9d254c26c23765565162247483f65c50303597bc9ce4d289f21d1c2f1f458828e33dc442100331b35e7eb031b5d38ba6460f8');
});
});
context('and more than 128 bytes', function() { function runTestCases(methods, testCases) {
it('should be equal', function() { methods.forEach(function (method) {
expect(sha3_512('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('4f8bcf3a60d3ee56a0bd405c3e6bb37dac44b6781c41bf76c91a5d8e621d472b7b13b8806d88914af3d97585df996363ebe17566d5dfeb6f4884a7949ba8263d'); describe('#' + method.name, function () {
}); var methodTestCases = testCases[method.name];
for (var testCaseName in methodTestCases) {
(function (testCaseName) {
var testCase = methodTestCases[testCaseName];
context('when ' + testCaseName, function () {
for (var hash in testCase) {
(function (message, hash) {
it('should be equal', function () {
expect(method.call(message)).to.be(hash);
});
})(testCase[hash], hash);
}
});
})(testCaseName);
}
}); });
}); });
}
context('when UTF8', function() { var methods = [
context('and less than 128 bytes', function() { {
it('should be equal', function() { name: 'sha3_512',
expect(sha3_512('中文')).to.be('059bbe2efc50cc30e4d8ec5a96be697e2108fcbf9193e1296192eddabc13b143c0120d059399a13d0d42651efe23a6c1ce2d1efb576c5b207fa2516050505af7'); call: sha3_512
expect(sha3_512('aécio')).to.be('35dfaf82d2ce4be79393dc90e327b4dd15b1c150d8a30f59d8d1b42ca4fc3c87f50b77da36acccf9dc76494d07fc57cfcc9470e627c38f95bce4deab311b87e0'); },
expect(sha3_512('𠜎')).to.be('33ef254289f36527c93cd203ef1973aec1eff7475c23fa842c3092b0d30965d13b0805c61d0aa92c51245c56bfe26978c35c00f26eb558a043982043ee8b178c'); {
}); name: 'sha3_384',
}); call: sha3_384
},
{
name: 'sha3_256',
call: sha3_256
},
{
name: 'sha3_224',
call: sha3_224
},
{
name: 'keccak_512',
call: keccak_512
},
{
name: 'keccak_384',
call: keccak_384
},
{
name: 'keccak_256',
call: keccak_256
},
{
name: 'keccak_224',
call: keccak_224
}
];
context('and more than 128 bytes', function() { var testCases = {
it('should be equal', function() { sha3_512: {
expect(sha3_512('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('accb127bb24b0ffbb7550dc637222d2f78538a8a186c98bc5efdad685b9b396639f34148bf0b94ed470f0e9c3665dc3b4c1cb321bacd32dd317a646295e073d9'); 'ascii': {
expect(sha3_512('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('5b70eaad083f1b86fd535b6812e02f5f2876a4bd8b43aede8d62ae71bb1743ebd919dc41be56d73ba45b67b2876ff215d0575788560e7b0c92b879f8a2fc3111'); 'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26': '',
}); '01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450': 'The quick brown fox jumps over the lazy dog',
}); '18f4f4bd419603f95538837003d9d254c26c23765565162247483f65c50303597bc9ce4d289f21d1c2f1f458828e33dc442100331b35e7eb031b5d38ba6460f8': 'The quick brown fox jumps over the lazy dog.'
}); },
'ascii more than 128 bytes': {
'4f8bcf3a60d3ee56a0bd405c3e6bb37dac44b6781c41bf76c91a5d8e621d472b7b13b8806d88914af3d97585df996363ebe17566d5dfeb6f4884a7949ba8263d': '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.'
},
'UTF-8': {
'059bbe2efc50cc30e4d8ec5a96be697e2108fcbf9193e1296192eddabc13b143c0120d059399a13d0d42651efe23a6c1ce2d1efb576c5b207fa2516050505af7': '中文',
'35dfaf82d2ce4be79393dc90e327b4dd15b1c150d8a30f59d8d1b42ca4fc3c87f50b77da36acccf9dc76494d07fc57cfcc9470e627c38f95bce4deab311b87e0': 'aécio',
'33ef254289f36527c93cd203ef1973aec1eff7475c23fa842c3092b0d30965d13b0805c61d0aa92c51245c56bfe26978c35c00f26eb558a043982043ee8b178c': '𠜎'
},
'UTF-8 more than 128 bytes': {
'accb127bb24b0ffbb7550dc637222d2f78538a8a186c98bc5efdad685b9b396639f34148bf0b94ed470f0e9c3665dc3b4c1cb321bacd32dd317a646295e073d9': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一',
'5b70eaad083f1b86fd535b6812e02f5f2876a4bd8b43aede8d62ae71bb1743ebd919dc41be56d73ba45b67b2876ff215d0575788560e7b0c92b879f8a2fc3111': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。'
},
'special length': {
'bce9da5b408846edd5bec9f26c2dee9bd835215c3f2b3876197067d87bc4d1af0cd97f94fda59761a0d804fe82383be2c6c4886fbb82e005fcf899449029f221' :'012345678901234567890123456789012345678901234567890123456789012345678901',
'8bdcb85e6b52c29fafac0d3daf65492f2e3499e066da1a095a65eb1144849a26b2790a8b39c2a7fb747456f749391d953841a61cb13289f9806f04981c180a86' :'01234567890123456789012345678901234567890123456789012345678901234567890'
},
'Array': {
'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26': [],
'01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450': [84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103]
},
'Uint8Array': {
'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26': new Uint8Array([]),
'01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450': new Uint8Array([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103])
},
'ArrayBuffer': {
'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26': new ArrayBuffer(0)
}
},
sha3_384: {
'ascii': {
'0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004': '',
'7063465e08a93bce31cd89d2e3ca8f602498696e253592ed26f07bf7e703cf328581e1471a7ba7ab119b1a9ebdf8be41': 'The quick brown fox jumps over the lazy dog',
'1a34d81695b622df178bc74df7124fe12fac0f64ba5250b78b99c1273d4b080168e10652894ecad5f1f4d5b965437fb9': 'The quick brown fox jumps over the lazy dog.'
},
'ascii more than 128 bytes': {
'ca6b121a6060bc85de05e5a8d70577838fad2481b092c8263d6f7bcbe5148740f0c7f9c4dc27061339570496956aaef6': '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.'
},
'UTF-8': {
'9fb5b99e3c546f2738dcd50a14e9aef9c313800c1bf8cf76bc9b2c3a23307841364c5a2d0794702662c5796fb72f5432': '中文',
'70b447f1bd5ce5a4753ccf7a3697eca0315954774374bc1042aff19582ccc32d5067f7da6c2bea9d6d344e11924cbe72': 'aécio',
'7add8d544b0a7cf188b54b1697a046f77e49d5f292e7ffe56feeed90a500b0bf026b9b68892888a1bafb9f8cb89ed874': '𠜎'
},
'UTF-8 more than 128 bytes': {
'7d0f80fe5c79a04a2a37a30a440e0cc068eb78fe6c3182246ede29645c144b5d33c44607cb2c3111ba77ffc66107f1cd': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一',
'e344b95c6a961a27793eff00fa5103ef78b4180fe41c93fc60a31aff49b3b5e95a92c84fda9a6c80fa403b7df58db59f': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。'
}
},
sha3_256: {
'ascii': {
'a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a': '',
'69070dda01975c8c120c3aada1b282394e7f032fa9cf32f4cb2259a0897dfc04': 'The quick brown fox jumps over the lazy dog',
'a80f839cd4f83f6c3dafc87feae470045e4eb0d366397d5c6ce34ba1739f734d': 'The quick brown fox jumps over the lazy dog.'
},
'ascii more than 128 bytes': {
'fa198893674a0bf9fb35980504e8cefb250aabd2311a37e5d2205f07fb023d36': '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.'
},
'UTF-8': {
'ac5305da3d18be1aed44aa7c70ea548da243a59a5fd546f489348fd5718fb1a0': '中文',
'65c756408eb6c35a1ffa2d7e09711bdc9f0b28716b1376223844a2b4c52b6718': 'aécio',
'babe9afc555b0311700dfb0b5b6296d49347b3d770480baedfcdc47a4aea6e82': '𠜎'
},
'UTF-8 more than 128 bytes': {
'4b2f36e4320b86e6ead0ad001e47e6d9e7fcf0044cd5a5fd65490a633c0372a4': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一',
'558a7f843b1ac5e7a8bbef90357876bcce0612992d0dfa2907e95521612f507f': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。'
}
},
sha3_224: {
'ascii': {
'6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7': '',
'd15dadceaa4d5d7bb3b48f446421d542e08ad8887305e28d58335795': 'The quick brown fox jumps over the lazy dog',
'2d0708903833afabdd232a20201176e8b58c5be8a6fe74265ac54db0': 'The quick brown fox jumps over the lazy dog.'
},
'ascii more than 128 bytes': {
'06885009a28e43e15bf1af718561ad211515a27b542eabc36764a0ca': '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.'
},
'UTF-8': {
'106d169e10b61c2a2a05554d3e631ec94467f8316640f29545d163ee': '中文',
'b16bad54608dc01864a5d7510d4c19b09f3a0f39cfc4ba1e53aa952a': 'aécio',
'f59253c41cb87e5cd953311656716cb5b64dbafc9e8155f0dd68123c': '𠜎'
},
'UTF-8 more than 128 bytes': {
'135c13deb71fdf6fb77b52b720c43ddd6ce7467f9147a74248557114': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一',
'bd05581e02445c53e05aad2014f6a3819d77a9dff918b8c6bf60bd06': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。'
}
},
keccak_512: {
'ascii': {
'0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e': '',
'd135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609': 'The quick brown fox jumps over the lazy dog',
'ab7192d2b11f51c7dd744e7b3441febf397ca07bf812cceae122ca4ded6387889064f8db9230f173f6d1ab6e24b6e50f065b039f799f5592360a6558eb52d760': 'The quick brown fox jumps over the lazy dog.'
},
'ascii more than 128 bytes': {
'10dcbf6389980ce3594547939bbc685363d28adbd6a05bc4abd7fc62e7693a1f6e33569fed5a380bfecb56ae811d25939b95823f39bb0f16a08740629d066d43': '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.'
},
'UTF-8': {
'2f6a1bd50562230229af34b0ccf46b8754b89d23ae2c5bf7840b4acfcef86f87395edc0a00b2bfef53bafebe3b79de2e3e01cbd8169ddbb08bde888dcc893524': '中文',
'c452ec93e83d4795fcab62a76eed0d88f2231a995ce108ac8f130246f87c4a11cb18a2c1a688a5695906a6f863e71bbe8997c6610319ab97f12d2e5bf0afe458': 'aécio',
'8a2d72022ce19d989dbe6a0017faccbf5dc2e22c162d1c5eb168864d32dd1a71e1b4782652c148cf6ca47b77a72c96fff682e72bdfef0566d4b7cca3c9ccc59d': '𠜎'
},
'UTF-8 more than 128 bytes': {
'6a67c28aa1946ca1be8382b861aac4aaf20052f495db9b6902d13adfa603eaba5d169f8896b86d461b2949283eb98e503c3f0640188ea7d6731526fc06568d37': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一',
'd04ff5b0e85e9968be2a4d4e133c15c7ccee7497198bb651599a97d11d00bca6048d329ab75aa454566cd532648fa1cb4551985d9d645de9fa43a311a9ee8e4d': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。'
}
},
keccak_384: {
'ascii': {
'2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff': '',
'283990fa9d5fb731d786c5bbee94ea4db4910f18c62c03d173fc0a5e494422e8a0b3da7574dae7fa0baf005e504063b3': 'The quick brown fox jumps over the lazy dog',
'9ad8e17325408eddb6edee6147f13856ad819bb7532668b605a24a2d958f88bd5c169e56dc4b2f89ffd325f6006d820b': 'The quick brown fox jumps over the lazy dog.'
},
'ascii more than 128 bytes': {
'e7ec8976b4d96e43f50ae8ecdcf2d97a56236e6406e8dd00efd0d9abe885659db58a2f4b138a4ecfb1bd0052f6569516': '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.'
},
'UTF-8': {
'743f64bb7544c6ed923be4741b738dde18b7cee384a3a09c4e01acaaac9f19222cdee137702bd3aa05dc198373d87d6c': '中文',
'08990555e131af8597687614309da4c5053ce866f348544da0a0c2c78c2cc79680ebb57cfbe238286e78ea133a037897': 'aécio',
'2a80f59abf3111f38a35a3daa25123b495f90e9736bd300e35911d19abdd8806498c581333f198ccbbf2252b57c2925d': '𠜎'
},
'UTF-8 more than 128 bytes': {
'a3b043a2f69e4326a05d478fa4c8aa2bd7612453d775af37665a0b96ef2207cdc74c50cdba1629796a5136fe77300b05': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一',
'66414c090cc3fe9c396d313cbaa100aefd335e851838b29382568b7f57357ada7c54b8fa8c17f859945bba88b2c2e332': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。'
}
},
keccak_256: {
'ascii': {
'c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470': '',
'4d741b6f1eb29cb2a9b9911c82f56fa8d73b04959d3d9d222895df6c0b28aa15': 'The quick brown fox jumps over the lazy dog',
'578951e24efd62a3d63a86f7cd19aaa53c898fe287d2552133220370240b572d': 'The quick brown fox jumps over the lazy dog.'
},
'ascii more than 128 bytes': {
'af20018353ffb50d507f1555580f5272eca7fdab4f8295db4b1a9ad832c93f6d': '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.'
},
'UTF-8': {
'70a2b6579047f0a977fcb5e9120a4e07067bea9abb6916fbc2d13ffb9a4e4eee': '中文',
'd7d569202f04daf90432810d6163112b2695d7820da979327ebd894efb0276dc': 'aécio',
'16a7cc7a58444cbf7e939611910ddc82e7cba65a99d3e8e08cfcda53180a2180': '𠜎'
},
'UTF-8 more than 128 bytes': {
'd1021d2d4c5c7e88098c40f422af68493b4b64c913cbd68220bf5e6127c37a88': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一',
'ffabf9bba2127c4928d360c9905cb4911f0ec21b9c3b89f3b242bccc68389e36': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。'
}
},
keccak_224: {
'ascii': {
'f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd': '',
'310aee6b30c47350576ac2873fa89fd190cdc488442f3ef654cf23fe': 'The quick brown fox jumps over the lazy dog',
'c59d4eaeac728671c635ff645014e2afa935bebffdb5fbd207ffdeab': 'The quick brown fox jumps over the lazy dog.'
},
'ascii more than 128 bytes': {
'8dd58b706e3a08ec4f1f202af39295b38c355a39b23308ade7218a21': '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.'
},
'UTF-8': {
'7bc2a0b6e7e0a055a61e4f731e2944b560f41ff98967dcbf4bbf77a5': '中文',
'66f3db76bf8cb35726cb278bac412d187c3484ab2083dc50ef5ffb55': 'aécio',
'3bfa94845726f4cd5cf17d19b5eacac17b3694790e13a76d5c81c7c2': '𠜎'
},
'UTF-8 more than 128 bytes': {
'd59eef8f394ef7d96967bb0bde578785c033f7f0a21913d6ba41ed1b': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一',
'27123a2a3860d1041d4769778c4b078732bf4300f7e1c56536ab2644': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。'
}
}
};
context('when special length', function() { runTestCases(methods, testCases);
it('should be equal', function() {
expect(sha3_512('012345678901234567890123456789012345678901234567890123456789012345678901')).to.be('bce9da5b408846edd5bec9f26c2dee9bd835215c3f2b3876197067d87bc4d1af0cd97f94fda59761a0d804fe82383be2c6c4886fbb82e005fcf899449029f221');
expect(sha3_512('01234567890123456789012345678901234567890123456789012345678901234567890')).to.be('8bdcb85e6b52c29fafac0d3daf65492f2e3499e066da1a095a65eb1144849a26b2790a8b39c2a7fb747456f749391d953841a61cb13289f9806f04981c180a86');
});
});
context('when Array', function() { describe('sha3_512', function () {
it('should be equal', function() { context('#buffer', function () {
expect(sha3_512([])).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26'); it('should be equal', function () {
expect(sha3_512([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103])).to.be('01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450');
});
});
context('when Uint8Array', function() {
it('should be equal', function() {
expect(sha3_512(new Uint8Array([]))).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
expect(sha3_512(new Uint8Array([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103]))).to.be('01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450');
});
});
context('when ArrayBuffer', function() {
it('should be equal', function() {
expect(sha3_512(new ArrayBuffer(0))).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
});
});
context('when output ArrayBuffer', function() {
it('should be equal', function() {
expect(sha3_512.buffer('').toHexString()).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26'); expect(sha3_512.buffer('').toHexString()).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
}); });
}); });
context('#hex', function() { context('#hex', function () {
it('should be equal', function() { it('should be equal', function () {
expect(sha3_512.hex('')).to.be(sha3_512('')); expect(sha3_512.hex('')).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
});
});
context('#update', function () {
it('should be equal', function () {
expect(sha3_512.update('').hex()).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
expect(sha3_512.update('The quick brown fox ').update('jumps over the lazy dog').hex()).to.be('01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450');
});
});
context('#create', function () {
it('should be equal', function () {
var bytes = [84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103];
var hash = sha3_512.create();
for (var i = 0;i < bytes.length;++i) {
hash.update([bytes[i]]);
}
expect(hash.hex()).to.be('01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450');
}); });
}); });
}); });
describe('sha3_384', function() { describe('#keccak_512', function () {
context('when ascii', function() { context('when special length', function () {
context('and less than 128 bytes', function() { it('should be equal', function () {
it('should be equal', function() { expect(keccak_512('012345678901234567890123456789012345678901234567890123456789012345678901')).to.be('90b1d032c3bf06dcc78a46fe52054bab1250600224bfc6dfbfb40a7877c55e89bb982799a2edf198568a4166f6736678b45e76b12fac813cfdf0a76714e5eae8');
expect(sha3_384('')).to.be('0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004'); expect(keccak_512('01234567890123456789012345678901234567890123456789012345678901234567890')).to.be('3173e7abc754a0b2909410d78986428a9183e996864af02f421d273d9fa1b4e4a5b14e2998b20767712f53a01ff8f6ae2c3e71e51e2c0f24257b03e6da09eb77');
expect(sha3_384('The quick brown fox jumps over the lazy dog')).to.be('7063465e08a93bce31cd89d2e3ca8f602498696e253592ed26f07bf7e703cf328581e1471a7ba7ab119b1a9ebdf8be41');
expect(sha3_384('The quick brown fox jumps over the lazy dog.')).to.be('1a34d81695b622df178bc74df7124fe12fac0f64ba5250b78b99c1273d4b080168e10652894ecad5f1f4d5b965437fb9');
}); });
}); });
context('and more than 128 bytes', function() { context('when Array', function () {
it('should be equal', function() { it('should be equal', function () {
expect(sha3_384('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('ca6b121a6060bc85de05e5a8d70577838fad2481b092c8263d6f7bcbe5148740f0c7f9c4dc27061339570496956aaef6'); expect(keccak_512([])).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
}); expect(keccak_512([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103])).to.be('d135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609');
});
});
context('when UTF8', function() {
context('and less than 128 bytes', function() {
it('should be equal', function() {
expect(sha3_384('中文')).to.be('9fb5b99e3c546f2738dcd50a14e9aef9c313800c1bf8cf76bc9b2c3a23307841364c5a2d0794702662c5796fb72f5432');
expect(sha3_384('aécio')).to.be('70b447f1bd5ce5a4753ccf7a3697eca0315954774374bc1042aff19582ccc32d5067f7da6c2bea9d6d344e11924cbe72');
expect(sha3_384('𠜎')).to.be('7add8d544b0a7cf188b54b1697a046f77e49d5f292e7ffe56feeed90a500b0bf026b9b68892888a1bafb9f8cb89ed874');
}); });
}); });
context('and more than 128 bytes', function() { context('when Uint8Array', function () {
it('should be equal', function() { it('should be equal', function () {
expect(sha3_384('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('7d0f80fe5c79a04a2a37a30a440e0cc068eb78fe6c3182246ede29645c144b5d33c44607cb2c3111ba77ffc66107f1cd'); expect(keccak_512(new Uint8Array([]))).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
expect(sha3_384('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('e344b95c6a961a27793eff00fa5103ef78b4180fe41c93fc60a31aff49b3b5e95a92c84fda9a6c80fa403b7df58db59f'); expect(keccak_512(new Uint8Array([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103]))).to.be('d135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609');
});
});
}); });
}); });
describe('sha3_256', function() { context('when ArrayBuffer', function () {
context('when ascii', function() { it('should be equal', function () {
context('and less than 128 bytes', function() { expect(keccak_512(new ArrayBuffer(0))).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
it('should be equal', function() {
expect(sha3_256('')).to.be('a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a');
expect(sha3_256('The quick brown fox jumps over the lazy dog')).to.be('69070dda01975c8c120c3aada1b282394e7f032fa9cf32f4cb2259a0897dfc04');
expect(sha3_256('The quick brown fox jumps over the lazy dog.')).to.be('a80f839cd4f83f6c3dafc87feae470045e4eb0d366397d5c6ce34ba1739f734d');
}); });
}); });
context('and more than 128 bytes', function() { context('when output ArrayBuffer', function () {
it('should be equal', function() { it('should be equal', function () {
expect(sha3_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('fa198893674a0bf9fb35980504e8cefb250aabd2311a37e5d2205f07fb023d36'); expect(keccak_512.buffer('').toHexString()).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
});
});
});
context('when UTF8', function() {
context('and less than 128 bytes', function() {
it('should be equal', function() {
expect(sha3_256('中文')).to.be('ac5305da3d18be1aed44aa7c70ea548da243a59a5fd546f489348fd5718fb1a0');
expect(sha3_256('aécio')).to.be('65c756408eb6c35a1ffa2d7e09711bdc9f0b28716b1376223844a2b4c52b6718');
expect(sha3_256('𠜎')).to.be('babe9afc555b0311700dfb0b5b6296d49347b3d770480baedfcdc47a4aea6e82');
}); });
}); });
context('and more than 128 bytes', function() { context('when output Array', function () {
it('should be equal', function() { it('should be equal', function () {
expect(sha3_256('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('4b2f36e4320b86e6ead0ad001e47e6d9e7fcf0044cd5a5fd65490a633c0372a4'); expect(keccak_512.array('').toHexString()).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
expect(sha3_256('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('558a7f843b1ac5e7a8bbef90357876bcce0612992d0dfa2907e95521612f507f');
}); });
}); });
}); });
}); })(sha3_512, sha3_384, sha3_256, sha3_224, keccak_512, keccak_384, keccak_256, keccak_224);
describe('sha3_224', function() {
context('when ascii', function() {
context('and less than 128 bytes', function() {
it('should be equal', function() {
expect(sha3_224('')).to.be('6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7');
expect(sha3_224('The quick brown fox jumps over the lazy dog')).to.be('d15dadceaa4d5d7bb3b48f446421d542e08ad8887305e28d58335795');
expect(sha3_224('The quick brown fox jumps over the lazy dog.')).to.be('2d0708903833afabdd232a20201176e8b58c5be8a6fe74265ac54db0');
});
});
context('and more than 128 bytes', function() {
it('should be equal', function() {
expect(sha3_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('06885009a28e43e15bf1af718561ad211515a27b542eabc36764a0ca');
});
});
});
context('when UTF8', function() {
context('and less than 128 bytes', function() {
it('should be equal', function() {
expect(sha3_224('中文')).to.be('106d169e10b61c2a2a05554d3e631ec94467f8316640f29545d163ee');
expect(sha3_224('aécio')).to.be('b16bad54608dc01864a5d7510d4c19b09f3a0f39cfc4ba1e53aa952a');
expect(sha3_224('𠜎')).to.be('f59253c41cb87e5cd953311656716cb5b64dbafc9e8155f0dd68123c');
});
});
context('and more than 128 bytes', function() {
it('should be equal', function() {
expect(sha3_224('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('135c13deb71fdf6fb77b52b720c43ddd6ce7467f9147a74248557114');
expect(sha3_224('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('bd05581e02445c53e05aad2014f6a3819d77a9dff918b8c6bf60bd06');
});
});
});
});
})(sha3_512, sha3_384, sha3_256, sha3_224);