twofish
Version:
Javascript Twofish implementation.
12 lines (10 loc) • 9.76 kB
JavaScript
/*!
* Twofish (ECB and CBC) javascript implementation v0.1.1
*
* Released under the MIT license
* www.opensource.org/licenses/MIT
*
* 2015-02-06
*/
!function(a){"use strict";var b=function(a){this.m=2147483648,this.a=1103515245,this.c=12345,this.state=a?a:Math.floor(Math.random()*(this.m-1))},c=function(){var a=function(a){return Array.isArray(a)||"[object Uint8Array]"===Object.prototype.toString.call(a)?!0:!1},b=function(a,b){var c,d=a.length,e=b.length,f=0;if(d>e){for(c=d-e;c>=0;c-=1)if(a[d-c])return!1}else if(e>d)for(c=e-d;c>=0;c-=1)if(b[e-c])return!1;for(;d>f;f+=1)if(a[f]!==b[f])return!1;return!0};return{isAnArray:a,areEqual:b}};b.prototype.nextInt=function(){return this.state=(this.a*this.state+this.c)%this.m,this.state},b.prototype.nextFloat=function(){return this.nextInt()/(this.m-1)},b.prototype.nextRange=function(a,b){var c=b-a,d=this.nextInt()/this.m;return a+Math.floor(d*c)},b.prototype.choice=function(a){return a[this.nextRange(0,a.length)]},a.twofish=function(a){var d,e=c(),f=new b,g=[],h=new Uint8Array([169,103,179,232,4,253,163,118,154,146,128,120,228,221,209,56,13,198,53,152,24,247,236,108,67,117,55,38,250,19,148,72,242,208,139,48,132,84,223,35,25,91,61,89,243,174,162,130,99,1,131,46,217,81,155,124,166,235,165,190,22,12,227,97,192,140,58,245,115,44,37,11,187,78,137,107,83,106,180,241,225,230,189,69,226,244,182,102,204,149,3,86,212,28,30,215,251,195,142,181,233,207,191,186,234,119,57,175,51,201,98,113,129,121,9,173,36,205,249,216,229,197,185,77,68,8,134,231,161,29,170,237,6,112,178,210,65,123,160,17,49,194,39,144,32,246,96,255,150,92,177,171,158,156,82,27,95,147,10,239,145,133,73,238,45,79,143,59,71,135,109,70,214,62,105,100,42,206,203,47,252,151,5,122,172,127,213,26,75,14,167,90,40,20,63,41,136,60,76,2,184,218,176,23,85,31,138,125,87,199,141,116,183,196,159,114,126,21,34,18,88,7,153,52,110,80,222,104,101,188,219,248,200,168,43,64,220,254,50,164,202,16,33,240,211,93,15,0,111,157,54,66,74,94,193,224]),i=new Uint8Array([117,243,198,244,219,123,251,200,74,211,230,107,69,125,232,75,214,50,216,253,55,113,241,225,48,15,248,27,135,250,6,63,94,186,174,91,138,0,188,157,109,193,177,14,128,93,210,213,160,132,7,20,181,144,44,163,178,115,76,84,146,116,54,81,56,176,189,90,252,96,98,150,108,66,247,16,124,40,39,140,19,149,156,199,36,70,59,112,202,227,133,203,17,208,147,184,166,131,32,255,159,119,195,204,3,111,8,191,64,231,43,226,121,12,170,130,65,58,234,185,228,154,164,151,126,218,122,23,102,148,161,29,61,240,222,179,11,114,167,28,239,209,83,62,143,51,38,95,236,118,42,73,129,136,238,33,196,26,235,217,197,57,153,205,173,49,139,1,24,35,221,31,78,45,249,72,79,242,101,142,120,92,88,25,141,229,152,87,103,127,5,100,175,99,182,254,245,183,60,165,206,233,104,68,224,77,67,105,41,46,172,21,89,168,10,158,110,71,223,52,53,106,207,220,34,201,192,155,137,212,237,171,18,162,13,82,187,2,47,169,215,97,30,180,80,4,246,194,22,37,134,86,85,9,190,145]),j=[h,i],k=16,l=16,m=33686018,n=16843009,o=9,p=0,q=p+k/4,r=q+k/4,s=0,t=0,u=1,v=0,w=0,x=1^v,y=1,z=0,A=0,B=1,C=1^A,D=0,E=1,F=1,G=0,H=1^F,I=0,J=0,K=1,L=1,M=1^K,N=1,O=Math.floor(180.5),P=Math.floor(90.25),Q=333,R=function(a){return a>>1^(0!==(1&a)?O:0)},S=function(a){return a>>2^(0!==(2&a)?O:0)^(0!==(1&a)?P:0)},T=function(a){return a^S(a)},U=function(a){return a^R(a)^S(a)},V=function(){var a,b,c=[[],[],[],[]],d=[],e=[],f=[];for(a=0;256>a;a+=1)b=255&j[0][a],d[0]=b,e[0]=255&T(b),f[0]=255&U(b),b=255&j[1][a],d[1]=b,e[1]=255&T(b),f[1]=255&U(b),c[0][a]=d[u]<<0|e[u]<<8|f[u]<<16|f[u]<<24,c[1][a]=f[z]<<0|f[z]<<8|e[z]<<16|d[z]<<24,c[2][a]=e[E]<<0|f[E]<<8|d[E]<<16|f[E]<<24,c[3][a]=e[J]<<0|d[J]<<8|f[J]<<16|e[J]<<24;return[new Uint32Array(c[0]),new Uint32Array(c[1]),new Uint32Array(c[2]),new Uint32Array(c[3])]}(),W=function(a){return 255&a},X=function(a){return a>>>8&255},Y=function(a){return a>>>16&255},Z=function(a){return a>>>24&255},$=function(a,b){var c=0;switch(b%4){case 0:c=W(a);break;case 1:c=X(a);break;case 2:c=Y(a);break;case 3:c=Z(a)}return c},_=function(a){var b=a>>>24&255,c=255&(b<<1^(0!==(128&b)?Q:0)),d=b>>>1^(0!==(1&b)?Q>>>1:0)^c,e=a<<8^d<<24^c<<16^d<<8^b;return e},ab=function(a,b){for(var c=0;4>c;c+=1)b=_(b);for(b^=a,c=0;4>c;c+=1)b=_(b);return b},bb=function(a,b,c){var d=W(b),e=X(b),f=Y(b),g=Z(b),h=c[0]||0,i=c[1]||0,k=c[2]||0,l=c[3]||0,m=0;switch(3&a){case 1:m=V[0][255&j[v][d]^W(h)]^V[1][255&j[A][e]^X(h)]^V[2][255&j[F][f]^Y(h)]^V[3][255&j[K][g]^Z(h)];break;case 0:d=255&j[y][d]^W(l),e=255&j[D][e]^X(l),f=255&j[I][f]^Y(l),g=255&j[N][g]^Z(l);case 3:d=255&j[x][d]^W(k),e=255&j[C][e]^X(k),f=255&j[H][f]^Y(k),g=255&j[M][g]^Z(k);case 2:m=V[0][255&j[v][255&j[w][d]^W(i)]^W(h)]^V[1][255&j[A][255&j[B][e]^X(i)]^X(h)]^V[2][255&j[F][255&j[G][f]^Y(i)]^Y(h)]^V[3][255&j[K][255&j[L][g]^Z(i)]^Z(h)]}return m},cb=function(a,b,c){var d=a[2*$(b,c)]^a[2*$(b,c+1)+1]^a[512+2*$(b,c+2)]^a[512+2*$(b,c+3)+1];return new Uint32Array([d])[0]},db=function(a,b){var c=[],d=0;if(a&&b&&e.isAnArray(a)&&e.isAnArray(b)&&a.length!==b.length)throw"Buffer length must be equal";for(a=new Uint8Array(a),b=new Uint8Array(b),d=0;d<a.length;d+=1)c[d]=255&(a[d]^b[d]);return new Uint8Array(c)},eb=function(a){if(a&&e.isAnArray(a)){var b,c,d,f,g,h,i,k,p,q,s,t,u,z,E,J=a.length,O=[],P=0,Q=J/8,R=r+2*l,S=[],T=[],U=[],$=0,_=[],cb=[];if(8>J||J>8&&16>J||J>16&&24>J||J>24&&32>J){for(P=0;P<a.length+(8-a.length);P+=1)b=a[P],O.push(void 0!==b?b:0);a=O}else if(J>32){for(c=[],P=0;32>P;P+=1)c.push(a[P]);a=c}for(a=new Uint8Array(a),J=a.length,d=0,f=Q-1;4>d&&J>$;d+=1,f-=1)S[d]=255&a[$++]|(255&a[$++])<<8|(255&a[$++])<<16|(255&a[$++])<<24,T[d]=255&a[$++]|(255&a[$++])<<8|(255&a[$++])<<16|(255&a[$++])<<24,U[f]=ab(S[d],T[d]);for(d=g=0;R/2>d;d+=1,g+=m)h=bb(Q,g,S),i=bb(Q,g+n,T),i=i<<8|i>>>24,h+=i,_[2*d]=h,h+=i,_[2*d+1]=h<<o|h>>>32-o;for(t=U[0],u=U[1],z=U[2],E=U[3],d=0;256>d;d+=1)switch(k=p=q=s=d,3&Q){case 1:cb[2*d]=V[0][255&j[v][k]^W(t)],cb[2*d+1]=V[1][255&j[A][p]^X(t)],cb[512+2*d]=V[2][255&j[F][q]^Y(t)],cb[512+2*d+1]=V[3][255&j[K][s]^Z(t)];break;case 0:k=255&j[y][k]^W(E),p=255&j[D][p]^X(E),q=255&j[I][q]^Y(E),s=255&j[N][s]^Z(E);case 3:k=255&j[x][k]^W(z),p=255&j[C][p]^X(z),q=255&j[H][q]^Y(z),s=255&j[M][s]^Z(z);case 2:cb[2*d]=V[0][255&j[v][255&j[w][k]^W(u)]^W(t)],cb[2*d+1]=V[1][255&j[A][255&j[B][p]^X(u)]^X(t)],cb[512+2*d]=V[2][255&j[F][255&j[G][q]^Y(u)]^Y(t)],cb[512+2*d+1]=V[3][255&j[K][255&j[L][s]^Z(u)]^Z(t)]}return[cb,_]}throw"key passed is undefined or not an array"},fb=function(a,b,c){if(a&&c&&e.isAnArray(c)&&e.isAnArray(a)){a=new Uint8Array(a);var d,f,g=c[0],h=c[1],i=255&a[b++]|(255&a[b++])<<8|(255&a[b++])<<16|(255&a[b++])<<24,j=255&a[b++]|(255&a[b++])<<8|(255&a[b++])<<16|(255&a[b++])<<24,k=255&a[b++]|(255&a[b++])<<8|(255&a[b++])<<16|(255&a[b++])<<24,m=255&a[b++]|(255&a[b++])<<8|(255&a[b++])<<16|(255&a[b++])<<24,n=r,o=0;for(i^=h[p],j^=h[p+1],k^=h[p+2],m^=h[p+3],o=0;l>o;o+=2)d=cb(g,i,0),f=cb(g,j,3),k^=d+f+h[n++],k=k>>>1|k<<31,m=m<<1|m>>>31,m^=d+2*f+h[n++],d=cb(g,k,0),f=cb(g,m,3),i^=d+f+h[n++],i=i>>>1|i<<31,j=j<<1|j>>>31,j^=d+2*f+h[n++];return k^=h[q],m^=h[q+1],i^=h[q+2],j^=h[q+3],new Uint8Array([k,k>>>8,k>>>16,k>>>24,m,m>>>8,m>>>16,m>>>24,i,i>>>8,i>>>16,i>>>24,j,j>>>8,j>>>16,j>>>24])}throw"input block is not an array or sessionKey is incorrect"},gb=function(a,b,c){if(a&&c&&e.isAnArray(c)&&e.isAnArray(a)){var d,f,g=c[0],h=c[1],i=255&a[b++]|(255&a[b++])<<8|(255&a[b++])<<16|(255&a[b++])<<24,j=255&a[b++]|(255&a[b++])<<8|(255&a[b++])<<16|(255&a[b++])<<24,k=255&a[b++]|(255&a[b++])<<8|(255&a[b++])<<16|(255&a[b++])<<24,m=255&a[b++]|(255&a[b++])<<8|(255&a[b++])<<16|(255&a[b++])<<24,n=r+2*l-1,o=0;for(i^=h[q],j^=h[q+1],k^=h[q+2],m^=h[q+3],o=0;l>o;o+=2)d=cb(g,i,0),f=cb(g,j,3),m^=d+2*f+h[n--],m=m>>>1|m<<31,k=k<<1|k>>>31,k^=d+f+h[n--],d=cb(g,k,0),f=cb(g,m,3),j^=d+2*f+h[n--],j=j>>>1|j<<31,i=i<<1|i>>>31,i^=d+f+h[n--];return k^=h[p],m^=h[p+1],i^=h[p+2],j^=h[p+3],new Uint8Array([k,k>>>8,k>>>16,k>>>24,m,m>>>8,m>>>16,m>>>24,i,i>>>8,i>>>16,i>>>24,j,j>>>8,j>>>16,j>>>24])}throw"input block is not an array or sessionKey is incorrect"},hb=function(a,b){var c,d,f,g=[];if(!e.isAnArray(a)||!e.isAnArray(b))throw"Inputs must be an array";for(a=new Uint8Array(a),b=new Uint8Array(b),a=eb(a),d=0;d<b.length;d+=16)for(f=fb(b,d,a),c=0;c<f.length;c+=1)g.push(f[c]);return g},ib=function(a,b){var c,d,f,g=[];if(!e.isAnArray(a)||!e.isAnArray(b))throw"Inputs must be an array";for(a=new Uint8Array(a),b=new Uint8Array(b),a=eb(a),d=0;d<b.length;d+=16)for(f=gb(b,d,a),c=0;c<f.length;c+=1)g.push(f[c]);return g},jb=function(a,b){if(!e.isAnArray(a)||!e.isAnArray(b))throw"Inputs must be an array";a=new Uint8Array(a),b=new Uint8Array(b),a=eb(a);for(var c,d,f,h=[],i=b.length/k,j=0,l=[],m=[],n=[],o=g,p=0,q=0;i>p;p+=1){if(l=b.subarray(j,j+k),l.length<k){for(c=[],t=0;k>t;t+=1)d=l[t],c.push(void 0!==d?d:0);l=c}for(m=db(l,o),n=fb(m,0,a),q=j;q<n.length+j;q+=1)f=q-j,void 0!==n[f]&&h.splice(q,0,n[f]);o=n,j+=k}return h},kb=function(a,b){if(!e.isAnArray(a)||!e.isAnArray(b))throw"Inputs must be an array";a=new Uint8Array(a),b=new Uint8Array(b),a=eb(a);for(var c,d,f,h=[],i=b.length/k,j=0,l=[],m=[],n=[],o=g,p=0,q=0;i>p;p+=1){if(l=b.subarray(j,j+k),l.length<k){for(c=[],t=0;k>t;t+=1)d=l[t],c.push(void 0!==d?d:0);l=c}for(m=gb(l,0,a),n=db(m,o),q=j;q<n.length+j;q+=1)f=q-j,void 0!==n[f]&&h.splice(q,0,n[f]);n=[],o=l,j+=k}return h};if(a){if(a&&e.isAnArray(a)&&a.length===k)g=new Uint8Array(a);else if(a&&e.isAnArray(a)&&a.length<k){for(d=a.length,t=0;k-d>t;t+=1)a.push(f.nextRange(0,256));g=new Uint8Array(a)}else if(a&&e.isAnArray(a)&&a.length>k)g=new Uint8Array(a.slice(0,k));else if(!a||!e.isAnArray(a)||a.length<16||a.length>16)throw"Initlializing vector incorrect"}else for(s=0;k>s;s+=1)g.push(f.nextRange(0,256));return g=new Uint8Array(g),{equalsArray:e.areEqual,encrypt:hb,decrypt:ib,encryptCBC:jb,decryptCBC:kb}}}("undefined"==typeof exports?this:exports);
//# sourceMappingURL=twofish.min.js.map