diff -Nru roundcube-1.3.3+dfsg.1/bin/update.sh roundcube-1.3.6+dfsg.1/bin/update.sh --- roundcube-1.3.3+dfsg.1/bin/update.sh 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/bin/update.sh 2018-04-11 11:14:33.000000000 +0000 @@ -181,6 +181,7 @@ 'pear-pear.php.net/net_sieve', 'pear/mail_mime-decode', 'roundcube/net_sieve', + 'endroid/qrcode', ); foreach ($old_packages as $pkg) { if (array_key_exists($pkg, $composer_data['require'])) { diff -Nru roundcube-1.3.3+dfsg.1/CHANGELOG roundcube-1.3.6+dfsg.1/CHANGELOG --- roundcube-1.3.3+dfsg.1/CHANGELOG 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/CHANGELOG 2018-04-11 11:14:33.000000000 +0000 @@ -1,6 +1,44 @@ CHANGELOG Roundcube Webmail =========================== +RELEASE 1.3.6 +------------- +- Fix parsing date strings (e.g. from a Date: mail header) with comments (#6216) +- Fix PHP 7.2: count(): Parameter must be an array in enchant-based spellchecker (#6234) +- Fix possible IMAP command injection and type juggling vulnerabilities (#6229) +- Enigma: Fix key selection for signing +- Enigma: Enable keypair generation on Internet Explorer 11 +- Fix check_request() bypass in places using get_uids() [CVE-2018-9846] (#6238) +- Fix bug where usernames without domain part could be malformed or converted to lower-case on logon (#6224) + +RELEASE 1.3.5 +------------- +- Managesieve: Fix bug where text: syntax was forced for strings longer than 1024 characters (#6143) +- Managesieve: Fix missing Save button in Edit Filter Set page of Classic skin (#6154) +- Fix duplicated labels in Test SMTP Config section (#6166) +- Fix PHP Warning: exif_read_data(...): Illegal IFD size (#6169) +- Enigma: Fix key generation in Safari by upgrade to OpenPGP 2.6.2 (#6149) +- Fix security issue in remote content blocking on HTML image and style tags (#6178) +- Added 9pt and 11pt to the list of font sizes in HTML editor +- Fix handling encoding of HTML tags in "inline" JSON output (#6207) +- Fix bug where some unix timestamps were not handled correctly by rcube_utils::anytodatetime() (#6212) + +RELEASE 1.3.4 +------------- +- Fix bug where contacts search could skip some records (#6130) +- Fix possible information leak - add more strict sql error check on user creation (#6125) +- Fix a couple of warnings on PHP 7.2 (#6098) +- Fix broken long filenames when using imap4d server - workaround server bug (#6048) +- Fix so temp_dir misconfiguration prints an error to the log (#6045) +- Fix untagged COPYUID responses handling - again (#5982) +- Fix PHP warning "idn_to_utf8(): INTL_IDNA_VARIANT_2003 is deprecated" with PHP 7.2 (#6075) +- Fix bug where Archive folder wasn't auto-created on login with create_default_folders=true +- Fix performance issue when parsing malformed and long Date header (#6087) +- Fix syntax error in mssql.initial.sql (#6097) +- Fix bug where contacts export by selection returned no more than 10 entries (#6103) +- Fix searching contacts by address in LDAP source (#6084) +- Fix X-Frame-Options:ALLOW-FROM support, remove custom click-jacking protection (#6057) + RELEASE 1.3.3 ------------- - Fix decoding of mailto: links with + character in HTML messages (#6020) diff -Nru roundcube-1.3.3+dfsg.1/composer.json-dist roundcube-1.3.6+dfsg.1/composer.json-dist --- roundcube-1.3.3+dfsg.1/composer.json-dist 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/composer.json-dist 2018-04-11 11:14:34.000000000 +0000 @@ -23,7 +23,7 @@ "pear/crypt_gpg": "~1.6.0", "pear/net_sieve": "~1.4.0", "roundcube/plugin-installer": "~0.1.6", - "endroid/qrcode": "~1.6.5" + "endroid/qr-code": "~1.6.5" }, "require-dev": { "phpunit/phpunit": "^4.8.36 || ^5.7.15" diff -Nru roundcube-1.3.3+dfsg.1/debian/changelog roundcube-1.3.6+dfsg.1/debian/changelog --- roundcube-1.3.3+dfsg.1/debian/changelog 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/changelog 2018-04-14 18:52:38.000000000 +0000 @@ -1,3 +1,30 @@ +roundcube (1.3.6+dfsg.1-1) unstable; urgency=medium + + * New upstream release. (Closes: #883620). + + Includes fix for CVE-2018-9846: When the archive plugin enabled and + configured, it's possible to exploit the unsanitized, user-controlled + "_uid" parameter to perform an MX (IMAP) injection attack. + (Closes: #895184). + + Upgrade OpenPGP.js from 1.6.2 to 2.6.2. + * debian/control: + + Bump Standards-Version to 4.1.4 (no changes needed). + + Remove dependency on 'php-mcrypt' package, which is no longer needed + since Roundcube 1.2. (Closes: #895100). + * debian/patches/*.patch: Remove files not mentioned in series: + + correct-magic-path.patch + + disable-dns-prefetch.patch + + dont-limit-email-local-part.patch + + fix-599586.patch + + install-jsdeps.sh + + received-headers-sa.patch + + too-old-mdb2.patch + + use-debian-jquery-ui.patch + + uuencoded-attachments.patch + * debian/roundcube-core.postinst: Use non-recursive calls to chown(1) and + chmod(1). + + -- Guilhem Moulin Sat, 14 Apr 2018 20:52:38 +0200 + roundcube (1.3.3+dfsg.1-2) unstable; urgency=medium * Upgrade internal TinyMCE to 4.5.8 to match upstream's JS dependencies. diff -Nru roundcube-1.3.3+dfsg.1/debian/control roundcube-1.3.6+dfsg.1/debian/control --- roundcube-1.3.3+dfsg.1/debian/control 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/control 2018-04-14 18:52:38.000000000 +0000 @@ -12,7 +12,7 @@ po-debconf, yui-compressor Homepage: https://www.roundcube.net/ -Standards-Version: 4.1.1 +Standards-Version: 4.1.4 Vcs-Git: https://anonscm.debian.org/git/pkg-roundcube/roundcube.git Vcs-Browser: https://anonscm.debian.org/cgit/pkg-roundcube/roundcube.git @@ -27,7 +27,6 @@ php-cli, php-intl, php-json, - php-mcrypt, roundcube-mysql (= ${source:Version}) | roundcube-sqlite3 (= ${source:Version}) | roundcube-pgsql (= ${source:Version}), ucf, ${misc:Depends}, diff -Nru roundcube-1.3.3+dfsg.1/debian/install-jsdeps.sh roundcube-1.3.6+dfsg.1/debian/install-jsdeps.sh --- roundcube-1.3.3+dfsg.1/debian/install-jsdeps.sh 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/install-jsdeps.sh 2018-04-14 18:52:38.000000000 +0000 @@ -1,9 +1,9 @@ #!/usr/bin/env php += 1.3.0 -1)for(var c=1;cb;++b)e[b]=c[b];return a.buffer=e}function d(a){this.buffer=new(o?Uint16Array:Array)(2*a),this.length=0}function e(a,b){this.e=w,this.f=0,this.input=o&&a instanceof Array?new Uint8Array(a):a,this.c=0,b&&(b.lazy&&(this.f=b.lazy),"number"==typeof b.compressionType&&(this.e=b.compressionType),b.outputBuffer&&(this.b=o&&b.outputBuffer instanceof Array?new Uint8Array(b.outputBuffer):b.outputBuffer),"number"==typeof b.outputIndex&&(this.c=b.outputIndex)),this.b||(this.b=new(o?Uint8Array:Array)(32768))}function f(a,b){this.length=a,this.g=b}function g(a,b){function c(a,b){var c,d=a.g,e=[],f=0;c=z[a.length],e[f++]=65535&c,e[f++]=c>>16&255,e[f++]=c>>24;var g;switch(m){case 1===d:g=[0,d-1,0];break;case 2===d:g=[1,d-2,0];break;case 3===d:g=[2,d-3,0];break;case 4===d:g=[3,d-4,0];break;case 6>=d:g=[4,d-5,1];break;case 8>=d:g=[5,d-7,1];break;case 12>=d:g=[6,d-9,2];break;case 16>=d:g=[7,d-13,2];break;case 24>=d:g=[8,d-17,3];break;case 32>=d:g=[9,d-25,3];break;case 48>=d:g=[10,d-33,4];break;case 64>=d:g=[11,d-49,4];break;case 96>=d:g=[12,d-65,5];break;case 128>=d:g=[13,d-97,5];break;case 192>=d:g=[14,d-129,6];break;case 256>=d:g=[15,d-193,6];break;case 384>=d:g=[16,d-257,7];break;case 512>=d:g=[17,d-385,7];break;case 768>=d:g=[18,d-513,8];break;case 1024>=d:g=[19,d-769,8];break;case 1536>=d:g=[20,d-1025,9];break;case 2048>=d:g=[21,d-1537,9];break;case 3072>=d:g=[22,d-2049,10];break;case 4096>=d:g=[23,d-3073,10];break;case 6144>=d:g=[24,d-4097,11];break;case 8192>=d:g=[25,d-6145,11];break;case 12288>=d:g=[26,d-8193,12];break;case 16384>=d:g=[27,d-12289,12];break;case 24576>=d:g=[28,d-16385,13];break;case 32768>=d:g=[29,d-24577,13];break;default:throw"invalid distance"}c=g,e[f++]=c[0],e[f++]=c[1],e[f++]=c[2];var h,i;for(h=0,i=e.length;i>h;++h)r[s++]=e[h];u[e[0]]++,v[e[3]]++,t=a.length+b-1,n=null}var d,e,f,g,i,j,k,n,p,q={},r=o?new Uint16Array(2*b.length):[],s=0,t=0,u=new(o?Uint32Array:Array)(286),v=new(o?Uint32Array:Array)(30),w=a.f;if(!o){for(f=0;285>=f;)u[f++]=0;for(f=0;29>=f;)v[f++]=0}for(u[256]=1,d=0,e=b.length;e>d;++d){for(f=i=0,g=3;g>f&&d+f!==e;++f)i=i<<8|b[d+f];if(q[i]===l&&(q[i]=[]),j=q[i],!(0=e){for(n&&c(n,-1),f=0,g=e-d;g>f;++f)p=b[d+f],r[s++]=p,++u[p];break}0h;h++){if(d=c[j-h-1],g=3,k>3){for(i=k;i>3;i--)if(a[d+i-1]!==a[b+i-1])continue a;g=k}for(;258>g&&l>b+g&&a[d+g]===a[b+g];)++g;if(g>k&&(e=d,k=g),258===g)break}return new f(k,b-e)}function i(a,b){var c,e,f,g,h,i=a.length,k=new d(572),l=new(o?Uint8Array:Array)(i);if(!o)for(g=0;i>g;g++)l[g]=0;for(g=0;i>g;++g)0g;++g)c[g]=k.pop(),e[g]=c[g].value;for(f=j(e,e.length,b),g=0,h=c.length;h>g;++g)l[c[g].index]=f[g];return l}function j(a,b,c){function d(a){var c=n[a][p[a]];c===b?(d(a+1),d(a+1)):--l[c],++p[a]}var e,f,g,h,i,j=new(o?Uint16Array:Array)(c),k=new(o?Uint8Array:Array)(c),l=new(o?Uint8Array:Array)(b),m=Array(c),n=Array(c),p=Array(c),q=(1<f;++f)r>q?k[f]=0:(k[f]=1,q-=r),q<<=1,j[c-2-f]=(j[c-1-f]/2|0)+b;for(j[0]=k[0],m[0]=Array(j[0]),n[0]=Array(j[0]),f=1;c>f;++f)j[f]>2*j[f-1]+k[f]&&(j[f]=2*j[f-1]+k[f]),m[f]=Array(j[f]),n[f]=Array(j[f]);for(e=0;b>e;++e)l[e]=c;for(g=0;ge;++e)p[e]=0;for(1===k[c-1]&&(--l[0],++p[c-1]),f=c-2;f>=0;--f){for(h=e=0,i=p[f+1],g=0;ga[e]?(m[f][g]=h,n[f][g]=b,i+=2):(m[f][g]=a[e],n[f][g]=e,++e);p[f]=0,1===k[f]&&d(f)}return l}function k(a){var b,c,d,e,f=new(o?Uint16Array:Array)(a.length),g=[],h=[],i=0;for(b=0,c=a.length;c>b;b++)g[a[b]]=(0|g[a[b]])+1;for(b=1,c=16;c>=b;b++)h[b]=i,i+=0|g[b],i<<=1;for(b=0,c=a.length;c>b;b++)for(i=h[a[b]],h[a[b]]+=1,d=f[b]=0,e=a[b];e>d;d++)f[b]=f[b]<<1|1&i,i>>>=1;return f}var l=void 0,m=!0,n=this,o="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array&&"undefined"!=typeof DataView;b.prototype.a=function(a,b,d){var e,f=this.buffer,g=this.index,h=this.d,i=f[g];if(d&&b>1&&(a=b>8?(u[255&a]<<24|u[a>>>8&255]<<16|u[a>>>16&255]<<8|u[a>>>24&255])>>32-b:u[a]>>8-b),8>b+h)i=i<e;++e)i=i<<1|a>>b-e-1&1,8===++h&&(h=0,f[g++]=u[i],i=0,g===f.length&&(f=c(this)));f[g]=i,this.buffer=f,this.d=h,this.index=g},b.prototype.finish=function(){var a,b=this.buffer,c=this.index;return 0p;++p){for(var r=p,s=r,t=7,r=r>>>1;r;r>>>=1)s<<=1,s|=1&r,--t;q[p]=(s<>>0}var u=q;d.prototype.getParent=function(a){return 2*((a-2)/4|0)},d.prototype.push=function(a,b){var c,d,e,f=this.buffer;for(c=this.length,f[this.length++]=b,f[this.length++]=a;c>0&&(d=this.getParent(c),f[c]>f[d]);)e=f[c],f[c]=f[d],f[d]=e,e=f[c+1],f[c+1]=f[d+1],f[d+1]=e,c=d;return this.length},d.prototype.pop=function(){var a,b,c,d,e,f=this.buffer;for(b=f[0],a=f[1],this.length-=2,f[0]=f[this.length],f[1]=f[this.length+1],e=0;(d=2*e+2,!(d>=this.length))&&(d+2f[d]&&(d+=2),f[d]>f[e]);)c=f[e],f[e]=f[d],f[d]=c,c=f[e+1],f[e+1]=f[d+1],f[d+1]=c,e=d;return{index:a,value:b,length:this.length}};var v,w=2,x=[];for(v=0;288>v;v++)switch(m){case 143>=v:x.push([v+48,8]);break;case 255>=v:x.push([v-144+400,9]);break;case 279>=v:x.push([v-256+0,7]);break;case 287>=v:x.push([v-280+192,8]);break;default:throw"invalid literal: "+v}e.prototype.h=function(){var a,c,d,e,f=this.input;switch(this.e){case 0:for(d=0,e=f.length;e>d;){c=o?f.subarray(d,d+65535):f.slice(d,d+65535),d+=c.length;var h=c,j=d===e,n=l,p=l,q=l,r=l,s=l,t=this.b,u=this.c;if(o){for(t=new Uint8Array(this.b.buffer);t.length<=u+h.length+5;)t=new Uint8Array(t.length<<1);t.set(this.b)}if(n=j?1:0,t[u++]=0|n,p=h.length,q=~p+65536&65535,t[u++]=255&p,t[u++]=p>>>8&255,t[u++]=255&q,t[u++]=q>>>8&255,o)t.set(h,u),u+=h.length,t=t.subarray(0,u);else{for(r=0,s=h.length;s>r;++r)t[u++]=h[r];t.length=u}this.c=u,this.b=t}break;case 1:var v=new b(o?new Uint8Array(this.b.buffer):this.b,this.c);v.a(1,1,m),v.a(1,2,m);var y,z,A,B=g(this,f);for(y=0,z=B.length;z>y;y++)if(A=B[y],b.prototype.a.apply(v,x[A]),A>256)v.a(B[++y],B[++y],m),v.a(B[++y],5),v.a(B[++y],B[++y],m);else if(256===A)break;this.b=v.finish(),this.c=this.b.length;break;case w:var C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R=new b(o?new Uint8Array(this.b.buffer):this.b,this.c),S=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],T=Array(19);for(C=w,R.a(1,1,m),R.a(C,2,m),D=g(this,f),H=i(this.j,15),I=k(H),J=i(this.i,7),K=k(J),E=286;E>257&&0===H[E-1];E--);for(F=30;F>1&&0===J[F-1];F--);var U,V,W,X,Y,Z,$=E,_=F,aa=new(o?Uint32Array:Array)($+_),ba=new(o?Uint32Array:Array)(316),ca=new(o?Uint8Array:Array)(19);for(U=V=0;$>U;U++)aa[V++]=H[U];for(U=0;_>U;U++)aa[V++]=J[U];if(!o)for(U=0,X=ca.length;X>U;++U)ca[U]=0;for(U=Y=0,X=aa.length;X>U;U+=V){for(V=1;X>U+V&&aa[U+V]===aa[U];++V);if(W=V,0===aa[U])if(3>W)for(;00;)Z=138>W?W:138,Z>W-3&&W>Z&&(Z=W-3),10>=Z?(ba[Y++]=17,ba[Y++]=Z-3,ca[17]++):(ba[Y++]=18,ba[Y++]=Z-11,ca[18]++),W-=Z;else if(ba[Y++]=aa[U],ca[aa[U]]++,W--,3>W)for(;00;)Z=6>W?W:6,Z>W-3&&W>Z&&(Z=W-3),ba[Y++]=16,ba[Y++]=Z-3,ca[16]++,W-=Z}for(a=o?ba.subarray(0,Y):ba.slice(0,Y),L=i(ca,7),P=0;19>P;P++)T[P]=L[S[P]];for(G=19;G>4&&0===T[G-1];G--);for(M=k(L),R.a(E-257,5,m),R.a(F-1,5,m),R.a(G-4,4,m),P=0;G>P;P++)R.a(T[P],3,m);for(P=0,Q=a.length;Q>P;P++)if(N=a[P],R.a(M[N],L[N],m),N>=16){switch(P++,N){case 16:O=2;break;case 17:O=3;break;case 18:O=7;break;default:throw"invalid code: "+N}R.a(a[P],O,m)}var da,ea,fa,ga,ha,ia,ja,ka,la=[I,H],ma=[K,J];for(ha=la[0],ia=la[1],ja=ma[0],ka=ma[1],da=0,ea=D.length;ea>da;++da)if(fa=D[da],R.a(ha[fa],ia[fa],m),fa>256)R.a(D[++da],D[++da],m),ga=D[++da],R.a(ja[ga],ka[ga],m),R.a(D[++da],D[++da],m);else if(256===fa)break;this.b=R.finish(),this.c=this.b.length;break;default:throw"invalid compression type"}return this.b};var y=function(){function a(a){switch(m){case 3===a:return[257,a-3,0];case 4===a:return[258,a-4,0];case 5===a:return[259,a-5,0];case 6===a:return[260,a-6,0];case 7===a:return[261,a-7,0];case 8===a:return[262,a-8,0];case 9===a:return[263,a-9,0];case 10===a:return[264,a-10,0];case 12>=a:return[265,a-11,1];case 14>=a:return[266,a-13,1];case 16>=a:return[267,a-15,1];case 18>=a:return[268,a-17,1];case 22>=a:return[269,a-19,2];case 26>=a:return[270,a-23,2];case 30>=a:return[271,a-27,2];case 34>=a:return[272,a-31,2];case 42>=a:return[273,a-35,3];case 50>=a:return[274,a-43,3];case 58>=a:return[275,a-51,3];case 66>=a:return[276,a-59,3];case 82>=a:return[277,a-67,4];case 98>=a:return[278,a-83,4];case 114>=a:return[279,a-99,4];case 130>=a:return[280,a-115,4];case 162>=a:return[281,a-131,5];case 194>=a:return[282,a-163,5];case 226>=a:return[283,a-195,5];case 257>=a:return[284,a-227,5];case 258===a:return[285,a-258,0];default:throw"invalid length: "+a}}var b,c,d=[];for(b=3;258>=b;b++)c=a(b),d[b]=c[2]<<24|c[1]<<16|c[0];return d}(),z=o?new Uint32Array(y):y;a("Zlib.RawDeflate",e),a("Zlib.RawDeflate.prototype.compress",e.prototype.h);var A,B,C,D,E={NONE:0,FIXED:1,DYNAMIC:w};if(Object.keys)A=Object.keys(E);else for(B in A=[],C=0,E)A[C++]=B;for(C=0,D=A.length;D>C;++C)B=A[C],a("Zlib.RawDeflate.CompressionType."+B,E[B])}).call(this)},{}],14:[function(a,b,c){(function(){"use strict";function a(a,b){var c=a.split("."),d=g;!(c[0]in d)&&d.execScript&&d.execScript("var "+c[0]);for(var e;c.length&&(e=c.shift());)c.length||void 0===b?d=d[e]?d[e]:d[e]={}:d[e]=b}function b(a){var b,c,d,e,f,g,i,j,k,l,m=a.length,n=0,o=Number.POSITIVE_INFINITY;for(j=0;m>j;++j)a[j]>n&&(n=a[j]),a[j]=d;){for(j=0;m>j;++j)if(a[j]===d){for(g=0,i=e,k=0;d>k;++k)g=g<<1|1&i,i>>=1;for(l=d<<16|j,k=g;b>k;k+=f)c[k]=l;++e}++d,e<<=1,f<<=1}return[c,n,o]}function c(a,b){switch(this.g=[],this.h=32768,this.c=this.f=this.d=this.k=0,this.input=h?new Uint8Array(a):a,this.l=!1,this.i=j,this.q=!1,(b||!(b={}))&&(b.index&&(this.d=b.index),b.bufferSize&&(this.h=b.bufferSize),b.bufferType&&(this.i=b.bufferType),b.resize&&(this.q=b.resize)),this.i){case i:this.a=32768,this.b=new(h?Uint8Array:Array)(32768+this.h+258);break;case j:this.a=0,this.b=new(h?Uint8Array:Array)(this.h),this.e=this.v,this.m=this.s,this.j=this.t;break;default:throw Error("invalid inflate mode")}}function d(a,b){for(var c,d=a.f,e=a.c,f=a.input,g=a.d,h=f.length;b>e;){if(g>=h)throw Error("input buffer is broken");d|=f[g++]<>>b,a.c=e-b,a.d=g,c}function e(a,b){for(var c,d,e=a.f,f=a.c,g=a.input,h=a.d,i=g.length,j=b[0],k=b[1];k>f&&!(h>=i);)e|=g[h++]<>>16,a.f=e>>d,a.c=f-d,a.d=h,65535&c}function f(a){function c(a,b,c){var f,g,h,i=this.p;for(h=0;a>h;)switch(f=e(this,b)){case 16:for(g=3+d(this,2);g--;)c[h++]=i;break;case 17:for(g=3+d(this,3);g--;)c[h++]=0;i=0;break;case 18:for(g=11+d(this,7);g--;)c[h++]=0;i=0;break;default:i=c[h++]=f}return this.p=i,c}var f,g,i,j,k=d(a,5)+257,l=d(a,5)+1,m=d(a,4)+4,o=new(h?Uint8Array:Array)(n.length);for(j=0;m>j;++j)o[n[j]]=d(a,3);if(!h)for(j=m,m=o.length;m>j;++j)o[n[j]]=0;f=b(o),g=new(h?Uint8Array:Array)(k),i=new(h?Uint8Array:Array)(l),a.p=0,a.j(b(c.call(a,k,f,g)),b(c.call(a,l,f,i)))}var g=this,h="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array&&"undefined"!=typeof DataView,i=0,j=1;c.prototype.u=function(){for(;!this.l;){var a=d(this,3);switch(1&a&&(this.l=!0),a>>>=1){case 0:var b=this.input,c=this.d,e=this.b,g=this.a,k=b.length,l=void 0,m=void 0,n=e.length,o=void 0;if(this.c=this.f=0,c+1>=k)throw Error("invalid uncompressed block header: LEN");if(l=b[c++]|b[c++]<<8,c+1>=k)throw Error("invalid uncompressed block header: NLEN");if(m=b[c++]|b[c++]<<8,l===~m)throw Error("invalid uncompressed block header: length verify");if(c+l>b.length)throw Error("input buffer is broken");switch(this.i){case i:for(;g+l>e.length;){if(o=n-g,l-=o,h)e.set(b.subarray(c,c+o),g),g+=o,c+=o;else for(;o--;)e[g++]=b[c++];this.a=g,e=this.e(),g=this.a}break;case j:for(;g+l>e.length;)e=this.e({o:2});break;default:throw Error("invalid inflate mode")}if(h)e.set(b.subarray(c,c+l),g),g+=l,c+=l;else for(;l--;)e[g++]=b[c++];this.d=c,this.a=g,this.b=e;break;case 1:this.j(z,B);break;case 2:f(this);break;default:throw Error("unknown BTYPE: "+a)}}return this.m()};var k,l,m=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],n=h?new Uint16Array(m):m,o=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],p=h?new Uint16Array(o):o,q=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],r=h?new Uint8Array(q):q,s=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],t=h?new Uint16Array(s):s,u=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],v=h?new Uint8Array(u):u,w=new(h?Uint8Array:Array)(288);for(k=0,l=w.length;l>k;++k)w[k]=143>=k?8:255>=k?9:279>=k?7:8;var x,y,z=b(w),A=new(h?Uint8Array:Array)(30);for(x=0,y=A.length;y>x;++x)A[x]=5;var B=b(A);c.prototype.j=function(a,b){var c=this.b,f=this.a;this.n=a;for(var g,h,i,j,k=c.length-258;256!==(g=e(this,a));)if(256>g)f>=k&&(this.a=f,c=this.e(),f=this.a),c[f++]=g;else for(h=g-257,j=p[h],0=k&&(this.a=f,c=this.e(),f=this.a);j--;)c[f]=c[f++-i];for(;8<=this.c;)this.c-=8,this.d--;this.a=f},c.prototype.t=function(a,b){var c=this.b,f=this.a;this.n=a;for(var g,h,i,j,k=c.length;256!==(g=e(this,a));)if(256>g)f>=k&&(c=this.e(),k=c.length),c[f++]=g;else for(h=g-257,j=p[h],0k&&(c=this.e(),k=c.length);j--;)c[f]=c[f++-i];for(;8<=this.c;)this.c-=8,this.d--;this.a=f},c.prototype.e=function(){var a,b,c=new(h?Uint8Array:Array)(this.a-32768),d=this.a-32768,e=this.b;if(h)c.set(e.subarray(32768,c.length));else for(a=0,b=c.length;b>a;++a)c[a]=e[a+32768];if(this.g.push(c),this.k+=c.length,h)e.set(e.subarray(d,d+32768));else for(a=0;32768>a;++a)e[a]=e[d+a];return this.a=32768,e},c.prototype.v=function(a){var b,c,d,e,f=this.input.length/this.d+1|0,g=this.input,i=this.b;return a&&("number"==typeof a.o&&(f=a.o),"number"==typeof a.r&&(f+=a.r)),2>f?(c=(g.length-this.d)/this.n[2],e=258*(c/2)|0,d=eb;++b)for(a=i[b],d=0,e=a.length;e>d;++d)j[f++]=a[d];for(b=32768,c=this.a;c>b;++b)j[f++]=g[b];return this.g=[],this.buffer=j},c.prototype.s=function(){var a,b=this.a;return h?this.q?(a=new Uint8Array(b),a.set(this.b.subarray(0,b))):a=this.b.subarray(0,b):(this.b.length>b&&(this.b.length=b),a=this.b),this.buffer=a},a("Zlib.RawInflate",c),a("Zlib.RawInflate.prototype.decompress",c.prototype.u);var C,D,E,F,G={ADAPTIVE:j,BLOCK:i};if(Object.keys)C=Object.keys(G);else for(D in C=[],E=0,G)C[E++]=D;for(E=0,F=C.length;F>E;++E)D=C[E],a("Zlib.RawInflate.BufferType."+D,G[D])}).call(this)},{}],15:[function(a,b,c){(function(){"use strict";function a(a){throw a}function b(a,b){var c=a.split("."),d=w;!(c[0]in d)&&d.execScript&&d.execScript("var "+c[0]);for(var e;c.length&&(e=c.shift());)c.length||b===u?d=d[e]?d[e]:d[e]={}:d[e]=b}function c(b,c){this.index="number"==typeof c?c:0,this.i=0,this.buffer=b instanceof(x?Uint8Array:Array)?b:new(x?Uint8Array:Array)(32768),2*this.buffer.length<=this.index&&a(Error("invalid index")),this.buffer.length<=this.index&&this.f()}function d(a){this.buffer=new(x?Uint16Array:Array)(2*a),this.length=0}function e(a){var b,c,d,e,f,g,h,i,j,k,l=a.length,m=0,n=Number.POSITIVE_INFINITY;for(i=0;l>i;++i)a[i]>m&&(m=a[i]),a[i]=d;){for(i=0;l>i;++i)if(a[i]===d){for(g=0,h=e,j=0;d>j;++j)g=g<<1|1&h,h>>=1;for(k=d<<16|i,j=g;b>j;j+=f)c[j]=k;++e}++d,e<<=1,f<<=1}return[c,m,n]}function f(a,b){this.h=F,this.w=0,this.input=x&&a instanceof Array?new Uint8Array(a):a,this.b=0,b&&(b.lazy&&(this.w=b.lazy),"number"==typeof b.compressionType&&(this.h=b.compressionType),b.outputBuffer&&(this.a=x&&b.outputBuffer instanceof Array?new Uint8Array(b.outputBuffer):b.outputBuffer),"number"==typeof b.outputIndex&&(this.b=b.outputIndex)),this.a||(this.a=new(x?Uint8Array:Array)(32768))}function g(a,b){this.length=a,this.H=b}function h(b,c){function d(b,c){var d,e=b.H,f=[],g=0;d=J[b.length],f[g++]=65535&d,f[g++]=d>>16&255,f[g++]=d>>24;var h;switch(v){case 1===e:h=[0,e-1,0];break;case 2===e:h=[1,e-2,0];break;case 3===e:h=[2,e-3,0];break;case 4===e:h=[3,e-4,0];break;case 6>=e:h=[4,e-5,1];break;case 8>=e:h=[5,e-7,1];break;case 12>=e:h=[6,e-9,2];break;case 16>=e:h=[7,e-13,2];break;case 24>=e:h=[8,e-17,3];break;case 32>=e:h=[9,e-25,3];break;case 48>=e:h=[10,e-33,4];break;case 64>=e:h=[11,e-49,4];break;case 96>=e:h=[12,e-65,5];break;case 128>=e:h=[13,e-97,5];break;case 192>=e:h=[14,e-129,6];break;case 256>=e:h=[15,e-193,6];break;case 384>=e:h=[16,e-257,7];break;case 512>=e:h=[17,e-385,7];break;case 768>=e:h=[18,e-513,8];break;case 1024>=e:h=[19,e-769,8];break;case 1536>=e:h=[20,e-1025,9];break;case 2048>=e:h=[21,e-1537,9];break;case 3072>=e:h=[22,e-2049,10];break;case 4096>=e:h=[23,e-3073,10];break;case 6144>=e:h=[24,e-4097,11];break;case 8192>=e:h=[25,e-6145,11];break;case 12288>=e:h=[26,e-8193,12];break;case 16384>=e:h=[27,e-12289,12];break;case 24576>=e:h=[28,e-16385,13];break;case 32768>=e:h=[29,e-24577,13];break;default:a("invalid distance")}d=h,f[g++]=d[0],f[g++]=d[1],f[g++]=d[2];var i,j;for(i=0,j=f.length;j>i;++i)p[q++]=f[i];s[f[0]]++,t[f[3]]++,r=b.length+c-1,m=null}var e,f,g,h,j,k,l,m,n,o={},p=x?new Uint16Array(2*c.length):[],q=0,r=0,s=new(x?Uint32Array:Array)(286),t=new(x?Uint32Array:Array)(30),w=b.w;if(!x){for(g=0;285>=g;)s[g++]=0;for(g=0;29>=g;)t[g++]=0}for(s[256]=1,e=0,f=c.length;f>e;++e){for(g=j=0,h=3;h>g&&e+g!==f;++g)j=j<<8|c[e+g];if(o[j]===u&&(o[j]=[]),k=o[j],!(0=f){for(m&&d(m,-1),g=0,h=f-e;h>g;++g)n=c[e+g],p[q++]=n,++s[n];break}0h;h++){if(d=c[j-h-1],f=3,k>3){for(i=k;i>3;i--)if(a[d+i-1]!==a[b+i-1])continue a;f=k}for(;258>f&&l>b+f&&a[d+f]===a[b+f];)++f;if(f>k&&(e=d,k=f),258===f)break}return new g(k,b-e)}function j(a,b){var c,e,f,g,h,i=a.length,j=new d(572),l=new(x?Uint8Array:Array)(i);if(!x)for(g=0;i>g;g++)l[g]=0;for(g=0;i>g;++g)0g;++g)c[g]=j.pop(),e[g]=c[g].value;for(f=k(e,e.length,b),g=0,h=c.length;h>g;++g)l[c[g].index]=f[g];return l}function k(a,b,c){function d(a){var c=n[a][o[a]];c===b?(d(a+1),d(a+1)):--l[c],++o[a]}var e,f,g,h,i,j=new(x?Uint16Array:Array)(c),k=new(x?Uint8Array:Array)(c),l=new(x?Uint8Array:Array)(b),m=Array(c),n=Array(c),o=Array(c),p=(1<f;++f)q>p?k[f]=0:(k[f]=1,p-=q),p<<=1,j[c-2-f]=(j[c-1-f]/2|0)+b;for(j[0]=k[0],m[0]=Array(j[0]),n[0]=Array(j[0]),f=1;c>f;++f)j[f]>2*j[f-1]+k[f]&&(j[f]=2*j[f-1]+k[f]),m[f]=Array(j[f]),n[f]=Array(j[f]);for(e=0;b>e;++e)l[e]=c;for(g=0;ge;++e)o[e]=0;for(1===k[c-1]&&(--l[0],++o[c-1]),f=c-2;f>=0;--f){for(h=e=0,i=o[f+1],g=0;ga[e]?(m[f][g]=h,n[f][g]=b,i+=2):(m[f][g]=a[e],n[f][g]=e,++e);o[f]=0,1===k[f]&&d(f)}return l}function l(a){var b,c,d,e,f=new(x?Uint16Array:Array)(a.length),g=[],h=[],i=0;for(b=0,c=a.length;c>b;b++)g[a[b]]=(0|g[a[b]])+1;for(b=1,c=16;c>=b;b++)h[b]=i,i+=0|g[b],i<<=1;for(b=0,c=a.length;c>b;b++)for(i=h[a[b]],h[a[b]]+=1,d=f[b]=0,e=a[b];e>d;d++)f[b]=f[b]<<1|1&i,i>>>=1;return f}function m(b,c){switch(this.l=[],this.m=32768,this.e=this.g=this.c=this.q=0,this.input=x?new Uint8Array(b):b,this.s=!1,this.n=L,this.C=!1,(c||!(c={}))&&(c.index&&(this.c=c.index),c.bufferSize&&(this.m=c.bufferSize),c.bufferType&&(this.n=c.bufferType),c.resize&&(this.C=c.resize)),this.n){case K:this.b=32768,this.a=new(x?Uint8Array:Array)(32768+this.m+258);break;case L:this.b=0,this.a=new(x?Uint8Array:Array)(this.m),this.f=this.K,this.t=this.I,this.o=this.J;break;default:a(Error("invalid inflate mode"))}}function n(b,c){for(var d,e=b.g,f=b.e,g=b.input,h=b.c,i=g.length;c>f;)h>=i&&a(Error("input buffer is broken")),e|=g[h++]<>>c,b.e=f-c,b.c=h,d}function o(a,b){for(var c,d,e=a.g,f=a.e,g=a.input,h=a.c,i=g.length,j=b[0],k=b[1];k>f&&!(h>=i);)e|=g[h++]<>>16,a.g=e>>d,a.e=f-d,a.c=h,65535&c}function p(a){function b(a,b,c){var d,e,f,g=this.z;for(f=0;a>f;)switch(d=o(this,b)){case 16:for(e=3+n(this,2);e--;)c[f++]=g;break;case 17:for(e=3+n(this,3);e--;)c[f++]=0;g=0;break;case 18:for(e=11+n(this,7);e--;)c[f++]=0;g=0;break;default:g=c[f++]=d}return this.z=g,c}var c,d,f,g,h=n(a,5)+257,i=n(a,5)+1,j=n(a,4)+4,k=new(x?Uint8Array:Array)(Q.length);for(g=0;j>g;++g)k[Q[g]]=n(a,3);if(!x)for(g=j,j=k.length;j>g;++g)k[Q[g]]=0;c=e(k),d=new(x?Uint8Array:Array)(h),f=new(x?Uint8Array:Array)(i),a.z=0,a.o(e(b.call(a,h,c,d)),e(b.call(a,i,c,f)))}function q(a){if("string"==typeof a){var b,c,d=a.split("");for(b=0,c=d.length;c>b;b++)d[b]=(255&d[b].charCodeAt(0))>>>0;a=d}for(var e,f=1,g=0,h=a.length,i=0;h>0;){e=h>1024?1024:h,h-=e;do f+=a[i++],g+=f;while(--e);f%=65521,g%=65521}return(g<<16|f)>>>0}function r(b,c){var d,e;switch(this.input=b,this.c=0,(c||!(c={}))&&(c.index&&(this.c=c.index),c.verify&&(this.N=c.verify)),d=b[this.c++],e=b[this.c++],15&d){case da:this.method=da;break;default:a(Error("unsupported compression method"))}0!==((d<<8)+e)%31&&a(Error("invalid fcheck flag:"+((d<<8)+e)%31)), -32&e&&a(Error("fdict flag is not supported")),this.B=new m(b,{index:this.c,bufferSize:c.bufferSize,bufferType:c.bufferType,resize:c.resize})}function s(a,b){this.input=a,this.a=new(x?Uint8Array:Array)(32768),this.h=ea.k;var c,d={};!b&&(b={})||"number"!=typeof b.compressionType||(this.h=b.compressionType);for(c in b)d[c]=b[c];d.outputBuffer=this.a,this.A=new f(this.input,d)}function t(a,c){var d,e,f,g;if(Object.keys)d=Object.keys(c);else for(e in d=[],f=0,c)d[f++]=e;for(f=0,g=d.length;g>f;++f)e=d[f],b(a+"."+e,c[e])}var u=void 0,v=!0,w=this,x="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array&&"undefined"!=typeof DataView;c.prototype.f=function(){var a,b=this.buffer,c=b.length,d=new(x?Uint8Array:Array)(c<<1);if(x)d.set(b);else for(a=0;c>a;++a)d[a]=b[a];return this.buffer=d},c.prototype.d=function(a,b,c){var d,e=this.buffer,f=this.index,g=this.i,h=e[f];if(c&&b>1&&(a=b>8?(D[255&a]<<24|D[a>>>8&255]<<16|D[a>>>16&255]<<8|D[a>>>24&255])>>32-b:D[a]>>8-b),8>b+g)h=h<d;++d)h=h<<1|a>>b-d-1&1,8===++g&&(g=0,e[f++]=D[h],h=0,f===e.length&&(e=this.f()));e[f]=h,this.buffer=e,this.i=g,this.index=f},c.prototype.finish=function(){var a,b=this.buffer,c=this.index;return 0y;++y){for(var A=y,B=A,C=7,A=A>>>1;A;A>>>=1)B<<=1,B|=1&A,--C;z[y]=(B<>>0}var D=z;d.prototype.getParent=function(a){return 2*((a-2)/4|0)},d.prototype.push=function(a,b){var c,d,e,f=this.buffer;for(c=this.length,f[this.length++]=b,f[this.length++]=a;c>0&&(d=this.getParent(c),f[c]>f[d]);)e=f[c],f[c]=f[d],f[d]=e,e=f[c+1],f[c+1]=f[d+1],f[d+1]=e,c=d;return this.length},d.prototype.pop=function(){var a,b,c,d,e,f=this.buffer;for(b=f[0],a=f[1],this.length-=2,f[0]=f[this.length],f[1]=f[this.length+1],e=0;(d=2*e+2,!(d>=this.length))&&(d+2f[d]&&(d+=2),f[d]>f[e]);)c=f[e],f[e]=f[d],f[d]=c,c=f[e+1],f[e+1]=f[d+1],f[d+1]=c,e=d;return{index:a,value:b,length:this.length}};var E,F=2,G={NONE:0,r:1,k:F,O:3},H=[];for(E=0;288>E;E++)switch(v){case 143>=E:H.push([E+48,8]);break;case 255>=E:H.push([E-144+400,9]);break;case 279>=E:H.push([E-256+0,7]);break;case 287>=E:H.push([E-280+192,8]);break;default:a("invalid literal: "+E)}f.prototype.j=function(){var b,d,e,f,g=this.input;switch(this.h){case 0:for(e=0,f=g.length;f>e;){d=x?g.subarray(e,e+65535):g.slice(e,e+65535),e+=d.length;var i=d,k=e===f,m=u,n=u,o=u,p=u,q=u,r=this.a,s=this.b;if(x){for(r=new Uint8Array(this.a.buffer);r.length<=s+i.length+5;)r=new Uint8Array(r.length<<1);r.set(this.a)}if(m=k?1:0,r[s++]=0|m,n=i.length,o=~n+65536&65535,r[s++]=255&n,r[s++]=n>>>8&255,r[s++]=255&o,r[s++]=o>>>8&255,x)r.set(i,s),s+=i.length,r=r.subarray(0,s);else{for(p=0,q=i.length;q>p;++p)r[s++]=i[p];r.length=s}this.b=s,this.a=r}break;case 1:var t=new c(x?new Uint8Array(this.a.buffer):this.a,this.b);t.d(1,1,v),t.d(1,2,v);var w,y,z,A=h(this,g);for(w=0,y=A.length;y>w;w++)if(z=A[w],c.prototype.d.apply(t,H[z]),z>256)t.d(A[++w],A[++w],v),t.d(A[++w],5),t.d(A[++w],A[++w],v);else if(256===z)break;this.a=t.finish(),this.b=this.a.length;break;case F:var B,C,D,E,G,I,J,K,L,M,N,O,P,Q,R,S=new c(x?new Uint8Array(this.a.buffer):this.a,this.b),T=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],U=Array(19);for(B=F,S.d(1,1,v),S.d(B,2,v),C=h(this,g),I=j(this.M,15),J=l(I),K=j(this.L,7),L=l(K),D=286;D>257&&0===I[D-1];D--);for(E=30;E>1&&0===K[E-1];E--);var V,W,X,Y,Z,$,_=D,aa=E,ba=new(x?Uint32Array:Array)(_+aa),ca=new(x?Uint32Array:Array)(316),da=new(x?Uint8Array:Array)(19);for(V=W=0;_>V;V++)ba[W++]=I[V];for(V=0;aa>V;V++)ba[W++]=K[V];if(!x)for(V=0,Y=da.length;Y>V;++V)da[V]=0;for(V=Z=0,Y=ba.length;Y>V;V+=W){for(W=1;Y>V+W&&ba[V+W]===ba[V];++W);if(X=W,0===ba[V])if(3>X)for(;00;)$=138>X?X:138,$>X-3&&X>$&&($=X-3),10>=$?(ca[Z++]=17,ca[Z++]=$-3,da[17]++):(ca[Z++]=18,ca[Z++]=$-11,da[18]++),X-=$;else if(ca[Z++]=ba[V],da[ba[V]]++,X--,3>X)for(;00;)$=6>X?X:6,$>X-3&&X>$&&($=X-3),ca[Z++]=16,ca[Z++]=$-3,da[16]++,X-=$}for(b=x?ca.subarray(0,Z):ca.slice(0,Z),M=j(da,7),Q=0;19>Q;Q++)U[Q]=M[T[Q]];for(G=19;G>4&&0===U[G-1];G--);for(N=l(M),S.d(D-257,5,v),S.d(E-1,5,v),S.d(G-4,4,v),Q=0;G>Q;Q++)S.d(U[Q],3,v);for(Q=0,R=b.length;R>Q;Q++)if(O=b[Q],S.d(N[O],M[O],v),O>=16){switch(Q++,O){case 16:P=2;break;case 17:P=3;break;case 18:P=7;break;default:a("invalid code: "+O)}S.d(b[Q],P,v)}var ea,fa,ga,ha,ia,ja,ka,la,ma=[J,I],na=[L,K];for(ia=ma[0],ja=ma[1],ka=na[0],la=na[1],ea=0,fa=C.length;fa>ea;++ea)if(ga=C[ea],S.d(ia[ga],ja[ga],v),ga>256)S.d(C[++ea],C[++ea],v),ha=C[++ea],S.d(ka[ha],la[ha],v),S.d(C[++ea],C[++ea],v);else if(256===ga)break;this.a=S.finish(),this.b=this.a.length;break;default:a("invalid compression type")}return this.a};var I=function(){function b(b){switch(v){case 3===b:return[257,b-3,0];case 4===b:return[258,b-4,0];case 5===b:return[259,b-5,0];case 6===b:return[260,b-6,0];case 7===b:return[261,b-7,0];case 8===b:return[262,b-8,0];case 9===b:return[263,b-9,0];case 10===b:return[264,b-10,0];case 12>=b:return[265,b-11,1];case 14>=b:return[266,b-13,1];case 16>=b:return[267,b-15,1];case 18>=b:return[268,b-17,1];case 22>=b:return[269,b-19,2];case 26>=b:return[270,b-23,2];case 30>=b:return[271,b-27,2];case 34>=b:return[272,b-31,2];case 42>=b:return[273,b-35,3];case 50>=b:return[274,b-43,3];case 58>=b:return[275,b-51,3];case 66>=b:return[276,b-59,3];case 82>=b:return[277,b-67,4];case 98>=b:return[278,b-83,4];case 114>=b:return[279,b-99,4];case 130>=b:return[280,b-115,4];case 162>=b:return[281,b-131,5];case 194>=b:return[282,b-163,5];case 226>=b:return[283,b-195,5];case 257>=b:return[284,b-227,5];case 258===b:return[285,b-258,0];default:a("invalid length: "+b)}}var c,d,e=[];for(c=3;258>=c;c++)d=b(c),e[c]=d[2]<<24|d[1]<<16|d[0];return e}(),J=x?new Uint32Array(I):I,K=0,L=1,M={F:K,D:L};m.prototype.p=function(){for(;!this.s;){var b=n(this,3);switch(1&b&&(this.s=v),b>>>=1){case 0:var c=this.input,d=this.c,e=this.a,f=this.b,g=c.length,h=u,i=u,j=e.length,k=u;switch(this.e=this.g=0,d+1>=g&&a(Error("invalid uncompressed block header: LEN")),h=c[d++]|c[d++]<<8,d+1>=g&&a(Error("invalid uncompressed block header: NLEN")),i=c[d++]|c[d++]<<8,h===~i&&a(Error("invalid uncompressed block header: length verify")),d+h>c.length&&a(Error("input buffer is broken")),this.n){case K:for(;f+h>e.length;){if(k=j-f,h-=k,x)e.set(c.subarray(d,d+k),f),f+=k,d+=k;else for(;k--;)e[f++]=c[d++];this.b=f,e=this.f(),f=this.b}break;case L:for(;f+h>e.length;)e=this.f({v:2});break;default:a(Error("invalid inflate mode"))}if(x)e.set(c.subarray(d,d+h),f),f+=h,d+=h;else for(;h--;)e[f++]=c[d++];this.c=d,this.b=f,this.a=e;break;case 1:this.o(aa,ca);break;case 2:p(this);break;default:a(Error("unknown BTYPE: "+b))}}return this.t()};var N,O,P=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],Q=x?new Uint16Array(P):P,R=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],S=x?new Uint16Array(R):R,T=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],U=x?new Uint8Array(T):T,V=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],W=x?new Uint16Array(V):V,X=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],Y=x?new Uint8Array(X):X,Z=new(x?Uint8Array:Array)(288);for(N=0,O=Z.length;O>N;++N)Z[N]=143>=N?8:255>=N?9:279>=N?7:8;var $,_,aa=e(Z),ba=new(x?Uint8Array:Array)(30);for($=0,_=ba.length;_>$;++$)ba[$]=5;var ca=e(ba);m.prototype.o=function(a,b){var c=this.a,d=this.b;this.u=a;for(var e,f,g,h,i=c.length-258;256!==(e=o(this,a));)if(256>e)d>=i&&(this.b=d,c=this.f(),d=this.b),c[d++]=e;else for(f=e-257,h=S[f],0=i&&(this.b=d,c=this.f(),d=this.b);h--;)c[d]=c[d++-g];for(;8<=this.e;)this.e-=8,this.c--;this.b=d},m.prototype.J=function(a,b){var c=this.a,d=this.b;this.u=a;for(var e,f,g,h,i=c.length;256!==(e=o(this,a));)if(256>e)d>=i&&(c=this.f(),i=c.length),c[d++]=e;else for(f=e-257,h=S[f],0i&&(c=this.f(),i=c.length);h--;)c[d]=c[d++-g];for(;8<=this.e;)this.e-=8,this.c--;this.b=d},m.prototype.f=function(){var a,b,c=new(x?Uint8Array:Array)(this.b-32768),d=this.b-32768,e=this.a;if(x)c.set(e.subarray(32768,c.length));else for(a=0,b=c.length;b>a;++a)c[a]=e[a+32768];if(this.l.push(c),this.q+=c.length,x)e.set(e.subarray(d,d+32768));else for(a=0;32768>a;++a)e[a]=e[d+a];return this.b=32768,e},m.prototype.K=function(a){var b,c,d,e,f=this.input.length/this.c+1|0,g=this.input,h=this.a;return a&&("number"==typeof a.v&&(f=a.v),"number"==typeof a.G&&(f+=a.G)),2>f?(c=(g.length-this.c)/this.u[2],e=258*(c/2)|0,d=eb;++b)for(a=h[b],d=0,e=a.length;e>d;++d)i[f++]=a[d];for(b=32768,c=this.b;c>b;++b)i[f++]=g[b];return this.l=[],this.buffer=i},m.prototype.I=function(){var a,b=this.b;return x?this.C?(a=new Uint8Array(b),a.set(this.a.subarray(0,b))):a=this.a.subarray(0,b):(this.a.length>b&&(this.a.length=b),a=this.a),this.buffer=a},r.prototype.p=function(){var b,c,d=this.input;return b=this.B.p(),this.c=this.B.c,this.N&&(c=(d[this.c++]<<24|d[this.c++]<<16|d[this.c++]<<8|d[this.c++])>>>0,c!==q(b)&&a(Error("invalid adler-32 checksum"))),b};var da=8,ea=G;s.prototype.j=function(){var b,c,d,e,f,g,h,i=0;switch(h=this.a,b=da){case da:c=Math.LOG2E*Math.log(32768)-8;break;default:a(Error("invalid compression method"))}switch(d=c<<4|b,h[i++]=d,b){case da:switch(this.h){case ea.NONE:f=0;break;case ea.r:f=1;break;case ea.k:f=2;break;default:a(Error("unsupported compression type"))}break;default:a(Error("invalid compression method"))}return e=f<<6|0,h[i++]=e|31-(256*d+e)%31,g=q(this.input),this.A.b=i,h=this.A.j(),i=h.length,x&&(h=new Uint8Array(h.buffer),h.length<=i+4&&(this.a=new Uint8Array(h.length+4),this.a.set(h),h=this.a),h=h.subarray(0,i+4)),h[i++]=g>>24&255,h[i++]=g>>16&255,h[i++]=g>>8&255,h[i++]=255&g,h},b("Zlib.Inflate",r),b("Zlib.Inflate.prototype.decompress",r.prototype.p),t("Zlib.Inflate.BufferType",{ADAPTIVE:M.D,BLOCK:M.F}),b("Zlib.Deflate",s),b("Zlib.Deflate.compress",function(a,b){return new s(a,b).j()}),b("Zlib.Deflate.prototype.compress",s.prototype.j),t("Zlib.Deflate.CompressionType",{NONE:ea.NONE,FIXED:ea.r,DYNAMIC:ea.k})}).call(this)},{}],16:[function(a,b,c){var d=a("../enums.js");b.exports={prefer_hash_algorithm:d.hash.sha256,encryption_cipher:d.symmetric.aes256,compression:d.compression.zip,integrity_protect:!0,ignore_mdc_error:!1,rsa_blinding:!0,useWebCrypto:!0,show_version:!0,show_comment:!0,versionstring:"OpenPGP.js v1.6.2",commentstring:"http://openpgpjs.org",keyserver:"https://keyserver.ubuntu.com",node_store:"./openpgp.store",debug:!1}},{"../enums.js":43}],17:[function(a,b,c){b.exports=a("./config.js")},{"./config.js":16}],18:[function(a,b,c){"use strict";var d=a("../util.js"),e=a("./cipher");b.exports={encrypt:function(a,b,c,f,g){b=new e[b](f);var h=b.blockSize,i=new Uint8Array(h),j=new Uint8Array(h);a=a+a.charAt(h-2)+a.charAt(h-1);var k,l,m,n=new Uint8Array(c.length+2+2*h),o=g?0:2;for(k=0;h>k;k++)i[k]=0;for(j=b.encrypt(i),k=0;h>k;k++)n[k]=j[k]^a.charCodeAt(k);for(i.set(n.subarray(0,h)),j=b.encrypt(i),n[h]=j[0]^a.charCodeAt(h),n[h+1]=j[1]^a.charCodeAt(h+1),g?i.set(n.subarray(2,h+2)):i.set(n.subarray(0,h)),j=b.encrypt(i),k=0;h>k;k++)n[h+2+k]=j[k+o]^c.charCodeAt(k);for(l=h;lk;k++)n[h+m+k]=j[k]^c.charCodeAt(l+k-o);return n=n.subarray(0,c.length+2+h),d.Uint8Array2str(n)},mdc:function(a,b,c){a=new e[a](b);var f,g=a.blockSize,h=new Uint8Array(g),i=new Uint8Array(g);for(f=0;g>f;f++)h[f]=0;for(h=a.encrypt(h),f=0;g>f;f++)i[f]=c.charCodeAt(f),h[f]^=i[f];return i=a.encrypt(i),d.bin2str(h)+String.fromCharCode(i[0]^c.charCodeAt(g))+String.fromCharCode(i[1]^c.charCodeAt(g+1))},decrypt:function(a,b,c,d){a=new e[a](b);var f,g=a.blockSize,h=new Uint8Array(g),i=new Uint8Array(g),j="",k=[];for(f=0;g>f;f++)h[f]=0;for(h=a.encrypt(h),f=0;g>f;f++)i[f]=c.charCodeAt(f),h[f]^=i[f];if(i=a.encrypt(i),h[g-2]!=(i[0]^c.charCodeAt(g))||h[g-1]!=(i[1]^c.charCodeAt(g+1)))throw new Error("CFB decrypt: invalid key");if(d){for(f=0;g>f;f++)h[f]=c.charCodeAt(f+2);for(j=g+2;jf&&f+jf;f++)h[f]=c.charCodeAt(f);for(j=g;jf&&f+jg*j;){var m=a.encrypt(d.str2bin(i));h=c.substring(j*g,j*g+g);for(var n=0;ng;g++)i+=String.fromCharCode(0);else i=f.substring(0,h);for(;c.length>h*j;){var m=a.encrypt(d.str2bin(i));for(i=c.substring(j*h+l,j*h+h+l),g=0;g>8&255}function f(a){return a>>16&255}function g(a){return a>>24&255}function h(a,b,c,d){return e(p[255&a])|e(p[b>>8&255])<<8|e(p[c>>16&255])<<16|e(p[d>>>24])<<24}function i(a){var b,c,d=a.length,e=new Array(d/4);if(a&&!(d%4)){for(b=0,c=0;d>c;c+=4)e[b++]=a[c]|a[c+1]<<8|a[c+2]<<16|a[c+3]<<24;return e}}function j(a){var b,c=0,h=a.length,i=new Array(4*h);for(b=0;h>b;b++)i[c++]=d(a[b]),i[c++]=e(a[b]),i[c++]=f(a[b]),i[c++]=g(a[b]);return i}function k(a){var b,c,h,i,j,k,l=new Array(u+1),m=a.length,p=new Array(t),q=new Array(t),r=0;if(16==m)k=10,b=4;else if(24==m)k=12,b=6;else{if(32!=m)throw new Error("Invalid key-length for AES key:"+m);k=14,b=8}for(c=0;u+1>c;c++)l[c]=new Uint32Array(4);for(c=0,h=0;m>h;h++,c+=4)p[h]=a.charCodeAt(c)|a.charCodeAt(c+1)<<8|a.charCodeAt(c+2)<<16|a.charCodeAt(c+3)<<24;for(h=b-1;h>=0;h--)q[h]=p[h];for(i=0,j=0,h=0;b>h&&k+1>i;){for(;b>h&&4>j;h++,j++)l[i][j]=q[h];4==j&&(i++,j=0)}for(;k+1>i;){var s=q[b-1];if(q[0]^=o[e(s)]|o[f(s)]<<8|o[g(s)]<<16|o[d(s)]<<24,q[0]^=n[r++],8!=b)for(h=1;b>h;h++)q[h]^=q[h-1];else{for(h=1;b/2>h;h++)q[h]^=q[h-1];for(s=q[b/2-1],q[b/2]^=o[d(s)]|o[e(s)]<<8|o[f(s)]<<16|o[g(s)]<<24,h=b/2+1;b>h;h++)q[h]^=q[h-1]}for(h=0;b>h&&k+1>i;){for(;b>h&&4>j;h++,j++)l[i][j]=q[h];4==j&&(i++,j=0)}}return{rounds:k,rk:l}}function l(a,b,c){var d,e,f;for(f=i(a),e=b.rounds,d=0;e-1>d;d++)c[0]=f[0]^b.rk[d][0],c[1]=f[1]^b.rk[d][1],c[2]=f[2]^b.rk[d][2],c[3]=f[3]^b.rk[d][3],f[0]=p[255&c[0]]^q[c[1]>>8&255]^r[c[2]>>16&255]^s[c[3]>>>24],f[1]=p[255&c[1]]^q[c[2]>>8&255]^r[c[3]>>16&255]^s[c[0]>>>24],f[2]=p[255&c[2]]^q[c[3]>>8&255]^r[c[0]>>16&255]^s[c[1]>>>24],f[3]=p[255&c[3]]^q[c[0]>>8&255]^r[c[1]>>16&255]^s[c[2]>>>24];return d=e-1,c[0]=f[0]^b.rk[d][0],c[1]=f[1]^b.rk[d][1],c[2]=f[2]^b.rk[d][2],c[3]=f[3]^b.rk[d][3],f[0]=h(c[0],c[1],c[2],c[3])^b.rk[e][0],f[1]=h(c[1],c[2],c[3],c[0])^b.rk[e][1],f[2]=h(c[2],c[3],c[0],c[1])^b.rk[e][2],f[3]=h(c[3],c[0],c[1],c[2])^b.rk[e][3],j(f)}function m(a){var b=function(a){this.key=k(a),this._temp=new Uint32Array(this.blockSize/4),this.encrypt=function(a){return l(a,this.key,this._temp)}};return b.blockSize=b.prototype.blockSize=16,b.keySize=b.prototype.keySize=a/8,b}var n=(a("../../util.js"),new Uint8Array([1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145])),o=new Uint8Array([99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22]),p=new Uint32Array([2774754246,2222750968,2574743534,2373680118,234025727,3177933782,2976870366,1422247313,1345335392,50397442,2842126286,2099981142,436141799,1658312629,3870010189,2591454956,1170918031,2642575903,1086966153,2273148410,368769775,3948501426,3376891790,200339707,3970805057,1742001331,4255294047,3937382213,3214711843,4154762323,2524082916,1539358875,3266819957,486407649,2928907069,1780885068,1513502316,1094664062,49805301,1338821763,1546925160,4104496465,887481809,150073849,2473685474,1943591083,1395732834,1058346282,201589768,1388824469,1696801606,1589887901,672667696,2711000631,251987210,3046808111,151455502,907153956,2608889883,1038279391,652995533,1764173646,3451040383,2675275242,453576978,2659418909,1949051992,773462580,756751158,2993581788,3998898868,4221608027,4132590244,1295727478,1641469623,3467883389,2066295122,1055122397,1898917726,2542044179,4115878822,1758581177,0,753790401,1612718144,536673507,3367088505,3982187446,3194645204,1187761037,3653156455,1262041458,3729410708,3561770136,3898103984,1255133061,1808847035,720367557,3853167183,385612781,3309519750,3612167578,1429418854,2491778321,3477423498,284817897,100794884,2172616702,4031795360,1144798328,3131023141,3819481163,4082192802,4272137053,3225436288,2324664069,2912064063,3164445985,1211644016,83228145,3753688163,3249976951,1977277103,1663115586,806359072,452984805,250868733,1842533055,1288555905,336333848,890442534,804056259,3781124030,2727843637,3427026056,957814574,1472513171,4071073621,2189328124,1195195770,2892260552,3881655738,723065138,2507371494,2690670784,2558624025,3511635870,2145180835,1713513028,2116692564,2878378043,2206763019,3393603212,703524551,3552098411,1007948840,2044649127,3797835452,487262998,1994120109,1004593371,1446130276,1312438900,503974420,3679013266,168166924,1814307912,3831258296,1573044895,1859376061,4021070915,2791465668,2828112185,2761266481,937747667,2339994098,854058965,1137232011,1496790894,3077402074,2358086913,1691735473,3528347292,3769215305,3027004632,4199962284,133494003,636152527,2942657994,2390391540,3920539207,403179536,3585784431,2289596656,1864705354,1915629148,605822008,4054230615,3350508659,1371981463,602466507,2094914977,2624877800,555687742,3712699286,3703422305,2257292045,2240449039,2423288032,1111375484,3300242801,2858837708,3628615824,84083462,32962295,302911004,2741068226,1597322602,4183250862,3501832553,2441512471,1489093017,656219450,3114180135,954327513,335083755,3013122091,856756514,3144247762,1893325225,2307821063,2811532339,3063651117,572399164,2458355477,552200649,1238290055,4283782570,2015897680,2061492133,2408352771,4171342169,2156497161,386731290,3669999461,837215959,3326231172,3093850320,3275833730,2962856233,1999449434,286199582,3417354363,4233385128,3602627437,974525996]),q=new Uint32Array([1667483301,2088564868,2004348569,2071721613,4076011277,1802229437,1869602481,3318059348,808476752,16843267,1734856361,724260477,4278118169,3621238114,2880130534,1987505306,3402272581,2189565853,3385428288,2105408135,4210749205,1499050731,1195871945,4042324747,2913812972,3570709351,2728550397,2947499498,2627478463,2762232823,1920132246,3233848155,3082253762,4261273884,2475900334,640044138,909536346,1061125697,4160222466,3435955023,875849820,2779075060,3857043764,4059166984,1903288979,3638078323,825320019,353708607,67373068,3351745874,589514341,3284376926,404238376,2526427041,84216335,2593796021,117902857,303178806,2155879323,3806519101,3958099238,656887401,2998042573,1970662047,151589403,2206408094,741103732,437924910,454768173,1852759218,1515893998,2694863867,1381147894,993752653,3604395873,3014884814,690573947,3823361342,791633521,2223248279,1397991157,3520182632,0,3991781676,538984544,4244431647,2981198280,1532737261,1785386174,3419114822,3200149465,960066123,1246401758,1280088276,1482207464,3486483786,3503340395,4025468202,2863288293,4227591446,1128498885,1296931543,859006549,2240090516,1162185423,4193904912,33686534,2139094657,1347461360,1010595908,2678007226,2829601763,1364304627,2745392638,1077969088,2408514954,2459058093,2644320700,943222856,4126535940,3166462943,3065411521,3671764853,555827811,269492272,4294960410,4092853518,3537026925,3452797260,202119188,320022069,3974939439,1600110305,2543269282,1145342156,387395129,3301217111,2812761586,2122251394,1027439175,1684326572,1566423783,421081643,1936975509,1616953504,2172721560,1330618065,3705447295,572671078,707417214,2425371563,2290617219,1179028682,4008625961,3099093971,336865340,3739133817,1583267042,185275933,3688607094,3772832571,842163286,976909390,168432670,1229558491,101059594,606357612,1549580516,3267534685,3553869166,2896970735,1650640038,2442213800,2509582756,3840201527,2038035083,3890730290,3368586051,926379609,1835915959,2374828428,3587551588,1313774802,2846444e3,1819072692,1448520954,4109693703,3941256997,1701169839,2054878350,2930657257,134746136,3132780501,2021191816,623200879,774790258,471611428,2795919345,3031724999,3334903633,3907570467,3722289532,1953818780,522141217,1263245021,3183305180,2341145990,2324303749,1886445712,1044282434,3048567236,1718013098,1212715224,50529797,4143380225,235805714,1633796771,892693087,1465364217,3115936208,2256934801,3250690392,488454695,2661164985,3789674808,4177062675,2560109491,286335539,1768542907,3654920560,2391672713,2492740519,2610638262,505297954,2273777042,3924412704,3469641545,1431677695,673730680,3755976058,2357986191,2711706104,2307459456,218962455,3216991706,3873888049,1111655622,1751699640,1094812355,2576951728,757946999,252648977,2964356043,1414834428,3149622742,370551866]),r=new Uint32Array([1673962851,2096661628,2012125559,2079755643,4076801522,1809235307,1876865391,3314635973,811618352,16909057,1741597031,727088427,4276558334,3618988759,2874009259,1995217526,3398387146,2183110018,3381215433,2113570685,4209972730,1504897881,1200539975,4042984432,2906778797,3568527316,2724199842,2940594863,2619588508,2756966308,1927583346,3231407040,3077948087,4259388669,2470293139,642542118,913070646,1065238847,4160029431,3431157708,879254580,2773611685,3855693029,4059629809,1910674289,3635114968,828527409,355090197,67636228,3348452039,591815971,3281870531,405809176,2520228246,84545285,2586817946,118360327,304363026,2149292928,3806281186,3956090603,659450151,2994720178,1978310517,152181513,2199756419,743994412,439627290,456535323,1859957358,1521806938,2690382752,1386542674,997608763,3602342358,3011366579,693271337,3822927587,794718511,2215876484,1403450707,3518589137,0,3988860141,541089824,4242743292,2977548465,1538714971,1792327274,3415033547,3194476990,963791673,1251270218,1285084236,1487988824,3481619151,3501943760,4022676207,2857362858,4226619131,1132905795,1301993293,862344499,2232521861,1166724933,4192801017,33818114,2147385727,1352724560,1014514748,2670049951,2823545768,1369633617,2740846243,1082179648,2399505039,2453646738,2636233885,946882616,4126213365,3160661948,3061301686,3668932058,557998881,270544912,4293204735,4093447923,3535760850,3447803085,202904588,321271059,3972214764,1606345055,2536874647,1149815876,388905239,3297990596,2807427751,2130477694,1031423805,1690872932,1572530013,422718233,1944491379,1623236704,2165938305,1335808335,3701702620,574907938,710180394,2419829648,2282455944,1183631942,4006029806,3094074296,338181140,3735517662,1589437022,185998603,3685578459,3772464096,845436466,980700730,169090570,1234361161,101452294,608726052,1555620956,3265224130,3552407251,2890133420,1657054818,2436475025,2503058581,3839047652,2045938553,3889509095,3364570056,929978679,1843050349,2365688973,3585172693,1318900302,2840191145,1826141292,1454176854,4109567988,3939444202,1707781989,2062847610,2923948462,135272456,3127891386,2029029496,625635109,777810478,473441308,2790781350,3027486644,3331805638,3905627112,3718347997,1961401460,524165407,1268178251,3177307325,2332919435,2316273034,1893765232,1048330814,3044132021,1724688998,1217452104,50726147,4143383030,236720654,1640145761,896163637,1471084887,3110719673,2249691526,3248052417,490350365,2653403550,3789109473,4176155640,2553000856,287453969,1775418217,3651760345,2382858638,2486413204,2603464347,507257374,2266337927,3922272489,3464972750,1437269845,676362280,3752164063,2349043596,2707028129,2299101321,219813645,3211123391,3872862694,1115997762,1758509160,1099088705,2569646233,760903469,253628687,2960903088,1420360788,3144537787,371997206]),s=new Uint32Array([3332727651,4169432188,4003034999,4136467323,4279104242,3602738027,3736170351,2438251973,1615867952,33751297,3467208551,1451043627,3877240574,3043153879,1306962859,3969545846,2403715786,530416258,2302724553,4203183485,4011195130,3001768281,2395555655,4211863792,1106029997,3009926356,1610457762,1173008303,599760028,1408738468,3835064946,2606481600,1975695287,3776773629,1034851219,1282024998,1817851446,2118205247,4110612471,2203045068,1750873140,1374987685,3509904869,4178113009,3801313649,2876496088,1649619249,708777237,135005188,2505230279,1181033251,2640233411,807933976,933336726,168756485,800430746,235472647,607523346,463175808,3745374946,3441880043,1315514151,2144187058,3936318837,303761673,496927619,1484008492,875436570,908925723,3702681198,3035519578,1543217312,2767606354,1984772923,3076642518,2110698419,1383803177,3711886307,1584475951,328696964,2801095507,3110654417,0,3240947181,1080041504,3810524412,2043195825,3069008731,3569248874,2370227147,1742323390,1917532473,2497595978,2564049996,2968016984,2236272591,3144405200,3307925487,1340451498,3977706491,2261074755,2597801293,1716859699,294946181,2328839493,3910203897,67502594,4269899647,2700103760,2017737788,632987551,1273211048,2733855057,1576969123,2160083008,92966799,1068339858,566009245,1883781176,4043634165,1675607228,2009183926,2943736538,1113792801,540020752,3843751935,4245615603,3211645650,2169294285,403966988,641012499,3274697964,3202441055,899848087,2295088196,775493399,2472002756,1441965991,4236410494,2051489085,3366741092,3135724893,841685273,3868554099,3231735904,429425025,2664517455,2743065820,1147544098,1417554474,1001099408,193169544,2362066502,3341414126,1809037496,675025940,2809781982,3168951902,371002123,2910247899,3678134496,1683370546,1951283770,337512970,2463844681,201983494,1215046692,3101973596,2673722050,3178157011,1139780780,3299238498,967348625,832869781,3543655652,4069226873,3576883175,2336475336,1851340599,3669454189,25988493,2976175573,2631028302,1239460265,3635702892,2902087254,4077384948,3475368682,3400492389,4102978170,1206496942,270010376,1876277946,4035475576,1248797989,1550986798,941890588,1475454630,1942467764,2538718918,3408128232,2709315037,3902567540,1042358047,2531085131,1641856445,226921355,260409994,3767562352,2084716094,1908716981,3433719398,2430093384,100991747,4144101110,470945294,3265487201,1784624437,2935576407,1775286713,395413126,2572730817,975641885,666476190,3644383713,3943954680,733190296,573772049,3535497577,2842745305,126455438,866620564,766942107,1008868894,361924487,3374377449,2269761230,2868860245,1350051880,2776293343,59739276,1509466529,159418761,437718285,1708834751,3610371814,2227585602,3501746280,2193834305,699439513,1517759789,504434447,2076946608,2835108948,1842789307,742004246]),t=8,u=14;b.exports={};var v=[128,192,256];for(var w in v)b.exports[v[w]]=m(v[w])},{"../../util.js":76}],20:[function(a,b,c){function d(){}function e(a){this.bf=new d,this.bf.init(f.str2bin(a)),this.encrypt=function(a){return this.bf.encrypt_block(a)}}d.prototype.BLOCKSIZE=8,d.prototype.SBOXES=[[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518,2069144605,3260701109,2620446009,720527379,3318853667,677414384,3393288472,3101374703,2390351024,1614419982,1822297739,2954791486,3608508353,3174124327,2024746970,1432378464,3864339955,2857741204,1464375394,1676153920,1439316330,715854006,3033291828,289532110,2706671279,2087905683,3018724369,1668267050,732546397,1947742710,3462151702,2609353502,2950085171,1814351708,2050118529,680887927,999245976,1800124847,3300911131,1713906067,1641548236,4213287313,1216130144,1575780402,4018429277,3917837745,3693486850,3949271944,596196993,3549867205,258830323,2213823033,772490370,2760122372,1774776394,2652871518,566650946,4142492826,1728879713,2882767088,1783734482,3629395816,2517608232,2874225571,1861159788,326777828,3124490320,2130389656,2716951837,967770486,1724537150,2185432712,2364442137,1164943284,2105845187,998989502,3765401048,2244026483,1075463327,1455516326,1322494562,910128902,469688178,1117454909,936433444,3490320968,3675253459,1240580251,122909385,2157517691,634681816,4142456567,3825094682,3061402683,2540495037,79693498,3249098678,1084186820,1583128258,426386531,1761308591,1047286709,322548459,995290223,1845252383,2603652396,3431023940,2942221577,3202600964,3727903485,1712269319,422464435,3234572375,1170764815,3523960633,3117677531,1434042557,442511882,3600875718,1076654713,1738483198,4213154764,2393238008,3677496056,1014306527,4251020053,793779912,2902807211,842905082,4246964064,1395751752,1040244610,2656851899,3396308128,445077038,3742853595,3577915638,679411651,2892444358,2354009459,1767581616,3150600392,3791627101,3102740896,284835224,4246832056,1258075500,768725851,2589189241,3069724005,3532540348,1274779536,3789419226,2764799539,1660621633,3471099624,4011903706,913787905,3497959166,737222580,2514213453,2928710040,3937242737,1804850592,3499020752,2949064160,2386320175,2390070455,2415321851,4061277028,2290661394,2416832540,1336762016,1754252060,3520065937,3014181293,791618072,3188594551,3933548030,2332172193,3852520463,3043980520,413987798,3465142937,3030929376,4245938359,2093235073,3534596313,375366246,2157278981,2479649556,555357303,3870105701,2008414854,3344188149,4221384143,3956125452,2067696032,3594591187,2921233993,2428461,544322398,577241275,1471733935,610547355,4027169054,1432588573,1507829418,2025931657,3646575487,545086370,48609733,2200306550,1653985193,298326376,1316178497,3007786442,2064951626,458293330,2589141269,3591329599,3164325604,727753846,2179363840,146436021,1461446943,4069977195,705550613,3059967265,3887724982,4281599278,3313849956,1404054877,2845806497,146425753,1854211946],[1266315497,3048417604,3681880366,3289982499,290971e4,1235738493,2632868024,2414719590,3970600049,1771706367,1449415276,3266420449,422970021,1963543593,2690192192,3826793022,1062508698,1531092325,1804592342,2583117782,2714934279,4024971509,1294809318,4028980673,1289560198,2221992742,1669523910,35572830,157838143,1052438473,1016535060,1802137761,1753167236,1386275462,3080475397,2857371447,1040679964,2145300060,2390574316,1461121720,2956646967,4031777805,4028374788,33600511,2920084762,1018524850,629373528,3691585981,3515945977,2091462646,2486323059,586499841,988145025,935516892,3367335476,2599673255,2839830854,265290510,3972581182,2759138881,3795373465,1005194799,847297441,406762289,1314163512,1332590856,1866599683,4127851711,750260880,613907577,1450815602,3165620655,3734664991,3650291728,3012275730,3704569646,1427272223,778793252,1343938022,2676280711,2052605720,1946737175,3164576444,3914038668,3967478842,3682934266,1661551462,3294938066,4011595847,840292616,3712170807,616741398,312560963,711312465,1351876610,322626781,1910503582,271666773,2175563734,1594956187,70604529,3617834859,1007753275,1495573769,4069517037,2549218298,2663038764,504708206,2263041392,3941167025,2249088522,1514023603,1998579484,1312622330,694541497,2582060303,2151582166,1382467621,776784248,2618340202,3323268794,2497899128,2784771155,503983604,4076293799,907881277,423175695,432175456,1378068232,4145222326,3954048622,3938656102,3820766613,2793130115,2977904593,26017576,3274890735,3194772133,1700274565,1756076034,4006520079,3677328699,720338349,1533947780,354530856,688349552,3973924725,1637815568,332179504,3949051286,53804574,2852348879,3044236432,1282449977,3583942155,3416972820,4006381244,1617046695,2628476075,3002303598,1686838959,431878346,2686675385,1700445008,1080580658,1009431731,832498133,3223435511,2605976345,2271191193,2516031870,1648197032,4164389018,2548247927,300782431,375919233,238389289,3353747414,2531188641,2019080857,1475708069,455242339,2609103871,448939670,3451063019,1395535956,2413381860,1841049896,1491858159,885456874,4264095073,4001119347,1565136089,3898914787,1108368660,540939232,1173283510,2745871338,3681308437,4207628240,3343053890,4016749493,1699691293,1103962373,3625875870,2256883143,3830138730,1031889488,3479347698,1535977030,4236805024,3251091107,2132092099,1774941330,1199868427,1452454533,157007616,2904115357,342012276,595725824,1480756522,206960106,497939518,591360097,863170706,2375253569,3596610801,1814182875,2094937945,3421402208,1082520231,3463918190,2785509508,435703966,3908032597,1641649973,2842273706,3305899714,1510255612,2148256476,2655287854,3276092548,4258621189,236887753,3681803219,274041037,1734335097,3815195456,3317970021,1899903192,1026095262,4050517792,356393447,2410691914,3873677099,3682840055],[3913112168,2491498743,4132185628,2489919796,1091903735,1979897079,3170134830,3567386728,3557303409,857797738,1136121015,1342202287,507115054,2535736646,337727348,3213592640,1301675037,2528481711,1895095763,1721773893,3216771564,62756741,2142006736,835421444,2531993523,1442658625,3659876326,2882144922,676362277,1392781812,170690266,3921047035,1759253602,3611846912,1745797284,664899054,1329594018,3901205900,3045908486,2062866102,2865634940,3543621612,3464012697,1080764994,553557557,3656615353,3996768171,991055499,499776247,1265440854,648242737,3940784050,980351604,3713745714,1749149687,3396870395,4211799374,3640570775,1161844396,3125318951,1431517754,545492359,4268468663,3499529547,1437099964,2702547544,3433638243,2581715763,2787789398,1060185593,1593081372,2418618748,4260947970,69676912,2159744348,86519011,2512459080,3838209314,1220612927,3339683548,133810670,1090789135,1078426020,1569222167,845107691,3583754449,4072456591,1091646820,628848692,1613405280,3757631651,526609435,236106946,48312990,2942717905,3402727701,1797494240,859738849,992217954,4005476642,2243076622,3870952857,3732016268,765654824,3490871365,2511836413,1685915746,3888969200,1414112111,2273134842,3281911079,4080962846,172450625,2569994100,980381355,4109958455,2819808352,2716589560,2568741196,3681446669,3329971472,1835478071,660984891,3704678404,4045999559,3422617507,3040415634,1762651403,1719377915,3470491036,2693910283,3642056355,3138596744,1364962596,2073328063,1983633131,926494387,3423689081,2150032023,4096667949,1749200295,3328846651,309677260,2016342300,1779581495,3079819751,111262694,1274766160,443224088,298511866,1025883608,3806446537,1145181785,168956806,3641502830,3584813610,1689216846,3666258015,3200248200,1692713982,2646376535,4042768518,1618508792,1610833997,3523052358,4130873264,2001055236,3610705100,2202168115,4028541809,2961195399,1006657119,2006996926,3186142756,1430667929,3210227297,1314452623,4074634658,4101304120,2273951170,1399257539,3367210612,3027628629,1190975929,2062231137,2333990788,2221543033,2438960610,1181637006,548689776,2362791313,3372408396,3104550113,3145860560,296247880,1970579870,3078560182,3769228297,1714227617,3291629107,3898220290,166772364,1251581989,493813264,448347421,195405023,2709975567,677966185,3703036547,1463355134,2715995803,1338867538,1343315457,2802222074,2684532164,233230375,2599980071,2000651841,3277868038,1638401717,4028070440,3237316320,6314154,819756386,300326615,590932579,1405279636,3267499572,3150704214,2428286686,3959192993,3461946742,1862657033,1266418056,963775037,2089974820,2263052895,1917689273,448879540,3550394620,3981727096,150775221,3627908307,1303187396,508620638,2975983352,2726630617,1817252668,1876281319,1457606340,908771278,3720792119,3617206836,2455994898,1729034894,1080033504],[976866871,3556439503,2881648439,1522871579,1555064734,1336096578,3548522304,2579274686,3574697629,3205460757,3593280638,3338716283,3079412587,564236357,2993598910,1781952180,1464380207,3163844217,3332601554,1699332808,1393555694,1183702653,3581086237,1288719814,691649499,2847557200,2895455976,3193889540,2717570544,1781354906,1676643554,2592534050,3230253752,1126444790,2770207658,2633158820,2210423226,2615765581,2414155088,3127139286,673620729,2805611233,1269405062,4015350505,3341807571,4149409754,1057255273,2012875353,2162469141,2276492801,2601117357,993977747,3918593370,2654263191,753973209,36408145,2530585658,25011837,3520020182,2088578344,530523599,2918365339,1524020338,1518925132,3760827505,3759777254,1202760957,3985898139,3906192525,674977740,4174734889,2031300136,2019492241,3983892565,4153806404,3822280332,352677332,2297720250,60907813,90501309,3286998549,1016092578,2535922412,2839152426,457141659,509813237,4120667899,652014361,1966332200,2975202805,55981186,2327461051,676427537,3255491064,2882294119,3433927263,1307055953,942726286,933058658,2468411793,3933900994,4215176142,1361170020,2001714738,2830558078,3274259782,1222529897,1679025792,2729314320,3714953764,1770335741,151462246,3013232138,1682292957,1483529935,471910574,1539241949,458788160,3436315007,1807016891,3718408830,978976581,1043663428,3165965781,1927990952,4200891579,2372276910,3208408903,3533431907,1412390302,2931980059,4132332400,1947078029,3881505623,4168226417,2941484381,1077988104,1320477388,886195818,18198404,3786409e3,2509781533,112762804,3463356488,1866414978,891333506,18488651,661792760,1628790961,3885187036,3141171499,876946877,2693282273,1372485963,791857591,2686433993,3759982718,3167212022,3472953795,2716379847,445679433,3561995674,3504004811,3574258232,54117162,3331405415,2381918588,3769707343,4154350007,1140177722,4074052095,668550556,3214352940,367459370,261225585,2610173221,4209349473,3468074219,3265815641,314222801,3066103646,3808782860,282218597,3406013506,3773591054,379116347,1285071038,846784868,2669647154,3771962079,3550491691,2305946142,453669953,1268987020,3317592352,3279303384,3744833421,2610507566,3859509063,266596637,3847019092,517658769,3462560207,3443424879,370717030,4247526661,2224018117,4143653529,4112773975,2788324899,2477274417,1456262402,2901442914,1517677493,1846949527,2295493580,3734397586,2176403920,1280348187,1908823572,3871786941,846861322,1172426758,3287448474,3383383037,1655181056,3139813346,901632758,1897031941,2986607138,3066810236,3447102507,1393639104,373351379,950779232,625454576,3124240540,4148612726,2007998917,544563296,2244738638,2330496472,2058025392,1291430526,424198748,50039436,29584100,3605783033,2429876329,2791104160,1057563949,3255363231,3075367218,3463963227,1469046755,985887462]], -d.prototype.PARRAY=[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069,3041331479,2450970073,2306472731],d.prototype.NN=16,d.prototype._clean=function(a){if(0>a){var b=2147483647&a;a=b+2147483648}return a},d.prototype._F=function(a){var b,c,d,e,f;return e=255&a,a>>>=8,d=255&a,a>>>=8,c=255&a,a>>>=8,b=255&a,f=this.sboxes[0][b]+this.sboxes[1][c],f^=this.sboxes[2][d],f+=this.sboxes[3][e]},d.prototype._encrypt_block=function(a){var b,c=a[0],d=a[1];for(b=0;b>>24-8*b&255,e[b+d]=c[1]>>>24-8*b&255;return e},d.prototype._decrypt_block=function(a){var b,c=a[0],d=a[1];for(b=this.NN+1;b>1;--b){c^=this.parray[b],d=this._F(c)^d;var e=c;c=d,d=e}c^=this.parray[1],d^=this.parray[0],a[0]=this._clean(d),a[1]=this._clean(c)},d.prototype.init=function(a){var b,c=0;for(this.parray=[],b=0;bd;++d)e=e<<8|255&a[c],++c>=a.length&&(c=0);this.parray[b]=this.PARRAY[b]^e}for(this.sboxes=[],b=0;4>b;++b)for(this.sboxes[b]=[],c=0;256>c;++c)this.sboxes[b][c]=this.SBOXES[b][c];var f=[0,0];for(b=0;bb;++b)for(c=0;256>c;c+=2)this._encrypt_block(f),this.sboxes[b][c+0]=f[0],this.sboxes[b][c+1]=f[1]};var f=a("../../util.js");b.exports=e,b.exports.keySize=e.prototype.keySize=16,b.exports.blockSize=e.prototype.blockSize=16},{"../../util.js":76}],21:[function(a,b,c){function d(){function a(a,b,c){var d=b+a,e=d<>>32-c;return(f[0][e>>>24]^f[1][e>>>16&255])-f[2][e>>>8&255]+f[3][255&e]}function b(a,b,c){var d=b^a,e=d<>>32-c;return f[0][e>>>24]-f[1][e>>>16&255]+f[2][e>>>8&255]^f[3][255&e]}function c(a,b,c){var d=b-a,e=d<>>32-c;return(f[0][e>>>24]+f[1][e>>>16&255]^f[2][e>>>8&255])-f[3][255&e]}this.BlockSize=8,this.KeySize=16,this.setKey=function(a){if(this.masking=new Array(16),this.rotate=new Array(16),this.reset(),a.length!=this.KeySize)throw new Error("CAST-128: keys must be 16 bytes");return this.keySchedule(a),!0},this.reset=function(){for(var a=0;16>a;a++)this.masking[a]=0,this.rotate[a]=0},this.getBlockSize=function(){return BlockSize},this.encrypt=function(d){for(var e=new Array(d.length),f=0;f>>24&255,e[f+1]=i>>>16&255,e[f+2]=i>>>8&255,e[f+3]=255&i,e[f+4]=h>>>24&255,e[f+5]=h>>>16&255,e[f+6]=h>>>8&255,e[f+7]=255&h}return e},this.decrypt=function(d){for(var e=new Array(d.length),f=0;f>>24&255,e[f+1]=i>>>16&255,e[f+2]=i>>>8&255,e[f+3]=255&i,e[f+4]=h>>>24&255,e[f+5]=h>>16&255,e[f+6]=h>>8&255,e[f+7]=255&h}return e};var d=new Array(4);d[0]=new Array(4),d[0][0]=new Array(4,0,13,15,12,14,8),d[0][1]=new Array(5,2,16,18,17,19,10),d[0][2]=new Array(6,3,23,22,21,20,9),d[0][3]=new Array(7,1,26,25,27,24,11),d[1]=new Array(4),d[1][0]=new Array(0,6,21,23,20,22,16),d[1][1]=new Array(1,4,0,2,1,3,18),d[1][2]=new Array(2,5,7,6,5,4,17),d[1][3]=new Array(3,7,10,9,11,8,19),d[2]=new Array(4),d[2][0]=new Array(4,0,13,15,12,14,8),d[2][1]=new Array(5,2,16,18,17,19,10),d[2][2]=new Array(6,3,23,22,21,20,9),d[2][3]=new Array(7,1,26,25,27,24,11),d[3]=new Array(4),d[3][0]=new Array(0,6,21,23,20,22,16),d[3][1]=new Array(1,4,0,2,1,3,18),d[3][2]=new Array(2,5,7,6,5,4,17),d[3][3]=new Array(3,7,10,9,11,8,19);var e=new Array(4);e[0]=new Array(4),e[0][0]=new Array(24,25,23,22,18),e[0][1]=new Array(26,27,21,20,22),e[0][2]=new Array(28,29,19,18,25),e[0][3]=new Array(30,31,17,16,28),e[1]=new Array(4),e[1][0]=new Array(3,2,12,13,8),e[1][1]=new Array(1,0,14,15,13),e[1][2]=new Array(7,6,8,9,3),e[1][3]=new Array(5,4,10,11,7),e[2]=new Array(4),e[2][0]=new Array(19,18,28,29,25),e[2][1]=new Array(17,16,30,31,28),e[2][2]=new Array(23,22,24,25,18),e[2][3]=new Array(21,20,26,27,22),e[3]=new Array(4),e[3][0]=new Array(8,9,7,6,3),e[3][1]=new Array(10,11,5,4,7),e[3][2]=new Array(12,13,3,2,8),e[3][3]=new Array(14,15,1,0,13),this.keySchedule=function(a){var b,c,g=new Array(8),h=new Array(32);for(b=0;4>b;b++)c=4*b,g[b]=a[c]<<24|a[c+1]<<16|a[c+2]<<8|a[c+3];for(var i,j=[6,7,4,5],k=0,l=0;2>l;l++)for(var m=0;4>m;m++){for(c=0;4>c;c++){var n=d[m][c];i=g[n[1]],i^=f[4][g[n[2]>>>2]>>>24-8*(3&n[2])&255],i^=f[5][g[n[3]>>>2]>>>24-8*(3&n[3])&255],i^=f[6][g[n[4]>>>2]>>>24-8*(3&n[4])&255],i^=f[7][g[n[5]>>>2]>>>24-8*(3&n[5])&255],i^=f[j[c]][g[n[6]>>>2]>>>24-8*(3&n[6])&255],g[n[0]]=i}for(c=0;4>c;c++){var o=e[m][c];i=f[4][g[o[0]>>>2]>>>24-8*(3&o[0])&255],i^=f[5][g[o[1]>>>2]>>>24-8*(3&o[1])&255],i^=f[6][g[o[2]>>>2]>>>24-8*(3&o[2])&255],i^=f[7][g[o[3]>>>2]>>>24-8*(3&o[3])&255],i^=f[4+c][g[o[4]>>>2]>>>24-8*(3&o[4])&255],h[k]=i,k++}}for(b=0;16>b;b++)this.masking[b]=h[b],this.rotate[b]=31&h[16+b]};var f=new Array(8);f[0]=new Array(821772500,2678128395,1810681135,1059425402,505495343,2617265619,1610868032,3483355465,3218386727,2294005173,3791863952,2563806837,1852023008,365126098,3269944861,584384398,677919599,3229601881,4280515016,2002735330,1136869587,3744433750,2289869850,2731719981,2714362070,879511577,1639411079,575934255,717107937,2857637483,576097850,2731753936,1725645e3,2810460463,5111599,767152862,2543075244,1251459544,1383482551,3052681127,3089939183,3612463449,1878520045,1510570527,2189125840,2431448366,582008916,3163445557,1265446783,1354458274,3529918736,3202711853,3073581712,3912963487,3029263377,1275016285,4249207360,2905708351,3304509486,1442611557,3585198765,2712415662,2731849581,3248163920,2283946226,208555832,2766454743,1331405426,1447828783,3315356441,3108627284,2957404670,2981538698,3339933917,1669711173,286233437,1465092821,1782121619,3862771680,710211251,980974943,1651941557,430374111,2051154026,704238805,4128970897,3144820574,2857402727,948965521,3333752299,2227686284,718756367,2269778983,2731643755,718440111,2857816721,3616097120,1113355533,2478022182,410092745,1811985197,1944238868,2696854588,1415722873,1682284203,1060277122,1998114690,1503841958,82706478,2315155686,1068173648,845149890,2167947013,1768146376,1993038550,3566826697,3390574031,940016341,3355073782,2328040721,904371731,1205506512,4094660742,2816623006,825647681,85914773,2857843460,1249926541,1417871568,3287612,3211054559,3126306446,1975924523,1353700161,2814456437,2438597621,1800716203,722146342,2873936343,1151126914,4160483941,2877670899,458611604,2866078500,3483680063,770352098,2652916994,3367839148,3940505011,3585973912,3809620402,718646636,2504206814,2914927912,3631288169,2857486607,2860018678,575749918,2857478043,718488780,2069512688,3548183469,453416197,1106044049,3032691430,52586708,3378514636,3459808877,3211506028,1785789304,218356169,3571399134,3759170522,1194783844,1523787992,3007827094,1975193539,2555452411,1341901877,3045838698,3776907964,3217423946,2802510864,2889438986,1057244207,1636348243,3761863214,1462225785,2632663439,481089165,718503062,24497053,3332243209,3344655856,3655024856,3960371065,1195698900,2971415156,3710176158,2115785917,4027663609,3525578417,2524296189,2745972565,3564906415,1372086093,1452307862,2780501478,1476592880,3389271281,18495466,2378148571,901398090,891748256,3279637769,3157290713,2560960102,1447622437,4284372637,216884176,2086908623,1879786977,3588903153,2242455666,2938092967,3559082096,2810645491,758861177,1121993112,215018983,642190776,4169236812,1196255959,2081185372,3508738393,941322904,4124243163,2877523539,1848581667,2205260958,3180453958,2589345134,3694731276,550028657,2519456284,3789985535,2973870856,2093648313,443148163,46942275,2734146937,1117713533,1115362972,1523183689,3717140224,1551984063),f[1]=new Array(522195092,4010518363,1776537470,960447360,4267822970,4005896314,1435016340,1929119313,2913464185,1310552629,3579470798,3724818106,2579771631,1594623892,417127293,2715217907,2696228731,1508390405,3994398868,3925858569,3695444102,4019471449,3129199795,3770928635,3520741761,990456497,4187484609,2783367035,21106139,3840405339,631373633,3783325702,532942976,396095098,3548038825,4267192484,2564721535,2011709262,2039648873,620404603,3776170075,2898526339,3612357925,4159332703,1645490516,223693667,1567101217,3362177881,1029951347,3470931136,3570957959,1550265121,119497089,972513919,907948164,3840628539,1613718692,3594177948,465323573,2659255085,654439692,2575596212,2699288441,3127702412,277098644,624404830,4100943870,2717858591,546110314,2403699828,3655377447,1321679412,4236791657,1045293279,4010672264,895050893,2319792268,494945126,1914543101,2777056443,3894764339,2219737618,311263384,4275257268,3458730721,669096869,3584475730,3835122877,3319158237,3949359204,2005142349,2713102337,2228954793,3769984788,569394103,3855636576,1425027204,108000370,2736431443,3671869269,3043122623,1750473702,2211081108,762237499,3972989403,2798899386,3061857628,2943854345,867476300,964413654,1591880597,1594774276,2179821409,552026980,3026064248,3726140315,2283577634,3110545105,2152310760,582474363,1582640421,1383256631,2043843868,3322775884,1217180674,463797851,2763038571,480777679,2718707717,2289164131,3118346187,214354409,200212307,3810608407,3025414197,2674075964,3997296425,1847405948,1342460550,510035443,4080271814,815934613,833030224,1620250387,1945732119,2703661145,3966000196,1388869545,3456054182,2687178561,2092620194,562037615,1356438536,3409922145,3261847397,1688467115,2150901366,631725691,3840332284,549916902,3455104640,394546491,837744717,2114462948,751520235,2221554606,2415360136,3999097078,2063029875,803036379,2702586305,821456707,3019566164,360699898,4018502092,3511869016,3677355358,2402471449,812317050,49299192,2570164949,3259169295,2816732080,3331213574,3101303564,2156015656,3705598920,3546263921,143268808,3200304480,1638124008,3165189453,3341807610,578956953,2193977524,3638120073,2333881532,807278310,658237817,2969561766,1641658566,11683945,3086995007,148645947,1138423386,4158756760,1981396783,2401016740,3699783584,380097457,2680394679,2803068651,3334260286,441530178,4016580796,1375954390,761952171,891809099,2183123478,157052462,3683840763,1592404427,341349109,2438483839,1417898363,644327628,2233032776,2353769706,2201510100,220455161,1815641738,182899273,2995019788,3627381533,3702638151,2890684138,1052606899,588164016,1681439879,4038439418,2405343923,4229449282,167996282,1336969661,1688053129,2739224926,1543734051,1046297529,1138201970,2121126012,115334942,1819067631,1902159161,1941945968,2206692869,1159982321),f[2]=new Array(2381300288,637164959,3952098751,3893414151,1197506559,916448331,2350892612,2932787856,3199334847,4009478890,3905886544,1373570990,2450425862,4037870920,3778841987,2456817877,286293407,124026297,3001279700,1028597854,3115296800,4208886496,2691114635,2188540206,1430237888,1218109995,3572471700,308166588,570424558,2187009021,2455094765,307733056,1310360322,3135275007,1384269543,2388071438,863238079,2359263624,2801553128,3380786597,2831162807,1470087780,1728663345,4072488799,1090516929,532123132,2389430977,1132193179,2578464191,3051079243,1670234342,1434557849,2711078940,1241591150,3314043432,3435360113,3091448339,1812415473,2198440252,267246943,796911696,3619716990,38830015,1526438404,2806502096,374413614,2943401790,1489179520,1603809326,1920779204,168801282,260042626,2358705581,1563175598,2397674057,1356499128,2217211040,514611088,2037363785,2186468373,4022173083,2792511869,2913485016,1173701892,4200428547,3896427269,1334932762,2455136706,602925377,2835607854,1613172210,41346230,2499634548,2457437618,2188827595,41386358,4172255629,1313404830,2405527007,3801973774,2217704835,873260488,2528884354,2478092616,4012915883,2555359016,2006953883,2463913485,575479328,2218240648,2099895446,660001756,2341502190,3038761536,3888151779,3848713377,3286851934,1022894237,1620365795,3449594689,1551255054,15374395,3570825345,4249311020,4151111129,3181912732,310226346,1133119310,530038928,136043402,2476768958,3107506709,2544909567,1036173560,2367337196,1681395281,1758231547,3641649032,306774401,1575354324,3716085866,1990386196,3114533736,2455606671,1262092282,3124342505,2768229131,4210529083,1833535011,423410938,660763973,2187129978,1639812e3,3508421329,3467445492,310289298,272797111,2188552562,2456863912,310240523,677093832,1013118031,901835429,3892695601,1116285435,3036471170,1337354835,243122523,520626091,277223598,4244441197,4194248841,1766575121,594173102,316590669,742362309,3536858622,4176435350,3838792410,2501204839,1229605004,3115755532,1552908988,2312334149,979407927,3959474601,1148277331,176638793,3614686272,2083809052,40992502,1340822838,2731552767,3535757508,3560899520,1354035053,122129617,7215240,2732932949,3118912700,2718203926,2539075635,3609230695,3725561661,1928887091,2882293555,1988674909,2063640240,2491088897,1459647954,4189817080,2302804382,1113892351,2237858528,1927010603,4002880361,1856122846,1594404395,2944033133,3855189863,3474975698,1643104450,4054590833,3431086530,1730235576,2984608721,3084664418,2131803598,4178205752,267404349,1617849798,1616132681,1462223176,736725533,2327058232,551665188,2945899023,1749386277,2575514597,1611482493,674206544,2201269090,3642560800,728599968,1680547377,2620414464,1388111496,453204106,4156223445,1094905244,2754698257,2201108165,3757000246,2704524545,3922940700,3996465027),f[3]=new Array(2645754912,532081118,2814278639,3530793624,1246723035,1689095255,2236679235,4194438865,2116582143,3859789411,157234593,2045505824,4245003587,1687664561,4083425123,605965023,672431967,1336064205,3376611392,214114848,4258466608,3232053071,489488601,605322005,3998028058,264917351,1912574028,756637694,436560991,202637054,135989450,85393697,2152923392,3896401662,2895836408,2145855233,3535335007,115294817,3147733898,1922296357,3464822751,4117858305,1037454084,2725193275,2127856640,1417604070,1148013728,1827919605,642362335,2929772533,909348033,1346338451,3547799649,297154785,1917849091,4161712827,2883604526,3968694238,1469521537,3780077382,3375584256,1763717519,136166297,4290970789,1295325189,2134727907,2798151366,1566297257,3672928234,2677174161,2672173615,965822077,2780786062,289653839,1133871874,3491843819,35685304,1068898316,418943774,672553190,642281022,2346158704,1954014401,3037126780,4079815205,2030668546,3840588673,672283427,1776201016,359975446,3750173538,555499703,2769985273,1324923,69110472,152125443,3176785106,3822147285,1340634837,798073664,1434183902,15393959,216384236,1303690150,3881221631,3711134124,3960975413,106373927,2578434224,1455997841,1801814300,1578393881,1854262133,3188178946,3258078583,2302670060,1539295533,3505142565,3078625975,2372746020,549938159,3278284284,2620926080,181285381,2865321098,3970029511,68876850,488006234,1728155692,2608167508,836007927,2435231793,919367643,3339422534,3655756360,1457871481,40520939,1380155135,797931188,234455205,2255801827,3990488299,397000196,739833055,3077865373,2871719860,4022553888,772369276,390177364,3853951029,557662966,740064294,1640166671,1699928825,3535942136,622006121,3625353122,68743880,1742502,219489963,1664179233,1577743084,1236991741,410585305,2366487942,823226535,1050371084,3426619607,3586839478,212779912,4147118561,1819446015,1911218849,530248558,3486241071,3252585495,2886188651,3410272728,2342195030,20547779,2982490058,3032363469,3631753222,312714466,1870521650,1493008054,3491686656,615382978,4103671749,2534517445,1932181,2196105170,278426614,6369430,3274544417,2913018367,697336853,2143000447,2946413531,701099306,1558357093,2805003052,3500818408,2321334417,3567135975,216290473,3591032198,23009561,1996984579,3735042806,2024298078,3739440863,569400510,2339758983,3016033873,3097871343,3639523026,3844324983,3256173865,795471839,2951117563,4101031090,4091603803,3603732598,971261452,534414648,428311343,3389027175,2844869880,694888862,1227866773,2456207019,3043454569,2614353370,3749578031,3676663836,459166190,4132644070,1794958188,51825668,2252611902,3084671440,2036672799,3436641603,1099053433,2469121526,3059204941,1323291266,2061838604,1018778475,2233344254,2553501054,334295216,3556750194,1065731521,183467730),f[4]=new Array(2127105028,745436345,2601412319,2788391185,3093987327,500390133,1155374404,389092991,150729210,3891597772,3523549952,1935325696,716645080,946045387,2901812282,1774124410,3869435775,4039581901,3293136918,3438657920,948246080,363898952,3867875531,1286266623,1598556673,68334250,630723836,1104211938,1312863373,613332731,2377784574,1101634306,441780740,3129959883,1917973735,2510624549,3238456535,2544211978,3308894634,1299840618,4076074851,1756332096,3977027158,297047435,3790297736,2265573040,3621810518,1311375015,1667687725,47300608,3299642885,2474112369,201668394,1468347890,576830978,3594690761,3742605952,1958042578,1747032512,3558991340,1408974056,3366841779,682131401,1033214337,1545599232,4265137049,206503691,103024618,2855227313,1337551222,2428998917,2963842932,4015366655,3852247746,2796956967,3865723491,3747938335,247794022,3755824572,702416469,2434691994,397379957,851939612,2314769512,218229120,1380406772,62274761,214451378,3170103466,2276210409,3845813286,28563499,446592073,1693330814,3453727194,29968656,3093872512,220656637,2470637031,77972100,1667708854,1358280214,4064765667,2395616961,325977563,4277240721,4220025399,3605526484,3355147721,811859167,3069544926,3962126810,652502677,3075892249,4132761541,3498924215,1217549313,3250244479,3858715919,3053989961,1538642152,2279026266,2875879137,574252750,3324769229,2651358713,1758150215,141295887,2719868960,3515574750,4093007735,4194485238,1082055363,3417560400,395511885,2966884026,179534037,3646028556,3738688086,1092926436,2496269142,257381841,3772900718,1636087230,1477059743,2499234752,3811018894,2675660129,3285975680,90732309,1684827095,1150307763,1723134115,3237045386,1769919919,1240018934,815675215,750138730,2239792499,1234303040,1995484674,138143821,675421338,1145607174,1936608440,3238603024,2345230278,2105974004,323969391,779555213,3004902369,2861610098,1017501463,2098600890,2628620304,2940611490,2682542546,1171473753,3656571411,3687208071,4091869518,393037935,159126506,1662887367,1147106178,391545844,3452332695,1891500680,3016609650,1851642611,546529401,1167818917,3194020571,2848076033,3953471836,575554290,475796850,4134673196,450035699,2351251534,844027695,1080539133,86184846,1554234488,3692025454,1972511363,2018339607,1491841390,1141460869,1061690759,4244549243,2008416118,2351104703,2868147542,1598468138,722020353,1027143159,212344630,1387219594,1725294528,3745187956,2500153616,458938280,4129215917,1828119673,544571780,3503225445,2297937496,1241802790,267843827,2694610800,1397140384,1558801448,3782667683,1806446719,929573330,2234912681,400817706,616011623,4121520928,3603768725,1761550015,1968522284,4053731006,4192232858,4005120285,872482584,3140537016,3894607381,2287405443,1963876937,3663887957,1584857e3,2975024454,1833426440,4025083860),f[5]=new Array(4143615901,749497569,1285769319,3795025788,2514159847,23610292,3974978748,844452780,3214870880,3751928557,2213566365,1676510905,448177848,3730751033,4086298418,2307502392,871450977,3222878141,4110862042,3831651966,2735270553,1310974780,2043402188,1218528103,2736035353,4274605013,2702448458,3936360550,2693061421,162023535,2827510090,687910808,23484817,3784910947,3371371616,779677500,3503626546,3473927188,4157212626,3500679282,4248902014,2466621104,3899384794,1958663117,925738300,1283408968,3669349440,1840910019,137959847,2679828185,1239142320,1315376211,1547541505,1690155329,739140458,3128809933,3933172616,3876308834,905091803,1548541325,4040461708,3095483362,144808038,451078856,676114313,2861728291,2469707347,993665471,373509091,2599041286,4025009006,4170239449,2149739950,3275793571,3749616649,2794760199,1534877388,572371878,2590613551,1753320020,3467782511,1405125690,4270405205,633333386,3026356924,3475123903,632057672,2846462855,1404951397,3882875879,3915906424,195638627,2385783745,3902872553,1233155085,3355999740,2380578713,2702246304,2144565621,3663341248,3894384975,2502479241,4248018925,3094885567,1594115437,572884632,3385116731,767645374,1331858858,1475698373,3793881790,3532746431,1321687957,619889600,1121017241,3440213920,2070816767,2833025776,1933951238,4095615791,890643334,3874130214,859025556,360630002,925594799,1764062180,3920222280,4078305929,979562269,2810700344,4087740022,1949714515,546639971,1165388173,3069891591,1495988560,922170659,1291546247,2107952832,1813327274,3406010024,3306028637,4241950635,153207855,2313154747,1608695416,1150242611,1967526857,721801357,1220138373,3691287617,3356069787,2112743302,3281662835,1111556101,1778980689,250857638,2298507990,673216130,2846488510,3207751581,3562756981,3008625920,3417367384,2198807050,529510932,3547516680,3426503187,2364944742,102533054,2294910856,1617093527,1204784762,3066581635,1019391227,1069574518,1317995090,1691889997,3661132003,510022745,3238594800,1362108837,1817929911,2184153760,805817662,1953603311,3699844737,120799444,2118332377,207536705,2282301548,4120041617,145305846,2508124933,3086745533,3261524335,1877257368,2977164480,3160454186,2503252186,4221677074,759945014,254147243,2767453419,3801518371,629083197,2471014217,907280572,3900796746,940896768,2751021123,2625262786,3161476951,3661752313,3260732218,1425318020,2977912069,1496677566,3988592072,2140652971,3126511541,3069632175,977771578,1392695845,1698528874,1411812681,1369733098,1343739227,3620887944,1142123638,67414216,3102056737,3088749194,1626167401,2546293654,3941374235,697522451,33404913,143560186,2595682037,994885535,1247667115,3859094837,2699155541,3547024625,4114935275,2968073508,3199963069,2732024527,1237921620,951448369,1898488916,1211705605,2790989240,2233243581,3598044975),f[6]=new Array(2246066201,858518887,1714274303,3485882003,713916271,2879113490,3730835617,539548191,36158695,1298409750,419087104,1358007170,749914897,2989680476,1261868530,2995193822,2690628854,3443622377,3780124940,3796824509,2976433025,4259637129,1551479e3,512490819,1296650241,951993153,2436689437,2460458047,144139966,3136204276,310820559,3068840729,643875328,1969602020,1680088954,2185813161,3283332454,672358534,198762408,896343282,276269502,3014846926,84060815,197145886,376173866,3943890818,3813173521,3545068822,1316698879,1598252827,2633424951,1233235075,859989710,2358460855,3503838400,3409603720,1203513385,1193654839,2792018475,2060853022,207403770,1144516871,3068631394,1121114134,177607304,3785736302,326409831,1929119770,2983279095,4183308101,3474579288,3200513878,3228482096,119610148,1170376745,3378393471,3163473169,951863017,3337026068,3135789130,2907618374,1183797387,2015970143,4045674555,2182986399,2952138740,3928772205,384012900,2454997643,10178499,2879818989,2596892536,111523738,2995089006,451689641,3196290696,235406569,1441906262,3890558523,3013735005,4158569349,1644036924,376726067,1006849064,3664579700,2041234796,1021632941,1374734338,2566452058,371631263,4007144233,490221539,206551450,3140638584,1053219195,1853335209,3412429660,3562156231,735133835,1623211703,3104214392,2738312436,4096837757,3366392578,3110964274,3956598718,3196820781,2038037254,3877786376,2339753847,300912036,3766732888,2372630639,1516443558,4200396704,1574567987,4069441456,4122592016,2699739776,146372218,2748961456,2043888151,35287437,2596680554,655490400,1132482787,110692520,1031794116,2188192751,1324057718,1217253157,919197030,686247489,3261139658,1028237775,3135486431,3059715558,2460921700,986174950,2661811465,4062904701,2752986992,3709736643,367056889,1353824391,731860949,1650113154,1778481506,784341916,357075625,3608602432,1074092588,2480052770,3811426202,92751289,877911070,3600361838,1231880047,480201094,3756190983,3094495953,434011822,87971354,363687820,1717726236,1901380172,3926403882,2481662265,400339184,1490350766,2661455099,1389319756,2558787174,784598401,1983468483,30828846,3550527752,2716276238,3841122214,1765724805,1955612312,1277890269,1333098070,1564029816,2704417615,1026694237,3287671188,1260819201,3349086767,1016692350,1582273796,1073413053,1995943182,694588404,1025494639,3323872702,3551898420,4146854327,453260480,1316140391,1435673405,3038941953,3486689407,1622062951,403978347,817677117,950059133,4246079218,3278066075,1486738320,1417279718,481875527,2549965225,3933690356,760697757,1452955855,3897451437,1177426808,1702951038,4085348628,2447005172,1084371187,3516436277,3068336338,1073369276,1027665953,3284188590,1230553676,1368340146,2226246512,267243139,2274220762,4070734279,2497715176,2423353163,2504755875),f[7]=new Array(3793104909,3151888380,2817252029,895778965,2005530807,3871412763,237245952,86829237,296341424,3851759377,3974600970,2475086196,709006108,1994621201,2972577594,937287164,3734691505,168608556,3189338153,2225080640,3139713551,3033610191,3025041904,77524477,185966941,1208824168,2344345178,1721625922,3354191921,1066374631,1927223579,1971335949,2483503697,1551748602,2881383779,2856329572,3003241482,48746954,1398218158,2050065058,313056748,4255789917,393167848,1912293076,940740642,3465845460,3091687853,2522601570,2197016661,1727764327,364383054,492521376,1291706479,3264136376,1474851438,1685747964,2575719748,1619776915,1814040067,970743798,1561002147,2925768690,2123093554,1880132620,3151188041,697884420,2550985770,2607674513,2659114323,110200136,1489731079,997519150,1378877361,3527870668,478029773,2766872923,1022481122,431258168,1112503832,897933369,2635587303,669726182,3383752315,918222264,163866573,3246985393,3776823163,114105080,1903216136,761148244,3571337562,1690750982,3166750252,1037045171,1888456500,2010454850,642736655,616092351,365016990,1185228132,4174898510,1043824992,2023083429,2241598885,3863320456,3279669087,3674716684,108438443,2132974366,830746235,606445527,4173263986,2204105912,1844756978,2532684181,4245352700,2969441100,3796921661,1335562986,4061524517,2720232303,2679424040,634407289,885462008,3294724487,3933892248,2094100220,339117932,4048830727,3202280980,1458155303,2689246273,1022871705,2464987878,3714515309,353796843,2822958815,4256850100,4052777845,551748367,618185374,3778635579,4020649912,1904685140,3069366075,2670879810,3407193292,2954511620,4058283405,2219449317,3135758300,1120655984,3447565834,1474845562,3577699062,550456716,3466908712,2043752612,881257467,869518812,2005220179,938474677,3305539448,3850417126,1315485940,3318264702,226533026,965733244,321539988,1136104718,804158748,573969341,3708209826,937399083,3290727049,2901666755,1461057207,4013193437,4066861423,3242773476,2421326174,1581322155,3028952165,786071460,3900391652,3918438532,1485433313,4023619836,3708277595,3678951060,953673138,1467089153,1930354364,1533292819,2492563023,1346121658,1685000834,1965281866,3765933717,4190206607,2052792609,3515332758,690371149,3125873887,2180283551,2903598061,3933952357,436236910,289419410,14314871,1242357089,2904507907,1616633776,2666382180,585885352,3471299210,2699507360,1432659641,277164553,3354103607,770115018,2303809295,3741942315,3177781868,2853364978,2269453327,3774259834,987383833,1290892879,225909803,1741533526,890078084,1496906255,1111072499,916028167,243534141,1252605537,2204162171,531204876,290011180,3916834213,102027703,237315147,209093447,1486785922,220223953,2758195998,4175039106,82940208,3127791296,2569425252,518464269,1353887104,3941492737,2377294467,3935040926)}function e(a){this.cast5=new d,this.cast5.setKey(f.str2bin(a)),this.encrypt=function(a){return this.cast5.encrypt(a)}}var f=a("../../util.js");b.exports=e,b.exports.blockSize=e.prototype.blockSize=8,b.exports.keySize=e.prototype.keySize=16},{"../../util.js":76}],22:[function(a,b,c){"use strict";function d(a,b,c,d,e,h){var i,j,k,l,m,n,o,p,q,r,s,t,u,v,w=new Array(16843776,0,65536,16843780,16842756,66564,4,65536,1024,16843776,16843780,1024,16778244,16842756,16777216,4,1028,16778240,16778240,66560,66560,16842752,16842752,16778244,65540,16777220,16777220,65540,0,1028,66564,16777216,65536,16843780,4,16842752,16843776,16777216,16777216,1024,16842756,65536,66560,16777220,1024,4,16778244,66564,16843780,65540,16842752,16778244,16777220,1028,66564,16843776,1028,16778240,16778240,0,65540,66560,0,16842756),x=new Array(-2146402272,-2147450880,32768,1081376,1048576,32,-2146435040,-2147450848,-2147483616,-2146402272,-2146402304,-2147483648,-2147450880,1048576,32,-2146435040,1081344,1048608,-2147450848,0,-2147483648,32768,1081376,-2146435072,1048608,-2147483616,0,1081344,32800,-2146402304,-2146435072,32800,0,1081376,-2146435040,1048576,-2147450848,-2146435072,-2146402304,32768,-2146435072,-2147450880,32,-2146402272,1081376,32,32768,-2147483648,32800,-2146402304,1048576,-2147483616,1048608,-2147450848,-2147483616,1048608,1081344,0,-2147450880,32800,-2147483648,-2146435040,-2146402272,1081344),y=new Array(520,134349312,0,134348808,134218240,0,131592,134218240,131080,134217736,134217736,131072,134349320,131080,134348800,520,134217728,8,134349312,512,131584,134348800,134348808,131592,134218248,131584,131072,134218248,8,134349320,512,134217728,134349312,134217728,131080,520,131072,134349312,134218240,0,512,131080,134349320,134218240,134217736,512,0,134348808,134218248,131072,134217728,134349320,8,131592,131584,134217736,134348800,134218248,520,134348800,131592,8,134348808,131584),z=new Array(8396801,8321,8321,128,8396928,8388737,8388609,8193,0,8396800,8396800,8396929,129,0,8388736,8388609,1,8192,8388608,8396801,128,8388608,8193,8320,8388737,1,8320,8388736,8192,8396928,8396929,129,8388736,8388609,8396800,8396929,129,0,0,8396800,8320,8388736,8388737,1,8396801,8321,8321,128,8396929,129,1,8192,8388609,8193,8396928,8388737,8193,8320,8388608,8396801,128,8388608,8192,8396928),A=new Array(256,34078976,34078720,1107296512,524288,256,1073741824,34078720,1074266368,524288,33554688,1074266368,1107296512,1107820544,524544,1073741824,33554432,1074266112,1074266112,0,1073742080,1107820800,1107820800,33554688,1107820544,1073742080,0,1107296256,34078976,33554432,1107296256,524544,524288,1107296512,256,33554432,1073741824,34078720,1107296512,1074266368,33554688,1073741824,1107820544,34078976,1074266368,256,33554432,1107820544,1107820800,524544,1107296256,1107820800,34078720,0,1074266112,1107296256,524544,33554688,1073742080,524288,0,1074266112,34078976,1073742080),B=new Array(536870928,541065216,16384,541081616,541065216,16,541081616,4194304,536887296,4210704,4194304,536870928,4194320,536887296,536870912,16400,0,4194320,536887312,16384,4210688,536887312,16,541065232,541065232,0,4210704,541081600,16400,4210688,541081600,536870912,536887296,16,541065232,4210688,541081616,4194304,16400,536870928,4194304,536887296,536870912,16400,536870928,541081616,4210688,541065216,4210704,541081600,0,541065232,16,16384,541065216,4210704,16384,4194320,536887312,0,541081600,536870912,4194320,536887312),C=new Array(2097152,69206018,67110914,0,2048,67110914,2099202,69208064,69208066,2097152,0,67108866,2,67108864,69206018,2050,67110912,2099202,2097154,67110912,67108866,69206016,69208064,2097154,69206016,2048,2050,69208066,2099200,2,67108864,2099200,67108864,2099200,2097152,67110914,67110914,69206018,69206018,2,2097154,67108864,67110912,2097152,69208064,2050,2099202,69208064,2050,67108866,69208066,69206016,2099200,0,2,69208066,0,2099202,69206016,2048,67108866,67110912,2048,2097154),D=new Array(268439616,4096,262144,268701760,268435456,268439616,64,268435456,262208,268697600,268701760,266240,268701696,266304,4096,64,268697600,268435520,268439552,4160,266240,262208,268697664,268701696,4160,0,0,268697664,268435520,268439552,266304,262144,266304,262144,268701696,4096,64,268697664,4096,266304,268439552,64,268435520,268697600,268697664,268435456,262144,268439616,0,268701760,262208,268435520,268697600,268439552,268439616,0,268701760,266240,266240,4160,4160,262208,268435456,268701696),E=0,F=b.length,G=0,H=32==a.length?3:9; -p=3==H?c?new Array(0,32,2):new Array(30,-2,-2):c?new Array(0,32,2,62,30,-2,64,96,2):new Array(94,62,-2,32,64,2,30,-2,-2),c&&(b=f(b,h),F=b.length);var I="",J="";for(1==d&&(q=e.charCodeAt(E++)<<24|e.charCodeAt(E++)<<16|e.charCodeAt(E++)<<8|e.charCodeAt(E++),s=e.charCodeAt(E++)<<24|e.charCodeAt(E++)<<16|e.charCodeAt(E++)<<8|e.charCodeAt(E++),E=0);F>E;){for(n=b.charCodeAt(E++)<<24|b.charCodeAt(E++)<<16|b.charCodeAt(E++)<<8|b.charCodeAt(E++),o=b.charCodeAt(E++)<<24|b.charCodeAt(E++)<<16|b.charCodeAt(E++)<<8|b.charCodeAt(E++),1==d&&(c?(n^=q,o^=s):(r=q,t=s,q=n,s=o)),k=252645135&(n>>>4^o),o^=k,n^=k<<4,k=65535&(n>>>16^o),o^=k,n^=k<<16,k=858993459&(o>>>2^n),n^=k,o^=k<<2,k=16711935&(o>>>8^n),n^=k,o^=k<<8,k=1431655765&(n>>>1^o),o^=k,n^=k<<1,n=n<<1|n>>>31,o=o<<1|o>>>31,j=0;H>j;j+=3){for(u=p[j+1],v=p[j+2],i=p[j];i!=u;i+=v)l=o^a[i],m=(o>>>4|o<<28)^a[i+1],k=n,n=o,o=k^(x[l>>>24&63]|z[l>>>16&63]|B[l>>>8&63]|D[63&l]|w[m>>>24&63]|y[m>>>16&63]|A[m>>>8&63]|C[63&m]);k=n,n=o,o=k}n=n>>>1|n<<31,o=o>>>1|o<<31,k=1431655765&(n>>>1^o),o^=k,n^=k<<1,k=16711935&(o>>>8^n),n^=k,o^=k<<8,k=858993459&(o>>>2^n),n^=k,o^=k<<2,k=65535&(n>>>16^o),o^=k,n^=k<<16,k=252645135&(n>>>4^o),o^=k,n^=k<<4,1==d&&(c?(q=n,s=o):(n^=r,o^=t)),J+=String.fromCharCode(n>>>24,n>>>16&255,n>>>8&255,255&n,o>>>24,o>>>16&255,o>>>8&255,255&o),G+=8,512==G&&(I+=J,J="",G=0)}return I+=J,c||(I=g(I,h)),I}function e(a){for(var b,c,d,e=new Array(0,4,536870912,536870916,65536,65540,536936448,536936452,512,516,536871424,536871428,66048,66052,536936960,536936964),f=new Array(0,1,1048576,1048577,67108864,67108865,68157440,68157441,256,257,1048832,1048833,67109120,67109121,68157696,68157697),g=new Array(0,8,2048,2056,16777216,16777224,16779264,16779272,0,8,2048,2056,16777216,16777224,16779264,16779272),h=new Array(0,2097152,134217728,136314880,8192,2105344,134225920,136323072,131072,2228224,134348800,136445952,139264,2236416,134356992,136454144),i=new Array(0,262144,16,262160,0,262144,16,262160,4096,266240,4112,266256,4096,266240,4112,266256),j=new Array(0,1024,32,1056,0,1024,32,1056,33554432,33555456,33554464,33555488,33554432,33555456,33554464,33555488),k=new Array(0,268435456,524288,268959744,2,268435458,524290,268959746,0,268435456,524288,268959744,2,268435458,524290,268959746),l=new Array(0,65536,2048,67584,536870912,536936448,536872960,536938496,131072,196608,133120,198656,537001984,537067520,537004032,537069568),m=new Array(0,262144,0,262144,2,262146,2,262146,33554432,33816576,33554432,33816576,33554434,33816578,33554434,33816578),n=new Array(0,268435456,8,268435464,0,268435456,8,268435464,1024,268436480,1032,268436488,1024,268436480,1032,268436488),o=new Array(0,32,0,32,1048576,1048608,1048576,1048608,8192,8224,8192,8224,1056768,1056800,1056768,1056800),p=new Array(0,16777216,512,16777728,2097152,18874368,2097664,18874880,67108864,83886080,67109376,83886592,69206016,85983232,69206528,85983744),q=new Array(0,4096,134217728,134221824,524288,528384,134742016,134746112,16,4112,134217744,134221840,524304,528400,134742032,134746128),r=new Array(0,4,256,260,0,4,256,260,1,5,257,261,1,5,257,261),s=a.length>8?3:1,t=new Array(32*s),u=new Array(0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0),v=0,w=0,x=0;s>x;x++){var y=a.charCodeAt(v++)<<24|a.charCodeAt(v++)<<16|a.charCodeAt(v++)<<8|a.charCodeAt(v++),z=a.charCodeAt(v++)<<24|a.charCodeAt(v++)<<16|a.charCodeAt(v++)<<8|a.charCodeAt(v++);d=252645135&(y>>>4^z),z^=d,y^=d<<4,d=65535&(z>>>-16^y),y^=d,z^=d<<-16,d=858993459&(y>>>2^z),z^=d,y^=d<<2,d=65535&(z>>>-16^y),y^=d,z^=d<<-16,d=1431655765&(y>>>1^z),z^=d,y^=d<<1,d=16711935&(z>>>8^y),y^=d,z^=d<<8,d=1431655765&(y>>>1^z),z^=d,y^=d<<1,d=y<<8|z>>>20&240,y=z<<24|z<<8&16711680|z>>>8&65280|z>>>24&240,z=d;for(var A=0;A>>26,z=z<<2|z>>>26):(y=y<<1|y>>>27,z=z<<1|z>>>27),y&=-15,z&=-15,b=e[y>>>28]|f[y>>>24&15]|g[y>>>20&15]|h[y>>>16&15]|i[y>>>12&15]|j[y>>>8&15]|k[y>>>4&15],c=l[z>>>28]|m[z>>>24&15]|n[z>>>20&15]|o[z>>>16&15]|p[z>>>12&15]|q[z>>>8&15]|r[z>>>4&15],d=65535&(c>>>16^b),t[w++]=b^d,t[w++]=c^d<<16}return t}function f(a,b){var c=8-a.length%8;return 2==b&&8>c?a+=" ".substr(0,c):1==b?a+=String.fromCharCode(c,c,c,c,c,c,c,c).substr(0,c):!b&&8>c&&(a+="\x00\x00\x00\x00\x00\x00\x00\x00".substr(0,c)),a}function g(a,b){if(2==b)a=a.replace(/ *$/g,"");else if(1==b){var c=a.charCodeAt(a.length-1);a=a.substr(0,a.length-c)}else b||(a=a.replace(/\0*$/g,""));return a}function h(a){this.key=[];for(var b=0;3>b;b++)this.key.push(a.substr(8*b,8));this.encrypt=function(a){return j.str2bin(d(e(this.key[2]),d(e(this.key[1]),d(e(this.key[0]),j.bin2str(a),!0,0,null,null),!1,0,null,null),!0,0,null,null))}}function i(a){this.key=a,this.encrypt=function(a,b){var c=e(this.key);return j.str2bin(d(c,j.bin2str(a),!0,0,null,b))},this.decrypt=function(a,b){var c=e(this.key);return j.str2bin(d(c,j.bin2str(a),!1,0,null,b))}}var j=a("../../util.js");h.keySize=h.prototype.keySize=24,h.blockSize=h.prototype.blockSize=8,b.exports={des:h,originalDes:i}},{"../../util.js":76}],23:[function(a,b,c){var d=a("./des.js");b.exports={des:d.originalDes,tripledes:d.des,cast5:a("./cast5.js"),twofish:a("./twofish.js"),blowfish:a("./blowfish.js"),idea:function(){throw new Error("IDEA symmetric-key algorithm not implemented")}};var e=a("./aes.js");for(var f in e)b.exports["aes"+f]=e[f]},{"./aes.js":19,"./blowfish.js":20,"./cast5.js":21,"./des.js":22,"./twofish.js":24}],24:[function(a,b,c){function d(a,b){return(a<>>32-b)&k}function e(a,b){return a[b]|a[b+1]<<8|a[b+2]<<16|a[b+3]<<24}function f(a,b,c){a.splice(b,4,255&c,c>>>8&255,c>>>16&255,c>>>24&255)}function g(a,b){return a>>>8*b&255}function h(){function a(a){function b(a){return a^a>>2^[0,90,180,238][3&a]}function c(a){return a^a>>1^a>>2^[0,238,180,90][3&a]}function f(a,b){var c,d,e;for(c=0;8>c;c++)d=b>>>24,b=b<<8&k|a>>>24,a=a<<8&k,e=d<<1,128&d&&(e^=333),b^=d^e<<16,e^=d>>>1,1&d&&(e^=166),b^=e<<24|e<<8;return b}function h(a,b){var c,d,e,f;return c=b>>4,d=15&b,e=A[a][c^d],f=B[a][E[d]^F[c]],D[a][E[f]^F[e]]<<4|C[a][e^f]}function i(a,b){var c=g(a,0),d=g(a,1),e=g(a,2),f=g(a,3);switch(q){case 4:c=G[1][c]^g(b[3],0),d=G[0][d]^g(b[3],1),e=G[0][e]^g(b[3],2),f=G[1][f]^g(b[3],3);case 3:c=G[1][c]^g(b[2],0),d=G[1][d]^g(b[2],1),e=G[0][e]^g(b[2],2),f=G[0][f]^g(b[2],3);case 2:c=G[0][G[0][c]^g(b[1],0)]^g(b[0],0),d=G[0][G[1][d]^g(b[1],1)]^g(b[0],1),e=G[1][G[0][e]^g(b[1],2)]^g(b[0],2),f=G[1][G[1][f]^g(b[1],3)]^g(b[0],3)}return H[0][c]^H[1][d]^H[2][e]^H[3][f]}o=a;var j,l,m,n,p,q,r,u,v,w=[],x=[],y=[],z=[],A=[[8,1,7,13,6,15,3,2,0,11,5,9,14,12,10,4],[2,8,11,13,15,7,6,14,3,1,9,4,0,10,12,5]],B=[[14,12,11,8,1,2,3,5,15,4,10,6,7,0,9,13],[1,14,2,11,4,12,3,7,6,13,10,5,15,9,0,8]],C=[[11,10,5,14,6,13,9,0,12,8,15,3,2,4,7,1],[4,12,7,5,1,6,9,10,0,14,13,8,2,11,3,15]],D=[[13,7,15,4,1,2,6,14,9,11,3,0,8,5,12,10],[11,9,5,1,12,3,13,14,6,4,7,15,2,0,8,10]],E=[0,8,1,9,2,10,3,11,4,12,5,13,6,14,7,15],F=[0,9,2,11,4,13,6,15,8,1,10,3,12,5,14,7],G=[[],[]],H=[[],[],[],[]];for(o=o.slice(0,32),j=o.length;16!=j&&24!=j&&32!=j;)o[j++]=0;for(j=0;j>2]=e(o,j);for(j=0;256>j;j++)G[0][j]=h(0,j),G[1][j]=h(1,j);for(j=0;256>j;j++)r=G[1][j],u=b(r),v=c(r),H[0][j]=r+(u<<8)+(v<<16)+(v<<24),H[2][j]=u+(v<<8)+(r<<16)+(v<<24),r=G[0][j],u=b(r),v=c(r),H[1][j]=v+(v<<8)+(u<<16)+(r<<24),H[3][j]=u+(r<<8)+(v<<16)+(u<<24);for(q=y.length/2,j=0;q>j;j++)l=y[j+j],w[j]=l,m=y[j+j+1],x[j]=m,z[q-j-1]=f(l,m);for(j=0;40>j;j+=2)l=16843009*j,m=l+16843009,l=i(l,w),m=d(i(m,x),8),s[j]=l+m&k,s[j+1]=d(l+2*m,9);for(j=0;256>j;j++)switch(l=m=n=p=j,q){case 4:l=G[1][l]^g(z[3],0),m=G[0][m]^g(z[3],1),n=G[0][n]^g(z[3],2),p=G[1][p]^g(z[3],3);case 3:l=G[1][l]^g(z[2],0),m=G[1][m]^g(z[2],1),n=G[0][n]^g(z[2],2),p=G[0][p]^g(z[2],3);case 2:t[0][j]=H[0][G[0][G[0][l]^g(z[1],0)]^g(z[0],0)],t[1][j]=H[1][G[0][G[1][m]^g(z[1],1)]^g(z[0],1)],t[2][j]=H[2][G[1][G[0][n]^g(z[1],2)]^g(z[0],2)],t[3][j]=H[3][G[1][G[1][p]^g(z[1],3)]^g(z[0],3)]}}function b(a){return t[0][g(a,0)]^t[1][g(a,1)]^t[2][g(a,2)]^t[3][g(a,3)]}function c(a){return t[0][g(a,3)]^t[1][g(a,0)]^t[2][g(a,1)]^t[3][g(a,2)]}function h(a,e){var f=b(e[0]),g=c(e[1]);e[2]=d(e[2]^f+g+s[4*a+8]&k,31),e[3]=d(e[3],1)^f+2*g+s[4*a+9]&k,f=b(e[2]),g=c(e[3]),e[0]=d(e[0]^f+g+s[4*a+10]&k,31),e[1]=d(e[1],1)^f+2*g+s[4*a+11]&k}function i(a,e){var f=b(e[0]),g=c(e[1]);e[2]=d(e[2],1)^f+g+s[4*a+10]&k,e[3]=d(e[3]^f+2*g+s[4*a+11]&k,31),f=b(e[2]),g=c(e[3]),e[0]=d(e[0],1)^f+g+s[4*a+8]&k,e[1]=d(e[1]^f+2*g+s[4*a+9]&k,31)}function j(){s=[],t=[[],[],[],[]]}function l(a,b){p=a,q=b;for(var c=[e(p,q)^s[0],e(p,q+4)^s[1],e(p,q+8)^s[2],e(p,q+12)^s[3]],d=0;8>d;d++)h(d,c);return f(p,q,c[2]^s[4]),f(p,q+4,c[3]^s[5]),f(p,q+8,c[0]^s[6]),f(p,q+12,c[1]^s[7]),q+=16,p}function m(a,b){p=a,q=b;for(var c=[e(p,q)^s[4],e(p,q+4)^s[5],e(p,q+8)^s[6],e(p,q+12)^s[7]],d=7;d>=0;d--)i(d,c);f(p,q,c[2]^s[0]),f(p,q+4,c[3]^s[1]),f(p,q+8,c[0]^s[2]),f(p,q+12,c[1]^s[3]),q+=16}function n(){return p}var o=null,p=null,q=-1,r=null;r="twofish";var s=[],t=[[],[],[],[]];return{name:"twofish",blocksize:16,open:a,close:j,encrypt:l,decrypt:m,finalize:n}}function i(a){this.tf=h(),this.tf.open(l.str2bin(a),0),this.encrypt=function(a){return this.tf.encrypt(j(a),0)}}function j(a){for(var b=[],c=0;c=64;){for(k=0;16>k;++k)b[k]=c.getInt32();for(;64>k;++k)d=b[k-2],d=(d>>>17|d<<15)^(d>>>19|d<<13)^d>>>10,e=b[k-15],e=(e>>>7|e<<25)^(e>>>18|e<<14)^e>>>3,b[k]=d+b[k-7]+e+b[k-16]&4294967295;for(l=a.h0,m=a.h1,n=a.h2,o=a.h3,p=a.h4,q=a.h5,r=a.h6,s=a.h7,k=0;64>k;++k)g=(p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7),i=r^p&(q^r),f=(l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10),j=l&m|n&(l^m),d=s+g+i+h[k]+b[k],e=f+j,s=r,r=q,q=p,p=o+d&4294967295,o=n,n=m,m=l,l=d+e&4294967295;a.h0=a.h0+l&4294967295,a.h1=a.h1+m&4294967295,a.h2=a.h2+n&4294967295,a.h3=a.h3+o&4294967295,a.h4=a.h4+p&4294967295,a.h5=a.h5+q&4294967295,a.h6=a.h6+r&4294967295,a.h7=a.h7+s&4294967295,t-=64}};d.create=function(){g||i();var a=null,b=e.createBuffer(),c=new Array(64),d={algorithm:"sha256",blockLength:64,digestLength:32,messageLength:0};return d.start=function(){return d.messageLength=0,b=e.createBuffer(),a={h0:1779033703,h1:3144134277,h2:1013904242,h3:2773480762,h4:1359893119,h5:2600822924,h6:528734635,h7:1541459225},d},d.start(),d.update=function(f,g){return"utf8"===g&&(f=e.encodeUtf8(f)),d.messageLength+=f.length,b.putBytes(f),j(a,c,b),(b.read>2048||0===b.length())&&b.compact(),d},d.digest=function(){var g=d.messageLength,h=e.createBuffer();h.putBytes(b.bytes()),h.putBytes(f.substr(0,64-(g+8)%64)),h.putInt32(g>>>29&255),h.putInt32(g<<3&4294967295);var i={h0:a.h0,h1:a.h1,h2:a.h2,h3:a.h3,h4:a.h4,h5:a.h5,h6:a.h6,h7:a.h7};j(i,c,h);var k=e.createBuffer();return k.putInt32(i.h0),k.putInt32(i.h1),k.putInt32(i.h2),k.putInt32(i.h3),k.putInt32(i.h4),k.putInt32(i.h5),k.putInt32(i.h6),k.putInt32(i.h7),k},d}},{"./forge_util.js":27}],27:[function(a,b,c){var d=b.exports={};d.isArray=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},d.isArrayBuffer=function(a){return"undefined"!=typeof ArrayBuffer&&a instanceof ArrayBuffer};var e=[];"undefined"!=typeof Int8Array&&e.push(Int8Array),"undefined"!=typeof Uint8Array&&e.push(Uint8Array),"undefined"!=typeof Uint8ClampedArray&&e.push(Uint8ClampedArray),"undefined"!=typeof Int16Array&&e.push(Int16Array),"undefined"!=typeof Uint16Array&&e.push(Uint16Array),"undefined"!=typeof Int32Array&&e.push(Int32Array),"undefined"!=typeof Uint32Array&&e.push(Uint32Array),"undefined"!=typeof Float32Array&&e.push(Float32Array),"undefined"!=typeof Float64Array&&e.push(Float64Array),d.isArrayBufferView=function(a){for(var b=0;b0;)1&b&&(c+=a),b>>>=1,b>0&&(a+=a);return this.data=c,this},d.ByteBuffer.prototype.putBytes=function(a){return this.data+=a,this},d.ByteBuffer.prototype.putString=function(a){return this.data+=d.encodeUtf8(a),this},d.ByteBuffer.prototype.putInt16=function(a){return this.data+=String.fromCharCode(a>>8&255)+String.fromCharCode(255&a),this},d.ByteBuffer.prototype.putInt24=function(a){return this.data+=String.fromCharCode(a>>16&255)+String.fromCharCode(a>>8&255)+String.fromCharCode(255&a),this},d.ByteBuffer.prototype.putInt32=function(a){return this.data+=String.fromCharCode(a>>24&255)+String.fromCharCode(a>>16&255)+String.fromCharCode(a>>8&255)+String.fromCharCode(255&a),this},d.ByteBuffer.prototype.putInt16Le=function(a){return this.data+=String.fromCharCode(255&a)+String.fromCharCode(a>>8&255),this},d.ByteBuffer.prototype.putInt24Le=function(a){return this.data+=String.fromCharCode(255&a)+String.fromCharCode(a>>8&255)+String.fromCharCode(a>>16&255),this},d.ByteBuffer.prototype.putInt32Le=function(a){return this.data+=String.fromCharCode(255&a)+String.fromCharCode(a>>8&255)+String.fromCharCode(a>>16&255)+String.fromCharCode(a>>24&255),this},d.ByteBuffer.prototype.putInt=function(a,b){do b-=8,this.data+=String.fromCharCode(a>>b&255);while(b>0);return this},d.ByteBuffer.prototype.putSignedInt=function(a,b){return 0>a&&(a+=2<0);return b},d.ByteBuffer.prototype.getSignedInt=function(a){var b=this.getInt(a),c=2<=c&&(b-=c<<1),b},d.ByteBuffer.prototype.getBytes=function(a){var b;return a?(a=Math.min(this.length(),a),b=this.data.slice(this.read,this.read+a),this.read+=a):0===a?b="":(b=0===this.read?this.data:this.data.slice(this.read),this.clear()),b},d.ByteBuffer.prototype.bytes=function(a){return"undefined"==typeof a?this.data.slice(this.read):this.data.slice(this.read,this.read+a)},d.ByteBuffer.prototype.at=function(a){return this.data.charCodeAt(this.read+a)},d.ByteBuffer.prototype.setAt=function(a,b){return this.data=this.data.substr(0,this.read+a)+String.fromCharCode(b)+this.data.substr(this.read+a+1),this},d.ByteBuffer.prototype.last=function(){return this.data.charCodeAt(this.data.length-1)},d.ByteBuffer.prototype.copy=function(){var a=d.createBuffer(this.data);return a.read=this.read,a},d.ByteBuffer.prototype.compact=function(){return this.read>0&&(this.data=this.data.slice(this.read),this.read=0),this},d.ByteBuffer.prototype.clear=function(){return this.data="",this.read=0,this},d.ByteBuffer.prototype.truncate=function(a){var b=Math.max(0,this.length()-a);return this.data=this.data.substr(this.read,b),this.read=0,this},d.ByteBuffer.prototype.toHex=function(){for(var a="",b=this.read;bc&&(a+="0"),a+=c.toString(16)}return a},d.ByteBuffer.prototype.toString=function(){return d.decodeUtf8(this.bytes())},d.createBuffer=function(a,b){return b=b||"raw",void 0!==a&&"utf8"===b&&(a=d.encodeUtf8(a)),new d.ByteBuffer(a)},d.fillString=function(a,b){for(var c="";b>0;)1&b&&(c+=a),b>>>=1,b>0&&(a+=a);return c},d.xorBytes=function(a,b,c){for(var d="",e="",f="",g=0,h=0;c>0;--c,++g)e=a.charCodeAt(g)^b.charCodeAt(g),h>=10&&(d+=f,f="",h=0),f+=String.fromCharCode(e),++h;return d+=f},d.hexToBytes=function(a){var b="",c=0;for(a.length&!0&&(c=1,b+=String.fromCharCode(parseInt(a[0],16)));c>24&255)+String.fromCharCode(a>>16&255)+String.fromCharCode(a>>8&255)+String.fromCharCode(255&a)};var f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",g=[62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,64,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51];d.encode64=function(a,b){for(var c,d,e,g="",h="",i=0;i>2),g+=f.charAt((3&c)<<4|d>>4),isNaN(d)?g+="==":(g+=f.charAt((15&d)<<2|e>>6),g+=isNaN(e)?"=":f.charAt(63&e)),b&&g.length>b&&(h+=g.substr(0,b)+"\r\n",g=g.substr(b));return h+=g},d.decode64=function(a){a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");for(var b,c,d,e,f="",h=0;h>4),64!==d&&(f+=String.fromCharCode((15&c)<<4|d>>2),64!==e&&(f+=String.fromCharCode((3&d)<<6|e)));return f},d.encodeUtf8=function(a){return unescape(encodeURIComponent(a))},d.decodeUtf8=function(a){return decodeURIComponent(escape(a))}},{}],28:[function(a,b,c){var d=a("./sha.js"),e=a("./forge_sha256.js");b.exports={md5:a("./md5.js"),sha1:d.sha1,sha224:d.sha224,sha256:d.sha256,sha384:d.sha384,sha512:d.sha512,ripemd:a("./ripe-md.js"),digest:function(a,b){switch(a){case 1:return this.md5(b);case 2:return this.sha1(b);case 3:return this.ripemd(b);case 8:var c=e.create();return c.update(b),c.digest().getBytes();case 9:return this.sha384(b);case 10:return this.sha512(b);case 11:return this.sha224(b);default:throw new Error("Invalid hash function.")}},getHashByteLength:function(a){switch(a){case 1:return 16;case 2:case 3:return 20;case 8:return 32;case 9:return 48;case 10:return 64;case 11:return 28;default:throw new Error("Invalid hash algorithm.")}}}},{"./forge_sha256.js":26,"./md5.js":29,"./ripe-md.js":30,"./sha.js":31}],29:[function(a,b,c){function d(a,b){var c=a[0],d=a[1],e=a[2],j=a[3];c=f(c,d,e,j,b[0],7,-680876936),j=f(j,c,d,e,b[1],12,-389564586),e=f(e,j,c,d,b[2],17,606105819),d=f(d,e,j,c,b[3],22,-1044525330),c=f(c,d,e,j,b[4],7,-176418897),j=f(j,c,d,e,b[5],12,1200080426),e=f(e,j,c,d,b[6],17,-1473231341),d=f(d,e,j,c,b[7],22,-45705983),c=f(c,d,e,j,b[8],7,1770035416),j=f(j,c,d,e,b[9],12,-1958414417),e=f(e,j,c,d,b[10],17,-42063),d=f(d,e,j,c,b[11],22,-1990404162),c=f(c,d,e,j,b[12],7,1804603682),j=f(j,c,d,e,b[13],12,-40341101),e=f(e,j,c,d,b[14],17,-1502002290),d=f(d,e,j,c,b[15],22,1236535329),c=g(c,d,e,j,b[1],5,-165796510),j=g(j,c,d,e,b[6],9,-1069501632),e=g(e,j,c,d,b[11],14,643717713),d=g(d,e,j,c,b[0],20,-373897302),c=g(c,d,e,j,b[5],5,-701558691),j=g(j,c,d,e,b[10],9,38016083),e=g(e,j,c,d,b[15],14,-660478335),d=g(d,e,j,c,b[4],20,-405537848),c=g(c,d,e,j,b[9],5,568446438),j=g(j,c,d,e,b[14],9,-1019803690),e=g(e,j,c,d,b[3],14,-187363961),d=g(d,e,j,c,b[8],20,1163531501),c=g(c,d,e,j,b[13],5,-1444681467),j=g(j,c,d,e,b[2],9,-51403784),e=g(e,j,c,d,b[7],14,1735328473),d=g(d,e,j,c,b[12],20,-1926607734),c=h(c,d,e,j,b[5],4,-378558),j=h(j,c,d,e,b[8],11,-2022574463),e=h(e,j,c,d,b[11],16,1839030562),d=h(d,e,j,c,b[14],23,-35309556),c=h(c,d,e,j,b[1],4,-1530992060),j=h(j,c,d,e,b[4],11,1272893353),e=h(e,j,c,d,b[7],16,-155497632),d=h(d,e,j,c,b[10],23,-1094730640),c=h(c,d,e,j,b[13],4,681279174),j=h(j,c,d,e,b[0],11,-358537222),e=h(e,j,c,d,b[3],16,-722521979),d=h(d,e,j,c,b[6],23,76029189),c=h(c,d,e,j,b[9],4,-640364487),j=h(j,c,d,e,b[12],11,-421815835),e=h(e,j,c,d,b[15],16,530742520),d=h(d,e,j,c,b[2],23,-995338651),c=i(c,d,e,j,b[0],6,-198630844),j=i(j,c,d,e,b[7],10,1126891415),e=i(e,j,c,d,b[14],15,-1416354905),d=i(d,e,j,c,b[5],21,-57434055),c=i(c,d,e,j,b[12],6,1700485571),j=i(j,c,d,e,b[3],10,-1894986606),e=i(e,j,c,d,b[10],15,-1051523),d=i(d,e,j,c,b[1],21,-2054922799),c=i(c,d,e,j,b[8],6,1873313359),j=i(j,c,d,e,b[15],10,-30611744),e=i(e,j,c,d,b[6],15,-1560198380),d=i(d,e,j,c,b[13],21,1309151649),c=i(c,d,e,j,b[4],6,-145523070),j=i(j,c,d,e,b[11],10,-1120210379),e=i(e,j,c,d,b[2],15,718787259),d=i(d,e,j,c,b[9],21,-343485551),a[0]=o(c,a[0]),a[1]=o(d,a[1]),a[2]=o(e,a[2]),a[3]=o(j,a[3])}function e(a,b,c,d,e,f){return b=o(o(b,a),o(d,f)),o(b<>>32-e,c)}function f(a,b,c,d,f,g,h){return e(b&c|~b&d,a,b,f,g,h)}function g(a,b,c,d,f,g,h){return e(b&d|c&~d,a,b,f,g,h)}function h(a,b,c,d,f,g,h){return e(b^c^d,a,b,f,g,h)}function i(a,b,c,d,f,g,h){return e(c^(b|~d),a,b,f,g,h)}function j(a){var b,c=a.length,e=[1732584193,-271733879,-1732584194,271733878];for(b=64;b<=a.length;b+=64)d(e,k(a.substring(b-64,b)));a=a.substring(b-64);var f=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(b=0;b>2]|=a.charCodeAt(b)<<(b%4<<3);if(f[b>>2]|=128<<(b%4<<3),b>55)for(d(e,f),b=0;16>b;b++)f[b]=0;return f[14]=8*c,d(e,f),e}function k(a){var b,c=[];for(b=0;64>b;b+=4)c[b>>2]=a.charCodeAt(b)+(a.charCodeAt(b+1)<<8)+(a.charCodeAt(b+2)<<16)+(a.charCodeAt(b+3)<<24);return c}function l(a){for(var b="",c=0;4>c;c++)b+=q[a>>8*c+4&15]+q[a>>8*c&15];return b}function m(a){for(var b=0;b>16)+(b>>16)+(c>>16);return d<<16|65535&c}var p=a("../../util.js");b.exports=function(a){var b=n(a),c=p.hex2bin(b);return c};var q="0123456789abcdef".split("");"5d41402abc4b2a76b9719d911017c592"!=n("hello")},{"../../util.js":76}],30:[function(a,b,c){function d(a,b){return new Number(a<>>32-b)}function e(a,b,c){return new Number(a^b^c)}function f(a,b,c){return new Number(a&b|~a&c)}function g(a,b,c){return new Number((a|~b)^c)}function h(a,b,c){return new Number(a&c|b&~c)}function i(a,b,c){return new Number(a^(b|~c))}function j(a,b,c,j,k,l,m,n){switch(n){case 0:a+=e(b,c,j)+l+0;break;case 1:a+=f(b,c,j)+l+1518500249;break;case 2:a+=g(b,c,j)+l+1859775393;break;case 3:a+=h(b,c,j)+l+2400959708;break;case 4:a+=i(b,c,j)+l+2840853838;break;case 5:a+=i(b,c,j)+l+1352829926;break;case 6:a+=h(b,c,j)+l+1548603684;break;case 7:a+=g(b,c,j)+l+1836072691;break;case 8:a+=f(b,c,j)+l+2053994217;break;case 9:a+=e(b,c,j)+l+0;break;default:throw new Error("Bogus round number")}a=d(a,m)+k,c=d(c,10),a&=4294967295,b&=4294967295,c&=4294967295,j&=4294967295,k&=4294967295;var o=[];return o[0]=a,o[1]=b,o[2]=c,o[3]=j,o[4]=k,o[5]=l,o[6]=m,o}function k(a){a[0]=1732584193,a[1]=4023233417,a[2]=2562383102,a[3]=271733878,a[4]=3285377520}function l(a,b){var c,d,e,f=[],g=[];for(d=0;5>d;d++)f[d]=new Number(a[d]),g[d]=new Number(a[d]);var h=0;for(e=0;5>e;e++)for(d=0;16>d;d++)c=j(f[(h+0)%5],f[(h+1)%5],f[(h+2)%5],f[(h+3)%5],f[(h+4)%5],b[t[e][d]],s[e][d],e),f[(h+0)%5]=c[0],f[(h+1)%5]=c[1],f[(h+2)%5]=c[2],f[(h+3)%5]=c[3],f[(h+4)%5]=c[4],h+=4;for(h=0,e=5;10>e;e++)for(d=0;16>d;d++)c=j(g[(h+0)%5],g[(h+1)%5],g[(h+2)%5],g[(h+3)%5],g[(h+4)%5],b[t[e][d]],s[e][d],e),g[(h+0)%5]=c[0],g[(h+1)%5]=c[1],g[(h+2)%5]=c[2],g[(h+3)%5]=c[3],g[(h+4)%5]=c[4],h+=4;g[3]+=f[2]+a[1],a[1]=a[2]+f[3]+g[4],a[2]=a[3]+f[4]+g[0],a[3]=a[4]+f[0]+g[1],a[4]=a[0]+f[1]+g[2],a[0]=g[3]}function m(a){for(var b=0;16>b;b++)a[b]=0}function n(a,b,c,d){var e=new Array(16);m(e);for(var f=0,g=0;(63&c)>g;g++)e[g>>>2]^=(255&b.charCodeAt(f++))<<8*(3&g);e[c>>>2&15]^=1<<8*(3&c)+7,(63&c)>55&&(l(a,e),e=new Array(16),m(e)),e[14]=c<<3,e[15]=c>>>29|d<<3,l(a,e)}function o(a){var b=(255&a.charCodeAt(3))<<24;return b|=(255&a.charCodeAt(2))<<16,b|=(255&a.charCodeAt(1))<<8,b|=255&a.charCodeAt(0)}function p(a){var b,c,d=new Array(r/32),e=new Array(r/8);k(d),b=a.length;var f=new Array(16);m(f);var g,h=0;for(c=b;c>63;c-=64){for(g=0;16>g;g++)f[g]=o(a.substr(h,4)),h+=4;l(d,f)}for(n(d,a.substr(h),b,0),g=0;r/8>g;g+=4)e[g]=255&d[g>>>2],e[g+1]=d[g>>>2]>>>8&255,e[g+2]=d[g>>>2]>>>16&255,e[g+3]=d[g>>>2]>>>24&255;return e}function q(a){for(var b=p(a),c="",d=0;r/8>d;d++)c+=String.fromCharCode(b[d]);return c}var r=160,s=[[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8],[7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12],[11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5],[11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12],[9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6],[8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6],[9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11],[9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5],[15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8],[8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]],t=[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],[7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8],[3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12],[1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2],[4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13],[5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12],[6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2],[15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13],[8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14],[12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]];b.exports=q},{}],31:[function(a,b,c){var d=function(){var a=8,b="",c=0,d=function(a,b){this.highOrder=a,this.lowOrder=b},e=function(b){var c,d=[],e=(1<c;c+=a)d[c>>5]|=(b.charCodeAt(c/a)&e)<<32-a-c%32;return d},f=function(a){var b,c,d=[],e=a.length;for(b=0;e>b;b+=2){if(c=parseInt(a.substr(b,2),16),isNaN(c))throw new Error("INVALID HEX STRING");d[b>>3]|=c<<24-4*(b%8)}return d},g=function(a){var b,d,e=c?"0123456789ABCDEF":"0123456789abcdef",f="",g=4*a.length;for(b=0;g>b;b+=1)d=a[b>>2]>>8*(3-b%4),f+=e.charAt(d>>4&15)+e.charAt(15&d);return f},h=function(a){var c,d,e,f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",g="",h=4*a.length;for(c=0;h>c;c+=3)for(e=(a[c>>2]>>8*(3-c%4)&255)<<16|(a[c+1>>2]>>8*(3-(c+1)%4)&255)<<8|a[c+2>>2]>>8*(3-(c+2)%4)&255,d=0;4>d;d+=1)g+=8*c+6*d<=32*a.length?f.charAt(e>>6*(3-d)&63):b;return g},i=function(a){for(var b="",c=255,d=0;d<32*a.length;d+=8)b+=String.fromCharCode(a[d>>5]>>>24-d%32&c);return b},j=function(a,b){return a<>>32-b},k=function(a,b){return a>>>b|a<<32-b},l=function(a,b){return 32>=b?new d(a.highOrder>>>b|a.lowOrder<<32-b,a.lowOrder>>>b|a.highOrder<<32-b):new d(a.lowOrder>>>b|a.highOrder<<32-b,a.highOrder>>>b|a.lowOrder<<32-b)},m=function(a,b){return a>>>b},n=function(a,b){return 32>=b?new d(a.highOrder>>>b,a.lowOrder>>>b|a.highOrder<<32-b):new d(0,a.highOrder<<32-b)},o=function(a,b,c){return a^b^c},p=function(a,b,c){return a&b^~a&c},q=function(a,b,c){return new d(a.highOrder&b.highOrder^~a.highOrder&c.highOrder,a.lowOrder&b.lowOrder^~a.lowOrder&c.lowOrder)},r=function(a,b,c){return a&b^a&c^b&c},s=function(a,b,c){return new d(a.highOrder&b.highOrder^a.highOrder&c.highOrder^b.highOrder&c.highOrder,a.lowOrder&b.lowOrder^a.lowOrder&c.lowOrder^b.lowOrder&c.lowOrder)},t=function(a){return k(a,2)^k(a,13)^k(a,22)},u=function(a){var b=l(a,28),c=l(a,34),e=l(a,39);return new d(b.highOrder^c.highOrder^e.highOrder,b.lowOrder^c.lowOrder^e.lowOrder)},v=function(a){return k(a,6)^k(a,11)^k(a,25)},w=function(a){var b=l(a,14),c=l(a,18),e=l(a,41);return new d(b.highOrder^c.highOrder^e.highOrder,b.lowOrder^c.lowOrder^e.lowOrder)},x=function(a){return k(a,7)^k(a,18)^m(a,3)},y=function(a){var b=l(a,1),c=l(a,8),e=n(a,7);return new d(b.highOrder^c.highOrder^e.highOrder,b.lowOrder^c.lowOrder^e.lowOrder)},z=function(a){return k(a,17)^k(a,19)^m(a,10)},A=function(a){var b=l(a,19),c=l(a,61),e=n(a,6);return new d(b.highOrder^c.highOrder^e.highOrder,b.lowOrder^c.lowOrder^e.lowOrder)},B=function(a,b){var c=(65535&a)+(65535&b),d=(a>>>16)+(b>>>16)+(c>>>16);return(65535&d)<<16|65535&c},C=function(a,b,c,d){var e=(65535&a)+(65535&b)+(65535&c)+(65535&d),f=(a>>>16)+(b>>>16)+(c>>>16)+(d>>>16)+(e>>>16);return(65535&f)<<16|65535&e},D=function(a,b,c,d,e){var f=(65535&a)+(65535&b)+(65535&c)+(65535&d)+(65535&e),g=(a>>>16)+(b>>>16)+(c>>>16)+(d>>>16)+(e>>>16)+(f>>>16);return(65535&g)<<16|65535&f},E=function(a,b){var c,e,f,g;return c=(65535&a.lowOrder)+(65535&b.lowOrder),e=(a.lowOrder>>>16)+(b.lowOrder>>>16)+(c>>>16),f=(65535&e)<<16|65535&c,c=(65535&a.highOrder)+(65535&b.highOrder)+(e>>>16),e=(a.highOrder>>>16)+(b.highOrder>>>16)+(c>>>16),g=(65535&e)<<16|65535&c,new d(g,f)},F=function(a,b,c,e){ -var f,g,h,i;return f=(65535&a.lowOrder)+(65535&b.lowOrder)+(65535&c.lowOrder)+(65535&e.lowOrder),g=(a.lowOrder>>>16)+(b.lowOrder>>>16)+(c.lowOrder>>>16)+(e.lowOrder>>>16)+(f>>>16),h=(65535&g)<<16|65535&f,f=(65535&a.highOrder)+(65535&b.highOrder)+(65535&c.highOrder)+(65535&e.highOrder)+(g>>>16),g=(a.highOrder>>>16)+(b.highOrder>>>16)+(c.highOrder>>>16)+(e.highOrder>>>16)+(f>>>16),i=(65535&g)<<16|65535&f,new d(i,h)},G=function(a,b,c,e,f){var g,h,i,j;return g=(65535&a.lowOrder)+(65535&b.lowOrder)+(65535&c.lowOrder)+(65535&e.lowOrder)+(65535&f.lowOrder),h=(a.lowOrder>>>16)+(b.lowOrder>>>16)+(c.lowOrder>>>16)+(e.lowOrder>>>16)+(f.lowOrder>>>16)+(g>>>16),i=(65535&h)<<16|65535&g,g=(65535&a.highOrder)+(65535&b.highOrder)+(65535&c.highOrder)+(65535&e.highOrder)+(65535&f.highOrder)+(h>>>16),h=(a.highOrder>>>16)+(b.highOrder>>>16)+(c.highOrder>>>16)+(e.highOrder>>>16)+(f.highOrder>>>16)+(g>>>16),j=(65535&h)<<16|65535&g,new d(j,i)},H=function(a,b){var c,d,e,f,g,h,i,k,l,m=[],n=p,q=o,s=r,t=j,u=B,v=D,w=[1732584193,4023233417,2562383102,271733878,3285377520],x=[1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782];for(a[b>>5]|=128<<24-b%32,a[(b+65>>9<<4)+15]=b,l=a.length,i=0;l>i;i+=16){for(c=w[0],d=w[1],e=w[2],f=w[3],g=w[4],k=0;80>k;k+=1)16>k?m[k]=a[k+i]:m[k]=t(m[k-3]^m[k-8]^m[k-14]^m[k-16],1),h=20>k?v(t(c,5),n(d,e,f),g,x[k],m[k]):40>k?v(t(c,5),q(d,e,f),g,x[k],m[k]):60>k?v(t(c,5),s(d,e,f),g,x[k],m[k]):v(t(c,5),q(d,e,f),g,x[k],m[k]),g=f,f=e,e=t(d,30),d=c,c=h;w[0]=u(c,w[0]),w[1]=u(d,w[1]),w[2]=u(e,w[2]),w[3]=u(f,w[3]),w[4]=u(g,w[4])}return w},I=function(a,b,c){var e,f,g,h,i,j,k,l,m,n,o,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z=[];for("SHA-224"===c||"SHA-256"===c?(H=64,I=(b+65>>9<<4)+15,L=16,M=1,W=Number,N=B,O=C,P=D,Q=x,R=z,S=t,T=v,V=r,U=p,X=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],o="SHA-224"===c?[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428]:[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]):("SHA-384"===c||"SHA-512"===c)&&(H=80,I=(b+128>>10<<5)+31,L=32,M=2,W=d,N=E,O=F,P=G,Q=y,R=A,S=u,T=w,V=s,U=q,X=[new W(1116352408,3609767458),new W(1899447441,602891725),new W(3049323471,3964484399),new W(3921009573,2173295548),new W(961987163,4081628472),new W(1508970993,3053834265),new W(2453635748,2937671579),new W(2870763221,3664609560),new W(3624381080,2734883394),new W(310598401,1164996542),new W(607225278,1323610764),new W(1426881987,3590304994),new W(1925078388,4068182383),new W(2162078206,991336113),new W(2614888103,633803317),new W(3248222580,3479774868),new W(3835390401,2666613458),new W(4022224774,944711139),new W(264347078,2341262773),new W(604807628,2007800933),new W(770255983,1495990901),new W(1249150122,1856431235),new W(1555081692,3175218132),new W(1996064986,2198950837),new W(2554220882,3999719339),new W(2821834349,766784016),new W(2952996808,2566594879),new W(3210313671,3203337956),new W(3336571891,1034457026),new W(3584528711,2466948901),new W(113926993,3758326383),new W(338241895,168717936),new W(666307205,1188179964),new W(773529912,1546045734),new W(1294757372,1522805485),new W(1396182291,2643833823),new W(1695183700,2343527390),new W(1986661051,1014477480),new W(2177026350,1206759142),new W(2456956037,344077627),new W(2730485921,1290863460),new W(2820302411,3158454273),new W(3259730800,3505952657),new W(3345764771,106217008),new W(3516065817,3606008344),new W(3600352804,1432725776),new W(4094571909,1467031594),new W(275423344,851169720),new W(430227734,3100823752),new W(506948616,1363258195),new W(659060556,3750685593),new W(883997877,3785050280),new W(958139571,3318307427),new W(1322822218,3812723403),new W(1537002063,2003034995),new W(1747873779,3602036899),new W(1955562222,1575990012),new W(2024104815,1125592928),new W(2227730452,2716904306),new W(2361852424,442776044),new W(2428436474,593698344),new W(2756734187,3733110249),new W(3204031479,2999351573),new W(3329325298,3815920427),new W(3391569614,3928383900),new W(3515267271,566280711),new W(3940187606,3454069534),new W(4118630271,4000239992),new W(116418474,1914138554),new W(174292421,2731055270),new W(289380356,3203993006),new W(460393269,320620315),new W(685471733,587496836),new W(852142971,1086792851),new W(1017036298,365543100),new W(1126000580,2618297676),new W(1288033470,3409855158),new W(1501505948,4234509866),new W(1607167915,987167468),new W(1816402316,1246189591)],o="SHA-384"===c?[new W(3418070365,3238371032),new W(1654270250,914150663),new W(2438529370,812702999),new W(355462360,4144912697),new W(1731405415,4290775857),new W(41048885895,1750603025),new W(3675008525,1694076839),new W(1203062813,3204075428)]:[new W(1779033703,4089235720),new W(3144134277,2227873595),new W(1013904242,4271175723),new W(2773480762,1595750129),new W(1359893119,2917565137),new W(2600822924,725511199),new W(528734635,4215389547),new W(1541459225,327033209)]),a[b>>5]|=128<<24-b%32,a[I]=b,Y=a.length,J=0;Y>J;J+=L){for(e=o[0],f=o[1],g=o[2],h=o[3],i=o[4],j=o[5],k=o[6],l=o[7],K=0;H>K;K+=1)16>K?Z[K]=new W(a[K*M+J],a[K*M+J+1]):Z[K]=O(R(Z[K-2]),Z[K-7],Q(Z[K-15]),Z[K-16]),m=P(l,T(i),U(i,j,k),X[K],Z[K]),n=N(S(e),V(e,f,g)),l=k,k=j,j=i,i=N(h,m),h=g,g=f,f=e,e=N(m,n);o[0]=N(e,o[0]),o[1]=N(f,o[1]),o[2]=N(g,o[2]),o[3]=N(h,o[3]),o[4]=N(i,o[4]),o[5]=N(j,o[5]),o[6]=N(k,o[6]),o[7]=N(l,o[7])}switch(c){case"SHA-224":return[o[0],o[1],o[2],o[3],o[4],o[5],o[6]];case"SHA-256":return o;case"SHA-384":return[o[0].highOrder,o[0].lowOrder,o[1].highOrder,o[1].lowOrder,o[2].highOrder,o[2].lowOrder,o[3].highOrder,o[3].lowOrder,o[4].highOrder,o[4].lowOrder,o[5].highOrder,o[5].lowOrder];case"SHA-512":return[o[0].highOrder,o[0].lowOrder,o[1].highOrder,o[1].lowOrder,o[2].highOrder,o[2].lowOrder,o[3].highOrder,o[3].lowOrder,o[4].highOrder,o[4].lowOrder,o[5].highOrder,o[5].lowOrder,o[6].highOrder,o[6].lowOrder,o[7].highOrder,o[7].lowOrder];default:throw new Error("Unknown SHA variant")}},J=function(b,c){if(this.sha1=null,this.sha224=null,this.sha256=null,this.sha384=null,this.sha512=null,this.strBinLen=null,this.strToHash=null,"HEX"===c){if(0!==b.length%2)throw new Error("TEXT MUST BE IN BYTE INCREMENTS");this.strBinLen=4*b.length,this.strToHash=f(b)}else{if("ASCII"!==c&&"undefined"!=typeof c)throw new Error("UNKNOWN TEXT INPUT TYPE");this.strBinLen=b.length*a,this.strToHash=e(b)}};return J.prototype={getHash:function(a,b){var c=null,d=this.strToHash.slice();switch(b){case"HEX":c=g;break;case"B64":c=h;break;case"ASCII":c=i;break;default:throw new Error("FORMAT NOT RECOGNIZED")}switch(a){case"SHA-1":return null===this.sha1&&(this.sha1=H(d,this.strBinLen)),c(this.sha1);case"SHA-224":return null===this.sha224&&(this.sha224=I(d,this.strBinLen,a)),c(this.sha224);case"SHA-256":return null===this.sha256&&(this.sha256=I(d,this.strBinLen,a)),c(this.sha256);case"SHA-384":return null===this.sha384&&(this.sha384=I(d,this.strBinLen,a)),c(this.sha384);case"SHA-512":return null===this.sha512&&(this.sha512=I(d,this.strBinLen,a)),c(this.sha512);default:throw new Error("HASH NOT RECOGNIZED")}},getHMAC:function(b,c,d,j){var k,l,m,n,o,p,q,r,s,t=[],u=[];switch(j){case"HEX":k=g;break;case"B64":k=h;break;case"ASCII":k=i;break;default:throw new Error("FORMAT NOT RECOGNIZED")}switch(d){case"SHA-1":m=64,s=160;break;case"SHA-224":m=64,s=224;break;case"SHA-256":m=64,s=256;break;case"SHA-384":m=128,s=384;break;case"SHA-512":m=128,s=512;break;default:throw new Error("HASH NOT RECOGNIZED")}if("HEX"===c){if(0!==b.length%2)throw new Error("KEY MUST BE IN BYTE INCREMENTS");l=f(b),r=4*b.length}else{if("ASCII"!==c)throw new Error("UNKNOWN KEY INPUT TYPE");l=e(b),r=b.length*a}for(n=8*m,q=m/4-1,r/8>m?(l="SHA-1"===d?H(l,r):I(l,r,d),l[q]&=4294967040):m>r/8&&(l[q]&=4294967040),o=0;q>=o;o+=1)t[o]=909522486^l[o],u[o]=1549556828^l[o];return"SHA-1"===d?(p=H(t.concat(this.strToHash),n+this.strBinLen),p=H(u.concat(p),n+s)):(p=I(t.concat(this.strToHash),n+this.strBinLen,d),p=I(u.concat(p),n+s,d)),k(p)}},J}();b.exports={sha1:function(a){var b=new d(a,"ASCII");return b.getHash("SHA-1","ASCII")},sha224:function(a){var b=new d(a,"ASCII");return b.getHash("SHA-224","ASCII")},sha256:function(a){var b=new d(a,"ASCII");return b.getHash("SHA-256","ASCII")},sha384:function(a){var b=new d(a,"ASCII");return b.getHash("SHA-384","ASCII")},sha512:function(a){var b=new d(a,"ASCII");return b.getHash("SHA-512","ASCII")}}},{}],32:[function(a,b,c){b.exports={cipher:a("./cipher"),hash:a("./hash"),cfb:a("./cfb.js"),publicKey:a("./public_key"),signature:a("./signature.js"),random:a("./random.js"),pkcs1:a("./pkcs1.js")};var d=a("./crypto.js");for(var e in d)b.exports[e]=d[e]},{"./cfb.js":18,"./cipher":23,"./crypto.js":25,"./hash":28,"./pkcs1.js":33,"./public_key":36,"./random.js":39,"./signature.js":40}],33:[function(a,b,c){function d(a){for(var b,c="";c.lengthb-11)throw new Error("Message too long");var e=d(b-c-3),f=String.fromCharCode(0)+String.fromCharCode(2)+e+String.fromCharCode(0)+a;return f},decode:function(a){0!==a.charCodeAt(0)&&(a=String.fromCharCode(0)+a);for(var b=a.charCodeAt(0),c=a.charCodeAt(1),d=2;0!==a.charCodeAt(d)&&d=8&&0===f)return a.substr(d);throw new Error("Decryption error")}},emsa:{encode:function(a,b,c){var d,f=i.digest(a,b);if(f.length!==i.getHashByteLength(a))throw new Error("Invalid hash length");var j="";for(d=0;dc)throw new Error("Intended encoded message length too short");var l="";for(d=0;c-k-3>d;d++)l+=String.fromCharCode(255);var m=String.fromCharCode(0)+String.fromCharCode(1)+l+String.fromCharCode(0)+j;return new h(g.hexstrdump(m),16)}}}},{"../util.js":76,"./crypto.js":25,"./hash":28,"./public_key/jsbn.js":37,"./random.js":39}],34:[function(a,b,c){function d(){function a(a,b,c,d,i,j){for(var k,l,m,n=h.getLeftNBits(g.digest(a,b),i.bitLength()),o=new e(h.hexstrdump(n),16);;)if(k=f.getRandomBigIntegerInRange(e.ONE,i.subtract(e.ONE)),l=c.modPow(k,d).mod(i),m=k.modInverse(i).multiply(o.add(j.multiply(l))).mod(i),0!=l&&0!=m)break;var p=[];return p[0]=l.toMPI(),p[1]=m.toMPI(),p}function b(a){var b=i.prefer_hash_algorithm;switch(Math.round(a.bitLength()/8)){case 20:return 2!=b&&b>11&&10!=b&&8>b?2:b;case 28:return b>11&&8>b?11:b;case 32:return b>10&&8>b?8:b;default:return h.print_debug("DSA select hash algorithm: returning null for an unknown length of q"),null}}function c(a,b,c,d,f,i,j,k){var l=h.getLeftNBits(g.digest(a,d),i.bitLength()),m=new e(h.hexstrdump(l),16);if(e.ZERO.compareTo(b)>=0||b.compareTo(i)>=0||e.ZERO.compareTo(c)>=0||c.compareTo(i)>=0)return h.print_debug("invalid DSA Signature"),null;var n=c.modInverse(i);if(0==e.ZERO.compareTo(n))return h.print_debug("invalid DSA Signature"),null;var o=m.multiply(n).mod(i),p=b.multiply(n).mod(i);return j.modPow(o,f).multiply(k.modPow(p,f)).mod(f).mod(i)}this.select_hash_algorithm=b,this.sign=a,this.verify=c}var e=a("./jsbn.js"),f=a("../random.js"),g=a("../hash"),h=a("../../util.js"),i=a("../../config");b.exports=d},{"../../config":17,"../../util.js":76,"../hash":28,"../random.js":39,"./jsbn.js":37}],35:[function(a,b,c){function d(){function a(a,b,c,d){var g=c.subtract(e.TWO),h=f.getRandomBigIntegerInRange(e.ONE,g);h=h.mod(g).add(e.ONE);var i=[];return i[0]=b.modPow(h,c),i[1]=d.modPow(h,c).multiply(a).mod(c),i}function b(a,b,c,d){return g.print_debug("Elgamal Decrypt:\nc1:"+g.hexstrdump(a.toMPI())+"\nc2:"+g.hexstrdump(b.toMPI())+"\np:"+g.hexstrdump(c.toMPI())+"\nx:"+g.hexstrdump(d.toMPI())),a.modPow(d,c).modInverse(c).multiply(b).mod(c)}this.encrypt=a,this.decrypt=b}var e=a("./jsbn.js"),f=a("../random.js"),g=a("../../util.js");b.exports=d},{"../../util.js":76,"../random.js":39,"./jsbn.js":37}],36:[function(a,b,c){b.exports={rsa:a("./rsa.js"),elgamal:a("./elgamal.js"),dsa:a("./dsa.js")}},{"./dsa.js":34,"./elgamal.js":35,"./rsa.js":38}],37:[function(a,b,c){function d(a,b,c){null!=a&&("number"==typeof a?this.fromNumber(a,b,c):null==b&&"string"!=typeof a?this.fromString(a,256):this.fromString(a,b))}function e(){return new d(null)}function f(a,b,c,d,e,f){for(;--f>=0;){var g=b*this[a++]+c[d]+e;e=Math.floor(g/67108864),c[d++]=67108863&g}return e}function g(a){return fb.charAt(a)}function h(a,b){var c=gb[a.charCodeAt(b)];return null==c?-1:c}function i(a){for(var b=this.t-1;b>=0;--b)a[b]=this[b];a.t=this.t,a.s=this.s}function j(a){this.t=1,this.s=0>a?-1:0,a>0?this[0]=a:-1>a?this[0]=a+this.DV:this.t=0}function k(a){var b=e();return b.fromInt(a),b}function l(a,b){var c;if(16==b)c=4;else if(8==b)c=3;else if(256==b)c=8;else if(2==b)c=1;else if(32==b)c=5;else{if(4!=b)return void this.fromRadix(a,b);c=2}this.t=0,this.s=0;for(var e=a.length,f=!1,g=0;--e>=0;){var i=8==c?255&a[e]:h(a,e);0>i?"-"==a.charAt(e)&&(f=!0):(f=!1,0==g?this[this.t++]=i:g+c>this.DB?(this[this.t-1]|=(i&(1<>this.DB-g):this[this.t-1]|=i<=this.DB&&(g-=this.DB))}8==c&&0!=(128&a[0])&&(this.s=-1,g>0&&(this[this.t-1]|=(1<0&&this[this.t-1]==a;)--this.t}function n(a){if(this.s<0)return"-"+this.negate().toString(a);var b;if(16==a)b=4;else if(8==a)b=3;else if(2==a)b=1;else if(32==a)b=5;else{if(4!=a)return this.toRadix(a);b=2}var c,d=(1<0)for(i>i)>0&&(e=!0,f=g(c));h>=0;)b>i?(c=(this[h]&(1<>(i+=this.DB-b)):(c=this[h]>>(i-=b)&d,0>=i&&(i+=this.DB,--h)),c>0&&(e=!0),e&&(f+=g(c));return e?f:"0"}function o(){var a=e();return d.ZERO.subTo(this,a),a}function p(){return this.s<0?this.negate():this}function q(a){var b=this.s-a.s;if(0!=b)return b;var c=this.t;if(b=c-a.t,0!=b)return this.s<0?-b:b;for(;--c>=0;)if(0!=(b=this[c]-a[c]))return b;return 0}function r(a){var b,c=1;return 0!=(b=a>>>16)&&(a=b,c+=16),0!=(b=a>>8)&&(a=b,c+=8),0!=(b=a>>4)&&(a=b,c+=4),0!=(b=a>>2)&&(a=b,c+=2),0!=(b=a>>1)&&(a=b,c+=1),c}function s(){return this.t<=0?0:this.DB*(this.t-1)+r(this[this.t-1]^this.s&this.DM)}function t(a,b){var c;for(c=this.t-1;c>=0;--c)b[c+a]=this[c];for(c=a-1;c>=0;--c)b[c]=0;b.t=this.t+a,b.s=this.s}function u(a,b){for(var c=a;c=0;--c)b[c+g+1]=this[c]>>e|h,h=(this[c]&f)<=0;--c)b[c]=0;b[g]=h,b.t=this.t+g+1,b.s=this.s,b.clamp()}function w(a,b){b.s=this.s;var c=Math.floor(a/this.DB);if(c>=this.t)return void(b.t=0);var d=a%this.DB,e=this.DB-d,f=(1<>d;for(var g=c+1;g>d;d>0&&(b[this.t-c-1]|=(this.s&f)<c;)d+=this[c]-a[c],b[c++]=d&this.DM,d>>=this.DB;if(a.t>=this.DB;d+=this.s}else{for(d+=this.s;c>=this.DB;d-=a.s}b.s=0>d?-1:0,-1>d?b[c++]=this.DV+d:d>0&&(b[c++]=d),b.t=c,b.clamp()}function y(a,b){var c=this.abs(),e=a.abs(),f=c.t;for(b.t=f+e.t;--f>=0;)b[f]=0;for(f=0;f=0;)a[c]=0;for(c=0;c=b.DV&&(a[c+b.t]-=b.DV,a[c+b.t+1]=1)}a.t>0&&(a[a.t-1]+=b.am(c,b[c],a,2*c,0,1)),a.s=0,a.clamp()}function A(a,b,c){var f=a.abs();if(!(f.t<=0)){var g=this.abs();if(g.t0?(f.lShiftTo(k,h),g.lShiftTo(k,c)):(f.copyTo(h),g.copyTo(c));var l=h.t,m=h[l-1];if(0!=m){var n=m*(1<1?h[l-2]>>this.F2:0),o=this.FV/n,p=(1<=0&&(c[c.t++]=1,c.subTo(u,c)),d.ONE.dlShiftTo(l,u),u.subTo(h,h);h.t=0;){var v=c[--s]==m?this.DM:Math.floor(c[s]*o+(c[s-1]+q)*p);if((c[s]+=h.am(0,v,c,t,0,l))0&&c.rShiftTo(k,c),0>i&&d.ZERO.subTo(c,c)}}}function B(a){var b=e();return this.abs().divRemTo(a,null,b),this.s<0&&b.compareTo(d.ZERO)>0&&a.subTo(b,b),b}function C(a){this.m=a}function D(a){return a.s<0||a.compareTo(this.m)>=0?a.mod(this.m):a}function E(a){return a}function F(a){a.divRemTo(this.m,null,a)}function G(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function H(a,b){a.squareTo(b),this.reduce(b)}function I(){if(this.t<1)return 0;var a=this[0];if(0==(1&a))return 0;var b=3&a;return b=b*(2-(15&a)*b)&15,b=b*(2-(255&a)*b)&255,b=b*(2-((65535&a)*b&65535))&65535,b=b*(2-a*b%this.DV)%this.DV,b>0?this.DV-b:-b}function J(a){this.m=a,this.mp=a.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<0&&this.m.subTo(b,b),b}function L(a){var b=e();return a.copyTo(b),this.reduce(b),b}function M(a){for(;a.t<=this.mt2;)a[a.t++]=0;for(var b=0;b>15)*this.mpl&this.um)<<15)&a.DM;for(c=b+this.m.t,a[c]+=this.m.am(0,d,a,b,0,this.m.t);a[c]>=a.DV;)a[c]-=a.DV,a[++c]++}a.clamp(),a.drShiftTo(this.m.t,a),a.compareTo(this.m)>=0&&a.subTo(this.m,a)}function N(a,b){a.squareTo(b),this.reduce(b)}function O(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function P(){return 0==(this.t>0?1&this[0]:this.s)}function Q(a,b){if(a>4294967295||1>a)return d.ONE;var c=e(),f=e(),g=b.convert(this),h=r(a)-1;for(g.copyTo(c);--h>=0;)if(b.sqrTo(c,f),(a&1<0)b.mulTo(f,g,c);else{var i=c;c=f,f=i}return b.revert(c)}function R(a,b){var c;return c=256>a||b.isEven()?new C(b):new J(b),this.exp(a,c)}function S(){var a=e();return this.copyTo(a),a}function T(){if(this.s<0){if(1==this.t)return this[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)return this[0];if(0==this.t)return 0}return(this[1]&(1<<32-this.DB)-1)<>24}function V(){return 0==this.t?this.s:this[0]<<16>>16}function W(a){return Math.floor(Math.LN2*this.DB/Math.log(a))}function X(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1}function Y(a){if(null==a&&(a=10),0==this.signum()||2>a||a>36)return"0";var b=this.chunkSize(a),c=Math.pow(a,b),d=k(c),f=e(),g=e(),h="";for(this.divRemTo(d,f,g);f.signum()>0;)h=(c+g.intValue()).toString(a).substr(1)+h,f.divRemTo(d,f,g);return g.intValue().toString(a)+h}function Z(a,b){this.fromInt(0),null==b&&(b=10);for(var c=this.chunkSize(b),e=Math.pow(b,c),f=!1,g=0,i=0,j=0;jk?"-"==a.charAt(j)&&0==this.signum()&&(f=!0):(i=b*i+k,++g>=c&&(this.dMultiply(e),this.dAddOffset(i,0),g=0,i=0))}g>0&&(this.dMultiply(Math.pow(b,g)),this.dAddOffset(i,0)),f&&d.ZERO.subTo(this,this)}function $(a,b,c){if("number"==typeof b)if(2>a)this.fromInt(1);else for(this.fromNumber(a,c),this.testBit(a-1)||this.bitwiseTo(d.ONE.shiftLeft(a-1),ga,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(b);)this.dAddOffset(2,0),this.bitLength()>a&&this.subTo(d.ONE.shiftLeft(a-1),this);else{var e=new Array,f=7&a;e.length=(a>>3)+1,b.nextBytes(e),f>0?e[0]&=(1<0)for(d>d)!=(this.s&this.DM)>>d&&(b[e++]=c|this.s<=0;)8>d?(c=(this[a]&(1<>(d+=this.DB-8)):(c=this[a]>>(d-=8)&255,0>=d&&(d+=this.DB,--a)),(e>0||c!=this.s)&&(b[e++]=c);return b}function aa(a){return 0==this.compareTo(a)}function ba(a){return this.compareTo(a)<0?this:a}function ca(a){return this.compareTo(a)>0?this:a}function da(a,b,c){var d,e,f=Math.min(a.t,this.t);for(d=0;f>d;++d)c[d]=b(this[d],a[d]);if(a.ta?this.rShiftTo(-a,b):this.lShiftTo(a,b),b}function oa(a){var b=e();return 0>a?this.lShiftTo(-a,b):this.rShiftTo(a,b),b}function pa(a){if(0==a)return-1;var b=0;return 0==(65535&a)&&(a>>=16,b+=16),0==(255&a)&&(a>>=8,b+=8),0==(15&a)&&(a>>=4,b+=4),0==(3&a)&&(a>>=2,b+=2),0==(1&a)&&++b,b}function qa(){for(var a=0;a=this.t?0!=this.s:0!=(this[b]&1<c;)d+=this[c]+a[c],b[c++]=d&this.DM,d>>=this.DB;if(a.t>=this.DB;d+=this.s}else{for(d+=this.s;c>=this.DB;d+=a.s}b.s=0>d?-1:0,d>0?b[c++]=d:-1>d&&(b[c++]=this.DV+d),b.t=c,b.clamp()}function za(a){var b=e();return this.addTo(a,b),b}function Aa(a){var b=e();return this.subTo(a,b),b}function Ba(a){var b=e();return this.multiplyTo(a,b),b}function Ca(){var a=e();return this.squareTo(a),a}function Da(a){var b=e();return this.divRemTo(a,b,null),b}function Ea(a){var b=e();return this.divRemTo(a,null,b),b}function Fa(a){var b=e(),c=e();return this.divRemTo(a,b,c),new Array(b,c)}function Ga(a){this[this.t]=this.am(0,a-1,this,0,0,this.t),++this.t,this.clamp()}function Ha(a,b){if(0!=a){for(;this.t<=b;)this[this.t++]=0;for(this[b]+=a;this[b]>=this.DV;)this[b]-=this.DV,++b>=this.t&&(this[this.t++]=0),++this[b]}}function Ia(){}function Ja(a){return a}function Ka(a,b,c){a.multiplyTo(b,c)}function La(a,b){a.squareTo(b)}function Ma(a){return this.exp(a,new Ia)}function Na(a,b,c){var d=Math.min(this.t+a.t,b);for(c.s=0,c.t=d;d>0;)c[--d]=0;var e;for(e=c.t-this.t;e>d;++d)c[d+this.t]=this.am(0,a[d],c,d,0,this.t);for(e=Math.min(a.t,b);e>d;++d)this.am(0,a[d],c,d,0,b-d);c.clamp()}function Oa(a,b,c){--b;var d=c.t=this.t+a.t-b;for(c.s=0;--d>=0;)c[d]=0;for(d=Math.max(b-this.t,0);d2*this.m.t)return a.mod(this.m);if(a.compareTo(this.m)<0)return a;var b=e();return a.copyTo(b),this.reduce(b),b}function Ra(a){return a}function Sa(a){for(a.drShiftTo(this.m.t-1,this.r2),a.t>this.m.t+1&&(a.t=this.m.t+1,a.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);a.compareTo(this.r2)<0;)a.dAddOffset(1,this.m.t+1);for(a.subTo(this.r2,a);a.compareTo(this.m)>=0;)a.subTo(this.m,a)}function Ta(a,b){a.squareTo(b),this.reduce(b)}function Ua(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function Va(a,b){var c,d,f=a.bitLength(),g=k(1);if(0>=f)return g;c=18>f?1:48>f?3:144>f?4:768>f?5:6,d=8>f?new C(b):b.isEven()?new Pa(b):new J(b);var h=new Array,i=3,j=c-1,l=(1<1){var m=e();for(d.sqrTo(h[1],m);l>=i;)h[i]=e(),d.mulTo(m,h[i-2],h[i]),i+=2}var n,o,p=a.t-1,q=!0,s=e();for(f=r(a[p])-1;p>=0;){for(f>=j?n=a[p]>>f-j&l:(n=(a[p]&(1<0&&(n|=a[p-1]>>this.DB+f-j)),i=c;0==(1&n);)n>>=1,--i;if((f-=i)<0&&(f+=this.DB,--p),q)h[n].copyTo(g),q=!1;else{for(;i>1;)d.sqrTo(g,s),d.sqrTo(s,g),i-=2;i>0?d.sqrTo(g,s):(o=g,g=s,s=o),d.mulTo(s,h[n],g)}for(;p>=0&&0==(a[p]&1<f)return b;for(f>e&&(f=e),f>0&&(b.rShiftTo(f,b),c.rShiftTo(f,c));b.signum()>0;)(e=b.getLowestSetBit())>0&&b.rShiftTo(e,b),(e=c.getLowestSetBit())>0&&c.rShiftTo(e,c),b.compareTo(c)>=0?(b.subTo(c,b),b.rShiftTo(1,b)):(c.subTo(b,c),c.rShiftTo(1,c));return f>0&&c.lShiftTo(f,c),c}function Xa(a){if(0>=a)return 0;var b=this.DV%a,c=this.s<0?a-1:0;if(this.t>0)if(0==b)c=this[0]%a;else for(var d=this.t-1;d>=0;--d)c=(b*c+this[d])%a;return c}function Ya(a){var b=a.isEven();if(this.isEven()&&b||0==a.signum())return d.ZERO;for(var c=a.clone(),e=this.clone(),f=k(1),g=k(0),h=k(0),i=k(1);0!=c.signum();){for(;c.isEven();)c.rShiftTo(1,c),b?(f.isEven()&&g.isEven()||(f.addTo(this,f),g.subTo(a,g)),f.rShiftTo(1,f)):g.isEven()||g.subTo(a,g),g.rShiftTo(1,g);for(;e.isEven();)e.rShiftTo(1,e),b?(h.isEven()&&i.isEven()||(h.addTo(this,h),i.subTo(a,i)),h.rShiftTo(1,h)):i.isEven()||i.subTo(a,i),i.rShiftTo(1,i);c.compareTo(e)>=0?(c.subTo(e,c),b&&f.subTo(h,f),g.subTo(i,g)):(e.subTo(c,e),b&&h.subTo(f,h),i.subTo(g,i))}return 0!=e.compareTo(d.ONE)?d.ZERO:i.compareTo(a)>=0?i.subtract(a):i.signum()<0?(i.addTo(a,i),i.signum()<0?i.add(a):i):i}function Za(a){var b,c=this.abs();if(1==c.t&&c[0]<=hb[hb.length-1]){for(b=0;bd;)d*=hb[e++];for(d=c.modInt(d);e>b;)if(d%hb[b++]==0)return!1}return c.millerRabin(a)}function r(a){var b,c=1;return 0!=(b=a>>>16)&&(a=b,c+=16),0!=(b=a>>8)&&(a=b,c+=8),0!=(b=a>>4)&&(a=b,c+=4),0!=(b=a>>2)&&(a=b,c+=2),0!=(b=a>>1)&&(a=b,c+=1),c}function $a(){var a=this.toByteArray(),b=8*(a.length-1)+r(a[0]),c="";return c+=String.fromCharCode((65280&b)>>8),c+=String.fromCharCode(255&b),c+=bb.bin2str(a)}function _a(a){var b=this.subtract(d.ONE),c=b.getLowestSetBit();if(0>=c)return!1;var f=b.shiftRight(c);a=a+1>>1,a>hb.length&&(a=hb.length);for(var g,h=e(),i=[],j=0;a>j;++j){for(;g=hb[Math.floor(Math.random()*hb.length)],-1!=i.indexOf(g););i.push(g),h.fromInt(g);var k=h.modPow(f,this);if(0!=k.compareTo(d.ONE)&&0!=k.compareTo(b)){for(var g=1;g++=eb;++eb)gb[db++]=eb;for(db="a".charCodeAt(0),eb=10;36>eb;++eb)gb[db++]=eb;for(db="A".charCodeAt(0),eb=10;36>eb;++eb)gb[db++]=eb;C.prototype.convert=D,C.prototype.revert=E,C.prototype.reduce=F,C.prototype.mulTo=G,C.prototype.sqrTo=H,J.prototype.convert=K,J.prototype.revert=L,J.prototype.reduce=M,J.prototype.mulTo=O,J.prototype.sqrTo=N,d.prototype.copyTo=i,d.prototype.fromInt=j,d.prototype.fromString=l,d.prototype.clamp=m,d.prototype.dlShiftTo=t,d.prototype.drShiftTo=u,d.prototype.lShiftTo=v,d.prototype.rShiftTo=w,d.prototype.subTo=x,d.prototype.multiplyTo=y,d.prototype.squareTo=z,d.prototype.divRemTo=A,d.prototype.invDigit=I,d.prototype.isEven=P,d.prototype.exp=Q,d.prototype.toString=n,d.prototype.negate=o,d.prototype.abs=p,d.prototype.compareTo=q,d.prototype.bitLength=s,d.prototype.mod=B,d.prototype.modPowInt=R,d.ZERO=k(0),d.ONE=k(1),d.TWO=k(2),b.exports=d,Ia.prototype.convert=Ja,Ia.prototype.revert=Ja,Ia.prototype.mulTo=Ka,Ia.prototype.sqrTo=La,Pa.prototype.convert=Qa,Pa.prototype.revert=Ra,Pa.prototype.reduce=Sa,Pa.prototype.mulTo=Ua,Pa.prototype.sqrTo=Ta;var hb=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997],ib=(1<<26)/hb[hb.length-1],d=a("./jsbn.js");d.prototype.chunkSize=W,d.prototype.toRadix=Y,d.prototype.fromRadix=Z,d.prototype.fromNumber=$,d.prototype.bitwiseTo=da,d.prototype.changeBit=ua,d.prototype.addTo=ya,d.prototype.dMultiply=Ga,d.prototype.dAddOffset=Ha,d.prototype.multiplyLowerTo=Na,d.prototype.multiplyUpperTo=Oa,d.prototype.modInt=Xa,d.prototype.millerRabin=_a,d.prototype.clone=S,d.prototype.intValue=T,d.prototype.byteValue=U,d.prototype.shortValue=V,d.prototype.signum=X,d.prototype.toByteArray=_,d.prototype.equals=aa,d.prototype.min=ba,d.prototype.max=ca,d.prototype.and=fa,d.prototype.or=ha,d.prototype.xor=ja,d.prototype.andNot=la,d.prototype.not=ma,d.prototype.shiftLeft=na,d.prototype.shiftRight=oa,d.prototype.getLowestSetBit=qa,d.prototype.bitCount=sa,d.prototype.testBit=ta,d.prototype.setBit=va,d.prototype.clearBit=wa,d.prototype.flipBit=xa,d.prototype.add=za,d.prototype.subtract=Aa,d.prototype.multiply=Ba,d.prototype.divide=Da,d.prototype.remainder=Ea,d.prototype.divideAndRemainder=Fa,d.prototype.modPow=Va,d.prototype.modInverse=Ya,d.prototype.pow=Ma,d.prototype.gcd=Wa,d.prototype.isProbablePrime=Za,d.prototype.toMPI=$a,d.prototype.square=Ca},{"../../util.js":76,"./jsbn.js":37}],38:[function(a,b,c){function d(){function a(a){for(var b=0;b>1;for(e.e=parseInt(b,16),e.ee=new h(b,16);;){for(;e.p=new h(a-g,1,f),0!==e.p.subtract(h.ONE).gcd(e.ee).compareTo(h.ONE)||!e.p.isProbablePrime(10););for(;e.q=new h(g,1,f),0!==e.q.subtract(h.ONE).gcd(e.ee).compareTo(h.ONE)||!e.q.isProbablePrime(10););if(e.p.compareTo(e.q)<=0){var i=e.p;e.p=e.q,e.q=i}var k=e.p.subtract(h.ONE),l=e.q.subtract(h.ONE),m=k.multiply(l);if(0===m.gcd(e.ee).compareTo(h.ONE)){e.n=e.p.multiply(e.q),e.d=e.ee.modInverse(m),e.dmp1=e.d.mod(k),e.dmq1=e.d.mod(l),e.u=e.p.modInverse(e.q);break}}c(e)})}this.encrypt=b,this.decrypt=a,this.verify=g,this.sign=c,this.generate=l,this.keyObject=j}var h=a("./jsbn.js"),i=a("../../util.js"),j=a("../random.js"),k=a("../../config"),l=h.ZERO,m=h.ZERO;b.exports=g},{"../../config":17,"../../util.js":76,"../random.js":39,"./jsbn.js":37}],39:[function(a,b,c){function d(){this.buffer=null,this.size=null}var e=a("../type/mpi.js"),f=null;"undefined"==typeof window&&(f=a("crypto")),b.exports={getRandomBytes:function(a){for(var b="",c=0;a>c;c++)b+=String.fromCharCode(this.getSecureRandomOctet());return b},getSecureRandom:function(a,b){for(var c=this.getSecureRandomUint(),d=(b-a).toString(2).length;(c&Math.pow(2,d)-1)>b-a;)c=this.getSecureRandomUint();return a+Math.abs(c&Math.pow(2,d)-1)},getSecureRandomOctet:function(){var a=new Uint8Array(1);return this.getRandomValues(a),a[0]},getSecureRandomUint:function(){var a=new Uint8Array(4),b=new DataView(a.buffer);return this.getRandomValues(a),b.getUint32(0)},getRandomValues:function(a){if(!(a instanceof Uint8Array))throw new Error("Invalid type: buf not an Uint8Array");if("undefined"!=typeof window&&window.crypto&&window.crypto.getRandomValues)window.crypto.getRandomValues(a);else if("undefined"!=typeof window&&"object"==typeof window.msCrypto&&"function"==typeof window.msCrypto.getRandomValues)window.msCrypto.getRandomValues(a);else if(f){var b=f.randomBytes(a.length);a.set(b)}else{if(!this.randomBuffer.buffer)throw new Error("No secure random number generator available.");this.randomBuffer.get(a)}},getRandomBigInteger:function(a){if(1>a)throw new Error("Illegal parameter value: bits < 1");var b=Math.floor((a+7)/8),c=this.getRandomBytes(b);a%8>0&&(c=String.fromCharCode(Math.pow(2,a%8)-1&c.charCodeAt(0))+c.substring(1));var d=new e;return d.fromBytes(c),d.toBigInteger()},getRandomBigIntegerInRange:function(a,b){if(b.compareTo(a)<=0)throw new Error("Illegal parameter value: max <= min");for(var c=b.subtract(a),d=this.getRandomBigInteger(c.bitLength());d.compareTo(c)>0;)d=this.getRandomBigInteger(c.bitLength());return a.add(d)},randomBuffer:new d},d.prototype.init=function(a){this.buffer=new Uint8Array(a),this.size=0},d.prototype.set=function(a){if(!this.buffer)throw new Error("RandomBuffer is not initialized");if(!(a instanceof Uint8Array))throw new Error("Invalid type: buf not an Uint8Array");var b=this.buffer.length-this.size;a.length>b&&(a=a.subarray(0,b)),this.buffer.set(a,this.size),this.size+=a.length},d.prototype.get=function(a){if(!this.buffer)throw new Error("RandomBuffer is not initialized");if(!(a instanceof Uint8Array))throw new Error("Invalid type: buf not an Uint8Array");if(this.size>16)+String.fromCharCode(b>>8&255)+String.fromCharCode(255&b);return n.encode(c)}function g(a,b){var c=f(a),d=b;return c[0]==d[0]&&c[1]==d[1]&&c[2]==d[2]&&c[3]==d[3]}function h(a){for(var b=11994318,c=0;a.length-c>16;)b=b<<8^q[255&(b>>16^a.charCodeAt(c))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+1))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+2))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+3))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+4))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+5))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+6))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+7))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+8))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+9))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+10))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+11))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+12))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+13))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+14))],b=b<<8^q[255&(b>>16^a.charCodeAt(c+15))],c+=16;for(var d=c;d>16^a.charCodeAt(c++))];return 16777215&b}function i(a){var b=/^[ \f\r\t\u00a0\u2000-\u200a\u202f\u205f\u3000]*\n/m,c="",d=a,e=b.exec(a);if(null===e)throw new Error("Mandatory blank line missing between armor headers and armor data");return c=a.slice(0,e.index),d=a.slice(e.index+e[0].length),c=c.split("\n"),c.pop(),{headers:c,body:d}}function j(a){for(var b=0;be;e++)d=a.charCodeAt(e),0===i?(g.push(f.charAt(d>>2&63)),c=(3&d)<<4):1==i?(g.push(f.charAt(c|d>>4&15)),c=(15&d)<<2):2==i&&(g.push(f.charAt(c|d>>6&3)),h+=1,h%60===0&&g.push("\n"),g.push(f.charAt(63&d))),h+=1,h%60===0&&g.push("\n"),i+=1,3==i&&(i=0);return i>0&&(g.push(f.charAt(c)),h+=1,h%60===0&&g.push("\n"),g.push("="),h+=1),1==i&&(h%60===0&&g.push("\n"),g.push("=")),b?void 0:g.join("")}function e(a){var b,c,d=[],e=0,g=0,h=a.length;for(c=0;h>c;c++)b=f.indexOf(a.charAt(c)),b>=0&&(e&&d.push(String.fromCharCode(g|b>>6-e&255)),e=e+2&7,g=b<>c,d.count++})}var e={prio:0,algo:q.encryption_cipher};for(var f in b)try{f!==o.symmetric.plaintext&&f!==o.symmetric.idea&&o.read(o.symmetric,f)&&b[f].count===a.length&&b[f].prio>e.prio&&(e=b[f])}catch(g){}return e.algo}var n=a("./packet"),o=a("./enums.js"),p=a("./encoding/armor.js"),q=a("./config"),r=a("./util");d.prototype.packetlist2structure=function(a){for(var b,c,d,e=0;ethis.primaryKey.created.getTime()+24*this.primaryKey.expirationTimeV3*3600*1e3)return o.keyStatus.expired;for(var a=!1,b=0;bthis.primaryKey.created.getTime()+1e3*c.selfCertificate.keyExpirationTime?o.keyStatus.expired:o.keyStatus.valid:o.keyStatus.invalid},d.prototype.getExpirationTime=function(){if(3==this.primaryKey.version)return g(this.primaryKey);if(4==this.primaryKey.version){var a=this.getPrimaryUser();return a?g(this.primaryKey,a.selfCertificate):null}},d.prototype.getPrimaryUser=function(){for(var a=[],b=0;bb.selfCertificate.isPrimaryUserID?-1:a.selfCertificate.isPrimaryUserIDb.selfCertificate.created?-1:a.selfCertificate.createdb?-1:b>a?1:0}),c=0;cthis.subKey.created.getTime()+24*this.subKey.expirationTimeV3*3600*1e3?o.keyStatus.expired:this.bindingSignature?this.bindingSignature.isExpired()?o.keyStatus.expired:this.bindingSignature.verified||this.bindingSignature.verify(a,{key:a,bind:this.subKey})?4==this.subKey.version&&this.bindingSignature.keyNeverExpires===!1&&Date.now()>this.subKey.created.getTime()+1e3*this.bindingSignature.keyExpirationTime?o.keyStatus.expired:o.keyStatus.valid:o.keyStatus.invalid:o.keyStatus.invalid},j.prototype.getExpirationTime=function(){return g(this.subKey,this.bindingSignature)},j.prototype.update=function(a,b){if(a.verify(b)!==o.keyStatus.invalid){if(this.subKey.getFingerprint()!==a.subKey.getFingerprint())throw new Error("SubKey update method: fingerprints of subkeys not equal");this.subKey.tag===o.packet.publicSubkey&&a.subKey.tag===o.packet.secretSubkey&&(this.subKey=a.subKey),!this.bindingSignature&&a.bindingSignature&&(a.bindingSignature.verified||a.bindingSignature.verify(b,{key:b,bind:this.subKey}))&&(this.bindingSignature=a.bindingSignature),this.revocationSignature||!a.revocationSignature||a.revocationSignature.isExpired()||!a.revocationSignature.verified&&!a.revocationSignature.verify(b,{key:b,bind:this.subKey})||(this.revocationSignature=a.revocationSignature)}},c.Key=d,c.readArmored=k,c.generate=l,c.getPreferredSymAlgo=m},{"./config":17,"./encoding/armor.js":41,"./enums.js":43,"./packet":55,"./util":76}],48:[function(a,b,c){b.exports=a("./keyring.js"),b.exports.localstore=a("./localstore.js")},{"./keyring.js":49,"./localstore.js":50}],49:[function(a,b,c){function d(b){this.storeHandler=b||new(a("./localstore.js")),this.publicKeys=new e(this.storeHandler.loadPublic()),this.privateKeys=new e(this.storeHandler.loadPrivate())}function e(a){this.keys=a}function f(a,b){a=a.toLowerCase();for(var c=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=new RegExp("<"+c+">"),e=b.getUserIds(),f=0;f=0;e--){var m=new i.Signature;if(m.signatureType=h,m.hashAlgorithm=l.prefer_hash_algorithm,m.publicKeyAlgorithm=f.algorithm,!f.isDecrypted)throw new Error("Private key is not decrypted.");m.sign(f,c),b.push(m)}return new d(b)},d.prototype.verify=function(a){var b=[],c=this.unwrapCompressed(),d=c.packets.filterByTag(j.packet.literal);if(1!==d.length)throw new Error("Can only verify message with one literal data packet.");for(var e=c.packets.filterByTag(j.packet.signature),f=0;fe?(c=a.charCodeAt(0),b=1):255>e?(c=(a.charCodeAt(0)-192<<8)+a.charCodeAt(1)+192,b=2):255==e&&(c=d.readNumber(a.substr(1,4)),b=5),{len:c,offset:b}},writeSimpleLength:function(a){var b="";return 192>a?b+=String.fromCharCode(a):a>191&&8384>a?(b+=String.fromCharCode((a-192>>8)+192),b+=String.fromCharCode(a-192&255)):(b+=String.fromCharCode(255),b+=d.writeNumber(a,4)),b},writeHeader:function(a,b){var c="";return c+=String.fromCharCode(192|a),c+=this.writeSimpleLength(b)},writeOldHeader:function(a,b){var c="";return 256>b?(c+=String.fromCharCode(128|a<<2),c+=String.fromCharCode(b)):65536>b?(c+=String.fromCharCode(128|a<<2|1),c+=d.writeNumber(b,2)):(c+=String.fromCharCode(128|a<<2|2),c+=d.writeNumber(b,4)),c},read:function(a,b,c){if(null===a||a.length<=b||a.substring(b).length<2||0===(128&a.charCodeAt(b)))throw new Error("Error during parsing. This message / key is probably not containing a valid OpenPGP format.");var e,f=b,g=-1,h=-1;h=0,0!==(64&a.charCodeAt(f))&&(h=1);var i;h?g=63&a.charCodeAt(f):(g=(63&a.charCodeAt(f))>>2,i=3&a.charCodeAt(f)),f++;var j=null,k=-1;if(h)if(a.charCodeAt(f)<192)e=a.charCodeAt(f++),d.print_debug("1 byte length:"+e);else if(a.charCodeAt(f)>=192&&a.charCodeAt(f)<224)e=(a.charCodeAt(f++)-192<<8)+a.charCodeAt(f++)+192,d.print_debug("2 byte length:"+e);else if(a.charCodeAt(f)>223&&a.charCodeAt(f)<255){e=1<<(31&a.charCodeAt(f++)),d.print_debug("4 byte length:"+e);var l=f+e;j=a.substring(f,f+e);for(var m;;){if(a.charCodeAt(l)<192){m=a.charCodeAt(l++),e+=m,j+=a.substring(l,l+m),l+=m;break}if(a.charCodeAt(l)>=192&&a.charCodeAt(l)<224){m=(a.charCodeAt(l++)-192<<8)+a.charCodeAt(l++)+192,e+=m,j+=a.substring(l,l+m),l+=m;break}if(!(a.charCodeAt(l)>223&&a.charCodeAt(l)<255)){l++,m=a.charCodeAt(l++)<<24|a.charCodeAt(l++)<<16|a.charCodeAt(l++)<<8|a.charCodeAt(l++),j+=a.substring(l,l+m),e+=m,l+=m;break}m=1<<(31&a.charCodeAt(l++)),e+=m,j+=a.substring(l,l+m),l+=m}k=l-f}else f++,e=a.charCodeAt(f++)<<24|a.charCodeAt(f++)<<16|a.charCodeAt(f++)<<8|a.charCodeAt(f++);else switch(i){case 0:e=a.charCodeAt(f++);break;case 1:e=a.charCodeAt(f++)<<8|a.charCodeAt(f++);break;case 2:e=a.charCodeAt(f++)<<24|a.charCodeAt(f++)<<16|a.charCodeAt(f++)<<8|a.charCodeAt(f++);break;default:e=c}return-1==k&&(k=e),null===j&&(j=a.substring(f,f+k)),{tag:g,packet:j,offset:f+k}}}},{"../enums.js":43,"../util.js":76}],60:[function(a,b,c){function d(){this.length=0}b.exports=d;var e=a("./packet.js"),f=a("./all_packets.js"),g=a("../enums.js");d.prototype.read=function(a){for(var b=0;be;e++)c.push(this[e]);return c},d.prototype.concat=function(a){if(a)for(var b=0;bj&&gd.length)throw new Error("Error reading MPI @:"+g);return g+6}throw new Error("Version "+this.version+" of the key packet is unsupported.")},d.prototype.readPublicKey=d.prototype.read,d.prototype.write=function(){var a=String.fromCharCode(this.version);a+=e.writeDate(this.created),3==this.version&&(a+=e.writeNumber(this.expirationTimeV3,2)),a+=String.fromCharCode(h.write(h.publicKey,this.algorithm));for(var b=i.getPublicMpiCount(this.algorithm),c=0;b>c;c++)a+=this.mpi[c].write();return a},d.prototype.writePublicKey=d.prototype.write,d.prototype.writeOld=function(){var a=this.writePublicKey();return String.fromCharCode(153)+e.writeNumber(a.length,2)+a},d.prototype.getKeyId=function(){return this.keyid?this.keyid:(this.keyid=new g,4==this.version?this.keyid.read(e.hex2bin(this.getFingerprint()).substr(12,8)):3==this.version&&this.keyid.read(this.mpi[0].write().substr(-8)),this.keyid)},d.prototype.getFingerprint=function(){if(this.fingerprint)return this.fingerprint;var a="";if(4==this.version)a=this.writeOld(),this.fingerprint=i.hash.sha1(a);else if(3==this.version){for(var b=i.getPublicMpiCount(this.algorithm),c=0;b>c;c++)a+=this.mpi[c].toBytes();this.fingerprint=i.hash.md5(a)}return this.fingerprint=e.hexstrdump(this.fingerprint),this.fingerprint},d.prototype.getBitSize=function(){return 8*this.mpi[0].byteLength()},d.prototype.postCloneTypeFix=function(){for(var a=0;ad;d++){var e=new g;b+=e.read(a.substr(b)),this.encrypted.push(e)}},d.prototype.write=function(){var a=String.fromCharCode(this.version);a+=this.publicKeyId.write(),a+=String.fromCharCode(h.write(h.publicKey,this.publicKeyAlgorithm));for(var b=0;bo&&kc;){var d=g.readSimpleLength(a.substr(c));c+=d.offset,this.read_sub_packet(a.substr(c,d.len)),c+=d.len}return c}var c=0;switch(this.version=a.charCodeAt(c++),this.version){case 3:5!=a.charCodeAt(c++)&&f.print_debug("packet/signature.js\ninvalid One-octet length of following hashed material.MUST be 5. @:"+(c-1));var d=c;this.signatureType=a.charCodeAt(c++),this.created=f.readDate(a.substr(c,4)),c+=4,this.signatureData=a.substring(d,c),this.issuerKeyId.read(a.substring(c,c+8)),c+=8,this.publicKeyAlgorithm=a.charCodeAt(c++),this.hashAlgorithm=a.charCodeAt(c++);break;case 4:this.signatureType=a.charCodeAt(c++),this.publicKeyAlgorithm=a.charCodeAt(c++),this.hashAlgorithm=a.charCodeAt(c++),c+=b.call(this,a.substr(c),!0),this.signatureData=a.substr(0,c);var e=c;c+=b.call(this,a.substr(c),!1),this.unhashedSubpackets=a.substr(e,c-e);break;default:throw new Error("Version "+this.version+" of the signature is unsupported.")}this.signedHashValue=a.substr(c,2),c+=2,this.signature=a.substr(c)},d.prototype.write=function(){var a="";switch(this.version){case 3:a+=String.fromCharCode(3),a+=String.fromCharCode(5),a+=this.signatureData,a+=this.issuerKeyId.write(),a+=String.fromCharCode(this.publicKeyAlgorithm),a+=String.fromCharCode(this.hashAlgorithm);break;case 4:a+=this.signatureData,a+=this.unhashedSubpackets?this.unhashedSubpackets:f.writeNumber(0,2)}return a+=this.signedHashValue+this.signature},d.prototype.sign=function(a,b){var c=h.write(h.signature,this.signatureType),d=h.write(h.publicKey,this.publicKeyAlgorithm),e=h.write(h.hash,this.hashAlgorithm),f=String.fromCharCode(4);f+=String.fromCharCode(c),f+=String.fromCharCode(d),f+=String.fromCharCode(e),this.issuerKeyId=a.getKeyId(),f+=this.write_all_sub_packets(),this.signatureData=f;var g=this.calculateTrailer(),j=this.toSign(c,b)+this.signatureData+g,k=i.hash.digest(e,j);this.signedHashValue=k.substr(0,2),this.signature=i.signature.sign(e,d,a.mpi,j)},d.prototype.write_all_sub_packets=function(){var a=h.signatureSubpacket,b="",c="";if(null!==this.created&&(b+=e(a.signature_creation_time,f.writeDate(this.created))),null!==this.signatureExpirationTime&&(b+=e(a.signature_expiration_time,f.writeNumber(this.signatureExpirationTime,4))),null!==this.exportable&&(b+=e(a.exportable_certification,String.fromCharCode(this.exportable?1:0))),null!==this.trustLevel&&(c=String.fromCharCode(this.trustLevel)+String.fromCharCode(this.trustAmount),b+=e(a.trust_signature,c)),null!==this.regularExpression&&(b+=e(a.regular_expression,this.regularExpression)),null!==this.revocable&&(b+=e(a.revocable,String.fromCharCode(this.revocable?1:0))),null!==this.keyExpirationTime&&(b+=e(a.key_expiration_time,f.writeNumber(this.keyExpirationTime,4))),null!==this.preferredSymmetricAlgorithms&&(c=f.bin2str(this.preferredSymmetricAlgorithms),b+=e(a.preferred_symmetric_algorithms,c)),null!==this.revocationKeyClass&&(c=String.fromCharCode(this.revocationKeyClass),c+=String.fromCharCode(this.revocationKeyAlgorithm),c+=this.revocationKeyFingerprint,b+=e(a.revocation_key,c)),this.issuerKeyId.isNull()||(b+=e(a.issuer,this.issuerKeyId.write())),null!==this.notation)for(var d in this.notation)if(this.notation.hasOwnProperty(d)){var g=this.notation[d];c=String.fromCharCode(128),c+=String.fromCharCode(0),c+=String.fromCharCode(0),c+=String.fromCharCode(0),c+=f.writeNumber(d.length,2),c+=f.writeNumber(g.length,2),c+=d+g,b+=e(a.notation_data,c)}return null!==this.preferredHashAlgorithms&&(c=f.bin2str(this.preferredHashAlgorithms),b+=e(a.preferred_hash_algorithms,c)),null!==this.preferredCompressionAlgorithms&&(c=f.bin2str(this.preferredCompressionAlgorithms),b+=e(a.preferred_compression_algorithms,c)),null!==this.keyServerPreferences&&(c=f.bin2str(this.keyServerPreferences),b+=e(a.key_server_preferences,c)),null!==this.preferredKeyServer&&(b+=e(a.preferred_key_server,this.preferredKeyServer)),null!==this.isPrimaryUserID&&(b+=e(a.primary_user_id,String.fromCharCode(this.isPrimaryUserID?1:0))),null!==this.policyURI&&(b+=e(a.policy_uri,this.policyURI)),null!==this.keyFlags&&(c=f.bin2str(this.keyFlags),b+=e(a.key_flags,c)),null!==this.signersUserId&&(b+=e(a.signers_user_id,this.signersUserId)),null!==this.reasonForRevocationFlag&&(c=String.fromCharCode(this.reasonForRevocationFlag),c+=this.reasonForRevocationString,b+=e(a.reason_for_revocation,c)),null!==this.features&&(c=f.bin2str(this.features),b+=e(a.features,c)),null!==this.signatureTargetPublicKeyAlgorithm&&(c=String.fromCharCode(this.signatureTargetPublicKeyAlgorithm),c+=String.fromCharCode(this.signatureTargetHashAlgorithm),c+=this.signatureTargetHash,b+=e(a.signature_target,c)),null!==this.embeddedSignature&&(b+=e(a.embedded_signature,this.embeddedSignature.write())),b=f.writeNumber(b.length,2)+b},d.prototype.read_sub_packet=function(a){function b(a,b){this[a]=[];for(var c=0;c0&&4>d?k=1:17==d&&(k=2);for(var l=[],m=0,n=0;k>n;n++)l[n]=new j,m+=l[n].read(this.signature.substr(m));return this.verified=i.signature.verify(d,e,l,a.mpi,f+this.signatureData+g),this.verified},d.prototype.isExpired=function(){return this.signatureNeverExpires?!1:Date.now()>this.created.getTime()+1e3*this.signatureExpirationTime},d.prototype.postCloneTypeFix=function(){this.issuerKeyId=k.fromClone(this.issuerKeyId)}},{"../crypto":32,"../enums.js":43,"../type/keyid.js":73,"../type/mpi.js":74,"../util.js":76,"./packet.js":59}],67:[function(a,b,c){function d(){this.tag=f.packet.symEncryptedIntegrityProtected,this.encrypted=null,this.modification=!1,this.packets=null}b.exports=d;var e=(a("../util.js"),a("../crypto")),f=a("../enums.js");d.prototype.read=function(a){var b=a.charCodeAt(0);if(1!=b)throw new Error("Invalid packet version.");this.encrypted=a.substr(1)},d.prototype.write=function(){return String.fromCharCode(1)+this.encrypted},d.prototype.encrypt=function(a,b){var c=this.packets.write(),d=e.getPrefixRandom(a),f=d+d.charAt(d.length-2)+d.charAt(d.length-1),g=c;g+=String.fromCharCode(211),g+=String.fromCharCode(20),g+=e.hash.sha1(f+g),this.encrypted=e.cfb.encrypt(d,a,g,b,!1),f.length+g.length!=this.encrypted.length&&(this.encrypted=this.encrypted.substring(0,f.length+g.length))},d.prototype.decrypt=function(a,b){var c=e.cfb.decrypt(a,b,this.encrypted,!1),d=c.slice(c.length-20,c.length).join("");if(c.splice(c.length-20),this.hash=e.hash.sha1(e.cfb.mdc(a,b,this.encrypted)+c.join("")),this.hash!=d)throw new Error("Modification detected.");c.splice(c.length-2),this.packets.read(c.join(""))}},{"../crypto":32,"../enums.js":43,"../util.js":76}],68:[function(a,b,c){function d(){this.tag=f.packet.symEncryptedSessionKey,this.version=4,this.sessionKeyEncryptionAlgorithm=null,this.sessionKeyAlgorithm="aes256",this.encrypted=null,this.s2k=new e}var e=a("../type/s2k.js"),f=a("../enums.js"),g=a("../crypto");b.exports=d,d.prototype.read=function(a){this.version=a.charCodeAt(0);var b=f.read(f.symmetric,a.charCodeAt(1)),c=this.s2k.read(a.substr(2)),d=c+2;d>4)+a},d.prototype.read=function(a){var b=0;switch(this.type=e.read(e.s2k,a.charCodeAt(b++)),this.algorithm=e.read(e.hash,a.charCodeAt(b++)),this.type){case"simple":break;case"salted":this.salt=a.substr(b,8),b+=8;break;case"iterated":this.salt=a.substr(b,8),b+=8,this.c=a.charCodeAt(b++);break;case"gnu":if("GNU"!=a.substr(b,3))throw new Error("Unknown s2k type.");b+=3;var c=1e3+a.charCodeAt(b++);if(1001!=c)throw new Error("Unknown s2k gnu protection mode.");this.type=c;break;default:throw new Error("Unknown s2k type.")}return b},d.prototype.write=function(){var a=String.fromCharCode(e.write(e.s2k,this.type));switch(a+=String.fromCharCode(e.write(e.hash,this.algorithm)),this.type){case"simple":break;case"salted":a+=this.salt;break;case"iterated":a+=this.salt,a+=String.fromCharCode(this.c);break;case"gnu":throw new Error("GNU s2k type not supported.");default:throw new Error("Unknown s2k type.")}return a},d.prototype.produce_key=function(a,b){function c(b,c){var d=e.write(e.hash,c.algorithm);switch(c.type){case"simple":return g.hash.digest(d,b+a);case"salted":return g.hash.digest(d,b+c.salt+a);case"iterated":for(var f=[],h=c.get_count(),i=c.salt+a;f.length*i.lengthh&&(f=f.substr(0,h)),g.hash.digest(d,b+f);case"gnu":throw new Error("GNU s2k type not supported.");default:throw new Error("Unknown s2k type.")}}a=f.encode_utf8(a);for(var d="",h="";d.length<=b;)d+=c(h,this),h+=String.fromCharCode(0);return d.substr(0,b)},b.exports.fromClone=function(a){var b=new d;return this.algorithm=a.algorithm,this.type=a.type,this.c=a.c,this.salt=a.salt,b}},{"../crypto":32,"../enums.js":43,"../util.js":76}],76:[function(a,b,c){"use strict";var d=a("./config");b.exports={readNumber:function(a){for(var b=0,c=0;cd;d++)c+=String.fromCharCode(a>>8*(b-d-1)&255);return c},readDate:function(a){var b=this.readNumber(a),c=new Date;return c.setTime(1e3*b),c},writeDate:function(a){var b=Math.round(a.getTime()/1e3);return this.writeNumber(b,4)},emailRegEx:/^[+a-zA-Z0-9_.-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]{2,6}$/,hexdump:function(a){for(var b,c=[],d=a.length,e=0,f=0;d>e;){for(b=a.charCodeAt(e++).toString(16);b.length<2;)b="0"+b;c.push(" "+b),f++,f%32===0&&c.push("\n ")}return c.join("")},hexstrdump:function(a){if(null===a)return"";for(var b,c=[],d=a.length,e=0;d>e;){for(b=a.charCodeAt(e++).toString(16);b.length<2;)b="0"+b;c.push(""+b)}return c.join("")},hex2bin:function(a){for(var b="",c=0;ce;){for(b=a[e++].toString(16);b.length<2;)b="0"+b;c.push(""+b)}return c.join("")},encode_utf8:function(a){return unescape(encodeURIComponent(a))},decode_utf8:function(a){if("string"!=typeof a)throw new Error('Parameter "utf8" is not of type string');try{return decodeURIComponent(escape(a))}catch(b){return a}},bin2str:function(a){for(var b=[],c=0;c=0;d--)c[d]>>=b%8,d>0&&(c[d]|=c[d-1]<<8-b%8&255);return util.bin2str(c)},get_hashAlgorithmString:function(a){switch(a){case 1:return"MD5";case 2:return"SHA1";case 3:return"RIPEMD160";case 8:return"SHA256";case 9:return"SHA384";case 10:return"SHA512";case 11:return"SHA224"}return"unknown"},getWebCrypto:function(){if(d.useWebCrypto!==!1&&"undefined"!=typeof window){if(window.crypto)return window.crypto.subtle||window.crypto.webkitSubtle;if(window.msCrypto)return window.msCrypto.subtle}}}},{"./config":17}],77:[function(a,b,c){"use strict";function d(a,b){b&&b.worker?this.worker=b.worker:this.worker=new Worker(a||"openpgp.worker.js"),this.worker.onmessage=this.onMessage.bind(this),this.worker.onerror=function(a){throw new Error("Unhandled error in openpgp worker: "+a.message+" ("+a.filename+":"+a.lineno+")")},this.seedRandom(i),this.tasks=[],b&&b.config&&this.worker.postMessage({event:"configure",config:b.config})}var e=a("../crypto"),f=a("../packet"),g=a("../key.js"),h=a("../type/keyid.js"),i=5e4,j=2e4;d.prototype.execute=function(a){var b=this,c=new Promise(function(c,d){a(),b.tasks.push({resolve:c,reject:d})});return c},d.prototype.onMessage=function(a){var b=a.data;switch(b.event){case"method-return":b.err?this.tasks.shift().reject(new Error(b.err)):this.tasks.shift().resolve(b.data);break;case"request-seed":this.seedRandom(j);break;default:throw new Error("Unknown Worker Event.")}},d.prototype.seedRandom=function(a){var b=this.getRandomBuffer(a);this.worker.postMessage({event:"seed-random",buf:b})},d.prototype.getRandomBuffer=function(a){if(!a)return null;var b=new Uint8Array(a);return e.random.getRandomValues(b),b},d.prototype.terminate=function(){this.worker.terminate()},d.prototype.encryptMessage=function(a,b,c,d){var e=this;return e.execute(function(){a.length||(a=[a]),a=a.map(function(a){return a.toPacketlist()}),e.worker.postMessage({event:"encrypt-message",keys:a,text:b,format:c,filename:d})})},d.prototype.signAndEncryptMessage=function(a,b,c,d,e){var f=this;return f.execute(function(){a.length||(a=[a]),a=a.map(function(a){return a.toPacketlist()}),b=b.toPacketlist(),f.worker.postMessage({event:"sign-and-encrypt-message",publicKeys:a,privateKey:b,text:c,format:d,filename:e})})},d.prototype.decryptMessage=function(a,b,c){var d=this;return d.execute(function(){a=a.toPacketlist(),d.worker.postMessage({event:"decrypt-message",privateKey:a,message:b,format:c})})},d.prototype.decryptAndVerifyMessage=function(a,b,c,d){var e=this,f=new Promise(function(f,g){a=a.toPacketlist(),b.length||(b=[b]),b=b.map(function(a){return a.toPacketlist()}),e.worker.postMessage({event:"decrypt-and-verify-message",privateKey:a,publicKeys:b,message:c,format:d}),e.tasks.push({resolve:function(a){a.signatures=a.signatures.map(function(a){return a.keyid=h.fromClone(a.keyid),a}),f(a)},reject:g})});return f},d.prototype.signClearMessage=function(a,b){var c=this;return c.execute(function(){a.length||(a=[a]),a=a.map(function(a){return a.toPacketlist()}),c.worker.postMessage({event:"sign-clear-message",privateKeys:a,text:b})})},d.prototype.verifyClearSignedMessage=function(a,b){var c=this,d=new Promise(function(d,e){a.length||(a=[a]),a=a.map(function(a){return a.toPacketlist()}),c.worker.postMessage({event:"verify-clear-signed-message",publicKeys:a,message:b}),c.tasks.push({resolve:function(a){a.signatures=a.signatures.map(function(a){return a.keyid=h.fromClone(a.keyid),a}),d(a)},reject:e})});return d},d.prototype.generateKeyPair=function(a){var b=this,c=new Promise(function(c,d){b.worker.postMessage({event:"generate-key-pair",options:a}),b.tasks.push({resolve:function(a){var b=f.List.fromStructuredClone(a.key);a.key=new g.Key(b),c(a)},reject:d})});return c},d.prototype.decryptKey=function(a,b){var c=this,d=new Promise(function(d,e){a=a.toPacketlist(),c.worker.postMessage({event:"decrypt-key",privateKey:a,password:b}),c.tasks.push({resolve:function(a){var b=f.List.fromStructuredClone(a),a=new g.Key(b);d(a)},reject:e})});return d},d.prototype.decryptKeyPacket=function(a,b,c){var d=this,e=new Promise(function(e,h){a=a.toPacketlist(),d.worker.postMessage({event:"decrypt-key-packet",privateKey:a,keyIds:b,password:c}),d.tasks.push({resolve:function(a){var b=f.List.fromStructuredClone(a),a=new g.Key(b);e(a)},reject:h})});return e},b.exports=d},{"../crypto":32,"../key.js":47,"../packet":55,"../type/keyid.js":73}]},{},[46])(46)}); \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/debian/missing-sources/openpgp-1.6.2.src.js roundcube-1.3.6+dfsg.1/debian/missing-sources/openpgp-1.6.2.src.js --- roundcube-1.3.3+dfsg.1/debian/missing-sources/openpgp-1.6.2.src.js 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/missing-sources/openpgp-1.6.2.src.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,16949 +0,0 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.openpgp = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - setTimeout(drainQueue, 0); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - -},{}],12:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * @requires config - * @requires encoding/armor - * @requires enums - * @requires packet - * @module cleartext - */ - -'use strict'; - -var config = require('./config'), - packet = require('./packet'), - enums = require('./enums.js'), - armor = require('./encoding/armor.js'); - -/** - * @class - * @classdesc Class that represents an OpenPGP cleartext signed message. - * See {@link http://tools.ietf.org/html/rfc4880#section-7} - * @param {String} text The cleartext of the signed message - * @param {module:packet/packetlist} packetlist The packetlist with signature packets or undefined - * if message not yet signed - */ - -function CleartextMessage(text, packetlist) { - if (!(this instanceof CleartextMessage)) { - return new CleartextMessage(text, packetlist); - } - // normalize EOL to canonical form - this.text = text.replace(/\r/g, '').replace(/[\t ]+\n/g, "\n").replace(/\n/g,"\r\n"); - this.packets = packetlist || new packet.List(); -} - -/** - * Returns the key IDs of the keys that signed the cleartext message - * @return {Array} array of keyid objects - */ -CleartextMessage.prototype.getSigningKeyIds = function() { - var keyIds = []; - var signatureList = this.packets.filterByTag(enums.packet.signature); - signatureList.forEach(function(packet) { - keyIds.push(packet.issuerKeyId); - }); - return keyIds; -}; - -/** - * Sign the cleartext message - * @param {Array} privateKeys private keys with decrypted secret key data for signing - */ -CleartextMessage.prototype.sign = function(privateKeys) { - var packetlist = new packet.List(); - var literalDataPacket = new packet.Literal(); - literalDataPacket.setText(this.text); - for (var i = 0; i < privateKeys.length; i++) { - if (privateKeys[i].isPublic()) { - throw new Error('Need private key for signing'); - } - var signaturePacket = new packet.Signature(); - signaturePacket.signatureType = enums.signature.text; - signaturePacket.hashAlgorithm = config.prefer_hash_algorithm; - var signingKeyPacket = privateKeys[i].getSigningKeyPacket(); - signaturePacket.publicKeyAlgorithm = signingKeyPacket.algorithm; - if (!signingKeyPacket.isDecrypted) throw new Error('Private key is not decrypted.'); - signaturePacket.sign(signingKeyPacket, literalDataPacket); - packetlist.push(signaturePacket); - } - this.packets = packetlist; -}; - -/** - * Verify signatures of cleartext signed message - * @param {Array} keys array of keys to verify signatures - * @return {Array<{keyid: module:type/keyid, valid: Boolean}>} list of signer's keyid and validity of signature - */ -CleartextMessage.prototype.verify = function(keys) { - var result = []; - var signatureList = this.packets.filterByTag(enums.packet.signature); - var literalDataPacket = new packet.Literal(); - // we assume that cleartext signature is generated based on UTF8 cleartext - literalDataPacket.setText(this.text); - for (var i = 0; i < signatureList.length; i++) { - var keyPacket = null; - for (var j = 0; j < keys.length; j++) { - keyPacket = keys[j].getSigningKeyPacket(signatureList[i].issuerKeyId); - if (keyPacket) { - break; - } - } - - var verifiedSig = {}; - if (keyPacket) { - verifiedSig.keyid = signatureList[i].issuerKeyId; - verifiedSig.valid = signatureList[i].verify(keyPacket, literalDataPacket); - } else { - verifiedSig.keyid = signatureList[i].issuerKeyId; - verifiedSig.valid = null; - } - result.push(verifiedSig); - } - return result; -}; - -/** - * Get cleartext - * @return {String} cleartext of message - */ -CleartextMessage.prototype.getText = function() { - // normalize end of line to \n - return this.text.replace(/\r\n/g,"\n"); -}; - -/** - * Returns ASCII armored text of cleartext signed message - * @return {String} ASCII armor - */ -CleartextMessage.prototype.armor = function() { - var body = { - hash: enums.read(enums.hash, config.prefer_hash_algorithm).toUpperCase(), - text: this.text, - data: this.packets.write() - }; - return armor.encode(enums.armor.signed, body); -}; - - -/** - * reads an OpenPGP cleartext signed message and returns a CleartextMessage object - * @param {String} armoredText text to be parsed - * @return {module:cleartext~CleartextMessage} new cleartext message object - * @static - */ -function readArmored(armoredText) { - var input = armor.decode(armoredText); - if (input.type !== enums.armor.signed) { - throw new Error('No cleartext signed message.'); - } - var packetlist = new packet.List(); - packetlist.read(input.data); - verifyHeaders(input.headers, packetlist); - var newMessage = new CleartextMessage(input.text, packetlist); - return newMessage; -} - -/** - * Compare hash algorithm specified in the armor header with signatures - * @private - * @param {Array} headers Armor headers - * @param {module:packet/packetlist} packetlist The packetlist with signature packets - */ -function verifyHeaders(headers, packetlist) { - var checkHashAlgos = function(hashAlgos) { - for (var i = 0; i < packetlist.length; i++) { - if (packetlist[i].tag === enums.packet.signature && - !hashAlgos.some(function(algo) { - return packetlist[i].hashAlgorithm === algo; - })) { - return false; - } - } - return true; - }; - var oneHeader = null; - var hashAlgos = []; - for (var i = 0; i < headers.length; i++) { - oneHeader = headers[i].match(/Hash: (.+)/); // get header value - if (oneHeader) { - oneHeader = oneHeader[1].replace(/\s/g, ''); // remove whitespace - oneHeader = oneHeader.split(','); - oneHeader = oneHeader.map(function(hash) { - hash = hash.toLowerCase(); - try { - return enums.write(enums.hash, hash); - } catch (e) { - throw new Error('Unknown hash algorithm in armor header: ' + hash); - } - }); - hashAlgos = hashAlgos.concat(oneHeader); - } else { - throw new Error('Only "Hash" header allowed in cleartext signed message'); - } - } - if (!hashAlgos.length && !checkHashAlgos([enums.hash.md5])) { - throw new Error('If no "Hash" header in cleartext signed message, then only MD5 signatures allowed'); - } else if (!checkHashAlgos(hashAlgos)) { - throw new Error('Hash algorithm mismatch in armor header and signature'); - } -} - -exports.CleartextMessage = CleartextMessage; -exports.readArmored = readArmored; - -},{"./config":17,"./encoding/armor.js":41,"./enums.js":43,"./packet":55}],13:[function(require,module,exports){ -/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';var n=void 0,u=!0,aa=this;function ba(e,d){var c=e.split("."),f=aa;!(c[0]in f)&&f.execScript&&f.execScript("var "+c[0]);for(var a;c.length&&(a=c.shift());)!c.length&&d!==n?f[a]=d:f=f[a]?f[a]:f[a]={}};var C="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array&&"undefined"!==typeof DataView;function K(e,d){this.index="number"===typeof d?d:0;this.d=0;this.buffer=e instanceof(C?Uint8Array:Array)?e:new (C?Uint8Array:Array)(32768);if(2*this.buffer.length<=this.index)throw Error("invalid index");this.buffer.length<=this.index&&ca(this)}function ca(e){var d=e.buffer,c,f=d.length,a=new (C?Uint8Array:Array)(f<<1);if(C)a.set(d);else for(c=0;c>>8&255]<<16|L[e>>>16&255]<<8|L[e>>>24&255])>>32-d:L[e]>>8-d);if(8>d+b)k=k<>d-m-1&1,8===++b&&(b=0,f[a++]=L[k],k=0,a===f.length&&(f=ca(this)));f[a]=k;this.buffer=f;this.d=b;this.index=a};K.prototype.finish=function(){var e=this.buffer,d=this.index,c;0M;++M){for(var R=M,S=R,ha=7,R=R>>>1;R;R>>>=1)S<<=1,S|=R&1,--ha;ga[M]=(S<>>0}var L=ga;function ja(e){this.buffer=new (C?Uint16Array:Array)(2*e);this.length=0}ja.prototype.getParent=function(e){return 2*((e-2)/4|0)};ja.prototype.push=function(e,d){var c,f,a=this.buffer,b;c=this.length;a[this.length++]=d;for(a[this.length++]=e;0a[f])b=a[c],a[c]=a[f],a[f]=b,b=a[c+1],a[c+1]=a[f+1],a[f+1]=b,c=f;else break;return this.length}; -ja.prototype.pop=function(){var e,d,c=this.buffer,f,a,b;d=c[0];e=c[1];this.length-=2;c[0]=c[this.length];c[1]=c[this.length+1];for(b=0;;){a=2*b+2;if(a>=this.length)break;a+2c[a]&&(a+=2);if(c[a]>c[b])f=c[b],c[b]=c[a],c[a]=f,f=c[b+1],c[b+1]=c[a+1],c[a+1]=f;else break;b=a}return{index:e,value:d,length:this.length}};function ka(e,d){this.e=ma;this.f=0;this.input=C&&e instanceof Array?new Uint8Array(e):e;this.c=0;d&&(d.lazy&&(this.f=d.lazy),"number"===typeof d.compressionType&&(this.e=d.compressionType),d.outputBuffer&&(this.b=C&&d.outputBuffer instanceof Array?new Uint8Array(d.outputBuffer):d.outputBuffer),"number"===typeof d.outputIndex&&(this.c=d.outputIndex));this.b||(this.b=new (C?Uint8Array:Array)(32768))}var ma=2,T=[],U; -for(U=0;288>U;U++)switch(u){case 143>=U:T.push([U+48,8]);break;case 255>=U:T.push([U-144+400,9]);break;case 279>=U:T.push([U-256+0,7]);break;case 287>=U:T.push([U-280+192,8]);break;default:throw"invalid literal: "+U;} -ka.prototype.h=function(){var e,d,c,f,a=this.input;switch(this.e){case 0:c=0;for(f=a.length;c>>8&255;l[h++]=p&255;l[h++]=p>>>8&255;if(C)l.set(b,h),h+=b.length,l=l.subarray(0,h);else{v=0;for(x=b.length;vs)for(;0s?s:138,A>s-3&&A=A?(E[D++]=17,E[D++]=A-3,H[17]++):(E[D++]=18,E[D++]=A-11,H[18]++),s-=A;else if(E[D++]=F[r],H[F[r]]++,s--,3>s)for(;0s?s:6,A>s-3&&Ay;y++)ia[y]=ea[Ia[y]];for(P=19;4=a:return[265,a-11,1];case 14>=a:return[266,a-13,1];case 16>=a:return[267,a-15,1];case 18>=a:return[268,a-17,1];case 22>=a:return[269,a-19,2];case 26>=a:return[270,a-23,2];case 30>=a:return[271,a-27,2];case 34>=a:return[272, -a-31,2];case 42>=a:return[273,a-35,3];case 50>=a:return[274,a-43,3];case 58>=a:return[275,a-51,3];case 66>=a:return[276,a-59,3];case 82>=a:return[277,a-67,4];case 98>=a:return[278,a-83,4];case 114>=a:return[279,a-99,4];case 130>=a:return[280,a-115,4];case 162>=a:return[281,a-131,5];case 194>=a:return[282,a-163,5];case 226>=a:return[283,a-195,5];case 257>=a:return[284,a-227,5];case 258===a:return[285,a-258,0];default:throw"invalid length: "+a;}}var d=[],c,f;for(c=3;258>=c;c++)f=e(c),d[c]=f[2]<<24| -f[1]<<16|f[0];return d}(),Ga=C?new Uint32Array(Fa):Fa; -function na(e,d){function c(a,c){var b=a.g,d=[],f=0,e;e=Ga[a.length];d[f++]=e&65535;d[f++]=e>>16&255;d[f++]=e>>24;var g;switch(u){case 1===b:g=[0,b-1,0];break;case 2===b:g=[1,b-2,0];break;case 3===b:g=[2,b-3,0];break;case 4===b:g=[3,b-4,0];break;case 6>=b:g=[4,b-5,1];break;case 8>=b:g=[5,b-7,1];break;case 12>=b:g=[6,b-9,2];break;case 16>=b:g=[7,b-13,2];break;case 24>=b:g=[8,b-17,3];break;case 32>=b:g=[9,b-25,3];break;case 48>=b:g=[10,b-33,4];break;case 64>=b:g=[11,b-49,4];break;case 96>=b:g=[12,b- -65,5];break;case 128>=b:g=[13,b-97,5];break;case 192>=b:g=[14,b-129,6];break;case 256>=b:g=[15,b-193,6];break;case 384>=b:g=[16,b-257,7];break;case 512>=b:g=[17,b-385,7];break;case 768>=b:g=[18,b-513,8];break;case 1024>=b:g=[19,b-769,8];break;case 1536>=b:g=[20,b-1025,9];break;case 2048>=b:g=[21,b-1537,9];break;case 3072>=b:g=[22,b-2049,10];break;case 4096>=b:g=[23,b-3073,10];break;case 6144>=b:g=[24,b-4097,11];break;case 8192>=b:g=[25,b-6145,11];break;case 12288>=b:g=[26,b-8193,12];break;case 16384>= -b:g=[27,b-12289,12];break;case 24576>=b:g=[28,b-16385,13];break;case 32768>=b:g=[29,b-24577,13];break;default:throw"invalid distance";}e=g;d[f++]=e[0];d[f++]=e[1];d[f++]=e[2];var k,m;k=0;for(m=d.length;k=b;)t[b++]=0;for(b=0;29>=b;)w[b++]=0}t[256]=1;f=0;for(a=d.length;f=a){x&&c(x,-1);b=0;for(k=a-f;bk&&d+kb&&(a=f,b=k);if(258===k)break}return new qa(b,d-a)} -function oa(e,d){var c=e.length,f=new ja(572),a=new (C?Uint8Array:Array)(c),b,k,m,g,p;if(!C)for(g=0;g2*a[h-1]+b[h]&&(a[h]=2*a[h-1]+b[h]),m[h]=Array(a[h]),g[h]=Array(a[h]);for(l=0;le[l]?(m[h][q]=t,g[h][q]=d,w+=2):(m[h][q]=e[l],g[h][q]=l,++l);p[h]=0;1===b[h]&&f(h)}return k} -function pa(e){var d=new (C?Uint16Array:Array)(e.length),c=[],f=[],a=0,b,k,m,g;b=0;for(k=e.length;b>>=1}return d};ba("Zlib.RawDeflate",ka);ba("Zlib.RawDeflate.prototype.compress",ka.prototype.h);var Ka={NONE:0,FIXED:1,DYNAMIC:ma},V,La,$,Ma;if(Object.keys)V=Object.keys(Ka);else for(La in V=[],$=0,Ka)V[$++]=La;$=0;for(Ma=V.length;$a&&(a=b[n]),b[n]>=1;J=g<<16|n;for(s=m;s>>=1;switch(b){case 0:var e=this.input,a=this.d,c=this.b,d=this.a,f=e.length,g=void 0,h=void 0,k=c.length,m=void 0;this.c=this.f=0;if(a+1>=f)throw Error("invalid uncompressed block header: LEN");g=e[a++]|e[a++]<<8;if(a+1>=f)throw Error("invalid uncompressed block header: NLEN");h=e[a++]|e[a++]<<8;if(g===~h)throw Error("invalid uncompressed block header: length verify");if(a+g>e.length)throw Error("input buffer is broken");switch(this.i){case w:for(;d+ -g>c.length;){m=k-d;g-=m;if(q)c.set(e.subarray(a,a+m),d),d+=m,a+=m;else for(;m--;)c[d++]=e[a++];this.a=d;c=this.e();d=this.a}break;case v:for(;d+g>c.length;)c=this.e({o:2});break;default:throw Error("invalid inflate mode");}if(q)c.set(e.subarray(a,a+g),d),d+=g,a+=g;else for(;g--;)c[d++]=e[a++];this.d=a;this.a=d;this.b=c;break;case 1:this.j(y,z);break;case 2:A(this);break;default:throw Error("unknown BTYPE: "+b);}}return this.m()}; -var B=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],C=q?new Uint16Array(B):B,D=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],E=q?new Uint16Array(D):D,F=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],G=q?new Uint8Array(F):F,H=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],I=q?new Uint16Array(H):H,K=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13, -13],L=q?new Uint8Array(K):K,M=new (q?Uint8Array:Array)(288),N,O;N=0;for(O=M.length;N=N?8:255>=N?9:279>=N?7:8;var y=t(M),P=new (q?Uint8Array:Array)(30),Q,R;Q=0;for(R=P.length;Q=g)throw Error("input buffer is broken");a|=d[f++]<>>e;b.c=c-e;b.d=f;return h} -function S(b,e){for(var a=b.f,c=b.c,d=b.input,f=b.d,g=d.length,h=e[0],k=e[1],m,r;c=g);)a|=d[f++]<>>16;b.f=a>>r;b.c=c-r;b.d=f;return m&65535} -function A(b){function e(a,b,c){var e,d=this.p,f,g;for(g=0;gf)c>=d&&(this.a=c,a=this.e(),c=this.a),a[c++]=f;else{g=f-257;k=E[g];0=d&&(this.a=c,a=this.e(),c=this.a);for(;k--;)a[c]=a[c++-h]}for(;8<=this.c;)this.c-=8,this.d--;this.a=c}; -u.prototype.t=function(b,e){var a=this.b,c=this.a;this.n=b;for(var d=a.length,f,g,h,k;256!==(f=S(this,b));)if(256>f)c>=d&&(a=this.e(),d=a.length),a[c++]=f;else{g=f-257;k=E[g];0d&&(a=this.e(),d=a.length);for(;k--;)a[c]=a[c++-h]}for(;8<=this.c;)this.c-=8,this.d--;this.a=c}; -u.prototype.e=function(){var b=new (q?Uint8Array:Array)(this.a-32768),e=this.a-32768,a,c,d=this.b;if(q)b.set(d.subarray(32768,b.length));else{a=0;for(c=b.length;aa;++a)d[a]=d[e+a];this.a=32768;return d}; -u.prototype.v=function(b){var e,a=this.input.length/this.d+1|0,c,d,f,g=this.input,h=this.b;b&&("number"===typeof b.o&&(a=b.o),"number"===typeof b.r&&(a+=b.r));2>a?(c=(g.length-this.d)/this.n[2],f=258*(c/2)|0,d=fe&&(this.b.length=e),b=this.b);return this.buffer=b};p("Zlib.RawInflate",u);p("Zlib.RawInflate.prototype.decompress",u.prototype.u);var T={ADAPTIVE:v,BLOCK:w},U,V,W,X;if(Object.keys)U=Object.keys(T);else for(V in U=[],W=0,T)U[W++]=V;W=0;for(X=U.length;W>>8&255]<<16|N[d>>>16&255]<<8|N[d>>>24&255])>>32-a:N[d]>>8-a);if(8>a+f)g=g<>a-h-1&1,8===++f&&(f=0,e[b++]=N[g],g=0,b===e.length&&(e=this.f()));e[b]=g;this.buffer=e;this.i=f;this.index=b};H.prototype.finish=function(){var d=this.buffer,a=this.index,c;0O;++O){for(var P=O,Q=P,ga=7,P=P>>>1;P;P>>>=1)Q<<=1,Q|=P&1,--ga;fa[O]=(Q<>>0}var N=fa;function ha(d){this.buffer=new (F?Uint16Array:Array)(2*d);this.length=0}ha.prototype.getParent=function(d){return 2*((d-2)/4|0)};ha.prototype.push=function(d,a){var c,e,b=this.buffer,f;c=this.length;b[this.length++]=a;for(b[this.length++]=d;0b[e])f=b[c],b[c]=b[e],b[e]=f,f=b[c+1],b[c+1]=b[e+1],b[e+1]=f,c=e;else break;return this.length}; -ha.prototype.pop=function(){var d,a,c=this.buffer,e,b,f;a=c[0];d=c[1];this.length-=2;c[0]=c[this.length];c[1]=c[this.length+1];for(f=0;;){b=2*f+2;if(b>=this.length)break;b+2c[b]&&(b+=2);if(c[b]>c[f])e=c[f],c[f]=c[b],c[b]=e,e=c[f+1],c[f+1]=c[b+1],c[b+1]=e;else break;f=b}return{index:d,value:a,length:this.length}};function R(d){var a=d.length,c=0,e=Number.POSITIVE_INFINITY,b,f,g,h,k,n,q,r,p,m;for(r=0;rc&&(c=d[r]),d[r]>=1;m=g<<16|r;for(p=n;pS;S++)switch(x){case 143>=S:oa.push([S+48,8]);break;case 255>=S:oa.push([S-144+400,9]);break;case 279>=S:oa.push([S-256+0,7]);break;case 287>=S:oa.push([S-280+192,8]);break;default:l("invalid literal: "+S)} -ia.prototype.j=function(){var d,a,c,e,b=this.input;switch(this.h){case 0:c=0;for(e=b.length;c>>8&255;p[m++]=n&255;p[m++]=n>>>8&255;if(F)p.set(f,m),m+=f.length,p=p.subarray(0,m);else{q=0;for(r=f.length;qu)for(;0< -u--;)G[E++]=0,K[0]++;else for(;0u?u:138,B>u-3&&B=B?(G[E++]=17,G[E++]=B-3,K[17]++):(G[E++]=18,G[E++]=B-11,K[18]++),u-=B;else if(G[E++]=I[t],K[I[t]]++,u--,3>u)for(;0u?u:6,B>u-3&&Bz;z++)ra[z]=ka[gb[z]];for(W=19;4=b:return[265,b-11,1];case 14>=b:return[266,b-13,1];case 16>=b:return[267,b-15,1];case 18>=b:return[268,b-17,1];case 22>=b:return[269,b-19,2];case 26>=b:return[270,b-23,2];case 30>=b:return[271,b-27,2];case 34>=b:return[272, -b-31,2];case 42>=b:return[273,b-35,3];case 50>=b:return[274,b-43,3];case 58>=b:return[275,b-51,3];case 66>=b:return[276,b-59,3];case 82>=b:return[277,b-67,4];case 98>=b:return[278,b-83,4];case 114>=b:return[279,b-99,4];case 130>=b:return[280,b-115,4];case 162>=b:return[281,b-131,5];case 194>=b:return[282,b-163,5];case 226>=b:return[283,b-195,5];case 257>=b:return[284,b-227,5];case 258===b:return[285,b-258,0];default:l("invalid length: "+b)}}var a=[],c,e;for(c=3;258>=c;c++)e=d(c),a[c]=e[2]<<24|e[1]<< -16|e[0];return a}(),wa=F?new Uint32Array(va):va; -function pa(d,a){function c(b,c){var a=b.H,d=[],e=0,f;f=wa[b.length];d[e++]=f&65535;d[e++]=f>>16&255;d[e++]=f>>24;var g;switch(x){case 1===a:g=[0,a-1,0];break;case 2===a:g=[1,a-2,0];break;case 3===a:g=[2,a-3,0];break;case 4===a:g=[3,a-4,0];break;case 6>=a:g=[4,a-5,1];break;case 8>=a:g=[5,a-7,1];break;case 12>=a:g=[6,a-9,2];break;case 16>=a:g=[7,a-13,2];break;case 24>=a:g=[8,a-17,3];break;case 32>=a:g=[9,a-25,3];break;case 48>=a:g=[10,a-33,4];break;case 64>=a:g=[11,a-49,4];break;case 96>=a:g=[12,a- -65,5];break;case 128>=a:g=[13,a-97,5];break;case 192>=a:g=[14,a-129,6];break;case 256>=a:g=[15,a-193,6];break;case 384>=a:g=[16,a-257,7];break;case 512>=a:g=[17,a-385,7];break;case 768>=a:g=[18,a-513,8];break;case 1024>=a:g=[19,a-769,8];break;case 1536>=a:g=[20,a-1025,9];break;case 2048>=a:g=[21,a-1537,9];break;case 3072>=a:g=[22,a-2049,10];break;case 4096>=a:g=[23,a-3073,10];break;case 6144>=a:g=[24,a-4097,11];break;case 8192>=a:g=[25,a-6145,11];break;case 12288>=a:g=[26,a-8193,12];break;case 16384>= -a:g=[27,a-12289,12];break;case 24576>=a:g=[28,a-16385,13];break;case 32768>=a:g=[29,a-24577,13];break;default:l("invalid distance")}f=g;d[e++]=f[0];d[e++]=f[1];d[e++]=f[2];var h,k;h=0;for(k=d.length;h=f;)w[f++]=0;for(f=0;29>=f;)y[f++]=0}w[256]=1;e=0;for(b=a.length;e=b){r&&c(r,-1);f=0;for(g=b-e;fg&&a+gf&&(b=e,f=g);if(258===g)break}return new ta(f,a-b)} -function qa(d,a){var c=d.length,e=new ha(572),b=new (F?Uint8Array:Array)(c),f,g,h,k,n;if(!F)for(k=0;k2*b[m-1]+f[m]&&(b[m]=2*b[m-1]+f[m]),h[m]=Array(b[m]),k[m]=Array(b[m]);for(p=0;pd[p]?(h[m][s]=w,k[m][s]=a,y+=2):(h[m][s]=d[p],k[m][s]=p,++p);n[m]=0;1===f[m]&&e(m)}return g} -function sa(d){var a=new (F?Uint16Array:Array)(d.length),c=[],e=[],b=0,f,g,h,k;f=0;for(g=d.length;f>>=1}return a};function T(d,a){this.l=[];this.m=32768;this.e=this.g=this.c=this.q=0;this.input=F?new Uint8Array(d):d;this.s=!1;this.n=za;this.C=!1;if(a||!(a={}))a.index&&(this.c=a.index),a.bufferSize&&(this.m=a.bufferSize),a.bufferType&&(this.n=a.bufferType),a.resize&&(this.C=a.resize);switch(this.n){case Aa:this.b=32768;this.a=new (F?Uint8Array:Array)(32768+this.m+258);break;case za:this.b=0;this.a=new (F?Uint8Array:Array)(this.m);this.f=this.K;this.t=this.I;this.o=this.J;break;default:l(Error("invalid inflate mode"))}} -var Aa=0,za=1,Ba={F:Aa,D:za}; -T.prototype.p=function(){for(;!this.s;){var d=Y(this,3);d&1&&(this.s=x);d>>>=1;switch(d){case 0:var a=this.input,c=this.c,e=this.a,b=this.b,f=a.length,g=v,h=v,k=e.length,n=v;this.e=this.g=0;c+1>=f&&l(Error("invalid uncompressed block header: LEN"));g=a[c++]|a[c++]<<8;c+1>=f&&l(Error("invalid uncompressed block header: NLEN"));h=a[c++]|a[c++]<<8;g===~h&&l(Error("invalid uncompressed block header: length verify"));c+g>a.length&&l(Error("input buffer is broken"));switch(this.n){case Aa:for(;b+g>e.length;){n= -k-b;g-=n;if(F)e.set(a.subarray(c,c+n),b),b+=n,c+=n;else for(;n--;)e[b++]=a[c++];this.b=b;e=this.f();b=this.b}break;case za:for(;b+g>e.length;)e=this.f({v:2});break;default:l(Error("invalid inflate mode"))}if(F)e.set(a.subarray(c,c+g),b),b+=g,c+=g;else for(;g--;)e[b++]=a[c++];this.c=c;this.b=b;this.a=e;break;case 1:this.o(Ca,Da);break;case 2:Sa(this);break;default:l(Error("unknown BTYPE: "+d))}}return this.t()}; -var Ta=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],Ua=F?new Uint16Array(Ta):Ta,Va=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],Wa=F?new Uint16Array(Va):Va,Xa=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],Ya=F?new Uint8Array(Xa):Xa,Za=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],$a=F?new Uint16Array(Za):Za,ab=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10, -10,11,11,12,12,13,13],bb=F?new Uint8Array(ab):ab,cb=new (F?Uint8Array:Array)(288),Z,db;Z=0;for(db=cb.length;Z=Z?8:255>=Z?9:279>=Z?7:8;var Ca=R(cb),eb=new (F?Uint8Array:Array)(30),fb,hb;fb=0;for(hb=eb.length;fb=g&&l(Error("input buffer is broken")),c|=b[f++]<>>a;d.e=e-a;d.c=f;return h} -function ib(d,a){for(var c=d.g,e=d.e,b=d.input,f=d.c,g=b.length,h=a[0],k=a[1],n,q;e=g);)c|=b[f++]<>>16;d.g=c>>q;d.e=e-q;d.c=f;return n&65535} -function Sa(d){function a(a,b,c){var d,e=this.z,f,g;for(g=0;gf)e>=b&&(this.b=e,c=this.f(),e=this.b),c[e++]=f;else{g=f-257;k=Wa[g];0=b&&(this.b=e,c=this.f(),e=this.b);for(;k--;)c[e]=c[e++-h]}for(;8<=this.e;)this.e-=8,this.c--;this.b=e}; -T.prototype.J=function(d,a){var c=this.a,e=this.b;this.u=d;for(var b=c.length,f,g,h,k;256!==(f=ib(this,d));)if(256>f)e>=b&&(c=this.f(),b=c.length),c[e++]=f;else{g=f-257;k=Wa[g];0b&&(c=this.f(),b=c.length);for(;k--;)c[e]=c[e++-h]}for(;8<=this.e;)this.e-=8,this.c--;this.b=e}; -T.prototype.f=function(){var d=new (F?Uint8Array:Array)(this.b-32768),a=this.b-32768,c,e,b=this.a;if(F)d.set(b.subarray(32768,d.length));else{c=0;for(e=d.length;cc;++c)b[c]=b[a+c];this.b=32768;return b}; -T.prototype.K=function(d){var a,c=this.input.length/this.c+1|0,e,b,f,g=this.input,h=this.a;d&&("number"===typeof d.v&&(c=d.v),"number"===typeof d.G&&(c+=d.G));2>c?(e=(g.length-this.c)/this.u[2],f=258*(e/2)|0,b=fa&&(this.a.length=a),d=this.a);return this.buffer=d};function jb(d){if("string"===typeof d){var a=d.split(""),c,e;c=0;for(e=a.length;c>>0;d=a}for(var b=1,f=0,g=d.length,h,k=0;0>>0};function kb(d,a){var c,e;this.input=d;this.c=0;if(a||!(a={}))a.index&&(this.c=a.index),a.verify&&(this.N=a.verify);c=d[this.c++];e=d[this.c++];switch(c&15){case lb:this.method=lb;break;default:l(Error("unsupported compression method"))}0!==((c<<8)+e)%31&&l(Error("invalid fcheck flag:"+((c<<8)+e)%31));e&32&&l(Error("fdict flag is not supported"));this.B=new T(d,{index:this.c,bufferSize:a.bufferSize,bufferType:a.bufferType,resize:a.resize})} -kb.prototype.p=function(){var d=this.input,a,c;a=this.B.p();this.c=this.B.c;this.N&&(c=(d[this.c++]<<24|d[this.c++]<<16|d[this.c++]<<8|d[this.c++])>>>0,c!==jb(a)&&l(Error("invalid adler-32 checksum")));return a};var lb=8;function mb(d,a){this.input=d;this.a=new (F?Uint8Array:Array)(32768);this.h=$.k;var c={},e;if((a||!(a={}))&&"number"===typeof a.compressionType)this.h=a.compressionType;for(e in a)c[e]=a[e];c.outputBuffer=this.a;this.A=new ia(this.input,c)}var $=na; -mb.prototype.j=function(){var d,a,c,e,b,f,g,h=0;g=this.a;d=lb;switch(d){case lb:a=Math.LOG2E*Math.log(32768)-8;break;default:l(Error("invalid compression method"))}c=a<<4|d;g[h++]=c;switch(d){case lb:switch(this.h){case $.NONE:b=0;break;case $.r:b=1;break;case $.k:b=2;break;default:l(Error("unsupported compression type"))}break;default:l(Error("invalid compression method"))}e=b<<6|0;g[h++]=e|31-(256*c+e)%31;f=jb(this.input);this.A.b=h;g=this.A.j();h=g.length;F&&(g=new Uint8Array(g.buffer),g.length<= -h+4&&(this.a=new Uint8Array(g.length+4),this.a.set(g),g=this.a),g=g.subarray(0,h+4));g[h++]=f>>24&255;g[h++]=f>>16&255;g[h++]=f>>8&255;g[h++]=f&255;return g};function nb(d,a){var c,e,b,f;if(Object.keys)c=Object.keys(a);else for(e in c=[],b=0,a)c[b++]=e;b=0;for(f=c.length;b block_size * pos) { - var encblock = cipherfn.encrypt(util.str2bin(blockc)); - blocki = plaintext.substring((pos * block_size), (pos * block_size) + block_size); - for (var i = 0; i < blocki.length; i++) { - tempBlock += String.fromCharCode(blocki.charCodeAt(i) ^ encblock[i]); - } - blockc = tempBlock; - tempBlock = ''; - cyphertext += blockc; - pos++; - } - return cyphertext; - }, - - normalDecrypt: function(cipherfn, key, ciphertext, iv) { - cipherfn = new cipher[cipherfn](key); - var block_size = cipherfn.blockSize; - - var blockp = ''; - var pos = 0; - var plaintext = ''; - var offset = 0; - var i; - if (iv === null) - for (i = 0; i < block_size; i++) { - blockp += String.fromCharCode(0); - } - else - blockp = iv.substring(0, block_size); - while (ciphertext.length > (block_size * pos)) { - var decblock = cipherfn.encrypt(util.str2bin(blockp)); - blockp = ciphertext.substring((pos * (block_size)) + offset, (pos * (block_size)) + (block_size) + offset); - for (i = 0; i < blockp.length; i++) { - plaintext += String.fromCharCode(blockp.charCodeAt(i) ^ decblock[i]); - } - pos++; - } - - return plaintext; - } -}; - -},{"../util.js":76,"./cipher":23}],19:[function(require,module,exports){ -/* Rijndael (AES) Encryption - * Copyright 2005 Herbert Hanewinkel, www.haneWIN.de - * version 1.1, check www.haneWIN.de for the latest version - - * This software is provided as-is, without express or implied warranty. - * Permission to use, copy, modify, distribute or sell this software, with or - * without fee, for any purpose and by any individual or organization, is hereby - * granted, provided that the above copyright notice and this paragraph appear - * in all copies. Distribution as a part of an application or binary must - * include the above copyright notice in the documentation and/or other - * materials provided with the application or distribution. - */ - -/** - * @requires util - * @module crypto/cipher/aes - */ - -'use strict'; - -var util = require('../../util.js'); - -// The round constants used in subkey expansion -var Rcon = new Uint8Array([ - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, - 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, - 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 -]); - -// Precomputed lookup table for the SBox -var S = new Uint8Array([ - 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, - 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, - 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, - 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, - 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, - 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, - 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, - 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, - 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, - 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, - 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, - 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, - 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, - 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, - 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, - 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, - 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, - 22 -]); - -var T1 = new Uint32Array([ - 0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, - 0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591, - 0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56, - 0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec, - 0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa, - 0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb, - 0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45, - 0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b, - 0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c, - 0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83, - 0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9, - 0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a, - 0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d, - 0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f, - 0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df, - 0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea, - 0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34, - 0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b, - 0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d, - 0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413, - 0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1, - 0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6, - 0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972, - 0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85, - 0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed, - 0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511, - 0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe, - 0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b, - 0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05, - 0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1, - 0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142, - 0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf, - 0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3, - 0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e, - 0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a, - 0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6, - 0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3, - 0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b, - 0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428, - 0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad, - 0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14, - 0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8, - 0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4, - 0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2, - 0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda, - 0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949, - 0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf, - 0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810, - 0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c, - 0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697, - 0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e, - 0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f, - 0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc, - 0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c, - 0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969, - 0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27, - 0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122, - 0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433, - 0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9, - 0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5, - 0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a, - 0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0, - 0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e, - 0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c -]); - -var T2 = new Uint32Array([ - 0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d, - 0xf2f2ff0d, 0x6b6bd6bd, 0x6f6fdeb1, 0xc5c59154, - 0x30306050, 0x01010203, 0x6767cea9, 0x2b2b567d, - 0xfefee719, 0xd7d7b562, 0xabab4de6, 0x7676ec9a, - 0xcaca8f45, 0x82821f9d, 0xc9c98940, 0x7d7dfa87, - 0xfafaef15, 0x5959b2eb, 0x47478ec9, 0xf0f0fb0b, - 0xadad41ec, 0xd4d4b367, 0xa2a25ffd, 0xafaf45ea, - 0x9c9c23bf, 0xa4a453f7, 0x7272e496, 0xc0c09b5b, - 0xb7b775c2, 0xfdfde11c, 0x93933dae, 0x26264c6a, - 0x36366c5a, 0x3f3f7e41, 0xf7f7f502, 0xcccc834f, - 0x3434685c, 0xa5a551f4, 0xe5e5d134, 0xf1f1f908, - 0x7171e293, 0xd8d8ab73, 0x31316253, 0x15152a3f, - 0x0404080c, 0xc7c79552, 0x23234665, 0xc3c39d5e, - 0x18183028, 0x969637a1, 0x05050a0f, 0x9a9a2fb5, - 0x07070e09, 0x12122436, 0x80801b9b, 0xe2e2df3d, - 0xebebcd26, 0x27274e69, 0xb2b27fcd, 0x7575ea9f, - 0x0909121b, 0x83831d9e, 0x2c2c5874, 0x1a1a342e, - 0x1b1b362d, 0x6e6edcb2, 0x5a5ab4ee, 0xa0a05bfb, - 0x5252a4f6, 0x3b3b764d, 0xd6d6b761, 0xb3b37dce, - 0x2929527b, 0xe3e3dd3e, 0x2f2f5e71, 0x84841397, - 0x5353a6f5, 0xd1d1b968, 0x00000000, 0xededc12c, - 0x20204060, 0xfcfce31f, 0xb1b179c8, 0x5b5bb6ed, - 0x6a6ad4be, 0xcbcb8d46, 0xbebe67d9, 0x3939724b, - 0x4a4a94de, 0x4c4c98d4, 0x5858b0e8, 0xcfcf854a, - 0xd0d0bb6b, 0xefefc52a, 0xaaaa4fe5, 0xfbfbed16, - 0x434386c5, 0x4d4d9ad7, 0x33336655, 0x85851194, - 0x45458acf, 0xf9f9e910, 0x02020406, 0x7f7ffe81, - 0x5050a0f0, 0x3c3c7844, 0x9f9f25ba, 0xa8a84be3, - 0x5151a2f3, 0xa3a35dfe, 0x404080c0, 0x8f8f058a, - 0x92923fad, 0x9d9d21bc, 0x38387048, 0xf5f5f104, - 0xbcbc63df, 0xb6b677c1, 0xdadaaf75, 0x21214263, - 0x10102030, 0xffffe51a, 0xf3f3fd0e, 0xd2d2bf6d, - 0xcdcd814c, 0x0c0c1814, 0x13132635, 0xececc32f, - 0x5f5fbee1, 0x979735a2, 0x444488cc, 0x17172e39, - 0xc4c49357, 0xa7a755f2, 0x7e7efc82, 0x3d3d7a47, - 0x6464c8ac, 0x5d5dbae7, 0x1919322b, 0x7373e695, - 0x6060c0a0, 0x81811998, 0x4f4f9ed1, 0xdcdca37f, - 0x22224466, 0x2a2a547e, 0x90903bab, 0x88880b83, - 0x46468cca, 0xeeeec729, 0xb8b86bd3, 0x1414283c, - 0xdedea779, 0x5e5ebce2, 0x0b0b161d, 0xdbdbad76, - 0xe0e0db3b, 0x32326456, 0x3a3a744e, 0x0a0a141e, - 0x494992db, 0x06060c0a, 0x2424486c, 0x5c5cb8e4, - 0xc2c29f5d, 0xd3d3bd6e, 0xacac43ef, 0x6262c4a6, - 0x919139a8, 0x959531a4, 0xe4e4d337, 0x7979f28b, - 0xe7e7d532, 0xc8c88b43, 0x37376e59, 0x6d6ddab7, - 0x8d8d018c, 0xd5d5b164, 0x4e4e9cd2, 0xa9a949e0, - 0x6c6cd8b4, 0x5656acfa, 0xf4f4f307, 0xeaeacf25, - 0x6565caaf, 0x7a7af48e, 0xaeae47e9, 0x08081018, - 0xbaba6fd5, 0x7878f088, 0x25254a6f, 0x2e2e5c72, - 0x1c1c3824, 0xa6a657f1, 0xb4b473c7, 0xc6c69751, - 0xe8e8cb23, 0xdddda17c, 0x7474e89c, 0x1f1f3e21, - 0x4b4b96dd, 0xbdbd61dc, 0x8b8b0d86, 0x8a8a0f85, - 0x7070e090, 0x3e3e7c42, 0xb5b571c4, 0x6666ccaa, - 0x484890d8, 0x03030605, 0xf6f6f701, 0x0e0e1c12, - 0x6161c2a3, 0x35356a5f, 0x5757aef9, 0xb9b969d0, - 0x86861791, 0xc1c19958, 0x1d1d3a27, 0x9e9e27b9, - 0xe1e1d938, 0xf8f8eb13, 0x98982bb3, 0x11112233, - 0x6969d2bb, 0xd9d9a970, 0x8e8e0789, 0x949433a7, - 0x9b9b2db6, 0x1e1e3c22, 0x87871592, 0xe9e9c920, - 0xcece8749, 0x5555aaff, 0x28285078, 0xdfdfa57a, - 0x8c8c038f, 0xa1a159f8, 0x89890980, 0x0d0d1a17, - 0xbfbf65da, 0xe6e6d731, 0x424284c6, 0x6868d0b8, - 0x414182c3, 0x999929b0, 0x2d2d5a77, 0x0f0f1e11, - 0xb0b07bcb, 0x5454a8fc, 0xbbbb6dd6, 0x16162c3a -]); - -var T3 = new Uint32Array([ - 0x63c6a563, 0x7cf8847c, 0x77ee9977, 0x7bf68d7b, - 0xf2ff0df2, 0x6bd6bd6b, 0x6fdeb16f, 0xc59154c5, - 0x30605030, 0x01020301, 0x67cea967, 0x2b567d2b, - 0xfee719fe, 0xd7b562d7, 0xab4de6ab, 0x76ec9a76, - 0xca8f45ca, 0x821f9d82, 0xc98940c9, 0x7dfa877d, - 0xfaef15fa, 0x59b2eb59, 0x478ec947, 0xf0fb0bf0, - 0xad41ecad, 0xd4b367d4, 0xa25ffda2, 0xaf45eaaf, - 0x9c23bf9c, 0xa453f7a4, 0x72e49672, 0xc09b5bc0, - 0xb775c2b7, 0xfde11cfd, 0x933dae93, 0x264c6a26, - 0x366c5a36, 0x3f7e413f, 0xf7f502f7, 0xcc834fcc, - 0x34685c34, 0xa551f4a5, 0xe5d134e5, 0xf1f908f1, - 0x71e29371, 0xd8ab73d8, 0x31625331, 0x152a3f15, - 0x04080c04, 0xc79552c7, 0x23466523, 0xc39d5ec3, - 0x18302818, 0x9637a196, 0x050a0f05, 0x9a2fb59a, - 0x070e0907, 0x12243612, 0x801b9b80, 0xe2df3de2, - 0xebcd26eb, 0x274e6927, 0xb27fcdb2, 0x75ea9f75, - 0x09121b09, 0x831d9e83, 0x2c58742c, 0x1a342e1a, - 0x1b362d1b, 0x6edcb26e, 0x5ab4ee5a, 0xa05bfba0, - 0x52a4f652, 0x3b764d3b, 0xd6b761d6, 0xb37dceb3, - 0x29527b29, 0xe3dd3ee3, 0x2f5e712f, 0x84139784, - 0x53a6f553, 0xd1b968d1, 0x00000000, 0xedc12ced, - 0x20406020, 0xfce31ffc, 0xb179c8b1, 0x5bb6ed5b, - 0x6ad4be6a, 0xcb8d46cb, 0xbe67d9be, 0x39724b39, - 0x4a94de4a, 0x4c98d44c, 0x58b0e858, 0xcf854acf, - 0xd0bb6bd0, 0xefc52aef, 0xaa4fe5aa, 0xfbed16fb, - 0x4386c543, 0x4d9ad74d, 0x33665533, 0x85119485, - 0x458acf45, 0xf9e910f9, 0x02040602, 0x7ffe817f, - 0x50a0f050, 0x3c78443c, 0x9f25ba9f, 0xa84be3a8, - 0x51a2f351, 0xa35dfea3, 0x4080c040, 0x8f058a8f, - 0x923fad92, 0x9d21bc9d, 0x38704838, 0xf5f104f5, - 0xbc63dfbc, 0xb677c1b6, 0xdaaf75da, 0x21426321, - 0x10203010, 0xffe51aff, 0xf3fd0ef3, 0xd2bf6dd2, - 0xcd814ccd, 0x0c18140c, 0x13263513, 0xecc32fec, - 0x5fbee15f, 0x9735a297, 0x4488cc44, 0x172e3917, - 0xc49357c4, 0xa755f2a7, 0x7efc827e, 0x3d7a473d, - 0x64c8ac64, 0x5dbae75d, 0x19322b19, 0x73e69573, - 0x60c0a060, 0x81199881, 0x4f9ed14f, 0xdca37fdc, - 0x22446622, 0x2a547e2a, 0x903bab90, 0x880b8388, - 0x468cca46, 0xeec729ee, 0xb86bd3b8, 0x14283c14, - 0xdea779de, 0x5ebce25e, 0x0b161d0b, 0xdbad76db, - 0xe0db3be0, 0x32645632, 0x3a744e3a, 0x0a141e0a, - 0x4992db49, 0x060c0a06, 0x24486c24, 0x5cb8e45c, - 0xc29f5dc2, 0xd3bd6ed3, 0xac43efac, 0x62c4a662, - 0x9139a891, 0x9531a495, 0xe4d337e4, 0x79f28b79, - 0xe7d532e7, 0xc88b43c8, 0x376e5937, 0x6ddab76d, - 0x8d018c8d, 0xd5b164d5, 0x4e9cd24e, 0xa949e0a9, - 0x6cd8b46c, 0x56acfa56, 0xf4f307f4, 0xeacf25ea, - 0x65caaf65, 0x7af48e7a, 0xae47e9ae, 0x08101808, - 0xba6fd5ba, 0x78f08878, 0x254a6f25, 0x2e5c722e, - 0x1c38241c, 0xa657f1a6, 0xb473c7b4, 0xc69751c6, - 0xe8cb23e8, 0xdda17cdd, 0x74e89c74, 0x1f3e211f, - 0x4b96dd4b, 0xbd61dcbd, 0x8b0d868b, 0x8a0f858a, - 0x70e09070, 0x3e7c423e, 0xb571c4b5, 0x66ccaa66, - 0x4890d848, 0x03060503, 0xf6f701f6, 0x0e1c120e, - 0x61c2a361, 0x356a5f35, 0x57aef957, 0xb969d0b9, - 0x86179186, 0xc19958c1, 0x1d3a271d, 0x9e27b99e, - 0xe1d938e1, 0xf8eb13f8, 0x982bb398, 0x11223311, - 0x69d2bb69, 0xd9a970d9, 0x8e07898e, 0x9433a794, - 0x9b2db69b, 0x1e3c221e, 0x87159287, 0xe9c920e9, - 0xce8749ce, 0x55aaff55, 0x28507828, 0xdfa57adf, - 0x8c038f8c, 0xa159f8a1, 0x89098089, 0x0d1a170d, - 0xbf65dabf, 0xe6d731e6, 0x4284c642, 0x68d0b868, - 0x4182c341, 0x9929b099, 0x2d5a772d, 0x0f1e110f, - 0xb07bcbb0, 0x54a8fc54, 0xbb6dd6bb, 0x162c3a16 -]); - -var T4 = new Uint32Array([ - 0xc6a56363, 0xf8847c7c, 0xee997777, 0xf68d7b7b, - 0xff0df2f2, 0xd6bd6b6b, 0xdeb16f6f, 0x9154c5c5, - 0x60503030, 0x02030101, 0xcea96767, 0x567d2b2b, - 0xe719fefe, 0xb562d7d7, 0x4de6abab, 0xec9a7676, - 0x8f45caca, 0x1f9d8282, 0x8940c9c9, 0xfa877d7d, - 0xef15fafa, 0xb2eb5959, 0x8ec94747, 0xfb0bf0f0, - 0x41ecadad, 0xb367d4d4, 0x5ffda2a2, 0x45eaafaf, - 0x23bf9c9c, 0x53f7a4a4, 0xe4967272, 0x9b5bc0c0, - 0x75c2b7b7, 0xe11cfdfd, 0x3dae9393, 0x4c6a2626, - 0x6c5a3636, 0x7e413f3f, 0xf502f7f7, 0x834fcccc, - 0x685c3434, 0x51f4a5a5, 0xd134e5e5, 0xf908f1f1, - 0xe2937171, 0xab73d8d8, 0x62533131, 0x2a3f1515, - 0x080c0404, 0x9552c7c7, 0x46652323, 0x9d5ec3c3, - 0x30281818, 0x37a19696, 0x0a0f0505, 0x2fb59a9a, - 0x0e090707, 0x24361212, 0x1b9b8080, 0xdf3de2e2, - 0xcd26ebeb, 0x4e692727, 0x7fcdb2b2, 0xea9f7575, - 0x121b0909, 0x1d9e8383, 0x58742c2c, 0x342e1a1a, - 0x362d1b1b, 0xdcb26e6e, 0xb4ee5a5a, 0x5bfba0a0, - 0xa4f65252, 0x764d3b3b, 0xb761d6d6, 0x7dceb3b3, - 0x527b2929, 0xdd3ee3e3, 0x5e712f2f, 0x13978484, - 0xa6f55353, 0xb968d1d1, 0x00000000, 0xc12ceded, - 0x40602020, 0xe31ffcfc, 0x79c8b1b1, 0xb6ed5b5b, - 0xd4be6a6a, 0x8d46cbcb, 0x67d9bebe, 0x724b3939, - 0x94de4a4a, 0x98d44c4c, 0xb0e85858, 0x854acfcf, - 0xbb6bd0d0, 0xc52aefef, 0x4fe5aaaa, 0xed16fbfb, - 0x86c54343, 0x9ad74d4d, 0x66553333, 0x11948585, - 0x8acf4545, 0xe910f9f9, 0x04060202, 0xfe817f7f, - 0xa0f05050, 0x78443c3c, 0x25ba9f9f, 0x4be3a8a8, - 0xa2f35151, 0x5dfea3a3, 0x80c04040, 0x058a8f8f, - 0x3fad9292, 0x21bc9d9d, 0x70483838, 0xf104f5f5, - 0x63dfbcbc, 0x77c1b6b6, 0xaf75dada, 0x42632121, - 0x20301010, 0xe51affff, 0xfd0ef3f3, 0xbf6dd2d2, - 0x814ccdcd, 0x18140c0c, 0x26351313, 0xc32fecec, - 0xbee15f5f, 0x35a29797, 0x88cc4444, 0x2e391717, - 0x9357c4c4, 0x55f2a7a7, 0xfc827e7e, 0x7a473d3d, - 0xc8ac6464, 0xbae75d5d, 0x322b1919, 0xe6957373, - 0xc0a06060, 0x19988181, 0x9ed14f4f, 0xa37fdcdc, - 0x44662222, 0x547e2a2a, 0x3bab9090, 0x0b838888, - 0x8cca4646, 0xc729eeee, 0x6bd3b8b8, 0x283c1414, - 0xa779dede, 0xbce25e5e, 0x161d0b0b, 0xad76dbdb, - 0xdb3be0e0, 0x64563232, 0x744e3a3a, 0x141e0a0a, - 0x92db4949, 0x0c0a0606, 0x486c2424, 0xb8e45c5c, - 0x9f5dc2c2, 0xbd6ed3d3, 0x43efacac, 0xc4a66262, - 0x39a89191, 0x31a49595, 0xd337e4e4, 0xf28b7979, - 0xd532e7e7, 0x8b43c8c8, 0x6e593737, 0xdab76d6d, - 0x018c8d8d, 0xb164d5d5, 0x9cd24e4e, 0x49e0a9a9, - 0xd8b46c6c, 0xacfa5656, 0xf307f4f4, 0xcf25eaea, - 0xcaaf6565, 0xf48e7a7a, 0x47e9aeae, 0x10180808, - 0x6fd5baba, 0xf0887878, 0x4a6f2525, 0x5c722e2e, - 0x38241c1c, 0x57f1a6a6, 0x73c7b4b4, 0x9751c6c6, - 0xcb23e8e8, 0xa17cdddd, 0xe89c7474, 0x3e211f1f, - 0x96dd4b4b, 0x61dcbdbd, 0x0d868b8b, 0x0f858a8a, - 0xe0907070, 0x7c423e3e, 0x71c4b5b5, 0xccaa6666, - 0x90d84848, 0x06050303, 0xf701f6f6, 0x1c120e0e, - 0xc2a36161, 0x6a5f3535, 0xaef95757, 0x69d0b9b9, - 0x17918686, 0x9958c1c1, 0x3a271d1d, 0x27b99e9e, - 0xd938e1e1, 0xeb13f8f8, 0x2bb39898, 0x22331111, - 0xd2bb6969, 0xa970d9d9, 0x07898e8e, 0x33a79494, - 0x2db69b9b, 0x3c221e1e, 0x15928787, 0xc920e9e9, - 0x8749cece, 0xaaff5555, 0x50782828, 0xa57adfdf, - 0x038f8c8c, 0x59f8a1a1, 0x09808989, 0x1a170d0d, - 0x65dabfbf, 0xd731e6e6, 0x84c64242, 0xd0b86868, - 0x82c34141, 0x29b09999, 0x5a772d2d, 0x1e110f0f, - 0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb, 0x2c3a1616 -]); - -function B0(x) { - return (x & 255); -} - -function B1(x) { - return ((x >> 8) & 255); -} - -function B2(x) { - return ((x >> 16) & 255); -} - -function B3(x) { - return ((x >> 24) & 255); -} - -function F1(x0, x1, x2, x3) { - return B1(T1[x0 & 255]) | (B1(T1[(x1 >> 8) & 255]) << 8) | (B1(T1[(x2 >> 16) & 255]) << 16) | (B1(T1[x3 >>> 24]) << 24); -} - -function packBytes(octets) { - var i, j; - var len = octets.length; - var b = new Array(len / 4); - - if (!octets || len % 4) return; - - for (i = 0, j = 0; j < len; j += 4) { - b[i++] = octets[j] | (octets[j + 1] << 8) | (octets[j + 2] << 16) | (octets[j + 3] << 24); - } - - return b; -} - -function unpackBytes(packed) { - var j; - var i = 0, - l = packed.length; - var r = new Array(l * 4); - - for (j = 0; j < l; j++) { - r[i++] = B0(packed[j]); - r[i++] = B1(packed[j]); - r[i++] = B2(packed[j]); - r[i++] = B3(packed[j]); - } - return r; -} - -// ------------------------------------------------ - -var maxkc = 8; -var maxrk = 14; - -function keyExpansion(key) { - var kc, i, j, r, t; - var rounds; - var keySched = new Array(maxrk + 1); - var keylen = key.length; - var k = new Array(maxkc); - var tk = new Array(maxkc); - var rconpointer = 0; - - if (keylen == 16) { - rounds = 10; - kc = 4; - } else if (keylen == 24) { - rounds = 12; - kc = 6; - } else if (keylen == 32) { - rounds = 14; - kc = 8; - } else { - throw new Error('Invalid key-length for AES key:' + keylen); - } - - for (i = 0; i < maxrk + 1; i++) { - keySched[i] = new Uint32Array(4); - } - - for (i = 0, j = 0; j < keylen; j++, i += 4) { - k[j] = key.charCodeAt(i) | (key.charCodeAt(i + 1) << 8) | (key.charCodeAt(i + 2) << 16) | (key.charCodeAt(i + 3) << 24); - } - - for (j = kc - 1; j >= 0; j--) { - tk[j] = k[j]; - } - - r = 0; - t = 0; - for (j = 0; (j < kc) && (r < rounds + 1);) { - for (; (j < kc) && (t < 4); j++, t++) { - keySched[r][t] = tk[j]; - } - if (t == 4) { - r++; - t = 0; - } - } - - while (r < rounds + 1) { - var temp = tk[kc - 1]; - - tk[0] ^= S[B1(temp)] | (S[B2(temp)] << 8) | (S[B3(temp)] << 16) | (S[B0(temp)] << 24); - tk[0] ^= Rcon[rconpointer++]; - - if (kc != 8) { - for (j = 1; j < kc; j++) { - tk[j] ^= tk[j - 1]; - } - } else { - for (j = 1; j < kc / 2; j++) { - tk[j] ^= tk[j - 1]; - } - - temp = tk[kc / 2 - 1]; - tk[kc / 2] ^= S[B0(temp)] | (S[B1(temp)] << 8) | (S[B2(temp)] << 16) | (S[B3(temp)] << 24); - - for (j = kc / 2 + 1; j < kc; j++) { - tk[j] ^= tk[j - 1]; - } - } - - for (j = 0; (j < kc) && (r < rounds + 1);) { - for (; (j < kc) && (t < 4); j++, t++) { - keySched[r][t] = tk[j]; - } - if (t == 4) { - r++; - t = 0; - } - } - } - - return { - rounds: rounds, - rk: keySched - }; -} - -function AESencrypt(block, ctx, t) { - var r, rounds, b; - - b = packBytes(block); - rounds = ctx.rounds; - - for (r = 0; r < rounds - 1; r++) { - t[0] = b[0] ^ ctx.rk[r][0]; - t[1] = b[1] ^ ctx.rk[r][1]; - t[2] = b[2] ^ ctx.rk[r][2]; - t[3] = b[3] ^ ctx.rk[r][3]; - - b[0] = T1[t[0] & 255] ^ T2[(t[1] >> 8) & 255] ^ T3[(t[2] >> 16) & 255] ^ T4[t[3] >>> 24]; - b[1] = T1[t[1] & 255] ^ T2[(t[2] >> 8) & 255] ^ T3[(t[3] >> 16) & 255] ^ T4[t[0] >>> 24]; - b[2] = T1[t[2] & 255] ^ T2[(t[3] >> 8) & 255] ^ T3[(t[0] >> 16) & 255] ^ T4[t[1] >>> 24]; - b[3] = T1[t[3] & 255] ^ T2[(t[0] >> 8) & 255] ^ T3[(t[1] >> 16) & 255] ^ T4[t[2] >>> 24]; - } - - // last round is special - r = rounds - 1; - - t[0] = b[0] ^ ctx.rk[r][0]; - t[1] = b[1] ^ ctx.rk[r][1]; - t[2] = b[2] ^ ctx.rk[r][2]; - t[3] = b[3] ^ ctx.rk[r][3]; - - b[0] = F1(t[0], t[1], t[2], t[3]) ^ ctx.rk[rounds][0]; - b[1] = F1(t[1], t[2], t[3], t[0]) ^ ctx.rk[rounds][1]; - b[2] = F1(t[2], t[3], t[0], t[1]) ^ ctx.rk[rounds][2]; - b[3] = F1(t[3], t[0], t[1], t[2]) ^ ctx.rk[rounds][3]; - - return unpackBytes(b); -} - -function makeClass(length) { - - var c = function(key) { - this.key = keyExpansion(key); - this._temp = new Uint32Array(this.blockSize / 4); - - this.encrypt = function(block) { - return AESencrypt(block, this.key, this._temp); - }; - }; - - c.blockSize = c.prototype.blockSize = 16; - c.keySize = c.prototype.keySize = length / 8; - - return c; -} - -module.exports = {}; - -var types = [128, 192, 256]; - -for (var i in types) { - module.exports[types[i]] = makeClass(types[i]); -} - -},{"../../util.js":76}],20:[function(require,module,exports){ -/* Modified by Recurity Labs GmbH - * - * Originally written by nklein software (nklein.com) - */ - -/** - * @module crypto/cipher/blowfish - */ - -/* - * Javascript implementation based on Bruce Schneier's reference implementation. - * - * - * The constructor doesn't do much of anything. It's just here - * so we can start defining properties and methods and such. - */ -function Blowfish() {} - -/* - * Declare the block size so that protocols know what size - * Initialization Vector (IV) they will need. - */ -Blowfish.prototype.BLOCKSIZE = 8; - -/* - * These are the default SBOXES. - */ -Blowfish.prototype.SBOXES = [ - [ - 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, - 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, - 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, - 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, - 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, - 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, - 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, - 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, - 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, - 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, - 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, - 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, - 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, - 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, - 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, - 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, - 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, - 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, - 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, - 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, - 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, - 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, - 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, - 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, - 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, - 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, - 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, - 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, - 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, - 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, - 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, - 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, - 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, - 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, - 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, - 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, - 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, - 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, - 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, - 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, - 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, - 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, - 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a - ], - [ - 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, - 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, - 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, - 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, - 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, - 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, - 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, - 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, - 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, - 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, - 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, - 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, - 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, - 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, - 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, - 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, - 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, - 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, - 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, - 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, - 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, - 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, - 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, - 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, - 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, - 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, - 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, - 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, - 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, - 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, - 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, - 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, - 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, - 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, - 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, - 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, - 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, - 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, - 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, - 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, - 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, - 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, - 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 - ], - [ - 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, - 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, - 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, - 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, - 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, - 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, - 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, - 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, - 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, - 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, - 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, - 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, - 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, - 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, - 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, - 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, - 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, - 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, - 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, - 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, - 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, - 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, - 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, - 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, - 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, - 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, - 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, - 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, - 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, - 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, - 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, - 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, - 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, - 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, - 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, - 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, - 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, - 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, - 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, - 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, - 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, - 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, - 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 - ], - [ - 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, - 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, - 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, - 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, - 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, - 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, - 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, - 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, - 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, - 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, - 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, - 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, - 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, - 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, - 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, - 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, - 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, - 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, - 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, - 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, - 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, - 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, - 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, - 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, - 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, - 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, - 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, - 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, - 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, - 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, - 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, - 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, - 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, - 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, - 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, - 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, - 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, - 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, - 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, - 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, - 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, - 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, - 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 - ] -]; - -//* -//* This is the default PARRAY -//* -Blowfish.prototype.PARRAY = [ - 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, - 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, - 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b -]; - -//* -//* This is the number of rounds the cipher will go -//* -Blowfish.prototype.NN = 16; - -//* -//* This function is needed to get rid of problems -//* with the high-bit getting set. If we don't do -//* this, then sometimes ( aa & 0x00FFFFFFFF ) is not -//* equal to ( bb & 0x00FFFFFFFF ) even when they -//* agree bit-for-bit for the first 32 bits. -//* -Blowfish.prototype._clean = function(xx) { - if (xx < 0) { - var yy = xx & 0x7FFFFFFF; - xx = yy + 0x80000000; - } - return xx; -}; - -//* -//* This is the mixing function that uses the sboxes -//* -Blowfish.prototype._F = function(xx) { - var aa; - var bb; - var cc; - var dd; - var yy; - - dd = xx & 0x00FF; - xx >>>= 8; - cc = xx & 0x00FF; - xx >>>= 8; - bb = xx & 0x00FF; - xx >>>= 8; - aa = xx & 0x00FF; - - yy = this.sboxes[0][aa] + this.sboxes[1][bb]; - yy = yy ^ this.sboxes[2][cc]; - yy = yy + this.sboxes[3][dd]; - - return yy; -}; - -//* -//* This method takes an array with two values, left and right -//* and does NN rounds of Blowfish on them. -//* -Blowfish.prototype._encrypt_block = function(vals) { - var dataL = vals[0]; - var dataR = vals[1]; - - var ii; - - for (ii = 0; ii < this.NN; ++ii) { - dataL = dataL ^ this.parray[ii]; - dataR = this._F(dataL) ^ dataR; - - var tmp = dataL; - dataL = dataR; - dataR = tmp; - } - - dataL = dataL ^ this.parray[this.NN + 0]; - dataR = dataR ^ this.parray[this.NN + 1]; - - vals[0] = this._clean(dataR); - vals[1] = this._clean(dataL); -}; - -//* -//* This method takes a vector of numbers and turns them -//* into long words so that they can be processed by the -//* real algorithm. -//* -//* Maybe I should make the real algorithm above take a vector -//* instead. That will involve more looping, but it won't require -//* the F() method to deconstruct the vector. -//* -Blowfish.prototype.encrypt_block = function(vector) { - var ii; - var vals = [0, 0]; - var off = this.BLOCKSIZE / 2; - for (ii = 0; ii < this.BLOCKSIZE / 2; ++ii) { - vals[0] = (vals[0] << 8) | (vector[ii + 0] & 0x00FF); - vals[1] = (vals[1] << 8) | (vector[ii + off] & 0x00FF); - } - - this._encrypt_block(vals); - - var ret = []; - for (ii = 0; ii < this.BLOCKSIZE / 2; ++ii) { - ret[ii + 0] = (vals[0] >>> (24 - 8 * (ii)) & 0x00FF); - ret[ii + off] = (vals[1] >>> (24 - 8 * (ii)) & 0x00FF); - // vals[ 0 ] = ( vals[ 0 ] >>> 8 ); - // vals[ 1 ] = ( vals[ 1 ] >>> 8 ); - } - - return ret; -}; - -//* -//* This method takes an array with two values, left and right -//* and undoes NN rounds of Blowfish on them. -//* -Blowfish.prototype._decrypt_block = function(vals) { - var dataL = vals[0]; - var dataR = vals[1]; - - var ii; - - for (ii = this.NN + 1; ii > 1; --ii) { - dataL = dataL ^ this.parray[ii]; - dataR = this._F(dataL) ^ dataR; - - var tmp = dataL; - dataL = dataR; - dataR = tmp; - } - - dataL = dataL ^ this.parray[1]; - dataR = dataR ^ this.parray[0]; - - vals[0] = this._clean(dataR); - vals[1] = this._clean(dataL); -}; - -//* -//* This method takes a key array and initializes the -//* sboxes and parray for this encryption. -//* -Blowfish.prototype.init = function(key) { - var ii; - var jj = 0; - - this.parray = []; - for (ii = 0; ii < this.NN + 2; ++ii) { - var data = 0x00000000; - var kk; - for (kk = 0; kk < 4; ++kk) { - data = (data << 8) | (key[jj] & 0x00FF); - if (++jj >= key.length) { - jj = 0; - } - } - this.parray[ii] = this.PARRAY[ii] ^ data; - } - - this.sboxes = []; - for (ii = 0; ii < 4; ++ii) { - this.sboxes[ii] = []; - for (jj = 0; jj < 256; ++jj) { - this.sboxes[ii][jj] = this.SBOXES[ii][jj]; - } - } - - var vals = [0x00000000, 0x00000000]; - - for (ii = 0; ii < this.NN + 2; ii += 2) { - this._encrypt_block(vals); - this.parray[ii + 0] = vals[0]; - this.parray[ii + 1] = vals[1]; - } - - for (ii = 0; ii < 4; ++ii) { - for (jj = 0; jj < 256; jj += 2) { - this._encrypt_block(vals); - this.sboxes[ii][jj + 0] = vals[0]; - this.sboxes[ii][jj + 1] = vals[1]; - } - } -}; - -var util = require('../../util.js'); - -// added by Recurity Labs - -function BFencrypt(block, key) { - var bf = new Blowfish(); - bf.init(util.str2bin(key)); - return bf.encrypt_block(block); -} - -function BF(key) { - this.bf = new Blowfish(); - this.bf.init(util.str2bin(key)); - - this.encrypt = function(block) { - return this.bf.encrypt_block(block); - }; -} - - -module.exports = BF; -module.exports.keySize = BF.prototype.keySize = 16; -module.exports.blockSize = BF.prototype.blockSize = 16; - -},{"../../util.js":76}],21:[function(require,module,exports){ -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Copyright 2010 pjacobs@xeekr.com . All rights reserved. - -// Modified by Recurity Labs GmbH - -// fixed/modified by Herbert Hanewinkel, www.haneWIN.de -// check www.haneWIN.de for the latest version - -// cast5.js is a Javascript implementation of CAST-128, as defined in RFC 2144. -// CAST-128 is a common OpenPGP cipher. - - -// CAST5 constructor - -/** @module crypto/cipher/cast5 */ - - - -function openpgp_symenc_cast5() { - this.BlockSize = 8; - this.KeySize = 16; - - this.setKey = function(key) { - this.masking = new Array(16); - this.rotate = new Array(16); - - this.reset(); - - if (key.length == this.KeySize) { - this.keySchedule(key); - } else { - throw new Error('CAST-128: keys must be 16 bytes'); - } - return true; - }; - - this.reset = function() { - for (var i = 0; i < 16; i++) { - this.masking[i] = 0; - this.rotate[i] = 0; - } - }; - - this.getBlockSize = function() { - return BlockSize; - }; - - this.encrypt = function(src) { - var dst = new Array(src.length); - - for (var i = 0; i < src.length; i += 8) { - var l = src[i] << 24 | src[i + 1] << 16 | src[i + 2] << 8 | src[i + 3]; - var r = src[i + 4] << 24 | src[i + 5] << 16 | src[i + 6] << 8 | src[i + 7]; - var t; - - t = r; - r = l ^ f1(r, this.masking[0], this.rotate[0]); - l = t; - t = r; - r = l ^ f2(r, this.masking[1], this.rotate[1]); - l = t; - t = r; - r = l ^ f3(r, this.masking[2], this.rotate[2]); - l = t; - t = r; - r = l ^ f1(r, this.masking[3], this.rotate[3]); - l = t; - - t = r; - r = l ^ f2(r, this.masking[4], this.rotate[4]); - l = t; - t = r; - r = l ^ f3(r, this.masking[5], this.rotate[5]); - l = t; - t = r; - r = l ^ f1(r, this.masking[6], this.rotate[6]); - l = t; - t = r; - r = l ^ f2(r, this.masking[7], this.rotate[7]); - l = t; - - t = r; - r = l ^ f3(r, this.masking[8], this.rotate[8]); - l = t; - t = r; - r = l ^ f1(r, this.masking[9], this.rotate[9]); - l = t; - t = r; - r = l ^ f2(r, this.masking[10], this.rotate[10]); - l = t; - t = r; - r = l ^ f3(r, this.masking[11], this.rotate[11]); - l = t; - - t = r; - r = l ^ f1(r, this.masking[12], this.rotate[12]); - l = t; - t = r; - r = l ^ f2(r, this.masking[13], this.rotate[13]); - l = t; - t = r; - r = l ^ f3(r, this.masking[14], this.rotate[14]); - l = t; - t = r; - r = l ^ f1(r, this.masking[15], this.rotate[15]); - l = t; - - dst[i] = (r >>> 24) & 255; - dst[i + 1] = (r >>> 16) & 255; - dst[i + 2] = (r >>> 8) & 255; - dst[i + 3] = r & 255; - dst[i + 4] = (l >>> 24) & 255; - dst[i + 5] = (l >>> 16) & 255; - dst[i + 6] = (l >>> 8) & 255; - dst[i + 7] = l & 255; - } - - return dst; - }; - - this.decrypt = function(src) { - var dst = new Array(src.length); - - for (var i = 0; i < src.length; i += 8) { - var l = src[i] << 24 | src[i + 1] << 16 | src[i + 2] << 8 | src[i + 3]; - var r = src[i + 4] << 24 | src[i + 5] << 16 | src[i + 6] << 8 | src[i + 7]; - var t; - - t = r; - r = l ^ f1(r, this.masking[15], this.rotate[15]); - l = t; - t = r; - r = l ^ f3(r, this.masking[14], this.rotate[14]); - l = t; - t = r; - r = l ^ f2(r, this.masking[13], this.rotate[13]); - l = t; - t = r; - r = l ^ f1(r, this.masking[12], this.rotate[12]); - l = t; - - t = r; - r = l ^ f3(r, this.masking[11], this.rotate[11]); - l = t; - t = r; - r = l ^ f2(r, this.masking[10], this.rotate[10]); - l = t; - t = r; - r = l ^ f1(r, this.masking[9], this.rotate[9]); - l = t; - t = r; - r = l ^ f3(r, this.masking[8], this.rotate[8]); - l = t; - - t = r; - r = l ^ f2(r, this.masking[7], this.rotate[7]); - l = t; - t = r; - r = l ^ f1(r, this.masking[6], this.rotate[6]); - l = t; - t = r; - r = l ^ f3(r, this.masking[5], this.rotate[5]); - l = t; - t = r; - r = l ^ f2(r, this.masking[4], this.rotate[4]); - l = t; - - t = r; - r = l ^ f1(r, this.masking[3], this.rotate[3]); - l = t; - t = r; - r = l ^ f3(r, this.masking[2], this.rotate[2]); - l = t; - t = r; - r = l ^ f2(r, this.masking[1], this.rotate[1]); - l = t; - t = r; - r = l ^ f1(r, this.masking[0], this.rotate[0]); - l = t; - - dst[i] = (r >>> 24) & 255; - dst[i + 1] = (r >>> 16) & 255; - dst[i + 2] = (r >>> 8) & 255; - dst[i + 3] = r & 255; - dst[i + 4] = (l >>> 24) & 255; - dst[i + 5] = (l >> 16) & 255; - dst[i + 6] = (l >> 8) & 255; - dst[i + 7] = l & 255; - } - - return dst; - }; - var scheduleA = new Array(4); - - scheduleA[0] = new Array(4); - scheduleA[0][0] = new Array(4, 0, 0xd, 0xf, 0xc, 0xe, 0x8); - scheduleA[0][1] = new Array(5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa); - scheduleA[0][2] = new Array(6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9); - scheduleA[0][3] = new Array(7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb); - - scheduleA[1] = new Array(4); - scheduleA[1][0] = new Array(0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0); - scheduleA[1][1] = new Array(1, 4, 0, 2, 1, 3, 16 + 2); - scheduleA[1][2] = new Array(2, 5, 7, 6, 5, 4, 16 + 1); - scheduleA[1][3] = new Array(3, 7, 0xa, 9, 0xb, 8, 16 + 3); - - scheduleA[2] = new Array(4); - scheduleA[2][0] = new Array(4, 0, 0xd, 0xf, 0xc, 0xe, 8); - scheduleA[2][1] = new Array(5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa); - scheduleA[2][2] = new Array(6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9); - scheduleA[2][3] = new Array(7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb); - - - scheduleA[3] = new Array(4); - scheduleA[3][0] = new Array(0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0); - scheduleA[3][1] = new Array(1, 4, 0, 2, 1, 3, 16 + 2); - scheduleA[3][2] = new Array(2, 5, 7, 6, 5, 4, 16 + 1); - scheduleA[3][3] = new Array(3, 7, 0xa, 9, 0xb, 8, 16 + 3); - - var scheduleB = new Array(4); - - scheduleB[0] = new Array(4); - scheduleB[0][0] = new Array(16 + 8, 16 + 9, 16 + 7, 16 + 6, 16 + 2); - scheduleB[0][1] = new Array(16 + 0xa, 16 + 0xb, 16 + 5, 16 + 4, 16 + 6); - scheduleB[0][2] = new Array(16 + 0xc, 16 + 0xd, 16 + 3, 16 + 2, 16 + 9); - scheduleB[0][3] = new Array(16 + 0xe, 16 + 0xf, 16 + 1, 16 + 0, 16 + 0xc); - - scheduleB[1] = new Array(4); - scheduleB[1][0] = new Array(3, 2, 0xc, 0xd, 8); - scheduleB[1][1] = new Array(1, 0, 0xe, 0xf, 0xd); - scheduleB[1][2] = new Array(7, 6, 8, 9, 3); - scheduleB[1][3] = new Array(5, 4, 0xa, 0xb, 7); - - - scheduleB[2] = new Array(4); - scheduleB[2][0] = new Array(16 + 3, 16 + 2, 16 + 0xc, 16 + 0xd, 16 + 9); - scheduleB[2][1] = new Array(16 + 1, 16 + 0, 16 + 0xe, 16 + 0xf, 16 + 0xc); - scheduleB[2][2] = new Array(16 + 7, 16 + 6, 16 + 8, 16 + 9, 16 + 2); - scheduleB[2][3] = new Array(16 + 5, 16 + 4, 16 + 0xa, 16 + 0xb, 16 + 6); - - - scheduleB[3] = new Array(4); - scheduleB[3][0] = new Array(8, 9, 7, 6, 3); - scheduleB[3][1] = new Array(0xa, 0xb, 5, 4, 7); - scheduleB[3][2] = new Array(0xc, 0xd, 3, 2, 8); - scheduleB[3][3] = new Array(0xe, 0xf, 1, 0, 0xd); - - // changed 'in' to 'inn' (in javascript 'in' is a reserved word) - this.keySchedule = function(inn) { - var t = new Array(8); - var k = new Array(32); - - var i, j; - - for (i = 0; i < 4; i++) { - j = i * 4; - t[i] = inn[j] << 24 | inn[j + 1] << 16 | inn[j + 2] << 8 | inn[j + 3]; - } - - var x = [6, 7, 4, 5]; - var ki = 0; - var w; - - for (var half = 0; half < 2; half++) { - for (var round = 0; round < 4; round++) { - for (j = 0; j < 4; j++) { - var a = scheduleA[round][j]; - w = t[a[1]]; - - w ^= sBox[4][(t[a[2] >>> 2] >>> (24 - 8 * (a[2] & 3))) & 0xff]; - w ^= sBox[5][(t[a[3] >>> 2] >>> (24 - 8 * (a[3] & 3))) & 0xff]; - w ^= sBox[6][(t[a[4] >>> 2] >>> (24 - 8 * (a[4] & 3))) & 0xff]; - w ^= sBox[7][(t[a[5] >>> 2] >>> (24 - 8 * (a[5] & 3))) & 0xff]; - w ^= sBox[x[j]][(t[a[6] >>> 2] >>> (24 - 8 * (a[6] & 3))) & 0xff]; - t[a[0]] = w; - } - - for (j = 0; j < 4; j++) { - var b = scheduleB[round][j]; - w = sBox[4][(t[b[0] >>> 2] >>> (24 - 8 * (b[0] & 3))) & 0xff]; - - w ^= sBox[5][(t[b[1] >>> 2] >>> (24 - 8 * (b[1] & 3))) & 0xff]; - w ^= sBox[6][(t[b[2] >>> 2] >>> (24 - 8 * (b[2] & 3))) & 0xff]; - w ^= sBox[7][(t[b[3] >>> 2] >>> (24 - 8 * (b[3] & 3))) & 0xff]; - w ^= sBox[4 + j][(t[b[4] >>> 2] >>> (24 - 8 * (b[4] & 3))) & 0xff]; - k[ki] = w; - ki++; - } - } - } - - for (i = 0; i < 16; i++) { - this.masking[i] = k[i]; - this.rotate[i] = k[16 + i] & 0x1f; - } - }; - - // These are the three 'f' functions. See RFC 2144, section 2.2. - - function f1(d, m, r) { - var t = m + d; - var I = (t << r) | (t >>> (32 - r)); - return ((sBox[0][I >>> 24] ^ sBox[1][(I >>> 16) & 255]) - sBox[2][(I >>> 8) & 255]) + sBox[3][I & 255]; - } - - function f2(d, m, r) { - var t = m ^ d; - var I = (t << r) | (t >>> (32 - r)); - return ((sBox[0][I >>> 24] - sBox[1][(I >>> 16) & 255]) + sBox[2][(I >>> 8) & 255]) ^ sBox[3][I & 255]; - } - - function f3(d, m, r) { - var t = m - d; - var I = (t << r) | (t >>> (32 - r)); - return ((sBox[0][I >>> 24] + sBox[1][(I >>> 16) & 255]) ^ sBox[2][(I >>> 8) & 255]) - sBox[3][I & 255]; - } - - var sBox = new Array(8); - sBox[0] = new Array( - 0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949, - 0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e, - 0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d, - 0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0, - 0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7, - 0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935, - 0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d, - 0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50, - 0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe, - 0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3, - 0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167, - 0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291, - 0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779, - 0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2, - 0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511, - 0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495, 0xaa573b04, 0x4a805d8d, - 0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5, - 0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324, - 0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c, - 0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc, - 0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d, - 0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96, - 0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a, - 0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d, - 0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd, - 0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6, - 0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9, - 0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872, - 0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c, - 0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e, - 0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9, - 0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf); - - sBox[1] = new Array( - 0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651, - 0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3, - 0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb, - 0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b, 0x25a1ff41, 0xe180f806, - 0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b, - 0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359, - 0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084, 0xe4eb573b, - 0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c, - 0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34, - 0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb, - 0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd, - 0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860, - 0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b, - 0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304, - 0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b, - 0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf, - 0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c, - 0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13, - 0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741, 0x7cbad9a2, 0x2180036f, - 0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6, - 0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6, - 0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc, 0xd152de58, - 0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906, - 0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d, - 0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6, - 0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4, - 0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6, - 0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f, - 0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249, - 0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa, - 0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9, - 0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1); - - sBox[2] = new Array( - 0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90, - 0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5, - 0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e, - 0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240, - 0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5, - 0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b, - 0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e, 0xc5884a28, 0xccc36f71, - 0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04, - 0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82, - 0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15, - 0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2, - 0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176, - 0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148, - 0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc, - 0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341, - 0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e, - 0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51, - 0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f, - 0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a, - 0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b, - 0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b, - 0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae, 0x12deca4d, 0x2c3f8cc5, - 0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45, - 0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536, - 0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc, - 0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0, - 0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69, - 0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2, - 0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49, - 0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d, - 0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a, - 0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783); - - sBox[3] = new Array( - 0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1, - 0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf, - 0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15, - 0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121, - 0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25, - 0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5, - 0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb, - 0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5, - 0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d, - 0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6, - 0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23, - 0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003, - 0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6, - 0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119, - 0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24, - 0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a, - 0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79, - 0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df, - 0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26, - 0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab, - 0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7, - 0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417, - 0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2, - 0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2, - 0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a, - 0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919, - 0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef, - 0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876, - 0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab, - 0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04, - 0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282, - 0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2); - - sBox[4] = new Array( - 0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f, - 0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a, - 0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff, - 0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02, - 0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a, - 0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7, - 0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9, - 0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981, - 0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774, - 0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655, - 0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2, - 0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910, - 0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1, - 0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da, - 0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049, - 0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f, - 0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba, - 0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be, - 0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3, - 0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840, - 0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4, - 0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2, - 0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7, - 0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5, - 0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e, - 0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e, - 0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801, - 0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad, - 0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0, - 0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20, - 0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8, - 0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4); - - sBox[5] = new Array( - 0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac, - 0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138, - 0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367, - 0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98, - 0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072, - 0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3, - 0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd, - 0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8, - 0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9, - 0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54, - 0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387, - 0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc, - 0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf, - 0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf, - 0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f, - 0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289, - 0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063, 0x4576698d, 0xb6fad407, 0x592af950, - 0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f, - 0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b, - 0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be, - 0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13, - 0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976, - 0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0, - 0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891, - 0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da, - 0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc, - 0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084, - 0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25, - 0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121, - 0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5, - 0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd, - 0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f); - - sBox[6] = new Array( - 0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f, - 0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de, - 0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43, - 0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19, - 0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2, - 0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516, - 0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88, - 0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816, - 0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756, - 0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a, - 0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264, - 0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688, - 0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28, - 0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3, - 0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7, - 0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06, - 0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033, - 0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a, - 0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566, - 0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509, - 0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962, - 0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e, - 0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c, - 0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c, - 0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285, - 0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301, - 0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be, - 0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767, - 0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647, - 0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914, - 0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c, - 0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3); - - sBox[7] = new Array( - 0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5, - 0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc, - 0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd, - 0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d, - 0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2, - 0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862, - 0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc, - 0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c, - 0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e, - 0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039, - 0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8, - 0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42, - 0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5, - 0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472, - 0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225, - 0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c, - 0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb, - 0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054, - 0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70, - 0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc, - 0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c, - 0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3, - 0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4, - 0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101, - 0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f, - 0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e, - 0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a, - 0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c, - 0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384, - 0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c, - 0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82, - 0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e); - -} -var util = require('../../util.js'); - -function cast5(key) { - this.cast5 = new openpgp_symenc_cast5(); - this.cast5.setKey(util.str2bin(key)); - - this.encrypt = function(block) { - return this.cast5.encrypt(block); - }; -} - -module.exports = cast5; -module.exports.blockSize = cast5.prototype.blockSize = 8; -module.exports.keySize = cast5.prototype.keySize = 16; - -},{"../../util.js":76}],22:[function(require,module,exports){ -//Paul Tero, July 2001 -//http://www.tero.co.uk/des/ -// -//Optimised for performance with large blocks by Michael Hayworth, November 2001 -//http://www.netdealing.com -// -// Modified by Recurity Labs GmbH - -//THIS SOFTWARE IS PROVIDED "AS IS" AND -//ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -//IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -//ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -//FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -//DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -//OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -//HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -//OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -//SUCH DAMAGE. - -//des -//this takes the key, the message, and whether to encrypt or decrypt - -/** - * @module crypto/cipher/des - */ - -'use strict'; - -function des(keys, message, encrypt, mode, iv, padding) { - //declaring this locally speeds things up a bit - var spfunction1 = new Array(0x1010400, 0, 0x10000, 0x1010404, 0x1010004, 0x10404, 0x4, 0x10000, 0x400, 0x1010400, - 0x1010404, 0x400, 0x1000404, 0x1010004, 0x1000000, 0x4, 0x404, 0x1000400, 0x1000400, 0x10400, 0x10400, 0x1010000, - 0x1010000, 0x1000404, 0x10004, 0x1000004, 0x1000004, 0x10004, 0, 0x404, 0x10404, 0x1000000, 0x10000, 0x1010404, 0x4, - 0x1010000, 0x1010400, 0x1000000, 0x1000000, 0x400, 0x1010004, 0x10000, 0x10400, 0x1000004, 0x400, 0x4, 0x1000404, - 0x10404, 0x1010404, 0x10004, 0x1010000, 0x1000404, 0x1000004, 0x404, 0x10404, 0x1010400, 0x404, 0x1000400, - 0x1000400, 0, 0x10004, 0x10400, 0, 0x1010004); - var spfunction2 = new Array(-0x7fef7fe0, -0x7fff8000, 0x8000, 0x108020, 0x100000, 0x20, -0x7fefffe0, -0x7fff7fe0, - - 0x7fffffe0, -0x7fef7fe0, -0x7fef8000, -0x80000000, -0x7fff8000, 0x100000, 0x20, -0x7fefffe0, 0x108000, 0x100020, - - 0x7fff7fe0, 0, -0x80000000, 0x8000, 0x108020, -0x7ff00000, 0x100020, -0x7fffffe0, 0, 0x108000, 0x8020, -0x7fef8000, - - 0x7ff00000, 0x8020, 0, 0x108020, -0x7fefffe0, 0x100000, -0x7fff7fe0, -0x7ff00000, -0x7fef8000, 0x8000, -0x7ff00000, - - 0x7fff8000, 0x20, -0x7fef7fe0, 0x108020, 0x20, 0x8000, -0x80000000, 0x8020, -0x7fef8000, 0x100000, -0x7fffffe0, - 0x100020, -0x7fff7fe0, -0x7fffffe0, 0x100020, 0x108000, 0, -0x7fff8000, 0x8020, -0x80000000, -0x7fefffe0, - - 0x7fef7fe0, 0x108000); - var spfunction3 = new Array(0x208, 0x8020200, 0, 0x8020008, 0x8000200, 0, 0x20208, 0x8000200, 0x20008, 0x8000008, - 0x8000008, 0x20000, 0x8020208, 0x20008, 0x8020000, 0x208, 0x8000000, 0x8, 0x8020200, 0x200, 0x20200, 0x8020000, - 0x8020008, 0x20208, 0x8000208, 0x20200, 0x20000, 0x8000208, 0x8, 0x8020208, 0x200, 0x8000000, 0x8020200, 0x8000000, - 0x20008, 0x208, 0x20000, 0x8020200, 0x8000200, 0, 0x200, 0x20008, 0x8020208, 0x8000200, 0x8000008, 0x200, 0, - 0x8020008, 0x8000208, 0x20000, 0x8000000, 0x8020208, 0x8, 0x20208, 0x20200, 0x8000008, 0x8020000, 0x8000208, 0x208, - 0x8020000, 0x20208, 0x8, 0x8020008, 0x20200); - var spfunction4 = new Array(0x802001, 0x2081, 0x2081, 0x80, 0x802080, 0x800081, 0x800001, 0x2001, 0, 0x802000, - 0x802000, 0x802081, 0x81, 0, 0x800080, 0x800001, 0x1, 0x2000, 0x800000, 0x802001, 0x80, 0x800000, 0x2001, 0x2080, - 0x800081, 0x1, 0x2080, 0x800080, 0x2000, 0x802080, 0x802081, 0x81, 0x800080, 0x800001, 0x802000, 0x802081, 0x81, 0, - 0, 0x802000, 0x2080, 0x800080, 0x800081, 0x1, 0x802001, 0x2081, 0x2081, 0x80, 0x802081, 0x81, 0x1, 0x2000, 0x800001, - 0x2001, 0x802080, 0x800081, 0x2001, 0x2080, 0x800000, 0x802001, 0x80, 0x800000, 0x2000, 0x802080); - var spfunction5 = new Array(0x100, 0x2080100, 0x2080000, 0x42000100, 0x80000, 0x100, 0x40000000, 0x2080000, - 0x40080100, 0x80000, 0x2000100, 0x40080100, 0x42000100, 0x42080000, 0x80100, 0x40000000, 0x2000000, 0x40080000, - 0x40080000, 0, 0x40000100, 0x42080100, 0x42080100, 0x2000100, 0x42080000, 0x40000100, 0, 0x42000000, 0x2080100, - 0x2000000, 0x42000000, 0x80100, 0x80000, 0x42000100, 0x100, 0x2000000, 0x40000000, 0x2080000, 0x42000100, - 0x40080100, 0x2000100, 0x40000000, 0x42080000, 0x2080100, 0x40080100, 0x100, 0x2000000, 0x42080000, 0x42080100, - 0x80100, 0x42000000, 0x42080100, 0x2080000, 0, 0x40080000, 0x42000000, 0x80100, 0x2000100, 0x40000100, 0x80000, 0, - 0x40080000, 0x2080100, 0x40000100); - var spfunction6 = new Array(0x20000010, 0x20400000, 0x4000, 0x20404010, 0x20400000, 0x10, 0x20404010, 0x400000, - 0x20004000, 0x404010, 0x400000, 0x20000010, 0x400010, 0x20004000, 0x20000000, 0x4010, 0, 0x400010, 0x20004010, - 0x4000, 0x404000, 0x20004010, 0x10, 0x20400010, 0x20400010, 0, 0x404010, 0x20404000, 0x4010, 0x404000, 0x20404000, - 0x20000000, 0x20004000, 0x10, 0x20400010, 0x404000, 0x20404010, 0x400000, 0x4010, 0x20000010, 0x400000, 0x20004000, - 0x20000000, 0x4010, 0x20000010, 0x20404010, 0x404000, 0x20400000, 0x404010, 0x20404000, 0, 0x20400010, 0x10, 0x4000, - 0x20400000, 0x404010, 0x4000, 0x400010, 0x20004010, 0, 0x20404000, 0x20000000, 0x400010, 0x20004010); - var spfunction7 = new Array(0x200000, 0x4200002, 0x4000802, 0, 0x800, 0x4000802, 0x200802, 0x4200800, 0x4200802, - 0x200000, 0, 0x4000002, 0x2, 0x4000000, 0x4200002, 0x802, 0x4000800, 0x200802, 0x200002, 0x4000800, 0x4000002, - 0x4200000, 0x4200800, 0x200002, 0x4200000, 0x800, 0x802, 0x4200802, 0x200800, 0x2, 0x4000000, 0x200800, 0x4000000, - 0x200800, 0x200000, 0x4000802, 0x4000802, 0x4200002, 0x4200002, 0x2, 0x200002, 0x4000000, 0x4000800, 0x200000, - 0x4200800, 0x802, 0x200802, 0x4200800, 0x802, 0x4000002, 0x4200802, 0x4200000, 0x200800, 0, 0x2, 0x4200802, 0, - 0x200802, 0x4200000, 0x800, 0x4000002, 0x4000800, 0x800, 0x200002); - var spfunction8 = new Array(0x10001040, 0x1000, 0x40000, 0x10041040, 0x10000000, 0x10001040, 0x40, 0x10000000, - 0x40040, 0x10040000, 0x10041040, 0x41000, 0x10041000, 0x41040, 0x1000, 0x40, 0x10040000, 0x10000040, 0x10001000, - 0x1040, 0x41000, 0x40040, 0x10040040, 0x10041000, 0x1040, 0, 0, 0x10040040, 0x10000040, 0x10001000, 0x41040, - 0x40000, 0x41040, 0x40000, 0x10041000, 0x1000, 0x40, 0x10040040, 0x1000, 0x41040, 0x10001000, 0x40, 0x10000040, - 0x10040000, 0x10040040, 0x10000000, 0x40000, 0x10001040, 0, 0x10041040, 0x40040, 0x10000040, 0x10040000, 0x10001000, - 0x10001040, 0, 0x10041040, 0x41000, 0x41000, 0x1040, 0x1040, 0x40040, 0x10000000, 0x10041000); - - //create the 16 or 48 subkeys we will need - var m = 0, - i, j, temp, temp2, right1, right2, left, right, looping; - var cbcleft, cbcleft2, cbcright, cbcright2; - var endloop, loopinc; - var len = message.length; - var chunk = 0; - //set up the loops for single and triple des - var iterations = keys.length == 32 ? 3 : 9; //single or triple des - if (iterations == 3) { - looping = encrypt ? new Array(0, 32, 2) : new Array(30, -2, -2); - } else { - looping = encrypt ? new Array(0, 32, 2, 62, 30, -2, 64, 96, 2) : new Array(94, 62, -2, 32, 64, 2, 30, -2, -2); - } - - //pad the message depending on the padding parameter - //only add padding if encrypting - note that you need to use the same padding option for both encrypt and decrypt - if (encrypt) { - message = des_addPadding(message, padding); - len = message.length; - } - - //store the result here - var result = ""; - var tempresult = ""; - - if (mode == 1) { //CBC mode - cbcleft = (iv.charCodeAt(m++) << 24) | (iv.charCodeAt(m++) << 16) | (iv.charCodeAt(m++) << 8) | iv.charCodeAt(m++); - cbcright = (iv.charCodeAt(m++) << 24) | (iv.charCodeAt(m++) << 16) | (iv.charCodeAt(m++) << 8) | iv.charCodeAt(m++); - m = 0; - } - - //loop through each 64 bit chunk of the message - while (m < len) { - left = (message.charCodeAt(m++) << 24) | (message.charCodeAt(m++) << 16) | (message.charCodeAt(m++) << 8) | message - .charCodeAt(m++); - right = (message.charCodeAt(m++) << 24) | (message.charCodeAt(m++) << 16) | (message.charCodeAt(m++) << 8) | - message.charCodeAt(m++); - - //for Cipher Block Chaining mode, xor the message with the previous result - if (mode == 1) { - if (encrypt) { - left ^= cbcleft; - right ^= cbcright; - } else { - cbcleft2 = cbcleft; - cbcright2 = cbcright; - cbcleft = left; - cbcright = right; - } - } - - //first each 64 but chunk of the message must be permuted according to IP - temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; - right ^= temp; - left ^= (temp << 4); - temp = ((left >>> 16) ^ right) & 0x0000ffff; - right ^= temp; - left ^= (temp << 16); - temp = ((right >>> 2) ^ left) & 0x33333333; - left ^= temp; - right ^= (temp << 2); - temp = ((right >>> 8) ^ left) & 0x00ff00ff; - left ^= temp; - right ^= (temp << 8); - temp = ((left >>> 1) ^ right) & 0x55555555; - right ^= temp; - left ^= (temp << 1); - - left = ((left << 1) | (left >>> 31)); - right = ((right << 1) | (right >>> 31)); - - //do this either 1 or 3 times for each chunk of the message - for (j = 0; j < iterations; j += 3) { - endloop = looping[j + 1]; - loopinc = looping[j + 2]; - //now go through and perform the encryption or decryption - for (i = looping[j]; i != endloop; i += loopinc) { //for efficiency - right1 = right ^ keys[i]; - right2 = ((right >>> 4) | (right << 28)) ^ keys[i + 1]; - //the result is attained by passing these bytes through the S selection functions - temp = left; - left = right; - right = temp ^ (spfunction2[(right1 >>> 24) & 0x3f] | spfunction4[(right1 >>> 16) & 0x3f] | spfunction6[(right1 >>> - 8) & 0x3f] | spfunction8[right1 & 0x3f] | spfunction1[(right2 >>> 24) & 0x3f] | spfunction3[(right2 >>> 16) & - 0x3f] | spfunction5[(right2 >>> 8) & 0x3f] | spfunction7[right2 & 0x3f]); - } - temp = left; - left = right; - right = temp; //unreverse left and right - } //for either 1 or 3 iterations - - //move then each one bit to the right - left = ((left >>> 1) | (left << 31)); - right = ((right >>> 1) | (right << 31)); - - //now perform IP-1, which is IP in the opposite direction - temp = ((left >>> 1) ^ right) & 0x55555555; - right ^= temp; - left ^= (temp << 1); - temp = ((right >>> 8) ^ left) & 0x00ff00ff; - left ^= temp; - right ^= (temp << 8); - temp = ((right >>> 2) ^ left) & 0x33333333; - left ^= temp; - right ^= (temp << 2); - temp = ((left >>> 16) ^ right) & 0x0000ffff; - right ^= temp; - left ^= (temp << 16); - temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; - right ^= temp; - left ^= (temp << 4); - - //for Cipher Block Chaining mode, xor the message with the previous result - if (mode == 1) { - if (encrypt) { - cbcleft = left; - cbcright = right; - } else { - left ^= cbcleft2; - right ^= cbcright2; - } - } - tempresult += String.fromCharCode((left >>> 24), ((left >>> 16) & 0xff), ((left >>> 8) & 0xff), (left & 0xff), ( - right >>> 24), ((right >>> 16) & 0xff), ((right >>> 8) & 0xff), (right & 0xff)); - - chunk += 8; - if (chunk == 512) { - result += tempresult; - tempresult = ""; - chunk = 0; - } - } //for every 8 characters, or 64 bits in the message - - //return the result as an array - result += tempresult; - - //only remove padding if decrypting - note that you need to use the same padding option for both encrypt and decrypt - if (!encrypt) { - result = des_removePadding(result, padding); - } - - return result; -} //end of des - - - -//des_createKeys -//this takes as input a 64 bit key (even though only 56 bits are used) -//as an array of 2 integers, and returns 16 48 bit keys - -function des_createKeys(key) { - //declaring this locally speeds things up a bit - var pc2bytes0 = new Array(0, 0x4, 0x20000000, 0x20000004, 0x10000, 0x10004, 0x20010000, 0x20010004, 0x200, 0x204, - 0x20000200, 0x20000204, 0x10200, 0x10204, 0x20010200, 0x20010204); - var pc2bytes1 = new Array(0, 0x1, 0x100000, 0x100001, 0x4000000, 0x4000001, 0x4100000, 0x4100001, 0x100, 0x101, 0x100100, - 0x100101, 0x4000100, 0x4000101, 0x4100100, 0x4100101); - var pc2bytes2 = new Array(0, 0x8, 0x800, 0x808, 0x1000000, 0x1000008, 0x1000800, 0x1000808, 0, 0x8, 0x800, 0x808, - 0x1000000, 0x1000008, 0x1000800, 0x1000808); - var pc2bytes3 = new Array(0, 0x200000, 0x8000000, 0x8200000, 0x2000, 0x202000, 0x8002000, 0x8202000, 0x20000, 0x220000, - 0x8020000, 0x8220000, 0x22000, 0x222000, 0x8022000, 0x8222000); - var pc2bytes4 = new Array(0, 0x40000, 0x10, 0x40010, 0, 0x40000, 0x10, 0x40010, 0x1000, 0x41000, 0x1010, 0x41010, 0x1000, - 0x41000, 0x1010, 0x41010); - var pc2bytes5 = new Array(0, 0x400, 0x20, 0x420, 0, 0x400, 0x20, 0x420, 0x2000000, 0x2000400, 0x2000020, 0x2000420, - 0x2000000, 0x2000400, 0x2000020, 0x2000420); - var pc2bytes6 = new Array(0, 0x10000000, 0x80000, 0x10080000, 0x2, 0x10000002, 0x80002, 0x10080002, 0, 0x10000000, - 0x80000, 0x10080000, 0x2, 0x10000002, 0x80002, 0x10080002); - var pc2bytes7 = new Array(0, 0x10000, 0x800, 0x10800, 0x20000000, 0x20010000, 0x20000800, 0x20010800, 0x20000, 0x30000, - 0x20800, 0x30800, 0x20020000, 0x20030000, 0x20020800, 0x20030800); - var pc2bytes8 = new Array(0, 0x40000, 0, 0x40000, 0x2, 0x40002, 0x2, 0x40002, 0x2000000, 0x2040000, 0x2000000, 0x2040000, - 0x2000002, 0x2040002, 0x2000002, 0x2040002); - var pc2bytes9 = new Array(0, 0x10000000, 0x8, 0x10000008, 0, 0x10000000, 0x8, 0x10000008, 0x400, 0x10000400, 0x408, - 0x10000408, 0x400, 0x10000400, 0x408, 0x10000408); - var pc2bytes10 = new Array(0, 0x20, 0, 0x20, 0x100000, 0x100020, 0x100000, 0x100020, 0x2000, 0x2020, 0x2000, 0x2020, - 0x102000, 0x102020, 0x102000, 0x102020); - var pc2bytes11 = new Array(0, 0x1000000, 0x200, 0x1000200, 0x200000, 0x1200000, 0x200200, 0x1200200, 0x4000000, 0x5000000, - 0x4000200, 0x5000200, 0x4200000, 0x5200000, 0x4200200, 0x5200200); - var pc2bytes12 = new Array(0, 0x1000, 0x8000000, 0x8001000, 0x80000, 0x81000, 0x8080000, 0x8081000, 0x10, 0x1010, - 0x8000010, 0x8001010, 0x80010, 0x81010, 0x8080010, 0x8081010); - var pc2bytes13 = new Array(0, 0x4, 0x100, 0x104, 0, 0x4, 0x100, 0x104, 0x1, 0x5, 0x101, 0x105, 0x1, 0x5, 0x101, 0x105); - - //how many iterations (1 for des, 3 for triple des) - var iterations = key.length > 8 ? 3 : 1; //changed by Paul 16/6/2007 to use Triple DES for 9+ byte keys - //stores the return keys - var keys = new Array(32 * iterations); - //now define the left shifts which need to be done - var shifts = new Array(0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0); - //other variables - var lefttemp, righttemp, m = 0, - n = 0, - temp; - - for (var j = 0; j < iterations; j++) { //either 1 or 3 iterations - var left = (key.charCodeAt(m++) << 24) | (key.charCodeAt(m++) << 16) | (key.charCodeAt(m++) << 8) | key.charCodeAt(m++); - var right = (key.charCodeAt(m++) << 24) | (key.charCodeAt(m++) << 16) | (key.charCodeAt(m++) << 8) | key.charCodeAt(m++); - - temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; - right ^= temp; - left ^= (temp << 4); - temp = ((right >>> -16) ^ left) & 0x0000ffff; - left ^= temp; - right ^= (temp << -16); - temp = ((left >>> 2) ^ right) & 0x33333333; - right ^= temp; - left ^= (temp << 2); - temp = ((right >>> -16) ^ left) & 0x0000ffff; - left ^= temp; - right ^= (temp << -16); - temp = ((left >>> 1) ^ right) & 0x55555555; - right ^= temp; - left ^= (temp << 1); - temp = ((right >>> 8) ^ left) & 0x00ff00ff; - left ^= temp; - right ^= (temp << 8); - temp = ((left >>> 1) ^ right) & 0x55555555; - right ^= temp; - left ^= (temp << 1); - - //the right side needs to be shifted and to get the last four bits of the left side - temp = (left << 8) | ((right >>> 20) & 0x000000f0); - //left needs to be put upside down - left = (right << 24) | ((right << 8) & 0xff0000) | ((right >>> 8) & 0xff00) | ((right >>> 24) & 0xf0); - right = temp; - - //now go through and perform these shifts on the left and right keys - for (var i = 0; i < shifts.length; i++) { - //shift the keys either one or two bits to the left - if (shifts[i]) { - left = (left << 2) | (left >>> 26); - right = (right << 2) | (right >>> 26); - } else { - left = (left << 1) | (left >>> 27); - right = (right << 1) | (right >>> 27); - } - left &= -0xf; - right &= -0xf; - - //now apply PC-2, in such a way that E is easier when encrypting or decrypting - //this conversion will look like PC-2 except only the last 6 bits of each byte are used - //rather than 48 consecutive bits and the order of lines will be according to - //how the S selection functions will be applied: S2, S4, S6, S8, S1, S3, S5, S7 - lefttemp = pc2bytes0[left >>> 28] | pc2bytes1[(left >>> 24) & 0xf] | pc2bytes2[(left >>> 20) & 0xf] | pc2bytes3[( - left >>> 16) & 0xf] | pc2bytes4[(left >>> 12) & 0xf] | pc2bytes5[(left >>> 8) & 0xf] | pc2bytes6[(left >>> 4) & - 0xf]; - righttemp = pc2bytes7[right >>> 28] | pc2bytes8[(right >>> 24) & 0xf] | pc2bytes9[(right >>> 20) & 0xf] | - pc2bytes10[(right >>> 16) & 0xf] | pc2bytes11[(right >>> 12) & 0xf] | pc2bytes12[(right >>> 8) & 0xf] | - pc2bytes13[(right >>> 4) & 0xf]; - temp = ((righttemp >>> 16) ^ lefttemp) & 0x0000ffff; - keys[n++] = lefttemp ^ temp; - keys[n++] = righttemp ^ (temp << 16); - } - } //for each iterations - //return the keys we've created - return keys; -} //end of des_createKeys - - -function des_addPadding(message, padding) { - var padLength = 8 - (message.length % 8); - if ((padding == 2) && (padLength < 8)) { //pad the message with spaces - message += " ".substr(0, padLength); - } else if (padding == 1) { //PKCS7 padding - message += String.fromCharCode(padLength, padLength, padLength, padLength, padLength, padLength, padLength, - padLength).substr(0, padLength); - } else if (!padding && (padLength < 8)) { //pad the message out with null bytes - message += "\0\0\0\0\0\0\0\0".substr(0, padLength); - } - return message; -} - -function des_removePadding(message, padding) { - if (padding == 2) { // space padded - message = message.replace(/ *$/g, ""); - } else if (padding == 1) { // PKCS7 - var padCount = message.charCodeAt(message.length - 1); - message = message.substr(0, message.length - padCount); - } else if (!padding) { // null padding - message = message.replace(/\0*$/g, ""); - } - return message; -} - - -var util = require('../../util.js'); - -// added by Recurity Labs - -function Des(key) { - this.key = []; - - for (var i = 0; i < 3; i++) { - this.key.push(key.substr(i * 8, 8)); - } - - this.encrypt = function(block) { - return util.str2bin(des(des_createKeys(this.key[2]), - des(des_createKeys(this.key[1]), - des(des_createKeys(this.key[0]), - util.bin2str(block), true, 0, null, null), - false, 0, null, null), true, 0, null, null)); - }; -} - -Des.keySize = Des.prototype.keySize = 24; -Des.blockSize = Des.prototype.blockSize = 8; - -// This is "original" DES - Des is actually Triple DES. -// This is only exported so we can unit test. - -function OriginalDes(key) { - this.key = key; - - this.encrypt = function(block, padding) { - var keys = des_createKeys(this.key); - return util.str2bin(des(keys, util.bin2str(block), true, 0, null, padding)); - }; - - this.decrypt = function(block, padding) { - var keys = des_createKeys(this.key); - return util.str2bin(des(keys, util.bin2str(block), false, 0, null, padding)); - }; -} - -module.exports = { - /** @static */ - des: Des, - /** @static */ - originalDes: OriginalDes -}; - -},{"../../util.js":76}],23:[function(require,module,exports){ -/** - * @requires crypto/cipher/aes - * @requires crypto/cipher/blowfish - * @requires crypto/cipher/cast5 - * @requires crypto/cipher/twofish - * @module crypto/cipher - */ - -var desModule = require('./des.js'); - -module.exports = { - /** @see module:crypto/cipher/des.originalDes */ - des: desModule.originalDes, - /** @see module:crypto/cipher/des.des */ - tripledes: desModule.des, - /** @see module:crypto/cipher/cast5 */ - cast5: require('./cast5.js'), - /** @see module:crypto/cipher/twofish */ - twofish: require('./twofish.js'), - /** @see module:crypto/cipher/blowfish */ - blowfish: require('./blowfish.js'), - /** Not implemented */ - idea: function() { - throw new Error('IDEA symmetric-key algorithm not implemented'); - } -}; - -var aes = require('./aes.js'); - -for (var i in aes) { - module.exports['aes' + i] = aes[i]; -} - -},{"./aes.js":19,"./blowfish.js":20,"./cast5.js":21,"./des.js":22,"./twofish.js":24}],24:[function(require,module,exports){ -/* Modified by Recurity Labs GmbH - * - * Cipher.js - * A block-cipher algorithm implementation on JavaScript - * See Cipher.readme.txt for further information. - * - * Copyright(c) 2009 Atsushi Oka [ http://oka.nu/ ] - * This script file is distributed under the LGPL - * - * ACKNOWLEDGMENT - * - * The main subroutines are written by Michiel van Everdingen. - * - * Michiel van Everdingen - * http://home.versatel.nl/MAvanEverdingen/index.html - * - * All rights for these routines are reserved to Michiel van Everdingen. - * - */ - -/** - * @module crypto/cipher/twofish - */ - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//Math -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -var MAXINT = 0xFFFFFFFF; - -function rotw(w, n) { - return (w << n | w >>> (32 - n)) & MAXINT; -} - -function getW(a, i) { - return a[i] | a[i + 1] << 8 | a[i + 2] << 16 | a[i + 3] << 24; -} - -function setW(a, i, w) { - a.splice(i, 4, w & 0xFF, (w >>> 8) & 0xFF, (w >>> 16) & 0xFF, (w >>> 24) & 0xFF); -} - -function setWInv(a, i, w) { - a.splice(i, 4, (w >>> 24) & 0xFF, (w >>> 16) & 0xFF, (w >>> 8) & 0xFF, w & 0xFF); -} - -function getB(x, n) { - return (x >>> (n * 8)) & 0xFF; -} - -// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Twofish -// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -function createTwofish() { - // - var keyBytes = null; - var dataBytes = null; - var dataOffset = -1; - // var dataLength = -1; - var algorithmName = null; - // var idx2 = -1; - // - - algorithmName = "twofish"; - - var tfsKey = []; - var tfsM = [ - [], - [], - [], - [] - ]; - - function tfsInit(key) { - keyBytes = key; - var i, a, b, c, d, meKey = [], - moKey = [], - inKey = []; - var kLen; - var sKey = []; - var f01, f5b, fef; - - var q0 = [ - [8, 1, 7, 13, 6, 15, 3, 2, 0, 11, 5, 9, 14, 12, 10, 4], - [2, 8, 11, 13, 15, 7, 6, 14, 3, 1, 9, 4, 0, 10, 12, 5] - ]; - var q1 = [ - [14, 12, 11, 8, 1, 2, 3, 5, 15, 4, 10, 6, 7, 0, 9, 13], - [1, 14, 2, 11, 4, 12, 3, 7, 6, 13, 10, 5, 15, 9, 0, 8] - ]; - var q2 = [ - [11, 10, 5, 14, 6, 13, 9, 0, 12, 8, 15, 3, 2, 4, 7, 1], - [4, 12, 7, 5, 1, 6, 9, 10, 0, 14, 13, 8, 2, 11, 3, 15] - ]; - var q3 = [ - [13, 7, 15, 4, 1, 2, 6, 14, 9, 11, 3, 0, 8, 5, 12, 10], - [11, 9, 5, 1, 12, 3, 13, 14, 6, 4, 7, 15, 2, 0, 8, 10] - ]; - var ror4 = [0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15]; - var ashx = [0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 5, 14, 7]; - var q = [ - [], - [] - ]; - var m = [ - [], - [], - [], - [] - ]; - - function ffm5b(x) { - return x ^ (x >> 2) ^ [0, 90, 180, 238][x & 3]; - } - - function ffmEf(x) { - return x ^ (x >> 1) ^ (x >> 2) ^ [0, 238, 180, 90][x & 3]; - } - - function mdsRem(p, q) { - var i, t, u; - for (i = 0; i < 8; i++) { - t = q >>> 24; - q = ((q << 8) & MAXINT) | p >>> 24; - p = (p << 8) & MAXINT; - u = t << 1; - if (t & 128) { - u ^= 333; - } - q ^= t ^ (u << 16); - u ^= t >>> 1; - if (t & 1) { - u ^= 166; - } - q ^= u << 24 | u << 8; - } - return q; - } - - function qp(n, x) { - var a, b, c, d; - a = x >> 4; - b = x & 15; - c = q0[n][a ^ b]; - d = q1[n][ror4[b] ^ ashx[a]]; - return q3[n][ror4[d] ^ ashx[c]] << 4 | q2[n][c ^ d]; - } - - function hFun(x, key) { - var a = getB(x, 0), - b = getB(x, 1), - c = getB(x, 2), - d = getB(x, 3); - switch (kLen) { - case 4: - a = q[1][a] ^ getB(key[3], 0); - b = q[0][b] ^ getB(key[3], 1); - c = q[0][c] ^ getB(key[3], 2); - d = q[1][d] ^ getB(key[3], 3); - case 3: - a = q[1][a] ^ getB(key[2], 0); - b = q[1][b] ^ getB(key[2], 1); - c = q[0][c] ^ getB(key[2], 2); - d = q[0][d] ^ getB(key[2], 3); - case 2: - a = q[0][q[0][a] ^ getB(key[1], 0)] ^ getB(key[0], 0); - b = q[0][q[1][b] ^ getB(key[1], 1)] ^ getB(key[0], 1); - c = q[1][q[0][c] ^ getB(key[1], 2)] ^ getB(key[0], 2); - d = q[1][q[1][d] ^ getB(key[1], 3)] ^ getB(key[0], 3); - } - return m[0][a] ^ m[1][b] ^ m[2][c] ^ m[3][d]; - } - - keyBytes = keyBytes.slice(0, 32); - i = keyBytes.length; - while (i != 16 && i != 24 && i != 32) - keyBytes[i++] = 0; - - for (i = 0; i < keyBytes.length; i += 4) { - inKey[i >> 2] = getW(keyBytes, i); - } - for (i = 0; i < 256; i++) { - q[0][i] = qp(0, i); - q[1][i] = qp(1, i); - } - for (i = 0; i < 256; i++) { - f01 = q[1][i]; - f5b = ffm5b(f01); - fef = ffmEf(f01); - m[0][i] = f01 + (f5b << 8) + (fef << 16) + (fef << 24); - m[2][i] = f5b + (fef << 8) + (f01 << 16) + (fef << 24); - f01 = q[0][i]; - f5b = ffm5b(f01); - fef = ffmEf(f01); - m[1][i] = fef + (fef << 8) + (f5b << 16) + (f01 << 24); - m[3][i] = f5b + (f01 << 8) + (fef << 16) + (f5b << 24); - } - - kLen = inKey.length / 2; - for (i = 0; i < kLen; i++) { - a = inKey[i + i]; - meKey[i] = a; - b = inKey[i + i + 1]; - moKey[i] = b; - sKey[kLen - i - 1] = mdsRem(a, b); - } - for (i = 0; i < 40; i += 2) { - a = 0x1010101 * i; - b = a + 0x1010101; - a = hFun(a, meKey); - b = rotw(hFun(b, moKey), 8); - tfsKey[i] = (a + b) & MAXINT; - tfsKey[i + 1] = rotw(a + 2 * b, 9); - } - for (i = 0; i < 256; i++) { - a = b = c = d = i; - switch (kLen) { - case 4: - a = q[1][a] ^ getB(sKey[3], 0); - b = q[0][b] ^ getB(sKey[3], 1); - c = q[0][c] ^ getB(sKey[3], 2); - d = q[1][d] ^ getB(sKey[3], 3); - case 3: - a = q[1][a] ^ getB(sKey[2], 0); - b = q[1][b] ^ getB(sKey[2], 1); - c = q[0][c] ^ getB(sKey[2], 2); - d = q[0][d] ^ getB(sKey[2], 3); - case 2: - tfsM[0][i] = m[0][q[0][q[0][a] ^ getB(sKey[1], 0)] ^ getB(sKey[0], 0)]; - tfsM[1][i] = m[1][q[0][q[1][b] ^ getB(sKey[1], 1)] ^ getB(sKey[0], 1)]; - tfsM[2][i] = m[2][q[1][q[0][c] ^ getB(sKey[1], 2)] ^ getB(sKey[0], 2)]; - tfsM[3][i] = m[3][q[1][q[1][d] ^ getB(sKey[1], 3)] ^ getB(sKey[0], 3)]; - } - } - } - - function tfsG0(x) { - return tfsM[0][getB(x, 0)] ^ tfsM[1][getB(x, 1)] ^ tfsM[2][getB(x, 2)] ^ tfsM[3][getB(x, 3)]; - } - - function tfsG1(x) { - return tfsM[0][getB(x, 3)] ^ tfsM[1][getB(x, 0)] ^ tfsM[2][getB(x, 1)] ^ tfsM[3][getB(x, 2)]; - } - - function tfsFrnd(r, blk) { - var a = tfsG0(blk[0]); - var b = tfsG1(blk[1]); - blk[2] = rotw(blk[2] ^ (a + b + tfsKey[4 * r + 8]) & MAXINT, 31); - blk[3] = rotw(blk[3], 1) ^ (a + 2 * b + tfsKey[4 * r + 9]) & MAXINT; - a = tfsG0(blk[2]); - b = tfsG1(blk[3]); - blk[0] = rotw(blk[0] ^ (a + b + tfsKey[4 * r + 10]) & MAXINT, 31); - blk[1] = rotw(blk[1], 1) ^ (a + 2 * b + tfsKey[4 * r + 11]) & MAXINT; - } - - function tfsIrnd(i, blk) { - var a = tfsG0(blk[0]); - var b = tfsG1(blk[1]); - blk[2] = rotw(blk[2], 1) ^ (a + b + tfsKey[4 * i + 10]) & MAXINT; - blk[3] = rotw(blk[3] ^ (a + 2 * b + tfsKey[4 * i + 11]) & MAXINT, 31); - a = tfsG0(blk[2]); - b = tfsG1(blk[3]); - blk[0] = rotw(blk[0], 1) ^ (a + b + tfsKey[4 * i + 8]) & MAXINT; - blk[1] = rotw(blk[1] ^ (a + 2 * b + tfsKey[4 * i + 9]) & MAXINT, 31); - } - - function tfsClose() { - tfsKey = []; - tfsM = [ - [], - [], - [], - [] - ]; - } - - function tfsEncrypt(data, offset) { - dataBytes = data; - dataOffset = offset; - var blk = [getW(dataBytes, dataOffset) ^ tfsKey[0], - getW(dataBytes, dataOffset + 4) ^ tfsKey[1], - getW(dataBytes, dataOffset + 8) ^ tfsKey[2], - getW(dataBytes, dataOffset + 12) ^ tfsKey[3] - ]; - for (var j = 0; j < 8; j++) { - tfsFrnd(j, blk); - } - setW(dataBytes, dataOffset, blk[2] ^ tfsKey[4]); - setW(dataBytes, dataOffset + 4, blk[3] ^ tfsKey[5]); - setW(dataBytes, dataOffset + 8, blk[0] ^ tfsKey[6]); - setW(dataBytes, dataOffset + 12, blk[1] ^ tfsKey[7]); - dataOffset += 16; - return dataBytes; - } - - function tfsDecrypt(data, offset) { - dataBytes = data; - dataOffset = offset; - var blk = [getW(dataBytes, dataOffset) ^ tfsKey[4], - getW(dataBytes, dataOffset + 4) ^ tfsKey[5], - getW(dataBytes, dataOffset + 8) ^ tfsKey[6], - getW(dataBytes, dataOffset + 12) ^ tfsKey[7] - ]; - for (var j = 7; j >= 0; j--) { - tfsIrnd(j, blk); - } - setW(dataBytes, dataOffset, blk[2] ^ tfsKey[0]); - setW(dataBytes, dataOffset + 4, blk[3] ^ tfsKey[1]); - setW(dataBytes, dataOffset + 8, blk[0] ^ tfsKey[2]); - setW(dataBytes, dataOffset + 12, blk[1] ^ tfsKey[3]); - dataOffset += 16; - } - - // added by Recurity Labs - - function tfsFinal() { - return dataBytes; - } - - return { - name: "twofish", - blocksize: 128 / 8, - open: tfsInit, - close: tfsClose, - encrypt: tfsEncrypt, - decrypt: tfsDecrypt, - // added by Recurity Labs - finalize: tfsFinal - }; -} - -var util = require('../../util.js'); - -// added by Recurity Labs - -function TFencrypt(block, key) { - var block_copy = toArray(block); - var tf = createTwofish(); - tf.open(util.str2bin(key), 0); - var result = tf.encrypt(block_copy, 0); - tf.close(); - return result; -} - -function TF(key) { - this.tf = createTwofish(); - this.tf.open(util.str2bin(key), 0); - - this.encrypt = function(block) { - return this.tf.encrypt(toArray(block), 0); - }; -} - -function toArray(typedArray) { - // Array.apply([], typedArray) does not work in PhantomJS 1.9 - var result = []; - for (var i = 0; i < typedArray.length; i++) { - result[i] = typedArray[i]; - } - return result; -} - - -module.exports = TF; -module.exports.keySize = TF.prototype.keySize = 32; -module.exports.blockSize = TF.prototype.blockSize = 16; - -},{"../../util.js":76}],25:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -// The GPG4Browsers crypto interface - -/** - * @requires crypto/cipher - * @requires crypto/public_key - * @requires crypto/random - * @requires type/mpi - * @module crypto/crypto - */ - -var random = require('./random.js'), - cipher = require('./cipher'), - publicKey = require('./public_key'), - type_mpi = require('../type/mpi.js'); - -module.exports = { - /** - * Encrypts data using the specified public key multiprecision integers - * and the specified algorithm. - * @param {module:enums.publicKey} algo Algorithm to be used (See {@link http://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1}) - * @param {Array} publicMPIs Algorithm dependent multiprecision integers - * @param {module:type/mpi} data Data to be encrypted as MPI - * @return {Array} if RSA an module:type/mpi; - * if elgamal encryption an array of two module:type/mpi is returned; otherwise null - */ - publicKeyEncrypt: function(algo, publicMPIs, data) { - var result = (function() { - var m; - switch (algo) { - case 'rsa_encrypt': - case 'rsa_encrypt_sign': - var rsa = new publicKey.rsa(); - var n = publicMPIs[0].toBigInteger(); - var e = publicMPIs[1].toBigInteger(); - m = data.toBigInteger(); - return [rsa.encrypt(m, e, n)]; - - case 'elgamal': - var elgamal = new publicKey.elgamal(); - var p = publicMPIs[0].toBigInteger(); - var g = publicMPIs[1].toBigInteger(); - var y = publicMPIs[2].toBigInteger(); - m = data.toBigInteger(); - return elgamal.encrypt(m, g, p, y); - - default: - return []; - } - })(); - - return result.map(function(bn) { - var mpi = new type_mpi(); - mpi.fromBigInteger(bn); - return mpi; - }); - }, - - /** - * Decrypts data using the specified public key multiprecision integers of the private key, - * the specified secretMPIs of the private key and the specified algorithm. - * @param {module:enums.publicKey} algo Algorithm to be used (See {@link http://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1}) - * @param {Array} publicMPIs Algorithm dependent multiprecision integers - * of the public key part of the private key - * @param {Array} secretMPIs Algorithm dependent multiprecision integers - * of the private key used - * @param {module:type/mpi} data Data to be encrypted as MPI - * @return {module:type/mpi} returns a big integer containing the decrypted data; otherwise null - */ - - publicKeyDecrypt: function(algo, keyIntegers, dataIntegers) { - var p; - - var bn = (function() { - switch (algo) { - case 'rsa_encrypt_sign': - case 'rsa_encrypt': - var rsa = new publicKey.rsa(); - // 0 and 1 are the public key. - var n = keyIntegers[0].toBigInteger(); - var e = keyIntegers[1].toBigInteger(); - // 2 to 5 are the private key. - var d = keyIntegers[2].toBigInteger(); - p = keyIntegers[3].toBigInteger(); - var q = keyIntegers[4].toBigInteger(); - var u = keyIntegers[5].toBigInteger(); - var m = dataIntegers[0].toBigInteger(); - return rsa.decrypt(m, n, e, d, p, q, u); - case 'elgamal': - var elgamal = new publicKey.elgamal(); - var x = keyIntegers[3].toBigInteger(); - var c1 = dataIntegers[0].toBigInteger(); - var c2 = dataIntegers[1].toBigInteger(); - p = keyIntegers[0].toBigInteger(); - return elgamal.decrypt(c1, c2, p, x); - default: - return null; - } - })(); - - var result = new type_mpi(); - result.fromBigInteger(bn); - return result; - }, - - /** Returns the number of integers comprising the private key of an algorithm - * @param {String} algo The public key algorithm - * @return {Integer} The number of integers. - */ - getPrivateMpiCount: function(algo) { - switch (algo) { - case 'rsa_encrypt': - case 'rsa_encrypt_sign': - case 'rsa_sign': - // Algorithm-Specific Fields for RSA secret keys: - // - multiprecision integer (MPI) of RSA secret exponent d. - // - MPI of RSA secret prime value p. - // - MPI of RSA secret prime value q (p < q). - // - MPI of u, the multiplicative inverse of p, mod q. - return 4; - case 'elgamal': - // Algorithm-Specific Fields for Elgamal secret keys: - // - MPI of Elgamal secret exponent x. - return 1; - case 'dsa': - // Algorithm-Specific Fields for DSA secret keys: - // - MPI of DSA secret exponent x. - return 1; - default: - throw new Error('Unknown algorithm'); - } - }, - - getPublicMpiCount: function(algo) { - // - A series of multiprecision integers comprising the key material: - // Algorithm-Specific Fields for RSA public keys: - // - a multiprecision integer (MPI) of RSA public modulus n; - // - an MPI of RSA public encryption exponent e. - switch (algo) { - case 'rsa_encrypt': - case 'rsa_encrypt_sign': - case 'rsa_sign': - return 2; - - // Algorithm-Specific Fields for Elgamal public keys: - // - MPI of Elgamal prime p; - // - MPI of Elgamal group generator g; - // - MPI of Elgamal public key value y (= g**x mod p where x is secret). - case 'elgamal': - return 3; - - // Algorithm-Specific Fields for DSA public keys: - // - MPI of DSA prime p; - // - MPI of DSA group order q (q is a prime divisor of p-1); - // - MPI of DSA group generator g; - // - MPI of DSA public-key value y (= g**x mod p where x is secret). - case 'dsa': - return 4; - - default: - throw new Error('Unknown algorithm.'); - } - }, - - generateMpi: function(algo, bits) { - switch (algo) { - case 'rsa_encrypt': - case 'rsa_encrypt_sign': - case 'rsa_sign': - //remember "publicKey" refers to the crypto/public_key dir - var rsa = new publicKey.rsa(); - return rsa.generate(bits, "10001").then(function(keyObject) { - var output = []; - output.push(keyObject.n); - output.push(keyObject.ee); - output.push(keyObject.d); - output.push(keyObject.p); - output.push(keyObject.q); - output.push(keyObject.u); - return mapResult(output); - }); - default: - throw new Error('Unsupported algorithm for key generation.'); - } - - function mapResult(result) { - return result.map(function(bn) { - var mpi = new type_mpi(); - mpi.fromBigInteger(bn); - return mpi; - }); - } - }, - - - /** - * generate random byte prefix as string for the specified algorithm - * @param {module:enums.symmetric} algo Algorithm to use (see {@link http://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2}) - * @return {String} Random bytes with length equal to the block - * size of the cipher - */ - getPrefixRandom: function(algo) { - return random.getRandomBytes(cipher[algo].blockSize); - }, - - /** - * Generating a session key for the specified symmetric algorithm - * @param {module:enums.symmetric} algo Algorithm to use (see {@link http://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2}) - * @return {String} Random bytes as a string to be used as a key - */ - generateSessionKey: function(algo) { - return random.getRandomBytes(cipher[algo].keySize); - } -}; - -},{"../type/mpi.js":74,"./cipher":23,"./public_key":36,"./random.js":39}],26:[function(require,module,exports){ -/** - * Secure Hash Algorithm with 256-bit digest (SHA-256) implementation. - * - * See FIPS 180-2 for details. - * - * This implementation is currently limited to message lengths (in bytes) that - * are up to 32-bits in size. - * - * @author Dave Longley - * - * Copyright (c) 2010-2012 Digital Bazaar, Inc. - */ - -var sha256 = module.exports = {}; -var util = require('./forge_util.js'); - -// sha-256 padding bytes not initialized yet -var _padding = null; -var _initialized = false; - -// table of constants -var _k = null; - -/** - * Initializes the constant tables. - */ -var _init = function() { - // create padding - _padding = String.fromCharCode(128); - _padding += util.fillString(String.fromCharCode(0x00), 64); - - // create K table for SHA-256 - _k = [ - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, - 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, - 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, - 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, - 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, - 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 - ]; - - // now initialized - _initialized = true; -}; - -/** - * Updates a SHA-256 state with the given byte buffer. - * - * @param s the SHA-256 state to update. - * @param w the array to use to store words. - * @param bytes the byte buffer to update with. - */ -var _update = function(s, w, bytes) { - // consume 512 bit (64 byte) chunks - var t1, t2, s0, s1, ch, maj, i, a, b, c, d, e, f, g, h; - var len = bytes.length(); - while (len >= 64) { - // the w array will be populated with sixteen 32-bit big-endian words - // and then extended into 64 32-bit words according to SHA-256 - for (i = 0; i < 16; ++i) { - w[i] = bytes.getInt32(); - } - for (; i < 64; ++i) { - // XOR word 2 words ago rot right 17, rot right 19, shft right 10 - t1 = w[i - 2]; - t1 = - ((t1 >>> 17) | (t1 << 15)) ^ - ((t1 >>> 19) | (t1 << 13)) ^ - (t1 >>> 10); - // XOR word 15 words ago rot right 7, rot right 18, shft right 3 - t2 = w[i - 15]; - t2 = - ((t2 >>> 7) | (t2 << 25)) ^ - ((t2 >>> 18) | (t2 << 14)) ^ - (t2 >>> 3); - // sum(t1, word 7 ago, t2, word 16 ago) modulo 2^32 - w[i] = (t1 + w[i - 7] + t2 + w[i - 16]) & 0xFFFFFFFF; - } - - // initialize hash value for this chunk - a = s.h0; - b = s.h1; - c = s.h2; - d = s.h3; - e = s.h4; - f = s.h5; - g = s.h6; - h = s.h7; - - // round function - for (i = 0; i < 64; ++i) { - // Sum1(e) - s1 = - ((e >>> 6) | (e << 26)) ^ - ((e >>> 11) | (e << 21)) ^ - ((e >>> 25) | (e << 7)); - // Ch(e, f, g) (optimized the same way as SHA-1) - ch = g ^ (e & (f ^ g)); - // Sum0(a) - s0 = - ((a >>> 2) | (a << 30)) ^ - ((a >>> 13) | (a << 19)) ^ - ((a >>> 22) | (a << 10)); - // Maj(a, b, c) (optimized the same way as SHA-1) - maj = (a & b) | (c & (a ^ b)); - - // main algorithm - t1 = h + s1 + ch + _k[i] + w[i]; - t2 = s0 + maj; - h = g; - g = f; - f = e; - e = (d + t1) & 0xFFFFFFFF; - d = c; - c = b; - b = a; - a = (t1 + t2) & 0xFFFFFFFF; - } - - // update hash state - s.h0 = (s.h0 + a) & 0xFFFFFFFF; - s.h1 = (s.h1 + b) & 0xFFFFFFFF; - s.h2 = (s.h2 + c) & 0xFFFFFFFF; - s.h3 = (s.h3 + d) & 0xFFFFFFFF; - s.h4 = (s.h4 + e) & 0xFFFFFFFF; - s.h5 = (s.h5 + f) & 0xFFFFFFFF; - s.h6 = (s.h6 + g) & 0xFFFFFFFF; - s.h7 = (s.h7 + h) & 0xFFFFFFFF; - len -= 64; - } -}; - -/** - * Creates a SHA-256 message digest object. - * - * @return a message digest object. - */ -sha256.create = function() { - // do initialization as necessary - if (!_initialized) { - _init(); - } - - // SHA-256 state contains eight 32-bit integers - var _state = null; - - // input buffer - var _input = util.createBuffer(); - - // used for word storage - var _w = new Array(64); - - // message digest object - var md = { - algorithm: 'sha256', - blockLength: 64, - digestLength: 32, - // length of message so far (does not including padding) - messageLength: 0 - }; - - /** - * Starts the digest. - * - * @return this digest object. - */ - md.start = function() { - md.messageLength = 0; - _input = util.createBuffer(); - _state = { - h0: 0x6A09E667, - h1: 0xBB67AE85, - h2: 0x3C6EF372, - h3: 0xA54FF53A, - h4: 0x510E527F, - h5: 0x9B05688C, - h6: 0x1F83D9AB, - h7: 0x5BE0CD19 - }; - return md; - }; - // start digest automatically for first time - md.start(); - - /** - * Updates the digest with the given message input. The given input can - * treated as raw input (no encoding will be applied) or an encoding of - * 'utf8' maybe given to encode the input using UTF-8. - * - * @param msg the message input to update with. - * @param encoding the encoding to use (default: 'raw', other: 'utf8'). - * - * @return this digest object. - */ - md.update = function(msg, encoding) { - if (encoding === 'utf8') { - msg = util.encodeUtf8(msg); - } - - // update message length - md.messageLength += msg.length; - - // add bytes to input buffer - _input.putBytes(msg); - - // process bytes - _update(_state, _w, _input); - - // compact input buffer every 2K or if empty - if (_input.read > 2048 || _input.length() === 0) { - _input.compact(); - } - - return md; - }; - - /** - * Produces the digest. - * - * @return a byte buffer containing the digest value. - */ - md.digest = function() { - /* Note: Here we copy the remaining bytes in the input buffer and - add the appropriate SHA-256 padding. Then we do the final update - on a copy of the state so that if the user wants to get - intermediate digests they can do so. */ - - /* Determine the number of bytes that must be added to the message - to ensure its length is congruent to 448 mod 512. In other words, - a 64-bit integer that gives the length of the message will be - appended to the message and whatever the length of the message is - plus 64 bits must be a multiple of 512. So the length of the - message must be congruent to 448 mod 512 because 512 - 64 = 448. - - In order to fill up the message length it must be filled with - padding that begins with 1 bit followed by all 0 bits. Padding - must *always* be present, so if the message length is already - congruent to 448 mod 512, then 512 padding bits must be added. */ - - // 512 bits == 64 bytes, 448 bits == 56 bytes, 64 bits = 8 bytes - // _padding starts with 1 byte with first bit is set in it which - // is byte value 128, then there may be up to 63 other pad bytes - var len = md.messageLength; - var padBytes = util.createBuffer(); - padBytes.putBytes(_input.bytes()); - padBytes.putBytes(_padding.substr(0, 64 - ((len + 8) % 64))); - - /* Now append length of the message. The length is appended in bits - as a 64-bit number in big-endian order. Since we store the length - in bytes, we must multiply it by 8 (or left shift by 3). So here - store the high 3 bits in the low end of the first 32-bits of the - 64-bit number and the lower 5 bits in the high end of the second - 32-bits. */ - padBytes.putInt32((len >>> 29) & 0xFF); - padBytes.putInt32((len << 3) & 0xFFFFFFFF); - var s2 = { - h0: _state.h0, - h1: _state.h1, - h2: _state.h2, - h3: _state.h3, - h4: _state.h4, - h5: _state.h5, - h6: _state.h6, - h7: _state.h7 - }; - _update(s2, _w, padBytes); - var rval = util.createBuffer(); - rval.putInt32(s2.h0); - rval.putInt32(s2.h1); - rval.putInt32(s2.h2); - rval.putInt32(s2.h3); - rval.putInt32(s2.h4); - rval.putInt32(s2.h5); - rval.putInt32(s2.h6); - rval.putInt32(s2.h7); - return rval; - }; - - return md; -}; -},{"./forge_util.js":27}],27:[function(require,module,exports){ -/** - * Utility functions for web applications. - * - * @author Dave Longley - * - * Copyright (c) 2010-2012 Digital Bazaar, Inc. - */ - -/* Utilities API */ -var util = module.exports = {}; - -// define isArray -util.isArray = Array.isArray || function(x) { - return Object.prototype.toString.call(x) === '[object Array]'; -}; - -// define isArrayBuffer -util.isArrayBuffer = function(x) { - return typeof ArrayBuffer !== 'undefined' && x instanceof ArrayBuffer; -}; - -// define isArrayBufferView -var _arrayBufferViews = []; -if(typeof Int8Array !== 'undefined') { - _arrayBufferViews.push(Int8Array); -} -if(typeof Uint8Array !== 'undefined') { - _arrayBufferViews.push(Uint8Array); -} -if(typeof Uint8ClampedArray !== 'undefined') { - _arrayBufferViews.push(Uint8ClampedArray); -} -if(typeof Int16Array !== 'undefined') { - _arrayBufferViews.push(Int16Array); -} -if(typeof Uint16Array !== 'undefined') { - _arrayBufferViews.push(Uint16Array); -} -if(typeof Int32Array !== 'undefined') { - _arrayBufferViews.push(Int32Array); -} -if(typeof Uint32Array !== 'undefined') { - _arrayBufferViews.push(Uint32Array); -} -if(typeof Float32Array !== 'undefined') { - _arrayBufferViews.push(Float32Array); -} -if(typeof Float64Array !== 'undefined') { - _arrayBufferViews.push(Float64Array); -} -util.isArrayBufferView = function(x) { - for(var i = 0; i < _arrayBufferViews.length; ++i) { - if(x instanceof _arrayBufferViews[i]) { - return true; - } - } - return false; -}; - -/** - * Constructor for a byte buffer. - * - * @param [b] the bytes to wrap (either encoded as string, one byte per - * character, or as an ArrayBuffer or Typed Array). - */ -util.ByteBuffer = function(b) { - // the data in this buffer - this.data = ''; - // the pointer for reading from this buffer - this.read = 0; - - if(typeof b === 'string') { - this.data = b; - } - else if(util.isArrayBuffer(b) || util.isArrayBufferView(b)) { - // convert native buffer to forge buffer - // FIXME: support native buffers internally instead - var arr = new Uint8Array(b); - try { - this.data = String.fromCharCode.apply(null, arr); - } - catch(e) { - for(var i = 0; i < arr.length; ++i) { - this.putByte(arr[i]); - } - } - } -}; - -/** - * Gets the number of bytes in this buffer. - * - * @return the number of bytes in this buffer. - */ -util.ByteBuffer.prototype.length = function() { - return this.data.length - this.read; -}; - -/** - * Gets whether or not this buffer is empty. - * - * @return true if this buffer is empty, false if not. - */ -util.ByteBuffer.prototype.isEmpty = function() { - return this.length() <= 0; -}; - -/** - * Puts a byte in this buffer. - * - * @param b the byte to put. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.putByte = function(b) { - this.data += String.fromCharCode(b); - return this; -}; - -/** - * Puts a byte in this buffer N times. - * - * @param b the byte to put. - * @param n the number of bytes of value b to put. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.fillWithByte = function(b, n) { - b = String.fromCharCode(b); - var d = this.data; - while(n > 0) { - if(n & 1) { - d += b; - } - n >>>= 1; - if(n > 0) { - b += b; - } - } - this.data = d; - return this; -}; - -/** - * Puts bytes in this buffer. - * - * @param bytes the bytes (as a UTF-8 encoded string) to put. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.putBytes = function(bytes) { - this.data += bytes; - return this; -}; - -/** - * Puts a UTF-16 encoded string into this buffer. - * - * @param str the string to put. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.putString = function(str) { - this.data += util.encodeUtf8(str); - return this; -}; - -/** - * Puts a 16-bit integer in this buffer in big-endian order. - * - * @param i the 16-bit integer. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.putInt16 = function(i) { - this.data += - String.fromCharCode(i >> 8 & 0xFF) + - String.fromCharCode(i & 0xFF); - return this; -}; - -/** - * Puts a 24-bit integer in this buffer in big-endian order. - * - * @param i the 24-bit integer. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.putInt24 = function(i) { - this.data += - String.fromCharCode(i >> 16 & 0xFF) + - String.fromCharCode(i >> 8 & 0xFF) + - String.fromCharCode(i & 0xFF); - return this; -}; - -/** - * Puts a 32-bit integer in this buffer in big-endian order. - * - * @param i the 32-bit integer. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.putInt32 = function(i) { - this.data += - String.fromCharCode(i >> 24 & 0xFF) + - String.fromCharCode(i >> 16 & 0xFF) + - String.fromCharCode(i >> 8 & 0xFF) + - String.fromCharCode(i & 0xFF); - return this; -}; - -/** - * Puts a 16-bit integer in this buffer in little-endian order. - * - * @param i the 16-bit integer. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.putInt16Le = function(i) { - this.data += - String.fromCharCode(i & 0xFF) + - String.fromCharCode(i >> 8 & 0xFF); - return this; -}; - -/** - * Puts a 24-bit integer in this buffer in little-endian order. - * - * @param i the 24-bit integer. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.putInt24Le = function(i) { - this.data += - String.fromCharCode(i & 0xFF) + - String.fromCharCode(i >> 8 & 0xFF) + - String.fromCharCode(i >> 16 & 0xFF); - return this; -}; - -/** - * Puts a 32-bit integer in this buffer in little-endian order. - * - * @param i the 32-bit integer. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.putInt32Le = function(i) { - this.data += - String.fromCharCode(i & 0xFF) + - String.fromCharCode(i >> 8 & 0xFF) + - String.fromCharCode(i >> 16 & 0xFF) + - String.fromCharCode(i >> 24 & 0xFF); - return this; -}; - -/** - * Puts an n-bit integer in this buffer in big-endian order. - * - * @param i the n-bit integer. - * @param n the number of bits in the integer. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.putInt = function(i, n) { - do { - n -= 8; - this.data += String.fromCharCode((i >> n) & 0xFF); - } - while(n > 0); - return this; -}; - -/** - * Puts a signed n-bit integer in this buffer in big-endian order. Two's - * complement representation is used. - * - * @param i the n-bit integer. - * @param n the number of bits in the integer. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.putSignedInt = function(i, n) { - if(i < 0) { - i += 2 << (n - 1); - } - return this.putInt(i, n); -}; - -/** - * Puts the given buffer into this buffer. - * - * @param buffer the buffer to put into this one. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.putBuffer = function(buffer) { - this.data += buffer.getBytes(); - return this; -}; - -/** - * Gets a byte from this buffer and advances the read pointer by 1. - * - * @return the byte. - */ -util.ByteBuffer.prototype.getByte = function() { - return this.data.charCodeAt(this.read++); -}; - -/** - * Gets a uint16 from this buffer in big-endian order and advances the read - * pointer by 2. - * - * @return the uint16. - */ -util.ByteBuffer.prototype.getInt16 = function() { - var rval = ( - this.data.charCodeAt(this.read) << 8 ^ - this.data.charCodeAt(this.read + 1)); - this.read += 2; - return rval; -}; - -/** - * Gets a uint24 from this buffer in big-endian order and advances the read - * pointer by 3. - * - * @return the uint24. - */ -util.ByteBuffer.prototype.getInt24 = function() { - var rval = ( - this.data.charCodeAt(this.read) << 16 ^ - this.data.charCodeAt(this.read + 1) << 8 ^ - this.data.charCodeAt(this.read + 2)); - this.read += 3; - return rval; -}; - -/** - * Gets a uint32 from this buffer in big-endian order and advances the read - * pointer by 4. - * - * @return the word. - */ -util.ByteBuffer.prototype.getInt32 = function() { - var rval = ( - this.data.charCodeAt(this.read) << 24 ^ - this.data.charCodeAt(this.read + 1) << 16 ^ - this.data.charCodeAt(this.read + 2) << 8 ^ - this.data.charCodeAt(this.read + 3)); - this.read += 4; - return rval; -}; - -/** - * Gets a uint16 from this buffer in little-endian order and advances the read - * pointer by 2. - * - * @return the uint16. - */ -util.ByteBuffer.prototype.getInt16Le = function() { - var rval = ( - this.data.charCodeAt(this.read) ^ - this.data.charCodeAt(this.read + 1) << 8); - this.read += 2; - return rval; -}; - -/** - * Gets a uint24 from this buffer in little-endian order and advances the read - * pointer by 3. - * - * @return the uint24. - */ -util.ByteBuffer.prototype.getInt24Le = function() { - var rval = ( - this.data.charCodeAt(this.read) ^ - this.data.charCodeAt(this.read + 1) << 8 ^ - this.data.charCodeAt(this.read + 2) << 16); - this.read += 3; - return rval; -}; - -/** - * Gets a uint32 from this buffer in little-endian order and advances the read - * pointer by 4. - * - * @return the word. - */ -util.ByteBuffer.prototype.getInt32Le = function() { - var rval = ( - this.data.charCodeAt(this.read) ^ - this.data.charCodeAt(this.read + 1) << 8 ^ - this.data.charCodeAt(this.read + 2) << 16 ^ - this.data.charCodeAt(this.read + 3) << 24); - this.read += 4; - return rval; -}; - -/** - * Gets an n-bit integer from this buffer in big-endian order and advances the - * read pointer by n/8. - * - * @param n the number of bits in the integer. - * - * @return the integer. - */ -util.ByteBuffer.prototype.getInt = function(n) { - var rval = 0; - do { - rval = (rval << 8) + this.data.charCodeAt(this.read++); - n -= 8; - } - while(n > 0); - return rval; -}; - -/** - * Gets a signed n-bit integer from this buffer in big-endian order, using - * two's complement, and advances the read pointer by n/8. - * - * @param n the number of bits in the integer. - * - * @return the integer. - */ -util.ByteBuffer.prototype.getSignedInt = function(n) { - var x = this.getInt(n); - var max = 2 << (n - 2); - if(x >= max) { - x -= max << 1; - } - return x; -}; - -/** - * Reads bytes out into a UTF-8 string and clears them from the buffer. - * - * @param count the number of bytes to read, undefined or null for all. - * - * @return a UTF-8 string of bytes. - */ -util.ByteBuffer.prototype.getBytes = function(count) { - var rval; - if(count) { - // read count bytes - count = Math.min(this.length(), count); - rval = this.data.slice(this.read, this.read + count); - this.read += count; - } - else if(count === 0) { - rval = ''; - } - else { - // read all bytes, optimize to only copy when needed - rval = (this.read === 0) ? this.data : this.data.slice(this.read); - this.clear(); - } - return rval; -}; - -/** - * Gets a UTF-8 encoded string of the bytes from this buffer without modifying - * the read pointer. - * - * @param count the number of bytes to get, omit to get all. - * - * @return a string full of UTF-8 encoded characters. - */ -util.ByteBuffer.prototype.bytes = function(count) { - return (typeof(count) === 'undefined' ? - this.data.slice(this.read) : - this.data.slice(this.read, this.read + count)); -}; - -/** - * Gets a byte at the given index without modifying the read pointer. - * - * @param i the byte index. - * - * @return the byte. - */ -util.ByteBuffer.prototype.at = function(i) { - return this.data.charCodeAt(this.read + i); -}; - -/** - * Puts a byte at the given index without modifying the read pointer. - * - * @param i the byte index. - * @param b the byte to put. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.setAt = function(i, b) { - this.data = this.data.substr(0, this.read + i) + - String.fromCharCode(b) + - this.data.substr(this.read + i + 1); - return this; -}; - -/** - * Gets the last byte without modifying the read pointer. - * - * @return the last byte. - */ -util.ByteBuffer.prototype.last = function() { - return this.data.charCodeAt(this.data.length - 1); -}; - -/** - * Creates a copy of this buffer. - * - * @return the copy. - */ -util.ByteBuffer.prototype.copy = function() { - var c = util.createBuffer(this.data); - c.read = this.read; - return c; -}; - -/** - * Compacts this buffer. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.compact = function() { - if(this.read > 0) { - this.data = this.data.slice(this.read); - this.read = 0; - } - return this; -}; - -/** - * Clears this buffer. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.clear = function() { - this.data = ''; - this.read = 0; - return this; -}; - -/** - * Shortens this buffer by triming bytes off of the end of this buffer. - * - * @param count the number of bytes to trim off. - * - * @return this buffer. - */ -util.ByteBuffer.prototype.truncate = function(count) { - var len = Math.max(0, this.length() - count); - this.data = this.data.substr(this.read, len); - this.read = 0; - return this; -}; - -/** - * Converts this buffer to a hexadecimal string. - * - * @return a hexadecimal string. - */ -util.ByteBuffer.prototype.toHex = function() { - var rval = ''; - for(var i = this.read; i < this.data.length; ++i) { - var b = this.data.charCodeAt(i); - if(b < 16) { - rval += '0'; - } - rval += b.toString(16); - } - return rval; -}; - -/** - * Converts this buffer to a UTF-16 string (standard JavaScript string). - * - * @return a UTF-16 string. - */ -util.ByteBuffer.prototype.toString = function() { - return util.decodeUtf8(this.bytes()); -}; - -/** - * Creates a buffer that stores bytes. A value may be given to put into the - * buffer that is either a string of bytes or a UTF-16 string that will - * be encoded using UTF-8 (to do the latter, specify 'utf8' as the encoding). - * - * @param [input] the bytes to wrap (as a string) or a UTF-16 string to encode - * as UTF-8. - * @param [encoding] (default: 'raw', other: 'utf8'). - */ -util.createBuffer = function(input, encoding) { - encoding = encoding || 'raw'; - if(input !== undefined && encoding === 'utf8') { - input = util.encodeUtf8(input); - } - return new util.ByteBuffer(input); -}; - -/** - * Fills a string with a particular value. If you want the string to be a byte - * string, pass in String.fromCharCode(theByte). - * - * @param c the character to fill the string with, use String.fromCharCode - * to fill the string with a byte value. - * @param n the number of characters of value c to fill with. - * - * @return the filled string. - */ -util.fillString = function(c, n) { - var s = ''; - while(n > 0) { - if(n & 1) { - s += c; - } - n >>>= 1; - if(n > 0) { - c += c; - } - } - return s; -}; - -/** - * Performs a per byte XOR between two byte strings and returns the result as a - * string of bytes. - * - * @param s1 first string of bytes. - * @param s2 second string of bytes. - * @param n the number of bytes to XOR. - * - * @return the XOR'd result. - */ -util.xorBytes = function(s1, s2, n) { - var s3 = ''; - var b = ''; - var t = ''; - var i = 0; - var c = 0; - for(; n > 0; --n, ++i) { - b = s1.charCodeAt(i) ^ s2.charCodeAt(i); - if(c >= 10) { - s3 += t; - t = ''; - c = 0; - } - t += String.fromCharCode(b); - ++c; - } - s3 += t; - return s3; -}; - -/** - * Converts a hex string into a UTF-8 string of bytes. - * - * @param hex the hexadecimal string to convert. - * - * @return the string of bytes. - */ -util.hexToBytes = function(hex) { - var rval = ''; - var i = 0; - if(hex.length & 1 == 1) { - // odd number of characters, convert first character alone - i = 1; - rval += String.fromCharCode(parseInt(hex[0], 16)); - } - // convert 2 characters (1 byte) at a time - for(; i < hex.length; i += 2) { - rval += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); - } - return rval; -}; - -/** - * Converts a UTF-8 byte string into a string of hexadecimal characters. - * - * @param bytes the byte string to convert. - * - * @return the string of hexadecimal characters. - */ -util.bytesToHex = function(bytes) { - return util.createBuffer(bytes).toHex(); -}; - -/** - * Converts an 32-bit integer to 4-big-endian byte string. - * - * @param i the integer. - * - * @return the byte string. - */ -util.int32ToBytes = function(i) { - return ( - String.fromCharCode(i >> 24 & 0xFF) + - String.fromCharCode(i >> 16 & 0xFF) + - String.fromCharCode(i >> 8 & 0xFF) + - String.fromCharCode(i & 0xFF)); -}; - -// base64 characters, reverse mapping -var _base64 = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; -var _base64Idx = [ -/*43 -43 = 0*/ -/*'+', 1, 2, 3,'/' */ - 62, -1, -1, -1, 63, - -/*'0','1','2','3','4','5','6','7','8','9' */ - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - -/*15, 16, 17,'=', 19, 20, 21 */ - -1, -1, -1, 64, -1, -1, -1, - -/*65 - 43 = 22*/ -/*'A','B','C','D','E','F','G','H','I','J','K','L','M', */ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - -/*'N','O','P','Q','R','S','T','U','V','W','X','Y','Z' */ - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - -/*91 - 43 = 48 */ -/*48, 49, 50, 51, 52, 53 */ - -1, -1, -1, -1, -1, -1, - -/*97 - 43 = 54*/ -/*'a','b','c','d','e','f','g','h','i','j','k','l','m' */ - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - -/*'n','o','p','q','r','s','t','u','v','w','x','y','z' */ - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 -]; - -/** - * Base64 encodes a UTF-8 string of bytes. - * - * @param input the UTF-8 string of bytes to encode. - * @param maxline the maximum number of encoded bytes per line to use, - * defaults to none. - * - * @return the base64-encoded output. - */ -util.encode64 = function(input, maxline) { - var line = ''; - var output = ''; - var chr1, chr2, chr3; - var i = 0; - while(i < input.length) { - chr1 = input.charCodeAt(i++); - chr2 = input.charCodeAt(i++); - chr3 = input.charCodeAt(i++); - - // encode 4 character group - line += _base64.charAt(chr1 >> 2); - line += _base64.charAt(((chr1 & 3) << 4) | (chr2 >> 4)); - if(isNaN(chr2)) { - line += '=='; - } - else { - line += _base64.charAt(((chr2 & 15) << 2) | (chr3 >> 6)); - line += isNaN(chr3) ? '=' : _base64.charAt(chr3 & 63); - } - - if(maxline && line.length > maxline) { - output += line.substr(0, maxline) + '\r\n'; - line = line.substr(maxline); - } - } - output += line; - - return output; -}; - -/** - * Base64 decodes a string into a UTF-8 string of bytes. - * - * @param input the base64-encoded input. - * - * @return the raw bytes. - */ -util.decode64 = function(input) { - // remove all non-base64 characters - input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); - - var output = ''; - var enc1, enc2, enc3, enc4; - var i = 0; - - while(i < input.length) { - enc1 = _base64Idx[input.charCodeAt(i++) - 43]; - enc2 = _base64Idx[input.charCodeAt(i++) - 43]; - enc3 = _base64Idx[input.charCodeAt(i++) - 43]; - enc4 = _base64Idx[input.charCodeAt(i++) - 43]; - - output += String.fromCharCode((enc1 << 2) | (enc2 >> 4)); - if(enc3 !== 64) { - // decoded at least 2 bytes - output += String.fromCharCode(((enc2 & 15) << 4) | (enc3 >> 2)); - if(enc4 !== 64) { - // decoded 3 bytes - output += String.fromCharCode(((enc3 & 3) << 6) | enc4); - } - } - } - - return output; -}; - -/** - * UTF-8 encodes the given UTF-16 encoded string (a standard JavaScript - * string). Non-ASCII characters will be encoded as multiple bytes according - * to UTF-8. - * - * @param str the string to encode. - * - * @return the UTF-8 encoded string. - */ -util.encodeUtf8 = function(str) { - return unescape(encodeURIComponent(str)); -}; - -/** - * Decodes a UTF-8 encoded string into a UTF-16 string. - * - * @param str the string to encode. - * - * @return the UTF-16 encoded string (standard JavaScript string). - */ -util.decodeUtf8 = function(str) { - return decodeURIComponent(escape(str)); -}; - -},{}],28:[function(require,module,exports){ -/** - * @requires crypto/hash/sha - * @module crypto/hash - */ -var sha = require('./sha.js'), - forge_sha256 = require('./forge_sha256.js'); - -module.exports = { - /** @see module:crypto/hash/md5 */ - md5: require('./md5.js'), - /** @see module:crypto/hash/sha.sha1 */ - sha1: sha.sha1, - /** @see module:crypto/hash/sha.sha224 */ - sha224: sha.sha224, - /** @see module:crypto/hash/sha.sha256 */ - sha256: sha.sha256, - /** @see module:crypto/hash/sha.sha384 */ - sha384: sha.sha384, - /** @see module:crypto/hash/sha.sha512 */ - sha512: sha.sha512, - /** @see module:crypto/hash/ripe-md */ - ripemd: require('./ripe-md.js'), - - /** - * Create a hash on the specified data using the specified algorithm - * @param {module:enums.hash} algo Hash algorithm type (see {@link http://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4}) - * @param {String} data Data to be hashed - * @return {String} hash value - */ - digest: function(algo, data) { - switch (algo) { - case 1: - // - MD5 [HAC] - return this.md5(data); - case 2: - // - SHA-1 [FIPS180] - return this.sha1(data); - case 3: - // - RIPE-MD/160 [HAC] - return this.ripemd(data); - case 8: - // - SHA256 [FIPS180] - var sha256 = forge_sha256.create(); - sha256.update(data); - return sha256.digest().getBytes(); - case 9: - // - SHA384 [FIPS180] - return this.sha384(data); - case 10: - // - SHA512 [FIPS180] - return this.sha512(data); - case 11: - // - SHA224 [FIPS180] - return this.sha224(data); - default: - throw new Error('Invalid hash function.'); - } - }, - - /** - * Returns the hash size in bytes of the specified hash algorithm type - * @param {module:enums.hash} algo Hash algorithm type (See {@link http://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4}) - * @return {Integer} Size in bytes of the resulting hash - */ - getHashByteLength: function(algo) { - switch (algo) { - case 1: - // - MD5 [HAC] - return 16; - case 2: - // - SHA-1 [FIPS180] - case 3: - // - RIPE-MD/160 [HAC] - return 20; - case 8: - // - SHA256 [FIPS180] - return 32; - case 9: - // - SHA384 [FIPS180] - return 48; - case 10: - // - SHA512 [FIPS180] - return 64; - case 11: - // - SHA224 [FIPS180] - return 28; - default: - throw new Error('Invalid hash algorithm.'); - } - } -}; - -},{"./forge_sha256.js":26,"./md5.js":29,"./ripe-md.js":30,"./sha.js":31}],29:[function(require,module,exports){ -/** - * A fast MD5 JavaScript implementation - * Copyright (c) 2012 Joseph Myers - * http://www.myersdaily.org/joseph/javascript/md5-text.html - * - * Permission to use, copy, modify, and distribute this software - * and its documentation for any purposes and without - * fee is hereby granted provided that this copyright notice - * appears in all copies. - * - * Of course, this soft is provided "as is" without express or implied - * warranty of any kind. - */ - -/** - * @requires util - * @module crypto/hash/md5 - */ - -var util = require('../../util.js'); - -/** - * MD5 hash - * @param {String} entree string to hash - */ -module.exports = function (entree) { - var hex = md5(entree); - var bin = util.hex2bin(hex); - return bin; -}; - -function md5cycle(x, k) { - var a = x[0], - b = x[1], - c = x[2], - d = x[3]; - - a = ff(a, b, c, d, k[0], 7, -680876936); - d = ff(d, a, b, c, k[1], 12, -389564586); - c = ff(c, d, a, b, k[2], 17, 606105819); - b = ff(b, c, d, a, k[3], 22, -1044525330); - a = ff(a, b, c, d, k[4], 7, -176418897); - d = ff(d, a, b, c, k[5], 12, 1200080426); - c = ff(c, d, a, b, k[6], 17, -1473231341); - b = ff(b, c, d, a, k[7], 22, -45705983); - a = ff(a, b, c, d, k[8], 7, 1770035416); - d = ff(d, a, b, c, k[9], 12, -1958414417); - c = ff(c, d, a, b, k[10], 17, -42063); - b = ff(b, c, d, a, k[11], 22, -1990404162); - a = ff(a, b, c, d, k[12], 7, 1804603682); - d = ff(d, a, b, c, k[13], 12, -40341101); - c = ff(c, d, a, b, k[14], 17, -1502002290); - b = ff(b, c, d, a, k[15], 22, 1236535329); - - a = gg(a, b, c, d, k[1], 5, -165796510); - d = gg(d, a, b, c, k[6], 9, -1069501632); - c = gg(c, d, a, b, k[11], 14, 643717713); - b = gg(b, c, d, a, k[0], 20, -373897302); - a = gg(a, b, c, d, k[5], 5, -701558691); - d = gg(d, a, b, c, k[10], 9, 38016083); - c = gg(c, d, a, b, k[15], 14, -660478335); - b = gg(b, c, d, a, k[4], 20, -405537848); - a = gg(a, b, c, d, k[9], 5, 568446438); - d = gg(d, a, b, c, k[14], 9, -1019803690); - c = gg(c, d, a, b, k[3], 14, -187363961); - b = gg(b, c, d, a, k[8], 20, 1163531501); - a = gg(a, b, c, d, k[13], 5, -1444681467); - d = gg(d, a, b, c, k[2], 9, -51403784); - c = gg(c, d, a, b, k[7], 14, 1735328473); - b = gg(b, c, d, a, k[12], 20, -1926607734); - - a = hh(a, b, c, d, k[5], 4, -378558); - d = hh(d, a, b, c, k[8], 11, -2022574463); - c = hh(c, d, a, b, k[11], 16, 1839030562); - b = hh(b, c, d, a, k[14], 23, -35309556); - a = hh(a, b, c, d, k[1], 4, -1530992060); - d = hh(d, a, b, c, k[4], 11, 1272893353); - c = hh(c, d, a, b, k[7], 16, -155497632); - b = hh(b, c, d, a, k[10], 23, -1094730640); - a = hh(a, b, c, d, k[13], 4, 681279174); - d = hh(d, a, b, c, k[0], 11, -358537222); - c = hh(c, d, a, b, k[3], 16, -722521979); - b = hh(b, c, d, a, k[6], 23, 76029189); - a = hh(a, b, c, d, k[9], 4, -640364487); - d = hh(d, a, b, c, k[12], 11, -421815835); - c = hh(c, d, a, b, k[15], 16, 530742520); - b = hh(b, c, d, a, k[2], 23, -995338651); - - a = ii(a, b, c, d, k[0], 6, -198630844); - d = ii(d, a, b, c, k[7], 10, 1126891415); - c = ii(c, d, a, b, k[14], 15, -1416354905); - b = ii(b, c, d, a, k[5], 21, -57434055); - a = ii(a, b, c, d, k[12], 6, 1700485571); - d = ii(d, a, b, c, k[3], 10, -1894986606); - c = ii(c, d, a, b, k[10], 15, -1051523); - b = ii(b, c, d, a, k[1], 21, -2054922799); - a = ii(a, b, c, d, k[8], 6, 1873313359); - d = ii(d, a, b, c, k[15], 10, -30611744); - c = ii(c, d, a, b, k[6], 15, -1560198380); - b = ii(b, c, d, a, k[13], 21, 1309151649); - a = ii(a, b, c, d, k[4], 6, -145523070); - d = ii(d, a, b, c, k[11], 10, -1120210379); - c = ii(c, d, a, b, k[2], 15, 718787259); - b = ii(b, c, d, a, k[9], 21, -343485551); - - x[0] = add32(a, x[0]); - x[1] = add32(b, x[1]); - x[2] = add32(c, x[2]); - x[3] = add32(d, x[3]); - -} - -function cmn(q, a, b, x, s, t) { - a = add32(add32(a, q), add32(x, t)); - return add32((a << s) | (a >>> (32 - s)), b); -} - -function ff(a, b, c, d, x, s, t) { - return cmn((b & c) | ((~b) & d), a, b, x, s, t); -} - -function gg(a, b, c, d, x, s, t) { - return cmn((b & d) | (c & (~d)), a, b, x, s, t); -} - -function hh(a, b, c, d, x, s, t) { - return cmn(b ^ c ^ d, a, b, x, s, t); -} - -function ii(a, b, c, d, x, s, t) { - return cmn(c ^ (b | (~d)), a, b, x, s, t); -} - -function md51(s) { - var n = s.length, - state = [1732584193, -271733879, -1732584194, 271733878], - i; - for (i = 64; i <= s.length; i += 64) { - md5cycle(state, md5blk(s.substring(i - 64, i))); - } - s = s.substring(i - 64); - var tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; - for (i = 0; i < s.length; i++) - tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3); - tail[i >> 2] |= 0x80 << ((i % 4) << 3); - if (i > 55) { - md5cycle(state, tail); - for (i = 0; i < 16; i++) tail[i] = 0; - } - tail[14] = n * 8; - md5cycle(state, tail); - return state; -} - -/* there needs to be support for Unicode here, - * unless we pretend that we can redefine the MD-5 - * algorithm for multi-byte characters (perhaps - * by adding every four 16-bit characters and - * shortening the sum to 32 bits). Otherwise - * I suggest performing MD-5 as if every character - * was two bytes--e.g., 0040 0025 = @%--but then - * how will an ordinary MD-5 sum be matched? - * There is no way to standardize text to something - * like UTF-8 before transformation; speed cost is - * utterly prohibitive. The JavaScript standard - * itself needs to look at this: it should start - * providing access to strings as preformed UTF-8 - * 8-bit unsigned value arrays. - */ -function md5blk(s) { /* I figured global was faster. */ - var md5blks = [], - i; /* Andy King said do it this way. */ - for (i = 0; i < 64; i += 4) { - md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << - 24); - } - return md5blks; -} - -var hex_chr = '0123456789abcdef'.split(''); - -function rhex(n) { - var s = '', - j = 0; - for (; j < 4; j++) - s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F]; - return s; -} - -function hex(x) { - for (var i = 0; i < x.length; i++) - x[i] = rhex(x[i]); - return x.join(''); -} - -function md5(s) { - return hex(md51(s)); -} - -/* this function is much faster, -so if possible we use it. Some IEs -are the only ones I know of that -need the idiotic second function, -generated by an if clause. */ - -function add32(a, b) { - return (a + b) & 0xFFFFFFFF; -} - -if (md5('hello') != '5d41402abc4b2a76b9719d911017c592') { - function add32(x, y) { - var lsw = (x & 0xFFFF) + (y & 0xFFFF), - msw = (x >> 16) + (y >> 16) + (lsw >> 16); - return (msw << 16) | (lsw & 0xFFFF); - } -} - -},{"../../util.js":76}],30:[function(require,module,exports){ -/* - * CryptoMX Tools - * Copyright (C) 2004 - 2006 Derek Buitenhuis - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -/* Modified by Recurity Labs GmbH - */ - -/** - * @module crypto/hash/ripe-md - */ - -var RMDsize = 160; -var X = []; - -function ROL(x, n) { - return new Number((x << n) | (x >>> (32 - n))); -} - -function F(x, y, z) { - return new Number(x ^ y ^ z); -} - -function G(x, y, z) { - return new Number((x & y) | (~x & z)); -} - -function H(x, y, z) { - return new Number((x | ~y) ^ z); -} - -function I(x, y, z) { - return new Number((x & z) | (y & ~z)); -} - -function J(x, y, z) { - return new Number(x ^ (y | ~z)); -} - -function mixOneRound(a, b, c, d, e, x, s, roundNumber) { - switch (roundNumber) { - case 0: - a += F(b, c, d) + x + 0x00000000; - break; - case 1: - a += G(b, c, d) + x + 0x5a827999; - break; - case 2: - a += H(b, c, d) + x + 0x6ed9eba1; - break; - case 3: - a += I(b, c, d) + x + 0x8f1bbcdc; - break; - case 4: - a += J(b, c, d) + x + 0xa953fd4e; - break; - case 5: - a += J(b, c, d) + x + 0x50a28be6; - break; - case 6: - a += I(b, c, d) + x + 0x5c4dd124; - break; - case 7: - a += H(b, c, d) + x + 0x6d703ef3; - break; - case 8: - a += G(b, c, d) + x + 0x7a6d76e9; - break; - case 9: - a += F(b, c, d) + x + 0x00000000; - break; - - default: - throw new Error("Bogus round number"); - break; - } - - a = ROL(a, s) + e; - c = ROL(c, 10); - - a &= 0xffffffff; - b &= 0xffffffff; - c &= 0xffffffff; - d &= 0xffffffff; - e &= 0xffffffff; - - var retBlock = []; - retBlock[0] = a; - retBlock[1] = b; - retBlock[2] = c; - retBlock[3] = d; - retBlock[4] = e; - retBlock[5] = x; - retBlock[6] = s; - - return retBlock; -} - -function MDinit(MDbuf) { - MDbuf[0] = 0x67452301; - MDbuf[1] = 0xefcdab89; - MDbuf[2] = 0x98badcfe; - MDbuf[3] = 0x10325476; - MDbuf[4] = 0xc3d2e1f0; -} - -var ROLs = [ - [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8], - [7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12], - [11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5], - [11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12], - [9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6], - [8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6], - [9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11], - [9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5], - [15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8], - [8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11] -]; - -var indexes = [ - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], - [7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8], - [3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12], - [1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2], - [4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13], - [5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12], - [6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2], - [15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13], - [8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14], - [12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11] -]; - -function compress(MDbuf, X) { - var blockA = []; - var blockB = []; - - var retBlock; - - var i, j; - - for (i = 0; i < 5; i++) { - blockA[i] = new Number(MDbuf[i]); - blockB[i] = new Number(MDbuf[i]); - } - - var step = 0; - for (j = 0; j < 5; j++) { - for (i = 0; i < 16; i++) { - retBlock = mixOneRound( - blockA[(step + 0) % 5], - blockA[(step + 1) % 5], - blockA[(step + 2) % 5], - blockA[(step + 3) % 5], - blockA[(step + 4) % 5], - X[indexes[j][i]], - ROLs[j][i], - j); - - blockA[(step + 0) % 5] = retBlock[0]; - blockA[(step + 1) % 5] = retBlock[1]; - blockA[(step + 2) % 5] = retBlock[2]; - blockA[(step + 3) % 5] = retBlock[3]; - blockA[(step + 4) % 5] = retBlock[4]; - - step += 4; - } - } - - step = 0; - for (j = 5; j < 10; j++) { - for (i = 0; i < 16; i++) { - retBlock = mixOneRound( - blockB[(step + 0) % 5], - blockB[(step + 1) % 5], - blockB[(step + 2) % 5], - blockB[(step + 3) % 5], - blockB[(step + 4) % 5], - X[indexes[j][i]], - ROLs[j][i], - j); - - blockB[(step + 0) % 5] = retBlock[0]; - blockB[(step + 1) % 5] = retBlock[1]; - blockB[(step + 2) % 5] = retBlock[2]; - blockB[(step + 3) % 5] = retBlock[3]; - blockB[(step + 4) % 5] = retBlock[4]; - - step += 4; - } - } - - blockB[3] += blockA[2] + MDbuf[1]; - MDbuf[1] = MDbuf[2] + blockA[3] + blockB[4]; - MDbuf[2] = MDbuf[3] + blockA[4] + blockB[0]; - MDbuf[3] = MDbuf[4] + blockA[0] + blockB[1]; - MDbuf[4] = MDbuf[0] + blockA[1] + blockB[2]; - MDbuf[0] = blockB[3]; -} - -function zeroX(X) { - for (var i = 0; i < 16; i++) { - X[i] = 0; - } -} - -function MDfinish(MDbuf, strptr, lswlen, mswlen) { - var X = new Array(16); - zeroX(X); - - var j = 0; - for (var i = 0; i < (lswlen & 63); i++) { - X[i >>> 2] ^= (strptr.charCodeAt(j++) & 255) << (8 * (i & 3)); - } - - X[(lswlen >>> 2) & 15] ^= 1 << (8 * (lswlen & 3) + 7); - - if ((lswlen & 63) > 55) { - compress(MDbuf, X); - X = new Array(16); - zeroX(X); - } - - X[14] = lswlen << 3; - X[15] = (lswlen >>> 29) | (mswlen << 3); - - compress(MDbuf, X); -} - -function BYTES_TO_DWORD(fourChars) { - var tmp = (fourChars.charCodeAt(3) & 255) << 24; - tmp |= (fourChars.charCodeAt(2) & 255) << 16; - tmp |= (fourChars.charCodeAt(1) & 255) << 8; - tmp |= (fourChars.charCodeAt(0) & 255); - - return tmp; -} - -function RMD(message) { - var MDbuf = new Array(RMDsize / 32); - var hashcode = new Array(RMDsize / 8); - var length; - var nbytes; - - MDinit(MDbuf); - length = message.length; - - var X = new Array(16); - zeroX(X); - - var i, j = 0; - for (nbytes = length; nbytes > 63; nbytes -= 64) { - for (i = 0; i < 16; i++) { - X[i] = BYTES_TO_DWORD(message.substr(j, 4)); - j += 4; - } - compress(MDbuf, X); - } - - MDfinish(MDbuf, message.substr(j), length, 0); - - for (i = 0; i < RMDsize / 8; i += 4) { - hashcode[i] = MDbuf[i >>> 2] & 255; - hashcode[i + 1] = (MDbuf[i >>> 2] >>> 8) & 255; - hashcode[i + 2] = (MDbuf[i >>> 2] >>> 16) & 255; - hashcode[i + 3] = (MDbuf[i >>> 2] >>> 24) & 255; - } - - return hashcode; -} - - -function RMDstring(message) { - var hashcode = RMD(message); - var retString = ""; - - for (var i = 0; i < RMDsize / 8; i++) { - retString += String.fromCharCode(hashcode[i]); - } - - return retString; -} - -module.exports = RMDstring; - -},{}],31:[function(require,module,exports){ -/* A JavaScript implementation of the SHA family of hashes, as defined in FIPS - * PUB 180-2 as well as the corresponding HMAC implementation as defined in - * FIPS PUB 198a - * - * Version 1.3 Copyright Brian Turek 2008-2010 - * Distributed under the BSD License - * See http://jssha.sourceforge.net/ for more information - * - * Several functions taken from Paul Johnson - */ - -/* Modified by Recurity Labs GmbH - * - * This code has been slightly modified direct string output: - * - bin2bstr has been added - * - following wrappers of this library have been added: - * - str_sha1 - * - str_sha256 - * - str_sha224 - * - str_sha384 - * - str_sha512 - */ - -/** - * @module crypto/hash/sha - */ - -var jsSHA = (function() { - - /* - * Configurable variables. Defaults typically work - */ - /* Number of Bits Per character (8 for ASCII, 16 for Unicode) */ - var charSize = 8, - /* base-64 pad character. "=" for strict RFC compliance */ - b64pad = "", - /* hex output format. 0 - lowercase; 1 - uppercase */ - hexCase = 0, - - /* - * Int_64 is a object for 2 32-bit numbers emulating a 64-bit number - * - * @constructor - * @param {Number} msint_32 The most significant 32-bits of a 64-bit number - * @param {Number} lsint_32 The least significant 32-bits of a 64-bit number - */ - Int_64 = function(msint_32, lsint_32) { - this.highOrder = msint_32; - this.lowOrder = lsint_32; - }, - - /* - * Convert a string to an array of big-endian words - * If charSize is ASCII, characters >255 have their hi-byte silently - * ignored. - * - * @param {String} str String to be converted to binary representation - * @return Integer array representation of the parameter - */ - str2binb = function(str) { - var bin = [], - mask = (1 << charSize) - 1, - length = str.length * charSize, - i; - - for (i = 0; i < length; i += charSize) { - bin[i >> 5] |= (str.charCodeAt(i / charSize) & mask) << - (32 - charSize - (i % 32)); - } - - return bin; - }, - - /* - * Convert a hex string to an array of big-endian words - * - * @param {String} str String to be converted to binary representation - * @return Integer array representation of the parameter - */ - hex2binb = function(str) { - var bin = [], - length = str.length, - i, num; - - for (i = 0; i < length; i += 2) { - num = parseInt(str.substr(i, 2), 16); - if (!isNaN(num)) { - bin[i >> 3] |= num << (24 - (4 * (i % 8))); - } else { - throw new Error("INVALID HEX STRING"); - } - } - - return bin; - }, - - /* - * Convert an array of big-endian words to a hex string. - * - * @private - * @param {Array} binarray Array of integers to be converted to hexidecimal - * representation - * @return Hexidecimal representation of the parameter in String form - */ - binb2hex = function(binarray) { - var hex_tab = (hexCase) ? "0123456789ABCDEF" : "0123456789abcdef", - str = "", - length = binarray.length * 4, - i, srcByte; - - for (i = 0; i < length; i += 1) { - srcByte = binarray[i >> 2] >> ((3 - (i % 4)) * 8); - str += hex_tab.charAt((srcByte >> 4) & 0xF) + - hex_tab.charAt(srcByte & 0xF); - } - - return str; - }, - - /* - * Convert an array of big-endian words to a base-64 string - * - * @private - * @param {Array} binarray Array of integers to be converted to base-64 - * representation - * @return Base-64 encoded representation of the parameter in String form - */ - binb2b64 = function(binarray) { - var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + - "0123456789+/", - str = "", - length = binarray.length * 4, - i, j, - triplet; - - for (i = 0; i < length; i += 3) { - triplet = (((binarray[i >> 2] >> 8 * (3 - i % 4)) & 0xFF) << 16) | - (((binarray[i + 1 >> 2] >> 8 * (3 - (i + 1) % 4)) & 0xFF) << 8) | - ((binarray[i + 2 >> 2] >> 8 * (3 - (i + 2) % 4)) & 0xFF); - for (j = 0; j < 4; j += 1) { - if (i * 8 + j * 6 <= binarray.length * 32) { - str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F); - } else { - str += b64pad; - } - } - } - return str; - }, - - /* - * Convert an array of big-endian words to a string - */ - binb2str = function(bin) { - var str = ""; - var mask = (1 << 8) - 1; - for (var i = 0; i < bin.length * 32; i += 8) - str += String.fromCharCode((bin[i >> 5] >>> (24 - i % 32)) & mask); - return str; - }, - /* - * The 32-bit implementation of circular rotate left - * - * @private - * @param {Number} x The 32-bit integer argument - * @param {Number} n The number of bits to shift - * @return The x shifted circularly by n bits - */ - rotl_32 = function(x, n) { - return (x << n) | (x >>> (32 - n)); - }, - - /* - * The 32-bit implementation of circular rotate right - * - * @private - * @param {Number} x The 32-bit integer argument - * @param {Number} n The number of bits to shift - * @return The x shifted circularly by n bits - */ - rotr_32 = function(x, n) { - return (x >>> n) | (x << (32 - n)); - }, - - /* - * The 64-bit implementation of circular rotate right - * - * @private - * @param {Int_64} x The 64-bit integer argument - * @param {Number} n The number of bits to shift - * @return The x shifted circularly by n bits - */ - rotr_64 = function(x, n) { - if (n <= 32) { - return new Int_64( - (x.highOrder >>> n) | (x.lowOrder << (32 - n)), (x.lowOrder >>> n) | (x.highOrder << (32 - n))); - } else { - return new Int_64( - (x.lowOrder >>> n) | (x.highOrder << (32 - n)), (x.highOrder >>> n) | (x.lowOrder << (32 - n))); - } - }, - - /* - * The 32-bit implementation of shift right - * - * @private - * @param {Number} x The 32-bit integer argument - * @param {Number} n The number of bits to shift - * @return The x shifted by n bits - */ - shr_32 = function(x, n) { - return x >>> n; - }, - - /* - * The 64-bit implementation of shift right - * - * @private - * @param {Int_64} x The 64-bit integer argument - * @param {Number} n The number of bits to shift - * @return The x shifted by n bits - */ - shr_64 = function(x, n) { - if (n <= 32) { - return new Int_64( - x.highOrder >>> n, - x.lowOrder >>> n | (x.highOrder << (32 - n))); - } else { - return new Int_64( - 0, - x.highOrder << (32 - n)); - } - }, - - /* - * The 32-bit implementation of the NIST specified Parity function - * - * @private - * @param {Number} x The first 32-bit integer argument - * @param {Number} y The second 32-bit integer argument - * @param {Number} z The third 32-bit integer argument - * @return The NIST specified output of the function - */ - parity_32 = function(x, y, z) { - return x ^ y ^ z; - }, - - /* - * The 32-bit implementation of the NIST specified Ch function - * - * @private - * @param {Number} x The first 32-bit integer argument - * @param {Number} y The second 32-bit integer argument - * @param {Number} z The third 32-bit integer argument - * @return The NIST specified output of the function - */ - ch_32 = function(x, y, z) { - return (x & y) ^ (~x & z); - }, - - /* - * The 64-bit implementation of the NIST specified Ch function - * - * @private - * @param {Int_64} x The first 64-bit integer argument - * @param {Int_64} y The second 64-bit integer argument - * @param {Int_64} z The third 64-bit integer argument - * @return The NIST specified output of the function - */ - ch_64 = function(x, y, z) { - return new Int_64( - (x.highOrder & y.highOrder) ^ (~x.highOrder & z.highOrder), (x.lowOrder & y.lowOrder) ^ (~x.lowOrder & z.lowOrder)); - }, - - /* - * The 32-bit implementation of the NIST specified Maj function - * - * @private - * @param {Number} x The first 32-bit integer argument - * @param {Number} y The second 32-bit integer argument - * @param {Number} z The third 32-bit integer argument - * @return The NIST specified output of the function - */ - maj_32 = function(x, y, z) { - return (x & y) ^ (x & z) ^ (y & z); - }, - - /* - * The 64-bit implementation of the NIST specified Maj function - * - * @private - * @param {Int_64} x The first 64-bit integer argument - * @param {Int_64} y The second 64-bit integer argument - * @param {Int_64} z The third 64-bit integer argument - * @return The NIST specified output of the function - */ - maj_64 = function(x, y, z) { - return new Int_64( - (x.highOrder & y.highOrder) ^ - (x.highOrder & z.highOrder) ^ - (y.highOrder & z.highOrder), (x.lowOrder & y.lowOrder) ^ - (x.lowOrder & z.lowOrder) ^ - (y.lowOrder & z.lowOrder)); - }, - - /* - * The 32-bit implementation of the NIST specified Sigma0 function - * - * @private - * @param {Number} x The 32-bit integer argument - * @return The NIST specified output of the function - */ - sigma0_32 = function(x) { - return rotr_32(x, 2) ^ rotr_32(x, 13) ^ rotr_32(x, 22); - }, - - /* - * The 64-bit implementation of the NIST specified Sigma0 function - * - * @private - * @param {Int_64} x The 64-bit integer argument - * @return The NIST specified output of the function - */ - sigma0_64 = function(x) { - var rotr28 = rotr_64(x, 28), - rotr34 = rotr_64(x, 34), - rotr39 = rotr_64(x, 39); - - return new Int_64( - rotr28.highOrder ^ rotr34.highOrder ^ rotr39.highOrder, - rotr28.lowOrder ^ rotr34.lowOrder ^ rotr39.lowOrder); - }, - - /* - * The 32-bit implementation of the NIST specified Sigma1 function - * - * @private - * @param {Number} x The 32-bit integer argument - * @return The NIST specified output of the function - */ - sigma1_32 = function(x) { - return rotr_32(x, 6) ^ rotr_32(x, 11) ^ rotr_32(x, 25); - }, - - /* - * The 64-bit implementation of the NIST specified Sigma1 function - * - * @private - * @param {Int_64} x The 64-bit integer argument - * @return The NIST specified output of the function - */ - sigma1_64 = function(x) { - var rotr14 = rotr_64(x, 14), - rotr18 = rotr_64(x, 18), - rotr41 = rotr_64(x, 41); - - return new Int_64( - rotr14.highOrder ^ rotr18.highOrder ^ rotr41.highOrder, - rotr14.lowOrder ^ rotr18.lowOrder ^ rotr41.lowOrder); - }, - - /* - * The 32-bit implementation of the NIST specified Gamma0 function - * - * @private - * @param {Number} x The 32-bit integer argument - * @return The NIST specified output of the function - */ - gamma0_32 = function(x) { - return rotr_32(x, 7) ^ rotr_32(x, 18) ^ shr_32(x, 3); - }, - - /* - * The 64-bit implementation of the NIST specified Gamma0 function - * - * @private - * @param {Int_64} x The 64-bit integer argument - * @return The NIST specified output of the function - */ - gamma0_64 = function(x) { - var rotr1 = rotr_64(x, 1), - rotr8 = rotr_64(x, 8), - shr7 = shr_64(x, 7); - - return new Int_64( - rotr1.highOrder ^ rotr8.highOrder ^ shr7.highOrder, - rotr1.lowOrder ^ rotr8.lowOrder ^ shr7.lowOrder); - }, - - /* - * The 32-bit implementation of the NIST specified Gamma1 function - * - * @private - * @param {Number} x The 32-bit integer argument - * @return The NIST specified output of the function - */ - gamma1_32 = function(x) { - return rotr_32(x, 17) ^ rotr_32(x, 19) ^ shr_32(x, 10); - }, - - /* - * The 64-bit implementation of the NIST specified Gamma1 function - * - * @private - * @param {Int_64} x The 64-bit integer argument - * @return The NIST specified output of the function - */ - gamma1_64 = function(x) { - var rotr19 = rotr_64(x, 19), - rotr61 = rotr_64(x, 61), - shr6 = shr_64(x, 6); - - return new Int_64( - rotr19.highOrder ^ rotr61.highOrder ^ shr6.highOrder, - rotr19.lowOrder ^ rotr61.lowOrder ^ shr6.lowOrder); - }, - - /* - * Add two 32-bit integers, wrapping at 2^32. This uses 16-bit operations - * internally to work around bugs in some JS interpreters. - * - * @private - * @param {Number} x The first 32-bit integer argument to be added - * @param {Number} y The second 32-bit integer argument to be added - * @return The sum of x + y - */ - safeAdd_32_2 = function(x, y) { - var lsw = (x & 0xFFFF) + (y & 0xFFFF), - msw = (x >>> 16) + (y >>> 16) + (lsw >>> 16); - - return ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); - }, - - /* - * Add four 32-bit integers, wrapping at 2^32. This uses 16-bit operations - * internally to work around bugs in some JS interpreters. - * - * @private - * @param {Number} a The first 32-bit integer argument to be added - * @param {Number} b The second 32-bit integer argument to be added - * @param {Number} c The third 32-bit integer argument to be added - * @param {Number} d The fourth 32-bit integer argument to be added - * @return The sum of a + b + c + d - */ - safeAdd_32_4 = function(a, b, c, d) { - var lsw = (a & 0xFFFF) + (b & 0xFFFF) + (c & 0xFFFF) + (d & 0xFFFF), - msw = (a >>> 16) + (b >>> 16) + (c >>> 16) + (d >>> 16) + - (lsw >>> 16); - - return ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); - }, - - /* - * Add five 32-bit integers, wrapping at 2^32. This uses 16-bit operations - * internally to work around bugs in some JS interpreters. - * - * @private - * @param {Number} a The first 32-bit integer argument to be added - * @param {Number} b The second 32-bit integer argument to be added - * @param {Number} c The third 32-bit integer argument to be added - * @param {Number} d The fourth 32-bit integer argument to be added - * @param {Number} e The fifth 32-bit integer argument to be added - * @return The sum of a + b + c + d + e - */ - safeAdd_32_5 = function(a, b, c, d, e) { - var lsw = (a & 0xFFFF) + (b & 0xFFFF) + (c & 0xFFFF) + (d & 0xFFFF) + - (e & 0xFFFF), - msw = (a >>> 16) + (b >>> 16) + (c >>> 16) + (d >>> 16) + - (e >>> 16) + (lsw >>> 16); - - return ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); - }, - - /* - * Add two 64-bit integers, wrapping at 2^64. This uses 16-bit operations - * internally to work around bugs in some JS interpreters. - * - * @private - * @param {Int_64} x The first 64-bit integer argument to be added - * @param {Int_64} y The second 64-bit integer argument to be added - * @return The sum of x + y - */ - safeAdd_64_2 = function(x, y) { - var lsw, msw, lowOrder, highOrder; - - lsw = (x.lowOrder & 0xFFFF) + (y.lowOrder & 0xFFFF); - msw = (x.lowOrder >>> 16) + (y.lowOrder >>> 16) + (lsw >>> 16); - lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); - - lsw = (x.highOrder & 0xFFFF) + (y.highOrder & 0xFFFF) + (msw >>> 16); - msw = (x.highOrder >>> 16) + (y.highOrder >>> 16) + (lsw >>> 16); - highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); - - return new Int_64(highOrder, lowOrder); - }, - - /* - * Add four 64-bit integers, wrapping at 2^64. This uses 16-bit operations - * internally to work around bugs in some JS interpreters. - * - * @private - * @param {Int_64} a The first 64-bit integer argument to be added - * @param {Int_64} b The second 64-bit integer argument to be added - * @param {Int_64} c The third 64-bit integer argument to be added - * @param {Int_64} d The fouth 64-bit integer argument to be added - * @return The sum of a + b + c + d - */ - safeAdd_64_4 = function(a, b, c, d) { - var lsw, msw, lowOrder, highOrder; - - lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + - (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF); - msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + - (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (lsw >>> 16); - lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); - - lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + - (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + (msw >>> 16); - msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + - (c.highOrder >>> 16) + (d.highOrder >>> 16) + (lsw >>> 16); - highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); - - return new Int_64(highOrder, lowOrder); - }, - - /* - * Add five 64-bit integers, wrapping at 2^64. This uses 16-bit operations - * internally to work around bugs in some JS interpreters. - * - * @private - * @param {Int_64} a The first 64-bit integer argument to be added - * @param {Int_64} b The second 64-bit integer argument to be added - * @param {Int_64} c The third 64-bit integer argument to be added - * @param {Int_64} d The fouth 64-bit integer argument to be added - * @param {Int_64} e The fouth 64-bit integer argument to be added - * @return The sum of a + b + c + d + e - */ - safeAdd_64_5 = function(a, b, c, d, e) { - var lsw, msw, lowOrder, highOrder; - - lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + - (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF) + - (e.lowOrder & 0xFFFF); - msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + - (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (e.lowOrder >>> 16) + - (lsw >>> 16); - lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); - - lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + - (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + - (e.highOrder & 0xFFFF) + (msw >>> 16); - msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + - (c.highOrder >>> 16) + (d.highOrder >>> 16) + - (e.highOrder >>> 16) + (lsw >>> 16); - highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); - - return new Int_64(highOrder, lowOrder); - }, - - /* - * Calculates the SHA-1 hash of the string set at instantiation - * - * @private - * @param {Array} message The binary array representation of the string to - * hash - * @param {Number} messageLen The number of bits in the message - * @return The array of integers representing the SHA-1 hash of message - */ - coreSHA1 = function(message, messageLen) { - var W = [], - a, b, c, d, e, T, ch = ch_32, - parity = parity_32, - maj = maj_32, - rotl = rotl_32, - safeAdd_2 = safeAdd_32_2, - i, t, - safeAdd_5 = safeAdd_32_5, - appendedMessageLength, - H = [ - 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 - ], - K = [ - 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999, - 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999, - 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999, - 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999, - 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999, - 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, - 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, - 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, - 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, - 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, - 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, - 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, - 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, - 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, - 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, - 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, - 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, - 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, - 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, - 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6 - ]; - - /* Append '1' at the end of the binary string */ - message[messageLen >> 5] |= 0x80 << (24 - (messageLen % 32)); - /* Append length of binary string in the position such that the new - length is a multiple of 512. Logic does not work for even multiples - of 512 but there can never be even multiples of 512 */ - message[(((messageLen + 65) >> 9) << 4) + 15] = messageLen; - - appendedMessageLength = message.length; - - for (i = 0; i < appendedMessageLength; i += 16) { - a = H[0]; - b = H[1]; - c = H[2]; - d = H[3]; - e = H[4]; - - for (t = 0; t < 80; t += 1) { - if (t < 16) { - W[t] = message[t + i]; - } else { - W[t] = rotl(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1); - } - - if (t < 20) { - T = safeAdd_5(rotl(a, 5), ch(b, c, d), e, K[t], W[t]); - } else if (t < 40) { - T = safeAdd_5(rotl(a, 5), parity(b, c, d), e, K[t], W[t]); - } else if (t < 60) { - T = safeAdd_5(rotl(a, 5), maj(b, c, d), e, K[t], W[t]); - } else { - T = safeAdd_5(rotl(a, 5), parity(b, c, d), e, K[t], W[t]); - } - - e = d; - d = c; - c = rotl(b, 30); - b = a; - a = T; - } - - H[0] = safeAdd_2(a, H[0]); - H[1] = safeAdd_2(b, H[1]); - H[2] = safeAdd_2(c, H[2]); - H[3] = safeAdd_2(d, H[3]); - H[4] = safeAdd_2(e, H[4]); - } - - return H; - }, - - /* - * Calculates the desired SHA-2 hash of the string set at instantiation - * - * @private - * @param {Array} The binary array representation of the string to hash - * @param {Number} The number of bits in message - * @param {String} variant The desired SHA-2 variant - * @return The array of integers representing the SHA-2 hash of message - */ - coreSHA2 = function(message, messageLen, variant) { - var a, b, c, d, e, f, g, h, T1, T2, H, numRounds, lengthPosition, i, t, - binaryStringInc, binaryStringMult, safeAdd_2, safeAdd_4, safeAdd_5, - gamma0, gamma1, sigma0, sigma1, ch, maj, Int, K, W = [], - appendedMessageLength; - - /* Set up the various function handles and variable for the specific - * variant */ - if (variant === "SHA-224" || variant === "SHA-256") { - /* 32-bit variant */ - numRounds = 64; - lengthPosition = (((messageLen + 65) >> 9) << 4) + 15; - binaryStringInc = 16; - binaryStringMult = 1; - Int = Number; - safeAdd_2 = safeAdd_32_2; - safeAdd_4 = safeAdd_32_4; - safeAdd_5 = safeAdd_32_5; - gamma0 = gamma0_32; - gamma1 = gamma1_32; - sigma0 = sigma0_32; - sigma1 = sigma1_32; - maj = maj_32; - ch = ch_32; - K = [ - 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, - 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, - 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, - 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, - 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, - 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, - 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, - 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, - 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, - 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, - 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, - 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, - 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, - 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, - 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, - 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 - ]; - - if (variant === "SHA-224") { - H = [ - 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, - 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 - ]; - } else { - H = [ - 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, - 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19 - ]; - } - } else if (variant === "SHA-384" || variant === "SHA-512") { - /* 64-bit variant */ - numRounds = 80; - lengthPosition = (((messageLen + 128) >> 10) << 5) + 31; - binaryStringInc = 32; - binaryStringMult = 2; - Int = Int_64; - safeAdd_2 = safeAdd_64_2; - safeAdd_4 = safeAdd_64_4; - safeAdd_5 = safeAdd_64_5; - gamma0 = gamma0_64; - gamma1 = gamma1_64; - sigma0 = sigma0_64; - sigma1 = sigma1_64; - maj = maj_64; - ch = ch_64; - - K = [ - new Int(0x428a2f98, 0xd728ae22), new Int(0x71374491, 0x23ef65cd), - new Int(0xb5c0fbcf, 0xec4d3b2f), new Int(0xe9b5dba5, 0x8189dbbc), - new Int(0x3956c25b, 0xf348b538), new Int(0x59f111f1, 0xb605d019), - new Int(0x923f82a4, 0xaf194f9b), new Int(0xab1c5ed5, 0xda6d8118), - new Int(0xd807aa98, 0xa3030242), new Int(0x12835b01, 0x45706fbe), - new Int(0x243185be, 0x4ee4b28c), new Int(0x550c7dc3, 0xd5ffb4e2), - new Int(0x72be5d74, 0xf27b896f), new Int(0x80deb1fe, 0x3b1696b1), - new Int(0x9bdc06a7, 0x25c71235), new Int(0xc19bf174, 0xcf692694), - new Int(0xe49b69c1, 0x9ef14ad2), new Int(0xefbe4786, 0x384f25e3), - new Int(0x0fc19dc6, 0x8b8cd5b5), new Int(0x240ca1cc, 0x77ac9c65), - new Int(0x2de92c6f, 0x592b0275), new Int(0x4a7484aa, 0x6ea6e483), - new Int(0x5cb0a9dc, 0xbd41fbd4), new Int(0x76f988da, 0x831153b5), - new Int(0x983e5152, 0xee66dfab), new Int(0xa831c66d, 0x2db43210), - new Int(0xb00327c8, 0x98fb213f), new Int(0xbf597fc7, 0xbeef0ee4), - new Int(0xc6e00bf3, 0x3da88fc2), new Int(0xd5a79147, 0x930aa725), - new Int(0x06ca6351, 0xe003826f), new Int(0x14292967, 0x0a0e6e70), - new Int(0x27b70a85, 0x46d22ffc), new Int(0x2e1b2138, 0x5c26c926), - new Int(0x4d2c6dfc, 0x5ac42aed), new Int(0x53380d13, 0x9d95b3df), - new Int(0x650a7354, 0x8baf63de), new Int(0x766a0abb, 0x3c77b2a8), - new Int(0x81c2c92e, 0x47edaee6), new Int(0x92722c85, 0x1482353b), - new Int(0xa2bfe8a1, 0x4cf10364), new Int(0xa81a664b, 0xbc423001), - new Int(0xc24b8b70, 0xd0f89791), new Int(0xc76c51a3, 0x0654be30), - new Int(0xd192e819, 0xd6ef5218), new Int(0xd6990624, 0x5565a910), - new Int(0xf40e3585, 0x5771202a), new Int(0x106aa070, 0x32bbd1b8), - new Int(0x19a4c116, 0xb8d2d0c8), new Int(0x1e376c08, 0x5141ab53), - new Int(0x2748774c, 0xdf8eeb99), new Int(0x34b0bcb5, 0xe19b48a8), - new Int(0x391c0cb3, 0xc5c95a63), new Int(0x4ed8aa4a, 0xe3418acb), - new Int(0x5b9cca4f, 0x7763e373), new Int(0x682e6ff3, 0xd6b2b8a3), - new Int(0x748f82ee, 0x5defb2fc), new Int(0x78a5636f, 0x43172f60), - new Int(0x84c87814, 0xa1f0ab72), new Int(0x8cc70208, 0x1a6439ec), - new Int(0x90befffa, 0x23631e28), new Int(0xa4506ceb, 0xde82bde9), - new Int(0xbef9a3f7, 0xb2c67915), new Int(0xc67178f2, 0xe372532b), - new Int(0xca273ece, 0xea26619c), new Int(0xd186b8c7, 0x21c0c207), - new Int(0xeada7dd6, 0xcde0eb1e), new Int(0xf57d4f7f, 0xee6ed178), - new Int(0x06f067aa, 0x72176fba), new Int(0x0a637dc5, 0xa2c898a6), - new Int(0x113f9804, 0xbef90dae), new Int(0x1b710b35, 0x131c471b), - new Int(0x28db77f5, 0x23047d84), new Int(0x32caab7b, 0x40c72493), - new Int(0x3c9ebe0a, 0x15c9bebc), new Int(0x431d67c4, 0x9c100d4c), - new Int(0x4cc5d4be, 0xcb3e42b6), new Int(0x597f299c, 0xfc657e2a), - new Int(0x5fcb6fab, 0x3ad6faec), new Int(0x6c44198c, 0x4a475817) - ]; - - if (variant === "SHA-384") { - H = [ - new Int(0xcbbb9d5d, 0xc1059ed8), new Int(0x0629a292a, 0x367cd507), - new Int(0x9159015a, 0x3070dd17), new Int(0x0152fecd8, 0xf70e5939), - new Int(0x67332667, 0xffc00b31), new Int(0x98eb44a87, 0x68581511), - new Int(0xdb0c2e0d, 0x64f98fa7), new Int(0x047b5481d, 0xbefa4fa4) - ]; - } else { - H = [ - new Int(0x6a09e667, 0xf3bcc908), new Int(0xbb67ae85, 0x84caa73b), - new Int(0x3c6ef372, 0xfe94f82b), new Int(0xa54ff53a, 0x5f1d36f1), - new Int(0x510e527f, 0xade682d1), new Int(0x9b05688c, 0x2b3e6c1f), - new Int(0x1f83d9ab, 0xfb41bd6b), new Int(0x5be0cd19, 0x137e2179) - ]; - } - } - - /* Append '1' at the end of the binary string */ - message[messageLen >> 5] |= 0x80 << (24 - messageLen % 32); - /* Append length of binary string in the position such that the new - * length is correct */ - message[lengthPosition] = messageLen; - - appendedMessageLength = message.length; - - for (i = 0; i < appendedMessageLength; i += binaryStringInc) { - a = H[0]; - b = H[1]; - c = H[2]; - d = H[3]; - e = H[4]; - f = H[5]; - g = H[6]; - h = H[7]; - - for (t = 0; t < numRounds; t += 1) { - if (t < 16) { - /* Bit of a hack - for 32-bit, the second term is ignored */ - W[t] = new Int(message[t * binaryStringMult + i], - message[t * binaryStringMult + i + 1]); - } else { - W[t] = safeAdd_4( - gamma1(W[t - 2]), W[t - 7], - gamma0(W[t - 15]), W[t - 16]); - } - - T1 = safeAdd_5(h, sigma1(e), ch(e, f, g), K[t], W[t]); - T2 = safeAdd_2(sigma0(a), maj(a, b, c)); - h = g; - g = f; - f = e; - e = safeAdd_2(d, T1); - d = c; - c = b; - b = a; - a = safeAdd_2(T1, T2); - } - - H[0] = safeAdd_2(a, H[0]); - H[1] = safeAdd_2(b, H[1]); - H[2] = safeAdd_2(c, H[2]); - H[3] = safeAdd_2(d, H[3]); - H[4] = safeAdd_2(e, H[4]); - H[5] = safeAdd_2(f, H[5]); - H[6] = safeAdd_2(g, H[6]); - H[7] = safeAdd_2(h, H[7]); - } - - switch (variant) { - case "SHA-224": - return [ - H[0], H[1], H[2], H[3], - H[4], H[5], H[6]]; - case "SHA-256": - return H; - case "SHA-384": - return [ - H[0].highOrder, H[0].lowOrder, - H[1].highOrder, H[1].lowOrder, - H[2].highOrder, H[2].lowOrder, - H[3].highOrder, H[3].lowOrder, - H[4].highOrder, H[4].lowOrder, - H[5].highOrder, H[5].lowOrder]; - case "SHA-512": - return [ - H[0].highOrder, H[0].lowOrder, - H[1].highOrder, H[1].lowOrder, - H[2].highOrder, H[2].lowOrder, - H[3].highOrder, H[3].lowOrder, - H[4].highOrder, H[4].lowOrder, - H[5].highOrder, H[5].lowOrder, - H[6].highOrder, H[6].lowOrder, - H[7].highOrder, H[7].lowOrder]; - default: - /* This should never be reached */ - throw new Error('Unknown SHA variant'); - } - }, - - /* - * jsSHA is the workhorse of the library. Instantiate it with the string to - * be hashed as the parameter - * - * @constructor - * @param {String} srcString The string to be hashed - * @param {String} inputFormat The format of srcString, ASCII or HEX - */ - jsSHA = function(srcString, inputFormat) { - - this.sha1 = null; - this.sha224 = null; - this.sha256 = null; - this.sha384 = null; - this.sha512 = null; - - this.strBinLen = null; - this.strToHash = null; - - /* Convert the input string into the correct type */ - if ("HEX" === inputFormat) { - if (0 !== (srcString.length % 2)) { - throw new Error("TEXT MUST BE IN BYTE INCREMENTS"); - } - this.strBinLen = srcString.length * 4; - this.strToHash = hex2binb(srcString); - } else if (("ASCII" === inputFormat) || - ('undefined' === typeof(inputFormat))) { - this.strBinLen = srcString.length * charSize; - this.strToHash = str2binb(srcString); - } else { - throw new Error("UNKNOWN TEXT INPUT TYPE"); - } - }; - - jsSHA.prototype = { - /* - * Returns the desired SHA hash of the string specified at instantiation - * using the specified parameters - * - * @param {String} variant The desired SHA variant (SHA-1, SHA-224, - * SHA-256, SHA-384, or SHA-512) - * @param {String} format The desired output formatting (B64 or HEX) - * @return The string representation of the hash in the format specified - */ - getHash: function(variant, format) { - var formatFunc = null, - message = this.strToHash.slice(); - - switch (format) { - case "HEX": - formatFunc = binb2hex; - break; - case "B64": - formatFunc = binb2b64; - break; - case "ASCII": - formatFunc = binb2str; - break; - default: - throw new Error("FORMAT NOT RECOGNIZED"); - } - - switch (variant) { - case "SHA-1": - if (null === this.sha1) { - this.sha1 = coreSHA1(message, this.strBinLen); - } - return formatFunc(this.sha1); - case "SHA-224": - if (null === this.sha224) { - this.sha224 = coreSHA2(message, this.strBinLen, variant); - } - return formatFunc(this.sha224); - case "SHA-256": - if (null === this.sha256) { - this.sha256 = coreSHA2(message, this.strBinLen, variant); - } - return formatFunc(this.sha256); - case "SHA-384": - if (null === this.sha384) { - this.sha384 = coreSHA2(message, this.strBinLen, variant); - } - return formatFunc(this.sha384); - case "SHA-512": - if (null === this.sha512) { - this.sha512 = coreSHA2(message, this.strBinLen, variant); - } - return formatFunc(this.sha512); - default: - throw new Error("HASH NOT RECOGNIZED"); - } - }, - - /* - * Returns the desired HMAC of the string specified at instantiation - * using the key and variant param. - * - * @param {String} key The key used to calculate the HMAC - * @param {String} inputFormat The format of key, ASCII or HEX - * @param {String} variant The desired SHA variant (SHA-1, SHA-224, - * SHA-256, SHA-384, or SHA-512) - * @param {String} outputFormat The desired output formatting - * (B64 or HEX) - * @return The string representation of the hash in the format specified - */ - getHMAC: function(key, inputFormat, variant, outputFormat) { - var formatFunc, keyToUse, blockByteSize, blockBitSize, i, - retVal, lastArrayIndex, keyBinLen, hashBitSize, - keyWithIPad = [], - keyWithOPad = []; - - /* Validate the output format selection */ - switch (outputFormat) { - case "HEX": - formatFunc = binb2hex; - break; - case "B64": - formatFunc = binb2b64; - break; - case "ASCII": - formatFunc = binb2str; - break; - default: - throw new Error("FORMAT NOT RECOGNIZED"); - } - - /* Validate the hash variant selection and set needed variables */ - switch (variant) { - case "SHA-1": - blockByteSize = 64; - hashBitSize = 160; - break; - case "SHA-224": - blockByteSize = 64; - hashBitSize = 224; - break; - case "SHA-256": - blockByteSize = 64; - hashBitSize = 256; - break; - case "SHA-384": - blockByteSize = 128; - hashBitSize = 384; - break; - case "SHA-512": - blockByteSize = 128; - hashBitSize = 512; - break; - default: - throw new Error("HASH NOT RECOGNIZED"); - } - - /* Validate input format selection */ - if ("HEX" === inputFormat) { - /* Nibbles must come in pairs */ - if (0 !== (key.length % 2)) { - throw new Error("KEY MUST BE IN BYTE INCREMENTS"); - } - keyToUse = hex2binb(key); - keyBinLen = key.length * 4; - } else if ("ASCII" === inputFormat) { - keyToUse = str2binb(key); - keyBinLen = key.length * charSize; - } else { - throw new Error("UNKNOWN KEY INPUT TYPE"); - } - - /* These are used multiple times, calculate and store them */ - blockBitSize = blockByteSize * 8; - lastArrayIndex = (blockByteSize / 4) - 1; - - /* Figure out what to do with the key based on its size relative to - * the hash's block size */ - if (blockByteSize < (keyBinLen / 8)) { - if ("SHA-1" === variant) { - keyToUse = coreSHA1(keyToUse, keyBinLen); - } else { - keyToUse = coreSHA2(keyToUse, keyBinLen, variant); - } - /* For all variants, the block size is bigger than the output - * size so there will never be a useful byte at the end of the - * string */ - keyToUse[lastArrayIndex] &= 0xFFFFFF00; - } else if (blockByteSize > (keyBinLen / 8)) { - /* If the blockByteSize is greater than the key length, there - * will always be at LEAST one "useless" byte at the end of the - * string */ - keyToUse[lastArrayIndex] &= 0xFFFFFF00; - } - - /* Create ipad and opad */ - for (i = 0; i <= lastArrayIndex; i += 1) { - keyWithIPad[i] = keyToUse[i] ^ 0x36363636; - keyWithOPad[i] = keyToUse[i] ^ 0x5C5C5C5C; - } - - /* Calculate the HMAC */ - if ("SHA-1" === variant) { - retVal = coreSHA1( - keyWithIPad.concat(this.strToHash), - blockBitSize + this.strBinLen); - retVal = coreSHA1( - keyWithOPad.concat(retVal), - blockBitSize + hashBitSize); - } else { - retVal = coreSHA2( - keyWithIPad.concat(this.strToHash), - blockBitSize + this.strBinLen, variant); - retVal = coreSHA2( - keyWithOPad.concat(retVal), - blockBitSize + hashBitSize, variant); - } - - return (formatFunc(retVal)); - } - }; - - return jsSHA; -}()); - -module.exports = { - /** SHA1 hash */ - sha1: function(str) { - var shaObj = new jsSHA(str, "ASCII"); - return shaObj.getHash("SHA-1", "ASCII"); - }, - /** SHA224 hash */ - sha224: function(str) { - var shaObj = new jsSHA(str, "ASCII"); - return shaObj.getHash("SHA-224", "ASCII"); - }, - /** SHA256 hash */ - sha256: function(str) { - var shaObj = new jsSHA(str, "ASCII"); - return shaObj.getHash("SHA-256", "ASCII"); - }, - /** SHA384 hash */ - sha384: function(str) { - var shaObj = new jsSHA(str, "ASCII"); - return shaObj.getHash("SHA-384", "ASCII"); - - }, - /** SHA512 hash */ - sha512: function(str) { - var shaObj = new jsSHA(str, "ASCII"); - return shaObj.getHash("SHA-512", "ASCII"); - } -}; - -},{}],32:[function(require,module,exports){ -/** - * @see module:crypto/crypto - * @module crypto - */ -module.exports = { - /** @see module:crypto/cipher */ - cipher: require('./cipher'), - /** @see module:crypto/hash */ - hash: require('./hash'), - /** @see module:crypto/cfb */ - cfb: require('./cfb.js'), - /** @see module:crypto/public_key */ - publicKey: require('./public_key'), - /** @see module:crypto/signature */ - signature: require('./signature.js'), - /** @see module:crypto/random */ - random: require('./random.js'), - /** @see module:crypto/pkcs1 */ - pkcs1: require('./pkcs1.js') -}; - -var crypto = require('./crypto.js'); - -for (var i in crypto) - module.exports[i] = crypto[i]; - -},{"./cfb.js":18,"./cipher":23,"./crypto.js":25,"./hash":28,"./pkcs1.js":33,"./public_key":36,"./random.js":39,"./signature.js":40}],33:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * PKCS1 encoding - * @requires crypto/crypto - * @requires crypto/hash - * @requires crypto/public_key/jsbn - * @requires crypto/random - * @requires util - * @module crypto/pkcs1 - */ - -/** - * ASN1 object identifiers for hashes (See {@link http://tools.ietf.org/html/rfc4880#section-5.2.2}) - */ -var hash_headers = []; -hash_headers[1] = [0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00, 0x04, - 0x10 -]; -hash_headers[2] = [0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14]; -hash_headers[3] = [0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x24, 0x03, 0x02, 0x01, 0x05, 0x00, 0x04, 0x14]; -hash_headers[8] = [0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, - 0x04, 0x20 -]; -hash_headers[9] = [0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, - 0x04, 0x30 -]; -hash_headers[10] = [0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, - 0x00, 0x04, 0x40 -]; -hash_headers[11] = [0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, - 0x00, 0x04, 0x1C -]; - -var crypto = require('./crypto.js'), - random = require('./random.js'), - util = require('../util.js'), - BigInteger = require('./public_key/jsbn.js'), - hash = require('./hash'); - -/** - * Create padding with secure random data - * @private - * @param {Integer} length Length of the padding in bytes - * @return {String} Padding as string - */ -function getPkcs1Padding(length) { - var result = ''; - var randomByte; - while (result.length < length) { - randomByte = random.getSecureRandomOctet(); - if (randomByte !== 0) { - result += String.fromCharCode(randomByte); - } - } - return result; -} - - -module.exports = { - eme: { - /** - * create a EME-PKCS1-v1_5 padding (See {@link http://tools.ietf.org/html/rfc4880#section-13.1.1|RFC 4880 13.1.1}) - * @param {String} M message to be encoded - * @param {Integer} k the length in octets of the key modulus - * @return {String} EME-PKCS1 padded message - */ - encode: function(M, k) { - var mLen = M.length; - // length checking - if (mLen > k - 11) { - throw new Error('Message too long'); - } - // Generate an octet string PS of length k - mLen - 3 consisting of - // pseudo-randomly generated nonzero octets - var PS = getPkcs1Padding(k - mLen - 3); - // Concatenate PS, the message M, and other padding to form an - // encoded message EM of length k octets as EM = 0x00 || 0x02 || PS || 0x00 || M. - var EM = String.fromCharCode(0) + - String.fromCharCode(2) + - PS + - String.fromCharCode(0) + - M; - return EM; - }, - /** - * decodes a EME-PKCS1-v1_5 padding (See {@link http://tools.ietf.org/html/rfc4880#section-13.1.2|RFC 4880 13.1.2}) - * @param {String} EM encoded message, an octet string - * @return {String} message, an octet string - */ - decode: function(EM) { - // leading zeros truncated by jsbn - if (EM.charCodeAt(0) !== 0) { - EM = String.fromCharCode(0) + EM; - } - var firstOct = EM.charCodeAt(0); - var secondOct = EM.charCodeAt(1); - var i = 2; - while (EM.charCodeAt(i) !== 0 && i < EM.length) { - i++; - } - var psLen = i - 2; - var separator = EM.charCodeAt(i++); - if (firstOct === 0 && secondOct === 2 && psLen >= 8 && separator === 0) { - return EM.substr(i); - } else { - throw new Error('Decryption error'); - } - } - }, - - emsa: { - /** - * create a EMSA-PKCS1-v1_5 padding (See {@link http://tools.ietf.org/html/rfc4880#section-13.1.3|RFC 4880 13.1.3}) - * @param {Integer} algo Hash algorithm type used - * @param {String} M message to be encoded - * @param {Integer} emLen intended length in octets of the encoded message - * @returns {String} encoded message - */ - encode: function(algo, M, emLen) { - var i; - // Apply the hash function to the message M to produce a hash value H - var H = hash.digest(algo, M); - if (H.length !== hash.getHashByteLength(algo)) { - throw new Error('Invalid hash length'); - } - // produce an ASN.1 DER value for the hash function used. - // Let T be the full hash prefix - var T = ''; - for (i = 0; i < hash_headers[algo].length; i++) { - T += String.fromCharCode(hash_headers[algo][i]); - } - // add hash value to prefix - T += H; - // and let tLen be the length in octets of T - var tLen = T.length; - if (emLen < tLen + 11) { - throw new Error('Intended encoded message length too short'); - } - // an octet string PS consisting of emLen - tLen - 3 octets with hexadecimal value 0xFF - // The length of PS will be at least 8 octets - var PS = ''; - for (i = 0; i < (emLen - tLen - 3); i++) { - PS += String.fromCharCode(0xff); - } - // Concatenate PS, the hash prefix T, and other padding to form the - // encoded message EM as EM = 0x00 || 0x01 || PS || 0x00 || T. - var EM = String.fromCharCode(0x00) + - String.fromCharCode(0x01) + - PS + - String.fromCharCode(0x00) + - T; - return new BigInteger(util.hexstrdump(EM), 16); - } - } -}; - -},{"../util.js":76,"./crypto.js":25,"./hash":28,"./public_key/jsbn.js":37,"./random.js":39}],34:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -// A Digital signature algorithm implementation - -/** - * @requires crypto/hash - * @requires crypto/public_key/jsbn - * @requires crypto/random - * @requires util - * @module crypto/public_key/dsa - */ - -var BigInteger = require('./jsbn.js'), - random = require('../random.js'), - hashModule = require('../hash'), - util = require('../../util.js'), - config = require('../../config'); - -function DSA() { - // s1 = ((g**s) mod p) mod q - // s1 = ((s**-1)*(sha-1(m)+(s1*x) mod q) - function sign(hashalgo, m, g, p, q, x) { - // If the output size of the chosen hash is larger than the number of - // bits of q, the hash result is truncated to fit by taking the number - // of leftmost bits equal to the number of bits of q. This (possibly - // truncated) hash function result is treated as a number and used - // directly in the DSA signature algorithm. - var hashed_data = util.getLeftNBits(hashModule.digest(hashalgo, m), q.bitLength()); - var hash = new BigInteger(util.hexstrdump(hashed_data), 16); - // FIPS-186-4, section 4.6: - // The values of r and s shall be checked to determine if r = 0 or s = 0. - // If either r = 0 or s = 0, a new value of k shall be generated, and the - // signature shall be recalculated. It is extremely unlikely that r = 0 - // or s = 0 if signatures are generated properly. - var k, s1, s2; - while (true) { - k = random.getRandomBigIntegerInRange(BigInteger.ONE, q.subtract(BigInteger.ONE)); - s1 = (g.modPow(k, p)).mod(q); - s2 = (k.modInverse(q).multiply(hash.add(x.multiply(s1)))).mod(q); - if (s1 != 0 && s2 != 0) { - break; - } - } - var result = []; - result[0] = s1.toMPI(); - result[1] = s2.toMPI(); - return result; - } - - function select_hash_algorithm(q) { - var usersetting = config.prefer_hash_algorithm; - /* - * 1024-bit key, 160-bit q, SHA-1, SHA-224, SHA-256, SHA-384, or SHA-512 hash - * 2048-bit key, 224-bit q, SHA-224, SHA-256, SHA-384, or SHA-512 hash - * 2048-bit key, 256-bit q, SHA-256, SHA-384, or SHA-512 hash - * 3072-bit key, 256-bit q, SHA-256, SHA-384, or SHA-512 hash - */ - switch (Math.round(q.bitLength() / 8)) { - case 20: - // 1024 bit - if (usersetting != 2 && - usersetting > 11 && - usersetting != 10 && - usersetting < 8) - return 2; // prefer sha1 - return usersetting; - case 28: - // 2048 bit - if (usersetting > 11 && - usersetting < 8) - return 11; - return usersetting; - case 32: - // 4096 bit // prefer sha224 - if (usersetting > 10 && - usersetting < 8) - return 8; // prefer sha256 - return usersetting; - default: - util.print_debug("DSA select hash algorithm: returning null for an unknown length of q"); - return null; - - } - } - this.select_hash_algorithm = select_hash_algorithm; - - function verify(hashalgo, s1, s2, m, p, q, g, y) { - var hashed_data = util.getLeftNBits(hashModule.digest(hashalgo, m), q.bitLength()); - var hash = new BigInteger(util.hexstrdump(hashed_data), 16); - if (BigInteger.ZERO.compareTo(s1) >= 0 || - s1.compareTo(q) >= 0 || - BigInteger.ZERO.compareTo(s2) >= 0 || - s2.compareTo(q) >= 0) { - util.print_debug("invalid DSA Signature"); - return null; - } - var w = s2.modInverse(q); - if (BigInteger.ZERO.compareTo(w) == 0) { - util.print_debug("invalid DSA Signature"); - return null; - } - var u1 = hash.multiply(w).mod(q); - var u2 = s1.multiply(w).mod(q); - return g.modPow(u1, p).multiply(y.modPow(u2, p)).mod(p).mod(q); - } - - /* - * unused code. This can be used as a start to write a key generator - * function. - - function generateKey(bitcount) { - var qi = new BigInteger(bitcount, primeCenterie); - var pi = generateP(q, 512); - var gi = generateG(p, q, bitcount); - var xi; - do { - xi = new BigInteger(q.bitCount(), rand); - } while (x.compareTo(BigInteger.ZERO) != 1 && x.compareTo(q) != -1); - var yi = g.modPow(x, p); - return {x: xi, q: qi, p: pi, g: gi, y: yi}; - } - - function generateP(q, bitlength, randomfn) { - if (bitlength % 64 != 0) { - return false; - } - var pTemp; - var pTemp2; - do { - pTemp = randomfn(bitcount, true); - pTemp2 = pTemp.subtract(BigInteger.ONE); - pTemp = pTemp.subtract(pTemp2.remainder(q)); - } while (!pTemp.isProbablePrime(primeCenterie) || pTemp.bitLength() != l); - return pTemp; - } - - function generateG(p, q, bitlength, randomfn) { - var aux = p.subtract(BigInteger.ONE); - var pow = aux.divide(q); - var gTemp; - do { - gTemp = randomfn(bitlength); - } while (gTemp.compareTo(aux) != -1 && gTemp.compareTo(BigInteger.ONE) != 1); - return gTemp.modPow(pow, p); - } - - function generateK(q, bitlength, randomfn) { - var tempK; - do { - tempK = randomfn(bitlength, false); - } while (tempK.compareTo(q) != -1 && tempK.compareTo(BigInteger.ZERO) != 1); - return tempK; - } - - function generateR(q,p) { - k = generateK(q); - var r = g.modPow(k, p).mod(q); - return r; - } - - function generateS(hashfn,k,r,m,q,x) { - var hash = hashfn(m); - s = (k.modInverse(q).multiply(hash.add(x.multiply(r)))).mod(q); - return s; - } */ - this.sign = sign; - this.verify = verify; - // this.generate = generateKey; -} - -module.exports = DSA; - -},{"../../config":17,"../../util.js":76,"../hash":28,"../random.js":39,"./jsbn.js":37}],35:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -// ElGamal implementation - -/** - * @requires crypto/public_key/jsbn - * @requires crypto/random - * @requires util - * @module crypto/public_key/elgamal - */ - -var BigInteger = require('./jsbn.js'), - random = require('../random.js'), - util = require('../../util.js'); - -function Elgamal() { - - function encrypt(m, g, p, y) { - // choose k in {2,...,p-2} - var pMinus2 = p.subtract(BigInteger.TWO); - var k = random.getRandomBigIntegerInRange(BigInteger.ONE, pMinus2); - k = k.mod(pMinus2).add(BigInteger.ONE); - var c = []; - c[0] = g.modPow(k, p); - c[1] = y.modPow(k, p).multiply(m).mod(p); - return c; - } - - function decrypt(c1, c2, p, x) { - util.print_debug("Elgamal Decrypt:\nc1:" + util.hexstrdump(c1.toMPI()) + "\n" + - "c2:" + util.hexstrdump(c2.toMPI()) + "\n" + - "p:" + util.hexstrdump(p.toMPI()) + "\n" + - "x:" + util.hexstrdump(x.toMPI())); - return (c1.modPow(x, p).modInverse(p)).multiply(c2).mod(p); - //var c = c1.pow(x).modInverse(p); // c0^-a mod p - //return c.multiply(c2).mod(p); - } - - // signing and signature verification using Elgamal is not required by OpenPGP. - this.encrypt = encrypt; - this.decrypt = decrypt; -} - -module.exports = Elgamal; - -},{"../../util.js":76,"../random.js":39,"./jsbn.js":37}],36:[function(require,module,exports){ -/** - * @requires crypto/public_key/dsa - * @requires crypto/public_key/elgamal - * @requires crypto/public_key/rsa - * @module crypto/public_key - */ -module.exports = { - /** @see module:crypto/public_key/rsa */ - rsa: require('./rsa.js'), - /** @see module:crypto/public_key/elgamal */ - elgamal: require('./elgamal.js'), - /** @see module:crypto/public_key/dsa */ - dsa: require('./dsa.js') -}; - -},{"./dsa.js":34,"./elgamal.js":35,"./rsa.js":38}],37:[function(require,module,exports){ -/* - * Copyright (c) 2003-2005 Tom Wu (tjw@cs.Stanford.EDU) - * All Rights Reserved. - * - * Modified by Recurity Labs GmbH - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF - * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT - * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * In addition, the following condition applies: - * - * All redistributions must retain an intact copy of this copyright notice - * and disclaimer. - */ - - -/** - * @requires util - * @module crypto/public_key/jsbn - */ - -var util = require('../../util.js'); - -// Basic JavaScript BN library - subset useful for RSA encryption. - -// Bits per digit -var dbits; - -// JavaScript engine analysis -var canary = 0xdeadbeefcafe; -var j_lm = ((canary & 0xffffff) == 0xefcafe); - -// (public) Constructor - -function BigInteger(a, b, c) { - if (a != null) - if ("number" == typeof a) this.fromNumber(a, b, c); - else if (b == null && "string" != typeof a) this.fromString(a, 256); - else this.fromString(a, b); -} - -// return new, unset BigInteger - -function nbi() { - return new BigInteger(null); -} - -// am: Compute w_j += (x*this_i), propagate carries, -// c is initial carry, returns final carry. -// c < 3*dvalue, x < 2*dvalue, this_i < dvalue -// We need to select the fastest one that works in this environment. - -// am1: use a single mult and divide to get the high bits, -// max digit bits should be 26 because -// max internal value = 2*dvalue^2-2*dvalue (< 2^53) - -function am1(i, x, w, j, c, n) { - while (--n >= 0) { - var v = x * this[i++] + w[j] + c; - c = Math.floor(v / 0x4000000); - w[j++] = v & 0x3ffffff; - } - return c; -} -// am2 avoids a big mult-and-extract completely. -// Max digit bits should be <= 30 because we do bitwise ops -// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) - -function am2(i, x, w, j, c, n) { - var xl = x & 0x7fff, - xh = x >> 15; - while (--n >= 0) { - var l = this[i] & 0x7fff; - var h = this[i++] >> 15; - var m = xh * l + h * xl; - l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff); - c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30); - w[j++] = l & 0x3fffffff; - } - return c; -} -// Alternately, set max digit bits to 28 since some -// browsers slow down when dealing with 32-bit numbers. - -function am3(i, x, w, j, c, n) { - var xl = x & 0x3fff, - xh = x >> 14; - while (--n >= 0) { - var l = this[i] & 0x3fff; - var h = this[i++] >> 14; - var m = xh * l + h * xl; - l = xl * l + ((m & 0x3fff) << 14) + w[j] + c; - c = (l >> 28) + (m >> 14) + xh * h; - w[j++] = l & 0xfffffff; - } - return c; -} -/*if(j_lm && (navigator != undefined && - navigator.appName == "Microsoft Internet Explorer")) { - BigInteger.prototype.am = am2; - dbits = 30; -} -else if(j_lm && (navigator != undefined && navigator.appName != "Netscape")) {*/ -BigInteger.prototype.am = am1; -dbits = 26; -/*} -else { // Mozilla/Netscape seems to prefer am3 - BigInteger.prototype.am = am3; - dbits = 28; -}*/ - -BigInteger.prototype.DB = dbits; -BigInteger.prototype.DM = ((1 << dbits) - 1); -BigInteger.prototype.DV = (1 << dbits); - -var BI_FP = 52; -BigInteger.prototype.FV = Math.pow(2, BI_FP); -BigInteger.prototype.F1 = BI_FP - dbits; -BigInteger.prototype.F2 = 2 * dbits - BI_FP; - -// Digit conversions -var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz"; -var BI_RC = new Array(); -var rr, vv; -rr = "0".charCodeAt(0); -for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv; -rr = "a".charCodeAt(0); -for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; -rr = "A".charCodeAt(0); -for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; - -function int2char(n) { - return BI_RM.charAt(n); -} - -function intAt(s, i) { - var c = BI_RC[s.charCodeAt(i)]; - return (c == null) ? -1 : c; -} - -// (protected) copy this to r - -function bnpCopyTo(r) { - for (var i = this.t - 1; i >= 0; --i) r[i] = this[i]; - r.t = this.t; - r.s = this.s; -} - -// (protected) set from integer value x, -DV <= x < DV - -function bnpFromInt(x) { - this.t = 1; - this.s = (x < 0) ? -1 : 0; - if (x > 0) this[0] = x; - else if (x < -1) this[0] = x + this.DV; - else this.t = 0; -} - -// return bigint initialized to value - -function nbv(i) { - var r = nbi(); - r.fromInt(i); - return r; -} - -// (protected) set from string and radix - -function bnpFromString(s, b) { - var k; - if (b == 16) k = 4; - else if (b == 8) k = 3; - else if (b == 256) k = 8; // byte array - else if (b == 2) k = 1; - else if (b == 32) k = 5; - else if (b == 4) k = 2; - else { - this.fromRadix(s, b); - return; - } - this.t = 0; - this.s = 0; - var i = s.length, - mi = false, - sh = 0; - while (--i >= 0) { - var x = (k == 8) ? s[i] & 0xff : intAt(s, i); - if (x < 0) { - if (s.charAt(i) == "-") mi = true; - continue; - } - mi = false; - if (sh == 0) - this[this.t++] = x; - else if (sh + k > this.DB) { - this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh; - this[this.t++] = (x >> (this.DB - sh)); - } else - this[this.t - 1] |= x << sh; - sh += k; - if (sh >= this.DB) sh -= this.DB; - } - if (k == 8 && (s[0] & 0x80) != 0) { - this.s = -1; - if (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh; - } - this.clamp(); - if (mi) BigInteger.ZERO.subTo(this, this); -} - -// (protected) clamp off excess high words - -function bnpClamp() { - var c = this.s & this.DM; - while (this.t > 0 && this[this.t - 1] == c)--this.t; -} - -// (public) return string representation in given radix - -function bnToString(b) { - if (this.s < 0) return "-" + this.negate().toString(b); - var k; - if (b == 16) k = 4; - else if (b == 8) k = 3; - else if (b == 2) k = 1; - else if (b == 32) k = 5; - else if (b == 4) k = 2; - else return this.toRadix(b); - var km = (1 << k) - 1, - d, m = false, - r = "", - i = this.t; - var p = this.DB - (i * this.DB) % k; - if (i-- > 0) { - if (p < this.DB && (d = this[i] >> p) > 0) { - m = true; - r = int2char(d); - } - while (i >= 0) { - if (p < k) { - d = (this[i] & ((1 << p) - 1)) << (k - p); - d |= this[--i] >> (p += this.DB - k); - } else { - d = (this[i] >> (p -= k)) & km; - if (p <= 0) { - p += this.DB; - --i; - } - } - if (d > 0) m = true; - if (m) r += int2char(d); - } - } - return m ? r : "0"; -} - -// (public) -this - -function bnNegate() { - var r = nbi(); - BigInteger.ZERO.subTo(this, r); - return r; -} - -// (public) |this| - -function bnAbs() { - return (this.s < 0) ? this.negate() : this; -} - -// (public) return + if this > a, - if this < a, 0 if equal - -function bnCompareTo(a) { - var r = this.s - a.s; - if (r != 0) return r; - var i = this.t; - r = i - a.t; - if (r != 0) return (this.s < 0) ? -r : r; - while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r; - return 0; -} - -// returns bit length of the integer x - -function nbits(x) { - var r = 1, - t; - if ((t = x >>> 16) != 0) { - x = t; - r += 16; - } - if ((t = x >> 8) != 0) { - x = t; - r += 8; - } - if ((t = x >> 4) != 0) { - x = t; - r += 4; - } - if ((t = x >> 2) != 0) { - x = t; - r += 2; - } - if ((t = x >> 1) != 0) { - x = t; - r += 1; - } - return r; -} - -// (public) return the number of bits in "this" - -function bnBitLength() { - if (this.t <= 0) return 0; - return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM)); -} - -// (protected) r = this << n*DB - -function bnpDLShiftTo(n, r) { - var i; - for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i]; - for (i = n - 1; i >= 0; --i) r[i] = 0; - r.t = this.t + n; - r.s = this.s; -} - -// (protected) r = this >> n*DB - -function bnpDRShiftTo(n, r) { - for (var i = n; i < this.t; ++i) r[i - n] = this[i]; - r.t = Math.max(this.t - n, 0); - r.s = this.s; -} - -// (protected) r = this << n - -function bnpLShiftTo(n, r) { - var bs = n % this.DB; - var cbs = this.DB - bs; - var bm = (1 << cbs) - 1; - var ds = Math.floor(n / this.DB), - c = (this.s << bs) & this.DM, - i; - for (i = this.t - 1; i >= 0; --i) { - r[i + ds + 1] = (this[i] >> cbs) | c; - c = (this[i] & bm) << bs; - } - for (i = ds - 1; i >= 0; --i) r[i] = 0; - r[ds] = c; - r.t = this.t + ds + 1; - r.s = this.s; - r.clamp(); -} - -// (protected) r = this >> n - -function bnpRShiftTo(n, r) { - r.s = this.s; - var ds = Math.floor(n / this.DB); - if (ds >= this.t) { - r.t = 0; - return; - } - var bs = n % this.DB; - var cbs = this.DB - bs; - var bm = (1 << bs) - 1; - r[0] = this[ds] >> bs; - for (var i = ds + 1; i < this.t; ++i) { - r[i - ds - 1] |= (this[i] & bm) << cbs; - r[i - ds] = this[i] >> bs; - } - if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs; - r.t = this.t - ds; - r.clamp(); -} - -// (protected) r = this - a - -function bnpSubTo(a, r) { - var i = 0, - c = 0, - m = Math.min(a.t, this.t); - while (i < m) { - c += this[i] - a[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - if (a.t < this.t) { - c -= a.s; - while (i < this.t) { - c += this[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c += this.s; - } else { - c += this.s; - while (i < a.t) { - c -= a[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c -= a.s; - } - r.s = (c < 0) ? -1 : 0; - if (c < -1) r[i++] = this.DV + c; - else if (c > 0) r[i++] = c; - r.t = i; - r.clamp(); -} - -// (protected) r = this * a, r != this,a (HAC 14.12) -// "this" should be the larger one if appropriate. - -function bnpMultiplyTo(a, r) { - var x = this.abs(), - y = a.abs(); - var i = x.t; - r.t = i + y.t; - while (--i >= 0) r[i] = 0; - for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t); - r.s = 0; - r.clamp(); - if (this.s != a.s) BigInteger.ZERO.subTo(r, r); -} - -// (protected) r = this^2, r != this (HAC 14.16) - -function bnpSquareTo(r) { - var x = this.abs(); - var i = r.t = 2 * x.t; - while (--i >= 0) r[i] = 0; - for (i = 0; i < x.t - 1; ++i) { - var c = x.am(i, x[i], r, 2 * i, 0, 1); - if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) { - r[i + x.t] -= x.DV; - r[i + x.t + 1] = 1; - } - } - if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1); - r.s = 0; - r.clamp(); -} - -// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) -// r != q, this != m. q or r may be null. - -function bnpDivRemTo(m, q, r) { - var pm = m.abs(); - if (pm.t <= 0) return; - var pt = this.abs(); - if (pt.t < pm.t) { - if (q != null) q.fromInt(0); - if (r != null) this.copyTo(r); - return; - } - if (r == null) r = nbi(); - var y = nbi(), - ts = this.s, - ms = m.s; - var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus - if (nsh > 0) { - pm.lShiftTo(nsh, y); - pt.lShiftTo(nsh, r); - } else { - pm.copyTo(y); - pt.copyTo(r); - } - var ys = y.t; - var y0 = y[ys - 1]; - if (y0 == 0) return; - var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0); - var d1 = this.FV / yt, - d2 = (1 << this.F1) / yt, - e = 1 << this.F2; - var i = r.t, - j = i - ys, - t = (q == null) ? nbi() : q; - y.dlShiftTo(j, t); - if (r.compareTo(t) >= 0) { - r[r.t++] = 1; - r.subTo(t, r); - } - BigInteger.ONE.dlShiftTo(ys, t); - t.subTo(y, y); // "negative" y so we can replace sub with am later - while (y.t < ys) y[y.t++] = 0; - while (--j >= 0) { - // Estimate quotient digit - var qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); - if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out - y.dlShiftTo(j, t); - r.subTo(t, r); - while (r[i] < --qd) r.subTo(t, r); - } - } - if (q != null) { - r.drShiftTo(ys, q); - if (ts != ms) BigInteger.ZERO.subTo(q, q); - } - r.t = ys; - r.clamp(); - if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder - if (ts < 0) BigInteger.ZERO.subTo(r, r); -} - -// (public) this mod a - -function bnMod(a) { - var r = nbi(); - this.abs().divRemTo(a, null, r); - if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r); - return r; -} - -// Modular reduction using "classic" algorithm - -function Classic(m) { - this.m = m; -} - -function cConvert(x) { - if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m); - else return x; -} - -function cRevert(x) { - return x; -} - -function cReduce(x) { - x.divRemTo(this.m, null, x); -} - -function cMulTo(x, y, r) { - x.multiplyTo(y, r); - this.reduce(r); -} - -function cSqrTo(x, r) { - x.squareTo(r); - this.reduce(r); -} - -Classic.prototype.convert = cConvert; -Classic.prototype.revert = cRevert; -Classic.prototype.reduce = cReduce; -Classic.prototype.mulTo = cMulTo; -Classic.prototype.sqrTo = cSqrTo; - -// (protected) return "-1/this % 2^DB"; useful for Mont. reduction -// justification: -// xy == 1 (mod m) -// xy = 1+km -// xy(2-xy) = (1+km)(1-km) -// x[y(2-xy)] = 1-k^2m^2 -// x[y(2-xy)] == 1 (mod m^2) -// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 -// should reduce x and y(2-xy) by m^2 at each step to keep size bounded. -// JS multiply "overflows" differently from C/C++, so care is needed here. - -function bnpInvDigit() { - if (this.t < 1) return 0; - var x = this[0]; - if ((x & 1) == 0) return 0; - var y = x & 3; // y == 1/x mod 2^2 - y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4 - y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8 - y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16 - // last step - calculate inverse mod DV directly; - // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints - y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits - // we really want the negative inverse, and -DV < y < DV - return (y > 0) ? this.DV - y : -y; -} - -// Montgomery reduction - -function Montgomery(m) { - this.m = m; - this.mp = m.invDigit(); - this.mpl = this.mp & 0x7fff; - this.mph = this.mp >> 15; - this.um = (1 << (m.DB - 15)) - 1; - this.mt2 = 2 * m.t; -} - -// xR mod m - -function montConvert(x) { - var r = nbi(); - x.abs().dlShiftTo(this.m.t, r); - r.divRemTo(this.m, null, r); - if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r); - return r; -} - -// x/R mod m - -function montRevert(x) { - var r = nbi(); - x.copyTo(r); - this.reduce(r); - return r; -} - -// x = x/R mod m (HAC 14.32) - -function montReduce(x) { - while (x.t <= this.mt2) // pad x so am has enough room later - x[x.t++] = 0; - for (var i = 0; i < this.m.t; ++i) { - // faster way of calculating u0 = x[i]*mp mod DV - var j = x[i] & 0x7fff; - var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM; - // use am to combine the multiply-shift-add into one call - j = i + this.m.t; - x[j] += this.m.am(0, u0, x, i, 0, this.m.t); - // propagate carry - while (x[j] >= x.DV) { - x[j] -= x.DV; - x[++j]++; - } - } - x.clamp(); - x.drShiftTo(this.m.t, x); - if (x.compareTo(this.m) >= 0) x.subTo(this.m, x); -} - -// r = "x^2/R mod m"; x != r - -function montSqrTo(x, r) { - x.squareTo(r); - this.reduce(r); -} - -// r = "xy/R mod m"; x,y != r - -function montMulTo(x, y, r) { - x.multiplyTo(y, r); - this.reduce(r); -} - -Montgomery.prototype.convert = montConvert; -Montgomery.prototype.revert = montRevert; -Montgomery.prototype.reduce = montReduce; -Montgomery.prototype.mulTo = montMulTo; -Montgomery.prototype.sqrTo = montSqrTo; - -// (protected) true iff this is even - -function bnpIsEven() { - return ((this.t > 0) ? (this[0] & 1) : this.s) == 0; -} - -// (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) - -function bnpExp(e, z) { - if (e > 0xffffffff || e < 1) return BigInteger.ONE; - var r = nbi(), - r2 = nbi(), - g = z.convert(this), - i = nbits(e) - 1; - g.copyTo(r); - while (--i >= 0) { - z.sqrTo(r, r2); - if ((e & (1 << i)) > 0) z.mulTo(r2, g, r); - else { - var t = r; - r = r2; - r2 = t; - } - } - return z.revert(r); -} - -// (public) this^e % m, 0 <= e < 2^32 - -function bnModPowInt(e, m) { - var z; - if (e < 256 || m.isEven()) z = new Classic(m); - else z = new Montgomery(m); - return this.exp(e, z); -} - -// protected -BigInteger.prototype.copyTo = bnpCopyTo; -BigInteger.prototype.fromInt = bnpFromInt; -BigInteger.prototype.fromString = bnpFromString; -BigInteger.prototype.clamp = bnpClamp; -BigInteger.prototype.dlShiftTo = bnpDLShiftTo; -BigInteger.prototype.drShiftTo = bnpDRShiftTo; -BigInteger.prototype.lShiftTo = bnpLShiftTo; -BigInteger.prototype.rShiftTo = bnpRShiftTo; -BigInteger.prototype.subTo = bnpSubTo; -BigInteger.prototype.multiplyTo = bnpMultiplyTo; -BigInteger.prototype.squareTo = bnpSquareTo; -BigInteger.prototype.divRemTo = bnpDivRemTo; -BigInteger.prototype.invDigit = bnpInvDigit; -BigInteger.prototype.isEven = bnpIsEven; -BigInteger.prototype.exp = bnpExp; - -// public -BigInteger.prototype.toString = bnToString; -BigInteger.prototype.negate = bnNegate; -BigInteger.prototype.abs = bnAbs; -BigInteger.prototype.compareTo = bnCompareTo; -BigInteger.prototype.bitLength = bnBitLength; -BigInteger.prototype.mod = bnMod; -BigInteger.prototype.modPowInt = bnModPowInt; - -// "constants" -BigInteger.ZERO = nbv(0); -BigInteger.ONE = nbv(1); -BigInteger.TWO = nbv(2); - -module.exports = BigInteger; - - - - - - - - - - - - - - - - - - - -/* - * Copyright (c) 2003-2005 Tom Wu (tjw@cs.Stanford.EDU) - * All Rights Reserved. - * - * Modified by Recurity Labs GmbH - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF - * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT - * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * In addition, the following condition applies: - * - * All redistributions must retain an intact copy of this copyright notice - * and disclaimer. - */ - - -// Extended JavaScript BN functions, required for RSA private ops. - -// Version 1.1: new BigInteger("0", 10) returns "proper" zero -// Version 1.2: square() API, isProbablePrime fix - -// (public) -function bnClone() { - var r = nbi(); - this.copyTo(r); - return r; -} - -// (public) return value as integer - -function bnIntValue() { - if (this.s < 0) { - if (this.t == 1) return this[0] - this.DV; - else if (this.t == 0) return -1; - } else if (this.t == 1) return this[0]; - else if (this.t == 0) return 0; - // assumes 16 < DB < 32 - return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0]; -} - -// (public) return value as byte - -function bnByteValue() { - return (this.t == 0) ? this.s : (this[0] << 24) >> 24; -} - -// (public) return value as short (assumes DB>=16) - -function bnShortValue() { - return (this.t == 0) ? this.s : (this[0] << 16) >> 16; -} - -// (protected) return x s.t. r^x < DV - -function bnpChunkSize(r) { - return Math.floor(Math.LN2 * this.DB / Math.log(r)); -} - -// (public) 0 if this == 0, 1 if this > 0 - -function bnSigNum() { - if (this.s < 0) return -1; - else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0; - else return 1; -} - -// (protected) convert to radix string - -function bnpToRadix(b) { - if (b == null) b = 10; - if (this.signum() == 0 || b < 2 || b > 36) return "0"; - var cs = this.chunkSize(b); - var a = Math.pow(b, cs); - var d = nbv(a), - y = nbi(), - z = nbi(), - r = ""; - this.divRemTo(d, y, z); - while (y.signum() > 0) { - r = (a + z.intValue()).toString(b).substr(1) + r; - y.divRemTo(d, y, z); - } - return z.intValue().toString(b) + r; -} - -// (protected) convert from radix string - -function bnpFromRadix(s, b) { - this.fromInt(0); - if (b == null) b = 10; - var cs = this.chunkSize(b); - var d = Math.pow(b, cs), - mi = false, - j = 0, - w = 0; - for (var i = 0; i < s.length; ++i) { - var x = intAt(s, i); - if (x < 0) { - if (s.charAt(i) == "-" && this.signum() == 0) mi = true; - continue; - } - w = b * w + x; - if (++j >= cs) { - this.dMultiply(d); - this.dAddOffset(w, 0); - j = 0; - w = 0; - } - } - if (j > 0) { - this.dMultiply(Math.pow(b, j)); - this.dAddOffset(w, 0); - } - if (mi) BigInteger.ZERO.subTo(this, this); -} - -// (protected) alternate constructor - -function bnpFromNumber(a, b, c) { - if ("number" == typeof b) { - // new BigInteger(int,int,RNG) - if (a < 2) this.fromInt(1); - else { - this.fromNumber(a, c); - if (!this.testBit(a - 1)) // force MSB set - this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this); - if (this.isEven()) this.dAddOffset(1, 0); // force odd - while (!this.isProbablePrime(b)) { - this.dAddOffset(2, 0); - if (this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a - 1), this); - } - } - } else { - // new BigInteger(int,RNG) - var x = new Array(), - t = a & 7; - x.length = (a >> 3) + 1; - b.nextBytes(x); - if (t > 0) x[0] &= ((1 << t) - 1); - else x[0] = 0; - this.fromString(x, 256); - } -} - -// (public) convert to bigendian byte array - -function bnToByteArray() { - var i = this.t, - r = new Array(); - r[0] = this.s; - var p = this.DB - (i * this.DB) % 8, - d, k = 0; - if (i-- > 0) { - if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) - r[k++] = d | (this.s << (this.DB - p)); - while (i >= 0) { - if (p < 8) { - d = (this[i] & ((1 << p) - 1)) << (8 - p); - d |= this[--i] >> (p += this.DB - 8); - } else { - d = (this[i] >> (p -= 8)) & 0xff; - if (p <= 0) { - p += this.DB; - --i; - } - } - //if((d&0x80) != 0) d |= -256; - //if(k == 0 && (this.s&0x80) != (d&0x80)) ++k; - if (k > 0 || d != this.s) r[k++] = d; - } - } - return r; -} - -function bnEquals(a) { - return (this.compareTo(a) == 0); -} - -function bnMin(a) { - return (this.compareTo(a) < 0) ? this : a; -} - -function bnMax(a) { - return (this.compareTo(a) > 0) ? this : a; -} - -// (protected) r = this op a (bitwise) - -function bnpBitwiseTo(a, op, r) { - var i, f, m = Math.min(a.t, this.t); - for (i = 0; i < m; ++i) r[i] = op(this[i], a[i]); - if (a.t < this.t) { - f = a.s & this.DM; - for (i = m; i < this.t; ++i) r[i] = op(this[i], f); - r.t = this.t; - } else { - f = this.s & this.DM; - for (i = m; i < a.t; ++i) r[i] = op(f, a[i]); - r.t = a.t; - } - r.s = op(this.s, a.s); - r.clamp(); -} - -// (public) this & a - -function op_and(x, y) { - return x & y; -} - -function bnAnd(a) { - var r = nbi(); - this.bitwiseTo(a, op_and, r); - return r; -} - -// (public) this | a - -function op_or(x, y) { - return x | y; -} - -function bnOr(a) { - var r = nbi(); - this.bitwiseTo(a, op_or, r); - return r; -} - -// (public) this ^ a - -function op_xor(x, y) { - return x ^ y; -} - -function bnXor(a) { - var r = nbi(); - this.bitwiseTo(a, op_xor, r); - return r; -} - -// (public) this & ~a - -function op_andnot(x, y) { - return x & ~y; -} - -function bnAndNot(a) { - var r = nbi(); - this.bitwiseTo(a, op_andnot, r); - return r; -} - -// (public) ~this - -function bnNot() { - var r = nbi(); - for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i]; - r.t = this.t; - r.s = ~this.s; - return r; -} - -// (public) this << n - -function bnShiftLeft(n) { - var r = nbi(); - if (n < 0) this.rShiftTo(-n, r); - else this.lShiftTo(n, r); - return r; -} - -// (public) this >> n - -function bnShiftRight(n) { - var r = nbi(); - if (n < 0) this.lShiftTo(-n, r); - else this.rShiftTo(n, r); - return r; -} - -// return index of lowest 1-bit in x, x < 2^31 - -function lbit(x) { - if (x == 0) return -1; - var r = 0; - if ((x & 0xffff) == 0) { - x >>= 16; - r += 16; - } - if ((x & 0xff) == 0) { - x >>= 8; - r += 8; - } - if ((x & 0xf) == 0) { - x >>= 4; - r += 4; - } - if ((x & 3) == 0) { - x >>= 2; - r += 2; - } - if ((x & 1) == 0)++r; - return r; -} - -// (public) returns index of lowest 1-bit (or -1 if none) - -function bnGetLowestSetBit() { - for (var i = 0; i < this.t; ++i) - if (this[i] != 0) return i * this.DB + lbit(this[i]); - if (this.s < 0) return this.t * this.DB; - return -1; -} - -// return number of 1 bits in x - -function cbit(x) { - var r = 0; - while (x != 0) { - x &= x - 1; - ++r; - } - return r; -} - -// (public) return number of set bits - -function bnBitCount() { - var r = 0, - x = this.s & this.DM; - for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x); - return r; -} - -// (public) true iff nth bit is set - -function bnTestBit(n) { - var j = Math.floor(n / this.DB); - if (j >= this.t) return (this.s != 0); - return ((this[j] & (1 << (n % this.DB))) != 0); -} - -// (protected) this op (1<>= this.DB; - } - if (a.t < this.t) { - c += a.s; - while (i < this.t) { - c += this[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c += this.s; - } else { - c += this.s; - while (i < a.t) { - c += a[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c += a.s; - } - r.s = (c < 0) ? -1 : 0; - if (c > 0) r[i++] = c; - else if (c < -1) r[i++] = this.DV + c; - r.t = i; - r.clamp(); -} - -// (public) this + a - -function bnAdd(a) { - var r = nbi(); - this.addTo(a, r); - return r; -} - -// (public) this - a - -function bnSubtract(a) { - var r = nbi(); - this.subTo(a, r); - return r; -} - -// (public) this * a - -function bnMultiply(a) { - var r = nbi(); - this.multiplyTo(a, r); - return r; -} - -// (public) this^2 - -function bnSquare() { - var r = nbi(); - this.squareTo(r); - return r; -} - -// (public) this / a - -function bnDivide(a) { - var r = nbi(); - this.divRemTo(a, r, null); - return r; -} - -// (public) this % a - -function bnRemainder(a) { - var r = nbi(); - this.divRemTo(a, null, r); - return r; -} - -// (public) [this/a,this%a] - -function bnDivideAndRemainder(a) { - var q = nbi(), - r = nbi(); - this.divRemTo(a, q, r); - return new Array(q, r); -} - -// (protected) this *= n, this >= 0, 1 < n < DV - -function bnpDMultiply(n) { - this[this.t] = this.am(0, n - 1, this, 0, 0, this.t); - ++this.t; - this.clamp(); -} - -// (protected) this += n << w words, this >= 0 - -function bnpDAddOffset(n, w) { - if (n == 0) return; - while (this.t <= w) this[this.t++] = 0; - this[w] += n; - while (this[w] >= this.DV) { - this[w] -= this.DV; - if (++w >= this.t) this[this.t++] = 0; - ++this[w]; - } -} - -// A "null" reducer - -function NullExp() {} - -function nNop(x) { - return x; -} - -function nMulTo(x, y, r) { - x.multiplyTo(y, r); -} - -function nSqrTo(x, r) { - x.squareTo(r); -} - -NullExp.prototype.convert = nNop; -NullExp.prototype.revert = nNop; -NullExp.prototype.mulTo = nMulTo; -NullExp.prototype.sqrTo = nSqrTo; - -// (public) this^e - -function bnPow(e) { - return this.exp(e, new NullExp()); -} - -// (protected) r = lower n words of "this * a", a.t <= n -// "this" should be the larger one if appropriate. - -function bnpMultiplyLowerTo(a, n, r) { - var i = Math.min(this.t + a.t, n); - r.s = 0; // assumes a,this >= 0 - r.t = i; - while (i > 0) r[--i] = 0; - var j; - for (j = r.t - this.t; i < j; ++i) r[i + this.t] = this.am(0, a[i], r, i, 0, this.t); - for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i); - r.clamp(); -} - -// (protected) r = "this * a" without lower n words, n > 0 -// "this" should be the larger one if appropriate. - -function bnpMultiplyUpperTo(a, n, r) { - --n; - var i = r.t = this.t + a.t - n; - r.s = 0; // assumes a,this >= 0 - while (--i >= 0) r[i] = 0; - for (i = Math.max(n - this.t, 0); i < a.t; ++i) - r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n); - r.clamp(); - r.drShiftTo(1, r); -} - -// Barrett modular reduction - -function Barrett(m) { - // setup Barrett - this.r2 = nbi(); - this.q3 = nbi(); - BigInteger.ONE.dlShiftTo(2 * m.t, this.r2); - this.mu = this.r2.divide(m); - this.m = m; -} - -function barrettConvert(x) { - if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m); - else if (x.compareTo(this.m) < 0) return x; - else { - var r = nbi(); - x.copyTo(r); - this.reduce(r); - return r; - } -} - -function barrettRevert(x) { - return x; -} - -// x = x mod m (HAC 14.42) - -function barrettReduce(x) { - x.drShiftTo(this.m.t - 1, this.r2); - if (x.t > this.m.t + 1) { - x.t = this.m.t + 1; - x.clamp(); - } - this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3); - this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); - while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1); - x.subTo(this.r2, x); - while (x.compareTo(this.m) >= 0) x.subTo(this.m, x); -} - -// r = x^2 mod m; x != r - -function barrettSqrTo(x, r) { - x.squareTo(r); - this.reduce(r); -} - -// r = x*y mod m; x,y != r - -function barrettMulTo(x, y, r) { - x.multiplyTo(y, r); - this.reduce(r); -} - -Barrett.prototype.convert = barrettConvert; -Barrett.prototype.revert = barrettRevert; -Barrett.prototype.reduce = barrettReduce; -Barrett.prototype.mulTo = barrettMulTo; -Barrett.prototype.sqrTo = barrettSqrTo; - -// (public) this^e % m (HAC 14.85) - -function bnModPow(e, m) { - var i = e.bitLength(), - k, r = nbv(1), - z; - if (i <= 0) return r; - else if (i < 18) k = 1; - else if (i < 48) k = 3; - else if (i < 144) k = 4; - else if (i < 768) k = 5; - else k = 6; - if (i < 8) - z = new Classic(m); - else if (m.isEven()) - z = new Barrett(m); - else - z = new Montgomery(m); - - // precomputation - var g = new Array(), - n = 3, - k1 = k - 1, - km = (1 << k) - 1; - g[1] = z.convert(this); - if (k > 1) { - var g2 = nbi(); - z.sqrTo(g[1], g2); - while (n <= km) { - g[n] = nbi(); - z.mulTo(g2, g[n - 2], g[n]); - n += 2; - } - } - - var j = e.t - 1, - w, is1 = true, - r2 = nbi(), - t; - i = nbits(e[j]) - 1; - while (j >= 0) { - if (i >= k1) w = (e[j] >> (i - k1)) & km; - else { - w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i); - if (j > 0) w |= e[j - 1] >> (this.DB + i - k1); - } - - n = k; - while ((w & 1) == 0) { - w >>= 1; - --n; - } - if ((i -= n) < 0) { - i += this.DB; - --j; - } - if (is1) { // ret == 1, don't bother squaring or multiplying it - g[w].copyTo(r); - is1 = false; - } else { - while (n > 1) { - z.sqrTo(r, r2); - z.sqrTo(r2, r); - n -= 2; - } - if (n > 0) z.sqrTo(r, r2); - else { - t = r; - r = r2; - r2 = t; - } - z.mulTo(r2, g[w], r); - } - - while (j >= 0 && (e[j] & (1 << i)) == 0) { - z.sqrTo(r, r2); - t = r; - r = r2; - r2 = t; - if (--i < 0) { - i = this.DB - 1; - --j; - } - } - } - return z.revert(r); -} - -// (public) gcd(this,a) (HAC 14.54) - -function bnGCD(a) { - var x = (this.s < 0) ? this.negate() : this.clone(); - var y = (a.s < 0) ? a.negate() : a.clone(); - if (x.compareTo(y) < 0) { - var t = x; - x = y; - y = t; - } - var i = x.getLowestSetBit(), - g = y.getLowestSetBit(); - if (g < 0) return x; - if (i < g) g = i; - if (g > 0) { - x.rShiftTo(g, x); - y.rShiftTo(g, y); - } - while (x.signum() > 0) { - if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x); - if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y); - if (x.compareTo(y) >= 0) { - x.subTo(y, x); - x.rShiftTo(1, x); - } else { - y.subTo(x, y); - y.rShiftTo(1, y); - } - } - if (g > 0) y.lShiftTo(g, y); - return y; -} - -// (protected) this % n, n < 2^26 - -function bnpModInt(n) { - if (n <= 0) return 0; - var d = this.DV % n, - r = (this.s < 0) ? n - 1 : 0; - if (this.t > 0) - if (d == 0) r = this[0] % n; - else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n; - return r; -} - -// (public) 1/this % m (HAC 14.61) - -function bnModInverse(m) { - var ac = m.isEven(); - if ((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO; - var u = m.clone(), - v = this.clone(); - var a = nbv(1), - b = nbv(0), - c = nbv(0), - d = nbv(1); - while (u.signum() != 0) { - while (u.isEven()) { - u.rShiftTo(1, u); - if (ac) { - if (!a.isEven() || !b.isEven()) { - a.addTo(this, a); - b.subTo(m, b); - } - a.rShiftTo(1, a); - } else if (!b.isEven()) b.subTo(m, b); - b.rShiftTo(1, b); - } - while (v.isEven()) { - v.rShiftTo(1, v); - if (ac) { - if (!c.isEven() || !d.isEven()) { - c.addTo(this, c); - d.subTo(m, d); - } - c.rShiftTo(1, c); - } else if (!d.isEven()) d.subTo(m, d); - d.rShiftTo(1, d); - } - if (u.compareTo(v) >= 0) { - u.subTo(v, u); - if (ac) a.subTo(c, a); - b.subTo(d, b); - } else { - v.subTo(u, v); - if (ac) c.subTo(a, c); - d.subTo(b, d); - } - } - if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO; - if (d.compareTo(m) >= 0) return d.subtract(m); - if (d.signum() < 0) d.addTo(m, d); - else return d; - if (d.signum() < 0) return d.add(m); - else return d; -} - -var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, - 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, - 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, - 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, - 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, - 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, - 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, - 977, 983, 991, 997 -]; -var lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; - -// (public) test primality with certainty >= 1-.5^t - -function bnIsProbablePrime(t) { - var i, x = this.abs(); - if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) { - for (i = 0; i < lowprimes.length; ++i) - if (x[0] == lowprimes[i]) return true; - return false; - } - if (x.isEven()) return false; - i = 1; - while (i < lowprimes.length) { - var m = lowprimes[i], - j = i + 1; - while (j < lowprimes.length && m < lplim) m *= lowprimes[j++]; - m = x.modInt(m); - while (i < j) if (m % lowprimes[i++] == 0) return false; - } - return x.millerRabin(t); -} - -/* added by Recurity Labs */ - -function nbits(x) { - var n = 1, - t; - if ((t = x >>> 16) != 0) { - x = t; - n += 16; - } - if ((t = x >> 8) != 0) { - x = t; - n += 8; - } - if ((t = x >> 4) != 0) { - x = t; - n += 4; - } - if ((t = x >> 2) != 0) { - x = t; - n += 2; - } - if ((t = x >> 1) != 0) { - x = t; - n += 1; - } - return n; -} - -function bnToMPI() { - var ba = this.toByteArray(); - var size = (ba.length - 1) * 8 + nbits(ba[0]); - var result = ""; - result += String.fromCharCode((size & 0xFF00) >> 8); - result += String.fromCharCode(size & 0xFF); - result += util.bin2str(ba); - return result; -} -/* END of addition */ - -// (protected) true if probably prime (HAC 4.24, Miller-Rabin) -function bnpMillerRabin(t) { - var n1 = this.subtract(BigInteger.ONE); - var k = n1.getLowestSetBit(); - if (k <= 0) return false; - var r = n1.shiftRight(k); - t = (t + 1) >> 1; - if (t > lowprimes.length) t = lowprimes.length; - var a = nbi(); - var j, bases = []; - for (var i = 0; i < t; ++i) { - //Pick bases at random, instead of starting at 2 - for (;;) { - j = lowprimes[Math.floor(Math.random() * lowprimes.length)]; - if (bases.indexOf(j) == -1) break; - } - bases.push(j); - a.fromInt(j); - var y = a.modPow(r, this); - if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { - var j = 1; - while (j++ < k && y.compareTo(n1) != 0) { - y = y.modPowInt(2, this); - if (y.compareTo(BigInteger.ONE) == 0) return false; - } - if (y.compareTo(n1) != 0) return false; - } - } - return true; -} - -var BigInteger = require('./jsbn.js'); - -// protected -BigInteger.prototype.chunkSize = bnpChunkSize; -BigInteger.prototype.toRadix = bnpToRadix; -BigInteger.prototype.fromRadix = bnpFromRadix; -BigInteger.prototype.fromNumber = bnpFromNumber; -BigInteger.prototype.bitwiseTo = bnpBitwiseTo; -BigInteger.prototype.changeBit = bnpChangeBit; -BigInteger.prototype.addTo = bnpAddTo; -BigInteger.prototype.dMultiply = bnpDMultiply; -BigInteger.prototype.dAddOffset = bnpDAddOffset; -BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; -BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; -BigInteger.prototype.modInt = bnpModInt; -BigInteger.prototype.millerRabin = bnpMillerRabin; - -// public -BigInteger.prototype.clone = bnClone; -BigInteger.prototype.intValue = bnIntValue; -BigInteger.prototype.byteValue = bnByteValue; -BigInteger.prototype.shortValue = bnShortValue; -BigInteger.prototype.signum = bnSigNum; -BigInteger.prototype.toByteArray = bnToByteArray; -BigInteger.prototype.equals = bnEquals; -BigInteger.prototype.min = bnMin; -BigInteger.prototype.max = bnMax; -BigInteger.prototype.and = bnAnd; -BigInteger.prototype.or = bnOr; -BigInteger.prototype.xor = bnXor; -BigInteger.prototype.andNot = bnAndNot; -BigInteger.prototype.not = bnNot; -BigInteger.prototype.shiftLeft = bnShiftLeft; -BigInteger.prototype.shiftRight = bnShiftRight; -BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; -BigInteger.prototype.bitCount = bnBitCount; -BigInteger.prototype.testBit = bnTestBit; -BigInteger.prototype.setBit = bnSetBit; -BigInteger.prototype.clearBit = bnClearBit; -BigInteger.prototype.flipBit = bnFlipBit; -BigInteger.prototype.add = bnAdd; -BigInteger.prototype.subtract = bnSubtract; -BigInteger.prototype.multiply = bnMultiply; -BigInteger.prototype.divide = bnDivide; -BigInteger.prototype.remainder = bnRemainder; -BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder; -BigInteger.prototype.modPow = bnModPow; -BigInteger.prototype.modInverse = bnModInverse; -BigInteger.prototype.pow = bnPow; -BigInteger.prototype.gcd = bnGCD; -BigInteger.prototype.isProbablePrime = bnIsProbablePrime; -BigInteger.prototype.toMPI = bnToMPI; - -// JSBN-specific extension -BigInteger.prototype.square = bnSquare; - -},{"../../util.js":76,"./jsbn.js":37}],38:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -// RSA implementation - -/** - * @requires crypto/public_key/jsbn - * @requires crypto/random - * @requires util - * @module crypto/public_key/rsa - */ - -var BigInteger = require('./jsbn.js'), - util = require('../../util.js'), - random = require('../random.js'), - config = require('../../config'); - -function SecureRandom() { - function nextBytes(byteArray) { - for (var n = 0; n < byteArray.length; n++) { - byteArray[n] = random.getSecureRandomOctet(); - } - } - this.nextBytes = nextBytes; -} - -var blinder = BigInteger.ZERO; -var unblinder = BigInteger.ZERO; - -function blind(m, n, e) { - if (unblinder.bitLength() === n.bitLength()) { - unblinder = unblinder.square().mod(n); - } else { - unblinder = random.getRandomBigIntegerInRange(BigInteger.TWO, n); - } - blinder = unblinder.modInverse(n).modPow(e, n); - return m.multiply(blinder).mod(n); -} - -function unblind(t, n) { - return t.multiply(unblinder).mod(n); -} - -function RSA() { - /** - * This function uses jsbn Big Num library to decrypt RSA - * @param m - * message - * @param n - * RSA public modulus n as BigInteger - * @param e - * RSA public exponent as BigInteger - * @param d - * RSA d as BigInteger - * @param p - * RSA p as BigInteger - * @param q - * RSA q as BigInteger - * @param u - * RSA u as BigInteger - * @return {BigInteger} The decrypted value of the message - */ - function decrypt(m, n, e, d, p, q, u) { - if (config.rsa_blinding) { - m = blind(m, n, e); - } - var xp = m.mod(p).modPow(d.mod(p.subtract(BigInteger.ONE)), p); - var xq = m.mod(q).modPow(d.mod(q.subtract(BigInteger.ONE)), q); - util.print_debug("rsa.js decrypt\nxpn:" + util.hexstrdump(xp.toMPI()) + "\nxqn:" + util.hexstrdump(xq.toMPI())); - - var t = xq.subtract(xp); - if (t[0] === 0) { - t = xp.subtract(xq); - t = t.multiply(u).mod(q); - t = q.subtract(t); - } else { - t = t.multiply(u).mod(q); - } - t = t.multiply(p).add(xp); - if (config.rsa_blinding) { - t = unblind(t, n); - } - return t; - } - - /** - * encrypt message - * @param m message as BigInteger - * @param e public MPI part as BigInteger - * @param n public MPI part as BigInteger - * @return BigInteger - */ - function encrypt(m, e, n) { - return m.modPowInt(e, n); - } - - /* Sign and Verify */ - function sign(m, d, n) { - return m.modPow(d, n); - } - - function verify(x, e, n) { - return x.modPowInt(e, n); - } - - // "empty" RSA key constructor - - function keyObject() { - this.n = null; - this.e = 0; - this.ee = null; - this.d = null; - this.p = null; - this.q = null; - this.dmp1 = null; - this.dmq1 = null; - this.u = null; - } - - // Generate a new random private key B bits long, using public expt E - - function generate(B, E) { - var webCrypto = util.getWebCrypto(); - - // - // Native RSA keygen using Web Crypto - // - - if (webCrypto) { - var Euint32 = new Uint32Array([parseInt(E, 16)]); // get integer of exponent - var Euint8 = new Uint8Array(Euint32.buffer); // get bytes of exponent - var keyGenOpt; - - var keys; - if (window.crypto && window.crypto.webkitSubtle) { - // outdated spec implemented by Webkit - keyGenOpt = { - name: 'RSA-OAEP', - modulusLength: B, // the specified keysize in bits - publicExponent: Euint8.subarray(0, 3) // take three bytes (max 65537) - }; - keys = webCrypto.generateKey(keyGenOpt, true, ['encrypt', 'decrypt']); - } - else { - // current standard spec - keyGenOpt = { - name: 'RSASSA-PKCS1-v1_5', - modulusLength: B, // the specified keysize in bits - publicExponent: Euint8.subarray(0, 3), // take three bytes (max 65537) - hash: { - name: 'SHA-1' // not required for actual RSA keys, but for crypto api 'sign' and 'verify' - } - }; - - keys = webCrypto.generateKey(keyGenOpt, true, ['sign', 'verify']); - if (!(typeof keys.then === 'function')) { // IE11 KeyOperation - keys = convertKeyOperation(keys, 'Error generating RSA key pair.'); - } - } - - return keys.then(exportKey).then(function(key) { - if (key instanceof ArrayBuffer) { - // parse raw ArrayBuffer bytes to jwk/json (WebKit/Safari/IE11 quirk) - return decodeKey(JSON.parse(String.fromCharCode.apply(null, new Uint8Array(key)))); - } - return decodeKey(key); - }); - } - - function exportKey(keypair) { - // export the generated keys as JsonWebKey (JWK) - // https://tools.ietf.org/html/draft-ietf-jose-json-web-key-33 - var key = webCrypto.exportKey('jwk', keypair.privateKey); - if (!(typeof key.then === 'function')) { // IE11 KeyOperation - key = convertKeyOperation(key, 'Error exporting RSA key pair.'); - } - return key; - } - - function decodeKey(jwk) { - // map JWK parameters to local BigInteger type system - var key = new keyObject(); - key.n = toBigInteger(jwk.n); - key.ee = new BigInteger(E, 16); - key.d = toBigInteger(jwk.d); - key.p = toBigInteger(jwk.p); - key.q = toBigInteger(jwk.q); - key.u = key.p.modInverse(key.q); - - function toBigInteger(base64url) { - var base64 = base64url.replace(/\-/g, '+').replace(/_/g, '/'); - var hex = util.hexstrdump(atob(base64)); - return new BigInteger(hex, 16); - } - - return key; - } - - function convertKeyOperation(keyop, errmsg) { - return new Promise(function(resolve, reject) { - keyop.onerror = function (err) { - reject(new Error(errmsg)); - }; - keyop.oncomplete = function (e) { - resolve(e.target.result); - }; - }); - } - - // - // JS code - // - - return new Promise(function(resolve) { - var key = new keyObject(); - var rng = new SecureRandom(); - var qs = B >> 1; - key.e = parseInt(E, 16); - key.ee = new BigInteger(E, 16); - - for (;;) { - for (;;) { - key.p = new BigInteger(B - qs, 1, rng); - if (key.p.subtract(BigInteger.ONE).gcd(key.ee).compareTo(BigInteger.ONE) === 0 && key.p.isProbablePrime(10)) - break; - } - for (;;) { - key.q = new BigInteger(qs, 1, rng); - if (key.q.subtract(BigInteger.ONE).gcd(key.ee).compareTo(BigInteger.ONE) === 0 && key.q.isProbablePrime(10)) - break; - } - if (key.p.compareTo(key.q) <= 0) { - var t = key.p; - key.p = key.q; - key.q = t; - } - var p1 = key.p.subtract(BigInteger.ONE); - var q1 = key.q.subtract(BigInteger.ONE); - var phi = p1.multiply(q1); - if (phi.gcd(key.ee).compareTo(BigInteger.ONE) === 0) { - key.n = key.p.multiply(key.q); - key.d = key.ee.modInverse(phi); - key.dmp1 = key.d.mod(p1); - key.dmq1 = key.d.mod(q1); - key.u = key.p.modInverse(key.q); - break; - } - } - - resolve(key); - }); - } - - this.encrypt = encrypt; - this.decrypt = decrypt; - this.verify = verify; - this.sign = sign; - this.generate = generate; - this.keyObject = keyObject; -} - -module.exports = RSA; - -},{"../../config":17,"../../util.js":76,"../random.js":39,"./jsbn.js":37}],39:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -// The GPG4Browsers crypto interface - -/** - * @requires type/mpi - * @module crypto/random - */ - -var type_mpi = require('../type/mpi.js'); -var nodeCrypto = null; - -if (typeof window === 'undefined') { - nodeCrypto = require('crypto'); -} - -module.exports = { - /** - * Retrieve secure random byte string of the specified length - * @param {Integer} length Length in bytes to generate - * @return {String} Random byte string - */ - getRandomBytes: function(length) { - var result = ''; - for (var i = 0; i < length; i++) { - result += String.fromCharCode(this.getSecureRandomOctet()); - } - return result; - }, - - /** - * Return a secure random number in the specified range - * @param {Integer} from Min of the random number - * @param {Integer} to Max of the random number (max 32bit) - * @return {Integer} A secure random number - */ - getSecureRandom: function(from, to) { - var randUint = this.getSecureRandomUint(); - var bits = ((to - from)).toString(2).length; - while ((randUint & (Math.pow(2, bits) - 1)) > (to - from)) { - randUint = this.getSecureRandomUint(); - } - return from + (Math.abs(randUint & (Math.pow(2, bits) - 1))); - }, - - getSecureRandomOctet: function() { - var buf = new Uint8Array(1); - this.getRandomValues(buf); - return buf[0]; - }, - - getSecureRandomUint: function() { - var buf = new Uint8Array(4); - var dv = new DataView(buf.buffer); - this.getRandomValues(buf); - return dv.getUint32(0); - }, - - /** - * Helper routine which calls platform specific crypto random generator - * @param {Uint8Array} buf - */ - getRandomValues: function(buf) { - if (!(buf instanceof Uint8Array)) { - throw new Error('Invalid type: buf not an Uint8Array'); - } - if (typeof window !== 'undefined' && window.crypto && window.crypto.getRandomValues) { - window.crypto.getRandomValues(buf); - } else if (typeof window !== 'undefined' && typeof window.msCrypto === 'object' && typeof window.msCrypto.getRandomValues === 'function') { - window.msCrypto.getRandomValues(buf); - } else if (nodeCrypto) { - var bytes = nodeCrypto.randomBytes(buf.length); - buf.set(bytes); - } else if (this.randomBuffer.buffer) { - this.randomBuffer.get(buf); - } else { - throw new Error('No secure random number generator available.'); - } - }, - - /** - * Create a secure random big integer of bits length - * @param {Integer} bits Bit length of the MPI to create - * @return {BigInteger} Resulting big integer - */ - getRandomBigInteger: function(bits) { - if (bits < 1) { - throw new Error('Illegal parameter value: bits < 1'); - } - var numBytes = Math.floor((bits + 7) / 8); - - var randomBits = this.getRandomBytes(numBytes); - if (bits % 8 > 0) { - - randomBits = String.fromCharCode( - (Math.pow(2, bits % 8) - 1) & - randomBits.charCodeAt(0)) + - randomBits.substring(1); - } - var mpi = new type_mpi(); - mpi.fromBytes(randomBits); - return mpi.toBigInteger(); - }, - - getRandomBigIntegerInRange: function(min, max) { - if (max.compareTo(min) <= 0) { - throw new Error('Illegal parameter value: max <= min'); - } - - var range = max.subtract(min); - var r = this.getRandomBigInteger(range.bitLength()); - while (r.compareTo(range) > 0) { - r = this.getRandomBigInteger(range.bitLength()); - } - return min.add(r); - }, - - randomBuffer: new RandomBuffer() - -}; - -/** - * Buffer for secure random numbers - */ -function RandomBuffer() { - this.buffer = null; - this.size = null; -} - -/** - * Initialize buffer - * @param {Integer} size size of buffer - */ -RandomBuffer.prototype.init = function(size) { - this.buffer = new Uint8Array(size); - this.size = 0; -}; - -/** - * Concat array of secure random numbers to buffer - * @param {Uint8Array} buf - */ -RandomBuffer.prototype.set = function(buf) { - if (!this.buffer) { - throw new Error('RandomBuffer is not initialized'); - } - if (!(buf instanceof Uint8Array)) { - throw new Error('Invalid type: buf not an Uint8Array'); - } - var freeSpace = this.buffer.length - this.size; - if (buf.length > freeSpace) { - buf = buf.subarray(0, freeSpace); - } - // set buf with offset old size of buffer - this.buffer.set(buf, this.size); - this.size += buf.length; -}; - -/** - * Take numbers out of buffer and copy to array - * @param {Uint8Array} buf the destination array - */ -RandomBuffer.prototype.get = function(buf) { - if (!this.buffer) { - throw new Error('RandomBuffer is not initialized'); - } - if (!(buf instanceof Uint8Array)) { - throw new Error('Invalid type: buf not an Uint8Array'); - } - if (this.size < buf.length) { - throw new Error('Random number buffer depleted'); - } - for (var i = 0; i < buf.length; i++) { - buf[i] = this.buffer[--this.size]; - // clear buffer value - this.buffer[this.size] = 0; - } -}; - -},{"../type/mpi.js":74,"crypto":"crypto"}],40:[function(require,module,exports){ -/** - * @requires crypto/hash - * @requires crypto/pkcs1 - * @requires crypto/public_key - * @module crypto/signature */ - -var publicKey = require('./public_key'), - pkcs1 = require('./pkcs1.js'), - hashModule = require('./hash'); - -module.exports = { - /** - * - * @param {module:enums.publicKey} algo public Key algorithm - * @param {module:enums.hash} hash_algo Hash algorithm - * @param {Array} msg_MPIs Signature multiprecision integers - * @param {Array} publickey_MPIs Public key multiprecision integers - * @param {String} data Data on where the signature was computed on. - * @return {Boolean} true if signature (sig_data was equal to data over hash) - */ - verify: function(algo, hash_algo, msg_MPIs, publickey_MPIs, data) { - - switch (algo) { - case 1: - // RSA (Encrypt or Sign) [HAC] - case 2: - // RSA Encrypt-Only [HAC] - case 3: - // RSA Sign-Only [HAC] - var rsa = new publicKey.rsa(); - var n = publickey_MPIs[0].toBigInteger(); - var k = publickey_MPIs[0].byteLength(); - var e = publickey_MPIs[1].toBigInteger(); - var m = msg_MPIs[0].toBigInteger(); - var EM = rsa.verify(m, e, n); - var EM2 = pkcs1.emsa.encode(hash_algo, data, k); - return EM.compareTo(EM2) === 0; - case 16: - // Elgamal (Encrypt-Only) [ELGAMAL] [HAC] - throw new Error("signing with Elgamal is not defined in the OpenPGP standard."); - case 17: - // DSA (Digital Signature Algorithm) [FIPS186] [HAC] - var dsa = new publicKey.dsa(); - var s1 = msg_MPIs[0].toBigInteger(); - var s2 = msg_MPIs[1].toBigInteger(); - var p = publickey_MPIs[0].toBigInteger(); - var q = publickey_MPIs[1].toBigInteger(); - var g = publickey_MPIs[2].toBigInteger(); - var y = publickey_MPIs[3].toBigInteger(); - var m = data; - var dopublic = dsa.verify(hash_algo, s1, s2, m, p, q, g, y); - return dopublic.compareTo(s1) === 0; - default: - throw new Error('Invalid signature algorithm.'); - } - }, - - /** - * Create a signature on data using the specified algorithm - * @param {module:enums.hash} hash_algo hash Algorithm to use (See {@link http://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4}) - * @param {module:enums.publicKey} algo Asymmetric cipher algorithm to use (See {@link http://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1}) - * @param {Array} publicMPIs Public key multiprecision integers - * of the private key - * @param {Array} secretMPIs Private key multiprecision - * integers which is used to sign the data - * @param {String} data Data to be signed - * @return {Array} - */ - sign: function(hash_algo, algo, keyIntegers, data) { - - var m; - - switch (algo) { - case 1: - // RSA (Encrypt or Sign) [HAC] - case 2: - // RSA Encrypt-Only [HAC] - case 3: - // RSA Sign-Only [HAC] - var rsa = new publicKey.rsa(); - var d = keyIntegers[2].toBigInteger(); - var n = keyIntegers[0].toBigInteger(); - m = pkcs1.emsa.encode(hash_algo, - data, keyIntegers[0].byteLength()); - - return rsa.sign(m, d, n).toMPI(); - - case 17: - // DSA (Digital Signature Algorithm) [FIPS186] [HAC] - var dsa = new publicKey.dsa(); - - var p = keyIntegers[0].toBigInteger(); - var q = keyIntegers[1].toBigInteger(); - var g = keyIntegers[2].toBigInteger(); - var y = keyIntegers[3].toBigInteger(); - var x = keyIntegers[4].toBigInteger(); - m = data; - var result = dsa.sign(hash_algo, m, g, p, q, x); - - return result[0].toString() + result[1].toString(); - case 16: - // Elgamal (Encrypt-Only) [ELGAMAL] [HAC] - throw new Error('Signing with Elgamal is not defined in the OpenPGP standard.'); - default: - throw new Error('Invalid signature algorithm.'); - } - } -}; - -},{"./hash":28,"./pkcs1.js":33,"./public_key":36}],41:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * @requires encoding/base64 - * @requires enums - * @requires config - * @module encoding/armor - */ - -var base64 = require('./base64.js'), - enums = require('../enums.js'), - config = require('../config'); - -/** - * Finds out which Ascii Armoring type is used. Throws error if unknown type. - * @private - * @param {String} text [String] ascii armored text - * @returns {Integer} 0 = MESSAGE PART n of m - * 1 = MESSAGE PART n - * 2 = SIGNED MESSAGE - * 3 = PGP MESSAGE - * 4 = PUBLIC KEY BLOCK - * 5 = PRIVATE KEY BLOCK - */ -function getType(text) { - var reHeader = /^-----BEGIN PGP (MESSAGE, PART \d+\/\d+|MESSAGE, PART \d+|SIGNED MESSAGE|MESSAGE|PUBLIC KEY BLOCK|PRIVATE KEY BLOCK|SIGNATURE)-----$\n/m; - - var header = text.match(reHeader); - - if (!header) { - throw new Error('Unknown ASCII armor type'); - } - - // BEGIN PGP MESSAGE, PART X/Y - // Used for multi-part messages, where the armor is split amongst Y - // parts, and this is the Xth part out of Y. - if (/MESSAGE, PART \d+\/\d+/.test(header[1])) { - return enums.armor.multipart_section; - } else - // BEGIN PGP MESSAGE, PART X - // Used for multi-part messages, where this is the Xth part of an - // unspecified number of parts. Requires the MESSAGE-ID Armor - // Header to be used. - if (/MESSAGE, PART \d+/.test(header[1])) { - return enums.armor.multipart_last; - - } else - // BEGIN PGP SIGNATURE - // Used for detached signatures, OpenPGP/MIME signatures, and - // cleartext signatures. Note that PGP 2.x uses BEGIN PGP MESSAGE - // for detached signatures. - if (/SIGNED MESSAGE/.test(header[1])) { - return enums.armor.signed; - - } else - // BEGIN PGP MESSAGE - // Used for signed, encrypted, or compressed files. - if (/MESSAGE/.test(header[1])) { - return enums.armor.message; - - } else - // BEGIN PGP PUBLIC KEY BLOCK - // Used for armoring public keys. - if (/PUBLIC KEY BLOCK/.test(header[1])) { - return enums.armor.public_key; - - } else - // BEGIN PGP PRIVATE KEY BLOCK - // Used for armoring private keys. - if (/PRIVATE KEY BLOCK/.test(header[1])) { - return enums.armor.private_key; - } -} - -/** - * Add additional information to the armor version of an OpenPGP binary - * packet block. - * @author Alex - * @version 2011-12-16 - * @returns {String} The header information - */ -function addheader() { - var result = ""; - if (config.show_version) { - result += "Version: " + config.versionstring + '\r\n'; - } - if (config.show_comment) { - result += "Comment: " + config.commentstring + '\r\n'; - } - result += '\r\n'; - return result; -} - - - -/** - * Calculates a checksum over the given data and returns it base64 encoded - * @param {String} data Data to create a CRC-24 checksum for - * @return {String} Base64 encoded checksum - */ -function getCheckSum(data) { - var c = createcrc24(data); - var str = "" + String.fromCharCode(c >> 16) + - String.fromCharCode((c >> 8) & 0xFF) + - String.fromCharCode(c & 0xFF); - return base64.encode(str); -} - -/** - * Calculates the checksum over the given data and compares it with the - * given base64 encoded checksum - * @param {String} data Data to create a CRC-24 checksum for - * @param {String} checksum Base64 encoded checksum - * @return {Boolean} True if the given checksum is correct; otherwise false - */ -function verifyCheckSum(data, checksum) { - var c = getCheckSum(data); - var d = checksum; - return c[0] == d[0] && c[1] == d[1] && c[2] == d[2] && c[3] == d[3]; -} -/** - * Internal function to calculate a CRC-24 checksum over a given string (data) - * @param {String} data Data to create a CRC-24 checksum for - * @return {Integer} The CRC-24 checksum as number - */ -var crc_table = [ - 0x00000000, 0x00864cfb, 0x018ad50d, 0x010c99f6, 0x0393e6e1, 0x0315aa1a, 0x021933ec, 0x029f7f17, 0x07a18139, - 0x0727cdc2, 0x062b5434, 0x06ad18cf, 0x043267d8, 0x04b42b23, 0x05b8b2d5, 0x053efe2e, 0x0fc54e89, 0x0f430272, - 0x0e4f9b84, 0x0ec9d77f, 0x0c56a868, 0x0cd0e493, 0x0ddc7d65, 0x0d5a319e, 0x0864cfb0, 0x08e2834b, 0x09ee1abd, - 0x09685646, 0x0bf72951, 0x0b7165aa, 0x0a7dfc5c, 0x0afbb0a7, 0x1f0cd1e9, 0x1f8a9d12, 0x1e8604e4, 0x1e00481f, - 0x1c9f3708, 0x1c197bf3, 0x1d15e205, 0x1d93aefe, 0x18ad50d0, 0x182b1c2b, 0x192785dd, 0x19a1c926, 0x1b3eb631, - 0x1bb8faca, 0x1ab4633c, 0x1a322fc7, 0x10c99f60, 0x104fd39b, 0x11434a6d, 0x11c50696, 0x135a7981, 0x13dc357a, - 0x12d0ac8c, 0x1256e077, 0x17681e59, 0x17ee52a2, 0x16e2cb54, 0x166487af, 0x14fbf8b8, 0x147db443, 0x15712db5, - 0x15f7614e, 0x3e19a3d2, 0x3e9fef29, 0x3f9376df, 0x3f153a24, 0x3d8a4533, 0x3d0c09c8, 0x3c00903e, 0x3c86dcc5, - 0x39b822eb, 0x393e6e10, 0x3832f7e6, 0x38b4bb1d, 0x3a2bc40a, 0x3aad88f1, 0x3ba11107, 0x3b275dfc, 0x31dced5b, - 0x315aa1a0, - 0x30563856, 0x30d074ad, 0x324f0bba, 0x32c94741, 0x33c5deb7, 0x3343924c, 0x367d6c62, 0x36fb2099, 0x37f7b96f, - 0x3771f594, 0x35ee8a83, 0x3568c678, 0x34645f8e, 0x34e21375, 0x2115723b, 0x21933ec0, 0x209fa736, 0x2019ebcd, - 0x228694da, 0x2200d821, 0x230c41d7, 0x238a0d2c, 0x26b4f302, 0x2632bff9, 0x273e260f, 0x27b86af4, 0x252715e3, - 0x25a15918, 0x24adc0ee, 0x242b8c15, 0x2ed03cb2, 0x2e567049, 0x2f5ae9bf, 0x2fdca544, 0x2d43da53, 0x2dc596a8, - 0x2cc90f5e, 0x2c4f43a5, 0x2971bd8b, 0x29f7f170, 0x28fb6886, 0x287d247d, 0x2ae25b6a, 0x2a641791, 0x2b688e67, - 0x2beec29c, 0x7c3347a4, 0x7cb50b5f, 0x7db992a9, 0x7d3fde52, 0x7fa0a145, 0x7f26edbe, 0x7e2a7448, 0x7eac38b3, - 0x7b92c69d, 0x7b148a66, 0x7a181390, 0x7a9e5f6b, 0x7801207c, 0x78876c87, 0x798bf571, 0x790db98a, 0x73f6092d, - 0x737045d6, 0x727cdc20, 0x72fa90db, 0x7065efcc, 0x70e3a337, 0x71ef3ac1, 0x7169763a, 0x74578814, 0x74d1c4ef, - 0x75dd5d19, 0x755b11e2, 0x77c46ef5, 0x7742220e, 0x764ebbf8, 0x76c8f703, 0x633f964d, 0x63b9dab6, 0x62b54340, - 0x62330fbb, - 0x60ac70ac, 0x602a3c57, 0x6126a5a1, 0x61a0e95a, 0x649e1774, 0x64185b8f, 0x6514c279, 0x65928e82, 0x670df195, - 0x678bbd6e, 0x66872498, 0x66016863, 0x6cfad8c4, 0x6c7c943f, 0x6d700dc9, 0x6df64132, 0x6f693e25, 0x6fef72de, - 0x6ee3eb28, 0x6e65a7d3, 0x6b5b59fd, 0x6bdd1506, 0x6ad18cf0, 0x6a57c00b, 0x68c8bf1c, 0x684ef3e7, 0x69426a11, - 0x69c426ea, 0x422ae476, 0x42aca88d, 0x43a0317b, 0x43267d80, 0x41b90297, 0x413f4e6c, 0x4033d79a, 0x40b59b61, - 0x458b654f, 0x450d29b4, 0x4401b042, 0x4487fcb9, 0x461883ae, 0x469ecf55, 0x479256a3, 0x47141a58, 0x4defaaff, - 0x4d69e604, 0x4c657ff2, 0x4ce33309, 0x4e7c4c1e, 0x4efa00e5, 0x4ff69913, 0x4f70d5e8, 0x4a4e2bc6, 0x4ac8673d, - 0x4bc4fecb, 0x4b42b230, 0x49ddcd27, 0x495b81dc, 0x4857182a, 0x48d154d1, 0x5d26359f, 0x5da07964, 0x5cace092, - 0x5c2aac69, 0x5eb5d37e, 0x5e339f85, 0x5f3f0673, 0x5fb94a88, 0x5a87b4a6, 0x5a01f85d, 0x5b0d61ab, 0x5b8b2d50, - 0x59145247, 0x59921ebc, 0x589e874a, 0x5818cbb1, 0x52e37b16, 0x526537ed, 0x5369ae1b, 0x53efe2e0, 0x51709df7, - 0x51f6d10c, - 0x50fa48fa, 0x507c0401, 0x5542fa2f, 0x55c4b6d4, 0x54c82f22, 0x544e63d9, 0x56d11cce, 0x56575035, 0x575bc9c3, - 0x57dd8538 -]; - -function createcrc24(input) { - var crc = 0xB704CE; - var index = 0; - - while ((input.length - index) > 16) { - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 1)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 2)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 3)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 4)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 5)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 6)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 7)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 8)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 9)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 10)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 11)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 12)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 13)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 14)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index + 15)) & 0xff]; - index += 16; - } - - for (var j = index; j < input.length; j++) { - crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index++)) & 0xff]; - } - return crc & 0xffffff; -} - -/** - * Splits a message into two parts, the headers and the body. This is an internal function - * @param {String} text OpenPGP armored message part - * @returns {(Boolean|Object)} Either false in case of an error - * or an object with attribute "headers" containing the headers and - * and an attribute "body" containing the body. - */ -function splitHeaders(text) { - // empty line with whitespace characters - var reEmptyLine = /^[ \f\r\t\u00a0\u2000-\u200a\u202f\u205f\u3000]*\n/m; - var headers = ''; - var body = text; - - var matchResult = reEmptyLine.exec(text); - - if (matchResult !== null) { - headers = text.slice(0, matchResult.index); - body = text.slice(matchResult.index + matchResult[0].length); - } else { - throw new Error('Mandatory blank line missing between armor headers and armor data'); - } - - headers = headers.split('\n'); - // remove empty entry - headers.pop(); - - return { headers: headers, body: body }; -} - -/** - * Verify armored headers. RFC4880, section 6.3: "OpenPGP should consider improperly formatted - * Armor Headers to be corruption of the ASCII Armor." - * @private - * @param {Array} headers Armor headers - */ -function verifyHeaders(headers) { - for (var i = 0; i < headers.length; i++) { - if (!/^(Version|Comment|MessageID|Hash|Charset): .+$/.test(headers[i])) { - throw new Error('Improperly formatted armor header: ' + headers[i]); - } - } -} - -/** - * Splits a message into two parts, the body and the checksum. This is an internal function - * @param {String} text OpenPGP armored message part - * @returns {(Boolean|Object)} Either false in case of an error - * or an object with attribute "body" containing the body - * and an attribute "checksum" containing the checksum. - */ -function splitChecksum(text) { - var reChecksumStart = /^=/m; - var body = text; - var checksum = ""; - - var matchResult = reChecksumStart.exec(text); - - if (matchResult !== null) { - body = text.slice(0, matchResult.index); - checksum = text.slice(matchResult.index + 1); - } - - return { body: body, checksum: checksum }; -} - -/** - * DeArmor an OpenPGP armored message; verify the checksum and return - * the encoded bytes - * @param {String} text OpenPGP armored message - * @returns {Object} An object with attribute "text" containing the message text, - * an attribute "data" containing the bytes and "type" for the ASCII armor type - * @static - */ -function dearmor(text) { - var reSplit = /^-----[^-]+-----$\n/m; - - // remove trailing whitespace at end of line - text = text.replace(/[\t\r ]+\n/g, '\n'); - - var type = getType(text); - - var splittext = text.split(reSplit); - - // IE has a bug in split with a re. If the pattern matches the beginning of the - // string it doesn't create an empty array element 0. So we need to detect this - // so we know the index of the data we are interested in. - var indexBase = 1; - - var result, checksum, msg; - - if (text.search(reSplit) != splittext[0].length) { - indexBase = 0; - } - - if (type != 2) { - msg = splitHeaders(splittext[indexBase]); - var msg_sum = splitChecksum(msg.body); - - result = { - data: base64.decode(msg_sum.body), - headers: msg.headers, - type: type - }; - - checksum = msg_sum.checksum; - } else { - // Reverse dash-escaping for msg - msg = splitHeaders(splittext[indexBase].replace(/^- /mg, '')); - var sig = splitHeaders(splittext[indexBase + 1].replace(/^- /mg, '')); - verifyHeaders(sig.headers); - var sig_sum = splitChecksum(sig.body); - - result = { - text: msg.body.replace(/\n$/, '').replace(/\n/g, "\r\n"), - data: base64.decode(sig_sum.body), - headers: msg.headers, - type: type - }; - - checksum = sig_sum.checksum; - } - - checksum = checksum.substr(0, 4); - - if (!verifyCheckSum(result.data, checksum)) { - throw new Error("Ascii armor integrity check on message failed: '" + - checksum + - "' should be '" + - getCheckSum(result.data) + "'"); - } - - verifyHeaders(result.headers); - - return result; -} - - -/** - * Armor an OpenPGP binary packet block - * @param {Integer} messagetype type of the message - * @param body - * @param {Integer} partindex - * @param {Integer} parttotal - * @returns {String} Armored text - * @static - */ -function armor(messagetype, body, partindex, parttotal) { - var result = []; - switch (messagetype) { - case enums.armor.multipart_section: - result.push("-----BEGIN PGP MESSAGE, PART " + partindex + "/" + parttotal + "-----\r\n"); - result.push(addheader()); - result.push(base64.encode(body)); - result.push("\r\n=" + getCheckSum(body) + "\r\n"); - result.push("-----END PGP MESSAGE, PART " + partindex + "/" + parttotal + "-----\r\n"); - break; - case enums.armor.multipart_last: - result.push("-----BEGIN PGP MESSAGE, PART " + partindex + "-----\r\n"); - result.push(addheader()); - result.push(base64.encode(body)); - result.push("\r\n=" + getCheckSum(body) + "\r\n"); - result.push("-----END PGP MESSAGE, PART " + partindex + "-----\r\n"); - break; - case enums.armor.signed: - result.push("\r\n-----BEGIN PGP SIGNED MESSAGE-----\r\n"); - result.push("Hash: " + body.hash + "\r\n\r\n"); - result.push(body.text.replace(/\n-/g, "\n- -")); - result.push("\r\n-----BEGIN PGP SIGNATURE-----\r\n"); - result.push(addheader()); - result.push(base64.encode(body.data)); - result.push("\r\n=" + getCheckSum(body.data) + "\r\n"); - result.push("-----END PGP SIGNATURE-----\r\n"); - break; - case enums.armor.message: - result.push("-----BEGIN PGP MESSAGE-----\r\n"); - result.push(addheader()); - result.push(base64.encode(body)); - result.push("\r\n=" + getCheckSum(body) + "\r\n"); - result.push("-----END PGP MESSAGE-----\r\n"); - break; - case enums.armor.public_key: - result.push("-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n"); - result.push(addheader()); - result.push(base64.encode(body)); - result.push("\r\n=" + getCheckSum(body) + "\r\n"); - result.push("-----END PGP PUBLIC KEY BLOCK-----\r\n\r\n"); - break; - case enums.armor.private_key: - result.push("-----BEGIN PGP PRIVATE KEY BLOCK-----\r\n"); - result.push(addheader()); - result.push(base64.encode(body)); - result.push("\r\n=" + getCheckSum(body) + "\r\n"); - result.push("-----END PGP PRIVATE KEY BLOCK-----\r\n"); - break; - } - - return result.join(''); -} - -module.exports = { - encode: armor, - decode: dearmor -}; - -},{"../config":17,"../enums.js":43,"./base64.js":42}],42:[function(require,module,exports){ -/* OpenPGP radix-64/base64 string encoding/decoding - * Copyright 2005 Herbert Hanewinkel, www.haneWIN.de - * version 1.0, check www.haneWIN.de for the latest version - * - * This software is provided as-is, without express or implied warranty. - * Permission to use, copy, modify, distribute or sell this software, with or - * without fee, for any purpose and by any individual or organization, is hereby - * granted, provided that the above copyright notice and this paragraph appear - * in all copies. Distribution as a part of an application or binary must - * include the above copyright notice in the documentation and/or other materials - * provided with the application or distribution. - */ - -/** - * @module encoding/base64 - */ - -var b64s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - -/** - * Convert binary string to radix-64 - * @param {String} t binary string to convert - * @returns {string} radix-64 version of input string - * @static - */ -function s2r(t, o) { - // TODO check btoa alternative - var a, c, n; - var r = o ? o : [], - l = 0, - s = 0; - var tl = t.length; - - for (n = 0; n < tl; n++) { - c = t.charCodeAt(n); - if (s === 0) { - r.push(b64s.charAt((c >> 2) & 63)); - a = (c & 3) << 4; - } else if (s == 1) { - r.push(b64s.charAt((a | (c >> 4) & 15))); - a = (c & 15) << 2; - } else if (s == 2) { - r.push(b64s.charAt(a | ((c >> 6) & 3))); - l += 1; - if ((l % 60) === 0) - r.push("\n"); - r.push(b64s.charAt(c & 63)); - } - l += 1; - if ((l % 60) === 0) - r.push("\n"); - - s += 1; - if (s == 3) - s = 0; - } - if (s > 0) { - r.push(b64s.charAt(a)); - l += 1; - if ((l % 60) === 0) - r.push("\n"); - r.push('='); - l += 1; - } - if (s == 1) { - if ((l % 60) === 0) - r.push("\n"); - r.push('='); - } - if (o) - { - return; - } - return r.join(''); -} - -/** - * Convert radix-64 to binary string - * @param {String} t radix-64 string to convert - * @returns {string} binary version of input string - * @static - */ -function r2s(t) { - // TODO check atob alternative - var c, n; - var r = [], - s = 0, - a = 0; - var tl = t.length; - - for (n = 0; n < tl; n++) { - c = b64s.indexOf(t.charAt(n)); - if (c >= 0) { - if (s) - r.push(String.fromCharCode(a | (c >> (6 - s)) & 255)); - s = (s + 2) & 7; - a = (c << s) & 255; - } - } - return r.join(''); -} - -module.exports = { - encode: s2r, - decode: r2s -}; - -},{}],43:[function(require,module,exports){ -'use strict'; - -/** - * @module enums - */ - -module.exports = { - - /** A string to key specifier type - * @enum {Integer} - * @readonly - */ - s2k: { - simple: 0, - salted: 1, - iterated: 3, - gnu: 101 - }, - - /** {@link http://tools.ietf.org/html/rfc4880#section-9.1|RFC4880, section 9.1} - * @enum {Integer} - * @readonly - */ - publicKey: { - rsa_encrypt_sign: 1, - rsa_encrypt: 2, - rsa_sign: 3, - elgamal: 16, - dsa: 17 - }, - - /** {@link http://tools.ietf.org/html/rfc4880#section-9.2|RFC4880, section 9.2} - * @enum {Integer} - * @readonly - */ - symmetric: { - plaintext: 0, - /** Not implemented! */ - idea: 1, - tripledes: 2, - cast5: 3, - blowfish: 4, - aes128: 7, - aes192: 8, - aes256: 9, - twofish: 10 - }, - - /** {@link http://tools.ietf.org/html/rfc4880#section-9.3|RFC4880, section 9.3} - * @enum {Integer} - * @readonly - */ - compression: { - uncompressed: 0, - /** RFC1951 */ - zip: 1, - /** RFC1950 */ - zlib: 2, - bzip2: 3 - }, - - /** {@link http://tools.ietf.org/html/rfc4880#section-9.4|RFC4880, section 9.4} - * @enum {Integer} - * @readonly - */ - hash: { - md5: 1, - sha1: 2, - ripemd: 3, - sha256: 8, - sha384: 9, - sha512: 10, - sha224: 11 - }, - - /** A list of packet types and numeric tags associated with them. - * @enum {Integer} - * @readonly - */ - packet: { - publicKeyEncryptedSessionKey: 1, - signature: 2, - symEncryptedSessionKey: 3, - onePassSignature: 4, - secretKey: 5, - publicKey: 6, - secretSubkey: 7, - compressed: 8, - symmetricallyEncrypted: 9, - marker: 10, - literal: 11, - trust: 12, - userid: 13, - publicSubkey: 14, - userAttribute: 17, - symEncryptedIntegrityProtected: 18, - modificationDetectionCode: 19 - }, - - /** Data types in the literal packet - * @enum {Integer} - * @readonly - */ - literal: { - /** Binary data 'b' */ - binary: 'b'.charCodeAt(), - /** Text data 't' */ - text: 't'.charCodeAt(), - /** Utf8 data 'u' */ - utf8: 'u'.charCodeAt() - }, - - - /** One pass signature packet type - * @enum {Integer} - * @readonly - */ - signature: { - /** 0x00: Signature of a binary document. */ - binary: 0, - /** 0x01: Signature of a canonical text document.
- * Canonicalyzing the document by converting line endings. */ - text: 1, - /** 0x02: Standalone signature.
- * This signature is a signature of only its own subpacket contents. - * It is calculated identically to a signature over a zero-lengh - * binary document. Note that it doesn't make sense to have a V3 - * standalone signature. */ - standalone: 2, - /** 0x10: Generic certification of a User ID and Public-Key packet.
- * The issuer of this certification does not make any particular - * assertion as to how well the certifier has checked that the owner - * of the key is in fact the person described by the User ID. */ - cert_generic: 16, - /** 0x11: Persona certification of a User ID and Public-Key packet.
- * The issuer of this certification has not done any verification of - * the claim that the owner of this key is the User ID specified. */ - cert_persona: 17, - /** 0x12: Casual certification of a User ID and Public-Key packet.
- * The issuer of this certification has done some casual - * verification of the claim of identity. */ - cert_casual: 18, - /** 0x13: Positive certification of a User ID and Public-Key packet.
- * The issuer of this certification has done substantial - * verification of the claim of identity.
- *
- * Most OpenPGP implementations make their "key signatures" as 0x10 - * certifications. Some implementations can issue 0x11-0x13 - * certifications, but few differentiate between the types. */ - cert_positive: 19, - /** 0x30: Certification revocation signature
- * This signature revokes an earlier User ID certification signature - * (signature class 0x10 through 0x13) or direct-key signature - * (0x1F). It should be issued by the same key that issued the - * revoked signature or an authorized revocation key. The signature - * is computed over the same data as the certificate that it - * revokes, and should have a later creation date than that - * certificate. */ - cert_revocation: 48, - /** 0x18: Subkey Binding Signature
- * This signature is a statement by the top-level signing key that - * indicates that it owns the subkey. This signature is calculated - * directly on the primary key and subkey, and not on any User ID or - * other packets. A signature that binds a signing subkey MUST have - * an Embedded Signature subpacket in this binding signature that - * contains a 0x19 signature made by the signing subkey on the - * primary key and subkey. */ - subkey_binding: 24, - /** 0x19: Primary Key Binding Signature
- * This signature is a statement by a signing subkey, indicating - * that it is owned by the primary key and subkey. This signature - * is calculated the same way as a 0x18 signature: directly on the - * primary key and subkey, and not on any User ID or other packets.
- *
- * When a signature is made over a key, the hash data starts with the - * octet 0x99, followed by a two-octet length of the key, and then body - * of the key packet. (Note that this is an old-style packet header for - * a key packet with two-octet length.) A subkey binding signature - * (type 0x18) or primary key binding signature (type 0x19) then hashes - * the subkey using the same format as the main key (also using 0x99 as - * the first octet). */ - key_binding: 25, - /** 0x1F: Signature directly on a key
- * This signature is calculated directly on a key. It binds the - * information in the Signature subpackets to the key, and is - * appropriate to be used for subpackets that provide information - * about the key, such as the Revocation Key subpacket. It is also - * appropriate for statements that non-self certifiers want to make - * about the key itself, rather than the binding between a key and a - * name. */ - key: 31, - /** 0x20: Key revocation signature
- * The signature is calculated directly on the key being revoked. A - * revoked key is not to be used. Only revocation signatures by the - * key being revoked, or by an authorized revocation key, should be - * considered valid revocation signatures.a */ - key_revocation: 32, - /** 0x28: Subkey revocation signature
- * The signature is calculated directly on the subkey being revoked. - * A revoked subkey is not to be used. Only revocation signatures - * by the top-level signature key that is bound to this subkey, or - * by an authorized revocation key, should be considered valid - * revocation signatures.
- *
- * Key revocation signatures (types 0x20 and 0x28) - * hash only the key being revoked. */ - subkey_revocation: 40, - /** 0x40: Timestamp signature.
- * This signature is only meaningful for the timestamp contained in - * it. */ - timestamp: 64, - /** 0x50: Third-Party Confirmation signature.
- * This signature is a signature over some other OpenPGP Signature - * packet(s). It is analogous to a notary seal on the signed data. - * A third-party signature SHOULD include Signature Target - * subpacket(s) to give easy identification. Note that we really do - * mean SHOULD. There are plausible uses for this (such as a blind - * party that only sees the signature, not the key or source - * document) that cannot include a target subpacket. */ - third_party: 80 - }, - - /** Signature subpacket type - * @enum {Integer} - * @readonly - */ - signatureSubpacket: { - signature_creation_time: 2, - signature_expiration_time: 3, - exportable_certification: 4, - trust_signature: 5, - regular_expression: 6, - revocable: 7, - key_expiration_time: 9, - placeholder_backwards_compatibility: 10, - preferred_symmetric_algorithms: 11, - revocation_key: 12, - issuer: 16, - notation_data: 20, - preferred_hash_algorithms: 21, - preferred_compression_algorithms: 22, - key_server_preferences: 23, - preferred_key_server: 24, - primary_user_id: 25, - policy_uri: 26, - key_flags: 27, - signers_user_id: 28, - reason_for_revocation: 29, - features: 30, - signature_target: 31, - embedded_signature: 32 - }, - - /** Key flags - * @enum {Integer} - * @readonly - */ - keyFlags: { - /** 0x01 - This key may be used to certify other keys. */ - certify_keys: 1, - /** 0x02 - This key may be used to sign data. */ - sign_data: 2, - /** 0x04 - This key may be used to encrypt communications. */ - encrypt_communication: 4, - /** 0x08 - This key may be used to encrypt storage. */ - encrypt_storage: 8, - /** 0x10 - The private component of this key may have been split - * by a secret-sharing mechanism. */ - split_private_key: 16, - /** 0x20 - This key may be used for authentication. */ - authentication: 32, - /** 0x80 - The private component of this key may be in the - * possession of more than one person. */ - shared_private_key: 128 - }, - - /** Key status - * @enum {Integer} - * @readonly - */ - keyStatus: { - invalid: 0, - expired: 1, - revoked: 2, - valid: 3, - no_self_cert: 4 - }, - - /** Armor type - * @enum {Integer} - * @readonly - */ - armor: { - multipart_section: 0, - multipart_last: 1, - signed: 2, - message: 3, - public_key: 4, - private_key: 5 - }, - - /** Asserts validity and converts from string/integer to integer. */ - write: function(type, e) { - if (typeof e == 'number') { - e = this.read(type, e); - } - - if (type[e] !== undefined) { - return type[e]; - } else throw new Error('Invalid enum value.'); - }, - /** Converts from an integer to string. */ - read: function(type, e) { - for (var i in type) - if (type[i] == e) return i; - - throw new Error('Invalid enum value.'); - } -}; - -},{}],44:[function(require,module,exports){ -// OpenPGP.js - An OpenPGP implementation in javascript -// Copyright (C) 2015 Tankred Hase -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -'use strict'; - -/** - * This class implements a client for the OpenPGP HTTP Keyserver Protocol (HKP) - * in order to lookup and upload keys on standard public key servers. - * @module hkp/hkp - */ -module.exports = HKP; - -var config = require('../config'); - -/** - * Initialize the HKP client and configure it with the key server url and fetch function. - * @constructor - * @param {String} keyServerBaseUrl (optional) The HKP key server base url including - * the protocol to use e.g. https://pgp.mit.edu - */ -function HKP(keyServerBaseUrl) { - this._baseUrl = keyServerBaseUrl ? keyServerBaseUrl : config.keyserver; - this._fetch = typeof window !== 'undefined' ? window.fetch : require('node-fetch'); -} - -/** - * Search for a public key on the key server either by key ID or part of the user ID. - * @param {String} options.keyID The long public key ID. - * @param {String} options.query This can be any part of the key user ID such as name - * or email address. - * @return {Promise} The ascii armored public key. - */ -HKP.prototype.lookup = function(options) { - var uri = this._baseUrl + '/pks/lookup?op=get&options=mr&search=', - fetch = this._fetch; - - if (options.keyId) { - uri += '0x' + encodeURIComponent(options.keyId); - } else if (options.query) { - uri += encodeURIComponent(options.query); - } else { - throw new Error('You must provide a query parameter!'); - } - - return fetch(uri).then(function(response) { - if (response.status === 200) { - return response.text(); - } - - }).then(function(publicKeyArmored) { - if (!publicKeyArmored || publicKeyArmored.indexOf('-----END PGP PUBLIC KEY BLOCK-----') < 0) { - return; - } - return publicKeyArmored.trim(); - }); -}; - -/** - * Upload a public key to the server. - * @param {String} publicKeyArmored An ascii armored public key to be uploaded. - * @return {Promise} - */ -HKP.prototype.upload = function(publicKeyArmored) { - var uri = this._baseUrl + '/pks/add', - fetch = this._fetch; - - return fetch(uri, { - method: 'post', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' - }, - body: 'keytext=' + encodeURIComponent(publicKeyArmored) - }); -}; -},{"../config":17,"node-fetch":"node-fetch"}],45:[function(require,module,exports){ -/** - * @see module:hkp/hkp - * @module hkp - */ -module.exports = require('./hkp.js'); - -},{"./hkp.js":44}],46:[function(require,module,exports){ -'use strict'; - -module.exports = require('./openpgp.js'); -/** - * @see module:key - * @name module:openpgp.key - */ -module.exports.key = require('./key.js'); -/** - * @see module:message - * @name module:openpgp.message - */ -module.exports.message = require('./message.js'); -/** - * @see module:cleartext - * @name module:openpgp.cleartext - */ -module.exports.cleartext = require('./cleartext.js'); -/** - * @see module:util - * @name module:openpgp.util - */ -module.exports.util = require('./util.js'); -/** - * @see module:packet - * @name module:openpgp.packet - */ -module.exports.packet = require('./packet'); -/** - * @see module:type/mpi - * @name module:openpgp.MPI - */ -module.exports.MPI = require('./type/mpi.js'); -/** - * @see module:type/s2k - * @name module:openpgp.S2K - */ -module.exports.S2K = require('./type/s2k.js'); -/** - * @see module:type/keyid - * @name module:openpgp.Keyid - */ -module.exports.Keyid = require('./type/keyid.js'); -/** - * @see module:encoding/armor - * @name module:openpgp.armor - */ -module.exports.armor = require('./encoding/armor.js'); -/** - * @see module:enums - * @name module:openpgp.enums - */ -module.exports.enums = require('./enums.js'); -/** - * @see module:config/config - * @name module:openpgp.config - */ -module.exports.config = require('./config/config.js'); -/** - * @see module:crypto - * @name module:openpgp.crypto - */ -module.exports.crypto = require('./crypto'); -/** - * @see module:keyring - * @name module:openpgp.Keyring - */ -module.exports.Keyring = require('./keyring'); -/** - * @see module:worker/async_proxy - * @name module:openpgp.AsyncProxy - */ -module.exports.AsyncProxy = require('./worker/async_proxy.js'); -/** - * @see module:hkp - * @name module:openpgp.HKP - */ -module.exports.HKP = require('./hkp'); - -},{"./cleartext.js":12,"./config/config.js":16,"./crypto":32,"./encoding/armor.js":41,"./enums.js":43,"./hkp":45,"./key.js":47,"./keyring":48,"./message.js":51,"./openpgp.js":52,"./packet":55,"./type/keyid.js":73,"./type/mpi.js":74,"./type/s2k.js":75,"./util.js":76,"./worker/async_proxy.js":77}],47:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * @requires config - * @requires encoding/armor - * @requires enums - * @requires packet - * @module key - */ - -'use strict'; - -var packet = require('./packet'), - enums = require('./enums.js'), - armor = require('./encoding/armor.js'), - config = require('./config'), - util = require('./util'); - -/** - * @class - * @classdesc Class that represents an OpenPGP key. Must contain a primary key. - * Can contain additional subkeys, signatures, user ids, user attributes. - * @param {module:packet/packetlist} packetlist The packets that form this key - */ - -function Key(packetlist) { - if (!(this instanceof Key)) { - return new Key(packetlist); - } - // same data as in packetlist but in structured form - this.primaryKey = null; - this.revocationSignature = null; - this.directSignatures = null; - this.users = null; - this.subKeys = null; - this.packetlist2structure(packetlist); - if (!this.primaryKey || !this.users) { - throw new Error('Invalid key: need at least key and user ID packet'); - } -} - -/** - * Transforms packetlist to structured key data - * @param {module:packet/packetlist} packetlist The packets that form a key - */ -Key.prototype.packetlist2structure = function(packetlist) { - var user, primaryKeyId, subKey; - for (var i = 0; i < packetlist.length; i++) { - switch (packetlist[i].tag) { - case enums.packet.publicKey: - case enums.packet.secretKey: - this.primaryKey = packetlist[i]; - primaryKeyId = this.primaryKey.getKeyId(); - break; - case enums.packet.userid: - case enums.packet.userAttribute: - user = new User(packetlist[i]); - if (!this.users) this.users = []; - this.users.push(user); - break; - case enums.packet.publicSubkey: - case enums.packet.secretSubkey: - user = null; - if (!this.subKeys) this.subKeys = []; - subKey = new SubKey(packetlist[i]); - this.subKeys.push(subKey); - break; - case enums.packet.signature: - switch (packetlist[i].signatureType) { - case enums.signature.cert_generic: - case enums.signature.cert_persona: - case enums.signature.cert_casual: - case enums.signature.cert_positive: - if (!user) { - util.print_debug('Dropping certification signatures without preceding user packet'); - continue; - } - if (packetlist[i].issuerKeyId.equals(primaryKeyId)) { - if (!user.selfCertifications) user.selfCertifications = []; - user.selfCertifications.push(packetlist[i]); - } else { - if (!user.otherCertifications) user.otherCertifications = []; - user.otherCertifications.push(packetlist[i]); - } - break; - case enums.signature.cert_revocation: - if (user) { - if (!user.revocationCertifications) user.revocationCertifications = []; - user.revocationCertifications.push(packetlist[i]); - } else { - if (!this.directSignatures) this.directSignatures = []; - this.directSignatures.push(packetlist[i]); - } - break; - case enums.signature.key: - if (!this.directSignatures) this.directSignatures = []; - this.directSignatures.push(packetlist[i]); - break; - case enums.signature.subkey_binding: - if (!subKey) { - util.print_debug('Dropping subkey binding signature without preceding subkey packet'); - continue; - } - subKey.bindingSignature = packetlist[i]; - break; - case enums.signature.key_revocation: - this.revocationSignature = packetlist[i]; - break; - case enums.signature.subkey_revocation: - if (!subKey) { - util.print_debug('Dropping subkey revocation signature without preceding subkey packet'); - continue; - } - subKey.revocationSignature = packetlist[i]; - break; - } - break; - } - } -}; - -/** - * Transforms structured key data to packetlist - * @return {module:packet/packetlist} The packets that form a key - */ -Key.prototype.toPacketlist = function() { - var packetlist = new packet.List(); - packetlist.push(this.primaryKey); - packetlist.push(this.revocationSignature); - packetlist.concat(this.directSignatures); - var i; - for (i = 0; i < this.users.length; i++) { - packetlist.concat(this.users[i].toPacketlist()); - } - if (this.subKeys) { - for (i = 0; i < this.subKeys.length; i++) { - packetlist.concat(this.subKeys[i].toPacketlist()); - } - } - return packetlist; -}; - -/** - * Returns all the private and public subkey packets - * @returns {Array<(module:packet/public_subkey|module:packet/secret_subkey)>} - */ -Key.prototype.getSubkeyPackets = function() { - var subKeys = []; - if (this.subKeys) { - for (var i = 0; i < this.subKeys.length; i++) { - subKeys.push(this.subKeys[i].subKey); - } - } - return subKeys; -}; - -/** - * Returns all the private and public key and subkey packets - * @returns {Array<(module:packet/public_subkey|module:packet/secret_subkey|module:packet/secret_key|module:packet/public_key)>} - */ -Key.prototype.getAllKeyPackets = function() { - return [this.primaryKey].concat(this.getSubkeyPackets()); -}; - -/** - * Returns key IDs of all key packets - * @returns {Array} - */ -Key.prototype.getKeyIds = function() { - var keyIds = []; - var keys = this.getAllKeyPackets(); - for (var i = 0; i < keys.length; i++) { - keyIds.push(keys[i].getKeyId()); - } - return keyIds; -}; - -/** - * Returns first key packet for given array of key IDs - * @param {Array} keyIds - * @return {(module:packet/public_subkey|module:packet/public_key| - * module:packet/secret_subkey|module:packet/secret_key|null)} - */ -Key.prototype.getKeyPacket = function(keyIds) { - var keys = this.getAllKeyPackets(); - for (var i = 0; i < keys.length; i++) { - var keyId = keys[i].getKeyId(); - for (var j = 0; j < keyIds.length; j++) { - if (keyId.equals(keyIds[j])) { - return keys[i]; - } - } - } - return null; -}; - -/** - * Returns userids - * @return {Array} array of userids - */ -Key.prototype.getUserIds = function() { - var userids = []; - for (var i = 0; i < this.users.length; i++) { - if (this.users[i].userId) { - userids.push(this.users[i].userId.write()); - } - } - return userids; -}; - -/** - * Returns true if this is a public key - * @return {Boolean} - */ -Key.prototype.isPublic = function() { - return this.primaryKey.tag == enums.packet.publicKey; -}; - -/** - * Returns true if this is a private key - * @return {Boolean} - */ -Key.prototype.isPrivate = function() { - return this.primaryKey.tag == enums.packet.secretKey; -}; - -/** - * Returns key as public key (shallow copy) - * @return {module:key~Key} new public Key - */ -Key.prototype.toPublic = function() { - var packetlist = new packet.List(); - var keyPackets = this.toPacketlist(); - var bytes; - for (var i = 0; i < keyPackets.length; i++) { - switch (keyPackets[i].tag) { - case enums.packet.secretKey: - bytes = keyPackets[i].writePublicKey(); - var pubKeyPacket = new packet.PublicKey(); - pubKeyPacket.read(bytes); - packetlist.push(pubKeyPacket); - break; - case enums.packet.secretSubkey: - bytes = keyPackets[i].writePublicKey(); - var pubSubkeyPacket = new packet.PublicSubkey(); - pubSubkeyPacket.read(bytes); - packetlist.push(pubSubkeyPacket); - break; - default: - packetlist.push(keyPackets[i]); - } - } - return new Key(packetlist); -}; - -/** - * Returns ASCII armored text of key - * @return {String} ASCII armor - */ -Key.prototype.armor = function() { - var type = this.isPublic() ? enums.armor.public_key : enums.armor.private_key; - return armor.encode(type, this.toPacketlist().write()); -}; - -/** - * Returns first key packet or key packet by given keyId that is available for signing or signature verification - * @param {module:type/keyid} keyId, optional - * @return {(module:packet/secret_subkey|module:packet/secret_key|null)} key packet or null if no signing key has been found - */ -Key.prototype.getSigningKeyPacket = function(keyId) { - var primaryUser = this.getPrimaryUser(); - if (primaryUser && - isValidSigningKeyPacket(this.primaryKey, primaryUser.selfCertificate) && - (!keyId || this.primaryKey.getKeyId().equals(keyId))) { - return this.primaryKey; - } - if (this.subKeys) { - for (var i = 0; i < this.subKeys.length; i++) { - if (this.subKeys[i].isValidSigningKey(this.primaryKey) && - (!keyId || this.subKeys[i].subKey.getKeyId().equals(keyId))) { - return this.subKeys[i].subKey; - } - } - } - return null; -}; - -/** - * Returns preferred signature hash algorithm of this key - * @return {String} - */ -Key.prototype.getPreferredHashAlgorithm = function() { - var primaryUser = this.getPrimaryUser(); - if (primaryUser && primaryUser.selfCertificate.preferredHashAlgorithms) { - return primaryUser.selfCertificate.preferredHashAlgorithms[0]; - } - return config.prefer_hash_algorithm; -}; - -function isValidEncryptionKeyPacket(keyPacket, signature) { - return keyPacket.algorithm !== enums.read(enums.publicKey, enums.publicKey.dsa) && - keyPacket.algorithm !== enums.read(enums.publicKey, enums.publicKey.rsa_sign) && - (!signature.keyFlags || - (signature.keyFlags[0] & enums.keyFlags.encrypt_communication) !== 0 || - (signature.keyFlags[0] & enums.keyFlags.encrypt_storage) !== 0); -} - -function isValidSigningKeyPacket(keyPacket, signature) { - return (keyPacket.algorithm == enums.read(enums.publicKey, enums.publicKey.dsa) || - keyPacket.algorithm == enums.read(enums.publicKey, enums.publicKey.rsa_sign) || - keyPacket.algorithm == enums.read(enums.publicKey, enums.publicKey.rsa_encrypt_sign)) && - (!signature.keyFlags || - (signature.keyFlags[0] & enums.keyFlags.sign_data) !== 0); -} - -/** - * Returns the first valid encryption key packet for this key - * @returns {(module:packet/public_subkey|module:packet/secret_subkey|module:packet/secret_key|module:packet/public_key|null)} key packet or null if no encryption key has been found - */ -Key.prototype.getEncryptionKeyPacket = function() { - // V4: by convention subkeys are prefered for encryption service - // V3: keys MUST NOT have subkeys - if (this.subKeys) { - for (var i = 0; i < this.subKeys.length; i++) { - if (this.subKeys[i].isValidEncryptionKey(this.primaryKey)) { - return this.subKeys[i].subKey; - } - } - } - // if no valid subkey for encryption, evaluate primary key - var primaryUser = this.getPrimaryUser(); - if (primaryUser && - isValidEncryptionKeyPacket(this.primaryKey, primaryUser.selfCertificate)) { - return this.primaryKey; - } - return null; -}; - -/** - * Decrypts all secret key and subkey packets - * @param {String} passphrase - * @return {Boolean} true if all key and subkey packets decrypted successfully - */ -Key.prototype.decrypt = function(passphrase) { - if (this.isPrivate()) { - var keys = this.getAllKeyPackets(); - for (var i = 0; i < keys.length; i++) { - var success = keys[i].decrypt(passphrase); - if (!success) return false; - } - } else { - throw new Error("Nothing to decrypt in a public key"); - } - return true; -}; - -/** - * Decrypts specific key packets by key ID - * @param {Array} keyIds - * @param {String} passphrase - * @return {Boolean} true if all key packets decrypted successfully - */ -Key.prototype.decryptKeyPacket = function(keyIds, passphrase) { - if (this.isPrivate()) { - var keys = this.getAllKeyPackets(); - for (var i = 0; i < keys.length; i++) { - var keyId = keys[i].getKeyId(); - for (var j = 0; j < keyIds.length; j++) { - if (keyId.equals(keyIds[j])) { - var success = keys[i].decrypt(passphrase); - if (!success) return false; - } - } - } - } else { - throw new Error("Nothing to decrypt in a public key"); - } - return true; -}; - -/** - * Verify primary key. Checks for revocation signatures, expiration time - * and valid self signature - * @return {module:enums.keyStatus} The status of the primary key - */ -Key.prototype.verifyPrimaryKey = function() { - // check revocation signature - if (this.revocationSignature && !this.revocationSignature.isExpired() && - (this.revocationSignature.verified || - this.revocationSignature.verify(this.primaryKey, {key: this.primaryKey}))) { - return enums.keyStatus.revoked; - } - // check V3 expiration time - if (this.primaryKey.version == 3 && this.primaryKey.expirationTimeV3 !== 0 && - Date.now() > (this.primaryKey.created.getTime() + this.primaryKey.expirationTimeV3*24*3600*1000)) { - return enums.keyStatus.expired; - } - // check for at least one self signature. Self signature of user ID not mandatory - // See {@link http://tools.ietf.org/html/rfc4880#section-11.1} - var selfSigned = false; - for (var i = 0; i < this.users.length; i++) { - if (this.users[i].userId && this.users[i].selfCertifications) { - selfSigned = true; - } - } - if (!selfSigned) { - return enums.keyStatus.no_self_cert; - } - // check for valid self signature - var primaryUser = this.getPrimaryUser(); - if (!primaryUser) { - return enums.keyStatus.invalid; - } - // check V4 expiration time - if (this.primaryKey.version == 4 && primaryUser.selfCertificate.keyNeverExpires === false && - Date.now() > (this.primaryKey.created.getTime() + primaryUser.selfCertificate.keyExpirationTime*1000)) { - return enums.keyStatus.expired; - } - return enums.keyStatus.valid; -}; - -/** - * Returns the expiration time of the primary key or null if key does not expire - * @return {Date|null} - */ -Key.prototype.getExpirationTime = function() { - if (this.primaryKey.version == 3) { - return getExpirationTime(this.primaryKey); - } - if (this.primaryKey.version == 4) { - var primaryUser = this.getPrimaryUser(); - if (!primaryUser) { - return null; - } - return getExpirationTime(this.primaryKey, primaryUser.selfCertificate); - } -}; - - -function getExpirationTime(keyPacket, selfCertificate) { - // check V3 expiration time - if (keyPacket.version == 3 && keyPacket.expirationTimeV3 !== 0) { - return new Date(keyPacket.created.getTime() + keyPacket.expirationTimeV3*24*3600*1000); - } - // check V4 expiration time - if (keyPacket.version == 4 && selfCertificate.keyNeverExpires === false) { - return new Date(keyPacket.created.getTime() + selfCertificate.keyExpirationTime*1000); - } - return null; -} - -/** - * Returns primary user and most significant (latest valid) self signature - * - if multiple users are marked as primary users returns the one with the latest self signature - * - if no primary user is found returns the user with the latest self signature - * @return {{user: Array, selfCertificate: Array}|null} The primary user and the self signature - */ -Key.prototype.getPrimaryUser = function() { - var primUser = []; - for (var i = 0; i < this.users.length; i++) { - if (!this.users[i].userId || !this.users[i].selfCertifications) { - continue; - } - for (var j = 0; j < this.users[i].selfCertifications.length; j++) { - primUser.push({user: this.users[i], selfCertificate: this.users[i].selfCertifications[j]}); - } - } - // sort by primary user flag and signature creation time - primUser = primUser.sort(function(a, b) { - if (a.selfCertificate.isPrimaryUserID > b.selfCertificate.isPrimaryUserID) { - return -1; - } else if (a.selfCertificate.isPrimaryUserID < b.selfCertificate.isPrimaryUserID) { - return 1; - } else if (a.selfCertificate.created > b.selfCertificate.created) { - return -1; - } else if (a.selfCertificate.created < b.selfCertificate.created) { - return 1; - } else { - return 0; - } - }); - // return first valid - for (var i = 0; i < primUser.length; i++) { - if (primUser[i].user.isValidSelfCertificate(this.primaryKey, primUser[i].selfCertificate)) { - return primUser[i]; - } - } - return null; -}; - -/** - * Update key with new components from specified key with same key ID: - * users, subkeys, certificates are merged into the destination key, - * duplicates are ignored. - * If the specified key is a private key and the destination key is public, - * the destination key is tranformed to a private key. - * @param {module:key~Key} key source key to merge - */ -Key.prototype.update = function(key) { - var that = this; - if (key.verifyPrimaryKey() === enums.keyStatus.invalid) { - return; - } - if (this.primaryKey.getFingerprint() !== key.primaryKey.getFingerprint()) { - throw new Error('Key update method: fingerprints of keys not equal'); - } - if (this.isPublic() && key.isPrivate()) { - // check for equal subkey packets - var equal = ((this.subKeys && this.subKeys.length) === (key.subKeys && key.subKeys.length)) && - (!this.subKeys || this.subKeys.every(function(destSubKey) { - return key.subKeys.some(function(srcSubKey) { - return destSubKey.subKey.getFingerprint() === srcSubKey.subKey.getFingerprint(); - }); - })); - if (!equal) { - throw new Error('Cannot update public key with private key if subkey mismatch'); - } - this.primaryKey = key.primaryKey; - } - // revocation signature - if (!this.revocationSignature && key.revocationSignature && !key.revocationSignature.isExpired() && - (key.revocationSignature.verified || - key.revocationSignature.verify(key.primaryKey, {key: key.primaryKey}))) { - this.revocationSignature = key.revocationSignature; - } - // direct signatures - mergeSignatures(key, this, 'directSignatures'); - // users - key.users.forEach(function(srcUser) { - var found = false; - for (var i = 0; i < that.users.length; i++) { - if (srcUser.userId && (srcUser.userId.userid === that.users[i].userId.userid) || - srcUser.userAttribute && (srcUser.userAttribute.equals(that.users[i].userAttribute))) { - that.users[i].update(srcUser, that.primaryKey); - found = true; - break; - } - } - if (!found) { - that.users.push(srcUser); - } - }); - // subkeys - if (key.subKeys) { - key.subKeys.forEach(function(srcSubKey) { - var found = false; - for (var i = 0; i < that.subKeys.length; i++) { - if (srcSubKey.subKey.getFingerprint() === that.subKeys[i].subKey.getFingerprint()) { - that.subKeys[i].update(srcSubKey, that.primaryKey); - found = true; - break; - } - } - if (!found) { - that.subKeys.push(srcSubKey); - } - }); - } -}; - -/** - * Merges signatures from source[attr] to dest[attr] - * @private - * @param {Object} source - * @param {Object} dest - * @param {String} attr - * @param {Function} checkFn optional, signature only merged if true - */ -function mergeSignatures(source, dest, attr, checkFn) { - source = source[attr]; - if (source) { - if (!dest[attr]) { - dest[attr] = source; - } else { - source.forEach(function(sourceSig) { - if (!sourceSig.isExpired() && (!checkFn || checkFn(sourceSig)) && - !dest[attr].some(function(destSig) { - return destSig.signature === sourceSig.signature; - })) { - dest[attr].push(sourceSig); - } - }); - } - } -} - -// TODO -Key.prototype.revoke = function() { - -}; - -/** - * @class - * @classdesc Class that represents an user ID or attribute packet and the relevant signatures. - */ -function User(userPacket) { - if (!(this instanceof User)) { - return new User(userPacket); - } - this.userId = userPacket.tag == enums.packet.userid ? userPacket : null; - this.userAttribute = userPacket.tag == enums.packet.userAttribute ? userPacket : null; - this.selfCertifications = null; - this.otherCertifications = null; - this.revocationCertifications = null; -} - -/** - * Transforms structured user data to packetlist - * @return {module:packet/packetlist} - */ -User.prototype.toPacketlist = function() { - var packetlist = new packet.List(); - packetlist.push(this.userId || this.userAttribute); - packetlist.concat(this.revocationCertifications); - packetlist.concat(this.selfCertifications); - packetlist.concat(this.otherCertifications); - return packetlist; -}; - -/** - * Checks if a self signature of the user is revoked - * @param {module:packet/signature} certificate - * @param {module:packet/secret_key|module:packet/public_key} primaryKey The primary key packet - * @return {Boolean} True if the certificate is revoked - */ -User.prototype.isRevoked = function(certificate, primaryKey) { - if (this.revocationCertifications) { - var that = this; - return this.revocationCertifications.some(function(revCert) { - return revCert.issuerKeyId.equals(certificate.issuerKeyId) && - !revCert.isExpired() && - (revCert.verified || - revCert.verify(primaryKey, {userid: that.userId || that.userAttribute, key: primaryKey})); - }); - } else { - return false; - } -}; - -/** - * Returns the most significant (latest valid) self signature of the user - * @param {module:packet/secret_key|module:packet/public_key} primaryKey The primary key packet - * @return {module:packet/signature} The self signature - */ -User.prototype.getValidSelfCertificate = function(primaryKey) { - if (!this.selfCertifications) { - return null; - } - // most recent first - var validCert = this.selfCertifications.sort(function(a, b) { - a = a.created; - b = b.created; - return a>b ? -1 : a (this.subKey.created.getTime() + this.subKey.expirationTimeV3*24*3600*1000)) { - return enums.keyStatus.expired; - } - // check subkey binding signature - if (!this.bindingSignature) { - return enums.keyStatus.invalid; - } - if (this.bindingSignature.isExpired()) { - return enums.keyStatus.expired; - } - if (!(this.bindingSignature.verified || - this.bindingSignature.verify(primaryKey, {key: primaryKey, bind: this.subKey}))) { - return enums.keyStatus.invalid; - } - // check V4 expiration time - if (this.subKey.version == 4 && - this.bindingSignature.keyNeverExpires === false && - Date.now() > (this.subKey.created.getTime() + this.bindingSignature.keyExpirationTime*1000)) { - return enums.keyStatus.expired; - } - return enums.keyStatus.valid; -}; - -/** - * Returns the expiration time of the subkey or null if key does not expire - * @return {Date|null} - */ -SubKey.prototype.getExpirationTime = function() { - return getExpirationTime(this.subKey, this.bindingSignature); -}; - -/** - * Update subkey with new components from specified subkey - * @param {module:key~SubKey} subKey source subkey to merge - * @param {module:packet/signature} primaryKey primary key used for validation - */ -SubKey.prototype.update = function(subKey, primaryKey) { - if (subKey.verify(primaryKey) === enums.keyStatus.invalid) { - return; - } - if (this.subKey.getFingerprint() !== subKey.subKey.getFingerprint()) { - throw new Error('SubKey update method: fingerprints of subkeys not equal'); - } - // key packet - if (this.subKey.tag === enums.packet.publicSubkey && - subKey.subKey.tag === enums.packet.secretSubkey) { - this.subKey = subKey.subKey; - } - // binding signature - if (!this.bindingSignature && subKey.bindingSignature && - (subKey.bindingSignature.verified || - subKey.bindingSignature.verify(primaryKey, {key: primaryKey, bind: this.subKey}))) { - this.bindingSignature = subKey.bindingSignature; - } - // revocation signature - if (!this.revocationSignature && subKey.revocationSignature && !subKey.revocationSignature.isExpired() && - (subKey.revocationSignature.verified || - subKey.revocationSignature.verify(primaryKey, {key: primaryKey, bind: this.subKey}))) { - this.revocationSignature = subKey.revocationSignature; - } -}; - -/** - * Reads an OpenPGP armored text and returns one or multiple key objects - * @param {String} armoredText text to be parsed - * @return {{keys: Array, err: (Array|null)}} result object with key and error arrays - * @static - */ -function readArmored(armoredText) { - var result = {}; - result.keys = []; - try { - var input = armor.decode(armoredText); - if (!(input.type == enums.armor.public_key || input.type == enums.armor.private_key)) { - throw new Error('Armored text not of type key'); - } - var packetlist = new packet.List(); - packetlist.read(input.data); - var keyIndex = packetlist.indexOfTag(enums.packet.publicKey, enums.packet.secretKey); - if (keyIndex.length === 0) { - throw new Error('No key packet found in armored text'); - } - for (var i = 0; i < keyIndex.length; i++) { - var oneKeyList = packetlist.slice(keyIndex[i], keyIndex[i + 1]); - try { - var newKey = new Key(oneKeyList); - result.keys.push(newKey); - } catch (e) { - result.err = result.err || []; - result.err.push(e); - } - } - } catch (e) { - result.err = result.err || []; - result.err.push(e); - } - return result; -} - -/** - * Generates a new OpenPGP key. Currently only supports RSA keys. - * Primary and subkey will be of same type. - * @param {module:enums.publicKey} [options.keyType=module:enums.publicKey.rsa_encrypt_sign] to indicate what type of key to make. - * RSA is 1. See {@link http://tools.ietf.org/html/rfc4880#section-9.1} - * @param {Integer} options.numBits number of bits for the key creation. - * @param {String|Array} options.userId assumes already in form of "User Name " - If array is used, the first userId is set as primary user Id - * @param {String} options.passphrase The passphrase used to encrypt the resulting private key - * @param {Boolean} [options.unlocked=false] The secret part of the generated key is unlocked - * @return {module:key~Key} - * @static - */ -function generate(options) { - var packetlist, secretKeyPacket, userIdPacket, dataToSign, signaturePacket, secretSubkeyPacket, subkeySignaturePacket; - - options.keyType = options.keyType || enums.publicKey.rsa_encrypt_sign; - // RSA Encrypt-Only and RSA Sign-Only are deprecated and SHOULD NOT be generated - if (options.keyType !== enums.publicKey.rsa_encrypt_sign) { - throw new Error('Only RSA Encrypt or Sign supported'); - } - // Key without passphrase is unlocked by definition - if (!options.passphrase) { - options.unlocked = true; - } - if (String.prototype.isPrototypeOf(options.userId) || typeof options.userId === 'string') { - options.userId = [options.userId]; - } - - // generate - var genSecretKey = generateSecretKey(); - var genSecretSubkey = generateSecretSubkey(); - return Promise.all([genSecretKey, genSecretSubkey]).then(wrapKeyObject); - - function generateSecretKey() { - secretKeyPacket = new packet.SecretKey(); - secretKeyPacket.algorithm = enums.read(enums.publicKey, options.keyType); - return secretKeyPacket.generate(options.numBits); - } - - function generateSecretSubkey() { - secretSubkeyPacket = new packet.SecretSubkey(); - secretSubkeyPacket.algorithm = enums.read(enums.publicKey, options.keyType); - return secretSubkeyPacket.generate(options.numBits); - } - - function wrapKeyObject() { - // set passphrase protection - if (options.passphrase) { - secretKeyPacket.encrypt(options.passphrase); - secretSubkeyPacket.encrypt(options.passphrase); - } - - packetlist = new packet.List(); - - packetlist.push(secretKeyPacket); - - options.userId.forEach(function(userId, index) { - - userIdPacket = new packet.Userid(); - userIdPacket.read(userId); - - dataToSign = {}; - dataToSign.userid = userIdPacket; - dataToSign.key = secretKeyPacket; - signaturePacket = new packet.Signature(); - signaturePacket.signatureType = enums.signature.cert_generic; - signaturePacket.publicKeyAlgorithm = options.keyType; - signaturePacket.hashAlgorithm = config.prefer_hash_algorithm; - signaturePacket.keyFlags = [enums.keyFlags.certify_keys | enums.keyFlags.sign_data]; - signaturePacket.preferredSymmetricAlgorithms = []; - signaturePacket.preferredSymmetricAlgorithms.push(enums.symmetric.aes256); - signaturePacket.preferredSymmetricAlgorithms.push(enums.symmetric.aes192); - signaturePacket.preferredSymmetricAlgorithms.push(enums.symmetric.aes128); - signaturePacket.preferredSymmetricAlgorithms.push(enums.symmetric.cast5); - signaturePacket.preferredSymmetricAlgorithms.push(enums.symmetric.tripledes); - signaturePacket.preferredHashAlgorithms = []; - signaturePacket.preferredHashAlgorithms.push(enums.hash.sha256); - signaturePacket.preferredHashAlgorithms.push(enums.hash.sha1); - signaturePacket.preferredHashAlgorithms.push(enums.hash.sha512); - signaturePacket.preferredCompressionAlgorithms = []; - signaturePacket.preferredCompressionAlgorithms.push(enums.compression.zlib); - signaturePacket.preferredCompressionAlgorithms.push(enums.compression.zip); - if (index === 0) { - signaturePacket.isPrimaryUserID = true; - } - if (config.integrity_protect) { - signaturePacket.features = []; - signaturePacket.features.push(1); // Modification Detection - } - signaturePacket.sign(secretKeyPacket, dataToSign); - - packetlist.push(userIdPacket); - packetlist.push(signaturePacket); - - }); - - dataToSign = {}; - dataToSign.key = secretKeyPacket; - dataToSign.bind = secretSubkeyPacket; - subkeySignaturePacket = new packet.Signature(); - subkeySignaturePacket.signatureType = enums.signature.subkey_binding; - subkeySignaturePacket.publicKeyAlgorithm = options.keyType; - subkeySignaturePacket.hashAlgorithm = config.prefer_hash_algorithm; - subkeySignaturePacket.keyFlags = [enums.keyFlags.encrypt_communication | enums.keyFlags.encrypt_storage]; - subkeySignaturePacket.sign(secretKeyPacket, dataToSign); - - packetlist.push(secretSubkeyPacket); - packetlist.push(subkeySignaturePacket); - - if (!options.unlocked) { - secretKeyPacket.clearPrivateMPIs(); - secretSubkeyPacket.clearPrivateMPIs(); - } - - return new Key(packetlist); - } -} - -/** - * Returns the preferred symmetric algorithm for a set of keys - * @param {Array} keys Set of keys - * @return {enums.symmetric} Preferred symmetric algorithm - */ -function getPreferredSymAlgo(keys) { - var prioMap = {}; - for (var i = 0; i < keys.length; i++) { - var primaryUser = keys[i].getPrimaryUser(); - if (!primaryUser || !primaryUser.selfCertificate.preferredSymmetricAlgorithms) { - return config.encryption_cipher; - } - primaryUser.selfCertificate.preferredSymmetricAlgorithms.forEach(function(algo, index) { - var entry = prioMap[algo] || (prioMap[algo] = {prio: 0, count: 0, algo: algo}); - entry.prio += 64 >> index; - entry.count++; - }); - } - var prefAlgo = {prio: 0, algo: config.encryption_cipher}; - for (var algo in prioMap) { - try { - if (algo !== enums.symmetric.plaintext && - algo !== enums.symmetric.idea && // not implemented - enums.read(enums.symmetric, algo) && // known algorithm - prioMap[algo].count === keys.length && // available for all keys - prioMap[algo].prio > prefAlgo.prio) { - prefAlgo = prioMap[algo]; - } - } catch (e) {} - } - return prefAlgo.algo; -} - -exports.Key = Key; -exports.readArmored = readArmored; -exports.generate = generate; -exports.getPreferredSymAlgo = getPreferredSymAlgo; - -},{"./config":17,"./encoding/armor.js":41,"./enums.js":43,"./packet":55,"./util":76}],48:[function(require,module,exports){ -/** - * @see module:keyring/keyring - * @module keyring - */ -module.exports = require('./keyring.js'); -module.exports.localstore = require('./localstore.js'); - -},{"./keyring.js":49,"./localstore.js":50}],49:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * The class that deals with storage of the keyring. Currently the only option is to use HTML5 local storage. - * @requires enums - * @requires key - * @requires util - * @module keyring/keyring - */ - -var enums = require('../enums.js'), - keyModule = require('../key.js'), - util = require('../util.js'); - -module.exports = Keyring; - - /** - * Initialization routine for the keyring. This method reads the - * keyring from HTML5 local storage and initializes this instance. - * @constructor - * @param {class} [storeHandler] class implementing load() and store() methods - */ -function Keyring(storeHandler) { - this.storeHandler = storeHandler || new (require('./localstore.js'))(); - this.publicKeys = new KeyArray(this.storeHandler.loadPublic()); - this.privateKeys = new KeyArray(this.storeHandler.loadPrivate()); -} - -/** - * Calls the storeHandler to save the keys - */ -Keyring.prototype.store = function () { - this.storeHandler.storePublic(this.publicKeys.keys); - this.storeHandler.storePrivate(this.privateKeys.keys); -}; - -/** - * Clear the keyring - erase all the keys - */ -Keyring.prototype.clear = function() { - this.publicKeys.keys = []; - this.privateKeys.keys = []; -}; - -/** - * Searches the keyring for keys having the specified key id - * @param {String} keyId provided as string of lowercase hex number - * withouth 0x prefix (can be 16-character key ID or fingerprint) - * @param {Boolean} deep if true search also in subkeys - * @return {Array|null} keys found or null - */ -Keyring.prototype.getKeysForId = function (keyId, deep) { - var result = []; - result = result.concat(this.publicKeys.getForId(keyId, deep) || []); - result = result.concat(this.privateKeys.getForId(keyId, deep) || []); - return result.length ? result : null; -}; - -/** - * Removes keys having the specified key id from the keyring - * @param {String} keyId provided as string of lowercase hex number - * withouth 0x prefix (can be 16-character key ID or fingerprint) - * @return {Array|null} keys found or null - */ -Keyring.prototype.removeKeysForId = function (keyId) { - var result = []; - result = result.concat(this.publicKeys.removeForId(keyId) || []); - result = result.concat(this.privateKeys.removeForId(keyId) || []); - return result.length ? result : null; -}; - -/** - * Get all public and private keys - * @return {Array} all keys - */ -Keyring.prototype.getAllKeys = function () { - return this.publicKeys.keys.concat(this.privateKeys.keys); -}; - -/** - * Array of keys - * @param {Array} keys The keys to store in this array - */ -function KeyArray(keys) { - this.keys = keys; -} - -/** - * Searches all keys in the KeyArray matching the address or address part of the user ids - * @param {String} email email address to search for - * @return {Array} The public keys associated with provided email address. - */ -KeyArray.prototype.getForAddress = function(email) { - var results = []; - for (var i = 0; i < this.keys.length; i++) { - if (emailCheck(email, this.keys[i])) { - results.push(this.keys[i]); - } - } - return results; -}; - -/** - * Checks a key to see if it matches the specified email address - * @private - * @param {String} email email address to search for - * @param {module:key~Key} key The key to be checked. - * @return {Boolean} True if the email address is defined in the specified key - */ -function emailCheck(email, key) { - email = email.toLowerCase(); - // escape email before using in regular expression - var emailEsc = email.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - var emailRegex = new RegExp('<' + emailEsc + '>'); - var userIds = key.getUserIds(); - for (var i = 0; i < userIds.length; i++) { - var userId = userIds[i].toLowerCase(); - if (email === userId || emailRegex.test(userId)) { - return true; - } - } - return false; -} - -/** - * Checks a key to see if it matches the specified keyid - * @private - * @param {String} keyId provided as string of lowercase hex number - * withouth 0x prefix (can be 16-character key ID or fingerprint) - * @param {module:packet/secret_key|public_key|public_subkey|secret_subkey} keypacket The keypacket to be checked - * @return {Boolean} True if keypacket has the specified keyid - */ -function keyIdCheck(keyId, keypacket) { - if (keyId.length === 16) { - return keyId === keypacket.getKeyId().toHex(); - } else { - return keyId === keypacket.getFingerprint(); - } -} - -/** - * Searches the KeyArray for a key having the specified key id - * @param {String} keyId provided as string of lowercase hex number - * withouth 0x prefix (can be 16-character key ID or fingerprint) - * @param {Boolean} deep if true search also in subkeys - * @return {module:key~Key|null} key found or null - */ -KeyArray.prototype.getForId = function (keyId, deep) { - for (var i = 0; i < this.keys.length; i++) { - if (keyIdCheck(keyId, this.keys[i].primaryKey)) { - return this.keys[i]; - } - if (deep && this.keys[i].subKeys) { - for (var j = 0; j < this.keys[i].subKeys.length; j++) { - if (keyIdCheck(keyId, this.keys[i].subKeys[j].subKey)) { - return this.keys[i]; - } - } - } - } - return null; -}; - -/** - * Imports a key from an ascii armored message - * @param {String} armored message to read the keys/key from - * @return {Array|null} array of error objects or null - */ -KeyArray.prototype.importKey = function (armored) { - var imported = keyModule.readArmored(armored); - var that = this; - imported.keys.forEach(function(key) { - // check if key already in key array - var keyidHex = key.primaryKey.getKeyId().toHex(); - var keyFound = that.getForId(keyidHex); - if (keyFound) { - keyFound.update(key); - } else { - that.push(key); - } - }); - return imported.err ? imported.err : null; -}; - -/** - * Add key to KeyArray - * @param {module:key~Key} key The key that will be added to the keyring - * @return {Number} The new length of the KeyArray - */ -KeyArray.prototype.push = function (key) { - return this.keys.push(key); -}; - -/** - * Removes a key with the specified keyid from the keyring - * @param {String} keyId provided as string of lowercase hex number - * withouth 0x prefix (can be 16-character key ID or fingerprint) - * @return {module:key~Key|null} The key object which has been removed or null - */ -KeyArray.prototype.removeForId = function (keyId) { - for (var i = 0; i < this.keys.length; i++) { - if (keyIdCheck(keyId, this.keys[i].primaryKey)) { - return this.keys.splice(i, 1)[0]; - } - } - return null; -}; - -},{"../enums.js":43,"../key.js":47,"../util.js":76,"./localstore.js":50}],50:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * The class that deals with storage of the keyring. Currently the only option is to use HTML5 local storage. - * @requires config - * @module keyring/localstore - * @param {String} prefix prefix for itemnames in localstore - */ -module.exports = LocalStore; - -var config = require('../config'), - keyModule = require('../key.js'), - util = require('../util.js'); - -function LocalStore(prefix) { - prefix = prefix || 'openpgp-'; - this.publicKeysItem = prefix + this.publicKeysItem; - this.privateKeysItem = prefix + this.privateKeysItem; - if (typeof window != 'undefined' && window.localStorage) { - this.storage = window.localStorage; - } else { - this.storage = new (require('node-localstorage').LocalStorage)(config.node_store); - } -} - -/* - * Declare the localstore itemnames - */ -LocalStore.prototype.publicKeysItem = 'public-keys'; -LocalStore.prototype.privateKeysItem = 'private-keys'; - -/** - * Load the public keys from HTML5 local storage. - * @return {Array} array of keys retrieved from localstore - */ -LocalStore.prototype.loadPublic = function () { - return loadKeys(this.storage, this.publicKeysItem); -}; - -/** - * Load the private keys from HTML5 local storage. - * @return {Array} array of keys retrieved from localstore - */ -LocalStore.prototype.loadPrivate = function () { - return loadKeys(this.storage, this.privateKeysItem); -}; - -function loadKeys(storage, itemname) { - var armoredKeys = JSON.parse(storage.getItem(itemname)); - var keys = []; - if (armoredKeys !== null && armoredKeys.length !== 0) { - var key; - for (var i = 0; i < armoredKeys.length; i++) { - key = keyModule.readArmored(armoredKeys[i]); - if (!key.err) { - keys.push(key.keys[0]); - } else { - util.print_debug("Error reading armored key from keyring index: " + i); - } - } - } - return keys; -} - -/** - * Saves the current state of the public keys to HTML5 local storage. - * The key array gets stringified using JSON - * @param {Array} keys array of keys to save in localstore - */ -LocalStore.prototype.storePublic = function (keys) { - storeKeys(this.storage, this.publicKeysItem, keys); -}; - -/** - * Saves the current state of the private keys to HTML5 local storage. - * The key array gets stringified using JSON - * @param {Array} keys array of keys to save in localstore - */ -LocalStore.prototype.storePrivate = function (keys) { - storeKeys(this.storage, this.privateKeysItem, keys); -}; - -function storeKeys(storage, itemname, keys) { - var armoredKeys = []; - if (keys.length) { - for (var i = 0; i < keys.length; i++) { - armoredKeys.push(keys[i].armor()); - } - storage.setItem(itemname, JSON.stringify(armoredKeys)); - } else { - storage.removeItem(itemname); - } -} - -},{"../config":17,"../key.js":47,"../util.js":76,"node-localstorage":"node-localstorage"}],51:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * @requires config - * @requires crypto - * @requires encoding/armor - * @requires enums - * @requires packet - * @module message - */ - -'use strict'; - -var packet = require('./packet'), - enums = require('./enums.js'), - armor = require('./encoding/armor.js'), - config = require('./config'), - crypto = require('./crypto'), - keyModule = require('./key.js'); - -/** - * @class - * @classdesc Class that represents an OpenPGP message. - * Can be an encrypted message, signed message, compressed message or literal message - * @param {module:packet/packetlist} packetlist The packets that form this message - * See {@link http://tools.ietf.org/html/rfc4880#section-11.3} - */ - -function Message(packetlist) { - if (!(this instanceof Message)) { - return new Message(packetlist); - } - this.packets = packetlist || new packet.List(); -} - -/** - * Returns the key IDs of the keys to which the session key is encrypted - * @return {Array} array of keyid objects - */ -Message.prototype.getEncryptionKeyIds = function() { - var keyIds = []; - var pkESKeyPacketlist = this.packets.filterByTag(enums.packet.publicKeyEncryptedSessionKey); - pkESKeyPacketlist.forEach(function(packet) { - keyIds.push(packet.publicKeyId); - }); - return keyIds; -}; - -/** - * Returns the key IDs of the keys that signed the message - * @return {Array} array of keyid objects - */ -Message.prototype.getSigningKeyIds = function() { - var keyIds = []; - var msg = this.unwrapCompressed(); - // search for one pass signatures - var onePassSigList = msg.packets.filterByTag(enums.packet.onePassSignature); - onePassSigList.forEach(function(packet) { - keyIds.push(packet.signingKeyId); - }); - // if nothing found look for signature packets - if (!keyIds.length) { - var signatureList = msg.packets.filterByTag(enums.packet.signature); - signatureList.forEach(function(packet) { - keyIds.push(packet.issuerKeyId); - }); - } - return keyIds; -}; - -/** - * Decrypt the message - * @param {module:key~Key} privateKey private key with decrypted secret data - * @return {Array} new message with decrypted content - */ -Message.prototype.decrypt = function(privateKey) { - var encryptionKeyIds = this.getEncryptionKeyIds(); - if (!encryptionKeyIds.length) { - // nothing to decrypt return unmodified message - return this; - } - var privateKeyPacket = privateKey.getKeyPacket(encryptionKeyIds); - if (!privateKeyPacket.isDecrypted) throw new Error('Private key is not decrypted.'); - var pkESKeyPacketlist = this.packets.filterByTag(enums.packet.publicKeyEncryptedSessionKey); - var pkESKeyPacket; - for (var i = 0; i < pkESKeyPacketlist.length; i++) { - if (pkESKeyPacketlist[i].publicKeyId.equals(privateKeyPacket.getKeyId())) { - pkESKeyPacket = pkESKeyPacketlist[i]; - pkESKeyPacket.decrypt(privateKeyPacket); - break; - } - } - if (pkESKeyPacket) { - var symEncryptedPacketlist = this.packets.filterByTag(enums.packet.symmetricallyEncrypted, enums.packet.symEncryptedIntegrityProtected); - if (symEncryptedPacketlist.length !== 0) { - var symEncryptedPacket = symEncryptedPacketlist[0]; - symEncryptedPacket.decrypt(pkESKeyPacket.sessionKeyAlgorithm, pkESKeyPacket.sessionKey); - var resultMsg = new Message(symEncryptedPacket.packets); - // remove packets after decryption - symEncryptedPacket.packets = new packet.List(); - return resultMsg; - } - } -}; - -/** - * Get literal data that is the body of the message - * @return {(String|null)} literal body of the message as string - */ -Message.prototype.getLiteralData = function() { - var literal = this.packets.findPacket(enums.packet.literal); - return literal && literal.data || null; -}; - -/** - * Get filename from literal data packet - * @return {(String|null)} filename of literal data packet as string - */ -Message.prototype.getFilename = function() { - var literal = this.packets.findPacket(enums.packet.literal); - return literal && literal.getFilename() || null; -}; - -/** - * Get literal data as text - * @return {(String|null)} literal body of the message interpreted as text - */ -Message.prototype.getText = function() { - var literal = this.packets.findPacket(enums.packet.literal); - if (literal) { - return literal.getText(); - } else { - return null; - } -}; - -/** - * Encrypt the message - * @param {Array} keys array of keys, used to encrypt the message - * @return {Array} new message with encrypted content - */ -Message.prototype.encrypt = function(keys) { - var packetlist = new packet.List(); - var symAlgo = keyModule.getPreferredSymAlgo(keys); - var sessionKey = crypto.generateSessionKey(enums.read(enums.symmetric, symAlgo)); - keys.forEach(function(key) { - var encryptionKeyPacket = key.getEncryptionKeyPacket(); - if (encryptionKeyPacket) { - var pkESKeyPacket = new packet.PublicKeyEncryptedSessionKey(); - pkESKeyPacket.publicKeyId = encryptionKeyPacket.getKeyId(); - pkESKeyPacket.publicKeyAlgorithm = encryptionKeyPacket.algorithm; - pkESKeyPacket.sessionKey = sessionKey; - pkESKeyPacket.sessionKeyAlgorithm = enums.read(enums.symmetric, symAlgo); - pkESKeyPacket.encrypt(encryptionKeyPacket); - packetlist.push(pkESKeyPacket); - } else { - throw new Error('Could not find valid key packet for encryption in key ' + key.primaryKey.getKeyId().toHex()); - } - }); - var symEncryptedPacket; - if (config.integrity_protect) { - symEncryptedPacket = new packet.SymEncryptedIntegrityProtected(); - } else { - symEncryptedPacket = new packet.SymmetricallyEncrypted(); - } - symEncryptedPacket.packets = this.packets; - symEncryptedPacket.encrypt(enums.read(enums.symmetric, symAlgo), sessionKey); - packetlist.push(symEncryptedPacket); - // remove packets after encryption - symEncryptedPacket.packets = new packet.List(); - return new Message(packetlist); -}; - -/** - * Encrypt the message symmetrically using a passphrase. - * https://tools.ietf.org/html/rfc4880#section-3.7.2.2 - * @param {String} passphrase - * @return {Array} new message with encrypted content - */ -Message.prototype.symEncrypt = function(passphrase) { - if (!passphrase) { - throw new Error('The passphrase cannot be empty!'); - } - - var algo = enums.read(enums.symmetric, config.encryption_cipher); - var packetlist = new packet.List(); - - // create a Symmetric-key Encrypted Session Key (ESK) - var symESKPacket = new packet.SymEncryptedSessionKey(); - symESKPacket.sessionKeyAlgorithm = algo; - symESKPacket.decrypt(passphrase); // generate the session key - packetlist.push(symESKPacket); - - // create integrity protected packet - var symEncryptedPacket = new packet.SymEncryptedIntegrityProtected(); - symEncryptedPacket.packets = this.packets; - symEncryptedPacket.encrypt(algo, symESKPacket.sessionKey); - packetlist.push(symEncryptedPacket); - - // remove packets after encryption - symEncryptedPacket.packets = new packet.List(); - return new Message(packetlist); -}; - -/** - * Decrypt the message symmetrically using a passphrase. - * https://tools.ietf.org/html/rfc4880#section-3.7.2.2 - * @param {String} passphrase - * @return {Array} new message with decrypted content - */ -Message.prototype.symDecrypt = function(passphrase) { - var symEncryptedPacketlist = this.packets.filterByTag(enums.packet.symEncryptedSessionKey, enums.packet.symEncryptedIntegrityProtected); - - // decrypt Symmetric-key Encrypted Session Key (ESK) - var symESKPacket = symEncryptedPacketlist[0]; - symESKPacket.decrypt(passphrase); - - // decrypt integrity protected packet - var symEncryptedPacket = symEncryptedPacketlist[1]; - symEncryptedPacket.decrypt(symESKPacket.sessionKeyAlgorithm, symESKPacket.sessionKey); - - var resultMsg = new Message(symEncryptedPacket.packets); - // remove packets after decryption - symEncryptedPacket.packets = new packet.List(); - return resultMsg; -}; - -/** - * Sign the message (the literal data packet of the message) - * @param {Array} privateKey private keys with decrypted secret key data for signing - * @return {module:message~Message} new message with signed content - */ -Message.prototype.sign = function(privateKeys) { - - var packetlist = new packet.List(); - - var literalDataPacket = this.packets.findPacket(enums.packet.literal); - if (!literalDataPacket) throw new Error('No literal data packet to sign.'); - - var literalFormat = enums.write(enums.literal, literalDataPacket.format); - var signatureType = literalFormat == enums.literal.binary ? - enums.signature.binary : enums.signature.text; - var i, signingKeyPacket; - for (i = 0; i < privateKeys.length; i++) { - if (privateKeys[i].isPublic()) { - throw new Error('Need private key for signing'); - } - var onePassSig = new packet.OnePassSignature(); - onePassSig.type = signatureType; - //TODO get preferred hashg algo from key signature - onePassSig.hashAlgorithm = config.prefer_hash_algorithm; - signingKeyPacket = privateKeys[i].getSigningKeyPacket(); - if (!signingKeyPacket) { - throw new Error('Could not find valid key packet for signing in key ' + privateKeys[i].primaryKey.getKeyId().toHex()); - } - onePassSig.publicKeyAlgorithm = signingKeyPacket.algorithm; - onePassSig.signingKeyId = signingKeyPacket.getKeyId(); - packetlist.push(onePassSig); - } - - packetlist.push(literalDataPacket); - - for (i = privateKeys.length - 1; i >= 0; i--) { - var signaturePacket = new packet.Signature(); - signaturePacket.signatureType = signatureType; - signaturePacket.hashAlgorithm = config.prefer_hash_algorithm; - signaturePacket.publicKeyAlgorithm = signingKeyPacket.algorithm; - if (!signingKeyPacket.isDecrypted) throw new Error('Private key is not decrypted.'); - signaturePacket.sign(signingKeyPacket, literalDataPacket); - packetlist.push(signaturePacket); - } - - return new Message(packetlist); -}; - -/** - * Verify message signatures - * @param {Array} keys array of keys to verify signatures - * @return {Array<({keyid: module:type/keyid, valid: Boolean})>} list of signer's keyid and validity of signature - */ -Message.prototype.verify = function(keys) { - var result = []; - var msg = this.unwrapCompressed(); - var literalDataList = msg.packets.filterByTag(enums.packet.literal); - if (literalDataList.length !== 1) throw new Error('Can only verify message with one literal data packet.'); - var signatureList = msg.packets.filterByTag(enums.packet.signature); - for (var i = 0; i < signatureList.length; i++) { - var keyPacket = null; - for (var j = 0; j < keys.length; j++) { - keyPacket = keys[j].getSigningKeyPacket(signatureList[i].issuerKeyId); - if (keyPacket) { - break; - } - } - - var verifiedSig = {}; - if (keyPacket) { - verifiedSig.keyid = signatureList[i].issuerKeyId; - verifiedSig.valid = signatureList[i].verify(keyPacket, literalDataList[0]); - } else { - verifiedSig.keyid = signatureList[i].issuerKeyId; - verifiedSig.valid = null; - } - result.push(verifiedSig); - } - return result; -}; - -/** - * Unwrap compressed message - * @return {module:message~Message} message Content of compressed message - */ -Message.prototype.unwrapCompressed = function() { - var compressed = this.packets.filterByTag(enums.packet.compressed); - if (compressed.length) { - return new Message(compressed[0].packets); - } else { - return this; - } -}; - -/** - * Returns ASCII armored text of message - * @return {String} ASCII armor - */ -Message.prototype.armor = function() { - return armor.encode(enums.armor.message, this.packets.write()); -}; - -/** - * reads an OpenPGP armored message and returns a message object - * @param {String} armoredText text to be parsed - * @return {module:message~Message} new message object - * @static - */ -function readArmored(armoredText) { - //TODO how do we want to handle bad text? Exception throwing - //TODO don't accept non-message armored texts - var input = armor.decode(armoredText).data; - var packetlist = new packet.List(); - packetlist.read(input); - return new Message(packetlist); -} - -/** - * Create a message object from signed content and a detached armored signature. - * @param {String} content An 8 bit ascii string containing e.g. a MIME subtree with text nodes or attachments - * @param {String} detachedSignature The detached ascii armored PGP signarure - */ -function readSignedContent(content, detachedSignature) { - var literalDataPacket = new packet.Literal(); - literalDataPacket.setBytes(content, enums.read(enums.literal, enums.literal.binary)); - var packetlist = new packet.List(); - packetlist.push(literalDataPacket); - var input = armor.decode(detachedSignature).data; - packetlist.read(input); - return new Message(packetlist); -} - -/** - * creates new message object from text - * @param {String} text - * @return {module:message~Message} new message object - * @static - */ -function fromText(text) { - var literalDataPacket = new packet.Literal(); - // text will be converted to UTF8 - literalDataPacket.setText(text); - var literalDataPacketlist = new packet.List(); - literalDataPacketlist.push(literalDataPacket); - return new Message(literalDataPacketlist); -} - -/** - * creates new message object from binary data - * @param {String} bytes - * @param {String} filename - * @return {module:message~Message} new message object - * @static - */ -function fromBinary(bytes, filename) { - var literalDataPacket = new packet.Literal(); - if (filename) { - literalDataPacket.setFilename(filename); - } - literalDataPacket.setBytes(bytes, enums.read(enums.literal, enums.literal.binary)); - var literalDataPacketlist = new packet.List(); - literalDataPacketlist.push(literalDataPacket); - return new Message(literalDataPacketlist); -} - -exports.Message = Message; -exports.readArmored = readArmored; -exports.readSignedContent = readSignedContent; -exports.fromText = fromText; -exports.fromBinary = fromBinary; - -},{"./config":17,"./crypto":32,"./encoding/armor.js":41,"./enums.js":43,"./key.js":47,"./packet":55}],52:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * @fileoverview The openpgp base module should provide all of the functionality - * to consume the openpgp.js library. All additional classes are documented - * for extending and developing on top of the base library. - */ - -/** - * @requires cleartext - * @requires config - * @requires encoding/armor - * @requires enums - * @requires message - * @requires packet - * @module openpgp - */ - -'use strict'; - -var armor = require('./encoding/armor.js'), - enums = require('./enums.js'), - message = require('./message.js'), - cleartext = require('./cleartext.js'), - key = require('./key.js'), - util = require('./util'), - AsyncProxy = require('./worker/async_proxy.js'); - -require('es6-promise').polyfill(); // load ES6 Promises polyfill - -var asyncProxy = null; // instance of the asyncproxy - -/** - * Set the path for the web worker script and create an instance of the async proxy - * @param {String} path relative path to the worker scripts, default: 'openpgp.worker.js' - * @param {Object} [options.worker=Object] alternative to path parameter: - * web worker initialized with 'openpgp.worker.js' - * @return {Boolean} true if worker created successfully - */ -function initWorker(path, options) { - if (options && options.worker || typeof window !== 'undefined' && window.Worker) { - options = options || {}; - options.config = this.config; - asyncProxy = new AsyncProxy(path, options); - return true; - } else { - return false; - } -} - -/** - * Returns a reference to the async proxy if the worker was initialized with openpgp.initWorker() - * @return {module:worker/async_proxy~AsyncProxy|null} the async proxy or null if not initialized - */ -function getWorker() { - return asyncProxy; -} - -/** - * Encrypts message text with keys - * @param {(Array|module:key~Key)} keys array of keys or single key, used to encrypt the message - * @param {String} text message as native JavaScript string - * @param {String} format (optional) The input format either 'utf8' or 'binary'. - * @param {String} filename (optional) The filename of the encrypted data - * @return {Promise} encrypted ASCII armored message - * @static - */ -function encryptMessage(keys, text, format, filename) { - if (!keys.length) { - keys = [keys]; - } - - if (asyncProxy) { - return asyncProxy.encryptMessage(keys, text, format, filename); - } - - return execute(function() { - var msg, armored; - msg = createMessage(text, format, filename); - msg = msg.encrypt(keys); - armored = armor.encode(enums.armor.message, msg.packets.write()); - return armored; - - }, 'Error encrypting message!'); -} - -/** - * Signs message text and encrypts it - * @param {(Array|module:key~Key)} publicKeys array of keys or single key, used to encrypt the message - * @param {module:key~Key} privateKey private key with decrypted secret key data for signing - * @param {String} text message as native JavaScript string - * @param {String} format (optional) The input format either 'utf8' or 'binary'. - * @param {String} filename (optional) The filename of the encrypted data - * @return {Promise} encrypted ASCII armored message - * @static - */ -function signAndEncryptMessage(publicKeys, privateKey, text, format, filename) { - if (!publicKeys.length) { - publicKeys = [publicKeys]; - } - - if (asyncProxy) { - return asyncProxy.signAndEncryptMessage(publicKeys, privateKey, text, format, filename); - } - - return execute(function() { - var msg, armored; - msg = createMessage(text, format, filename); - msg = msg.sign([privateKey]); - msg = msg.encrypt(publicKeys); - armored = armor.encode(enums.armor.message, msg.packets.write()); - return armored; - - }, 'Error signing and encrypting message!'); -} - -/** - * Decrypts message - * @param {module:key~Key} privateKey private key with decrypted secret key data - * @param {module:message~Message} msg the message object with the encrypted data - * @param {String} format (optional) The input format either 'utf8' or 'binary'. - * @return {Promise<(String|null)>} decrypted message as as native JavaScript string - * or null if no literal data found - * @static - */ -function decryptMessage(privateKey, msg, format) { - if (asyncProxy) { - return asyncProxy.decryptMessage(privateKey, msg, format); - } - - return execute(function() { - msg = msg.decrypt(privateKey); - return format ? parseMessage(msg, format) : parseMessage(msg).text; - - }, 'Error decrypting message!'); -} - -/** - * Decrypts message and verifies signatures - * @param {module:key~Key} privateKey private key with decrypted secret key data - * @param {(Array|module:key~Key)} publicKeys array of keys or single key, to verify signatures - * @param {module:message~Message} msg the message object with signed and encrypted data - * @param {String} format (optional) The input format either 'utf8' or 'binary'. - * @return {Promise<{text: String, signatures: Array<{keyid: module:type/keyid, valid: Boolean}>}>} - * decrypted message as as native JavaScript string - * with verified signatures or null if no literal data found - * @static - */ -function decryptAndVerifyMessage(privateKey, publicKeys, msg, format) { - if (!publicKeys.length) { - publicKeys = [publicKeys]; - } - - if (asyncProxy) { - return asyncProxy.decryptAndVerifyMessage(privateKey, publicKeys, msg, format); - } - - return execute(function() { - var result = {}; - msg = msg.decrypt(privateKey); - result = parseMessage(msg, format); - if (result.text) { - result.signatures = msg.verify(publicKeys); - return result; - } - return null; - - }, 'Error decrypting and verifying message!'); -} - -/** - * Signs a cleartext message - * @param {(Array|module:key~Key)} privateKeys array of keys or single key with decrypted secret key data to sign cleartext - * @param {String} text cleartext - * @return {Promise} ASCII armored message - * @static - */ -function signClearMessage(privateKeys, text) { - if (!privateKeys.length) { - privateKeys = [privateKeys]; - } - - if (asyncProxy) { - return asyncProxy.signClearMessage(privateKeys, text); - } - - return execute(function() { - var cleartextMessage = new cleartext.CleartextMessage(text); - cleartextMessage.sign(privateKeys); - return cleartextMessage.armor(); - - }, 'Error signing cleartext message!'); -} - -/** - * Verifies signatures of cleartext signed message - * @param {(Array|module:key~Key)} publicKeys array of keys or single key, to verify signatures - * @param {module:cleartext~CleartextMessage} msg cleartext message object with signatures - * @return {Promise<{text: String, signatures: Array<{keyid: module:type/keyid, valid: Boolean}>}>} - * cleartext with status of verified signatures - * @static - */ -function verifyClearSignedMessage(publicKeys, msg) { - if (!publicKeys.length) { - publicKeys = [publicKeys]; - } - - if (asyncProxy) { - return asyncProxy.verifyClearSignedMessage(publicKeys, msg); - } - - return execute(function() { - var result = {}; - if (!(msg instanceof cleartext.CleartextMessage)) { - throw new Error('Parameter [message] needs to be of type CleartextMessage.'); - } - result.text = msg.getText(); - result.signatures = msg.verify(publicKeys); - return result; - - }, 'Error verifying cleartext signed message!'); -} - -/** - * Generates a new OpenPGP key pair. Currently only supports RSA keys. - * Primary and subkey will be of same type. - * @param {module:enums.publicKey} [options.keyType=module:enums.publicKey.rsa_encrypt_sign] to indicate what type of key to make. - * RSA is 1. See {@link http://tools.ietf.org/html/rfc4880#section-9.1} - * @param {Integer} options.numBits number of bits for the key creation. (should be 1024+, generally) - * @param {String} options.userId assumes already in form of "User Name " - * @param {String} options.passphrase The passphrase used to encrypt the resulting private key - * @param {Boolean} [options.unlocked=false] The secret part of the generated key is unlocked - * @return {Promise} {key: module:key~Key, privateKeyArmored: String, publicKeyArmored: String} - * @static - */ -function generateKeyPair(options) { - // use web worker if web crypto apis are not supported - if (!util.getWebCrypto() && asyncProxy) { - return asyncProxy.generateKeyPair(options); - } - - return key.generate(options).then(function(newKey) { - var result = {}; - result.key = newKey; - result.privateKeyArmored = newKey.armor(); - result.publicKeyArmored = newKey.toPublic().armor(); - return result; - - }).catch(function(err) { - console.error(err); - - if (!util.getWebCrypto()) { - // js fallback already tried - throw new Error('Error generating keypair using js fallback!'); - } - - // fall back to js keygen in a worker - console.log('Error generating keypair using native WebCrypto... falling back back to js!'); - return asyncProxy.generateKeyPair(options); - - }).catch(onError.bind(null, 'Error generating keypair!')); -} - -// -// helper functions -// - -/** - * Command pattern that wraps synchronous code into a promise - * @param {function} cmd The synchronous function with a return value - * to be wrapped in a promise - * @param {String} errMsg A human readable error Message - * @return {Promise} The promise wrapped around cmd - */ -function execute(cmd, errMsg) { - // wrap the sync cmd in a promise - var promise = new Promise(function(resolve) { - var result = cmd(); - resolve(result); - }); - - // handler error globally - return promise.catch(onError.bind(null, errMsg)); -} - -/** - * Global error handler that logs the stack trace and - * rethrows a high lvl error message - * @param {String} message A human readable high level error Message - * @param {Error} error The internal error that caused the failure - */ -function onError(message, error) { - // log the stack trace - console.error(error.stack); - // rethrow new high level error for api users - throw new Error(message); -} - -function createMessage(data, format, filename) { - var msg; - if (format === 'binary') { - msg = message.fromBinary(data, filename); - } else { - msg = message.fromText(data); // default to 'utf8' text - } - return msg; -} - -function parseMessage(msg, format) { - if (format === 'binary') { - return { - text: msg.getLiteralData(), - filename: msg.getFilename() - }; - } else { - return { - text: msg.getText() // default to 'utf8' text - }; - } -} - -exports.initWorker = initWorker; -exports.getWorker = getWorker; -exports.encryptMessage = encryptMessage; -exports.signAndEncryptMessage = signAndEncryptMessage; -exports.decryptMessage = decryptMessage; -exports.decryptAndVerifyMessage = decryptAndVerifyMessage; -exports.signClearMessage = signClearMessage; -exports.verifyClearSignedMessage = verifyClearSignedMessage; -exports.generateKeyPair = generateKeyPair; -},{"./cleartext.js":12,"./encoding/armor.js":41,"./enums.js":43,"./key.js":47,"./message.js":51,"./util":76,"./worker/async_proxy.js":77,"es6-promise":1}],53:[function(require,module,exports){ -/** - * @requires enums - * @module packet - */ -var enums = require('../enums.js'); - -// This is pretty ugly, but browserify needs to have the requires explicitly written. - -module.exports = { - /** @see module:packet/compressed */ - Compressed: require('./compressed.js'), - /** @see module:packet/sym_encrypted_integrity_protected */ - SymEncryptedIntegrityProtected: require('./sym_encrypted_integrity_protected.js'), - /** @see module:packet/public_key_encrypted_session_key */ - PublicKeyEncryptedSessionKey: require('./public_key_encrypted_session_key.js'), - /** @see module:packet/sym_encrypted_session_key */ - SymEncryptedSessionKey: require('./sym_encrypted_session_key.js'), - /** @see module:packet/literal */ - Literal: require('./literal.js'), - /** @see module:packet/public_key */ - PublicKey: require('./public_key.js'), - /** @see module:packet/symmetrically_encrypted */ - SymmetricallyEncrypted: require('./symmetrically_encrypted.js'), - /** @see module:packet/marker */ - Marker: require('./marker.js'), - /** @see module:packet/public_subkey */ - PublicSubkey: require('./public_subkey.js'), - /** @see module:packet/user_attribute */ - UserAttribute: require('./user_attribute.js'), - /** @see module:packet/one_pass_signature */ - OnePassSignature: require('./one_pass_signature.js'), - /** @see module:packet/secret_key */ - SecretKey: require('./secret_key.js'), - /** @see module:packet/userid */ - Userid: require('./userid.js'), - /** @see module:packet/secret_subkey */ - SecretSubkey: require('./secret_subkey.js'), - /** @see module:packet/signature */ - Signature: require('./signature.js'), - /** @see module:packet/trust */ - Trust: require('./trust.js'), - /** - * Allocate a new packet - * @param {String} tag property name from {@link module:enums.packet} - * @returns {Object} new packet object with type based on tag - */ - newPacketFromTag: function (tag) { - return new this[packetClassFromTagName(tag)](); - }, - /** - * Allocate a new packet from structured packet clone - * See {@link http://www.w3.org/html/wg/drafts/html/master/infrastructure.html#safe-passing-of-structured-data} - * @param {Object} packetClone packet clone - * @returns {Object} new packet object with data from packet clone - */ - fromStructuredClone: function(packetClone) { - var tagName = enums.read(enums.packet, packetClone.tag); - var packet = this.newPacketFromTag(tagName); - for (var attr in packetClone) { - if (packetClone.hasOwnProperty(attr)) { - packet[attr] = packetClone[attr]; - } - } - if (packet.postCloneTypeFix) { - packet.postCloneTypeFix(); - } - return packet; - } -}; - -/** - * Convert tag name to class name - * @param {String} tag property name from {@link module:enums.packet} - * @returns {String} - */ -function packetClassFromTagName(tag) { - return tag.substr(0, 1).toUpperCase() + tag.substr(1); -} - -},{"../enums.js":43,"./compressed.js":54,"./literal.js":56,"./marker.js":57,"./one_pass_signature.js":58,"./public_key.js":61,"./public_key_encrypted_session_key.js":62,"./public_subkey.js":63,"./secret_key.js":64,"./secret_subkey.js":65,"./signature.js":66,"./sym_encrypted_integrity_protected.js":67,"./sym_encrypted_session_key.js":68,"./symmetrically_encrypted.js":69,"./trust.js":70,"./user_attribute.js":71,"./userid.js":72}],54:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * Implementation of the Compressed Data Packet (Tag 8)
- *
- * {@link http://tools.ietf.org/html/rfc4880#section-5.6|RFC4880 5.6}: The Compressed Data packet contains compressed data. Typically, - * this packet is found as the contents of an encrypted packet, or following - * a Signature or One-Pass Signature packet, and contains a literal data packet. - * @requires compression/zlib - * @requires compression/rawinflate - * @requires compression/rawdeflate - * @requires enums - * @requires util - * @module packet/compressed - */ - -module.exports = Compressed; - -var enums = require('../enums.js'), - util = require('../util.js'), - Zlib = require('../compression/zlib.min.js'), - RawInflate = require('../compression/rawinflate.min.js'), - RawDeflate = require('../compression/rawdeflate.min.js'); - -/** - * @constructor - */ -function Compressed() { - /** - * Packet type - * @type {module:enums.packet} - */ - this.tag = enums.packet.compressed; - /** - * List of packets - * @type {module:packet/packetlist} - */ - this.packets = null; - /** - * Compression algorithm - * @type {compression} - */ - this.algorithm = 'zip'; - - /** - * Compressed packet data - * @type {String} - */ - this.compressed = null; -} - -/** - * Parsing function for the packet. - * @param {String} bytes Payload of a tag 8 packet - */ -Compressed.prototype.read = function (bytes) { - // One octet that gives the algorithm used to compress the packet. - this.algorithm = enums.read(enums.compression, bytes.charCodeAt(0)); - - // Compressed data, which makes up the remainder of the packet. - this.compressed = bytes.substr(1); - - this.decompress(); -}; - - - -/** - * Return the compressed packet. - * @return {String} binary compressed packet - */ -Compressed.prototype.write = function () { - if (this.compressed === null) - this.compress(); - - return String.fromCharCode(enums.write(enums.compression, this.algorithm)) + this.compressed; -}; - - -/** - * Decompression method for decompressing the compressed data - * read by read_packet - */ -Compressed.prototype.decompress = function () { - var decompressed; - - switch (this.algorithm) { - case 'uncompressed': - decompressed = this.compressed; - break; - - case 'zip': - var inflate = new RawInflate.Zlib.RawInflate(util.str2Uint8Array(this.compressed)); - decompressed = util.Uint8Array2str(inflate.decompress()); - break; - - case 'zlib': - var inflate = new Zlib.Zlib.Inflate(util.str2Uint8Array(this.compressed)); - decompressed = util.Uint8Array2str(inflate.decompress()); - break; - - case 'bzip2': - // TODO: need to implement this - throw new Error('Compression algorithm BZip2 [BZ2] is not implemented.'); - - default: - throw new Error("Compression algorithm unknown :" + this.alogrithm); - } - - this.packets.read(decompressed); -}; - -/** - * Compress the packet data (member decompressedData) - */ -Compressed.prototype.compress = function () { - var uncompressed, deflate; - uncompressed = this.packets.write(); - - switch (this.algorithm) { - - case 'uncompressed': - // - Uncompressed - this.compressed = uncompressed; - break; - - case 'zip': - // - ZIP [RFC1951] - deflate = new RawDeflate.Zlib.RawDeflate(util.str2Uint8Array(uncompressed)); - this.compressed = util.Uint8Array2str(deflate.compress()); - break; - - case 'zlib': - // - ZLIB [RFC1950] - deflate = new Zlib.Zlib.Deflate(util.str2Uint8Array(uncompressed)); - this.compressed = util.Uint8Array2str(deflate.compress()); - break; - - case 'bzip2': - // - BZip2 [BZ2] - // TODO: need to implement this - throw new Error("Compression algorithm BZip2 [BZ2] is not implemented."); - - default: - throw new Error("Compression algorithm unknown :" + this.type); - } -}; - -},{"../compression/rawdeflate.min.js":13,"../compression/rawinflate.min.js":14,"../compression/zlib.min.js":15,"../enums.js":43,"../util.js":76}],55:[function(require,module,exports){ -var enums = require('../enums.js'); - -module.exports = { - /** - * @name module:packet.List - * @see module:packet/packetlist - */ - List: require('./packetlist.js') -}; - -var packets = require('./all_packets.js'); - -for (var i in packets) - module.exports[i] = packets[i]; - -},{"../enums.js":43,"./all_packets.js":53,"./packetlist.js":60}],56:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * Implementation of the Literal Data Packet (Tag 11)
- *
- * {@link http://tools.ietf.org/html/rfc4880#section-5.9|RFC4880 5.9}: A Literal Data packet contains the body of a message; data that - * is not to be further interpreted. - * @requires enums - * @requires util - * @module packet/literal - */ - -module.exports = Literal; - -var util = require('../util.js'), - enums = require('../enums.js'); - -/** - * @constructor - */ -function Literal() { - this.tag = enums.packet.literal; - this.format = 'utf8'; // default format for literal data packets - this.data = ''; // literal data representation as native JavaScript string or bytes - this.date = new Date(); - this.filename = 'msg.txt'; -} - -/** - * Set the packet data to a javascript native string, end of line - * will be normalized to \r\n and by default text is converted to UTF8 - * @param {String} text Any native javascript string - */ -Literal.prototype.setText = function (text) { - // normalize EOL to \r\n - text = text.replace(/\r/g, '').replace(/\n/g, '\r\n'); - // encode UTF8 - this.data = this.format == 'utf8' ? util.encode_utf8(text) : text; -}; - -/** - * Returns literal data packets as native JavaScript string - * with normalized end of line to \n - * @return {String} literal data as text - */ -Literal.prototype.getText = function () { - // decode UTF8 - var text = util.decode_utf8(this.data); - // normalize EOL to \n - return text.replace(/\r\n/g, '\n'); -}; - -/** - * Set the packet data to value represented by the provided string of bytes. - * @param {String} bytes The string of bytes - * @param {utf8|binary|text} format The format of the string of bytes - */ -Literal.prototype.setBytes = function (bytes, format) { - this.format = format; - this.data = bytes; -}; - - -/** - * Get the byte sequence representing the literal packet data - * @returns {String} A sequence of bytes - */ -Literal.prototype.getBytes = function () { - return this.data; -}; - - -/** - * Sets the filename of the literal packet data - * @param {String} filename Any native javascript string - */ -Literal.prototype.setFilename = function (filename) { - this.filename = filename; -}; - - -/** - * Get the filename of the literal packet data - * @returns {String} filename - */ -Literal.prototype.getFilename = function() { - return this.filename; -}; - - -/** - * Parsing function for a literal data packet (tag 11). - * - * @param {String} input Payload of a tag 11 packet - * @param {Integer} position - * Position to start reading from the input string - * @param {Integer} len - * Length of the packet or the remaining length of - * input at position - * @return {module:packet/literal} object representation - */ -Literal.prototype.read = function (bytes) { - // - A one-octet field that describes how the data is formatted. - - var format = enums.read(enums.literal, bytes.charCodeAt(0)); - - var filename_len = bytes.charCodeAt(1); - this.filename = util.decode_utf8(bytes.substr(2, filename_len)); - - this.date = util.readDate(bytes.substr(2 + filename_len, 4)); - - var data = bytes.substring(6 + filename_len); - - this.setBytes(data, format); -}; - -/** - * Creates a string representation of the packet - * - * @param {String} data The data to be inserted as body - * @return {String} string-representation of the packet - */ -Literal.prototype.write = function () { - var filename = util.encode_utf8(this.filename); - - var data = this.getBytes(); - - var result = ''; - result += String.fromCharCode(enums.write(enums.literal, this.format)); - result += String.fromCharCode(filename.length); - result += filename; - result += util.writeDate(this.date); - result += data; - return result; -}; - -},{"../enums.js":43,"../util.js":76}],57:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - -/** - * Implementation of the strange "Marker packet" (Tag 10)
- *
- * {@link http://tools.ietf.org/html/rfc4880#section-5.8|RFC4880 5.8}: An experimental version of PGP used this packet as the Literal - * packet, but no released version of PGP generated Literal packets with this - * tag. With PGP 5.x, this packet has been reassigned and is reserved for use as - * the Marker packet.
- *
- * Such a packet MUST be ignored when received. - * @requires enums - * @module packet/marker - */ - -module.exports = Marker; - -var enums = require('../enums.js'); - -/** - * @constructor - */ -function Marker() { - this.tag = enums.packet.marker; -} - -/** - * Parsing function for a literal data packet (tag 10). - * - * @param {String} input Payload of a tag 10 packet - * @param {Integer} position - * Position to start reading from the input string - * @param {Integer} len - * Length of the packet or the remaining length of - * input at position - * @return {module:packet/marker} Object representation - */ -Marker.prototype.read = function (bytes) { - if (bytes.charCodeAt(0) == 0x50 && // P - bytes.charCodeAt(1) == 0x47 && // G - bytes.charCodeAt(2) == 0x50) // P - return true; - // marker packet does not contain "PGP" - return false; -}; - -},{"../enums.js":43}],58:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * Implementation of the One-Pass Signature Packets (Tag 4)
- *
- * {@link http://tools.ietf.org/html/rfc4880#section-5.4|RFC4880 5.4}: The One-Pass Signature packet precedes the signed data and contains - * enough information to allow the receiver to begin calculating any - * hashes needed to verify the signature. It allows the Signature - * packet to be placed at the end of the message, so that the signer - * can compute the entire signed message in one pass. - * @requires enums - * @requires type/keyid - * @module packet/one_pass_signature -*/ - -module.exports = OnePassSignature; - -var enums = require('../enums.js'), - type_keyid = require('../type/keyid.js'); - -/** - * @constructor - */ -function OnePassSignature() { - this.tag = enums.packet.onePassSignature; // The packet type - this.version = null; // A one-octet version number. The current version is 3. - this.type = null; // A one-octet signature type. Signature types are described in {@link http://tools.ietf.org/html/rfc4880#section-5.2.1|RFC4880 Section 5.2.1}. - this.hashAlgorithm = null; // A one-octet number describing the hash algorithm used. (See {@link http://tools.ietf.org/html/rfc4880#section-9.4|RFC4880 9.4}) - this.publicKeyAlgorithm = null; // A one-octet number describing the public-key algorithm used. (See {@link http://tools.ietf.org/html/rfc4880#section-9.1|RFC4880 9.1}) - this.signingKeyId = null; // An eight-octet number holding the Key ID of the signing key. - this.flags = null; // A one-octet number holding a flag showing whether the signature is nested. A zero value indicates that the next packet is another One-Pass Signature packet that describes another signature to be applied to the same message data. -} - -/** - * parsing function for a one-pass signature packet (tag 4). - * @param {String} bytes payload of a tag 4 packet - * @return {module:packet/one_pass_signature} object representation - */ -OnePassSignature.prototype.read = function (bytes) { - var mypos = 0; - // A one-octet version number. The current version is 3. - this.version = bytes.charCodeAt(mypos++); - - // A one-octet signature type. Signature types are described in - // Section 5.2.1. - this.type = enums.read(enums.signature, bytes.charCodeAt(mypos++)); - - // A one-octet number describing the hash algorithm used. - this.hashAlgorithm = enums.read(enums.hash, bytes.charCodeAt(mypos++)); - - // A one-octet number describing the public-key algorithm used. - this.publicKeyAlgorithm = enums.read(enums.publicKey, bytes.charCodeAt(mypos++)); - - // An eight-octet number holding the Key ID of the signing key. - this.signingKeyId = new type_keyid(); - this.signingKeyId.read(bytes.substr(mypos)); - mypos += 8; - - // A one-octet number holding a flag showing whether the signature - // is nested. A zero value indicates that the next packet is - // another One-Pass Signature packet that describes another - // signature to be applied to the same message data. - this.flags = bytes.charCodeAt(mypos++); - return this; -}; - -/** - * creates a string representation of a one-pass signature packet - * @return {String} a string representation of a one-pass signature packet - */ -OnePassSignature.prototype.write = function () { - var result = ""; - - result += String.fromCharCode(3); - result += String.fromCharCode(enums.write(enums.signature, this.type)); - result += String.fromCharCode(enums.write(enums.hash, this.hashAlgorithm)); - result += String.fromCharCode(enums.write(enums.publicKey, this.publicKeyAlgorithm)); - result += this.signingKeyId.write(); - result += String.fromCharCode(this.flags); - - return result; -}; - -/** - * Fix custom types after cloning - */ -OnePassSignature.prototype.postCloneTypeFix = function() { - this.signingKeyId = type_keyid.fromClone(this.signingKeyId); -}; - -},{"../enums.js":43,"../type/keyid.js":73}],59:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * @requires enums - * @requires util - * @module packet/packet - */ - -var enums = require('../enums.js'), - util = require('../util.js'); - -module.exports = { - readSimpleLength: function(bytes) { - var len = 0, - offset, - type = bytes.charCodeAt(0); - - - if (type < 192) { - len = bytes.charCodeAt(0); - offset = 1; - } else if (type < 255) { - len = ((bytes.charCodeAt(0) - 192) << 8) + (bytes.charCodeAt(1)) + 192; - offset = 2; - } else if (type == 255) { - len = util.readNumber(bytes.substr(1, 4)); - offset = 5; - } - - return { - len: len, - offset: offset - }; - }, - - /** - * Encodes a given integer of length to the openpgp length specifier to a - * string - * - * @param {Integer} length The length to encode - * @return {String} String with openpgp length representation - */ - writeSimpleLength: function(length) { - var result = ""; - if (length < 192) { - result += String.fromCharCode(length); - } else if (length > 191 && length < 8384) { - /* - * let a = (total data packet length) - 192 let bc = two octet - * representation of a let d = b + 192 - */ - result += String.fromCharCode(((length - 192) >> 8) + 192); - result += String.fromCharCode((length - 192) & 0xFF); - } else { - result += String.fromCharCode(255); - result += util.writeNumber(length, 4); - } - return result; - }, - - /** - * Writes a packet header version 4 with the given tag_type and length to a - * string - * - * @param {Integer} tag_type Tag type - * @param {Integer} length Length of the payload - * @return {String} String of the header - */ - writeHeader: function(tag_type, length) { - /* we're only generating v4 packet headers here */ - var result = ""; - result += String.fromCharCode(0xC0 | tag_type); - result += this.writeSimpleLength(length); - return result; - }, - - /** - * Writes a packet header Version 3 with the given tag_type and length to a - * string - * - * @param {Integer} tag_type Tag type - * @param {Integer} length Length of the payload - * @return {String} String of the header - */ - writeOldHeader: function(tag_type, length) { - var result = ""; - if (length < 256) { - result += String.fromCharCode(0x80 | (tag_type << 2)); - result += String.fromCharCode(length); - } else if (length < 65536) { - result += String.fromCharCode(0x80 | (tag_type << 2) | 1); - result += util.writeNumber(length, 2); - } else { - result += String.fromCharCode(0x80 | (tag_type << 2) | 2); - result += util.writeNumber(length, 4); - } - return result; - }, - - /** - * Generic static Packet Parser function - * - * @param {String} input Input stream as string - * @param {integer} position Position to start parsing - * @param {integer} len Length of the input from position on - * @return {Object} Returns a parsed module:packet/packet - */ - read: function(input, position, len) { - // some sanity checks - if (input === null || input.length <= position || input.substring(position).length < 2 || (input.charCodeAt(position) & - 0x80) === 0) { - throw new Error("Error during parsing. This message / key is probably not containing a valid OpenPGP format."); - } - var mypos = position; - var tag = -1; - var format = -1; - var packet_length; - - format = 0; // 0 = old format; 1 = new format - if ((input.charCodeAt(mypos) & 0x40) !== 0) { - format = 1; - } - - var packet_length_type; - if (format) { - // new format header - tag = input.charCodeAt(mypos) & 0x3F; // bit 5-0 - } else { - // old format header - tag = (input.charCodeAt(mypos) & 0x3F) >> 2; // bit 5-2 - packet_length_type = input.charCodeAt(mypos) & 0x03; // bit 1-0 - } - - // header octet parsing done - mypos++; - - // parsed length from length field - var bodydata = null; - - // used for partial body lengths - var real_packet_length = -1; - if (!format) { - // 4.2.1. Old Format Packet Lengths - switch (packet_length_type) { - case 0: - // The packet has a one-octet length. The header is 2 octets - // long. - packet_length = input.charCodeAt(mypos++); - break; - case 1: - // The packet has a two-octet length. The header is 3 octets - // long. - packet_length = (input.charCodeAt(mypos++) << 8) | input.charCodeAt(mypos++); - break; - case 2: - // The packet has a four-octet length. The header is 5 - // octets long. - packet_length = (input.charCodeAt(mypos++) << 24) | (input.charCodeAt(mypos++) << 16) | (input.charCodeAt(mypos++) << - 8) | input.charCodeAt(mypos++); - break; - default: - // 3 - The packet is of indeterminate length. The header is 1 - // octet long, and the implementation must determine how long - // the packet is. If the packet is in a file, this means that - // the packet extends until the end of the file. In general, - // an implementation SHOULD NOT use indeterminate-length - // packets except where the end of the data will be clear - // from the context, and even then it is better to use a - // definite length, or a new format header. The new format - // headers described below have a mechanism for precisely - // encoding data of indeterminate length. - packet_length = len; - break; - } - - } else // 4.2.2. New Format Packet Lengths - { - - // 4.2.2.1. One-Octet Lengths - if (input.charCodeAt(mypos) < 192) { - packet_length = input.charCodeAt(mypos++); - util.print_debug("1 byte length:" + packet_length); - // 4.2.2.2. Two-Octet Lengths - } else if (input.charCodeAt(mypos) >= 192 && input.charCodeAt(mypos) < 224) { - packet_length = ((input.charCodeAt(mypos++) - 192) << 8) + (input.charCodeAt(mypos++)) + 192; - util.print_debug("2 byte length:" + packet_length); - // 4.2.2.4. Partial Body Lengths - } else if (input.charCodeAt(mypos) > 223 && input.charCodeAt(mypos) < 255) { - packet_length = 1 << (input.charCodeAt(mypos++) & 0x1F); - util.print_debug("4 byte length:" + packet_length); - // EEEK, we're reading the full data here... - var mypos2 = mypos + packet_length; - bodydata = input.substring(mypos, mypos + packet_length); - var tmplen; - while (true) { - if (input.charCodeAt(mypos2) < 192) { - tmplen = input.charCodeAt(mypos2++); - packet_length += tmplen; - bodydata += input.substring(mypos2, mypos2 + tmplen); - mypos2 += tmplen; - break; - } else if (input.charCodeAt(mypos2) >= 192 && input.charCodeAt(mypos2) < 224) { - tmplen = ((input.charCodeAt(mypos2++) - 192) << 8) + (input.charCodeAt(mypos2++)) + 192; - packet_length += tmplen; - bodydata += input.substring(mypos2, mypos2 + tmplen); - mypos2 += tmplen; - break; - } else if (input.charCodeAt(mypos2) > 223 && input.charCodeAt(mypos2) < 255) { - tmplen = 1 << (input.charCodeAt(mypos2++) & 0x1F); - packet_length += tmplen; - bodydata += input.substring(mypos2, mypos2 + tmplen); - mypos2 += tmplen; - } else { - mypos2++; - tmplen = (input.charCodeAt(mypos2++) << 24) | (input.charCodeAt(mypos2++) << 16) | (input - .charCodeAt(mypos2++) << 8) | input.charCodeAt(mypos2++); - bodydata += input.substring(mypos2, mypos2 + tmplen); - packet_length += tmplen; - mypos2 += tmplen; - break; - } - } - real_packet_length = mypos2 - mypos; - // 4.2.2.3. Five-Octet Lengths - } else { - mypos++; - packet_length = (input.charCodeAt(mypos++) << 24) | (input.charCodeAt(mypos++) << 16) | (input.charCodeAt(mypos++) << - 8) | input.charCodeAt(mypos++); - } - } - - // if there was'nt a partial body length: use the specified - // packet_length - if (real_packet_length == -1) { - real_packet_length = packet_length; - } - - if (bodydata === null) { - bodydata = input.substring(mypos, mypos + real_packet_length); - } - - return { - tag: tag, - packet: bodydata, - offset: mypos + real_packet_length - }; - } -}; - -},{"../enums.js":43,"../util.js":76}],60:[function(require,module,exports){ -/** - * This class represents a list of openpgp packets. - * Take care when iterating over it - the packets themselves - * are stored as numerical indices. - * @requires enums - * @requires packet - * @requires packet/packet - * @module packet/packetlist - */ - -module.exports = Packetlist; - -var packetParser = require('./packet.js'), - packets = require('./all_packets.js'), - enums = require('../enums.js'); - -/** - * @constructor - */ -function Packetlist() { - /** The number of packets contained within the list. - * @readonly - * @type {Integer} */ - this.length = 0; -} -/** - * Reads a stream of binary data and interprents it as a list of packets. - * @param {String} A binary string of bytes. - */ -Packetlist.prototype.read = function (bytes) { - var i = 0; - - while (i < bytes.length) { - var parsed = packetParser.read(bytes, i, bytes.length - i); - i = parsed.offset; - - var pushed = false; - try { - var tag = enums.read(enums.packet, parsed.tag); - var packet = packets.newPacketFromTag(tag); - this.push(packet); - pushed = true; - packet.read(parsed.packet); - } catch(e) { - if (pushed) { - this.pop(); // drop unsupported packet - } - } - } -}; - -/** - * Creates a binary representation of openpgp objects contained within the - * class instance. - * @returns {String} A binary string of bytes containing valid openpgp packets. - */ -Packetlist.prototype.write = function () { - var bytes = ''; - - for (var i = 0; i < this.length; i++) { - var packetbytes = this[i].write(); - bytes += packetParser.writeHeader(this[i].tag, packetbytes.length); - bytes += packetbytes; - } - - return bytes; -}; - -/** - * Adds a packet to the list. This is the only supported method of doing so; - * writing to packetlist[i] directly will result in an error. - */ -Packetlist.prototype.push = function (packet) { - if (!packet) return; - - packet.packets = packet.packets || new Packetlist(); - - this[this.length] = packet; - this.length++; -}; - -/** - * Remove a packet from the list and return it. - * @return {Object} The packet that was removed - */ -Packetlist.prototype.pop = function() { - if (this.length === 0) { - return; - } - - var packet = this[this.length - 1]; - delete this[this.length - 1]; - this.length--; - - return packet; -}; - -/** -* Creates a new PacketList with all packets that pass the test implemented by the provided function. -*/ -Packetlist.prototype.filter = function (callback) { - - var filtered = new Packetlist(); - - for (var i = 0; i < this.length; i++) { - if (callback(this[i], i, this)) { - filtered.push(this[i]); - } - } - - return filtered; -}; - -/** -* Creates a new PacketList with all packets from the given types -*/ -Packetlist.prototype.filterByTag = function () { - var args = Array.prototype.slice.call(arguments); - var filtered = new Packetlist(); - var that = this; - - for (var i = 0; i < this.length; i++) { - if (args.some(function(packetType) {return that[i].tag == packetType;})) { - filtered.push(this[i]); - } - } - - return filtered; -}; - -/** -* Executes the provided callback once for each element -*/ -Packetlist.prototype.forEach = function (callback) { - for (var i = 0; i < this.length; i++) { - callback(this[i]); - } -}; - -/** - * Traverses packet tree and returns first matching packet - * @param {module:enums.packet} type The packet type - * @return {module:packet/packet|null} - */ -Packetlist.prototype.findPacket = function (type) { - var packetlist = this.filterByTag(type); - if (packetlist.length) { - return packetlist[0]; - } else { - var found = null; - for (var i = 0; i < this.length; i++) { - if (this[i].packets.length) { - found = this[i].packets.findPacket(type); - if (found) return found; - } - } - } - return null; -}; - -/** - * Returns array of found indices by tag - */ -Packetlist.prototype.indexOfTag = function () { - var args = Array.prototype.slice.call(arguments); - var tagIndex = []; - var that = this; - for (var i = 0; i < this.length; i++) { - if (args.some(function(packetType) {return that[i].tag == packetType;})) { - tagIndex.push(i); - } - } - return tagIndex; -}; - -/** - * Returns slice of packetlist - */ -Packetlist.prototype.slice = function (begin, end) { - if (!end) { - end = this.length; - } - var part = new Packetlist(); - for (var i = begin; i < end; i++) { - part.push(this[i]); - } - return part; -}; - -/** - * Concatenates packetlist or array of packets - */ -Packetlist.prototype.concat = function (packetlist) { - if (packetlist) { - for (var i = 0; i < packetlist.length; i++) { - this.push(packetlist[i]); - } - } -}; - -/** - * Allocate a new packetlist from structured packetlist clone - * See {@link http://www.w3.org/html/wg/drafts/html/master/infrastructure.html#safe-passing-of-structured-data} - * @param {Object} packetClone packetlist clone - * @returns {Object} new packetlist object with data from packetlist clone - */ -module.exports.fromStructuredClone = function(packetlistClone) { - var packetlist = new Packetlist(); - for (var i = 0; i < packetlistClone.length; i++) { - packetlist.push(packets.fromStructuredClone(packetlistClone[i])); - if (packetlist[i].packets.length !== 0) { - packetlist[i].packets = this.fromStructuredClone(packetlist[i].packets); - } else { - packetlist[i].packets = new Packetlist(); - } - } - return packetlist; -}; -},{"../enums.js":43,"./all_packets.js":53,"./packet.js":59}],61:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * Implementation of the Key Material Packet (Tag 5,6,7,14)
- *
- * {@link http://tools.ietf.org/html/rfc4880#section-5.5|RFC4480 5.5}: - * A key material packet contains all the information about a public or - * private key. There are four variants of this packet type, and two - * major versions. Consequently, this section is complex. - * @requires crypto - * @requires enums - * @requires type/keyid - * @requires type/mpi - * @requires util - * @module packet/public_key - */ - -module.exports = PublicKey; - -var util = require('../util.js'), - type_mpi = require('../type/mpi.js'), - type_keyid = require('../type/keyid.js'), - enums = require('../enums.js'), - crypto = require('../crypto'); - -/** - * @constructor - */ -function PublicKey() { - this.tag = enums.packet.publicKey; - this.version = 4; - /** Key creation date. - * @type {Date} */ - this.created = new Date(); - /** A list of multiprecision integers - * @type {module:type/mpi} */ - this.mpi = []; - /** Public key algorithm - * @type {module:enums.publicKey} */ - this.algorithm = 'rsa_sign'; - // time in days (V3 only) - this.expirationTimeV3 = 0; - /** - * Fingerprint in lowercase hex - * @type {String} - */ - this.fingerprint = null; - /** - * Keyid - * @type {module:type/keyid} - */ - this.keyid = null; -} - -/** - * Internal Parser for public keys as specified in {@link http://tools.ietf.org/html/rfc4880#section-5.5.2|RFC 4880 section 5.5.2 Public-Key Packet Formats} - * called by read_tag<num> - * @param {String} input Input string to read the packet from - * @return {Object} This object with attributes set by the parser - */ -PublicKey.prototype.read = function (bytes) { - var pos = 0; - // A one-octet version number (3 or 4). - this.version = bytes.charCodeAt(pos++); - - if (this.version == 3 || this.version == 4) { - // - A four-octet number denoting the time that the key was created. - this.created = util.readDate(bytes.substr(pos, 4)); - pos += 4; - - if (this.version == 3) { - // - A two-octet number denoting the time in days that this key is - // valid. If this number is zero, then it does not expire. - this.expirationTimeV3 = util.readNumber(bytes.substr(pos, 2)); - pos += 2; - } - - // - A one-octet number denoting the public-key algorithm of this key. - this.algorithm = enums.read(enums.publicKey, bytes.charCodeAt(pos++)); - - var mpicount = crypto.getPublicMpiCount(this.algorithm); - this.mpi = []; - - var bmpi = bytes.substr(pos); - var p = 0; - - for (var i = 0; i < mpicount && p < bmpi.length; i++) { - - this.mpi[i] = new type_mpi(); - - p += this.mpi[i].read(bmpi.substr(p)); - - if (p > bmpi.length) { - throw new Error('Error reading MPI @:' + p); - } - } - - return p + 6; - } else { - throw new Error('Version ' + this.version + ' of the key packet is unsupported.'); - } -}; - -/** - * Alias of read() - * @see module:packet/public_key~PublicKey#read - */ -PublicKey.prototype.readPublicKey = PublicKey.prototype.read; - -/** - * Same as write_private_key, but has less information because of - * public key. - * @return {Object} {body: [string]OpenPGP packet body contents, - * header: [string] OpenPGP packet header, string: [string] header+body} - */ -PublicKey.prototype.write = function () { - // Version - var result = String.fromCharCode(this.version); - result += util.writeDate(this.created); - if (this.version == 3) { - result += util.writeNumber(this.expirationTimeV3, 2); - } - result += String.fromCharCode(enums.write(enums.publicKey, this.algorithm)); - - var mpicount = crypto.getPublicMpiCount(this.algorithm); - - for (var i = 0; i < mpicount; i++) { - result += this.mpi[i].write(); - } - - return result; -}; - -/** - * Alias of write() - * @see module:packet/public_key~PublicKey#write - */ -PublicKey.prototype.writePublicKey = PublicKey.prototype.write; - -/** - * Write an old version packet - it's used by some of the internal routines. - */ -PublicKey.prototype.writeOld = function () { - var bytes = this.writePublicKey(); - - return String.fromCharCode(0x99) + - util.writeNumber(bytes.length, 2) + - bytes; -}; - -/** - * Calculates the key id of the key - * @return {String} A 8 byte key id - */ -PublicKey.prototype.getKeyId = function () { - if (this.keyid) { - return this.keyid; - } - this.keyid = new type_keyid(); - if (this.version == 4) { - this.keyid.read(util.hex2bin(this.getFingerprint()).substr(12, 8)); - } else if (this.version == 3) { - this.keyid.read(this.mpi[0].write().substr(-8)); - } - return this.keyid; -}; - -/** - * Calculates the fingerprint of the key - * @return {String} A string containing the fingerprint in lowercase hex - */ -PublicKey.prototype.getFingerprint = function () { - if (this.fingerprint) { - return this.fingerprint; - } - var toHash = ''; - if (this.version == 4) { - toHash = this.writeOld(); - this.fingerprint = crypto.hash.sha1(toHash); - } else if (this.version == 3) { - var mpicount = crypto.getPublicMpiCount(this.algorithm); - for (var i = 0; i < mpicount; i++) { - toHash += this.mpi[i].toBytes(); - } - this.fingerprint = crypto.hash.md5(toHash); - } - this.fingerprint = util.hexstrdump(this.fingerprint); - return this.fingerprint; -}; - -/** - * Returns bit size of key - * @return {int} Number of bits - */ -PublicKey.prototype.getBitSize = function () { - return this.mpi[0].byteLength() * 8; -}; - -/** - * Fix custom types after cloning - */ -PublicKey.prototype.postCloneTypeFix = function() { - for (var i = 0; i < this.mpi.length; i++) { - this.mpi[i] = type_mpi.fromClone(this.mpi[i]); - } - if (this.keyid) { - this.keyid = type_keyid.fromClone(this.keyid); - } -}; - -},{"../crypto":32,"../enums.js":43,"../type/keyid.js":73,"../type/mpi.js":74,"../util.js":76}],62:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * Public-Key Encrypted Session Key Packets (Tag 1)
- *
- * {@link http://tools.ietf.org/html/rfc4880#section-5.1|RFC4880 5.1}: A Public-Key Encrypted Session Key packet holds the session key - * used to encrypt a message. Zero or more Public-Key Encrypted Session Key - * packets and/or Symmetric-Key Encrypted Session Key packets may precede a - * Symmetrically Encrypted Data Packet, which holds an encrypted message. The - * message is encrypted with the session key, and the session key is itself - * encrypted and stored in the Encrypted Session Key packet(s). The - * Symmetrically Encrypted Data Packet is preceded by one Public-Key Encrypted - * Session Key packet for each OpenPGP key to which the message is encrypted. - * The recipient of the message finds a session key that is encrypted to their - * public key, decrypts the session key, and then uses the session key to - * decrypt the message. - * @requires crypto - * @requires enums - * @requires type/keyid - * @requires type/mpi - * @requires util - * @module packet/public_key_encrypted_session_key - */ - -module.exports = PublicKeyEncryptedSessionKey; - -var type_keyid = require('../type/keyid.js'), - util = require('../util.js'), - type_mpi = require('../type/mpi.js'), - enums = require('../enums.js'), - crypto = require('../crypto'); - -/** - * @constructor - */ -function PublicKeyEncryptedSessionKey() { - this.tag = enums.packet.publicKeyEncryptedSessionKey; - this.version = 3; - - this.publicKeyId = new type_keyid(); - this.publicKeyAlgorithm = 'rsa_encrypt'; - - this.sessionKey = null; - this.sessionKeyAlgorithm = 'aes256'; - - /** @type {Array} */ - this.encrypted = []; -} - -/** - * Parsing function for a publickey encrypted session key packet (tag 1). - * - * @param {String} input Payload of a tag 1 packet - * @param {Integer} position Position to start reading from the input string - * @param {Integer} len Length of the packet or the remaining length of - * input at position - * @return {module:packet/public_key_encrypted_session_key} Object representation - */ -PublicKeyEncryptedSessionKey.prototype.read = function (bytes) { - - this.version = bytes.charCodeAt(0); - this.publicKeyId.read(bytes.substr(1)); - this.publicKeyAlgorithm = enums.read(enums.publicKey, bytes.charCodeAt(9)); - - var i = 10; - - var integerCount = (function(algo) { - switch (algo) { - case 'rsa_encrypt': - case 'rsa_encrypt_sign': - return 1; - - case 'elgamal': - return 2; - - default: - throw new Error("Invalid algorithm."); - } - })(this.publicKeyAlgorithm); - - this.encrypted = []; - - for (var j = 0; j < integerCount; j++) { - var mpi = new type_mpi(); - i += mpi.read(bytes.substr(i)); - this.encrypted.push(mpi); - } -}; - -/** - * Create a string representation of a tag 1 packet - * - * @param {String} publicKeyId - * The public key id corresponding to publicMPIs key as string - * @param {Array} publicMPIs - * Multiprecision integer objects describing the public key - * @param {module:enums.publicKey} pubalgo - * The corresponding public key algorithm // See {@link http://tools.ietf.org/html/rfc4880#section-9.1|RFC4880 9.1} - * @param {module:enums.symmetric} symmalgo - * The symmetric cipher algorithm used to encrypt the data - * within an encrypteddatapacket or encryptedintegrity- - * protecteddatapacket - * following this packet //See {@link http://tools.ietf.org/html/rfc4880#section-9.2|RFC4880 9.2} - * @param {String} sessionkey - * A string of randombytes representing the session key - * @return {String} The string representation - */ -PublicKeyEncryptedSessionKey.prototype.write = function () { - - var result = String.fromCharCode(this.version); - result += this.publicKeyId.write(); - result += String.fromCharCode( - enums.write(enums.publicKey, this.publicKeyAlgorithm)); - - for (var i = 0; i < this.encrypted.length; i++) { - result += this.encrypted[i].write(); - } - - return result; -}; - -PublicKeyEncryptedSessionKey.prototype.encrypt = function (key) { - var data = String.fromCharCode( - enums.write(enums.symmetric, this.sessionKeyAlgorithm)); - - data += this.sessionKey; - var checksum = util.calc_checksum(this.sessionKey); - data += util.writeNumber(checksum, 2); - - var mpi = new type_mpi(); - mpi.fromBytes(crypto.pkcs1.eme.encode( - data, - key.mpi[0].byteLength())); - - this.encrypted = crypto.publicKeyEncrypt( - this.publicKeyAlgorithm, - key.mpi, - mpi); -}; - -/** - * Decrypts the session key (only for public key encrypted session key - * packets (tag 1) - * - * @param {module:packet/secret_key} key - * Private key with secMPIs unlocked - * @return {String} The unencrypted session key - */ -PublicKeyEncryptedSessionKey.prototype.decrypt = function (key) { - var result = crypto.publicKeyDecrypt( - this.publicKeyAlgorithm, - key.mpi, - this.encrypted).toBytes(); - - var checksum = util.readNumber(result.substr(result.length - 2)); - - var decoded = crypto.pkcs1.eme.decode(result); - - key = decoded.substring(1, decoded.length - 2); - - if (checksum != util.calc_checksum(key)) { - throw new Error('Checksum mismatch'); - } else { - this.sessionKey = key; - this.sessionKeyAlgorithm = - enums.read(enums.symmetric, decoded.charCodeAt(0)); - } -}; - -/** - * Fix custom types after cloning - */ -PublicKeyEncryptedSessionKey.prototype.postCloneTypeFix = function() { - this.publicKeyId = type_keyid.fromClone(this.publicKeyId); - for (var i = 0; i < this.encrypted.length; i++) { - this.encrypted[i] = type_mpi.fromClone(this.encrypted[i]); - } -}; - -},{"../crypto":32,"../enums.js":43,"../type/keyid.js":73,"../type/mpi.js":74,"../util.js":76}],63:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * @requires packet/public_key - * @requires enums - * @module packet/public_subkey - */ - -module.exports = PublicSubkey; - -var publicKey = require('./public_key.js'), - enums = require('../enums.js'); - -/** - * @constructor - * @extends module:packet/public_key - */ -function PublicSubkey() { - publicKey.call(this); - this.tag = enums.packet.publicSubkey; -} - -PublicSubkey.prototype = new publicKey(); -PublicSubkey.prototype.constructor = PublicSubkey; - -},{"../enums.js":43,"./public_key.js":61}],64:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * Implementation of the Key Material Packet (Tag 5,6,7,14)
- *
- * {@link http://tools.ietf.org/html/rfc4880#section-5.5|RFC4480 5.5}: - * A key material packet contains all the information about a public or - * private key. There are four variants of this packet type, and two - * major versions. Consequently, this section is complex. - * @requires crypto - * @requires enums - * @requires packet/public_key - * @requires type/mpi - * @requires type/s2k - * @requires util - * @module packet/secret_key - */ - -module.exports = SecretKey; - -var publicKey = require('./public_key.js'), - enums = require('../enums.js'), - util = require('../util.js'), - crypto = require('../crypto'), - type_mpi = require('../type/mpi.js'), - type_s2k = require('../type/s2k.js'); - -/** - * @constructor - * @extends module:packet/public_key - */ -function SecretKey() { - publicKey.call(this); - this.tag = enums.packet.secretKey; - // encrypted secret-key data - this.encrypted = null; - // indicator if secret-key data is available in decrypted form - this.isDecrypted = false; -} - -SecretKey.prototype = new publicKey(); -SecretKey.prototype.constructor = SecretKey; - -function get_hash_len(hash) { - if (hash == 'sha1') - return 20; - else - return 2; -} - -function get_hash_fn(hash) { - if (hash == 'sha1') - return crypto.hash.sha1; - else - return function(c) { - return util.writeNumber(util.calc_checksum(c), 2); - }; -} - -// Helper function - -function parse_cleartext_mpi(hash_algorithm, cleartext, algorithm) { - var hashlen = get_hash_len(hash_algorithm), - hashfn = get_hash_fn(hash_algorithm); - - var hashtext = cleartext.substr(cleartext.length - hashlen); - cleartext = cleartext.substr(0, cleartext.length - hashlen); - - var hash = hashfn(cleartext); - - if (hash != hashtext) - return new Error("Hash mismatch."); - - var mpis = crypto.getPrivateMpiCount(algorithm); - - var j = 0; - var mpi = []; - - for (var i = 0; i < mpis && j < cleartext.length; i++) { - mpi[i] = new type_mpi(); - j += mpi[i].read(cleartext.substr(j)); - } - - return mpi; -} - -function write_cleartext_mpi(hash_algorithm, algorithm, mpi) { - var bytes = ''; - var discard = crypto.getPublicMpiCount(algorithm); - - for (var i = discard; i < mpi.length; i++) { - bytes += mpi[i].write(); - } - - - bytes += get_hash_fn(hash_algorithm)(bytes); - - return bytes; -} - - -// 5.5.3. Secret-Key Packet Formats - -/** - * Internal parser for private keys as specified in {@link http://tools.ietf.org/html/rfc4880#section-5.5.3|RFC 4880 section 5.5.3} - * @param {String} bytes Input string to read the packet from - */ -SecretKey.prototype.read = function (bytes) { - // - A Public-Key or Public-Subkey packet, as described above. - var len = this.readPublicKey(bytes); - - bytes = bytes.substr(len); - - - // - One octet indicating string-to-key usage conventions. Zero - // indicates that the secret-key data is not encrypted. 255 or 254 - // indicates that a string-to-key specifier is being given. Any - // other value is a symmetric-key encryption algorithm identifier. - var isEncrypted = bytes.charCodeAt(0); - - if (isEncrypted) { - this.encrypted = bytes; - } else { - - // - Plain or encrypted multiprecision integers comprising the secret - // key data. These algorithm-specific fields are as described - // below. - var parsedMPI = parse_cleartext_mpi('mod', bytes.substr(1), this.algorithm); - if (parsedMPI instanceof Error) - throw parsedMPI; - this.mpi = this.mpi.concat(parsedMPI); - this.isDecrypted = true; - } - -}; - -/** Creates an OpenPGP key packet for the given key. - * @return {String} A string of bytes containing the secret key OpenPGP packet - */ -SecretKey.prototype.write = function () { - var bytes = this.writePublicKey(); - - if (!this.encrypted) { - bytes += String.fromCharCode(0); - - bytes += write_cleartext_mpi('mod', this.algorithm, this.mpi); - } else { - bytes += this.encrypted; - } - - return bytes; -}; - - - - -/** Encrypt the payload. By default, we use aes256 and iterated, salted string - * to key specifier. If the key is in a decrypted state (isDecrypted == true) - * and the passphrase is empty or undefined, the key will be set as not encrypted. - * This can be used to remove passphrase protection after calling decrypt(). - * @param {String} passphrase - */ -SecretKey.prototype.encrypt = function (passphrase) { - if (this.isDecrypted && !passphrase) { - this.encrypted = null; - return; - } else if (!passphrase) { - throw new Error('The key must be decrypted before removing passphrase protection.'); - } - - var s2k = new type_s2k(), - symmetric = 'aes256', - cleartext = write_cleartext_mpi('sha1', this.algorithm, this.mpi), - key = produceEncryptionKey(s2k, passphrase, symmetric), - blockLen = crypto.cipher[symmetric].blockSize, - iv = crypto.random.getRandomBytes(blockLen); - - this.encrypted = ''; - this.encrypted += String.fromCharCode(254); - this.encrypted += String.fromCharCode(enums.write(enums.symmetric, symmetric)); - this.encrypted += s2k.write(); - this.encrypted += iv; - - this.encrypted += crypto.cfb.normalEncrypt(symmetric, key, cleartext, iv); -}; - -function produceEncryptionKey(s2k, passphrase, algorithm) { - return s2k.produce_key(passphrase, - crypto.cipher[algorithm].keySize); -} - -/** - * Decrypts the private key MPIs which are needed to use the key. - * @link module:packet/secret_key.isDecrypted should be - * false otherwise a call to this function is not needed - * - * @param {String} str_passphrase The passphrase for this private key - * as string - * @return {Boolean} True if the passphrase was correct or MPI already - * decrypted; false if not - */ -SecretKey.prototype.decrypt = function (passphrase) { - if (this.isDecrypted) - return true; - - var i = 0, - symmetric, - key; - - var s2k_usage = this.encrypted.charCodeAt(i++); - - // - [Optional] If string-to-key usage octet was 255 or 254, a one- - // octet symmetric encryption algorithm. - if (s2k_usage == 255 || s2k_usage == 254) { - symmetric = this.encrypted.charCodeAt(i++); - symmetric = enums.read(enums.symmetric, symmetric); - - // - [Optional] If string-to-key usage octet was 255 or 254, a - // string-to-key specifier. The length of the string-to-key - // specifier is implied by its type, as described above. - var s2k = new type_s2k(); - i += s2k.read(this.encrypted.substr(i)); - - key = produceEncryptionKey(s2k, passphrase, symmetric); - } else { - symmetric = s2k_usage; - symmetric = enums.read(enums.symmetric, symmetric); - key = crypto.hash.md5(passphrase); - } - - - // - [Optional] If secret data is encrypted (string-to-key usage octet - // not zero), an Initial Vector (IV) of the same length as the - // cipher's block size. - var iv = this.encrypted.substr(i, - crypto.cipher[symmetric].blockSize); - - i += iv.length; - - var cleartext, - ciphertext = this.encrypted.substr(i); - - cleartext = crypto.cfb.normalDecrypt(symmetric, key, ciphertext, iv); - - var hash = s2k_usage == 254 ? - 'sha1' : - 'mod'; - - var parsedMPI = parse_cleartext_mpi(hash, cleartext, this.algorithm); - if (parsedMPI instanceof Error) { - return false; - } - this.mpi = this.mpi.concat(parsedMPI); - this.isDecrypted = true; - return true; -}; - -SecretKey.prototype.generate = function (bits) { - var self = this; - - return crypto.generateMpi(self.algorithm, bits).then(function(mpi) { - self.mpi = mpi; - self.isDecrypted = true; - }); -}; - -/** - * Clear private MPIs, return to initial state - */ -SecretKey.prototype.clearPrivateMPIs = function () { - if (!this.encrypted) { - throw new Error('If secret key is not encrypted, clearing private MPIs is irreversible.'); - } - this.mpi = this.mpi.slice(0, crypto.getPublicMpiCount(this.algorithm)); - this.isDecrypted = false; -}; - -},{"../crypto":32,"../enums.js":43,"../type/mpi.js":74,"../type/s2k.js":75,"../util.js":76,"./public_key.js":61}],65:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * @requires packet/secret_key - * @requires enums - * @module packet/secret_subkey - */ - -module.exports = SecretSubkey; - -var secretKey = require('./secret_key.js'), - enums = require('../enums.js'); - -/** - * @constructor - * @extends module:packet/secret_key - */ -function SecretSubkey() { - secretKey.call(this); - this.tag = enums.packet.secretSubkey; -} - -SecretSubkey.prototype = new secretKey(); -SecretSubkey.prototype.constructor = SecretSubkey; - -},{"../enums.js":43,"./secret_key.js":64}],66:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * Implementation of the Signature Packet (Tag 2)
- *
- * {@link http://tools.ietf.org/html/rfc4880#section-5.2|RFC4480 5.2}: - * A Signature packet describes a binding between some public key and - * some data. The most common signatures are a signature of a file or a - * block of text, and a signature that is a certification of a User ID. - * @requires crypto - * @requires enums - * @requires packet/packet - * @requires type/keyid - * @requires type/mpi - * @requires util - * @module packet/signature - */ - -module.exports = Signature; - -var util = require('../util.js'), - packet = require('./packet.js'), - enums = require('../enums.js'), - crypto = require('../crypto'), - type_mpi = require('../type/mpi.js'), - type_keyid = require('../type/keyid.js'); - -/** - * @constructor - */ -function Signature() { - this.tag = enums.packet.signature; - this.version = 4; - this.signatureType = null; - this.hashAlgorithm = null; - this.publicKeyAlgorithm = null; - - this.signatureData = null; - this.unhashedSubpackets = null; - this.signedHashValue = null; - - this.created = new Date(); - this.signatureExpirationTime = null; - this.signatureNeverExpires = true; - this.exportable = null; - this.trustLevel = null; - this.trustAmount = null; - this.regularExpression = null; - this.revocable = null; - this.keyExpirationTime = null; - this.keyNeverExpires = null; - this.preferredSymmetricAlgorithms = null; - this.revocationKeyClass = null; - this.revocationKeyAlgorithm = null; - this.revocationKeyFingerprint = null; - this.issuerKeyId = new type_keyid(); - this.notation = null; - this.preferredHashAlgorithms = null; - this.preferredCompressionAlgorithms = null; - this.keyServerPreferences = null; - this.preferredKeyServer = null; - this.isPrimaryUserID = null; - this.policyURI = null; - this.keyFlags = null; - this.signersUserId = null; - this.reasonForRevocationFlag = null; - this.reasonForRevocationString = null; - this.features = null; - this.signatureTargetPublicKeyAlgorithm = null; - this.signatureTargetHashAlgorithm = null; - this.signatureTargetHash = null; - this.embeddedSignature = null; - - this.verified = false; -} - -/** - * parsing function for a signature packet (tag 2). - * @param {String} bytes payload of a tag 2 packet - * @param {Integer} position position to start reading from the bytes string - * @param {Integer} len length of the packet or the remaining length of bytes at position - * @return {module:packet/signature} object representation - */ -Signature.prototype.read = function (bytes) { - var i = 0; - - this.version = bytes.charCodeAt(i++); - // switch on version (3 and 4) - switch (this.version) { - case 3: - // One-octet length of following hashed material. MUST be 5. - if (bytes.charCodeAt(i++) != 5) - util.print_debug("packet/signature.js\n" + - 'invalid One-octet length of following hashed material.' + - 'MUST be 5. @:' + (i - 1)); - - var sigpos = i; - // One-octet signature type. - this.signatureType = bytes.charCodeAt(i++); - - // Four-octet creation time. - this.created = util.readDate(bytes.substr(i, 4)); - i += 4; - - // storing data appended to data which gets verified - this.signatureData = bytes.substring(sigpos, i); - - // Eight-octet Key ID of signer. - this.issuerKeyId.read(bytes.substring(i, i + 8)); - i += 8; - - // One-octet public-key algorithm. - this.publicKeyAlgorithm = bytes.charCodeAt(i++); - - // One-octet hash algorithm. - this.hashAlgorithm = bytes.charCodeAt(i++); - break; - case 4: - this.signatureType = bytes.charCodeAt(i++); - this.publicKeyAlgorithm = bytes.charCodeAt(i++); - this.hashAlgorithm = bytes.charCodeAt(i++); - - function subpackets(bytes) { - // Two-octet scalar octet count for following subpacket data. - var subpacket_length = util.readNumber( - bytes.substr(0, 2)); - - var i = 2; - - // subpacket data set (zero or more subpackets) - var subpacked_read = 0; - while (i < 2 + subpacket_length) { - - var len = packet.readSimpleLength(bytes.substr(i)); - i += len.offset; - - this.read_sub_packet(bytes.substr(i, len.len)); - - i += len.len; - } - - return i; - } - - // hashed subpackets - i += subpackets.call(this, bytes.substr(i), true); - - // A V4 signature hashes the packet body - // starting from its first field, the version number, through the end - // of the hashed subpacket data. Thus, the fields hashed are the - // signature version, the signature type, the public-key algorithm, the - // hash algorithm, the hashed subpacket length, and the hashed - // subpacket body. - this.signatureData = bytes.substr(0, i); - var sigDataLength = i; - - // unhashed subpackets - i += subpackets.call(this, bytes.substr(i), false); - this.unhashedSubpackets = bytes.substr(sigDataLength, i - sigDataLength); - - break; - default: - throw new Error('Version ' + this.version + ' of the signature is unsupported.'); - } - - // Two-octet field holding left 16 bits of signed hash value. - this.signedHashValue = bytes.substr(i, 2); - i += 2; - - this.signature = bytes.substr(i); -}; - -Signature.prototype.write = function () { - var result = ''; - switch (this.version) { - case 3: - result += String.fromCharCode(3); // version - result += String.fromCharCode(5); // One-octet length of following hashed material. MUST be 5 - result += this.signatureData; - result += this.issuerKeyId.write(); - result += String.fromCharCode(this.publicKeyAlgorithm); - result += String.fromCharCode(this.hashAlgorithm); - break; - case 4: - result += this.signatureData; - result += this.unhashedSubpackets ? this.unhashedSubpackets : util.writeNumber(0, 2); - break; - } - result += this.signedHashValue + this.signature; - return result; -}; - -/** - * Signs provided data. This needs to be done prior to serialization. - * @param {module:packet/secret_key} key private key used to sign the message. - * @param {Object} data Contains packets to be signed. - */ -Signature.prototype.sign = function (key, data) { - var signatureType = enums.write(enums.signature, this.signatureType), - publicKeyAlgorithm = enums.write(enums.publicKey, this.publicKeyAlgorithm), - hashAlgorithm = enums.write(enums.hash, this.hashAlgorithm); - - var result = String.fromCharCode(4); - result += String.fromCharCode(signatureType); - result += String.fromCharCode(publicKeyAlgorithm); - result += String.fromCharCode(hashAlgorithm); - - this.issuerKeyId = key.getKeyId(); - - // Add hashed subpackets - result += this.write_all_sub_packets(); - - this.signatureData = result; - - var trailer = this.calculateTrailer(); - - var toHash = this.toSign(signatureType, data) + - this.signatureData + trailer; - - var hash = crypto.hash.digest(hashAlgorithm, toHash); - - this.signedHashValue = hash.substr(0, 2); - - this.signature = crypto.signature.sign(hashAlgorithm, - publicKeyAlgorithm, key.mpi, toHash); -}; - -/** - * Creates string of bytes with all subpacket data - * @return {String} a string-representation of a all subpacket data - */ -Signature.prototype.write_all_sub_packets = function () { - var sub = enums.signatureSubpacket; - var result = ''; - var bytes = ''; - if (this.created !== null) { - result += write_sub_packet(sub.signature_creation_time, util.writeDate(this.created)); - } - if (this.signatureExpirationTime !== null) { - result += write_sub_packet(sub.signature_expiration_time, util.writeNumber(this.signatureExpirationTime, 4)); - } - if (this.exportable !== null) { - result += write_sub_packet(sub.exportable_certification, String.fromCharCode(this.exportable ? 1 : 0)); - } - if (this.trustLevel !== null) { - bytes = String.fromCharCode(this.trustLevel) + String.fromCharCode(this.trustAmount); - result += write_sub_packet(sub.trust_signature, bytes); - } - if (this.regularExpression !== null) { - result += write_sub_packet(sub.regular_expression, this.regularExpression); - } - if (this.revocable !== null) { - result += write_sub_packet(sub.revocable, String.fromCharCode(this.revocable ? 1 : 0)); - } - if (this.keyExpirationTime !== null) { - result += write_sub_packet(sub.key_expiration_time, util.writeNumber(this.keyExpirationTime, 4)); - } - if (this.preferredSymmetricAlgorithms !== null) { - bytes = util.bin2str(this.preferredSymmetricAlgorithms); - result += write_sub_packet(sub.preferred_symmetric_algorithms, bytes); - } - if (this.revocationKeyClass !== null) { - bytes = String.fromCharCode(this.revocationKeyClass); - bytes += String.fromCharCode(this.revocationKeyAlgorithm); - bytes += this.revocationKeyFingerprint; - result += write_sub_packet(sub.revocation_key, bytes); - } - if (!this.issuerKeyId.isNull()) { - result += write_sub_packet(sub.issuer, this.issuerKeyId.write()); - } - if (this.notation !== null) { - for (var name in this.notation) { - if (this.notation.hasOwnProperty(name)) { - var value = this.notation[name]; - bytes = String.fromCharCode(0x80); - bytes += String.fromCharCode(0); - bytes += String.fromCharCode(0); - bytes += String.fromCharCode(0); - // 2 octets of name length - bytes += util.writeNumber(name.length, 2); - // 2 octets of value length - bytes += util.writeNumber(value.length, 2); - bytes += name + value; - result += write_sub_packet(sub.notation_data, bytes); - } - } - } - if (this.preferredHashAlgorithms !== null) { - bytes = util.bin2str(this.preferredHashAlgorithms); - result += write_sub_packet(sub.preferred_hash_algorithms, bytes); - } - if (this.preferredCompressionAlgorithms !== null) { - bytes = util.bin2str(this.preferredCompressionAlgorithms); - result += write_sub_packet(sub.preferred_compression_algorithms, bytes); - } - if (this.keyServerPreferences !== null) { - bytes = util.bin2str(this.keyServerPreferences); - result += write_sub_packet(sub.key_server_preferences, bytes); - } - if (this.preferredKeyServer !== null) { - result += write_sub_packet(sub.preferred_key_server, this.preferredKeyServer); - } - if (this.isPrimaryUserID !== null) { - result += write_sub_packet(sub.primary_user_id, String.fromCharCode(this.isPrimaryUserID ? 1 : 0)); - } - if (this.policyURI !== null) { - result += write_sub_packet(sub.policy_uri, this.policyURI); - } - if (this.keyFlags !== null) { - bytes = util.bin2str(this.keyFlags); - result += write_sub_packet(sub.key_flags, bytes); - } - if (this.signersUserId !== null) { - result += write_sub_packet(sub.signers_user_id, this.signersUserId); - } - if (this.reasonForRevocationFlag !== null) { - bytes = String.fromCharCode(this.reasonForRevocationFlag); - bytes += this.reasonForRevocationString; - result += write_sub_packet(sub.reason_for_revocation, bytes); - } - if (this.features !== null) { - bytes = util.bin2str(this.features); - result += write_sub_packet(sub.features, bytes); - } - if (this.signatureTargetPublicKeyAlgorithm !== null) { - bytes = String.fromCharCode(this.signatureTargetPublicKeyAlgorithm); - bytes += String.fromCharCode(this.signatureTargetHashAlgorithm); - bytes += this.signatureTargetHash; - result += write_sub_packet(sub.signature_target, bytes); - } - if (this.embeddedSignature !== null) { - result += write_sub_packet(sub.embedded_signature, this.embeddedSignature.write()); - } - result = util.writeNumber(result.length, 2) + result; - return result; -}; - -/** - * creates a string representation of a sub signature packet (See {@link http://tools.ietf.org/html/rfc4880#section-5.2.3.1|RFC 4880 5.2.3.1}) - * @param {Integer} type subpacket signature type. Signature types as described - * in {@link http://tools.ietf.org/html/rfc4880#section-5.2.3.2|RFC4880 Section 5.2.3.2} - * @param {String} data data to be included - * @return {String} a string-representation of a sub signature packet (See {@link http://tools.ietf.org/html/rfc4880#section-5.2.3.1|RFC 4880 5.2.3.1}) - */ -function write_sub_packet(type, data) { - var result = ""; - result += packet.writeSimpleLength(data.length + 1); - result += String.fromCharCode(type); - result += data; - return result; -} - -// V4 signature sub packets - -Signature.prototype.read_sub_packet = function (bytes) { - var mypos = 0; - - function read_array(prop, bytes) { - this[prop] = []; - - for (var i = 0; i < bytes.length; i++) { - this[prop].push(bytes.charCodeAt(i)); - } - } - - // The leftwost bit denotes a "critical" packet, but we ignore it. - var type = bytes.charCodeAt(mypos++) & 0x7F; - var seconds; - - // subpacket type - switch (type) { - case 2: - // Signature Creation Time - this.created = util.readDate(bytes.substr(mypos)); - break; - case 3: - // Signature Expiration Time in seconds - seconds = util.readNumber(bytes.substr(mypos)); - - this.signatureNeverExpires = seconds === 0; - this.signatureExpirationTime = seconds; - - break; - case 4: - // Exportable Certification - this.exportable = bytes.charCodeAt(mypos++) == 1; - break; - case 5: - // Trust Signature - this.trustLevel = bytes.charCodeAt(mypos++); - this.trustAmount = bytes.charCodeAt(mypos++); - break; - case 6: - // Regular Expression - this.regularExpression = bytes.substr(mypos); - break; - case 7: - // Revocable - this.revocable = bytes.charCodeAt(mypos++) == 1; - break; - case 9: - // Key Expiration Time in seconds - seconds = util.readNumber(bytes.substr(mypos)); - - this.keyExpirationTime = seconds; - this.keyNeverExpires = seconds === 0; - - break; - case 11: - // Preferred Symmetric Algorithms - read_array.call(this, 'preferredSymmetricAlgorithms', bytes.substr(mypos)); - break; - case 12: - // Revocation Key - // (1 octet of class, 1 octet of public-key algorithm ID, 20 - // octets of - // fingerprint) - this.revocationKeyClass = bytes.charCodeAt(mypos++); - this.revocationKeyAlgorithm = bytes.charCodeAt(mypos++); - this.revocationKeyFingerprint = bytes.substr(mypos, 20); - break; - - case 16: - // Issuer - this.issuerKeyId.read(bytes.substr(mypos)); - break; - - case 20: - // Notation Data - // We don't know how to handle anything but a text flagged data. - if (bytes.charCodeAt(mypos) == 0x80) { - - // We extract key/value tuple from the byte stream. - mypos += 4; - var m = util.readNumber(bytes.substr(mypos, 2)); - mypos += 2; - var n = util.readNumber(bytes.substr(mypos, 2)); - mypos += 2; - - var name = bytes.substr(mypos, m), - value = bytes.substr(mypos + m, n); - - this.notation = this.notation || {}; - this.notation[name] = value; - } else { - util.print_debug("Unsupported notation flag "+bytes.charCodeAt(mypos)); - } - break; - case 21: - // Preferred Hash Algorithms - read_array.call(this, 'preferredHashAlgorithms', bytes.substr(mypos)); - break; - case 22: - // Preferred Compression Algorithms - read_array.call(this, 'preferredCompressionAlgorithms', bytes.substr(mypos)); - break; - case 23: - // Key Server Preferences - read_array.call(this, 'keyServerPreferencess', bytes.substr(mypos)); - break; - case 24: - // Preferred Key Server - this.preferredKeyServer = bytes.substr(mypos); - break; - case 25: - // Primary User ID - this.isPrimaryUserID = bytes[mypos++] !== 0; - break; - case 26: - // Policy URI - this.policyURI = bytes.substr(mypos); - break; - case 27: - // Key Flags - read_array.call(this, 'keyFlags', bytes.substr(mypos)); - break; - case 28: - // Signer's User ID - this.signersUserId += bytes.substr(mypos); - break; - case 29: - // Reason for Revocation - this.reasonForRevocationFlag = bytes.charCodeAt(mypos++); - this.reasonForRevocationString = bytes.substr(mypos); - break; - case 30: - // Features - read_array.call(this, 'features', bytes.substr(mypos)); - break; - case 31: - // Signature Target - // (1 octet public-key algorithm, 1 octet hash algorithm, N octets hash) - this.signatureTargetPublicKeyAlgorithm = bytes.charCodeAt(mypos++); - this.signatureTargetHashAlgorithm = bytes.charCodeAt(mypos++); - - var len = crypto.getHashByteLength(this.signatureTargetHashAlgorithm); - - this.signatureTargetHash = bytes.substr(mypos, len); - break; - case 32: - // Embedded Signature - this.embeddedSignature = new Signature(); - this.embeddedSignature.read(bytes.substr(mypos)); - break; - default: - util.print_debug("Unknown signature subpacket type " + type + " @:" + mypos); - } -}; - -// Produces data to produce signature on -Signature.prototype.toSign = function (type, data) { - var t = enums.signature; - - switch (type) { - case t.binary: - case t.text: - return data.getBytes(); - - case t.standalone: - return ''; - - case t.cert_generic: - case t.cert_persona: - case t.cert_casual: - case t.cert_positive: - case t.cert_revocation: - var packet, tag; - - if (data.userid !== undefined) { - tag = 0xB4; - packet = data.userid; - } else if (data.userattribute !== undefined) { - tag = 0xD1; - packet = data.userattribute; - } else throw new Error('Either a userid or userattribute packet needs to be ' + - 'supplied for certification.'); - - var bytes = packet.write(); - - if (this.version == 4) { - return this.toSign(t.key, data) + - String.fromCharCode(tag) + - util.writeNumber(bytes.length, 4) + - bytes; - } else if (this.version == 3) { - return this.toSign(t.key, data) + - bytes; - } - break; - - case t.subkey_binding: - case t.subkey_revocation: - case t.key_binding: - return this.toSign(t.key, data) + this.toSign(t.key, { - key: data.bind - }); - - case t.key: - if (data.key === undefined) - throw new Error('Key packet is required for this signature.'); - - return data.key.writeOld(); - - case t.key_revocation: - return this.toSign(t.key, data); - case t.timestamp: - return ''; - case t.third_party: - throw new Error('Not implemented'); - default: - throw new Error('Unknown signature type.'); - } -}; - - -Signature.prototype.calculateTrailer = function () { - // calculating the trailer - var trailer = ''; - // V3 signatures don't have a trailer - if (this.version == 3) return trailer; - trailer += String.fromCharCode(4); // Version - trailer += String.fromCharCode(0xFF); - trailer += util.writeNumber(this.signatureData.length, 4); - return trailer; -}; - - -/** - * verifys the signature packet. Note: not signature types are implemented - * @param {String|Object} data data which on the signature applies - * @param {module:packet/public_subkey|module:packet/public_key| - * module:packet/secret_subkey|module:packet/secret_key} key the public key to verify the signature - * @return {boolean} True if message is verified, else false. - */ -Signature.prototype.verify = function (key, data) { - var signatureType = enums.write(enums.signature, this.signatureType), - publicKeyAlgorithm = enums.write(enums.publicKey, this.publicKeyAlgorithm), - hashAlgorithm = enums.write(enums.hash, this.hashAlgorithm); - - var bytes = this.toSign(signatureType, data), - trailer = this.calculateTrailer(); - - - var mpicount = 0; - // Algorithm-Specific Fields for RSA signatures: - // - multiprecision number (MPI) of RSA signature value m**d mod n. - if (publicKeyAlgorithm > 0 && publicKeyAlgorithm < 4) - mpicount = 1; - // Algorithm-Specific Fields for DSA signatures: - // - MPI of DSA value r. - // - MPI of DSA value s. - else if (publicKeyAlgorithm == 17) - mpicount = 2; - - var mpi = [], - i = 0; - for (var j = 0; j < mpicount; j++) { - mpi[j] = new type_mpi(); - i += mpi[j].read(this.signature.substr(i)); - } - - this.verified = crypto.signature.verify(publicKeyAlgorithm, - hashAlgorithm, mpi, key.mpi, - bytes + this.signatureData + trailer); - - return this.verified; -}; - -/** - * Verifies signature expiration date - * @return {Boolean} true if expired - */ -Signature.prototype.isExpired = function () { - if (!this.signatureNeverExpires) { - return Date.now() > (this.created.getTime() + this.signatureExpirationTime*1000); - } - return false; -}; - -/** - * Fix custom types after cloning - */ -Signature.prototype.postCloneTypeFix = function() { - this.issuerKeyId = type_keyid.fromClone(this.issuerKeyId); -}; - -},{"../crypto":32,"../enums.js":43,"../type/keyid.js":73,"../type/mpi.js":74,"../util.js":76,"./packet.js":59}],67:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * Implementation of the Sym. Encrypted Integrity Protected Data - * Packet (Tag 18)
- *
- * {@link http://tools.ietf.org/html/rfc4880#section-5.13|RFC4880 5.13}: - * The Symmetrically Encrypted Integrity Protected Data packet is - * a variant of the Symmetrically Encrypted Data packet. It is a new feature - * created for OpenPGP that addresses the problem of detecting a modification to - * encrypted data. It is used in combination with a Modification Detection Code - * packet. - * @requires crypto - * @requires util - * @requires enums - * @module packet/sym_encrypted_integrity_protected - */ - -module.exports = SymEncryptedIntegrityProtected; - -var util = require('../util.js'), - crypto = require('../crypto'), - enums = require('../enums.js'); - -/** - * @constructor - */ -function SymEncryptedIntegrityProtected() { - this.tag = enums.packet.symEncryptedIntegrityProtected; - /** The encrypted payload. */ - this.encrypted = null; // string - /** - * If after decrypting the packet this is set to true, - * a modification has been detected and thus the contents - * should be discarded. - * @type {Boolean} - */ - this.modification = false; - this.packets = null; -} - -SymEncryptedIntegrityProtected.prototype.read = function (bytes) { - // - A one-octet version number. The only currently defined value is 1. - var version = bytes.charCodeAt(0); - - if (version != 1) { - throw new Error('Invalid packet version.'); - } - - // - Encrypted data, the output of the selected symmetric-key cipher - // operating in Cipher Feedback mode with shift amount equal to the - // block size of the cipher (CFB-n where n is the block size). - this.encrypted = bytes.substr(1); -}; - -SymEncryptedIntegrityProtected.prototype.write = function () { - - // 1 = Version - return String.fromCharCode(1) + this.encrypted; -}; - -SymEncryptedIntegrityProtected.prototype.encrypt = function (sessionKeyAlgorithm, key) { - var bytes = this.packets.write(); - - var prefixrandom = crypto.getPrefixRandom(sessionKeyAlgorithm); - var prefix = prefixrandom + prefixrandom.charAt(prefixrandom.length - 2) + prefixrandom.charAt(prefixrandom.length - - 1); - - var tohash = bytes; - - - // Modification detection code packet. - tohash += String.fromCharCode(0xD3); - tohash += String.fromCharCode(0x14); - - - tohash += crypto.hash.sha1(prefix + tohash); - - - this.encrypted = crypto.cfb.encrypt(prefixrandom, - sessionKeyAlgorithm, tohash, key, false); - - if (prefix.length + tohash.length != this.encrypted.length) - { - this.encrypted = this.encrypted.substring(0, prefix.length + tohash.length); - } -}; - -/** - * Decrypts the encrypted data contained in this object read_packet must - * have been called before - * - * @param {module:enums.symmetric} sessionKeyAlgorithm - * The selected symmetric encryption algorithm to be used - * @param {String} key The key of cipher blocksize length to be used - * @return {String} The decrypted data of this packet - */ -SymEncryptedIntegrityProtected.prototype.decrypt = function (sessionKeyAlgorithm, key) { - var decrypted = crypto.cfb.decrypt( - sessionKeyAlgorithm, key, this.encrypted, false); - - var mdc = decrypted.slice(decrypted.length - 20, decrypted.length).join(''); - - decrypted.splice(decrypted.length - 20); - - // there must be a modification detection code packet as the - // last packet and everything gets hashed except the hash itself - this.hash = crypto.hash.sha1( - crypto.cfb.mdc(sessionKeyAlgorithm, key, this.encrypted) + decrypted.join('')); - - - if (this.hash != mdc) { - throw new Error('Modification detected.'); - } else { - decrypted.splice(decrypted.length - 2); - this.packets.read(decrypted.join('')); - } -}; - -},{"../crypto":32,"../enums.js":43,"../util.js":76}],68:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * Public-Key Encrypted Session Key Packets (Tag 1)
- *
- * {@link http://tools.ietf.org/html/rfc4880#section-5.1|RFC4880 5.1}: A Public-Key Encrypted Session Key packet holds the session key - * used to encrypt a message. Zero or more Public-Key Encrypted Session Key - * packets and/or Symmetric-Key Encrypted Session Key packets may precede a - * Symmetrically Encrypted Data Packet, which holds an encrypted message. The - * message is encrypted with the session key, and the session key is itself - * encrypted and stored in the Encrypted Session Key packet(s). The - * Symmetrically Encrypted Data Packet is preceded by one Public-Key Encrypted - * Session Key packet for each OpenPGP key to which the message is encrypted. - * The recipient of the message finds a session key that is encrypted to their - * public key, decrypts the session key, and then uses the session key to - * decrypt the message. - * @requires crypto - * @requires enums - * @requires type/s2k - * @module packet/sym_encrypted_session_key - */ - -var type_s2k = require('../type/s2k.js'), - enums = require('../enums.js'), - crypto = require('../crypto'); - -module.exports = SymEncryptedSessionKey; - -/** - * @constructor - */ -function SymEncryptedSessionKey() { - this.tag = enums.packet.symEncryptedSessionKey; - this.version = 4; - this.sessionKeyEncryptionAlgorithm = null; - this.sessionKeyAlgorithm = 'aes256'; - this.encrypted = null; - this.s2k = new type_s2k(); -} - -/** - * Parsing function for a symmetric encrypted session key packet (tag 3). - * - * @param {String} input Payload of a tag 1 packet - * @param {Integer} position Position to start reading from the input string - * @param {Integer} len - * Length of the packet or the remaining length of - * input at position - * @return {module:packet/sym_encrypted_session_key} Object representation - */ -SymEncryptedSessionKey.prototype.read = function(bytes) { - // A one-octet version number. The only currently defined version is 4. - this.version = bytes.charCodeAt(0); - - // A one-octet number describing the symmetric algorithm used. - var algo = enums.read(enums.symmetric, bytes.charCodeAt(1)); - - // A string-to-key (S2K) specifier, length as defined above. - var s2klength = this.s2k.read(bytes.substr(2)); - - // Optionally, the encrypted session key itself, which is decrypted - // with the string-to-key object. - var done = s2klength + 2; - - if (done < bytes.length) { - this.encrypted = bytes.substr(done); - this.sessionKeyEncryptionAlgorithm = algo; - } else - this.sessionKeyAlgorithm = algo; -}; - -SymEncryptedSessionKey.prototype.write = function() { - var algo = this.encrypted === null ? - this.sessionKeyAlgorithm : - this.sessionKeyEncryptionAlgorithm; - - var bytes = String.fromCharCode(this.version) + - String.fromCharCode(enums.write(enums.symmetric, algo)) + - this.s2k.write(); - - if (this.encrypted !== null) - bytes += this.encrypted; - return bytes; -}; - -/** - * Decrypts the session key (only for public key encrypted session key - * packets (tag 1) - * - * @return {String} The unencrypted session key - */ -SymEncryptedSessionKey.prototype.decrypt = function(passphrase) { - var algo = this.sessionKeyEncryptionAlgorithm !== null ? - this.sessionKeyEncryptionAlgorithm : - this.sessionKeyAlgorithm; - - - var length = crypto.cipher[algo].keySize; - var key = this.s2k.produce_key(passphrase, length); - - if (this.encrypted === null) { - this.sessionKey = key; - - } else { - var decrypted = crypto.cfb.decrypt( - this.sessionKeyEncryptionAlgorithm, key, this.encrypted, true); - decrypted = decrypted.join(''); - - this.sessionKeyAlgorithm = enums.read(enums.symmetric, - decrypted[0].keyCodeAt()); - - this.sessionKey = decrypted.substr(1); - } -}; - -SymEncryptedSessionKey.prototype.encrypt = function(passphrase) { - var length = crypto.getKeyLength(this.sessionKeyEncryptionAlgorithm); - var key = this.s2k.produce_key(passphrase, length); - - var private_key = String.fromCharCode( - enums.write(enums.symmetric, this.sessionKeyAlgorithm)) + - - crypto.getRandomBytes( - crypto.getKeyLength(this.sessionKeyAlgorithm)); - - this.encrypted = crypto.cfb.encrypt( - crypto.getPrefixRandom(this.sessionKeyEncryptionAlgorithm), - this.sessionKeyEncryptionAlgorithm, key, private_key, true); -}; - -/** - * Fix custom types after cloning - */ -SymEncryptedSessionKey.prototype.postCloneTypeFix = function() { - this.s2k = type_s2k.fromClone(this.s2k); -}; - -},{"../crypto":32,"../enums.js":43,"../type/s2k.js":75}],69:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * Implementation of the Symmetrically Encrypted Data Packet (Tag 9)
- *
- * {@link http://tools.ietf.org/html/rfc4880#section-5.7|RFC4880 5.7}: The Symmetrically Encrypted Data packet contains data encrypted - * with a symmetric-key algorithm. When it has been decrypted, it contains other - * packets (usually a literal data packet or compressed data packet, but in - * theory other Symmetrically Encrypted Data packets or sequences of packets - * that form whole OpenPGP messages). - * @requires crypto - * @requires enums - * @module packet/symmetrically_encrypted - */ - -module.exports = SymmetricallyEncrypted; - -var crypto = require('../crypto'), - enums = require('../enums.js'), - config = require('../config'); - -/** - * @constructor - */ -function SymmetricallyEncrypted() { - this.tag = enums.packet.symmetricallyEncrypted; - this.encrypted = null; - /** Decrypted packets contained within. - * @type {module:packet/packetlist} */ - this.packets = null; - this.ignore_mdc_error = config.ignore_mdc_error; -} - -SymmetricallyEncrypted.prototype.read = function (bytes) { - this.encrypted = bytes; -}; - -SymmetricallyEncrypted.prototype.write = function () { - return this.encrypted; -}; - -/** - * Symmetrically decrypt the packet data - * - * @param {module:enums.symmetric} sessionKeyAlgorithm - * Symmetric key algorithm to use // See {@link http://tools.ietf.org/html/rfc4880#section-9.2|RFC4880 9.2} - * @param {String} key - * Key as string with the corresponding length to the - * algorithm - */ -SymmetricallyEncrypted.prototype.decrypt = function (sessionKeyAlgorithm, key) { - var decrypted = crypto.cfb.decrypt(sessionKeyAlgorithm, key, this.encrypted, true); - // for modern cipher (blocklength != 64 bit, except for Twofish) MDC is required - if (!this.ignore_mdc_error && - (sessionKeyAlgorithm === 'aes128' || - sessionKeyAlgorithm === 'aes192' || - sessionKeyAlgorithm === 'aes256')) { - throw new Error('Decryption failed due to missing MDC in combination with modern cipher.') - } - this.packets.read(decrypted.join('')); -}; - -SymmetricallyEncrypted.prototype.encrypt = function (algo, key) { - var data = this.packets.write(); - - this.encrypted = crypto.cfb.encrypt( - crypto.getPrefixRandom(algo), algo, data, key, true); -}; - -},{"../config":17,"../crypto":32,"../enums.js":43}],70:[function(require,module,exports){ -/** - * @requires enums - * @module packet/trust - */ - -module.exports = Trust; - -var enums = require('../enums.js'); - -/** - * @constructor - */ -function Trust() { - this.tag = enums.packet.trust; -} - -/** - * Parsing function for a trust packet (tag 12). - * Currently empty as we ignore trust packets - * @param {String} byptes payload of a tag 12 packet - */ -Trust.prototype.read = function (bytes) { - -}; - -},{"../enums.js":43}],71:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * Implementation of the User Attribute Packet (Tag 17)
- *
- * The User Attribute packet is a variation of the User ID packet. It - * is capable of storing more types of data than the User ID packet, - * which is limited to text. Like the User ID packet, a User Attribute - * packet may be certified by the key owner ("self-signed") or any other - * key owner who cares to certify it. Except as noted, a User Attribute - * packet may be used anywhere that a User ID packet may be used. - *
- * While User Attribute packets are not a required part of the OpenPGP - * standard, implementations SHOULD provide at least enough - * compatibility to properly handle a certification signature on the - * User Attribute packet. A simple way to do this is by treating the - * User Attribute packet as a User ID packet with opaque contents, but - * an implementation may use any method desired. - * module packet/user_attribute - * @requires enums - * @module packet/user_attribute - */ - -var util = require('../util.js'), - packet = require('./packet.js'), - enums = require('../enums.js'); - -module.exports = UserAttribute; - -/** - * @constructor - */ -function UserAttribute() { - this.tag = enums.packet.userAttribute; - this.attributes = []; -} - -/** - * parsing function for a user attribute packet (tag 17). - * @param {String} input payload of a tag 17 packet - */ -UserAttribute.prototype.read = function(bytes) { - var i = 0; - while (i < bytes.length) { - var len = packet.readSimpleLength(bytes.substr(i)); - i += len.offset; - - this.attributes.push(bytes.substr(i, len.len)); - i += len.len; - } -}; - -/** - * Creates a string representation of the user attribute packet - * @return {String} string representation - */ -UserAttribute.prototype.write = function() { - var result = ''; - for (var i = 0; i < this.attributes.length; i++) { - result += packet.writeSimpleLength(this.attributes[i].length); - result += this.attributes[i]; - } - return result; -}; - -/** - * Compare for equality - * @param {module:user_attribute~UserAttribute} usrAttr - * @return {Boolean} true if equal - */ -UserAttribute.prototype.equals = function(usrAttr) { - if (!usrAttr || !(usrAttr instanceof UserAttribute)) { - return false; - } - return this.attributes.every(function(attr, index) { - return attr === usrAttr.attributes[index]; - }); -}; - -},{"../enums.js":43,"../util.js":76,"./packet.js":59}],72:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * Implementation of the User ID Packet (Tag 13)
- *
- * A User ID packet consists of UTF-8 text that is intended to represent - * the name and email address of the key holder. By convention, it - * includes an RFC 2822 [RFC2822] mail name-addr, but there are no - * restrictions on its content. The packet length in the header - * specifies the length of the User ID. - * @requires util - * @requires enums - * @module packet/userid - */ - -module.exports = Userid; - -var util = require('../util.js'), - enums = require('../enums.js'); - -/** - * @constructor - */ -function Userid() { - this.tag = enums.packet.userid; - /** A string containing the user id. Usually in the form - * John Doe - * @type {String} - */ - this.userid = ''; -} - -/** - * Parsing function for a user id packet (tag 13). - * @param {String} input payload of a tag 13 packet - */ -Userid.prototype.read = function (bytes) { - this.userid = util.decode_utf8(bytes); -}; - -/** - * Creates a string representation of the user id packet - * @return {String} string representation - */ -Userid.prototype.write = function () { - return util.encode_utf8(this.userid); -}; - -},{"../enums.js":43,"../util.js":76}],73:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * Implementation of type key id ({@link http://tools.ietf.org/html/rfc4880#section-3.3|RFC4880 3.3})
- *
- * A Key ID is an eight-octet scalar that identifies a key. - * Implementations SHOULD NOT assume that Key IDs are unique. The - * section "Enhanced Key Formats" below describes how Key IDs are - * formed. - * @requires util - * @module type/keyid - */ - -module.exports = Keyid; - -var util = require('../util.js'); - -/** - * @constructor - */ -function Keyid() { - - this.bytes = ''; -} - -/** - * Parsing method for a key id - * @param {String} input Input to read the key id from - */ -Keyid.prototype.read = function(bytes) { - this.bytes = bytes.substr(0, 8); -}; - -Keyid.prototype.write = function() { - return this.bytes; -}; - -Keyid.prototype.toHex = function() { - return util.hexstrdump(this.bytes); -}; - -Keyid.prototype.equals = function(keyid) { - return this.bytes == keyid.bytes; -}; - -Keyid.prototype.isNull = function() { - return this.bytes === ''; -}; - -module.exports.mapToHex = function (keyId) { - return keyId.toHex(); -}; - -module.exports.fromClone = function (clone) { - var keyid = new Keyid(); - keyid.bytes = clone.bytes; - return keyid; -}; - -module.exports.fromId = function (hex) { - var keyid = new Keyid(); - keyid.read(util.hex2bin(hex)); - return keyid; -}; - -},{"../util.js":76}],74:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -// Hint: We hold our MPIs as an array of octets in big endian format preceeding a two -// octet scalar: MPI: [a,b,c,d,e,f] -// - MPI size: (a << 8) | b -// - MPI = c | d << 8 | e << ((MPI.length -2)*8) | f ((MPI.length -2)*8) - -/** - * Implementation of type MPI ({@link http://tools.ietf.org/html/rfc4880#section-3.2|RFC4880 3.2})
- *
- * Multiprecision integers (also called MPIs) are unsigned integers used - * to hold large integers such as the ones used in cryptographic - * calculations. - * An MPI consists of two pieces: a two-octet scalar that is the length - * of the MPI in bits followed by a string of octets that contain the - * actual integer. - * @requires crypto/public_key/jsbn - * @requires util - * @module type/mpi - */ - -module.exports = MPI; - -var BigInteger = require('../crypto/public_key/jsbn.js'), - util = require('../util.js'); - -/** - * @constructor - */ -function MPI() { - /** An implementation dependent integer */ - this.data = null; -} - -/** - * Parsing function for a mpi ({@link http://tools.ietf.org/html/rfc4880#section3.2|RFC 4880 3.2}). - * @param {String} input Payload of mpi data - * @return {Integer} Length of data read - */ -MPI.prototype.read = function (bytes) { - var bits = (bytes.charCodeAt(0) << 8) | bytes.charCodeAt(1); - - // Additional rules: - // - // The size of an MPI is ((MPI.length + 7) / 8) + 2 octets. - // - // The length field of an MPI describes the length starting from its - // most significant non-zero bit. Thus, the MPI [00 02 01] is not - // formed correctly. It should be [00 01 01]. - - // TODO: Verification of this size method! This size calculation as - // specified above is not applicable in JavaScript - var bytelen = Math.ceil(bits / 8); - - var raw = bytes.substr(2, bytelen); - this.fromBytes(raw); - - return 2 + bytelen; -}; - -MPI.prototype.fromBytes = function (bytes) { - this.data = new BigInteger(util.hexstrdump(bytes), 16); -}; - -MPI.prototype.toBytes = function () { - return this.write().substr(2); -}; - -MPI.prototype.byteLength = function () { - return this.toBytes().length; -}; - -/** - * Converts the mpi object to a string as specified in {@link http://tools.ietf.org/html/rfc4880#section-3.2|RFC4880 3.2} - * @return {String} mpi Byte representation - */ -MPI.prototype.write = function () { - return this.data.toMPI(); -}; - -MPI.prototype.toBigInteger = function () { - return this.data.clone(); -}; - -MPI.prototype.fromBigInteger = function (bn) { - this.data = bn.clone(); -}; - -module.exports.fromClone = function (clone) { - clone.data.copyTo = BigInteger.prototype.copyTo; - var bn = new BigInteger(); - clone.data.copyTo(bn); - var mpi = new MPI(); - mpi.data = bn; - return mpi; -}; - -},{"../crypto/public_key/jsbn.js":37,"../util.js":76}],75:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * Implementation of the String-to-key specifier ({@link http://tools.ietf.org/html/rfc4880#section-3.7|RFC4880 3.7})
- *
- * String-to-key (S2K) specifiers are used to convert passphrase strings - * into symmetric-key encryption/decryption keys. They are used in two - * places, currently: to encrypt the secret part of private keys in the - * private keyring, and to convert passphrases to encryption keys for - * symmetrically encrypted messages. - * @requires crypto - * @requires enums - * @requires util - * @module type/s2k - */ - -module.exports = S2K; - -var enums = require('../enums.js'), - util = require('../util.js'), - crypto = require('../crypto'); - -/** - * @constructor - */ -function S2K() { - /** @type {module:enums.hash} */ - this.algorithm = 'sha256'; - /** @type {module:enums.s2k} */ - this.type = 'iterated'; - this.c = 96; - /** Eight bytes of salt in a binary string. - * @type {String} - */ - this.salt = crypto.random.getRandomBytes(8); -} - -S2K.prototype.get_count = function () { - // Exponent bias, defined in RFC4880 - var expbias = 6; - - return (16 + (this.c & 15)) << ((this.c >> 4) + expbias); -}; - -/** - * Parsing function for a string-to-key specifier ({@link http://tools.ietf.org/html/rfc4880#section-3.7|RFC 4880 3.7}). - * @param {String} input Payload of string-to-key specifier - * @return {Integer} Actual length of the object - */ -S2K.prototype.read = function (bytes) { - var i = 0; - this.type = enums.read(enums.s2k, bytes.charCodeAt(i++)); - this.algorithm = enums.read(enums.hash, bytes.charCodeAt(i++)); - - switch (this.type) { - case 'simple': - break; - - case 'salted': - this.salt = bytes.substr(i, 8); - i += 8; - break; - - case 'iterated': - this.salt = bytes.substr(i, 8); - i += 8; - - // Octet 10: count, a one-octet, coded value - this.c = bytes.charCodeAt(i++); - break; - - case 'gnu': - if (bytes.substr(i, 3) == "GNU") { - i += 3; // GNU - var gnuExtType = 1000 + bytes.charCodeAt(i++); - if (gnuExtType == 1001) { - this.type = gnuExtType; - // GnuPG extension mode 1001 -- don't write secret key at all - } else { - throw new Error("Unknown s2k gnu protection mode."); - } - } else { - throw new Error("Unknown s2k type."); - } - break; - - default: - throw new Error("Unknown s2k type."); - } - - return i; -}; - - -/** - * writes an s2k hash based on the inputs. - * @return {String} Produced key of hashAlgorithm hash length - */ -S2K.prototype.write = function () { - var bytes = String.fromCharCode(enums.write(enums.s2k, this.type)); - bytes += String.fromCharCode(enums.write(enums.hash, this.algorithm)); - - switch (this.type) { - case 'simple': - break; - case 'salted': - bytes += this.salt; - break; - case 'iterated': - bytes += this.salt; - bytes += String.fromCharCode(this.c); - break; - case 'gnu': - throw new Error("GNU s2k type not supported."); - default: - throw new Error("Unknown s2k type."); - } - - return bytes; -}; - -/** - * Produces a key using the specified passphrase and the defined - * hashAlgorithm - * @param {String} passphrase Passphrase containing user input - * @return {String} Produced key with a length corresponding to - * hashAlgorithm hash length - */ -S2K.prototype.produce_key = function (passphrase, numBytes) { - passphrase = util.encode_utf8(passphrase); - - function round(prefix, s2k) { - var algorithm = enums.write(enums.hash, s2k.algorithm); - - switch (s2k.type) { - case 'simple': - return crypto.hash.digest(algorithm, prefix + passphrase); - - case 'salted': - return crypto.hash.digest(algorithm, - prefix + s2k.salt + passphrase); - - case 'iterated': - var isp = [], - count = s2k.get_count(), - data = s2k.salt + passphrase; - - while (isp.length * data.length < count) - isp.push(data); - - isp = isp.join(''); - - if (isp.length > count) - isp = isp.substr(0, count); - - return crypto.hash.digest(algorithm, prefix + isp); - - case 'gnu': - throw new Error("GNU s2k type not supported."); - - default: - throw new Error("Unknown s2k type."); - } - } - - var result = '', - prefix = ''; - - while (result.length <= numBytes) { - result += round(prefix, this); - prefix += String.fromCharCode(0); - } - - return result.substr(0, numBytes); -}; - -module.exports.fromClone = function (clone) { - var s2k = new S2K(); - this.algorithm = clone.algorithm; - this.type = clone.type; - this.c = clone.c; - this.salt = clone.salt; - return s2k; -}; - -},{"../crypto":32,"../enums.js":43,"../util.js":76}],76:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * This object contains utility functions - * @requires config - * @module util - */ - -'use strict'; - -var config = require('./config'); - -module.exports = { - readNumber: function (bytes) { - var n = 0; - - for (var i = 0; i < bytes.length; i++) { - n <<= 8; - n += bytes.charCodeAt(i); - } - - return n; - }, - - writeNumber: function (n, bytes) { - var b = ''; - for (var i = 0; i < bytes; i++) { - b += String.fromCharCode((n >> (8 * (bytes - i - 1))) & 0xFF); - } - - return b; - }, - - readDate: function (bytes) { - var n = this.readNumber(bytes); - var d = new Date(); - d.setTime(n * 1000); - return d; - }, - - writeDate: function (time) { - var numeric = Math.round(time.getTime() / 1000); - - return this.writeNumber(numeric, 4); - }, - - emailRegEx: /^[+a-zA-Z0-9_.-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]{2,6}$/, - - hexdump: function (str) { - var r = []; - var e = str.length; - var c = 0; - var h; - var i = 0; - while (c < e) { - h = str.charCodeAt(c++).toString(16); - while (h.length < 2) h = "0" + h; - r.push(" " + h); - i++; - if (i % 32 === 0) - r.push("\n "); - } - return r.join(''); - }, - - /** - * Create hexstring from a binary - * @param {String} str String to convert - * @return {String} String containing the hexadecimal values - */ - hexstrdump: function (str) { - if (str === null) - return ""; - var r = []; - var e = str.length; - var c = 0; - var h; - while (c < e) { - h = str.charCodeAt(c++).toString(16); - while (h.length < 2) h = "0" + h; - r.push("" + h); - } - return r.join(''); - }, - - /** - * Create binary string from a hex encoded string - * @param {String} str Hex string to convert - * @return {String} String containing the binary values - */ - hex2bin: function (hex) { - var str = ''; - for (var i = 0; i < hex.length; i += 2) - str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); - return str; - }, - - /** - * Creating a hex string from an binary array of integers (0..255) - * @param {String} str Array of bytes to convert - * @return {String} Hexadecimal representation of the array - */ - hexidump: function (str) { - var r = []; - var e = str.length; - var c = 0; - var h; - while (c < e) { - h = str[c++].toString(16); - while (h.length < 2) h = "0" + h; - r.push("" + h); - } - return r.join(''); - }, - - - /** - * Convert a native javascript string to a string of utf8 bytes - * @param {String} str The string to convert - * @return {String} A valid squence of utf8 bytes - */ - encode_utf8: function (str) { - return unescape(encodeURIComponent(str)); - }, - - /** - * Convert a string of utf8 bytes to a native javascript string - * @param {String} utf8 A valid squence of utf8 bytes - * @return {String} A native javascript string - */ - decode_utf8: function (utf8) { - if (typeof utf8 !== 'string') { - throw new Error('Parameter "utf8" is not of type string'); - } - try { - return decodeURIComponent(escape(utf8)); - } catch (e) { - return utf8; - } - }, - - /** - * Convert an array of integers(0.255) to a string - * @param {Array} bin An array of (binary) integers to convert - * @return {String} The string representation of the array - */ - bin2str: function (bin) { - var result = []; - for (var i = 0; i < bin.length; i++) { - result[i] = String.fromCharCode(bin[i]); - } - return result.join(''); - }, - - /** - * Convert a string to an array of integers(0.255) - * @param {String} str String to convert - * @return {Array} An array of (binary) integers - */ - str2bin: function (str) { - var result = []; - for (var i = 0; i < str.length; i++) { - result[i] = str.charCodeAt(i); - } - return result; - }, - - - /** - * Convert a string to a Uint8Array - * @param {String} str String to convert - * @return {Uint8Array} The array of (binary) integers - */ - str2Uint8Array: function (str) { - var result = new Uint8Array(str.length); - for (var i = 0; i < str.length; i++) { - result[i] = str.charCodeAt(i); - } - return result; - }, - - /** - * Convert a Uint8Array to a string. This currently functions - * the same as bin2str. - * @function module:util.Uint8Array2str - * @param {Uint8Array} bin An array of (binary) integers to convert - * @return {String} String representation of the array - */ - Uint8Array2str: function (bin) { - var result = []; - for (var i = 0; i < bin.length; i++) { - result[i] = String.fromCharCode(bin[i]); - } - return result.join(''); - }, - - /** - * Calculates a 16bit sum of a string by adding each character - * codes modulus 65535 - * @param {String} text String to create a sum of - * @return {Integer} An integer containing the sum of all character - * codes % 65535 - */ - calc_checksum: function (text) { - var checksum = { - s: 0, - add: function (sadd) { - this.s = (this.s + sadd) % 65536; - } - }; - for (var i = 0; i < text.length; i++) { - checksum.add(text.charCodeAt(i)); - } - return checksum.s; - }, - - /** - * Helper function to print a debug message. Debug - * messages are only printed if - * @link module:config/config.debug is set to true. - * @param {String} str String of the debug message - */ - print_debug: function (str) { - if (config.debug) { - console.log(str); - } - }, - - /** - * Helper function to print a debug message. Debug - * messages are only printed if - * @link module:config/config.debug is set to true. - * Different than print_debug because will call hexstrdump iff necessary. - * @param {String} str String of the debug message - */ - print_debug_hexstr_dump: function (str, strToHex) { - if (config.debug) { - str = str + this.hexstrdump(strToHex); - console.log(str); - } - }, - - getLeftNBits: function (string, bitcount) { - var rest = bitcount % 8; - if (rest === 0) - return string.substring(0, bitcount / 8); - var bytes = (bitcount - rest) / 8 + 1; - var result = string.substring(0, bytes); - return this.shiftRight(result, 8 - rest); // +String.fromCharCode(string.charCodeAt(bytes -1) << (8-rest) & 0xFF); - }, - - /** - * Shifting a string to n bits right - * @param {String} value The string to shift - * @param {Integer} bitcount Amount of bits to shift (MUST be smaller - * than 9) - * @return {String} Resulting string. - */ - shiftRight: function (value, bitcount) { - var temp = util.str2bin(value); - if (bitcount % 8 !== 0) { - for (var i = temp.length - 1; i >= 0; i--) { - temp[i] >>= bitcount % 8; - if (i > 0) - temp[i] |= (temp[i - 1] << (8 - (bitcount % 8))) & 0xFF; - } - } else { - return value; - } - return util.bin2str(temp); - }, - - /** - * Return the algorithm type as string - * @return {String} String representing the message type - */ - get_hashAlgorithmString: function (algo) { - switch (algo) { - case 1: - return "MD5"; - case 2: - return "SHA1"; - case 3: - return "RIPEMD160"; - case 8: - return "SHA256"; - case 9: - return "SHA384"; - case 10: - return "SHA512"; - case 11: - return "SHA224"; - } - return "unknown"; - }, - - /** - * Get native Web Cryptography api. The default configuration is to use - * the api when available. But it can also be deactivated with config.useWebCrypto - * @return {Object} The SubtleCrypto api or 'undefined' - */ - getWebCrypto: function() { - if (config.useWebCrypto === false) { - // make web crypto optional - return; - } - - if (typeof window !== 'undefined') { - if (window.crypto) { - return window.crypto.subtle || window.crypto.webkitSubtle; - } - if (window.msCrypto) { - return window.msCrypto.subtle; - } - } - } -}; - -},{"./config":17}],77:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3.0 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -/** - * @requires crypto - * @requires enums - * @requires packet - * @requires type_keyid - * @requires key - * @module async_proxy - */ - -'use strict'; - -var crypto = require('../crypto'), - packet = require('../packet'), - key = require('../key.js'), - type_keyid = require('../type/keyid.js'); - -var INITIAL_RANDOM_SEED = 50000, // random bytes seeded to worker - RANDOM_SEED_REQUEST = 20000; // random bytes seeded after worker request - -/** - * Initializes a new proxy and loads the web worker - * @constructor - * @param {String} path The path to the worker or 'openpgp.worker.js' by default - * @param {Object} [options.config=Object] config The worker configuration - * @param {Object} [options.worker=Object] alternative to path parameter: - * web worker initialized with 'openpgp.worker.js' - */ -function AsyncProxy(path, options) { - if (options && options.worker) { - this.worker = options.worker; - } else { - this.worker = new Worker(path || 'openpgp.worker.js'); - } - this.worker.onmessage = this.onMessage.bind(this); - this.worker.onerror = function(e) { - throw new Error('Unhandled error in openpgp worker: ' + e.message + ' (' + e.filename + ':' + e.lineno + ')'); - }; - this.seedRandom(INITIAL_RANDOM_SEED); - // FIFO - this.tasks = []; - if (options && options.config) { - this.worker.postMessage({event: 'configure', config: options.config}); - } -} - -/** - * Command pattern that wraps synchronous code into a promise - * @param {Object} self The current this - * @param {function} cmd The synchronous function with a return value - * to be wrapped in a promise - * @return {Promise} The promise wrapped around cmd - */ -AsyncProxy.prototype.execute = function(cmd) { - var self = this; - - var promise = new Promise(function(resolve, reject) { - cmd(); - self.tasks.push({ resolve:resolve, reject:reject }); - }); - - return promise; -}; - -/** - * Message handling - */ -AsyncProxy.prototype.onMessage = function(event) { - var msg = event.data; - switch (msg.event) { - case 'method-return': - if (msg.err) { - // fail - this.tasks.shift().reject(new Error(msg.err)); - } else { - // success - this.tasks.shift().resolve(msg.data); - } - break; - case 'request-seed': - this.seedRandom(RANDOM_SEED_REQUEST); - break; - default: - throw new Error('Unknown Worker Event.'); - } -}; - -/** - * Send message to worker with random data - * @param {Integer} size Number of bytes to send - */ -AsyncProxy.prototype.seedRandom = function(size) { - var buf = this.getRandomBuffer(size); - this.worker.postMessage({event: 'seed-random', buf: buf}); -}; - -/** - * Get Uint8Array with random numbers - * @param {Integer} size Length of buffer - * @return {Uint8Array} - */ -AsyncProxy.prototype.getRandomBuffer = function(size) { - if (!size) return null; - var buf = new Uint8Array(size); - crypto.random.getRandomValues(buf); - return buf; -}; - -/** - * Terminates the worker - */ -AsyncProxy.prototype.terminate = function() { - this.worker.terminate(); -}; - -/** - * Encrypts message text with keys - * @param {(Array|module:key~Key)} keys array of keys or single key, used to encrypt the message - * @param {String} text message as native JavaScript string - * @param {String} format (optional) The input format either 'utf8' or 'binary'. - * @param {String} filename (optional) The filename of the encrypted data - */ -AsyncProxy.prototype.encryptMessage = function(keys, text, format, filename) { - var self = this; - - return self.execute(function() { - if (!keys.length) { - keys = [keys]; - } - keys = keys.map(function(key) { - return key.toPacketlist(); - }); - self.worker.postMessage({ - event: 'encrypt-message', - keys: keys, - text: text, - format: format, - filename: filename - }); - }); -}; - -/** - * Signs message text and encrypts it - * @param {(Array|module:key~Key)} publicKeys array of keys or single key, used to encrypt the message - * @param {module:key~Key} privateKey private key with decrypted secret key data for signing - * @param {String} text message as native JavaScript string - * @param {String} format (optional) The input format either 'utf8' or 'binary'. - * @param {String} filename (optional) The filename of the encrypted data - */ -AsyncProxy.prototype.signAndEncryptMessage = function(publicKeys, privateKey, text, format, filename) { - var self = this; - - return self.execute(function() { - if (!publicKeys.length) { - publicKeys = [publicKeys]; - } - publicKeys = publicKeys.map(function(key) { - return key.toPacketlist(); - }); - privateKey = privateKey.toPacketlist(); - self.worker.postMessage({ - event: 'sign-and-encrypt-message', - publicKeys: publicKeys, - privateKey: privateKey, - text: text, - format: format, - filename: filename - }); - }); -}; - -/** - * Decrypts message - * @param {module:key~Key} privateKey private key with decrypted secret key data - * @param {module:message~Message} message the message object with the encrypted data - * @param {String} format (optional) The input format either 'utf8' or 'binary'. - */ -AsyncProxy.prototype.decryptMessage = function(privateKey, message, format) { - var self = this; - - return self.execute(function() { - privateKey = privateKey.toPacketlist(); - self.worker.postMessage({ - event: 'decrypt-message', - privateKey: privateKey, - message: message, - format: format - }); - }); -}; - -/** - * Decrypts message and verifies signatures - * @param {module:key~Key} privateKey private key with decrypted secret key data - * @param {(Array|module:key~Key)} publicKeys array of keys or single key to verify signatures - * @param {module:message~Message} message the message object with signed and encrypted data - * @param {String} format (optional) The input format either 'utf8' or 'binary'. - */ -AsyncProxy.prototype.decryptAndVerifyMessage = function(privateKey, publicKeys, message, format) { - var self = this; - - var promise = new Promise(function(resolve, reject) { - privateKey = privateKey.toPacketlist(); - if (!publicKeys.length) { - publicKeys = [publicKeys]; - } - publicKeys = publicKeys.map(function(key) { - return key.toPacketlist(); - }); - self.worker.postMessage({ - event: 'decrypt-and-verify-message', - privateKey: privateKey, - publicKeys: publicKeys, - message: message, - format: format - }); - - self.tasks.push({ resolve:function(data) { - data.signatures = data.signatures.map(function(sig) { - sig.keyid = type_keyid.fromClone(sig.keyid); - return sig; - }); - resolve(data); - }, reject:reject }); - }); - - return promise; -}; - -/** - * Signs a cleartext message - * @param {(Array|module:key~Key)} privateKeys array of keys or single key, with decrypted secret key data to sign cleartext - * @param {String} text cleartext - */ -AsyncProxy.prototype.signClearMessage = function(privateKeys, text) { - var self = this; - - return self.execute(function() { - if (!privateKeys.length) { - privateKeys = [privateKeys]; - } - privateKeys = privateKeys.map(function(key) { - return key.toPacketlist(); - }); - self.worker.postMessage({ - event: 'sign-clear-message', - privateKeys: privateKeys, - text: text - }); - }); -}; - -/** - * Verifies signatures of cleartext signed message - * @param {(Array|module:key~Key)} publicKeys array of keys or single key, to verify signatures - * @param {module:cleartext~CleartextMessage} message cleartext message object with signatures - */ -AsyncProxy.prototype.verifyClearSignedMessage = function(publicKeys, message) { - var self = this; - - var promise = new Promise(function(resolve, reject) { - if (!publicKeys.length) { - publicKeys = [publicKeys]; - } - publicKeys = publicKeys.map(function(key) { - return key.toPacketlist(); - }); - self.worker.postMessage({ - event: 'verify-clear-signed-message', - publicKeys: publicKeys, - message: message - }); - - self.tasks.push({ resolve:function(data) { - data.signatures = data.signatures.map(function(sig) { - sig.keyid = type_keyid.fromClone(sig.keyid); - return sig; - }); - resolve(data); - }, reject:reject }); - }); - - return promise; -}; - -/** - * Generates a new OpenPGP key pair. Currently only supports RSA keys. - * Primary and subkey will be of same type. - * @param {module:enums.publicKey} keyType to indicate what type of key to make. - * RSA is 1. See {@link http://tools.ietf.org/html/rfc4880#section-9.1} - * @param {Integer} numBits number of bits for the key creation. (should be 1024+, generally) - * @param {String} userId assumes already in form of "User Name " - * @param {String} passphrase The passphrase used to encrypt the resulting private key - */ -AsyncProxy.prototype.generateKeyPair = function(options) { - var self = this; - - var promise = new Promise(function(resolve, reject) { - self.worker.postMessage({ - event: 'generate-key-pair', - options: options - }); - - self.tasks.push({ resolve:function(data) { - var packetlist = packet.List.fromStructuredClone(data.key); - data.key = new key.Key(packetlist); - resolve(data); - }, reject:reject }); - }); - - return promise; -}; - -/** - * Decrypts secret part of all secret key packets of key. - * @param {module:key~Key} privateKey private key with encrypted secret key data - * @param {String} password password to unlock the key - */ -AsyncProxy.prototype.decryptKey = function(privateKey, password) { - var self = this; - - var promise = new Promise(function(resolve, reject) { - privateKey = privateKey.toPacketlist(); - self.worker.postMessage({ - event: 'decrypt-key', - privateKey: privateKey, - password: password - }); - - self.tasks.push({ resolve:function(data) { - var packetlist = packet.List.fromStructuredClone(data), - data = new key.Key(packetlist); - resolve(data); - }, reject:reject }); - }); - - return promise; -}; - -/** - * Decrypts secret part of key packets matching array of keyids. - * @param {module:key~Key} privateKey private key with encrypted secret key data - * @param {Array} keyIds - * @param {String} password password to unlock the key - */ -AsyncProxy.prototype.decryptKeyPacket = function(privateKey, keyIds, password) { - var self = this; - - var promise = new Promise(function(resolve, reject) { - privateKey = privateKey.toPacketlist(); - self.worker.postMessage({ - event: 'decrypt-key-packet', - privateKey: privateKey, - keyIds: keyIds, - password: password - }); - - self.tasks.push({ resolve:function(data) { - var packetlist = packet.List.fromStructuredClone(data), - data = new key.Key(packetlist); - resolve(data); - }, reject:reject }); - }); - - return promise; -}; - -module.exports = AsyncProxy; - -},{"../crypto":32,"../key.js":47,"../packet":55,"../type/keyid.js":73}]},{},[46])(46) -}); \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/debian/missing-sources/openpgp-2.6.2.js roundcube-1.3.6+dfsg.1/debian/missing-sources/openpgp-2.6.2.js --- roundcube-1.3.3+dfsg.1/debian/missing-sources/openpgp-2.6.2.js 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/missing-sources/openpgp-2.6.2.js 2018-04-14 18:52:38.000000000 +0000 @@ -0,0 +1,2 @@ +/*! OpenPGP.js v2.6.2 - 2018-01-21 - this is LGPL licensed code, see LICENSE/our website http://openpgpjs.org/ for more information. */ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).openpgp=e()}}(function(){return function e(t,r,n){function i(a,o){if(!r[a]){if(!t[a]){var u="function"==typeof require&&require;if(!o&&u)return u(a,!0);if(s)return s(a,!0);var f=new Error("Cannot find module '"+a+"'");throw f.code="MODULE_NOT_FOUND",f}var h=r[a]={exports:{}};t[a][0].call(h.exports,function(e){var r=t[a][1][e];return i(r||e)},h,h.exports,e,t,r,n)}return r[a].exports}for(var s="function"==typeof require&&require,a=0;a=r)throw new Error("Malformed string, low surrogate expected at position "+i);a=(55296^a)<<10|65536|56320^e.charCodeAt(i)}else if(!t&&a>>>8)throw new Error("Wide characters are not allowed.");!t||a<=127?n[s++]=a:a<=2047?(n[s++]=192|a>>6,n[s++]=128|63&a):a<=65535?(n[s++]=224|a>>12,n[s++]=128|a>>6&63,n[s++]=128|63&a):(n[s++]=240|a>>18,n[s++]=128|a>>12&63,n[s++]=128|a>>6&63,n[s++]=128|63&a)}return n.subarray(0,s)}function o(e){return btoa(function(e,t){t=!!t;for(var r=e.length,n=new Array(r),i=0,s=0;i=192&&a<224&&i+1=224&&a<240&&i+2=240&&a<248&&i+3>10,n[s++]=56320|1023&o)}}for(var u="",i=0;i>2,r.getUint32(0),r.getUint32(4),r.getUint32(8),r.getUint32(12),t>16?r.getUint32(16):0,t>16?r.getUint32(20):0,t>24?r.getUint32(24):0,t>24?r.getUint32(28):0),this.key=e}else if(!this.key)throw new Error("key is required")}.call(this,e.key),this.hasOwnProperty("iv")&&y.call(this,e.iv),this.hasOwnProperty("padding")&&function(e){this.padding=void 0===e||!!e}.call(this,e.padding),this}function m(e){if(f(e)&&(e=a(e)),h(e)&&(e=new Uint8Array(e)),!l(e))throw new TypeError("data isn't of expected type");for(var t=this.asm,r=this.heap,n=D.ENC[this.mode],i=D.HEAP_DATA,s=this.pos,o=this.len,u=0,c=e.length||0,p=0,y=o+c&-16,g=0,m=new Uint8Array(y);c>0;)o+=g=d(r,s+o,e,u,c),u+=g,c-=g,(g=t.cipher(n,i+s,o))&&m.set(r.subarray(s,s+g),p),p+=g,g0;)o+=m=d(r,s+o,e,u,c),u+=m,c-=m,(m=t.cipher(n,i+s,o-(c?0:g)))&&v.set(r.subarray(s,s+m),p),p+=m,m0){if(h%16){if(this.hasOwnProperty("padding"))throw new i("data length must be a multiple of the block size");h+=16-h%16}if(n.cipher(o,u+f,h),this.hasOwnProperty("padding")&&this.padding){var c=a[f+l-1];if(c<1||c>16||c>l)throw new s("bad padding");for(var d=0,p=c;p>1;p--)d|=c^a[f+l-p];if(d)throw new s("bad padding");l-=c}}var y=new Uint8Array(r+l);return r>0&&y.set(t),l>0&&y.set(a.subarray(f,f+l),r),this.result=y,this.pos=0,this.len=0,this}function k(e){this.iv=null,p.call(this,e),this.mode="CFB"}function A(e){k.call(this,e)}function _(e){k.call(this,e)}function E(e){this.nonce=null,this.counter=0,this.counterSize=0,p.call(this,e),this.mode="CTR"}function S(e){return e=e||{},g.call(this,e),function(e,t,r){if(void 0!==r){if(r<8||r>48)throw new i("illegal counter size");this.counterSize=r;var n=Math.pow(2,r)-1;this.asm.set_mask(0,0,n/4294967296|0,0|n)}else this.counterSize=r=48,this.asm.set_mask(0,0,65535,4294967295);if(void 0===e)throw new Error("nonce is required");if(h(e)||l(e))e=new Uint8Array(e);else{if(!f(e))throw new TypeError("unexpected nonce type");e=a(e)}var s=e.length;if(!s||s>16)throw new i("illegal nonce size");this.nonce=e;var o=new DataView(new ArrayBuffer(16));if(new Uint8Array(o.buffer).set(e),this.asm.set_nonce(o.getUint32(0),o.getUint32(4),o.getUint32(8),o.getUint32(12)),void 0!==t){if(!u(t))throw new TypeError("unexpected counter type");if(t<0||t>=Math.pow(2,r))throw new i("illegal counter value");this.counter=t,this.asm.set_counter(0,0,t/4294967296|0,0|t)}else this.counter=t=0}.call(this,e.nonce,e.counter,e.counterSize),this}function U(e){for(var t=this.heap,r=this.asm,n=0,i=e.length||0,s=0;i>0;){for(n+=s=d(t,0,e,n,i),i-=s;15&s;)t[s++]=0;r.mac(D.MAC.GCM,D.HEAP_DATA,s)}}function K(e){this.nonce=null,this.adata=null,this.iv=null,this.counter=1,this.tagSize=16,p.call(this,e),this.mode="GCM"}function P(e){K.call(this,e)}function j(e){K.call(this,e)}function x(e){g.call(this,e=e||{});var t=this.asm,r=this.heap;t.gcm_init();var n=e.tagSize;if(void 0!==n){if(!u(n))throw new TypeError("tagSize must be a number");if(n<4||n>16)throw new i("illegal tagSize value");this.tagSize=n}else this.tagSize=16;var s=e.nonce;if(void 0===s)throw new Error("nonce is required");if(l(s)||h(s))s=new Uint8Array(s);else{if(!f(s))throw new TypeError("unexpected nonce type");s=a(s)}this.nonce=s;var o=s.length||0,c=new Uint8Array(16);12!==o?(U.call(this,s),r[0]=r[1]=r[2]=r[3]=r[4]=r[5]=r[6]=r[7]=r[8]=r[9]=r[10]=0,r[11]=o>>>29,r[12]=o>>>21&255,r[13]=o>>>13&255,r[14]=o>>>5&255,r[15]=o<<3&255,t.mac(D.MAC.GCM,D.HEAP_DATA,16),t.get_iv(D.HEAP_DATA),t.set_iv(),c.set(r.subarray(0,16))):(c.set(s),c[15]=1);var d=new DataView(c.buffer);this.gamma0=d.getUint32(12),t.set_nonce(d.getUint32(0),d.getUint32(4),d.getUint32(8),0),t.set_mask(0,0,0,4294967295);var p=e.adata;if(void 0!==p&&null!==p){if(l(p)||h(p))p=new Uint8Array(p);else{if(!f(p))throw new TypeError("unexpected adata type");p=a(p)}if(p.length>z)throw new i("illegal adata length");p.length?(this.adata=p,U.call(this,p)):this.adata=null}else this.adata=null;var m=e.counter;if(void 0!==m){if(!u(m))throw new TypeError("counter must be a number");if(m<1||m>4294967295)throw new RangeError("counter must be a positive 32-bit integer");this.counter=m,t.set_counter(0,0,0,this.gamma0+m|0)}else this.counter=1,t.set_counter(0,0,0,this.gamma0+1|0);var v=e.iv;if(void 0!==v){if(!u(m))throw new TypeError("counter must be a number");this.iv=v,y.call(this,v)}return this}function T(e){if(f(e)&&(e=a(e)),h(e)&&(e=new Uint8Array(e)),!l(e))throw new TypeError("data isn't of expected type");var t=0,r=e.length||0,n=this.asm,i=this.heap,s=this.counter,o=this.pos,u=this.len,c=0,p=u+r&-16,y=0;if((s-1<<4)+u+r>z)throw new RangeError("counter overflow");for(var g=new Uint8Array(p);r>0;)u+=y=d(i,o+u,e,t,r),t+=y,r-=y,y=n.cipher(D.ENC.CTR,D.HEAP_DATA+o,u),(y=n.mac(D.MAC.GCM,D.HEAP_DATA+o,y))&&g.set(i.subarray(o,o+y),c),s+=y>>>4,c+=y,y>>29,t[4]=f>>>21,t[5]=f>>>13&255,t[6]=f>>>5&255,t[7]=f<<3&255,t[8]=t[9]=t[10]=0,t[11]=h>>>29,t[12]=h>>>21&255,t[13]=h>>>13&255,t[14]=h>>>5&255,t[15]=h<<3&255,e.mac(D.MAC.GCM,D.HEAP_DATA,16),e.get_iv(D.HEAP_DATA),e.set_counter(0,0,0,this.gamma0),e.cipher(D.ENC.CTR,D.HEAP_DATA,16),o.set(t.subarray(0,n),a),this.result=o,this.counter=1,this.pos=0,this.len=0,this}function C(e){if(f(e)&&(e=a(e)),h(e)&&(e=new Uint8Array(e)),!l(e))throw new TypeError("data isn't of expected type");var t=0,r=e.length||0,n=this.asm,i=this.heap,s=this.counter,o=this.tagSize,u=this.pos,c=this.len,p=0,y=c+r>o?c+r-o&-16:0,g=c+r-y,m=0;if((s-1<<4)+c+r>z)throw new RangeError("counter overflow");for(var v=new Uint8Array(y);r>g;)c+=m=d(i,u+c,e,t,r-g),t+=m,r-=m,m=n.mac(D.MAC.GCM,D.HEAP_DATA+u,m),(m=n.cipher(D.DEC.CTR,D.HEAP_DATA+u,m))&&v.set(i.subarray(u,u+m),p),s+=m>>>4,p+=m,u=0,c=0;return r>0&&(c+=d(i,0,e,t,r)),this.result=v,this.counter=s,this.pos=u,this.len=c,this}function I(){var e=this.asm,t=this.heap,r=this.tagSize,i=this.adata,a=this.counter,o=this.pos,u=this.len,f=u-r;if(u>>29,t[4]=d>>>21,t[5]=d>>>13&255,t[6]=d>>>5&255,t[7]=d<<3&255,t[8]=t[9]=t[10]=0,t[11]=p>>>29,t[12]=p>>>21&255,t[13]=p>>>13&255,t[14]=p>>>5&255,t[15]=p<<3&255,e.mac(D.MAC.GCM,D.HEAP_DATA,16),e.get_iv(D.HEAP_DATA),e.set_counter(0,0,0,this.gamma0),e.cipher(D.ENC.CTR,D.HEAP_DATA,16);for(var y=0,c=0;c>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x428a2f98|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=t+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x71374491|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=r+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xb5c0fbcf|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=l+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xe9b5dba5|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=c+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x3956c25b|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=d+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x59f111f1|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=p+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x923f82a4|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=y+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xab1c5ed5|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=g+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xd807aa98|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=m+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x12835b01|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=v+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x243185be|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=w+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x550c7dc3|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=b+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x72be5d74|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=k+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x80deb1fe|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=A+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x9bdc06a7|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;O=_+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xc19bf174|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;e=O=(t>>>7^t>>>18^t>>>3^t<<25^t<<14)+(A>>>17^A>>>19^A>>>10^A<<15^A<<13)+e+m|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xe49b69c1|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;t=O=(r>>>7^r>>>18^r>>>3^r<<25^r<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+t+v|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xefbe4786|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;r=O=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+r+w|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x0fc19dc6|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;l=O=(c>>>7^c>>>18^c>>>3^c<<25^c<<14)+(t>>>17^t>>>19^t>>>10^t<<15^t<<13)+l+b|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x240ca1cc|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;c=O=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(r>>>17^r>>>19^r>>>10^r<<15^r<<13)+c+k|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x2de92c6f|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;d=O=(p>>>7^p>>>18^p>>>3^p<<25^p<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+d+A|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x4a7484aa|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;p=O=(y>>>7^y>>>18^y>>>3^y<<25^y<<14)+(c>>>17^c>>>19^c>>>10^c<<15^c<<13)+p+_|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x5cb0a9dc|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;y=O=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+y+e|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x76f988da|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;g=O=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(p>>>17^p>>>19^p>>>10^p<<15^p<<13)+g+t|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x983e5152|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;m=O=(v>>>7^v>>>18^v>>>3^v<<25^v<<14)+(y>>>17^y>>>19^y>>>10^y<<15^y<<13)+m+r|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xa831c66d|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;v=O=(w>>>7^w>>>18^w>>>3^w<<25^w<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+v+l|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xb00327c8|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;w=O=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+w+c|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xbf597fc7|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;b=O=(k>>>7^k>>>18^k>>>3^k<<25^k<<14)+(v>>>17^v>>>19^v>>>10^v<<15^v<<13)+b+d|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xc6e00bf3|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;k=O=(A>>>7^A>>>18^A>>>3^A<<25^A<<14)+(w>>>17^w>>>19^w>>>10^w<<15^w<<13)+k+p|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xd5a79147|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;A=O=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+A+y|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x06ca6351|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;_=O=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(k>>>17^k>>>19^k>>>10^k<<15^k<<13)+_+g|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x14292967|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;e=O=(t>>>7^t>>>18^t>>>3^t<<25^t<<14)+(A>>>17^A>>>19^A>>>10^A<<15^A<<13)+e+m|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x27b70a85|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;t=O=(r>>>7^r>>>18^r>>>3^r<<25^r<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+t+v|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x2e1b2138|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;r=O=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+r+w|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x4d2c6dfc|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;l=O=(c>>>7^c>>>18^c>>>3^c<<25^c<<14)+(t>>>17^t>>>19^t>>>10^t<<15^t<<13)+l+b|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x53380d13|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;c=O=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(r>>>17^r>>>19^r>>>10^r<<15^r<<13)+c+k|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x650a7354|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;d=O=(p>>>7^p>>>18^p>>>3^p<<25^p<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+d+A|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x766a0abb|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;p=O=(y>>>7^y>>>18^y>>>3^y<<25^y<<14)+(c>>>17^c>>>19^c>>>10^c<<15^c<<13)+p+_|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x81c2c92e|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;y=O=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+y+e|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x92722c85|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;g=O=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(p>>>17^p>>>19^p>>>10^p<<15^p<<13)+g+t|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xa2bfe8a1|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;m=O=(v>>>7^v>>>18^v>>>3^v<<25^v<<14)+(y>>>17^y>>>19^y>>>10^y<<15^y<<13)+m+r|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xa81a664b|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;v=O=(w>>>7^w>>>18^w>>>3^w<<25^w<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+v+l|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xc24b8b70|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;w=O=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+w+c|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xc76c51a3|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;b=O=(k>>>7^k>>>18^k>>>3^k<<25^k<<14)+(v>>>17^v>>>19^v>>>10^v<<15^v<<13)+b+d|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xd192e819|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;k=O=(A>>>7^A>>>18^A>>>3^A<<25^A<<14)+(w>>>17^w>>>19^w>>>10^w<<15^w<<13)+k+p|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xd6990624|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;A=O=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+A+y|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xf40e3585|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;_=O=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(k>>>17^k>>>19^k>>>10^k<<15^k<<13)+_+g|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x106aa070|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;e=O=(t>>>7^t>>>18^t>>>3^t<<25^t<<14)+(A>>>17^A>>>19^A>>>10^A<<15^A<<13)+e+m|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x19a4c116|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;t=O=(r>>>7^r>>>18^r>>>3^r<<25^r<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+t+v|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x1e376c08|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;r=O=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+r+w|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x2748774c|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;l=O=(c>>>7^c>>>18^c>>>3^c<<25^c<<14)+(t>>>17^t>>>19^t>>>10^t<<15^t<<13)+l+b|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x34b0bcb5|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;c=O=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(r>>>17^r>>>19^r>>>10^r<<15^r<<13)+c+k|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x391c0cb3|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;d=O=(p>>>7^p>>>18^p>>>3^p<<25^p<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+d+A|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x4ed8aa4a|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;p=O=(y>>>7^y>>>18^y>>>3^y<<25^y<<14)+(c>>>17^c>>>19^c>>>10^c<<15^c<<13)+p+_|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x5b9cca4f|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;y=O=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+y+e|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x682e6ff3|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;g=O=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(p>>>17^p>>>19^p>>>10^p<<15^p<<13)+g+t|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x748f82ee|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;m=O=(v>>>7^v>>>18^v>>>3^v<<25^v<<14)+(y>>>17^y>>>19^y>>>10^y<<15^y<<13)+m+r|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x78a5636f|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;v=O=(w>>>7^w>>>18^w>>>3^w<<25^w<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+v+l|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x84c87814|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;w=O=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+w+c|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x8cc70208|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;b=O=(k>>>7^k>>>18^k>>>3^k<<25^k<<14)+(v>>>17^v>>>19^v>>>10^v<<15^v<<13)+b+d|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0x90befffa|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;k=O=(A>>>7^A>>>18^A>>>3^A<<25^A<<14)+(w>>>17^w>>>19^w>>>10^w<<15^w<<13)+k+p|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xa4506ceb|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;A=O=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+A+y|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xbef9a3f7|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;_=O=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(k>>>17^k>>>19^k>>>10^k<<15^k<<13)+_+g|0;O=O+T+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(x^P&(j^x))+0xc67178f2|0;T=x;x=j;j=P;P=K+O|0;K=U;U=S;S=E;E=O+(S&U^K&(S^U))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;n=n+E|0;i=i+S|0;s=s+U|0;a=a+K|0;o=o+P|0;u=u+j|0;f=f+x|0;h=h+T|0}function T(e){e=e|0;x(j[e|0]<<24|j[e|1]<<16|j[e|2]<<8|j[e|3],j[e|4]<<24|j[e|5]<<16|j[e|6]<<8|j[e|7],j[e|8]<<24|j[e|9]<<16|j[e|10]<<8|j[e|11],j[e|12]<<24|j[e|13]<<16|j[e|14]<<8|j[e|15],j[e|16]<<24|j[e|17]<<16|j[e|18]<<8|j[e|19],j[e|20]<<24|j[e|21]<<16|j[e|22]<<8|j[e|23],j[e|24]<<24|j[e|25]<<16|j[e|26]<<8|j[e|27],j[e|28]<<24|j[e|29]<<16|j[e|30]<<8|j[e|31],j[e|32]<<24|j[e|33]<<16|j[e|34]<<8|j[e|35],j[e|36]<<24|j[e|37]<<16|j[e|38]<<8|j[e|39],j[e|40]<<24|j[e|41]<<16|j[e|42]<<8|j[e|43],j[e|44]<<24|j[e|45]<<16|j[e|46]<<8|j[e|47],j[e|48]<<24|j[e|49]<<16|j[e|50]<<8|j[e|51],j[e|52]<<24|j[e|53]<<16|j[e|54]<<8|j[e|55],j[e|56]<<24|j[e|57]<<16|j[e|58]<<8|j[e|59],j[e|60]<<24|j[e|61]<<16|j[e|62]<<8|j[e|63])}function O(e){e=e|0;j[e|0]=n>>>24;j[e|1]=n>>>16&255;j[e|2]=n>>>8&255;j[e|3]=n&255;j[e|4]=i>>>24;j[e|5]=i>>>16&255;j[e|6]=i>>>8&255;j[e|7]=i&255;j[e|8]=s>>>24;j[e|9]=s>>>16&255;j[e|10]=s>>>8&255;j[e|11]=s&255;j[e|12]=a>>>24;j[e|13]=a>>>16&255;j[e|14]=a>>>8&255;j[e|15]=a&255;j[e|16]=o>>>24;j[e|17]=o>>>16&255;j[e|18]=o>>>8&255;j[e|19]=o&255;j[e|20]=u>>>24;j[e|21]=u>>>16&255;j[e|22]=u>>>8&255;j[e|23]=u&255;j[e|24]=f>>>24;j[e|25]=f>>>16&255;j[e|26]=f>>>8&255;j[e|27]=f&255;j[e|28]=h>>>24;j[e|29]=h>>>16&255;j[e|30]=h>>>8&255;j[e|31]=h&255}function C(){n=0x6a09e667;i=0xbb67ae85;s=0x3c6ef372;a=0xa54ff53a;o=0x510e527f;u=0x9b05688c;f=0x1f83d9ab;h=0x5be0cd19;l=c=0}function I(e,t,r,d,p,y,g,m,v,w){e=e|0;t=t|0;r=r|0;d=d|0;p=p|0;y=y|0;g=g|0;m=m|0;v=v|0;w=w|0;n=e;i=t;s=r;a=d;o=p;u=y;f=g;h=m;l=v;c=w}function M(e,t){e=e|0;t=t|0;var r=0;if(e&63)return-1;while((t|0)>=64){T(e);e=e+64|0;t=t-64|0;r=r+64|0}l=l+r|0;if(l>>>0>>0)c=c+1|0;return r|0}function B(e,t,r){e=e|0;t=t|0;r=r|0;var n=0,i=0;if(e&63)return-1;if(~r)if(r&31)return-1;if((t|0)>=64){n=M(e,t)|0;if((n|0)==-1)return-1;e=e+n|0;t=t-n|0}n=n+t|0;l=l+t|0;if(l>>>0>>0)c=c+1|0;j[e|t]=0x80;if((t|0)>=56){for(i=t+1|0;(i|0)<64;i=i+1|0)j[e|i]=0x00;T(e);t=0;j[e|0]=0}for(i=t+1|0;(i|0)<59;i=i+1|0)j[e|i]=0;j[e|56]=c>>>21&255;j[e|57]=c>>>13&255;j[e|58]=c>>>5&255;j[e|59]=c<<3&255|l>>>29;j[e|60]=l>>>21&255;j[e|61]=l>>>13&255;j[e|62]=l>>>5&255;j[e|63]=l<<3&255;T(e);if(~r)O(r);return n|0}function D(){n=d;i=p;s=y;a=g;o=m;u=v;f=w;h=b;l=64;c=0}function N(){n=k;i=A;s=_;a=E;o=S;u=U;f=K;h=P;l=64;c=0}function L(e,t,r,j,T,O,I,M,B,D,N,L,R,H,F,z){e=e|0;t=t|0;r=r|0;j=j|0;T=T|0;O=O|0;I=I|0;M=M|0;B=B|0;D=D|0;N=N|0;L=L|0;R=R|0;H=H|0;F=F|0;z=z|0;C();x(e^0x5c5c5c5c,t^0x5c5c5c5c,r^0x5c5c5c5c,j^0x5c5c5c5c,T^0x5c5c5c5c,O^0x5c5c5c5c,I^0x5c5c5c5c,M^0x5c5c5c5c,B^0x5c5c5c5c,D^0x5c5c5c5c,N^0x5c5c5c5c,L^0x5c5c5c5c,R^0x5c5c5c5c,H^0x5c5c5c5c,F^0x5c5c5c5c,z^0x5c5c5c5c);k=n;A=i;_=s;E=a;S=o;U=u;K=f;P=h;C();x(e^0x36363636,t^0x36363636,r^0x36363636,j^0x36363636,T^0x36363636,O^0x36363636,I^0x36363636,M^0x36363636,B^0x36363636,D^0x36363636,N^0x36363636,L^0x36363636,R^0x36363636,H^0x36363636,F^0x36363636,z^0x36363636);d=n;p=i;y=s;g=a;m=o;v=u;w=f;b=h;l=64;c=0}function R(e,t,r){e=e|0;t=t|0;r=r|0;var l=0,c=0,d=0,p=0,y=0,g=0,m=0,v=0,w=0;if(e&63)return-1;if(~r)if(r&31)return-1;w=B(e,t,-1)|0;l=n,c=i,d=s,p=a,y=o,g=u,m=f,v=h;N();x(l,c,d,p,y,g,m,v,0x80000000,0,0,0,0,0,0,768);if(~r)O(r);return w|0}function H(e,t,r,l,c){e=e|0;t=t|0;r=r|0;l=l|0;c=c|0;var d=0,p=0,y=0,g=0,m=0,v=0,w=0,b=0,k=0,A=0,_=0,E=0,S=0,U=0,K=0,P=0;if(e&63)return-1;if(~c)if(c&31)return-1;j[e+t|0]=r>>>24;j[e+t+1|0]=r>>>16&255;j[e+t+2|0]=r>>>8&255;j[e+t+3|0]=r&255;R(e,t+4|0,-1)|0;d=k=n,p=A=i,y=_=s,g=E=a,m=S=o,v=U=u,w=K=f,b=P=h;l=l-1|0;while((l|0)>0){D();x(k,A,_,E,S,U,K,P,0x80000000,0,0,0,0,0,0,768);k=n,A=i,_=s,E=a,S=o,U=u,K=f,P=h;N();x(k,A,_,E,S,U,K,P,0x80000000,0,0,0,0,0,0,768);k=n,A=i,_=s,E=a,S=o,U=u,K=f,P=h;d=d^n;p=p^i;y=y^s;g=g^a;m=m^o;v=v^u;w=w^f;b=b^h;l=l-1|0}n=d;i=p;s=y;a=g;o=m;u=v;f=w;h=b;if(~c)O(c);return 0}return{reset:C,init:I,process:M,finish:B,hmac_reset:D,hmac_init:L,hmac_finish:R,pbkdf2_generate_block:H}}(r,null,this.heap.buffer),this.BLOCK_SIZE=X,this.HASH_SIZE=W,this.reset()}function B(e){if(void 0===e)throw new SyntaxError("data required");return(null===J&&(J=new M({heapSize:1048576})),J).reset().process(e).finish().result}n.prototype=Object.create(Error.prototype,{name:{value:"IllegalStateError"}}),i.prototype=Object.create(Error.prototype,{name:{value:"IllegalArgumentError"}}),s.prototype=Object.create(Error.prototype,{name:{value:"SecurityError"}});r.Float64Array||r.Float32Array;r.IllegalStateError=n,r.IllegalArgumentError=i,r.SecurityError=s;var D=function(){"use strict";function e(e,t){var i=r[(n[e]+n[t])%255];return 0!==e&&0!==t||(i=0),i}function t(){function t(e){var t,i,s;for(i=s=function(e){var t=r[255-n[e]];return 0===e&&(t=0),t}(e),t=0;t<4;t++)s^=i=255&(i<<1|i>>>7);return s^=99}u||function(){r=[],n=[];var e,t,i=1;for(e=0;e<255;e++)r[e]=i,t=128&i,i<<=1,i&=255,128===t&&(i^=27),i^=r[e],n[r[e]]=e;r[255]=r[0],n[0]=0,u=!0}(),i=[],s=[],a=[[],[],[],[]],o=[[],[],[],[]];for(var f=0;f<256;f++){var h=t(f);i[f]=h,s[h]=f,a[0][f]=e(2,h)<<24|h<<16|h<<8|e(3,h),o[0][h]=e(14,f)<<24|e(9,f)<<16|e(13,f)<<8|e(11,f);for(var l=1;l<4;l++)a[l][f]=a[l-1][f]>>>8|a[l-1][f]<<24,o[l][h]=o[l-1][h]>>>8|o[l-1][h]<<24}}var r,n,i,s,a,o,u=!1,f=function(e,r,n){t();var u=new Uint32Array(n);u.set(i,512),u.set(s,768);for(var f=0;f<4;f++)u.set(a[f],4096+1024*f>>2),u.set(o[f],8192+1024*f>>2);var h=function(e,t,r){"use asm";var n=0,i=0,s=0,a=0,o=0,u=0,f=0,h=0,l=0,c=0,d=0,p=0,y=0,g=0,m=0,v=0,w=0,b=0,k=0,A=0,_=0;var E=new e.Uint32Array(r),S=new e.Uint8Array(r);function U(e,t,r,o,u,f,h,l){e=e|0;t=t|0;r=r|0;o=o|0;u=u|0;f=f|0;h=h|0;l=l|0;var c=0,d=0,p=0,y=0,g=0,m=0,v=0,w=0;c=r|0x400,d=r|0x800,p=r|0xc00;u=u^E[(e|0)>>2],f=f^E[(e|4)>>2],h=h^E[(e|8)>>2],l=l^E[(e|12)>>2];for(w=16;(w|0)<=o<<4;w=w+16|0){y=E[(r|u>>22&1020)>>2]^E[(c|f>>14&1020)>>2]^E[(d|h>>6&1020)>>2]^E[(p|l<<2&1020)>>2]^E[(e|w|0)>>2],g=E[(r|f>>22&1020)>>2]^E[(c|h>>14&1020)>>2]^E[(d|l>>6&1020)>>2]^E[(p|u<<2&1020)>>2]^E[(e|w|4)>>2],m=E[(r|h>>22&1020)>>2]^E[(c|l>>14&1020)>>2]^E[(d|u>>6&1020)>>2]^E[(p|f<<2&1020)>>2]^E[(e|w|8)>>2],v=E[(r|l>>22&1020)>>2]^E[(c|u>>14&1020)>>2]^E[(d|f>>6&1020)>>2]^E[(p|h<<2&1020)>>2]^E[(e|w|12)>>2];u=y,f=g,h=m,l=v}n=E[(t|u>>22&1020)>>2]<<24^E[(t|f>>14&1020)>>2]<<16^E[(t|h>>6&1020)>>2]<<8^E[(t|l<<2&1020)>>2]^E[(e|w|0)>>2],i=E[(t|f>>22&1020)>>2]<<24^E[(t|h>>14&1020)>>2]<<16^E[(t|l>>6&1020)>>2]<<8^E[(t|u<<2&1020)>>2]^E[(e|w|4)>>2],s=E[(t|h>>22&1020)>>2]<<24^E[(t|l>>14&1020)>>2]<<16^E[(t|u>>6&1020)>>2]<<8^E[(t|f<<2&1020)>>2]^E[(e|w|8)>>2],a=E[(t|l>>22&1020)>>2]<<24^E[(t|u>>14&1020)>>2]<<16^E[(t|f>>6&1020)>>2]<<8^E[(t|h<<2&1020)>>2]^E[(e|w|12)>>2]}function K(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;U(0x0000,0x0800,0x1000,_,e,t,r,n)}function P(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;var s=0;U(0x0400,0x0c00,0x2000,_,e,n,r,t);s=i,i=a,a=s}function j(e,t,r,l){e=e|0;t=t|0;r=r|0;l=l|0;U(0x0000,0x0800,0x1000,_,o^e,u^t,f^r,h^l);o=n,u=i,f=s,h=a}function x(e,t,r,l){e=e|0;t=t|0;r=r|0;l=l|0;var c=0;U(0x0400,0x0c00,0x2000,_,e,l,r,t);c=i,i=a,a=c;n=n^o,i=i^u,s=s^f,a=a^h;o=e,u=t,f=r,h=l}function T(e,t,r,l){e=e|0;t=t|0;r=r|0;l=l|0;U(0x0000,0x0800,0x1000,_,o,u,f,h);o=n=n^e,u=i=i^t,f=s=s^r,h=a=a^l}function O(e,t,r,l){e=e|0;t=t|0;r=r|0;l=l|0;U(0x0000,0x0800,0x1000,_,o,u,f,h);n=n^e,i=i^t,s=s^r,a=a^l;o=e,u=t,f=r,h=l}function C(e,t,r,l){e=e|0;t=t|0;r=r|0;l=l|0;U(0x0000,0x0800,0x1000,_,o,u,f,h);o=n,u=i,f=s,h=a;n=n^e,i=i^t,s=s^r,a=a^l}function I(e,t,r,o){e=e|0;t=t|0;r=r|0;o=o|0;U(0x0000,0x0800,0x1000,_,l,c,d,p);p=~v&p|v&p+1,d=~m&d|m&d+((p|0)==0),c=~g&c|g&c+((d|0)==0),l=~y&l|y&l+((c|0)==0);n=n^e,i=i^t,s=s^r,a=a^o}function M(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;var i=0,s=0,a=0,l=0,c=0,d=0,p=0,y=0,g=0,m=0;e=e^o,t=t^u,r=r^f,n=n^h;i=w|0,s=b|0,a=k|0,l=A|0;for(;(g|0)<128;g=g+1|0){if(i>>>31){c=c^e,d=d^t,p=p^r,y=y^n}i=i<<1|s>>>31,s=s<<1|a>>>31,a=a<<1|l>>>31,l=l<<1;m=n&1;n=n>>>1|r<<31,r=r>>>1|t<<31,t=t>>>1|e<<31,e=e>>>1;if(m)e=e^0xe1000000}o=c,u=d,f=p,h=y}function B(e){e=e|0;_=e}function D(e,t,r,o){e=e|0;t=t|0;r=r|0;o=o|0;n=e,i=t,s=r,a=o}function N(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;o=e,u=t,f=r,h=n}function L(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;l=e,c=t,d=r,p=n}function R(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;y=e,g=t,m=r,v=n}function H(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;p=~v&p|v&n,d=~m&d|m&r,c=~g&c|g&t,l=~y&l|y&e}function F(e){e=e|0;if(e&15)return-1;S[e|0]=n>>>24,S[e|1]=n>>>16&255,S[e|2]=n>>>8&255,S[e|3]=n&255,S[e|4]=i>>>24,S[e|5]=i>>>16&255,S[e|6]=i>>>8&255,S[e|7]=i&255,S[e|8]=s>>>24,S[e|9]=s>>>16&255,S[e|10]=s>>>8&255,S[e|11]=s&255,S[e|12]=a>>>24,S[e|13]=a>>>16&255,S[e|14]=a>>>8&255,S[e|15]=a&255;return 16}function z(e){e=e|0;if(e&15)return-1;S[e|0]=o>>>24,S[e|1]=o>>>16&255,S[e|2]=o>>>8&255,S[e|3]=o&255,S[e|4]=u>>>24,S[e|5]=u>>>16&255,S[e|6]=u>>>8&255,S[e|7]=u&255,S[e|8]=f>>>24,S[e|9]=f>>>16&255,S[e|10]=f>>>8&255,S[e|11]=f&255,S[e|12]=h>>>24,S[e|13]=h>>>16&255,S[e|14]=h>>>8&255,S[e|15]=h&255;return 16}function q(){K(0,0,0,0);w=n,b=i,k=s,A=a}function G(e,t,r){e=e|0;t=t|0;r=r|0;var o=0;if(t&15)return-1;while((r|0)>=16){Z[e&7](S[t|0]<<24|S[t|1]<<16|S[t|2]<<8|S[t|3],S[t|4]<<24|S[t|5]<<16|S[t|6]<<8|S[t|7],S[t|8]<<24|S[t|9]<<16|S[t|10]<<8|S[t|11],S[t|12]<<24|S[t|13]<<16|S[t|14]<<8|S[t|15]);S[t|0]=n>>>24,S[t|1]=n>>>16&255,S[t|2]=n>>>8&255,S[t|3]=n&255,S[t|4]=i>>>24,S[t|5]=i>>>16&255,S[t|6]=i>>>8&255,S[t|7]=i&255,S[t|8]=s>>>24,S[t|9]=s>>>16&255,S[t|10]=s>>>8&255,S[t|11]=s&255,S[t|12]=a>>>24,S[t|13]=a>>>16&255,S[t|14]=a>>>8&255,S[t|15]=a&255;o=o+16|0,t=t+16|0,r=r-16|0}return o|0}function V(e,t,r){e=e|0;t=t|0;r=r|0;var n=0;if(t&15)return-1;while((r|0)>=16){Y[e&1](S[t|0]<<24|S[t|1]<<16|S[t|2]<<8|S[t|3],S[t|4]<<24|S[t|5]<<16|S[t|6]<<8|S[t|7],S[t|8]<<24|S[t|9]<<16|S[t|10]<<8|S[t|11],S[t|12]<<24|S[t|13]<<16|S[t|14]<<8|S[t|15]);n=n+16|0,t=t+16|0,r=r-16|0}return n|0}var Z=[K,P,j,x,T,O,C,I];var Y=[j,M];return{set_rounds:B,set_state:D,set_iv:N,set_nonce:L,set_mask:R,set_counter:H,get_state:F,get_iv:z,gcm_init:q,cipher:G,mac:V}}(e,r,n);return h.set_key=function(e,t,r,n,s,a,f,l,c){var d=u.subarray(0,60),p=u.subarray(256,316);d.set([t,r,n,s,a,f,l,c]);for(var y=e,g=1;y<4*e+28;y++)w=d[y-1],(y%e==0||8===e&&y%e==4)&&(w=i[w>>>24]<<24^i[w>>>16&255]<<16^i[w>>>8&255]<<8^i[255&w]),y%e==0&&(w=w<<8^w>>>24^g<<24,g=g<<1^(128&g?27:0)),d[y]=d[y-e]^w;for(var m=0;m=y-4?w:o[0][i[w>>>24]]^o[1][i[w>>>16&255]]^o[2][i[w>>>8&255]]^o[3][i[255&w]]}h.set_rounds(e+5)},h};return f.ENC={ECB:0,CBC:2,CFB:4,OFB:6,CTR:7},f.DEC={ECB:1,CBC:3,CFB:5,OFB:6,CTR:7},f.MAC={CBC:0,GCM:1},f.HEAP_DATA=16384,f}(),N=k.prototype;N.BLOCK_SIZE=16,N.reset=g,N.encrypt=v,N.decrypt=b;var L=A.prototype;L.BLOCK_SIZE=16,L.reset=g,L.process=m,L.finish=v;var R=_.prototype;R.BLOCK_SIZE=16,R.reset=g,R.process=w,R.finish=b;var H=E.prototype;H.BLOCK_SIZE=16,H.reset=S,H.encrypt=v,H.decrypt=v;var F=function(e){E.call(this,e)}.prototype;F.BLOCK_SIZE=16,F.reset=S,F.process=m,F.finish=v;var z=68719476704,q=K.prototype;q.BLOCK_SIZE=16,q.reset=x,q.encrypt=function(e){var t=T.call(this,e).result,r=O.call(this).result,n=new Uint8Array(t.length+r.length);return t.length&&n.set(t),r.length&&n.set(r,t.length),this.result=n,this},q.decrypt=function(e){var t=C.call(this,e).result,r=I.call(this).result,n=new Uint8Array(t.length+r.length);return t.length&&n.set(t),r.length&&n.set(r,t.length),this.result=n,this};var G=P.prototype;G.BLOCK_SIZE=16,G.reset=x,G.process=T,G.finish=O;var V=j.prototype;V.BLOCK_SIZE=16,V.reset=x,V.process=C,V.finish=I;var Z=new Uint8Array(1048576),Y=D(r,null,Z.buffer);e.AES_CFB=k,e.AES_CFB.encrypt=function(e,t,r){if(void 0===e)throw new SyntaxError("data required");if(void 0===t)throw new SyntaxError("key required");return new k({heap:Z,asm:Y,key:t,iv:r}).encrypt(e).result},e.AES_CFB.decrypt=function(e,t,r){if(void 0===e)throw new SyntaxError("data required");if(void 0===t)throw new SyntaxError("key required");return new k({heap:Z,asm:Y,key:t,iv:r}).decrypt(e).result},e.AES_CFB.Encrypt=A,e.AES_CFB.Decrypt=_,e.AES_GCM=K,e.AES_GCM.encrypt=function(e,t,r,n,i){if(void 0===e)throw new SyntaxError("data required");if(void 0===t)throw new SyntaxError("key required");if(void 0===r)throw new SyntaxError("nonce required");return new K({heap:Z,asm:Y,key:t,nonce:r,adata:n,tagSize:i}).encrypt(e).result},e.AES_GCM.decrypt=function(e,t,r,n,i){if(void 0===e)throw new SyntaxError("data required");if(void 0===t)throw new SyntaxError("key required");if(void 0===r)throw new SyntaxError("nonce required");return new K({heap:Z,asm:Y,key:t,nonce:r,adata:n,tagSize:i}).decrypt(e).result},e.AES_GCM.Encrypt=P,e.AES_GCM.Decrypt=j;var X=64,W=32;M.BLOCK_SIZE=X,M.HASH_SIZE=W;var $=M.prototype;$.reset=function(){return this.result=null,this.pos=0,this.len=0,this.asm.reset(),this},$.process=function(e){if(null!==this.result)throw new n("state must be reset before processing new data");if(f(e)&&(e=a(e)),h(e)&&(e=new Uint8Array(e)),!l(e))throw new TypeError("data isn't of expected type");for(var t=this.asm,r=this.heap,i=this.pos,s=this.len,o=0,u=e.length,c=0;u>0;)s+=c=d(r,i+s,e,o,u),o+=c,u-=c,i+=c=t.process(i,s),(s-=c)||(i=0);return this.pos=i,this.len=s,this},$.finish=function(){if(null!==this.result)throw new n("state must be reset before processing new data");return this.asm.finish(this.pos,this.len,0),this.result=new Uint8Array(this.HASH_SIZE),this.result.set(this.heap.subarray(0,this.HASH_SIZE)),this.pos=0,this.len=0,this};var J=null;M.bytes=B,M.hex=function(e){return function(e){for(var t="",r=0;r1)for(var r=1;r0;e+=1);return e},o=function(e,t,r,n,i){var s,a=i%4,o=(n+a)%4,u=n-o;switch(a){case 0:e[i]=this[r+3];case 1:e[i+1-(a<<1)|0]=this[r+2];case 2:e[i+2-(a<<1)|0]=this[r+1];case 3:e[i+3-(a<<1)|0]=this[r]}if(!(n>2|0]=this[r+s]<<24|this[r+s+1]<<16|this[r+s+2]<<8|this[r+s+3];switch(o){case 3:e[i+u+1|0]=this[r+u+2];case 2:e[i+u+2|0]=this[r+u+1];case 1:e[i+u+3|0]=this[r+u]}}},u=function(e){switch(i(e)){case"string":return function(e,t,r,n,i){var s,a=i%4,o=(n+a)%4,u=n-o;switch(a){case 0:e[i]=this.charCodeAt(r+3);case 1:e[i+1-(a<<1)|0]=this.charCodeAt(r+2);case 2:e[i+2-(a<<1)|0]=this.charCodeAt(r+1);case 3:e[i+3-(a<<1)|0]=this.charCodeAt(r)}if(!(n>2]=this.charCodeAt(r+s)<<24|this.charCodeAt(r+s+1)<<16|this.charCodeAt(r+s+2)<<8|this.charCodeAt(r+s+3);switch(o){case 3:e[i+u+1|0]=this.charCodeAt(r+u+2);case 2:e[i+u+2|0]=this.charCodeAt(r+u+1);case 1:e[i+u+3|0]=this.charCodeAt(r+u)}}}.bind(e);case"array":case"buffer":return o.bind(e);case"arraybuffer":return o.bind(new Uint8Array(e));case"view":return o.bind(new Uint8Array(e.buffer,e.byteOffset,e.byteLength));case"blob":return function(e,t,r,i,s){var a,o=s%4,u=(i+o)%4,f=i-u,h=new Uint8Array(n.readAsArrayBuffer(this.slice(r,r+i)));switch(o){case 0:e[s]=h[3];case 1:e[s+1-(o<<1)|0]=h[2];case 2:e[s+2-(o<<1)|0]=h[1];case 3:e[s+3-(o<<1)|0]=h[0]}if(!(i>2|0]=h[a]<<24|h[a+1]<<16|h[a+2]<<8|h[a+3];switch(u){case 3:e[s+f+1|0]=h[f+2];case 2:e[s+f+2|0]=h[f+1];case 1:e[s+f+3|0]=h[f]}}}.bind(e)}},f=new Array(256),h=0;h<256;h++)f[h]=(h<16?"0":"")+h.toString(16);var l=function(e){for(var t=new Uint8Array(e),r=new Array(e.byteLength),n=0;n0)throw new Error("Chunk size must be a multiple of 128 bit");s.offset=0,s.maxChunkLen=e,s.padMaxChunkLen=a(e),s.heap=new ArrayBuffer(function(e){var t;if(e<=65536)return 65536;if(e<16777216)for(t=1;t>2);return function(e,t){var r=new Uint8Array(e.buffer),n=t%4,i=t-n;switch(n){case 0:r[i+3]=0;case 1:r[i+2]=0;case 2:r[i+1]=0;case 3:r[i+0]=0}for(var s=1+(t>>2);s>2]|=128<<24-(t%4<<3),e[14+(2+(t>>2)&-16)]=r/(1<<29)|0,e[15+(2+(t>>2)&-16)]=r<<3}(n,e,t),r},p=function(e,t,r,n){u(e)(s.h8,s.h32,t,r,n||0)},y=function(e,t,r,n,i){var a=r;p(e,t,r),i&&(a=d(r,n)),s.core.hash(a,s.padMaxChunkLen)},g=function(e,t){var r=new Int32Array(e,t+320,5),n=new Int32Array(5),i=new DataView(n.buffer);return i.setInt32(0,r[0],!1),i.setInt32(4,r[1],!1),i.setInt32(8,r[2],!1),i.setInt32(12,r[3],!1),i.setInt32(16,r[4],!1),n},m=this.rawDigest=function(e){var t=e.byteLength||e.length||e.size||0;c(s.heap,s.padMaxChunkLen);var r=0,n=s.maxChunkLen;for(r=0;t>r+n;r+=n)y(e,r,n,t,!1);return y(e,r,t-r,t,!0),g(s.heap,s.padMaxChunkLen)};this.digest=this.digestFromString=this.digestFromBuffer=this.digestFromArrayBuffer=function(e){return l(m(e).buffer)},this.resetState=function(){return c(s.heap,s.padMaxChunkLen),this},this.append=function(e){var t,r=0,n=e.byteLength||e.length||e.size||0,i=s.offset%s.maxChunkLen;for(s.offset+=n;r>2]|0;o=n[t+324>>2]|0;f=n[t+328>>2]|0;l=n[t+332>>2]|0;d=n[t+336>>2]|0;for(r=0;(r|0)<(e|0);r=r+64|0){a=s;u=o;h=f;c=l;p=d;for(i=0;(i|0)<64;i=i+4|0){g=n[r+i>>2]|0;y=((s<<5|s>>>27)+(o&f|~o&l)|0)+((g+d|0)+1518500249|0)|0;d=l;l=f;f=o<<30|o>>>2;o=s;s=y;n[e+i>>2]=g}for(i=e+64|0;(i|0)<(e+80|0);i=i+4|0){g=(n[i-12>>2]^n[i-32>>2]^n[i-56>>2]^n[i-64>>2])<<1|(n[i-12>>2]^n[i-32>>2]^n[i-56>>2]^n[i-64>>2])>>>31;y=((s<<5|s>>>27)+(o&f|~o&l)|0)+((g+d|0)+1518500249|0)|0;d=l;l=f;f=o<<30|o>>>2;o=s;s=y;n[i>>2]=g}for(i=e+80|0;(i|0)<(e+160|0);i=i+4|0){g=(n[i-12>>2]^n[i-32>>2]^n[i-56>>2]^n[i-64>>2])<<1|(n[i-12>>2]^n[i-32>>2]^n[i-56>>2]^n[i-64>>2])>>>31;y=((s<<5|s>>>27)+(o^f^l)|0)+((g+d|0)+1859775393|0)|0;d=l;l=f;f=o<<30|o>>>2;o=s;s=y;n[i>>2]=g}for(i=e+160|0;(i|0)<(e+240|0);i=i+4|0){g=(n[i-12>>2]^n[i-32>>2]^n[i-56>>2]^n[i-64>>2])<<1|(n[i-12>>2]^n[i-32>>2]^n[i-56>>2]^n[i-64>>2])>>>31;y=((s<<5|s>>>27)+(o&f|o&l|f&l)|0)+((g+d|0)-1894007588|0)|0;d=l;l=f;f=o<<30|o>>>2;o=s;s=y;n[i>>2]=g}for(i=e+240|0;(i|0)<(e+320|0);i=i+4|0){g=(n[i-12>>2]^n[i-32>>2]^n[i-56>>2]^n[i-64>>2])<<1|(n[i-12>>2]^n[i-32>>2]^n[i-56>>2]^n[i-64>>2])>>>31;y=((s<<5|s>>>27)+(o^f^l)|0)+((g+d|0)-899497514|0)|0;d=l;l=f;f=o<<30|o>>>2;o=s;s=y;n[i>>2]=g}s=s+a|0;o=o+u|0;f=f+h|0;l=l+c|0;d=d+p|0}n[t+320>>2]=s;n[t+324>>2]=o;n[t+328>>2]=f;n[t+332>>2]=l;n[t+336>>2]=d}return{hash:i}},void 0!==t?t.exports=r:"undefined"!=typeof window&&(window.Rusha=r),"undefined"!=typeof FileReaderSync){var n=new FileReaderSync,i=function(e,t,r,n,s){var a=new self.FileReader;a.onloadend=function(){var o=a.result;t+=a.result.byteLength;try{e.append(o)}catch(e){return void s(e)}t>16&255,i[s++]=r>>24;var a;switch(f){case 1===n:a=[0,n-1,0];break;case 2===n:a=[1,n-2,0];break;case 3===n:a=[2,n-3,0];break;case 4===n:a=[3,n-4,0];break;case 6>=n:a=[4,n-5,1];break;case 8>=n:a=[5,n-7,1];break;case 12>=n:a=[6,n-9,2];break;case 16>=n:a=[7,n-13,2];break;case 24>=n:a=[8,n-17,3];break;case 32>=n:a=[9,n-25,3];break;case 48>=n:a=[10,n-33,4];break;case 64>=n:a=[11,n-49,4];break;case 96>=n:a=[12,n-65,5];break;case 128>=n:a=[13,n-97,5];break;case 192>=n:a=[14,n-129,6];break;case 256>=n:a=[15,n-193,6];break;case 384>=n:a=[16,n-257,7];break;case 512>=n:a=[17,n-385,7];break;case 768>=n:a=[18,n-513,8];break;case 1024>=n:a=[19,n-769,8];break;case 1536>=n:a=[20,n-1025,9];break;case 2048>=n:a=[21,n-1537,9];break;case 3072>=n:a=[22,n-2049,10];break;case 4096>=n:a=[23,n-3073,10];break;case 6144>=n:a=[24,n-4097,11];break;case 8192>=n:a=[25,n-6145,11];break;case 12288>=n:a=[26,n-8193,12];break;case 16384>=n:a=[27,n-12289,12];break;case 24576>=n:a=[28,n-16385,13];break;case 32768>=n:a=[29,n-24577,13];break;default:throw"invalid distance"}r=a,i[s++]=r[0],i[s++]=r[1],i[s++]=r[2];var o,u;for(o=0,u=i.length;o=s;)w[s++]=0;for(s=0;29>=s;)b[s++]=0}for(w[256]=1,n=0,i=t.length;n=i){for(d&&r(d,-1),s=0,a=i-n;ss&&t+sf&&(i=n,f=s),258===s)break}return new function(e,t){this.length=e,this.g=t}(f,t-i)}(t,n,h),d?d.length2*f[s-1]+h[s]&&(f[s]=2*f[s-1]+h[s]),d[s]=Array(f[s]),p[s]=Array(f[s]);for(i=0;ie[i]?(d[s][a]=o,p[s][a]=t,u+=2):(d[s][a]=e[i],p[s][a]=i,++i);y[s]=0,1===h[s]&&n(s)}return c}(i,i.length,t),a=0,o=r.length;a>>=1;return s}var u=void 0,f=!0,h=this,l="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array&&"undefined"!=typeof DataView;t.prototype.a=function(e,t,n){var i,s=this.buffer,a=this.index,o=this.d,u=s[a];if(n&&1>>8&255]<<16|m[e>>>16&255]<<8|m[e>>>24&255])>>32-t:m[e]>>8-t),8>t+o)u=u<>t-i-1&1,8==++o&&(o=0,s[a++]=m[u],u=0,a===s.length&&(s=r(this)));s[a]=u,this.buffer=s,this.d=o,this.index=a},t.prototype.finish=function(){var e,t=this.buffer,r=this.index;return 0c;++c){for(var p=g=c,y=7,g=g>>>1;g;g>>>=1)p<<=1,p|=1&g,--y;d[c]=(p<>>0}var m=d;n.prototype.getParent=function(e){return 2*((e-2)/4|0)},n.prototype.push=function(e,t){var r,n,i,s=this.buffer;for(r=this.length,s[this.length++]=t,s[this.length++]=e;0s[n]);)i=s[r],s[r]=s[n],s[n]=i,i=s[r+1],s[r+1]=s[n+1],s[n+1]=i,r=n;return this.length},n.prototype.pop=function(){var e,t,r,n,i,s=this.buffer;for(t=s[0],e=s[1],this.length-=2,s[0]=s[this.length],s[1]=s[this.length+1],i=0;!((n=2*i+2)>=this.length)&&(n+2s[n]&&(n+=2),s[n]>s[i]);)r=s[i],s[i]=s[n],s[n]=r,r=s[i+1],s[i+1]=s[n+1],s[n+1]=r,i=n;return{index:e,value:t,length:this.length}};var v,w=2,b=[];for(v=0;288>v;v++)switch(f){case 143>=v:b.push([v+48,8]);break;case 255>=v:b.push([v-144+400,9]);break;case 279>=v:b.push([v-256+0,7]);break;case 287>=v:b.push([v-280+192,8]);break;default:throw"invalid literal: "+v}i.prototype.h=function(){var e,r,n,i,h=this.input;switch(this.e){case 0:for(n=0,i=h.length;n>>8&255,k[A++]=255&g,k[A++]=g>>>8&255,l)k.set(c,A),A+=c.length,k=k.subarray(0,A);else{for(m=0,v=c.length;mY)for(;0Y?Y:138)>Y-3&&$=$?(te[W++]=17,te[W++]=$-3,re[17]++):(te[W++]=18,te[W++]=$-11,re[18]++),Y-=$;else if(te[W++]=ee[V],re[ee[V]]++,3>--Y)for(;0Y?Y:6)>Y-3&&$H;H++)G[H]=D[q[H]];for(O=19;4=e:return[265,e-11,1];case 14>=e:return[266,e-13,1];case 16>=e:return[267,e-15,1];case 18>=e:return[268,e-17,1];case 22>=e:return[269,e-19,2];case 26>=e:return[270,e-23,2];case 30>=e:return[271,e-27,2];case 34>=e:return[272,e-31,2];case 42>=e:return[273,e-35,3];case 50>=e:return[274,e-43,3];case 58>=e:return[275,e-51,3];case 66>=e:return[276,e-59,3];case 82>=e:return[277,e-67,4];case 98>=e:return[278,e-83,4];case 114>=e:return[279,e-99,4];case 130>=e:return[280,e-115,4];case 162>=e:return[281,e-131,5];case 194>=e:return[282,e-163,5];case 226>=e:return[283,e-195,5];case 257>=e:return[284,e-227,5];case 258===e:return[285,e-258,0];default:throw"invalid length: "+e}}var t,r,n=[];for(t=3;258>=t;t++)r=e(t),n[t]=r[2]<<24|r[1]<<16|r[0];return n}(),A=l?new Uint32Array(k):k;e("Zlib.RawDeflate",i),e("Zlib.RawDeflate.prototype.compress",i.prototype.h);var _,E,S,U,K={NONE:0,FIXED:1,DYNAMIC:w};if(Object.keys)_=Object.keys(K);else for(E in _=[],S=0,K)_[S++]=E;for(S=0,U=_.length;Sd&&(d=e[f]),e[f]>=1;for(l=n<<16|f,h=a;h=o)throw Error("input buffer is broken");n|=s[a++]<>>t,e.c=i-t,e.d=a,r}function i(e,t){for(var r,n,i=e.f,s=e.c,a=e.input,o=e.d,u=a.length,f=t[0],h=t[1];s=u);)i|=a[o++]<>>16)>s)throw Error("invalid code length: "+n);return e.f=i>>n,e.c=s-n,e.d=o,65535&r}var s=void 0,a=this,o="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array&&"undefined"!=typeof DataView,u=0,f=1;r.prototype.t=function(){for(;!this.l;){var e=n(this,3);switch(1&e&&(this.l=!0),e>>>=1){case 0:var r=this.input,a=this.d,h=this.b,l=this.a,c=r.length,p=s,y=s,g=h.length,m=s;if(this.c=this.f=0,a+1>=c)throw Error("invalid uncompressed block header: LEN");if(p=r[a++]|r[a++]<<8,a+1>=c)throw Error("invalid uncompressed block header: NLEN");if(y=r[a++]|r[a++]<<8,p===~y)throw Error("invalid uncompressed block header: length verify");if(a+p>r.length)throw Error("input buffer is broken");switch(this.i){case u:for(;l+p>h.length;){if(m=g-l,p-=m,o)h.set(r.subarray(a,a+m),l),l+=m,a+=m;else for(;m--;)h[l++]=r[a++];this.a=l,h=this.e(),l=this.a}break;case f:for(;l+p>h.length;)h=this.e({o:2});break;default:throw Error("invalid inflate mode")}if(o)h.set(r.subarray(a,a+p),l),l+=p,a+=p;else for(;p--;)h[l++]=r[a++];this.d=a,this.a=l,this.b=h;break;case 1:this.j(S,K);break;case 2:for(var v=n(this,5)+257,w=n(this,5)+1,b=n(this,4)+4,k=new(o?Uint8Array:Array)(d.length),A=s,_=s,E=s,U=s,P=s,j=s,x=s,T=s,O=s,T=0;T=h?8:255>=h?9:279>=h?7:8;var _,E,S=t(A),U=new(o?Uint8Array:Array)(30);for(_=0,E=U.length;_a)s>=h&&(this.a=s,r=this.e(),s=this.a),r[s++]=a;else for(f=y[o=a-257],0=h&&(this.a=s,r=this.e(),s=this.a);f--;)r[s]=r[s++-u];for(;8<=this.c;)this.c-=8,this.d--;this.a=s},r.prototype.s=function(e,t){var r=this.b,s=this.a;this.n=e;for(var a,o,u,f,h=r.length;256!==(a=i(this,e));)if(256>a)s>=h&&(r=this.e(),h=r.length),r[s++]=a;else for(f=y[o=a-257],0h&&(r=this.e(),h=r.length);f--;)r[s]=r[s++-u];for(;8<=this.c;)this.c-=8,this.d--;this.a=s},r.prototype.e=function(){var e,t,r=new(o?Uint8Array:Array)(this.a-32768),n=this.a-32768,i=this.b;if(o)r.set(i.subarray(32768,r.length));else for(e=0,t=r.length;ee;++e)i[e]=i[n+e];return this.a=32768,i},r.prototype.u=function(e){var t,r,n,i,s=this.input.length/this.d+1|0,a=this.input,u=this.b;return e&&("number"==typeof e.o&&(s=e.o),"number"==typeof e.q&&(s+=e.q)),2>s?(r=(a.length-this.d)/this.n[2],i=r/2*258|0,n=it&&(this.b.length=t),e=this.b),this.buffer=e},e("Zlib.RawInflate",r),e("Zlib.RawInflate.prototype.decompress",r.prototype.t);var P,j,x,T,O={ADAPTIVE:f,BLOCK:u};if(Object.keys)P=Object.keys(O);else for(j in P=[],x=0,O)P[x++]=j;for(x=0,T=P.length;xc&&(c=e[u]),e[u]>=1;for(h=n<<16|u,f=a;f>16&255,s[a++]=n>>24;var o;switch(m){case 1===i:o=[0,i-1,0];break;case 2===i:o=[1,i-2,0];break;case 3===i:o=[2,i-3,0];break;case 4===i:o=[3,i-4,0];break;case 6>=i:o=[4,i-5,1];break;case 8>=i:o=[5,i-7,1];break;case 12>=i:o=[6,i-9,2];break;case 16>=i:o=[7,i-13,2];break;case 24>=i:o=[8,i-17,3];break;case 32>=i:o=[9,i-25,3];break;case 48>=i:o=[10,i-33,4];break;case 64>=i:o=[11,i-49,4];break;case 96>=i:o=[12,i-65,5];break;case 128>=i:o=[13,i-97,5];break;case 192>=i:o=[14,i-129,6];break;case 256>=i:o=[15,i-193,6];break;case 384>=i:o=[16,i-257,7];break;case 512>=i:o=[17,i-385,7];break;case 768>=i:o=[18,i-513,8];break;case 1024>=i:o=[19,i-769,8];break;case 1536>=i:o=[20,i-1025,9];break;case 2048>=i:o=[21,i-1537,9];break;case 3072>=i:o=[22,i-2049,10];break;case 4096>=i:o=[23,i-3073,10];break;case 6144>=i:o=[24,i-4097,11];break;case 8192>=i:o=[25,i-6145,11];break;case 12288>=i:o=[26,i-8193,12];break;case 16384>=i:o=[27,i-12289,12];break;case 24576>=i:o=[28,i-16385,13];break;case 32768>=i:o=[29,i-24577,13];break;default:e("invalid distance")}n=o,s[a++]=n[0],s[a++]=n[1],s[a++]=n[2];var u,f;for(u=0,f=s.length;u=a;)b[a++]=0;for(a=0;29>=a;)k[a++]=0}for(b[256]=1,i=0,s=r.length;i=s){for(l&&n(l,-1),a=0,o=s-i;as&&t+sf&&(i=n,f=s),258===s)break}return new function(e,t){this.length=e,this.G=t}(f,t-i)}(r,i,f),l?l.length2*f[s-1]+h[s]&&(f[s]=2*f[s-1]+h[s]),c[s]=Array(f[s]),d[s]=Array(f[s]);for(i=0;ie[i]?(c[s][a]=o,d[s][a]=t,u+=2):(c[s][a]=e[i],d[s][a]=i,++i);p[s]=0,1===h[s]&&n(s)}return l}(i,i.length,t),a=0,o=r.length;a>>=1;return s}function f(t,r){switch(this.l=[],this.m=32768,this.e=this.g=this.c=this.q=0,this.input=w?new Uint8Array(t):t,this.s=!1,this.n=C,this.B=!1,!r&&(r={})||(r.index&&(this.c=r.index),r.bufferSize&&(this.m=r.bufferSize),r.bufferType&&(this.n=r.bufferType),r.resize&&(this.B=r.resize)),this.n){case O:this.b=32768,this.a=new(w?Uint8Array:Array)(32768+this.m+258);break;case C:this.b=0,this.a=new(w?Uint8Array:Array)(this.m),this.f=this.J,this.t=this.H,this.o=this.I;break;default:e(Error("invalid inflate mode"))}}function h(t,r){for(var n,i=t.g,s=t.e,a=t.input,o=t.c,u=a.length;s=u&&e(Error("input buffer is broken")),i|=a[o++]<>>r,t.e=s-r,t.c=o,n}function l(t,r){for(var n,i,s=t.g,a=t.e,o=t.input,u=t.c,f=o.length,h=r[0],l=r[1];a=f);)s|=o[u++]<>>16)>a&&e(Error("invalid code length: "+i)),t.g=s>>i,t.e=a-i,t.c=u,65535&n}function c(e){if("string"==typeof e){var t,r,n=e.split("");for(t=0,r=n.length;t>>0;e=n}for(var i,s=1,a=0,o=e.length,u=0;0>>0}function d(t,r){var n,i;switch(this.input=t,this.c=0,!r&&(r={})||(r.index&&(this.c=r.index),r.verify&&(this.M=r.verify)),n=t[this.c++],i=t[this.c++],15&n){case Q:this.method=Q;break;default:e(Error("unsupported compression method"))}0!=((n<<8)+i)%31&&e(Error("invalid fcheck flag:"+((n<<8)+i)%31)),32&i&&e(Error("fdict flag is not supported")),this.A=new f(t,{index:this.c,bufferSize:r.bufferSize,bufferType:r.bufferType,resize:r.resize})}function p(e,t){this.input=e,this.a=new(w?Uint8Array:Array)(32768),this.h=ee.k;var r,n={};!t&&(t={})||"number"!=typeof t.compressionType||(this.h=t.compressionType);for(r in t)n[r]=t[r];n.outputBuffer=this.a,this.z=new s(this.input,n)}function y(e,r){var n,i,s,a;if(Object.keys)n=Object.keys(r);else for(i in n=[],s=0,r)n[s++]=i;for(s=0,a=n.length;s>>8&255]<<16|S[e>>>16&255]<<8|S[e>>>24&255])>>32-t:S[e]>>8-t),8>t+a)o=o<>t-n-1&1,8==++a&&(a=0,i[s++]=S[o],o=0,s===i.length&&(i=this.f()));i[s]=o,this.buffer=i,this.i=a,this.index=s},r.prototype.finish=function(){var e,t=this.buffer,r=this.index;return 0b;++b){for(var A=E=b,_=7,E=E>>>1;E;E>>>=1)A<<=1,A|=1&E,--_;k[b]=(A<<_&255)>>>0}var S=k;n.prototype.getParent=function(e){return 2*((e-2)/4|0)},n.prototype.push=function(e,t){var r,n,i,s=this.buffer;for(r=this.length,s[this.length++]=t,s[this.length++]=e;0s[n]);)i=s[r],s[r]=s[n],s[n]=i,i=s[r+1],s[r+1]=s[n+1],s[n+1]=i,r=n;return this.length},n.prototype.pop=function(){var e,t,r,n,i,s=this.buffer;for(t=s[0],e=s[1],this.length-=2,s[0]=s[this.length],s[1]=s[this.length+1],i=0;!((n=2*i+2)>=this.length)&&(n+2s[n]&&(n+=2),s[n]>s[i]);)r=s[i],s[i]=s[n],s[n]=r,r=s[i+1],s[i+1]=s[n+1],s[n+1]=r,i=n;return{index:e,value:t,length:this.length}};var U,K=2,P={NONE:0,r:1,k:K,N:3},j=[];for(U=0;288>U;U++)switch(m){case 143>=U:j.push([U+48,8]);break;case 255>=U:j.push([U-144+400,9]);break;case 279>=U:j.push([U-256+0,7]);break;case 287>=U:j.push([U-280+192,8]);break;default:e("invalid literal: "+U)}s.prototype.j=function(){var t,n,i,s,f=this.input;switch(this.h){case 0:for(i=0,s=f.length;i>>8&255,b[k++]=255&p,b[k++]=p>>>8&255,w)b.set(h,k),k+=h.length,b=b.subarray(0,k);else{for(y=0,v=h.length;yX)for(;0X?X:138)>X-3&&J=J?(re[$++]=17,re[$++]=J-3,ne[17]++):(re[$++]=18,re[$++]=J-11,ne[18]++),X-=J;else if(re[$++]=te[Z],ne[te[Z]]++,3>--X)for(;0X?X:6)>X-3&&JF;F++)V[F]=N[G[F]];for(C=19;4=t:return[265,t-11,1];case 14>=t:return[266,t-13,1];case 16>=t:return[267,t-15,1];case 18>=t:return[268,t-17,1];case 22>=t:return[269,t-19,2];case 26>=t:return[270,t-23,2];case 30>=t:return[271,t-27,2];case 34>=t:return[272,t-31,2];case 42>=t:return[273,t-35,3];case 50>=t:return[274,t-43,3];case 58>=t:return[275,t-51,3];case 66>=t:return[276,t-59,3];case 82>=t:return[277,t-67,4];case 98>=t:return[278,t-83,4];case 114>=t:return[279,t-99,4];case 130>=t:return[280,t-115,4];case 162>=t:return[281,t-131,5];case 194>=t:return[282,t-163,5];case 226>=t:return[283,t-195,5];case 257>=t:return[284,t-227,5];case 258===t:return[285,t-258,0];default:e("invalid length: "+t)}}var r,n,i=[];for(r=3;258>=r;r++)n=t(r),i[r]=n[2]<<24|n[1]<<16|n[0];return i}(),T=w?new Uint32Array(x):x,O=0,C=1,I={D:O,C:C};f.prototype.p=function(){for(;!this.s;){var t=h(this,3);switch(1&t&&(this.s=m),t>>>=1){case 0:var r=this.input,n=this.c,s=this.a,a=this.b,o=r.length,u=g,f=g,c=s.length,d=g;switch(this.e=this.g=0,n+1>=o&&e(Error("invalid uncompressed block header: LEN")),u=r[n++]|r[n++]<<8,n+1>=o&&e(Error("invalid uncompressed block header: NLEN")),f=r[n++]|r[n++]<<8,u===~f&&e(Error("invalid uncompressed block header: length verify")),n+u>r.length&&e(Error("input buffer is broken")),this.n){case O:for(;a+u>s.length;){if(d=c-a,u-=d,w)s.set(r.subarray(n,n+d),a),a+=d,n+=d;else for(;d--;)s[a++]=r[n++];this.b=a,s=this.f(),a=this.b}break;case C:for(;a+u>s.length;)s=this.f({v:2});break;default:e(Error("invalid inflate mode"))}if(w)s.set(r.subarray(n,n+u),a),a+=u,n+=u;else for(;u--;)s[a++]=r[n++];this.c=n,this.b=a,this.a=s;break;case 1:this.o(W,J);break;case 2:for(var p=h(this,5)+257,y=h(this,5)+1,v=h(this,4)+4,b=new(w?Uint8Array:Array)(N.length),k=g,A=g,_=g,E=g,S=g,U=g,K=g,P=g,j=g,P=0;P=M?8:255>=M?9:279>=M?7:8;var Y,X,W=i(Z),$=new(w?Uint8Array:Array)(30);for(Y=0,X=$.length;Yi)n>=u&&(this.b=n,r=this.f(),n=this.b),r[n++]=i;else for(o=R[s=i-257],0=u&&(this.b=n,r=this.f(),n=this.b);o--;)r[n]=r[n++-a];for(;8<=this.e;)this.e-=8,this.c--;this.b=n},f.prototype.I=function(e,t){var r=this.a,n=this.b;this.u=e;for(var i,s,a,o,u=r.length;256!==(i=l(this,e));)if(256>i)n>=u&&(r=this.f(),u=r.length),r[n++]=i;else for(o=R[s=i-257],0u&&(r=this.f(),u=r.length);o--;)r[n]=r[n++-a];for(;8<=this.e;)this.e-=8,this.c--;this.b=n},f.prototype.f=function(){var e,t,r=new(w?Uint8Array:Array)(this.b-32768),n=this.b-32768,i=this.a;if(w)r.set(i.subarray(32768,r.length));else for(e=0,t=r.length;ee;++e)i[e]=i[n+e];return this.b=32768,i},f.prototype.J=function(e){var t,r,n,i,s=this.input.length/this.c+1|0,a=this.input,o=this.a;return e&&("number"==typeof e.v&&(s=e.v),"number"==typeof e.F&&(s+=e.F)),2>s?(r=(a.length-this.c)/this.u[2],i=r/2*258|0,n=it&&(this.a.length=t),e=this.a),this.buffer=e},d.prototype.p=function(){var t,r=this.input;return t=this.A.p(),this.c=this.A.c,this.M&&(r[this.c++]<<24|r[this.c++]<<16|r[this.c++]<<8|r[this.c++])>>>0!==c(t)&&e(Error("invalid adler-32 checksum")),t};var Q=8,ee=P;p.prototype.j=function(){var t,r,n,i,s,a,o,u=0;switch(o=this.a,t=Q){case Q:r=Math.LOG2E*Math.log(32768)-8;break;default:e(Error("invalid compression method"))}switch(n=r<<4|t,o[u++]=n,t){case Q:switch(this.h){case ee.NONE:s=0;break;case ee.r:s=1;break;case ee.k:s=2;break;default:e(Error("unsupported compression type"))}break;default:e(Error("invalid compression method"))}return i=s<<6|0,o[u++]=i|31-(256*n+i)%31,a=c(this.input),this.z.b=u,o=this.z.j(),u=o.length,w&&((o=new Uint8Array(o.buffer)).length<=u+4&&(this.a=new Uint8Array(o.length+4),this.a.set(o),o=this.a),o=o.subarray(0,u+4)),o[u++]=a>>24&255,o[u++]=a>>16&255,o[u++]=a>>8&255,o[u++]=255&a,o},t("Zlib.Inflate",d),t("Zlib.Inflate.prototype.decompress",d.prototype.p),y("Zlib.Inflate.BufferType",{ADAPTIVE:I.C,BLOCK:I.D}),t("Zlib.Deflate",p),t("Zlib.Deflate.compress",function(e,t){return new p(e,t).j()}),t("Zlib.Deflate.prototype.compress",p.prototype.j),y("Zlib.Deflate.CompressionType",{NONE:ee.NONE,FIXED:ee.r,DYNAMIC:ee.k})}).call(this)},{}],9:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(e){return e&&e.__esModule?e:{default:e}}(e("../enums.js"));r.default={prefer_hash_algorithm:n.default.hash.sha256,encryption_cipher:n.default.symmetric.aes256,compression:n.default.compression.zip,aead_protect:!1,integrity_protect:!0,ignore_mdc_error:!1,checksum_required:!1,verify_expired_keys:!0,rsa_blinding:!0,use_native:!0,zero_copy:!1,debug:!1,tolerant:!0,show_version:!0,show_comment:!0,versionstring:"OpenPGP.js v2.6.2",commentstring:"https://openpgpjs.org",keyserver:"https://keyserver.ubuntu.com",node_store:"./openpgp.store"}},{"../enums.js":35}],10:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./config.js");Object.defineProperty(r,"default",{enumerable:!0,get:function(){return function(e){return e&&e.__esModule?e:{default:e}}(n).default}})},{"./config.js":9}],11:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(e){return e&&e.__esModule?e:{default:e}}(e("./cipher"));r.default={encrypt:function(e,t,r,i,s){var a=(t=new n.default[t](i)).blockSize,o=new Uint8Array(a),u=new Uint8Array(a),f=new Uint8Array(e.length+2);f.set(e),f[e.length]=e[a-2],f[e.length+1]=e[a-1],e=f;var h,l,c,d=new Uint8Array(r.length+2+2*a),p=s?0:2;for(h=0;ha*f;){var c=e.encrypt(u);for(o=r.subarray(f*a,f*a+a),s=0;so*u;){var l=e.encrypt(s);for(s=r.subarray(u*o+0,u*o+o+0),a=0;a>8&255}function s(e){return e>>16&255}function a(e){return e>>24&255}function o(e,t,r,n){return i(c[255&e])|i(c[t>>8&255])<<8|i(c[r>>16&255])<<16|i(c[n>>>24])<<24}function u(e,t,r){var u,f,h;for(h=function(e){var t,r,n=e.length,i=new Array(n/4);if(e&&!(n%4)){for(t=0,r=0;r>8&255]^p[r[2]>>16&255]^y[r[3]>>>24],h[1]=c[255&r[1]]^d[r[2]>>8&255]^p[r[3]>>16&255]^y[r[0]>>>24],h[2]=c[255&r[2]]^d[r[3]>>8&255]^p[r[0]>>16&255]^y[r[1]>>>24],h[3]=c[255&r[3]]^d[r[0]>>8&255]^p[r[1]>>16&255]^y[r[2]>>>24];return u=f-1,r[0]=h[0]^t.rk[u][0],r[1]=h[1]^t.rk[u][1],r[2]=h[2]^t.rk[u][2],r[3]=h[3]^t.rk[u][3],h[0]=o(r[0],r[1],r[2],r[3])^t.rk[f][0],h[1]=o(r[1],r[2],r[3],r[0])^t.rk[f][1],h[2]=o(r[2],r[3],r[0],r[1])^t.rk[f][2],h[3]=o(r[3],r[0],r[1],r[2])^t.rk[f][3],function(e){var t,r=0,o=e.length,u=new Array(4*o);for(t=0;t=0;o--)v[o]=y[o];for(u=0,f=0,o=0;o>>=8,n=255&e,e>>>=8,r=255&e,e>>>=8,t=255&e,s=this.sboxes[0][t]+this.sboxes[1][r],s^=this.sboxes[2][n],s+=this.sboxes[3][i]},n.prototype._encrypt_block=function(e){var t,r=e[0],n=e[1];for(t=0;t>>24-8*t&255,i[t+n]=r[1]>>>24-8*t&255;return i},n.prototype._decrypt_block=function(e){var t,r=e[0],n=e[1];for(t=this.NN+1;t>1;--t){var i=r^=this.parray[t];r=n=this._F(r)^n,n=i}r^=this.parray[1],n^=this.parray[0],e[0]=this._clean(n),e[1]=this._clean(r)},n.prototype.init=function(e){var t,r=0;for(this.parray=[],t=0;t=e.length&&(r=0);this.parray[t]=this.PARRAY[t]^i}for(this.sboxes=[],t=0;t<4;++t)for(this.sboxes[t]=[],r=0;r<256;++r)this.sboxes[t][r]=this.SBOXES[t][r];var s=[0,0];for(t=0;t>>32-r;return(s[0][i>>>24]^s[1][i>>>16&255])-s[2][i>>>8&255]+s[3][255&i]}function t(e,t,r){var n=t^e,i=n<>>32-r;return s[0][i>>>24]-s[1][i>>>16&255]+s[2][i>>>8&255]^s[3][255&i]}function r(e,t,r){var n=t-e,i=n<>>32-r;return(s[0][i>>>24]+s[1][i>>>16&255]^s[2][i>>>8&255])-s[3][255&i]}this.BlockSize=8,this.KeySize=16,this.setKey=function(e){if(this.masking=new Array(16),this.rotate=new Array(16),this.reset(),e.length!==this.KeySize)throw new Error("CAST-128: keys must be 16 bytes");return this.keySchedule(e),!0},this.reset=function(){for(var e=0;e<16;e++)this.masking[e]=0,this.rotate[e]=0},this.getBlockSize=function(){return this.BlockSize},this.encrypt=function(n){for(var i=new Array(n.length),s=0;s>>24&255,i[s+1]=u>>>16&255,i[s+2]=u>>>8&255,i[s+3]=255&u,i[s+4]=o>>>24&255,i[s+5]=o>>>16&255,i[s+6]=o>>>8&255,i[s+7]=255&o}return i},this.decrypt=function(n){for(var i=new Array(n.length),s=0;s>>24&255,i[s+1]=u>>>16&255,i[s+2]=u>>>8&255,i[s+3]=255&u,i[s+4]=o>>>24&255,i[s+5]=o>>16&255,i[s+6]=o>>8&255,i[s+7]=255&o}return i};var n=new Array(4);n[0]=new Array(4),n[0][0]=new Array(4,0,13,15,12,14,8),n[0][1]=new Array(5,2,16,18,17,19,10),n[0][2]=new Array(6,3,23,22,21,20,9),n[0][3]=new Array(7,1,26,25,27,24,11),n[1]=new Array(4),n[1][0]=new Array(0,6,21,23,20,22,16),n[1][1]=new Array(1,4,0,2,1,3,18),n[1][2]=new Array(2,5,7,6,5,4,17),n[1][3]=new Array(3,7,10,9,11,8,19),n[2]=new Array(4),n[2][0]=new Array(4,0,13,15,12,14,8),n[2][1]=new Array(5,2,16,18,17,19,10),n[2][2]=new Array(6,3,23,22,21,20,9),n[2][3]=new Array(7,1,26,25,27,24,11),n[3]=new Array(4),n[3][0]=new Array(0,6,21,23,20,22,16),n[3][1]=new Array(1,4,0,2,1,3,18),n[3][2]=new Array(2,5,7,6,5,4,17),n[3][3]=new Array(3,7,10,9,11,8,19);var i=new Array(4);i[0]=new Array(4),i[0][0]=new Array(24,25,23,22,18),i[0][1]=new Array(26,27,21,20,22),i[0][2]=new Array(28,29,19,18,25),i[0][3]=new Array(30,31,17,16,28),i[1]=new Array(4),i[1][0]=new Array(3,2,12,13,8),i[1][1]=new Array(1,0,14,15,13),i[1][2]=new Array(7,6,8,9,3),i[1][3]=new Array(5,4,10,11,7),i[2]=new Array(4),i[2][0]=new Array(19,18,28,29,25),i[2][1]=new Array(17,16,30,31,28),i[2][2]=new Array(23,22,24,25,18),i[2][3]=new Array(21,20,26,27,22),i[3]=new Array(4),i[3][0]=new Array(8,9,7,6,3),i[3][1]=new Array(10,11,5,4,7),i[3][2]=new Array(12,13,3,2,8),i[3][3]=new Array(14,15,1,0,13),this.keySchedule=function(e){var t,r,a=new Array(8),o=new Array(32);for(t=0;t<4;t++)r=4*t,a[t]=e[r]<<24|e[r+1]<<16|e[r+2]<<8|e[r+3];for(var u,f=[6,7,4,5],h=0,l=0;l<2;l++)for(var c=0;c<4;c++){for(r=0;r<4;r++){var d=n[c][r];u=a[d[1]],u^=s[4][a[d[2]>>>2]>>>24-8*(3&d[2])&255],u^=s[5][a[d[3]>>>2]>>>24-8*(3&d[3])&255],u^=s[6][a[d[4]>>>2]>>>24-8*(3&d[4])&255],u^=s[7][a[d[5]>>>2]>>>24-8*(3&d[5])&255],u^=s[f[r]][a[d[6]>>>2]>>>24-8*(3&d[6])&255],a[d[0]]=u}for(r=0;r<4;r++){var p=i[c][r];u=s[4][a[p[0]>>>2]>>>24-8*(3&p[0])&255],u^=s[5][a[p[1]>>>2]>>>24-8*(3&p[1])&255],u^=s[6][a[p[2]>>>2]>>>24-8*(3&p[2])&255],u^=s[7][a[p[3]>>>2]>>>24-8*(3&p[3])&255],u^=s[4+r][a[p[4]>>>2]>>>24-8*(3&p[4])&255],o[h]=u,h++}}for(t=0;t<16;t++)this.masking[t]=o[t],this.rotate[t]=31&o[16+t]};var s=new Array(8);s[0]=new Array(821772500,2678128395,1810681135,1059425402,505495343,2617265619,1610868032,3483355465,3218386727,2294005173,3791863952,2563806837,1852023008,365126098,3269944861,584384398,677919599,3229601881,4280515016,2002735330,1136869587,3744433750,2289869850,2731719981,2714362070,879511577,1639411079,575934255,717107937,2857637483,576097850,2731753936,1725645e3,2810460463,5111599,767152862,2543075244,1251459544,1383482551,3052681127,3089939183,3612463449,1878520045,1510570527,2189125840,2431448366,582008916,3163445557,1265446783,1354458274,3529918736,3202711853,3073581712,3912963487,3029263377,1275016285,4249207360,2905708351,3304509486,1442611557,3585198765,2712415662,2731849581,3248163920,2283946226,208555832,2766454743,1331405426,1447828783,3315356441,3108627284,2957404670,2981538698,3339933917,1669711173,286233437,1465092821,1782121619,3862771680,710211251,980974943,1651941557,430374111,2051154026,704238805,4128970897,3144820574,2857402727,948965521,3333752299,2227686284,718756367,2269778983,2731643755,718440111,2857816721,3616097120,1113355533,2478022182,410092745,1811985197,1944238868,2696854588,1415722873,1682284203,1060277122,1998114690,1503841958,82706478,2315155686,1068173648,845149890,2167947013,1768146376,1993038550,3566826697,3390574031,940016341,3355073782,2328040721,904371731,1205506512,4094660742,2816623006,825647681,85914773,2857843460,1249926541,1417871568,3287612,3211054559,3126306446,1975924523,1353700161,2814456437,2438597621,1800716203,722146342,2873936343,1151126914,4160483941,2877670899,458611604,2866078500,3483680063,770352098,2652916994,3367839148,3940505011,3585973912,3809620402,718646636,2504206814,2914927912,3631288169,2857486607,2860018678,575749918,2857478043,718488780,2069512688,3548183469,453416197,1106044049,3032691430,52586708,3378514636,3459808877,3211506028,1785789304,218356169,3571399134,3759170522,1194783844,1523787992,3007827094,1975193539,2555452411,1341901877,3045838698,3776907964,3217423946,2802510864,2889438986,1057244207,1636348243,3761863214,1462225785,2632663439,481089165,718503062,24497053,3332243209,3344655856,3655024856,3960371065,1195698900,2971415156,3710176158,2115785917,4027663609,3525578417,2524296189,2745972565,3564906415,1372086093,1452307862,2780501478,1476592880,3389271281,18495466,2378148571,901398090,891748256,3279637769,3157290713,2560960102,1447622437,4284372637,216884176,2086908623,1879786977,3588903153,2242455666,2938092967,3559082096,2810645491,758861177,1121993112,215018983,642190776,4169236812,1196255959,2081185372,3508738393,941322904,4124243163,2877523539,1848581667,2205260958,3180453958,2589345134,3694731276,550028657,2519456284,3789985535,2973870856,2093648313,443148163,46942275,2734146937,1117713533,1115362972,1523183689,3717140224,1551984063),s[1]=new Array(522195092,4010518363,1776537470,960447360,4267822970,4005896314,1435016340,1929119313,2913464185,1310552629,3579470798,3724818106,2579771631,1594623892,417127293,2715217907,2696228731,1508390405,3994398868,3925858569,3695444102,4019471449,3129199795,3770928635,3520741761,990456497,4187484609,2783367035,21106139,3840405339,631373633,3783325702,532942976,396095098,3548038825,4267192484,2564721535,2011709262,2039648873,620404603,3776170075,2898526339,3612357925,4159332703,1645490516,223693667,1567101217,3362177881,1029951347,3470931136,3570957959,1550265121,119497089,972513919,907948164,3840628539,1613718692,3594177948,465323573,2659255085,654439692,2575596212,2699288441,3127702412,277098644,624404830,4100943870,2717858591,546110314,2403699828,3655377447,1321679412,4236791657,1045293279,4010672264,895050893,2319792268,494945126,1914543101,2777056443,3894764339,2219737618,311263384,4275257268,3458730721,669096869,3584475730,3835122877,3319158237,3949359204,2005142349,2713102337,2228954793,3769984788,569394103,3855636576,1425027204,108000370,2736431443,3671869269,3043122623,1750473702,2211081108,762237499,3972989403,2798899386,3061857628,2943854345,867476300,964413654,1591880597,1594774276,2179821409,552026980,3026064248,3726140315,2283577634,3110545105,2152310760,582474363,1582640421,1383256631,2043843868,3322775884,1217180674,463797851,2763038571,480777679,2718707717,2289164131,3118346187,214354409,200212307,3810608407,3025414197,2674075964,3997296425,1847405948,1342460550,510035443,4080271814,815934613,833030224,1620250387,1945732119,2703661145,3966000196,1388869545,3456054182,2687178561,2092620194,562037615,1356438536,3409922145,3261847397,1688467115,2150901366,631725691,3840332284,549916902,3455104640,394546491,837744717,2114462948,751520235,2221554606,2415360136,3999097078,2063029875,803036379,2702586305,821456707,3019566164,360699898,4018502092,3511869016,3677355358,2402471449,812317050,49299192,2570164949,3259169295,2816732080,3331213574,3101303564,2156015656,3705598920,3546263921,143268808,3200304480,1638124008,3165189453,3341807610,578956953,2193977524,3638120073,2333881532,807278310,658237817,2969561766,1641658566,11683945,3086995007,148645947,1138423386,4158756760,1981396783,2401016740,3699783584,380097457,2680394679,2803068651,3334260286,441530178,4016580796,1375954390,761952171,891809099,2183123478,157052462,3683840763,1592404427,341349109,2438483839,1417898363,644327628,2233032776,2353769706,2201510100,220455161,1815641738,182899273,2995019788,3627381533,3702638151,2890684138,1052606899,588164016,1681439879,4038439418,2405343923,4229449282,167996282,1336969661,1688053129,2739224926,1543734051,1046297529,1138201970,2121126012,115334942,1819067631,1902159161,1941945968,2206692869,1159982321),s[2]=new Array(2381300288,637164959,3952098751,3893414151,1197506559,916448331,2350892612,2932787856,3199334847,4009478890,3905886544,1373570990,2450425862,4037870920,3778841987,2456817877,286293407,124026297,3001279700,1028597854,3115296800,4208886496,2691114635,2188540206,1430237888,1218109995,3572471700,308166588,570424558,2187009021,2455094765,307733056,1310360322,3135275007,1384269543,2388071438,863238079,2359263624,2801553128,3380786597,2831162807,1470087780,1728663345,4072488799,1090516929,532123132,2389430977,1132193179,2578464191,3051079243,1670234342,1434557849,2711078940,1241591150,3314043432,3435360113,3091448339,1812415473,2198440252,267246943,796911696,3619716990,38830015,1526438404,2806502096,374413614,2943401790,1489179520,1603809326,1920779204,168801282,260042626,2358705581,1563175598,2397674057,1356499128,2217211040,514611088,2037363785,2186468373,4022173083,2792511869,2913485016,1173701892,4200428547,3896427269,1334932762,2455136706,602925377,2835607854,1613172210,41346230,2499634548,2457437618,2188827595,41386358,4172255629,1313404830,2405527007,3801973774,2217704835,873260488,2528884354,2478092616,4012915883,2555359016,2006953883,2463913485,575479328,2218240648,2099895446,660001756,2341502190,3038761536,3888151779,3848713377,3286851934,1022894237,1620365795,3449594689,1551255054,15374395,3570825345,4249311020,4151111129,3181912732,310226346,1133119310,530038928,136043402,2476768958,3107506709,2544909567,1036173560,2367337196,1681395281,1758231547,3641649032,306774401,1575354324,3716085866,1990386196,3114533736,2455606671,1262092282,3124342505,2768229131,4210529083,1833535011,423410938,660763973,2187129978,1639812e3,3508421329,3467445492,310289298,272797111,2188552562,2456863912,310240523,677093832,1013118031,901835429,3892695601,1116285435,3036471170,1337354835,243122523,520626091,277223598,4244441197,4194248841,1766575121,594173102,316590669,742362309,3536858622,4176435350,3838792410,2501204839,1229605004,3115755532,1552908988,2312334149,979407927,3959474601,1148277331,176638793,3614686272,2083809052,40992502,1340822838,2731552767,3535757508,3560899520,1354035053,122129617,7215240,2732932949,3118912700,2718203926,2539075635,3609230695,3725561661,1928887091,2882293555,1988674909,2063640240,2491088897,1459647954,4189817080,2302804382,1113892351,2237858528,1927010603,4002880361,1856122846,1594404395,2944033133,3855189863,3474975698,1643104450,4054590833,3431086530,1730235576,2984608721,3084664418,2131803598,4178205752,267404349,1617849798,1616132681,1462223176,736725533,2327058232,551665188,2945899023,1749386277,2575514597,1611482493,674206544,2201269090,3642560800,728599968,1680547377,2620414464,1388111496,453204106,4156223445,1094905244,2754698257,2201108165,3757000246,2704524545,3922940700,3996465027),s[3]=new Array(2645754912,532081118,2814278639,3530793624,1246723035,1689095255,2236679235,4194438865,2116582143,3859789411,157234593,2045505824,4245003587,1687664561,4083425123,605965023,672431967,1336064205,3376611392,214114848,4258466608,3232053071,489488601,605322005,3998028058,264917351,1912574028,756637694,436560991,202637054,135989450,85393697,2152923392,3896401662,2895836408,2145855233,3535335007,115294817,3147733898,1922296357,3464822751,4117858305,1037454084,2725193275,2127856640,1417604070,1148013728,1827919605,642362335,2929772533,909348033,1346338451,3547799649,297154785,1917849091,4161712827,2883604526,3968694238,1469521537,3780077382,3375584256,1763717519,136166297,4290970789,1295325189,2134727907,2798151366,1566297257,3672928234,2677174161,2672173615,965822077,2780786062,289653839,1133871874,3491843819,35685304,1068898316,418943774,672553190,642281022,2346158704,1954014401,3037126780,4079815205,2030668546,3840588673,672283427,1776201016,359975446,3750173538,555499703,2769985273,1324923,69110472,152125443,3176785106,3822147285,1340634837,798073664,1434183902,15393959,216384236,1303690150,3881221631,3711134124,3960975413,106373927,2578434224,1455997841,1801814300,1578393881,1854262133,3188178946,3258078583,2302670060,1539295533,3505142565,3078625975,2372746020,549938159,3278284284,2620926080,181285381,2865321098,3970029511,68876850,488006234,1728155692,2608167508,836007927,2435231793,919367643,3339422534,3655756360,1457871481,40520939,1380155135,797931188,234455205,2255801827,3990488299,397000196,739833055,3077865373,2871719860,4022553888,772369276,390177364,3853951029,557662966,740064294,1640166671,1699928825,3535942136,622006121,3625353122,68743880,1742502,219489963,1664179233,1577743084,1236991741,410585305,2366487942,823226535,1050371084,3426619607,3586839478,212779912,4147118561,1819446015,1911218849,530248558,3486241071,3252585495,2886188651,3410272728,2342195030,20547779,2982490058,3032363469,3631753222,312714466,1870521650,1493008054,3491686656,615382978,4103671749,2534517445,1932181,2196105170,278426614,6369430,3274544417,2913018367,697336853,2143000447,2946413531,701099306,1558357093,2805003052,3500818408,2321334417,3567135975,216290473,3591032198,23009561,1996984579,3735042806,2024298078,3739440863,569400510,2339758983,3016033873,3097871343,3639523026,3844324983,3256173865,795471839,2951117563,4101031090,4091603803,3603732598,971261452,534414648,428311343,3389027175,2844869880,694888862,1227866773,2456207019,3043454569,2614353370,3749578031,3676663836,459166190,4132644070,1794958188,51825668,2252611902,3084671440,2036672799,3436641603,1099053433,2469121526,3059204941,1323291266,2061838604,1018778475,2233344254,2553501054,334295216,3556750194,1065731521,183467730),s[4]=new Array(2127105028,745436345,2601412319,2788391185,3093987327,500390133,1155374404,389092991,150729210,3891597772,3523549952,1935325696,716645080,946045387,2901812282,1774124410,3869435775,4039581901,3293136918,3438657920,948246080,363898952,3867875531,1286266623,1598556673,68334250,630723836,1104211938,1312863373,613332731,2377784574,1101634306,441780740,3129959883,1917973735,2510624549,3238456535,2544211978,3308894634,1299840618,4076074851,1756332096,3977027158,297047435,3790297736,2265573040,3621810518,1311375015,1667687725,47300608,3299642885,2474112369,201668394,1468347890,576830978,3594690761,3742605952,1958042578,1747032512,3558991340,1408974056,3366841779,682131401,1033214337,1545599232,4265137049,206503691,103024618,2855227313,1337551222,2428998917,2963842932,4015366655,3852247746,2796956967,3865723491,3747938335,247794022,3755824572,702416469,2434691994,397379957,851939612,2314769512,218229120,1380406772,62274761,214451378,3170103466,2276210409,3845813286,28563499,446592073,1693330814,3453727194,29968656,3093872512,220656637,2470637031,77972100,1667708854,1358280214,4064765667,2395616961,325977563,4277240721,4220025399,3605526484,3355147721,811859167,3069544926,3962126810,652502677,3075892249,4132761541,3498924215,1217549313,3250244479,3858715919,3053989961,1538642152,2279026266,2875879137,574252750,3324769229,2651358713,1758150215,141295887,2719868960,3515574750,4093007735,4194485238,1082055363,3417560400,395511885,2966884026,179534037,3646028556,3738688086,1092926436,2496269142,257381841,3772900718,1636087230,1477059743,2499234752,3811018894,2675660129,3285975680,90732309,1684827095,1150307763,1723134115,3237045386,1769919919,1240018934,815675215,750138730,2239792499,1234303040,1995484674,138143821,675421338,1145607174,1936608440,3238603024,2345230278,2105974004,323969391,779555213,3004902369,2861610098,1017501463,2098600890,2628620304,2940611490,2682542546,1171473753,3656571411,3687208071,4091869518,393037935,159126506,1662887367,1147106178,391545844,3452332695,1891500680,3016609650,1851642611,546529401,1167818917,3194020571,2848076033,3953471836,575554290,475796850,4134673196,450035699,2351251534,844027695,1080539133,86184846,1554234488,3692025454,1972511363,2018339607,1491841390,1141460869,1061690759,4244549243,2008416118,2351104703,2868147542,1598468138,722020353,1027143159,212344630,1387219594,1725294528,3745187956,2500153616,458938280,4129215917,1828119673,544571780,3503225445,2297937496,1241802790,267843827,2694610800,1397140384,1558801448,3782667683,1806446719,929573330,2234912681,400817706,616011623,4121520928,3603768725,1761550015,1968522284,4053731006,4192232858,4005120285,872482584,3140537016,3894607381,2287405443,1963876937,3663887957,1584857e3,2975024454,1833426440,4025083860),s[5]=new Array(4143615901,749497569,1285769319,3795025788,2514159847,23610292,3974978748,844452780,3214870880,3751928557,2213566365,1676510905,448177848,3730751033,4086298418,2307502392,871450977,3222878141,4110862042,3831651966,2735270553,1310974780,2043402188,1218528103,2736035353,4274605013,2702448458,3936360550,2693061421,162023535,2827510090,687910808,23484817,3784910947,3371371616,779677500,3503626546,3473927188,4157212626,3500679282,4248902014,2466621104,3899384794,1958663117,925738300,1283408968,3669349440,1840910019,137959847,2679828185,1239142320,1315376211,1547541505,1690155329,739140458,3128809933,3933172616,3876308834,905091803,1548541325,4040461708,3095483362,144808038,451078856,676114313,2861728291,2469707347,993665471,373509091,2599041286,4025009006,4170239449,2149739950,3275793571,3749616649,2794760199,1534877388,572371878,2590613551,1753320020,3467782511,1405125690,4270405205,633333386,3026356924,3475123903,632057672,2846462855,1404951397,3882875879,3915906424,195638627,2385783745,3902872553,1233155085,3355999740,2380578713,2702246304,2144565621,3663341248,3894384975,2502479241,4248018925,3094885567,1594115437,572884632,3385116731,767645374,1331858858,1475698373,3793881790,3532746431,1321687957,619889600,1121017241,3440213920,2070816767,2833025776,1933951238,4095615791,890643334,3874130214,859025556,360630002,925594799,1764062180,3920222280,4078305929,979562269,2810700344,4087740022,1949714515,546639971,1165388173,3069891591,1495988560,922170659,1291546247,2107952832,1813327274,3406010024,3306028637,4241950635,153207855,2313154747,1608695416,1150242611,1967526857,721801357,1220138373,3691287617,3356069787,2112743302,3281662835,1111556101,1778980689,250857638,2298507990,673216130,2846488510,3207751581,3562756981,3008625920,3417367384,2198807050,529510932,3547516680,3426503187,2364944742,102533054,2294910856,1617093527,1204784762,3066581635,1019391227,1069574518,1317995090,1691889997,3661132003,510022745,3238594800,1362108837,1817929911,2184153760,805817662,1953603311,3699844737,120799444,2118332377,207536705,2282301548,4120041617,145305846,2508124933,3086745533,3261524335,1877257368,2977164480,3160454186,2503252186,4221677074,759945014,254147243,2767453419,3801518371,629083197,2471014217,907280572,3900796746,940896768,2751021123,2625262786,3161476951,3661752313,3260732218,1425318020,2977912069,1496677566,3988592072,2140652971,3126511541,3069632175,977771578,1392695845,1698528874,1411812681,1369733098,1343739227,3620887944,1142123638,67414216,3102056737,3088749194,1626167401,2546293654,3941374235,697522451,33404913,143560186,2595682037,994885535,1247667115,3859094837,2699155541,3547024625,4114935275,2968073508,3199963069,2732024527,1237921620,951448369,1898488916,1211705605,2790989240,2233243581,3598044975),s[6]=new Array(2246066201,858518887,1714274303,3485882003,713916271,2879113490,3730835617,539548191,36158695,1298409750,419087104,1358007170,749914897,2989680476,1261868530,2995193822,2690628854,3443622377,3780124940,3796824509,2976433025,4259637129,1551479e3,512490819,1296650241,951993153,2436689437,2460458047,144139966,3136204276,310820559,3068840729,643875328,1969602020,1680088954,2185813161,3283332454,672358534,198762408,896343282,276269502,3014846926,84060815,197145886,376173866,3943890818,3813173521,3545068822,1316698879,1598252827,2633424951,1233235075,859989710,2358460855,3503838400,3409603720,1203513385,1193654839,2792018475,2060853022,207403770,1144516871,3068631394,1121114134,177607304,3785736302,326409831,1929119770,2983279095,4183308101,3474579288,3200513878,3228482096,119610148,1170376745,3378393471,3163473169,951863017,3337026068,3135789130,2907618374,1183797387,2015970143,4045674555,2182986399,2952138740,3928772205,384012900,2454997643,10178499,2879818989,2596892536,111523738,2995089006,451689641,3196290696,235406569,1441906262,3890558523,3013735005,4158569349,1644036924,376726067,1006849064,3664579700,2041234796,1021632941,1374734338,2566452058,371631263,4007144233,490221539,206551450,3140638584,1053219195,1853335209,3412429660,3562156231,735133835,1623211703,3104214392,2738312436,4096837757,3366392578,3110964274,3956598718,3196820781,2038037254,3877786376,2339753847,300912036,3766732888,2372630639,1516443558,4200396704,1574567987,4069441456,4122592016,2699739776,146372218,2748961456,2043888151,35287437,2596680554,655490400,1132482787,110692520,1031794116,2188192751,1324057718,1217253157,919197030,686247489,3261139658,1028237775,3135486431,3059715558,2460921700,986174950,2661811465,4062904701,2752986992,3709736643,367056889,1353824391,731860949,1650113154,1778481506,784341916,357075625,3608602432,1074092588,2480052770,3811426202,92751289,877911070,3600361838,1231880047,480201094,3756190983,3094495953,434011822,87971354,363687820,1717726236,1901380172,3926403882,2481662265,400339184,1490350766,2661455099,1389319756,2558787174,784598401,1983468483,30828846,3550527752,2716276238,3841122214,1765724805,1955612312,1277890269,1333098070,1564029816,2704417615,1026694237,3287671188,1260819201,3349086767,1016692350,1582273796,1073413053,1995943182,694588404,1025494639,3323872702,3551898420,4146854327,453260480,1316140391,1435673405,3038941953,3486689407,1622062951,403978347,817677117,950059133,4246079218,3278066075,1486738320,1417279718,481875527,2549965225,3933690356,760697757,1452955855,3897451437,1177426808,1702951038,4085348628,2447005172,1084371187,3516436277,3068336338,1073369276,1027665953,3284188590,1230553676,1368340146,2226246512,267243139,2274220762,4070734279,2497715176,2423353163,2504755875),s[7]=new Array(3793104909,3151888380,2817252029,895778965,2005530807,3871412763,237245952,86829237,296341424,3851759377,3974600970,2475086196,709006108,1994621201,2972577594,937287164,3734691505,168608556,3189338153,2225080640,3139713551,3033610191,3025041904,77524477,185966941,1208824168,2344345178,1721625922,3354191921,1066374631,1927223579,1971335949,2483503697,1551748602,2881383779,2856329572,3003241482,48746954,1398218158,2050065058,313056748,4255789917,393167848,1912293076,940740642,3465845460,3091687853,2522601570,2197016661,1727764327,364383054,492521376,1291706479,3264136376,1474851438,1685747964,2575719748,1619776915,1814040067,970743798,1561002147,2925768690,2123093554,1880132620,3151188041,697884420,2550985770,2607674513,2659114323,110200136,1489731079,997519150,1378877361,3527870668,478029773,2766872923,1022481122,431258168,1112503832,897933369,2635587303,669726182,3383752315,918222264,163866573,3246985393,3776823163,114105080,1903216136,761148244,3571337562,1690750982,3166750252,1037045171,1888456500,2010454850,642736655,616092351,365016990,1185228132,4174898510,1043824992,2023083429,2241598885,3863320456,3279669087,3674716684,108438443,2132974366,830746235,606445527,4173263986,2204105912,1844756978,2532684181,4245352700,2969441100,3796921661,1335562986,4061524517,2720232303,2679424040,634407289,885462008,3294724487,3933892248,2094100220,339117932,4048830727,3202280980,1458155303,2689246273,1022871705,2464987878,3714515309,353796843,2822958815,4256850100,4052777845,551748367,618185374,3778635579,4020649912,1904685140,3069366075,2670879810,3407193292,2954511620,4058283405,2219449317,3135758300,1120655984,3447565834,1474845562,3577699062,550456716,3466908712,2043752612,881257467,869518812,2005220179,938474677,3305539448,3850417126,1315485940,3318264702,226533026,965733244,321539988,1136104718,804158748,573969341,3708209826,937399083,3290727049,2901666755,1461057207,4013193437,4066861423,3242773476,2421326174,1581322155,3028952165,786071460,3900391652,3918438532,1485433313,4023619836,3708277595,3678951060,953673138,1467089153,1930354364,1533292819,2492563023,1346121658,1685000834,1965281866,3765933717,4190206607,2052792609,3515332758,690371149,3125873887,2180283551,2903598061,3933952357,436236910,289419410,14314871,1242357089,2904507907,1616633776,2666382180,585885352,3471299210,2699507360,1432659641,277164553,3354103607,770115018,2303809295,3741942315,3177781868,2853364978,2269453327,3774259834,987383833,1290892879,225909803,1741533526,890078084,1496906255,1111072499,916028167,243534141,1252605537,2204162171,531204876,290011180,3916834213,102027703,237315147,209093447,1486785922,220223953,2758195998,4175039106,82940208,3127791296,2569425252,518464269,1353887104,3941492737,2377294467,3935040926)},this.cast5.setKey(e),this.encrypt=function(e){return this.cast5.encrypt(e)}}Object.defineProperty(r,"__esModule",{value:!0}),r.default=n,n.blockSize=n.prototype.blockSize=8,n.keySize=n.prototype.keySize=16},{}],15:[function(e,t,r){"use strict";function n(e,t,r,n,i,s){var a,o,u,f,h,l,c,d,p,y,g,m,v,w,b=new Array(16843776,0,65536,16843780,16842756,66564,4,65536,1024,16843776,16843780,1024,16778244,16842756,16777216,4,1028,16778240,16778240,66560,66560,16842752,16842752,16778244,65540,16777220,16777220,65540,0,1028,66564,16777216,65536,16843780,4,16842752,16843776,16777216,16777216,1024,16842756,65536,66560,16777220,1024,4,16778244,66564,16843780,65540,16842752,16778244,16777220,1028,66564,16843776,1028,16778240,16778240,0,65540,66560,0,16842756),k=new Array(-2146402272,-2147450880,32768,1081376,1048576,32,-2146435040,-2147450848,-2147483616,-2146402272,-2146402304,-2147483648,-2147450880,1048576,32,-2146435040,1081344,1048608,-2147450848,0,-2147483648,32768,1081376,-2146435072,1048608,-2147483616,0,1081344,32800,-2146402304,-2146435072,32800,0,1081376,-2146435040,1048576,-2147450848,-2146435072,-2146402304,32768,-2146435072,-2147450880,32,-2146402272,1081376,32,32768,-2147483648,32800,-2146402304,1048576,-2147483616,1048608,-2147450848,-2147483616,1048608,1081344,0,-2147450880,32800,-2147483648,-2146435040,-2146402272,1081344),A=new Array(520,134349312,0,134348808,134218240,0,131592,134218240,131080,134217736,134217736,131072,134349320,131080,134348800,520,134217728,8,134349312,512,131584,134348800,134348808,131592,134218248,131584,131072,134218248,8,134349320,512,134217728,134349312,134217728,131080,520,131072,134349312,134218240,0,512,131080,134349320,134218240,134217736,512,0,134348808,134218248,131072,134217728,134349320,8,131592,131584,134217736,134348800,134218248,520,134348800,131592,8,134348808,131584),_=new Array(8396801,8321,8321,128,8396928,8388737,8388609,8193,0,8396800,8396800,8396929,129,0,8388736,8388609,1,8192,8388608,8396801,128,8388608,8193,8320,8388737,1,8320,8388736,8192,8396928,8396929,129,8388736,8388609,8396800,8396929,129,0,0,8396800,8320,8388736,8388737,1,8396801,8321,8321,128,8396929,129,1,8192,8388609,8193,8396928,8388737,8193,8320,8388608,8396801,128,8388608,8192,8396928),E=new Array(256,34078976,34078720,1107296512,524288,256,1073741824,34078720,1074266368,524288,33554688,1074266368,1107296512,1107820544,524544,1073741824,33554432,1074266112,1074266112,0,1073742080,1107820800,1107820800,33554688,1107820544,1073742080,0,1107296256,34078976,33554432,1107296256,524544,524288,1107296512,256,33554432,1073741824,34078720,1107296512,1074266368,33554688,1073741824,1107820544,34078976,1074266368,256,33554432,1107820544,1107820800,524544,1107296256,1107820800,34078720,0,1074266112,1107296256,524544,33554688,1073742080,524288,0,1074266112,34078976,1073742080),S=new Array(536870928,541065216,16384,541081616,541065216,16,541081616,4194304,536887296,4210704,4194304,536870928,4194320,536887296,536870912,16400,0,4194320,536887312,16384,4210688,536887312,16,541065232,541065232,0,4210704,541081600,16400,4210688,541081600,536870912,536887296,16,541065232,4210688,541081616,4194304,16400,536870928,4194304,536887296,536870912,16400,536870928,541081616,4210688,541065216,4210704,541081600,0,541065232,16,16384,541065216,4210704,16384,4194320,536887312,0,541081600,536870912,4194320,536887312),U=new Array(2097152,69206018,67110914,0,2048,67110914,2099202,69208064,69208066,2097152,0,67108866,2,67108864,69206018,2050,67110912,2099202,2097154,67110912,67108866,69206016,69208064,2097154,69206016,2048,2050,69208066,2099200,2,67108864,2099200,67108864,2099200,2097152,67110914,67110914,69206018,69206018,2,2097154,67108864,67110912,2097152,69208064,2050,2099202,69208064,2050,67108866,69208066,69206016,2099200,0,2,69208066,0,2099202,69206016,2048,67108866,67110912,2048,2097154),K=new Array(268439616,4096,262144,268701760,268435456,268439616,64,268435456,262208,268697600,268701760,266240,268701696,266304,4096,64,268697600,268435520,268439552,4160,266240,262208,268697664,268701696,4160,0,0,268697664,268435520,268439552,266304,262144,266304,262144,268701696,4096,64,268697664,4096,266304,268439552,64,268435520,268697600,268697664,268435456,262144,268439616,0,268701760,262208,268435520,268697600,268439552,268439616,0,268701760,266240,266240,4160,4160,262208,268435456,268701696),P=0,j=t.length,x=32===e.length?3:9;d=3===x?r?new Array(0,32,2):new Array(30,-2,-2):r?new Array(0,32,2,62,30,-2,64,96,2):new Array(94,62,-2,32,64,2,30,-2,-2),r&&(j=(t=function(e,t){var r,n=8-e.length%8;if(2===t&&n<8)r=" ".charCodeAt(0);else if(1===t)r=n;else{if(t||!(n<8)){if(8===n)return e;throw new Error("des: invalid padding")}r=0}for(var i=new Uint8Array(e.length+n),s=0;s>>4^c))<<4,l^=(u=65535&(l>>>16^(c^=u)))<<16,l^=u=858993459&((c^=u)>>>2^l),l^=u=16711935&((c^=u<<2)>>>8^l),l=(l^=(u=1431655765&(l>>>1^(c^=u<<8)))<<1)<<1|l>>>31,c=(c^=u)<<1|c>>>31,o=0;o>>4|c<<28)^e[a+1],u=l,l=c,c=u^(k[f>>>24&63]|_[f>>>16&63]|S[f>>>8&63]|K[63&f]|b[h>>>24&63]|A[h>>>16&63]|E[h>>>8&63]|U[63&h]);u=l,l=c,c=u}c=c>>>1|c<<31,c^=u=1431655765&((l=l>>>1|l<<31)>>>1^c),c^=(u=16711935&(c>>>8^(l^=u<<1)))<<8,c^=(u=858993459&(c>>>2^(l^=u)))<<2,c^=u=65535&((l^=u)>>>16^c),c^=u=252645135&((l^=u<<16)>>>4^c),l^=u<<4,1===n&&(r?(p=l,g=c):(l^=y,c^=m)),T[O++]=l>>>24,T[O++]=l>>>16&255,T[O++]=l>>>8&255,T[O++]=255&l,T[O++]=c>>>24,T[O++]=c>>>16&255,T[O++]=c>>>8&255,T[O++]=255&c}return r||(T=function(e,t){var r,n=null;if(2===t)r=" ".charCodeAt(0);else if(1===t)n=e[e.length-1];else{if(t)throw new Error("des: invalid padding");r=0}if(!n){for(n=1;e[e.length-n]===r;)n++;n--}return e.subarray(0,e.length-n)}(T,s)),T}function i(e){for(var t,r,n,i=new Array(0,4,536870912,536870916,65536,65540,536936448,536936452,512,516,536871424,536871428,66048,66052,536936960,536936964),s=new Array(0,1,1048576,1048577,67108864,67108865,68157440,68157441,256,257,1048832,1048833,67109120,67109121,68157696,68157697),a=new Array(0,8,2048,2056,16777216,16777224,16779264,16779272,0,8,2048,2056,16777216,16777224,16779264,16779272),o=new Array(0,2097152,134217728,136314880,8192,2105344,134225920,136323072,131072,2228224,134348800,136445952,139264,2236416,134356992,136454144),u=new Array(0,262144,16,262160,0,262144,16,262160,4096,266240,4112,266256,4096,266240,4112,266256),f=new Array(0,1024,32,1056,0,1024,32,1056,33554432,33555456,33554464,33555488,33554432,33555456,33554464,33555488),h=new Array(0,268435456,524288,268959744,2,268435458,524290,268959746,0,268435456,524288,268959744,2,268435458,524290,268959746),l=new Array(0,65536,2048,67584,536870912,536936448,536872960,536938496,131072,196608,133120,198656,537001984,537067520,537004032,537069568),c=new Array(0,262144,0,262144,2,262146,2,262146,33554432,33816576,33554432,33816576,33554434,33816578,33554434,33816578),d=new Array(0,268435456,8,268435464,0,268435456,8,268435464,1024,268436480,1032,268436488,1024,268436480,1032,268436488),p=new Array(0,32,0,32,1048576,1048608,1048576,1048608,8192,8224,8192,8224,1056768,1056800,1056768,1056800),y=new Array(0,16777216,512,16777728,2097152,18874368,2097664,18874880,67108864,83886080,67109376,83886592,69206016,85983232,69206528,85983744),g=new Array(0,4096,134217728,134221824,524288,528384,134742016,134746112,16,4112,134217744,134221840,524304,528400,134742032,134746128),m=new Array(0,4,256,260,0,4,256,260,1,5,257,261,1,5,257,261),v=e.length>8?3:1,w=new Array(32*v),b=new Array(0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0),k=0,A=0,_=0;_>>4^S))<<4,E^=n=65535&((S^=n)>>>-16^E),E^=(n=858993459&(E>>>2^(S^=n<<-16)))<<2,E^=n=65535&((S^=n)>>>-16^E),E^=(n=1431655765&(E>>>1^(S^=n<<-16)))<<1,E^=n=16711935&((S^=n)>>>8^E),n=(E^=(n=1431655765&(E>>>1^(S^=n<<8)))<<1)<<8|(S^=n)>>>20&240,E=S<<24|S<<8&16711680|S>>>8&65280|S>>>24&240,S=n;for(var U=0;U>>26,S=S<<2|S>>>26):(E=E<<1|E>>>27,S=S<<1|S>>>27),S&=-15,t=i[(E&=-15)>>>28]|s[E>>>24&15]|a[E>>>20&15]|o[E>>>16&15]|u[E>>>12&15]|f[E>>>8&15]|h[E>>>4&15],n=65535&((r=l[S>>>28]|c[S>>>24&15]|d[S>>>20&15]|p[S>>>16&15]|y[S>>>12&15]|g[S>>>8&15]|m[S>>>4&15])>>>16^t),w[A++]=t^n,w[A++]=r^n<<16}return w}function s(e){this.key=[];for(var t=0;t<3;t++)this.key.push(new Uint8Array(e.subarray(8*t,8*t+8)));this.encrypt=function(e){return n(i(this.key[2]),n(i(this.key[1]),n(i(this.key[0]),e,!0,0,null,null),!1,0,null,null),!0,0,null,null)}}Object.defineProperty(r,"__esModule",{value:!0}),s.keySize=s.prototype.keySize=24,s.blockSize=s.prototype.blockSize=8,r.default={des:s,originalDes:function(e){this.key=e,this.encrypt=function(e,t){return n(i(this.key),e,!0,0,null,t)},this.decrypt=function(e,t){return n(i(this.key),e,!1,0,null,t)}}}},{}],16:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(r,"__esModule",{value:!0});var i=n(e("./aes.js")),s=n(e("./des.js")),a=n(e("./cast5.js")),o=n(e("./twofish.js")),u=n(e("./blowfish.js"));r.default={aes128:i.default[128],aes192:i.default[192],aes256:i.default[256],des:s.default.originalDes,tripledes:s.default.des,cast5:a.default,twofish:o.default,blowfish:u.default,idea:function(){throw new Error("IDEA symmetric-key algorithm not implemented")}}},{"./aes.js":12,"./blowfish.js":13,"./cast5.js":14,"./des.js":15,"./twofish.js":17}],17:[function(e,t,r){"use strict";function n(e,t){return(e<>>32-t)&f}function i(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function s(e,t,r){e.splice(t,4,255&r,r>>>8&255,r>>>16&255,r>>>24&255)}function a(e,t){return e>>>8*t&255}function o(e){this.tf=function(){function e(e){return d[0][a(e,0)]^d[1][a(e,1)]^d[2][a(e,2)]^d[3][a(e,3)]}function t(e){return d[0][a(e,3)]^d[1][a(e,0)]^d[2][a(e,1)]^d[3][a(e,2)]}function r(r,i){var s=e(i[0]),a=t(i[1]);i[2]=n(i[2]^s+a+c[4*r+8]&f,31),i[3]=n(i[3],1)^s+2*a+c[4*r+9]&f,s=e(i[2]),a=t(i[3]),i[0]=n(i[0]^s+a+c[4*r+10]&f,31),i[1]=n(i[1],1)^s+2*a+c[4*r+11]&f}function o(r,i){var s=e(i[0]),a=t(i[1]);i[2]=n(i[2],1)^s+a+c[4*r+10]&f,i[3]=n(i[3]^s+2*a+c[4*r+11]&f,31),s=e(i[2]),a=t(i[3]),i[0]=n(i[0],1)^s+a+c[4*r+8]&f,i[1]=n(i[1]^s+2*a+c[4*r+9]&f,31)}var u=null,h=null,l=-1,c=[],d=[[],[],[],[]];return{name:"twofish",blocksize:16,open:function(e){function t(e){return e^e>>2^[0,90,180,238][3&e]}function r(e){return e^e>>1^e>>2^[0,238,180,90][3&e]}function s(e,t){var r,n,i;for(r=0;r<8;r++)n=t>>>24,t=t<<8&f|e>>>24,e=e<<8&f,i=n<<1,128&n&&(i^=333),t^=n^i<<16,i^=n>>>1,1&n&&(i^=166),t^=i<<24|i<<8;return t}function o(e,t){var r,n,i,s;return r=t>>4,n=15&t,i=U[e][r^n],s=K[e][x[n]^T[r]],j[e][x[s]^T[i]]<<4|P[e][i^s]}function h(e,t){var r=a(e,0),n=a(e,1),i=a(e,2),s=a(e,3);switch(v){case 4:r=O[1][r]^a(t[3],0),n=O[0][n]^a(t[3],1),i=O[0][i]^a(t[3],2),s=O[1][s]^a(t[3],3);case 3:r=O[1][r]^a(t[2],0),n=O[1][n]^a(t[2],1),i=O[0][i]^a(t[2],2),s=O[0][s]^a(t[2],3);case 2:r=O[0][O[0][r]^a(t[1],0)]^a(t[0],0),n=O[0][O[1][n]^a(t[1],1)]^a(t[0],1),i=O[1][O[0][i]^a(t[1],2)]^a(t[0],2),s=O[1][O[1][s]^a(t[1],3)]^a(t[0],3)}return C[0][r]^C[1][n]^C[2][i]^C[3][s]}var l,p,y,g,m,v,w,b,k,A=[],_=[],E=[],S=[],U=[[8,1,7,13,6,15,3,2,0,11,5,9,14,12,10,4],[2,8,11,13,15,7,6,14,3,1,9,4,0,10,12,5]],K=[[14,12,11,8,1,2,3,5,15,4,10,6,7,0,9,13],[1,14,2,11,4,12,3,7,6,13,10,5,15,9,0,8]],P=[[11,10,5,14,6,13,9,0,12,8,15,3,2,4,7,1],[4,12,7,5,1,6,9,10,0,14,13,8,2,11,3,15]],j=[[13,7,15,4,1,2,6,14,9,11,3,0,8,5,12,10],[11,9,5,1,12,3,13,14,6,4,7,15,2,0,8,10]],x=[0,8,1,9,2,10,3,11,4,12,5,13,6,14,7,15],T=[0,9,2,11,4,13,6,15,8,1,10,3,12,5,14,7],O=[[],[]],C=[[],[],[],[]];for(l=(u=(u=e).slice(0,32)).length;16!==l&&24!==l&&32!==l;)u[l++]=0;for(l=0;l>2]=i(u,l);for(l=0;l<256;l++)O[0][l]=o(0,l),O[1][l]=o(1,l);for(l=0;l<256;l++)b=t(w=O[1][l]),k=r(w),C[0][l]=w+(b<<8)+(k<<16)+(k<<24),C[2][l]=b+(k<<8)+(w<<16)+(k<<24),b=t(w=O[0][l]),k=r(w),C[1][l]=k+(k<<8)+(b<<16)+(w<<24),C[3][l]=b+(w<<8)+(k<<16)+(b<<24);for(v=E.length/2,l=0;l=0;n--)o(n,r);s(h,l,r[2]^c[0]),s(h,l+4,r[3]^c[1]),s(h,l+8,r[0]^c[2]),s(h,l+12,r[1]^c[3]),l+=16},finalize:function(){return h}}}(),this.tf.open(u(e),0),this.encrypt=function(e){return this.tf.encrypt(u(e),0)}}function u(e){for(var t=[],r=0;r>>32-i,r)}function s(e,t,r,n,s,a,o){return i(t&r|~t&n,e,t,s,a,o)}function a(e,t,r,n,s,a,o){return i(t&n|r&~n,e,t,s,a,o)}function o(e,t,r,n,s,a,o){return i(t^r^n,e,t,s,a,o)}function u(e,t,r,n,s,a,o){return i(r^(t|~n),e,t,s,a,o)}function f(e){for(var t="",r=0;r<4;r++)t+=d[e>>8*r+4&15]+d[e>>8*r&15];return t}function h(e){return function(e){for(var t=0;t>2]=e.charCodeAt(t)+(e.charCodeAt(t+1)<<8)+(e.charCodeAt(t+2)<<16)+(e.charCodeAt(t+3)<<24);return r}(e.substring(t-64,t)));e=e.substring(t-64);var s=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(t=0;t>2]|=e.charCodeAt(t)<<(t%4<<3);if(s[t>>2]|=128<<(t%4<<3),t>55)for(n(i,s),t=0;t<16;t++)s[t]=0;return s[14]=8*r,n(i,s),i}(e))}function l(e,t){return e+t&4294967295}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){var t=h(c.default.Uint8Array2str(e));return c.default.str2Uint8Array(c.default.hex2bin(t))};var c=function(e){return e&&e.__esModule?e:{default:e}}(e("../../util.js")),d="0123456789abcdef".split("")},{"../../util.js":70}],22:[function(e,t,r){"use strict";function n(e,t){return new Number(e<>>32-t)}function i(e,t,r){return new Number(e^t^r)}function s(e,t,r){return new Number(e&t|~e&r)}function a(e,t,r){return new Number((e|~t)^r)}function o(e,t,r){return new Number(e&r|t&~r)}function u(e,t,r){return new Number(e^(t|~r))}function f(e,t,r,f,h,l,c,d){switch(d){case 0:e+=i(t,r,f)+l+0;break;case 1:e+=s(t,r,f)+l+1518500249;break;case 2:e+=a(t,r,f)+l+1859775393;break;case 3:e+=o(t,r,f)+l+2400959708;break;case 4:e+=u(t,r,f)+l+2840853838;break;case 5:e+=u(t,r,f)+l+1352829926;break;case 6:e+=o(t,r,f)+l+1548603684;break;case 7:e+=a(t,r,f)+l+1836072691;break;case 8:e+=s(t,r,f)+l+2053994217;break;case 9:e+=i(t,r,f)+l+0;break;default:throw new Error("Bogus round number")}e=n(e,c)+h,r=n(r,10),e&=4294967295,t&=4294967295,r&=4294967295,f&=4294967295,h&=4294967295;var p=[];return p[0]=e,p[1]=t,p[2]=r,p[3]=f,p[4]=h,p[5]=l,p[6]=c,p}function h(e,t){var r,n,i,s=[],a=[];for(n=0;n<5;n++)s[n]=new Number(e[n]),a[n]=new Number(e[n]);var o=0;for(i=0;i<5;i++)for(n=0;n<16;n++)r=f(s[(o+0)%5],s[(o+1)%5],s[(o+2)%5],s[(o+3)%5],s[(o+4)%5],t[m[i][n]],g[i][n],i),s[(o+0)%5]=r[0],s[(o+1)%5]=r[1],s[(o+2)%5]=r[2],s[(o+3)%5]=r[3],s[(o+4)%5]=r[4],o+=4;for(o=0,i=5;i<10;i++)for(n=0;n<16;n++)r=f(a[(o+0)%5],a[(o+1)%5],a[(o+2)%5],a[(o+3)%5],a[(o+4)%5],t[m[i][n]],g[i][n],i),a[(o+0)%5]=r[0],a[(o+1)%5]=r[1],a[(o+2)%5]=r[2],a[(o+3)%5]=r[3],a[(o+4)%5]=r[4],o+=4;a[3]+=s[2]+e[1],e[1]=e[2]+s[3]+a[4],e[2]=e[3]+s[4]+a[0],e[3]=e[4]+s[0]+a[1],e[4]=e[0]+s[1]+a[2],e[0]=a[3]}function l(e){for(var t=0;t<16;t++)e[t]=0}function c(e){var t=(255&e.charCodeAt(3))<<24;return t|=(255&e.charCodeAt(2))<<16,t|=(255&e.charCodeAt(1))<<8,t|=255&e.charCodeAt(0)}function d(e){var t,r,n=new Array(y/32),i=new Array(y/8);!function(e){e[0]=1732584193,e[1]=4023233417,e[2]=2562383102,e[3]=271733878,e[4]=3285377520}(n),t=e.length;var s=new Array(16);l(s);var a,o=0;for(r=t;r>63;r-=64){for(a=0;a<16;a++)s[a]=c(e.substr(o,4)),o+=4;h(n,s)}for(function(e,t,r,n){var i=new Array(16);l(i);for(var s=0,a=0;a<(63&r);a++)i[a>>>2]^=(255&t.charCodeAt(s++))<<8*(3&a);i[r>>>2&15]^=1<<8*(3&r)+7,(63&r)>55&&(h(e,i),l(i=new Array(16))),i[14]=r<<3,i[15]=r>>>29|n<<3,h(e,i)}(n,e.substr(o),t,0),a=0;a>>2],i[a+1]=n[a>>>2]>>>8&255,i[a+2]=n[a>>>2]>>>16&255,i[a+3]=n[a>>>2]>>>24&255;return i}Object.defineProperty(r,"__esModule",{value:!0}),r.default=function(e){for(var t=d(p.default.Uint8Array2str(e)),r="",n=0;n(r=e.charCodeAt(n))?o.push(r):2048>r?(o.push(192|r>>>6),o.push(128|63&r)):55296>r||57344<=r?o.push(224|r>>>12,128|r>>>6&63,128|63&r):(n+=1,r=65536+((1023&r)<<10|1023&e.charCodeAt(n)),o.push(240|r>>>18,128|r>>>12&63,128|r>>>6&63,128|63&r)),i=0;i>>2;a.length<=s;)a.push(0);a[s]|=o[i]<<24-u%4*8,u+=1}else if("UTF16BE"===t||"UTF16LE"===t)for(n=0;n>8),s=u>>>2;a.length<=s;)a.push(0);a[s]|=r<<16-u%4*8,u+=2}return{value:a,binLen:8*u}}function s(e){var t,r,n,i=[],s=e.length;if(0!=s%2)throw"String of HEX type must be in byte increments";for(t=0;t>>3;i.length<=n;)i.push(0);i[t>>>3]|=r<<24-t%8*4}return{value:i,binLen:4*s}}function a(e){var t,r,n,i=[];for(r=0;r>>2,i.length<=n&&i.push(0),i[n]|=t<<24-r%4*8;return{value:i,binLen:8*e.length}}function o(e){var t,r,n,i,s,a,o=[],u=0;if(-1===e.search(/^[a-zA-Z0-9=+\/]+$/))throw"Invalid character in base-64 string";if(s=e.indexOf("="),e=e.replace(/\=/g,""),-1!==s&&s>2&63)),r=(3&i)<<4):1===u?(a.push(n.charAt(r|i>>4&15)),r=(15&i)<<2):2===u&&(a.push(n.charAt(r|i>>6&3)),(o+=1)%60==0&&a.push("\n"),a.push(n.charAt(63&i))),(o+=1)%60==0&&a.push("\n"),3===(u+=1)&&(u=0);if(u>0&&(a.push(n.charAt(r)),(o+=1)%60==0&&a.push("\n"),a.push("="),o+=1),1===u&&(o%60==0&&a.push("\n"),a.push("=")),!t)return a.join("")},decode:function(e){var t,r,i=[],s=0,a=0,o=e.length;for(r=0;r=0&&(s&&i.push(a|t>>6-s&255),a=t<<(s=s+2&7)&255);return new Uint8Array(i)}}},{}],35:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default={s2k:{simple:0,salted:1,iterated:3,gnu:101},publicKey:{rsa_encrypt_sign:1,rsa_encrypt:2,rsa_sign:3,elgamal:16,dsa:17},symmetric:{plaintext:0,idea:1,tripledes:2,cast5:3,blowfish:4,aes128:7,aes192:8,aes256:9,twofish:10},compression:{uncompressed:0,zip:1,zlib:2,bzip2:3},hash:{md5:1,sha1:2,ripemd:3,sha256:8,sha384:9,sha512:10,sha224:11},packet:{publicKeyEncryptedSessionKey:1,signature:2,symEncryptedSessionKey:3,onePassSignature:4,secretKey:5,publicKey:6,secretSubkey:7,compressed:8,symmetricallyEncrypted:9,marker:10,literal:11,trust:12,userid:13,publicSubkey:14,userAttribute:17,symEncryptedIntegrityProtected:18,modificationDetectionCode:19,symEncryptedAEADProtected:20},literal:{binary:"b".charCodeAt(),text:"t".charCodeAt(),utf8:"u".charCodeAt()},signature:{binary:0,text:1,standalone:2,cert_generic:16,cert_persona:17,cert_casual:18,cert_positive:19,cert_revocation:48,subkey_binding:24,key_binding:25,key:31,key_revocation:32,subkey_revocation:40,timestamp:64,third_party:80},signatureSubpacket:{signature_creation_time:2,signature_expiration_time:3,exportable_certification:4,trust_signature:5,regular_expression:6,revocable:7,key_expiration_time:9,placeholder_backwards_compatibility:10,preferred_symmetric_algorithms:11,revocation_key:12,issuer:16,notation_data:20,preferred_hash_algorithms:21,preferred_compression_algorithms:22,key_server_preferences:23,preferred_key_server:24,primary_user_id:25,policy_uri:26,key_flags:27,signers_user_id:28,reason_for_revocation:29,features:30,signature_target:31,embedded_signature:32},keyFlags:{certify_keys:1,sign_data:2,encrypt_communication:4,encrypt_storage:8,split_private_key:16,authentication:32,shared_private_key:128},keyStatus:{invalid:0,expired:1,revoked:2,valid:3,no_self_cert:4},armor:{multipart_section:0,multipart_last:1,signed:2,message:3,public_key:4,private_key:5,signature:6},write:function(e,t){if("number"==typeof t&&(t=this.read(e,t)),void 0!==e[t])return e[t];throw new Error("Invalid enum value.")},read:function(e,t){for(var r in e)if(e[r]===parseInt(t))return r;throw new Error("Invalid enum value.")}}},{}],36:[function(e,t,r){"use strict";function n(t){this._baseUrl=t||i.default.keyserver,this._fetch="undefined"!=typeof window?window.fetch:e("node-fetch")}Object.defineProperty(r,"__esModule",{value:!0}),r.default=n;var i=function(e){return e&&e.__esModule?e:{default:e}}(e("./config"));n.prototype.lookup=function(e){var t=this._baseUrl+"/pks/lookup?op=get&options=mr&search=",r=this._fetch;if(e.keyId)t+="0x"+encodeURIComponent(e.keyId);else{if(!e.query)throw new Error("You must provide a query parameter!");t+=encodeURIComponent(e.query)}return r(t).then(function(e){if(200===e.status)return e.text()}).then(function(e){if(e&&!(e.indexOf("-----END PGP PUBLIC KEY BLOCK-----")<0))return e.trim()})},n.prototype.upload=function(e){var t=this._baseUrl+"/pks/add";return(0,this._fetch)(t,{method:"post",headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"},body:"keytext="+encodeURIComponent(e)})}},{"./config":10,"node-fetch":"node-fetch"}],37:[function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(r,"__esModule",{value:!0}),r.HKP=r.AsyncProxy=r.Keyring=r.crypto=r.config=r.enums=r.armor=r.Keyid=r.S2K=r.MPI=r.packet=r.util=r.cleartext=r.message=r.signature=r.key=void 0;var s=e("./openpgp");Object.keys(s).forEach(function(e){"default"!==e&&"__esModule"!==e&&Object.defineProperty(r,e,{enumerable:!0,get:function(){return s[e]}})});var a=e("./util");Object.defineProperty(r,"util",{enumerable:!0,get:function(){return i(a).default}});var o=e("./packet");Object.defineProperty(r,"packet",{enumerable:!0,get:function(){return i(o).default}});var u=e("./type/mpi");Object.defineProperty(r,"MPI",{enumerable:!0,get:function(){return i(u).default}});var f=e("./type/s2k");Object.defineProperty(r,"S2K",{enumerable:!0,get:function(){return i(f).default}});var h=e("./type/keyid");Object.defineProperty(r,"Keyid",{enumerable:!0,get:function(){return i(h).default}});var l=e("./encoding/armor");Object.defineProperty(r,"armor",{enumerable:!0,get:function(){return i(l).default}});var c=e("./enums");Object.defineProperty(r,"enums",{enumerable:!0,get:function(){return i(c).default}});var d=e("./config/config");Object.defineProperty(r,"config",{enumerable:!0,get:function(){return i(d).default}});var p=e("./crypto");Object.defineProperty(r,"crypto",{enumerable:!0,get:function(){return i(p).default}});var y=e("./keyring");Object.defineProperty(r,"Keyring",{enumerable:!0,get:function(){return i(y).default}});var g=e("./worker/async_proxy");Object.defineProperty(r,"AsyncProxy",{enumerable:!0,get:function(){return i(g).default}});var m=e("./hkp");Object.defineProperty(r,"HKP",{enumerable:!0,get:function(){return i(m).default}});var v=n(s),w=n(e("./key")),b=n(e("./signature")),k=n(e("./message")),A=n(e("./cleartext"));r.default=v;r.key=w,r.signature=b,r.message=k,r.cleartext=A},{"./cleartext":5,"./config/config":9,"./crypto":24,"./encoding/armor":33,"./enums":35,"./hkp":36,"./key":38,"./keyring":39,"./message":42,"./openpgp":43,"./packet":47,"./signature":66,"./type/keyid":67,"./type/mpi":68,"./type/s2k":69,"./util":70,"./worker/async_proxy":71}],38:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(e){if(!(this instanceof i))return new i(e);if(this.primaryKey=null,this.revocationSignature=null,this.directSignatures=null,this.users=null,this.subKeys=null,this.packetlist2structure(e),!this.primaryKey||!this.users)throw new Error("Invalid key: need at least key and user ID packet")}function s(e,t){return e.algorithm!==p.default.read(p.default.publicKey,p.default.publicKey.dsa)&&e.algorithm!==p.default.read(p.default.publicKey,p.default.publicKey.rsa_sign)&&(!t.keyFlags||0!=(t.keyFlags[0]&p.default.keyFlags.encrypt_communication)||0!=(t.keyFlags[0]&p.default.keyFlags.encrypt_storage))}function a(e,t){return!(e.algorithm!==p.default.read(p.default.publicKey,p.default.publicKey.dsa)&&e.algorithm!==p.default.read(p.default.publicKey,p.default.publicKey.rsa_sign)&&e.algorithm!==p.default.read(p.default.publicKey,p.default.publicKey.rsa_encrypt_sign)||t.keyFlags&&0==(t.keyFlags[0]&p.default.keyFlags.sign_data))}function o(e,t){return 3===e.version&&0!==e.expirationTimeV3?new Date(e.created.getTime()+24*e.expirationTimeV3*3600*1e3):4===e.version&&!1===t.keyNeverExpires?new Date(e.created.getTime()+1e3*t.keyExpirationTime):null}function u(e,t,r,n){(e=e[r])&&(t[r]?e.forEach(function(e){e.isExpired()||n&&!n(e)||t[r].some(function(t){return m.default.equalsUint8Array(t.signature,e.signature)})||t[r].push(e)}):t[r]=e)}function f(e){if(!(this instanceof f))return new f(e);this.userId=e.tag===p.default.packet.userid?e:null,this.userAttribute=e.tag===p.default.packet.userAttribute?e:null,this.selfCertifications=null,this.otherCertifications=null,this.revocationCertifications=null}function h(e){if(!(this instanceof h))return new h(e);this.subKey=e,this.bindingSignatures=[],this.revocationSignature=null}function l(e){var t={};t.keys=[];try{var r=new d.default.List;r.read(e);var n=r.indexOfTag(p.default.packet.publicKey,p.default.packet.secretKey);if(0===n.length)throw new Error("No key packet found");for(var s=0;s0&&(o.keyExpirationTime=r.keyExpirationTime,o.keyNeverExpires=!1),o.sign(e,a),n.push(s),n.push(o)});var s={};s.key=e,s.bind=t;var a=new d.default.Signature;return a.signatureType=p.default.signature.subkey_binding,a.publicKeyAlgorithm=r.keyType,a.hashAlgorithm=g.default.prefer_hash_algorithm,a.keyFlags=[p.default.keyFlags.encrypt_communication|p.default.keyFlags.encrypt_storage],r.keyExpirationTime>0&&(a.keyExpirationTime=r.keyExpirationTime,a.keyNeverExpires=!1),a.sign(e,s),n.push(t),n.push(a),r.unlocked||(e.clearPrivateMPIs(),t.clearPrivateMPIs()),new i(n)}Object.defineProperty(r,"__esModule",{value:!0}),r.Key=i,r.read=l,r.readArmored=function(e){try{var t=y.default.decode(e);if(t.type!==p.default.armor.public_key&&t.type!==p.default.armor.private_key)throw new Error("Armored text not of type key");return l(t.data)}catch(e){var r={keys:[],err:[]};return r.err.push(e),r}},r.generate=function(e){var t,r;return Promise.resolve().then(function(){if(e.keyType=e.keyType||p.default.publicKey.rsa_encrypt_sign,e.keyType!==p.default.publicKey.rsa_encrypt_sign)throw new Error("Only RSA Encrypt or Sign supported");return e.passphrase||(e.unlocked=!0),(String.prototype.isPrototypeOf(e.userIds)||"string"==typeof e.userIds)&&(e.userIds=[e.userIds]),Promise.all([(t=new d.default.SecretKey,t.algorithm=p.default.read(p.default.publicKey,e.keyType),t.generate(e.numBits)),(r=new d.default.SecretSubkey,r.algorithm=p.default.read(p.default.publicKey,e.keyType),r.generate(e.numBits))]).then(function(){return c(t,r,e)})})},r.reformat=function(e){var t,r;return Promise.resolve().then(function(){if(e.keyType=e.keyType||p.default.publicKey.rsa_encrypt_sign,e.keyType!==p.default.publicKey.rsa_encrypt_sign)throw new Error("Only RSA Encrypt or Sign supported");if(!e.privateKey.decrypt())throw new Error("Key not decrypted");e.passphrase||(e.unlocked=!0),(String.prototype.isPrototypeOf(e.userIds)||"string"==typeof e.userIds)&&(e.userIds=[e.userIds]);for(var n=e.privateKey.toPacketlist(),i=0;i>r,n.count++})});var r={prio:0,algo:g.default.encryption_cipher};for(var n in t)try{n!==p.default.symmetric.plaintext&&n!==p.default.symmetric.idea&&p.default.read(p.default.symmetric,n)&&t[n].count===e.length&&t[n].prio>r.prio&&(r=t[n])}catch(e){}return r.algo};var d=n(e("./packet")),p=n(e("./enums.js")),y=n(e("./encoding/armor.js")),g=n(e("./config")),m=n(e("./util"));i.prototype.packetlist2structure=function(e){for(var t,r,n,i=0;i1&&void 0!==arguments[1]&&arguments[1],r=this.getPrimaryUser(t);if(r&&a(this.primaryKey,r.selfCertificate)&&(!e||this.primaryKey.getKeyId().equals(e))&&this.verifyPrimaryKey(t)===p.default.keyStatus.valid)return this.primaryKey;if(this.subKeys)for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];if(this.revocationSignature&&!this.revocationSignature.isExpired()&&(this.revocationSignature.verified||this.revocationSignature.verify(this.primaryKey,{key:this.primaryKey})))return p.default.keyStatus.revoked;if(!e&&3===this.primaryKey.version&&0!==this.primaryKey.expirationTimeV3&&Date.now()>this.primaryKey.created.getTime()+24*this.primaryKey.expirationTimeV3*3600*1e3)return p.default.keyStatus.expired;for(var t=!1,r=0;rthis.primaryKey.created.getTime()+1e3*n.selfCertificate.keyExpirationTime?p.default.keyStatus.expired:p.default.keyStatus.valid:p.default.keyStatus.invalid},i.prototype.getExpirationTime=function(){if(3===this.primaryKey.version)return o(this.primaryKey);if(4===this.primaryKey.version){var e=this.getPrimaryUser();return e?o(this.primaryKey,e.selfCertificate):null}},i.prototype.getPrimaryUser=function(){for(var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=[],r=0;rt.selfCertificate.isPrimaryUserID?-1:e.selfCertificate.isPrimaryUserIDt.selfCertificate.created?-1:e.selfCertificate.created2&&void 0!==arguments[2]&&arguments[2];return!this.isRevoked(t,e)&&!(t.isExpired()&&!r||!t.verified&&!t.verify(e,{userid:this.userId||this.userAttribute,key:e}))},f.prototype.sign=function(e,t){var r,n,i,s;return n={},n.key=e,n.userid=this.userId||this.userAttribute,r=new f(this.userId||this.userAttribute),r.otherCertifications=[],t.forEach(function(t){if(t.isPublic())throw new Error("Need private key for signing");if(t.primaryKey.getFingerprint()===e.getFingerprint())throw new Error("Not implemented for self signing");if(!(i=t.getSigningKeyPacket()))throw new Error("Could not find valid signing key packet");if(!i.isDecrypted)throw new Error("Private key is not decrypted.");(s=new d.default.Signature).signatureType=p.default.write(p.default.signature,p.default.signature.cert_generic),s.keyFlags=[p.default.keyFlags.certify_keys|p.default.keyFlags.sign_data],s.hashAlgorithm=t.getPreferredHashAlgorithm(),s.publicKeyAlgorithm=i.algorithm,s.signingKeyId=i.getKeyId(),s.sign(i,n),r.otherCertifications.push(s)}),r.update(this,e),r},f.prototype.verifyAllSignatures=function(e,t){var r={userid:this.userId||this.userAttribute,key:e};return this.selfCertifications.concat(this.otherCertifications||[]).map(function(e){var n=t.filter(function(t){return t.getSigningKeyPacket(e.issuerKeyId)}),i=null;return n.length>0&&(i=n.some(function(t){return e.verify(t.primaryKey,r)})),{keyid:e.issuerKeyId,valid:i}})},f.prototype.verify=function(e){if(!this.selfCertifications)return p.default.keyStatus.no_self_cert;for(var t,r=0;r1&&void 0!==arguments[1]&&arguments[1];if(this.verify(e,t)!==p.default.keyStatus.valid)return!1;for(var r=0;r1&&void 0!==arguments[1]&&arguments[1];if(this.revocationSignature&&!this.revocationSignature.isExpired()&&(this.revocationSignature.verified||this.revocationSignature.verify(e,{key:e,bind:this.subKey})))return p.default.keyStatus.revoked;if(!t&&3===this.subKey.version&&0!==this.subKey.expirationTimeV3&&Date.now()>this.subKey.created.getTime()+24*this.subKey.expirationTimeV3*3600*1e3)return p.default.keyStatus.expired;for(var r=0;rthis.subKey.created.getTime()+1e3*i.keyExpirationTime))return p.default.keyStatus.valid;if(n)return p.default.keyStatus.expired}else if(n)return p.default.keyStatus.invalid}else if(n)return p.default.keyStatus.expired}return p.default.keyStatus.invalid},h.prototype.getExpirationTime=function(){for(var e,t=0;te)&&(e=r)}return e},h.prototype.update=function(e,t){if(e.verify(t)!==p.default.keyStatus.invalid){if(this.subKey.getFingerprint()!==e.subKey.getFingerprint())throw new Error("SubKey update method: fingerprints of subkeys not equal");if(this.subKey.tag===p.default.packet.publicSubkey&&e.subKey.tag===p.default.packet.secretSubkey&&(this.subKey=e.subKey),this.bindingSignatures.length"),i=t.getUserIds(),s=0;s0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=new h.default.List,n=this.packets.findPacket(l.default.packet.literal);if(!n)throw new Error("No literal data packet to sign.");var i,a,o,u,f=l.default.write(l.default.literal,n.format)===l.default.literal.binary?l.default.signature.binary:l.default.signature.text;if(t&&(o=t.packets.filterByTag(l.default.packet.signature)).length)for(i=o.length-1;i>=0;i--){var c=o[i];(u=new h.default.OnePassSignature).type=f,u.hashAlgorithm=d.default.prefer_hash_algorithm,u.publicKeyAlgorithm=c.publicKeyAlgorithm,u.signingKeyId=c.issuerKeyId,e.length||0!==i||(u.flags=1),r.push(u)}for(i=0;i=0;i--){var p=new h.default.Signature;if(p.signatureType=f,p.hashAlgorithm=d.default.prefer_hash_algorithm,p.publicKeyAlgorithm=a.algorithm,!a.isDecrypted)throw new Error("Private key is not decrypted.");p.sign(a,n),r.push(p)}return t&&r.concat(o),new s(r)},s.prototype.signDetached=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=new h.default.List,n=this.packets.findPacket(l.default.packet.literal);if(!n)throw new Error("No literal data packet to sign.");for(var i=l.default.write(l.default.literal,n.format)===l.default.literal.binary?l.default.signature.binary:l.default.signature.text,s=0;s0&&(e.name+=" "),e.name+"<"+e.email+">"}),e):e}function u(e){return e&&!g.default.isArray(e)&&(e=[e]),e}function f(e,t){return new Promise(function(t){return t(e())}).catch(h.bind(null,t))}function h(e,t){throw y.default.debug&&console.error(t.stack),t.message=e+": "+t.message,t}function l(){return g.default.getWebCrypto()&&y.default.aead_protect}Object.defineProperty(r,"__esModule",{value:!0}),r.initWorker=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,r=void 0===t?"openpgp.worker.min.js":t,n=e.worker;if(n||"undefined"!=typeof window&&window.Worker)return v=new m.default({path:r,worker:n,config:y.default}),!0},r.getWorker=function(){return v},r.destroyWorker=function(){v=void 0},r.generateKey=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.userIds,r=void 0===t?[]:t,n=e.passphrase,i=e.numBits,s=void 0===i?2048:i,a=e.unlocked,u=void 0!==a&&a,f=e.keyExpirationTime,l=o({userIds:r,passphrase:n,numBits:s,unlocked:u,keyExpirationTime:void 0===f?0:f});return!g.default.getWebCryptoAll()&&v?v.delegate("generateKey",l):p.generate(l).then(function(e){return{key:e,privateKeyArmored:e.armor(),publicKeyArmored:e.toPublic().armor()}}).catch(h.bind(null,"Error generating keypair"))},r.reformatKey=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.privateKey,r=e.userIds,n=void 0===r?[]:r,i=e.passphrase,s=void 0===i?"":i,a=e.unlocked,u=void 0!==a&&a,f=e.keyExpirationTime,l=o({privateKey:t,userIds:n,passphrase:s,unlocked:u,keyExpirationTime:void 0===f?0:f});return v?v.delegate("reformatKey",l):p.reformat(l).then(function(e){return{key:e,privateKeyArmored:e.armor(),publicKeyArmored:e.toPublic().armor()}}).catch(h.bind(null,"Error reformatting keypair"))},r.decryptKey=function(e){var t=e.privateKey,r=e.passphrase;return v?v.delegate("decryptKey",{privateKey:t,passphrase:r}):f(function(){if(!t.decrypt(r))throw new Error("Invalid passphrase");return{key:t}},"Error decrypting private key")},r.encrypt=function(e){var t=e.data,r=e.publicKeys,n=e.privateKeys,i=e.passwords,a=e.sessionKey,o=e.filename,f=e.armor,d=void 0===f||f,p=e.detached,y=void 0!==p&&p,m=e.signature,w=void 0===m?null:m,b=e.returnSessionKey,k=void 0!==b&&b;if(s(t),r=u(r),n=u(n),i=u(i),!l()&&v)return v.delegate("encrypt",{data:t,publicKeys:r,privateKeys:n,passwords:i,sessionKey:a,filename:o,armor:d,detached:y,signature:w,returnSessionKey:k});var A={};return Promise.resolve().then(function(){var e=function(e,t){var r=void 0;if(g.default.isUint8Array(e))r=c.fromBinary(e,t);else{if(!g.default.isString(e))throw new Error("Data must be of type String or Uint8Array");r=c.fromText(e,t)}return r}(t,o);if(n||(n=[]),n.length||w)if(y){var s=e.signDetached(n,w);A.signature=d?s.armor():s}else e=e.sign(n,w);return e.encrypt(r,i,a)}).then(function(e){return d?A.data=e.message.armor():A.message=e.message,k&&(A.sessionKey=e.sessionKey),A}).catch(h.bind(null,"Error encrypting message"))},r.decrypt=function(e){var t=e.message,r=e.privateKey,n=e.publicKeys,i=e.sessionKey,s=e.password,o=e.format,f=void 0===o?"utf8":o,c=e.signature,d=void 0===c?null:c;return a(t),n=u(n),!l()&&v?v.delegate("decrypt",{message:t,privateKey:r,publicKeys:n,sessionKey:i,password:s,format:f,signature:d}):t.decrypt(r,i,s).then(function(e){var t=function(e,t){if("binary"===t)return{data:e.getLiteralData(),filename:e.getFilename()};if("utf8"===t)return{data:e.getText(),filename:e.getFilename()};throw new Error("Invalid format")}(e,f);return n||(n=[]),t.signatures=d?e.verifyDetached(d,n):e.verify(n),t}).catch(h.bind(null,"Error decrypting message"))},r.sign=function(e){var t=e.data,r=e.privateKeys,n=e.armor,i=void 0===n||n,a=e.detached,o=void 0!==a&&a;if(s(t),r=u(r),v)return v.delegate("sign",{data:t,privateKeys:r,armor:i,detached:o});var h={};return f(function(){var e;if(e=g.default.isString(t)?new d.CleartextMessage(t):c.fromBinary(t),o){var n=e.signDetached(r);h.signature=i?n.armor():n}else e=e.sign(r),i?h.data=e.armor():h.message=e;return h},"Error signing cleartext message")},r.verify=function(e){var t=e.message,r=e.publicKeys,n=e.signature,i=void 0===n?null:n;if(function(e){if(!d.CleartextMessage.prototype.isPrototypeOf(e)&&!c.Message.prototype.isPrototypeOf(e))throw new Error("Parameter [message] needs to be of type Message or CleartextMessage")}(t),r=u(r),v)return v.delegate("verify",{message:t,publicKeys:r,signature:i});var s={};return f(function(){return d.CleartextMessage.prototype.isPrototypeOf(t)?s.data=t.getText():s.data=t.getLiteralData(),s.signatures=i?t.verifyDetached(i,r):t.verify(r),s},"Error verifying cleartext signed message")},r.encryptSessionKey=function(e){var t=e.data,r=e.algorithm,n=e.publicKeys,i=e.passwords;return function(e,t){if(!g.default.isUint8Array(e))throw new Error("Parameter ["+(t||"data")+"] must be of type Uint8Array")}(t),function(e,t){if(!g.default.isString(e))throw new Error("Parameter ["+(t||"data")+"] must be of type String")}(r,"algorithm"),n=u(n),i=u(i),v?v.delegate("encryptSessionKey",{data:t,algorithm:r,publicKeys:n,passwords:i}):f(function(){return{message:c.encryptSessionKey(t,r,n,i)}},"Error encrypting session key")},r.decryptSessionKey=function(e){var t=e.message,r=e.privateKey,n=e.password;return a(t),v?v.delegate("decryptSessionKey",{message:t,privateKey:r,password:n}):f(function(){return t.decryptSessionKey(r,n)},"Error decrypting session key")};var c=i(e("./message.js")),d=i(e("./cleartext.js")),p=i(e("./key.js")),y=n(e("./config/config.js")),g=n(e("./util")),m=n(e("./worker/async_proxy.js"));n(e("es6-promise")).default.polyfill();var v=void 0},{"./cleartext.js":5,"./config/config.js":9,"./key.js":38,"./message.js":42,"./util":70,"./worker/async_proxy.js":71,"es6-promise":2}],44:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(e){return new(_[function(e){return e.substr(0,1).toUpperCase()+e.substr(1)}(e)])}Object.defineProperty(r,"__esModule",{value:!0}),r.Trust=r.Signature=r.SecretSubkey=r.Userid=r.SecretKey=r.OnePassSignature=r.UserAttribute=r.PublicSubkey=r.Marker=r.SymmetricallyEncrypted=r.PublicKey=r.Literal=r.SymEncryptedSessionKey=r.PublicKeyEncryptedSessionKey=r.SymEncryptedAEADProtected=r.SymEncryptedIntegrityProtected=r.Compressed=void 0;var s=e("./compressed.js");Object.defineProperty(r,"Compressed",{enumerable:!0,get:function(){return n(s).default}});var a=e("./sym_encrypted_integrity_protected.js");Object.defineProperty(r,"SymEncryptedIntegrityProtected",{enumerable:!0,get:function(){return n(a).default}});var o=e("./sym_encrypted_aead_protected.js");Object.defineProperty(r,"SymEncryptedAEADProtected",{enumerable:!0,get:function(){return n(o).default}});var u=e("./public_key_encrypted_session_key.js");Object.defineProperty(r,"PublicKeyEncryptedSessionKey",{enumerable:!0,get:function(){return n(u).default}});var f=e("./sym_encrypted_session_key.js");Object.defineProperty(r,"SymEncryptedSessionKey",{enumerable:!0,get:function(){return n(f).default}});var h=e("./literal.js");Object.defineProperty(r,"Literal",{enumerable:!0,get:function(){return n(h).default}});var l=e("./public_key.js");Object.defineProperty(r,"PublicKey",{enumerable:!0,get:function(){return n(l).default}});var c=e("./symmetrically_encrypted.js");Object.defineProperty(r,"SymmetricallyEncrypted",{enumerable:!0,get:function(){return n(c).default}});var d=e("./marker.js");Object.defineProperty(r,"Marker",{enumerable:!0,get:function(){return n(d).default}});var p=e("./public_subkey.js");Object.defineProperty(r,"PublicSubkey",{enumerable:!0,get:function(){return n(p).default}});var y=e("./user_attribute.js");Object.defineProperty(r,"UserAttribute",{enumerable:!0,get:function(){return n(y).default}});var g=e("./one_pass_signature.js");Object.defineProperty(r,"OnePassSignature",{enumerable:!0,get:function(){return n(g).default}});var m=e("./secret_key.js");Object.defineProperty(r,"SecretKey",{enumerable:!0,get:function(){return n(m).default}});var v=e("./userid.js");Object.defineProperty(r,"Userid",{enumerable:!0,get:function(){return n(v).default}});var w=e("./secret_subkey.js");Object.defineProperty(r,"SecretSubkey",{enumerable:!0,get:function(){return n(w).default}});var b=e("./signature.js");Object.defineProperty(r,"Signature",{enumerable:!0,get:function(){return n(b).default}});var k=e("./trust.js");Object.defineProperty(r,"Trust",{enumerable:!0,get:function(){return n(k).default}}),r.newPacketFromTag=i,r.fromStructuredClone=function(e){var t=i(A.default.read(A.default.packet,e.tag));for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return t.postCloneTypeFix&&t.postCloneTypeFix(),t};var A=n(e("../enums.js")),_=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(e("./all_packets.js"))},{"../enums.js":35,"./all_packets.js":44,"./compressed.js":46,"./literal.js":48,"./marker.js":49,"./one_pass_signature.js":50,"./public_key.js":53,"./public_key_encrypted_session_key.js":54,"./public_subkey.js":55,"./secret_key.js":56,"./secret_subkey.js":57,"./signature.js":58,"./sym_encrypted_aead_protected.js":59,"./sym_encrypted_integrity_protected.js":60,"./sym_encrypted_session_key.js":61,"./symmetrically_encrypted.js":62,"./trust.js":63,"./user_attribute.js":64,"./userid.js":65}],45:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function s(e){var t=l.default.fromStructuredClone(e);return new o.Key(t)}function a(e){return e.keyid=c.default.fromClone(e.keyid),e.signature=new h.Signature(e.signature),e}Object.defineProperty(r,"__esModule",{value:!0}),r.clonePackets=function(e){return e.publicKeys&&(e.publicKeys=e.publicKeys.map(function(e){return e.toPacketlist()})),e.privateKeys&&(e.privateKeys=e.privateKeys.map(function(e){return e.toPacketlist()})),e.privateKey&&(e.privateKey=e.privateKey.toPacketlist()),e.key&&(e.key=e.key.toPacketlist()),e.message&&(e.message instanceof u.Message?e.message=e.message.packets:e.message instanceof f.CleartextMessage&&(e.message.signature=e.message.signature.packets)),e.signature&&e.signature instanceof h.Signature&&(e.signature=e.signature.packets),e.signatures&&(e.signatures=e.signatures.map(function(e){return function(e){return e.signature=e.signature.packets,e}(e)})),e},r.parseClonedPackets=function(e,t){return e.publicKeys&&(e.publicKeys=e.publicKeys.map(s)),e.privateKeys&&(e.privateKeys=e.privateKeys.map(s)),e.privateKey&&(e.privateKey=s(e.privateKey)),e.key&&(e.key=s(e.key)),e.message&&e.message.signature?e.message=function(e){var t=l.default.fromStructuredClone(e.signature);return new f.CleartextMessage(e.text,new h.Signature(t))}(e.message):e.message&&(e.message=function(e){var t=l.default.fromStructuredClone(e);return new u.Message(t)}(e.message)),e.signatures&&(e.signatures=e.signatures.map(a)),e.signature&&(e.signature=function(e){if("string"==typeof e)return e;var t=l.default.fromStructuredClone(e);return new h.Signature(t)}(e.signature)),e};var o=i(e("../key.js")),u=i(e("../message.js")),f=i(e("../cleartext.js")),h=i(e("../signature.js")),l=n(e("./packetlist.js")),c=n(e("../type/keyid.js"))},{"../cleartext.js":5,"../key.js":38,"../message.js":42,"../signature.js":66,"../type/keyid.js":67,"./packetlist.js":52}],46:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(){this.tag=s.default.packet.compressed,this.packets=null,this.algorithm="zip",this.compressed=null}Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var s=n(e("../enums.js")),a=n(e("../util.js")),o=n(e("../compression/zlib.min.js")),u=n(e("../compression/rawinflate.min.js")),f=n(e("../compression/rawdeflate.min.js"));i.prototype.read=function(e){this.algorithm=s.default.read(s.default.compression,e[0]),this.compressed=e.subarray(1,e.length),this.decompress()},i.prototype.write=function(){return null===this.compressed&&this.compress(),a.default.concatUint8Array(new Uint8Array([s.default.write(s.default.compression,this.algorithm)]),this.compressed)},i.prototype.decompress=function(){var e;switch(this.algorithm){case"uncompressed":e=this.compressed;break;case"zip":e=new u.default.Zlib.RawInflate(this.compressed).decompress();break;case"zlib":e=new o.default.Zlib.Inflate(this.compressed).decompress();break;case"bzip2":throw new Error("Compression algorithm BZip2 [BZ2] is not implemented.");default:throw new Error("Compression algorithm unknown :"+this.algorithm)}this.packets.read(e)},i.prototype.compress=function(){var e,t;switch(e=this.packets.write(),this.algorithm){case"uncompressed":this.compressed=e;break;case"zip":t=new f.default.Zlib.RawDeflate(e),this.compressed=t.compress();break;case"zlib":t=new o.default.Zlib.Deflate(e),this.compressed=t.compress();break;case"bzip2":throw new Error("Compression algorithm BZip2 [BZ2] is not implemented.");default:throw new Error("Compression algorithm unknown :"+this.type)}}},{"../compression/rawdeflate.min.js":6,"../compression/rawinflate.min.js":7,"../compression/zlib.min.js":8,"../enums.js":35,"../util.js":70}],47:[function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}Object.defineProperty(r,"__esModule",{value:!0});var i=n(e("./all_packets.js")),s=n(e("./clone.js")),a={List:function(e){return e&&e.__esModule?e:{default:e}}(e("./packetlist.js")).default,clone:s};for(var o in i)a[o]=i[o];r.default=a},{"./all_packets.js":44,"./clone.js":45,"./packetlist.js":52}],48:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(){this.tag=a.default.packet.literal,this.format="utf8",this.date=new Date,this.data=new Uint8Array(0),this.filename="msg.txt"}Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var s=n(e("../util.js")),a=n(e("../enums.js"));i.prototype.setText=function(e){e=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n").replace(/\n/g,"\r\n"),this.data="utf8"===this.format?s.default.str2Uint8Array(s.default.encode_utf8(e)):s.default.str2Uint8Array(e)},i.prototype.getText=function(){return s.default.decode_utf8(s.default.Uint8Array2str(this.data)).replace(/\r\n/g,"\n")},i.prototype.setBytes=function(e,t){this.format=t,this.data=e},i.prototype.getBytes=function(){return this.data},i.prototype.setFilename=function(e){this.filename=e},i.prototype.getFilename=function(){return this.filename},i.prototype.read=function(e){var t=a.default.read(a.default.literal,e[0]),r=e[1];this.filename=s.default.decode_utf8(s.default.Uint8Array2str(e.subarray(2,2+r))),this.date=s.default.readDate(e.subarray(2+r,2+r+4));var n=e.subarray(6+r,e.length);this.setBytes(n,t)},i.prototype.write=function(){var e=s.default.str2Uint8Array(s.default.encode_utf8(this.filename)),t=new Uint8Array([e.length]),r=new Uint8Array([a.default.write(a.default.literal,this.format)]),n=s.default.writeDate(this.date),i=this.getBytes();return s.default.concatUint8Array([r,t,e,n,i])}},{"../enums.js":35,"../util.js":70}],49:[function(e,t,r){"use strict";function n(){this.tag=i.default.packet.marker}Object.defineProperty(r,"__esModule",{value:!0}),r.default=n;var i=function(e){return e&&e.__esModule?e:{default:e}}(e("../enums.js"));n.prototype.read=function(e){return 80===e[0]&&71===e[1]&&80===e[2]}},{"../enums.js":35}],50:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(){this.tag=a.default.packet.onePassSignature,this.version=null,this.type=null,this.hashAlgorithm=null,this.publicKeyAlgorithm=null,this.signingKeyId=null,this.flags=null}Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var s=n(e("../util.js")),a=n(e("../enums.js")),o=n(e("../type/keyid.js"));i.prototype.read=function(e){var t=0;return this.version=e[t++],this.type=a.default.read(a.default.signature,e[t++]),this.hashAlgorithm=a.default.read(a.default.hash,e[t++]),this.publicKeyAlgorithm=a.default.read(a.default.publicKey,e[t++]),this.signingKeyId=new o.default,this.signingKeyId.read(e.subarray(t,t+8)),t+=8,this.flags=e[t++],this},i.prototype.write=function(){var e=new Uint8Array([3,a.default.write(a.default.signature,this.type),a.default.write(a.default.hash,this.hashAlgorithm),a.default.write(a.default.publicKey,this.publicKeyAlgorithm)]),t=new Uint8Array([this.flags]);return s.default.concatUint8Array([e,this.signingKeyId.write(),t])},i.prototype.postCloneTypeFix=function(){this.signingKeyId=o.default.fromClone(this.signingKeyId)}},{"../enums.js":35,"../type/keyid.js":67,"../util.js":70}],51:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(e){return e&&e.__esModule?e:{default:e}}(e("../util.js"));r.default={readSimpleLength:function(e){var t,r=0,i=e[0];return i<192?(r=e[0],t=1):i<255?(r=(e[0]-192<<8)+e[1]+192,t=2):255===i&&(r=n.default.readNumber(e.subarray(1,5)),t=5),{len:r,offset:t}},writeSimpleLength:function(e){return e<192?new Uint8Array([e]):e>191&&e<8384?new Uint8Array([192+(e-192>>8),e-192&255]):n.default.concatUint8Array([new Uint8Array([255]),n.default.writeNumber(e,4)])},writeHeader:function(e,t){return n.default.concatUint8Array([new Uint8Array([192|e]),this.writeSimpleLength(t)])},writeOldHeader:function(e,t){return t<256?new Uint8Array([128|e<<2,t]):t<65536?n.default.concatUint8Array([new Uint8Array([129|e<<2]),n.default.writeNumber(t,2)]):n.default.concatUint8Array([new Uint8Array([130|e<<2]),n.default.writeNumber(t,4)])},read:function(e,t,r){if(null===e||e.length<=t||e.subarray(t,e.length).length<2||0==(128&e[t]))throw new Error("Error during parsing. This message / key probably does not conform to a valid OpenPGP format.");var i,s=t,a=-1,o=-1;o=0,0!=(64&e[s])&&(o=1);var u;o?a=63&e[s]:(a=(63&e[s])>>2,u=3&e[s]),s++;var f=null,h=-1;if(o)if(e[s]<192)i=e[s++],n.default.print_debug("1 byte length:"+i);else if(e[s]>=192&&e[s]<224)i=(e[s++]-192<<8)+e[s++]+192,n.default.print_debug("2 byte length:"+i);else if(e[s]>223&&e[s]<255){i=1<<(31&e[s++]),n.default.print_debug("4 byte length:"+i);var l=s+i;f=[e.subarray(s,s+i)];for(var c;;){if(e[l]<192){i+=c=e[l++],f.push(e.subarray(l,l+c)),l+=c;break}if(e[l]>=192&&e[l]<224){i+=c=(e[l++]-192<<8)+e[l++]+192,f.push(e.subarray(l,l+c)),l+=c;break}if(!(e[l]>223&&e[l]<255)){l++,c=e[l++]<<24|e[l++]<<16|e[l++]<<8|e[l++],f.push(e.subarray(l,l+c)),i+=c,l+=c;break}i+=c=1<<(31&e[l++]),f.push(e.subarray(l,l+c)),l+=c}h=l-s}else s++,i=e[s++]<<24|e[s++]<<16|e[s++]<<8|e[s++];else switch(u){case 0:i=e[s++];break;case 1:i=e[s++]<<8|e[s++];break;case 2:i=e[s++]<<24|e[s++]<<16|e[s++]<<8|e[s++];break;default:i=r}return-1===h&&(h=i),null===f?f=e.subarray(s,s+h):f instanceof Array&&(f=n.default.concatUint8Array(f)),{tag:a,packet:f,offset:s+h}}}},{"../util.js":70}],52:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(){this.length=0}Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var s=n(e("../util")),a=n(e("./packet.js")),o=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(e("./all_packets.js")),u=n(e("../enums.js")),f=n(e("../config"));i.prototype.read=function(e){for(var t=0;tn.length)throw new Error("Error reading MPI @:"+i);return i+6}throw new Error("Version "+this.version+" of the key packet is unsupported.")},i.prototype.readPublicKey=i.prototype.read,i.prototype.write=function(){var e=[];e.push(new Uint8Array([this.version])),e.push(s.default.writeDate(this.created)),3===this.version&&e.push(s.default.writeNumber(this.expirationTimeV3,2)),e.push(new Uint8Array([u.default.write(u.default.publicKey,this.algorithm)]));for(var t=f.default.getPublicMpiCount(this.algorithm),r=0;r0&&n<4?l=1:17===n&&(l=2);for(var c=[],d=0,p=0;pthis.created.getTime()+1e3*this.signatureExpirationTime},i.prototype.postCloneTypeFix=function(){this.issuerKeyId=l.default.fromClone(this.issuerKeyId)}},{"../crypto":24,"../enums.js":35,"../type/keyid.js":67,"../type/mpi.js":68,"../util.js":70,"./packet.js":51}],59:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(){this.tag=o.default.packet.symEncryptedAEADProtected,this.version=u,this.iv=null,this.encrypted=null,this.packets=null}Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var s=n(e("../util.js")),a=n(e("../crypto")),o=n(e("../enums.js")),u=1,f=a.default.gcm.ivLength;i.prototype.read=function(e){var t=0;if(e[t]!==u)throw new Error("Invalid packet version.");t++,this.iv=e.subarray(t,f+t),t+=f,this.encrypted=e.subarray(t,e.length)},i.prototype.write=function(){return s.default.concatUint8Array([new Uint8Array([this.version]),this.iv,this.encrypted])},i.prototype.decrypt=function(e,t){var r=this;return a.default.gcm.decrypt(e,this.encrypted,t,this.iv).then(function(e){r.packets.read(e)})},i.prototype.encrypt=function(e,t){var r=this;return this.iv=a.default.random.getRandomValues(new Uint8Array(f)),a.default.gcm.encrypt(e,this.packets.write(),t,this.iv).then(function(e){r.encrypted=e})}},{"../crypto":24,"../enums.js":35,"../util.js":70}],60:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(){this.tag=f.default.packet.symEncryptedIntegrityProtected,this.version=d,this.encrypted=null,this.modification=!1,this.packets=null}function s(e,t,r,n){return l?function(e,t,r,n){n=new c(n);var i=new c(new Uint8Array(u.default.cipher[e].blockSize)),s=new l.createCipheriv("aes-"+e.substr(3,3)+"-cfb",n,i).update(new c(o.default.concatUint8Array([t,r])));return new Uint8Array(s)}(e,t,r,n):h.default.AES_CFB.encrypt(o.default.concatUint8Array([t,r]),n)}function a(e,t,r){var n=void 0;return(n=l?function(e,t,r){t=new c(t),r=new c(r);var n=new c(new Uint8Array(u.default.cipher[e].blockSize)),i=new l.createDecipheriv("aes-"+e.substr(3,3)+"-cfb",r,n).update(t);return new Uint8Array(i)}(e,t,r):h.default.AES_CFB.decrypt(t,r)).subarray(u.default.cipher[e].blockSize+2,n.length)}Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var o=n(e("../util.js")),u=n(e("../crypto")),f=n(e("../enums.js")),h=n(e("asmcrypto-lite")),l=o.default.getNodeCrypto(),c=o.default.getNodeBuffer(),d=1;i.prototype.read=function(e){if(e[0]!==d)throw new Error("Invalid packet version.");this.encrypted=e.subarray(1,e.length)},i.prototype.write=function(){return o.default.concatUint8Array([new Uint8Array([d]),this.encrypted])},i.prototype.encrypt=function(e,t){var r=this.packets.write(),n=u.default.getPrefixRandom(e),i=new Uint8Array([n[n.length-2],n[n.length-1]]),a=o.default.concatUint8Array([n,i]),f=new Uint8Array([211,20]),h=o.default.concatUint8Array([r,f]),l=u.default.hash.sha1(o.default.concatUint8Array([a,h]));return h=o.default.concatUint8Array([h,l]),"aes"===e.substr(0,3)?this.encrypted=s(e,a,h,t):(this.encrypted=u.default.cfb.encrypt(n,e,h,t,!1),this.encrypted=this.encrypted.subarray(0,a.length+h.length)),Promise.resolve()},i.prototype.decrypt=function(e,t){var r=void 0;r="aes"===e.substr(0,3)?a(e,this.encrypted,t):u.default.cfb.decrypt(e,t,this.encrypted,!1);var n=u.default.cfb.mdc(e,t,this.encrypted),i=r.subarray(0,r.length-20),s=o.default.concatUint8Array([n,i]);this.hash=o.default.Uint8Array2str(u.default.hash.sha1(s));var f=o.default.Uint8Array2str(r.subarray(r.length-20,r.length));if(this.hash!==f)throw new Error("Modification detected.");return this.packets.read(r.subarray(0,r.length-22)),Promise.resolve()}},{"../crypto":24,"../enums.js":35,"../util.js":70,"asmcrypto-lite":1}],61:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(){this.tag=o.default.packet.symEncryptedSessionKey,this.version=4,this.sessionKey=null,this.sessionKeyEncryptionAlgorithm=null,this.sessionKeyAlgorithm="aes256",this.encrypted=null,this.s2k=new a.default}Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var s=n(e("../util.js")),a=n(e("../type/s2k.js")),o=n(e("../enums.js")),u=n(e("../crypto"));i.prototype.read=function(e){this.version=e[0];var t=o.default.read(o.default.symmetric,e[1]),r=this.s2k.read(e.subarray(2,e.length))+2;r>4)},i.prototype.read=function(e){var t=0;switch(this.type=s.default.read(s.default.s2k,e[t++]),this.algorithm=s.default.read(s.default.hash,e[t++]),this.type){case"simple":break;case"salted":this.salt=e.subarray(t,t+8),t+=8;break;case"iterated":this.salt=e.subarray(t,t+8),t+=8,this.c=e[t++];break;case"gnu":if("GNU"!==a.default.Uint8Array2str(e.subarray(t,3)))throw new Error("Unknown s2k type.");t+=3;var r=1e3+e[t++];if(1001!==r)throw new Error("Unknown s2k gnu protection mode.");this.type=r;break;default:throw new Error("Unknown s2k type.")}return t},i.prototype.write=function(){var e=[new Uint8Array([s.default.write(s.default.s2k,this.type),s.default.write(s.default.hash,this.algorithm)])];switch(this.type){case"simple":break;case"salted":e.push(this.salt);break;case"iterated":e.push(this.salt),e.push(new Uint8Array([this.c]));break;case"gnu":throw new Error("GNU s2k type not supported.");default:throw new Error("Unknown s2k type.")}return a.default.concatUint8Array(e)},i.prototype.produce_key=function(e,t){function r(t,r){var n=s.default.write(s.default.hash,r.algorithm);switch(r.type){case"simple":return o.default.hash.digest(n,a.default.concatUint8Array([t,e]));case"salted":return o.default.hash.digest(n,a.default.concatUint8Array([t,r.salt,e]));case"iterated":for(var i=[],u=r.get_count(),f=a.default.concatUint8Array([r.salt,e]);i.length*f.lengthu&&(i=i.subarray(0,u)),o.default.hash.digest(n,a.default.concatUint8Array([t,i]));case"gnu":throw new Error("GNU s2k type not supported.");default:throw new Error("Unknown s2k type.")}}e=a.default.str2Uint8Array(a.default.encode_utf8(e));for(var n=[],i=0,u=new Uint8Array(t),f=0;f()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e)},isUserId:function(e){return!!this.isString(e)&&(/$/.test(e))},getTransferables:function(e){if(n.default.zero_copy&&Object.prototype.isPrototypeOf(e)){var t=[];return this.collectBuffers(e,t),t.length?t:void 0}},collectBuffers:function(e,t){if(e)if(this.isUint8Array(e)&&-1===t.indexOf(e.buffer))t.push(e.buffer);else if(Object.prototype.isPrototypeOf(e))for(var r in e)this.collectBuffers(e[r],t)},readNumber:function(e){for(var t=0,r=0;r>8*(t-n-1)&255;return r},readDate:function(e){var t=this.readNumber(e),r=new Date;return r.setTime(1e3*t),r},writeDate:function(e){var t=Math.round(e.getTime()/1e3);return this.writeNumber(t,4)},hexdump:function(e){for(var t,r=[],n=e.length,i=0,s=0;i=0;n--)r[n]>>=t%8,n>0&&(r[n]|=r[n-1]<<8-t%8&255);return this.bin2str(r)},get_hashAlgorithmString:function(e){switch(e){case 1:return"MD5";case 2:return"SHA1";case 3:return"RIPEMD160";case 8:return"SHA256";case 9:return"SHA384";case 10:return"SHA512";case 11:return"SHA224"}return"unknown"},getWebCrypto:function(){if(n.default.use_native)return"undefined"!=typeof window&&window.crypto&&window.crypto.subtle},getWebCryptoAll:function(){if(n.default.use_native&&"undefined"!=typeof window){if(window.crypto)return window.crypto.subtle||window.crypto.webkitSubtle;if(window.msCrypto)return window.msCrypto.subtle}},promisify:function(e){return function(){var t=arguments;return new Promise(function(r){r(e.apply(null,t))})}},promisifyIE11Op:function(e,t){return new Promise(function(r,n){e.onerror=function(){n(new Error(t))},e.oncomplete=function(e){r(e.target.result)}})},detectNode:function(){return"undefined"==typeof window},getNodeCrypto:function(){if(this.detectNode()&&n.default.use_native)return e("crypto")},getNodeBuffer:function(){if(this.detectNode())return e("buffer").Buffer}}},{"./config":10,buffer:"buffer",crypto:"crypto"}],71:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function i(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,r=void 0===t?"openpgp.worker.min.js":t,n=e.worker,i=e.config;this.worker=n||new Worker(r),this.worker.onmessage=this.onMessage.bind(this),this.worker.onerror=function(e){throw new Error("Unhandled error in openpgp worker: "+e.message+" ("+e.filename+":"+e.lineno+")")},this.seedRandom(u),i&&this.worker.postMessage({event:"configure",config:i}),this.tasks={},this.currentID=0}Object.defineProperty(r,"__esModule",{value:!0}),r.default=i;var s=n(e("../util.js")),a=n(e("../crypto")),o=n(e("../packet")),u=5e4;i.prototype.getID=function(){return this.currentID++},i.prototype.onMessage=function(e){var t=e.data;switch(t.event){case"method-return":if(t.err){var r=new Error(t.err);r.workerStack=t.stack,this.tasks[t.id].reject(r)}else this.tasks[t.id].resolve(t.data);delete this.tasks[t.id];break;case"request-seed":this.seedRandom(2e4);break;default:throw new Error("Unknown Worker Event.")}},i.prototype.seedRandom=function(e){var t=this.getRandomBuffer(e);this.worker.postMessage({event:"seed-random",buf:t},s.default.getTransferables.call(s.default,t))},i.prototype.getRandomBuffer=function(e){if(!e)return null;var t=new Uint8Array(e);return a.default.random.getRandomValues(t),t},i.prototype.terminate=function(){this.worker.terminate()},i.prototype.delegate=function(e,t){var r=this,n=this.getID();return new Promise(function(i,a){r.worker.postMessage({id:n,event:e,options:o.default.clone.clonePackets(t)},s.default.getTransferables.call(s.default,t)),r.tasks[n]={resolve:function(t){return i(o.default.clone.parseClonedPackets(t,e))},reject:a}})}},{"../crypto":24,"../packet":47,"../util.js":70}]},{},[37])(37)}); \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/debian/missing-sources/openpgp-2.6.2.src.js roundcube-1.3.6+dfsg.1/debian/missing-sources/openpgp-2.6.2.src.js --- roundcube-1.3.3+dfsg.1/debian/missing-sources/openpgp-2.6.2.src.js 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/missing-sources/openpgp-2.6.2.src.js 2018-04-14 18:52:38.000000000 +0000 @@ -0,0 +1,21615 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.openpgp = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= len ) throw new Error( "Malformed string, low surrogate expected at position " + i ); + c = ( (c ^ 0xd800) << 10 ) | 0x10000 | ( str.charCodeAt(i) ^ 0xdc00 ); + } + else if ( !utf8 && c >>> 8 ) { + throw new Error("Wide characters are not allowed."); + } + + if ( !utf8 || c <= 0x7f ) { + bytes[j++] = c; + } + else if ( c <= 0x7ff ) { + bytes[j++] = 0xc0 | (c >> 6); + bytes[j++] = 0x80 | (c & 0x3f); + } + else if ( c <= 0xffff ) { + bytes[j++] = 0xe0 | (c >> 12); + bytes[j++] = 0x80 | (c >> 6 & 0x3f); + bytes[j++] = 0x80 | (c & 0x3f); + } + else { + bytes[j++] = 0xf0 | (c >> 18); + bytes[j++] = 0x80 | (c >> 12 & 0x3f); + bytes[j++] = 0x80 | (c >> 6 & 0x3f); + bytes[j++] = 0x80 | (c & 0x3f); + } + } + + return bytes.subarray(0, j); +} + +function hex_to_bytes ( str ) { + var len = str.length; + if ( len & 1 ) { + str = '0'+str; + len++; + } + var bytes = new Uint8Array(len>>1); + for ( var i = 0; i < len; i += 2 ) { + bytes[i>>1] = parseInt( str.substr( i, 2), 16 ); + } + return bytes; +} + +function base64_to_bytes ( str ) { + return string_to_bytes( atob( str ) ); +} + +function bytes_to_string ( bytes, utf8 ) { + utf8 = !!utf8; + + var len = bytes.length, + chars = new Array(len); + + for ( var i = 0, j = 0; i < len; i++ ) { + var b = bytes[i]; + if ( !utf8 || b < 128 ) { + chars[j++] = b; + } + else if ( b >= 192 && b < 224 && i+1 < len ) { + chars[j++] = ( (b & 0x1f) << 6 ) | (bytes[++i] & 0x3f); + } + else if ( b >= 224 && b < 240 && i+2 < len ) { + chars[j++] = ( (b & 0xf) << 12 ) | ( (bytes[++i] & 0x3f) << 6 ) | (bytes[++i] & 0x3f); + } + else if ( b >= 240 && b < 248 && i+3 < len ) { + var c = ( (b & 7) << 18 ) | ( (bytes[++i] & 0x3f) << 12 ) | ( (bytes[++i] & 0x3f) << 6 ) | (bytes[++i] & 0x3f); + if ( c <= 0xffff ) { + chars[j++] = c; + } + else { + c ^= 0x10000; + chars[j++] = 0xd800 | (c >> 10); + chars[j++] = 0xdc00 | (c & 0x3ff); + } + } + else { + throw new Error("Malformed UTF8 character at byte offset " + i); + } + } + + var str = '', + bs = 16384; + for ( var i = 0; i < j; i += bs ) { + str += String.fromCharCode.apply( String, chars.slice( i, i+bs <= j ? i+bs : j ) ); + } + + return str; +} + +function bytes_to_hex ( arr ) { + var str = ''; + for ( var i = 0; i < arr.length; i++ ) { + var h = ( arr[i] & 0xff ).toString(16); + if ( h.length < 2 ) str += '0'; + str += h; + } + return str; +} + +function bytes_to_base64 ( arr ) { + return btoa( bytes_to_string(arr) ); +} + +function pow2_ceil ( a ) { + a -= 1; + a |= a >>> 1; + a |= a >>> 2; + a |= a >>> 4; + a |= a >>> 8; + a |= a >>> 16; + a += 1; + return a; +} + +function is_number ( a ) { + return ( typeof a === 'number' ); +} + +function is_string ( a ) { + return ( typeof a === 'string' ); +} + +function is_buffer ( a ) { + return ( a instanceof ArrayBuffer ); +} + +function is_bytes ( a ) { + return ( a instanceof Uint8Array ); +} + +function is_typed_array ( a ) { + return ( a instanceof Int8Array ) || ( a instanceof Uint8Array ) + || ( a instanceof Int16Array ) || ( a instanceof Uint16Array ) + || ( a instanceof Int32Array ) || ( a instanceof Uint32Array ) + || ( a instanceof Float32Array ) + || ( a instanceof Float64Array ); +} + +function _heap_init ( constructor, options ) { + var heap = options.heap, + size = heap ? heap.byteLength : options.heapSize || 65536; + + if ( size & 0xfff || size <= 0 ) + throw new Error("heap size must be a positive integer and a multiple of 4096"); + + heap = heap || new constructor( new ArrayBuffer(size) ); + + return heap; +} + +function _heap_write ( heap, hpos, data, dpos, dlen ) { + var hlen = heap.length - hpos, + wlen = ( hlen < dlen ) ? hlen : dlen; + + heap.set( data.subarray( dpos, dpos+wlen ), hpos ); + + return wlen; +} + +/** + * Error definitions + */ + +global.IllegalStateError = IllegalStateError; +global.IllegalArgumentError = IllegalArgumentError; +global.SecurityError = SecurityError; + +/** + * @file {@link http://asmjs.org Asm.js} implementation of the {@link https://en.wikipedia.org/wiki/Advanced_Encryption_Standard Advanced Encryption Standard}. + * @author Artem S Vybornov + * @license MIT + */ +var AES_asm = function () { + "use strict"; + + /** + * Galois Field stuff init flag + */ + var ginit_done = false; + + /** + * Galois Field exponentiation and logarithm tables for 3 (the generator) + */ + var gexp3, glog3; + + /** + * Init Galois Field tables + */ + function ginit () { + gexp3 = [], + glog3 = []; + + var a = 1, c, d; + for ( c = 0; c < 255; c++ ) { + gexp3[c] = a; + + // Multiply by three + d = a & 0x80, a <<= 1, a &= 255; + if ( d === 0x80 ) a ^= 0x1b; + a ^= gexp3[c]; + + // Set the log table value + glog3[gexp3[c]] = c; + } + gexp3[255] = gexp3[0]; + glog3[0] = 0; + + ginit_done = true; + } + + /** + * Galois Field multiplication + * @param {int} a + * @param {int} b + * @return {int} + */ + function gmul ( a, b ) { + var c = gexp3[ ( glog3[a] + glog3[b] ) % 255 ]; + if ( a === 0 || b === 0 ) c = 0; + return c; + } + + /** + * Galois Field reciprocal + * @param {int} a + * @return {int} + */ + function ginv ( a ) { + var i = gexp3[ 255 - glog3[a] ]; + if ( a === 0 ) i = 0; + return i; + } + + /** + * AES stuff init flag + */ + var aes_init_done = false; + + /** + * Encryption, Decryption, S-Box and KeyTransform tables + */ + var aes_sbox, aes_sinv, aes_enc, aes_dec; + + /** + * Init AES tables + */ + function aes_init () { + if ( !ginit_done ) ginit(); + + // Calculates AES S-Box value + function _s ( a ) { + var c, s, x; + s = x = ginv(a); + for ( c = 0; c < 4; c++ ) { + s = ( (s << 1) | (s >>> 7) ) & 255; + x ^= s; + } + x ^= 99; + return x; + } + + // Tables + aes_sbox = [], + aes_sinv = [], + aes_enc = [ [], [], [], [] ], + aes_dec = [ [], [], [], [] ]; + + for ( var i = 0; i < 256; i++ ) { + var s = _s(i); + + // S-Box and its inverse + aes_sbox[i] = s; + aes_sinv[s] = i; + + // Ecryption and Decryption tables + aes_enc[0][i] = ( gmul( 2, s ) << 24 ) | ( s << 16 ) | ( s << 8 ) | gmul( 3, s ); + aes_dec[0][s] = ( gmul( 14, i ) << 24 ) | ( gmul( 9, i ) << 16 ) | ( gmul( 13, i ) << 8 ) | gmul( 11, i ); + // Rotate tables + for ( var t = 1; t < 4; t++ ) { + aes_enc[t][i] = ( aes_enc[t-1][i] >>> 8 ) | ( aes_enc[t-1][i] << 24 ); + aes_dec[t][s] = ( aes_dec[t-1][s] >>> 8 ) | ( aes_dec[t-1][s] << 24 ); + } + } + } + + /** + * Asm.js module constructor. + * + *

+ * Heap buffer layout by offset: + *

+     * 0x0000   encryption key schedule
+     * 0x0400   decryption key schedule
+     * 0x0800   sbox
+     * 0x0c00   inv sbox
+     * 0x1000   encryption tables
+     * 0x2000   decryption tables
+     * 0x3000   reserved (future GCM multiplication lookup table)
+     * 0x4000   data
+     * 
+ * Don't touch anything before 0x400. + *

+ * + * @alias AES_asm + * @class + * @param {GlobalScope} stdlib - global scope object (e.g. window) + * @param {Object} foreign - ignored + * @param {ArrayBuffer} buffer - heap buffer to link with + */ + var wrapper = function ( stdlib, foreign, buffer ) { + // Init AES stuff for the first time + if ( !aes_init_done ) aes_init(); + + // Fill up AES tables + var heap = new Uint32Array(buffer); + heap.set( aes_sbox, 0x0800>>2 ); + heap.set( aes_sinv, 0x0c00>>2 ); + for ( var i = 0; i < 4; i++ ) { + heap.set( aes_enc[i], ( 0x1000 + 0x400 * i )>>2 ); + heap.set( aes_dec[i], ( 0x2000 + 0x400 * i )>>2 ); + } + + /** + * Calculate AES key schedules. + * @instance + * @memberof AES_asm + * @param {int} ks - key size, 4/6/8 (for 128/192/256-bit key correspondingly) + * @param {int} k0..k7 - key vector components + */ + function set_key ( ks, k0, k1, k2, k3, k4, k5, k6, k7 ) { + var ekeys = heap.subarray( 0x000, 60 ), + dkeys = heap.subarray( 0x100, 0x100+60 ); + + // Encryption key schedule + ekeys.set( [ k0, k1, k2, k3, k4, k5, k6, k7 ] ); + for ( var i = ks, rcon = 1; i < 4*ks+28; i++ ) { + var k = ekeys[i-1]; + if ( ( i % ks === 0 ) || ( ks === 8 && i % ks === 4 ) ) { + k = aes_sbox[k>>>24]<<24 ^ aes_sbox[k>>>16&255]<<16 ^ aes_sbox[k>>>8&255]<<8 ^ aes_sbox[k&255]; + } + if ( i % ks === 0 ) { + k = (k << 8) ^ (k >>> 24) ^ (rcon << 24); + rcon = (rcon << 1) ^ ( (rcon & 0x80) ? 0x1b : 0 ); + } + ekeys[i] = ekeys[i-ks] ^ k; + } + + // Decryption key schedule + for ( var j = 0; j < i; j += 4 ) { + for ( var jj = 0; jj < 4; jj++ ) { + var k = ekeys[i-(4+j)+(4-jj)%4]; + if ( j < 4 || j >= i-4 ) { + dkeys[j+jj] = k; + } else { + dkeys[j+jj] = aes_dec[0][aes_sbox[k>>>24]] + ^ aes_dec[1][aes_sbox[k>>>16&255]] + ^ aes_dec[2][aes_sbox[k>>>8&255]] + ^ aes_dec[3][aes_sbox[k&255]]; + } + } + } + + // Set rounds number + asm.set_rounds( ks + 5 ); + } + + var asm = function ( stdlib, foreign, buffer ) { + "use asm"; + + var S0 = 0, S1 = 0, S2 = 0, S3 = 0, + I0 = 0, I1 = 0, I2 = 0, I3 = 0, + N0 = 0, N1 = 0, N2 = 0, N3 = 0, + M0 = 0, M1 = 0, M2 = 0, M3 = 0, + H0 = 0, H1 = 0, H2 = 0, H3 = 0, + R = 0; + + var HEAP = new stdlib.Uint32Array(buffer), + DATA = new stdlib.Uint8Array(buffer); + + /** + * AES core + * @param {int} k - precomputed key schedule offset + * @param {int} s - precomputed sbox table offset + * @param {int} t - precomputed round table offset + * @param {int} r - number of inner rounds to perform + * @param {int} x0..x3 - 128-bit input block vector + */ + function _core ( k, s, t, r, x0, x1, x2, x3 ) { + k = k|0; + s = s|0; + t = t|0; + r = r|0; + x0 = x0|0; + x1 = x1|0; + x2 = x2|0; + x3 = x3|0; + + var t1 = 0, t2 = 0, t3 = 0, + y0 = 0, y1 = 0, y2 = 0, y3 = 0, + i = 0; + + t1 = t|0x400, t2 = t|0x800, t3 = t|0xc00; + + // round 0 + x0 = x0 ^ HEAP[(k|0)>>2], + x1 = x1 ^ HEAP[(k|4)>>2], + x2 = x2 ^ HEAP[(k|8)>>2], + x3 = x3 ^ HEAP[(k|12)>>2]; + + // round 1..r + for ( i = 16; (i|0) <= (r<<4); i = (i+16)|0 ) { + y0 = HEAP[(t|x0>>22&1020)>>2] ^ HEAP[(t1|x1>>14&1020)>>2] ^ HEAP[(t2|x2>>6&1020)>>2] ^ HEAP[(t3|x3<<2&1020)>>2] ^ HEAP[(k|i|0)>>2], + y1 = HEAP[(t|x1>>22&1020)>>2] ^ HEAP[(t1|x2>>14&1020)>>2] ^ HEAP[(t2|x3>>6&1020)>>2] ^ HEAP[(t3|x0<<2&1020)>>2] ^ HEAP[(k|i|4)>>2], + y2 = HEAP[(t|x2>>22&1020)>>2] ^ HEAP[(t1|x3>>14&1020)>>2] ^ HEAP[(t2|x0>>6&1020)>>2] ^ HEAP[(t3|x1<<2&1020)>>2] ^ HEAP[(k|i|8)>>2], + y3 = HEAP[(t|x3>>22&1020)>>2] ^ HEAP[(t1|x0>>14&1020)>>2] ^ HEAP[(t2|x1>>6&1020)>>2] ^ HEAP[(t3|x2<<2&1020)>>2] ^ HEAP[(k|i|12)>>2]; + x0 = y0, x1 = y1, x2 = y2, x3 = y3; + } + + // final round + S0 = HEAP[(s|x0>>22&1020)>>2]<<24 ^ HEAP[(s|x1>>14&1020)>>2]<<16 ^ HEAP[(s|x2>>6&1020)>>2]<<8 ^ HEAP[(s|x3<<2&1020)>>2] ^ HEAP[(k|i|0)>>2], + S1 = HEAP[(s|x1>>22&1020)>>2]<<24 ^ HEAP[(s|x2>>14&1020)>>2]<<16 ^ HEAP[(s|x3>>6&1020)>>2]<<8 ^ HEAP[(s|x0<<2&1020)>>2] ^ HEAP[(k|i|4)>>2], + S2 = HEAP[(s|x2>>22&1020)>>2]<<24 ^ HEAP[(s|x3>>14&1020)>>2]<<16 ^ HEAP[(s|x0>>6&1020)>>2]<<8 ^ HEAP[(s|x1<<2&1020)>>2] ^ HEAP[(k|i|8)>>2], + S3 = HEAP[(s|x3>>22&1020)>>2]<<24 ^ HEAP[(s|x0>>14&1020)>>2]<<16 ^ HEAP[(s|x1>>6&1020)>>2]<<8 ^ HEAP[(s|x2<<2&1020)>>2] ^ HEAP[(k|i|12)>>2]; + } + + /** + * ECB mode encryption + * @param {int} x0..x3 - 128-bit input block vector + */ + function _ecb_enc ( x0, x1, x2, x3 ) { + x0 = x0|0; + x1 = x1|0; + x2 = x2|0; + x3 = x3|0; + + _core( + 0x0000, 0x0800, 0x1000, + R, + x0, + x1, + x2, + x3 + ); + } + + /** + * ECB mode decryption + * @param {int} x0..x3 - 128-bit input block vector + */ + function _ecb_dec ( x0, x1, x2, x3 ) { + x0 = x0|0; + x1 = x1|0; + x2 = x2|0; + x3 = x3|0; + + var t = 0; + + _core( + 0x0400, 0x0c00, 0x2000, + R, + x0, + x3, + x2, + x1 + ); + + t = S1, S1 = S3, S3 = t; + } + + + /** + * CBC mode encryption + * @param {int} x0..x3 - 128-bit input block vector + */ + function _cbc_enc ( x0, x1, x2, x3 ) { + x0 = x0|0; + x1 = x1|0; + x2 = x2|0; + x3 = x3|0; + + _core( + 0x0000, 0x0800, 0x1000, + R, + I0 ^ x0, + I1 ^ x1, + I2 ^ x2, + I3 ^ x3 + ); + + I0 = S0, + I1 = S1, + I2 = S2, + I3 = S3; + } + + /** + * CBC mode decryption + * @param {int} x0..x3 - 128-bit input block vector + */ + function _cbc_dec ( x0, x1, x2, x3 ) { + x0 = x0|0; + x1 = x1|0; + x2 = x2|0; + x3 = x3|0; + + var t = 0; + + _core( + 0x0400, 0x0c00, 0x2000, + R, + x0, + x3, + x2, + x1 + ); + + t = S1, S1 = S3, S3 = t; + + S0 = S0 ^ I0, + S1 = S1 ^ I1, + S2 = S2 ^ I2, + S3 = S3 ^ I3; + + I0 = x0, + I1 = x1, + I2 = x2, + I3 = x3; + } + + /** + * CFB mode encryption + * @param {int} x0..x3 - 128-bit input block vector + */ + function _cfb_enc ( x0, x1, x2, x3 ) { + x0 = x0|0; + x1 = x1|0; + x2 = x2|0; + x3 = x3|0; + + _core( + 0x0000, 0x0800, 0x1000, + R, + I0, + I1, + I2, + I3 + ); + + I0 = S0 = S0 ^ x0, + I1 = S1 = S1 ^ x1, + I2 = S2 = S2 ^ x2, + I3 = S3 = S3 ^ x3; + } + + + /** + * CFB mode decryption + * @param {int} x0..x3 - 128-bit input block vector + */ + function _cfb_dec ( x0, x1, x2, x3 ) { + x0 = x0|0; + x1 = x1|0; + x2 = x2|0; + x3 = x3|0; + + _core( + 0x0000, 0x0800, 0x1000, + R, + I0, + I1, + I2, + I3 + ); + + S0 = S0 ^ x0, + S1 = S1 ^ x1, + S2 = S2 ^ x2, + S3 = S3 ^ x3; + + I0 = x0, + I1 = x1, + I2 = x2, + I3 = x3; + } + + /** + * OFB mode encryption / decryption + * @param {int} x0..x3 - 128-bit input block vector + */ + function _ofb ( x0, x1, x2, x3 ) { + x0 = x0|0; + x1 = x1|0; + x2 = x2|0; + x3 = x3|0; + + _core( + 0x0000, 0x0800, 0x1000, + R, + I0, + I1, + I2, + I3 + ); + + I0 = S0, + I1 = S1, + I2 = S2, + I3 = S3; + + S0 = S0 ^ x0, + S1 = S1 ^ x1, + S2 = S2 ^ x2, + S3 = S3 ^ x3; + } + + /** + * CTR mode encryption / decryption + * @param {int} x0..x3 - 128-bit input block vector + */ + function _ctr ( x0, x1, x2, x3 ) { + x0 = x0|0; + x1 = x1|0; + x2 = x2|0; + x3 = x3|0; + + _core( + 0x0000, 0x0800, 0x1000, + R, + N0, + N1, + N2, + N3 + ); + + N3 = ( ~M3 & N3 ) | M3 & ( N3 + 1 ), + N2 = ( ~M2 & N2 ) | M2 & ( N2 + ( (N3|0) == 0 ) ), + N1 = ( ~M1 & N1 ) | M1 & ( N1 + ( (N2|0) == 0 ) ), + N0 = ( ~M0 & N0 ) | M0 & ( N0 + ( (N1|0) == 0 ) ); + + S0 = S0 ^ x0, + S1 = S1 ^ x1, + S2 = S2 ^ x2, + S3 = S3 ^ x3; + } + + /** + * GCM mode MAC calculation + * @param {int} x0..x3 - 128-bit input block vector + */ + function _gcm_mac ( x0, x1, x2, x3 ) { + x0 = x0|0; + x1 = x1|0; + x2 = x2|0; + x3 = x3|0; + + var y0 = 0, y1 = 0, y2 = 0, y3 = 0, + z0 = 0, z1 = 0, z2 = 0, z3 = 0, + i = 0, c = 0; + + x0 = x0 ^ I0, + x1 = x1 ^ I1, + x2 = x2 ^ I2, + x3 = x3 ^ I3; + + y0 = H0|0, + y1 = H1|0, + y2 = H2|0, + y3 = H3|0; + + for ( ; (i|0) < 128; i = (i + 1)|0 ) { + if ( y0 >>> 31 ) { + z0 = z0 ^ x0, + z1 = z1 ^ x1, + z2 = z2 ^ x2, + z3 = z3 ^ x3; + } + + y0 = (y0 << 1) | (y1 >>> 31), + y1 = (y1 << 1) | (y2 >>> 31), + y2 = (y2 << 1) | (y3 >>> 31), + y3 = (y3 << 1); + + c = x3 & 1; + + x3 = (x3 >>> 1) | (x2 << 31), + x2 = (x2 >>> 1) | (x1 << 31), + x1 = (x1 >>> 1) | (x0 << 31), + x0 = (x0 >>> 1); + + if ( c ) x0 = x0 ^ 0xe1000000; + } + + I0 = z0, + I1 = z1, + I2 = z2, + I3 = z3; + } + + /** + * Set the internal rounds number. + * @instance + * @memberof AES_asm + * @param {int} r - number if inner AES rounds + */ + function set_rounds ( r ) { + r = r|0; + R = r; + } + + /** + * Populate the internal state of the module. + * @instance + * @memberof AES_asm + * @param {int} s0...s3 - state vector + */ + function set_state ( s0, s1, s2, s3 ) { + s0 = s0|0; + s1 = s1|0; + s2 = s2|0; + s3 = s3|0; + + S0 = s0, + S1 = s1, + S2 = s2, + S3 = s3; + } + + /** + * Populate the internal iv of the module. + * @instance + * @memberof AES_asm + * @param {int} i0...i3 - iv vector + */ + function set_iv ( i0, i1, i2, i3 ) { + i0 = i0|0; + i1 = i1|0; + i2 = i2|0; + i3 = i3|0; + + I0 = i0, + I1 = i1, + I2 = i2, + I3 = i3; + } + + /** + * Set nonce for CTR-family modes. + * @instance + * @memberof AES_asm + * @param {int} n0..n3 - nonce vector + */ + function set_nonce ( n0, n1, n2, n3 ) { + n0 = n0|0; + n1 = n1|0; + n2 = n2|0; + n3 = n3|0; + + N0 = n0, + N1 = n1, + N2 = n2, + N3 = n3; + } + + /** + * Set counter mask for CTR-family modes. + * @instance + * @memberof AES_asm + * @param {int} m0...m3 - counter mask vector + */ + function set_mask ( m0, m1, m2, m3 ) { + m0 = m0|0; + m1 = m1|0; + m2 = m2|0; + m3 = m3|0; + + M0 = m0, + M1 = m1, + M2 = m2, + M3 = m3; + } + + /** + * Set counter for CTR-family modes. + * @instance + * @memberof AES_asm + * @param {int} c0...c3 - counter vector + */ + function set_counter ( c0, c1, c2, c3 ) { + c0 = c0|0; + c1 = c1|0; + c2 = c2|0; + c3 = c3|0; + + N3 = ( ~M3 & N3 ) | M3 & c3, + N2 = ( ~M2 & N2 ) | M2 & c2, + N1 = ( ~M1 & N1 ) | M1 & c1, + N0 = ( ~M0 & N0 ) | M0 & c0; + } + + /** + * Store the internal state vector into the heap. + * @instance + * @memberof AES_asm + * @param {int} pos - offset where to put the data + * @return {int} The number of bytes have been written into the heap, always 16. + */ + function get_state ( pos ) { + pos = pos|0; + + if ( pos & 15 ) return -1; + + DATA[pos|0] = S0>>>24, + DATA[pos|1] = S0>>>16&255, + DATA[pos|2] = S0>>>8&255, + DATA[pos|3] = S0&255, + DATA[pos|4] = S1>>>24, + DATA[pos|5] = S1>>>16&255, + DATA[pos|6] = S1>>>8&255, + DATA[pos|7] = S1&255, + DATA[pos|8] = S2>>>24, + DATA[pos|9] = S2>>>16&255, + DATA[pos|10] = S2>>>8&255, + DATA[pos|11] = S2&255, + DATA[pos|12] = S3>>>24, + DATA[pos|13] = S3>>>16&255, + DATA[pos|14] = S3>>>8&255, + DATA[pos|15] = S3&255; + + return 16; + } + + /** + * Store the internal iv vector into the heap. + * @instance + * @memberof AES_asm + * @param {int} pos - offset where to put the data + * @return {int} The number of bytes have been written into the heap, always 16. + */ + function get_iv ( pos ) { + pos = pos|0; + + if ( pos & 15 ) return -1; + + DATA[pos|0] = I0>>>24, + DATA[pos|1] = I0>>>16&255, + DATA[pos|2] = I0>>>8&255, + DATA[pos|3] = I0&255, + DATA[pos|4] = I1>>>24, + DATA[pos|5] = I1>>>16&255, + DATA[pos|6] = I1>>>8&255, + DATA[pos|7] = I1&255, + DATA[pos|8] = I2>>>24, + DATA[pos|9] = I2>>>16&255, + DATA[pos|10] = I2>>>8&255, + DATA[pos|11] = I2&255, + DATA[pos|12] = I3>>>24, + DATA[pos|13] = I3>>>16&255, + DATA[pos|14] = I3>>>8&255, + DATA[pos|15] = I3&255; + + return 16; + } + + /** + * GCM initialization. + * @instance + * @memberof AES_asm + */ + function gcm_init ( ) { + _ecb_enc( 0, 0, 0, 0 ); + H0 = S0, + H1 = S1, + H2 = S2, + H3 = S3; + } + + /** + * Perform ciphering operation on the supplied data. + * @instance + * @memberof AES_asm + * @param {int} mode - block cipher mode (see {@link AES_asm} mode constants) + * @param {int} pos - offset of the data being processed + * @param {int} len - length of the data being processed + * @return {int} Actual amount of data have been processed. + */ + function cipher ( mode, pos, len ) { + mode = mode|0; + pos = pos|0; + len = len|0; + + var ret = 0; + + if ( pos & 15 ) return -1; + + while ( (len|0) >= 16 ) { + _cipher_modes[mode&7]( + DATA[pos|0]<<24 | DATA[pos|1]<<16 | DATA[pos|2]<<8 | DATA[pos|3], + DATA[pos|4]<<24 | DATA[pos|5]<<16 | DATA[pos|6]<<8 | DATA[pos|7], + DATA[pos|8]<<24 | DATA[pos|9]<<16 | DATA[pos|10]<<8 | DATA[pos|11], + DATA[pos|12]<<24 | DATA[pos|13]<<16 | DATA[pos|14]<<8 | DATA[pos|15] + ); + + DATA[pos|0] = S0>>>24, + DATA[pos|1] = S0>>>16&255, + DATA[pos|2] = S0>>>8&255, + DATA[pos|3] = S0&255, + DATA[pos|4] = S1>>>24, + DATA[pos|5] = S1>>>16&255, + DATA[pos|6] = S1>>>8&255, + DATA[pos|7] = S1&255, + DATA[pos|8] = S2>>>24, + DATA[pos|9] = S2>>>16&255, + DATA[pos|10] = S2>>>8&255, + DATA[pos|11] = S2&255, + DATA[pos|12] = S3>>>24, + DATA[pos|13] = S3>>>16&255, + DATA[pos|14] = S3>>>8&255, + DATA[pos|15] = S3&255; + + ret = (ret + 16)|0, + pos = (pos + 16)|0, + len = (len - 16)|0; + } + + return ret|0; + } + + /** + * Calculates MAC of the supplied data. + * @instance + * @memberof AES_asm + * @param {int} mode - block cipher mode (see {@link AES_asm} mode constants) + * @param {int} pos - offset of the data being processed + * @param {int} len - length of the data being processed + * @return {int} Actual amount of data have been processed. + */ + function mac ( mode, pos, len ) { + mode = mode|0; + pos = pos|0; + len = len|0; + + var ret = 0; + + if ( pos & 15 ) return -1; + + while ( (len|0) >= 16 ) { + _mac_modes[mode&1]( + DATA[pos|0]<<24 | DATA[pos|1]<<16 | DATA[pos|2]<<8 | DATA[pos|3], + DATA[pos|4]<<24 | DATA[pos|5]<<16 | DATA[pos|6]<<8 | DATA[pos|7], + DATA[pos|8]<<24 | DATA[pos|9]<<16 | DATA[pos|10]<<8 | DATA[pos|11], + DATA[pos|12]<<24 | DATA[pos|13]<<16 | DATA[pos|14]<<8 | DATA[pos|15] + ); + + ret = (ret + 16)|0, + pos = (pos + 16)|0, + len = (len - 16)|0; + } + + return ret|0; + } + + /** + * AES cipher modes table (virual methods) + */ + var _cipher_modes = [ _ecb_enc, _ecb_dec, _cbc_enc, _cbc_dec, _cfb_enc, _cfb_dec, _ofb, _ctr ]; + + /** + * AES MAC modes table (virual methods) + */ + var _mac_modes = [ _cbc_enc, _gcm_mac ]; + + /** + * Asm.js module exports + */ + return { + set_rounds: set_rounds, + set_state: set_state, + set_iv: set_iv, + set_nonce: set_nonce, + set_mask: set_mask, + set_counter:set_counter, + get_state: get_state, + get_iv: get_iv, + gcm_init: gcm_init, + cipher: cipher, + mac: mac + }; + }( stdlib, foreign, buffer ); + + asm.set_key = set_key; + + return asm; + }; + + /** + * AES enciphering mode constants + * @enum {int} + * @const + */ + wrapper.ENC = { + ECB: 0, + CBC: 2, + CFB: 4, + OFB: 6, + CTR: 7 + }, + + /** + * AES deciphering mode constants + * @enum {int} + * @const + */ + wrapper.DEC = { + ECB: 1, + CBC: 3, + CFB: 5, + OFB: 6, + CTR: 7 + }, + + /** + * AES MAC mode constants + * @enum {int} + * @const + */ + wrapper.MAC = { + CBC: 0, + GCM: 1 + }; + + /** + * Heap data offset + * @type {int} + * @const + */ + wrapper.HEAP_DATA = 0x4000; + + return wrapper; +}(); + +function AES ( options ) { + options = options || {}; + + this.heap = _heap_init( Uint8Array, options ).subarray( AES_asm.HEAP_DATA ); + this.asm = options.asm || AES_asm( global, null, this.heap.buffer ); + this.mode = null; + this.key = null; + + this.reset( options ); +} + +function AES_set_key ( key ) { + if ( key !== undefined ) { + if ( is_buffer(key) || is_bytes(key) ) { + key = new Uint8Array(key); + } + else if ( is_string(key) ) { + key = string_to_bytes(key); + } + else { + throw new TypeError("unexpected key type"); + } + + var keylen = key.length; + if ( keylen !== 16 && keylen !== 24 && keylen !== 32 ) + throw new IllegalArgumentError("illegal key size"); + + var keyview = new DataView( key.buffer, key.byteOffset, key.byteLength ); + this.asm.set_key( + keylen >> 2, + keyview.getUint32(0), + keyview.getUint32(4), + keyview.getUint32(8), + keyview.getUint32(12), + keylen > 16 ? keyview.getUint32(16) : 0, + keylen > 16 ? keyview.getUint32(20) : 0, + keylen > 24 ? keyview.getUint32(24) : 0, + keylen > 24 ? keyview.getUint32(28) : 0 + ); + + this.key = key; + } + else if ( !this.key ) { + throw new Error("key is required"); + } +} + +function AES_set_iv ( iv ) { + if ( iv !== undefined ) { + if ( is_buffer(iv) || is_bytes(iv) ) { + iv = new Uint8Array(iv); + } + else if ( is_string(iv) ) { + iv = string_to_bytes(iv); + } + else { + throw new TypeError("unexpected iv type"); + } + + if ( iv.length !== 16 ) + throw new IllegalArgumentError("illegal iv size"); + + var ivview = new DataView( iv.buffer, iv.byteOffset, iv.byteLength ); + + this.iv = iv; + this.asm.set_iv( ivview.getUint32(0), ivview.getUint32(4), ivview.getUint32(8), ivview.getUint32(12) ); + } + else { + this.iv = null; + this.asm.set_iv( 0, 0, 0, 0 ); + } +} + +function AES_set_padding ( padding ) { + if ( padding !== undefined ) { + this.padding = !!padding; + } + else { + this.padding = true; + } +} + +function AES_reset ( options ) { + options = options || {}; + + this.result = null; + this.pos = 0; + this.len = 0; + + AES_set_key.call( this, options.key ); + if ( this.hasOwnProperty('iv') ) AES_set_iv.call( this, options.iv ); + if ( this.hasOwnProperty('padding') ) AES_set_padding.call( this, options.padding ); + + return this; +} + +function AES_Encrypt_process ( data ) { + if ( is_string(data) ) + data = string_to_bytes(data); + + if ( is_buffer(data) ) + data = new Uint8Array(data); + + if ( !is_bytes(data) ) + throw new TypeError("data isn't of expected type"); + + var asm = this.asm, + heap = this.heap, + amode = AES_asm.ENC[this.mode], + hpos = AES_asm.HEAP_DATA, + pos = this.pos, + len = this.len, + dpos = 0, + dlen = data.length || 0, + rpos = 0, + rlen = (len + dlen) & -16, + wlen = 0; + + var result = new Uint8Array(rlen); + + while ( dlen > 0 ) { + wlen = _heap_write( heap, pos+len, data, dpos, dlen ); + len += wlen; + dpos += wlen; + dlen -= wlen; + + wlen = asm.cipher( amode, hpos + pos, len ); + + if ( wlen ) result.set( heap.subarray( pos, pos + wlen ), rpos ); + rpos += wlen; + + if ( wlen < len ) { + pos += wlen; + len -= wlen; + } else { + pos = 0; + len = 0; + } + } + + this.result = result; + this.pos = pos; + this.len = len; + + return this; +} + +function AES_Encrypt_finish ( data ) { + var presult = null, + prlen = 0; + + if ( data !== undefined ) { + presult = AES_Encrypt_process.call( this, data ).result; + prlen = presult.length; + } + + var asm = this.asm, + heap = this.heap, + amode = AES_asm.ENC[this.mode], + hpos = AES_asm.HEAP_DATA, + pos = this.pos, + len = this.len, + plen = 16 - len % 16, + rlen = len; + + if ( this.hasOwnProperty('padding') ) { + if ( this.padding ) { + for ( var p = 0; p < plen; ++p ) heap[ pos + len + p ] = plen; + len += plen; + rlen = len; + } + else if ( len % 16 ) { + throw new IllegalArgumentError("data length must be a multiple of the block size"); + } + } + else { + len += plen; + } + + var result = new Uint8Array( prlen + rlen ); + + if ( prlen ) result.set( presult ); + + if ( len ) asm.cipher( amode, hpos + pos, len ); + + if ( rlen ) result.set( heap.subarray( pos, pos + rlen ), prlen ); + + this.result = result; + this.pos = 0; + this.len = 0; + + return this; +} + +function AES_Decrypt_process ( data ) { + if ( is_string(data) ) + data = string_to_bytes(data); + + if ( is_buffer(data) ) + data = new Uint8Array(data); + + if ( !is_bytes(data) ) + throw new TypeError("data isn't of expected type"); + + var asm = this.asm, + heap = this.heap, + amode = AES_asm.DEC[this.mode], + hpos = AES_asm.HEAP_DATA, + pos = this.pos, + len = this.len, + dpos = 0, + dlen = data.length || 0, + rpos = 0, + rlen = (len + dlen) & -16, + plen = 0, + wlen = 0; + + if ( this.hasOwnProperty('padding') && this.padding ) { + plen = len + dlen - rlen || 16; + rlen -= plen; + } + + var result = new Uint8Array(rlen); + + while ( dlen > 0 ) { + wlen = _heap_write( heap, pos+len, data, dpos, dlen ); + len += wlen; + dpos += wlen; + dlen -= wlen; + + wlen = asm.cipher( amode, hpos + pos, len - ( !dlen ? plen : 0 ) ); + + if ( wlen ) result.set( heap.subarray( pos, pos + wlen ), rpos ); + rpos += wlen; + + if ( wlen < len ) { + pos += wlen; + len -= wlen; + } else { + pos = 0; + len = 0; + } + } + + this.result = result; + this.pos = pos; + this.len = len; + + return this; +} + +function AES_Decrypt_finish ( data ) { + var presult = null, + prlen = 0; + + if ( data !== undefined ) { + presult = AES_Decrypt_process.call( this, data ).result; + prlen = presult.length; + } + + var asm = this.asm, + heap = this.heap, + amode = AES_asm.DEC[this.mode], + hpos = AES_asm.HEAP_DATA, + pos = this.pos, + len = this.len, + rlen = len; + + if ( len > 0 ) { + if ( len % 16 ) { + if ( this.hasOwnProperty('padding') ) { + throw new IllegalArgumentError("data length must be a multiple of the block size"); + } else { + len += 16 - len % 16; + } + } + + asm.cipher( amode, hpos + pos, len ); + + if ( this.hasOwnProperty('padding') && this.padding ) { + var pad = heap[ pos + rlen - 1 ]; + if ( pad < 1 || pad > 16 || pad > rlen ) + throw new SecurityError("bad padding"); + + var pcheck = 0; + for ( var i = pad; i > 1; i-- ) pcheck |= pad ^ heap[ pos + rlen - i ]; + if ( pcheck ) + throw new SecurityError("bad padding"); + + rlen -= pad; + } + } + + var result = new Uint8Array( prlen + rlen ); + + if ( prlen > 0 ) { + result.set( presult ); + } + + if ( rlen > 0 ) { + result.set( heap.subarray( pos, pos + rlen ), prlen ); + } + + this.result = result; + this.pos = 0; + this.len = 0; + + return this; +} + +/** + * Cipher Feedback Mode (CFB) + */ + +function AES_CFB ( options ) { + this.iv = null; + + AES.call( this, options ); + + this.mode = 'CFB'; +} + +var AES_CFB_prototype = AES_CFB.prototype; +AES_CFB_prototype.BLOCK_SIZE = 16; +AES_CFB_prototype.reset = AES_reset; +AES_CFB_prototype.encrypt = AES_Encrypt_finish; +AES_CFB_prototype.decrypt = AES_Decrypt_finish; + +function AES_CFB_Encrypt ( options ) { + AES_CFB.call( this, options ); +} + +var AES_CFB_Encrypt_prototype = AES_CFB_Encrypt.prototype; +AES_CFB_Encrypt_prototype.BLOCK_SIZE = 16; +AES_CFB_Encrypt_prototype.reset = AES_reset; +AES_CFB_Encrypt_prototype.process = AES_Encrypt_process; +AES_CFB_Encrypt_prototype.finish = AES_Encrypt_finish; + +function AES_CFB_Decrypt ( options ) { + AES_CFB.call( this, options ); +} + +var AES_CFB_Decrypt_prototype = AES_CFB_Decrypt.prototype; +AES_CFB_Decrypt_prototype.BLOCK_SIZE = 16; +AES_CFB_Decrypt_prototype.reset = AES_reset; +AES_CFB_Decrypt_prototype.process = AES_Decrypt_process; +AES_CFB_Decrypt_prototype.finish = AES_Decrypt_finish; + +/** + * Counter Mode (CTR) + */ + +function AES_CTR ( options ) { + this.nonce = null, + this.counter = 0, + this.counterSize = 0; + + AES.call( this, options ); + + this.mode = 'CTR'; +} + +function AES_CTR_Crypt ( options ) { + AES_CTR.call( this, options ); +} + +function AES_CTR_set_options ( nonce, counter, size ) { + if ( size !== undefined ) { + if ( size < 8 || size > 48 ) + throw new IllegalArgumentError("illegal counter size"); + + this.counterSize = size; + + var mask = Math.pow( 2, size ) - 1; + this.asm.set_mask( 0, 0, (mask / 0x100000000)|0, mask|0 ); + } + else { + this.counterSize = size = 48; + this.asm.set_mask( 0, 0, 0xffff, 0xffffffff ); + } + + if ( nonce !== undefined ) { + if ( is_buffer(nonce) || is_bytes(nonce) ) { + nonce = new Uint8Array(nonce); + } + else if ( is_string(nonce) ) { + nonce = string_to_bytes(nonce); + } + else { + throw new TypeError("unexpected nonce type"); + } + + var len = nonce.length; + if ( !len || len > 16 ) + throw new IllegalArgumentError("illegal nonce size"); + + this.nonce = nonce; + + var view = new DataView( new ArrayBuffer(16) ); + new Uint8Array(view.buffer).set(nonce); + + this.asm.set_nonce( view.getUint32(0), view.getUint32(4), view.getUint32(8), view.getUint32(12) ); + } + else { + throw new Error("nonce is required"); + } + + if ( counter !== undefined ) { + if ( !is_number(counter) ) + throw new TypeError("unexpected counter type"); + + if ( counter < 0 || counter >= Math.pow( 2, size ) ) + throw new IllegalArgumentError("illegal counter value"); + + this.counter = counter; + + this.asm.set_counter( 0, 0, (counter / 0x100000000)|0, counter|0 ); + } + else { + this.counter = counter = 0; + } +} + +function AES_CTR_reset ( options ) { + options = options || {}; + + AES_reset.call( this, options ); + + AES_CTR_set_options.call( this, options.nonce, options.counter, options.counterSize ); + + return this; +} + +var AES_CTR_prototype = AES_CTR.prototype; +AES_CTR_prototype.BLOCK_SIZE = 16; +AES_CTR_prototype.reset = AES_CTR_reset; +AES_CTR_prototype.encrypt = AES_Encrypt_finish; +AES_CTR_prototype.decrypt = AES_Encrypt_finish; + +var AES_CTR_Crypt_prototype = AES_CTR_Crypt.prototype; +AES_CTR_Crypt_prototype.BLOCK_SIZE = 16; +AES_CTR_Crypt_prototype.reset = AES_CTR_reset; +AES_CTR_Crypt_prototype.process = AES_Encrypt_process; +AES_CTR_Crypt_prototype.finish = AES_Encrypt_finish; + +/** + * Galois/Counter mode + */ + +var _AES_GCM_data_maxLength = 68719476704; // 2^36 - 2^5 + +function _gcm_mac_process ( data ) { + var heap = this.heap, + asm = this.asm, + dpos = 0, + dlen = data.length || 0, + wlen = 0; + + while ( dlen > 0 ) { + wlen = _heap_write( heap, 0, data, dpos, dlen ); + dpos += wlen; + dlen -= wlen; + + while ( wlen & 15 ) heap[ wlen++ ] = 0; + + asm.mac( AES_asm.MAC.GCM, AES_asm.HEAP_DATA, wlen ); + } +} + +function AES_GCM ( options ) { + this.nonce = null; + this.adata = null; + this.iv = null; + this.counter = 1; + this.tagSize = 16; + + AES.call( this, options ); + + this.mode = 'GCM'; +} + +function AES_GCM_Encrypt ( options ) { + AES_GCM.call( this, options ); +} + +function AES_GCM_Decrypt ( options ) { + AES_GCM.call( this, options ); +} + +function AES_GCM_reset ( options ) { + options = options || {}; + + AES_reset.call( this, options ); + + var asm = this.asm, + heap = this.heap; + + asm.gcm_init(); + + var tagSize = options.tagSize; + if ( tagSize !== undefined ) { + if ( !is_number(tagSize) ) + throw new TypeError("tagSize must be a number"); + + if ( tagSize < 4 || tagSize > 16 ) + throw new IllegalArgumentError("illegal tagSize value"); + + this.tagSize = tagSize; + } + else { + this.tagSize = 16; + } + + var nonce = options.nonce; + if ( nonce !== undefined ) { + if ( is_bytes(nonce) || is_buffer(nonce) ) { + nonce = new Uint8Array(nonce); + } + else if ( is_string(nonce) ) { + nonce = string_to_bytes(nonce); + } + else { + throw new TypeError("unexpected nonce type"); + } + + this.nonce = nonce; + + var noncelen = nonce.length || 0, + noncebuf = new Uint8Array(16); + if ( noncelen !== 12 ) { + _gcm_mac_process.call( this, nonce ); + + heap[0] = heap[1] = heap[2] = heap[3] = heap[4] = heap[5] = heap[6] = heap[7] = heap[8] = heap[9] = heap[10] = 0, + heap[11] = noncelen>>>29, + heap[12] = noncelen>>>21&255, + heap[13] = noncelen>>>13&255, + heap[14] = noncelen>>>5&255, + heap[15] = noncelen<<3&255; + asm.mac( AES_asm.MAC.GCM, AES_asm.HEAP_DATA, 16 ); + + asm.get_iv( AES_asm.HEAP_DATA ); + asm.set_iv(); + + noncebuf.set( heap.subarray( 0, 16 ) ); + } + else { + noncebuf.set(nonce); + noncebuf[15] = 1; + } + + var nonceview = new DataView( noncebuf.buffer ); + this.gamma0 = nonceview.getUint32(12); + + asm.set_nonce( nonceview.getUint32(0), nonceview.getUint32(4), nonceview.getUint32(8), 0 ); + asm.set_mask( 0, 0, 0, 0xffffffff ); + } + else { + throw new Error("nonce is required"); + } + + var adata = options.adata; + if ( adata !== undefined && adata !== null ) { + if ( is_bytes(adata) || is_buffer(adata) ) { + adata = new Uint8Array(adata); + } + else if ( is_string(adata) ) { + adata = string_to_bytes(adata); + } + else { + throw new TypeError("unexpected adata type"); + } + + if ( adata.length > _AES_GCM_data_maxLength ) + throw new IllegalArgumentError("illegal adata length"); + + if ( adata.length ) { + this.adata = adata; + _gcm_mac_process.call( this, adata ); + } + else { + this.adata = null; + } + } + else { + this.adata = null; + } + + var counter = options.counter; + if ( counter !== undefined ) { + if ( !is_number(counter) ) + throw new TypeError("counter must be a number"); + + if ( counter < 1 || counter > 0xffffffff ) + throw new RangeError("counter must be a positive 32-bit integer"); + + this.counter = counter; + asm.set_counter( 0, 0, 0, this.gamma0+counter|0 ); + } + else { + this.counter = 1; + asm.set_counter( 0, 0, 0, this.gamma0+1|0 ); + } + + var iv = options.iv; + if ( iv !== undefined ) { + if ( !is_number(counter) ) + throw new TypeError("counter must be a number"); + + this.iv = iv; + + AES_set_iv.call( this, iv ); + } + + return this; +} + +function AES_GCM_Encrypt_process ( data ) { + if ( is_string(data) ) + data = string_to_bytes(data); + + if ( is_buffer(data) ) + data = new Uint8Array(data); + + if ( !is_bytes(data) ) + throw new TypeError("data isn't of expected type"); + + var dpos = 0, + dlen = data.length || 0, + asm = this.asm, + heap = this.heap, + counter = this.counter, + pos = this.pos, + len = this.len, + rpos = 0, + rlen = ( len + dlen ) & -16, + wlen = 0; + + if ( ((counter-1)<<4) + len + dlen > _AES_GCM_data_maxLength ) + throw new RangeError("counter overflow"); + + var result = new Uint8Array(rlen); + + while ( dlen > 0 ) { + wlen = _heap_write( heap, pos+len, data, dpos, dlen ); + len += wlen; + dpos += wlen; + dlen -= wlen; + + wlen = asm.cipher( AES_asm.ENC.CTR, AES_asm.HEAP_DATA + pos, len ); + wlen = asm.mac( AES_asm.MAC.GCM, AES_asm.HEAP_DATA + pos, wlen ); + + if ( wlen ) result.set( heap.subarray( pos, pos + wlen ), rpos ); + counter += (wlen>>>4); + rpos += wlen; + + if ( wlen < len ) { + pos += wlen; + len -= wlen; + } else { + pos = 0; + len = 0; + } + } + + this.result = result; + this.counter = counter; + this.pos = pos; + this.len = len; + + return this; +} + +function AES_GCM_Encrypt_finish () { + var asm = this.asm, + heap = this.heap, + counter = this.counter, + tagSize = this.tagSize, + adata = this.adata, + pos = this.pos, + len = this.len; + + var result = new Uint8Array( len + tagSize ); + + asm.cipher( AES_asm.ENC.CTR, AES_asm.HEAP_DATA + pos, (len + 15) & -16 ); + if ( len ) result.set( heap.subarray( pos, pos + len ) ); + + for ( var i = len; i & 15; i++ ) heap[ pos + i ] = 0; + asm.mac( AES_asm.MAC.GCM, AES_asm.HEAP_DATA + pos, i ); + + var alen = ( adata !== null ) ? adata.length : 0, + clen = ( (counter-1) << 4) + len; + heap[0] = heap[1] = heap[2] = 0, + heap[3] = alen>>>29, + heap[4] = alen>>>21, + heap[5] = alen>>>13&255, + heap[6] = alen>>>5&255, + heap[7] = alen<<3&255, + heap[8] = heap[9] = heap[10] = 0, + heap[11] = clen>>>29, + heap[12] = clen>>>21&255, + heap[13] = clen>>>13&255, + heap[14] = clen>>>5&255, + heap[15] = clen<<3&255; + asm.mac( AES_asm.MAC.GCM, AES_asm.HEAP_DATA, 16 ); + asm.get_iv( AES_asm.HEAP_DATA ); + + asm.set_counter( 0, 0, 0, this.gamma0 ); + asm.cipher( AES_asm.ENC.CTR, AES_asm.HEAP_DATA, 16 ); + result.set( heap.subarray( 0, tagSize ), len ); + + this.result = result; + this.counter = 1; + this.pos = 0; + this.len = 0; + + return this; +} + +function AES_GCM_encrypt ( data ) { + var result1 = AES_GCM_Encrypt_process.call( this, data ).result, + result2 = AES_GCM_Encrypt_finish.call(this).result; + + var result = new Uint8Array( result1.length + result2.length ); + if ( result1.length ) result.set( result1 ); + if ( result2.length ) result.set( result2, result1.length ); + this.result = result; + + return this; +} + +function AES_GCM_Decrypt_process ( data ) { + if ( is_string(data) ) + data = string_to_bytes(data); + + if ( is_buffer(data) ) + data = new Uint8Array(data); + + if ( !is_bytes(data) ) + throw new TypeError("data isn't of expected type"); + + var dpos = 0, + dlen = data.length || 0, + asm = this.asm, + heap = this.heap, + counter = this.counter, + tagSize = this.tagSize, + pos = this.pos, + len = this.len, + rpos = 0, + rlen = len + dlen > tagSize ? ( len + dlen - tagSize ) & -16 : 0, + tlen = len + dlen - rlen, + wlen = 0; + + if ( ((counter-1)<<4) + len + dlen > _AES_GCM_data_maxLength ) + throw new RangeError("counter overflow"); + + var result = new Uint8Array(rlen); + + while ( dlen > tlen ) { + wlen = _heap_write( heap, pos+len, data, dpos, dlen-tlen ); + len += wlen; + dpos += wlen; + dlen -= wlen; + + wlen = asm.mac( AES_asm.MAC.GCM, AES_asm.HEAP_DATA + pos, wlen ); + wlen = asm.cipher( AES_asm.DEC.CTR, AES_asm.HEAP_DATA + pos, wlen ); + + if ( wlen ) result.set( heap.subarray( pos, pos+wlen ), rpos ); + counter += (wlen>>>4); + rpos += wlen; + + pos = 0; + len = 0; + } + + if ( dlen > 0 ) { + len += _heap_write( heap, 0, data, dpos, dlen ); + } + + this.result = result; + this.counter = counter; + this.pos = pos; + this.len = len; + + return this; +} + +function AES_GCM_Decrypt_finish () { + var asm = this.asm, + heap = this.heap, + tagSize = this.tagSize, + adata = this.adata, + counter = this.counter, + pos = this.pos, + len = this.len, + rlen = len - tagSize, + wlen = 0; + + if ( len < tagSize ) + throw new IllegalStateError("authentication tag not found"); + + var result = new Uint8Array(rlen), + atag = new Uint8Array( heap.subarray( pos+rlen, pos+len ) ); + + for ( var i = rlen; i & 15; i++ ) heap[ pos + i ] = 0; + + wlen = asm.mac( AES_asm.MAC.GCM, AES_asm.HEAP_DATA + pos, i ); + wlen = asm.cipher( AES_asm.DEC.CTR, AES_asm.HEAP_DATA + pos, i ); + if ( rlen ) result.set( heap.subarray( pos, pos+rlen ) ); + + var alen = ( adata !== null ) ? adata.length : 0, + clen = ( (counter-1) << 4) + len - tagSize; + heap[0] = heap[1] = heap[2] = 0, + heap[3] = alen>>>29, + heap[4] = alen>>>21, + heap[5] = alen>>>13&255, + heap[6] = alen>>>5&255, + heap[7] = alen<<3&255, + heap[8] = heap[9] = heap[10] = 0, + heap[11] = clen>>>29, + heap[12] = clen>>>21&255, + heap[13] = clen>>>13&255, + heap[14] = clen>>>5&255, + heap[15] = clen<<3&255; + asm.mac( AES_asm.MAC.GCM, AES_asm.HEAP_DATA, 16 ); + asm.get_iv( AES_asm.HEAP_DATA ); + + asm.set_counter( 0, 0, 0, this.gamma0 ); + asm.cipher( AES_asm.ENC.CTR, AES_asm.HEAP_DATA, 16 ); + + var acheck = 0; + for ( var i = 0; i < tagSize; ++i ) acheck |= atag[i] ^ heap[i]; + if ( acheck ) + throw new SecurityError("data integrity check failed"); + + this.result = result; + this.counter = 1; + this.pos = 0; + this.len = 0; + + return this; +} + +function AES_GCM_decrypt ( data ) { + var result1 = AES_GCM_Decrypt_process.call( this, data ).result, + result2 = AES_GCM_Decrypt_finish.call( this ).result; + + var result = new Uint8Array( result1.length + result2.length ); + if ( result1.length ) result.set( result1 ); + if ( result2.length ) result.set( result2, result1.length ); + this.result = result; + + return this; +} + +var AES_GCM_prototype = AES_GCM.prototype; +AES_GCM_prototype.BLOCK_SIZE = 16; +AES_GCM_prototype.reset = AES_GCM_reset; +AES_GCM_prototype.encrypt = AES_GCM_encrypt; +AES_GCM_prototype.decrypt = AES_GCM_decrypt; + +var AES_GCM_Encrypt_prototype = AES_GCM_Encrypt.prototype; +AES_GCM_Encrypt_prototype.BLOCK_SIZE = 16; +AES_GCM_Encrypt_prototype.reset = AES_GCM_reset; +AES_GCM_Encrypt_prototype.process = AES_GCM_Encrypt_process; +AES_GCM_Encrypt_prototype.finish = AES_GCM_Encrypt_finish; + +var AES_GCM_Decrypt_prototype = AES_GCM_Decrypt.prototype; +AES_GCM_Decrypt_prototype.BLOCK_SIZE = 16; +AES_GCM_Decrypt_prototype.reset = AES_GCM_reset; +AES_GCM_Decrypt_prototype.process = AES_GCM_Decrypt_process; +AES_GCM_Decrypt_prototype.finish = AES_GCM_Decrypt_finish; + +// shared asm.js module and heap +var _AES_heap_instance = new Uint8Array(0x100000), + _AES_asm_instance = AES_asm( global, null, _AES_heap_instance.buffer ); + +/** + * AES-CFB exports + */ + +function AES_CFB_encrypt_bytes ( data, key, iv ) { + if ( data === undefined ) throw new SyntaxError("data required"); + if ( key === undefined ) throw new SyntaxError("key required"); + return new AES_CFB( { heap: _AES_heap_instance, asm: _AES_asm_instance, key: key, iv: iv } ).encrypt(data).result; +} + +function AES_CFB_decrypt_bytes ( data, key, iv ) { + if ( data === undefined ) throw new SyntaxError("data required"); + if ( key === undefined ) throw new SyntaxError("key required"); + return new AES_CFB( { heap: _AES_heap_instance, asm: _AES_asm_instance, key: key, iv: iv } ).decrypt(data).result; +} + +exports.AES_CFB = AES_CFB; +exports.AES_CFB.encrypt = AES_CFB_encrypt_bytes; +exports.AES_CFB.decrypt = AES_CFB_decrypt_bytes; + +exports.AES_CFB.Encrypt = AES_CFB_Encrypt; +exports.AES_CFB.Decrypt = AES_CFB_Decrypt; + +/** + * AES-GCM exports + */ + +function AES_GCM_encrypt_bytes ( data, key, nonce, adata, tagSize ) { + if ( data === undefined ) throw new SyntaxError("data required"); + if ( key === undefined ) throw new SyntaxError("key required"); + if ( nonce === undefined ) throw new SyntaxError("nonce required"); + return new AES_GCM( { heap: _AES_heap_instance, asm: _AES_asm_instance, key: key, nonce: nonce, adata: adata, tagSize: tagSize } ).encrypt(data).result; +} + +function AES_GCM_decrypt_bytes ( data, key, nonce, adata, tagSize ) { + if ( data === undefined ) throw new SyntaxError("data required"); + if ( key === undefined ) throw new SyntaxError("key required"); + if ( nonce === undefined ) throw new SyntaxError("nonce required"); + return new AES_GCM( { heap: _AES_heap_instance, asm: _AES_asm_instance, key: key, nonce: nonce, adata: adata, tagSize: tagSize } ).decrypt(data).result; +} + +exports.AES_GCM = AES_GCM; +exports.AES_GCM.encrypt = AES_GCM_encrypt_bytes; +exports.AES_GCM.decrypt = AES_GCM_decrypt_bytes; + +exports.AES_GCM.Encrypt = AES_GCM_Encrypt; +exports.AES_GCM.Decrypt = AES_GCM_Decrypt; + +function hash_reset () { + this.result = null; + this.pos = 0; + this.len = 0; + + this.asm.reset(); + + return this; +} + +function hash_process ( data ) { + if ( this.result !== null ) + throw new IllegalStateError("state must be reset before processing new data"); + + if ( is_string(data) ) + data = string_to_bytes(data); + + if ( is_buffer(data) ) + data = new Uint8Array(data); + + if ( !is_bytes(data) ) + throw new TypeError("data isn't of expected type"); + + var asm = this.asm, + heap = this.heap, + hpos = this.pos, + hlen = this.len, + dpos = 0, + dlen = data.length, + wlen = 0; + + while ( dlen > 0 ) { + wlen = _heap_write( heap, hpos+hlen, data, dpos, dlen ); + hlen += wlen; + dpos += wlen; + dlen -= wlen; + + wlen = asm.process( hpos, hlen ); + + hpos += wlen; + hlen -= wlen; + + if ( !hlen ) hpos = 0; + } + + this.pos = hpos; + this.len = hlen; + + return this; +} + +function hash_finish () { + if ( this.result !== null ) + throw new IllegalStateError("state must be reset before processing new data"); + + this.asm.finish( this.pos, this.len, 0 ); + + this.result = new Uint8Array(this.HASH_SIZE); + this.result.set( this.heap.subarray( 0, this.HASH_SIZE ) ); + + this.pos = 0; + this.len = 0; + + return this; +} + +function sha256_asm ( stdlib, foreign, buffer ) { + "use asm"; + + // SHA256 state + var H0 = 0, H1 = 0, H2 = 0, H3 = 0, H4 = 0, H5 = 0, H6 = 0, H7 = 0, + TOTAL0 = 0, TOTAL1 = 0; + + // HMAC state + var I0 = 0, I1 = 0, I2 = 0, I3 = 0, I4 = 0, I5 = 0, I6 = 0, I7 = 0, + O0 = 0, O1 = 0, O2 = 0, O3 = 0, O4 = 0, O5 = 0, O6 = 0, O7 = 0; + + // I/O buffer + var HEAP = new stdlib.Uint8Array(buffer); + + function _core ( w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15 ) { + w0 = w0|0; + w1 = w1|0; + w2 = w2|0; + w3 = w3|0; + w4 = w4|0; + w5 = w5|0; + w6 = w6|0; + w7 = w7|0; + w8 = w8|0; + w9 = w9|0; + w10 = w10|0; + w11 = w11|0; + w12 = w12|0; + w13 = w13|0; + w14 = w14|0; + w15 = w15|0; + + var a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 0, + t = 0; + + a = H0; + b = H1; + c = H2; + d = H3; + e = H4; + f = H5; + g = H6; + h = H7; + + // 0 + t = ( w0 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x428a2f98 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 1 + t = ( w1 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x71374491 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 2 + t = ( w2 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xb5c0fbcf )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 3 + t = ( w3 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xe9b5dba5 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 4 + t = ( w4 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x3956c25b )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 5 + t = ( w5 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x59f111f1 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 6 + t = ( w6 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x923f82a4 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 7 + t = ( w7 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xab1c5ed5 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 8 + t = ( w8 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xd807aa98 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 9 + t = ( w9 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x12835b01 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 10 + t = ( w10 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x243185be )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 11 + t = ( w11 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x550c7dc3 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 12 + t = ( w12 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x72be5d74 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 13 + t = ( w13 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x80deb1fe )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 14 + t = ( w14 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x9bdc06a7 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 15 + t = ( w15 + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xc19bf174 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 16 + w0 = t = ( ( w1>>>7 ^ w1>>>18 ^ w1>>>3 ^ w1<<25 ^ w1<<14 ) + ( w14>>>17 ^ w14>>>19 ^ w14>>>10 ^ w14<<15 ^ w14<<13 ) + w0 + w9 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xe49b69c1 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 17 + w1 = t = ( ( w2>>>7 ^ w2>>>18 ^ w2>>>3 ^ w2<<25 ^ w2<<14 ) + ( w15>>>17 ^ w15>>>19 ^ w15>>>10 ^ w15<<15 ^ w15<<13 ) + w1 + w10 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xefbe4786 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 18 + w2 = t = ( ( w3>>>7 ^ w3>>>18 ^ w3>>>3 ^ w3<<25 ^ w3<<14 ) + ( w0>>>17 ^ w0>>>19 ^ w0>>>10 ^ w0<<15 ^ w0<<13 ) + w2 + w11 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x0fc19dc6 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 19 + w3 = t = ( ( w4>>>7 ^ w4>>>18 ^ w4>>>3 ^ w4<<25 ^ w4<<14 ) + ( w1>>>17 ^ w1>>>19 ^ w1>>>10 ^ w1<<15 ^ w1<<13 ) + w3 + w12 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x240ca1cc )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 20 + w4 = t = ( ( w5>>>7 ^ w5>>>18 ^ w5>>>3 ^ w5<<25 ^ w5<<14 ) + ( w2>>>17 ^ w2>>>19 ^ w2>>>10 ^ w2<<15 ^ w2<<13 ) + w4 + w13 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x2de92c6f )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 21 + w5 = t = ( ( w6>>>7 ^ w6>>>18 ^ w6>>>3 ^ w6<<25 ^ w6<<14 ) + ( w3>>>17 ^ w3>>>19 ^ w3>>>10 ^ w3<<15 ^ w3<<13 ) + w5 + w14 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x4a7484aa )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 22 + w6 = t = ( ( w7>>>7 ^ w7>>>18 ^ w7>>>3 ^ w7<<25 ^ w7<<14 ) + ( w4>>>17 ^ w4>>>19 ^ w4>>>10 ^ w4<<15 ^ w4<<13 ) + w6 + w15 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x5cb0a9dc )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 23 + w7 = t = ( ( w8>>>7 ^ w8>>>18 ^ w8>>>3 ^ w8<<25 ^ w8<<14 ) + ( w5>>>17 ^ w5>>>19 ^ w5>>>10 ^ w5<<15 ^ w5<<13 ) + w7 + w0 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x76f988da )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 24 + w8 = t = ( ( w9>>>7 ^ w9>>>18 ^ w9>>>3 ^ w9<<25 ^ w9<<14 ) + ( w6>>>17 ^ w6>>>19 ^ w6>>>10 ^ w6<<15 ^ w6<<13 ) + w8 + w1 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x983e5152 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 25 + w9 = t = ( ( w10>>>7 ^ w10>>>18 ^ w10>>>3 ^ w10<<25 ^ w10<<14 ) + ( w7>>>17 ^ w7>>>19 ^ w7>>>10 ^ w7<<15 ^ w7<<13 ) + w9 + w2 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xa831c66d )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 26 + w10 = t = ( ( w11>>>7 ^ w11>>>18 ^ w11>>>3 ^ w11<<25 ^ w11<<14 ) + ( w8>>>17 ^ w8>>>19 ^ w8>>>10 ^ w8<<15 ^ w8<<13 ) + w10 + w3 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xb00327c8 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 27 + w11 = t = ( ( w12>>>7 ^ w12>>>18 ^ w12>>>3 ^ w12<<25 ^ w12<<14 ) + ( w9>>>17 ^ w9>>>19 ^ w9>>>10 ^ w9<<15 ^ w9<<13 ) + w11 + w4 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xbf597fc7 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 28 + w12 = t = ( ( w13>>>7 ^ w13>>>18 ^ w13>>>3 ^ w13<<25 ^ w13<<14 ) + ( w10>>>17 ^ w10>>>19 ^ w10>>>10 ^ w10<<15 ^ w10<<13 ) + w12 + w5 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xc6e00bf3 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 29 + w13 = t = ( ( w14>>>7 ^ w14>>>18 ^ w14>>>3 ^ w14<<25 ^ w14<<14 ) + ( w11>>>17 ^ w11>>>19 ^ w11>>>10 ^ w11<<15 ^ w11<<13 ) + w13 + w6 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xd5a79147 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 30 + w14 = t = ( ( w15>>>7 ^ w15>>>18 ^ w15>>>3 ^ w15<<25 ^ w15<<14 ) + ( w12>>>17 ^ w12>>>19 ^ w12>>>10 ^ w12<<15 ^ w12<<13 ) + w14 + w7 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x06ca6351 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 31 + w15 = t = ( ( w0>>>7 ^ w0>>>18 ^ w0>>>3 ^ w0<<25 ^ w0<<14 ) + ( w13>>>17 ^ w13>>>19 ^ w13>>>10 ^ w13<<15 ^ w13<<13 ) + w15 + w8 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x14292967 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 32 + w0 = t = ( ( w1>>>7 ^ w1>>>18 ^ w1>>>3 ^ w1<<25 ^ w1<<14 ) + ( w14>>>17 ^ w14>>>19 ^ w14>>>10 ^ w14<<15 ^ w14<<13 ) + w0 + w9 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x27b70a85 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 33 + w1 = t = ( ( w2>>>7 ^ w2>>>18 ^ w2>>>3 ^ w2<<25 ^ w2<<14 ) + ( w15>>>17 ^ w15>>>19 ^ w15>>>10 ^ w15<<15 ^ w15<<13 ) + w1 + w10 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x2e1b2138 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 34 + w2 = t = ( ( w3>>>7 ^ w3>>>18 ^ w3>>>3 ^ w3<<25 ^ w3<<14 ) + ( w0>>>17 ^ w0>>>19 ^ w0>>>10 ^ w0<<15 ^ w0<<13 ) + w2 + w11 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x4d2c6dfc )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 35 + w3 = t = ( ( w4>>>7 ^ w4>>>18 ^ w4>>>3 ^ w4<<25 ^ w4<<14 ) + ( w1>>>17 ^ w1>>>19 ^ w1>>>10 ^ w1<<15 ^ w1<<13 ) + w3 + w12 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x53380d13 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 36 + w4 = t = ( ( w5>>>7 ^ w5>>>18 ^ w5>>>3 ^ w5<<25 ^ w5<<14 ) + ( w2>>>17 ^ w2>>>19 ^ w2>>>10 ^ w2<<15 ^ w2<<13 ) + w4 + w13 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x650a7354 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 37 + w5 = t = ( ( w6>>>7 ^ w6>>>18 ^ w6>>>3 ^ w6<<25 ^ w6<<14 ) + ( w3>>>17 ^ w3>>>19 ^ w3>>>10 ^ w3<<15 ^ w3<<13 ) + w5 + w14 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x766a0abb )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 38 + w6 = t = ( ( w7>>>7 ^ w7>>>18 ^ w7>>>3 ^ w7<<25 ^ w7<<14 ) + ( w4>>>17 ^ w4>>>19 ^ w4>>>10 ^ w4<<15 ^ w4<<13 ) + w6 + w15 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x81c2c92e )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 39 + w7 = t = ( ( w8>>>7 ^ w8>>>18 ^ w8>>>3 ^ w8<<25 ^ w8<<14 ) + ( w5>>>17 ^ w5>>>19 ^ w5>>>10 ^ w5<<15 ^ w5<<13 ) + w7 + w0 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x92722c85 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 40 + w8 = t = ( ( w9>>>7 ^ w9>>>18 ^ w9>>>3 ^ w9<<25 ^ w9<<14 ) + ( w6>>>17 ^ w6>>>19 ^ w6>>>10 ^ w6<<15 ^ w6<<13 ) + w8 + w1 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xa2bfe8a1 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 41 + w9 = t = ( ( w10>>>7 ^ w10>>>18 ^ w10>>>3 ^ w10<<25 ^ w10<<14 ) + ( w7>>>17 ^ w7>>>19 ^ w7>>>10 ^ w7<<15 ^ w7<<13 ) + w9 + w2 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xa81a664b )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 42 + w10 = t = ( ( w11>>>7 ^ w11>>>18 ^ w11>>>3 ^ w11<<25 ^ w11<<14 ) + ( w8>>>17 ^ w8>>>19 ^ w8>>>10 ^ w8<<15 ^ w8<<13 ) + w10 + w3 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xc24b8b70 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 43 + w11 = t = ( ( w12>>>7 ^ w12>>>18 ^ w12>>>3 ^ w12<<25 ^ w12<<14 ) + ( w9>>>17 ^ w9>>>19 ^ w9>>>10 ^ w9<<15 ^ w9<<13 ) + w11 + w4 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xc76c51a3 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 44 + w12 = t = ( ( w13>>>7 ^ w13>>>18 ^ w13>>>3 ^ w13<<25 ^ w13<<14 ) + ( w10>>>17 ^ w10>>>19 ^ w10>>>10 ^ w10<<15 ^ w10<<13 ) + w12 + w5 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xd192e819 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 45 + w13 = t = ( ( w14>>>7 ^ w14>>>18 ^ w14>>>3 ^ w14<<25 ^ w14<<14 ) + ( w11>>>17 ^ w11>>>19 ^ w11>>>10 ^ w11<<15 ^ w11<<13 ) + w13 + w6 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xd6990624 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 46 + w14 = t = ( ( w15>>>7 ^ w15>>>18 ^ w15>>>3 ^ w15<<25 ^ w15<<14 ) + ( w12>>>17 ^ w12>>>19 ^ w12>>>10 ^ w12<<15 ^ w12<<13 ) + w14 + w7 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xf40e3585 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 47 + w15 = t = ( ( w0>>>7 ^ w0>>>18 ^ w0>>>3 ^ w0<<25 ^ w0<<14 ) + ( w13>>>17 ^ w13>>>19 ^ w13>>>10 ^ w13<<15 ^ w13<<13 ) + w15 + w8 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x106aa070 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 48 + w0 = t = ( ( w1>>>7 ^ w1>>>18 ^ w1>>>3 ^ w1<<25 ^ w1<<14 ) + ( w14>>>17 ^ w14>>>19 ^ w14>>>10 ^ w14<<15 ^ w14<<13 ) + w0 + w9 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x19a4c116 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 49 + w1 = t = ( ( w2>>>7 ^ w2>>>18 ^ w2>>>3 ^ w2<<25 ^ w2<<14 ) + ( w15>>>17 ^ w15>>>19 ^ w15>>>10 ^ w15<<15 ^ w15<<13 ) + w1 + w10 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x1e376c08 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 50 + w2 = t = ( ( w3>>>7 ^ w3>>>18 ^ w3>>>3 ^ w3<<25 ^ w3<<14 ) + ( w0>>>17 ^ w0>>>19 ^ w0>>>10 ^ w0<<15 ^ w0<<13 ) + w2 + w11 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x2748774c )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 51 + w3 = t = ( ( w4>>>7 ^ w4>>>18 ^ w4>>>3 ^ w4<<25 ^ w4<<14 ) + ( w1>>>17 ^ w1>>>19 ^ w1>>>10 ^ w1<<15 ^ w1<<13 ) + w3 + w12 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x34b0bcb5 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 52 + w4 = t = ( ( w5>>>7 ^ w5>>>18 ^ w5>>>3 ^ w5<<25 ^ w5<<14 ) + ( w2>>>17 ^ w2>>>19 ^ w2>>>10 ^ w2<<15 ^ w2<<13 ) + w4 + w13 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x391c0cb3 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 53 + w5 = t = ( ( w6>>>7 ^ w6>>>18 ^ w6>>>3 ^ w6<<25 ^ w6<<14 ) + ( w3>>>17 ^ w3>>>19 ^ w3>>>10 ^ w3<<15 ^ w3<<13 ) + w5 + w14 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x4ed8aa4a )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 54 + w6 = t = ( ( w7>>>7 ^ w7>>>18 ^ w7>>>3 ^ w7<<25 ^ w7<<14 ) + ( w4>>>17 ^ w4>>>19 ^ w4>>>10 ^ w4<<15 ^ w4<<13 ) + w6 + w15 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x5b9cca4f )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 55 + w7 = t = ( ( w8>>>7 ^ w8>>>18 ^ w8>>>3 ^ w8<<25 ^ w8<<14 ) + ( w5>>>17 ^ w5>>>19 ^ w5>>>10 ^ w5<<15 ^ w5<<13 ) + w7 + w0 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x682e6ff3 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 56 + w8 = t = ( ( w9>>>7 ^ w9>>>18 ^ w9>>>3 ^ w9<<25 ^ w9<<14 ) + ( w6>>>17 ^ w6>>>19 ^ w6>>>10 ^ w6<<15 ^ w6<<13 ) + w8 + w1 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x748f82ee )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 57 + w9 = t = ( ( w10>>>7 ^ w10>>>18 ^ w10>>>3 ^ w10<<25 ^ w10<<14 ) + ( w7>>>17 ^ w7>>>19 ^ w7>>>10 ^ w7<<15 ^ w7<<13 ) + w9 + w2 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x78a5636f )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 58 + w10 = t = ( ( w11>>>7 ^ w11>>>18 ^ w11>>>3 ^ w11<<25 ^ w11<<14 ) + ( w8>>>17 ^ w8>>>19 ^ w8>>>10 ^ w8<<15 ^ w8<<13 ) + w10 + w3 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x84c87814 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 59 + w11 = t = ( ( w12>>>7 ^ w12>>>18 ^ w12>>>3 ^ w12<<25 ^ w12<<14 ) + ( w9>>>17 ^ w9>>>19 ^ w9>>>10 ^ w9<<15 ^ w9<<13 ) + w11 + w4 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x8cc70208 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 60 + w12 = t = ( ( w13>>>7 ^ w13>>>18 ^ w13>>>3 ^ w13<<25 ^ w13<<14 ) + ( w10>>>17 ^ w10>>>19 ^ w10>>>10 ^ w10<<15 ^ w10<<13 ) + w12 + w5 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0x90befffa )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 61 + w13 = t = ( ( w14>>>7 ^ w14>>>18 ^ w14>>>3 ^ w14<<25 ^ w14<<14 ) + ( w11>>>17 ^ w11>>>19 ^ w11>>>10 ^ w11<<15 ^ w11<<13 ) + w13 + w6 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xa4506ceb )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 62 + w14 = t = ( ( w15>>>7 ^ w15>>>18 ^ w15>>>3 ^ w15<<25 ^ w15<<14 ) + ( w12>>>17 ^ w12>>>19 ^ w12>>>10 ^ w12<<15 ^ w12<<13 ) + w14 + w7 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xbef9a3f7 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + // 63 + w15 = t = ( ( w0>>>7 ^ w0>>>18 ^ w0>>>3 ^ w0<<25 ^ w0<<14 ) + ( w13>>>17 ^ w13>>>19 ^ w13>>>10 ^ w13<<15 ^ w13<<13 ) + w15 + w8 )|0; + t = ( t + h + ( e>>>6 ^ e>>>11 ^ e>>>25 ^ e<<26 ^ e<<21 ^ e<<7 ) + ( g ^ e & (f^g) ) + 0xc67178f2 )|0; + h = g; g = f; f = e; e = ( d + t )|0; d = c; c = b; b = a; + a = ( t + ( (b & c) ^ ( d & (b ^ c) ) ) + ( b>>>2 ^ b>>>13 ^ b>>>22 ^ b<<30 ^ b<<19 ^ b<<10 ) )|0; + + H0 = ( H0 + a )|0; + H1 = ( H1 + b )|0; + H2 = ( H2 + c )|0; + H3 = ( H3 + d )|0; + H4 = ( H4 + e )|0; + H5 = ( H5 + f )|0; + H6 = ( H6 + g )|0; + H7 = ( H7 + h )|0; + } + + function _core_heap ( offset ) { + offset = offset|0; + + _core( + HEAP[offset|0]<<24 | HEAP[offset|1]<<16 | HEAP[offset|2]<<8 | HEAP[offset|3], + HEAP[offset|4]<<24 | HEAP[offset|5]<<16 | HEAP[offset|6]<<8 | HEAP[offset|7], + HEAP[offset|8]<<24 | HEAP[offset|9]<<16 | HEAP[offset|10]<<8 | HEAP[offset|11], + HEAP[offset|12]<<24 | HEAP[offset|13]<<16 | HEAP[offset|14]<<8 | HEAP[offset|15], + HEAP[offset|16]<<24 | HEAP[offset|17]<<16 | HEAP[offset|18]<<8 | HEAP[offset|19], + HEAP[offset|20]<<24 | HEAP[offset|21]<<16 | HEAP[offset|22]<<8 | HEAP[offset|23], + HEAP[offset|24]<<24 | HEAP[offset|25]<<16 | HEAP[offset|26]<<8 | HEAP[offset|27], + HEAP[offset|28]<<24 | HEAP[offset|29]<<16 | HEAP[offset|30]<<8 | HEAP[offset|31], + HEAP[offset|32]<<24 | HEAP[offset|33]<<16 | HEAP[offset|34]<<8 | HEAP[offset|35], + HEAP[offset|36]<<24 | HEAP[offset|37]<<16 | HEAP[offset|38]<<8 | HEAP[offset|39], + HEAP[offset|40]<<24 | HEAP[offset|41]<<16 | HEAP[offset|42]<<8 | HEAP[offset|43], + HEAP[offset|44]<<24 | HEAP[offset|45]<<16 | HEAP[offset|46]<<8 | HEAP[offset|47], + HEAP[offset|48]<<24 | HEAP[offset|49]<<16 | HEAP[offset|50]<<8 | HEAP[offset|51], + HEAP[offset|52]<<24 | HEAP[offset|53]<<16 | HEAP[offset|54]<<8 | HEAP[offset|55], + HEAP[offset|56]<<24 | HEAP[offset|57]<<16 | HEAP[offset|58]<<8 | HEAP[offset|59], + HEAP[offset|60]<<24 | HEAP[offset|61]<<16 | HEAP[offset|62]<<8 | HEAP[offset|63] + ); + } + + // offset — multiple of 32 + function _state_to_heap ( output ) { + output = output|0; + + HEAP[output|0] = H0>>>24; + HEAP[output|1] = H0>>>16&255; + HEAP[output|2] = H0>>>8&255; + HEAP[output|3] = H0&255; + HEAP[output|4] = H1>>>24; + HEAP[output|5] = H1>>>16&255; + HEAP[output|6] = H1>>>8&255; + HEAP[output|7] = H1&255; + HEAP[output|8] = H2>>>24; + HEAP[output|9] = H2>>>16&255; + HEAP[output|10] = H2>>>8&255; + HEAP[output|11] = H2&255; + HEAP[output|12] = H3>>>24; + HEAP[output|13] = H3>>>16&255; + HEAP[output|14] = H3>>>8&255; + HEAP[output|15] = H3&255; + HEAP[output|16] = H4>>>24; + HEAP[output|17] = H4>>>16&255; + HEAP[output|18] = H4>>>8&255; + HEAP[output|19] = H4&255; + HEAP[output|20] = H5>>>24; + HEAP[output|21] = H5>>>16&255; + HEAP[output|22] = H5>>>8&255; + HEAP[output|23] = H5&255; + HEAP[output|24] = H6>>>24; + HEAP[output|25] = H6>>>16&255; + HEAP[output|26] = H6>>>8&255; + HEAP[output|27] = H6&255; + HEAP[output|28] = H7>>>24; + HEAP[output|29] = H7>>>16&255; + HEAP[output|30] = H7>>>8&255; + HEAP[output|31] = H7&255; + } + + function reset () { + H0 = 0x6a09e667; + H1 = 0xbb67ae85; + H2 = 0x3c6ef372; + H3 = 0xa54ff53a; + H4 = 0x510e527f; + H5 = 0x9b05688c; + H6 = 0x1f83d9ab; + H7 = 0x5be0cd19; + TOTAL0 = TOTAL1 = 0; + } + + function init ( h0, h1, h2, h3, h4, h5, h6, h7, total0, total1 ) { + h0 = h0|0; + h1 = h1|0; + h2 = h2|0; + h3 = h3|0; + h4 = h4|0; + h5 = h5|0; + h6 = h6|0; + h7 = h7|0; + total0 = total0|0; + total1 = total1|0; + + H0 = h0; + H1 = h1; + H2 = h2; + H3 = h3; + H4 = h4; + H5 = h5; + H6 = h6; + H7 = h7; + TOTAL0 = total0; + TOTAL1 = total1; + } + + // offset — multiple of 64 + function process ( offset, length ) { + offset = offset|0; + length = length|0; + + var hashed = 0; + + if ( offset & 63 ) + return -1; + + while ( (length|0) >= 64 ) { + _core_heap(offset); + + offset = ( offset + 64 )|0; + length = ( length - 64 )|0; + + hashed = ( hashed + 64 )|0; + } + + TOTAL0 = ( TOTAL0 + hashed )|0; + if ( TOTAL0>>>0 < hashed>>>0 ) TOTAL1 = ( TOTAL1 + 1 )|0; + + return hashed|0; + } + + // offset — multiple of 64 + // output — multiple of 32 + function finish ( offset, length, output ) { + offset = offset|0; + length = length|0; + output = output|0; + + var hashed = 0, + i = 0; + + if ( offset & 63 ) + return -1; + + if ( ~output ) + if ( output & 31 ) + return -1; + + if ( (length|0) >= 64 ) { + hashed = process( offset, length )|0; + if ( (hashed|0) == -1 ) + return -1; + + offset = ( offset + hashed )|0; + length = ( length - hashed )|0; + } + + hashed = ( hashed + length )|0; + TOTAL0 = ( TOTAL0 + length )|0; + if ( TOTAL0>>>0 < length>>>0 ) TOTAL1 = ( TOTAL1 + 1 )|0; + + HEAP[offset|length] = 0x80; + + if ( (length|0) >= 56 ) { + for ( i = (length+1)|0; (i|0) < 64; i = (i+1)|0 ) + HEAP[offset|i] = 0x00; + + _core_heap(offset); + + length = 0; + + HEAP[offset|0] = 0; + } + + for ( i = (length+1)|0; (i|0) < 59; i = (i+1)|0 ) + HEAP[offset|i] = 0; + + HEAP[offset|56] = TOTAL1>>>21&255; + HEAP[offset|57] = TOTAL1>>>13&255; + HEAP[offset|58] = TOTAL1>>>5&255; + HEAP[offset|59] = TOTAL1<<3&255 | TOTAL0>>>29; + HEAP[offset|60] = TOTAL0>>>21&255; + HEAP[offset|61] = TOTAL0>>>13&255; + HEAP[offset|62] = TOTAL0>>>5&255; + HEAP[offset|63] = TOTAL0<<3&255; + _core_heap(offset); + + if ( ~output ) + _state_to_heap(output); + + return hashed|0; + } + + function hmac_reset () { + H0 = I0; + H1 = I1; + H2 = I2; + H3 = I3; + H4 = I4; + H5 = I5; + H6 = I6; + H7 = I7; + TOTAL0 = 64; + TOTAL1 = 0; + } + + function _hmac_opad () { + H0 = O0; + H1 = O1; + H2 = O2; + H3 = O3; + H4 = O4; + H5 = O5; + H6 = O6; + H7 = O7; + TOTAL0 = 64; + TOTAL1 = 0; + } + + function hmac_init ( p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ) { + p0 = p0|0; + p1 = p1|0; + p2 = p2|0; + p3 = p3|0; + p4 = p4|0; + p5 = p5|0; + p6 = p6|0; + p7 = p7|0; + p8 = p8|0; + p9 = p9|0; + p10 = p10|0; + p11 = p11|0; + p12 = p12|0; + p13 = p13|0; + p14 = p14|0; + p15 = p15|0; + + // opad + reset(); + _core( + p0 ^ 0x5c5c5c5c, + p1 ^ 0x5c5c5c5c, + p2 ^ 0x5c5c5c5c, + p3 ^ 0x5c5c5c5c, + p4 ^ 0x5c5c5c5c, + p5 ^ 0x5c5c5c5c, + p6 ^ 0x5c5c5c5c, + p7 ^ 0x5c5c5c5c, + p8 ^ 0x5c5c5c5c, + p9 ^ 0x5c5c5c5c, + p10 ^ 0x5c5c5c5c, + p11 ^ 0x5c5c5c5c, + p12 ^ 0x5c5c5c5c, + p13 ^ 0x5c5c5c5c, + p14 ^ 0x5c5c5c5c, + p15 ^ 0x5c5c5c5c + ); + O0 = H0; + O1 = H1; + O2 = H2; + O3 = H3; + O4 = H4; + O5 = H5; + O6 = H6; + O7 = H7; + + // ipad + reset(); + _core( + p0 ^ 0x36363636, + p1 ^ 0x36363636, + p2 ^ 0x36363636, + p3 ^ 0x36363636, + p4 ^ 0x36363636, + p5 ^ 0x36363636, + p6 ^ 0x36363636, + p7 ^ 0x36363636, + p8 ^ 0x36363636, + p9 ^ 0x36363636, + p10 ^ 0x36363636, + p11 ^ 0x36363636, + p12 ^ 0x36363636, + p13 ^ 0x36363636, + p14 ^ 0x36363636, + p15 ^ 0x36363636 + ); + I0 = H0; + I1 = H1; + I2 = H2; + I3 = H3; + I4 = H4; + I5 = H5; + I6 = H6; + I7 = H7; + + TOTAL0 = 64; + TOTAL1 = 0; + } + + // offset — multiple of 64 + // output — multiple of 32 + function hmac_finish ( offset, length, output ) { + offset = offset|0; + length = length|0; + output = output|0; + + var t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, + hashed = 0; + + if ( offset & 63 ) + return -1; + + if ( ~output ) + if ( output & 31 ) + return -1; + + hashed = finish( offset, length, -1 )|0; + t0 = H0, t1 = H1, t2 = H2, t3 = H3, t4 = H4, t5 = H5, t6 = H6, t7 = H7; + + _hmac_opad(); + _core( t0, t1, t2, t3, t4, t5, t6, t7, 0x80000000, 0, 0, 0, 0, 0, 0, 768 ); + + if ( ~output ) + _state_to_heap(output); + + return hashed|0; + } + + // salt is assumed to be already processed + // offset — multiple of 64 + // output — multiple of 32 + function pbkdf2_generate_block ( offset, length, block, count, output ) { + offset = offset|0; + length = length|0; + block = block|0; + count = count|0; + output = output|0; + + var h0 = 0, h1 = 0, h2 = 0, h3 = 0, h4 = 0, h5 = 0, h6 = 0, h7 = 0, + t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0; + + if ( offset & 63 ) + return -1; + + if ( ~output ) + if ( output & 31 ) + return -1; + + // pad block number into heap + // FIXME probable OOB write + HEAP[(offset+length)|0] = block>>>24; + HEAP[(offset+length+1)|0] = block>>>16&255; + HEAP[(offset+length+2)|0] = block>>>8&255; + HEAP[(offset+length+3)|0] = block&255; + + // finish first iteration + hmac_finish( offset, (length+4)|0, -1 )|0; + h0 = t0 = H0, h1 = t1 = H1, h2 = t2 = H2, h3 = t3 = H3, h4 = t4 = H4, h5 = t5 = H5, h6 = t6 = H6, h7 = t7 = H7; + count = (count-1)|0; + + // perform the rest iterations + while ( (count|0) > 0 ) { + hmac_reset(); + _core( t0, t1, t2, t3, t4, t5, t6, t7, 0x80000000, 0, 0, 0, 0, 0, 0, 768 ); + t0 = H0, t1 = H1, t2 = H2, t3 = H3, t4 = H4, t5 = H5, t6 = H6, t7 = H7; + + _hmac_opad(); + _core( t0, t1, t2, t3, t4, t5, t6, t7, 0x80000000, 0, 0, 0, 0, 0, 0, 768 ); + t0 = H0, t1 = H1, t2 = H2, t3 = H3, t4 = H4, t5 = H5, t6 = H6, t7 = H7; + + h0 = h0 ^ H0; + h1 = h1 ^ H1; + h2 = h2 ^ H2; + h3 = h3 ^ H3; + h4 = h4 ^ H4; + h5 = h5 ^ H5; + h6 = h6 ^ H6; + h7 = h7 ^ H7; + + count = (count-1)|0; + } + + H0 = h0; + H1 = h1; + H2 = h2; + H3 = h3; + H4 = h4; + H5 = h5; + H6 = h6; + H7 = h7; + + if ( ~output ) + _state_to_heap(output); + + return 0; + } + + return { + // SHA256 + reset: reset, + init: init, + process: process, + finish: finish, + + // HMAC-SHA256 + hmac_reset: hmac_reset, + hmac_init: hmac_init, + hmac_finish: hmac_finish, + + // PBKDF2-HMAC-SHA256 + pbkdf2_generate_block: pbkdf2_generate_block + } +} + +var _sha256_block_size = 64, + _sha256_hash_size = 32; + +function sha256_constructor ( options ) { + options = options || {}; + + this.heap = _heap_init( Uint8Array, options ); + this.asm = options.asm || sha256_asm( global, null, this.heap.buffer ); + + this.BLOCK_SIZE = _sha256_block_size; + this.HASH_SIZE = _sha256_hash_size; + + this.reset(); +} + +sha256_constructor.BLOCK_SIZE = _sha256_block_size; +sha256_constructor.HASH_SIZE = _sha256_hash_size; +var sha256_prototype = sha256_constructor.prototype; +sha256_prototype.reset = hash_reset; +sha256_prototype.process = hash_process; +sha256_prototype.finish = hash_finish; + +var sha256_instance = null; + +function get_sha256_instance () { + if ( sha256_instance === null ) sha256_instance = new sha256_constructor( { heapSize: 0x100000 } ); + return sha256_instance; +} + +/** + * SHA256 exports + */ + +function sha256_bytes ( data ) { + if ( data === undefined ) throw new SyntaxError("data required"); + return get_sha256_instance().reset().process(data).finish().result; +} + +function sha256_hex ( data ) { + var result = sha256_bytes(data); + return bytes_to_hex(result); +} + +function sha256_base64 ( data ) { + var result = sha256_bytes(data); + return bytes_to_base64(result); +} + +sha256_constructor.bytes = sha256_bytes; +sha256_constructor.hex = sha256_hex; +sha256_constructor.base64 = sha256_base64; + +exports.SHA256 = sha256_constructor; + + +'function'==typeof define&&define.amd?define([],function(){return exports}):'object'==typeof module&&module.exports?module.exports=exports:global.asmCrypto=exports; + +return exports; +})( {}, function(){return this}() ); +},{}],2:[function(_dereq_,module,exports){ +(function (process,global){ +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE + * @version 4.1.1 + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.ES6Promise = factory()); +}(this, (function () { 'use strict'; + +function objectOrFunction(x) { + var type = typeof x; + return x !== null && (type === 'object' || type === 'function'); +} + +function isFunction(x) { + return typeof x === 'function'; +} + +var _isArray = undefined; +if (Array.isArray) { + _isArray = Array.isArray; +} else { + _isArray = function (x) { + return Object.prototype.toString.call(x) === '[object Array]'; + }; +} + +var isArray = _isArray; + +var len = 0; +var vertxNext = undefined; +var customSchedulerFn = undefined; + +var asap = function asap(callback, arg) { + queue[len] = callback; + queue[len + 1] = arg; + len += 2; + if (len === 2) { + // If len is 2, that means that we need to schedule an async flush. + // If additional callbacks are queued before the queue is flushed, they + // will be processed by this flush that we are scheduling. + if (customSchedulerFn) { + customSchedulerFn(flush); + } else { + scheduleFlush(); + } + } +}; + +function setScheduler(scheduleFn) { + customSchedulerFn = scheduleFn; +} + +function setAsap(asapFn) { + asap = asapFn; +} + +var browserWindow = typeof window !== 'undefined' ? window : undefined; +var browserGlobal = browserWindow || {}; +var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver; +var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]'; + +// test for web worker but not in IE10 +var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; + +// node +function useNextTick() { + // node version 0.10.x displays a deprecation warning when nextTick is used recursively + // see https://github.com/cujojs/when/issues/410 for details + return function () { + return process.nextTick(flush); + }; +} + +// vertx +function useVertxTimer() { + if (typeof vertxNext !== 'undefined') { + return function () { + vertxNext(flush); + }; + } + + return useSetTimeout(); +} + +function useMutationObserver() { + var iterations = 0; + var observer = new BrowserMutationObserver(flush); + var node = document.createTextNode(''); + observer.observe(node, { characterData: true }); + + return function () { + node.data = iterations = ++iterations % 2; + }; +} + +// web worker +function useMessageChannel() { + var channel = new MessageChannel(); + channel.port1.onmessage = flush; + return function () { + return channel.port2.postMessage(0); + }; +} + +function useSetTimeout() { + // Store setTimeout reference so es6-promise will be unaffected by + // other code modifying setTimeout (like sinon.useFakeTimers()) + var globalSetTimeout = setTimeout; + return function () { + return globalSetTimeout(flush, 1); + }; +} + +var queue = new Array(1000); +function flush() { + for (var i = 0; i < len; i += 2) { + var callback = queue[i]; + var arg = queue[i + 1]; + + callback(arg); + + queue[i] = undefined; + queue[i + 1] = undefined; + } + + len = 0; +} + +function attemptVertx() { + try { + var r = _dereq_; + var vertx = r('vertx'); + vertxNext = vertx.runOnLoop || vertx.runOnContext; + return useVertxTimer(); + } catch (e) { + return useSetTimeout(); + } +} + +var scheduleFlush = undefined; +// Decide what async method to use to triggering processing of queued callbacks: +if (isNode) { + scheduleFlush = useNextTick(); +} else if (BrowserMutationObserver) { + scheduleFlush = useMutationObserver(); +} else if (isWorker) { + scheduleFlush = useMessageChannel(); +} else if (browserWindow === undefined && typeof _dereq_ === 'function') { + scheduleFlush = attemptVertx(); +} else { + scheduleFlush = useSetTimeout(); +} + +function then(onFulfillment, onRejection) { + var _arguments = arguments; + + var parent = this; + + var child = new this.constructor(noop); + + if (child[PROMISE_ID] === undefined) { + makePromise(child); + } + + var _state = parent._state; + + if (_state) { + (function () { + var callback = _arguments[_state - 1]; + asap(function () { + return invokeCallback(_state, child, callback, parent._result); + }); + })(); + } else { + subscribe(parent, child, onFulfillment, onRejection); + } + + return child; +} + +/** + `Promise.resolve` returns a promise that will become resolved with the + passed `value`. It is shorthand for the following: + + ```javascript + let promise = new Promise(function(resolve, reject){ + resolve(1); + }); + + promise.then(function(value){ + // value === 1 + }); + ``` + + Instead of writing the above, your code now simply becomes the following: + + ```javascript + let promise = Promise.resolve(1); + + promise.then(function(value){ + // value === 1 + }); + ``` + + @method resolve + @static + @param {Any} value value that the returned promise will be resolved with + Useful for tooling. + @return {Promise} a promise that will become fulfilled with the given + `value` +*/ +function resolve$1(object) { + /*jshint validthis:true */ + var Constructor = this; + + if (object && typeof object === 'object' && object.constructor === Constructor) { + return object; + } + + var promise = new Constructor(noop); + resolve(promise, object); + return promise; +} + +var PROMISE_ID = Math.random().toString(36).substring(16); + +function noop() {} + +var PENDING = void 0; +var FULFILLED = 1; +var REJECTED = 2; + +var GET_THEN_ERROR = new ErrorObject(); + +function selfFulfillment() { + return new TypeError("You cannot resolve a promise with itself"); +} + +function cannotReturnOwn() { + return new TypeError('A promises callback cannot return that same promise.'); +} + +function getThen(promise) { + try { + return promise.then; + } catch (error) { + GET_THEN_ERROR.error = error; + return GET_THEN_ERROR; + } +} + +function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) { + try { + then$$1.call(value, fulfillmentHandler, rejectionHandler); + } catch (e) { + return e; + } +} + +function handleForeignThenable(promise, thenable, then$$1) { + asap(function (promise) { + var sealed = false; + var error = tryThen(then$$1, thenable, function (value) { + if (sealed) { + return; + } + sealed = true; + if (thenable !== value) { + resolve(promise, value); + } else { + fulfill(promise, value); + } + }, function (reason) { + if (sealed) { + return; + } + sealed = true; + + reject(promise, reason); + }, 'Settle: ' + (promise._label || ' unknown promise')); + + if (!sealed && error) { + sealed = true; + reject(promise, error); + } + }, promise); +} + +function handleOwnThenable(promise, thenable) { + if (thenable._state === FULFILLED) { + fulfill(promise, thenable._result); + } else if (thenable._state === REJECTED) { + reject(promise, thenable._result); + } else { + subscribe(thenable, undefined, function (value) { + return resolve(promise, value); + }, function (reason) { + return reject(promise, reason); + }); + } +} + +function handleMaybeThenable(promise, maybeThenable, then$$1) { + if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) { + handleOwnThenable(promise, maybeThenable); + } else { + if (then$$1 === GET_THEN_ERROR) { + reject(promise, GET_THEN_ERROR.error); + GET_THEN_ERROR.error = null; + } else if (then$$1 === undefined) { + fulfill(promise, maybeThenable); + } else if (isFunction(then$$1)) { + handleForeignThenable(promise, maybeThenable, then$$1); + } else { + fulfill(promise, maybeThenable); + } + } +} + +function resolve(promise, value) { + if (promise === value) { + reject(promise, selfFulfillment()); + } else if (objectOrFunction(value)) { + handleMaybeThenable(promise, value, getThen(value)); + } else { + fulfill(promise, value); + } +} + +function publishRejection(promise) { + if (promise._onerror) { + promise._onerror(promise._result); + } + + publish(promise); +} + +function fulfill(promise, value) { + if (promise._state !== PENDING) { + return; + } + + promise._result = value; + promise._state = FULFILLED; + + if (promise._subscribers.length !== 0) { + asap(publish, promise); + } +} + +function reject(promise, reason) { + if (promise._state !== PENDING) { + return; + } + promise._state = REJECTED; + promise._result = reason; + + asap(publishRejection, promise); +} + +function subscribe(parent, child, onFulfillment, onRejection) { + var _subscribers = parent._subscribers; + var length = _subscribers.length; + + parent._onerror = null; + + _subscribers[length] = child; + _subscribers[length + FULFILLED] = onFulfillment; + _subscribers[length + REJECTED] = onRejection; + + if (length === 0 && parent._state) { + asap(publish, parent); + } +} + +function publish(promise) { + var subscribers = promise._subscribers; + var settled = promise._state; + + if (subscribers.length === 0) { + return; + } + + var child = undefined, + callback = undefined, + detail = promise._result; + + for (var i = 0; i < subscribers.length; i += 3) { + child = subscribers[i]; + callback = subscribers[i + settled]; + + if (child) { + invokeCallback(settled, child, callback, detail); + } else { + callback(detail); + } + } + + promise._subscribers.length = 0; +} + +function ErrorObject() { + this.error = null; +} + +var TRY_CATCH_ERROR = new ErrorObject(); + +function tryCatch(callback, detail) { + try { + return callback(detail); + } catch (e) { + TRY_CATCH_ERROR.error = e; + return TRY_CATCH_ERROR; + } +} + +function invokeCallback(settled, promise, callback, detail) { + var hasCallback = isFunction(callback), + value = undefined, + error = undefined, + succeeded = undefined, + failed = undefined; + + if (hasCallback) { + value = tryCatch(callback, detail); + + if (value === TRY_CATCH_ERROR) { + failed = true; + error = value.error; + value.error = null; + } else { + succeeded = true; + } + + if (promise === value) { + reject(promise, cannotReturnOwn()); + return; + } + } else { + value = detail; + succeeded = true; + } + + if (promise._state !== PENDING) { + // noop + } else if (hasCallback && succeeded) { + resolve(promise, value); + } else if (failed) { + reject(promise, error); + } else if (settled === FULFILLED) { + fulfill(promise, value); + } else if (settled === REJECTED) { + reject(promise, value); + } +} + +function initializePromise(promise, resolver) { + try { + resolver(function resolvePromise(value) { + resolve(promise, value); + }, function rejectPromise(reason) { + reject(promise, reason); + }); + } catch (e) { + reject(promise, e); + } +} + +var id = 0; +function nextId() { + return id++; +} + +function makePromise(promise) { + promise[PROMISE_ID] = id++; + promise._state = undefined; + promise._result = undefined; + promise._subscribers = []; +} + +function Enumerator$1(Constructor, input) { + this._instanceConstructor = Constructor; + this.promise = new Constructor(noop); + + if (!this.promise[PROMISE_ID]) { + makePromise(this.promise); + } + + if (isArray(input)) { + this.length = input.length; + this._remaining = input.length; + + this._result = new Array(this.length); + + if (this.length === 0) { + fulfill(this.promise, this._result); + } else { + this.length = this.length || 0; + this._enumerate(input); + if (this._remaining === 0) { + fulfill(this.promise, this._result); + } + } + } else { + reject(this.promise, validationError()); + } +} + +function validationError() { + return new Error('Array Methods must be provided an Array'); +} + +Enumerator$1.prototype._enumerate = function (input) { + for (var i = 0; this._state === PENDING && i < input.length; i++) { + this._eachEntry(input[i], i); + } +}; + +Enumerator$1.prototype._eachEntry = function (entry, i) { + var c = this._instanceConstructor; + var resolve$$1 = c.resolve; + + if (resolve$$1 === resolve$1) { + var _then = getThen(entry); + + if (_then === then && entry._state !== PENDING) { + this._settledAt(entry._state, i, entry._result); + } else if (typeof _then !== 'function') { + this._remaining--; + this._result[i] = entry; + } else if (c === Promise$2) { + var promise = new c(noop); + handleMaybeThenable(promise, entry, _then); + this._willSettleAt(promise, i); + } else { + this._willSettleAt(new c(function (resolve$$1) { + return resolve$$1(entry); + }), i); + } + } else { + this._willSettleAt(resolve$$1(entry), i); + } +}; + +Enumerator$1.prototype._settledAt = function (state, i, value) { + var promise = this.promise; + + if (promise._state === PENDING) { + this._remaining--; + + if (state === REJECTED) { + reject(promise, value); + } else { + this._result[i] = value; + } + } + + if (this._remaining === 0) { + fulfill(promise, this._result); + } +}; + +Enumerator$1.prototype._willSettleAt = function (promise, i) { + var enumerator = this; + + subscribe(promise, undefined, function (value) { + return enumerator._settledAt(FULFILLED, i, value); + }, function (reason) { + return enumerator._settledAt(REJECTED, i, reason); + }); +}; + +/** + `Promise.all` accepts an array of promises, and returns a new promise which + is fulfilled with an array of fulfillment values for the passed promises, or + rejected with the reason of the first passed promise to be rejected. It casts all + elements of the passed iterable to promises as it runs this algorithm. + + Example: + + ```javascript + let promise1 = resolve(1); + let promise2 = resolve(2); + let promise3 = resolve(3); + let promises = [ promise1, promise2, promise3 ]; + + Promise.all(promises).then(function(array){ + // The array here would be [ 1, 2, 3 ]; + }); + ``` + + If any of the `promises` given to `all` are rejected, the first promise + that is rejected will be given as an argument to the returned promises's + rejection handler. For example: + + Example: + + ```javascript + let promise1 = resolve(1); + let promise2 = reject(new Error("2")); + let promise3 = reject(new Error("3")); + let promises = [ promise1, promise2, promise3 ]; + + Promise.all(promises).then(function(array){ + // Code here never runs because there are rejected promises! + }, function(error) { + // error.message === "2" + }); + ``` + + @method all + @static + @param {Array} entries array of promises + @param {String} label optional string for labeling the promise. + Useful for tooling. + @return {Promise} promise that is fulfilled when all `promises` have been + fulfilled, or rejected if any of them become rejected. + @static +*/ +function all$1(entries) { + return new Enumerator$1(this, entries).promise; +} + +/** + `Promise.race` returns a new promise which is settled in the same way as the + first passed promise to settle. + + Example: + + ```javascript + let promise1 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 1'); + }, 200); + }); + + let promise2 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 2'); + }, 100); + }); + + Promise.race([promise1, promise2]).then(function(result){ + // result === 'promise 2' because it was resolved before promise1 + // was resolved. + }); + ``` + + `Promise.race` is deterministic in that only the state of the first + settled promise matters. For example, even if other promises given to the + `promises` array argument are resolved, but the first settled promise has + become rejected before the other promises became fulfilled, the returned + promise will become rejected: + + ```javascript + let promise1 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 1'); + }, 200); + }); + + let promise2 = new Promise(function(resolve, reject){ + setTimeout(function(){ + reject(new Error('promise 2')); + }, 100); + }); + + Promise.race([promise1, promise2]).then(function(result){ + // Code here never runs + }, function(reason){ + // reason.message === 'promise 2' because promise 2 became rejected before + // promise 1 became fulfilled + }); + ``` + + An example real-world use case is implementing timeouts: + + ```javascript + Promise.race([ajax('foo.json'), timeout(5000)]) + ``` + + @method race + @static + @param {Array} promises array of promises to observe + Useful for tooling. + @return {Promise} a promise which settles in the same way as the first passed + promise to settle. +*/ +function race$1(entries) { + /*jshint validthis:true */ + var Constructor = this; + + if (!isArray(entries)) { + return new Constructor(function (_, reject) { + return reject(new TypeError('You must pass an array to race.')); + }); + } else { + return new Constructor(function (resolve, reject) { + var length = entries.length; + for (var i = 0; i < length; i++) { + Constructor.resolve(entries[i]).then(resolve, reject); + } + }); + } +} + +/** + `Promise.reject` returns a promise rejected with the passed `reason`. + It is shorthand for the following: + + ```javascript + let promise = new Promise(function(resolve, reject){ + reject(new Error('WHOOPS')); + }); + + promise.then(function(value){ + // Code here doesn't run because the promise is rejected! + }, function(reason){ + // reason.message === 'WHOOPS' + }); + ``` + + Instead of writing the above, your code now simply becomes the following: + + ```javascript + let promise = Promise.reject(new Error('WHOOPS')); + + promise.then(function(value){ + // Code here doesn't run because the promise is rejected! + }, function(reason){ + // reason.message === 'WHOOPS' + }); + ``` + + @method reject + @static + @param {Any} reason value that the returned promise will be rejected with. + Useful for tooling. + @return {Promise} a promise rejected with the given `reason`. +*/ +function reject$1(reason) { + /*jshint validthis:true */ + var Constructor = this; + var promise = new Constructor(noop); + reject(promise, reason); + return promise; +} + +function needsResolver() { + throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); +} + +function needsNew() { + throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); +} + +/** + Promise objects represent the eventual result of an asynchronous operation. The + primary way of interacting with a promise is through its `then` method, which + registers callbacks to receive either a promise's eventual value or the reason + why the promise cannot be fulfilled. + + Terminology + ----------- + + - `promise` is an object or function with a `then` method whose behavior conforms to this specification. + - `thenable` is an object or function that defines a `then` method. + - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). + - `exception` is a value that is thrown using the throw statement. + - `reason` is a value that indicates why a promise was rejected. + - `settled` the final resting state of a promise, fulfilled or rejected. + + A promise can be in one of three states: pending, fulfilled, or rejected. + + Promises that are fulfilled have a fulfillment value and are in the fulfilled + state. Promises that are rejected have a rejection reason and are in the + rejected state. A fulfillment value is never a thenable. + + Promises can also be said to *resolve* a value. If this value is also a + promise, then the original promise's settled state will match the value's + settled state. So a promise that *resolves* a promise that rejects will + itself reject, and a promise that *resolves* a promise that fulfills will + itself fulfill. + + + Basic Usage: + ------------ + + ```js + let promise = new Promise(function(resolve, reject) { + // on success + resolve(value); + + // on failure + reject(reason); + }); + + promise.then(function(value) { + // on fulfillment + }, function(reason) { + // on rejection + }); + ``` + + Advanced Usage: + --------------- + + Promises shine when abstracting away asynchronous interactions such as + `XMLHttpRequest`s. + + ```js + function getJSON(url) { + return new Promise(function(resolve, reject){ + let xhr = new XMLHttpRequest(); + + xhr.open('GET', url); + xhr.onreadystatechange = handler; + xhr.responseType = 'json'; + xhr.setRequestHeader('Accept', 'application/json'); + xhr.send(); + + function handler() { + if (this.readyState === this.DONE) { + if (this.status === 200) { + resolve(this.response); + } else { + reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); + } + } + }; + }); + } + + getJSON('/posts.json').then(function(json) { + // on fulfillment + }, function(reason) { + // on rejection + }); + ``` + + Unlike callbacks, promises are great composable primitives. + + ```js + Promise.all([ + getJSON('/posts'), + getJSON('/comments') + ]).then(function(values){ + values[0] // => postsJSON + values[1] // => commentsJSON + + return values; + }); + ``` + + @class Promise + @param {function} resolver + Useful for tooling. + @constructor +*/ +function Promise$2(resolver) { + this[PROMISE_ID] = nextId(); + this._result = this._state = undefined; + this._subscribers = []; + + if (noop !== resolver) { + typeof resolver !== 'function' && needsResolver(); + this instanceof Promise$2 ? initializePromise(this, resolver) : needsNew(); + } +} + +Promise$2.all = all$1; +Promise$2.race = race$1; +Promise$2.resolve = resolve$1; +Promise$2.reject = reject$1; +Promise$2._setScheduler = setScheduler; +Promise$2._setAsap = setAsap; +Promise$2._asap = asap; + +Promise$2.prototype = { + constructor: Promise$2, + + /** + The primary way of interacting with a promise is through its `then` method, + which registers callbacks to receive either a promise's eventual value or the + reason why the promise cannot be fulfilled. + + ```js + findUser().then(function(user){ + // user is available + }, function(reason){ + // user is unavailable, and you are given the reason why + }); + ``` + + Chaining + -------- + + The return value of `then` is itself a promise. This second, 'downstream' + promise is resolved with the return value of the first promise's fulfillment + or rejection handler, or rejected if the handler throws an exception. + + ```js + findUser().then(function (user) { + return user.name; + }, function (reason) { + return 'default name'; + }).then(function (userName) { + // If `findUser` fulfilled, `userName` will be the user's name, otherwise it + // will be `'default name'` + }); + + findUser().then(function (user) { + throw new Error('Found user, but still unhappy'); + }, function (reason) { + throw new Error('`findUser` rejected and we're unhappy'); + }).then(function (value) { + // never reached + }, function (reason) { + // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. + // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'. + }); + ``` + If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. + + ```js + findUser().then(function (user) { + throw new PedagogicalException('Upstream error'); + }).then(function (value) { + // never reached + }).then(function (value) { + // never reached + }, function (reason) { + // The `PedgagocialException` is propagated all the way down to here + }); + ``` + + Assimilation + ------------ + + Sometimes the value you want to propagate to a downstream promise can only be + retrieved asynchronously. This can be achieved by returning a promise in the + fulfillment or rejection handler. The downstream promise will then be pending + until the returned promise is settled. This is called *assimilation*. + + ```js + findUser().then(function (user) { + return findCommentsByAuthor(user); + }).then(function (comments) { + // The user's comments are now available + }); + ``` + + If the assimliated promise rejects, then the downstream promise will also reject. + + ```js + findUser().then(function (user) { + return findCommentsByAuthor(user); + }).then(function (comments) { + // If `findCommentsByAuthor` fulfills, we'll have the value here + }, function (reason) { + // If `findCommentsByAuthor` rejects, we'll have the reason here + }); + ``` + + Simple Example + -------------- + + Synchronous Example + + ```javascript + let result; + + try { + result = findResult(); + // success + } catch(reason) { + // failure + } + ``` + + Errback Example + + ```js + findResult(function(result, err){ + if (err) { + // failure + } else { + // success + } + }); + ``` + + Promise Example; + + ```javascript + findResult().then(function(result){ + // success + }, function(reason){ + // failure + }); + ``` + + Advanced Example + -------------- + + Synchronous Example + + ```javascript + let author, books; + + try { + author = findAuthor(); + books = findBooksByAuthor(author); + // success + } catch(reason) { + // failure + } + ``` + + Errback Example + + ```js + + function foundBooks(books) { + + } + + function failure(reason) { + + } + + findAuthor(function(author, err){ + if (err) { + failure(err); + // failure + } else { + try { + findBoooksByAuthor(author, function(books, err) { + if (err) { + failure(err); + } else { + try { + foundBooks(books); + } catch(reason) { + failure(reason); + } + } + }); + } catch(error) { + failure(err); + } + // success + } + }); + ``` + + Promise Example; + + ```javascript + findAuthor(). + then(findBooksByAuthor). + then(function(books){ + // found books + }).catch(function(reason){ + // something went wrong + }); + ``` + + @method then + @param {Function} onFulfilled + @param {Function} onRejected + Useful for tooling. + @return {Promise} + */ + then: then, + + /** + `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same + as the catch block of a try/catch statement. + + ```js + function findAuthor(){ + throw new Error('couldn't find that author'); + } + + // synchronous + try { + findAuthor(); + } catch(reason) { + // something went wrong + } + + // async with promises + findAuthor().catch(function(reason){ + // something went wrong + }); + ``` + + @method catch + @param {Function} onRejection + Useful for tooling. + @return {Promise} + */ + 'catch': function _catch(onRejection) { + return this.then(null, onRejection); + } +}; + +/*global self*/ +function polyfill$1() { + var local = undefined; + + if (typeof global !== 'undefined') { + local = global; + } else if (typeof self !== 'undefined') { + local = self; + } else { + try { + local = Function('return this')(); + } catch (e) { + throw new Error('polyfill failed because global object is unavailable in this environment'); + } + } + + var P = local.Promise; + + if (P) { + var promiseToString = null; + try { + promiseToString = Object.prototype.toString.call(P.resolve()); + } catch (e) { + // silently ignored + } + + if (promiseToString === '[object Promise]' && !P.cast) { + return; + } + } + + local.Promise = Promise$2; +} + +// Strange compat.. +Promise$2.polyfill = polyfill$1; +Promise$2.Promise = Promise$2; + +return Promise$2; + +}))); + + + +}).call(this,_dereq_('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"_process":3}],3:[function(_dereq_,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],4:[function(_dereq_,module,exports){ +(function (global){ +(function () { + function Rusha(chunkSize) { + 'use strict'; + var util = { + getDataType: function (data) { + if (typeof data === 'string') { + return 'string'; + } + if (data instanceof Array) { + return 'array'; + } + if (typeof global !== 'undefined' && global.Buffer && global.Buffer.isBuffer(data)) { + return 'buffer'; + } + if (data instanceof ArrayBuffer) { + return 'arraybuffer'; + } + if (data.buffer instanceof ArrayBuffer) { + return 'view'; + } + if (data instanceof Blob) { + return 'blob'; + } + throw new Error('Unsupported data type.'); + } + }; + var // Private object structure. + self$2 = { fill: 0 }; + var // Calculate the length of buffer that the sha1 routine uses + // including the padding. + padlen = function (len) { + for (len += 9; len % 64 > 0; len += 1); + return len; + }; + var padZeroes = function (bin, len) { + var h8 = new Uint8Array(bin.buffer); + var om = len % 4, align = len - om; + switch (om) { + case 0: + h8[align + 3] = 0; + case 1: + h8[align + 2] = 0; + case 2: + h8[align + 1] = 0; + case 3: + h8[align + 0] = 0; + } + for (var i$2 = (len >> 2) + 1; i$2 < bin.length; i$2++) + bin[i$2] = 0; + }; + var padData = function (bin, chunkLen, msgLen) { + bin[chunkLen >> 2] |= 128 << 24 - (chunkLen % 4 << 3); + // To support msgLen >= 2 GiB, use a float division when computing the + // high 32-bits of the big-endian message length in bits. + bin[((chunkLen >> 2) + 2 & ~15) + 14] = msgLen / (1 << 29) | 0; + bin[((chunkLen >> 2) + 2 & ~15) + 15] = msgLen << 3; + }; + var // Convert a binary string and write it to the heap. + // A binary string is expected to only contain char codes < 256. + convStr = function (H8, H32, start, len, off) { + var str = this, i$2, om = off % 4, lm = (len + om) % 4, j = len - lm; + switch (om) { + case 0: + H8[off] = str.charCodeAt(start + 3); + case 1: + H8[off + 1 - (om << 1) | 0] = str.charCodeAt(start + 2); + case 2: + H8[off + 2 - (om << 1) | 0] = str.charCodeAt(start + 1); + case 3: + H8[off + 3 - (om << 1) | 0] = str.charCodeAt(start); + } + if (len < lm + om) { + return; + } + for (i$2 = 4 - om; i$2 < j; i$2 = i$2 + 4 | 0) { + H32[off + i$2 >> 2] = str.charCodeAt(start + i$2) << 24 | str.charCodeAt(start + i$2 + 1) << 16 | str.charCodeAt(start + i$2 + 2) << 8 | str.charCodeAt(start + i$2 + 3); + } + switch (lm) { + case 3: + H8[off + j + 1 | 0] = str.charCodeAt(start + j + 2); + case 2: + H8[off + j + 2 | 0] = str.charCodeAt(start + j + 1); + case 1: + H8[off + j + 3 | 0] = str.charCodeAt(start + j); + } + }; + var // Convert a buffer or array and write it to the heap. + // The buffer or array is expected to only contain elements < 256. + convBuf = function (H8, H32, start, len, off) { + var buf = this, i$2, om = off % 4, lm = (len + om) % 4, j = len - lm; + switch (om) { + case 0: + H8[off] = buf[start + 3]; + case 1: + H8[off + 1 - (om << 1) | 0] = buf[start + 2]; + case 2: + H8[off + 2 - (om << 1) | 0] = buf[start + 1]; + case 3: + H8[off + 3 - (om << 1) | 0] = buf[start]; + } + if (len < lm + om) { + return; + } + for (i$2 = 4 - om; i$2 < j; i$2 = i$2 + 4 | 0) { + H32[off + i$2 >> 2 | 0] = buf[start + i$2] << 24 | buf[start + i$2 + 1] << 16 | buf[start + i$2 + 2] << 8 | buf[start + i$2 + 3]; + } + switch (lm) { + case 3: + H8[off + j + 1 | 0] = buf[start + j + 2]; + case 2: + H8[off + j + 2 | 0] = buf[start + j + 1]; + case 1: + H8[off + j + 3 | 0] = buf[start + j]; + } + }; + var convBlob = function (H8, H32, start, len, off) { + var blob = this, i$2, om = off % 4, lm = (len + om) % 4, j = len - lm; + var buf = new Uint8Array(reader.readAsArrayBuffer(blob.slice(start, start + len))); + switch (om) { + case 0: + H8[off] = buf[3]; + case 1: + H8[off + 1 - (om << 1) | 0] = buf[2]; + case 2: + H8[off + 2 - (om << 1) | 0] = buf[1]; + case 3: + H8[off + 3 - (om << 1) | 0] = buf[0]; + } + if (len < lm + om) { + return; + } + for (i$2 = 4 - om; i$2 < j; i$2 = i$2 + 4 | 0) { + H32[off + i$2 >> 2 | 0] = buf[i$2] << 24 | buf[i$2 + 1] << 16 | buf[i$2 + 2] << 8 | buf[i$2 + 3]; + } + switch (lm) { + case 3: + H8[off + j + 1 | 0] = buf[j + 2]; + case 2: + H8[off + j + 2 | 0] = buf[j + 1]; + case 1: + H8[off + j + 3 | 0] = buf[j]; + } + }; + var convFn = function (data) { + switch (util.getDataType(data)) { + case 'string': + return convStr.bind(data); + case 'array': + return convBuf.bind(data); + case 'buffer': + return convBuf.bind(data); + case 'arraybuffer': + return convBuf.bind(new Uint8Array(data)); + case 'view': + return convBuf.bind(new Uint8Array(data.buffer, data.byteOffset, data.byteLength)); + case 'blob': + return convBlob.bind(data); + } + }; + var slice = function (data, offset) { + switch (util.getDataType(data)) { + case 'string': + return data.slice(offset); + case 'array': + return data.slice(offset); + case 'buffer': + return data.slice(offset); + case 'arraybuffer': + return data.slice(offset); + case 'view': + return data.buffer.slice(offset); + } + }; + var // Precompute 00 - ff strings + precomputedHex = new Array(256); + for (var i = 0; i < 256; i++) { + precomputedHex[i] = (i < 16 ? '0' : '') + i.toString(16); + } + var // Convert an ArrayBuffer into its hexadecimal string representation. + hex = function (arrayBuffer) { + var binarray = new Uint8Array(arrayBuffer); + var res = new Array(arrayBuffer.byteLength); + for (var i$2 = 0; i$2 < res.length; i$2++) { + res[i$2] = precomputedHex[binarray[i$2]]; + } + return res.join(''); + }; + var ceilHeapSize = function (v) { + // The asm.js spec says: + // The heap object's byteLength must be either + // 2^n for n in [12, 24) or 2^24 * n for n ≥ 1. + // Also, byteLengths smaller than 2^16 are deprecated. + var p; + if (// If v is smaller than 2^16, the smallest possible solution + // is 2^16. + v <= 65536) + return 65536; + if (// If v < 2^24, we round up to 2^n, + // otherwise we round up to 2^24 * n. + v < 16777216) { + for (p = 1; p < v; p = p << 1); + } else { + for (p = 16777216; p < v; p += 16777216); + } + return p; + }; + var // Initialize the internal data structures to a new capacity. + init = function (size) { + if (size % 64 > 0) { + throw new Error('Chunk size must be a multiple of 128 bit'); + } + self$2.offset = 0; + self$2.maxChunkLen = size; + self$2.padMaxChunkLen = padlen(size); + // The size of the heap is the sum of: + // 1. The padded input message size + // 2. The extended space the algorithm needs (320 byte) + // 3. The 160 bit state the algoritm uses + self$2.heap = new ArrayBuffer(ceilHeapSize(self$2.padMaxChunkLen + 320 + 20)); + self$2.h32 = new Int32Array(self$2.heap); + self$2.h8 = new Int8Array(self$2.heap); + self$2.core = new Rusha._core({ + Int32Array: Int32Array, + DataView: DataView + }, {}, self$2.heap); + self$2.buffer = null; + }; + // Iinitializethe datastructures according + // to a chunk siyze. + init(chunkSize || 64 * 1024); + var initState = function (heap, padMsgLen) { + self$2.offset = 0; + var io = new Int32Array(heap, padMsgLen + 320, 5); + io[0] = 1732584193; + io[1] = -271733879; + io[2] = -1732584194; + io[3] = 271733878; + io[4] = -1009589776; + }; + var padChunk = function (chunkLen, msgLen) { + var padChunkLen = padlen(chunkLen); + var view = new Int32Array(self$2.heap, 0, padChunkLen >> 2); + padZeroes(view, chunkLen); + padData(view, chunkLen, msgLen); + return padChunkLen; + }; + var // Write data to the heap. + write = function (data, chunkOffset, chunkLen, off) { + convFn(data)(self$2.h8, self$2.h32, chunkOffset, chunkLen, off || 0); + }; + var // Initialize and call the RushaCore, + // assuming an input buffer of length len * 4. + coreCall = function (data, chunkOffset, chunkLen, msgLen, finalize) { + var padChunkLen = chunkLen; + write(data, chunkOffset, chunkLen); + if (finalize) { + padChunkLen = padChunk(chunkLen, msgLen); + } + self$2.core.hash(padChunkLen, self$2.padMaxChunkLen); + }; + var getRawDigest = function (heap, padMaxChunkLen) { + var io = new Int32Array(heap, padMaxChunkLen + 320, 5); + var out = new Int32Array(5); + var arr = new DataView(out.buffer); + arr.setInt32(0, io[0], false); + arr.setInt32(4, io[1], false); + arr.setInt32(8, io[2], false); + arr.setInt32(12, io[3], false); + arr.setInt32(16, io[4], false); + return out; + }; + var // Calculate the hash digest as an array of 5 32bit integers. + rawDigest = this.rawDigest = function (str) { + var msgLen = str.byteLength || str.length || str.size || 0; + initState(self$2.heap, self$2.padMaxChunkLen); + var chunkOffset = 0, chunkLen = self$2.maxChunkLen; + for (chunkOffset = 0; msgLen > chunkOffset + chunkLen; chunkOffset += chunkLen) { + coreCall(str, chunkOffset, chunkLen, msgLen, false); + } + coreCall(str, chunkOffset, msgLen - chunkOffset, msgLen, true); + return getRawDigest(self$2.heap, self$2.padMaxChunkLen); + }; + // The digest and digestFrom* interface returns the hash digest + // as a hex string. + this.digest = this.digestFromString = this.digestFromBuffer = this.digestFromArrayBuffer = function (str) { + return hex(rawDigest(str).buffer); + }; + this.resetState = function () { + initState(self$2.heap, self$2.padMaxChunkLen); + return this; + }; + this.append = function (chunk) { + var chunkOffset = 0; + var chunkLen = chunk.byteLength || chunk.length || chunk.size || 0; + var turnOffset = self$2.offset % self$2.maxChunkLen; + var inputLen; + self$2.offset += chunkLen; + while (chunkOffset < chunkLen) { + inputLen = Math.min(chunkLen - chunkOffset, self$2.maxChunkLen - turnOffset); + write(chunk, chunkOffset, inputLen, turnOffset); + turnOffset += inputLen; + chunkOffset += inputLen; + if (turnOffset === self$2.maxChunkLen) { + self$2.core.hash(self$2.maxChunkLen, self$2.padMaxChunkLen); + turnOffset = 0; + } + } + return this; + }; + this.getState = function () { + var turnOffset = self$2.offset % self$2.maxChunkLen; + var heap; + if (!turnOffset) { + var io = new Int32Array(self$2.heap, self$2.padMaxChunkLen + 320, 5); + heap = io.buffer.slice(io.byteOffset, io.byteOffset + io.byteLength); + } else { + heap = self$2.heap.slice(0); + } + return { + offset: self$2.offset, + heap: heap + }; + }; + this.setState = function (state) { + self$2.offset = state.offset; + if (state.heap.byteLength === 20) { + var io = new Int32Array(self$2.heap, self$2.padMaxChunkLen + 320, 5); + io.set(new Int32Array(state.heap)); + } else { + self$2.h32.set(new Int32Array(state.heap)); + } + return this; + }; + var rawEnd = this.rawEnd = function () { + var msgLen = self$2.offset; + var chunkLen = msgLen % self$2.maxChunkLen; + var padChunkLen = padChunk(chunkLen, msgLen); + self$2.core.hash(padChunkLen, self$2.padMaxChunkLen); + var result = getRawDigest(self$2.heap, self$2.padMaxChunkLen); + initState(self$2.heap, self$2.padMaxChunkLen); + return result; + }; + this.end = function () { + return hex(rawEnd().buffer); + }; + } + ; + // The low-level RushCore module provides the heart of Rusha, + // a high-speed sha1 implementation working on an Int32Array heap. + // At first glance, the implementation seems complicated, however + // with the SHA1 spec at hand, it is obvious this almost a textbook + // implementation that has a few functions hand-inlined and a few loops + // hand-unrolled. + Rusha._core = function RushaCore(stdlib, foreign, heap) { + 'use asm'; + var H = new stdlib.Int32Array(heap); + function hash(k, x) { + // k in bytes + k = k | 0; + x = x | 0; + var i = 0, j = 0, y0 = 0, z0 = 0, y1 = 0, z1 = 0, y2 = 0, z2 = 0, y3 = 0, z3 = 0, y4 = 0, z4 = 0, t0 = 0, t1 = 0; + y0 = H[x + 320 >> 2] | 0; + y1 = H[x + 324 >> 2] | 0; + y2 = H[x + 328 >> 2] | 0; + y3 = H[x + 332 >> 2] | 0; + y4 = H[x + 336 >> 2] | 0; + for (i = 0; (i | 0) < (k | 0); i = i + 64 | 0) { + z0 = y0; + z1 = y1; + z2 = y2; + z3 = y3; + z4 = y4; + for (j = 0; (j | 0) < 64; j = j + 4 | 0) { + t1 = H[i + j >> 2] | 0; + t0 = ((y0 << 5 | y0 >>> 27) + (y1 & y2 | ~y1 & y3) | 0) + ((t1 + y4 | 0) + 1518500249 | 0) | 0; + y4 = y3; + y3 = y2; + y2 = y1 << 30 | y1 >>> 2; + y1 = y0; + y0 = t0; + H[k + j >> 2] = t1; + } + for (j = k + 64 | 0; (j | 0) < (k + 80 | 0); j = j + 4 | 0) { + t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) << 1 | (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31; + t0 = ((y0 << 5 | y0 >>> 27) + (y1 & y2 | ~y1 & y3) | 0) + ((t1 + y4 | 0) + 1518500249 | 0) | 0; + y4 = y3; + y3 = y2; + y2 = y1 << 30 | y1 >>> 2; + y1 = y0; + y0 = t0; + H[j >> 2] = t1; + } + for (j = k + 80 | 0; (j | 0) < (k + 160 | 0); j = j + 4 | 0) { + t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) << 1 | (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31; + t0 = ((y0 << 5 | y0 >>> 27) + (y1 ^ y2 ^ y3) | 0) + ((t1 + y4 | 0) + 1859775393 | 0) | 0; + y4 = y3; + y3 = y2; + y2 = y1 << 30 | y1 >>> 2; + y1 = y0; + y0 = t0; + H[j >> 2] = t1; + } + for (j = k + 160 | 0; (j | 0) < (k + 240 | 0); j = j + 4 | 0) { + t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) << 1 | (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31; + t0 = ((y0 << 5 | y0 >>> 27) + (y1 & y2 | y1 & y3 | y2 & y3) | 0) + ((t1 + y4 | 0) - 1894007588 | 0) | 0; + y4 = y3; + y3 = y2; + y2 = y1 << 30 | y1 >>> 2; + y1 = y0; + y0 = t0; + H[j >> 2] = t1; + } + for (j = k + 240 | 0; (j | 0) < (k + 320 | 0); j = j + 4 | 0) { + t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) << 1 | (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31; + t0 = ((y0 << 5 | y0 >>> 27) + (y1 ^ y2 ^ y3) | 0) + ((t1 + y4 | 0) - 899497514 | 0) | 0; + y4 = y3; + y3 = y2; + y2 = y1 << 30 | y1 >>> 2; + y1 = y0; + y0 = t0; + H[j >> 2] = t1; + } + y0 = y0 + z0 | 0; + y1 = y1 + z1 | 0; + y2 = y2 + z2 | 0; + y3 = y3 + z3 | 0; + y4 = y4 + z4 | 0; + } + H[x + 320 >> 2] = y0; + H[x + 324 >> 2] = y1; + H[x + 328 >> 2] = y2; + H[x + 332 >> 2] = y3; + H[x + 336 >> 2] = y4; + } + return { hash: hash }; + }; + if (// If we'e running in Node.JS, export a module. + typeof module !== 'undefined') { + module.exports = Rusha; + } else if (// If we're running in a DOM context, export + // the Rusha object to toplevel. + typeof window !== 'undefined') { + window.Rusha = Rusha; + } + if (// If we're running in a webworker, accept + // messages containing a jobid and a buffer + // or blob object, and return the hash result. + typeof FileReaderSync !== 'undefined') { + var reader = new FileReaderSync(); + var hashData = function hash(hasher, data, cb) { + try { + return cb(null, hasher.digest(data)); + } catch (e) { + return cb(e); + } + }; + var hashFile = function hashArrayBuffer(hasher, readTotal, blockSize, file, cb) { + var reader$2 = new self.FileReader(); + reader$2.onloadend = function onloadend() { + var buffer = reader$2.result; + readTotal += reader$2.result.byteLength; + try { + hasher.append(buffer); + } catch (e) { + cb(e); + return; + } + if (readTotal < file.size) { + hashFile(hasher, readTotal, blockSize, file, cb); + } else { + cb(null, hasher.end()); + } + }; + reader$2.readAsArrayBuffer(file.slice(readTotal, readTotal + blockSize)); + }; + self.onmessage = function onMessage(event) { + var data = event.data.data, file = event.data.file, id = event.data.id; + if (typeof id === 'undefined') + return; + if (!file && !data) + return; + var blockSize = event.data.blockSize || 4 * 1024 * 1024; + var hasher = new Rusha(blockSize); + hasher.resetState(); + var done = function done$2(err, hash) { + if (!err) { + self.postMessage({ + id: id, + hash: hash + }); + } else { + self.postMessage({ + id: id, + error: err.name + }); + } + }; + if (data) + hashData(hasher, data, done); + if (file) + hashFile(hasher, 0, blockSize, file, done); + }; + } +}()); +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],5:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @requires config + * @requires encoding/armor + * @requires enums + * @requires packet + * @module cleartext + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.CleartextMessage = CleartextMessage; +exports.readArmored = readArmored; + +var _config = _dereq_('./config'); + +var _config2 = _interopRequireDefault(_config); + +var _packet = _dereq_('./packet'); + +var _packet2 = _interopRequireDefault(_packet); + +var _enums = _dereq_('./enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _armor = _dereq_('./encoding/armor.js'); + +var _armor2 = _interopRequireDefault(_armor); + +var _signature = _dereq_('./signature.js'); + +var sigModule = _interopRequireWildcard(_signature); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @class + * @classdesc Class that represents an OpenPGP cleartext signed message. + * See {@link http://tools.ietf.org/html/rfc4880#section-7} + * @param {String} text The cleartext of the signed message + * @param {module:signature} signature The detached signature or an empty signature if message not yet signed + */ + +function CleartextMessage(text, signature) { + if (!(this instanceof CleartextMessage)) { + return new CleartextMessage(text, signature); + } + // normalize EOL to canonical form + this.text = text.replace(/\r/g, '').replace(/[\t ]+\n/g, "\n").replace(/\n/g, "\r\n"); + if (signature && !(signature instanceof sigModule.Signature)) { + throw new Error('Invalid signature input'); + } + this.signature = signature || new sigModule.Signature(new _packet2.default.List()); +} + +/** + * Returns the key IDs of the keys that signed the cleartext message + * @return {Array} array of keyid objects + */ +CleartextMessage.prototype.getSigningKeyIds = function () { + var keyIds = []; + var signatureList = this.signature.packets; + signatureList.forEach(function (packet) { + keyIds.push(packet.issuerKeyId); + }); + return keyIds; +}; + +/** + * Sign the cleartext message + * @param {Array} privateKeys private keys with decrypted secret key data for signing + * @return {module:message~CleartextMessage} new cleartext message with signed content + */ +CleartextMessage.prototype.sign = function (privateKeys) { + return new CleartextMessage(this.text, this.signDetached(privateKeys)); +}; + +/** + * Sign the cleartext message + * @param {Array} privateKeys private keys with decrypted secret key data for signing + * @return {module:signature~Signature} new detached signature of message content + */ +CleartextMessage.prototype.signDetached = function (privateKeys) { + var packetlist = new _packet2.default.List(); + var literalDataPacket = new _packet2.default.Literal(); + literalDataPacket.setText(this.text); + for (var i = 0; i < privateKeys.length; i++) { + if (privateKeys[i].isPublic()) { + throw new Error('Need private key for signing'); + } + var signaturePacket = new _packet2.default.Signature(); + signaturePacket.signatureType = _enums2.default.signature.text; + signaturePacket.hashAlgorithm = _config2.default.prefer_hash_algorithm; + var signingKeyPacket = privateKeys[i].getSigningKeyPacket(); + signaturePacket.publicKeyAlgorithm = signingKeyPacket.algorithm; + if (!signingKeyPacket.isDecrypted) { + throw new Error('Private key is not decrypted.'); + } + signaturePacket.sign(signingKeyPacket, literalDataPacket); + packetlist.push(signaturePacket); + } + return new sigModule.Signature(packetlist); +}; + +/** + * Verify signatures of cleartext signed message + * @param {Array} keys array of keys to verify signatures + * @return {Array<{keyid: module:type/keyid, valid: Boolean}>} list of signer's keyid and validity of signature + */ +CleartextMessage.prototype.verify = function (keys) { + return this.verifyDetached(this.signature, keys); +}; + +/** + * Verify signatures of cleartext signed message + * @param {Array} keys array of keys to verify signatures + * @return {Array<{keyid: module:type/keyid, valid: Boolean}>} list of signer's keyid and validity of signature + */ +CleartextMessage.prototype.verifyDetached = function (signature, keys) { + var result = []; + var signatureList = signature.packets; + var literalDataPacket = new _packet2.default.Literal(); + // we assume that cleartext signature is generated based on UTF8 cleartext + literalDataPacket.setText(this.text); + for (var i = 0; i < signatureList.length; i++) { + var keyPacket = null; + for (var j = 0; j < keys.length; j++) { + keyPacket = keys[j].getSigningKeyPacket(signatureList[i].issuerKeyId); + if (keyPacket) { + break; + } + } + + var verifiedSig = {}; + if (keyPacket) { + verifiedSig.keyid = signatureList[i].issuerKeyId; + verifiedSig.valid = signatureList[i].verify(keyPacket, literalDataPacket); + } else { + verifiedSig.keyid = signatureList[i].issuerKeyId; + verifiedSig.valid = null; + } + + var packetlist = new _packet2.default.List(); + packetlist.push(signatureList[i]); + verifiedSig.signature = new sigModule.Signature(packetlist); + + result.push(verifiedSig); + } + return result; +}; + +/** + * Get cleartext + * @return {String} cleartext of message + */ +CleartextMessage.prototype.getText = function () { + // normalize end of line to \n + return this.text.replace(/\r\n/g, "\n"); +}; + +/** + * Returns ASCII armored text of cleartext signed message + * @return {String} ASCII armor + */ +CleartextMessage.prototype.armor = function () { + var body = { + hash: _enums2.default.read(_enums2.default.hash, _config2.default.prefer_hash_algorithm).toUpperCase(), + text: this.text, + data: this.signature.packets.write() + }; + return _armor2.default.encode(_enums2.default.armor.signed, body); +}; + +/** + * reads an OpenPGP cleartext signed message and returns a CleartextMessage object + * @param {String} armoredText text to be parsed + * @return {module:cleartext~CleartextMessage} new cleartext message object + * @static + */ +function readArmored(armoredText) { + var input = _armor2.default.decode(armoredText); + if (input.type !== _enums2.default.armor.signed) { + throw new Error('No cleartext signed message.'); + } + var packetlist = new _packet2.default.List(); + packetlist.read(input.data); + verifyHeaders(input.headers, packetlist); + var signature = new sigModule.Signature(packetlist); + var newMessage = new CleartextMessage(input.text, signature); + return newMessage; +} + +/** + * Compare hash algorithm specified in the armor header with signatures + * @private + * @param {Array} headers Armor headers + * @param {module:packet/packetlist} packetlist The packetlist with signature packets + */ +function verifyHeaders(headers, packetlist) { + var checkHashAlgos = function checkHashAlgos(hashAlgos) { + function check(algo) { + return packetlist[i].hashAlgorithm === algo; + } + for (var i = 0; i < packetlist.length; i++) { + if (packetlist[i].tag === _enums2.default.packet.signature && !hashAlgos.some(check)) { + return false; + } + } + return true; + }; + var oneHeader = null; + var hashAlgos = []; + headers.forEach(function (header) { + oneHeader = header.match(/Hash: (.+)/); // get header value + if (oneHeader) { + oneHeader = oneHeader[1].replace(/\s/g, ''); // remove whitespace + oneHeader = oneHeader.split(','); + oneHeader = oneHeader.map(function (hash) { + hash = hash.toLowerCase(); + try { + return _enums2.default.write(_enums2.default.hash, hash); + } catch (e) { + throw new Error('Unknown hash algorithm in armor header: ' + hash); + } + }); + hashAlgos = hashAlgos.concat(oneHeader); + } else { + throw new Error('Only "Hash" header allowed in cleartext signed message'); + } + }); + if (!hashAlgos.length && !checkHashAlgos([_enums2.default.hash.md5])) { + throw new Error('If no "Hash" header in cleartext signed message, then only MD5 signatures allowed'); + } else if (!checkHashAlgos(hashAlgos)) { + throw new Error('Hash algorithm mismatch in armor header and signature'); + } +} + +},{"./config":10,"./encoding/armor.js":33,"./enums.js":35,"./packet":47,"./signature.js":66}],6:[function(_dereq_,module,exports){ +/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';var n=void 0,u=!0,aa=this;function ba(e,d){var c=e.split("."),f=aa;!(c[0]in f)&&f.execScript&&f.execScript("var "+c[0]);for(var a;c.length&&(a=c.shift());)!c.length&&d!==n?f[a]=d:f=f[a]?f[a]:f[a]={}};var C="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array&&"undefined"!==typeof DataView;function K(e,d){this.index="number"===typeof d?d:0;this.d=0;this.buffer=e instanceof(C?Uint8Array:Array)?e:new (C?Uint8Array:Array)(32768);if(2*this.buffer.length<=this.index)throw Error("invalid index");this.buffer.length<=this.index&&ca(this)}function ca(e){var d=e.buffer,c,f=d.length,a=new (C?Uint8Array:Array)(f<<1);if(C)a.set(d);else for(c=0;c>>8&255]<<16|L[e>>>16&255]<<8|L[e>>>24&255])>>32-d:L[e]>>8-d);if(8>d+b)k=k<>d-m-1&1,8===++b&&(b=0,f[a++]=L[k],k=0,a===f.length&&(f=ca(this)));f[a]=k;this.buffer=f;this.d=b;this.index=a};K.prototype.finish=function(){var e=this.buffer,d=this.index,c;0M;++M){for(var R=M,S=R,ha=7,R=R>>>1;R;R>>>=1)S<<=1,S|=R&1,--ha;ga[M]=(S<>>0}var L=ga;function ja(e){this.buffer=new (C?Uint16Array:Array)(2*e);this.length=0}ja.prototype.getParent=function(e){return 2*((e-2)/4|0)};ja.prototype.push=function(e,d){var c,f,a=this.buffer,b;c=this.length;a[this.length++]=d;for(a[this.length++]=e;0a[f])b=a[c],a[c]=a[f],a[f]=b,b=a[c+1],a[c+1]=a[f+1],a[f+1]=b,c=f;else break;return this.length}; +ja.prototype.pop=function(){var e,d,c=this.buffer,f,a,b;d=c[0];e=c[1];this.length-=2;c[0]=c[this.length];c[1]=c[this.length+1];for(b=0;;){a=2*b+2;if(a>=this.length)break;a+2c[a]&&(a+=2);if(c[a]>c[b])f=c[b],c[b]=c[a],c[a]=f,f=c[b+1],c[b+1]=c[a+1],c[a+1]=f;else break;b=a}return{index:e,value:d,length:this.length}};function ka(e,d){this.e=ma;this.f=0;this.input=C&&e instanceof Array?new Uint8Array(e):e;this.c=0;d&&(d.lazy&&(this.f=d.lazy),"number"===typeof d.compressionType&&(this.e=d.compressionType),d.outputBuffer&&(this.b=C&&d.outputBuffer instanceof Array?new Uint8Array(d.outputBuffer):d.outputBuffer),"number"===typeof d.outputIndex&&(this.c=d.outputIndex));this.b||(this.b=new (C?Uint8Array:Array)(32768))}var ma=2,T=[],U; +for(U=0;288>U;U++)switch(u){case 143>=U:T.push([U+48,8]);break;case 255>=U:T.push([U-144+400,9]);break;case 279>=U:T.push([U-256+0,7]);break;case 287>=U:T.push([U-280+192,8]);break;default:throw"invalid literal: "+U;} +ka.prototype.h=function(){var e,d,c,f,a=this.input;switch(this.e){case 0:c=0;for(f=a.length;c>>8&255;l[h++]=p&255;l[h++]=p>>>8&255;if(C)l.set(b,h),h+=b.length,l=l.subarray(0,h);else{v=0;for(x=b.length;vs)for(;0s?s:138,A>s-3&&A=A?(E[D++]=17,E[D++]=A-3,H[17]++):(E[D++]=18,E[D++]=A-11,H[18]++),s-=A;else if(E[D++]=F[r],H[F[r]]++,s--,3>s)for(;0s?s:6,A>s-3&&Ay;y++)ia[y]=ea[Ia[y]];for(P=19;4=a:return[265,a-11,1];case 14>=a:return[266,a-13,1];case 16>=a:return[267,a-15,1];case 18>=a:return[268,a-17,1];case 22>=a:return[269,a-19,2];case 26>=a:return[270,a-23,2];case 30>=a:return[271,a-27,2];case 34>=a:return[272, +a-31,2];case 42>=a:return[273,a-35,3];case 50>=a:return[274,a-43,3];case 58>=a:return[275,a-51,3];case 66>=a:return[276,a-59,3];case 82>=a:return[277,a-67,4];case 98>=a:return[278,a-83,4];case 114>=a:return[279,a-99,4];case 130>=a:return[280,a-115,4];case 162>=a:return[281,a-131,5];case 194>=a:return[282,a-163,5];case 226>=a:return[283,a-195,5];case 257>=a:return[284,a-227,5];case 258===a:return[285,a-258,0];default:throw"invalid length: "+a;}}var d=[],c,f;for(c=3;258>=c;c++)f=e(c),d[c]=f[2]<<24| +f[1]<<16|f[0];return d}(),Ga=C?new Uint32Array(Fa):Fa; +function na(e,d){function c(a,c){var b=a.g,d=[],f=0,e;e=Ga[a.length];d[f++]=e&65535;d[f++]=e>>16&255;d[f++]=e>>24;var g;switch(u){case 1===b:g=[0,b-1,0];break;case 2===b:g=[1,b-2,0];break;case 3===b:g=[2,b-3,0];break;case 4===b:g=[3,b-4,0];break;case 6>=b:g=[4,b-5,1];break;case 8>=b:g=[5,b-7,1];break;case 12>=b:g=[6,b-9,2];break;case 16>=b:g=[7,b-13,2];break;case 24>=b:g=[8,b-17,3];break;case 32>=b:g=[9,b-25,3];break;case 48>=b:g=[10,b-33,4];break;case 64>=b:g=[11,b-49,4];break;case 96>=b:g=[12,b- +65,5];break;case 128>=b:g=[13,b-97,5];break;case 192>=b:g=[14,b-129,6];break;case 256>=b:g=[15,b-193,6];break;case 384>=b:g=[16,b-257,7];break;case 512>=b:g=[17,b-385,7];break;case 768>=b:g=[18,b-513,8];break;case 1024>=b:g=[19,b-769,8];break;case 1536>=b:g=[20,b-1025,9];break;case 2048>=b:g=[21,b-1537,9];break;case 3072>=b:g=[22,b-2049,10];break;case 4096>=b:g=[23,b-3073,10];break;case 6144>=b:g=[24,b-4097,11];break;case 8192>=b:g=[25,b-6145,11];break;case 12288>=b:g=[26,b-8193,12];break;case 16384>= +b:g=[27,b-12289,12];break;case 24576>=b:g=[28,b-16385,13];break;case 32768>=b:g=[29,b-24577,13];break;default:throw"invalid distance";}e=g;d[f++]=e[0];d[f++]=e[1];d[f++]=e[2];var k,m;k=0;for(m=d.length;k=b;)t[b++]=0;for(b=0;29>=b;)w[b++]=0}t[256]=1;f=0;for(a=d.length;f=a){x&&c(x,-1);b=0;for(k=a-f;bk&&d+kb&&(a=f,b=k);if(258===k)break}return new qa(b,d-a)} +function oa(e,d){var c=e.length,f=new ja(572),a=new (C?Uint8Array:Array)(c),b,k,m,g,p;if(!C)for(g=0;g2*a[h-1]+b[h]&&(a[h]=2*a[h-1]+b[h]),m[h]=Array(a[h]),g[h]=Array(a[h]);for(l=0;le[l]?(m[h][q]=t,g[h][q]=d,w+=2):(m[h][q]=e[l],g[h][q]=l,++l);p[h]=0;1===b[h]&&f(h)}return k} +function pa(e){var d=new (C?Uint16Array:Array)(e.length),c=[],f=[],a=0,b,k,m,g;b=0;for(k=e.length;b>>=1}return d};ba("Zlib.RawDeflate",ka);ba("Zlib.RawDeflate.prototype.compress",ka.prototype.h);var Ka={NONE:0,FIXED:1,DYNAMIC:ma},V,La,$,Ma;if(Object.keys)V=Object.keys(Ka);else for(La in V=[],$=0,Ka)V[$++]=La;$=0;for(Ma=V.length;$a&&(a=c[p]),c[p]>=1;x=g<<16|p;for(s=n;s>>=1;switch(c){case 0:var d=this.input,a=this.d,b=this.b,e=this.a,f=d.length,g=k,h=k,l=b.length,n=k;this.c=this.f=0;if(a+1>=f)throw Error("invalid uncompressed block header: LEN");g=d[a++]|d[a++]<<8;if(a+1>=f)throw Error("invalid uncompressed block header: NLEN");h=d[a++]|d[a++]<<8;if(g===~h)throw Error("invalid uncompressed block header: length verify");if(a+g>d.length)throw Error("input buffer is broken");switch(this.i){case A:for(;e+g> +b.length;){n=l-e;g-=n;if(t)b.set(d.subarray(a,a+n),e),e+=n,a+=n;else for(;n--;)b[e++]=d[a++];this.a=e;b=this.e();e=this.a}break;case y:for(;e+g>b.length;)b=this.e({o:2});break;default:throw Error("invalid inflate mode");}if(t)b.set(d.subarray(a,a+g),e),e+=g,a+=g;else for(;g--;)b[e++]=d[a++];this.d=a;this.a=e;this.b=b;break;case 1:this.j(ba,ca);break;case 2:for(var m=B(this,5)+257,p=B(this,5)+1,s=B(this,4)+4,x=new (t?Uint8Array:Array)(C.length),Q=k,R=k,S=k,v=k,M=k,F=k,z=k,q=k,T=k,q=0;q=U?8:255>=U?9:279>=U?7:8;var ba=u(P),V=new (t?Uint8Array:Array)(30),W,ea;W=0;for(ea=V.length;W=g)throw Error("input buffer is broken");a|=e[f++]<>>d;c.c=b-d;c.d=f;return h} +function D(c,d){for(var a=c.f,b=c.c,e=c.input,f=c.d,g=e.length,h=d[0],l=d[1],n,m;b=g);)a|=e[f++]<>>16;if(m>b)throw Error("invalid code length: "+m);c.f=a>>m;c.c=b-m;c.d=f;return n&65535} +w.prototype.j=function(c,d){var a=this.b,b=this.a;this.n=c;for(var e=a.length-258,f,g,h,l;256!==(f=D(this,c));)if(256>f)b>=e&&(this.a=b,a=this.e(),b=this.a),a[b++]=f;else{g=f-257;l=H[g];0=e&&(this.a=b,a=this.e(),b=this.a);for(;l--;)a[b]=a[b++-h]}for(;8<=this.c;)this.c-=8,this.d--;this.a=b}; +w.prototype.s=function(c,d){var a=this.b,b=this.a;this.n=c;for(var e=a.length,f,g,h,l;256!==(f=D(this,c));)if(256>f)b>=e&&(a=this.e(),e=a.length),a[b++]=f;else{g=f-257;l=H[g];0e&&(a=this.e(),e=a.length);for(;l--;)a[b]=a[b++-h]}for(;8<=this.c;)this.c-=8,this.d--;this.a=b}; +w.prototype.e=function(){var c=new (t?Uint8Array:Array)(this.a-32768),d=this.a-32768,a,b,e=this.b;if(t)c.set(e.subarray(32768,c.length));else{a=0;for(b=c.length;aa;++a)e[a]=e[d+a];this.a=32768;return e}; +w.prototype.u=function(c){var d,a=this.input.length/this.d+1|0,b,e,f,g=this.input,h=this.b;c&&("number"===typeof c.o&&(a=c.o),"number"===typeof c.q&&(a+=c.q));2>a?(b=(g.length-this.d)/this.n[2],f=258*(b/2)|0,e=fd&&(this.b.length=d),c=this.b);return this.buffer=c};r("Zlib.RawInflate",w);r("Zlib.RawInflate.prototype.decompress",w.prototype.t);var X={ADAPTIVE:y,BLOCK:A},Y,Z,$,fa;if(Object.keys)Y=Object.keys(X);else for(Z in Y=[],$=0,X)Y[$++]=Z;$=0;for(fa=Y.length;$>>8&255]<<16|Q[d>>>16&255]<<8|Q[d>>>24&255])>>32-a:Q[d]>>8-a);if(8>a+f)g=g<>a-h-1&1,8===++f&&(f=0,e[b++]=Q[g],g=0,b===e.length&&(e=this.f()));e[b]=g;this.buffer=e;this.i=f;this.index=b};I.prototype.finish=function(){var d=this.buffer,a=this.index,c;0ca;++ca){for(var R=ca,ha=R,ia=7,R=R>>>1;R;R>>>=1)ha<<=1,ha|=R&1,--ia;ba[ca]=(ha<>>0}var Q=ba;function ja(d){this.buffer=new (G?Uint16Array:Array)(2*d);this.length=0}ja.prototype.getParent=function(d){return 2*((d-2)/4|0)};ja.prototype.push=function(d,a){var c,e,b=this.buffer,f;c=this.length;b[this.length++]=a;for(b[this.length++]=d;0b[e])f=b[c],b[c]=b[e],b[e]=f,f=b[c+1],b[c+1]=b[e+1],b[e+1]=f,c=e;else break;return this.length}; +ja.prototype.pop=function(){var d,a,c=this.buffer,e,b,f;a=c[0];d=c[1];this.length-=2;c[0]=c[this.length];c[1]=c[this.length+1];for(f=0;;){b=2*f+2;if(b>=this.length)break;b+2c[b]&&(b+=2);if(c[b]>c[f])e=c[f],c[f]=c[b],c[b]=e,e=c[f+1],c[f+1]=c[b+1],c[b+1]=e;else break;f=b}return{index:d,value:a,length:this.length}};function S(d){var a=d.length,c=0,e=Number.POSITIVE_INFINITY,b,f,g,h,k,p,q,r,n,l;for(r=0;rc&&(c=d[r]),d[r]>=1;l=g<<16|r;for(n=p;nT;T++)switch(z){case 143>=T:pa.push([T+48,8]);break;case 255>=T:pa.push([T-144+400,9]);break;case 279>=T:pa.push([T-256+0,7]);break;case 287>=T:pa.push([T-280+192,8]);break;default:m("invalid literal: "+T)} +ka.prototype.j=function(){var d,a,c,e,b=this.input;switch(this.h){case 0:c=0;for(e=b.length;c>>8&255;n[l++]=p&255;n[l++]=p>>>8&255;if(G)n.set(f,l),l+=f.length,n=n.subarray(0,l);else{q=0;for(r=f.length;qy)for(;0y?y:138,F>y-3&&F=F?(J[H++]=17,J[H++]=F-3,O[17]++):(J[H++]=18,J[H++]=F-11,O[18]++),y-=F;else if(J[H++]=K[u],O[K[u]]++,y--,3>y)for(;0y?y:6,F>y-3&&FD;D++)sa[D]=la[gb[D]];for(Z=19;4=b:return[265,b-11,1];case 14>=b:return[266,b-13,1];case 16>=b:return[267,b-15,1];case 18>=b:return[268,b-17,1];case 22>=b:return[269,b-19,2];case 26>=b:return[270,b-23,2];case 30>=b:return[271,b-27,2];case 34>=b:return[272, +b-31,2];case 42>=b:return[273,b-35,3];case 50>=b:return[274,b-43,3];case 58>=b:return[275,b-51,3];case 66>=b:return[276,b-59,3];case 82>=b:return[277,b-67,4];case 98>=b:return[278,b-83,4];case 114>=b:return[279,b-99,4];case 130>=b:return[280,b-115,4];case 162>=b:return[281,b-131,5];case 194>=b:return[282,b-163,5];case 226>=b:return[283,b-195,5];case 257>=b:return[284,b-227,5];case 258===b:return[285,b-258,0];default:m("invalid length: "+b)}}var a=[],c,e;for(c=3;258>=c;c++)e=d(c),a[c]=e[2]<<24|e[1]<< +16|e[0];return a}(),xa=G?new Uint32Array(wa):wa; +function qa(d,a){function c(b,c){var a=b.G,d=[],e=0,f;f=xa[b.length];d[e++]=f&65535;d[e++]=f>>16&255;d[e++]=f>>24;var g;switch(z){case 1===a:g=[0,a-1,0];break;case 2===a:g=[1,a-2,0];break;case 3===a:g=[2,a-3,0];break;case 4===a:g=[3,a-4,0];break;case 6>=a:g=[4,a-5,1];break;case 8>=a:g=[5,a-7,1];break;case 12>=a:g=[6,a-9,2];break;case 16>=a:g=[7,a-13,2];break;case 24>=a:g=[8,a-17,3];break;case 32>=a:g=[9,a-25,3];break;case 48>=a:g=[10,a-33,4];break;case 64>=a:g=[11,a-49,4];break;case 96>=a:g=[12,a- +65,5];break;case 128>=a:g=[13,a-97,5];break;case 192>=a:g=[14,a-129,6];break;case 256>=a:g=[15,a-193,6];break;case 384>=a:g=[16,a-257,7];break;case 512>=a:g=[17,a-385,7];break;case 768>=a:g=[18,a-513,8];break;case 1024>=a:g=[19,a-769,8];break;case 1536>=a:g=[20,a-1025,9];break;case 2048>=a:g=[21,a-1537,9];break;case 3072>=a:g=[22,a-2049,10];break;case 4096>=a:g=[23,a-3073,10];break;case 6144>=a:g=[24,a-4097,11];break;case 8192>=a:g=[25,a-6145,11];break;case 12288>=a:g=[26,a-8193,12];break;case 16384>= +a:g=[27,a-12289,12];break;case 24576>=a:g=[28,a-16385,13];break;case 32768>=a:g=[29,a-24577,13];break;default:m("invalid distance")}f=g;d[e++]=f[0];d[e++]=f[1];d[e++]=f[2];var h,k;h=0;for(k=d.length;h=f;)t[f++]=0;for(f=0;29>=f;)x[f++]=0}t[256]=1;e=0;for(b=a.length;e=b){r&&c(r,-1);f=0;for(g=b-e;fg&&a+gf&&(b=e,f=g);if(258===g)break}return new ua(f,a-b)} +function ra(d,a){var c=d.length,e=new ja(572),b=new (G?Uint8Array:Array)(c),f,g,h,k,p;if(!G)for(k=0;k2*b[l-1]+f[l]&&(b[l]=2*b[l-1]+f[l]),h[l]=Array(b[l]),k[l]=Array(b[l]);for(n=0;nd[n]?(h[l][s]=t,k[l][s]=a,x+=2):(h[l][s]=d[n],k[l][s]=n,++n);p[l]=0;1===f[l]&&e(l)}return g} +function ta(d){var a=new (G?Uint16Array:Array)(d.length),c=[],e=[],b=0,f,g,h,k;f=0;for(g=d.length;f>>=1}return a};function U(d,a){this.l=[];this.m=32768;this.e=this.g=this.c=this.q=0;this.input=G?new Uint8Array(d):d;this.s=!1;this.n=Aa;this.B=!1;if(a||!(a={}))a.index&&(this.c=a.index),a.bufferSize&&(this.m=a.bufferSize),a.bufferType&&(this.n=a.bufferType),a.resize&&(this.B=a.resize);switch(this.n){case Ba:this.b=32768;this.a=new (G?Uint8Array:Array)(32768+this.m+258);break;case Aa:this.b=0;this.a=new (G?Uint8Array:Array)(this.m);this.f=this.J;this.t=this.H;this.o=this.I;break;default:m(Error("invalid inflate mode"))}} +var Ba=0,Aa=1,Ca={D:Ba,C:Aa}; +U.prototype.p=function(){for(;!this.s;){var d=V(this,3);d&1&&(this.s=z);d>>>=1;switch(d){case 0:var a=this.input,c=this.c,e=this.a,b=this.b,f=a.length,g=w,h=w,k=e.length,p=w;this.e=this.g=0;c+1>=f&&m(Error("invalid uncompressed block header: LEN"));g=a[c++]|a[c++]<<8;c+1>=f&&m(Error("invalid uncompressed block header: NLEN"));h=a[c++]|a[c++]<<8;g===~h&&m(Error("invalid uncompressed block header: length verify"));c+g>a.length&&m(Error("input buffer is broken"));switch(this.n){case Ba:for(;b+g>e.length;){p= +k-b;g-=p;if(G)e.set(a.subarray(c,c+p),b),b+=p,c+=p;else for(;p--;)e[b++]=a[c++];this.b=b;e=this.f();b=this.b}break;case Aa:for(;b+g>e.length;)e=this.f({v:2});break;default:m(Error("invalid inflate mode"))}if(G)e.set(a.subarray(c,c+g),b),b+=g,c+=g;else for(;g--;)e[b++]=a[c++];this.c=c;this.b=b;this.a=e;break;case 1:this.o(Da,Ea);break;case 2:for(var q=V(this,5)+257,r=V(this,5)+1,n=V(this,4)+4,l=new (G?Uint8Array:Array)(Sa.length),s=w,t=w,x=w,E=w,B=w,C=w,L=w,v=w,M=w,v=0;v=W?8:255>=W?9:279>=W?7:8;var Da=S(cb),eb=new (G?Uint8Array:Array)(30),fb,hb;fb=0;for(hb=eb.length;fb=g&&m(Error("input buffer is broken")),c|=b[f++]<>>a;d.e=e-a;d.c=f;return h} +function Ta(d,a){for(var c=d.g,e=d.e,b=d.input,f=d.c,g=b.length,h=a[0],k=a[1],p,q;e=g);)c|=b[f++]<>>16;q>e&&m(Error("invalid code length: "+q));d.g=c>>q;d.e=e-q;d.c=f;return p&65535} +U.prototype.o=function(d,a){var c=this.a,e=this.b;this.u=d;for(var b=c.length-258,f,g,h,k;256!==(f=Ta(this,d));)if(256>f)e>=b&&(this.b=e,c=this.f(),e=this.b),c[e++]=f;else{g=f-257;k=Wa[g];0=b&&(this.b=e,c=this.f(),e=this.b);for(;k--;)c[e]=c[e++-h]}for(;8<=this.e;)this.e-=8,this.c--;this.b=e}; +U.prototype.I=function(d,a){var c=this.a,e=this.b;this.u=d;for(var b=c.length,f,g,h,k;256!==(f=Ta(this,d));)if(256>f)e>=b&&(c=this.f(),b=c.length),c[e++]=f;else{g=f-257;k=Wa[g];0b&&(c=this.f(),b=c.length);for(;k--;)c[e]=c[e++-h]}for(;8<=this.e;)this.e-=8,this.c--;this.b=e}; +U.prototype.f=function(){var d=new (G?Uint8Array:Array)(this.b-32768),a=this.b-32768,c,e,b=this.a;if(G)d.set(b.subarray(32768,d.length));else{c=0;for(e=d.length;cc;++c)b[c]=b[a+c];this.b=32768;return b}; +U.prototype.J=function(d){var a,c=this.input.length/this.c+1|0,e,b,f,g=this.input,h=this.a;d&&("number"===typeof d.v&&(c=d.v),"number"===typeof d.F&&(c+=d.F));2>c?(e=(g.length-this.c)/this.u[2],f=258*(e/2)|0,b=fa&&(this.a.length=a),d=this.a);return this.buffer=d};function ib(d){if("string"===typeof d){var a=d.split(""),c,e;c=0;for(e=a.length;c>>0;d=a}for(var b=1,f=0,g=d.length,h,k=0;0>>0};function jb(d,a){var c,e;this.input=d;this.c=0;if(a||!(a={}))a.index&&(this.c=a.index),a.verify&&(this.M=a.verify);c=d[this.c++];e=d[this.c++];switch(c&15){case kb:this.method=kb;break;default:m(Error("unsupported compression method"))}0!==((c<<8)+e)%31&&m(Error("invalid fcheck flag:"+((c<<8)+e)%31));e&32&&m(Error("fdict flag is not supported"));this.A=new U(d,{index:this.c,bufferSize:a.bufferSize,bufferType:a.bufferType,resize:a.resize})} +jb.prototype.p=function(){var d=this.input,a,c;a=this.A.p();this.c=this.A.c;this.M&&(c=(d[this.c++]<<24|d[this.c++]<<16|d[this.c++]<<8|d[this.c++])>>>0,c!==ib(a)&&m(Error("invalid adler-32 checksum")));return a};var kb=8;function lb(d,a){this.input=d;this.a=new (G?Uint8Array:Array)(32768);this.h=X.k;var c={},e;if((a||!(a={}))&&"number"===typeof a.compressionType)this.h=a.compressionType;for(e in a)c[e]=a[e];c.outputBuffer=this.a;this.z=new ka(this.input,c)}var X=oa; +lb.prototype.j=function(){var d,a,c,e,b,f,g,h=0;g=this.a;d=kb;switch(d){case kb:a=Math.LOG2E*Math.log(32768)-8;break;default:m(Error("invalid compression method"))}c=a<<4|d;g[h++]=c;switch(d){case kb:switch(this.h){case X.NONE:b=0;break;case X.r:b=1;break;case X.k:b=2;break;default:m(Error("unsupported compression type"))}break;default:m(Error("invalid compression method"))}e=b<<6|0;g[h++]=e|31-(256*c+e)%31;f=ib(this.input);this.z.b=h;g=this.z.j();h=g.length;G&&(g=new Uint8Array(g.buffer),g.length<= +h+4&&(this.a=new Uint8Array(g.length+4),this.a.set(g),g=this.a),g=g.subarray(0,h+4));g[h++]=f>>24&255;g[h++]=f>>16&255;g[h++]=f>>8&255;g[h++]=f&255;return g};function mb(d,a){var c,e,b,f;if(Object.keys)c=Object.keys(a);else for(e in c=[],b=0,a)c[b++]=e;b=0;for(f=c.length;b block_size * pos) { + var encblock = cipherfn.encrypt(blockc); + blocki = plaintext.subarray(pos * block_size, pos * block_size + block_size); + for (i = 0; i < blocki.length; i++) { + blockc[i] = blocki[i] ^ encblock[i]; + cyphertext[j++] = blockc[i]; + } + pos++; + } + return cyphertext; + }, + + normalDecrypt: function normalDecrypt(cipherfn, key, ciphertext, iv) { + cipherfn = new _cipher2.default[cipherfn](key); + var block_size = cipherfn.blockSize; + + var blockp; + var pos = 0; + var plaintext = new Uint8Array(ciphertext.length); + var offset = 0; + var i, + j = 0; + + if (iv === null) { + blockp = new Uint8Array(block_size); + for (i = 0; i < block_size; i++) { + blockp[i] = 0; + } + } else { + blockp = iv.subarray(0, block_size); + } + while (ciphertext.length > block_size * pos) { + var decblock = cipherfn.encrypt(blockp); + blockp = ciphertext.subarray(pos * block_size + offset, pos * block_size + block_size + offset); + for (i = 0; i < blockp.length; i++) { + plaintext[j++] = blockp[i] ^ decblock[i]; + } + pos++; + } + + return plaintext; + } +}; + +},{"./cipher":16}],12:[function(_dereq_,module,exports){ +/* Rijndael (AES) Encryption + * Copyright 2005 Herbert Hanewinkel, www.haneWIN.de + * version 1.1, check www.haneWIN.de for the latest version + + * This software is provided as-is, without express or implied warranty. + * Permission to use, copy, modify, distribute or sell this software, with or + * without fee, for any purpose and by any individual or organization, is hereby + * granted, provided that the above copyright notice and this paragraph appear + * in all copies. Distribution as a part of an application or binary must + * include the above copyright notice in the documentation and/or other + * materials provided with the application or distribution. + */ + +/** + * @module crypto/cipher/aes + */ + +'use strict'; + +// The round constants used in subkey expansion + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var Rcon = new Uint8Array([0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91]); + +// Precomputed lookup table for the SBox +var S = new Uint8Array([99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22]); + +var T1 = new Uint32Array([0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, 0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591, 0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56, 0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec, 0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa, 0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb, 0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45, 0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b, 0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c, 0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83, 0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9, 0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a, 0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d, 0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f, 0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df, 0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea, 0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34, 0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b, 0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d, 0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413, 0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1, 0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6, 0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972, 0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85, 0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed, 0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511, 0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe, 0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b, 0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05, 0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1, 0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142, 0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf, 0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3, 0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e, 0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a, 0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6, 0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3, 0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b, 0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428, 0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad, 0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14, 0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8, 0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4, 0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2, 0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda, 0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949, 0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf, 0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810, 0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c, 0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697, 0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e, 0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f, 0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc, 0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c, 0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969, 0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27, 0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122, 0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433, 0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9, 0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5, 0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a, 0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0, 0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e, 0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c]); + +var T2 = new Uint32Array([0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d, 0xf2f2ff0d, 0x6b6bd6bd, 0x6f6fdeb1, 0xc5c59154, 0x30306050, 0x01010203, 0x6767cea9, 0x2b2b567d, 0xfefee719, 0xd7d7b562, 0xabab4de6, 0x7676ec9a, 0xcaca8f45, 0x82821f9d, 0xc9c98940, 0x7d7dfa87, 0xfafaef15, 0x5959b2eb, 0x47478ec9, 0xf0f0fb0b, 0xadad41ec, 0xd4d4b367, 0xa2a25ffd, 0xafaf45ea, 0x9c9c23bf, 0xa4a453f7, 0x7272e496, 0xc0c09b5b, 0xb7b775c2, 0xfdfde11c, 0x93933dae, 0x26264c6a, 0x36366c5a, 0x3f3f7e41, 0xf7f7f502, 0xcccc834f, 0x3434685c, 0xa5a551f4, 0xe5e5d134, 0xf1f1f908, 0x7171e293, 0xd8d8ab73, 0x31316253, 0x15152a3f, 0x0404080c, 0xc7c79552, 0x23234665, 0xc3c39d5e, 0x18183028, 0x969637a1, 0x05050a0f, 0x9a9a2fb5, 0x07070e09, 0x12122436, 0x80801b9b, 0xe2e2df3d, 0xebebcd26, 0x27274e69, 0xb2b27fcd, 0x7575ea9f, 0x0909121b, 0x83831d9e, 0x2c2c5874, 0x1a1a342e, 0x1b1b362d, 0x6e6edcb2, 0x5a5ab4ee, 0xa0a05bfb, 0x5252a4f6, 0x3b3b764d, 0xd6d6b761, 0xb3b37dce, 0x2929527b, 0xe3e3dd3e, 0x2f2f5e71, 0x84841397, 0x5353a6f5, 0xd1d1b968, 0x00000000, 0xededc12c, 0x20204060, 0xfcfce31f, 0xb1b179c8, 0x5b5bb6ed, 0x6a6ad4be, 0xcbcb8d46, 0xbebe67d9, 0x3939724b, 0x4a4a94de, 0x4c4c98d4, 0x5858b0e8, 0xcfcf854a, 0xd0d0bb6b, 0xefefc52a, 0xaaaa4fe5, 0xfbfbed16, 0x434386c5, 0x4d4d9ad7, 0x33336655, 0x85851194, 0x45458acf, 0xf9f9e910, 0x02020406, 0x7f7ffe81, 0x5050a0f0, 0x3c3c7844, 0x9f9f25ba, 0xa8a84be3, 0x5151a2f3, 0xa3a35dfe, 0x404080c0, 0x8f8f058a, 0x92923fad, 0x9d9d21bc, 0x38387048, 0xf5f5f104, 0xbcbc63df, 0xb6b677c1, 0xdadaaf75, 0x21214263, 0x10102030, 0xffffe51a, 0xf3f3fd0e, 0xd2d2bf6d, 0xcdcd814c, 0x0c0c1814, 0x13132635, 0xececc32f, 0x5f5fbee1, 0x979735a2, 0x444488cc, 0x17172e39, 0xc4c49357, 0xa7a755f2, 0x7e7efc82, 0x3d3d7a47, 0x6464c8ac, 0x5d5dbae7, 0x1919322b, 0x7373e695, 0x6060c0a0, 0x81811998, 0x4f4f9ed1, 0xdcdca37f, 0x22224466, 0x2a2a547e, 0x90903bab, 0x88880b83, 0x46468cca, 0xeeeec729, 0xb8b86bd3, 0x1414283c, 0xdedea779, 0x5e5ebce2, 0x0b0b161d, 0xdbdbad76, 0xe0e0db3b, 0x32326456, 0x3a3a744e, 0x0a0a141e, 0x494992db, 0x06060c0a, 0x2424486c, 0x5c5cb8e4, 0xc2c29f5d, 0xd3d3bd6e, 0xacac43ef, 0x6262c4a6, 0x919139a8, 0x959531a4, 0xe4e4d337, 0x7979f28b, 0xe7e7d532, 0xc8c88b43, 0x37376e59, 0x6d6ddab7, 0x8d8d018c, 0xd5d5b164, 0x4e4e9cd2, 0xa9a949e0, 0x6c6cd8b4, 0x5656acfa, 0xf4f4f307, 0xeaeacf25, 0x6565caaf, 0x7a7af48e, 0xaeae47e9, 0x08081018, 0xbaba6fd5, 0x7878f088, 0x25254a6f, 0x2e2e5c72, 0x1c1c3824, 0xa6a657f1, 0xb4b473c7, 0xc6c69751, 0xe8e8cb23, 0xdddda17c, 0x7474e89c, 0x1f1f3e21, 0x4b4b96dd, 0xbdbd61dc, 0x8b8b0d86, 0x8a8a0f85, 0x7070e090, 0x3e3e7c42, 0xb5b571c4, 0x6666ccaa, 0x484890d8, 0x03030605, 0xf6f6f701, 0x0e0e1c12, 0x6161c2a3, 0x35356a5f, 0x5757aef9, 0xb9b969d0, 0x86861791, 0xc1c19958, 0x1d1d3a27, 0x9e9e27b9, 0xe1e1d938, 0xf8f8eb13, 0x98982bb3, 0x11112233, 0x6969d2bb, 0xd9d9a970, 0x8e8e0789, 0x949433a7, 0x9b9b2db6, 0x1e1e3c22, 0x87871592, 0xe9e9c920, 0xcece8749, 0x5555aaff, 0x28285078, 0xdfdfa57a, 0x8c8c038f, 0xa1a159f8, 0x89890980, 0x0d0d1a17, 0xbfbf65da, 0xe6e6d731, 0x424284c6, 0x6868d0b8, 0x414182c3, 0x999929b0, 0x2d2d5a77, 0x0f0f1e11, 0xb0b07bcb, 0x5454a8fc, 0xbbbb6dd6, 0x16162c3a]); + +var T3 = new Uint32Array([0x63c6a563, 0x7cf8847c, 0x77ee9977, 0x7bf68d7b, 0xf2ff0df2, 0x6bd6bd6b, 0x6fdeb16f, 0xc59154c5, 0x30605030, 0x01020301, 0x67cea967, 0x2b567d2b, 0xfee719fe, 0xd7b562d7, 0xab4de6ab, 0x76ec9a76, 0xca8f45ca, 0x821f9d82, 0xc98940c9, 0x7dfa877d, 0xfaef15fa, 0x59b2eb59, 0x478ec947, 0xf0fb0bf0, 0xad41ecad, 0xd4b367d4, 0xa25ffda2, 0xaf45eaaf, 0x9c23bf9c, 0xa453f7a4, 0x72e49672, 0xc09b5bc0, 0xb775c2b7, 0xfde11cfd, 0x933dae93, 0x264c6a26, 0x366c5a36, 0x3f7e413f, 0xf7f502f7, 0xcc834fcc, 0x34685c34, 0xa551f4a5, 0xe5d134e5, 0xf1f908f1, 0x71e29371, 0xd8ab73d8, 0x31625331, 0x152a3f15, 0x04080c04, 0xc79552c7, 0x23466523, 0xc39d5ec3, 0x18302818, 0x9637a196, 0x050a0f05, 0x9a2fb59a, 0x070e0907, 0x12243612, 0x801b9b80, 0xe2df3de2, 0xebcd26eb, 0x274e6927, 0xb27fcdb2, 0x75ea9f75, 0x09121b09, 0x831d9e83, 0x2c58742c, 0x1a342e1a, 0x1b362d1b, 0x6edcb26e, 0x5ab4ee5a, 0xa05bfba0, 0x52a4f652, 0x3b764d3b, 0xd6b761d6, 0xb37dceb3, 0x29527b29, 0xe3dd3ee3, 0x2f5e712f, 0x84139784, 0x53a6f553, 0xd1b968d1, 0x00000000, 0xedc12ced, 0x20406020, 0xfce31ffc, 0xb179c8b1, 0x5bb6ed5b, 0x6ad4be6a, 0xcb8d46cb, 0xbe67d9be, 0x39724b39, 0x4a94de4a, 0x4c98d44c, 0x58b0e858, 0xcf854acf, 0xd0bb6bd0, 0xefc52aef, 0xaa4fe5aa, 0xfbed16fb, 0x4386c543, 0x4d9ad74d, 0x33665533, 0x85119485, 0x458acf45, 0xf9e910f9, 0x02040602, 0x7ffe817f, 0x50a0f050, 0x3c78443c, 0x9f25ba9f, 0xa84be3a8, 0x51a2f351, 0xa35dfea3, 0x4080c040, 0x8f058a8f, 0x923fad92, 0x9d21bc9d, 0x38704838, 0xf5f104f5, 0xbc63dfbc, 0xb677c1b6, 0xdaaf75da, 0x21426321, 0x10203010, 0xffe51aff, 0xf3fd0ef3, 0xd2bf6dd2, 0xcd814ccd, 0x0c18140c, 0x13263513, 0xecc32fec, 0x5fbee15f, 0x9735a297, 0x4488cc44, 0x172e3917, 0xc49357c4, 0xa755f2a7, 0x7efc827e, 0x3d7a473d, 0x64c8ac64, 0x5dbae75d, 0x19322b19, 0x73e69573, 0x60c0a060, 0x81199881, 0x4f9ed14f, 0xdca37fdc, 0x22446622, 0x2a547e2a, 0x903bab90, 0x880b8388, 0x468cca46, 0xeec729ee, 0xb86bd3b8, 0x14283c14, 0xdea779de, 0x5ebce25e, 0x0b161d0b, 0xdbad76db, 0xe0db3be0, 0x32645632, 0x3a744e3a, 0x0a141e0a, 0x4992db49, 0x060c0a06, 0x24486c24, 0x5cb8e45c, 0xc29f5dc2, 0xd3bd6ed3, 0xac43efac, 0x62c4a662, 0x9139a891, 0x9531a495, 0xe4d337e4, 0x79f28b79, 0xe7d532e7, 0xc88b43c8, 0x376e5937, 0x6ddab76d, 0x8d018c8d, 0xd5b164d5, 0x4e9cd24e, 0xa949e0a9, 0x6cd8b46c, 0x56acfa56, 0xf4f307f4, 0xeacf25ea, 0x65caaf65, 0x7af48e7a, 0xae47e9ae, 0x08101808, 0xba6fd5ba, 0x78f08878, 0x254a6f25, 0x2e5c722e, 0x1c38241c, 0xa657f1a6, 0xb473c7b4, 0xc69751c6, 0xe8cb23e8, 0xdda17cdd, 0x74e89c74, 0x1f3e211f, 0x4b96dd4b, 0xbd61dcbd, 0x8b0d868b, 0x8a0f858a, 0x70e09070, 0x3e7c423e, 0xb571c4b5, 0x66ccaa66, 0x4890d848, 0x03060503, 0xf6f701f6, 0x0e1c120e, 0x61c2a361, 0x356a5f35, 0x57aef957, 0xb969d0b9, 0x86179186, 0xc19958c1, 0x1d3a271d, 0x9e27b99e, 0xe1d938e1, 0xf8eb13f8, 0x982bb398, 0x11223311, 0x69d2bb69, 0xd9a970d9, 0x8e07898e, 0x9433a794, 0x9b2db69b, 0x1e3c221e, 0x87159287, 0xe9c920e9, 0xce8749ce, 0x55aaff55, 0x28507828, 0xdfa57adf, 0x8c038f8c, 0xa159f8a1, 0x89098089, 0x0d1a170d, 0xbf65dabf, 0xe6d731e6, 0x4284c642, 0x68d0b868, 0x4182c341, 0x9929b099, 0x2d5a772d, 0x0f1e110f, 0xb07bcbb0, 0x54a8fc54, 0xbb6dd6bb, 0x162c3a16]); + +var T4 = new Uint32Array([0xc6a56363, 0xf8847c7c, 0xee997777, 0xf68d7b7b, 0xff0df2f2, 0xd6bd6b6b, 0xdeb16f6f, 0x9154c5c5, 0x60503030, 0x02030101, 0xcea96767, 0x567d2b2b, 0xe719fefe, 0xb562d7d7, 0x4de6abab, 0xec9a7676, 0x8f45caca, 0x1f9d8282, 0x8940c9c9, 0xfa877d7d, 0xef15fafa, 0xb2eb5959, 0x8ec94747, 0xfb0bf0f0, 0x41ecadad, 0xb367d4d4, 0x5ffda2a2, 0x45eaafaf, 0x23bf9c9c, 0x53f7a4a4, 0xe4967272, 0x9b5bc0c0, 0x75c2b7b7, 0xe11cfdfd, 0x3dae9393, 0x4c6a2626, 0x6c5a3636, 0x7e413f3f, 0xf502f7f7, 0x834fcccc, 0x685c3434, 0x51f4a5a5, 0xd134e5e5, 0xf908f1f1, 0xe2937171, 0xab73d8d8, 0x62533131, 0x2a3f1515, 0x080c0404, 0x9552c7c7, 0x46652323, 0x9d5ec3c3, 0x30281818, 0x37a19696, 0x0a0f0505, 0x2fb59a9a, 0x0e090707, 0x24361212, 0x1b9b8080, 0xdf3de2e2, 0xcd26ebeb, 0x4e692727, 0x7fcdb2b2, 0xea9f7575, 0x121b0909, 0x1d9e8383, 0x58742c2c, 0x342e1a1a, 0x362d1b1b, 0xdcb26e6e, 0xb4ee5a5a, 0x5bfba0a0, 0xa4f65252, 0x764d3b3b, 0xb761d6d6, 0x7dceb3b3, 0x527b2929, 0xdd3ee3e3, 0x5e712f2f, 0x13978484, 0xa6f55353, 0xb968d1d1, 0x00000000, 0xc12ceded, 0x40602020, 0xe31ffcfc, 0x79c8b1b1, 0xb6ed5b5b, 0xd4be6a6a, 0x8d46cbcb, 0x67d9bebe, 0x724b3939, 0x94de4a4a, 0x98d44c4c, 0xb0e85858, 0x854acfcf, 0xbb6bd0d0, 0xc52aefef, 0x4fe5aaaa, 0xed16fbfb, 0x86c54343, 0x9ad74d4d, 0x66553333, 0x11948585, 0x8acf4545, 0xe910f9f9, 0x04060202, 0xfe817f7f, 0xa0f05050, 0x78443c3c, 0x25ba9f9f, 0x4be3a8a8, 0xa2f35151, 0x5dfea3a3, 0x80c04040, 0x058a8f8f, 0x3fad9292, 0x21bc9d9d, 0x70483838, 0xf104f5f5, 0x63dfbcbc, 0x77c1b6b6, 0xaf75dada, 0x42632121, 0x20301010, 0xe51affff, 0xfd0ef3f3, 0xbf6dd2d2, 0x814ccdcd, 0x18140c0c, 0x26351313, 0xc32fecec, 0xbee15f5f, 0x35a29797, 0x88cc4444, 0x2e391717, 0x9357c4c4, 0x55f2a7a7, 0xfc827e7e, 0x7a473d3d, 0xc8ac6464, 0xbae75d5d, 0x322b1919, 0xe6957373, 0xc0a06060, 0x19988181, 0x9ed14f4f, 0xa37fdcdc, 0x44662222, 0x547e2a2a, 0x3bab9090, 0x0b838888, 0x8cca4646, 0xc729eeee, 0x6bd3b8b8, 0x283c1414, 0xa779dede, 0xbce25e5e, 0x161d0b0b, 0xad76dbdb, 0xdb3be0e0, 0x64563232, 0x744e3a3a, 0x141e0a0a, 0x92db4949, 0x0c0a0606, 0x486c2424, 0xb8e45c5c, 0x9f5dc2c2, 0xbd6ed3d3, 0x43efacac, 0xc4a66262, 0x39a89191, 0x31a49595, 0xd337e4e4, 0xf28b7979, 0xd532e7e7, 0x8b43c8c8, 0x6e593737, 0xdab76d6d, 0x018c8d8d, 0xb164d5d5, 0x9cd24e4e, 0x49e0a9a9, 0xd8b46c6c, 0xacfa5656, 0xf307f4f4, 0xcf25eaea, 0xcaaf6565, 0xf48e7a7a, 0x47e9aeae, 0x10180808, 0x6fd5baba, 0xf0887878, 0x4a6f2525, 0x5c722e2e, 0x38241c1c, 0x57f1a6a6, 0x73c7b4b4, 0x9751c6c6, 0xcb23e8e8, 0xa17cdddd, 0xe89c7474, 0x3e211f1f, 0x96dd4b4b, 0x61dcbdbd, 0x0d868b8b, 0x0f858a8a, 0xe0907070, 0x7c423e3e, 0x71c4b5b5, 0xccaa6666, 0x90d84848, 0x06050303, 0xf701f6f6, 0x1c120e0e, 0xc2a36161, 0x6a5f3535, 0xaef95757, 0x69d0b9b9, 0x17918686, 0x9958c1c1, 0x3a271d1d, 0x27b99e9e, 0xd938e1e1, 0xeb13f8f8, 0x2bb39898, 0x22331111, 0xd2bb6969, 0xa970d9d9, 0x07898e8e, 0x33a79494, 0x2db69b9b, 0x3c221e1e, 0x15928787, 0xc920e9e9, 0x8749cece, 0xaaff5555, 0x50782828, 0xa57adfdf, 0x038f8c8c, 0x59f8a1a1, 0x09808989, 0x1a170d0d, 0x65dabfbf, 0xd731e6e6, 0x84c64242, 0xd0b86868, 0x82c34141, 0x29b09999, 0x5a772d2d, 0x1e110f0f, 0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb, 0x2c3a1616]); + +function B0(x) { + return x & 255; +} + +function B1(x) { + return x >> 8 & 255; +} + +function B2(x) { + return x >> 16 & 255; +} + +function B3(x) { + return x >> 24 & 255; +} + +function F1(x0, x1, x2, x3) { + return B1(T1[x0 & 255]) | B1(T1[x1 >> 8 & 255]) << 8 | B1(T1[x2 >> 16 & 255]) << 16 | B1(T1[x3 >>> 24]) << 24; +} + +function packBytes(octets) { + var i, j; + var len = octets.length; + var b = new Array(len / 4); + + if (!octets || len % 4) { + return; + } + + for (i = 0, j = 0; j < len; j += 4) { + b[i++] = octets[j] | octets[j + 1] << 8 | octets[j + 2] << 16 | octets[j + 3] << 24; + } + + return b; +} + +function unpackBytes(packed) { + var j; + var i = 0, + l = packed.length; + var r = new Array(l * 4); + + for (j = 0; j < l; j++) { + r[i++] = B0(packed[j]); + r[i++] = B1(packed[j]); + r[i++] = B2(packed[j]); + r[i++] = B3(packed[j]); + } + return r; +} + +// ------------------------------------------------ + +var maxkc = 8; +var maxrk = 14; + +function keyExpansion(key) { + var kc, i, j, r, t; + var rounds; + var keySched = new Array(maxrk + 1); + var keylen = key.length; + var k = new Array(maxkc); + var tk = new Array(maxkc); + var rconpointer = 0; + + if (keylen === 16) { + rounds = 10; + kc = 4; + } else if (keylen === 24) { + rounds = 12; + kc = 6; + } else if (keylen === 32) { + rounds = 14; + kc = 8; + } else { + throw new Error('Invalid key-length for AES key:' + keylen); + } + + for (i = 0; i < maxrk + 1; i++) { + keySched[i] = new Uint32Array(4); + } + + for (i = 0, j = 0; j < keylen; j++, i += 4) { + k[j] = key[i] | key[i + 1] << 8 | key[i + 2] << 16 | key[i + 3] << 24; + } + + for (j = kc - 1; j >= 0; j--) { + tk[j] = k[j]; + } + + r = 0; + t = 0; + for (j = 0; j < kc && r < rounds + 1;) { + for (; j < kc && t < 4; j++, t++) { + keySched[r][t] = tk[j]; + } + if (t === 4) { + r++; + t = 0; + } + } + + while (r < rounds + 1) { + var temp = tk[kc - 1]; + + tk[0] ^= S[B1(temp)] | S[B2(temp)] << 8 | S[B3(temp)] << 16 | S[B0(temp)] << 24; + tk[0] ^= Rcon[rconpointer++]; + + if (kc !== 8) { + for (j = 1; j < kc; j++) { + tk[j] ^= tk[j - 1]; + } + } else { + for (j = 1; j < kc / 2; j++) { + tk[j] ^= tk[j - 1]; + } + + temp = tk[kc / 2 - 1]; + tk[kc / 2] ^= S[B0(temp)] | S[B1(temp)] << 8 | S[B2(temp)] << 16 | S[B3(temp)] << 24; + + for (j = kc / 2 + 1; j < kc; j++) { + tk[j] ^= tk[j - 1]; + } + } + + for (j = 0; j < kc && r < rounds + 1;) { + for (; j < kc && t < 4; j++, t++) { + keySched[r][t] = tk[j]; + } + if (t === 4) { + r++; + t = 0; + } + } + } + + return { + rounds: rounds, + rk: keySched + }; +} + +function AESencrypt(block, ctx, t) { + var r, rounds, b; + + b = packBytes(block); + rounds = ctx.rounds; + + for (r = 0; r < rounds - 1; r++) { + t[0] = b[0] ^ ctx.rk[r][0]; + t[1] = b[1] ^ ctx.rk[r][1]; + t[2] = b[2] ^ ctx.rk[r][2]; + t[3] = b[3] ^ ctx.rk[r][3]; + + b[0] = T1[t[0] & 255] ^ T2[t[1] >> 8 & 255] ^ T3[t[2] >> 16 & 255] ^ T4[t[3] >>> 24]; + b[1] = T1[t[1] & 255] ^ T2[t[2] >> 8 & 255] ^ T3[t[3] >> 16 & 255] ^ T4[t[0] >>> 24]; + b[2] = T1[t[2] & 255] ^ T2[t[3] >> 8 & 255] ^ T3[t[0] >> 16 & 255] ^ T4[t[1] >>> 24]; + b[3] = T1[t[3] & 255] ^ T2[t[0] >> 8 & 255] ^ T3[t[1] >> 16 & 255] ^ T4[t[2] >>> 24]; + } + + // last round is special + r = rounds - 1; + + t[0] = b[0] ^ ctx.rk[r][0]; + t[1] = b[1] ^ ctx.rk[r][1]; + t[2] = b[2] ^ ctx.rk[r][2]; + t[3] = b[3] ^ ctx.rk[r][3]; + + b[0] = F1(t[0], t[1], t[2], t[3]) ^ ctx.rk[rounds][0]; + b[1] = F1(t[1], t[2], t[3], t[0]) ^ ctx.rk[rounds][1]; + b[2] = F1(t[2], t[3], t[0], t[1]) ^ ctx.rk[rounds][2]; + b[3] = F1(t[3], t[0], t[1], t[2]) ^ ctx.rk[rounds][3]; + + return unpackBytes(b); +} + +function makeClass(length) { + + var c = function c(key) { + this.key = keyExpansion(key); + this._temp = new Uint32Array(this.blockSize / 4); + + this.encrypt = function (block) { + return AESencrypt(block, this.key, this._temp); + }; + }; + + c.blockSize = c.prototype.blockSize = 16; + c.keySize = c.prototype.keySize = length / 8; + + return c; +} + +exports.default = { + 128: makeClass(128), + 192: makeClass(192), + 256: makeClass(256) +}; + +},{}],13:[function(_dereq_,module,exports){ +/* Modified by Recurity Labs GmbH + * + * Originally written by nklein software (nklein.com) + */ + +/** + * @module crypto/cipher/blowfish + */ + +'use strict'; + +/* + * Javascript implementation based on Bruce Schneier's reference implementation. + * + * + * The constructor doesn't do much of anything. It's just here + * so we can start defining properties and methods and such. + */ + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = BF; +function Blowfish() {} + +/* + * Declare the block size so that protocols know what size + * Initialization Vector (IV) they will need. + */ +Blowfish.prototype.BLOCKSIZE = 8; + +/* + * These are the default SBOXES. + */ +Blowfish.prototype.SBOXES = [[0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a], [0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7], [0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0], [0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6]]; + +//* +//* This is the default PARRAY +//* +Blowfish.prototype.PARRAY = [0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b]; + +//* +//* This is the number of rounds the cipher will go +//* +Blowfish.prototype.NN = 16; + +//* +//* This function is needed to get rid of problems +//* with the high-bit getting set. If we don't do +//* this, then sometimes ( aa & 0x00FFFFFFFF ) is not +//* equal to ( bb & 0x00FFFFFFFF ) even when they +//* agree bit-for-bit for the first 32 bits. +//* +Blowfish.prototype._clean = function (xx) { + if (xx < 0) { + var yy = xx & 0x7FFFFFFF; + xx = yy + 0x80000000; + } + return xx; +}; + +//* +//* This is the mixing function that uses the sboxes +//* +Blowfish.prototype._F = function (xx) { + var aa; + var bb; + var cc; + var dd; + var yy; + + dd = xx & 0x00FF; + xx >>>= 8; + cc = xx & 0x00FF; + xx >>>= 8; + bb = xx & 0x00FF; + xx >>>= 8; + aa = xx & 0x00FF; + + yy = this.sboxes[0][aa] + this.sboxes[1][bb]; + yy = yy ^ this.sboxes[2][cc]; + yy = yy + this.sboxes[3][dd]; + + return yy; +}; + +//* +//* This method takes an array with two values, left and right +//* and does NN rounds of Blowfish on them. +//* +Blowfish.prototype._encrypt_block = function (vals) { + var dataL = vals[0]; + var dataR = vals[1]; + + var ii; + + for (ii = 0; ii < this.NN; ++ii) { + dataL = dataL ^ this.parray[ii]; + dataR = this._F(dataL) ^ dataR; + + var tmp = dataL; + dataL = dataR; + dataR = tmp; + } + + dataL = dataL ^ this.parray[this.NN + 0]; + dataR = dataR ^ this.parray[this.NN + 1]; + + vals[0] = this._clean(dataR); + vals[1] = this._clean(dataL); +}; + +//* +//* This method takes a vector of numbers and turns them +//* into long words so that they can be processed by the +//* real algorithm. +//* +//* Maybe I should make the real algorithm above take a vector +//* instead. That will involve more looping, but it won't require +//* the F() method to deconstruct the vector. +//* +Blowfish.prototype.encrypt_block = function (vector) { + var ii; + var vals = [0, 0]; + var off = this.BLOCKSIZE / 2; + for (ii = 0; ii < this.BLOCKSIZE / 2; ++ii) { + vals[0] = vals[0] << 8 | vector[ii + 0] & 0x00FF; + vals[1] = vals[1] << 8 | vector[ii + off] & 0x00FF; + } + + this._encrypt_block(vals); + + var ret = []; + for (ii = 0; ii < this.BLOCKSIZE / 2; ++ii) { + ret[ii + 0] = vals[0] >>> 24 - 8 * ii & 0x00FF; + ret[ii + off] = vals[1] >>> 24 - 8 * ii & 0x00FF; + // vals[ 0 ] = ( vals[ 0 ] >>> 8 ); + // vals[ 1 ] = ( vals[ 1 ] >>> 8 ); + } + + return ret; +}; + +//* +//* This method takes an array with two values, left and right +//* and undoes NN rounds of Blowfish on them. +//* +Blowfish.prototype._decrypt_block = function (vals) { + var dataL = vals[0]; + var dataR = vals[1]; + + var ii; + + for (ii = this.NN + 1; ii > 1; --ii) { + dataL = dataL ^ this.parray[ii]; + dataR = this._F(dataL) ^ dataR; + + var tmp = dataL; + dataL = dataR; + dataR = tmp; + } + + dataL = dataL ^ this.parray[1]; + dataR = dataR ^ this.parray[0]; + + vals[0] = this._clean(dataR); + vals[1] = this._clean(dataL); +}; + +//* +//* This method takes a key array and initializes the +//* sboxes and parray for this encryption. +//* +Blowfish.prototype.init = function (key) { + var ii; + var jj = 0; + + this.parray = []; + for (ii = 0; ii < this.NN + 2; ++ii) { + var data = 0x00000000; + var kk; + for (kk = 0; kk < 4; ++kk) { + data = data << 8 | key[jj] & 0x00FF; + if (++jj >= key.length) { + jj = 0; + } + } + this.parray[ii] = this.PARRAY[ii] ^ data; + } + + this.sboxes = []; + for (ii = 0; ii < 4; ++ii) { + this.sboxes[ii] = []; + for (jj = 0; jj < 256; ++jj) { + this.sboxes[ii][jj] = this.SBOXES[ii][jj]; + } + } + + var vals = [0x00000000, 0x00000000]; + + for (ii = 0; ii < this.NN + 2; ii += 2) { + this._encrypt_block(vals); + this.parray[ii + 0] = vals[0]; + this.parray[ii + 1] = vals[1]; + } + + for (ii = 0; ii < 4; ++ii) { + for (jj = 0; jj < 256; jj += 2) { + this._encrypt_block(vals); + this.sboxes[ii][jj + 0] = vals[0]; + this.sboxes[ii][jj + 1] = vals[1]; + } + } +}; + +// added by Recurity Labs + +function BF(key) { + this.bf = new Blowfish(); + this.bf.init(key); + + this.encrypt = function (block) { + return this.bf.encrypt_block(block); + }; +} +BF.keySize = BF.prototype.keySize = 16; +BF.blockSize = BF.prototype.blockSize = 16; + +},{}],14:[function(_dereq_,module,exports){ +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Copyright 2010 pjacobs@xeekr.com . All rights reserved. + +// Modified by Recurity Labs GmbH + +// fixed/modified by Herbert Hanewinkel, www.haneWIN.de +// check www.haneWIN.de for the latest version + +// cast5.js is a Javascript implementation of CAST-128, as defined in RFC 2144. +// CAST-128 is a common OpenPGP cipher. + + +// CAST5 constructor + +/** @module crypto/cipher/cast5 */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = Cast5; +function OpenpgpSymencCast5() { + this.BlockSize = 8; + this.KeySize = 16; + + this.setKey = function (key) { + this.masking = new Array(16); + this.rotate = new Array(16); + + this.reset(); + + if (key.length === this.KeySize) { + this.keySchedule(key); + } else { + throw new Error('CAST-128: keys must be 16 bytes'); + } + return true; + }; + + this.reset = function () { + for (var i = 0; i < 16; i++) { + this.masking[i] = 0; + this.rotate[i] = 0; + } + }; + + this.getBlockSize = function () { + return this.BlockSize; + }; + + this.encrypt = function (src) { + var dst = new Array(src.length); + + for (var i = 0; i < src.length; i += 8) { + var l = src[i] << 24 | src[i + 1] << 16 | src[i + 2] << 8 | src[i + 3]; + var r = src[i + 4] << 24 | src[i + 5] << 16 | src[i + 6] << 8 | src[i + 7]; + var t; + + t = r; + r = l ^ f1(r, this.masking[0], this.rotate[0]); + l = t; + t = r; + r = l ^ f2(r, this.masking[1], this.rotate[1]); + l = t; + t = r; + r = l ^ f3(r, this.masking[2], this.rotate[2]); + l = t; + t = r; + r = l ^ f1(r, this.masking[3], this.rotate[3]); + l = t; + + t = r; + r = l ^ f2(r, this.masking[4], this.rotate[4]); + l = t; + t = r; + r = l ^ f3(r, this.masking[5], this.rotate[5]); + l = t; + t = r; + r = l ^ f1(r, this.masking[6], this.rotate[6]); + l = t; + t = r; + r = l ^ f2(r, this.masking[7], this.rotate[7]); + l = t; + + t = r; + r = l ^ f3(r, this.masking[8], this.rotate[8]); + l = t; + t = r; + r = l ^ f1(r, this.masking[9], this.rotate[9]); + l = t; + t = r; + r = l ^ f2(r, this.masking[10], this.rotate[10]); + l = t; + t = r; + r = l ^ f3(r, this.masking[11], this.rotate[11]); + l = t; + + t = r; + r = l ^ f1(r, this.masking[12], this.rotate[12]); + l = t; + t = r; + r = l ^ f2(r, this.masking[13], this.rotate[13]); + l = t; + t = r; + r = l ^ f3(r, this.masking[14], this.rotate[14]); + l = t; + t = r; + r = l ^ f1(r, this.masking[15], this.rotate[15]); + l = t; + + dst[i] = r >>> 24 & 255; + dst[i + 1] = r >>> 16 & 255; + dst[i + 2] = r >>> 8 & 255; + dst[i + 3] = r & 255; + dst[i + 4] = l >>> 24 & 255; + dst[i + 5] = l >>> 16 & 255; + dst[i + 6] = l >>> 8 & 255; + dst[i + 7] = l & 255; + } + + return dst; + }; + + this.decrypt = function (src) { + var dst = new Array(src.length); + + for (var i = 0; i < src.length; i += 8) { + var l = src[i] << 24 | src[i + 1] << 16 | src[i + 2] << 8 | src[i + 3]; + var r = src[i + 4] << 24 | src[i + 5] << 16 | src[i + 6] << 8 | src[i + 7]; + var t; + + t = r; + r = l ^ f1(r, this.masking[15], this.rotate[15]); + l = t; + t = r; + r = l ^ f3(r, this.masking[14], this.rotate[14]); + l = t; + t = r; + r = l ^ f2(r, this.masking[13], this.rotate[13]); + l = t; + t = r; + r = l ^ f1(r, this.masking[12], this.rotate[12]); + l = t; + + t = r; + r = l ^ f3(r, this.masking[11], this.rotate[11]); + l = t; + t = r; + r = l ^ f2(r, this.masking[10], this.rotate[10]); + l = t; + t = r; + r = l ^ f1(r, this.masking[9], this.rotate[9]); + l = t; + t = r; + r = l ^ f3(r, this.masking[8], this.rotate[8]); + l = t; + + t = r; + r = l ^ f2(r, this.masking[7], this.rotate[7]); + l = t; + t = r; + r = l ^ f1(r, this.masking[6], this.rotate[6]); + l = t; + t = r; + r = l ^ f3(r, this.masking[5], this.rotate[5]); + l = t; + t = r; + r = l ^ f2(r, this.masking[4], this.rotate[4]); + l = t; + + t = r; + r = l ^ f1(r, this.masking[3], this.rotate[3]); + l = t; + t = r; + r = l ^ f3(r, this.masking[2], this.rotate[2]); + l = t; + t = r; + r = l ^ f2(r, this.masking[1], this.rotate[1]); + l = t; + t = r; + r = l ^ f1(r, this.masking[0], this.rotate[0]); + l = t; + + dst[i] = r >>> 24 & 255; + dst[i + 1] = r >>> 16 & 255; + dst[i + 2] = r >>> 8 & 255; + dst[i + 3] = r & 255; + dst[i + 4] = l >>> 24 & 255; + dst[i + 5] = l >> 16 & 255; + dst[i + 6] = l >> 8 & 255; + dst[i + 7] = l & 255; + } + + return dst; + }; + var scheduleA = new Array(4); + + scheduleA[0] = new Array(4); + scheduleA[0][0] = new Array(4, 0, 0xd, 0xf, 0xc, 0xe, 0x8); + scheduleA[0][1] = new Array(5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa); + scheduleA[0][2] = new Array(6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9); + scheduleA[0][3] = new Array(7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb); + + scheduleA[1] = new Array(4); + scheduleA[1][0] = new Array(0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0); + scheduleA[1][1] = new Array(1, 4, 0, 2, 1, 3, 16 + 2); + scheduleA[1][2] = new Array(2, 5, 7, 6, 5, 4, 16 + 1); + scheduleA[1][3] = new Array(3, 7, 0xa, 9, 0xb, 8, 16 + 3); + + scheduleA[2] = new Array(4); + scheduleA[2][0] = new Array(4, 0, 0xd, 0xf, 0xc, 0xe, 8); + scheduleA[2][1] = new Array(5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa); + scheduleA[2][2] = new Array(6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9); + scheduleA[2][3] = new Array(7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb); + + scheduleA[3] = new Array(4); + scheduleA[3][0] = new Array(0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0); + scheduleA[3][1] = new Array(1, 4, 0, 2, 1, 3, 16 + 2); + scheduleA[3][2] = new Array(2, 5, 7, 6, 5, 4, 16 + 1); + scheduleA[3][3] = new Array(3, 7, 0xa, 9, 0xb, 8, 16 + 3); + + var scheduleB = new Array(4); + + scheduleB[0] = new Array(4); + scheduleB[0][0] = new Array(16 + 8, 16 + 9, 16 + 7, 16 + 6, 16 + 2); + scheduleB[0][1] = new Array(16 + 0xa, 16 + 0xb, 16 + 5, 16 + 4, 16 + 6); + scheduleB[0][2] = new Array(16 + 0xc, 16 + 0xd, 16 + 3, 16 + 2, 16 + 9); + scheduleB[0][3] = new Array(16 + 0xe, 16 + 0xf, 16 + 1, 16 + 0, 16 + 0xc); + + scheduleB[1] = new Array(4); + scheduleB[1][0] = new Array(3, 2, 0xc, 0xd, 8); + scheduleB[1][1] = new Array(1, 0, 0xe, 0xf, 0xd); + scheduleB[1][2] = new Array(7, 6, 8, 9, 3); + scheduleB[1][3] = new Array(5, 4, 0xa, 0xb, 7); + + scheduleB[2] = new Array(4); + scheduleB[2][0] = new Array(16 + 3, 16 + 2, 16 + 0xc, 16 + 0xd, 16 + 9); + scheduleB[2][1] = new Array(16 + 1, 16 + 0, 16 + 0xe, 16 + 0xf, 16 + 0xc); + scheduleB[2][2] = new Array(16 + 7, 16 + 6, 16 + 8, 16 + 9, 16 + 2); + scheduleB[2][3] = new Array(16 + 5, 16 + 4, 16 + 0xa, 16 + 0xb, 16 + 6); + + scheduleB[3] = new Array(4); + scheduleB[3][0] = new Array(8, 9, 7, 6, 3); + scheduleB[3][1] = new Array(0xa, 0xb, 5, 4, 7); + scheduleB[3][2] = new Array(0xc, 0xd, 3, 2, 8); + scheduleB[3][3] = new Array(0xe, 0xf, 1, 0, 0xd); + + // changed 'in' to 'inn' (in javascript 'in' is a reserved word) + this.keySchedule = function (inn) { + var t = new Array(8); + var k = new Array(32); + + var i, j; + + for (i = 0; i < 4; i++) { + j = i * 4; + t[i] = inn[j] << 24 | inn[j + 1] << 16 | inn[j + 2] << 8 | inn[j + 3]; + } + + var x = [6, 7, 4, 5]; + var ki = 0; + var w; + + for (var half = 0; half < 2; half++) { + for (var round = 0; round < 4; round++) { + for (j = 0; j < 4; j++) { + var a = scheduleA[round][j]; + w = t[a[1]]; + + w ^= sBox[4][t[a[2] >>> 2] >>> 24 - 8 * (a[2] & 3) & 0xff]; + w ^= sBox[5][t[a[3] >>> 2] >>> 24 - 8 * (a[3] & 3) & 0xff]; + w ^= sBox[6][t[a[4] >>> 2] >>> 24 - 8 * (a[4] & 3) & 0xff]; + w ^= sBox[7][t[a[5] >>> 2] >>> 24 - 8 * (a[5] & 3) & 0xff]; + w ^= sBox[x[j]][t[a[6] >>> 2] >>> 24 - 8 * (a[6] & 3) & 0xff]; + t[a[0]] = w; + } + + for (j = 0; j < 4; j++) { + var b = scheduleB[round][j]; + w = sBox[4][t[b[0] >>> 2] >>> 24 - 8 * (b[0] & 3) & 0xff]; + + w ^= sBox[5][t[b[1] >>> 2] >>> 24 - 8 * (b[1] & 3) & 0xff]; + w ^= sBox[6][t[b[2] >>> 2] >>> 24 - 8 * (b[2] & 3) & 0xff]; + w ^= sBox[7][t[b[3] >>> 2] >>> 24 - 8 * (b[3] & 3) & 0xff]; + w ^= sBox[4 + j][t[b[4] >>> 2] >>> 24 - 8 * (b[4] & 3) & 0xff]; + k[ki] = w; + ki++; + } + } + } + + for (i = 0; i < 16; i++) { + this.masking[i] = k[i]; + this.rotate[i] = k[16 + i] & 0x1f; + } + }; + + // These are the three 'f' functions. See RFC 2144, section 2.2. + + function f1(d, m, r) { + var t = m + d; + var I = t << r | t >>> 32 - r; + return (sBox[0][I >>> 24] ^ sBox[1][I >>> 16 & 255]) - sBox[2][I >>> 8 & 255] + sBox[3][I & 255]; + } + + function f2(d, m, r) { + var t = m ^ d; + var I = t << r | t >>> 32 - r; + return sBox[0][I >>> 24] - sBox[1][I >>> 16 & 255] + sBox[2][I >>> 8 & 255] ^ sBox[3][I & 255]; + } + + function f3(d, m, r) { + var t = m - d; + var I = t << r | t >>> 32 - r; + return (sBox[0][I >>> 24] + sBox[1][I >>> 16 & 255] ^ sBox[2][I >>> 8 & 255]) - sBox[3][I & 255]; + } + + var sBox = new Array(8); + sBox[0] = new Array(0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949, 0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e, 0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d, 0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0, 0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7, 0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935, 0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d, 0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50, 0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe, 0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3, 0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167, 0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291, 0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779, 0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2, 0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511, 0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495, 0xaa573b04, 0x4a805d8d, 0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5, 0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324, 0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c, 0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc, 0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d, 0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96, 0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a, 0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d, 0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd, 0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6, 0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9, 0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872, 0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c, 0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e, 0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9, 0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf); + + sBox[1] = new Array(0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651, 0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3, 0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb, 0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b, 0x25a1ff41, 0xe180f806, 0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b, 0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359, 0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084, 0xe4eb573b, 0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c, 0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34, 0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb, 0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd, 0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860, 0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b, 0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304, 0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b, 0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf, 0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c, 0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13, 0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741, 0x7cbad9a2, 0x2180036f, 0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6, 0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6, 0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc, 0xd152de58, 0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906, 0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d, 0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6, 0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4, 0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6, 0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f, 0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249, 0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa, 0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9, 0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1); + + sBox[2] = new Array(0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90, 0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5, 0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e, 0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240, 0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5, 0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b, 0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e, 0xc5884a28, 0xccc36f71, 0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04, 0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82, 0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15, 0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2, 0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176, 0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148, 0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc, 0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341, 0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e, 0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51, 0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f, 0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a, 0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b, 0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b, 0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae, 0x12deca4d, 0x2c3f8cc5, 0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45, 0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536, 0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc, 0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0, 0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69, 0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2, 0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49, 0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d, 0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a, 0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783); + + sBox[3] = new Array(0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1, 0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf, 0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15, 0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121, 0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25, 0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5, 0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb, 0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5, 0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d, 0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6, 0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23, 0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003, 0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6, 0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119, 0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24, 0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a, 0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79, 0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df, 0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26, 0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab, 0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7, 0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417, 0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2, 0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2, 0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a, 0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919, 0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef, 0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876, 0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab, 0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04, 0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282, 0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2); + + sBox[4] = new Array(0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f, 0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a, 0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff, 0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02, 0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a, 0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7, 0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9, 0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981, 0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774, 0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655, 0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2, 0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910, 0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1, 0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da, 0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049, 0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f, 0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba, 0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be, 0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3, 0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840, 0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4, 0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2, 0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7, 0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5, 0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e, 0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e, 0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801, 0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad, 0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0, 0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20, 0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8, 0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4); + + sBox[5] = new Array(0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac, 0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138, 0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367, 0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98, 0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072, 0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3, 0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd, 0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8, 0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9, 0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54, 0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387, 0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc, 0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf, 0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf, 0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f, 0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289, 0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063, 0x4576698d, 0xb6fad407, 0x592af950, 0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f, 0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b, 0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be, 0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13, 0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976, 0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0, 0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891, 0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da, 0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc, 0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084, 0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25, 0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121, 0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5, 0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd, 0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f); + + sBox[6] = new Array(0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f, 0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de, 0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43, 0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19, 0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2, 0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516, 0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88, 0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816, 0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756, 0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a, 0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264, 0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688, 0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28, 0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3, 0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7, 0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06, 0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033, 0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a, 0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566, 0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509, 0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962, 0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e, 0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c, 0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c, 0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285, 0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301, 0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be, 0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767, 0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647, 0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914, 0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c, 0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3); + + sBox[7] = new Array(0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5, 0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc, 0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd, 0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d, 0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2, 0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862, 0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc, 0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c, 0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e, 0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039, 0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8, 0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42, 0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5, 0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472, 0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225, 0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c, 0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb, 0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054, 0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70, 0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc, 0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c, 0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3, 0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4, 0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101, 0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f, 0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e, 0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a, 0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c, 0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384, 0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c, 0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82, 0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e); +} + +function Cast5(key) { + this.cast5 = new OpenpgpSymencCast5(); + this.cast5.setKey(key); + + this.encrypt = function (block) { + return this.cast5.encrypt(block); + }; +} + +Cast5.blockSize = Cast5.prototype.blockSize = 8; +Cast5.keySize = Cast5.prototype.keySize = 16; + +},{}],15:[function(_dereq_,module,exports){ +//Paul Tero, July 2001 +//http://www.tero.co.uk/des/ +// +//Optimised for performance with large blocks by Michael Hayworth, November 2001 +//http://www.netdealing.com +// +// Modified by Recurity Labs GmbH + +//THIS SOFTWARE IS PROVIDED "AS IS" AND +//ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +//IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +//ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +//FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +//DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +//OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +//HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +//OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +//SUCH DAMAGE. + +//des +//this takes the key, the message, and whether to encrypt or decrypt + +/** + * @module crypto/cipher/des + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +function des(keys, message, encrypt, mode, iv, padding) { + //declaring this locally speeds things up a bit + var spfunction1 = new Array(0x1010400, 0, 0x10000, 0x1010404, 0x1010004, 0x10404, 0x4, 0x10000, 0x400, 0x1010400, 0x1010404, 0x400, 0x1000404, 0x1010004, 0x1000000, 0x4, 0x404, 0x1000400, 0x1000400, 0x10400, 0x10400, 0x1010000, 0x1010000, 0x1000404, 0x10004, 0x1000004, 0x1000004, 0x10004, 0, 0x404, 0x10404, 0x1000000, 0x10000, 0x1010404, 0x4, 0x1010000, 0x1010400, 0x1000000, 0x1000000, 0x400, 0x1010004, 0x10000, 0x10400, 0x1000004, 0x400, 0x4, 0x1000404, 0x10404, 0x1010404, 0x10004, 0x1010000, 0x1000404, 0x1000004, 0x404, 0x10404, 0x1010400, 0x404, 0x1000400, 0x1000400, 0, 0x10004, 0x10400, 0, 0x1010004); + var spfunction2 = new Array(-0x7fef7fe0, -0x7fff8000, 0x8000, 0x108020, 0x100000, 0x20, -0x7fefffe0, -0x7fff7fe0, -0x7fffffe0, -0x7fef7fe0, -0x7fef8000, -0x80000000, -0x7fff8000, 0x100000, 0x20, -0x7fefffe0, 0x108000, 0x100020, -0x7fff7fe0, 0, -0x80000000, 0x8000, 0x108020, -0x7ff00000, 0x100020, -0x7fffffe0, 0, 0x108000, 0x8020, -0x7fef8000, -0x7ff00000, 0x8020, 0, 0x108020, -0x7fefffe0, 0x100000, -0x7fff7fe0, -0x7ff00000, -0x7fef8000, 0x8000, -0x7ff00000, -0x7fff8000, 0x20, -0x7fef7fe0, 0x108020, 0x20, 0x8000, -0x80000000, 0x8020, -0x7fef8000, 0x100000, -0x7fffffe0, 0x100020, -0x7fff7fe0, -0x7fffffe0, 0x100020, 0x108000, 0, -0x7fff8000, 0x8020, -0x80000000, -0x7fefffe0, -0x7fef7fe0, 0x108000); + var spfunction3 = new Array(0x208, 0x8020200, 0, 0x8020008, 0x8000200, 0, 0x20208, 0x8000200, 0x20008, 0x8000008, 0x8000008, 0x20000, 0x8020208, 0x20008, 0x8020000, 0x208, 0x8000000, 0x8, 0x8020200, 0x200, 0x20200, 0x8020000, 0x8020008, 0x20208, 0x8000208, 0x20200, 0x20000, 0x8000208, 0x8, 0x8020208, 0x200, 0x8000000, 0x8020200, 0x8000000, 0x20008, 0x208, 0x20000, 0x8020200, 0x8000200, 0, 0x200, 0x20008, 0x8020208, 0x8000200, 0x8000008, 0x200, 0, 0x8020008, 0x8000208, 0x20000, 0x8000000, 0x8020208, 0x8, 0x20208, 0x20200, 0x8000008, 0x8020000, 0x8000208, 0x208, 0x8020000, 0x20208, 0x8, 0x8020008, 0x20200); + var spfunction4 = new Array(0x802001, 0x2081, 0x2081, 0x80, 0x802080, 0x800081, 0x800001, 0x2001, 0, 0x802000, 0x802000, 0x802081, 0x81, 0, 0x800080, 0x800001, 0x1, 0x2000, 0x800000, 0x802001, 0x80, 0x800000, 0x2001, 0x2080, 0x800081, 0x1, 0x2080, 0x800080, 0x2000, 0x802080, 0x802081, 0x81, 0x800080, 0x800001, 0x802000, 0x802081, 0x81, 0, 0, 0x802000, 0x2080, 0x800080, 0x800081, 0x1, 0x802001, 0x2081, 0x2081, 0x80, 0x802081, 0x81, 0x1, 0x2000, 0x800001, 0x2001, 0x802080, 0x800081, 0x2001, 0x2080, 0x800000, 0x802001, 0x80, 0x800000, 0x2000, 0x802080); + var spfunction5 = new Array(0x100, 0x2080100, 0x2080000, 0x42000100, 0x80000, 0x100, 0x40000000, 0x2080000, 0x40080100, 0x80000, 0x2000100, 0x40080100, 0x42000100, 0x42080000, 0x80100, 0x40000000, 0x2000000, 0x40080000, 0x40080000, 0, 0x40000100, 0x42080100, 0x42080100, 0x2000100, 0x42080000, 0x40000100, 0, 0x42000000, 0x2080100, 0x2000000, 0x42000000, 0x80100, 0x80000, 0x42000100, 0x100, 0x2000000, 0x40000000, 0x2080000, 0x42000100, 0x40080100, 0x2000100, 0x40000000, 0x42080000, 0x2080100, 0x40080100, 0x100, 0x2000000, 0x42080000, 0x42080100, 0x80100, 0x42000000, 0x42080100, 0x2080000, 0, 0x40080000, 0x42000000, 0x80100, 0x2000100, 0x40000100, 0x80000, 0, 0x40080000, 0x2080100, 0x40000100); + var spfunction6 = new Array(0x20000010, 0x20400000, 0x4000, 0x20404010, 0x20400000, 0x10, 0x20404010, 0x400000, 0x20004000, 0x404010, 0x400000, 0x20000010, 0x400010, 0x20004000, 0x20000000, 0x4010, 0, 0x400010, 0x20004010, 0x4000, 0x404000, 0x20004010, 0x10, 0x20400010, 0x20400010, 0, 0x404010, 0x20404000, 0x4010, 0x404000, 0x20404000, 0x20000000, 0x20004000, 0x10, 0x20400010, 0x404000, 0x20404010, 0x400000, 0x4010, 0x20000010, 0x400000, 0x20004000, 0x20000000, 0x4010, 0x20000010, 0x20404010, 0x404000, 0x20400000, 0x404010, 0x20404000, 0, 0x20400010, 0x10, 0x4000, 0x20400000, 0x404010, 0x4000, 0x400010, 0x20004010, 0, 0x20404000, 0x20000000, 0x400010, 0x20004010); + var spfunction7 = new Array(0x200000, 0x4200002, 0x4000802, 0, 0x800, 0x4000802, 0x200802, 0x4200800, 0x4200802, 0x200000, 0, 0x4000002, 0x2, 0x4000000, 0x4200002, 0x802, 0x4000800, 0x200802, 0x200002, 0x4000800, 0x4000002, 0x4200000, 0x4200800, 0x200002, 0x4200000, 0x800, 0x802, 0x4200802, 0x200800, 0x2, 0x4000000, 0x200800, 0x4000000, 0x200800, 0x200000, 0x4000802, 0x4000802, 0x4200002, 0x4200002, 0x2, 0x200002, 0x4000000, 0x4000800, 0x200000, 0x4200800, 0x802, 0x200802, 0x4200800, 0x802, 0x4000002, 0x4200802, 0x4200000, 0x200800, 0, 0x2, 0x4200802, 0, 0x200802, 0x4200000, 0x800, 0x4000002, 0x4000800, 0x800, 0x200002); + var spfunction8 = new Array(0x10001040, 0x1000, 0x40000, 0x10041040, 0x10000000, 0x10001040, 0x40, 0x10000000, 0x40040, 0x10040000, 0x10041040, 0x41000, 0x10041000, 0x41040, 0x1000, 0x40, 0x10040000, 0x10000040, 0x10001000, 0x1040, 0x41000, 0x40040, 0x10040040, 0x10041000, 0x1040, 0, 0, 0x10040040, 0x10000040, 0x10001000, 0x41040, 0x40000, 0x41040, 0x40000, 0x10041000, 0x1000, 0x40, 0x10040040, 0x1000, 0x41040, 0x10001000, 0x40, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x40000, 0x10001040, 0, 0x10041040, 0x40040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0, 0x10041040, 0x41000, 0x41000, 0x1040, 0x1040, 0x40040, 0x10000000, 0x10041000); + + //create the 16 or 48 subkeys we will need + var m = 0, + i, + j, + temp, + right1, + right2, + left, + right, + looping; + var cbcleft, cbcleft2, cbcright, cbcright2; + var endloop, loopinc; + var len = message.length; + + //set up the loops for single and triple des + var iterations = keys.length === 32 ? 3 : 9; //single or triple des + if (iterations === 3) { + looping = encrypt ? new Array(0, 32, 2) : new Array(30, -2, -2); + } else { + looping = encrypt ? new Array(0, 32, 2, 62, 30, -2, 64, 96, 2) : new Array(94, 62, -2, 32, 64, 2, 30, -2, -2); + } + + //pad the message depending on the padding parameter + //only add padding if encrypting - note that you need to use the same padding option for both encrypt and decrypt + if (encrypt) { + message = des_addPadding(message, padding); + len = message.length; + } + + //store the result here + var result = new Uint8Array(len); + var k = 0; + + if (mode === 1) { + //CBC mode + cbcleft = iv[m++] << 24 | iv[m++] << 16 | iv[m++] << 8 | iv[m++]; + cbcright = iv[m++] << 24 | iv[m++] << 16 | iv[m++] << 8 | iv[m++]; + m = 0; + } + + //loop through each 64 bit chunk of the message + while (m < len) { + left = message[m++] << 24 | message[m++] << 16 | message[m++] << 8 | message[m++]; + right = message[m++] << 24 | message[m++] << 16 | message[m++] << 8 | message[m++]; + + //for Cipher Block Chaining mode, xor the message with the previous result + if (mode === 1) { + if (encrypt) { + left ^= cbcleft; + right ^= cbcright; + } else { + cbcleft2 = cbcleft; + cbcright2 = cbcright; + cbcleft = left; + cbcright = right; + } + } + + //first each 64 but chunk of the message must be permuted according to IP + temp = (left >>> 4 ^ right) & 0x0f0f0f0f; + right ^= temp; + left ^= temp << 4; + temp = (left >>> 16 ^ right) & 0x0000ffff; + right ^= temp; + left ^= temp << 16; + temp = (right >>> 2 ^ left) & 0x33333333; + left ^= temp; + right ^= temp << 2; + temp = (right >>> 8 ^ left) & 0x00ff00ff; + left ^= temp; + right ^= temp << 8; + temp = (left >>> 1 ^ right) & 0x55555555; + right ^= temp; + left ^= temp << 1; + + left = left << 1 | left >>> 31; + right = right << 1 | right >>> 31; + + //do this either 1 or 3 times for each chunk of the message + for (j = 0; j < iterations; j += 3) { + endloop = looping[j + 1]; + loopinc = looping[j + 2]; + //now go through and perform the encryption or decryption + for (i = looping[j]; i !== endloop; i += loopinc) { + //for efficiency + right1 = right ^ keys[i]; + right2 = (right >>> 4 | right << 28) ^ keys[i + 1]; + //the result is attained by passing these bytes through the S selection functions + temp = left; + left = right; + right = temp ^ (spfunction2[right1 >>> 24 & 0x3f] | spfunction4[right1 >>> 16 & 0x3f] | spfunction6[right1 >>> 8 & 0x3f] | spfunction8[right1 & 0x3f] | spfunction1[right2 >>> 24 & 0x3f] | spfunction3[right2 >>> 16 & 0x3f] | spfunction5[right2 >>> 8 & 0x3f] | spfunction7[right2 & 0x3f]); + } + temp = left; + left = right; + right = temp; //unreverse left and right + } //for either 1 or 3 iterations + + //move then each one bit to the right + left = left >>> 1 | left << 31; + right = right >>> 1 | right << 31; + + //now perform IP-1, which is IP in the opposite direction + temp = (left >>> 1 ^ right) & 0x55555555; + right ^= temp; + left ^= temp << 1; + temp = (right >>> 8 ^ left) & 0x00ff00ff; + left ^= temp; + right ^= temp << 8; + temp = (right >>> 2 ^ left) & 0x33333333; + left ^= temp; + right ^= temp << 2; + temp = (left >>> 16 ^ right) & 0x0000ffff; + right ^= temp; + left ^= temp << 16; + temp = (left >>> 4 ^ right) & 0x0f0f0f0f; + right ^= temp; + left ^= temp << 4; + + //for Cipher Block Chaining mode, xor the message with the previous result + if (mode === 1) { + if (encrypt) { + cbcleft = left; + cbcright = right; + } else { + left ^= cbcleft2; + right ^= cbcright2; + } + } + + result[k++] = left >>> 24; + result[k++] = left >>> 16 & 0xff; + result[k++] = left >>> 8 & 0xff; + result[k++] = left & 0xff; + result[k++] = right >>> 24; + result[k++] = right >>> 16 & 0xff; + result[k++] = right >>> 8 & 0xff; + result[k++] = right & 0xff; + } //for every 8 characters, or 64 bits in the message + + //only remove padding if decrypting - note that you need to use the same padding option for both encrypt and decrypt + if (!encrypt) { + result = des_removePadding(result, padding); + } + + return result; +} //end of des + + +//des_createKeys +//this takes as input a 64 bit key (even though only 56 bits are used) +//as an array of 2 integers, and returns 16 48 bit keys + +function des_createKeys(key) { + //declaring this locally speeds things up a bit + var pc2bytes0 = new Array(0, 0x4, 0x20000000, 0x20000004, 0x10000, 0x10004, 0x20010000, 0x20010004, 0x200, 0x204, 0x20000200, 0x20000204, 0x10200, 0x10204, 0x20010200, 0x20010204); + var pc2bytes1 = new Array(0, 0x1, 0x100000, 0x100001, 0x4000000, 0x4000001, 0x4100000, 0x4100001, 0x100, 0x101, 0x100100, 0x100101, 0x4000100, 0x4000101, 0x4100100, 0x4100101); + var pc2bytes2 = new Array(0, 0x8, 0x800, 0x808, 0x1000000, 0x1000008, 0x1000800, 0x1000808, 0, 0x8, 0x800, 0x808, 0x1000000, 0x1000008, 0x1000800, 0x1000808); + var pc2bytes3 = new Array(0, 0x200000, 0x8000000, 0x8200000, 0x2000, 0x202000, 0x8002000, 0x8202000, 0x20000, 0x220000, 0x8020000, 0x8220000, 0x22000, 0x222000, 0x8022000, 0x8222000); + var pc2bytes4 = new Array(0, 0x40000, 0x10, 0x40010, 0, 0x40000, 0x10, 0x40010, 0x1000, 0x41000, 0x1010, 0x41010, 0x1000, 0x41000, 0x1010, 0x41010); + var pc2bytes5 = new Array(0, 0x400, 0x20, 0x420, 0, 0x400, 0x20, 0x420, 0x2000000, 0x2000400, 0x2000020, 0x2000420, 0x2000000, 0x2000400, 0x2000020, 0x2000420); + var pc2bytes6 = new Array(0, 0x10000000, 0x80000, 0x10080000, 0x2, 0x10000002, 0x80002, 0x10080002, 0, 0x10000000, 0x80000, 0x10080000, 0x2, 0x10000002, 0x80002, 0x10080002); + var pc2bytes7 = new Array(0, 0x10000, 0x800, 0x10800, 0x20000000, 0x20010000, 0x20000800, 0x20010800, 0x20000, 0x30000, 0x20800, 0x30800, 0x20020000, 0x20030000, 0x20020800, 0x20030800); + var pc2bytes8 = new Array(0, 0x40000, 0, 0x40000, 0x2, 0x40002, 0x2, 0x40002, 0x2000000, 0x2040000, 0x2000000, 0x2040000, 0x2000002, 0x2040002, 0x2000002, 0x2040002); + var pc2bytes9 = new Array(0, 0x10000000, 0x8, 0x10000008, 0, 0x10000000, 0x8, 0x10000008, 0x400, 0x10000400, 0x408, 0x10000408, 0x400, 0x10000400, 0x408, 0x10000408); + var pc2bytes10 = new Array(0, 0x20, 0, 0x20, 0x100000, 0x100020, 0x100000, 0x100020, 0x2000, 0x2020, 0x2000, 0x2020, 0x102000, 0x102020, 0x102000, 0x102020); + var pc2bytes11 = new Array(0, 0x1000000, 0x200, 0x1000200, 0x200000, 0x1200000, 0x200200, 0x1200200, 0x4000000, 0x5000000, 0x4000200, 0x5000200, 0x4200000, 0x5200000, 0x4200200, 0x5200200); + var pc2bytes12 = new Array(0, 0x1000, 0x8000000, 0x8001000, 0x80000, 0x81000, 0x8080000, 0x8081000, 0x10, 0x1010, 0x8000010, 0x8001010, 0x80010, 0x81010, 0x8080010, 0x8081010); + var pc2bytes13 = new Array(0, 0x4, 0x100, 0x104, 0, 0x4, 0x100, 0x104, 0x1, 0x5, 0x101, 0x105, 0x1, 0x5, 0x101, 0x105); + + //how many iterations (1 for des, 3 for triple des) + var iterations = key.length > 8 ? 3 : 1; //changed by Paul 16/6/2007 to use Triple DES for 9+ byte keys + //stores the return keys + var keys = new Array(32 * iterations); + //now define the left shifts which need to be done + var shifts = new Array(0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0); + //other variables + var lefttemp, + righttemp, + m = 0, + n = 0, + temp; + + for (var j = 0; j < iterations; j++) { + //either 1 or 3 iterations + var left = key[m++] << 24 | key[m++] << 16 | key[m++] << 8 | key[m++]; + var right = key[m++] << 24 | key[m++] << 16 | key[m++] << 8 | key[m++]; + + temp = (left >>> 4 ^ right) & 0x0f0f0f0f; + right ^= temp; + left ^= temp << 4; + temp = (right >>> -16 ^ left) & 0x0000ffff; + left ^= temp; + right ^= temp << -16; + temp = (left >>> 2 ^ right) & 0x33333333; + right ^= temp; + left ^= temp << 2; + temp = (right >>> -16 ^ left) & 0x0000ffff; + left ^= temp; + right ^= temp << -16; + temp = (left >>> 1 ^ right) & 0x55555555; + right ^= temp; + left ^= temp << 1; + temp = (right >>> 8 ^ left) & 0x00ff00ff; + left ^= temp; + right ^= temp << 8; + temp = (left >>> 1 ^ right) & 0x55555555; + right ^= temp; + left ^= temp << 1; + + //the right side needs to be shifted and to get the last four bits of the left side + temp = left << 8 | right >>> 20 & 0x000000f0; + //left needs to be put upside down + left = right << 24 | right << 8 & 0xff0000 | right >>> 8 & 0xff00 | right >>> 24 & 0xf0; + right = temp; + + //now go through and perform these shifts on the left and right keys + for (var i = 0; i < shifts.length; i++) { + //shift the keys either one or two bits to the left + if (shifts[i]) { + left = left << 2 | left >>> 26; + right = right << 2 | right >>> 26; + } else { + left = left << 1 | left >>> 27; + right = right << 1 | right >>> 27; + } + left &= -0xf; + right &= -0xf; + + //now apply PC-2, in such a way that E is easier when encrypting or decrypting + //this conversion will look like PC-2 except only the last 6 bits of each byte are used + //rather than 48 consecutive bits and the order of lines will be according to + //how the S selection functions will be applied: S2, S4, S6, S8, S1, S3, S5, S7 + lefttemp = pc2bytes0[left >>> 28] | pc2bytes1[left >>> 24 & 0xf] | pc2bytes2[left >>> 20 & 0xf] | pc2bytes3[left >>> 16 & 0xf] | pc2bytes4[left >>> 12 & 0xf] | pc2bytes5[left >>> 8 & 0xf] | pc2bytes6[left >>> 4 & 0xf]; + righttemp = pc2bytes7[right >>> 28] | pc2bytes8[right >>> 24 & 0xf] | pc2bytes9[right >>> 20 & 0xf] | pc2bytes10[right >>> 16 & 0xf] | pc2bytes11[right >>> 12 & 0xf] | pc2bytes12[right >>> 8 & 0xf] | pc2bytes13[right >>> 4 & 0xf]; + temp = (righttemp >>> 16 ^ lefttemp) & 0x0000ffff; + keys[n++] = lefttemp ^ temp; + keys[n++] = righttemp ^ temp << 16; + } + } //for each iterations + //return the keys we've created + return keys; +} //end of des_createKeys + + +function des_addPadding(message, padding) { + var padLength = 8 - message.length % 8; + + var pad; + if (padding === 2 && padLength < 8) { + //pad the message with spaces + pad = " ".charCodeAt(0); + } else if (padding === 1) { + //PKCS7 padding + pad = padLength; + } else if (!padding && padLength < 8) { + //pad the message out with null bytes + pad = 0; + } else if (padLength === 8) { + return message; + } else { + throw new Error('des: invalid padding'); + } + + var paddedMessage = new Uint8Array(message.length + padLength); + for (var i = 0; i < message.length; i++) { + paddedMessage[i] = message[i]; + } + for (var j = 0; j < padLength; j++) { + paddedMessage[message.length + j] = pad; + } + + return paddedMessage; +} + +function des_removePadding(message, padding) { + var padLength = null; + var pad; + if (padding === 2) { + // space padded + pad = " ".charCodeAt(0); + } else if (padding === 1) { + // PKCS7 + padLength = message[message.length - 1]; + } else if (!padding) { + // null padding + pad = 0; + } else { + throw new Error('des: invalid padding'); + } + + if (!padLength) { + padLength = 1; + while (message[message.length - padLength] === pad) { + padLength++; + } + padLength--; + } + + return message.subarray(0, message.length - padLength); +} + +// added by Recurity Labs + +function Des(key) { + this.key = []; + + for (var i = 0; i < 3; i++) { + this.key.push(new Uint8Array(key.subarray(i * 8, i * 8 + 8))); + } + + this.encrypt = function (block) { + return des(des_createKeys(this.key[2]), des(des_createKeys(this.key[1]), des(des_createKeys(this.key[0]), block, true, 0, null, null), false, 0, null, null), true, 0, null, null); + }; +} + +Des.keySize = Des.prototype.keySize = 24; +Des.blockSize = Des.prototype.blockSize = 8; + +// This is "original" DES - Des is actually Triple DES. +// This is only exported so we can unit test. + +function OriginalDes(key) { + this.key = key; + + this.encrypt = function (block, padding) { + var keys = des_createKeys(this.key); + return des(keys, block, true, 0, null, padding); + }; + + this.decrypt = function (block, padding) { + var keys = des_createKeys(this.key); + return des(keys, block, false, 0, null, padding); + }; +} + +exports.default = { + /** @static */ + des: Des, + /** @static */ + originalDes: OriginalDes +}; + +},{}],16:[function(_dereq_,module,exports){ +/** + * @requires crypto/cipher/aes + * @requires crypto/cipher/blowfish + * @requires crypto/cipher/cast5 + * @requires crypto/cipher/twofish + * @module crypto/cipher + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _aes = _dereq_('./aes.js'); + +var _aes2 = _interopRequireDefault(_aes); + +var _des = _dereq_('./des.js'); + +var _des2 = _interopRequireDefault(_des); + +var _cast = _dereq_('./cast5.js'); + +var _cast2 = _interopRequireDefault(_cast); + +var _twofish = _dereq_('./twofish.js'); + +var _twofish2 = _interopRequireDefault(_twofish); + +var _blowfish = _dereq_('./blowfish.js'); + +var _blowfish2 = _interopRequireDefault(_blowfish); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = { + /** @see module:crypto/cipher/aes */ + aes128: _aes2.default[128], + aes192: _aes2.default[192], + aes256: _aes2.default[256], + /** @see module:crypto/cipher/des.originalDes */ + des: _des2.default.originalDes, + /** @see module:crypto/cipher/des.des */ + tripledes: _des2.default.des, + /** @see module:crypto/cipher/cast5 */ + cast5: _cast2.default, + /** @see module:crypto/cipher/twofish */ + twofish: _twofish2.default, + /** @see module:crypto/cipher/blowfish */ + blowfish: _blowfish2.default, + /** Not implemented */ + idea: function idea() { + throw new Error('IDEA symmetric-key algorithm not implemented'); + } +}; + +},{"./aes.js":12,"./blowfish.js":13,"./cast5.js":14,"./des.js":15,"./twofish.js":17}],17:[function(_dereq_,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = TF; +/* Modified by Recurity Labs GmbH + * + * Cipher.js + * A block-cipher algorithm implementation on JavaScript + * See Cipher.readme.txt for further information. + * + * Copyright(c) 2009 Atsushi Oka [ http://oka.nu/ ] + * This script file is distributed under the LGPL + * + * ACKNOWLEDGMENT + * + * The main subroutines are written by Michiel van Everdingen. + * + * Michiel van Everdingen + * http://home.versatel.nl/MAvanEverdingen/index.html + * + * All rights for these routines are reserved to Michiel van Everdingen. + * + */ + +/** + * @module crypto/cipher/twofish + */ + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//Math +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +var MAXINT = 0xFFFFFFFF; + +function rotw(w, n) { + return (w << n | w >>> 32 - n) & MAXINT; +} + +function getW(a, i) { + return a[i] | a[i + 1] << 8 | a[i + 2] << 16 | a[i + 3] << 24; +} + +function setW(a, i, w) { + a.splice(i, 4, w & 0xFF, w >>> 8 & 0xFF, w >>> 16 & 0xFF, w >>> 24 & 0xFF); +} + +function getB(x, n) { + return x >>> n * 8 & 0xFF; +} + +// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Twofish +// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +function createTwofish() { + // + var keyBytes = null; + var dataBytes = null; + var dataOffset = -1; + // var dataLength = -1; + var algorithmName = null; + // var idx2 = -1; + // + + algorithmName = "twofish"; + + var tfsKey = []; + var tfsM = [[], [], [], []]; + + function tfsInit(key) { + keyBytes = key; + var i, + a, + b, + c, + d, + meKey = [], + moKey = [], + inKey = []; + var kLen; + var sKey = []; + var f01, f5b, fef; + + var q0 = [[8, 1, 7, 13, 6, 15, 3, 2, 0, 11, 5, 9, 14, 12, 10, 4], [2, 8, 11, 13, 15, 7, 6, 14, 3, 1, 9, 4, 0, 10, 12, 5]]; + var q1 = [[14, 12, 11, 8, 1, 2, 3, 5, 15, 4, 10, 6, 7, 0, 9, 13], [1, 14, 2, 11, 4, 12, 3, 7, 6, 13, 10, 5, 15, 9, 0, 8]]; + var q2 = [[11, 10, 5, 14, 6, 13, 9, 0, 12, 8, 15, 3, 2, 4, 7, 1], [4, 12, 7, 5, 1, 6, 9, 10, 0, 14, 13, 8, 2, 11, 3, 15]]; + var q3 = [[13, 7, 15, 4, 1, 2, 6, 14, 9, 11, 3, 0, 8, 5, 12, 10], [11, 9, 5, 1, 12, 3, 13, 14, 6, 4, 7, 15, 2, 0, 8, 10]]; + var ror4 = [0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15]; + var ashx = [0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 5, 14, 7]; + var q = [[], []]; + var m = [[], [], [], []]; + + function ffm5b(x) { + return x ^ x >> 2 ^ [0, 90, 180, 238][x & 3]; + } + + function ffmEf(x) { + return x ^ x >> 1 ^ x >> 2 ^ [0, 238, 180, 90][x & 3]; + } + + function mdsRem(p, q) { + var i, t, u; + for (i = 0; i < 8; i++) { + t = q >>> 24; + q = q << 8 & MAXINT | p >>> 24; + p = p << 8 & MAXINT; + u = t << 1; + if (t & 128) { + u ^= 333; + } + q ^= t ^ u << 16; + u ^= t >>> 1; + if (t & 1) { + u ^= 166; + } + q ^= u << 24 | u << 8; + } + return q; + } + + function qp(n, x) { + var a, b, c, d; + a = x >> 4; + b = x & 15; + c = q0[n][a ^ b]; + d = q1[n][ror4[b] ^ ashx[a]]; + return q3[n][ror4[d] ^ ashx[c]] << 4 | q2[n][c ^ d]; + } + + function hFun(x, key) { + var a = getB(x, 0), + b = getB(x, 1), + c = getB(x, 2), + d = getB(x, 3); + switch (kLen) { + case 4: + a = q[1][a] ^ getB(key[3], 0); + b = q[0][b] ^ getB(key[3], 1); + c = q[0][c] ^ getB(key[3], 2); + d = q[1][d] ^ getB(key[3], 3); + case 3: + a = q[1][a] ^ getB(key[2], 0); + b = q[1][b] ^ getB(key[2], 1); + c = q[0][c] ^ getB(key[2], 2); + d = q[0][d] ^ getB(key[2], 3); + case 2: + a = q[0][q[0][a] ^ getB(key[1], 0)] ^ getB(key[0], 0); + b = q[0][q[1][b] ^ getB(key[1], 1)] ^ getB(key[0], 1); + c = q[1][q[0][c] ^ getB(key[1], 2)] ^ getB(key[0], 2); + d = q[1][q[1][d] ^ getB(key[1], 3)] ^ getB(key[0], 3); + } + return m[0][a] ^ m[1][b] ^ m[2][c] ^ m[3][d]; + } + + keyBytes = keyBytes.slice(0, 32); + i = keyBytes.length; + while (i !== 16 && i !== 24 && i !== 32) { + keyBytes[i++] = 0; + } + + for (i = 0; i < keyBytes.length; i += 4) { + inKey[i >> 2] = getW(keyBytes, i); + } + for (i = 0; i < 256; i++) { + q[0][i] = qp(0, i); + q[1][i] = qp(1, i); + } + for (i = 0; i < 256; i++) { + f01 = q[1][i]; + f5b = ffm5b(f01); + fef = ffmEf(f01); + m[0][i] = f01 + (f5b << 8) + (fef << 16) + (fef << 24); + m[2][i] = f5b + (fef << 8) + (f01 << 16) + (fef << 24); + f01 = q[0][i]; + f5b = ffm5b(f01); + fef = ffmEf(f01); + m[1][i] = fef + (fef << 8) + (f5b << 16) + (f01 << 24); + m[3][i] = f5b + (f01 << 8) + (fef << 16) + (f5b << 24); + } + + kLen = inKey.length / 2; + for (i = 0; i < kLen; i++) { + a = inKey[i + i]; + meKey[i] = a; + b = inKey[i + i + 1]; + moKey[i] = b; + sKey[kLen - i - 1] = mdsRem(a, b); + } + for (i = 0; i < 40; i += 2) { + a = 0x1010101 * i; + b = a + 0x1010101; + a = hFun(a, meKey); + b = rotw(hFun(b, moKey), 8); + tfsKey[i] = a + b & MAXINT; + tfsKey[i + 1] = rotw(a + 2 * b, 9); + } + for (i = 0; i < 256; i++) { + a = b = c = d = i; + switch (kLen) { + case 4: + a = q[1][a] ^ getB(sKey[3], 0); + b = q[0][b] ^ getB(sKey[3], 1); + c = q[0][c] ^ getB(sKey[3], 2); + d = q[1][d] ^ getB(sKey[3], 3); + case 3: + a = q[1][a] ^ getB(sKey[2], 0); + b = q[1][b] ^ getB(sKey[2], 1); + c = q[0][c] ^ getB(sKey[2], 2); + d = q[0][d] ^ getB(sKey[2], 3); + case 2: + tfsM[0][i] = m[0][q[0][q[0][a] ^ getB(sKey[1], 0)] ^ getB(sKey[0], 0)]; + tfsM[1][i] = m[1][q[0][q[1][b] ^ getB(sKey[1], 1)] ^ getB(sKey[0], 1)]; + tfsM[2][i] = m[2][q[1][q[0][c] ^ getB(sKey[1], 2)] ^ getB(sKey[0], 2)]; + tfsM[3][i] = m[3][q[1][q[1][d] ^ getB(sKey[1], 3)] ^ getB(sKey[0], 3)]; + } + } + } + + function tfsG0(x) { + return tfsM[0][getB(x, 0)] ^ tfsM[1][getB(x, 1)] ^ tfsM[2][getB(x, 2)] ^ tfsM[3][getB(x, 3)]; + } + + function tfsG1(x) { + return tfsM[0][getB(x, 3)] ^ tfsM[1][getB(x, 0)] ^ tfsM[2][getB(x, 1)] ^ tfsM[3][getB(x, 2)]; + } + + function tfsFrnd(r, blk) { + var a = tfsG0(blk[0]); + var b = tfsG1(blk[1]); + blk[2] = rotw(blk[2] ^ a + b + tfsKey[4 * r + 8] & MAXINT, 31); + blk[3] = rotw(blk[3], 1) ^ a + 2 * b + tfsKey[4 * r + 9] & MAXINT; + a = tfsG0(blk[2]); + b = tfsG1(blk[3]); + blk[0] = rotw(blk[0] ^ a + b + tfsKey[4 * r + 10] & MAXINT, 31); + blk[1] = rotw(blk[1], 1) ^ a + 2 * b + tfsKey[4 * r + 11] & MAXINT; + } + + function tfsIrnd(i, blk) { + var a = tfsG0(blk[0]); + var b = tfsG1(blk[1]); + blk[2] = rotw(blk[2], 1) ^ a + b + tfsKey[4 * i + 10] & MAXINT; + blk[3] = rotw(blk[3] ^ a + 2 * b + tfsKey[4 * i + 11] & MAXINT, 31); + a = tfsG0(blk[2]); + b = tfsG1(blk[3]); + blk[0] = rotw(blk[0], 1) ^ a + b + tfsKey[4 * i + 8] & MAXINT; + blk[1] = rotw(blk[1] ^ a + 2 * b + tfsKey[4 * i + 9] & MAXINT, 31); + } + + function tfsClose() { + tfsKey = []; + tfsM = [[], [], [], []]; + } + + function tfsEncrypt(data, offset) { + dataBytes = data; + dataOffset = offset; + var blk = [getW(dataBytes, dataOffset) ^ tfsKey[0], getW(dataBytes, dataOffset + 4) ^ tfsKey[1], getW(dataBytes, dataOffset + 8) ^ tfsKey[2], getW(dataBytes, dataOffset + 12) ^ tfsKey[3]]; + for (var j = 0; j < 8; j++) { + tfsFrnd(j, blk); + } + setW(dataBytes, dataOffset, blk[2] ^ tfsKey[4]); + setW(dataBytes, dataOffset + 4, blk[3] ^ tfsKey[5]); + setW(dataBytes, dataOffset + 8, blk[0] ^ tfsKey[6]); + setW(dataBytes, dataOffset + 12, blk[1] ^ tfsKey[7]); + dataOffset += 16; + return dataBytes; + } + + function tfsDecrypt(data, offset) { + dataBytes = data; + dataOffset = offset; + var blk = [getW(dataBytes, dataOffset) ^ tfsKey[4], getW(dataBytes, dataOffset + 4) ^ tfsKey[5], getW(dataBytes, dataOffset + 8) ^ tfsKey[6], getW(dataBytes, dataOffset + 12) ^ tfsKey[7]]; + for (var j = 7; j >= 0; j--) { + tfsIrnd(j, blk); + } + setW(dataBytes, dataOffset, blk[2] ^ tfsKey[0]); + setW(dataBytes, dataOffset + 4, blk[3] ^ tfsKey[1]); + setW(dataBytes, dataOffset + 8, blk[0] ^ tfsKey[2]); + setW(dataBytes, dataOffset + 12, blk[1] ^ tfsKey[3]); + dataOffset += 16; + } + + // added by Recurity Labs + + function tfsFinal() { + return dataBytes; + } + + return { + name: "twofish", + blocksize: 128 / 8, + open: tfsInit, + close: tfsClose, + encrypt: tfsEncrypt, + decrypt: tfsDecrypt, + // added by Recurity Labs + finalize: tfsFinal + }; +} + +// added by Recurity Labs + +function TF(key) { + this.tf = createTwofish(); + this.tf.open(toArray(key), 0); + + this.encrypt = function (block) { + return this.tf.encrypt(toArray(block), 0); + }; +} + +function toArray(typedArray) { + // Array.apply([], typedArray) does not work in PhantomJS 1.9 + var result = []; + for (var i = 0; i < typedArray.length; i++) { + result[i] = typedArray[i]; + } + return result; +} + +TF.keySize = TF.prototype.keySize = 32; +TF.blockSize = TF.prototype.blockSize = 16; + +},{}],18:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +// The GPG4Browsers crypto interface + +/** + * @requires crypto/cipher + * @requires crypto/public_key + * @requires crypto/random + * @requires type/mpi + * @module crypto/crypto + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _random = _dereq_('./random.js'); + +var _random2 = _interopRequireDefault(_random); + +var _cipher = _dereq_('./cipher'); + +var _cipher2 = _interopRequireDefault(_cipher); + +var _public_key = _dereq_('./public_key'); + +var _public_key2 = _interopRequireDefault(_public_key); + +var _mpi = _dereq_('../type/mpi.js'); + +var _mpi2 = _interopRequireDefault(_mpi); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = { + /** + * Encrypts data using the specified public key multiprecision integers + * and the specified algorithm. + * @param {module:enums.publicKey} algo Algorithm to be used (See {@link http://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1}) + * @param {Array} publicMPIs Algorithm dependent multiprecision integers + * @param {module:type/mpi} data Data to be encrypted as MPI + * @return {Array} if RSA an module:type/mpi; + * if elgamal encryption an array of two module:type/mpi is returned; otherwise null + */ + publicKeyEncrypt: function publicKeyEncrypt(algo, publicMPIs, data) { + var result = function () { + var m; + switch (algo) { + case 'rsa_encrypt': + case 'rsa_encrypt_sign': + var rsa = new _public_key2.default.rsa(); + var n = publicMPIs[0].toBigInteger(); + var e = publicMPIs[1].toBigInteger(); + m = data.toBigInteger(); + return [rsa.encrypt(m, e, n)]; + + case 'elgamal': + var elgamal = new _public_key2.default.elgamal(); + var p = publicMPIs[0].toBigInteger(); + var g = publicMPIs[1].toBigInteger(); + var y = publicMPIs[2].toBigInteger(); + m = data.toBigInteger(); + return elgamal.encrypt(m, g, p, y); + + default: + return []; + } + }(); + + return result.map(function (bn) { + var mpi = new _mpi2.default(); + mpi.fromBigInteger(bn); + return mpi; + }); + }, + + /** + * Decrypts data using the specified public key multiprecision integers of the private key, + * the specified secretMPIs of the private key and the specified algorithm. + * @param {module:enums.publicKey} algo Algorithm to be used (See {@link http://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1}) + * @param {Array} publicMPIs Algorithm dependent multiprecision integers + * of the public key part of the private key + * @param {Array} secretMPIs Algorithm dependent multiprecision integers + * of the private key used + * @param {module:type/mpi} data Data to be encrypted as MPI + * @return {module:type/mpi} returns a big integer containing the decrypted data; otherwise null + */ + + publicKeyDecrypt: function publicKeyDecrypt(algo, keyIntegers, dataIntegers) { + var p; + + var bn = function () { + switch (algo) { + case 'rsa_encrypt_sign': + case 'rsa_encrypt': + var rsa = new _public_key2.default.rsa(); + // 0 and 1 are the public key. + var n = keyIntegers[0].toBigInteger(); + var e = keyIntegers[1].toBigInteger(); + // 2 to 5 are the private key. + var d = keyIntegers[2].toBigInteger(); + p = keyIntegers[3].toBigInteger(); + var q = keyIntegers[4].toBigInteger(); + var u = keyIntegers[5].toBigInteger(); + var m = dataIntegers[0].toBigInteger(); + return rsa.decrypt(m, n, e, d, p, q, u); + case 'elgamal': + var elgamal = new _public_key2.default.elgamal(); + var x = keyIntegers[3].toBigInteger(); + var c1 = dataIntegers[0].toBigInteger(); + var c2 = dataIntegers[1].toBigInteger(); + p = keyIntegers[0].toBigInteger(); + return elgamal.decrypt(c1, c2, p, x); + default: + return null; + } + }(); + + var result = new _mpi2.default(); + result.fromBigInteger(bn); + return result; + }, + + /** Returns the number of integers comprising the private key of an algorithm + * @param {String} algo The public key algorithm + * @return {Integer} The number of integers. + */ + getPrivateMpiCount: function getPrivateMpiCount(algo) { + switch (algo) { + case 'rsa_encrypt': + case 'rsa_encrypt_sign': + case 'rsa_sign': + // Algorithm-Specific Fields for RSA secret keys: + // - multiprecision integer (MPI) of RSA secret exponent d. + // - MPI of RSA secret prime value p. + // - MPI of RSA secret prime value q (p < q). + // - MPI of u, the multiplicative inverse of p, mod q. + return 4; + case 'elgamal': + // Algorithm-Specific Fields for Elgamal secret keys: + // - MPI of Elgamal secret exponent x. + return 1; + case 'dsa': + // Algorithm-Specific Fields for DSA secret keys: + // - MPI of DSA secret exponent x. + return 1; + default: + throw new Error('Unknown algorithm'); + } + }, + + getPublicMpiCount: function getPublicMpiCount(algo) { + // - A series of multiprecision integers comprising the key material: + // Algorithm-Specific Fields for RSA public keys: + // - a multiprecision integer (MPI) of RSA public modulus n; + // - an MPI of RSA public encryption exponent e. + switch (algo) { + case 'rsa_encrypt': + case 'rsa_encrypt_sign': + case 'rsa_sign': + return 2; + + // Algorithm-Specific Fields for Elgamal public keys: + // - MPI of Elgamal prime p; + // - MPI of Elgamal group generator g; + // - MPI of Elgamal public key value y (= g**x mod p where x is secret). + case 'elgamal': + return 3; + + // Algorithm-Specific Fields for DSA public keys: + // - MPI of DSA prime p; + // - MPI of DSA group order q (q is a prime divisor of p-1); + // - MPI of DSA group generator g; + // - MPI of DSA public-key value y (= g**x mod p where x is secret). + case 'dsa': + return 4; + + default: + throw new Error('Unknown algorithm.'); + } + }, + + generateMpi: function generateMpi(algo, bits) { + switch (algo) { + case 'rsa_encrypt': + case 'rsa_encrypt_sign': + case 'rsa_sign': + //remember "publicKey" refers to the crypto/public_key dir + var rsa = new _public_key2.default.rsa(); + return rsa.generate(bits, "10001").then(function (keyObject) { + var output = []; + output.push(keyObject.n); + output.push(keyObject.ee); + output.push(keyObject.d); + output.push(keyObject.p); + output.push(keyObject.q); + output.push(keyObject.u); + return mapResult(output); + }); + default: + throw new Error('Unsupported algorithm for key generation.'); + } + + function mapResult(result) { + return result.map(function (bn) { + var mpi = new _mpi2.default(); + mpi.fromBigInteger(bn); + return mpi; + }); + } + }, + + /** + * generate random byte prefix as string for the specified algorithm + * @param {module:enums.symmetric} algo Algorithm to use (see {@link http://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2}) + * @return {Uint8Array} Random bytes with length equal to the block + * size of the cipher + */ + getPrefixRandom: function getPrefixRandom(algo) { + return _random2.default.getRandomBytes(_cipher2.default[algo].blockSize); + }, + + /** + * Generating a session key for the specified symmetric algorithm + * @param {module:enums.symmetric} algo Algorithm to use (see {@link http://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2}) + * @return {Uint8Array} Random bytes as a string to be used as a key + */ + generateSessionKey: function generateSessionKey(algo) { + return _random2.default.getRandomBytes(_cipher2.default[algo].keySize); + } +}; + +},{"../type/mpi.js":68,"./cipher":16,"./public_key":28,"./random.js":31}],19:[function(_dereq_,module,exports){ +// OpenPGP.js - An OpenPGP implementation in javascript +// Copyright (C) 2016 Tankred Hase +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @fileoverview This module wraps native AES-GCM en/decryption for both + * the WebCrypto api as well as node.js' crypto api. + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.ivLength = undefined; +exports.encrypt = encrypt; +exports.decrypt = decrypt; + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _config = _dereq_('../config'); + +var _config2 = _interopRequireDefault(_config); + +var _asmcryptoLite = _dereq_('asmcrypto-lite'); + +var _asmcryptoLite2 = _interopRequireDefault(_asmcryptoLite); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var webCrypto = _util2.default.getWebCrypto(); // no GCM support in IE11, Safari 9 +var nodeCrypto = _util2.default.getNodeCrypto(); +var Buffer = _util2.default.getNodeBuffer(); + +var ivLength = exports.ivLength = 12; // size of the IV in bytes +var TAG_LEN = 16; // size of the tag in bytes +var ALGO = 'AES-GCM'; + +/** + * Encrypt plaintext input. + * @param {String} cipher The symmetric cipher algorithm to use e.g. 'aes128' + * @param {Uint8Array} plaintext The cleartext input to be encrypted + * @param {Uint8Array} key The encryption key + * @param {Uint8Array} iv The initialization vector (12 bytes) + * @return {Promise} The ciphertext output + */ +function encrypt(cipher, plaintext, key, iv) { + if (cipher.substr(0, 3) !== 'aes') { + return Promise.reject(new Error('GCM mode supports only AES cipher')); + } + + if (webCrypto && _config2.default.use_native && key.length !== 24) { + // WebCrypto (no 192 bit support) see: https://www.chromium.org/blink/webcrypto#TOC-AES-support + return webEncrypt(plaintext, key, iv); + } else if (nodeCrypto && _config2.default.use_native) { + // Node crypto library + return nodeEncrypt(plaintext, key, iv); + } else { + // asm.js fallback + return Promise.resolve(_asmcryptoLite2.default.AES_GCM.encrypt(plaintext, key, iv)); + } +} + +/** + * Decrypt ciphertext input. + * @param {String} cipher The symmetric cipher algorithm to use e.g. 'aes128' + * @param {Uint8Array} ciphertext The ciphertext input to be decrypted + * @param {Uint8Array} key The encryption key + * @param {Uint8Array} iv The initialization vector (12 bytes) + * @return {Promise} The plaintext output + */ +function decrypt(cipher, ciphertext, key, iv) { + if (cipher.substr(0, 3) !== 'aes') { + return Promise.reject(new Error('GCM mode supports only AES cipher')); + } + + if (webCrypto && _config2.default.use_native && key.length !== 24) { + // WebCrypto (no 192 bit support) see: https://www.chromium.org/blink/webcrypto#TOC-AES-support + return webDecrypt(ciphertext, key, iv); + } else if (nodeCrypto && _config2.default.use_native) { + // Node crypto library + return nodeDecrypt(ciphertext, key, iv); + } else { + // asm.js fallback + return Promise.resolve(_asmcryptoLite2.default.AES_GCM.decrypt(ciphertext, key, iv)); + } +} + +////////////////////////// +// // +// Helper functions // +// // +////////////////////////// + + +function webEncrypt(pt, key, iv) { + return webCrypto.importKey('raw', key, { name: ALGO }, false, ['encrypt']).then(function (keyObj) { + return webCrypto.encrypt({ name: ALGO, iv: iv }, keyObj, pt); + }).then(function (ct) { + return new Uint8Array(ct); + }); +} + +function webDecrypt(ct, key, iv) { + return webCrypto.importKey('raw', key, { name: ALGO }, false, ['decrypt']).then(function (keyObj) { + return webCrypto.decrypt({ name: ALGO, iv: iv }, keyObj, ct); + }).then(function (pt) { + return new Uint8Array(pt); + }); +} + +function nodeEncrypt(pt, key, iv) { + pt = new Buffer(pt); + key = new Buffer(key); + iv = new Buffer(iv); + var en = new nodeCrypto.createCipheriv('aes-' + key.length * 8 + '-gcm', key, iv); + var ct = Buffer.concat([en.update(pt), en.final(), en.getAuthTag()]); // append auth tag to ciphertext + return Promise.resolve(new Uint8Array(ct)); +} + +function nodeDecrypt(ct, key, iv) { + ct = new Buffer(ct); + key = new Buffer(key); + iv = new Buffer(iv); + var de = new nodeCrypto.createDecipheriv('aes-' + key.length * 8 + '-gcm', key, iv); + de.setAuthTag(ct.slice(ct.length - TAG_LEN, ct.length)); // read auth tag at end of ciphertext + var pt = Buffer.concat([de.update(ct.slice(0, ct.length - TAG_LEN)), de.final()]); + return Promise.resolve(new Uint8Array(pt)); +} + +},{"../config":10,"../util.js":70,"asmcrypto-lite":1}],20:[function(_dereq_,module,exports){ +/** + * @requires crypto/hash/sha + * @requires crypto/hash/md5 + * @requires crypto/hash/ripe-md + * @requires util + * @module crypto/hash + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _sha = _dereq_('./sha.js'); + +var _sha2 = _interopRequireDefault(_sha); + +var _asmcryptoLite = _dereq_('asmcrypto-lite'); + +var _asmcryptoLite2 = _interopRequireDefault(_asmcryptoLite); + +var _rusha = _dereq_('rusha'); + +var _rusha2 = _interopRequireDefault(_rusha); + +var _md = _dereq_('./md5.js'); + +var _md2 = _interopRequireDefault(_md); + +var _ripeMd = _dereq_('./ripe-md.js'); + +var _ripeMd2 = _interopRequireDefault(_ripeMd); + +var _util = _dereq_('../../util.js'); + +var _util2 = _interopRequireDefault(_util); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var rusha = new _rusha2.default(), + nodeCrypto = _util2.default.getNodeCrypto(), + Buffer = _util2.default.getNodeBuffer(); + +function node_hash(type) { + return function (data) { + var shasum = nodeCrypto.createHash(type); + shasum.update(new Buffer(data)); + return new Uint8Array(shasum.digest()); + }; +} + +var hash_fns; +if (nodeCrypto) { + // Use Node native crypto for all hash functions + + hash_fns = { + md5: node_hash('md5'), + sha1: node_hash('sha1'), + sha224: node_hash('sha224'), + sha256: node_hash('sha256'), + sha384: node_hash('sha384'), + sha512: node_hash('sha512'), + ripemd: node_hash('ripemd160') + }; +} else { + // Use JS fallbacks + + hash_fns = { + /** @see module:crypto/hash/md5 */ + md5: _md2.default, + /** @see module:rusha */ + sha1: function sha1(data) { + return _util2.default.str2Uint8Array(_util2.default.hex2bin(rusha.digest(data))); + }, + /** @see module:crypto/hash/sha.sha224 */ + sha224: _sha2.default.sha224, + /** @see module:asmcrypto */ + sha256: _asmcryptoLite2.default.SHA256.bytes, + /** @see module:crypto/hash/sha.sha384 */ + sha384: _sha2.default.sha384, + /** @see module:crypto/hash/sha.sha512 */ + sha512: _sha2.default.sha512, + /** @see module:crypto/hash/ripe-md */ + ripemd: _ripeMd2.default + }; +} + +exports.default = { + + md5: hash_fns.md5, + sha1: hash_fns.sha1, + sha224: hash_fns.sha224, + sha256: hash_fns.sha256, + sha384: hash_fns.sha384, + sha512: hash_fns.sha512, + ripemd: hash_fns.ripemd, + + /** + * Create a hash on the specified data using the specified algorithm + * @param {module:enums.hash} algo Hash algorithm type (see {@link http://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4}) + * @param {Uint8Array} data Data to be hashed + * @return {Uint8Array} hash value + */ + digest: function digest(algo, data) { + switch (algo) { + case 1: + // - MD5 [HAC] + return this.md5(data); + case 2: + // - SHA-1 [FIPS180] + return this.sha1(data); + case 3: + // - RIPE-MD/160 [HAC] + return this.ripemd(data); + case 8: + // - SHA256 [FIPS180] + return this.sha256(data); + case 9: + // - SHA384 [FIPS180] + return this.sha384(data); + case 10: + // - SHA512 [FIPS180] + return this.sha512(data); + case 11: + // - SHA224 [FIPS180] + return this.sha224(data); + default: + throw new Error('Invalid hash function.'); + } + }, + + /** + * Returns the hash size in bytes of the specified hash algorithm type + * @param {module:enums.hash} algo Hash algorithm type (See {@link http://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4}) + * @return {Integer} Size in bytes of the resulting hash + */ + getHashByteLength: function getHashByteLength(algo) { + switch (algo) { + case 1: + // - MD5 [HAC] + return 16; + case 2: + // - SHA-1 [FIPS180] + case 3: + // - RIPE-MD/160 [HAC] + return 20; + case 8: + // - SHA256 [FIPS180] + return 32; + case 9: + // - SHA384 [FIPS180] + return 48; + case 10: + // - SHA512 [FIPS180] + return 64; + case 11: + // - SHA224 [FIPS180] + return 28; + default: + throw new Error('Invalid hash algorithm.'); + } + } +}; + +},{"../../util.js":70,"./md5.js":21,"./ripe-md.js":22,"./sha.js":23,"asmcrypto-lite":1,"rusha":4}],21:[function(_dereq_,module,exports){ +/** + * A fast MD5 JavaScript implementation + * Copyright (c) 2012 Joseph Myers + * http://www.myersdaily.org/joseph/javascript/md5-text.html + * + * Permission to use, copy, modify, and distribute this software + * and its documentation for any purposes and without + * fee is hereby granted provided that this copyright notice + * appears in all copies. + * + * Of course, this soft is provided "as is" without express or implied + * warranty of any kind. + */ + +/** + * @requires util + * @module crypto/hash/md5 + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports.default = function (entree) { + var hex = md5(_util2.default.Uint8Array2str(entree)); + var bin = _util2.default.str2Uint8Array(_util2.default.hex2bin(hex)); + return bin; +}; + +var _util = _dereq_('../../util.js'); + +var _util2 = _interopRequireDefault(_util); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function md5cycle(x, k) { + var a = x[0], + b = x[1], + c = x[2], + d = x[3]; + + a = ff(a, b, c, d, k[0], 7, -680876936); + d = ff(d, a, b, c, k[1], 12, -389564586); + c = ff(c, d, a, b, k[2], 17, 606105819); + b = ff(b, c, d, a, k[3], 22, -1044525330); + a = ff(a, b, c, d, k[4], 7, -176418897); + d = ff(d, a, b, c, k[5], 12, 1200080426); + c = ff(c, d, a, b, k[6], 17, -1473231341); + b = ff(b, c, d, a, k[7], 22, -45705983); + a = ff(a, b, c, d, k[8], 7, 1770035416); + d = ff(d, a, b, c, k[9], 12, -1958414417); + c = ff(c, d, a, b, k[10], 17, -42063); + b = ff(b, c, d, a, k[11], 22, -1990404162); + a = ff(a, b, c, d, k[12], 7, 1804603682); + d = ff(d, a, b, c, k[13], 12, -40341101); + c = ff(c, d, a, b, k[14], 17, -1502002290); + b = ff(b, c, d, a, k[15], 22, 1236535329); + + a = gg(a, b, c, d, k[1], 5, -165796510); + d = gg(d, a, b, c, k[6], 9, -1069501632); + c = gg(c, d, a, b, k[11], 14, 643717713); + b = gg(b, c, d, a, k[0], 20, -373897302); + a = gg(a, b, c, d, k[5], 5, -701558691); + d = gg(d, a, b, c, k[10], 9, 38016083); + c = gg(c, d, a, b, k[15], 14, -660478335); + b = gg(b, c, d, a, k[4], 20, -405537848); + a = gg(a, b, c, d, k[9], 5, 568446438); + d = gg(d, a, b, c, k[14], 9, -1019803690); + c = gg(c, d, a, b, k[3], 14, -187363961); + b = gg(b, c, d, a, k[8], 20, 1163531501); + a = gg(a, b, c, d, k[13], 5, -1444681467); + d = gg(d, a, b, c, k[2], 9, -51403784); + c = gg(c, d, a, b, k[7], 14, 1735328473); + b = gg(b, c, d, a, k[12], 20, -1926607734); + + a = hh(a, b, c, d, k[5], 4, -378558); + d = hh(d, a, b, c, k[8], 11, -2022574463); + c = hh(c, d, a, b, k[11], 16, 1839030562); + b = hh(b, c, d, a, k[14], 23, -35309556); + a = hh(a, b, c, d, k[1], 4, -1530992060); + d = hh(d, a, b, c, k[4], 11, 1272893353); + c = hh(c, d, a, b, k[7], 16, -155497632); + b = hh(b, c, d, a, k[10], 23, -1094730640); + a = hh(a, b, c, d, k[13], 4, 681279174); + d = hh(d, a, b, c, k[0], 11, -358537222); + c = hh(c, d, a, b, k[3], 16, -722521979); + b = hh(b, c, d, a, k[6], 23, 76029189); + a = hh(a, b, c, d, k[9], 4, -640364487); + d = hh(d, a, b, c, k[12], 11, -421815835); + c = hh(c, d, a, b, k[15], 16, 530742520); + b = hh(b, c, d, a, k[2], 23, -995338651); + + a = ii(a, b, c, d, k[0], 6, -198630844); + d = ii(d, a, b, c, k[7], 10, 1126891415); + c = ii(c, d, a, b, k[14], 15, -1416354905); + b = ii(b, c, d, a, k[5], 21, -57434055); + a = ii(a, b, c, d, k[12], 6, 1700485571); + d = ii(d, a, b, c, k[3], 10, -1894986606); + c = ii(c, d, a, b, k[10], 15, -1051523); + b = ii(b, c, d, a, k[1], 21, -2054922799); + a = ii(a, b, c, d, k[8], 6, 1873313359); + d = ii(d, a, b, c, k[15], 10, -30611744); + c = ii(c, d, a, b, k[6], 15, -1560198380); + b = ii(b, c, d, a, k[13], 21, 1309151649); + a = ii(a, b, c, d, k[4], 6, -145523070); + d = ii(d, a, b, c, k[11], 10, -1120210379); + c = ii(c, d, a, b, k[2], 15, 718787259); + b = ii(b, c, d, a, k[9], 21, -343485551); + + x[0] = add32(a, x[0]); + x[1] = add32(b, x[1]); + x[2] = add32(c, x[2]); + x[3] = add32(d, x[3]); +} + +/** + * MD5 hash + * @param {String} entree string to hash + */ + + +function cmn(q, a, b, x, s, t) { + a = add32(add32(a, q), add32(x, t)); + return add32(a << s | a >>> 32 - s, b); +} + +function ff(a, b, c, d, x, s, t) { + return cmn(b & c | ~b & d, a, b, x, s, t); +} + +function gg(a, b, c, d, x, s, t) { + return cmn(b & d | c & ~d, a, b, x, s, t); +} + +function hh(a, b, c, d, x, s, t) { + return cmn(b ^ c ^ d, a, b, x, s, t); +} + +function ii(a, b, c, d, x, s, t) { + return cmn(c ^ (b | ~d), a, b, x, s, t); +} + +function md51(s) { + var n = s.length, + state = [1732584193, -271733879, -1732584194, 271733878], + i; + for (i = 64; i <= s.length; i += 64) { + md5cycle(state, md5blk(s.substring(i - 64, i))); + } + s = s.substring(i - 64); + var tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + for (i = 0; i < s.length; i++) { + tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3); + } + tail[i >> 2] |= 0x80 << (i % 4 << 3); + if (i > 55) { + md5cycle(state, tail); + for (i = 0; i < 16; i++) { + tail[i] = 0; + } + } + tail[14] = n * 8; + md5cycle(state, tail); + return state; +} + +/* there needs to be support for Unicode here, + * unless we pretend that we can redefine the MD-5 + * algorithm for multi-byte characters (perhaps + * by adding every four 16-bit characters and + * shortening the sum to 32 bits). Otherwise + * I suggest performing MD-5 as if every character + * was two bytes--e.g., 0040 0025 = @%--but then + * how will an ordinary MD-5 sum be matched? + * There is no way to standardize text to something + * like UTF-8 before transformation; speed cost is + * utterly prohibitive. The JavaScript standard + * itself needs to look at this: it should start + * providing access to strings as preformed UTF-8 + * 8-bit unsigned value arrays. + */ +function md5blk(s) { + /* I figured global was faster. */ + var md5blks = [], + i; /* Andy King said do it this way. */ + for (i = 0; i < 64; i += 4) { + md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24); + } + return md5blks; +} + +var hex_chr = '0123456789abcdef'.split(''); + +function rhex(n) { + var s = '', + j = 0; + for (; j < 4; j++) { + s += hex_chr[n >> j * 8 + 4 & 0x0F] + hex_chr[n >> j * 8 & 0x0F]; + } + return s; +} + +function hex(x) { + for (var i = 0; i < x.length; i++) { + x[i] = rhex(x[i]); + } + return x.join(''); +} + +function md5(s) { + return hex(md51(s)); +} + +/* this function is much faster, +so if possible we use it. Some IEs +are the only ones I know of that +need the idiotic second function, +generated by an if clause. */ + +function add32(a, b) { + return a + b & 0xFFFFFFFF; +} + +},{"../../util.js":70}],22:[function(_dereq_,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = RMDstring; + +var _util = _dereq_("../../util.js"); + +var _util2 = _interopRequireDefault(_util); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var RMDsize = 160; /* + * CryptoMX Tools + * Copyright (C) 2004 - 2006 Derek Buitenhuis + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* Modified by Recurity Labs GmbH + */ + +/* Modified by ProtonTech AG + */ + +/** + * @requires util + * @module crypto/hash/ripe-md + */ + +var X = []; + +function ROL(x, n) { + return new Number(x << n | x >>> 32 - n); +} + +function F(x, y, z) { + return new Number(x ^ y ^ z); +} + +function G(x, y, z) { + return new Number(x & y | ~x & z); +} + +function H(x, y, z) { + return new Number((x | ~y) ^ z); +} + +function I(x, y, z) { + return new Number(x & z | y & ~z); +} + +function J(x, y, z) { + return new Number(x ^ (y | ~z)); +} + +function mixOneRound(a, b, c, d, e, x, s, roundNumber) { + switch (roundNumber) { + case 0: + a += F(b, c, d) + x + 0x00000000; + break; + case 1: + a += G(b, c, d) + x + 0x5a827999; + break; + case 2: + a += H(b, c, d) + x + 0x6ed9eba1; + break; + case 3: + a += I(b, c, d) + x + 0x8f1bbcdc; + break; + case 4: + a += J(b, c, d) + x + 0xa953fd4e; + break; + case 5: + a += J(b, c, d) + x + 0x50a28be6; + break; + case 6: + a += I(b, c, d) + x + 0x5c4dd124; + break; + case 7: + a += H(b, c, d) + x + 0x6d703ef3; + break; + case 8: + a += G(b, c, d) + x + 0x7a6d76e9; + break; + case 9: + a += F(b, c, d) + x + 0x00000000; + break; + + default: + throw new Error("Bogus round number"); + break; + } + + a = ROL(a, s) + e; + c = ROL(c, 10); + + a &= 0xffffffff; + b &= 0xffffffff; + c &= 0xffffffff; + d &= 0xffffffff; + e &= 0xffffffff; + + var retBlock = []; + retBlock[0] = a; + retBlock[1] = b; + retBlock[2] = c; + retBlock[3] = d; + retBlock[4] = e; + retBlock[5] = x; + retBlock[6] = s; + + return retBlock; +} + +function MDinit(MDbuf) { + MDbuf[0] = 0x67452301; + MDbuf[1] = 0xefcdab89; + MDbuf[2] = 0x98badcfe; + MDbuf[3] = 0x10325476; + MDbuf[4] = 0xc3d2e1f0; +} + +var ROLs = [[11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8], [7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12], [11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5], [11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12], [9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6], [8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6], [9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11], [9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5], [15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8], [8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]]; + +var indexes = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], [7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8], [3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12], [1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2], [4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13], [5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12], [6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2], [15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13], [8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14], [12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]]; + +function compress(MDbuf, X) { + var blockA = []; + var blockB = []; + + var retBlock; + + var i, j; + + for (i = 0; i < 5; i++) { + blockA[i] = new Number(MDbuf[i]); + blockB[i] = new Number(MDbuf[i]); + } + + var step = 0; + for (j = 0; j < 5; j++) { + for (i = 0; i < 16; i++) { + retBlock = mixOneRound(blockA[(step + 0) % 5], blockA[(step + 1) % 5], blockA[(step + 2) % 5], blockA[(step + 3) % 5], blockA[(step + 4) % 5], X[indexes[j][i]], ROLs[j][i], j); + + blockA[(step + 0) % 5] = retBlock[0]; + blockA[(step + 1) % 5] = retBlock[1]; + blockA[(step + 2) % 5] = retBlock[2]; + blockA[(step + 3) % 5] = retBlock[3]; + blockA[(step + 4) % 5] = retBlock[4]; + + step += 4; + } + } + + step = 0; + for (j = 5; j < 10; j++) { + for (i = 0; i < 16; i++) { + retBlock = mixOneRound(blockB[(step + 0) % 5], blockB[(step + 1) % 5], blockB[(step + 2) % 5], blockB[(step + 3) % 5], blockB[(step + 4) % 5], X[indexes[j][i]], ROLs[j][i], j); + + blockB[(step + 0) % 5] = retBlock[0]; + blockB[(step + 1) % 5] = retBlock[1]; + blockB[(step + 2) % 5] = retBlock[2]; + blockB[(step + 3) % 5] = retBlock[3]; + blockB[(step + 4) % 5] = retBlock[4]; + + step += 4; + } + } + + blockB[3] += blockA[2] + MDbuf[1]; + MDbuf[1] = MDbuf[2] + blockA[3] + blockB[4]; + MDbuf[2] = MDbuf[3] + blockA[4] + blockB[0]; + MDbuf[3] = MDbuf[4] + blockA[0] + blockB[1]; + MDbuf[4] = MDbuf[0] + blockA[1] + blockB[2]; + MDbuf[0] = blockB[3]; +} + +function zeroX(X) { + for (var i = 0; i < 16; i++) { + X[i] = 0; + } +} + +function MDfinish(MDbuf, strptr, lswlen, mswlen) { + var X = new Array(16); + zeroX(X); + + var j = 0; + for (var i = 0; i < (lswlen & 63); i++) { + X[i >>> 2] ^= (strptr.charCodeAt(j++) & 255) << 8 * (i & 3); + } + + X[lswlen >>> 2 & 15] ^= 1 << 8 * (lswlen & 3) + 7; + + if ((lswlen & 63) > 55) { + compress(MDbuf, X); + X = new Array(16); + zeroX(X); + } + + X[14] = lswlen << 3; + X[15] = lswlen >>> 29 | mswlen << 3; + + compress(MDbuf, X); +} + +function BYTES_TO_DWORD(fourChars) { + var tmp = (fourChars.charCodeAt(3) & 255) << 24; + tmp |= (fourChars.charCodeAt(2) & 255) << 16; + tmp |= (fourChars.charCodeAt(1) & 255) << 8; + tmp |= fourChars.charCodeAt(0) & 255; + + return tmp; +} + +function RMD(message) { + var MDbuf = new Array(RMDsize / 32); + var hashcode = new Array(RMDsize / 8); + var length; + var nbytes; + + MDinit(MDbuf); + length = message.length; + + var X = new Array(16); + zeroX(X); + + var i, + j = 0; + for (nbytes = length; nbytes > 63; nbytes -= 64) { + for (i = 0; i < 16; i++) { + X[i] = BYTES_TO_DWORD(message.substr(j, 4)); + j += 4; + } + compress(MDbuf, X); + } + + MDfinish(MDbuf, message.substr(j), length, 0); + + for (i = 0; i < RMDsize / 8; i += 4) { + hashcode[i] = MDbuf[i >>> 2] & 255; + hashcode[i + 1] = MDbuf[i >>> 2] >>> 8 & 255; + hashcode[i + 2] = MDbuf[i >>> 2] >>> 16 & 255; + hashcode[i + 3] = MDbuf[i >>> 2] >>> 24 & 255; + } + + return hashcode; +} + +function RMDstring(message) { + var hashcode = RMD(_util2.default.Uint8Array2str(message)); + var retString = ""; + + for (var i = 0; i < RMDsize / 8; i++) { + retString += String.fromCharCode(hashcode[i]); + } + + return _util2.default.str2Uint8Array(retString); +} + +},{"../../util.js":70}],23:[function(_dereq_,module,exports){ +/** + * @preserve A JavaScript implementation of the SHA family of hashes, as + * defined in FIPS PUB 180-2 as well as the corresponding HMAC implementation + * as defined in FIPS PUB 198a + * + * Copyright Brian Turek 2008-2015 + * Distributed under the BSD License + * See http://caligatio.github.com/jsSHA/ for more information + * + * Several functions taken from Paul Johnston + */ + +/** + * SUPPORTED_ALGS is the stub for a compile flag that will cause pruning of + * functions that are not needed when a limited number of SHA families are + * selected + * + * @define {number} ORed value of SHA variants to be supported + * 1 = SHA-1, 2 = SHA-224/SHA-256, 4 = SHA-384/SHA-512 + */ + +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var SUPPORTED_ALGS = 4 | 2 | 1; + +/** + * Int_64 is a object for 2 32-bit numbers emulating a 64-bit number + * + * @private + * @constructor + * @this {Int_64} + * @param {number} msint_32 The most significant 32-bits of a 64-bit number + * @param {number} lsint_32 The least significant 32-bits of a 64-bit number + */ +function Int_64(msint_32, lsint_32) { + this.highOrder = msint_32; + this.lowOrder = lsint_32; +} + +/** + * Convert a string to an array of big-endian words + * + * @private + * @param {string} str String to be converted to binary representation + * @param {string} utfType The Unicode type, UTF8 or UTF16BE, UTF16LE, to + * use to encode the source string + * @return {{value : Array., binLen : number}} Hash list where + * "value" contains the output number array and "binLen" is the binary + * length of "value" + */ +function str2binb(str, utfType) { + var bin = [], + codePnt, + binArr = [], + byteCnt = 0, + i, + j, + offset; + + if ("UTF8" === utfType) { + for (i = 0; i < str.length; i += 1) { + codePnt = str.charCodeAt(i); + binArr = []; + + if (0x80 > codePnt) { + binArr.push(codePnt); + } else if (0x800 > codePnt) { + binArr.push(0xC0 | codePnt >>> 6); + binArr.push(0x80 | codePnt & 0x3F); + } else if (0xd800 > codePnt || 0xe000 <= codePnt) { + binArr.push(0xe0 | codePnt >>> 12, 0x80 | codePnt >>> 6 & 0x3f, 0x80 | codePnt & 0x3f); + } else { + i += 1; + codePnt = 0x10000 + ((codePnt & 0x3ff) << 10 | str.charCodeAt(i) & 0x3ff); + binArr.push(0xf0 | codePnt >>> 18, 0x80 | codePnt >>> 12 & 0x3f, 0x80 | codePnt >>> 6 & 0x3f, 0x80 | codePnt & 0x3f); + } + + for (j = 0; j < binArr.length; j += 1) { + offset = byteCnt >>> 2; + while (bin.length <= offset) { + bin.push(0); + } + bin[offset] |= binArr[j] << 24 - 8 * (byteCnt % 4); + byteCnt += 1; + } + } + } else if ("UTF16BE" === utfType || "UTF16LE" === utfType) { + for (i = 0; i < str.length; i += 1) { + codePnt = str.charCodeAt(i); + /* Internally strings are UTF-16BE so only change if UTF-16LE */ + if ("UTF16LE" === utfType) { + j = codePnt & 0xFF; + codePnt = j << 8 | codePnt >> 8; + } + + offset = byteCnt >>> 2; + while (bin.length <= offset) { + bin.push(0); + } + bin[offset] |= codePnt << 16 - 8 * (byteCnt % 4); + byteCnt += 2; + } + } + return { "value": bin, "binLen": byteCnt * 8 }; +} + +/** + * Convert a hex string to an array of big-endian words + * + * @private + * @param {string} str String to be converted to binary representation + * @return {{value : Array., binLen : number}} Hash list where + * "value" contains the output number array and "binLen" is the binary + * length of "value" + */ +function hex2binb(str) { + var bin = [], + length = str.length, + i, + num, + offset; + + if (0 !== length % 2) { + throw "String of HEX type must be in byte increments"; + } + + for (i = 0; i < length; i += 2) { + num = parseInt(str.substr(i, 2), 16); + if (!isNaN(num)) { + offset = i >>> 3; + while (bin.length <= offset) { + bin.push(0); + } + bin[i >>> 3] |= num << 24 - 4 * (i % 8); + } else { + throw "String of HEX type contains invalid characters"; + } + } + + return { "value": bin, "binLen": length * 4 }; +} + +/** + * Convert a string of raw bytes to an array of big-endian words + * + * @private + * @param {string} str String of raw bytes to be converted to binary representation + * @return {{value : Array., binLen : number}} Hash list where + * "value" contains the output number array and "binLen" is the binary + * length of "value" + */ +function bytes2binb(str) { + var bin = [], + codePnt, + i, + offset; + + for (i = 0; i < str.length; i += 1) { + codePnt = str.charCodeAt(i); + + offset = i >>> 2; + if (bin.length <= offset) { + bin.push(0); + } + bin[offset] |= codePnt << 24 - 8 * (i % 4); + } + + return { "value": bin, "binLen": str.length * 8 }; +} + +/** + * Convert a Uint8Array of raw bytes to an array of big-endian 32-bit words + * + * @private + * @param {Uint8Array} str String of raw bytes to be converted to binary representation + * @return {{value : Array., binLen : number}} Hash list where + * "value" contains the output array and "binLen" is the binary + * length of "value" + */ +function typed2binb(array) { + + var bin = [], + octet, + i, + offset; + + for (i = 0; i < array.length; i += 1) { + octet = array[i]; + + offset = i >>> 2; + if (bin.length <= offset) { + bin.push(0); + } + bin[offset] |= octet << 24 - 8 * (i % 4); + } + + return { "value": bin, "binLen": array.length * 8 }; +} + +/** + * Convert a base-64 string to an array of big-endian words + * + * @private + * @param {string} str String to be converted to binary representation + * @return {{value : Array., binLen : number}} Hash list where + * "value" contains the output number array and "binLen" is the binary + * length of "value" + */ +function b642binb(str) { + var retVal = [], + byteCnt = 0, + index, + i, + j, + tmpInt, + strPart, + firstEqual, + offset, + b64Tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + if (-1 === str.search(/^[a-zA-Z0-9=+\/]+$/)) { + throw "Invalid character in base-64 string"; + } + firstEqual = str.indexOf('='); + str = str.replace(/\=/g, ''); + if (-1 !== firstEqual && firstEqual < str.length) { + throw "Invalid '=' found in base-64 string"; + } + + for (i = 0; i < str.length; i += 4) { + strPart = str.substr(i, 4); + tmpInt = 0; + + for (j = 0; j < strPart.length; j += 1) { + index = b64Tab.indexOf(strPart[j]); + tmpInt |= index << 18 - 6 * j; + } + + for (j = 0; j < strPart.length - 1; j += 1) { + offset = byteCnt >>> 2; + while (retVal.length <= offset) { + retVal.push(0); + } + retVal[offset] |= (tmpInt >>> 16 - j * 8 & 0xFF) << 24 - 8 * (byteCnt % 4); + byteCnt += 1; + } + } + + return { "value": retVal, "binLen": byteCnt * 8 }; +} + +/** + * Convert an array of big-endian words to a hex string. + * + * @private + * @param {Array.} binarray Array of integers to be converted to + * hexidecimal representation + * @param {{outputUpper : boolean, b64Pad : string}} formatOpts Hash list + * containing validated output formatting options + * @return {string} Hexidecimal representation of the parameter in string + * form + */ +function binb2hex(binarray, formatOpts) { + var hex_tab = "0123456789abcdef", + str = "", + length = binarray.length * 4, + i, + srcByte; + + for (i = 0; i < length; i += 1) { + /* The below is more than a byte but it gets taken care of later */ + srcByte = binarray[i >>> 2] >>> (3 - i % 4) * 8; + str += hex_tab.charAt(srcByte >>> 4 & 0xF) + hex_tab.charAt(srcByte & 0xF); + } + + return formatOpts["outputUpper"] ? str.toUpperCase() : str; +} + +/** + * Convert an array of big-endian words to a base-64 string + * + * @private + * @param {Array.} binarray Array of integers to be converted to + * base-64 representation + * @param {{outputUpper : boolean, b64Pad : string}} formatOpts Hash list + * containing validated output formatting options + * @return {string} Base-64 encoded representation of the parameter in + * string form + */ +function binb2b64(binarray, formatOpts) { + var str = "", + length = binarray.length * 4, + i, + j, + triplet, + offset, + int1, + int2, + b64Tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + for (i = 0; i < length; i += 3) { + offset = i + 1 >>> 2; + int1 = binarray.length <= offset ? 0 : binarray[offset]; + offset = i + 2 >>> 2; + int2 = binarray.length <= offset ? 0 : binarray[offset]; + triplet = (binarray[i >>> 2] >>> 8 * (3 - i % 4) & 0xFF) << 16 | (int1 >>> 8 * (3 - (i + 1) % 4) & 0xFF) << 8 | int2 >>> 8 * (3 - (i + 2) % 4) & 0xFF; + for (j = 0; j < 4; j += 1) { + if (i * 8 + j * 6 <= binarray.length * 32) { + str += b64Tab.charAt(triplet >>> 6 * (3 - j) & 0x3F); + } else { + str += formatOpts["b64Pad"]; + } + } + } + return str; +} + +/** + * Convert an array of big-endian words to raw bytes string + * + * @private + * @param {Array.} binarray Array of integers to be converted to + * a raw bytes string representation + * @param {!Object} formatOpts Unused Hash list + * @return {string} Raw bytes representation of the parameter in string + * form + */ +function binb2bytes(binarray, formatOpts) { + var str = "", + length = binarray.length * 4, + i, + srcByte; + + for (i = 0; i < length; i += 1) { + srcByte = binarray[i >>> 2] >>> (3 - i % 4) * 8 & 0xFF; + str += String.fromCharCode(srcByte); + } + + return str; +} + +/** + * Convert an array of big-endian words to raw bytes Uint8Array + * + * @private + * @param {Array.} binarray Array of integers to be converted to + * a raw bytes string representation + * @param {!Object} formatOpts Unused Hash list + * @return {Uint8Array} Raw bytes representation of the parameter + */ +function binb2typed(binarray, formatOpts) { + var length = binarray.length * 4; + var arr = new Uint8Array(length), + i; + + for (i = 0; i < length; i += 1) { + arr[i] = binarray[i >>> 2] >>> (3 - i % 4) * 8 & 0xFF; + } + + return arr; +} + +/** + * Validate hash list containing output formatting options, ensuring + * presence of every option or adding the default value + * + * @private + * @param {{outputUpper : boolean, b64Pad : string}|undefined} outputOpts + * Hash list of output formatting options + * @return {{outputUpper : boolean, b64Pad : string}} Validated hash list + * containing output formatting options + */ +function getOutputOpts(outputOpts) { + var retVal = { "outputUpper": false, "b64Pad": "=" }; + + try { + if (outputOpts.hasOwnProperty("outputUpper")) { + retVal["outputUpper"] = outputOpts["outputUpper"]; + } + + if (outputOpts.hasOwnProperty("b64Pad")) { + retVal["b64Pad"] = outputOpts["b64Pad"]; + } + } catch (ignore) {} + + if ("boolean" !== typeof retVal["outputUpper"]) { + throw "Invalid outputUpper formatting option"; + } + + if ("string" !== typeof retVal["b64Pad"]) { + throw "Invalid b64Pad formatting option"; + } + + return retVal; +} + +/** + * The 32-bit implementation of circular rotate left + * + * @private + * @param {number} x The 32-bit integer argument + * @param {number} n The number of bits to shift + * @return {number} The x shifted circularly by n bits + */ +function rotl_32(x, n) { + return x << n | x >>> 32 - n; +} + +/** + * The 32-bit implementation of circular rotate right + * + * @private + * @param {number} x The 32-bit integer argument + * @param {number} n The number of bits to shift + * @return {number} The x shifted circularly by n bits + */ +function rotr_32(x, n) { + return x >>> n | x << 32 - n; +} + +/** + * The 64-bit implementation of circular rotate right + * + * @private + * @param {Int_64} x The 64-bit integer argument + * @param {number} n The number of bits to shift + * @return {Int_64} The x shifted circularly by n bits + */ +function rotr_64(x, n) { + var retVal = null, + tmp = new Int_64(x.highOrder, x.lowOrder); + + if (32 >= n) { + retVal = new Int_64(tmp.highOrder >>> n | tmp.lowOrder << 32 - n & 0xFFFFFFFF, tmp.lowOrder >>> n | tmp.highOrder << 32 - n & 0xFFFFFFFF); + } else { + retVal = new Int_64(tmp.lowOrder >>> n - 32 | tmp.highOrder << 64 - n & 0xFFFFFFFF, tmp.highOrder >>> n - 32 | tmp.lowOrder << 64 - n & 0xFFFFFFFF); + } + + return retVal; +} + +/** + * The 32-bit implementation of shift right + * + * @private + * @param {number} x The 32-bit integer argument + * @param {number} n The number of bits to shift + * @return {number} The x shifted by n bits + */ +function shr_32(x, n) { + return x >>> n; +} + +/** + * The 64-bit implementation of shift right + * + * @private + * @param {Int_64} x The 64-bit integer argument + * @param {number} n The number of bits to shift + * @return {Int_64} The x shifted by n bits + */ +function shr_64(x, n) { + var retVal = null; + + if (32 >= n) { + retVal = new Int_64(x.highOrder >>> n, x.lowOrder >>> n | x.highOrder << 32 - n & 0xFFFFFFFF); + } else { + retVal = new Int_64(0, x.highOrder >>> n - 32); + } + + return retVal; +} + +/** + * The 32-bit implementation of the NIST specified Parity function + * + * @private + * @param {number} x The first 32-bit integer argument + * @param {number} y The second 32-bit integer argument + * @param {number} z The third 32-bit integer argument + * @return {number} The NIST specified output of the function + */ +function parity_32(x, y, z) { + return x ^ y ^ z; +} + +/** + * The 32-bit implementation of the NIST specified Ch function + * + * @private + * @param {number} x The first 32-bit integer argument + * @param {number} y The second 32-bit integer argument + * @param {number} z The third 32-bit integer argument + * @return {number} The NIST specified output of the function + */ +function ch_32(x, y, z) { + return x & y ^ ~x & z; +} + +/** + * The 64-bit implementation of the NIST specified Ch function + * + * @private + * @param {Int_64} x The first 64-bit integer argument + * @param {Int_64} y The second 64-bit integer argument + * @param {Int_64} z The third 64-bit integer argument + * @return {Int_64} The NIST specified output of the function + */ +function ch_64(x, y, z) { + return new Int_64(x.highOrder & y.highOrder ^ ~x.highOrder & z.highOrder, x.lowOrder & y.lowOrder ^ ~x.lowOrder & z.lowOrder); +} + +/** + * The 32-bit implementation of the NIST specified Maj function + * + * @private + * @param {number} x The first 32-bit integer argument + * @param {number} y The second 32-bit integer argument + * @param {number} z The third 32-bit integer argument + * @return {number} The NIST specified output of the function + */ +function maj_32(x, y, z) { + return x & y ^ x & z ^ y & z; +} + +/** + * The 64-bit implementation of the NIST specified Maj function + * + * @private + * @param {Int_64} x The first 64-bit integer argument + * @param {Int_64} y The second 64-bit integer argument + * @param {Int_64} z The third 64-bit integer argument + * @return {Int_64} The NIST specified output of the function + */ +function maj_64(x, y, z) { + return new Int_64(x.highOrder & y.highOrder ^ x.highOrder & z.highOrder ^ y.highOrder & z.highOrder, x.lowOrder & y.lowOrder ^ x.lowOrder & z.lowOrder ^ y.lowOrder & z.lowOrder); +} + +/** + * The 32-bit implementation of the NIST specified Sigma0 function + * + * @private + * @param {number} x The 32-bit integer argument + * @return {number} The NIST specified output of the function + */ +function sigma0_32(x) { + return rotr_32(x, 2) ^ rotr_32(x, 13) ^ rotr_32(x, 22); +} + +/** + * The 64-bit implementation of the NIST specified Sigma0 function + * + * @private + * @param {Int_64} x The 64-bit integer argument + * @return {Int_64} The NIST specified output of the function + */ +function sigma0_64(x) { + var rotr28 = rotr_64(x, 28), + rotr34 = rotr_64(x, 34), + rotr39 = rotr_64(x, 39); + + return new Int_64(rotr28.highOrder ^ rotr34.highOrder ^ rotr39.highOrder, rotr28.lowOrder ^ rotr34.lowOrder ^ rotr39.lowOrder); +} + +/** + * The 32-bit implementation of the NIST specified Sigma1 function + * + * @private + * @param {number} x The 32-bit integer argument + * @return {number} The NIST specified output of the function + */ +function sigma1_32(x) { + return rotr_32(x, 6) ^ rotr_32(x, 11) ^ rotr_32(x, 25); +} + +/** + * The 64-bit implementation of the NIST specified Sigma1 function + * + * @private + * @param {Int_64} x The 64-bit integer argument + * @return {Int_64} The NIST specified output of the function + */ +function sigma1_64(x) { + var rotr14 = rotr_64(x, 14), + rotr18 = rotr_64(x, 18), + rotr41 = rotr_64(x, 41); + + return new Int_64(rotr14.highOrder ^ rotr18.highOrder ^ rotr41.highOrder, rotr14.lowOrder ^ rotr18.lowOrder ^ rotr41.lowOrder); +} + +/** + * The 32-bit implementation of the NIST specified Gamma0 function + * + * @private + * @param {number} x The 32-bit integer argument + * @return {number} The NIST specified output of the function + */ +function gamma0_32(x) { + return rotr_32(x, 7) ^ rotr_32(x, 18) ^ shr_32(x, 3); +} + +/** + * The 64-bit implementation of the NIST specified Gamma0 function + * + * @private + * @param {Int_64} x The 64-bit integer argument + * @return {Int_64} The NIST specified output of the function + */ +function gamma0_64(x) { + var rotr1 = rotr_64(x, 1), + rotr8 = rotr_64(x, 8), + shr7 = shr_64(x, 7); + + return new Int_64(rotr1.highOrder ^ rotr8.highOrder ^ shr7.highOrder, rotr1.lowOrder ^ rotr8.lowOrder ^ shr7.lowOrder); +} + +/** + * The 32-bit implementation of the NIST specified Gamma1 function + * + * @private + * @param {number} x The 32-bit integer argument + * @return {number} The NIST specified output of the function + */ +function gamma1_32(x) { + return rotr_32(x, 17) ^ rotr_32(x, 19) ^ shr_32(x, 10); +} + +/** + * The 64-bit implementation of the NIST specified Gamma1 function + * + * @private + * @param {Int_64} x The 64-bit integer argument + * @return {Int_64} The NIST specified output of the function + */ +function gamma1_64(x) { + var rotr19 = rotr_64(x, 19), + rotr61 = rotr_64(x, 61), + shr6 = shr_64(x, 6); + + return new Int_64(rotr19.highOrder ^ rotr61.highOrder ^ shr6.highOrder, rotr19.lowOrder ^ rotr61.lowOrder ^ shr6.lowOrder); +} + +/** + * Add two 32-bit integers, wrapping at 2^32. This uses 16-bit operations + * internally to work around bugs in some JS interpreters. + * + * @private + * @param {number} a The first 32-bit integer argument to be added + * @param {number} b The second 32-bit integer argument to be added + * @return {number} The sum of a + b + */ +function safeAdd_32_2(a, b) { + var lsw = (a & 0xFFFF) + (b & 0xFFFF), + msw = (a >>> 16) + (b >>> 16) + (lsw >>> 16); + + return (msw & 0xFFFF) << 16 | lsw & 0xFFFF; +} + +/** + * Add four 32-bit integers, wrapping at 2^32. This uses 16-bit operations + * internally to work around bugs in some JS interpreters. + * + * @private + * @param {number} a The first 32-bit integer argument to be added + * @param {number} b The second 32-bit integer argument to be added + * @param {number} c The third 32-bit integer argument to be added + * @param {number} d The fourth 32-bit integer argument to be added + * @return {number} The sum of a + b + c + d + */ +function safeAdd_32_4(a, b, c, d) { + var lsw = (a & 0xFFFF) + (b & 0xFFFF) + (c & 0xFFFF) + (d & 0xFFFF), + msw = (a >>> 16) + (b >>> 16) + (c >>> 16) + (d >>> 16) + (lsw >>> 16); + + return (msw & 0xFFFF) << 16 | lsw & 0xFFFF; +} + +/** + * Add five 32-bit integers, wrapping at 2^32. This uses 16-bit operations + * internally to work around bugs in some JS interpreters. + * + * @private + * @param {number} a The first 32-bit integer argument to be added + * @param {number} b The second 32-bit integer argument to be added + * @param {number} c The third 32-bit integer argument to be added + * @param {number} d The fourth 32-bit integer argument to be added + * @param {number} e The fifth 32-bit integer argument to be added + * @return {number} The sum of a + b + c + d + e + */ +function safeAdd_32_5(a, b, c, d, e) { + var lsw = (a & 0xFFFF) + (b & 0xFFFF) + (c & 0xFFFF) + (d & 0xFFFF) + (e & 0xFFFF), + msw = (a >>> 16) + (b >>> 16) + (c >>> 16) + (d >>> 16) + (e >>> 16) + (lsw >>> 16); + + return (msw & 0xFFFF) << 16 | lsw & 0xFFFF; +} + +/** + * Add two 64-bit integers, wrapping at 2^64. This uses 16-bit operations + * internally to work around bugs in some JS interpreters. + * + * @private + * @param {Int_64} x The first 64-bit integer argument to be added + * @param {Int_64} y The second 64-bit integer argument to be added + * @return {Int_64} The sum of x + y + */ +function safeAdd_64_2(x, y) { + var lsw, msw, lowOrder, highOrder; + + lsw = (x.lowOrder & 0xFFFF) + (y.lowOrder & 0xFFFF); + msw = (x.lowOrder >>> 16) + (y.lowOrder >>> 16) + (lsw >>> 16); + lowOrder = (msw & 0xFFFF) << 16 | lsw & 0xFFFF; + + lsw = (x.highOrder & 0xFFFF) + (y.highOrder & 0xFFFF) + (msw >>> 16); + msw = (x.highOrder >>> 16) + (y.highOrder >>> 16) + (lsw >>> 16); + highOrder = (msw & 0xFFFF) << 16 | lsw & 0xFFFF; + + return new Int_64(highOrder, lowOrder); +} + +/** + * Add four 64-bit integers, wrapping at 2^64. This uses 16-bit operations + * internally to work around bugs in some JS interpreters. + * + * @private + * @param {Int_64} a The first 64-bit integer argument to be added + * @param {Int_64} b The second 64-bit integer argument to be added + * @param {Int_64} c The third 64-bit integer argument to be added + * @param {Int_64} d The fouth 64-bit integer argument to be added + * @return {Int_64} The sum of a + b + c + d + */ +function safeAdd_64_4(a, b, c, d) { + var lsw, msw, lowOrder, highOrder; + + lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF); + msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (lsw >>> 16); + lowOrder = (msw & 0xFFFF) << 16 | lsw & 0xFFFF; + + lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + (msw >>> 16); + msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + (c.highOrder >>> 16) + (d.highOrder >>> 16) + (lsw >>> 16); + highOrder = (msw & 0xFFFF) << 16 | lsw & 0xFFFF; + + return new Int_64(highOrder, lowOrder); +} + +/** + * Add five 64-bit integers, wrapping at 2^64. This uses 16-bit operations + * internally to work around bugs in some JS interpreters. + * + * @private + * @param {Int_64} a The first 64-bit integer argument to be added + * @param {Int_64} b The second 64-bit integer argument to be added + * @param {Int_64} c The third 64-bit integer argument to be added + * @param {Int_64} d The fouth 64-bit integer argument to be added + * @param {Int_64} e The fouth 64-bit integer argument to be added + * @return {Int_64} The sum of a + b + c + d + e + */ +function safeAdd_64_5(a, b, c, d, e) { + var lsw, msw, lowOrder, highOrder; + + lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF) + (e.lowOrder & 0xFFFF); + msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (e.lowOrder >>> 16) + (lsw >>> 16); + lowOrder = (msw & 0xFFFF) << 16 | lsw & 0xFFFF; + + lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + (e.highOrder & 0xFFFF) + (msw >>> 16); + msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + (c.highOrder >>> 16) + (d.highOrder >>> 16) + (e.highOrder >>> 16) + (lsw >>> 16); + highOrder = (msw & 0xFFFF) << 16 | lsw & 0xFFFF; + + return new Int_64(highOrder, lowOrder); +} + +/** + * Calculates the SHA-1 hash of the string set at instantiation + * + * @private + * @param {Array.} message The binary array representation of the + * string to hash + * @param {number} messageLen The number of bits in the message + * @return {Array.} The array of integers representing the SHA-1 + * hash of message + */ +function coreSHA1(message, messageLen) { + var W = [], + a, + b, + c, + d, + e, + T, + ch = ch_32, + parity = parity_32, + maj = maj_32, + rotl = rotl_32, + safeAdd_2 = safeAdd_32_2, + i, + t, + safeAdd_5 = safeAdd_32_5, + appendedMessageLength, + offset, + H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; + + offset = (messageLen + 65 >>> 9 << 4) + 15; + while (message.length <= offset) { + message.push(0); + } + /* Append '1' at the end of the binary string */ + message[messageLen >>> 5] |= 0x80 << 24 - messageLen % 32; + /* Append length of binary string in the position such that the new + length is a multiple of 512. Logic does not work for even multiples + of 512 but there can never be even multiples of 512 */ + message[offset] = messageLen; + + appendedMessageLength = message.length; + + for (i = 0; i < appendedMessageLength; i += 16) { + a = H[0]; + b = H[1]; + c = H[2]; + d = H[3]; + e = H[4]; + + for (t = 0; t < 80; t += 1) { + if (t < 16) { + W[t] = message[t + i]; + } else { + W[t] = rotl(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1); + } + + if (t < 20) { + T = safeAdd_5(rotl(a, 5), ch(b, c, d), e, 0x5a827999, W[t]); + } else if (t < 40) { + T = safeAdd_5(rotl(a, 5), parity(b, c, d), e, 0x6ed9eba1, W[t]); + } else if (t < 60) { + T = safeAdd_5(rotl(a, 5), maj(b, c, d), e, 0x8f1bbcdc, W[t]); + } else { + T = safeAdd_5(rotl(a, 5), parity(b, c, d), e, 0xca62c1d6, W[t]); + } + + e = d; + d = c; + c = rotl(b, 30); + b = a; + a = T; + } + + H[0] = safeAdd_2(a, H[0]); + H[1] = safeAdd_2(b, H[1]); + H[2] = safeAdd_2(c, H[2]); + H[3] = safeAdd_2(d, H[3]); + H[4] = safeAdd_2(e, H[4]); + } + + return H; +} + +/** + * Calculates the desired SHA-2 hash of the string set at instantiation + * + * @private + * @param {Array.} message The binary array representation of the + * string to hash + * @param {number} messageLen The number of bits in message + * @param {string} variant The desired SHA-2 variant + * @return {Array.} The array of integers representing the SHA-2 + * hash of message + */ +function coreSHA2(message, messageLen, variant) { + var a, + b, + c, + d, + e, + f, + g, + h, + T1, + T2, + H, + numRounds, + lengthPosition, + i, + t, + binaryStringInc, + binaryStringMult, + safeAdd_2, + safeAdd_4, + safeAdd_5, + gamma0, + gamma1, + sigma0, + sigma1, + ch, + maj, + Int, + W = [], + int1, + int2, + offset, + appendedMessageLength, + retVal, + K = [0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2], + H_trunc = [0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4], + H_full = [0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19]; + + /* Set up the various function handles and variable for the specific + * variant */ + if ((variant === "SHA-224" || variant === "SHA-256") && 2 & SUPPORTED_ALGS) { + /* 32-bit variant */ + numRounds = 64; + lengthPosition = (messageLen + 65 >>> 9 << 4) + 15; + binaryStringInc = 16; + binaryStringMult = 1; + Int = Number; + safeAdd_2 = safeAdd_32_2; + safeAdd_4 = safeAdd_32_4; + safeAdd_5 = safeAdd_32_5; + gamma0 = gamma0_32; + gamma1 = gamma1_32; + sigma0 = sigma0_32; + sigma1 = sigma1_32; + maj = maj_32; + ch = ch_32; + + if ("SHA-224" === variant) { + H = H_trunc; + } else /* "SHA-256" === variant */ + { + H = H_full; + } + } else if ((variant === "SHA-384" || variant === "SHA-512") && 4 & SUPPORTED_ALGS) { + /* 64-bit variant */ + numRounds = 80; + lengthPosition = (messageLen + 128 >>> 10 << 5) + 31; + binaryStringInc = 32; + binaryStringMult = 2; + Int = Int_64; + safeAdd_2 = safeAdd_64_2; + safeAdd_4 = safeAdd_64_4; + safeAdd_5 = safeAdd_64_5; + gamma0 = gamma0_64; + gamma1 = gamma1_64; + sigma0 = sigma0_64; + sigma1 = sigma1_64; + maj = maj_64; + ch = ch_64; + + K = [new Int(K[0], 0xd728ae22), new Int(K[1], 0x23ef65cd), new Int(K[2], 0xec4d3b2f), new Int(K[3], 0x8189dbbc), new Int(K[4], 0xf348b538), new Int(K[5], 0xb605d019), new Int(K[6], 0xaf194f9b), new Int(K[7], 0xda6d8118), new Int(K[8], 0xa3030242), new Int(K[9], 0x45706fbe), new Int(K[10], 0x4ee4b28c), new Int(K[11], 0xd5ffb4e2), new Int(K[12], 0xf27b896f), new Int(K[13], 0x3b1696b1), new Int(K[14], 0x25c71235), new Int(K[15], 0xcf692694), new Int(K[16], 0x9ef14ad2), new Int(K[17], 0x384f25e3), new Int(K[18], 0x8b8cd5b5), new Int(K[19], 0x77ac9c65), new Int(K[20], 0x592b0275), new Int(K[21], 0x6ea6e483), new Int(K[22], 0xbd41fbd4), new Int(K[23], 0x831153b5), new Int(K[24], 0xee66dfab), new Int(K[25], 0x2db43210), new Int(K[26], 0x98fb213f), new Int(K[27], 0xbeef0ee4), new Int(K[28], 0x3da88fc2), new Int(K[29], 0x930aa725), new Int(K[30], 0xe003826f), new Int(K[31], 0x0a0e6e70), new Int(K[32], 0x46d22ffc), new Int(K[33], 0x5c26c926), new Int(K[34], 0x5ac42aed), new Int(K[35], 0x9d95b3df), new Int(K[36], 0x8baf63de), new Int(K[37], 0x3c77b2a8), new Int(K[38], 0x47edaee6), new Int(K[39], 0x1482353b), new Int(K[40], 0x4cf10364), new Int(K[41], 0xbc423001), new Int(K[42], 0xd0f89791), new Int(K[43], 0x0654be30), new Int(K[44], 0xd6ef5218), new Int(K[45], 0x5565a910), new Int(K[46], 0x5771202a), new Int(K[47], 0x32bbd1b8), new Int(K[48], 0xb8d2d0c8), new Int(K[49], 0x5141ab53), new Int(K[50], 0xdf8eeb99), new Int(K[51], 0xe19b48a8), new Int(K[52], 0xc5c95a63), new Int(K[53], 0xe3418acb), new Int(K[54], 0x7763e373), new Int(K[55], 0xd6b2b8a3), new Int(K[56], 0x5defb2fc), new Int(K[57], 0x43172f60), new Int(K[58], 0xa1f0ab72), new Int(K[59], 0x1a6439ec), new Int(K[60], 0x23631e28), new Int(K[61], 0xde82bde9), new Int(K[62], 0xb2c67915), new Int(K[63], 0xe372532b), new Int(0xca273ece, 0xea26619c), new Int(0xd186b8c7, 0x21c0c207), new Int(0xeada7dd6, 0xcde0eb1e), new Int(0xf57d4f7f, 0xee6ed178), new Int(0x06f067aa, 0x72176fba), new Int(0x0a637dc5, 0xa2c898a6), new Int(0x113f9804, 0xbef90dae), new Int(0x1b710b35, 0x131c471b), new Int(0x28db77f5, 0x23047d84), new Int(0x32caab7b, 0x40c72493), new Int(0x3c9ebe0a, 0x15c9bebc), new Int(0x431d67c4, 0x9c100d4c), new Int(0x4cc5d4be, 0xcb3e42b6), new Int(0x597f299c, 0xfc657e2a), new Int(0x5fcb6fab, 0x3ad6faec), new Int(0x6c44198c, 0x4a475817)]; + + if ("SHA-384" === variant) { + H = [new Int(0xcbbb9d5d, H_trunc[0]), new Int(0x0629a292a, H_trunc[1]), new Int(0x9159015a, H_trunc[2]), new Int(0x0152fecd8, H_trunc[3]), new Int(0x67332667, H_trunc[4]), new Int(0x98eb44a87, H_trunc[5]), new Int(0xdb0c2e0d, H_trunc[6]), new Int(0x047b5481d, H_trunc[7])]; + } else /* "SHA-512" === variant */ + { + H = [new Int(H_full[0], 0xf3bcc908), new Int(H_full[1], 0x84caa73b), new Int(H_full[2], 0xfe94f82b), new Int(H_full[3], 0x5f1d36f1), new Int(H_full[4], 0xade682d1), new Int(H_full[5], 0x2b3e6c1f), new Int(H_full[6], 0xfb41bd6b), new Int(H_full[7], 0x137e2179)]; + } + } else { + throw "Unexpected error in SHA-2 implementation"; + } + + while (message.length <= lengthPosition) { + message.push(0); + } + /* Append '1' at the end of the binary string */ + message[messageLen >>> 5] |= 0x80 << 24 - messageLen % 32; + /* Append length of binary string in the position such that the new + * length is correct */ + message[lengthPosition] = messageLen; + + appendedMessageLength = message.length; + + for (i = 0; i < appendedMessageLength; i += binaryStringInc) { + a = H[0]; + b = H[1]; + c = H[2]; + d = H[3]; + e = H[4]; + f = H[5]; + g = H[6]; + h = H[7]; + + for (t = 0; t < numRounds; t += 1) { + if (t < 16) { + offset = t * binaryStringMult + i; + int1 = message.length <= offset ? 0 : message[offset]; + int2 = message.length <= offset + 1 ? 0 : message[offset + 1]; + /* Bit of a hack - for 32-bit, the second term is ignored */ + W[t] = new Int(int1, int2); + } else { + W[t] = safeAdd_4(gamma1(W[t - 2]), W[t - 7], gamma0(W[t - 15]), W[t - 16]); + } + + T1 = safeAdd_5(h, sigma1(e), ch(e, f, g), K[t], W[t]); + T2 = safeAdd_2(sigma0(a), maj(a, b, c)); + h = g; + g = f; + f = e; + e = safeAdd_2(d, T1); + d = c; + c = b; + b = a; + a = safeAdd_2(T1, T2); + } + + H[0] = safeAdd_2(a, H[0]); + H[1] = safeAdd_2(b, H[1]); + H[2] = safeAdd_2(c, H[2]); + H[3] = safeAdd_2(d, H[3]); + H[4] = safeAdd_2(e, H[4]); + H[5] = safeAdd_2(f, H[5]); + H[6] = safeAdd_2(g, H[6]); + H[7] = safeAdd_2(h, H[7]); + } + + if ("SHA-224" === variant && 2 & SUPPORTED_ALGS) { + retVal = [H[0], H[1], H[2], H[3], H[4], H[5], H[6]]; + } else if ("SHA-256" === variant && 2 & SUPPORTED_ALGS) { + retVal = H; + } else if ("SHA-384" === variant && 4 & SUPPORTED_ALGS) { + retVal = [H[0].highOrder, H[0].lowOrder, H[1].highOrder, H[1].lowOrder, H[2].highOrder, H[2].lowOrder, H[3].highOrder, H[3].lowOrder, H[4].highOrder, H[4].lowOrder, H[5].highOrder, H[5].lowOrder]; + } else if ("SHA-512" === variant && 4 & SUPPORTED_ALGS) { + retVal = [H[0].highOrder, H[0].lowOrder, H[1].highOrder, H[1].lowOrder, H[2].highOrder, H[2].lowOrder, H[3].highOrder, H[3].lowOrder, H[4].highOrder, H[4].lowOrder, H[5].highOrder, H[5].lowOrder, H[6].highOrder, H[6].lowOrder, H[7].highOrder, H[7].lowOrder]; + } else /* This should never be reached */ + { + throw "Unexpected error in SHA-2 implementation"; + } + + return retVal; +} + +/** + * jsSHA is the workhorse of the library. Instantiate it with the string to + * be hashed as the parameter + * + * @constructor + * @this {jsSHA} + * @param {string} srcString The string to be hashed + * @param {string} inputFormat The format of srcString, HEX, ASCII, TEXT, + * B64, or BYTES + * @param {string=} encoding The text encoding to use to encode the source + * string + */ +var jsSHA = function jsSHA(srcString, inputFormat, encoding) { + var strBinLen = 0, + strToHash = [0], + utfType = '', + srcConvertRet = null; + + utfType = encoding || "UTF8"; + + if (!("UTF8" === utfType || "UTF16BE" === utfType || "UTF16LE" === utfType)) { + throw "encoding must be UTF8, UTF16BE, or UTF16LE"; + } + + /* Convert the input string into the correct type */ + if ("HEX" === inputFormat) { + if (0 !== srcString.length % 2) { + throw "srcString of HEX type must be in byte increments"; + } + srcConvertRet = hex2binb(srcString); + strBinLen = srcConvertRet["binLen"]; + strToHash = srcConvertRet["value"]; + } else if ("TEXT" === inputFormat || "ASCII" === inputFormat) { + srcConvertRet = str2binb(srcString, utfType); + strBinLen = srcConvertRet["binLen"]; + strToHash = srcConvertRet["value"]; + } else if ("B64" === inputFormat) { + srcConvertRet = b642binb(srcString); + strBinLen = srcConvertRet["binLen"]; + strToHash = srcConvertRet["value"]; + } else if ("BYTES" === inputFormat) { + srcConvertRet = bytes2binb(srcString); + strBinLen = srcConvertRet["binLen"]; + strToHash = srcConvertRet["value"]; + } else if ("TYPED" === inputFormat) { + srcConvertRet = typed2binb(srcString); + strBinLen = srcConvertRet["binLen"]; + strToHash = srcConvertRet["value"]; + } else { + throw "inputFormat must be HEX, TEXT, ASCII, B64, BYTES, or TYPED"; + } + + /** + * Returns the desired SHA hash of the string specified at instantiation + * using the specified parameters + * + * @expose + * @param {string} variant The desired SHA variant (SHA-1, SHA-224, + * SHA-256, SHA-384, or SHA-512) + * @param {string} format The desired output formatting (B64, HEX, or BYTES) + * @param {number=} numRounds The number of rounds of hashing to be + * executed + * @param {{outputUpper : boolean, b64Pad : string}=} outputFormatOpts + * Hash list of output formatting options + * @return {string} The string representation of the hash in the format + * specified + */ + this.getHash = function (variant, format, numRounds, outputFormatOpts) { + var formatFunc = null, + message = strToHash.slice(), + messageBinLen = strBinLen, + i; + + /* Need to do argument patching since both numRounds and + outputFormatOpts are optional */ + if (3 === arguments.length) { + if ("number" !== typeof numRounds) { + outputFormatOpts = numRounds; + numRounds = 1; + } + } else if (2 === arguments.length) { + numRounds = 1; + } + + /* Validate the numRounds argument */ + if (numRounds !== parseInt(numRounds, 10) || 1 > numRounds) { + throw "numRounds must a integer >= 1"; + } + + /* Validate the output format selection */ + switch (format) { + case "HEX": + formatFunc = binb2hex; + break; + case "B64": + formatFunc = binb2b64; + break; + case "BYTES": + formatFunc = binb2bytes; + break; + case "TYPED": + formatFunc = binb2typed; + break; + default: + throw "format must be HEX, B64, or BYTES"; + } + + if ("SHA-1" === variant && 1 & SUPPORTED_ALGS) { + for (i = 0; i < numRounds; i += 1) { + message = coreSHA1(message, messageBinLen); + messageBinLen = 160; + } + } else if ("SHA-224" === variant && 2 & SUPPORTED_ALGS) { + for (i = 0; i < numRounds; i += 1) { + message = coreSHA2(message, messageBinLen, variant); + messageBinLen = 224; + } + } else if ("SHA-256" === variant && 2 & SUPPORTED_ALGS) { + for (i = 0; i < numRounds; i += 1) { + message = coreSHA2(message, messageBinLen, variant); + messageBinLen = 256; + } + } else if ("SHA-384" === variant && 4 & SUPPORTED_ALGS) { + for (i = 0; i < numRounds; i += 1) { + message = coreSHA2(message, messageBinLen, variant); + messageBinLen = 384; + } + } else if ("SHA-512" === variant && 4 & SUPPORTED_ALGS) { + for (i = 0; i < numRounds; i += 1) { + message = coreSHA2(message, messageBinLen, variant); + messageBinLen = 512; + } + } else { + throw "Chosen SHA variant is not supported"; + } + + return formatFunc(message, getOutputOpts(outputFormatOpts)); + }; + + /** + * Returns the desired HMAC of the string specified at instantiation + * using the key and variant parameter + * + * @expose + * @param {string} key The key used to calculate the HMAC + * @param {string} inputFormat The format of key, HEX, TEXT, ASCII, + * B64, or BYTES + * @param {string} variant The desired SHA variant (SHA-1, SHA-224, + * SHA-256, SHA-384, or SHA-512) + * @param {string} outputFormat The desired output formatting + * (B64, HEX, or BYTES) + * @param {{outputUpper : boolean, b64Pad : string}=} outputFormatOpts + * associative array of output formatting options + * @return {string} The string representation of the hash in the format + * specified + */ + this.getHMAC = function (key, inputFormat, variant, outputFormat, outputFormatOpts) { + var formatFunc, + keyToUse, + blockByteSize, + blockBitSize, + i, + retVal, + lastArrayIndex, + keyBinLen, + hashBitSize, + keyWithIPad = [], + keyWithOPad = [], + keyConvertRet = null; + + /* Validate the output format selection */ + switch (outputFormat) { + case "HEX": + formatFunc = binb2hex; + break; + case "B64": + formatFunc = binb2b64; + break; + case "BYTES": + formatFunc = binb2bytes; + break; + default: + throw "outputFormat must be HEX, B64, or BYTES"; + } + + /* Validate the hash variant selection and set needed variables */ + if ("SHA-1" === variant && 1 & SUPPORTED_ALGS) { + blockByteSize = 64; + hashBitSize = 160; + } else if ("SHA-224" === variant && 2 & SUPPORTED_ALGS) { + blockByteSize = 64; + hashBitSize = 224; + } else if ("SHA-256" === variant && 2 & SUPPORTED_ALGS) { + blockByteSize = 64; + hashBitSize = 256; + } else if ("SHA-384" === variant && 4 & SUPPORTED_ALGS) { + blockByteSize = 128; + hashBitSize = 384; + } else if ("SHA-512" === variant && 4 & SUPPORTED_ALGS) { + blockByteSize = 128; + hashBitSize = 512; + } else { + throw "Chosen SHA variant is not supported"; + } + + /* Validate input format selection */ + if ("HEX" === inputFormat) { + keyConvertRet = hex2binb(key); + keyBinLen = keyConvertRet["binLen"]; + keyToUse = keyConvertRet["value"]; + } else if ("TEXT" === inputFormat || "ASCII" === inputFormat) { + keyConvertRet = str2binb(key, utfType); + keyBinLen = keyConvertRet["binLen"]; + keyToUse = keyConvertRet["value"]; + } else if ("B64" === inputFormat) { + keyConvertRet = b642binb(key); + keyBinLen = keyConvertRet["binLen"]; + keyToUse = keyConvertRet["value"]; + } else if ("BYTES" === inputFormat) { + keyConvertRet = bytes2binb(key); + keyBinLen = keyConvertRet["binLen"]; + keyToUse = keyConvertRet["value"]; + } else { + throw "inputFormat must be HEX, TEXT, ASCII, B64, or BYTES"; + } + + /* These are used multiple times, calculate and store them */ + blockBitSize = blockByteSize * 8; + lastArrayIndex = blockByteSize / 4 - 1; + + /* Figure out what to do with the key based on its size relative to + * the hash's block size */ + if (blockByteSize < keyBinLen / 8) { + if ("SHA-1" === variant && 1 & SUPPORTED_ALGS) { + keyToUse = coreSHA1(keyToUse, keyBinLen); + } else if (6 & SUPPORTED_ALGS) { + keyToUse = coreSHA2(keyToUse, keyBinLen, variant); + } else { + throw "Unexpected error in HMAC implementation"; + } + /* For all variants, the block size is bigger than the output + * size so there will never be a useful byte at the end of the + * string */ + while (keyToUse.length <= lastArrayIndex) { + keyToUse.push(0); + } + keyToUse[lastArrayIndex] &= 0xFFFFFF00; + } else if (blockByteSize > keyBinLen / 8) { + /* If the blockByteSize is greater than the key length, there + * will always be at LEAST one "useless" byte at the end of the + * string */ + while (keyToUse.length <= lastArrayIndex) { + keyToUse.push(0); + } + keyToUse[lastArrayIndex] &= 0xFFFFFF00; + } + + /* Create ipad and opad */ + for (i = 0; i <= lastArrayIndex; i += 1) { + keyWithIPad[i] = keyToUse[i] ^ 0x36363636; + keyWithOPad[i] = keyToUse[i] ^ 0x5C5C5C5C; + } + + /* Calculate the HMAC */ + if ("SHA-1" === variant && 1 & SUPPORTED_ALGS) { + retVal = coreSHA1(keyWithOPad.concat(coreSHA1(keyWithIPad.concat(strToHash), blockBitSize + strBinLen)), blockBitSize + hashBitSize); + } else if (6 & SUPPORTED_ALGS) { + retVal = coreSHA2(keyWithOPad.concat(coreSHA2(keyWithIPad.concat(strToHash), blockBitSize + strBinLen, variant)), blockBitSize + hashBitSize, variant); + } else { + throw "Unexpected error in HMAC implementation"; + } + + return formatFunc(retVal, getOutputOpts(outputFormatOpts)); + }; +}; + +exports.default = { + /** SHA1 hash */ + sha1: function sha1(str) { + var shaObj = new jsSHA(str, "TYPED", "UTF8"); + return shaObj.getHash("SHA-1", "TYPED"); + }, + /** SHA224 hash */ + sha224: function sha224(str) { + var shaObj = new jsSHA(str, "TYPED", "UTF8"); + return shaObj.getHash("SHA-224", "TYPED"); + }, + /** SHA256 hash */ + sha256: function sha256(str) { + var shaObj = new jsSHA(str, "TYPED", "UTF8"); + return shaObj.getHash("SHA-256", "TYPED"); + }, + /** SHA384 hash */ + sha384: function sha384(str) { + var shaObj = new jsSHA(str, "TYPED", "UTF8"); + return shaObj.getHash("SHA-384", "TYPED"); + }, + /** SHA512 hash */ + sha512: function sha512(str) { + var shaObj = new jsSHA(str, "TYPED", "UTF8"); + return shaObj.getHash("SHA-512", "TYPED"); + } +}; + +},{}],24:[function(_dereq_,module,exports){ +/** + * @see module:crypto/crypto + * @module crypto + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _cipher = _dereq_('./cipher'); + +var _cipher2 = _interopRequireDefault(_cipher); + +var _hash = _dereq_('./hash'); + +var _hash2 = _interopRequireDefault(_hash); + +var _cfb = _dereq_('./cfb'); + +var _cfb2 = _interopRequireDefault(_cfb); + +var _gcm = _dereq_('./gcm'); + +var gcm = _interopRequireWildcard(_gcm); + +var _public_key = _dereq_('./public_key'); + +var _public_key2 = _interopRequireDefault(_public_key); + +var _signature = _dereq_('./signature'); + +var _signature2 = _interopRequireDefault(_signature); + +var _random = _dereq_('./random'); + +var _random2 = _interopRequireDefault(_random); + +var _pkcs = _dereq_('./pkcs1'); + +var _pkcs2 = _interopRequireDefault(_pkcs); + +var _crypto = _dereq_('./crypto.js'); + +var _crypto2 = _interopRequireDefault(_crypto); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var mod = { + /** @see module:crypto/cipher */ + cipher: _cipher2.default, + /** @see module:crypto/hash */ + hash: _hash2.default, + /** @see module:crypto/cfb */ + cfb: _cfb2.default, + /** @see module:crypto/gcm */ + gcm: gcm, + /** @see module:crypto/public_key */ + publicKey: _public_key2.default, + /** @see module:crypto/signature */ + signature: _signature2.default, + /** @see module:crypto/random */ + random: _random2.default, + /** @see module:crypto/pkcs1 */ + pkcs1: _pkcs2.default +}; + +for (var i in _crypto2.default) { + mod[i] = _crypto2.default[i]; +} + +exports.default = mod; + +},{"./cfb":11,"./cipher":16,"./crypto.js":18,"./gcm":19,"./hash":20,"./pkcs1":25,"./public_key":28,"./random":31,"./signature":32}],25:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * PKCS1 encoding + * @requires crypto/crypto + * @requires crypto/hash + * @requires crypto/public_key/jsbn + * @requires crypto/random + * @requires util + * @module crypto/pkcs1 + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _random = _dereq_('./random.js'); + +var _random2 = _interopRequireDefault(_random); + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _jsbn = _dereq_('./public_key/jsbn.js'); + +var _jsbn2 = _interopRequireDefault(_jsbn); + +var _hash = _dereq_('./hash'); + +var _hash2 = _interopRequireDefault(_hash); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * ASN1 object identifiers for hashes (See {@link http://tools.ietf.org/html/rfc4880#section-5.2.2}) + */ +var hash_headers = []; +hash_headers[1] = [0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10]; +hash_headers[2] = [0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14]; +hash_headers[3] = [0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x24, 0x03, 0x02, 0x01, 0x05, 0x00, 0x04, 0x14]; +hash_headers[8] = [0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20]; +hash_headers[9] = [0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30]; +hash_headers[10] = [0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40]; +hash_headers[11] = [0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, 0x00, 0x04, 0x1C]; + +/** + * Create padding with secure random data + * @private + * @param {Integer} length Length of the padding in bytes + * @return {String} Padding as string + */ +function getPkcs1Padding(length) { + var result = ''; + var randomByte; + while (result.length < length) { + randomByte = _random2.default.getSecureRandomOctet(); + if (randomByte !== 0) { + result += String.fromCharCode(randomByte); + } + } + return result; +} + +exports.default = { + eme: { + /** + * create a EME-PKCS1-v1_5 padding (See {@link http://tools.ietf.org/html/rfc4880#section-13.1.1|RFC 4880 13.1.1}) + * @param {String} M message to be encoded + * @param {Integer} k the length in octets of the key modulus + * @return {String} EME-PKCS1 padded message + */ + encode: function encode(M, k) { + var mLen = M.length; + // length checking + if (mLen > k - 11) { + throw new Error('Message too long'); + } + // Generate an octet string PS of length k - mLen - 3 consisting of + // pseudo-randomly generated nonzero octets + var PS = getPkcs1Padding(k - mLen - 3); + // Concatenate PS, the message M, and other padding to form an + // encoded message EM of length k octets as EM = 0x00 || 0x02 || PS || 0x00 || M. + var EM = String.fromCharCode(0) + String.fromCharCode(2) + PS + String.fromCharCode(0) + M; + return EM; + }, + /** + * decodes a EME-PKCS1-v1_5 padding (See {@link http://tools.ietf.org/html/rfc4880#section-13.1.2|RFC 4880 13.1.2}) + * @param {String} EM encoded message, an octet string + * @return {String} message, an octet string + */ + decode: function decode(EM) { + // leading zeros truncated by jsbn + if (EM.charCodeAt(0) !== 0) { + EM = String.fromCharCode(0) + EM; + } + var firstOct = EM.charCodeAt(0); + var secondOct = EM.charCodeAt(1); + var i = 2; + while (EM.charCodeAt(i) !== 0 && i < EM.length) { + i++; + } + var psLen = i - 2; + var separator = EM.charCodeAt(i++); + if (firstOct === 0 && secondOct === 2 && psLen >= 8 && separator === 0) { + return EM.substr(i); + } else { + throw new Error('Decryption error'); + } + } + }, + + emsa: { + /** + * create a EMSA-PKCS1-v1_5 padding (See {@link http://tools.ietf.org/html/rfc4880#section-13.1.3|RFC 4880 13.1.3}) + * @param {Integer} algo Hash algorithm type used + * @param {String} M message to be encoded + * @param {Integer} emLen intended length in octets of the encoded message + * @returns {String} encoded message + */ + encode: function encode(algo, M, emLen) { + var i; + // Apply the hash function to the message M to produce a hash value H + var H = _util2.default.Uint8Array2str(_hash2.default.digest(algo, _util2.default.str2Uint8Array(M))); + if (H.length !== _hash2.default.getHashByteLength(algo)) { + throw new Error('Invalid hash length'); + } + // produce an ASN.1 DER value for the hash function used. + // Let T be the full hash prefix + var T = ''; + for (i = 0; i < hash_headers[algo].length; i++) { + T += String.fromCharCode(hash_headers[algo][i]); + } + // add hash value to prefix + T += H; + // and let tLen be the length in octets of T + var tLen = T.length; + if (emLen < tLen + 11) { + throw new Error('Intended encoded message length too short'); + } + // an octet string PS consisting of emLen - tLen - 3 octets with hexadecimal value 0xFF + // The length of PS will be at least 8 octets + var PS = ''; + for (i = 0; i < emLen - tLen - 3; i++) { + PS += String.fromCharCode(0xff); + } + // Concatenate PS, the hash prefix T, and other padding to form the + // encoded message EM as EM = 0x00 || 0x01 || PS || 0x00 || T. + var EM = String.fromCharCode(0x00) + String.fromCharCode(0x01) + PS + String.fromCharCode(0x00) + T; + return new _jsbn2.default(_util2.default.hexstrdump(EM), 16); + } + } +}; + +},{"../util.js":70,"./hash":20,"./public_key/jsbn.js":29,"./random.js":31}],26:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// A Digital signature algorithm implementation + +/** + * @requires crypto/hash + * @requires crypto/public_key/jsbn + * @requires crypto/random + * @requires util + * @module crypto/public_key/dsa + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = DSA; + +var _jsbn = _dereq_('./jsbn.js'); + +var _jsbn2 = _interopRequireDefault(_jsbn); + +var _random = _dereq_('../random.js'); + +var _random2 = _interopRequireDefault(_random); + +var _hash = _dereq_('../hash'); + +var _hash2 = _interopRequireDefault(_hash); + +var _util = _dereq_('../../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _config = _dereq_('../../config'); + +var _config2 = _interopRequireDefault(_config); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function DSA() { + // s1 = ((g**s) mod p) mod q + // s1 = ((s**-1)*(sha-1(m)+(s1*x) mod q) + function sign(hashalgo, m, g, p, q, x) { + // If the output size of the chosen hash is larger than the number of + // bits of q, the hash result is truncated to fit by taking the number + // of leftmost bits equal to the number of bits of q. This (possibly + // truncated) hash function result is treated as a number and used + // directly in the DSA signature algorithm. + var hashed_data = _util2.default.getLeftNBits(_util2.default.Uint8Array2str(_hash2.default.digest(hashalgo, _util2.default.str2Uint8Array(m))), q.bitLength()); + var hash = new _jsbn2.default(_util2.default.hexstrdump(hashed_data), 16); + // FIPS-186-4, section 4.6: + // The values of r and s shall be checked to determine if r = 0 or s = 0. + // If either r = 0 or s = 0, a new value of k shall be generated, and the + // signature shall be recalculated. It is extremely unlikely that r = 0 + // or s = 0 if signatures are generated properly. + var k, s1, s2; + while (true) { + k = _random2.default.getRandomBigIntegerInRange(_jsbn2.default.ONE, q.subtract(_jsbn2.default.ONE)); + s1 = g.modPow(k, p).mod(q); + s2 = k.modInverse(q).multiply(hash.add(x.multiply(s1))).mod(q); + if (s1 !== 0 && s2 !== 0) { + break; + } + } + var result = []; + result[0] = s1.toMPI(); + result[1] = s2.toMPI(); + return result; + } + + function select_hash_algorithm(q) { + var usersetting = _config2.default.prefer_hash_algorithm; + /* + * 1024-bit key, 160-bit q, SHA-1, SHA-224, SHA-256, SHA-384, or SHA-512 hash + * 2048-bit key, 224-bit q, SHA-224, SHA-256, SHA-384, or SHA-512 hash + * 2048-bit key, 256-bit q, SHA-256, SHA-384, or SHA-512 hash + * 3072-bit key, 256-bit q, SHA-256, SHA-384, or SHA-512 hash + */ + switch (Math.round(q.bitLength() / 8)) { + case 20: + // 1024 bit + if (usersetting !== 2 && usersetting > 11 && usersetting !== 10 && usersetting < 8) { + return 2; // prefer sha1 + } + return usersetting; + case 28: + // 2048 bit + if (usersetting > 11 && usersetting < 8) { + return 11; + } + return usersetting; + case 32: + // 4096 bit // prefer sha224 + if (usersetting > 10 && usersetting < 8) { + return 8; // prefer sha256 + } + return usersetting; + default: + _util2.default.print_debug("DSA select hash algorithm: returning null for an unknown length of q"); + return null; + } + } + this.select_hash_algorithm = select_hash_algorithm; + + function verify(hashalgo, s1, s2, m, p, q, g, y) { + var hashed_data = _util2.default.getLeftNBits(_util2.default.Uint8Array2str(_hash2.default.digest(hashalgo, _util2.default.str2Uint8Array(m))), q.bitLength()); + var hash = new _jsbn2.default(_util2.default.hexstrdump(hashed_data), 16); + if (_jsbn2.default.ZERO.compareTo(s1) >= 0 || s1.compareTo(q) >= 0 || _jsbn2.default.ZERO.compareTo(s2) >= 0 || s2.compareTo(q) >= 0) { + _util2.default.print_debug("invalid DSA Signature"); + return null; + } + var w = s2.modInverse(q); + if (_jsbn2.default.ZERO.compareTo(w) === 0) { + _util2.default.print_debug("invalid DSA Signature"); + return null; + } + var u1 = hash.multiply(w).mod(q); + var u2 = s1.multiply(w).mod(q); + return g.modPow(u1, p).multiply(y.modPow(u2, p)).mod(p).mod(q); + } + + this.sign = sign; + this.verify = verify; +} + +},{"../../config":10,"../../util.js":70,"../hash":20,"../random.js":31,"./jsbn.js":29}],27:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// ElGamal implementation + +/** + * @requires crypto/public_key/jsbn + * @requires crypto/random + * @requires util + * @module crypto/public_key/elgamal + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = Elgamal; + +var _jsbn = _dereq_('./jsbn.js'); + +var _jsbn2 = _interopRequireDefault(_jsbn); + +var _random = _dereq_('../random.js'); + +var _random2 = _interopRequireDefault(_random); + +var _util = _dereq_('../../util.js'); + +var _util2 = _interopRequireDefault(_util); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function Elgamal() { + + function encrypt(m, g, p, y) { + // choose k in {2,...,p-2} + var pMinus2 = p.subtract(_jsbn2.default.TWO); + var k = _random2.default.getRandomBigIntegerInRange(_jsbn2.default.ONE, pMinus2); + k = k.mod(pMinus2).add(_jsbn2.default.ONE); + var c = []; + c[0] = g.modPow(k, p); + c[1] = y.modPow(k, p).multiply(m).mod(p); + return c; + } + + function decrypt(c1, c2, p, x) { + _util2.default.print_debug("Elgamal Decrypt:\nc1:" + _util2.default.hexstrdump(c1.toMPI()) + "\n" + "c2:" + _util2.default.hexstrdump(c2.toMPI()) + "\n" + "p:" + _util2.default.hexstrdump(p.toMPI()) + "\n" + "x:" + _util2.default.hexstrdump(x.toMPI())); + return c1.modPow(x, p).modInverse(p).multiply(c2).mod(p); + //var c = c1.pow(x).modInverse(p); // c0^-a mod p + //return c.multiply(c2).mod(p); + } + + // signing and signature verification using Elgamal is not required by OpenPGP. + this.encrypt = encrypt; + this.decrypt = decrypt; +} + +},{"../../util.js":70,"../random.js":31,"./jsbn.js":29}],28:[function(_dereq_,module,exports){ +/** + * @requires crypto/public_key/dsa + * @requires crypto/public_key/elgamal + * @requires crypto/public_key/rsa + * @module crypto/public_key + */ + +'use strict'; + +/** @see module:crypto/public_key/rsa */ + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _rsa = _dereq_('./rsa.js'); + +var _rsa2 = _interopRequireDefault(_rsa); + +var _elgamal = _dereq_('./elgamal.js'); + +var _elgamal2 = _interopRequireDefault(_elgamal); + +var _dsa = _dereq_('./dsa.js'); + +var _dsa2 = _interopRequireDefault(_dsa); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** @see module:crypto/public_key/elgamal */ +exports.default = { + rsa: _rsa2.default, + elgamal: _elgamal2.default, + dsa: _dsa2.default +}; +/** @see module:crypto/public_key/dsa */ + +},{"./dsa.js":26,"./elgamal.js":27,"./rsa.js":30}],29:[function(_dereq_,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = BigInteger; + +var _util = _dereq_("../../util.js"); + +var _util2 = _interopRequireDefault(_util); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// Basic JavaScript BN library - subset useful for RSA encryption. + +// Bits per digit +var dbits; + +// JavaScript engine analysis +/* + * Copyright (c) 2003-2005 Tom Wu (tjw@cs.Stanford.EDU) + * All Rights Reserved. + * + * Modified by Recurity Labs GmbH + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF + * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * In addition, the following condition applies: + * + * All redistributions must retain an intact copy of this copyright notice + * and disclaimer. + */ + +/** + * @requires util + * @module crypto/public_key/jsbn + */ + +var canary = 0xdeadbeefcafe; +var j_lm = (canary & 0xffffff) == 0xefcafe; + +// (public) Constructor + +function BigInteger(a, b, c) { + if (a != null) if ("number" == typeof a) this.fromNumber(a, b, c);else if (b == null && "string" != typeof a) this.fromString(a, 256);else this.fromString(a, b); +} + +// return new, unset BigInteger + +function nbi() { + return new BigInteger(null); +} + +// am: Compute w_j += (x*this_i), propagate carries, +// c is initial carry, returns final carry. +// c < 3*dvalue, x < 2*dvalue, this_i < dvalue +// We need to select the fastest one that works in this environment. + +// am1: use a single mult and divide to get the high bits, +// max digit bits should be 26 because +// max internal value = 2*dvalue^2-2*dvalue (< 2^53) + +function am1(i, x, w, j, c, n) { + while (--n >= 0) { + var v = x * this[i++] + w[j] + c; + c = Math.floor(v / 0x4000000); + w[j++] = v & 0x3ffffff; + } + return c; +} +// am2 avoids a big mult-and-extract completely. +// Max digit bits should be <= 30 because we do bitwise ops +// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) + +function am2(i, x, w, j, c, n) { + var xl = x & 0x7fff, + xh = x >> 15; + while (--n >= 0) { + var l = this[i] & 0x7fff; + var h = this[i++] >> 15; + var m = xh * l + h * xl; + l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff); + c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30); + w[j++] = l & 0x3fffffff; + } + return c; +} +// Alternately, set max digit bits to 28 since some +// browsers slow down when dealing with 32-bit numbers. + +function am3(i, x, w, j, c, n) { + var xl = x & 0x3fff, + xh = x >> 14; + while (--n >= 0) { + var l = this[i] & 0x3fff; + var h = this[i++] >> 14; + var m = xh * l + h * xl; + l = xl * l + ((m & 0x3fff) << 14) + w[j] + c; + c = (l >> 28) + (m >> 14) + xh * h; + w[j++] = l & 0xfffffff; + } + return c; +} +/*if(j_lm && (navigator != undefined && + navigator.appName == "Microsoft Internet Explorer")) { + BigInteger.prototype.am = am2; + dbits = 30; +} +else if(j_lm && (navigator != undefined && navigator.appName != "Netscape")) {*/ +BigInteger.prototype.am = am1; +dbits = 26; +/*} +else { // Mozilla/Netscape seems to prefer am3 + BigInteger.prototype.am = am3; + dbits = 28; +}*/ + +BigInteger.prototype.DB = dbits; +BigInteger.prototype.DM = (1 << dbits) - 1; +BigInteger.prototype.DV = 1 << dbits; + +var BI_FP = 52; +BigInteger.prototype.FV = Math.pow(2, BI_FP); +BigInteger.prototype.F1 = BI_FP - dbits; +BigInteger.prototype.F2 = 2 * dbits - BI_FP; + +// Digit conversions +var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz"; +var BI_RC = new Array(); +var rr, vv; +rr = "0".charCodeAt(0); +for (vv = 0; vv <= 9; ++vv) { + BI_RC[rr++] = vv; +}rr = "a".charCodeAt(0); +for (vv = 10; vv < 36; ++vv) { + BI_RC[rr++] = vv; +}rr = "A".charCodeAt(0); +for (vv = 10; vv < 36; ++vv) { + BI_RC[rr++] = vv; +}function int2char(n) { + return BI_RM.charAt(n); +} + +function intAt(s, i) { + var c = BI_RC[s.charCodeAt(i)]; + return c == null ? -1 : c; +} + +// (protected) copy this to r + +function bnpCopyTo(r) { + for (var i = this.t - 1; i >= 0; --i) { + r[i] = this[i]; + }r.t = this.t; + r.s = this.s; +} + +// (protected) set from integer value x, -DV <= x < DV + +function bnpFromInt(x) { + this.t = 1; + this.s = x < 0 ? -1 : 0; + if (x > 0) this[0] = x;else if (x < -1) this[0] = x + this.DV;else this.t = 0; +} + +// return bigint initialized to value + +function nbv(i) { + var r = nbi(); + r.fromInt(i); + return r; +} + +// (protected) set from string and radix + +function bnpFromString(s, b) { + var k; + if (b == 16) k = 4;else if (b == 8) k = 3;else if (b == 256) k = 8; // byte array + else if (b == 2) k = 1;else if (b == 32) k = 5;else if (b == 4) k = 2;else { + this.fromRadix(s, b); + return; + } + this.t = 0; + this.s = 0; + var i = s.length, + mi = false, + sh = 0; + while (--i >= 0) { + var x = k == 8 ? s[i] & 0xff : intAt(s, i); + if (x < 0) { + if (s.charAt(i) == "-") mi = true; + continue; + } + mi = false; + if (sh == 0) this[this.t++] = x;else if (sh + k > this.DB) { + this[this.t - 1] |= (x & (1 << this.DB - sh) - 1) << sh; + this[this.t++] = x >> this.DB - sh; + } else this[this.t - 1] |= x << sh; + sh += k; + if (sh >= this.DB) sh -= this.DB; + } + if (k == 8 && (s[0] & 0x80) != 0) { + this.s = -1; + if (sh > 0) this[this.t - 1] |= (1 << this.DB - sh) - 1 << sh; + } + this.clamp(); + if (mi) BigInteger.ZERO.subTo(this, this); +} + +// (protected) clamp off excess high words + +function bnpClamp() { + var c = this.s & this.DM; + while (this.t > 0 && this[this.t - 1] == c) { + --this.t; + } +} + +// (public) return string representation in given radix + +function bnToString(b) { + if (this.s < 0) return "-" + this.negate().toString(b); + var k; + if (b == 16) k = 4;else if (b == 8) k = 3;else if (b == 2) k = 1;else if (b == 32) k = 5;else if (b == 4) k = 2;else return this.toRadix(b); + var km = (1 << k) - 1, + d, + m = false, + r = "", + i = this.t; + var p = this.DB - i * this.DB % k; + if (i-- > 0) { + if (p < this.DB && (d = this[i] >> p) > 0) { + m = true; + r = int2char(d); + } + while (i >= 0) { + if (p < k) { + d = (this[i] & (1 << p) - 1) << k - p; + d |= this[--i] >> (p += this.DB - k); + } else { + d = this[i] >> (p -= k) & km; + if (p <= 0) { + p += this.DB; + --i; + } + } + if (d > 0) m = true; + if (m) r += int2char(d); + } + } + return m ? r : "0"; +} + +// (public) -this + +function bnNegate() { + var r = nbi(); + BigInteger.ZERO.subTo(this, r); + return r; +} + +// (public) |this| + +function bnAbs() { + return this.s < 0 ? this.negate() : this; +} + +// (public) return + if this > a, - if this < a, 0 if equal + +function bnCompareTo(a) { + var r = this.s - a.s; + if (r != 0) return r; + var i = this.t; + r = i - a.t; + if (r != 0) return this.s < 0 ? -r : r; + while (--i >= 0) { + if ((r = this[i] - a[i]) != 0) return r; + }return 0; +} + +// returns bit length of the integer x + +function nbits(x) { + var r = 1, + t; + if ((t = x >>> 16) != 0) { + x = t; + r += 16; + } + if ((t = x >> 8) != 0) { + x = t; + r += 8; + } + if ((t = x >> 4) != 0) { + x = t; + r += 4; + } + if ((t = x >> 2) != 0) { + x = t; + r += 2; + } + if ((t = x >> 1) != 0) { + x = t; + r += 1; + } + return r; +} + +// (public) return the number of bits in "this" + +function bnBitLength() { + if (this.t <= 0) return 0; + return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM); +} + +// (protected) r = this << n*DB + +function bnpDLShiftTo(n, r) { + var i; + for (i = this.t - 1; i >= 0; --i) { + r[i + n] = this[i]; + }for (i = n - 1; i >= 0; --i) { + r[i] = 0; + }r.t = this.t + n; + r.s = this.s; +} + +// (protected) r = this >> n*DB + +function bnpDRShiftTo(n, r) { + for (var i = n; i < this.t; ++i) { + r[i - n] = this[i]; + }r.t = Math.max(this.t - n, 0); + r.s = this.s; +} + +// (protected) r = this << n + +function bnpLShiftTo(n, r) { + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << cbs) - 1; + var ds = Math.floor(n / this.DB), + c = this.s << bs & this.DM, + i; + for (i = this.t - 1; i >= 0; --i) { + r[i + ds + 1] = this[i] >> cbs | c; + c = (this[i] & bm) << bs; + } + for (i = ds - 1; i >= 0; --i) { + r[i] = 0; + }r[ds] = c; + r.t = this.t + ds + 1; + r.s = this.s; + r.clamp(); +} + +// (protected) r = this >> n + +function bnpRShiftTo(n, r) { + r.s = this.s; + var ds = Math.floor(n / this.DB); + if (ds >= this.t) { + r.t = 0; + return; + } + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << bs) - 1; + r[0] = this[ds] >> bs; + for (var i = ds + 1; i < this.t; ++i) { + r[i - ds - 1] |= (this[i] & bm) << cbs; + r[i - ds] = this[i] >> bs; + } + if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs; + r.t = this.t - ds; + r.clamp(); +} + +// (protected) r = this - a + +function bnpSubTo(a, r) { + var i = 0, + c = 0, + m = Math.min(a.t, this.t); + while (i < m) { + c += this[i] - a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + if (a.t < this.t) { + c -= a.s; + while (i < this.t) { + c += this[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } else { + c += this.s; + while (i < a.t) { + c -= a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c -= a.s; + } + r.s = c < 0 ? -1 : 0; + if (c < -1) r[i++] = this.DV + c;else if (c > 0) r[i++] = c; + r.t = i; + r.clamp(); +} + +// (protected) r = this * a, r != this,a (HAC 14.12) +// "this" should be the larger one if appropriate. + +function bnpMultiplyTo(a, r) { + var x = this.abs(), + y = a.abs(); + var i = x.t; + r.t = i + y.t; + while (--i >= 0) { + r[i] = 0; + }for (i = 0; i < y.t; ++i) { + r[i + x.t] = x.am(0, y[i], r, i, 0, x.t); + }r.s = 0; + r.clamp(); + if (this.s != a.s) BigInteger.ZERO.subTo(r, r); +} + +// (protected) r = this^2, r != this (HAC 14.16) + +function bnpSquareTo(r) { + var x = this.abs(); + var i = r.t = 2 * x.t; + while (--i >= 0) { + r[i] = 0; + }for (i = 0; i < x.t - 1; ++i) { + var c = x.am(i, x[i], r, 2 * i, 0, 1); + if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) { + r[i + x.t] -= x.DV; + r[i + x.t + 1] = 1; + } + } + if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1); + r.s = 0; + r.clamp(); +} + +// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) +// r != q, this != m. q or r may be null. + +function bnpDivRemTo(m, q, r) { + var pm = m.abs(); + if (pm.t <= 0) return; + var pt = this.abs(); + if (pt.t < pm.t) { + if (q != null) q.fromInt(0); + if (r != null) this.copyTo(r); + return; + } + if (r == null) r = nbi(); + var y = nbi(), + ts = this.s, + ms = m.s; + var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus + if (nsh > 0) { + pm.lShiftTo(nsh, y); + pt.lShiftTo(nsh, r); + } else { + pm.copyTo(y); + pt.copyTo(r); + } + var ys = y.t; + var y0 = y[ys - 1]; + if (y0 == 0) return; + var yt = y0 * (1 << this.F1) + (ys > 1 ? y[ys - 2] >> this.F2 : 0); + var d1 = this.FV / yt, + d2 = (1 << this.F1) / yt, + e = 1 << this.F2; + var i = r.t, + j = i - ys, + t = q == null ? nbi() : q; + y.dlShiftTo(j, t); + if (r.compareTo(t) >= 0) { + r[r.t++] = 1; + r.subTo(t, r); + } + BigInteger.ONE.dlShiftTo(ys, t); + t.subTo(y, y); // "negative" y so we can replace sub with am later + while (y.t < ys) { + y[y.t++] = 0; + }while (--j >= 0) { + // Estimate quotient digit + var qd = r[--i] == y0 ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); + if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { + // Try it out + y.dlShiftTo(j, t); + r.subTo(t, r); + while (r[i] < --qd) { + r.subTo(t, r); + } + } + } + if (q != null) { + r.drShiftTo(ys, q); + if (ts != ms) BigInteger.ZERO.subTo(q, q); + } + r.t = ys; + r.clamp(); + if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder + if (ts < 0) BigInteger.ZERO.subTo(r, r); +} + +// (public) this mod a + +function bnMod(a) { + var r = nbi(); + this.abs().divRemTo(a, null, r); + if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r); + return r; +} + +// Modular reduction using "classic" algorithm + +function Classic(m) { + this.m = m; +} + +function cConvert(x) { + if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);else return x; +} + +function cRevert(x) { + return x; +} + +function cReduce(x) { + x.divRemTo(this.m, null, x); +} + +function cMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); +} + +function cSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); +} + +Classic.prototype.convert = cConvert; +Classic.prototype.revert = cRevert; +Classic.prototype.reduce = cReduce; +Classic.prototype.mulTo = cMulTo; +Classic.prototype.sqrTo = cSqrTo; + +// (protected) return "-1/this % 2^DB"; useful for Mont. reduction +// justification: +// xy == 1 (mod m) +// xy = 1+km +// xy(2-xy) = (1+km)(1-km) +// x[y(2-xy)] = 1-k^2m^2 +// x[y(2-xy)] == 1 (mod m^2) +// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 +// should reduce x and y(2-xy) by m^2 at each step to keep size bounded. +// JS multiply "overflows" differently from C/C++, so care is needed here. + +function bnpInvDigit() { + if (this.t < 1) return 0; + var x = this[0]; + if ((x & 1) == 0) return 0; + var y = x & 3; // y == 1/x mod 2^2 + y = y * (2 - (x & 0xf) * y) & 0xf; // y == 1/x mod 2^4 + y = y * (2 - (x & 0xff) * y) & 0xff; // y == 1/x mod 2^8 + y = y * (2 - ((x & 0xffff) * y & 0xffff)) & 0xffff; // y == 1/x mod 2^16 + // last step - calculate inverse mod DV directly; + // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints + y = y * (2 - x * y % this.DV) % this.DV; // y == 1/x mod 2^dbits + // we really want the negative inverse, and -DV < y < DV + return y > 0 ? this.DV - y : -y; +} + +// Montgomery reduction + +function Montgomery(m) { + this.m = m; + this.mp = m.invDigit(); + this.mpl = this.mp & 0x7fff; + this.mph = this.mp >> 15; + this.um = (1 << m.DB - 15) - 1; + this.mt2 = 2 * m.t; +} + +// xR mod m + +function montConvert(x) { + var r = nbi(); + x.abs().dlShiftTo(this.m.t, r); + r.divRemTo(this.m, null, r); + if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r); + return r; +} + +// x/R mod m + +function montRevert(x) { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; +} + +// x = x/R mod m (HAC 14.32) + +function montReduce(x) { + while (x.t <= this.mt2) { + // pad x so am has enough room later + x[x.t++] = 0; + }for (var i = 0; i < this.m.t; ++i) { + // faster way of calculating u0 = x[i]*mp mod DV + var j = x[i] & 0x7fff; + var u0 = j * this.mpl + ((j * this.mph + (x[i] >> 15) * this.mpl & this.um) << 15) & x.DM; + // use am to combine the multiply-shift-add into one call + j = i + this.m.t; + x[j] += this.m.am(0, u0, x, i, 0, this.m.t); + // propagate carry + while (x[j] >= x.DV) { + x[j] -= x.DV; + x[++j]++; + } + } + x.clamp(); + x.drShiftTo(this.m.t, x); + if (x.compareTo(this.m) >= 0) x.subTo(this.m, x); +} + +// r = "x^2/R mod m"; x != r + +function montSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); +} + +// r = "xy/R mod m"; x,y != r + +function montMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); +} + +Montgomery.prototype.convert = montConvert; +Montgomery.prototype.revert = montRevert; +Montgomery.prototype.reduce = montReduce; +Montgomery.prototype.mulTo = montMulTo; +Montgomery.prototype.sqrTo = montSqrTo; + +// (protected) true iff this is even + +function bnpIsEven() { + return (this.t > 0 ? this[0] & 1 : this.s) == 0; +} + +// (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) + +function bnpExp(e, z) { + if (e > 0xffffffff || e < 1) return BigInteger.ONE; + var r = nbi(), + r2 = nbi(), + g = z.convert(this), + i = nbits(e) - 1; + g.copyTo(r); + while (--i >= 0) { + z.sqrTo(r, r2); + if ((e & 1 << i) > 0) z.mulTo(r2, g, r);else { + var t = r; + r = r2; + r2 = t; + } + } + return z.revert(r); +} + +// (public) this^e % m, 0 <= e < 2^32 + +function bnModPowInt(e, m) { + var z; + if (e < 256 || m.isEven()) z = new Classic(m);else z = new Montgomery(m); + return this.exp(e, z); +} + +// protected +BigInteger.prototype.copyTo = bnpCopyTo; +BigInteger.prototype.fromInt = bnpFromInt; +BigInteger.prototype.fromString = bnpFromString; +BigInteger.prototype.clamp = bnpClamp; +BigInteger.prototype.dlShiftTo = bnpDLShiftTo; +BigInteger.prototype.drShiftTo = bnpDRShiftTo; +BigInteger.prototype.lShiftTo = bnpLShiftTo; +BigInteger.prototype.rShiftTo = bnpRShiftTo; +BigInteger.prototype.subTo = bnpSubTo; +BigInteger.prototype.multiplyTo = bnpMultiplyTo; +BigInteger.prototype.squareTo = bnpSquareTo; +BigInteger.prototype.divRemTo = bnpDivRemTo; +BigInteger.prototype.invDigit = bnpInvDigit; +BigInteger.prototype.isEven = bnpIsEven; +BigInteger.prototype.exp = bnpExp; + +// public +BigInteger.prototype.toString = bnToString; +BigInteger.prototype.negate = bnNegate; +BigInteger.prototype.abs = bnAbs; +BigInteger.prototype.compareTo = bnCompareTo; +BigInteger.prototype.bitLength = bnBitLength; +BigInteger.prototype.mod = bnMod; +BigInteger.prototype.modPowInt = bnModPowInt; + +// "constants" +BigInteger.ZERO = nbv(0); +BigInteger.ONE = nbv(1); +BigInteger.TWO = nbv(2); + +/* + * Copyright (c) 2003-2005 Tom Wu (tjw@cs.Stanford.EDU) + * All Rights Reserved. + * + * Modified by Recurity Labs GmbH + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF + * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * In addition, the following condition applies: + * + * All redistributions must retain an intact copy of this copyright notice + * and disclaimer. + */ + +// Extended JavaScript BN functions, required for RSA private ops. + +// Version 1.1: new BigInteger("0", 10) returns "proper" zero +// Version 1.2: square() API, isProbablePrime fix + +// (public) +function bnClone() { + var r = nbi(); + this.copyTo(r); + return r; +} + +// (public) return value as integer + +function bnIntValue() { + if (this.s < 0) { + if (this.t == 1) return this[0] - this.DV;else if (this.t == 0) return -1; + } else if (this.t == 1) return this[0];else if (this.t == 0) return 0; + // assumes 16 < DB < 32 + return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0]; +} + +// (public) return value as byte + +function bnByteValue() { + return this.t == 0 ? this.s : this[0] << 24 >> 24; +} + +// (public) return value as short (assumes DB>=16) + +function bnShortValue() { + return this.t == 0 ? this.s : this[0] << 16 >> 16; +} + +// (protected) return x s.t. r^x < DV + +function bnpChunkSize(r) { + return Math.floor(Math.LN2 * this.DB / Math.log(r)); +} + +// (public) 0 if this == 0, 1 if this > 0 + +function bnSigNum() { + if (this.s < 0) return -1;else if (this.t <= 0 || this.t == 1 && this[0] <= 0) return 0;else return 1; +} + +// (protected) convert to radix string + +function bnpToRadix(b) { + if (b == null) b = 10; + if (this.signum() == 0 || b < 2 || b > 36) return "0"; + var cs = this.chunkSize(b); + var a = Math.pow(b, cs); + var d = nbv(a), + y = nbi(), + z = nbi(), + r = ""; + this.divRemTo(d, y, z); + while (y.signum() > 0) { + r = (a + z.intValue()).toString(b).substr(1) + r; + y.divRemTo(d, y, z); + } + return z.intValue().toString(b) + r; +} + +// (protected) convert from radix string + +function bnpFromRadix(s, b) { + this.fromInt(0); + if (b == null) b = 10; + var cs = this.chunkSize(b); + var d = Math.pow(b, cs), + mi = false, + j = 0, + w = 0; + for (var i = 0; i < s.length; ++i) { + var x = intAt(s, i); + if (x < 0) { + if (s.charAt(i) == "-" && this.signum() == 0) mi = true; + continue; + } + w = b * w + x; + if (++j >= cs) { + this.dMultiply(d); + this.dAddOffset(w, 0); + j = 0; + w = 0; + } + } + if (j > 0) { + this.dMultiply(Math.pow(b, j)); + this.dAddOffset(w, 0); + } + if (mi) BigInteger.ZERO.subTo(this, this); +} + +// (protected) alternate constructor + +function bnpFromNumber(a, b, c) { + if ("number" == typeof b) { + // new BigInteger(int,int,RNG) + if (a < 2) this.fromInt(1);else { + this.fromNumber(a, c); + if (!this.testBit(a - 1)) // force MSB set + this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this); + if (this.isEven()) this.dAddOffset(1, 0); // force odd + while (!this.isProbablePrime(b)) { + this.dAddOffset(2, 0); + if (this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a - 1), this); + } + } + } else { + // new BigInteger(int,RNG) + var x = new Array(), + t = a & 7; + x.length = (a >> 3) + 1; + b.nextBytes(x); + if (t > 0) x[0] &= (1 << t) - 1;else x[0] = 0; + this.fromString(x, 256); + } +} + +// (public) convert to bigendian byte array + +function bnToByteArray() { + var i = this.t, + r = new Array(); + r[0] = this.s; + var p = this.DB - i * this.DB % 8, + d, + k = 0; + if (i-- > 0) { + if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) r[k++] = d | this.s << this.DB - p; + while (i >= 0) { + if (p < 8) { + d = (this[i] & (1 << p) - 1) << 8 - p; + d |= this[--i] >> (p += this.DB - 8); + } else { + d = this[i] >> (p -= 8) & 0xff; + if (p <= 0) { + p += this.DB; + --i; + } + } + //if((d&0x80) != 0) d |= -256; + //if(k == 0 && (this.s&0x80) != (d&0x80)) ++k; + if (k > 0 || d != this.s) r[k++] = d; + } + } + return r; +} + +function bnEquals(a) { + return this.compareTo(a) == 0; +} + +function bnMin(a) { + return this.compareTo(a) < 0 ? this : a; +} + +function bnMax(a) { + return this.compareTo(a) > 0 ? this : a; +} + +// (protected) r = this op a (bitwise) + +function bnpBitwiseTo(a, op, r) { + var i, + f, + m = Math.min(a.t, this.t); + for (i = 0; i < m; ++i) { + r[i] = op(this[i], a[i]); + }if (a.t < this.t) { + f = a.s & this.DM; + for (i = m; i < this.t; ++i) { + r[i] = op(this[i], f); + }r.t = this.t; + } else { + f = this.s & this.DM; + for (i = m; i < a.t; ++i) { + r[i] = op(f, a[i]); + }r.t = a.t; + } + r.s = op(this.s, a.s); + r.clamp(); +} + +// (public) this & a + +function op_and(x, y) { + return x & y; +} + +function bnAnd(a) { + var r = nbi(); + this.bitwiseTo(a, op_and, r); + return r; +} + +// (public) this | a + +function op_or(x, y) { + return x | y; +} + +function bnOr(a) { + var r = nbi(); + this.bitwiseTo(a, op_or, r); + return r; +} + +// (public) this ^ a + +function op_xor(x, y) { + return x ^ y; +} + +function bnXor(a) { + var r = nbi(); + this.bitwiseTo(a, op_xor, r); + return r; +} + +// (public) this & ~a + +function op_andnot(x, y) { + return x & ~y; +} + +function bnAndNot(a) { + var r = nbi(); + this.bitwiseTo(a, op_andnot, r); + return r; +} + +// (public) ~this + +function bnNot() { + var r = nbi(); + for (var i = 0; i < this.t; ++i) { + r[i] = this.DM & ~this[i]; + }r.t = this.t; + r.s = ~this.s; + return r; +} + +// (public) this << n + +function bnShiftLeft(n) { + var r = nbi(); + if (n < 0) this.rShiftTo(-n, r);else this.lShiftTo(n, r); + return r; +} + +// (public) this >> n + +function bnShiftRight(n) { + var r = nbi(); + if (n < 0) this.lShiftTo(-n, r);else this.rShiftTo(n, r); + return r; +} + +// return index of lowest 1-bit in x, x < 2^31 + +function lbit(x) { + if (x == 0) return -1; + var r = 0; + if ((x & 0xffff) == 0) { + x >>= 16; + r += 16; + } + if ((x & 0xff) == 0) { + x >>= 8; + r += 8; + } + if ((x & 0xf) == 0) { + x >>= 4; + r += 4; + } + if ((x & 3) == 0) { + x >>= 2; + r += 2; + } + if ((x & 1) == 0) ++r; + return r; +} + +// (public) returns index of lowest 1-bit (or -1 if none) + +function bnGetLowestSetBit() { + for (var i = 0; i < this.t; ++i) { + if (this[i] != 0) return i * this.DB + lbit(this[i]); + }if (this.s < 0) return this.t * this.DB; + return -1; +} + +// return number of 1 bits in x + +function cbit(x) { + var r = 0; + while (x != 0) { + x &= x - 1; + ++r; + } + return r; +} + +// (public) return number of set bits + +function bnBitCount() { + var r = 0, + x = this.s & this.DM; + for (var i = 0; i < this.t; ++i) { + r += cbit(this[i] ^ x); + }return r; +} + +// (public) true iff nth bit is set + +function bnTestBit(n) { + var j = Math.floor(n / this.DB); + if (j >= this.t) return this.s != 0; + return (this[j] & 1 << n % this.DB) != 0; +} + +// (protected) this op (1<>= this.DB; + } + if (a.t < this.t) { + c += a.s; + while (i < this.t) { + c += this[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } else { + c += this.s; + while (i < a.t) { + c += a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += a.s; + } + r.s = c < 0 ? -1 : 0; + if (c > 0) r[i++] = c;else if (c < -1) r[i++] = this.DV + c; + r.t = i; + r.clamp(); +} + +// (public) this + a + +function bnAdd(a) { + var r = nbi(); + this.addTo(a, r); + return r; +} + +// (public) this - a + +function bnSubtract(a) { + var r = nbi(); + this.subTo(a, r); + return r; +} + +// (public) this * a + +function bnMultiply(a) { + var r = nbi(); + this.multiplyTo(a, r); + return r; +} + +// (public) this^2 + +function bnSquare() { + var r = nbi(); + this.squareTo(r); + return r; +} + +// (public) this / a + +function bnDivide(a) { + var r = nbi(); + this.divRemTo(a, r, null); + return r; +} + +// (public) this % a + +function bnRemainder(a) { + var r = nbi(); + this.divRemTo(a, null, r); + return r; +} + +// (public) [this/a,this%a] + +function bnDivideAndRemainder(a) { + var q = nbi(), + r = nbi(); + this.divRemTo(a, q, r); + return new Array(q, r); +} + +// (protected) this *= n, this >= 0, 1 < n < DV + +function bnpDMultiply(n) { + this[this.t] = this.am(0, n - 1, this, 0, 0, this.t); + ++this.t; + this.clamp(); +} + +// (protected) this += n << w words, this >= 0 + +function bnpDAddOffset(n, w) { + if (n == 0) return; + while (this.t <= w) { + this[this.t++] = 0; + }this[w] += n; + while (this[w] >= this.DV) { + this[w] -= this.DV; + if (++w >= this.t) this[this.t++] = 0; + ++this[w]; + } +} + +// A "null" reducer + +function NullExp() {} + +function nNop(x) { + return x; +} + +function nMulTo(x, y, r) { + x.multiplyTo(y, r); +} + +function nSqrTo(x, r) { + x.squareTo(r); +} + +NullExp.prototype.convert = nNop; +NullExp.prototype.revert = nNop; +NullExp.prototype.mulTo = nMulTo; +NullExp.prototype.sqrTo = nSqrTo; + +// (public) this^e + +function bnPow(e) { + return this.exp(e, new NullExp()); +} + +// (protected) r = lower n words of "this * a", a.t <= n +// "this" should be the larger one if appropriate. + +function bnpMultiplyLowerTo(a, n, r) { + var i = Math.min(this.t + a.t, n); + r.s = 0; // assumes a,this >= 0 + r.t = i; + while (i > 0) { + r[--i] = 0; + }var j; + for (j = r.t - this.t; i < j; ++i) { + r[i + this.t] = this.am(0, a[i], r, i, 0, this.t); + }for (j = Math.min(a.t, n); i < j; ++i) { + this.am(0, a[i], r, i, 0, n - i); + }r.clamp(); +} + +// (protected) r = "this * a" without lower n words, n > 0 +// "this" should be the larger one if appropriate. + +function bnpMultiplyUpperTo(a, n, r) { + --n; + var i = r.t = this.t + a.t - n; + r.s = 0; // assumes a,this >= 0 + while (--i >= 0) { + r[i] = 0; + }for (i = Math.max(n - this.t, 0); i < a.t; ++i) { + r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n); + }r.clamp(); + r.drShiftTo(1, r); +} + +// Barrett modular reduction + +function Barrett(m) { + // setup Barrett + this.r2 = nbi(); + this.q3 = nbi(); + BigInteger.ONE.dlShiftTo(2 * m.t, this.r2); + this.mu = this.r2.divide(m); + this.m = m; +} + +function barrettConvert(x) { + if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m);else if (x.compareTo(this.m) < 0) return x;else { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + } +} + +function barrettRevert(x) { + return x; +} + +// x = x mod m (HAC 14.42) + +function barrettReduce(x) { + x.drShiftTo(this.m.t - 1, this.r2); + if (x.t > this.m.t + 1) { + x.t = this.m.t + 1; + x.clamp(); + } + this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3); + this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); + while (x.compareTo(this.r2) < 0) { + x.dAddOffset(1, this.m.t + 1); + }x.subTo(this.r2, x); + while (x.compareTo(this.m) >= 0) { + x.subTo(this.m, x); + } +} + +// r = x^2 mod m; x != r + +function barrettSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); +} + +// r = x*y mod m; x,y != r + +function barrettMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); +} + +Barrett.prototype.convert = barrettConvert; +Barrett.prototype.revert = barrettRevert; +Barrett.prototype.reduce = barrettReduce; +Barrett.prototype.mulTo = barrettMulTo; +Barrett.prototype.sqrTo = barrettSqrTo; + +// (public) this^e % m (HAC 14.85) + +function bnModPow(e, m) { + var i = e.bitLength(), + k, + r = nbv(1), + z; + if (i <= 0) return r;else if (i < 18) k = 1;else if (i < 48) k = 3;else if (i < 144) k = 4;else if (i < 768) k = 5;else k = 6; + if (i < 8) z = new Classic(m);else if (m.isEven()) z = new Barrett(m);else z = new Montgomery(m); + + // precomputation + var g = new Array(), + n = 3, + k1 = k - 1, + km = (1 << k) - 1; + g[1] = z.convert(this); + if (k > 1) { + var g2 = nbi(); + z.sqrTo(g[1], g2); + while (n <= km) { + g[n] = nbi(); + z.mulTo(g2, g[n - 2], g[n]); + n += 2; + } + } + + var j = e.t - 1, + w, + is1 = true, + r2 = nbi(), + t; + i = nbits(e[j]) - 1; + while (j >= 0) { + if (i >= k1) w = e[j] >> i - k1 & km;else { + w = (e[j] & (1 << i + 1) - 1) << k1 - i; + if (j > 0) w |= e[j - 1] >> this.DB + i - k1; + } + + n = k; + while ((w & 1) == 0) { + w >>= 1; + --n; + } + if ((i -= n) < 0) { + i += this.DB; + --j; + } + if (is1) { + // ret == 1, don't bother squaring or multiplying it + g[w].copyTo(r); + is1 = false; + } else { + while (n > 1) { + z.sqrTo(r, r2); + z.sqrTo(r2, r); + n -= 2; + } + if (n > 0) z.sqrTo(r, r2);else { + t = r; + r = r2; + r2 = t; + } + z.mulTo(r2, g[w], r); + } + + while (j >= 0 && (e[j] & 1 << i) == 0) { + z.sqrTo(r, r2); + t = r; + r = r2; + r2 = t; + if (--i < 0) { + i = this.DB - 1; + --j; + } + } + } + return z.revert(r); +} + +// (public) gcd(this,a) (HAC 14.54) + +function bnGCD(a) { + var x = this.s < 0 ? this.negate() : this.clone(); + var y = a.s < 0 ? a.negate() : a.clone(); + if (x.compareTo(y) < 0) { + var t = x; + x = y; + y = t; + } + var i = x.getLowestSetBit(), + g = y.getLowestSetBit(); + if (g < 0) return x; + if (i < g) g = i; + if (g > 0) { + x.rShiftTo(g, x); + y.rShiftTo(g, y); + } + while (x.signum() > 0) { + if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x); + if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y); + if (x.compareTo(y) >= 0) { + x.subTo(y, x); + x.rShiftTo(1, x); + } else { + y.subTo(x, y); + y.rShiftTo(1, y); + } + } + if (g > 0) y.lShiftTo(g, y); + return y; +} + +// (protected) this % n, n < 2^26 + +function bnpModInt(n) { + if (n <= 0) return 0; + var d = this.DV % n, + r = this.s < 0 ? n - 1 : 0; + if (this.t > 0) if (d == 0) r = this[0] % n;else for (var i = this.t - 1; i >= 0; --i) { + r = (d * r + this[i]) % n; + }return r; +} + +// (public) 1/this % m (HAC 14.61) + +function bnModInverse(m) { + var ac = m.isEven(); + if (this.isEven() && ac || m.signum() == 0) return BigInteger.ZERO; + var u = m.clone(), + v = this.clone(); + var a = nbv(1), + b = nbv(0), + c = nbv(0), + d = nbv(1); + while (u.signum() != 0) { + while (u.isEven()) { + u.rShiftTo(1, u); + if (ac) { + if (!a.isEven() || !b.isEven()) { + a.addTo(this, a); + b.subTo(m, b); + } + a.rShiftTo(1, a); + } else if (!b.isEven()) b.subTo(m, b); + b.rShiftTo(1, b); + } + while (v.isEven()) { + v.rShiftTo(1, v); + if (ac) { + if (!c.isEven() || !d.isEven()) { + c.addTo(this, c); + d.subTo(m, d); + } + c.rShiftTo(1, c); + } else if (!d.isEven()) d.subTo(m, d); + d.rShiftTo(1, d); + } + if (u.compareTo(v) >= 0) { + u.subTo(v, u); + if (ac) a.subTo(c, a); + b.subTo(d, b); + } else { + v.subTo(u, v); + if (ac) c.subTo(a, c); + d.subTo(b, d); + } + } + if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO; + if (d.compareTo(m) >= 0) return d.subtract(m); + if (d.signum() < 0) d.addTo(m, d);else return d; + if (d.signum() < 0) return d.add(m);else return d; +} + +var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]; +var lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; + +// (public) test primality with certainty >= 1-.5^t + +function bnIsProbablePrime(t) { + var i, + x = this.abs(); + if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) { + for (i = 0; i < lowprimes.length; ++i) { + if (x[0] == lowprimes[i]) return true; + }return false; + } + if (x.isEven()) return false; + i = 1; + while (i < lowprimes.length) { + var m = lowprimes[i], + j = i + 1; + while (j < lowprimes.length && m < lplim) { + m *= lowprimes[j++]; + }m = x.modInt(m); + while (i < j) { + if (m % lowprimes[i++] == 0) return false; + } + } + return x.millerRabin(t); +} + +/* added by Recurity Labs */ + +function nbits(x) { + var n = 1, + t; + if ((t = x >>> 16) != 0) { + x = t; + n += 16; + } + if ((t = x >> 8) != 0) { + x = t; + n += 8; + } + if ((t = x >> 4) != 0) { + x = t; + n += 4; + } + if ((t = x >> 2) != 0) { + x = t; + n += 2; + } + if ((t = x >> 1) != 0) { + x = t; + n += 1; + } + return n; +} + +function bnToMPI() { + var ba = this.toByteArray(); + var size = (ba.length - 1) * 8 + nbits(ba[0]); + var result = ""; + result += String.fromCharCode((size & 0xFF00) >> 8); + result += String.fromCharCode(size & 0xFF); + result += _util2.default.bin2str(ba); + return result; +} +/* END of addition */ + +// (protected) true if probably prime (HAC 4.24, Miller-Rabin) +function bnpMillerRabin(t) { + var n1 = this.subtract(BigInteger.ONE); + var k = n1.getLowestSetBit(); + if (k <= 0) return false; + var r = n1.shiftRight(k); + t = t + 1 >> 1; + if (t > lowprimes.length) t = lowprimes.length; + var a = nbi(); + var j, + bases = []; + for (var i = 0; i < t; ++i) { + //Pick bases at random, instead of starting at 2 + for (;;) { + j = lowprimes[Math.floor(Math.random() * lowprimes.length)]; + if (bases.indexOf(j) == -1) break; + } + bases.push(j); + a.fromInt(j); + var y = a.modPow(r, this); + if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { + var j = 1; + while (j++ < k && y.compareTo(n1) != 0) { + y = y.modPowInt(2, this); + if (y.compareTo(BigInteger.ONE) == 0) return false; + } + if (y.compareTo(n1) != 0) return false; + } + } + return true; +} + +// protected +BigInteger.prototype.chunkSize = bnpChunkSize; +BigInteger.prototype.toRadix = bnpToRadix; +BigInteger.prototype.fromRadix = bnpFromRadix; +BigInteger.prototype.fromNumber = bnpFromNumber; +BigInteger.prototype.bitwiseTo = bnpBitwiseTo; +BigInteger.prototype.changeBit = bnpChangeBit; +BigInteger.prototype.addTo = bnpAddTo; +BigInteger.prototype.dMultiply = bnpDMultiply; +BigInteger.prototype.dAddOffset = bnpDAddOffset; +BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; +BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; +BigInteger.prototype.modInt = bnpModInt; +BigInteger.prototype.millerRabin = bnpMillerRabin; + +// public +BigInteger.prototype.clone = bnClone; +BigInteger.prototype.intValue = bnIntValue; +BigInteger.prototype.byteValue = bnByteValue; +BigInteger.prototype.shortValue = bnShortValue; +BigInteger.prototype.signum = bnSigNum; +BigInteger.prototype.toByteArray = bnToByteArray; +BigInteger.prototype.equals = bnEquals; +BigInteger.prototype.min = bnMin; +BigInteger.prototype.max = bnMax; +BigInteger.prototype.and = bnAnd; +BigInteger.prototype.or = bnOr; +BigInteger.prototype.xor = bnXor; +BigInteger.prototype.andNot = bnAndNot; +BigInteger.prototype.not = bnNot; +BigInteger.prototype.shiftLeft = bnShiftLeft; +BigInteger.prototype.shiftRight = bnShiftRight; +BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; +BigInteger.prototype.bitCount = bnBitCount; +BigInteger.prototype.testBit = bnTestBit; +BigInteger.prototype.setBit = bnSetBit; +BigInteger.prototype.clearBit = bnClearBit; +BigInteger.prototype.flipBit = bnFlipBit; +BigInteger.prototype.add = bnAdd; +BigInteger.prototype.subtract = bnSubtract; +BigInteger.prototype.multiply = bnMultiply; +BigInteger.prototype.divide = bnDivide; +BigInteger.prototype.remainder = bnRemainder; +BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder; +BigInteger.prototype.modPow = bnModPow; +BigInteger.prototype.modInverse = bnModInverse; +BigInteger.prototype.pow = bnPow; +BigInteger.prototype.gcd = bnGCD; +BigInteger.prototype.isProbablePrime = bnIsProbablePrime; +BigInteger.prototype.toMPI = bnToMPI; + +// JSBN-specific extension +BigInteger.prototype.square = bnSquare; + +},{"../../util.js":70}],30:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// RSA implementation + +/** + * @requires crypto/public_key/jsbn + * @requires crypto/random + * @requires util + * @module crypto/public_key/rsa + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = RSA; + +var _jsbn = _dereq_('./jsbn.js'); + +var _jsbn2 = _interopRequireDefault(_jsbn); + +var _util = _dereq_('../../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _random = _dereq_('../random.js'); + +var _random2 = _interopRequireDefault(_random); + +var _config = _dereq_('../../config'); + +var _config2 = _interopRequireDefault(_config); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function SecureRandom() { + function nextBytes(byteArray) { + for (var n = 0; n < byteArray.length; n++) { + byteArray[n] = _random2.default.getSecureRandomOctet(); + } + } + this.nextBytes = nextBytes; +} + +var blinder = _jsbn2.default.ZERO; +var unblinder = _jsbn2.default.ZERO; + +function blind(m, n, e) { + if (unblinder.bitLength() === n.bitLength()) { + unblinder = unblinder.square().mod(n); + } else { + unblinder = _random2.default.getRandomBigIntegerInRange(_jsbn2.default.TWO, n); + } + blinder = unblinder.modInverse(n).modPow(e, n); + return m.multiply(blinder).mod(n); +} + +function unblind(t, n) { + return t.multiply(unblinder).mod(n); +} + +function RSA() { + /** + * This function uses jsbn Big Num library to decrypt RSA + * @param m + * message + * @param n + * RSA public modulus n as BigInteger + * @param e + * RSA public exponent as BigInteger + * @param d + * RSA d as BigInteger + * @param p + * RSA p as BigInteger + * @param q + * RSA q as BigInteger + * @param u + * RSA u as BigInteger + * @return {BigInteger} The decrypted value of the message + */ + function decrypt(m, n, e, d, p, q, u) { + if (_config2.default.rsa_blinding) { + m = blind(m, n, e); + } + var xp = m.mod(p).modPow(d.mod(p.subtract(_jsbn2.default.ONE)), p); + var xq = m.mod(q).modPow(d.mod(q.subtract(_jsbn2.default.ONE)), q); + _util2.default.print_debug("rsa.js decrypt\nxpn:" + _util2.default.hexstrdump(xp.toMPI()) + "\nxqn:" + _util2.default.hexstrdump(xq.toMPI())); + + var t = xq.subtract(xp); + if (t[0] === 0) { + t = xp.subtract(xq); + t = t.multiply(u).mod(q); + t = q.subtract(t); + } else { + t = t.multiply(u).mod(q); + } + t = t.multiply(p).add(xp); + if (_config2.default.rsa_blinding) { + t = unblind(t, n); + } + return t; + } + + /** + * encrypt message + * @param m message as BigInteger + * @param e public MPI part as BigInteger + * @param n public MPI part as BigInteger + * @return BigInteger + */ + function encrypt(m, e, n) { + return m.modPowInt(e, n); + } + + /* Sign and Verify */ + function sign(m, d, n) { + return m.modPow(d, n); + } + + function verify(x, e, n) { + return x.modPowInt(e, n); + } + + // "empty" RSA key constructor + + function KeyObject() { + this.n = null; + this.e = 0; + this.ee = null; + this.d = null; + this.p = null; + this.q = null; + this.dmp1 = null; + this.dmq1 = null; + this.u = null; + } + + // Generate a new random private key B bits long, using public expt E + + function generate(B, E) { + var webCrypto = _util2.default.getWebCryptoAll(); + + // + // Native RSA keygen using Web Crypto + // + + if (webCrypto) { + var Euint32 = new Uint32Array([parseInt(E, 16)]); // get integer of exponent + var Euint8 = new Uint8Array(Euint32.buffer); // get bytes of exponent + var keyGenOpt; + + var keys; + if (window.crypto && window.crypto.webkitSubtle) { + // outdated spec implemented by Webkit + keyGenOpt = { + name: 'RSA-OAEP', + modulusLength: B, // the specified keysize in bits + publicExponent: Euint8.subarray(0, 3), // take three bytes (max 65537) + hash: { + name: 'SHA-1' // not required for actual RSA keys, but for crypto api 'sign' and 'verify' + } + }; + keys = webCrypto.generateKey(keyGenOpt, true, ['encrypt', 'decrypt']); + } else { + // current standard spec + keyGenOpt = { + name: 'RSASSA-PKCS1-v1_5', + modulusLength: B, // the specified keysize in bits + publicExponent: Euint8.subarray(0, 3), // take three bytes (max 65537) + hash: { + name: 'SHA-1' // not required for actual RSA keys, but for crypto api 'sign' and 'verify' + } + }; + + keys = webCrypto.generateKey(keyGenOpt, true, ['sign', 'verify']); + if (typeof keys.then !== 'function') { + // IE11 KeyOperation + keys = _util2.default.promisifyIE11Op(keys, 'Error generating RSA key pair.'); + } + } + + return keys.then(exportKey).then(function (key) { + if (key instanceof ArrayBuffer) { + // parse raw ArrayBuffer bytes to jwk/json (WebKit/Safari/IE11 quirk) + return decodeKey(JSON.parse(String.fromCharCode.apply(null, new Uint8Array(key)))); + } + return decodeKey(key); + }); + } + + function exportKey(keypair) { + // export the generated keys as JsonWebKey (JWK) + // https://tools.ietf.org/html/draft-ietf-jose-json-web-key-33 + var key = webCrypto.exportKey('jwk', keypair.privateKey); + if (typeof key.then !== 'function') { + // IE11 KeyOperation + key = _util2.default.promisifyIE11Op(key, 'Error exporting RSA key pair.'); + } + return key; + } + + function decodeKey(jwk) { + // map JWK parameters to local BigInteger type system + var key = new KeyObject(); + key.n = toBigInteger(jwk.n); + key.ee = new _jsbn2.default(E, 16); + key.d = toBigInteger(jwk.d); + key.p = toBigInteger(jwk.p); + key.q = toBigInteger(jwk.q); + key.u = key.p.modInverse(key.q); + + function toBigInteger(base64url) { + var base64 = base64url.replace(/\-/g, '+').replace(/_/g, '/'); + var hex = _util2.default.hexstrdump(atob(base64)); + return new _jsbn2.default(hex, 16); + } + + return key; + } + + // + // JS code + // + + return new Promise(function (resolve) { + var key = new KeyObject(); + var rng = new SecureRandom(); + var qs = B >> 1; + key.e = parseInt(E, 16); + key.ee = new _jsbn2.default(E, 16); + + for (;;) { + for (;;) { + key.p = new _jsbn2.default(B - qs, 1, rng); + if (key.p.subtract(_jsbn2.default.ONE).gcd(key.ee).compareTo(_jsbn2.default.ONE) === 0 && key.p.isProbablePrime(10)) { + break; + } + } + for (;;) { + key.q = new _jsbn2.default(qs, 1, rng); + if (key.q.subtract(_jsbn2.default.ONE).gcd(key.ee).compareTo(_jsbn2.default.ONE) === 0 && key.q.isProbablePrime(10)) { + break; + } + } + if (key.p.compareTo(key.q) <= 0) { + var t = key.p; + key.p = key.q; + key.q = t; + } + var p1 = key.p.subtract(_jsbn2.default.ONE); + var q1 = key.q.subtract(_jsbn2.default.ONE); + var phi = p1.multiply(q1); + if (phi.gcd(key.ee).compareTo(_jsbn2.default.ONE) === 0) { + key.n = key.p.multiply(key.q); + key.d = key.ee.modInverse(phi); + key.dmp1 = key.d.mod(p1); + key.dmq1 = key.d.mod(q1); + key.u = key.p.modInverse(key.q); + break; + } + } + + resolve(key); + }); + } + + this.encrypt = encrypt; + this.decrypt = decrypt; + this.verify = verify; + this.sign = sign; + this.generate = generate; + this.keyObject = KeyObject; +} + +},{"../../config":10,"../../util.js":70,"../random.js":31,"./jsbn.js":29}],31:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +// The GPG4Browsers crypto interface + +/** + * @requires type/mpi + * @requires util + * @module crypto/random + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _mpi = _dereq_('../type/mpi.js'); + +var _mpi2 = _interopRequireDefault(_mpi); + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var nodeCrypto = _util2.default.detectNode() && _dereq_('crypto'); + +exports.default = { + /** + * Retrieve secure random byte array of the specified length + * @param {Integer} length Length in bytes to generate + * @return {Uint8Array} Random byte array + */ + getRandomBytes: function getRandomBytes(length) { + var result = new Uint8Array(length); + for (var i = 0; i < length; i++) { + result[i] = this.getSecureRandomOctet(); + } + return result; + }, + + /** + * Return a secure random number in the specified range + * @param {Integer} from Min of the random number + * @param {Integer} to Max of the random number (max 32bit) + * @return {Integer} A secure random number + */ + getSecureRandom: function getSecureRandom(from, to) { + var randUint = this.getSecureRandomUint(); + var bits = (to - from).toString(2).length; + while ((randUint & Math.pow(2, bits) - 1) > to - from) { + randUint = this.getSecureRandomUint(); + } + return from + Math.abs(randUint & Math.pow(2, bits) - 1); + }, + + getSecureRandomOctet: function getSecureRandomOctet() { + var buf = new Uint8Array(1); + this.getRandomValues(buf); + return buf[0]; + }, + + getSecureRandomUint: function getSecureRandomUint() { + var buf = new Uint8Array(4); + var dv = new DataView(buf.buffer); + this.getRandomValues(buf); + return dv.getUint32(0); + }, + + /** + * Helper routine which calls platform specific crypto random generator + * @param {Uint8Array} buf + */ + getRandomValues: function getRandomValues(buf) { + if (!(buf instanceof Uint8Array)) { + throw new Error('Invalid type: buf not an Uint8Array'); + } + if (typeof window !== 'undefined' && window.crypto && window.crypto.getRandomValues) { + window.crypto.getRandomValues(buf); + } else if (typeof window !== 'undefined' && _typeof(window.msCrypto) === 'object' && typeof window.msCrypto.getRandomValues === 'function') { + window.msCrypto.getRandomValues(buf); + } else if (nodeCrypto) { + var bytes = nodeCrypto.randomBytes(buf.length); + buf.set(bytes); + } else if (this.randomBuffer.buffer) { + this.randomBuffer.get(buf); + } else { + throw new Error('No secure random number generator available.'); + } + return buf; + }, + + /** + * Create a secure random big integer of bits length + * @param {Integer} bits Bit length of the MPI to create + * @return {BigInteger} Resulting big integer + */ + getRandomBigInteger: function getRandomBigInteger(bits) { + if (bits < 1) { + throw new Error('Illegal parameter value: bits < 1'); + } + var numBytes = Math.floor((bits + 7) / 8); + + var randomBits = _util2.default.Uint8Array2str(this.getRandomBytes(numBytes)); + if (bits % 8 > 0) { + + randomBits = String.fromCharCode(Math.pow(2, bits % 8) - 1 & randomBits.charCodeAt(0)) + randomBits.substring(1); + } + var mpi = new _mpi2.default(); + mpi.fromBytes(randomBits); + return mpi.toBigInteger(); + }, + + getRandomBigIntegerInRange: function getRandomBigIntegerInRange(min, max) { + if (max.compareTo(min) <= 0) { + throw new Error('Illegal parameter value: max <= min'); + } + + var range = max.subtract(min); + var r = this.getRandomBigInteger(range.bitLength()); + while (r.compareTo(range) > 0) { + r = this.getRandomBigInteger(range.bitLength()); + } + return min.add(r); + }, + + randomBuffer: new RandomBuffer() + +}; + +/** + * Buffer for secure random numbers + */ + +function RandomBuffer() { + this.buffer = null; + this.size = null; +} + +/** + * Initialize buffer + * @param {Integer} size size of buffer + */ +RandomBuffer.prototype.init = function (size) { + this.buffer = new Uint8Array(size); + this.size = 0; +}; + +/** + * Concat array of secure random numbers to buffer + * @param {Uint8Array} buf + */ +RandomBuffer.prototype.set = function (buf) { + if (!this.buffer) { + throw new Error('RandomBuffer is not initialized'); + } + if (!(buf instanceof Uint8Array)) { + throw new Error('Invalid type: buf not an Uint8Array'); + } + var freeSpace = this.buffer.length - this.size; + if (buf.length > freeSpace) { + buf = buf.subarray(0, freeSpace); + } + // set buf with offset old size of buffer + this.buffer.set(buf, this.size); + this.size += buf.length; +}; + +/** + * Take numbers out of buffer and copy to array + * @param {Uint8Array} buf the destination array + */ +RandomBuffer.prototype.get = function (buf) { + if (!this.buffer) { + throw new Error('RandomBuffer is not initialized'); + } + if (!(buf instanceof Uint8Array)) { + throw new Error('Invalid type: buf not an Uint8Array'); + } + if (this.size < buf.length) { + throw new Error('Random number buffer depleted'); + } + for (var i = 0; i < buf.length; i++) { + buf[i] = this.buffer[--this.size]; + // clear buffer value + this.buffer[this.size] = 0; + } +}; + +},{"../type/mpi.js":68,"../util.js":70,"crypto":"crypto"}],32:[function(_dereq_,module,exports){ +/** + * @requires util + * @requires crypto/hash + * @requires crypto/pkcs1 + * @requires crypto/public_key + * @module crypto/signature */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _util = _dereq_('../util'); + +var _util2 = _interopRequireDefault(_util); + +var _public_key = _dereq_('./public_key'); + +var _public_key2 = _interopRequireDefault(_public_key); + +var _pkcs = _dereq_('./pkcs1.js'); + +var _pkcs2 = _interopRequireDefault(_pkcs); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = { + /** + * + * @param {module:enums.publicKey} algo public Key algorithm + * @param {module:enums.hash} hash_algo Hash algorithm + * @param {Array} msg_MPIs Signature multiprecision integers + * @param {Array} publickey_MPIs Public key multiprecision integers + * @param {Uint8Array} data Data on where the signature was computed on. + * @return {Boolean} true if signature (sig_data was equal to data over hash) + */ + verify: function verify(algo, hash_algo, msg_MPIs, publickey_MPIs, data) { + var m; + + data = _util2.default.Uint8Array2str(data); + + switch (algo) { + case 1: + // RSA (Encrypt or Sign) [HAC] + case 2: + // RSA Encrypt-Only [HAC] + case 3: + // RSA Sign-Only [HAC] + var rsa = new _public_key2.default.rsa(); + var n = publickey_MPIs[0].toBigInteger(); + var k = publickey_MPIs[0].byteLength(); + var e = publickey_MPIs[1].toBigInteger(); + m = msg_MPIs[0].toBigInteger(); + var EM = rsa.verify(m, e, n); + var EM2 = _pkcs2.default.emsa.encode(hash_algo, data, k); + return EM.compareTo(EM2) === 0; + case 16: + // Elgamal (Encrypt-Only) [ELGAMAL] [HAC] + throw new Error("signing with Elgamal is not defined in the OpenPGP standard."); + case 17: + // DSA (Digital Signature Algorithm) [FIPS186] [HAC] + var dsa = new _public_key2.default.dsa(); + var s1 = msg_MPIs[0].toBigInteger(); + var s2 = msg_MPIs[1].toBigInteger(); + var p = publickey_MPIs[0].toBigInteger(); + var q = publickey_MPIs[1].toBigInteger(); + var g = publickey_MPIs[2].toBigInteger(); + var y = publickey_MPIs[3].toBigInteger(); + m = data; + var dopublic = dsa.verify(hash_algo, s1, s2, m, p, q, g, y); + return dopublic.compareTo(s1) === 0; + default: + throw new Error('Invalid signature algorithm.'); + } + }, + + /** + * Create a signature on data using the specified algorithm + * @param {module:enums.hash} hash_algo hash Algorithm to use (See {@link http://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4}) + * @param {module:enums.publicKey} algo Asymmetric cipher algorithm to use (See {@link http://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1}) + * @param {Array} publicMPIs Public key multiprecision integers + * of the private key + * @param {Array} secretMPIs Private key multiprecision + * integers which is used to sign the data + * @param {Uint8Array} data Data to be signed + * @return {Array} + */ + sign: function sign(hash_algo, algo, keyIntegers, data) { + + data = _util2.default.Uint8Array2str(data); + + var m; + + switch (algo) { + case 1: + // RSA (Encrypt or Sign) [HAC] + case 2: + // RSA Encrypt-Only [HAC] + case 3: + // RSA Sign-Only [HAC] + var rsa = new _public_key2.default.rsa(); + var d = keyIntegers[2].toBigInteger(); + var n = keyIntegers[0].toBigInteger(); + m = _pkcs2.default.emsa.encode(hash_algo, data, keyIntegers[0].byteLength()); + return _util2.default.str2Uint8Array(rsa.sign(m, d, n).toMPI()); + + case 17: + // DSA (Digital Signature Algorithm) [FIPS186] [HAC] + var dsa = new _public_key2.default.dsa(); + + var p = keyIntegers[0].toBigInteger(); + var q = keyIntegers[1].toBigInteger(); + var g = keyIntegers[2].toBigInteger(); + var x = keyIntegers[4].toBigInteger(); + m = data; + var result = dsa.sign(hash_algo, m, g, p, q, x); + + return _util2.default.str2Uint8Array(result[0].toString() + result[1].toString()); + case 16: + // Elgamal (Encrypt-Only) [ELGAMAL] [HAC] + throw new Error('Signing with Elgamal is not defined in the OpenPGP standard.'); + default: + throw new Error('Invalid signature algorithm.'); + } + } +}; + +},{"../util":70,"./pkcs1.js":25,"./public_key":28}],33:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @requires encoding/base64 + * @requires enums + * @requires config + * @module encoding/armor + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _base = _dereq_('./base64.js'); + +var _base2 = _interopRequireDefault(_base); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _config = _dereq_('../config'); + +var _config2 = _interopRequireDefault(_config); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Finds out which Ascii Armoring type is used. Throws error if unknown type. + * @private + * @param {String} text [String] ascii armored text + * @returns {Integer} 0 = MESSAGE PART n of m + * 1 = MESSAGE PART n + * 2 = SIGNED MESSAGE + * 3 = PGP MESSAGE + * 4 = PUBLIC KEY BLOCK + * 5 = PRIVATE KEY BLOCK + * 6 = SIGNATURE + */ +function getType(text) { + var reHeader = /^-----BEGIN PGP (MESSAGE, PART \d+\/\d+|MESSAGE, PART \d+|SIGNED MESSAGE|MESSAGE|PUBLIC KEY BLOCK|PRIVATE KEY BLOCK|SIGNATURE)-----$\n/m; + + var header = text.match(reHeader); + + if (!header) { + throw new Error('Unknown ASCII armor type'); + } + + // BEGIN PGP MESSAGE, PART X/Y + // Used for multi-part messages, where the armor is split amongst Y + // parts, and this is the Xth part out of Y. + if (/MESSAGE, PART \d+\/\d+/.test(header[1])) { + return _enums2.default.armor.multipart_section; + } else + // BEGIN PGP MESSAGE, PART X + // Used for multi-part messages, where this is the Xth part of an + // unspecified number of parts. Requires the MESSAGE-ID Armor + // Header to be used. + if (/MESSAGE, PART \d+/.test(header[1])) { + return _enums2.default.armor.multipart_last; + } else + // BEGIN PGP SIGNED MESSAGE + if (/SIGNED MESSAGE/.test(header[1])) { + return _enums2.default.armor.signed; + } else + // BEGIN PGP MESSAGE + // Used for signed, encrypted, or compressed files. + if (/MESSAGE/.test(header[1])) { + return _enums2.default.armor.message; + } else + // BEGIN PGP PUBLIC KEY BLOCK + // Used for armoring public keys. + if (/PUBLIC KEY BLOCK/.test(header[1])) { + return _enums2.default.armor.public_key; + } else + // BEGIN PGP PRIVATE KEY BLOCK + // Used for armoring private keys. + if (/PRIVATE KEY BLOCK/.test(header[1])) { + return _enums2.default.armor.private_key; + } else + // BEGIN PGP SIGNATURE + // Used for detached signatures, OpenPGP/MIME signatures, and + // cleartext signatures. Note that PGP 2.x uses BEGIN PGP MESSAGE + // for detached signatures. + if (/SIGNATURE/.test(header[1])) { + return _enums2.default.armor.signature; + } +} + +/** + * Add additional information to the armor version of an OpenPGP binary + * packet block. + * @author Alex + * @version 2011-12-16 + * @returns {String} The header information + */ +function addheader() { + var result = ""; + if (_config2.default.show_version) { + result += "Version: " + _config2.default.versionstring + '\r\n'; + } + if (_config2.default.show_comment) { + result += "Comment: " + _config2.default.commentstring + '\r\n'; + } + result += '\r\n'; + return result; +} + +/** + * Calculates a checksum over the given data and returns it base64 encoded + * @param {String} data Data to create a CRC-24 checksum for + * @return {String} Base64 encoded checksum + */ +function getCheckSum(data) { + var c = createcrc24(data); + var bytes = new Uint8Array([c >> 16, c >> 8 & 0xFF, c & 0xFF]); + return _base2.default.encode(bytes); +} + +/** + * Calculates the checksum over the given data and compares it with the + * given base64 encoded checksum + * @param {String} data Data to create a CRC-24 checksum for + * @param {String} checksum Base64 encoded checksum + * @return {Boolean} True if the given checksum is correct; otherwise false + */ +function verifyCheckSum(data, checksum) { + var c = getCheckSum(data); + var d = checksum; + return c[0] === d[0] && c[1] === d[1] && c[2] === d[2] && c[3] === d[3]; +} +/** + * Internal function to calculate a CRC-24 checksum over a given string (data) + * @param {String} data Data to create a CRC-24 checksum for + * @return {Integer} The CRC-24 checksum as number + */ +var crc_table = [0x00000000, 0x00864cfb, 0x018ad50d, 0x010c99f6, 0x0393e6e1, 0x0315aa1a, 0x021933ec, 0x029f7f17, 0x07a18139, 0x0727cdc2, 0x062b5434, 0x06ad18cf, 0x043267d8, 0x04b42b23, 0x05b8b2d5, 0x053efe2e, 0x0fc54e89, 0x0f430272, 0x0e4f9b84, 0x0ec9d77f, 0x0c56a868, 0x0cd0e493, 0x0ddc7d65, 0x0d5a319e, 0x0864cfb0, 0x08e2834b, 0x09ee1abd, 0x09685646, 0x0bf72951, 0x0b7165aa, 0x0a7dfc5c, 0x0afbb0a7, 0x1f0cd1e9, 0x1f8a9d12, 0x1e8604e4, 0x1e00481f, 0x1c9f3708, 0x1c197bf3, 0x1d15e205, 0x1d93aefe, 0x18ad50d0, 0x182b1c2b, 0x192785dd, 0x19a1c926, 0x1b3eb631, 0x1bb8faca, 0x1ab4633c, 0x1a322fc7, 0x10c99f60, 0x104fd39b, 0x11434a6d, 0x11c50696, 0x135a7981, 0x13dc357a, 0x12d0ac8c, 0x1256e077, 0x17681e59, 0x17ee52a2, 0x16e2cb54, 0x166487af, 0x14fbf8b8, 0x147db443, 0x15712db5, 0x15f7614e, 0x3e19a3d2, 0x3e9fef29, 0x3f9376df, 0x3f153a24, 0x3d8a4533, 0x3d0c09c8, 0x3c00903e, 0x3c86dcc5, 0x39b822eb, 0x393e6e10, 0x3832f7e6, 0x38b4bb1d, 0x3a2bc40a, 0x3aad88f1, 0x3ba11107, 0x3b275dfc, 0x31dced5b, 0x315aa1a0, 0x30563856, 0x30d074ad, 0x324f0bba, 0x32c94741, 0x33c5deb7, 0x3343924c, 0x367d6c62, 0x36fb2099, 0x37f7b96f, 0x3771f594, 0x35ee8a83, 0x3568c678, 0x34645f8e, 0x34e21375, 0x2115723b, 0x21933ec0, 0x209fa736, 0x2019ebcd, 0x228694da, 0x2200d821, 0x230c41d7, 0x238a0d2c, 0x26b4f302, 0x2632bff9, 0x273e260f, 0x27b86af4, 0x252715e3, 0x25a15918, 0x24adc0ee, 0x242b8c15, 0x2ed03cb2, 0x2e567049, 0x2f5ae9bf, 0x2fdca544, 0x2d43da53, 0x2dc596a8, 0x2cc90f5e, 0x2c4f43a5, 0x2971bd8b, 0x29f7f170, 0x28fb6886, 0x287d247d, 0x2ae25b6a, 0x2a641791, 0x2b688e67, 0x2beec29c, 0x7c3347a4, 0x7cb50b5f, 0x7db992a9, 0x7d3fde52, 0x7fa0a145, 0x7f26edbe, 0x7e2a7448, 0x7eac38b3, 0x7b92c69d, 0x7b148a66, 0x7a181390, 0x7a9e5f6b, 0x7801207c, 0x78876c87, 0x798bf571, 0x790db98a, 0x73f6092d, 0x737045d6, 0x727cdc20, 0x72fa90db, 0x7065efcc, 0x70e3a337, 0x71ef3ac1, 0x7169763a, 0x74578814, 0x74d1c4ef, 0x75dd5d19, 0x755b11e2, 0x77c46ef5, 0x7742220e, 0x764ebbf8, 0x76c8f703, 0x633f964d, 0x63b9dab6, 0x62b54340, 0x62330fbb, 0x60ac70ac, 0x602a3c57, 0x6126a5a1, 0x61a0e95a, 0x649e1774, 0x64185b8f, 0x6514c279, 0x65928e82, 0x670df195, 0x678bbd6e, 0x66872498, 0x66016863, 0x6cfad8c4, 0x6c7c943f, 0x6d700dc9, 0x6df64132, 0x6f693e25, 0x6fef72de, 0x6ee3eb28, 0x6e65a7d3, 0x6b5b59fd, 0x6bdd1506, 0x6ad18cf0, 0x6a57c00b, 0x68c8bf1c, 0x684ef3e7, 0x69426a11, 0x69c426ea, 0x422ae476, 0x42aca88d, 0x43a0317b, 0x43267d80, 0x41b90297, 0x413f4e6c, 0x4033d79a, 0x40b59b61, 0x458b654f, 0x450d29b4, 0x4401b042, 0x4487fcb9, 0x461883ae, 0x469ecf55, 0x479256a3, 0x47141a58, 0x4defaaff, 0x4d69e604, 0x4c657ff2, 0x4ce33309, 0x4e7c4c1e, 0x4efa00e5, 0x4ff69913, 0x4f70d5e8, 0x4a4e2bc6, 0x4ac8673d, 0x4bc4fecb, 0x4b42b230, 0x49ddcd27, 0x495b81dc, 0x4857182a, 0x48d154d1, 0x5d26359f, 0x5da07964, 0x5cace092, 0x5c2aac69, 0x5eb5d37e, 0x5e339f85, 0x5f3f0673, 0x5fb94a88, 0x5a87b4a6, 0x5a01f85d, 0x5b0d61ab, 0x5b8b2d50, 0x59145247, 0x59921ebc, 0x589e874a, 0x5818cbb1, 0x52e37b16, 0x526537ed, 0x5369ae1b, 0x53efe2e0, 0x51709df7, 0x51f6d10c, 0x50fa48fa, 0x507c0401, 0x5542fa2f, 0x55c4b6d4, 0x54c82f22, 0x544e63d9, 0x56d11cce, 0x56575035, 0x575bc9c3, 0x57dd8538]; + +function createcrc24(input) { + var crc = 0xB704CE; + + for (var index = 0; index < input.length; index++) { + crc = crc << 8 ^ crc_table[(crc >> 16 ^ input[index]) & 0xff]; + } + return crc & 0xffffff; +} + +/** + * Splits a message into two parts, the headers and the body. This is an internal function + * @param {String} text OpenPGP armored message part + * @returns {Object} An object with attribute "headers" containing the headers + * and an attribute "body" containing the body. + */ +function splitHeaders(text) { + // empty line with whitespace characters + var reEmptyLine = /^[ \f\r\t\u00a0\u2000-\u200a\u202f\u205f\u3000]*\n/m; + var headers = ''; + var body = text; + + var matchResult = reEmptyLine.exec(text); + + if (matchResult !== null) { + headers = text.slice(0, matchResult.index); + body = text.slice(matchResult.index + matchResult[0].length); + } else { + throw new Error('Mandatory blank line missing between armor headers and armor data'); + } + + headers = headers.split('\n'); + // remove empty entry + headers.pop(); + + return { headers: headers, body: body }; +} + +/** + * Verify armored headers. RFC4880, section 6.3: "OpenPGP should consider improperly formatted + * Armor Headers to be corruption of the ASCII Armor." + * @private + * @param {Array} headers Armor headers + */ +function verifyHeaders(headers) { + for (var i = 0; i < headers.length; i++) { + if (!/^([^\s:]|[^\s:][^:]*[^\s:]): .+$/.test(headers[i])) { + throw new Error('Improperly formatted armor header: ' + headers[i]); + } + if (_config2.default.debug && !/^(Version|Comment|MessageID|Hash|Charset): .+$/.test(headers[i])) { + console.log('Unknown header: ' + headers[i]); + } + } +} + +/** + * Splits a message into two parts, the body and the checksum. This is an internal function + * @param {String} text OpenPGP armored message part + * @returns {Object} An object with attribute "body" containing the body + * and an attribute "checksum" containing the checksum. + */ +function splitChecksum(text) { + text = text.trim(); + var body = text; + var checksum = ""; + + var lastEquals = text.lastIndexOf("="); + + if (lastEquals >= 0 && lastEquals !== text.length - 1) { + // '=' as the last char means no checksum + body = text.slice(0, lastEquals); + checksum = text.slice(lastEquals + 1).substr(0, 4); + } + + return { body: body, checksum: checksum }; +} + +/** + * DeArmor an OpenPGP armored message; verify the checksum and return + * the encoded bytes + * @param {String} text OpenPGP armored message + * @returns {Object} An object with attribute "text" containing the message text, + * an attribute "data" containing the bytes and "type" for the ASCII armor type + * @static + */ +function dearmor(text) { + var reSplit = /^-----[^-]+-----$\n/m; + + // remove trailing whitespace at end of line + text = text.replace(/[\t\r ]+\n/g, '\n'); + + var type = getType(text); + + text = text.trim() + "\n"; + var splittext = text.split(reSplit); + + // IE has a bug in split with a re. If the pattern matches the beginning of the + // string it doesn't create an empty array element 0. So we need to detect this + // so we know the index of the data we are interested in. + var indexBase = 1; + + var result, checksum, msg; + + if (text.search(reSplit) !== splittext[0].length) { + indexBase = 0; + } + + if (type !== 2) { + msg = splitHeaders(splittext[indexBase]); + var msg_sum = splitChecksum(msg.body); + + result = { + data: _base2.default.decode(msg_sum.body), + headers: msg.headers, + type: type + }; + + checksum = msg_sum.checksum; + } else { + // Reverse dash-escaping for msg + msg = splitHeaders(splittext[indexBase].replace(/^- /mg, '')); + var sig = splitHeaders(splittext[indexBase + 1].replace(/^- /mg, '')); + verifyHeaders(sig.headers); + var sig_sum = splitChecksum(sig.body); + + result = { + text: msg.body.replace(/\n$/, '').replace(/\n/g, "\r\n"), + data: _base2.default.decode(sig_sum.body), + headers: msg.headers, + type: type + }; + + checksum = sig_sum.checksum; + } + + if (!verifyCheckSum(result.data, checksum) && (checksum || _config2.default.checksum_required)) { + // will NOT throw error if checksum is empty AND checksum is not required (GPG compatibility) + throw new Error("Ascii armor integrity check on message failed: '" + checksum + "' should be '" + getCheckSum(result.data) + "'"); + } + + verifyHeaders(result.headers); + + return result; +} + +/** + * Armor an OpenPGP binary packet block + * @param {Integer} messagetype type of the message + * @param body + * @param {Integer} partindex + * @param {Integer} parttotal + * @returns {String} Armored text + * @static + */ +function armor(messagetype, body, partindex, parttotal) { + var result = []; + switch (messagetype) { + case _enums2.default.armor.multipart_section: + result.push("-----BEGIN PGP MESSAGE, PART " + partindex + "/" + parttotal + "-----\r\n"); + result.push(addheader()); + result.push(_base2.default.encode(body)); + result.push("\r\n=" + getCheckSum(body) + "\r\n"); + result.push("-----END PGP MESSAGE, PART " + partindex + "/" + parttotal + "-----\r\n"); + break; + case _enums2.default.armor.multipart_last: + result.push("-----BEGIN PGP MESSAGE, PART " + partindex + "-----\r\n"); + result.push(addheader()); + result.push(_base2.default.encode(body)); + result.push("\r\n=" + getCheckSum(body) + "\r\n"); + result.push("-----END PGP MESSAGE, PART " + partindex + "-----\r\n"); + break; + case _enums2.default.armor.signed: + result.push("\r\n-----BEGIN PGP SIGNED MESSAGE-----\r\n"); + result.push("Hash: " + body.hash + "\r\n\r\n"); + result.push(body.text.replace(/\n-/g, "\n- -")); + result.push("\r\n-----BEGIN PGP SIGNATURE-----\r\n"); + result.push(addheader()); + result.push(_base2.default.encode(body.data)); + result.push("\r\n=" + getCheckSum(body.data) + "\r\n"); + result.push("-----END PGP SIGNATURE-----\r\n"); + break; + case _enums2.default.armor.message: + result.push("-----BEGIN PGP MESSAGE-----\r\n"); + result.push(addheader()); + result.push(_base2.default.encode(body)); + result.push("\r\n=" + getCheckSum(body) + "\r\n"); + result.push("-----END PGP MESSAGE-----\r\n"); + break; + case _enums2.default.armor.public_key: + result.push("-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n"); + result.push(addheader()); + result.push(_base2.default.encode(body)); + result.push("\r\n=" + getCheckSum(body) + "\r\n"); + result.push("-----END PGP PUBLIC KEY BLOCK-----\r\n\r\n"); + break; + case _enums2.default.armor.private_key: + result.push("-----BEGIN PGP PRIVATE KEY BLOCK-----\r\n"); + result.push(addheader()); + result.push(_base2.default.encode(body)); + result.push("\r\n=" + getCheckSum(body) + "\r\n"); + result.push("-----END PGP PRIVATE KEY BLOCK-----\r\n"); + break; + case _enums2.default.armor.signature: + result.push("-----BEGIN PGP SIGNATURE-----\r\n"); + result.push(addheader()); + result.push(_base2.default.encode(body)); + result.push("\r\n=" + getCheckSum(body) + "\r\n"); + result.push("-----END PGP SIGNATURE-----\r\n"); + break; + } + + return result.join(''); +} + +exports.default = { + encode: armor, + decode: dearmor +}; + +},{"../config":10,"../enums.js":35,"./base64.js":34}],34:[function(_dereq_,module,exports){ +/* OpenPGP radix-64/base64 string encoding/decoding + * Copyright 2005 Herbert Hanewinkel, www.haneWIN.de + * version 1.0, check www.haneWIN.de for the latest version + * + * This software is provided as-is, without express or implied warranty. + * Permission to use, copy, modify, distribute or sell this software, with or + * without fee, for any purpose and by any individual or organization, is hereby + * granted, provided that the above copyright notice and this paragraph appear + * in all copies. Distribution as a part of an application or binary must + * include the above copyright notice in the documentation and/or other materials + * provided with the application or distribution. + */ + +/** + * @module encoding/base64 + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var b64s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + +/** + * Convert binary array to radix-64 + * @param {Uint8Array} t Uint8Array to convert + * @returns {string} radix-64 version of input string + * @static + */ +function s2r(t, o) { + // TODO check btoa alternative + var a, c, n; + var r = o ? o : [], + l = 0, + s = 0; + var tl = t.length; + + for (n = 0; n < tl; n++) { + c = t[n]; + if (s === 0) { + r.push(b64s.charAt(c >> 2 & 63)); + a = (c & 3) << 4; + } else if (s === 1) { + r.push(b64s.charAt(a | c >> 4 & 15)); + a = (c & 15) << 2; + } else if (s === 2) { + r.push(b64s.charAt(a | c >> 6 & 3)); + l += 1; + if (l % 60 === 0) { + r.push("\n"); + } + r.push(b64s.charAt(c & 63)); + } + l += 1; + if (l % 60 === 0) { + r.push("\n"); + } + + s += 1; + if (s === 3) { + s = 0; + } + } + if (s > 0) { + r.push(b64s.charAt(a)); + l += 1; + if (l % 60 === 0) { + r.push("\n"); + } + r.push('='); + l += 1; + } + if (s === 1) { + if (l % 60 === 0) { + r.push("\n"); + } + r.push('='); + } + if (o) { + return; + } + return r.join(''); +} + +/** + * Convert radix-64 to binary array + * @param {String} t radix-64 string to convert + * @returns {Uint8Array} binary array version of input string + * @static + */ +function r2s(t) { + // TODO check atob alternative + var c, n; + var r = [], + s = 0, + a = 0; + var tl = t.length; + + for (n = 0; n < tl; n++) { + c = b64s.indexOf(t.charAt(n)); + if (c >= 0) { + if (s) { + r.push(a | c >> 6 - s & 255); + } + s = s + 2 & 7; + a = c << s & 255; + } + } + return new Uint8Array(r); +} + +exports.default = { + encode: s2r, + decode: r2s +}; + +},{}],35:[function(_dereq_,module,exports){ +'use strict'; + +/** + * @module enums + */ + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = { + + /** A string to key specifier type + * @enum {Integer} + * @readonly + */ + s2k: { + simple: 0, + salted: 1, + iterated: 3, + gnu: 101 + }, + + /** {@link http://tools.ietf.org/html/rfc4880#section-9.1|RFC4880, section 9.1} + * @enum {Integer} + * @readonly + */ + publicKey: { + rsa_encrypt_sign: 1, + rsa_encrypt: 2, + rsa_sign: 3, + elgamal: 16, + dsa: 17 + }, + + /** {@link http://tools.ietf.org/html/rfc4880#section-9.2|RFC4880, section 9.2} + * @enum {Integer} + * @readonly + */ + symmetric: { + plaintext: 0, + /** Not implemented! */ + idea: 1, + tripledes: 2, + cast5: 3, + blowfish: 4, + aes128: 7, + aes192: 8, + aes256: 9, + twofish: 10 + }, + + /** {@link http://tools.ietf.org/html/rfc4880#section-9.3|RFC4880, section 9.3} + * @enum {Integer} + * @readonly + */ + compression: { + uncompressed: 0, + /** RFC1951 */ + zip: 1, + /** RFC1950 */ + zlib: 2, + bzip2: 3 + }, + + /** {@link http://tools.ietf.org/html/rfc4880#section-9.4|RFC4880, section 9.4} + * @enum {Integer} + * @readonly + */ + hash: { + md5: 1, + sha1: 2, + ripemd: 3, + sha256: 8, + sha384: 9, + sha512: 10, + sha224: 11 + }, + + /** A list of packet types and numeric tags associated with them. + * @enum {Integer} + * @readonly + */ + packet: { + publicKeyEncryptedSessionKey: 1, + signature: 2, + symEncryptedSessionKey: 3, + onePassSignature: 4, + secretKey: 5, + publicKey: 6, + secretSubkey: 7, + compressed: 8, + symmetricallyEncrypted: 9, + marker: 10, + literal: 11, + trust: 12, + userid: 13, + publicSubkey: 14, + userAttribute: 17, + symEncryptedIntegrityProtected: 18, + modificationDetectionCode: 19, + symEncryptedAEADProtected: 20 // see IETF draft: https://tools.ietf.org/html/draft-ford-openpgp-format-00#section-2.1 + }, + + /** Data types in the literal packet + * @enum {Integer} + * @readonly + */ + literal: { + /** Binary data 'b' */ + binary: 'b'.charCodeAt(), + /** Text data 't' */ + text: 't'.charCodeAt(), + /** Utf8 data 'u' */ + utf8: 'u'.charCodeAt() + }, + + /** One pass signature packet type + * @enum {Integer} + * @readonly + */ + signature: { + /** 0x00: Signature of a binary document. */ + binary: 0, + /** 0x01: Signature of a canonical text document.
+ * Canonicalyzing the document by converting line endings. */ + text: 1, + /** 0x02: Standalone signature.
+ * This signature is a signature of only its own subpacket contents. + * It is calculated identically to a signature over a zero-lengh + * binary document. Note that it doesn't make sense to have a V3 + * standalone signature. */ + standalone: 2, + /** 0x10: Generic certification of a User ID and Public-Key packet.
+ * The issuer of this certification does not make any particular + * assertion as to how well the certifier has checked that the owner + * of the key is in fact the person described by the User ID. */ + cert_generic: 16, + /** 0x11: Persona certification of a User ID and Public-Key packet.
+ * The issuer of this certification has not done any verification of + * the claim that the owner of this key is the User ID specified. */ + cert_persona: 17, + /** 0x12: Casual certification of a User ID and Public-Key packet.
+ * The issuer of this certification has done some casual + * verification of the claim of identity. */ + cert_casual: 18, + /** 0x13: Positive certification of a User ID and Public-Key packet.
+ * The issuer of this certification has done substantial + * verification of the claim of identity.
+ *
+ * Most OpenPGP implementations make their "key signatures" as 0x10 + * certifications. Some implementations can issue 0x11-0x13 + * certifications, but few differentiate between the types. */ + cert_positive: 19, + /** 0x30: Certification revocation signature
+ * This signature revokes an earlier User ID certification signature + * (signature class 0x10 through 0x13) or direct-key signature + * (0x1F). It should be issued by the same key that issued the + * revoked signature or an authorized revocation key. The signature + * is computed over the same data as the certificate that it + * revokes, and should have a later creation date than that + * certificate. */ + cert_revocation: 48, + /** 0x18: Subkey Binding Signature
+ * This signature is a statement by the top-level signing key that + * indicates that it owns the subkey. This signature is calculated + * directly on the primary key and subkey, and not on any User ID or + * other packets. A signature that binds a signing subkey MUST have + * an Embedded Signature subpacket in this binding signature that + * contains a 0x19 signature made by the signing subkey on the + * primary key and subkey. */ + subkey_binding: 24, + /** 0x19: Primary Key Binding Signature
+ * This signature is a statement by a signing subkey, indicating + * that it is owned by the primary key and subkey. This signature + * is calculated the same way as a 0x18 signature: directly on the + * primary key and subkey, and not on any User ID or other packets.
+ *
+ * When a signature is made over a key, the hash data starts with the + * octet 0x99, followed by a two-octet length of the key, and then body + * of the key packet. (Note that this is an old-style packet header for + * a key packet with two-octet length.) A subkey binding signature + * (type 0x18) or primary key binding signature (type 0x19) then hashes + * the subkey using the same format as the main key (also using 0x99 as + * the first octet). */ + key_binding: 25, + /** 0x1F: Signature directly on a key
+ * This signature is calculated directly on a key. It binds the + * information in the Signature subpackets to the key, and is + * appropriate to be used for subpackets that provide information + * about the key, such as the Revocation Key subpacket. It is also + * appropriate for statements that non-self certifiers want to make + * about the key itself, rather than the binding between a key and a + * name. */ + key: 31, + /** 0x20: Key revocation signature
+ * The signature is calculated directly on the key being revoked. A + * revoked key is not to be used. Only revocation signatures by the + * key being revoked, or by an authorized revocation key, should be + * considered valid revocation signatures.a */ + key_revocation: 32, + /** 0x28: Subkey revocation signature
+ * The signature is calculated directly on the subkey being revoked. + * A revoked subkey is not to be used. Only revocation signatures + * by the top-level signature key that is bound to this subkey, or + * by an authorized revocation key, should be considered valid + * revocation signatures.
+ *
+ * Key revocation signatures (types 0x20 and 0x28) + * hash only the key being revoked. */ + subkey_revocation: 40, + /** 0x40: Timestamp signature.
+ * This signature is only meaningful for the timestamp contained in + * it. */ + timestamp: 64, + /** 0x50: Third-Party Confirmation signature.
+ * This signature is a signature over some other OpenPGP Signature + * packet(s). It is analogous to a notary seal on the signed data. + * A third-party signature SHOULD include Signature Target + * subpacket(s) to give easy identification. Note that we really do + * mean SHOULD. There are plausible uses for this (such as a blind + * party that only sees the signature, not the key or source + * document) that cannot include a target subpacket. */ + third_party: 80 + }, + + /** Signature subpacket type + * @enum {Integer} + * @readonly + */ + signatureSubpacket: { + signature_creation_time: 2, + signature_expiration_time: 3, + exportable_certification: 4, + trust_signature: 5, + regular_expression: 6, + revocable: 7, + key_expiration_time: 9, + placeholder_backwards_compatibility: 10, + preferred_symmetric_algorithms: 11, + revocation_key: 12, + issuer: 16, + notation_data: 20, + preferred_hash_algorithms: 21, + preferred_compression_algorithms: 22, + key_server_preferences: 23, + preferred_key_server: 24, + primary_user_id: 25, + policy_uri: 26, + key_flags: 27, + signers_user_id: 28, + reason_for_revocation: 29, + features: 30, + signature_target: 31, + embedded_signature: 32 + }, + + /** Key flags + * @enum {Integer} + * @readonly + */ + keyFlags: { + /** 0x01 - This key may be used to certify other keys. */ + certify_keys: 1, + /** 0x02 - This key may be used to sign data. */ + sign_data: 2, + /** 0x04 - This key may be used to encrypt communications. */ + encrypt_communication: 4, + /** 0x08 - This key may be used to encrypt storage. */ + encrypt_storage: 8, + /** 0x10 - The private component of this key may have been split + * by a secret-sharing mechanism. */ + split_private_key: 16, + /** 0x20 - This key may be used for authentication. */ + authentication: 32, + /** 0x80 - The private component of this key may be in the + * possession of more than one person. */ + shared_private_key: 128 + }, + + /** Key status + * @enum {Integer} + * @readonly + */ + keyStatus: { + invalid: 0, + expired: 1, + revoked: 2, + valid: 3, + no_self_cert: 4 + }, + + /** Armor type + * @enum {Integer} + * @readonly + */ + armor: { + multipart_section: 0, + multipart_last: 1, + signed: 2, + message: 3, + public_key: 4, + private_key: 5, + signature: 6 + }, + + /** Asserts validity and converts from string/integer to integer. */ + write: function write(type, e) { + if (typeof e === 'number') { + e = this.read(type, e); + } + + if (type[e] !== undefined) { + return type[e]; + } else { + throw new Error('Invalid enum value.'); + } + }, + + /** Converts from an integer to string. */ + read: function read(type, e) { + for (var i in type) { + if (type[i] === parseInt(e)) { + return i; + } + } + + throw new Error('Invalid enum value.'); + } + +}; + +},{}],36:[function(_dereq_,module,exports){ +// OpenPGP.js - An OpenPGP implementation in javascript +// Copyright (C) 2015 Tankred Hase +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @fileoverview This class implements a client for the OpenPGP HTTP Keyserver Protocol (HKP) + * in order to lookup and upload keys on standard public key servers. + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = HKP; + +var _config = _dereq_('./config'); + +var _config2 = _interopRequireDefault(_config); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Initialize the HKP client and configure it with the key server url and fetch function. + * @constructor + * @param {String} keyServerBaseUrl (optional) The HKP key server base url including + * the protocol to use e.g. https://pgp.mit.edu + */ +function HKP(keyServerBaseUrl) { + this._baseUrl = keyServerBaseUrl ? keyServerBaseUrl : _config2.default.keyserver; + this._fetch = typeof window !== 'undefined' ? window.fetch : _dereq_('node-fetch'); +} + +/** + * Search for a public key on the key server either by key ID or part of the user ID. + * @param {String} options.keyID The long public key ID. + * @param {String} options.query This can be any part of the key user ID such as name + * or email address. + * @return {Promise} The ascii armored public key. + */ +HKP.prototype.lookup = function (options) { + var uri = this._baseUrl + '/pks/lookup?op=get&options=mr&search=', + fetch = this._fetch; + + if (options.keyId) { + uri += '0x' + encodeURIComponent(options.keyId); + } else if (options.query) { + uri += encodeURIComponent(options.query); + } else { + throw new Error('You must provide a query parameter!'); + } + + return fetch(uri).then(function (response) { + if (response.status === 200) { + return response.text(); + } + }).then(function (publicKeyArmored) { + if (!publicKeyArmored || publicKeyArmored.indexOf('-----END PGP PUBLIC KEY BLOCK-----') < 0) { + return; + } + return publicKeyArmored.trim(); + }); +}; + +/** + * Upload a public key to the server. + * @param {String} publicKeyArmored An ascii armored public key to be uploaded. + * @return {Promise} + */ +HKP.prototype.upload = function (publicKeyArmored) { + var uri = this._baseUrl + '/pks/add', + fetch = this._fetch; + + return fetch(uri, { + method: 'post', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' + }, + body: 'keytext=' + encodeURIComponent(publicKeyArmored) + }); +}; + +},{"./config":10,"node-fetch":"node-fetch"}],37:[function(_dereq_,module,exports){ +'use strict'; + +/** + * Export high level api as default. + * Usage: + * + * import openpgp from 'openpgp.js' + * openpgp.encryptMessage(keys, text) + */ + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.HKP = exports.AsyncProxy = exports.Keyring = exports.crypto = exports.config = exports.enums = exports.armor = exports.Keyid = exports.S2K = exports.MPI = exports.packet = exports.util = exports.cleartext = exports.message = exports.signature = exports.key = undefined; + +var _openpgp = _dereq_('./openpgp'); + +Object.keys(_openpgp).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function get() { + return _openpgp[key]; + } + }); +}); + +var _util = _dereq_('./util'); + +Object.defineProperty(exports, 'util', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_util).default; + } +}); + +var _packet = _dereq_('./packet'); + +Object.defineProperty(exports, 'packet', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_packet).default; + } +}); + +var _mpi = _dereq_('./type/mpi'); + +Object.defineProperty(exports, 'MPI', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_mpi).default; + } +}); + +var _s2k = _dereq_('./type/s2k'); + +Object.defineProperty(exports, 'S2K', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_s2k).default; + } +}); + +var _keyid = _dereq_('./type/keyid'); + +Object.defineProperty(exports, 'Keyid', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_keyid).default; + } +}); + +var _armor = _dereq_('./encoding/armor'); + +Object.defineProperty(exports, 'armor', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_armor).default; + } +}); + +var _enums = _dereq_('./enums'); + +Object.defineProperty(exports, 'enums', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_enums).default; + } +}); + +var _config = _dereq_('./config/config'); + +Object.defineProperty(exports, 'config', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_config).default; + } +}); + +var _crypto = _dereq_('./crypto'); + +Object.defineProperty(exports, 'crypto', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_crypto).default; + } +}); + +var _keyring = _dereq_('./keyring'); + +Object.defineProperty(exports, 'Keyring', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_keyring).default; + } +}); + +var _async_proxy = _dereq_('./worker/async_proxy'); + +Object.defineProperty(exports, 'AsyncProxy', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_async_proxy).default; + } +}); + +var _hkp = _dereq_('./hkp'); + +Object.defineProperty(exports, 'HKP', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_hkp).default; + } +}); + +var openpgp = _interopRequireWildcard(_openpgp); + +var _key = _dereq_('./key'); + +var keyMod = _interopRequireWildcard(_key); + +var _signature = _dereq_('./signature'); + +var signatureMod = _interopRequireWildcard(_signature); + +var _message = _dereq_('./message'); + +var messageMod = _interopRequireWildcard(_message); + +var _cleartext = _dereq_('./cleartext'); + +var cleartextMod = _interopRequireWildcard(_cleartext); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = openpgp; + +/** + * Export each high level api function seperately. + * Usage: + * + * import { encryptMessage } from 'openpgp.js' + * encryptMessage(keys, text) + */ + + +/** + * @see module:key + * @name module:openpgp.key + */ + +var key = exports.key = keyMod; + +/** + * @see module:signature + * @name module:openpgp.signature + */ +var signature = exports.signature = signatureMod; + +/** + * @see module:message + * @name module:openpgp.message + */ +var message = exports.message = messageMod; + +/** + * @see module:cleartext + * @name module:openpgp.cleartext + */ +var cleartext = exports.cleartext = cleartextMod; + +/** + * @see module:util + * @name module:openpgp.util + */ + +},{"./cleartext":5,"./config/config":9,"./crypto":24,"./encoding/armor":33,"./enums":35,"./hkp":36,"./key":38,"./keyring":39,"./message":42,"./openpgp":43,"./packet":47,"./signature":66,"./type/keyid":67,"./type/mpi":68,"./type/s2k":69,"./util":70,"./worker/async_proxy":71}],38:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @requires config + * @requires encoding/armor + * @requires enums + * @requires packet + * @module key + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Key = Key; +exports.read = read; +exports.readArmored = readArmored; +exports.generate = generate; +exports.reformat = reformat; +exports.getPreferredSymAlgo = getPreferredSymAlgo; + +var _packet = _dereq_('./packet'); + +var _packet2 = _interopRequireDefault(_packet); + +var _enums = _dereq_('./enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _armor = _dereq_('./encoding/armor.js'); + +var _armor2 = _interopRequireDefault(_armor); + +var _config = _dereq_('./config'); + +var _config2 = _interopRequireDefault(_config); + +var _util = _dereq_('./util'); + +var _util2 = _interopRequireDefault(_util); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @class + * @classdesc Class that represents an OpenPGP key. Must contain a primary key. + * Can contain additional subkeys, signatures, user ids, user attributes. + * @param {module:packet/packetlist} packetlist The packets that form this key + */ + +function Key(packetlist) { + if (!(this instanceof Key)) { + return new Key(packetlist); + } + // same data as in packetlist but in structured form + this.primaryKey = null; + this.revocationSignature = null; + this.directSignatures = null; + this.users = null; + this.subKeys = null; + this.packetlist2structure(packetlist); + if (!this.primaryKey || !this.users) { + throw new Error('Invalid key: need at least key and user ID packet'); + } +} + +/** + * Transforms packetlist to structured key data + * @param {module:packet/packetlist} packetlist The packets that form a key + */ +Key.prototype.packetlist2structure = function (packetlist) { + var user, primaryKeyId, subKey; + for (var i = 0; i < packetlist.length; i++) { + switch (packetlist[i].tag) { + case _enums2.default.packet.publicKey: + case _enums2.default.packet.secretKey: + this.primaryKey = packetlist[i]; + primaryKeyId = this.primaryKey.getKeyId(); + break; + case _enums2.default.packet.userid: + case _enums2.default.packet.userAttribute: + user = new User(packetlist[i]); + if (!this.users) { + this.users = []; + } + this.users.push(user); + break; + case _enums2.default.packet.publicSubkey: + case _enums2.default.packet.secretSubkey: + user = null; + if (!this.subKeys) { + this.subKeys = []; + } + subKey = new SubKey(packetlist[i]); + this.subKeys.push(subKey); + break; + case _enums2.default.packet.signature: + switch (packetlist[i].signatureType) { + case _enums2.default.signature.cert_generic: + case _enums2.default.signature.cert_persona: + case _enums2.default.signature.cert_casual: + case _enums2.default.signature.cert_positive: + if (!user) { + _util2.default.print_debug('Dropping certification signatures without preceding user packet'); + continue; + } + if (packetlist[i].issuerKeyId.equals(primaryKeyId)) { + if (!user.selfCertifications) { + user.selfCertifications = []; + } + user.selfCertifications.push(packetlist[i]); + } else { + if (!user.otherCertifications) { + user.otherCertifications = []; + } + user.otherCertifications.push(packetlist[i]); + } + break; + case _enums2.default.signature.cert_revocation: + if (user) { + if (!user.revocationCertifications) { + user.revocationCertifications = []; + } + user.revocationCertifications.push(packetlist[i]); + } else { + if (!this.directSignatures) { + this.directSignatures = []; + } + this.directSignatures.push(packetlist[i]); + } + break; + case _enums2.default.signature.key: + if (!this.directSignatures) { + this.directSignatures = []; + } + this.directSignatures.push(packetlist[i]); + break; + case _enums2.default.signature.subkey_binding: + if (!subKey) { + _util2.default.print_debug('Dropping subkey binding signature without preceding subkey packet'); + continue; + } + subKey.bindingSignatures.push(packetlist[i]); + break; + case _enums2.default.signature.key_revocation: + this.revocationSignature = packetlist[i]; + break; + case _enums2.default.signature.subkey_revocation: + if (!subKey) { + _util2.default.print_debug('Dropping subkey revocation signature without preceding subkey packet'); + continue; + } + subKey.revocationSignature = packetlist[i]; + break; + } + break; + } + } +}; + +/** + * Transforms structured key data to packetlist + * @return {module:packet/packetlist} The packets that form a key + */ +Key.prototype.toPacketlist = function () { + var packetlist = new _packet2.default.List(); + packetlist.push(this.primaryKey); + packetlist.push(this.revocationSignature); + packetlist.concat(this.directSignatures); + var i; + for (i = 0; i < this.users.length; i++) { + packetlist.concat(this.users[i].toPacketlist()); + } + if (this.subKeys) { + for (i = 0; i < this.subKeys.length; i++) { + packetlist.concat(this.subKeys[i].toPacketlist()); + } + } + return packetlist; +}; + +/** + * Returns all the private and public subkey packets + * @returns {Array<(module:packet/public_subkey|module:packet/secret_subkey)>} + */ +Key.prototype.getSubkeyPackets = function () { + var subKeys = []; + if (this.subKeys) { + for (var i = 0; i < this.subKeys.length; i++) { + subKeys.push(this.subKeys[i].subKey); + } + } + return subKeys; +}; + +/** + * Returns all the private and public key and subkey packets + * @returns {Array<(module:packet/public_subkey|module:packet/secret_subkey|module:packet/secret_key|module:packet/public_key)>} + */ +Key.prototype.getAllKeyPackets = function () { + return [this.primaryKey].concat(this.getSubkeyPackets()); +}; + +/** + * Returns key IDs of all key packets + * @returns {Array} + */ +Key.prototype.getKeyIds = function () { + var keyIds = []; + var keys = this.getAllKeyPackets(); + for (var i = 0; i < keys.length; i++) { + keyIds.push(keys[i].getKeyId()); + } + return keyIds; +}; + +/** + * Returns first key packet for given array of key IDs + * @param {Array} keyIds + * @return {(module:packet/public_subkey|module:packet/public_key| + * module:packet/secret_subkey|module:packet/secret_key|null)} + */ +Key.prototype.getKeyPacket = function (keyIds) { + var keys = this.getAllKeyPackets(); + for (var i = 0; i < keys.length; i++) { + var keyId = keys[i].getKeyId(); + for (var j = 0; j < keyIds.length; j++) { + if (keyId.equals(keyIds[j])) { + return keys[i]; + } + } + } + return null; +}; + +/** + * Returns userids + * @return {Array} array of userids + */ +Key.prototype.getUserIds = function () { + var userids = []; + for (var i = 0; i < this.users.length; i++) { + if (this.users[i].userId) { + userids.push(_util2.default.Uint8Array2str(this.users[i].userId.write())); + } + } + return userids; +}; + +/** + * Returns true if this is a public key + * @return {Boolean} + */ +Key.prototype.isPublic = function () { + return this.primaryKey.tag === _enums2.default.packet.publicKey; +}; + +/** + * Returns true if this is a private key + * @return {Boolean} + */ +Key.prototype.isPrivate = function () { + return this.primaryKey.tag === _enums2.default.packet.secretKey; +}; + +/** + * Returns key as public key (shallow copy) + * @return {module:key~Key} new public Key + */ +Key.prototype.toPublic = function () { + var packetlist = new _packet2.default.List(); + var keyPackets = this.toPacketlist(); + var bytes; + for (var i = 0; i < keyPackets.length; i++) { + switch (keyPackets[i].tag) { + case _enums2.default.packet.secretKey: + bytes = keyPackets[i].writePublicKey(); + var pubKeyPacket = new _packet2.default.PublicKey(); + pubKeyPacket.read(bytes); + packetlist.push(pubKeyPacket); + break; + case _enums2.default.packet.secretSubkey: + bytes = keyPackets[i].writePublicKey(); + var pubSubkeyPacket = new _packet2.default.PublicSubkey(); + pubSubkeyPacket.read(bytes); + packetlist.push(pubSubkeyPacket); + break; + default: + packetlist.push(keyPackets[i]); + } + } + return new Key(packetlist); +}; + +/** + * Returns ASCII armored text of key + * @return {String} ASCII armor + */ +Key.prototype.armor = function () { + var type = this.isPublic() ? _enums2.default.armor.public_key : _enums2.default.armor.private_key; + return _armor2.default.encode(type, this.toPacketlist().write()); +}; + +/** + * Returns first key packet or key packet by given keyId that is available for signing or signature verification + * @param {module:type/keyid} keyId, optional + * @param {Boolean} allowExpired allows signature verification with expired keys + * @return {(module:packet/secret_subkey|module:packet/secret_key|null)} key packet or null if no signing key has been found + */ +Key.prototype.getSigningKeyPacket = function (keyId) { + var allowExpired = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var primaryUser = this.getPrimaryUser(allowExpired); + if (primaryUser && isValidSigningKeyPacket(this.primaryKey, primaryUser.selfCertificate) && (!keyId || this.primaryKey.getKeyId().equals(keyId)) && this.verifyPrimaryKey(allowExpired) === _enums2.default.keyStatus.valid) { + return this.primaryKey; + } + if (this.subKeys) { + for (var i = 0; i < this.subKeys.length; i++) { + if (this.subKeys[i].isValidSigningKey(this.primaryKey, allowExpired) && (!keyId || this.subKeys[i].subKey.getKeyId().equals(keyId))) { + return this.subKeys[i].subKey; + } + } + } + return null; +}; + +/** + * Returns preferred signature hash algorithm of this key + * @return {String} + */ +Key.prototype.getPreferredHashAlgorithm = function () { + var primaryUser = this.getPrimaryUser(); + if (primaryUser && primaryUser.selfCertificate.preferredHashAlgorithms) { + return primaryUser.selfCertificate.preferredHashAlgorithms[0]; + } + return _config2.default.prefer_hash_algorithm; +}; + +function isValidEncryptionKeyPacket(keyPacket, signature) { + return keyPacket.algorithm !== _enums2.default.read(_enums2.default.publicKey, _enums2.default.publicKey.dsa) && keyPacket.algorithm !== _enums2.default.read(_enums2.default.publicKey, _enums2.default.publicKey.rsa_sign) && (!signature.keyFlags || (signature.keyFlags[0] & _enums2.default.keyFlags.encrypt_communication) !== 0 || (signature.keyFlags[0] & _enums2.default.keyFlags.encrypt_storage) !== 0); +} + +function isValidSigningKeyPacket(keyPacket, signature) { + return (keyPacket.algorithm === _enums2.default.read(_enums2.default.publicKey, _enums2.default.publicKey.dsa) || keyPacket.algorithm === _enums2.default.read(_enums2.default.publicKey, _enums2.default.publicKey.rsa_sign) || keyPacket.algorithm === _enums2.default.read(_enums2.default.publicKey, _enums2.default.publicKey.rsa_encrypt_sign)) && (!signature.keyFlags || (signature.keyFlags[0] & _enums2.default.keyFlags.sign_data) !== 0); +} + +/** + * Returns the first valid encryption key packet for this key + * @returns {(module:packet/public_subkey|module:packet/secret_subkey|module:packet/secret_key|module:packet/public_key|null)} key packet or null if no encryption key has been found + */ +Key.prototype.getEncryptionKeyPacket = function () { + // V4: by convention subkeys are prefered for encryption service + // V3: keys MUST NOT have subkeys + if (this.subKeys) { + for (var i = 0; i < this.subKeys.length; i++) { + if (this.subKeys[i].isValidEncryptionKey(this.primaryKey)) { + return this.subKeys[i].subKey; + } + } + } + // if no valid subkey for encryption, evaluate primary key + var primaryUser = this.getPrimaryUser(); + if (primaryUser && primaryUser.selfCertificate && !primaryUser.selfCertificate.isExpired() && isValidEncryptionKeyPacket(this.primaryKey, primaryUser.selfCertificate)) { + return this.primaryKey; + } + return null; +}; + +/** + * Encrypts all secret key and subkey packets + * @param {String} passphrase + */ +Key.prototype.encrypt = function (passphrase) { + if (!this.isPrivate()) { + throw new Error("Nothing to encrypt in a public key"); + } + + var keys = this.getAllKeyPackets(); + for (var i = 0; i < keys.length; i++) { + keys[i].encrypt(passphrase); + keys[i].clearPrivateMPIs(); + } +}; + +/** + * Decrypts all secret key and subkey packets + * @param {String} passphrase + * @return {Boolean} true if all key and subkey packets decrypted successfully + */ +Key.prototype.decrypt = function (passphrase) { + if (this.isPrivate()) { + var keys = this.getAllKeyPackets(); + for (var i = 0; i < keys.length; i++) { + var success = keys[i].decrypt(passphrase); + if (!success) { + return false; + } + } + } else { + throw new Error("Nothing to decrypt in a public key"); + } + return true; +}; + +/** + * Decrypts specific key packets by key ID + * @param {Array} keyIds + * @param {String} passphrase + * @return {Boolean} true if all key packets decrypted successfully + */ +Key.prototype.decryptKeyPacket = function (keyIds, passphrase) { + if (this.isPrivate()) { + var keys = this.getAllKeyPackets(); + for (var i = 0; i < keys.length; i++) { + var keyId = keys[i].getKeyId(); + for (var j = 0; j < keyIds.length; j++) { + if (keyId.equals(keyIds[j])) { + var success = keys[i].decrypt(passphrase); + if (!success) { + return false; + } + } + } + } + } else { + throw new Error("Nothing to decrypt in a public key"); + } + return true; +}; + +/** + * Verify primary key. Checks for revocation signatures, expiration time + * and valid self signature + * @param {Boolean} allowExpired allows signature verification with expired keys + * @return {module:enums.keyStatus} The status of the primary key + */ +Key.prototype.verifyPrimaryKey = function () { + var allowExpired = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + // check revocation signature + if (this.revocationSignature && !this.revocationSignature.isExpired() && (this.revocationSignature.verified || this.revocationSignature.verify(this.primaryKey, { key: this.primaryKey }))) { + return _enums2.default.keyStatus.revoked; + } + // check V3 expiration time + if (!allowExpired && this.primaryKey.version === 3 && this.primaryKey.expirationTimeV3 !== 0 && Date.now() > this.primaryKey.created.getTime() + this.primaryKey.expirationTimeV3 * 24 * 3600 * 1000) { + return _enums2.default.keyStatus.expired; + } + // check for at least one self signature. Self signature of user ID not mandatory + // See {@link http://tools.ietf.org/html/rfc4880#section-11.1} + var selfSigned = false; + for (var i = 0; i < this.users.length; i++) { + if (this.users[i].userId && this.users[i].selfCertifications) { + selfSigned = true; + } + } + if (!selfSigned) { + return _enums2.default.keyStatus.no_self_cert; + } + // check for valid self signature + var primaryUser = this.getPrimaryUser(); + if (!primaryUser) { + return _enums2.default.keyStatus.invalid; + } + // check V4 expiration time + if (!allowExpired && this.primaryKey.version === 4 && primaryUser.selfCertificate.keyNeverExpires === false && Date.now() > this.primaryKey.created.getTime() + primaryUser.selfCertificate.keyExpirationTime * 1000) { + return _enums2.default.keyStatus.expired; + } + return _enums2.default.keyStatus.valid; +}; + +/** + * Returns the expiration time of the primary key or null if key does not expire + * @return {Date|null} + */ +Key.prototype.getExpirationTime = function () { + if (this.primaryKey.version === 3) { + return getExpirationTime(this.primaryKey); + } + if (this.primaryKey.version === 4) { + var primaryUser = this.getPrimaryUser(); + if (!primaryUser) { + return null; + } + return getExpirationTime(this.primaryKey, primaryUser.selfCertificate); + } +}; + +function getExpirationTime(keyPacket, selfCertificate) { + // check V3 expiration time + if (keyPacket.version === 3 && keyPacket.expirationTimeV3 !== 0) { + return new Date(keyPacket.created.getTime() + keyPacket.expirationTimeV3 * 24 * 3600 * 1000); + } + // check V4 expiration time + if (keyPacket.version === 4 && selfCertificate.keyNeverExpires === false) { + return new Date(keyPacket.created.getTime() + selfCertificate.keyExpirationTime * 1000); + } + return null; +} + +/** + * Returns primary user and most significant (latest valid) self signature + * - if multiple users are marked as primary users returns the one with the latest self signature + * - if no primary user is found returns the user with the latest self signature + * @param {Boolean} allowExpired allows signature verification with expired keys + * @return {{user: Array, selfCertificate: Array}|null} The primary user and the self signature + */ +Key.prototype.getPrimaryUser = function () { + var allowExpired = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + var primUser = []; + for (var i = 0; i < this.users.length; i++) { + if (!this.users[i].userId || !this.users[i].selfCertifications) { + continue; + } + for (var j = 0; j < this.users[i].selfCertifications.length; j++) { + primUser.push({ index: i, user: this.users[i], selfCertificate: this.users[i].selfCertifications[j] }); + } + } + // sort by primary user flag and signature creation time + primUser = primUser.sort(function (a, b) { + if (a.selfCertificate.isPrimaryUserID > b.selfCertificate.isPrimaryUserID) { + return -1; + } else if (a.selfCertificate.isPrimaryUserID < b.selfCertificate.isPrimaryUserID) { + return 1; + } else if (a.selfCertificate.created > b.selfCertificate.created) { + return -1; + } else if (a.selfCertificate.created < b.selfCertificate.created) { + return 1; + } else { + return 0; + } + }); + // return first valid + for (var k = 0; k < primUser.length; k++) { + if (primUser[k].user.isValidSelfCertificate(this.primaryKey, primUser[k].selfCertificate, allowExpired)) { + return primUser[k]; + } + } + return null; +}; + +/** + * Update key with new components from specified key with same key ID: + * users, subkeys, certificates are merged into the destination key, + * duplicates are ignored. + * If the specified key is a private key and the destination key is public, + * the destination key is tranformed to a private key. + * @param {module:key~Key} key source key to merge + */ +Key.prototype.update = function (key) { + var that = this; + if (key.verifyPrimaryKey() === _enums2.default.keyStatus.invalid) { + return; + } + if (this.primaryKey.getFingerprint() !== key.primaryKey.getFingerprint()) { + throw new Error('Key update method: fingerprints of keys not equal'); + } + if (this.isPublic() && key.isPrivate()) { + // check for equal subkey packets + var equal = (this.subKeys && this.subKeys.length) === (key.subKeys && key.subKeys.length) && (!this.subKeys || this.subKeys.every(function (destSubKey) { + return key.subKeys.some(function (srcSubKey) { + return destSubKey.subKey.getFingerprint() === srcSubKey.subKey.getFingerprint(); + }); + })); + if (!equal) { + throw new Error('Cannot update public key with private key if subkey mismatch'); + } + this.primaryKey = key.primaryKey; + } + // revocation signature + if (!this.revocationSignature && key.revocationSignature && !key.revocationSignature.isExpired() && (key.revocationSignature.verified || key.revocationSignature.verify(key.primaryKey, { key: key.primaryKey }))) { + this.revocationSignature = key.revocationSignature; + } + // direct signatures + mergeSignatures(key, this, 'directSignatures'); + // users + key.users.forEach(function (srcUser) { + var found = false; + for (var i = 0; i < that.users.length; i++) { + if (srcUser.userId && srcUser.userId.userid === that.users[i].userId.userid || srcUser.userAttribute && srcUser.userAttribute.equals(that.users[i].userAttribute)) { + that.users[i].update(srcUser, that.primaryKey); + found = true; + break; + } + } + if (!found) { + that.users.push(srcUser); + } + }); + // subkeys + if (key.subKeys) { + key.subKeys.forEach(function (srcSubKey) { + var found = false; + for (var i = 0; i < that.subKeys.length; i++) { + if (srcSubKey.subKey.getFingerprint() === that.subKeys[i].subKey.getFingerprint()) { + that.subKeys[i].update(srcSubKey, that.primaryKey); + found = true; + break; + } + } + if (!found) { + that.subKeys.push(srcSubKey); + } + }); + } +}; + +/** + * Merges signatures from source[attr] to dest[attr] + * @private + * @param {Object} source + * @param {Object} dest + * @param {String} attr + * @param {Function} checkFn optional, signature only merged if true + */ +function mergeSignatures(source, dest, attr, checkFn) { + source = source[attr]; + if (source) { + if (!dest[attr]) { + dest[attr] = source; + } else { + source.forEach(function (sourceSig) { + if (!sourceSig.isExpired() && (!checkFn || checkFn(sourceSig)) && !dest[attr].some(function (destSig) { + return _util2.default.equalsUint8Array(destSig.signature, sourceSig.signature); + })) { + dest[attr].push(sourceSig); + } + }); + } + } +} + +// TODO +Key.prototype.revoke = function () {}; + +/** + * Signs primary user of key + * @param {Array} privateKey decrypted private keys for signing + * @return {module:key~Key} new public key with new certificate signature + */ +Key.prototype.signPrimaryUser = function (privateKeys) { + var _ref = this.getPrimaryUser() || {}, + index = _ref.index, + user = _ref.user; + + if (!user) { + throw new Error('Could not find primary user'); + } + user = user.sign(this.primaryKey, privateKeys); + var key = new Key(this.toPacketlist()); + key.users[index] = user; + return key; +}; + +/** + * Signs all users of key + * @param {Array} privateKeys decrypted private keys for signing + * @return {module:key~Key} new public key with new certificate signature + */ +Key.prototype.signAllUsers = function (privateKeys) { + var _this = this; + + var users = this.users.map(function (user) { + return user.sign(_this.primaryKey, privateKeys); + }); + var key = new Key(this.toPacketlist()); + key.users = users; + return key; +}; + +/** + * Verifies primary user of key + * @param {Array} keys array of keys to verify certificate signatures + * @return {Array<({keyid: module:type/keyid, valid: Boolean})>} list of signer's keyid and validity of signature + */ +Key.prototype.verifyPrimaryUser = function (keys) { + var _ref2 = this.getPrimaryUser() || {}, + user = _ref2.user; + + if (!user) { + throw new Error('Could not find primary user'); + } + return user.verifyAllSignatures(this.primaryKey, keys); +}; + +/** + * Verifies all users of key + * @param {Array} keys array of keys to verify certificate signatures + * @return {Array<({userid: String, keyid: module:type/keyid, valid: Boolean})>} list of userid, signer's keyid and validity of signature + */ +Key.prototype.verifyAllUsers = function (keys) { + var _this2 = this; + + return this.users.reduce(function (signatures, user) { + return signatures.concat(user.verifyAllSignatures(_this2.primaryKey, keys).map(function (signature) { + return { + userid: user.userId.userid, + keyid: signature.keyid, + valid: signature.valid + }; + })); + }, []); +}; + +/** + * @class + * @classdesc Class that represents an user ID or attribute packet and the relevant signatures. + */ +function User(userPacket) { + if (!(this instanceof User)) { + return new User(userPacket); + } + this.userId = userPacket.tag === _enums2.default.packet.userid ? userPacket : null; + this.userAttribute = userPacket.tag === _enums2.default.packet.userAttribute ? userPacket : null; + this.selfCertifications = null; + this.otherCertifications = null; + this.revocationCertifications = null; +} + +/** + * Transforms structured user data to packetlist + * @return {module:packet/packetlist} + */ +User.prototype.toPacketlist = function () { + var packetlist = new _packet2.default.List(); + packetlist.push(this.userId || this.userAttribute); + packetlist.concat(this.revocationCertifications); + packetlist.concat(this.selfCertifications); + packetlist.concat(this.otherCertifications); + return packetlist; +}; + +/** + * Checks if a self signature of the user is revoked + * @param {module:packet/signature} certificate + * @param {module:packet/secret_key|module:packet/public_key} primaryKey The primary key packet + * @return {Boolean} True if the certificate is revoked + */ +User.prototype.isRevoked = function (certificate, primaryKey) { + if (this.revocationCertifications) { + var that = this; + return this.revocationCertifications.some(function (revCert) { + return revCert.issuerKeyId.equals(certificate.issuerKeyId) && !revCert.isExpired() && (revCert.verified || revCert.verify(primaryKey, { userid: that.userId || that.userAttribute, key: primaryKey })); + }); + } else { + return false; + } +}; + +/** + * Returns true if the self certificate is valid + * @param {module:packet/secret_key|module:packet/public_key} primaryKey The primary key packet + * @param {module:packet/signature} selfCertificate A self certificate of this user + * @param {Boolean} allowExpired allows signature verification with expired keys + * @return {Boolean} + */ +User.prototype.isValidSelfCertificate = function (primaryKey, selfCertificate) { + var allowExpired = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + if (this.isRevoked(selfCertificate, primaryKey)) { + return false; + } + if ((!selfCertificate.isExpired() || allowExpired) && (selfCertificate.verified || selfCertificate.verify(primaryKey, { userid: this.userId || this.userAttribute, key: primaryKey }))) { + return true; + } + return false; +}; + +/** + * Signs user + * @param {module:packet/secret_key|module:packet/public_key} primaryKey The primary key packet + * @param {Array} privateKeys decrypted private keys for signing + * @return {module:key~Key} new user with new certificate signatures + */ +User.prototype.sign = function (primaryKey, privateKeys) { + var user, dataToSign, signingKeyPacket, signaturePacket; + dataToSign = {}; + dataToSign.key = primaryKey; + dataToSign.userid = this.userId || this.userAttribute; + user = new User(this.userId || this.userAttribute); + user.otherCertifications = []; + privateKeys.forEach(function (privateKey) { + if (privateKey.isPublic()) { + throw new Error('Need private key for signing'); + } + if (privateKey.primaryKey.getFingerprint() === primaryKey.getFingerprint()) { + throw new Error('Not implemented for self signing'); + } + signingKeyPacket = privateKey.getSigningKeyPacket(); + if (!signingKeyPacket) { + throw new Error('Could not find valid signing key packet'); + } + if (!signingKeyPacket.isDecrypted) { + throw new Error('Private key is not decrypted.'); + } + signaturePacket = new _packet2.default.Signature(); + // Most OpenPGP implementations use generic certification (0x10) + signaturePacket.signatureType = _enums2.default.write(_enums2.default.signature, _enums2.default.signature.cert_generic); + signaturePacket.keyFlags = [_enums2.default.keyFlags.certify_keys | _enums2.default.keyFlags.sign_data]; + signaturePacket.hashAlgorithm = privateKey.getPreferredHashAlgorithm(); + signaturePacket.publicKeyAlgorithm = signingKeyPacket.algorithm; + signaturePacket.signingKeyId = signingKeyPacket.getKeyId(); + signaturePacket.sign(signingKeyPacket, dataToSign); + user.otherCertifications.push(signaturePacket); + }); + user.update(this, primaryKey); + return user; +}; + +/** + * Verifies all user signatures + * @param {module:packet/secret_key|module:packet/public_key} primaryKey The primary key packet + * @param {Array} keys array of keys to verify certificate signatures + * @return {Array<({keyid: module:type/keyid, valid: Boolean})>} list of signer's keyid and validity of signature + */ +User.prototype.verifyAllSignatures = function (primaryKey, keys) { + var dataToVerify = { userid: this.userId || this.userAttribute, key: primaryKey }; + var certificates = this.selfCertifications.concat(this.otherCertifications || []); + return certificates.map(function (signaturePacket) { + var keyPackets = keys.filter(function (key) { + return key.getSigningKeyPacket(signaturePacket.issuerKeyId); + }); + var valid = null; + if (keyPackets.length > 0) { + valid = keyPackets.some(function (keyPacket) { + return signaturePacket.verify(keyPacket.primaryKey, dataToVerify); + }); + } + return { keyid: signaturePacket.issuerKeyId, valid: valid }; + }); +}; + +/** + * Verify User. Checks for existence of self signatures, revocation signatures + * and validity of self signature + * @param {module:packet/secret_key|module:packet/public_key} primaryKey The primary key packet + * @return {module:enums.keyStatus} status of user + */ +User.prototype.verify = function (primaryKey) { + if (!this.selfCertifications) { + return _enums2.default.keyStatus.no_self_cert; + } + var status; + for (var i = 0; i < this.selfCertifications.length; i++) { + if (this.isRevoked(this.selfCertifications[i], primaryKey)) { + status = _enums2.default.keyStatus.revoked; + continue; + } + if (!(this.selfCertifications[i].verified || this.selfCertifications[i].verify(primaryKey, { userid: this.userId || this.userAttribute, key: primaryKey }))) { + status = _enums2.default.keyStatus.invalid; + continue; + } + if (this.selfCertifications[i].isExpired()) { + status = _enums2.default.keyStatus.expired; + continue; + } + status = _enums2.default.keyStatus.valid; + break; + } + return status; +}; + +/** + * Update user with new components from specified user + * @param {module:key~User} user source user to merge + * @param {module:packet/signature} primaryKey primary key used for validation + */ +User.prototype.update = function (user, primaryKey) { + var that = this; + // self signatures + mergeSignatures(user, this, 'selfCertifications', function (srcSelfSig) { + return srcSelfSig.verified || srcSelfSig.verify(primaryKey, { userid: that.userId || that.userAttribute, key: primaryKey }); + }); + // other signatures + mergeSignatures(user, this, 'otherCertifications'); + // revocation signatures + mergeSignatures(user, this, 'revocationCertifications'); +}; + +/** + * @class + * @classdesc Class that represents a subkey packet and the relevant signatures. + */ +function SubKey(subKeyPacket) { + if (!(this instanceof SubKey)) { + return new SubKey(subKeyPacket); + } + this.subKey = subKeyPacket; + this.bindingSignatures = []; + this.revocationSignature = null; +} + +/** + * Transforms structured subkey data to packetlist + * @return {module:packet/packetlist} + */ +SubKey.prototype.toPacketlist = function () { + var packetlist = new _packet2.default.List(); + packetlist.push(this.subKey); + packetlist.push(this.revocationSignature); + for (var i = 0; i < this.bindingSignatures.length; i++) { + packetlist.push(this.bindingSignatures[i]); + } + return packetlist; +}; + +/** + * Returns true if the subkey can be used for encryption + * @param {module:packet/secret_key|module:packet/public_key} primaryKey The primary key packet + * @return {Boolean} + */ +SubKey.prototype.isValidEncryptionKey = function (primaryKey) { + if (this.verify(primaryKey) !== _enums2.default.keyStatus.valid) { + return false; + } + for (var i = 0; i < this.bindingSignatures.length; i++) { + if (isValidEncryptionKeyPacket(this.subKey, this.bindingSignatures[i])) { + return true; + } + } + return false; +}; + +/** + * Returns true if the subkey can be used for signing of data + * @param {module:packet/secret_key|module:packet/public_key} primaryKey The primary key packet + * @param {Boolean} allowExpired allows signature verification with expired keys + * @return {Boolean} + */ +SubKey.prototype.isValidSigningKey = function (primaryKey) { + var allowExpired = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (this.verify(primaryKey, allowExpired) !== _enums2.default.keyStatus.valid) { + return false; + } + for (var i = 0; i < this.bindingSignatures.length; i++) { + if (isValidSigningKeyPacket(this.subKey, this.bindingSignatures[i])) { + return true; + } + } + return false; +}; + +/** + * Verify subkey. Checks for revocation signatures, expiration time + * and valid binding signature + * @param {module:packet/secret_key|module:packet/public_key} primaryKey The primary key packet + * @param {Boolean} allowExpired allows signature verification with expired keys + * @return {module:enums.keyStatus} The status of the subkey + */ +SubKey.prototype.verify = function (primaryKey) { + var allowExpired = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + // check subkey revocation signature + if (this.revocationSignature && !this.revocationSignature.isExpired() && (this.revocationSignature.verified || this.revocationSignature.verify(primaryKey, { key: primaryKey, bind: this.subKey }))) { + return _enums2.default.keyStatus.revoked; + } + // check V3 expiration time + if (!allowExpired && this.subKey.version === 3 && this.subKey.expirationTimeV3 !== 0 && Date.now() > this.subKey.created.getTime() + this.subKey.expirationTimeV3 * 24 * 3600 * 1000) { + return _enums2.default.keyStatus.expired; + } + // check subkey binding signatures (at least one valid binding sig needed) + for (var i = 0; i < this.bindingSignatures.length; i++) { + var isLast = i === this.bindingSignatures.length - 1; + var sig = this.bindingSignatures[i]; + // check binding signature is not expired + if (!allowExpired && sig.isExpired()) { + if (isLast) { + return _enums2.default.keyStatus.expired; // last expired binding signature + } else { + continue; + } + } + // check binding signature can verify + if (!(sig.verified || sig.verify(primaryKey, { key: primaryKey, bind: this.subKey }))) { + if (isLast) { + return _enums2.default.keyStatus.invalid; // last invalid binding signature + } else { + continue; + } + } + // check V4 expiration time + if (this.subKey.version === 4) { + if (!allowExpired && sig.keyNeverExpires === false && Date.now() > this.subKey.created.getTime() + sig.keyExpirationTime * 1000) { + if (isLast) { + return _enums2.default.keyStatus.expired; // last V4 expired binding signature + } else { + continue; + } + } + } + return _enums2.default.keyStatus.valid; // found a binding signature that passed all checks + } + return _enums2.default.keyStatus.invalid; // no binding signatures to check +}; + +/** + * Returns the expiration time of the subkey or null if key does not expire + * @return {Date|null} + */ +SubKey.prototype.getExpirationTime = function () { + var highest; + for (var i = 0; i < this.bindingSignatures.length; i++) { + var current = getExpirationTime(this.subKey, this.bindingSignatures[i]); + if (current === null) { + return null; + } + if (!highest || current > highest) { + highest = current; + } + } + return highest; +}; + +/** + * Update subkey with new components from specified subkey + * @param {module:key~SubKey} subKey source subkey to merge + * @param {module:packet/signature} primaryKey primary key used for validation + */ +SubKey.prototype.update = function (subKey, primaryKey) { + if (subKey.verify(primaryKey) === _enums2.default.keyStatus.invalid) { + return; + } + if (this.subKey.getFingerprint() !== subKey.subKey.getFingerprint()) { + throw new Error('SubKey update method: fingerprints of subkeys not equal'); + } + // key packet + if (this.subKey.tag === _enums2.default.packet.publicSubkey && subKey.subKey.tag === _enums2.default.packet.secretSubkey) { + this.subKey = subKey.subKey; + } + // update missing binding signatures + if (this.bindingSignatures.length < subKey.bindingSignatures.length) { + for (var i = this.bindingSignatures.length; i < subKey.bindingSignatures.length; i++) { + var newSig = subKey.bindingSignatures[i]; + if (newSig.verified || newSig.verify(primaryKey, { key: primaryKey, bind: this.subKey })) { + this.bindingSignatures.push(newSig); + } + } + } + // revocation signature + if (!this.revocationSignature && subKey.revocationSignature && !subKey.revocationSignature.isExpired() && (subKey.revocationSignature.verified || subKey.revocationSignature.verify(primaryKey, { key: primaryKey, bind: this.subKey }))) { + this.revocationSignature = subKey.revocationSignature; + } +}; + +/** + * Reads an unarmored OpenPGP key list and returns one or multiple key objects + * @param {Uint8Array} data to be parsed + * @return {{keys: Array, err: (Array|null)}} result object with key and error arrays + * @static + */ +function read(data) { + var result = {}; + result.keys = []; + try { + var packetlist = new _packet2.default.List(); + packetlist.read(data); + var keyIndex = packetlist.indexOfTag(_enums2.default.packet.publicKey, _enums2.default.packet.secretKey); + if (keyIndex.length === 0) { + throw new Error('No key packet found'); + } + for (var i = 0; i < keyIndex.length; i++) { + var oneKeyList = packetlist.slice(keyIndex[i], keyIndex[i + 1]); + try { + var newKey = new Key(oneKeyList); + result.keys.push(newKey); + } catch (e) { + result.err = result.err || []; + result.err.push(e); + } + } + } catch (e) { + result.err = result.err || []; + result.err.push(e); + } + return result; +} + +/** + * Reads an OpenPGP armored text and returns one or multiple key objects + * @param {String} armoredText text to be parsed + * @return {{keys: Array, err: (Array|null)}} result object with key and error arrays + * @static + */ +function readArmored(armoredText) { + try { + var input = _armor2.default.decode(armoredText); + if (!(input.type === _enums2.default.armor.public_key || input.type === _enums2.default.armor.private_key)) { + throw new Error('Armored text not of type key'); + } + return read(input.data); + } catch (e) { + var result = { keys: [], err: [] }; + result.err.push(e); + return result; + } +} + +/** + * Generates a new OpenPGP key. Currently only supports RSA keys. + * Primary and subkey will be of same type. + * @param {module:enums.publicKey} [options.keyType=module:enums.publicKey.rsa_encrypt_sign] to indicate what type of key to make. + * RSA is 1. See {@link http://tools.ietf.org/html/rfc4880#section-9.1} + * @param {Integer} options.numBits number of bits for the key creation. + * @param {String|Array} options.userIds assumes already in form of "User Name " + If array is used, the first userId is set as primary user Id + * @param {String} options.passphrase The passphrase used to encrypt the resulting private key + * @param {Boolean} [options.unlocked=false] The secret part of the generated key is unlocked + * @param {Number} [options.keyExpirationTime=0] The number of seconds after the key creation time that the key expires + * @return {module:key~Key} + * @static + */ +function generate(options) { + var secretKeyPacket, secretSubkeyPacket; + return Promise.resolve().then(function () { + options.keyType = options.keyType || _enums2.default.publicKey.rsa_encrypt_sign; + if (options.keyType !== _enums2.default.publicKey.rsa_encrypt_sign) { + // RSA Encrypt-Only and RSA Sign-Only are deprecated and SHOULD NOT be generated + throw new Error('Only RSA Encrypt or Sign supported'); + } + + if (!options.passphrase) { + // Key without passphrase is unlocked by definition + options.unlocked = true; + } + if (String.prototype.isPrototypeOf(options.userIds) || typeof options.userIds === 'string') { + options.userIds = [options.userIds]; + } + + return Promise.all([generateSecretKey(), generateSecretSubkey()]).then(function () { + return wrapKeyObject(secretKeyPacket, secretSubkeyPacket, options); + }); + }); + + function generateSecretKey() { + secretKeyPacket = new _packet2.default.SecretKey(); + secretKeyPacket.algorithm = _enums2.default.read(_enums2.default.publicKey, options.keyType); + return secretKeyPacket.generate(options.numBits); + } + + function generateSecretSubkey() { + secretSubkeyPacket = new _packet2.default.SecretSubkey(); + secretSubkeyPacket.algorithm = _enums2.default.read(_enums2.default.publicKey, options.keyType); + return secretSubkeyPacket.generate(options.numBits); + } +} + +/** + * Reformats and signs an OpenPGP with a given User ID. Currently only supports RSA keys. + * @param {module:key~Key} options.privateKey The private key to reformat + * @param {module:enums.publicKey} [options.keyType=module:enums.publicKey.rsa_encrypt_sign] + * @param {String|Array} options.userIds assumes already in form of "User Name " + If array is used, the first userId is set as primary user Id + * @param {String} options.passphrase The passphrase used to encrypt the resulting private key + * @param {Boolean} [options.unlocked=false] The secret part of the generated key is unlocked + * @param {Number} [options.keyExpirationTime=0] The number of seconds after the key creation time that the key expires + * @return {module:key~Key} + * @static + */ +function reformat(options) { + var secretKeyPacket, secretSubkeyPacket; + return Promise.resolve().then(function () { + + options.keyType = options.keyType || _enums2.default.publicKey.rsa_encrypt_sign; + if (options.keyType !== _enums2.default.publicKey.rsa_encrypt_sign) { + // RSA Encrypt-Only and RSA Sign-Only are deprecated and SHOULD NOT be generated + throw new Error('Only RSA Encrypt or Sign supported'); + } + + if (!options.privateKey.decrypt()) { + throw new Error('Key not decrypted'); + } + + if (!options.passphrase) { + // Key without passphrase is unlocked by definition + options.unlocked = true; + } + if (String.prototype.isPrototypeOf(options.userIds) || typeof options.userIds === 'string') { + options.userIds = [options.userIds]; + } + var packetlist = options.privateKey.toPacketlist(); + for (var i = 0; i < packetlist.length; i++) { + if (packetlist[i].tag === _enums2.default.packet.secretKey) { + secretKeyPacket = packetlist[i]; + } else if (packetlist[i].tag === _enums2.default.packet.secretSubkey) { + secretSubkeyPacket = packetlist[i]; + } + } + return wrapKeyObject(secretKeyPacket, secretSubkeyPacket, options); + }); +} + +function wrapKeyObject(secretKeyPacket, secretSubkeyPacket, options) { + // set passphrase protection + if (options.passphrase) { + secretKeyPacket.encrypt(options.passphrase); + secretSubkeyPacket.encrypt(options.passphrase); + } + + var packetlist = new _packet2.default.List(); + + packetlist.push(secretKeyPacket); + + options.userIds.forEach(function (userId, index) { + + var userIdPacket = new _packet2.default.Userid(); + userIdPacket.read(_util2.default.str2Uint8Array(userId)); + + var dataToSign = {}; + dataToSign.userid = userIdPacket; + dataToSign.key = secretKeyPacket; + var signaturePacket = new _packet2.default.Signature(); + signaturePacket.signatureType = _enums2.default.signature.cert_generic; + signaturePacket.publicKeyAlgorithm = options.keyType; + signaturePacket.hashAlgorithm = _config2.default.prefer_hash_algorithm; + signaturePacket.keyFlags = [_enums2.default.keyFlags.certify_keys | _enums2.default.keyFlags.sign_data]; + signaturePacket.preferredSymmetricAlgorithms = []; + // prefer aes256, aes128, then aes192 (no WebCrypto support: https://www.chromium.org/blink/webcrypto#TOC-AES-support) + signaturePacket.preferredSymmetricAlgorithms.push(_enums2.default.symmetric.aes256); + signaturePacket.preferredSymmetricAlgorithms.push(_enums2.default.symmetric.aes128); + signaturePacket.preferredSymmetricAlgorithms.push(_enums2.default.symmetric.aes192); + signaturePacket.preferredSymmetricAlgorithms.push(_enums2.default.symmetric.cast5); + signaturePacket.preferredSymmetricAlgorithms.push(_enums2.default.symmetric.tripledes); + signaturePacket.preferredHashAlgorithms = []; + // prefer fast asm.js implementations (SHA-256). SHA-1 will not be secure much longer...move to bottom of list + signaturePacket.preferredHashAlgorithms.push(_enums2.default.hash.sha256); + signaturePacket.preferredHashAlgorithms.push(_enums2.default.hash.sha512); + signaturePacket.preferredHashAlgorithms.push(_enums2.default.hash.sha1); + signaturePacket.preferredCompressionAlgorithms = []; + signaturePacket.preferredCompressionAlgorithms.push(_enums2.default.compression.zlib); + signaturePacket.preferredCompressionAlgorithms.push(_enums2.default.compression.zip); + if (index === 0) { + signaturePacket.isPrimaryUserID = true; + } + if (_config2.default.integrity_protect) { + signaturePacket.features = []; + signaturePacket.features.push(1); // Modification Detection + } + if (options.keyExpirationTime > 0) { + signaturePacket.keyExpirationTime = options.keyExpirationTime; + signaturePacket.keyNeverExpires = false; + } + signaturePacket.sign(secretKeyPacket, dataToSign); + + packetlist.push(userIdPacket); + packetlist.push(signaturePacket); + }); + + var dataToSign = {}; + dataToSign.key = secretKeyPacket; + dataToSign.bind = secretSubkeyPacket; + var subkeySignaturePacket = new _packet2.default.Signature(); + subkeySignaturePacket.signatureType = _enums2.default.signature.subkey_binding; + subkeySignaturePacket.publicKeyAlgorithm = options.keyType; + subkeySignaturePacket.hashAlgorithm = _config2.default.prefer_hash_algorithm; + subkeySignaturePacket.keyFlags = [_enums2.default.keyFlags.encrypt_communication | _enums2.default.keyFlags.encrypt_storage]; + if (options.keyExpirationTime > 0) { + subkeySignaturePacket.keyExpirationTime = options.keyExpirationTime; + subkeySignaturePacket.keyNeverExpires = false; + } + subkeySignaturePacket.sign(secretKeyPacket, dataToSign); + + packetlist.push(secretSubkeyPacket); + packetlist.push(subkeySignaturePacket); + + if (!options.unlocked) { + secretKeyPacket.clearPrivateMPIs(); + secretSubkeyPacket.clearPrivateMPIs(); + } + + return new Key(packetlist); +} + +/** + * Returns the preferred symmetric algorithm for a set of keys + * @param {Array} keys Set of keys + * @return {enums.symmetric} Preferred symmetric algorithm + */ +function getPreferredSymAlgo(keys) { + var prioMap = {}; + keys.forEach(function (key) { + var primaryUser = key.getPrimaryUser(); + if (!primaryUser || !primaryUser.selfCertificate.preferredSymmetricAlgorithms) { + return _config2.default.encryption_cipher; + } + primaryUser.selfCertificate.preferredSymmetricAlgorithms.forEach(function (algo, index) { + var entry = prioMap[algo] || (prioMap[algo] = { prio: 0, count: 0, algo: algo }); + entry.prio += 64 >> index; + entry.count++; + }); + }); + var prefAlgo = { prio: 0, algo: _config2.default.encryption_cipher }; + for (var algo in prioMap) { + try { + if (algo !== _enums2.default.symmetric.plaintext && algo !== _enums2.default.symmetric.idea && // not implemented + _enums2.default.read(_enums2.default.symmetric, algo) && // known algorithm + prioMap[algo].count === keys.length && // available for all keys + prioMap[algo].prio > prefAlgo.prio) { + prefAlgo = prioMap[algo]; + } + } catch (e) {} + } + return prefAlgo.algo; +} + +},{"./config":10,"./encoding/armor.js":33,"./enums.js":35,"./packet":47,"./util":70}],39:[function(_dereq_,module,exports){ +'use strict'; + +/** + * @see module:keyring/keyring + * @module keyring + */ + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _keyring = _dereq_('./keyring.js'); + +var _keyring2 = _interopRequireDefault(_keyring); + +var _localstore = _dereq_('./localstore.js'); + +var _localstore2 = _interopRequireDefault(_localstore); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +_keyring2.default.localstore = _localstore2.default; + +exports.default = _keyring2.default; + +},{"./keyring.js":40,"./localstore.js":41}],40:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * The class that deals with storage of the keyring. Currently the only option is to use HTML5 local storage. + * @requires enums + * @requires key + * @requires util + * @module keyring/keyring + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = Keyring; + +var _key = _dereq_('../key.js'); + +var keyModule = _interopRequireWildcard(_key); + +var _localstore = _dereq_('./localstore.js'); + +var _localstore2 = _interopRequireDefault(_localstore); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +/** + * Initialization routine for the keyring. This method reads the + * keyring from HTML5 local storage and initializes this instance. + * @constructor + * @param {class} [storeHandler] class implementing loadPublic(), loadPrivate(), storePublic(), and storePrivate() methods + */ +function Keyring(storeHandler) { + this.storeHandler = storeHandler || new _localstore2.default(); + this.publicKeys = new KeyArray(this.storeHandler.loadPublic()); + this.privateKeys = new KeyArray(this.storeHandler.loadPrivate()); +} + +/** + * Calls the storeHandler to save the keys + */ +Keyring.prototype.store = function () { + this.storeHandler.storePublic(this.publicKeys.keys); + this.storeHandler.storePrivate(this.privateKeys.keys); +}; + +/** + * Clear the keyring - erase all the keys + */ +Keyring.prototype.clear = function () { + this.publicKeys.keys = []; + this.privateKeys.keys = []; +}; + +/** + * Searches the keyring for keys having the specified key id + * @param {String} keyId provided as string of lowercase hex number + * withouth 0x prefix (can be 16-character key ID or fingerprint) + * @param {Boolean} deep if true search also in subkeys + * @return {Array|null} keys found or null + */ +Keyring.prototype.getKeysForId = function (keyId, deep) { + var result = []; + result = result.concat(this.publicKeys.getForId(keyId, deep) || []); + result = result.concat(this.privateKeys.getForId(keyId, deep) || []); + return result.length ? result : null; +}; + +/** + * Removes keys having the specified key id from the keyring + * @param {String} keyId provided as string of lowercase hex number + * withouth 0x prefix (can be 16-character key ID or fingerprint) + * @return {Array|null} keys found or null + */ +Keyring.prototype.removeKeysForId = function (keyId) { + var result = []; + result = result.concat(this.publicKeys.removeForId(keyId) || []); + result = result.concat(this.privateKeys.removeForId(keyId) || []); + return result.length ? result : null; +}; + +/** + * Get all public and private keys + * @return {Array} all keys + */ +Keyring.prototype.getAllKeys = function () { + return this.publicKeys.keys.concat(this.privateKeys.keys); +}; + +/** + * Array of keys + * @param {Array} keys The keys to store in this array + */ +function KeyArray(keys) { + this.keys = keys; +} + +/** + * Searches all keys in the KeyArray matching the address or address part of the user ids + * @param {String} email email address to search for + * @return {Array} The public keys associated with provided email address. + */ +KeyArray.prototype.getForAddress = function (email) { + var results = []; + for (var i = 0; i < this.keys.length; i++) { + if (emailCheck(email, this.keys[i])) { + results.push(this.keys[i]); + } + } + return results; +}; + +/** + * Checks a key to see if it matches the specified email address + * @private + * @param {String} email email address to search for + * @param {module:key~Key} key The key to be checked. + * @return {Boolean} True if the email address is defined in the specified key + */ +function emailCheck(email, key) { + email = email.toLowerCase(); + // escape email before using in regular expression + var emailEsc = email.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var emailRegex = new RegExp('<' + emailEsc + '>'); + var userIds = key.getUserIds(); + for (var i = 0; i < userIds.length; i++) { + var userId = userIds[i].toLowerCase(); + if (email === userId || emailRegex.test(userId)) { + return true; + } + } + return false; +} + +/** + * Checks a key to see if it matches the specified keyid + * @private + * @param {String} keyId provided as string of lowercase hex number + * withouth 0x prefix (can be 16-character key ID or fingerprint) + * @param {module:packet/secret_key|public_key|public_subkey|secret_subkey} keypacket The keypacket to be checked + * @return {Boolean} True if keypacket has the specified keyid + */ +function keyIdCheck(keyId, keypacket) { + if (keyId.length === 16) { + return keyId === keypacket.getKeyId().toHex(); + } else { + return keyId === keypacket.getFingerprint(); + } +} + +/** + * Searches the KeyArray for a key having the specified key id + * @param {String} keyId provided as string of lowercase hex number + * withouth 0x prefix (can be 16-character key ID or fingerprint) + * @param {Boolean} deep if true search also in subkeys + * @return {module:key~Key|null} key found or null + */ +KeyArray.prototype.getForId = function (keyId, deep) { + for (var i = 0; i < this.keys.length; i++) { + if (keyIdCheck(keyId, this.keys[i].primaryKey)) { + return this.keys[i]; + } + if (deep && this.keys[i].subKeys) { + for (var j = 0; j < this.keys[i].subKeys.length; j++) { + if (keyIdCheck(keyId, this.keys[i].subKeys[j].subKey)) { + return this.keys[i]; + } + } + } + } + return null; +}; + +/** + * Imports a key from an ascii armored message + * @param {String} armored message to read the keys/key from + * @return {Array|null} array of error objects or null + */ +KeyArray.prototype.importKey = function (armored) { + var imported = keyModule.readArmored(armored); + var that = this; + imported.keys.forEach(function (key) { + // check if key already in key array + var keyidHex = key.primaryKey.getKeyId().toHex(); + var keyFound = that.getForId(keyidHex); + if (keyFound) { + keyFound.update(key); + } else { + that.push(key); + } + }); + return imported.err ? imported.err : null; +}; + +/** + * Add key to KeyArray + * @param {module:key~Key} key The key that will be added to the keyring + * @return {Number} The new length of the KeyArray + */ +KeyArray.prototype.push = function (key) { + return this.keys.push(key); +}; + +/** + * Removes a key with the specified keyid from the keyring + * @param {String} keyId provided as string of lowercase hex number + * withouth 0x prefix (can be 16-character key ID or fingerprint) + * @return {module:key~Key|null} The key object which has been removed or null + */ +KeyArray.prototype.removeForId = function (keyId) { + for (var i = 0; i < this.keys.length; i++) { + if (keyIdCheck(keyId, this.keys[i].primaryKey)) { + return this.keys.splice(i, 1)[0]; + } + } + return null; +}; + +},{"../key.js":38,"./localstore.js":41}],41:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * The class that deals with storage of the keyring. Currently the only option is to use HTML5 local storage. + * @requires config + * @module keyring/localstore + * @param {String} prefix prefix for itemnames in localstore + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = LocalStore; + +var _config = _dereq_('../config'); + +var _config2 = _interopRequireDefault(_config); + +var _key = _dereq_('../key.js'); + +var keyModule = _interopRequireWildcard(_key); + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function LocalStore(prefix) { + prefix = prefix || 'openpgp-'; + this.publicKeysItem = prefix + this.publicKeysItem; + this.privateKeysItem = prefix + this.privateKeysItem; + if (typeof window !== 'undefined' && window.localStorage) { + this.storage = window.localStorage; + } else { + this.storage = new (_dereq_('node-localstorage').LocalStorage)(_config2.default.node_store); + } +} + +/* + * Declare the localstore itemnames + */ +LocalStore.prototype.publicKeysItem = 'public-keys'; +LocalStore.prototype.privateKeysItem = 'private-keys'; + +/** + * Load the public keys from HTML5 local storage. + * @return {Array} array of keys retrieved from localstore + */ +LocalStore.prototype.loadPublic = function () { + return loadKeys(this.storage, this.publicKeysItem); +}; + +/** + * Load the private keys from HTML5 local storage. + * @return {Array} array of keys retrieved from localstore + */ +LocalStore.prototype.loadPrivate = function () { + return loadKeys(this.storage, this.privateKeysItem); +}; + +function loadKeys(storage, itemname) { + var armoredKeys = JSON.parse(storage.getItem(itemname)); + var keys = []; + if (armoredKeys !== null && armoredKeys.length !== 0) { + var key; + for (var i = 0; i < armoredKeys.length; i++) { + key = keyModule.readArmored(armoredKeys[i]); + if (!key.err) { + keys.push(key.keys[0]); + } else { + _util2.default.print_debug("Error reading armored key from keyring index: " + i); + } + } + } + return keys; +} + +/** + * Saves the current state of the public keys to HTML5 local storage. + * The key array gets stringified using JSON + * @param {Array} keys array of keys to save in localstore + */ +LocalStore.prototype.storePublic = function (keys) { + storeKeys(this.storage, this.publicKeysItem, keys); +}; + +/** + * Saves the current state of the private keys to HTML5 local storage. + * The key array gets stringified using JSON + * @param {Array} keys array of keys to save in localstore + */ +LocalStore.prototype.storePrivate = function (keys) { + storeKeys(this.storage, this.privateKeysItem, keys); +}; + +function storeKeys(storage, itemname, keys) { + var armoredKeys = []; + if (keys.length) { + for (var i = 0; i < keys.length; i++) { + armoredKeys.push(keys[i].armor()); + } + storage.setItem(itemname, JSON.stringify(armoredKeys)); + } else { + storage.removeItem(itemname); + } +} + +},{"../config":10,"../key.js":38,"../util.js":70,"node-localstorage":"node-localstorage"}],42:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @requires config + * @requires crypto + * @requires encoding/armor + * @requires enums + * @requires packet + * @module message + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Message = Message; +exports.encryptSessionKey = encryptSessionKey; +exports.readArmored = readArmored; +exports.read = read; +exports.readSignedContent = readSignedContent; +exports.fromText = fromText; +exports.fromBinary = fromBinary; + +var _util = _dereq_('./util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _packet = _dereq_('./packet'); + +var _packet2 = _interopRequireDefault(_packet); + +var _enums = _dereq_('./enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _armor = _dereq_('./encoding/armor.js'); + +var _armor2 = _interopRequireDefault(_armor); + +var _config = _dereq_('./config'); + +var _config2 = _interopRequireDefault(_config); + +var _crypto = _dereq_('./crypto'); + +var _crypto2 = _interopRequireDefault(_crypto); + +var _signature = _dereq_('./signature.js'); + +var sigModule = _interopRequireWildcard(_signature); + +var _key = _dereq_('./key.js'); + +var keyModule = _interopRequireWildcard(_key); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @class + * @classdesc Class that represents an OpenPGP message. + * Can be an encrypted message, signed message, compressed message or literal message + * @param {module:packet/packetlist} packetlist The packets that form this message + * See {@link http://tools.ietf.org/html/rfc4880#section-11.3} + */ + +function Message(packetlist) { + if (!(this instanceof Message)) { + return new Message(packetlist); + } + this.packets = packetlist || new _packet2.default.List(); +} + +/** + * Returns the key IDs of the keys to which the session key is encrypted + * @return {Array} array of keyid objects + */ +Message.prototype.getEncryptionKeyIds = function () { + var keyIds = []; + var pkESKeyPacketlist = this.packets.filterByTag(_enums2.default.packet.publicKeyEncryptedSessionKey); + pkESKeyPacketlist.forEach(function (packet) { + keyIds.push(packet.publicKeyId); + }); + return keyIds; +}; + +/** + * Returns the key IDs of the keys that signed the message + * @return {Array} array of keyid objects + */ +Message.prototype.getSigningKeyIds = function () { + var keyIds = []; + var msg = this.unwrapCompressed(); + // search for one pass signatures + var onePassSigList = msg.packets.filterByTag(_enums2.default.packet.onePassSignature); + onePassSigList.forEach(function (packet) { + keyIds.push(packet.signingKeyId); + }); + // if nothing found look for signature packets + if (!keyIds.length) { + var signatureList = msg.packets.filterByTag(_enums2.default.packet.signature); + signatureList.forEach(function (packet) { + keyIds.push(packet.issuerKeyId); + }); + } + return keyIds; +}; + +/** + * Decrypt the message. Either a private key, a session key, or a password must be specified. + * @param {Key} privateKey (optional) private key with decrypted secret data + * @param {Object} sessionKey (optional) session key in the form: { data:Uint8Array, algorithm:String } + * @param {String} password (optional) password used to decrypt + * @return {Message} new message with decrypted content + */ +Message.prototype.decrypt = function (privateKey, sessionKey, password) { + var _this = this; + + return Promise.resolve().then(function () { + var keyObj = sessionKey || _this.decryptSessionKey(privateKey, password); + if (!keyObj || !_util2.default.isUint8Array(keyObj.data) || !_util2.default.isString(keyObj.algorithm)) { + throw new Error('Invalid session key for decryption.'); + } + + var symEncryptedPacketlist = _this.packets.filterByTag(_enums2.default.packet.symmetricallyEncrypted, _enums2.default.packet.symEncryptedIntegrityProtected, _enums2.default.packet.symEncryptedAEADProtected); + + if (symEncryptedPacketlist.length === 0) { + return; + } + + var symEncryptedPacket = symEncryptedPacketlist[0]; + return symEncryptedPacket.decrypt(keyObj.algorithm, keyObj.data).then(function () { + var resultMsg = new Message(symEncryptedPacket.packets); + symEncryptedPacket.packets = new _packet2.default.List(); // remove packets after decryption + return resultMsg; + }); + }); +}; + +/** + * Decrypt an encrypted session key either with a private key or a password. + * @param {Key} privateKey (optional) private key with decrypted secret data + * @param {String} password (optional) password used to decrypt + * @return {Object} object with sessionKey, algorithm in the form: + * { data:Uint8Array, algorithm:String } + */ +Message.prototype.decryptSessionKey = function (privateKey, password) { + var keyPacket; + + if (password) { + var symEncryptedSessionKeyPacketlist = this.packets.filterByTag(_enums2.default.packet.symEncryptedSessionKey); + var symLength = symEncryptedSessionKeyPacketlist.length; + for (var i = 0; i < symLength; i++) { + keyPacket = symEncryptedSessionKeyPacketlist[i]; + try { + keyPacket.decrypt(password); + break; + } catch (err) { + if (i === symLength - 1) { + throw err; + } + } + } + if (!keyPacket) { + throw new Error('No symmetrically encrypted session key packet found.'); + } + } else if (privateKey) { + var encryptionKeyIds = this.getEncryptionKeyIds(); + if (!encryptionKeyIds.length) { + // nothing to decrypt + return; + } + var privateKeyPacket = privateKey.getKeyPacket(encryptionKeyIds); + if (!privateKeyPacket.isDecrypted) { + throw new Error('Private key is not decrypted.'); + } + var pkESKeyPacketlist = this.packets.filterByTag(_enums2.default.packet.publicKeyEncryptedSessionKey); + for (var j = 0; j < pkESKeyPacketlist.length; j++) { + if (pkESKeyPacketlist[j].publicKeyId.equals(privateKeyPacket.getKeyId())) { + keyPacket = pkESKeyPacketlist[j]; + keyPacket.decrypt(privateKeyPacket); + break; + } + } + } else { + throw new Error('No key or password specified.'); + } + + if (keyPacket) { + return { + data: keyPacket.sessionKey, + algorithm: keyPacket.sessionKeyAlgorithm + }; + } +}; + +/** + * Get literal data that is the body of the message + * @return {(Uint8Array|null)} literal body of the message as Uint8Array + */ +Message.prototype.getLiteralData = function () { + var literal = this.packets.findPacket(_enums2.default.packet.literal); + return literal && literal.data || null; +}; + +/** + * Get filename from literal data packet + * @return {(String|null)} filename of literal data packet as string + */ +Message.prototype.getFilename = function () { + var literal = this.packets.findPacket(_enums2.default.packet.literal); + return literal && literal.getFilename() || null; +}; + +/** + * Get literal data as text + * @return {(String|null)} literal body of the message interpreted as text + */ +Message.prototype.getText = function () { + var literal = this.packets.findPacket(_enums2.default.packet.literal); + if (literal) { + return literal.getText(); + } else { + return null; + } +}; + +/** + * Encrypt the message either with public keys, passwords, or both at once. + * @param {Array} keys (optional) public key(s) for message encryption + * @param {Array} passwords (optional) password(s) for message encryption + * @param {Object} sessionKey (optional) session key in the form: { data:Uint8Array, algorithm:String } + * @return {Message} new message with encrypted content + */ +Message.prototype.encrypt = function (keys, passwords, sessionKey) { + var _this2 = this; + + var symAlgo = void 0, + msg = void 0, + symEncryptedPacket = void 0; + return Promise.resolve().then(function () { + if (sessionKey) { + if (!_util2.default.isUint8Array(sessionKey.data) || !_util2.default.isString(sessionKey.algorithm)) { + throw new Error('Invalid session key for encryption.'); + } + symAlgo = sessionKey.algorithm; + sessionKey = sessionKey.data; + } else if (keys && keys.length) { + symAlgo = _enums2.default.read(_enums2.default.symmetric, keyModule.getPreferredSymAlgo(keys)); + } else if (passwords && passwords.length) { + symAlgo = _enums2.default.read(_enums2.default.symmetric, _config2.default.encryption_cipher); + } else { + throw new Error('No keys, passwords, or session key provided.'); + } + + if (!sessionKey) { + sessionKey = _crypto2.default.generateSessionKey(symAlgo); + } + + msg = encryptSessionKey(sessionKey, symAlgo, keys, passwords); + + if (_config2.default.aead_protect) { + symEncryptedPacket = new _packet2.default.SymEncryptedAEADProtected(); + } else if (_config2.default.integrity_protect) { + symEncryptedPacket = new _packet2.default.SymEncryptedIntegrityProtected(); + } else { + symEncryptedPacket = new _packet2.default.SymmetricallyEncrypted(); + } + symEncryptedPacket.packets = _this2.packets; + + return symEncryptedPacket.encrypt(symAlgo, sessionKey); + }).then(function () { + msg.packets.push(symEncryptedPacket); + symEncryptedPacket.packets = new _packet2.default.List(); // remove packets after encryption + return { + message: msg, + sessionKey: { + data: sessionKey, + algorithm: symAlgo + } + }; + }); +}; + +/** + * Encrypt a session key either with public keys, passwords, or both at once. + * @param {Uint8Array} sessionKey session key for encryption + * @param {String} symAlgo session key algorithm + * @param {Array} publicKeys (optional) public key(s) for message encryption + * @param {Array} passwords (optional) for message encryption + * @return {Message} new message with encrypted content + */ +function encryptSessionKey(sessionKey, symAlgo, publicKeys, passwords) { + var packetlist = new _packet2.default.List(); + + if (publicKeys) { + publicKeys.forEach(function (key) { + var encryptionKeyPacket = key.getEncryptionKeyPacket(); + if (encryptionKeyPacket) { + var pkESKeyPacket = new _packet2.default.PublicKeyEncryptedSessionKey(); + pkESKeyPacket.publicKeyId = encryptionKeyPacket.getKeyId(); + pkESKeyPacket.publicKeyAlgorithm = encryptionKeyPacket.algorithm; + pkESKeyPacket.sessionKey = sessionKey; + pkESKeyPacket.sessionKeyAlgorithm = symAlgo; + pkESKeyPacket.encrypt(encryptionKeyPacket); + delete pkESKeyPacket.sessionKey; // delete plaintext session key after encryption + packetlist.push(pkESKeyPacket); + } else { + throw new Error('Could not find valid key packet for encryption in key ' + key.primaryKey.getKeyId().toHex()); + } + }); + } + + if (passwords) { + passwords.forEach(function (password) { + var symEncryptedSessionKeyPacket = new _packet2.default.SymEncryptedSessionKey(); + symEncryptedSessionKeyPacket.sessionKey = sessionKey; + symEncryptedSessionKeyPacket.sessionKeyAlgorithm = symAlgo; + symEncryptedSessionKeyPacket.encrypt(password); + delete symEncryptedSessionKeyPacket.sessionKey; // delete plaintext session key after encryption + packetlist.push(symEncryptedSessionKeyPacket); + }); + } + + return new Message(packetlist); +} + +/** + * Sign the message (the literal data packet of the message) + * @param {Array} privateKey private keys with decrypted secret key data for signing + * @param {Signature} signature (optional) any existing detached signature to add to the message + * @return {module:message~Message} new message with signed content + */ +Message.prototype.sign = function () { + var privateKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + var signature = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + + var packetlist = new _packet2.default.List(); + + var literalDataPacket = this.packets.findPacket(_enums2.default.packet.literal); + if (!literalDataPacket) { + throw new Error('No literal data packet to sign.'); + } + + var literalFormat = _enums2.default.write(_enums2.default.literal, literalDataPacket.format); + var signatureType = literalFormat === _enums2.default.literal.binary ? _enums2.default.signature.binary : _enums2.default.signature.text; + var i, signingKeyPacket, existingSigPacketlist, onePassSig; + + if (signature) { + existingSigPacketlist = signature.packets.filterByTag(_enums2.default.packet.signature); + if (existingSigPacketlist.length) { + for (i = existingSigPacketlist.length - 1; i >= 0; i--) { + var sigPacket = existingSigPacketlist[i]; + onePassSig = new _packet2.default.OnePassSignature(); + onePassSig.type = signatureType; + onePassSig.hashAlgorithm = _config2.default.prefer_hash_algorithm; + onePassSig.publicKeyAlgorithm = sigPacket.publicKeyAlgorithm; + onePassSig.signingKeyId = sigPacket.issuerKeyId; + if (!privateKeys.length && i === 0) { + onePassSig.flags = 1; + } + packetlist.push(onePassSig); + } + } + } + for (i = 0; i < privateKeys.length; i++) { + if (privateKeys[i].isPublic()) { + throw new Error('Need private key for signing'); + } + onePassSig = new _packet2.default.OnePassSignature(); + onePassSig.type = signatureType; + //TODO get preferred hashg algo from key signature + onePassSig.hashAlgorithm = _config2.default.prefer_hash_algorithm; + signingKeyPacket = privateKeys[i].getSigningKeyPacket(); + if (!signingKeyPacket) { + throw new Error('Could not find valid key packet for signing in key ' + privateKeys[i].primaryKey.getKeyId().toHex()); + } + onePassSig.publicKeyAlgorithm = signingKeyPacket.algorithm; + onePassSig.signingKeyId = signingKeyPacket.getKeyId(); + if (i === privateKeys.length - 1) { + onePassSig.flags = 1; + } + packetlist.push(onePassSig); + } + + packetlist.push(literalDataPacket); + + for (i = privateKeys.length - 1; i >= 0; i--) { + var signaturePacket = new _packet2.default.Signature(); + signaturePacket.signatureType = signatureType; + signaturePacket.hashAlgorithm = _config2.default.prefer_hash_algorithm; + signaturePacket.publicKeyAlgorithm = signingKeyPacket.algorithm; + if (!signingKeyPacket.isDecrypted) { + throw new Error('Private key is not decrypted.'); + } + signaturePacket.sign(signingKeyPacket, literalDataPacket); + packetlist.push(signaturePacket); + } + + if (signature) { + packetlist.concat(existingSigPacketlist); + } + + return new Message(packetlist); +}; + +/** + * Create a detached signature for the message (the literal data packet of the message) + * @param {Array} privateKey private keys with decrypted secret key data for signing + * @param {Signature} signature (optional) any existing detached signature + * @return {module:signature~Signature} new detached signature of message content + */ +Message.prototype.signDetached = function () { + var privateKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + var signature = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + + var packetlist = new _packet2.default.List(); + + var literalDataPacket = this.packets.findPacket(_enums2.default.packet.literal); + if (!literalDataPacket) { + throw new Error('No literal data packet to sign.'); + } + + var literalFormat = _enums2.default.write(_enums2.default.literal, literalDataPacket.format); + var signatureType = literalFormat === _enums2.default.literal.binary ? _enums2.default.signature.binary : _enums2.default.signature.text; + + for (var i = 0; i < privateKeys.length; i++) { + var signingKeyPacket = privateKeys[i].getSigningKeyPacket(); + var signaturePacket = new _packet2.default.Signature(); + signaturePacket.signatureType = signatureType; + signaturePacket.hashAlgorithm = _config2.default.prefer_hash_algorithm; + signaturePacket.publicKeyAlgorithm = signingKeyPacket.algorithm; + if (!signingKeyPacket.isDecrypted) { + throw new Error('Private key is not decrypted.'); + } + signaturePacket.sign(signingKeyPacket, literalDataPacket); + packetlist.push(signaturePacket); + } + if (signature) { + var existingSigPacketlist = signature.packets.filterByTag(_enums2.default.packet.signature); + packetlist.concat(existingSigPacketlist); + } + + return new sigModule.Signature(packetlist); +}; + +/** + * Verify message signatures + * @param {Array} keys array of keys to verify signatures + * @return {Array<({keyid: module:type/keyid, valid: Boolean})>} list of signer's keyid and validity of signature + */ +Message.prototype.verify = function (keys) { + var msg = this.unwrapCompressed(); + var literalDataList = msg.packets.filterByTag(_enums2.default.packet.literal); + if (literalDataList.length !== 1) { + throw new Error('Can only verify message with one literal data packet.'); + } + var signatureList = msg.packets.filterByTag(_enums2.default.packet.signature); + return createVerificationObjects(signatureList, literalDataList, keys); +}; + +/** + * Verify detached message signature + * @param {Array} keys array of keys to verify signatures + * @param {Signature} + * @return {Array<({keyid: module:type/keyid, valid: Boolean})>} list of signer's keyid and validity of signature + */ +Message.prototype.verifyDetached = function (signature, keys) { + var msg = this.unwrapCompressed(); + var literalDataList = msg.packets.filterByTag(_enums2.default.packet.literal); + if (literalDataList.length !== 1) { + throw new Error('Can only verify message with one literal data packet.'); + } + var signatureList = signature.packets; + return createVerificationObjects(signatureList, literalDataList, keys); +}; + +/** + * Create list of objects containing signer's keyid and validity of signature + * @param {Array} signatureList array of signature packets + * @param {Array} literalDataList array of literal data packets + * @param {Array} keys array of keys to verify signatures + * @return {Array<({keyid: module:type/keyid, valid: Boolean})>} list of signer's keyid and validity of signature + */ +function createVerificationObjects(signatureList, literalDataList, keys) { + var result = []; + for (var i = 0; i < signatureList.length; i++) { + var keyPacket = null; + for (var j = 0; j < keys.length; j++) { + keyPacket = keys[j].getSigningKeyPacket(signatureList[i].issuerKeyId, _config2.default.verify_expired_keys); + if (keyPacket) { + break; + } + } + + var verifiedSig = {}; + if (keyPacket) { + //found a key packet that matches keyId of signature + verifiedSig.keyid = signatureList[i].issuerKeyId; + verifiedSig.valid = signatureList[i].verify(keyPacket, literalDataList[0]); + } else { + verifiedSig.keyid = signatureList[i].issuerKeyId; + verifiedSig.valid = null; + } + + var packetlist = new _packet2.default.List(); + packetlist.push(signatureList[i]); + verifiedSig.signature = new sigModule.Signature(packetlist); + + result.push(verifiedSig); + } + return result; +} + +/** + * Unwrap compressed message + * @return {module:message~Message} message Content of compressed message + */ +Message.prototype.unwrapCompressed = function () { + var compressed = this.packets.filterByTag(_enums2.default.packet.compressed); + if (compressed.length) { + return new Message(compressed[0].packets); + } else { + return this; + } +}; + +/** + * Returns ASCII armored text of message + * @return {String} ASCII armor + */ +Message.prototype.armor = function () { + return _armor2.default.encode(_enums2.default.armor.message, this.packets.write()); +}; + +/** + * reads an OpenPGP armored message and returns a message object + * @param {String} armoredText text to be parsed + * @return {module:message~Message} new message object + * @static + */ +function readArmored(armoredText) { + //TODO how do we want to handle bad text? Exception throwing + //TODO don't accept non-message armored texts + var input = _armor2.default.decode(armoredText).data; + return read(input); +} + +/** + * reads an OpenPGP message as byte array and returns a message object + * @param {Uint8Array} input binary message + * @return {Message} new message object + * @static + */ +function read(input) { + var packetlist = new _packet2.default.List(); + packetlist.read(input); + return new Message(packetlist); +} + +/** + * Create a message object from signed content and a detached armored signature. + * @param {String} content An 8 bit ascii string containing e.g. a MIME subtree with text nodes or attachments + * @param {String} detachedSignature The detached ascii armored PGP signature + */ +function readSignedContent(content, detachedSignature) { + var literalDataPacket = new _packet2.default.Literal(); + literalDataPacket.setBytes(_util2.default.str2Uint8Array(content), _enums2.default.read(_enums2.default.literal, _enums2.default.literal.binary)); + var packetlist = new _packet2.default.List(); + packetlist.push(literalDataPacket); + var input = _armor2.default.decode(detachedSignature).data; + packetlist.read(input); + return new Message(packetlist); +} + +/** + * creates new message object from text + * @param {String} text + * @param {String} filename (optional) + * @return {module:message~Message} new message object + * @static + */ +function fromText(text, filename) { + var literalDataPacket = new _packet2.default.Literal(); + // text will be converted to UTF8 + literalDataPacket.setText(text); + if (filename !== undefined) { + literalDataPacket.setFilename(filename); + } + var literalDataPacketlist = new _packet2.default.List(); + literalDataPacketlist.push(literalDataPacket); + return new Message(literalDataPacketlist); +} + +/** + * creates new message object from binary data + * @param {Uint8Array} bytes + * @param {String} filename (optional) + * @return {module:message~Message} new message object + * @static + */ +function fromBinary(bytes, filename) { + if (!_util2.default.isUint8Array(bytes)) { + throw new Error('Data must be in the form of a Uint8Array'); + } + + var literalDataPacket = new _packet2.default.Literal(); + if (filename) { + literalDataPacket.setFilename(filename); + } + literalDataPacket.setBytes(bytes, _enums2.default.read(_enums2.default.literal, _enums2.default.literal.binary)); + if (filename !== undefined) { + literalDataPacket.setFilename(filename); + } + var literalDataPacketlist = new _packet2.default.List(); + literalDataPacketlist.push(literalDataPacket); + return new Message(literalDataPacketlist); +} + +},{"./config":10,"./crypto":24,"./encoding/armor.js":33,"./enums.js":35,"./key.js":38,"./packet":47,"./signature.js":66,"./util.js":70}],43:[function(_dereq_,module,exports){ +// OpenPGP.js - An OpenPGP implementation in javascript +// Copyright (C) 2016 Tankred Hase +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @requires message + * @requires cleartext + * @requires key + * @requires config + * @requires util + * @module openpgp + */ + +/** + * @fileoverview The openpgp base module should provide all of the functionality + * to consume the openpgp.js library. All additional classes are documented + * for extending and developing on top of the base library. + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.initWorker = initWorker; +exports.getWorker = getWorker; +exports.destroyWorker = destroyWorker; +exports.generateKey = generateKey; +exports.reformatKey = reformatKey; +exports.decryptKey = decryptKey; +exports.encrypt = encrypt; +exports.decrypt = decrypt; +exports.sign = sign; +exports.verify = verify; +exports.encryptSessionKey = encryptSessionKey; +exports.decryptSessionKey = decryptSessionKey; + +var _message = _dereq_('./message.js'); + +var messageLib = _interopRequireWildcard(_message); + +var _cleartext = _dereq_('./cleartext.js'); + +var cleartext = _interopRequireWildcard(_cleartext); + +var _key = _dereq_('./key.js'); + +var key = _interopRequireWildcard(_key); + +var _config = _dereq_('./config/config.js'); + +var _config2 = _interopRequireDefault(_config); + +var _util = _dereq_('./util'); + +var _util2 = _interopRequireDefault(_util); + +var _async_proxy = _dereq_('./worker/async_proxy.js'); + +var _async_proxy2 = _interopRequireDefault(_async_proxy); + +var _es6Promise = _dereq_('es6-promise'); + +var _es6Promise2 = _interopRequireDefault(_es6Promise); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +_es6Promise2.default.polyfill(); // load ES6 Promises polyfill + + +////////////////////////// +// // +// Web Worker setup // +// // +////////////////////////// + + +var asyncProxy = void 0; // instance of the asyncproxy + +/** + * Set the path for the web worker script and create an instance of the async proxy + * @param {String} path relative path to the worker scripts, default: 'openpgp.worker.js' + * @param {Object} worker alternative to path parameter: web worker initialized with 'openpgp.worker.js' + */ +function initWorker() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$path = _ref.path, + path = _ref$path === undefined ? 'openpgp.worker.js' : _ref$path, + worker = _ref.worker; + + if (worker || typeof window !== 'undefined' && window.Worker) { + asyncProxy = new _async_proxy2.default({ path: path, worker: worker, config: _config2.default }); + return true; + } +} + +/** + * Returns a reference to the async proxy if the worker was initialized with openpgp.initWorker() + * @return {module:worker/async_proxy~AsyncProxy|null} the async proxy or null if not initialized + */ +function getWorker() { + return asyncProxy; +} + +/** + * Cleanup the current instance of the web worker. + */ +function destroyWorker() { + asyncProxy = undefined; +} + +////////////////////// +// // +// Key handling // +// // +////////////////////// + + +/** + * Generates a new OpenPGP key pair. Currently only supports RSA keys. Primary and subkey will be of same type. + * @param {Array} userIds array of user IDs e.g. [{ name:'Phil Zimmermann', email:'phil@openpgp.org' }] + * @param {String} passphrase (optional) The passphrase used to encrypt the resulting private key + * @param {Number} numBits (optional) number of bits for the key creation. (should be 2048 or 4096) + * @param {Boolean} unlocked (optional) If the returned secret part of the generated key is unlocked + * @param {Number} keyExpirationTime (optional) The number of seconds after the key creation time that the key expires + * @return {Promise} The generated key object in the form: + * { key:Key, privateKeyArmored:String, publicKeyArmored:String } + * @static + */ +function generateKey() { + var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref2$userIds = _ref2.userIds, + userIds = _ref2$userIds === undefined ? [] : _ref2$userIds, + passphrase = _ref2.passphrase, + _ref2$numBits = _ref2.numBits, + numBits = _ref2$numBits === undefined ? 2048 : _ref2$numBits, + _ref2$unlocked = _ref2.unlocked, + unlocked = _ref2$unlocked === undefined ? false : _ref2$unlocked, + _ref2$keyExpirationTi = _ref2.keyExpirationTime, + keyExpirationTime = _ref2$keyExpirationTi === undefined ? 0 : _ref2$keyExpirationTi; + + var options = formatUserIds({ userIds: userIds, passphrase: passphrase, numBits: numBits, unlocked: unlocked, keyExpirationTime: keyExpirationTime }); + + if (!_util2.default.getWebCryptoAll() && asyncProxy) { + // use web worker if web crypto apis are not supported + return asyncProxy.delegate('generateKey', options); + } + + return key.generate(options).then(function (newKey) { + return { + + key: newKey, + privateKeyArmored: newKey.armor(), + publicKeyArmored: newKey.toPublic().armor() + + }; + }).catch(onError.bind(null, 'Error generating keypair')); +} + +/** + * Reformats signature packets for a key and rewraps key object. + * @param {Array} userIds array of user IDs e.g. [{ name:'Phil Zimmermann', email:'phil@openpgp.org' }] + * @param {String} passphrase (optional) The passphrase used to encrypt the resulting private key + * @param {Boolean} unlocked (optional) If the returned secret part of the generated key is unlocked + * @param {Number} keyExpirationTime (optional) The number of seconds after the key creation time that the key expires + * @return {Promise} The generated key object in the form: + * { key:Key, privateKeyArmored:String, publicKeyArmored:String } + * @static + */ +function reformatKey() { + var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + privateKey = _ref3.privateKey, + _ref3$userIds = _ref3.userIds, + userIds = _ref3$userIds === undefined ? [] : _ref3$userIds, + _ref3$passphrase = _ref3.passphrase, + passphrase = _ref3$passphrase === undefined ? "" : _ref3$passphrase, + _ref3$unlocked = _ref3.unlocked, + unlocked = _ref3$unlocked === undefined ? false : _ref3$unlocked, + _ref3$keyExpirationTi = _ref3.keyExpirationTime, + keyExpirationTime = _ref3$keyExpirationTi === undefined ? 0 : _ref3$keyExpirationTi; + + var options = formatUserIds({ privateKey: privateKey, userIds: userIds, passphrase: passphrase, unlocked: unlocked, keyExpirationTime: keyExpirationTime }); + + if (asyncProxy) { + return asyncProxy.delegate('reformatKey', options); + } + + return key.reformat(options).then(function (newKey) { + return { + + key: newKey, + privateKeyArmored: newKey.armor(), + publicKeyArmored: newKey.toPublic().armor() + + }; + }).catch(onError.bind(null, 'Error reformatting keypair')); +} + +/** + * Unlock a private key with your passphrase. + * @param {Key} privateKey the private key that is to be decrypted + * @param {String} passphrase the user's passphrase chosen during key generation + * @return {Key} the unlocked private key + */ +function decryptKey(_ref4) { + var privateKey = _ref4.privateKey, + passphrase = _ref4.passphrase; + + if (asyncProxy) { + // use web worker if available + return asyncProxy.delegate('decryptKey', { privateKey: privateKey, passphrase: passphrase }); + } + + return execute(function () { + + if (!privateKey.decrypt(passphrase)) { + throw new Error('Invalid passphrase'); + } + return { + key: privateKey + }; + }, 'Error decrypting private key'); +} + +/////////////////////////////////////////// +// // +// Message encryption and decryption // +// // +/////////////////////////////////////////// + + +/** + * Encrypts message text/data with public keys, passwords or both at once. At least either public keys or passwords + * must be specified. If private keys are specified, those will be used to sign the message. + * @param {String|Uint8Array} data text/data to be encrypted as JavaScript binary string or Uint8Array + * @param {Key|Array} publicKeys (optional) array of keys or single key, used to encrypt the message + * @param {Key|Array} privateKeys (optional) private keys for signing. If omitted message will not be signed + * @param {String|Array} passwords (optional) array of passwords or a single password to encrypt the message + * @param {Object} sessionKey (optional) session key in the form: { data:Uint8Array, algorithm:String } + * @param {String} filename (optional) a filename for the literal data packet + * @param {Boolean} armor (optional) if the return values should be ascii armored or the message/signature objects + * @param {Boolean} detached (optional) if the signature should be detached (if true, signature will be added to returned object) + * @param {Signature} signature (optional) a detached signature to add to the encrypted message + * @param {Boolean} returnSessionKey (optional) if the unencrypted session key should be added to returned object + * @return {Promise} encrypted (and optionally signed message) in the form: + * {data: ASCII armored message if 'armor' is true, + * message: full Message object if 'armor' is false, signature: detached signature if 'detached' is true} + * @static + */ +function encrypt(_ref5) { + var data = _ref5.data, + publicKeys = _ref5.publicKeys, + privateKeys = _ref5.privateKeys, + passwords = _ref5.passwords, + sessionKey = _ref5.sessionKey, + filename = _ref5.filename, + _ref5$armor = _ref5.armor, + armor = _ref5$armor === undefined ? true : _ref5$armor, + _ref5$detached = _ref5.detached, + detached = _ref5$detached === undefined ? false : _ref5$detached, + _ref5$signature = _ref5.signature, + signature = _ref5$signature === undefined ? null : _ref5$signature, + _ref5$returnSessionKe = _ref5.returnSessionKey, + returnSessionKey = _ref5$returnSessionKe === undefined ? false : _ref5$returnSessionKe; + + checkData(data);publicKeys = toArray(publicKeys);privateKeys = toArray(privateKeys);passwords = toArray(passwords); + + if (!nativeAEAD() && asyncProxy) { + // use web worker if web crypto apis are not supported + return asyncProxy.delegate('encrypt', { data: data, publicKeys: publicKeys, privateKeys: privateKeys, passwords: passwords, sessionKey: sessionKey, filename: filename, armor: armor, detached: detached, signature: signature, returnSessionKey: returnSessionKey }); + } + var result = {}; + return Promise.resolve().then(function () { + + var message = createMessage(data, filename); + if (!privateKeys) { + privateKeys = []; + } + if (privateKeys.length || signature) { + // sign the message only if private keys or signature is specified + if (detached) { + var detachedSignature = message.signDetached(privateKeys, signature); + if (armor) { + result.signature = detachedSignature.armor(); + } else { + result.signature = detachedSignature; + } + } else { + message = message.sign(privateKeys, signature); + } + } + return message.encrypt(publicKeys, passwords, sessionKey); + }).then(function (encrypted) { + if (armor) { + result.data = encrypted.message.armor(); + } else { + result.message = encrypted.message; + } + if (returnSessionKey) { + result.sessionKey = encrypted.sessionKey; + } + return result; + }).catch(onError.bind(null, 'Error encrypting message')); +} + +/** + * Decrypts a message with the user's private key, a session key or a password. Either a private key, + * a session key or a password must be specified. + * @param {Message} message the message object with the encrypted data + * @param {Key} privateKey (optional) private key with decrypted secret key data or session key + * @param {Key|Array} publicKeys (optional) array of public keys or single key, to verify signatures + * @param {Object} sessionKey (optional) session key in the form: { data:Uint8Array, algorithm:String } + * @param {String} password (optional) single password to decrypt the message + * @param {String} format (optional) return data format either as 'utf8' or 'binary' + * @param {Signature} signature (optional) detached signature for verification + * @return {Promise} decrypted and verified message in the form: + * { data:Uint8Array|String, filename:String, signatures:[{ keyid:String, valid:Boolean }] } + * @static + */ +function decrypt(_ref6) { + var message = _ref6.message, + privateKey = _ref6.privateKey, + publicKeys = _ref6.publicKeys, + sessionKey = _ref6.sessionKey, + password = _ref6.password, + _ref6$format = _ref6.format, + format = _ref6$format === undefined ? 'utf8' : _ref6$format, + _ref6$signature = _ref6.signature, + signature = _ref6$signature === undefined ? null : _ref6$signature; + + checkMessage(message);publicKeys = toArray(publicKeys); + + if (!nativeAEAD() && asyncProxy) { + // use web worker if web crypto apis are not supported + return asyncProxy.delegate('decrypt', { message: message, privateKey: privateKey, publicKeys: publicKeys, sessionKey: sessionKey, password: password, format: format, signature: signature }); + } + + return message.decrypt(privateKey, sessionKey, password).then(function (message) { + + var result = parseMessage(message, format); + + if (!publicKeys) { + publicKeys = []; + } + if (signature) { + //detached signature + result.signatures = message.verifyDetached(signature, publicKeys); + } else { + result.signatures = message.verify(publicKeys); + } + + return result; + }).catch(onError.bind(null, 'Error decrypting message')); +} + +////////////////////////////////////////// +// // +// Message signing and verification // +// // +////////////////////////////////////////// + + +/** + * Signs a cleartext message. + * @param {String | Uint8Array} data cleartext input to be signed + * @param {Key|Array} privateKeys array of keys or single key with decrypted secret key data to sign cleartext + * @param {Boolean} armor (optional) if the return value should be ascii armored or the message object + * @param {Boolean} detached (optional) if the return value should contain a detached signature + * @return {Promise} signed cleartext in the form: + * {data: ASCII armored message if 'armor' is true, + * message: full Message object if 'armor' is false, signature: detached signature if 'detached' is true} + * @static + */ +function sign(_ref7) { + var data = _ref7.data, + privateKeys = _ref7.privateKeys, + _ref7$armor = _ref7.armor, + armor = _ref7$armor === undefined ? true : _ref7$armor, + _ref7$detached = _ref7.detached, + detached = _ref7$detached === undefined ? false : _ref7$detached; + + checkData(data); + privateKeys = toArray(privateKeys); + + if (asyncProxy) { + // use web worker if available + return asyncProxy.delegate('sign', { data: data, privateKeys: privateKeys, armor: armor, detached: detached }); + } + + var result = {}; + return execute(function () { + var message; + + if (_util2.default.isString(data)) { + message = new cleartext.CleartextMessage(data); + } else { + message = messageLib.fromBinary(data); + } + + if (detached) { + var signature = message.signDetached(privateKeys); + if (armor) { + result.signature = signature.armor(); + } else { + result.signature = signature; + } + } else { + message = message.sign(privateKeys); + if (armor) { + result.data = message.armor(); + } else { + result.message = message; + } + } + + return result; + }, 'Error signing cleartext message'); +} + +/** + * Verifies signatures of cleartext signed message + * @param {Key|Array} publicKeys array of publicKeys or single key, to verify signatures + * @param {CleartextMessage} message cleartext message object with signatures + * @param {Signature} signature (optional) detached signature for verification + * @return {Promise} cleartext with status of verified signatures in the form of: + * { data:String, signatures: [{ keyid:String, valid:Boolean }] } + * @static + */ +function verify(_ref8) { + var message = _ref8.message, + publicKeys = _ref8.publicKeys, + _ref8$signature = _ref8.signature, + signature = _ref8$signature === undefined ? null : _ref8$signature; + + checkCleartextOrMessage(message); + publicKeys = toArray(publicKeys); + + if (asyncProxy) { + // use web worker if available + return asyncProxy.delegate('verify', { message: message, publicKeys: publicKeys, signature: signature }); + } + + var result = {}; + return execute(function () { + if (cleartext.CleartextMessage.prototype.isPrototypeOf(message)) { + result.data = message.getText(); + } else { + result.data = message.getLiteralData(); + } + if (signature) { + //detached signature + result.signatures = message.verifyDetached(signature, publicKeys); + } else { + result.signatures = message.verify(publicKeys); + } + return result; + }, 'Error verifying cleartext signed message'); +} + +/////////////////////////////////////////////// +// // +// Session key encryption and decryption // +// // +/////////////////////////////////////////////// + + +/** + * Encrypt a symmetric session key with public keys, passwords, or both at once. At least either public keys + * or passwords must be specified. + * @param {Uint8Array} data the session key to be encrypted e.g. 16 random bytes (for aes128) + * @param {String} algorithm algorithm of the symmetric session key e.g. 'aes128' or 'aes256' + * @param {Key|Array} publicKeys (optional) array of public keys or single key, used to encrypt the key + * @param {String|Array} passwords (optional) passwords for the message + * @return {Promise} the encrypted session key packets contained in a message object + * @static + */ +function encryptSessionKey(_ref9) { + var data = _ref9.data, + algorithm = _ref9.algorithm, + publicKeys = _ref9.publicKeys, + passwords = _ref9.passwords; + + checkBinary(data);checkString(algorithm, 'algorithm');publicKeys = toArray(publicKeys);passwords = toArray(passwords); + + if (asyncProxy) { + // use web worker if available + return asyncProxy.delegate('encryptSessionKey', { data: data, algorithm: algorithm, publicKeys: publicKeys, passwords: passwords }); + } + + return execute(function () { + return { + + message: messageLib.encryptSessionKey(data, algorithm, publicKeys, passwords) + + }; + }, 'Error encrypting session key'); +} + +/** + * Decrypt a symmetric session key with a private key or password. Either a private key or + * a password must be specified. + * @param {Message} message a message object containing the encrypted session key packets + * @param {Key} privateKey (optional) private key with decrypted secret key data + * @param {String} password (optional) a single password to decrypt the session key + * @return {Promise} decrypted session key and algorithm in object form: + * { data:Uint8Array, algorithm:String } + * or 'undefined' if no key packets found + * @static + */ +function decryptSessionKey(_ref10) { + var message = _ref10.message, + privateKey = _ref10.privateKey, + password = _ref10.password; + + checkMessage(message); + + if (asyncProxy) { + // use web worker if available + return asyncProxy.delegate('decryptSessionKey', { message: message, privateKey: privateKey, password: password }); + } + + return execute(function () { + return message.decryptSessionKey(privateKey, password); + }, 'Error decrypting session key'); +} + +////////////////////////// +// // +// Helper functions // +// // +////////////////////////// + + +/** + * Input validation + */ +function checkString(data, name) { + if (!_util2.default.isString(data)) { + throw new Error('Parameter [' + (name || 'data') + '] must be of type String'); + } +} +function checkBinary(data, name) { + if (!_util2.default.isUint8Array(data)) { + throw new Error('Parameter [' + (name || 'data') + '] must be of type Uint8Array'); + } +} +function checkData(data, name) { + if (!_util2.default.isUint8Array(data) && !_util2.default.isString(data)) { + throw new Error('Parameter [' + (name || 'data') + '] must be of type String or Uint8Array'); + } +} +function checkMessage(message) { + if (!messageLib.Message.prototype.isPrototypeOf(message)) { + throw new Error('Parameter [message] needs to be of type Message'); + } +} +function checkCleartextOrMessage(message) { + if (!cleartext.CleartextMessage.prototype.isPrototypeOf(message) && !messageLib.Message.prototype.isPrototypeOf(message)) { + throw new Error('Parameter [message] needs to be of type Message or CleartextMessage'); + } +} + +/** + * Format user ids for internal use. + */ +function formatUserIds(options) { + if (!options.userIds) { + return options; + } + options.userIds = toArray(options.userIds); // normalize to array + options.userIds = options.userIds.map(function (id) { + if (_util2.default.isString(id) && !_util2.default.isUserId(id)) { + throw new Error('Invalid user id format'); + } + if (_util2.default.isUserId(id)) { + return id; // user id is already in correct format... no conversion necessary + } + // name and email address can be empty but must be of the correct type + id.name = id.name || ''; + id.email = id.email || ''; + if (!_util2.default.isString(id.name) || id.email && !_util2.default.isEmailAddress(id.email)) { + throw new Error('Invalid user id format'); + } + id.name = id.name.trim(); + if (id.name.length > 0) { + id.name += ' '; + } + return id.name + '<' + id.email + '>'; + }); + return options; +} + +/** + * Normalize parameter to an array if it is not undefined. + * @param {Object} param the parameter to be normalized + * @return {Array|undefined} the resulting array or undefined + */ +function toArray(param) { + if (param && !_util2.default.isArray(param)) { + param = [param]; + } + return param; +} + +/** + * Creates a message obejct either from a Uint8Array or a string. + * @param {String|Uint8Array} data the payload for the message + * @param {String} filename the literal data packet's filename + * @return {Message} a message object + */ +function createMessage(data, filename) { + var msg = void 0; + if (_util2.default.isUint8Array(data)) { + msg = messageLib.fromBinary(data, filename); + } else if (_util2.default.isString(data)) { + msg = messageLib.fromText(data, filename); + } else { + throw new Error('Data must be of type String or Uint8Array'); + } + return msg; +} + +/** + * Parse the message given a certain format. + * @param {Message} message the message object to be parse + * @param {String} format the output format e.g. 'utf8' or 'binary' + * @return {Object} the parse data in the respective format + */ +function parseMessage(message, format) { + if (format === 'binary') { + return { + data: message.getLiteralData(), + filename: message.getFilename() + }; + } else if (format === 'utf8') { + return { + data: message.getText(), + filename: message.getFilename() + }; + } else { + throw new Error('Invalid format'); + } +} + +/** + * Command pattern that wraps synchronous code into a promise. + * @param {function} cmd The synchronous function with a return value + * to be wrapped in a promise + * @param {String} message A human readable error Message + * @return {Promise} The promise wrapped around cmd + */ +function execute(cmd, message) { + // wrap the sync cmd in a promise + var promise = new Promise(function (resolve) { + return resolve(cmd()); + }); + // handler error globally + return promise.catch(onError.bind(null, message)); +} + +/** + * Global error handler that logs the stack trace and rethrows a high lvl error message. + * @param {String} message A human readable high level error Message + * @param {Error} error The internal error that caused the failure + */ +function onError(message, error) { + // log the stack trace + if (_config2.default.debug) { + console.error(error.stack); + } + + // update error message + error.message = message + ': ' + error.message; + + throw error; +} + +/** + * Check for AES-GCM support and configuration by the user. Only browsers that + * implement the current WebCrypto specification support native AES-GCM. + * @return {Boolean} If authenticated encryption should be used + */ +function nativeAEAD() { + return _util2.default.getWebCrypto() && _config2.default.aead_protect; +} + +},{"./cleartext.js":5,"./config/config.js":9,"./key.js":38,"./message.js":42,"./util":70,"./worker/async_proxy.js":71,"es6-promise":2}],44:[function(_dereq_,module,exports){ +/** + * @requires enums + * @module packet + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Trust = exports.Signature = exports.SecretSubkey = exports.Userid = exports.SecretKey = exports.OnePassSignature = exports.UserAttribute = exports.PublicSubkey = exports.Marker = exports.SymmetricallyEncrypted = exports.PublicKey = exports.Literal = exports.SymEncryptedSessionKey = exports.PublicKeyEncryptedSessionKey = exports.SymEncryptedAEADProtected = exports.SymEncryptedIntegrityProtected = exports.Compressed = undefined; + +var _compressed = _dereq_('./compressed.js'); + +Object.defineProperty(exports, 'Compressed', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_compressed).default; + } +}); + +var _sym_encrypted_integrity_protected = _dereq_('./sym_encrypted_integrity_protected.js'); + +Object.defineProperty(exports, 'SymEncryptedIntegrityProtected', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_sym_encrypted_integrity_protected).default; + } +}); + +var _sym_encrypted_aead_protected = _dereq_('./sym_encrypted_aead_protected.js'); + +Object.defineProperty(exports, 'SymEncryptedAEADProtected', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_sym_encrypted_aead_protected).default; + } +}); + +var _public_key_encrypted_session_key = _dereq_('./public_key_encrypted_session_key.js'); + +Object.defineProperty(exports, 'PublicKeyEncryptedSessionKey', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_public_key_encrypted_session_key).default; + } +}); + +var _sym_encrypted_session_key = _dereq_('./sym_encrypted_session_key.js'); + +Object.defineProperty(exports, 'SymEncryptedSessionKey', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_sym_encrypted_session_key).default; + } +}); + +var _literal = _dereq_('./literal.js'); + +Object.defineProperty(exports, 'Literal', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_literal).default; + } +}); + +var _public_key = _dereq_('./public_key.js'); + +Object.defineProperty(exports, 'PublicKey', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_public_key).default; + } +}); + +var _symmetrically_encrypted = _dereq_('./symmetrically_encrypted.js'); + +Object.defineProperty(exports, 'SymmetricallyEncrypted', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_symmetrically_encrypted).default; + } +}); + +var _marker = _dereq_('./marker.js'); + +Object.defineProperty(exports, 'Marker', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_marker).default; + } +}); + +var _public_subkey = _dereq_('./public_subkey.js'); + +Object.defineProperty(exports, 'PublicSubkey', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_public_subkey).default; + } +}); + +var _user_attribute = _dereq_('./user_attribute.js'); + +Object.defineProperty(exports, 'UserAttribute', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_user_attribute).default; + } +}); + +var _one_pass_signature = _dereq_('./one_pass_signature.js'); + +Object.defineProperty(exports, 'OnePassSignature', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_one_pass_signature).default; + } +}); + +var _secret_key = _dereq_('./secret_key.js'); + +Object.defineProperty(exports, 'SecretKey', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_secret_key).default; + } +}); + +var _userid = _dereq_('./userid.js'); + +Object.defineProperty(exports, 'Userid', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_userid).default; + } +}); + +var _secret_subkey = _dereq_('./secret_subkey.js'); + +Object.defineProperty(exports, 'SecretSubkey', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_secret_subkey).default; + } +}); + +var _signature = _dereq_('./signature.js'); + +Object.defineProperty(exports, 'Signature', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_signature).default; + } +}); + +var _trust = _dereq_('./trust.js'); + +Object.defineProperty(exports, 'Trust', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_trust).default; + } +}); +exports.newPacketFromTag = newPacketFromTag; +exports.fromStructuredClone = fromStructuredClone; + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _all_packets = _dereq_('./all_packets.js'); + +var packets = _interopRequireWildcard(_all_packets); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Allocate a new packet + * @param {String} tag property name from {@link module:enums.packet} + * @returns {Object} new packet object with type based on tag + */ +function newPacketFromTag(tag) { + return new packets[packetClassFromTagName(tag)](); +} + +/** + * Allocate a new packet from structured packet clone + * See {@link http://www.w3.org/html/wg/drafts/html/master/infrastructure.html#safe-passing-of-structured-data} + * @param {Object} packetClone packet clone + * @returns {Object} new packet object with data from packet clone + */ +function fromStructuredClone(packetClone) { + var tagName = _enums2.default.read(_enums2.default.packet, packetClone.tag); + var packet = newPacketFromTag(tagName); + for (var attr in packetClone) { + if (packetClone.hasOwnProperty(attr)) { + packet[attr] = packetClone[attr]; + } + } + if (packet.postCloneTypeFix) { + packet.postCloneTypeFix(); + } + return packet; +} + +/** + * Convert tag name to class name + * @param {String} tag property name from {@link module:enums.packet} + * @returns {String} + */ +function packetClassFromTagName(tag) { + return tag.substr(0, 1).toUpperCase() + tag.substr(1); +} + +},{"../enums.js":35,"./all_packets.js":44,"./compressed.js":46,"./literal.js":48,"./marker.js":49,"./one_pass_signature.js":50,"./public_key.js":53,"./public_key_encrypted_session_key.js":54,"./public_subkey.js":55,"./secret_key.js":56,"./secret_subkey.js":57,"./signature.js":58,"./sym_encrypted_aead_protected.js":59,"./sym_encrypted_integrity_protected.js":60,"./sym_encrypted_session_key.js":61,"./symmetrically_encrypted.js":62,"./trust.js":63,"./user_attribute.js":64,"./userid.js":65}],45:[function(_dereq_,module,exports){ +// OpenPGP.js - An OpenPGP implementation in javascript +// Copyright (C) 2015 Tankred Hase +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @fileoverview This module implements packet list cloning required to + * pass certain object types beteen the web worker and main thread using + * the structured cloning algorithm. + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.clonePackets = clonePackets; +exports.parseClonedPackets = parseClonedPackets; + +var _key = _dereq_('../key.js'); + +var key = _interopRequireWildcard(_key); + +var _message = _dereq_('../message.js'); + +var message = _interopRequireWildcard(_message); + +var _cleartext = _dereq_('../cleartext.js'); + +var cleartext = _interopRequireWildcard(_cleartext); + +var _signature = _dereq_('../signature.js'); + +var signature = _interopRequireWildcard(_signature); + +var _packetlist = _dereq_('./packetlist.js'); + +var _packetlist2 = _interopRequireDefault(_packetlist); + +var _keyid = _dereq_('../type/keyid.js'); + +var _keyid2 = _interopRequireDefault(_keyid); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +////////////////////////////// +// // +// Packetlist --> Clone // +// // +////////////////////////////// + + +/** + * Create a packetlist from the correspoding object types. + * @param {Object} options the object passed to and from the web worker + * @return {Object} a mutated version of the options optject + */ +function clonePackets(options) { + if (options.publicKeys) { + options.publicKeys = options.publicKeys.map(function (key) { + return key.toPacketlist(); + }); + } + if (options.privateKeys) { + options.privateKeys = options.privateKeys.map(function (key) { + return key.toPacketlist(); + }); + } + if (options.privateKey) { + options.privateKey = options.privateKey.toPacketlist(); + } + if (options.key) { + options.key = options.key.toPacketlist(); + } + if (options.message) { + //could be either a Message or CleartextMessage object + if (options.message instanceof message.Message) { + options.message = options.message.packets; + } else if (options.message instanceof cleartext.CleartextMessage) { + options.message.signature = options.message.signature.packets; + } + } + if (options.signature && options.signature instanceof signature.Signature) { + options.signature = options.signature.packets; + } + if (options.signatures) { + options.signatures = options.signatures.map(function (sig) { + return verificationObjectToClone(sig); + }); + } + return options; +} + +function verificationObjectToClone(verObject) { + verObject.signature = verObject.signature.packets; + return verObject; +} + +////////////////////////////// +// // +// Clone --> Packetlist // +// // +////////////////////////////// + + +/** + * Creates an object with the correct prototype from a corresponding packetlist. + * @param {Object} options the object passed to and from the web worker + * @param {String} method the public api function name to be delegated to the worker + * @return {Object} a mutated version of the options optject + */ +function parseClonedPackets(options, method) { + if (options.publicKeys) { + options.publicKeys = options.publicKeys.map(packetlistCloneToKey); + } + if (options.privateKeys) { + options.privateKeys = options.privateKeys.map(packetlistCloneToKey); + } + if (options.privateKey) { + options.privateKey = packetlistCloneToKey(options.privateKey); + } + if (options.key) { + options.key = packetlistCloneToKey(options.key); + } + if (options.message && options.message.signature) { + options.message = packetlistCloneToCleartextMessage(options.message); + } else if (options.message) { + options.message = packetlistCloneToMessage(options.message); + } + if (options.signatures) { + options.signatures = options.signatures.map(packetlistCloneToSignatures); + } + if (options.signature) { + options.signature = packetlistCloneToSignature(options.signature); + } + return options; +} + +function packetlistCloneToKey(clone) { + var packetlist = _packetlist2.default.fromStructuredClone(clone); + return new key.Key(packetlist); +} + +function packetlistCloneToMessage(clone) { + var packetlist = _packetlist2.default.fromStructuredClone(clone); + return new message.Message(packetlist); +} + +function packetlistCloneToCleartextMessage(clone) { + var packetlist = _packetlist2.default.fromStructuredClone(clone.signature); + return new cleartext.CleartextMessage(clone.text, new signature.Signature(packetlist)); +} + +//verification objects +function packetlistCloneToSignatures(clone) { + clone.keyid = _keyid2.default.fromClone(clone.keyid); + clone.signature = new signature.Signature(clone.signature); + return clone; +} + +function packetlistCloneToSignature(clone) { + if (typeof clone === "string") { + //signature is armored + return clone; + } + var packetlist = _packetlist2.default.fromStructuredClone(clone); + return new signature.Signature(packetlist); +} + +},{"../cleartext.js":5,"../key.js":38,"../message.js":42,"../signature.js":66,"../type/keyid.js":67,"./packetlist.js":52}],46:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Implementation of the Compressed Data Packet (Tag 8)
+ *
+ * {@link http://tools.ietf.org/html/rfc4880#section-5.6|RFC4880 5.6}: The Compressed Data packet contains compressed data. Typically, + * this packet is found as the contents of an encrypted packet, or following + * a Signature or One-Pass Signature packet, and contains a literal data packet. + * @requires compression/zlib + * @requires compression/rawinflate + * @requires compression/rawdeflate + * @requires enums + * @requires util + * @module packet/compressed + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = Compressed; + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _zlibMin = _dereq_('../compression/zlib.min.js'); + +var _zlibMin2 = _interopRequireDefault(_zlibMin); + +var _rawinflateMin = _dereq_('../compression/rawinflate.min.js'); + +var _rawinflateMin2 = _interopRequireDefault(_rawinflateMin); + +var _rawdeflateMin = _dereq_('../compression/rawdeflate.min.js'); + +var _rawdeflateMin2 = _interopRequireDefault(_rawdeflateMin); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function Compressed() { + /** + * Packet type + * @type {module:enums.packet} + */ + this.tag = _enums2.default.packet.compressed; + /** + * List of packets + * @type {module:packet/packetlist} + */ + this.packets = null; + /** + * Compression algorithm + * @type {compression} + */ + this.algorithm = 'zip'; + + /** + * Compressed packet data + * @type {String} + */ + this.compressed = null; +} + +/** + * Parsing function for the packet. + * @param {String} bytes Payload of a tag 8 packet + */ +Compressed.prototype.read = function (bytes) { + // One octet that gives the algorithm used to compress the packet. + this.algorithm = _enums2.default.read(_enums2.default.compression, bytes[0]); + + // Compressed data, which makes up the remainder of the packet. + this.compressed = bytes.subarray(1, bytes.length); + + this.decompress(); +}; + +/** + * Return the compressed packet. + * @return {String} binary compressed packet + */ +Compressed.prototype.write = function () { + if (this.compressed === null) { + this.compress(); + } + + return _util2.default.concatUint8Array(new Uint8Array([_enums2.default.write(_enums2.default.compression, this.algorithm)]), this.compressed); +}; + +/** + * Decompression method for decompressing the compressed data + * read by read_packet + */ +Compressed.prototype.decompress = function () { + var decompressed, inflate; + + switch (this.algorithm) { + case 'uncompressed': + decompressed = this.compressed; + break; + + case 'zip': + inflate = new _rawinflateMin2.default.Zlib.RawInflate(this.compressed); + decompressed = inflate.decompress(); + break; + + case 'zlib': + inflate = new _zlibMin2.default.Zlib.Inflate(this.compressed); + decompressed = inflate.decompress(); + break; + + case 'bzip2': + // TODO: need to implement this + throw new Error('Compression algorithm BZip2 [BZ2] is not implemented.'); + + default: + throw new Error("Compression algorithm unknown :" + this.algorithm); + } + + this.packets.read(decompressed); +}; + +/** + * Compress the packet data (member decompressedData) + */ +Compressed.prototype.compress = function () { + var uncompressed, deflate; + uncompressed = this.packets.write(); + + switch (this.algorithm) { + + case 'uncompressed': + // - Uncompressed + this.compressed = uncompressed; + break; + + case 'zip': + // - ZIP [RFC1951] + deflate = new _rawdeflateMin2.default.Zlib.RawDeflate(uncompressed); + this.compressed = deflate.compress(); + break; + + case 'zlib': + // - ZLIB [RFC1950] + deflate = new _zlibMin2.default.Zlib.Deflate(uncompressed); + this.compressed = deflate.compress(); + break; + + case 'bzip2': + // - BZip2 [BZ2] + // TODO: need to implement this + throw new Error("Compression algorithm BZip2 [BZ2] is not implemented."); + + default: + throw new Error("Compression algorithm unknown :" + this.type); + } +}; + +},{"../compression/rawdeflate.min.js":6,"../compression/rawinflate.min.js":7,"../compression/zlib.min.js":8,"../enums.js":35,"../util.js":70}],47:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _all_packets = _dereq_('./all_packets.js'); + +var packets = _interopRequireWildcard(_all_packets); + +var _clone = _dereq_('./clone.js'); + +var clone = _interopRequireWildcard(_clone); + +var _packetlist = _dereq_('./packetlist.js'); + +var _packetlist2 = _interopRequireDefault(_packetlist); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var mod = { + /** @see module:packet/packetlist */ + List: _packetlist2.default, + /** @see module:packet/clone */ + clone: clone +}; + +for (var i in packets) { + mod[i] = packets[i]; +} + +exports.default = mod; + +},{"./all_packets.js":44,"./clone.js":45,"./packetlist.js":52}],48:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Implementation of the Literal Data Packet (Tag 11)
+ *
+ * {@link http://tools.ietf.org/html/rfc4880#section-5.9|RFC4880 5.9}: A Literal Data packet contains the body of a message; data that + * is not to be further interpreted. + * @requires enums + * @requires util + * @module packet/literal + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = Literal; + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function Literal() { + this.tag = _enums2.default.packet.literal; + this.format = 'utf8'; // default format for literal data packets + this.date = new Date(); + this.data = new Uint8Array(0); // literal data representation + this.filename = 'msg.txt'; +} + +/** + * Set the packet data to a javascript native string, end of line + * will be normalized to \r\n and by default text is converted to UTF8 + * @param {String} text Any native javascript string + */ +Literal.prototype.setText = function (text) { + // normalize EOL to \r\n + text = text.replace(/\r\n/g, '\n').replace(/\r/g, '\n').replace(/\n/g, '\r\n'); + // encode UTF8 + this.data = this.format === 'utf8' ? _util2.default.str2Uint8Array(_util2.default.encode_utf8(text)) : _util2.default.str2Uint8Array(text); +}; + +/** + * Returns literal data packets as native JavaScript string + * with normalized end of line to \n + * @return {String} literal data as text + */ +Literal.prototype.getText = function () { + // decode UTF8 + var text = _util2.default.decode_utf8(_util2.default.Uint8Array2str(this.data)); + // normalize EOL to \n + return text.replace(/\r\n/g, '\n'); +}; + +/** + * Set the packet data to value represented by the provided string of bytes. + * @param {Uint8Array} bytes The string of bytes + * @param {utf8|binary|text} format The format of the string of bytes + */ +Literal.prototype.setBytes = function (bytes, format) { + this.format = format; + this.data = bytes; +}; + +/** + * Get the byte sequence representing the literal packet data + * @returns {Uint8Array} A sequence of bytes + */ +Literal.prototype.getBytes = function () { + return this.data; +}; + +/** + * Sets the filename of the literal packet data + * @param {String} filename Any native javascript string + */ +Literal.prototype.setFilename = function (filename) { + this.filename = filename; +}; + +/** + * Get the filename of the literal packet data + * @returns {String} filename + */ +Literal.prototype.getFilename = function () { + return this.filename; +}; + +/** + * Parsing function for a literal data packet (tag 11). + * + * @param {Uint8Array} input Payload of a tag 11 packet + * @return {module:packet/literal} object representation + */ +Literal.prototype.read = function (bytes) { + // - A one-octet field that describes how the data is formatted. + var format = _enums2.default.read(_enums2.default.literal, bytes[0]); + + var filename_len = bytes[1]; + this.filename = _util2.default.decode_utf8(_util2.default.Uint8Array2str(bytes.subarray(2, 2 + filename_len))); + + this.date = _util2.default.readDate(bytes.subarray(2 + filename_len, 2 + filename_len + 4)); + + var data = bytes.subarray(6 + filename_len, bytes.length); + + this.setBytes(data, format); +}; + +/** + * Creates a string representation of the packet + * + * @return {Uint8Array} Uint8Array representation of the packet + */ +Literal.prototype.write = function () { + var filename = _util2.default.str2Uint8Array(_util2.default.encode_utf8(this.filename)); + var filename_length = new Uint8Array([filename.length]); + + var format = new Uint8Array([_enums2.default.write(_enums2.default.literal, this.format)]); + var date = _util2.default.writeDate(this.date); + var data = this.getBytes(); + + return _util2.default.concatUint8Array([format, filename_length, filename, date, data]); +}; + +},{"../enums.js":35,"../util.js":70}],49:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +/** + * Implementation of the strange "Marker packet" (Tag 10)
+ *
+ * {@link http://tools.ietf.org/html/rfc4880#section-5.8|RFC4880 5.8}: An experimental version of PGP used this packet as the Literal + * packet, but no released version of PGP generated Literal packets with this + * tag. With PGP 5.x, this packet has been reassigned and is reserved for use as + * the Marker packet.
+ *
+ * Such a packet MUST be ignored when received. + * @requires enums + * @module packet/marker + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = Marker; + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function Marker() { + this.tag = _enums2.default.packet.marker; +} + +/** + * Parsing function for a literal data packet (tag 10). + * + * @param {String} input Payload of a tag 10 packet + * @param {Integer} position + * Position to start reading from the input string + * @param {Integer} len + * Length of the packet or the remaining length of + * input at position + * @return {module:packet/marker} Object representation + */ +Marker.prototype.read = function (bytes) { + if (bytes[0] === 0x50 && // P + bytes[1] === 0x47 && // G + bytes[2] === 0x50) { + // P + return true; + } + // marker packet does not contain "PGP" + return false; +}; + +},{"../enums.js":35}],50:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Implementation of the One-Pass Signature Packets (Tag 4)
+ *
+ * {@link http://tools.ietf.org/html/rfc4880#section-5.4|RFC4880 5.4}: The One-Pass Signature packet precedes the signed data and contains + * enough information to allow the receiver to begin calculating any + * hashes needed to verify the signature. It allows the Signature + * packet to be placed at the end of the message, so that the signer + * can compute the entire signed message in one pass. +* @requires util + * @requires enums + * @requires type/keyid + * @module packet/one_pass_signature +*/ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = OnePassSignature; + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _keyid = _dereq_('../type/keyid.js'); + +var _keyid2 = _interopRequireDefault(_keyid); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function OnePassSignature() { + this.tag = _enums2.default.packet.onePassSignature; // The packet type + this.version = null; // A one-octet version number. The current version is 3. + this.type = null; // A one-octet signature type. Signature types are described in {@link http://tools.ietf.org/html/rfc4880#section-5.2.1|RFC4880 Section 5.2.1}. + this.hashAlgorithm = null; // A one-octet number describing the hash algorithm used. (See {@link http://tools.ietf.org/html/rfc4880#section-9.4|RFC4880 9.4}) + this.publicKeyAlgorithm = null; // A one-octet number describing the public-key algorithm used. (See {@link http://tools.ietf.org/html/rfc4880#section-9.1|RFC4880 9.1}) + this.signingKeyId = null; // An eight-octet number holding the Key ID of the signing key. + this.flags = null; // A one-octet number holding a flag showing whether the signature is nested. A zero value indicates that the next packet is another One-Pass Signature packet that describes another signature to be applied to the same message data. +} + +/** + * parsing function for a one-pass signature packet (tag 4). + * @param {Uint8Array} bytes payload of a tag 4 packet + * @return {module:packet/one_pass_signature} object representation + */ +OnePassSignature.prototype.read = function (bytes) { + var mypos = 0; + // A one-octet version number. The current version is 3. + this.version = bytes[mypos++]; + + // A one-octet signature type. Signature types are described in + // Section 5.2.1. + this.type = _enums2.default.read(_enums2.default.signature, bytes[mypos++]); + + // A one-octet number describing the hash algorithm used. + this.hashAlgorithm = _enums2.default.read(_enums2.default.hash, bytes[mypos++]); + + // A one-octet number describing the public-key algorithm used. + this.publicKeyAlgorithm = _enums2.default.read(_enums2.default.publicKey, bytes[mypos++]); + + // An eight-octet number holding the Key ID of the signing key. + this.signingKeyId = new _keyid2.default(); + this.signingKeyId.read(bytes.subarray(mypos, mypos + 8)); + mypos += 8; + + // A one-octet number holding a flag showing whether the signature + // is nested. A zero value indicates that the next packet is + // another One-Pass Signature packet that describes another + // signature to be applied to the same message data. + this.flags = bytes[mypos++]; + return this; +}; + +/** + * creates a string representation of a one-pass signature packet + * @return {Uint8Array} a Uint8Array representation of a one-pass signature packet + */ +OnePassSignature.prototype.write = function () { + + var start = new Uint8Array([3, _enums2.default.write(_enums2.default.signature, this.type), _enums2.default.write(_enums2.default.hash, this.hashAlgorithm), _enums2.default.write(_enums2.default.publicKey, this.publicKeyAlgorithm)]); + + var end = new Uint8Array([this.flags]); + + return _util2.default.concatUint8Array([start, this.signingKeyId.write(), end]); +}; + +/** + * Fix custom types after cloning + */ +OnePassSignature.prototype.postCloneTypeFix = function () { + this.signingKeyId = _keyid2.default.fromClone(this.signingKeyId); +}; + +},{"../enums.js":35,"../type/keyid.js":67,"../util.js":70}],51:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @requires enums + * @requires util + * @module packet/packet + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = { + readSimpleLength: function readSimpleLength(bytes) { + var len = 0, + offset, + type = bytes[0]; + + if (type < 192) { + len = bytes[0]; + offset = 1; + } else if (type < 255) { + len = (bytes[0] - 192 << 8) + bytes[1] + 192; + offset = 2; + } else if (type === 255) { + len = _util2.default.readNumber(bytes.subarray(1, 1 + 4)); + offset = 5; + } + + return { + len: len, + offset: offset + }; + }, + + /** + * Encodes a given integer of length to the openpgp length specifier to a + * string + * + * @param {Integer} length The length to encode + * @return {Uint8Array} String with openpgp length representation + */ + writeSimpleLength: function writeSimpleLength(length) { + + if (length < 192) { + return new Uint8Array([length]); + } else if (length > 191 && length < 8384) { + /* + * let a = (total data packet length) - 192 let bc = two octet + * representation of a let d = b + 192 + */ + return new Uint8Array([(length - 192 >> 8) + 192, length - 192 & 0xFF]); + } else { + return _util2.default.concatUint8Array([new Uint8Array([255]), _util2.default.writeNumber(length, 4)]); + } + }, + + /** + * Writes a packet header version 4 with the given tag_type and length to a + * string + * + * @param {Integer} tag_type Tag type + * @param {Integer} length Length of the payload + * @return {String} String of the header + */ + writeHeader: function writeHeader(tag_type, length) { + /* we're only generating v4 packet headers here */ + return _util2.default.concatUint8Array([new Uint8Array([0xC0 | tag_type]), this.writeSimpleLength(length)]); + }, + + /** + * Writes a packet header Version 3 with the given tag_type and length to a + * string + * + * @param {Integer} tag_type Tag type + * @param {Integer} length Length of the payload + * @return {String} String of the header + */ + writeOldHeader: function writeOldHeader(tag_type, length) { + + if (length < 256) { + return new Uint8Array([0x80 | tag_type << 2, length]); + } else if (length < 65536) { + return _util2.default.concatUint8Array([new Uint8Array([0x80 | tag_type << 2 | 1]), _util2.default.writeNumber(length, 2)]); + } else { + return _util2.default.concatUint8Array([new Uint8Array([0x80 | tag_type << 2 | 2]), _util2.default.writeNumber(length, 4)]); + } + }, + + /** + * Generic static Packet Parser function + * + * @param {String} input Input stream as string + * @param {integer} position Position to start parsing + * @param {integer} len Length of the input from position on + * @return {Object} Returns a parsed module:packet/packet + */ + read: function read(input, position, len) { + // some sanity checks + if (input === null || input.length <= position || input.subarray(position, input.length).length < 2 || (input[position] & 0x80) === 0) { + throw new Error("Error during parsing. This message / key probably does not conform to a valid OpenPGP format."); + } + var mypos = position; + var tag = -1; + var format = -1; + var packet_length; + + format = 0; // 0 = old format; 1 = new format + if ((input[mypos] & 0x40) !== 0) { + format = 1; + } + + var packet_length_type; + if (format) { + // new format header + tag = input[mypos] & 0x3F; // bit 5-0 + } else { + // old format header + tag = (input[mypos] & 0x3F) >> 2; // bit 5-2 + packet_length_type = input[mypos] & 0x03; // bit 1-0 + } + + // header octet parsing done + mypos++; + + // parsed length from length field + var bodydata = null; + + // used for partial body lengths + var real_packet_length = -1; + if (!format) { + // 4.2.1. Old Format Packet Lengths + switch (packet_length_type) { + case 0: + // The packet has a one-octet length. The header is 2 octets + // long. + packet_length = input[mypos++]; + break; + case 1: + // The packet has a two-octet length. The header is 3 octets + // long. + packet_length = input[mypos++] << 8 | input[mypos++]; + break; + case 2: + // The packet has a four-octet length. The header is 5 + // octets long. + packet_length = input[mypos++] << 24 | input[mypos++] << 16 | input[mypos++] << 8 | input[mypos++]; + break; + default: + // 3 - The packet is of indeterminate length. The header is 1 + // octet long, and the implementation must determine how long + // the packet is. If the packet is in a file, this means that + // the packet extends until the end of the file. In general, + // an implementation SHOULD NOT use indeterminate-length + // packets except where the end of the data will be clear + // from the context, and even then it is better to use a + // definite length, or a new format header. The new format + // headers described below have a mechanism for precisely + // encoding data of indeterminate length. + packet_length = len; + break; + } + } else // 4.2.2. New Format Packet Lengths + { + + // 4.2.2.1. One-Octet Lengths + if (input[mypos] < 192) { + packet_length = input[mypos++]; + _util2.default.print_debug("1 byte length:" + packet_length); + // 4.2.2.2. Two-Octet Lengths + } else if (input[mypos] >= 192 && input[mypos] < 224) { + packet_length = (input[mypos++] - 192 << 8) + input[mypos++] + 192; + _util2.default.print_debug("2 byte length:" + packet_length); + // 4.2.2.4. Partial Body Lengths + } else if (input[mypos] > 223 && input[mypos] < 255) { + packet_length = 1 << (input[mypos++] & 0x1F); + _util2.default.print_debug("4 byte length:" + packet_length); + // EEEK, we're reading the full data here... + var mypos2 = mypos + packet_length; + bodydata = [input.subarray(mypos, mypos + packet_length)]; + var tmplen; + while (true) { + if (input[mypos2] < 192) { + tmplen = input[mypos2++]; + packet_length += tmplen; + bodydata.push(input.subarray(mypos2, mypos2 + tmplen)); + mypos2 += tmplen; + break; + } else if (input[mypos2] >= 192 && input[mypos2] < 224) { + tmplen = (input[mypos2++] - 192 << 8) + input[mypos2++] + 192; + packet_length += tmplen; + bodydata.push(input.subarray(mypos2, mypos2 + tmplen)); + mypos2 += tmplen; + break; + } else if (input[mypos2] > 223 && input[mypos2] < 255) { + tmplen = 1 << (input[mypos2++] & 0x1F); + packet_length += tmplen; + bodydata.push(input.subarray(mypos2, mypos2 + tmplen)); + mypos2 += tmplen; + } else { + mypos2++; + tmplen = input[mypos2++] << 24 | input[mypos2++] << 16 | input[mypos2++] << 8 | input[mypos2++]; + bodydata.push(input.subarray(mypos2, mypos2 + tmplen)); + packet_length += tmplen; + mypos2 += tmplen; + break; + } + } + real_packet_length = mypos2 - mypos; + // 4.2.2.3. Five-Octet Lengths + } else { + mypos++; + packet_length = input[mypos++] << 24 | input[mypos++] << 16 | input[mypos++] << 8 | input[mypos++]; + } + } + + // if there was'nt a partial body length: use the specified + // packet_length + if (real_packet_length === -1) { + real_packet_length = packet_length; + } + + if (bodydata === null) { + bodydata = input.subarray(mypos, mypos + real_packet_length); + } else if (bodydata instanceof Array) { + bodydata = _util2.default.concatUint8Array(bodydata); + } + + return { + tag: tag, + packet: bodydata, + offset: mypos + real_packet_length + }; + } +}; + +},{"../util.js":70}],52:[function(_dereq_,module,exports){ +/** + * This class represents a list of openpgp packets. + * Take care when iterating over it - the packets themselves + * are stored as numerical indices. + * @requires util + * @requires enums + * @requires packet + * @requires packet/packet + * @module packet/packetlist + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = Packetlist; + +var _util = _dereq_('../util'); + +var _util2 = _interopRequireDefault(_util); + +var _packet = _dereq_('./packet.js'); + +var _packet2 = _interopRequireDefault(_packet); + +var _all_packets = _dereq_('./all_packets.js'); + +var packets = _interopRequireWildcard(_all_packets); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _config = _dereq_('../config'); + +var _config2 = _interopRequireDefault(_config); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function Packetlist() { + /** The number of packets contained within the list. + * @readonly + * @type {Integer} */ + this.length = 0; +} +/** + * Reads a stream of binary data and interprents it as a list of packets. + * @param {Uint8Array} A Uint8Array of bytes. + */ +Packetlist.prototype.read = function (bytes) { + var i = 0; + + while (i < bytes.length) { + var parsed = _packet2.default.read(bytes, i, bytes.length - i); + i = parsed.offset; + + var pushed = false; + try { + var tag = _enums2.default.read(_enums2.default.packet, parsed.tag); + var packet = packets.newPacketFromTag(tag); + this.push(packet); + pushed = true; + packet.read(parsed.packet); + } catch (e) { + if (!_config2.default.tolerant || parsed.tag == _enums2.default.packet.symmetricallyEncrypted || parsed.tag == _enums2.default.packet.literal || parsed.tag == _enums2.default.packet.compressed) { + throw e; + } + if (pushed) { + this.pop(); // drop unsupported packet + } + } + } +}; + +/** + * Creates a binary representation of openpgp objects contained within the + * class instance. + * @returns {Uint8Array} A Uint8Array containing valid openpgp packets. + */ +Packetlist.prototype.write = function () { + var arr = []; + + for (var i = 0; i < this.length; i++) { + var packetbytes = this[i].write(); + arr.push(_packet2.default.writeHeader(this[i].tag, packetbytes.length)); + arr.push(packetbytes); + } + + return _util2.default.concatUint8Array(arr); +}; + +/** + * Adds a packet to the list. This is the only supported method of doing so; + * writing to packetlist[i] directly will result in an error. + */ +Packetlist.prototype.push = function (packet) { + if (!packet) { + return; + } + + packet.packets = packet.packets || new Packetlist(); + + this[this.length] = packet; + this.length++; +}; + +/** + * Remove a packet from the list and return it. + * @return {Object} The packet that was removed + */ +Packetlist.prototype.pop = function () { + if (this.length === 0) { + return; + } + + var packet = this[this.length - 1]; + delete this[this.length - 1]; + this.length--; + + return packet; +}; + +/** +* Creates a new PacketList with all packets that pass the test implemented by the provided function. +*/ +Packetlist.prototype.filter = function (callback) { + + var filtered = new Packetlist(); + + for (var i = 0; i < this.length; i++) { + if (callback(this[i], i, this)) { + filtered.push(this[i]); + } + } + + return filtered; +}; + +/** +* Creates a new PacketList with all packets from the given types +*/ +Packetlist.prototype.filterByTag = function () { + var args = Array.prototype.slice.call(arguments); + var filtered = new Packetlist(); + var that = this; + + function handle(packetType) { + return that[i].tag === packetType; + } + for (var i = 0; i < this.length; i++) { + if (args.some(handle)) { + filtered.push(this[i]); + } + } + + return filtered; +}; + +/** +* Executes the provided callback once for each element +*/ +Packetlist.prototype.forEach = function (callback) { + for (var i = 0; i < this.length; i++) { + callback(this[i]); + } +}; + +/** + * Traverses packet tree and returns first matching packet + * @param {module:enums.packet} type The packet type + * @return {module:packet/packet|null} + */ +Packetlist.prototype.findPacket = function (type) { + var packetlist = this.filterByTag(type); + if (packetlist.length) { + return packetlist[0]; + } else { + var found = null; + for (var i = 0; i < this.length; i++) { + if (this[i].packets.length) { + found = this[i].packets.findPacket(type); + if (found) { + return found; + } + } + } + } + return null; +}; + +/** + * Returns array of found indices by tag + */ +Packetlist.prototype.indexOfTag = function () { + var args = Array.prototype.slice.call(arguments); + var tagIndex = []; + var that = this; + + function handle(packetType) { + return that[i].tag === packetType; + } + for (var i = 0; i < this.length; i++) { + if (args.some(handle)) { + tagIndex.push(i); + } + } + return tagIndex; +}; + +/** + * Returns slice of packetlist + */ +Packetlist.prototype.slice = function (begin, end) { + if (!end) { + end = this.length; + } + var part = new Packetlist(); + for (var i = begin; i < end; i++) { + part.push(this[i]); + } + return part; +}; + +/** + * Concatenates packetlist or array of packets + */ +Packetlist.prototype.concat = function (packetlist) { + if (packetlist) { + for (var i = 0; i < packetlist.length; i++) { + this.push(packetlist[i]); + } + } +}; + +/** + * Allocate a new packetlist from structured packetlist clone + * See {@link http://www.w3.org/html/wg/drafts/html/master/infrastructure.html#safe-passing-of-structured-data} + * @param {Object} packetClone packetlist clone + * @returns {Object} new packetlist object with data from packetlist clone + */ +Packetlist.fromStructuredClone = function (packetlistClone) { + var packetlist = new Packetlist(); + for (var i = 0; i < packetlistClone.length; i++) { + packetlist.push(packets.fromStructuredClone(packetlistClone[i])); + if (packetlist[i].packets.length !== 0) { + packetlist[i].packets = this.fromStructuredClone(packetlist[i].packets); + } else { + packetlist[i].packets = new Packetlist(); + } + } + return packetlist; +}; + +},{"../config":10,"../enums.js":35,"../util":70,"./all_packets.js":44,"./packet.js":51}],53:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Implementation of the Key Material Packet (Tag 5,6,7,14)
+ *
+ * {@link http://tools.ietf.org/html/rfc4880#section-5.5|RFC4480 5.5}: + * A key material packet contains all the information about a public or + * private key. There are four variants of this packet type, and two + * major versions. Consequently, this section is complex. + * @requires crypto + * @requires enums + * @requires type/keyid + * @requires type/mpi + * @requires util + * @module packet/public_key + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = PublicKey; + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _mpi = _dereq_('../type/mpi.js'); + +var _mpi2 = _interopRequireDefault(_mpi); + +var _keyid = _dereq_('../type/keyid.js'); + +var _keyid2 = _interopRequireDefault(_keyid); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _crypto = _dereq_('../crypto'); + +var _crypto2 = _interopRequireDefault(_crypto); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function PublicKey() { + this.tag = _enums2.default.packet.publicKey; + this.version = 4; + /** Key creation date. + * @type {Date} */ + this.created = new Date(); + /** A list of multiprecision integers + * @type {module:type/mpi} */ + this.mpi = []; + /** Public key algorithm + * @type {module:enums.publicKey} */ + this.algorithm = 'rsa_sign'; + // time in days (V3 only) + this.expirationTimeV3 = 0; + /** + * Fingerprint in lowercase hex + * @type {String} + */ + this.fingerprint = null; + /** + * Keyid + * @type {module:type/keyid} + */ + this.keyid = null; +} + +/** + * Internal Parser for public keys as specified in {@link http://tools.ietf.org/html/rfc4880#section-5.5.2|RFC 4880 section 5.5.2 Public-Key Packet Formats} + * called by read_tag<num> + * @param {Uint8Array} bytes Input array to read the packet from + * @return {Object} This object with attributes set by the parser + */ +PublicKey.prototype.read = function (bytes) { + var pos = 0; + // A one-octet version number (3 or 4). + this.version = bytes[pos++]; + + if (this.version === 3 || this.version === 4) { + // - A four-octet number denoting the time that the key was created. + this.created = _util2.default.readDate(bytes.subarray(pos, pos + 4)); + pos += 4; + + if (this.version === 3) { + // - A two-octet number denoting the time in days that this key is + // valid. If this number is zero, then it does not expire. + this.expirationTimeV3 = _util2.default.readNumber(bytes.subarray(pos, pos + 2)); + pos += 2; + } + + // - A one-octet number denoting the public-key algorithm of this key. + this.algorithm = _enums2.default.read(_enums2.default.publicKey, bytes[pos++]); + + var mpicount = _crypto2.default.getPublicMpiCount(this.algorithm); + this.mpi = []; + + var bmpi = bytes.subarray(pos, bytes.length); + var p = 0; + + for (var i = 0; i < mpicount && p < bmpi.length; i++) { + + this.mpi[i] = new _mpi2.default(); + + p += this.mpi[i].read(bmpi.subarray(p, bmpi.length)); + + if (p > bmpi.length) { + throw new Error('Error reading MPI @:' + p); + } + } + + return p + 6; + } else { + throw new Error('Version ' + this.version + ' of the key packet is unsupported.'); + } +}; + +/** + * Alias of read() + * @see module:packet/public_key~PublicKey#read + */ +PublicKey.prototype.readPublicKey = PublicKey.prototype.read; + +/** + * Same as write_private_key, but has less information because of + * public key. + * @return {Uint8Array} OpenPGP packet body contents, + */ +PublicKey.prototype.write = function () { + + var arr = []; + // Version + arr.push(new Uint8Array([this.version])); + arr.push(_util2.default.writeDate(this.created)); + if (this.version === 3) { + arr.push(_util2.default.writeNumber(this.expirationTimeV3, 2)); + } + arr.push(new Uint8Array([_enums2.default.write(_enums2.default.publicKey, this.algorithm)])); + + var mpicount = _crypto2.default.getPublicMpiCount(this.algorithm); + + for (var i = 0; i < mpicount; i++) { + arr.push(this.mpi[i].write()); + } + + return _util2.default.concatUint8Array(arr); +}; + +/** + * Alias of write() + * @see module:packet/public_key~PublicKey#write + */ +PublicKey.prototype.writePublicKey = PublicKey.prototype.write; + +/** + * Write an old version packet - it's used by some of the internal routines. + */ +PublicKey.prototype.writeOld = function () { + var bytes = this.writePublicKey(); + + return _util2.default.concatUint8Array([new Uint8Array([0x99]), _util2.default.writeNumber(bytes.length, 2), bytes]); +}; + +/** + * Calculates the key id of the key + * @return {String} A 8 byte key id + */ +PublicKey.prototype.getKeyId = function () { + if (this.keyid) { + return this.keyid; + } + this.keyid = new _keyid2.default(); + if (this.version === 4) { + this.keyid.read(_util2.default.str2Uint8Array(_util2.default.hex2bin(this.getFingerprint()).substr(12, 8))); + } else if (this.version === 3) { + var arr = this.mpi[0].write(); + this.keyid.read(arr.subarray(arr.length - 8, arr.length)); + } + return this.keyid; +}; + +/** + * Calculates the fingerprint of the key + * @return {String} A string containing the fingerprint in lowercase hex + */ +PublicKey.prototype.getFingerprint = function () { + if (this.fingerprint) { + return this.fingerprint; + } + var toHash = ''; + if (this.version === 4) { + toHash = this.writeOld(); + this.fingerprint = _util2.default.Uint8Array2str(_crypto2.default.hash.sha1(toHash)); + } else if (this.version === 3) { + var mpicount = _crypto2.default.getPublicMpiCount(this.algorithm); + for (var i = 0; i < mpicount; i++) { + toHash += this.mpi[i].toBytes(); + } + this.fingerprint = _util2.default.Uint8Array2str(_crypto2.default.hash.md5(_util2.default.str2Uint8Array(toHash))); + } + this.fingerprint = _util2.default.hexstrdump(this.fingerprint); + return this.fingerprint; +}; + +/** + * Returns bit size of key + * @return {int} Number of bits + */ +PublicKey.prototype.getBitSize = function () { + return this.mpi[0].byteLength() * 8; +}; + +/** + * Fix custom types after cloning + */ +PublicKey.prototype.postCloneTypeFix = function () { + for (var i = 0; i < this.mpi.length; i++) { + this.mpi[i] = _mpi2.default.fromClone(this.mpi[i]); + } + if (this.keyid) { + this.keyid = _keyid2.default.fromClone(this.keyid); + } +}; + +},{"../crypto":24,"../enums.js":35,"../type/keyid.js":67,"../type/mpi.js":68,"../util.js":70}],54:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Public-Key Encrypted Session Key Packets (Tag 1)
+ *
+ * {@link http://tools.ietf.org/html/rfc4880#section-5.1|RFC4880 5.1}: A Public-Key Encrypted Session Key packet holds the session key + * used to encrypt a message. Zero or more Public-Key Encrypted Session Key + * packets and/or Symmetric-Key Encrypted Session Key packets may precede a + * Symmetrically Encrypted Data Packet, which holds an encrypted message. The + * message is encrypted with the session key, and the session key is itself + * encrypted and stored in the Encrypted Session Key packet(s). The + * Symmetrically Encrypted Data Packet is preceded by one Public-Key Encrypted + * Session Key packet for each OpenPGP key to which the message is encrypted. + * The recipient of the message finds a session key that is encrypted to their + * public key, decrypts the session key, and then uses the session key to + * decrypt the message. + * @requires crypto + * @requires enums + * @requires type/keyid + * @requires type/mpi + * @requires util + * @module packet/public_key_encrypted_session_key + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = PublicKeyEncryptedSessionKey; + +var _keyid = _dereq_('../type/keyid.js'); + +var _keyid2 = _interopRequireDefault(_keyid); + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _mpi = _dereq_('../type/mpi.js'); + +var _mpi2 = _interopRequireDefault(_mpi); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _crypto = _dereq_('../crypto'); + +var _crypto2 = _interopRequireDefault(_crypto); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function PublicKeyEncryptedSessionKey() { + this.tag = _enums2.default.packet.publicKeyEncryptedSessionKey; + this.version = 3; + + this.publicKeyId = new _keyid2.default(); + this.publicKeyAlgorithm = 'rsa_encrypt'; + + this.sessionKey = null; + this.sessionKeyAlgorithm = 'aes256'; + + /** @type {Array} */ + this.encrypted = []; +} + +/** + * Parsing function for a publickey encrypted session key packet (tag 1). + * + * @param {Uint8Array} input Payload of a tag 1 packet + * @param {Integer} position Position to start reading from the input string + * @param {Integer} len Length of the packet or the remaining length of + * input at position + * @return {module:packet/public_key_encrypted_session_key} Object representation + */ +PublicKeyEncryptedSessionKey.prototype.read = function (bytes) { + + this.version = bytes[0]; + this.publicKeyId.read(bytes.subarray(1, bytes.length)); + this.publicKeyAlgorithm = _enums2.default.read(_enums2.default.publicKey, bytes[9]); + + var i = 10; + + var integerCount = function (algo) { + switch (algo) { + case 'rsa_encrypt': + case 'rsa_encrypt_sign': + return 1; + + case 'elgamal': + return 2; + + default: + throw new Error("Invalid algorithm."); + } + }(this.publicKeyAlgorithm); + + this.encrypted = []; + + for (var j = 0; j < integerCount; j++) { + var mpi = new _mpi2.default(); + i += mpi.read(bytes.subarray(i, bytes.length)); + this.encrypted.push(mpi); + } +}; + +/** + * Create a string representation of a tag 1 packet + * + * @return {Uint8Array} The Uint8Array representation + */ +PublicKeyEncryptedSessionKey.prototype.write = function () { + + var arr = [new Uint8Array([this.version]), this.publicKeyId.write(), new Uint8Array([_enums2.default.write(_enums2.default.publicKey, this.publicKeyAlgorithm)])]; + + for (var i = 0; i < this.encrypted.length; i++) { + arr.push(this.encrypted[i].write()); + } + + return _util2.default.concatUint8Array(arr); +}; + +PublicKeyEncryptedSessionKey.prototype.encrypt = function (key) { + var data = String.fromCharCode(_enums2.default.write(_enums2.default.symmetric, this.sessionKeyAlgorithm)); + + data += _util2.default.Uint8Array2str(this.sessionKey); + var checksum = _util2.default.calc_checksum(this.sessionKey); + data += _util2.default.Uint8Array2str(_util2.default.writeNumber(checksum, 2)); + + var mpi = new _mpi2.default(); + mpi.fromBytes(_crypto2.default.pkcs1.eme.encode(data, key.mpi[0].byteLength())); + + this.encrypted = _crypto2.default.publicKeyEncrypt(this.publicKeyAlgorithm, key.mpi, mpi); +}; + +/** + * Decrypts the session key (only for public key encrypted session key + * packets (tag 1) + * + * @param {module:packet/secret_key} key + * Private key with secMPIs unlocked + * @return {String} The unencrypted session key + */ +PublicKeyEncryptedSessionKey.prototype.decrypt = function (key) { + var result = _crypto2.default.publicKeyDecrypt(this.publicKeyAlgorithm, key.mpi, this.encrypted).toBytes(); + + var checksum = _util2.default.readNumber(_util2.default.str2Uint8Array(result.substr(result.length - 2))); + + var decoded = _crypto2.default.pkcs1.eme.decode(result); + + key = _util2.default.str2Uint8Array(decoded.substring(1, decoded.length - 2)); + + if (checksum !== _util2.default.calc_checksum(key)) { + throw new Error('Checksum mismatch'); + } else { + this.sessionKey = key; + this.sessionKeyAlgorithm = _enums2.default.read(_enums2.default.symmetric, decoded.charCodeAt(0)); + } +}; + +/** + * Fix custom types after cloning + */ +PublicKeyEncryptedSessionKey.prototype.postCloneTypeFix = function () { + this.publicKeyId = _keyid2.default.fromClone(this.publicKeyId); + for (var i = 0; i < this.encrypted.length; i++) { + this.encrypted[i] = _mpi2.default.fromClone(this.encrypted[i]); + } +}; + +},{"../crypto":24,"../enums.js":35,"../type/keyid.js":67,"../type/mpi.js":68,"../util.js":70}],55:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @requires packet/public_key + * @requires enums + * @module packet/public_subkey + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = PublicSubkey; + +var _public_key = _dereq_('./public_key.js'); + +var _public_key2 = _interopRequireDefault(_public_key); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + * @extends module:packet/public_key + */ +function PublicSubkey() { + _public_key2.default.call(this); + this.tag = _enums2.default.packet.publicSubkey; +} + +PublicSubkey.prototype = new _public_key2.default(); +PublicSubkey.prototype.constructor = PublicSubkey; + +},{"../enums.js":35,"./public_key.js":53}],56:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Implementation of the Key Material Packet (Tag 5,6,7,14)
+ *
+ * {@link http://tools.ietf.org/html/rfc4880#section-5.5|RFC4480 5.5}: + * A key material packet contains all the information about a public or + * private key. There are four variants of this packet type, and two + * major versions. Consequently, this section is complex. + * @requires crypto + * @requires enums + * @requires packet/public_key + * @requires type/mpi + * @requires type/s2k + * @requires util + * @module packet/secret_key + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = SecretKey; + +var _public_key = _dereq_('./public_key.js'); + +var _public_key2 = _interopRequireDefault(_public_key); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _crypto = _dereq_('../crypto'); + +var _crypto2 = _interopRequireDefault(_crypto); + +var _mpi = _dereq_('../type/mpi.js'); + +var _mpi2 = _interopRequireDefault(_mpi); + +var _s2k = _dereq_('../type/s2k.js'); + +var _s2k2 = _interopRequireDefault(_s2k); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + * @extends module:packet/public_key + */ +function SecretKey() { + _public_key2.default.call(this); + this.tag = _enums2.default.packet.secretKey; + // encrypted secret-key data + this.encrypted = null; + // indicator if secret-key data is available in decrypted form + this.isDecrypted = false; +} + +SecretKey.prototype = new _public_key2.default(); +SecretKey.prototype.constructor = SecretKey; + +function get_hash_len(hash) { + if (hash === 'sha1') { + return 20; + } else { + return 2; + } +} + +function get_hash_fn(hash) { + if (hash === 'sha1') { + return _crypto2.default.hash.sha1; + } else { + return function (c) { + return _util2.default.writeNumber(_util2.default.calc_checksum(c), 2); + }; + } +} + +// Helper function + +function parse_cleartext_mpi(hash_algorithm, cleartext, algorithm) { + var hashlen = get_hash_len(hash_algorithm), + hashfn = get_hash_fn(hash_algorithm); + + var hashtext = _util2.default.Uint8Array2str(cleartext.subarray(cleartext.length - hashlen, cleartext.length)); + cleartext = cleartext.subarray(0, cleartext.length - hashlen); + + var hash = _util2.default.Uint8Array2str(hashfn(cleartext)); + + if (hash !== hashtext) { + return new Error("Hash mismatch."); + } + + var mpis = _crypto2.default.getPrivateMpiCount(algorithm); + + var j = 0; + var mpi = []; + + for (var i = 0; i < mpis && j < cleartext.length; i++) { + mpi[i] = new _mpi2.default(); + j += mpi[i].read(cleartext.subarray(j, cleartext.length)); + } + + return mpi; +} + +function write_cleartext_mpi(hash_algorithm, algorithm, mpi) { + var arr = []; + var discard = _crypto2.default.getPublicMpiCount(algorithm); + + for (var i = discard; i < mpi.length; i++) { + arr.push(mpi[i].write()); + } + + var bytes = _util2.default.concatUint8Array(arr); + + var hash = get_hash_fn(hash_algorithm)(bytes); + + return _util2.default.concatUint8Array([bytes, hash]); +} + +// 5.5.3. Secret-Key Packet Formats + +/** + * Internal parser for private keys as specified in {@link http://tools.ietf.org/html/rfc4880#section-5.5.3|RFC 4880 section 5.5.3} + * @param {String} bytes Input string to read the packet from + */ +SecretKey.prototype.read = function (bytes) { + // - A Public-Key or Public-Subkey packet, as described above. + var len = this.readPublicKey(bytes); + + bytes = bytes.subarray(len, bytes.length); + + // - One octet indicating string-to-key usage conventions. Zero + // indicates that the secret-key data is not encrypted. 255 or 254 + // indicates that a string-to-key specifier is being given. Any + // other value is a symmetric-key encryption algorithm identifier. + var isEncrypted = bytes[0]; + + if (isEncrypted) { + this.encrypted = bytes; + } else { + // - Plain or encrypted multiprecision integers comprising the secret + // key data. These algorithm-specific fields are as described + // below. + var parsedMPI = parse_cleartext_mpi('mod', bytes.subarray(1, bytes.length), this.algorithm); + if (parsedMPI instanceof Error) { + throw parsedMPI; + } + this.mpi = this.mpi.concat(parsedMPI); + this.isDecrypted = true; + } +}; + +/** Creates an OpenPGP key packet for the given key. + * @return {String} A string of bytes containing the secret key OpenPGP packet + */ +SecretKey.prototype.write = function () { + var arr = [this.writePublicKey()]; + + if (!this.encrypted) { + arr.push(new Uint8Array([0])); + arr.push(write_cleartext_mpi('mod', this.algorithm, this.mpi)); + } else { + arr.push(this.encrypted); + } + + return _util2.default.concatUint8Array(arr); +}; + +/** Encrypt the payload. By default, we use aes256 and iterated, salted string + * to key specifier. If the key is in a decrypted state (isDecrypted === true) + * and the passphrase is empty or undefined, the key will be set as not encrypted. + * This can be used to remove passphrase protection after calling decrypt(). + * @param {String} passphrase + */ +SecretKey.prototype.encrypt = function (passphrase) { + if (this.isDecrypted && !passphrase) { + this.encrypted = null; + return; + } else if (!passphrase) { + throw new Error('The key must be decrypted before removing passphrase protection.'); + } + + var s2k = new _s2k2.default(), + symmetric = 'aes256', + cleartext = write_cleartext_mpi('sha1', this.algorithm, this.mpi), + key = produceEncryptionKey(s2k, passphrase, symmetric), + blockLen = _crypto2.default.cipher[symmetric].blockSize, + iv = _crypto2.default.random.getRandomBytes(blockLen); + + var arr = [new Uint8Array([254, _enums2.default.write(_enums2.default.symmetric, symmetric)])]; + arr.push(s2k.write()); + arr.push(iv); + arr.push(_crypto2.default.cfb.normalEncrypt(symmetric, key, cleartext, iv)); + + this.encrypted = _util2.default.concatUint8Array(arr); +}; + +function produceEncryptionKey(s2k, passphrase, algorithm) { + return s2k.produce_key(passphrase, _crypto2.default.cipher[algorithm].keySize); +} + +/** + * Decrypts the private key MPIs which are needed to use the key. + * @link module:packet/secret_key.isDecrypted should be + * false otherwise a call to this function is not needed + * + * @param {String} str_passphrase The passphrase for this private key + * as string + * @return {Boolean} True if the passphrase was correct or MPI already + * decrypted; false if not + */ +SecretKey.prototype.decrypt = function (passphrase) { + if (this.isDecrypted) { + return true; + } + + var i = 0, + symmetric, + key; + + var s2k_usage = this.encrypted[i++]; + + // - [Optional] If string-to-key usage octet was 255 or 254, a one- + // octet symmetric encryption algorithm. + if (s2k_usage === 255 || s2k_usage === 254) { + symmetric = this.encrypted[i++]; + symmetric = _enums2.default.read(_enums2.default.symmetric, symmetric); + + // - [Optional] If string-to-key usage octet was 255 or 254, a + // string-to-key specifier. The length of the string-to-key + // specifier is implied by its type, as described above. + var s2k = new _s2k2.default(); + i += s2k.read(this.encrypted.subarray(i, this.encrypted.length)); + + key = produceEncryptionKey(s2k, passphrase, symmetric); + } else { + symmetric = s2k_usage; + symmetric = _enums2.default.read(_enums2.default.symmetric, symmetric); + key = _crypto2.default.hash.md5(passphrase); + } + + // - [Optional] If secret data is encrypted (string-to-key usage octet + // not zero), an Initial Vector (IV) of the same length as the + // cipher's block size. + var iv = this.encrypted.subarray(i, i + _crypto2.default.cipher[symmetric].blockSize); + + i += iv.length; + + var cleartext, + ciphertext = this.encrypted.subarray(i, this.encrypted.length); + + cleartext = _crypto2.default.cfb.normalDecrypt(symmetric, key, ciphertext, iv); + + var hash = s2k_usage === 254 ? 'sha1' : 'mod'; + + var parsedMPI = parse_cleartext_mpi(hash, cleartext, this.algorithm); + if (parsedMPI instanceof Error) { + return false; + } + this.mpi = this.mpi.concat(parsedMPI); + this.isDecrypted = true; + this.encrypted = null; + return true; +}; + +SecretKey.prototype.generate = function (bits) { + var self = this; + + return _crypto2.default.generateMpi(self.algorithm, bits).then(function (mpi) { + self.mpi = mpi; + self.isDecrypted = true; + }); +}; + +/** + * Clear private MPIs, return to initial state + */ +SecretKey.prototype.clearPrivateMPIs = function () { + if (!this.encrypted) { + throw new Error('If secret key is not encrypted, clearing private MPIs is irreversible.'); + } + this.mpi = this.mpi.slice(0, _crypto2.default.getPublicMpiCount(this.algorithm)); + this.isDecrypted = false; +}; + +},{"../crypto":24,"../enums.js":35,"../type/mpi.js":68,"../type/s2k.js":69,"../util.js":70,"./public_key.js":53}],57:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @requires packet/secret_key + * @requires enums + * @module packet/secret_subkey + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = SecretSubkey; + +var _secret_key = _dereq_('./secret_key.js'); + +var _secret_key2 = _interopRequireDefault(_secret_key); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + * @extends module:packet/secret_key + */ +function SecretSubkey() { + _secret_key2.default.call(this); + this.tag = _enums2.default.packet.secretSubkey; +} + +SecretSubkey.prototype = new _secret_key2.default(); +SecretSubkey.prototype.constructor = SecretSubkey; + +},{"../enums.js":35,"./secret_key.js":56}],58:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = Signature; + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _packet = _dereq_('./packet.js'); + +var _packet2 = _interopRequireDefault(_packet); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _crypto = _dereq_('../crypto'); + +var _crypto2 = _interopRequireDefault(_crypto); + +var _mpi = _dereq_('../type/mpi.js'); + +var _mpi2 = _interopRequireDefault(_mpi); + +var _keyid = _dereq_('../type/keyid.js'); + +var _keyid2 = _interopRequireDefault(_keyid); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Implementation of the Signature Packet (Tag 2)
+ *
+ * {@link http://tools.ietf.org/html/rfc4880#section-5.2|RFC4480 5.2}: + * A Signature packet describes a binding between some public key and + * some data. The most common signatures are a signature of a file or a + * block of text, and a signature that is a certification of a User ID. + * @requires crypto + * @requires enums + * @requires packet/packet + * @requires type/keyid + * @requires type/mpi + * @requires util + * @module packet/signature + */ + +function Signature() { + this.tag = _enums2.default.packet.signature; + this.version = 4; + this.signatureType = null; + this.hashAlgorithm = null; + this.publicKeyAlgorithm = null; + + this.signatureData = null; + this.unhashedSubpackets = null; + this.signedHashValue = null; + + this.created = new Date(); + this.signatureExpirationTime = null; + this.signatureNeverExpires = true; + this.exportable = null; + this.trustLevel = null; + this.trustAmount = null; + this.regularExpression = null; + this.revocable = null; + this.keyExpirationTime = null; + this.keyNeverExpires = null; + this.preferredSymmetricAlgorithms = null; + this.revocationKeyClass = null; + this.revocationKeyAlgorithm = null; + this.revocationKeyFingerprint = null; + this.issuerKeyId = new _keyid2.default(); + this.notation = null; + this.preferredHashAlgorithms = null; + this.preferredCompressionAlgorithms = null; + this.keyServerPreferences = null; + this.preferredKeyServer = null; + this.isPrimaryUserID = null; + this.policyURI = null; + this.keyFlags = null; + this.signersUserId = null; + this.reasonForRevocationFlag = null; + this.reasonForRevocationString = null; + this.features = null; + this.signatureTargetPublicKeyAlgorithm = null; + this.signatureTargetHashAlgorithm = null; + this.signatureTargetHash = null; + this.embeddedSignature = null; + + this.verified = false; +} + +/** + * parsing function for a signature packet (tag 2). + * @param {String} bytes payload of a tag 2 packet + * @param {Integer} position position to start reading from the bytes string + * @param {Integer} len length of the packet or the remaining length of bytes at position + * @return {module:packet/signature} object representation + */ +Signature.prototype.read = function (bytes) { + var i = 0; + this.version = bytes[i++]; + // switch on version (3 and 4) + switch (this.version) { + case 3: + // One-octet length of following hashed material. MUST be 5. + if (bytes[i++] !== 5) { + _util2.default.print_debug("packet/signature.js\n" + 'invalid One-octet length of following hashed material.' + 'MUST be 5. @:' + (i - 1)); + } + + var sigpos = i; + // One-octet signature type. + this.signatureType = bytes[i++]; + + // Four-octet creation time. + this.created = _util2.default.readDate(bytes.subarray(i, i + 4)); + i += 4; + + // storing data appended to data which gets verified + this.signatureData = bytes.subarray(sigpos, i); + + // Eight-octet Key ID of signer. + this.issuerKeyId.read(bytes.subarray(i, i + 8)); + i += 8; + + // One-octet public-key algorithm. + this.publicKeyAlgorithm = bytes[i++]; + + // One-octet hash algorithm. + this.hashAlgorithm = bytes[i++]; + break; + case 4: + this.signatureType = bytes[i++]; + this.publicKeyAlgorithm = bytes[i++]; + this.hashAlgorithm = bytes[i++]; + + var subpackets = function subpackets(bytes) { + // Two-octet scalar octet count for following subpacket data. + var subpacket_length = _util2.default.readNumber(bytes.subarray(0, 2)); + + var i = 2; + + // subpacket data set (zero or more subpackets) + while (i < 2 + subpacket_length) { + + var len = _packet2.default.readSimpleLength(bytes.subarray(i, bytes.length)); + i += len.offset; + + this.read_sub_packet(bytes.subarray(i, i + len.len)); + + i += len.len; + } + + return i; + }; + + // hashed subpackets + + + i += subpackets.call(this, bytes.subarray(i, bytes.length), true); + + // A V4 signature hashes the packet body + // starting from its first field, the version number, through the end + // of the hashed subpacket data. Thus, the fields hashed are the + // signature version, the signature type, the public-key algorithm, the + // hash algorithm, the hashed subpacket length, and the hashed + // subpacket body. + this.signatureData = bytes.subarray(0, i); + var sigDataLength = i; + + // unhashed subpackets + i += subpackets.call(this, bytes.subarray(i, bytes.length), false); + this.unhashedSubpackets = bytes.subarray(sigDataLength, i); + + break; + default: + throw new Error('Version ' + this.version + ' of the signature is unsupported.'); + } + + // Two-octet field holding left 16 bits of signed hash value. + this.signedHashValue = bytes.subarray(i, i + 2); + i += 2; + + this.signature = bytes.subarray(i, bytes.length); +}; + +Signature.prototype.write = function () { + var arr = []; + switch (this.version) { + case 3: + arr.push(new Uint8Array([3, 5])); // version, One-octet length of following hashed material. MUST be 5 + arr.push(new Uint8Array([this.signatureType])); + arr.push(_util2.default.writeDate(this.created)); + arr.push(this.issuerKeyId.write()); + arr.push(new Uint8Array([_enums2.default.write(_enums2.default.publicKey, this.publicKeyAlgorithm), _enums2.default.write(_enums2.default.hash, this.hashAlgorithm)])); + break; + case 4: + arr.push(this.signatureData); + arr.push(this.unhashedSubpackets ? this.unhashedSubpackets : _util2.default.writeNumber(0, 2)); + break; + } + arr.push(this.signedHashValue); + arr.push(this.signature); + return _util2.default.concatUint8Array(arr); +}; + +/** + * Signs provided data. This needs to be done prior to serialization. + * @param {module:packet/secret_key} key private key used to sign the message. + * @param {Object} data Contains packets to be signed. + */ +Signature.prototype.sign = function (key, data) { + var signatureType = _enums2.default.write(_enums2.default.signature, this.signatureType), + publicKeyAlgorithm = _enums2.default.write(_enums2.default.publicKey, this.publicKeyAlgorithm), + hashAlgorithm = _enums2.default.write(_enums2.default.hash, this.hashAlgorithm); + + var arr = [new Uint8Array([4, signatureType, publicKeyAlgorithm, hashAlgorithm])]; + + this.issuerKeyId = key.getKeyId(); + + // Add hashed subpackets + arr.push(this.write_all_sub_packets()); + + this.signatureData = _util2.default.concatUint8Array(arr); + + var trailer = this.calculateTrailer(); + + var toHash = null; + + switch (this.version) { + case 3: + toHash = _util2.default.concatUint8Array([this.toSign(signatureType, data), new Uint8Array([signatureType]), _util2.default.writeDate(this.created)]); + break; + case 4: + toHash = _util2.default.concatUint8Array([this.toSign(signatureType, data), this.signatureData, trailer]); + break; + default: + throw new Error('Version ' + this.version + ' of the signature is unsupported.'); + } + + var hash = _crypto2.default.hash.digest(hashAlgorithm, toHash); + + this.signedHashValue = hash.subarray(0, 2); + + this.signature = _crypto2.default.signature.sign(hashAlgorithm, publicKeyAlgorithm, key.mpi, toHash); +}; + +/** + * Creates string of bytes with all subpacket data + * @return {String} a string-representation of a all subpacket data + */ +Signature.prototype.write_all_sub_packets = function () { + var sub = _enums2.default.signatureSubpacket; + var arr = []; + var bytes; + if (this.created !== null) { + arr.push(write_sub_packet(sub.signature_creation_time, _util2.default.writeDate(this.created))); + } + if (this.signatureExpirationTime !== null) { + arr.push(write_sub_packet(sub.signature_expiration_time, _util2.default.writeNumber(this.signatureExpirationTime, 4))); + } + if (this.exportable !== null) { + arr.push(write_sub_packet(sub.exportable_certification, new Uint8Array([this.exportable ? 1 : 0]))); + } + if (this.trustLevel !== null) { + bytes = new Uint8Array([this.trustLevel, this.trustAmount]); + arr.push(write_sub_packet(sub.trust_signature, bytes)); + } + if (this.regularExpression !== null) { + arr.push(write_sub_packet(sub.regular_expression, this.regularExpression)); + } + if (this.revocable !== null) { + arr.push(write_sub_packet(sub.revocable, new Uint8Array([this.revocable ? 1 : 0]))); + } + if (this.keyExpirationTime !== null) { + arr.push(write_sub_packet(sub.key_expiration_time, _util2.default.writeNumber(this.keyExpirationTime, 4))); + } + if (this.preferredSymmetricAlgorithms !== null) { + bytes = _util2.default.str2Uint8Array(_util2.default.bin2str(this.preferredSymmetricAlgorithms)); + arr.push(write_sub_packet(sub.preferred_symmetric_algorithms, bytes)); + } + if (this.revocationKeyClass !== null) { + + bytes = new Uint8Array([this.revocationKeyClass, this.revocationKeyAlgorithm]); + bytes = _util2.default.concatUint8Array([bytes, this.revocationKeyFingerprint]); + arr.push(write_sub_packet(sub.revocation_key, bytes)); + } + if (!this.issuerKeyId.isNull()) { + arr.push(write_sub_packet(sub.issuer, this.issuerKeyId.write())); + } + if (this.notation !== null) { + for (var name in this.notation) { + if (this.notation.hasOwnProperty(name)) { + var value = this.notation[name]; + bytes = [new Uint8Array([0x80, 0, 0, 0])]; + // 2 octets of name length + bytes.push(_util2.default.writeNumber(name.length, 2)); + // 2 octets of value length + bytes.push(_util2.default.writeNumber(value.length, 2)); + bytes.push(_util2.default.str2Uint8Array(name + value)); + bytes = _util2.default.concatUint8Array(bytes); + arr.push(write_sub_packet(sub.notation_data, bytes)); + } + } + } + if (this.preferredHashAlgorithms !== null) { + bytes = _util2.default.str2Uint8Array(_util2.default.bin2str(this.preferredHashAlgorithms)); + arr.push(write_sub_packet(sub.preferred_hash_algorithms, bytes)); + } + if (this.preferredCompressionAlgorithms !== null) { + bytes = _util2.default.str2Uint8Array(_util2.default.bin2str(this.preferredCompressionAlgorithms)); + arr.push(write_sub_packet(sub.preferred_compression_algorithms, bytes)); + } + if (this.keyServerPreferences !== null) { + bytes = _util2.default.str2Uint8Array(_util2.default.bin2str(this.keyServerPreferences)); + arr.push(write_sub_packet(sub.key_server_preferences, bytes)); + } + if (this.preferredKeyServer !== null) { + arr.push(write_sub_packet(sub.preferred_key_server, _util2.default.str2Uint8Array(this.preferredKeyServer))); + } + if (this.isPrimaryUserID !== null) { + arr.push(write_sub_packet(sub.primary_user_id, new Uint8Array([this.isPrimaryUserID ? 1 : 0]))); + } + if (this.policyURI !== null) { + arr.push(write_sub_packet(sub.policy_uri, _util2.default.str2Uint8Array(this.policyURI))); + } + if (this.keyFlags !== null) { + bytes = _util2.default.str2Uint8Array(_util2.default.bin2str(this.keyFlags)); + arr.push(write_sub_packet(sub.key_flags, bytes)); + } + if (this.signersUserId !== null) { + arr.push(write_sub_packet(sub.signers_user_id, _util2.default.str2Uint8Array(this.signersUserId))); + } + if (this.reasonForRevocationFlag !== null) { + bytes = _util2.default.str2Uint8Array(String.fromCharCode(this.reasonForRevocationFlag) + this.reasonForRevocationString); + arr.push(write_sub_packet(sub.reason_for_revocation, bytes)); + } + if (this.features !== null) { + bytes = _util2.default.str2Uint8Array(_util2.default.bin2str(this.features)); + arr.push(write_sub_packet(sub.features, bytes)); + } + if (this.signatureTargetPublicKeyAlgorithm !== null) { + bytes = [new Uint8Array([this.signatureTargetPublicKeyAlgorithm, this.signatureTargetHashAlgorithm])]; + bytes.push(_util2.default.str2Uint8Array(this.signatureTargetHash)); + bytes = _util2.default.concatUint8Array(bytes); + arr.push(write_sub_packet(sub.signature_target, bytes)); + } + if (this.embeddedSignature !== null) { + arr.push(write_sub_packet(sub.embedded_signature, this.embeddedSignature.write())); + } + + var result = _util2.default.concatUint8Array(arr); + var length = _util2.default.writeNumber(result.length, 2); + + return _util2.default.concatUint8Array([length, result]); +}; + +/** + * creates a string representation of a sub signature packet (See {@link http://tools.ietf.org/html/rfc4880#section-5.2.3.1|RFC 4880 5.2.3.1}) + * @param {Integer} type subpacket signature type. Signature types as described + * in {@link http://tools.ietf.org/html/rfc4880#section-5.2.3.2|RFC4880 Section 5.2.3.2} + * @param {String} data data to be included + * @return {String} a string-representation of a sub signature packet (See {@link http://tools.ietf.org/html/rfc4880#section-5.2.3.1|RFC 4880 5.2.3.1}) + */ +function write_sub_packet(type, data) { + var arr = []; + arr.push(_packet2.default.writeSimpleLength(data.length + 1)); + arr.push(new Uint8Array([type])); + arr.push(data); + return _util2.default.concatUint8Array(arr); +} + +// V4 signature sub packets + +Signature.prototype.read_sub_packet = function (bytes) { + var mypos = 0; + + function read_array(prop, bytes) { + this[prop] = []; + + for (var i = 0; i < bytes.length; i++) { + this[prop].push(bytes[i]); + } + } + + // The leftwost bit denotes a "critical" packet, but we ignore it. + var type = bytes[mypos++] & 0x7F; + var seconds; + + // subpacket type + switch (type) { + case 2: + // Signature Creation Time + this.created = _util2.default.readDate(bytes.subarray(mypos, bytes.length)); + break; + case 3: + // Signature Expiration Time in seconds + seconds = _util2.default.readNumber(bytes.subarray(mypos, bytes.length)); + + this.signatureNeverExpires = seconds === 0; + this.signatureExpirationTime = seconds; + + break; + case 4: + // Exportable Certification + this.exportable = bytes[mypos++] === 1; + break; + case 5: + // Trust Signature + this.trustLevel = bytes[mypos++]; + this.trustAmount = bytes[mypos++]; + break; + case 6: + // Regular Expression + this.regularExpression = bytes[mypos]; + break; + case 7: + // Revocable + this.revocable = bytes[mypos++] === 1; + break; + case 9: + // Key Expiration Time in seconds + seconds = _util2.default.readNumber(bytes.subarray(mypos, bytes.length)); + + this.keyExpirationTime = seconds; + this.keyNeverExpires = seconds === 0; + + break; + case 11: + // Preferred Symmetric Algorithms + read_array.call(this, 'preferredSymmetricAlgorithms', bytes.subarray(mypos, bytes.length)); + break; + case 12: + // Revocation Key + // (1 octet of class, 1 octet of public-key algorithm ID, 20 + // octets of + // fingerprint) + this.revocationKeyClass = bytes[mypos++]; + this.revocationKeyAlgorithm = bytes[mypos++]; + this.revocationKeyFingerprint = bytes.subarray(mypos, 20); + break; + + case 16: + // Issuer + this.issuerKeyId.read(bytes.subarray(mypos, bytes.length)); + break; + + case 20: + // Notation Data + // We don't know how to handle anything but a text flagged data. + if (bytes[mypos] === 0x80) { + + // We extract key/value tuple from the byte stream. + mypos += 4; + var m = _util2.default.readNumber(bytes.subarray(mypos, mypos + 2)); + mypos += 2; + var n = _util2.default.readNumber(bytes.subarray(mypos, mypos + 2)); + mypos += 2; + + var name = _util2.default.Uint8Array2str(bytes.subarray(mypos, mypos + m)), + value = _util2.default.Uint8Array2str(bytes.subarray(mypos + m, mypos + m + n)); + + this.notation = this.notation || {}; + this.notation[name] = value; + } else { + _util2.default.print_debug("Unsupported notation flag " + bytes[mypos]); + } + break; + case 21: + // Preferred Hash Algorithms + read_array.call(this, 'preferredHashAlgorithms', bytes.subarray(mypos, bytes.length)); + break; + case 22: + // Preferred Compression Algorithms + read_array.call(this, 'preferredCompressionAlgorithms', bytes.subarray(mypos, bytes.length)); + break; + case 23: + // Key Server Preferences + read_array.call(this, 'keyServerPreferencess', bytes.subarray(mypos, bytes.length)); + break; + case 24: + // Preferred Key Server + this.preferredKeyServer = _util2.default.Uint8Array2str(bytes.subarray(mypos, bytes.length)); + break; + case 25: + // Primary User ID + this.isPrimaryUserID = bytes[mypos++] !== 0; + break; + case 26: + // Policy URI + this.policyURI = _util2.default.Uint8Array2str(bytes.subarray(mypos, bytes.length)); + break; + case 27: + // Key Flags + read_array.call(this, 'keyFlags', bytes.subarray(mypos, bytes.length)); + break; + case 28: + // Signer's User ID + this.signersUserId += _util2.default.Uint8Array2str(bytes.subarray(mypos, bytes.length)); + break; + case 29: + // Reason for Revocation + this.reasonForRevocationFlag = bytes[mypos++]; + this.reasonForRevocationString = _util2.default.Uint8Array2str(bytes.subarray(mypos, bytes.length)); + break; + case 30: + // Features + read_array.call(this, 'features', bytes.subarray(mypos, bytes.length)); + break; + case 31: + // Signature Target + // (1 octet public-key algorithm, 1 octet hash algorithm, N octets hash) + this.signatureTargetPublicKeyAlgorithm = bytes[mypos++]; + this.signatureTargetHashAlgorithm = bytes[mypos++]; + + var len = _crypto2.default.getHashByteLength(this.signatureTargetHashAlgorithm); + + this.signatureTargetHash = _util2.default.Uint8Array2str(bytes.subarray(mypos, mypos + len)); + break; + case 32: + // Embedded Signature + this.embeddedSignature = new Signature(); + this.embeddedSignature.read(bytes.subarray(mypos, bytes.length)); + break; + default: + _util2.default.print_debug("Unknown signature subpacket type " + type + " @:" + mypos); + } +}; + +// Produces data to produce signature on +Signature.prototype.toSign = function (type, data) { + var t = _enums2.default.signature; + + switch (type) { + case t.binary: + case t.text: + return data.getBytes(); + + case t.standalone: + return new Uint8Array(0); + + case t.cert_generic: + case t.cert_persona: + case t.cert_casual: + case t.cert_positive: + case t.cert_revocation: + var packet, tag; + + if (data.userid !== undefined) { + tag = 0xB4; + packet = data.userid; + } else if (data.userattribute !== undefined) { + tag = 0xD1; + packet = data.userattribute; + } else { + throw new Error('Either a userid or userattribute packet needs to be ' + 'supplied for certification.'); + } + + var bytes = packet.write(); + + if (this.version === 4) { + return _util2.default.concatUint8Array([this.toSign(t.key, data), new Uint8Array([tag]), _util2.default.writeNumber(bytes.length, 4), bytes]); + } else if (this.version === 3) { + return _util2.default.concatUint8Array([this.toSign(t.key, data), bytes]); + } + break; + + case t.subkey_binding: + case t.subkey_revocation: + case t.key_binding: + return _util2.default.concatUint8Array([this.toSign(t.key, data), this.toSign(t.key, { + key: data.bind + })]); + + case t.key: + if (data.key === undefined) { + throw new Error('Key packet is required for this signature.'); + } + return data.key.writeOld(); + + case t.key_revocation: + return this.toSign(t.key, data); + case t.timestamp: + return new Uint8Array(0); + case t.third_party: + throw new Error('Not implemented'); + default: + throw new Error('Unknown signature type.'); + } +}; + +Signature.prototype.calculateTrailer = function () { + // calculating the trailer + // V3 signatures don't have a trailer + if (this.version === 3) { + return new Uint8Array(0); + } + var first = new Uint8Array([4, 0xFF]); //Version, ? + return _util2.default.concatUint8Array([first, _util2.default.writeNumber(this.signatureData.length, 4)]); +}; + +/** + * verifys the signature packet. Note: not signature types are implemented + * @param {String|Object} data data which on the signature applies + * @param {module:packet/public_subkey|module:packet/public_key| + * module:packet/secret_subkey|module:packet/secret_key} key the public key to verify the signature + * @return {boolean} True if message is verified, else false. + */ +Signature.prototype.verify = function (key, data) { + var signatureType = _enums2.default.write(_enums2.default.signature, this.signatureType), + publicKeyAlgorithm = _enums2.default.write(_enums2.default.publicKey, this.publicKeyAlgorithm), + hashAlgorithm = _enums2.default.write(_enums2.default.hash, this.hashAlgorithm); + + var bytes = this.toSign(signatureType, data), + trailer = this.calculateTrailer(); + + var mpicount = 0; + // Algorithm-Specific Fields for RSA signatures: + // - multiprecision number (MPI) of RSA signature value m**d mod n. + if (publicKeyAlgorithm > 0 && publicKeyAlgorithm < 4) { + mpicount = 1; + } + // Algorithm-Specific Fields for DSA signatures: + // - MPI of DSA value r. + // - MPI of DSA value s. + else if (publicKeyAlgorithm === 17) { + mpicount = 2; + } + + var mpi = [], + i = 0; + for (var j = 0; j < mpicount; j++) { + mpi[j] = new _mpi2.default(); + i += mpi[j].read(this.signature.subarray(i, this.signature.length)); + } + + this.verified = _crypto2.default.signature.verify(publicKeyAlgorithm, hashAlgorithm, mpi, key.mpi, _util2.default.concatUint8Array([bytes, this.signatureData, trailer])); + + return this.verified; +}; + +/** + * Verifies signature expiration date + * @return {Boolean} true if expired + */ +Signature.prototype.isExpired = function () { + if (!this.signatureNeverExpires) { + return Date.now() > this.created.getTime() + this.signatureExpirationTime * 1000; + } + return false; +}; + +/** + * Fix custom types after cloning + */ +Signature.prototype.postCloneTypeFix = function () { + this.issuerKeyId = _keyid2.default.fromClone(this.issuerKeyId); +}; + +},{"../crypto":24,"../enums.js":35,"../type/keyid.js":67,"../type/mpi.js":68,"../util.js":70,"./packet.js":51}],59:[function(_dereq_,module,exports){ +// OpenPGP.js - An OpenPGP implementation in javascript +// Copyright (C) 2016 Tankred Hase +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Implementation of the Symmetrically Encrypted Authenticated Encryption with Additional Data (AEAD) Protected Data Packet + * {@link https://tools.ietf.org/html/draft-ford-openpgp-format-00#section-2.1}: AEAD Protected Data Packet + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = SymEncryptedAEADProtected; + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _crypto = _dereq_('../crypto'); + +var _crypto2 = _interopRequireDefault(_crypto); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var VERSION = 1; // A one-octet version number of the data packet. +var IV_LEN = _crypto2.default.gcm.ivLength; // currently only AES-GCM is supported + +/** + * @constructor + */ +function SymEncryptedAEADProtected() { + this.tag = _enums2.default.packet.symEncryptedAEADProtected; + this.version = VERSION; + this.iv = null; + this.encrypted = null; + this.packets = null; +} + +/** + * Parse an encrypted payload of bytes in the order: version, IV, ciphertext (see specification) + */ +SymEncryptedAEADProtected.prototype.read = function (bytes) { + var offset = 0; + if (bytes[offset] !== VERSION) { + // The only currently defined value is 1. + throw new Error('Invalid packet version.'); + } + offset++; + this.iv = bytes.subarray(offset, IV_LEN + offset); + offset += IV_LEN; + this.encrypted = bytes.subarray(offset, bytes.length); +}; + +/** + * Write the encrypted payload of bytes in the order: version, IV, ciphertext (see specification) + * @return {Uint8Array} The encrypted payload + */ +SymEncryptedAEADProtected.prototype.write = function () { + return _util2.default.concatUint8Array([new Uint8Array([this.version]), this.iv, this.encrypted]); +}; + +/** + * Decrypt the encrypted payload. + * @param {String} sessionKeyAlgorithm The session key's cipher algorithm e.g. 'aes128' + * @param {Uint8Array} key The session key used to encrypt the payload + * @return {Promise} Nothing is returned + */ +SymEncryptedAEADProtected.prototype.decrypt = function (sessionKeyAlgorithm, key) { + var _this = this; + + return _crypto2.default.gcm.decrypt(sessionKeyAlgorithm, this.encrypted, key, this.iv).then(function (decrypted) { + _this.packets.read(decrypted); + }); +}; + +/** + * Encrypt the packet list payload. + * @param {String} sessionKeyAlgorithm The session key's cipher algorithm e.g. 'aes128' + * @param {Uint8Array} key The session key used to encrypt the payload + * @return {Promise} Nothing is returned + */ +SymEncryptedAEADProtected.prototype.encrypt = function (sessionKeyAlgorithm, key) { + var _this2 = this; + + this.iv = _crypto2.default.random.getRandomValues(new Uint8Array(IV_LEN)); // generate new random IV + return _crypto2.default.gcm.encrypt(sessionKeyAlgorithm, this.packets.write(), key, this.iv).then(function (encrypted) { + _this2.encrypted = encrypted; + }); +}; + +},{"../crypto":24,"../enums.js":35,"../util.js":70}],60:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Implementation of the Sym. Encrypted Integrity Protected Data + * Packet (Tag 18)
+ *
+ * {@link http://tools.ietf.org/html/rfc4880#section-5.13|RFC4880 5.13}: + * The Symmetrically Encrypted Integrity Protected Data packet is + * a variant of the Symmetrically Encrypted Data packet. It is a new feature + * created for OpenPGP that addresses the problem of detecting a modification to + * encrypted data. It is used in combination with a Modification Detection Code + * packet. + * @requires crypto + * @requires util + * @requires enums + * @requires config + * @module packet/sym_encrypted_integrity_protected + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = SymEncryptedIntegrityProtected; + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _crypto = _dereq_('../crypto'); + +var _crypto2 = _interopRequireDefault(_crypto); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _asmcryptoLite = _dereq_('asmcrypto-lite'); + +var _asmcryptoLite2 = _interopRequireDefault(_asmcryptoLite); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var nodeCrypto = _util2.default.getNodeCrypto(); +var Buffer = _util2.default.getNodeBuffer(); + +var VERSION = 1; // A one-octet version number of the data packet. + +/** + * @constructor + */ +function SymEncryptedIntegrityProtected() { + this.tag = _enums2.default.packet.symEncryptedIntegrityProtected; + this.version = VERSION; + /** The encrypted payload. */ + this.encrypted = null; // string + /** + * If after decrypting the packet this is set to true, + * a modification has been detected and thus the contents + * should be discarded. + * @type {Boolean} + */ + this.modification = false; + this.packets = null; +} + +SymEncryptedIntegrityProtected.prototype.read = function (bytes) { + // - A one-octet version number. The only currently defined value is 1. + if (bytes[0] !== VERSION) { + throw new Error('Invalid packet version.'); + } + + // - Encrypted data, the output of the selected symmetric-key cipher + // operating in Cipher Feedback mode with shift amount equal to the + // block size of the cipher (CFB-n where n is the block size). + this.encrypted = bytes.subarray(1, bytes.length); +}; + +SymEncryptedIntegrityProtected.prototype.write = function () { + return _util2.default.concatUint8Array([new Uint8Array([VERSION]), this.encrypted]); +}; + +/** + * Encrypt the payload in the packet. + * @param {String} sessionKeyAlgorithm The selected symmetric encryption algorithm to be used e.g. 'aes128' + * @param {Uint8Array} key The key of cipher blocksize length to be used + * @return {Promise} + */ +SymEncryptedIntegrityProtected.prototype.encrypt = function (sessionKeyAlgorithm, key) { + var bytes = this.packets.write(); + var prefixrandom = _crypto2.default.getPrefixRandom(sessionKeyAlgorithm); + var repeat = new Uint8Array([prefixrandom[prefixrandom.length - 2], prefixrandom[prefixrandom.length - 1]]); + var prefix = _util2.default.concatUint8Array([prefixrandom, repeat]); + var mdc = new Uint8Array([0xD3, 0x14]); // modification detection code packet + + var tohash = _util2.default.concatUint8Array([bytes, mdc]); + var hash = _crypto2.default.hash.sha1(_util2.default.concatUint8Array([prefix, tohash])); + tohash = _util2.default.concatUint8Array([tohash, hash]); + + if (sessionKeyAlgorithm.substr(0, 3) === 'aes') { + // AES optimizations. Native code for node, asmCrypto for browser. + this.encrypted = aesEncrypt(sessionKeyAlgorithm, prefix, tohash, key); + } else { + this.encrypted = _crypto2.default.cfb.encrypt(prefixrandom, sessionKeyAlgorithm, tohash, key, false); + this.encrypted = this.encrypted.subarray(0, prefix.length + tohash.length); + } + + return Promise.resolve(); +}; + +/** + * Decrypts the encrypted data contained in the packet. + * @param {String} sessionKeyAlgorithm The selected symmetric encryption algorithm to be used e.g. 'aes128' + * @param {Uint8Array} key The key of cipher blocksize length to be used + * @return {Promise} + */ +SymEncryptedIntegrityProtected.prototype.decrypt = function (sessionKeyAlgorithm, key) { + var decrypted = void 0; + if (sessionKeyAlgorithm.substr(0, 3) === 'aes') { + // AES optimizations. Native code for node, asmCrypto for browser. + decrypted = aesDecrypt(sessionKeyAlgorithm, this.encrypted, key); + } else { + decrypted = _crypto2.default.cfb.decrypt(sessionKeyAlgorithm, key, this.encrypted, false); + } + + // there must be a modification detection code packet as the + // last packet and everything gets hashed except the hash itself + var prefix = _crypto2.default.cfb.mdc(sessionKeyAlgorithm, key, this.encrypted); + var bytes = decrypted.subarray(0, decrypted.length - 20); + var tohash = _util2.default.concatUint8Array([prefix, bytes]); + this.hash = _util2.default.Uint8Array2str(_crypto2.default.hash.sha1(tohash)); + var mdc = _util2.default.Uint8Array2str(decrypted.subarray(decrypted.length - 20, decrypted.length)); + + if (this.hash !== mdc) { + throw new Error('Modification detected.'); + } else { + this.packets.read(decrypted.subarray(0, decrypted.length - 22)); + } + + return Promise.resolve(); +}; + +////////////////////////// +// // +// Helper functions // +// // +////////////////////////// + + +function aesEncrypt(algo, prefix, pt, key) { + if (nodeCrypto) { + // Node crypto library. + return nodeEncrypt(algo, prefix, pt, key); + } else { + // asm.js fallback + return _asmcryptoLite2.default.AES_CFB.encrypt(_util2.default.concatUint8Array([prefix, pt]), key); + } +} + +function aesDecrypt(algo, ct, key) { + var pt = void 0; + if (nodeCrypto) { + // Node crypto library. + pt = nodeDecrypt(algo, ct, key); + } else { + // asm.js fallback + pt = _asmcryptoLite2.default.AES_CFB.decrypt(ct, key); + } + return pt.subarray(_crypto2.default.cipher[algo].blockSize + 2, pt.length); // Remove random prefix +} + +function nodeEncrypt(algo, prefix, pt, key) { + key = new Buffer(key); + var iv = new Buffer(new Uint8Array(_crypto2.default.cipher[algo].blockSize)); + var cipherObj = new nodeCrypto.createCipheriv('aes-' + algo.substr(3, 3) + '-cfb', key, iv); + var ct = cipherObj.update(new Buffer(_util2.default.concatUint8Array([prefix, pt]))); + return new Uint8Array(ct); +} + +function nodeDecrypt(algo, ct, key) { + ct = new Buffer(ct); + key = new Buffer(key); + var iv = new Buffer(new Uint8Array(_crypto2.default.cipher[algo].blockSize)); + var decipherObj = new nodeCrypto.createDecipheriv('aes-' + algo.substr(3, 3) + '-cfb', key, iv); + var pt = decipherObj.update(ct); + return new Uint8Array(pt); +} + +},{"../crypto":24,"../enums.js":35,"../util.js":70,"asmcrypto-lite":1}],61:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Public-Key Encrypted Session Key Packets (Tag 1)
+ *
+ * {@link http://tools.ietf.org/html/rfc4880#section-5.1|RFC4880 5.1}: A Public-Key Encrypted Session Key packet holds the session key + * used to encrypt a message. Zero or more Public-Key Encrypted Session Key + * packets and/or Symmetric-Key Encrypted Session Key packets may precede a + * Symmetrically Encrypted Data Packet, which holds an encrypted message. The + * message is encrypted with the session key, and the session key is itself + * encrypted and stored in the Encrypted Session Key packet(s). The + * Symmetrically Encrypted Data Packet is preceded by one Public-Key Encrypted + * Session Key packet for each OpenPGP key to which the message is encrypted. + * The recipient of the message finds a session key that is encrypted to their + * public key, decrypts the session key, and then uses the session key to + * decrypt the message. + * @requires util + * @requires crypto + * @requires enums + * @requires type/s2k + * @module packet/sym_encrypted_session_key + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = SymEncryptedSessionKey; + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _s2k = _dereq_('../type/s2k.js'); + +var _s2k2 = _interopRequireDefault(_s2k); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _crypto = _dereq_('../crypto'); + +var _crypto2 = _interopRequireDefault(_crypto); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function SymEncryptedSessionKey() { + this.tag = _enums2.default.packet.symEncryptedSessionKey; + this.version = 4; + this.sessionKey = null; + this.sessionKeyEncryptionAlgorithm = null; + this.sessionKeyAlgorithm = 'aes256'; + this.encrypted = null; + this.s2k = new _s2k2.default(); +} + +/** + * Parsing function for a symmetric encrypted session key packet (tag 3). + * + * @param {Uint8Array} input Payload of a tag 1 packet + * @param {Integer} position Position to start reading from the input string + * @param {Integer} len + * Length of the packet or the remaining length of + * input at position + * @return {module:packet/sym_encrypted_session_key} Object representation + */ +SymEncryptedSessionKey.prototype.read = function (bytes) { + // A one-octet version number. The only currently defined version is 4. + this.version = bytes[0]; + + // A one-octet number describing the symmetric algorithm used. + var algo = _enums2.default.read(_enums2.default.symmetric, bytes[1]); + + // A string-to-key (S2K) specifier, length as defined above. + var s2klength = this.s2k.read(bytes.subarray(2, bytes.length)); + + // Optionally, the encrypted session key itself, which is decrypted + // with the string-to-key object. + var done = s2klength + 2; + + if (done < bytes.length) { + this.encrypted = bytes.subarray(done, bytes.length); + this.sessionKeyEncryptionAlgorithm = algo; + } else { + this.sessionKeyAlgorithm = algo; + } +}; + +SymEncryptedSessionKey.prototype.write = function () { + var algo = this.encrypted === null ? this.sessionKeyAlgorithm : this.sessionKeyEncryptionAlgorithm; + + var bytes = _util2.default.concatUint8Array([new Uint8Array([this.version, _enums2.default.write(_enums2.default.symmetric, algo)]), this.s2k.write()]); + + if (this.encrypted !== null) { + bytes = _util2.default.concatUint8Array([bytes, this.encrypted]); + } + return bytes; +}; + +/** + * Decrypts the session key (only for public key encrypted session key + * packets (tag 1) + * + * @return {Uint8Array} The unencrypted session key + */ +SymEncryptedSessionKey.prototype.decrypt = function (passphrase) { + var algo = this.sessionKeyEncryptionAlgorithm !== null ? this.sessionKeyEncryptionAlgorithm : this.sessionKeyAlgorithm; + + var length = _crypto2.default.cipher[algo].keySize; + var key = this.s2k.produce_key(passphrase, length); + + if (this.encrypted === null) { + this.sessionKey = key; + } else { + var decrypted = _crypto2.default.cfb.normalDecrypt(algo, key, this.encrypted, null); + + this.sessionKeyAlgorithm = _enums2.default.read(_enums2.default.symmetric, decrypted[0]); + + this.sessionKey = decrypted.subarray(1, decrypted.length); + } +}; + +SymEncryptedSessionKey.prototype.encrypt = function (passphrase) { + var algo = this.sessionKeyEncryptionAlgorithm !== null ? this.sessionKeyEncryptionAlgorithm : this.sessionKeyAlgorithm; + + this.sessionKeyEncryptionAlgorithm = algo; + + var length = _crypto2.default.cipher[algo].keySize; + var key = this.s2k.produce_key(passphrase, length); + + var algo_enum = new Uint8Array([_enums2.default.write(_enums2.default.symmetric, this.sessionKeyAlgorithm)]); + + var private_key; + if (this.sessionKey === null) { + this.sessionKey = _crypto2.default.getRandomBytes(_crypto2.default.cipher[this.sessionKeyAlgorithm].keySize); + } + private_key = _util2.default.concatUint8Array([algo_enum, this.sessionKey]); + + this.encrypted = _crypto2.default.cfb.normalEncrypt(algo, key, private_key, null); +}; + +/** + * Fix custom types after cloning + */ +SymEncryptedSessionKey.prototype.postCloneTypeFix = function () { + this.s2k = _s2k2.default.fromClone(this.s2k); +}; + +},{"../crypto":24,"../enums.js":35,"../type/s2k.js":69,"../util.js":70}],62:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Implementation of the Symmetrically Encrypted Data Packet (Tag 9)
+ *
+ * {@link http://tools.ietf.org/html/rfc4880#section-5.7|RFC4880 5.7}: The Symmetrically Encrypted Data packet contains data encrypted + * with a symmetric-key algorithm. When it has been decrypted, it contains other + * packets (usually a literal data packet or compressed data packet, but in + * theory other Symmetrically Encrypted Data packets or sequences of packets + * that form whole OpenPGP messages). + * @requires crypto + * @requires enums + * @module packet/symmetrically_encrypted + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = SymmetricallyEncrypted; + +var _crypto = _dereq_('../crypto'); + +var _crypto2 = _interopRequireDefault(_crypto); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _config = _dereq_('../config'); + +var _config2 = _interopRequireDefault(_config); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function SymmetricallyEncrypted() { + this.tag = _enums2.default.packet.symmetricallyEncrypted; + this.encrypted = null; + /** Decrypted packets contained within. + * @type {module:packet/packetlist} */ + this.packets = null; + this.ignore_mdc_error = _config2.default.ignore_mdc_error; +} + +SymmetricallyEncrypted.prototype.read = function (bytes) { + this.encrypted = bytes; +}; + +SymmetricallyEncrypted.prototype.write = function () { + return this.encrypted; +}; + +/** + * Symmetrically decrypt the packet data + * + * @param {module:enums.symmetric} sessionKeyAlgorithm + * Symmetric key algorithm to use // See {@link http://tools.ietf.org/html/rfc4880#section-9.2|RFC4880 9.2} + * @param {String} key + * Key as string with the corresponding length to the + * algorithm + */ +SymmetricallyEncrypted.prototype.decrypt = function (sessionKeyAlgorithm, key) { + var decrypted = _crypto2.default.cfb.decrypt(sessionKeyAlgorithm, key, this.encrypted, true); + // for modern cipher (blocklength != 64 bit, except for Twofish) MDC is required + if (!this.ignore_mdc_error && (sessionKeyAlgorithm === 'aes128' || sessionKeyAlgorithm === 'aes192' || sessionKeyAlgorithm === 'aes256')) { + throw new Error('Decryption failed due to missing MDC in combination with modern cipher.'); + } + this.packets.read(decrypted); + + return Promise.resolve(); +}; + +SymmetricallyEncrypted.prototype.encrypt = function (algo, key) { + var data = this.packets.write(); + + this.encrypted = _crypto2.default.cfb.encrypt(_crypto2.default.getPrefixRandom(algo), algo, data, key, true); + + return Promise.resolve(); +}; + +},{"../config":10,"../crypto":24,"../enums.js":35}],63:[function(_dereq_,module,exports){ +/** + * @requires enums + * @module packet/trust + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = Trust; + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function Trust() { + this.tag = _enums2.default.packet.trust; +} + +/** + * Parsing function for a trust packet (tag 12). + * Currently empty as we ignore trust packets + * @param {String} byptes payload of a tag 12 packet + */ +Trust.prototype.read = function () {}; + +},{"../enums.js":35}],64:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Implementation of the User Attribute Packet (Tag 17)
+ *
+ * The User Attribute packet is a variation of the User ID packet. It + * is capable of storing more types of data than the User ID packet, + * which is limited to text. Like the User ID packet, a User Attribute + * packet may be certified by the key owner ("self-signed") or any other + * key owner who cares to certify it. Except as noted, a User Attribute + * packet may be used anywhere that a User ID packet may be used. + *
+ * While User Attribute packets are not a required part of the OpenPGP + * standard, implementations SHOULD provide at least enough + * compatibility to properly handle a certification signature on the + * User Attribute packet. A simple way to do this is by treating the + * User Attribute packet as a User ID packet with opaque contents, but + * an implementation may use any method desired. + * module packet/user_attribute + * @requires enums + * @module packet/user_attribute + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = UserAttribute; + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _packet = _dereq_('./packet.js'); + +var _packet2 = _interopRequireDefault(_packet); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function UserAttribute() { + this.tag = _enums2.default.packet.userAttribute; + this.attributes = []; +} + +/** + * parsing function for a user attribute packet (tag 17). + * @param {Uint8Array} input payload of a tag 17 packet + */ +UserAttribute.prototype.read = function (bytes) { + var i = 0; + while (i < bytes.length) { + var len = _packet2.default.readSimpleLength(bytes.subarray(i, bytes.length)); + i += len.offset; + + this.attributes.push(_util2.default.Uint8Array2str(bytes.subarray(i, i + len.len))); + i += len.len; + } +}; + +/** + * Creates a binary representation of the user attribute packet + * @return {Uint8Array} string representation + */ +UserAttribute.prototype.write = function () { + var arr = []; + for (var i = 0; i < this.attributes.length; i++) { + arr.push(_packet2.default.writeSimpleLength(this.attributes[i].length)); + arr.push(_util2.default.str2Uint8Array(this.attributes[i])); + } + return _util2.default.concatUint8Array(arr); +}; + +/** + * Compare for equality + * @param {module:user_attribute~UserAttribute} usrAttr + * @return {Boolean} true if equal + */ +UserAttribute.prototype.equals = function (usrAttr) { + if (!usrAttr || !(usrAttr instanceof UserAttribute)) { + return false; + } + return this.attributes.every(function (attr, index) { + return attr === usrAttr.attributes[index]; + }); +}; + +},{"../enums.js":35,"../util.js":70,"./packet.js":51}],65:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Implementation of the User ID Packet (Tag 13)
+ *
+ * A User ID packet consists of UTF-8 text that is intended to represent + * the name and email address of the key holder. By convention, it + * includes an RFC 2822 [RFC2822] mail name-addr, but there are no + * restrictions on its content. The packet length in the header + * specifies the length of the User ID. + * @requires util + * @requires enums + * @module packet/userid + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = Userid; + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function Userid() { + this.tag = _enums2.default.packet.userid; + /** A string containing the user id. Usually in the form + * John Doe + * @type {String} + */ + this.userid = ''; +} + +/** + * Parsing function for a user id packet (tag 13). + * @param {Uint8Array} input payload of a tag 13 packet + */ +Userid.prototype.read = function (bytes) { + this.userid = _util2.default.decode_utf8(_util2.default.Uint8Array2str(bytes)); +}; + +/** + * Creates a binary representation of the user id packet + * @return {Uint8Array} binary representation + */ +Userid.prototype.write = function () { + return _util2.default.str2Uint8Array(_util2.default.encode_utf8(this.userid)); +}; + +},{"../enums.js":35,"../util.js":70}],66:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @requires config + * @requires crypto + * @requires encoding/armor + * @requires enums + * @requires packet + * @module signature + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Signature = Signature; +exports.readArmored = readArmored; +exports.read = read; + +var _packet = _dereq_('./packet'); + +var _packet2 = _interopRequireDefault(_packet); + +var _enums = _dereq_('./enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _armor = _dereq_('./encoding/armor.js'); + +var _armor2 = _interopRequireDefault(_armor); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @class + * @classdesc Class that represents an OpenPGP signature. + * @param {module:packet/packetlist} packetlist The signature packets + */ + +function Signature(packetlist) { + if (!(this instanceof Signature)) { + return new Signature(packetlist); + } + this.packets = packetlist || new _packet2.default.List(); +} + +/** + * Returns ASCII armored text of signature + * @return {String} ASCII armor + */ +Signature.prototype.armor = function () { + return _armor2.default.encode(_enums2.default.armor.signature, this.packets.write()); +}; + +/** + * reads an OpenPGP armored signature and returns a signature object + * @param {String} armoredText text to be parsed + * @return {Signature} new signature object + * @static + */ +function readArmored(armoredText) { + var input = _armor2.default.decode(armoredText).data; + return read(input); +} + +/** + * reads an OpenPGP signature as byte array and returns a signature object + * @param {Uint8Array} input binary signature + * @return {Signature} new signature object + * @static + */ +function read(input) { + var packetlist = new _packet2.default.List(); + packetlist.read(input); + return new Signature(packetlist); +} + +},{"./encoding/armor.js":33,"./enums.js":35,"./packet":47}],67:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Implementation of type key id ({@link http://tools.ietf.org/html/rfc4880#section-3.3|RFC4880 3.3})
+ *
+ * A Key ID is an eight-octet scalar that identifies a key. + * Implementations SHOULD NOT assume that Key IDs are unique. The + * section "Enhanced Key Formats" below describes how Key IDs are + * formed. + * @requires util + * @module type/keyid + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = Keyid; + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function Keyid() { + this.bytes = ''; +} + +/** + * Parsing method for a key id + * @param {Uint8Array} input Input to read the key id from + */ +Keyid.prototype.read = function (bytes) { + this.bytes = _util2.default.Uint8Array2str(bytes.subarray(0, 8)); +}; + +Keyid.prototype.write = function () { + return _util2.default.str2Uint8Array(this.bytes); +}; + +Keyid.prototype.toHex = function () { + return _util2.default.hexstrdump(this.bytes); +}; + +Keyid.prototype.equals = function (keyid) { + return this.bytes === keyid.bytes; +}; + +Keyid.prototype.isNull = function () { + return this.bytes === ''; +}; + +Keyid.mapToHex = function (keyId) { + return keyId.toHex(); +}; + +Keyid.fromClone = function (clone) { + var keyid = new Keyid(); + keyid.bytes = clone.bytes; + return keyid; +}; + +Keyid.fromId = function (hex) { + var keyid = new Keyid(); + keyid.read(_util2.default.str2Uint8Array(_util2.default.hex2bin(hex))); + return keyid; +}; + +},{"../util.js":70}],68:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +// Hint: We hold our MPIs as an array of octets in big endian format preceeding a two +// octet scalar: MPI: [a,b,c,d,e,f] +// - MPI size: (a << 8) | b +// - MPI = c | d << 8 | e << ((MPI.length -2)*8) | f ((MPI.length -2)*8) + +/** + * Implementation of type MPI ({@link http://tools.ietf.org/html/rfc4880#section-3.2|RFC4880 3.2})
+ *
+ * Multiprecision integers (also called MPIs) are unsigned integers used + * to hold large integers such as the ones used in cryptographic + * calculations. + * An MPI consists of two pieces: a two-octet scalar that is the length + * of the MPI in bits followed by a string of octets that contain the + * actual integer. + * @requires crypto/public_key/jsbn + * @requires util + * @module type/mpi + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = MPI; + +var _jsbn = _dereq_('../crypto/public_key/jsbn.js'); + +var _jsbn2 = _interopRequireDefault(_jsbn); + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function MPI() { + /** An implementation dependent integer */ + this.data = null; +} + +/** + * Parsing function for a mpi ({@link http://tools.ietf.org/html/rfc4880#section3.2|RFC 4880 3.2}). + * @param {String} input Payload of mpi data + * @return {Integer} Length of data read + */ +MPI.prototype.read = function (bytes) { + + if (typeof bytes === 'string' || String.prototype.isPrototypeOf(bytes)) { + bytes = _util2.default.str2Uint8Array(bytes); + } + + var bits = bytes[0] << 8 | bytes[1]; + + // Additional rules: + // + // The size of an MPI is ((MPI.length + 7) / 8) + 2 octets. + // + // The length field of an MPI describes the length starting from its + // most significant non-zero bit. Thus, the MPI [00 02 01] is not + // formed correctly. It should be [00 01 01]. + + // TODO: Verification of this size method! This size calculation as + // specified above is not applicable in JavaScript + var bytelen = Math.ceil(bits / 8); + + var raw = _util2.default.Uint8Array2str(bytes.subarray(2, 2 + bytelen)); + this.fromBytes(raw); + + return 2 + bytelen; +}; + +MPI.prototype.fromBytes = function (bytes) { + this.data = new _jsbn2.default(_util2.default.hexstrdump(bytes), 16); +}; + +MPI.prototype.toBytes = function () { + var bytes = _util2.default.Uint8Array2str(this.write()); + return bytes.substr(2); +}; + +MPI.prototype.byteLength = function () { + return this.toBytes().length; +}; + +/** + * Converts the mpi object to a bytes as specified in {@link http://tools.ietf.org/html/rfc4880#section-3.2|RFC4880 3.2} + * @return {Uint8Aray} mpi Byte representation + */ +MPI.prototype.write = function () { + return _util2.default.str2Uint8Array(this.data.toMPI()); +}; + +MPI.prototype.toBigInteger = function () { + return this.data.clone(); +}; + +MPI.prototype.fromBigInteger = function (bn) { + this.data = bn.clone(); +}; + +MPI.fromClone = function (clone) { + clone.data.copyTo = _jsbn2.default.prototype.copyTo; + var bn = new _jsbn2.default(); + clone.data.copyTo(bn); + var mpi = new MPI(); + mpi.data = bn; + return mpi; +}; + +},{"../crypto/public_key/jsbn.js":29,"../util.js":70}],69:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Implementation of the String-to-key specifier ({@link http://tools.ietf.org/html/rfc4880#section-3.7|RFC4880 3.7})
+ *
+ * String-to-key (S2K) specifiers are used to convert passphrase strings + * into symmetric-key encryption/decryption keys. They are used in two + * places, currently: to encrypt the secret part of private keys in the + * private keyring, and to convert passphrases to encryption keys for + * symmetrically encrypted messages. + * @requires crypto + * @requires enums + * @requires util + * @module type/s2k + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = S2K; + +var _enums = _dereq_('../enums.js'); + +var _enums2 = _interopRequireDefault(_enums); + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _crypto = _dereq_('../crypto'); + +var _crypto2 = _interopRequireDefault(_crypto); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @constructor + */ +function S2K() { + /** @type {module:enums.hash} */ + this.algorithm = 'sha256'; + /** @type {module:enums.s2k} */ + this.type = 'iterated'; + this.c = 96; + /** Eight bytes of salt in a binary string. + * @type {String} + */ + this.salt = _crypto2.default.random.getRandomBytes(8); +} + +S2K.prototype.get_count = function () { + // Exponent bias, defined in RFC4880 + var expbias = 6; + + return 16 + (this.c & 15) << (this.c >> 4) + expbias; +}; + +/** + * Parsing function for a string-to-key specifier ({@link http://tools.ietf.org/html/rfc4880#section-3.7|RFC 4880 3.7}). + * @param {String} input Payload of string-to-key specifier + * @return {Integer} Actual length of the object + */ +S2K.prototype.read = function (bytes) { + var i = 0; + this.type = _enums2.default.read(_enums2.default.s2k, bytes[i++]); + this.algorithm = _enums2.default.read(_enums2.default.hash, bytes[i++]); + + switch (this.type) { + case 'simple': + break; + + case 'salted': + this.salt = bytes.subarray(i, i + 8); + i += 8; + break; + + case 'iterated': + this.salt = bytes.subarray(i, i + 8); + i += 8; + + // Octet 10: count, a one-octet, coded value + this.c = bytes[i++]; + break; + + case 'gnu': + if (_util2.default.Uint8Array2str(bytes.subarray(i, 3)) === "GNU") { + i += 3; // GNU + var gnuExtType = 1000 + bytes[i++]; + if (gnuExtType === 1001) { + this.type = gnuExtType; + // GnuPG extension mode 1001 -- don't write secret key at all + } else { + throw new Error("Unknown s2k gnu protection mode."); + } + } else { + throw new Error("Unknown s2k type."); + } + break; + + default: + throw new Error("Unknown s2k type."); + } + + return i; +}; + +/** + * Serializes s2k information + * @return {Uint8Array} binary representation of s2k + */ +S2K.prototype.write = function () { + + var arr = [new Uint8Array([_enums2.default.write(_enums2.default.s2k, this.type), _enums2.default.write(_enums2.default.hash, this.algorithm)])]; + + switch (this.type) { + case 'simple': + break; + case 'salted': + arr.push(this.salt); + break; + case 'iterated': + arr.push(this.salt); + arr.push(new Uint8Array([this.c])); + break; + case 'gnu': + throw new Error("GNU s2k type not supported."); + default: + throw new Error("Unknown s2k type."); + } + + return _util2.default.concatUint8Array(arr); +}; + +/** + * Produces a key using the specified passphrase and the defined + * hashAlgorithm + * @param {String} passphrase Passphrase containing user input + * @return {Uint8Array} Produced key with a length corresponding to + * hashAlgorithm hash length + */ +S2K.prototype.produce_key = function (passphrase, numBytes) { + passphrase = _util2.default.str2Uint8Array(_util2.default.encode_utf8(passphrase)); + + function round(prefix, s2k) { + var algorithm = _enums2.default.write(_enums2.default.hash, s2k.algorithm); + + switch (s2k.type) { + case 'simple': + return _crypto2.default.hash.digest(algorithm, _util2.default.concatUint8Array([prefix, passphrase])); + + case 'salted': + return _crypto2.default.hash.digest(algorithm, _util2.default.concatUint8Array([prefix, s2k.salt, passphrase])); + + case 'iterated': + var isp = [], + count = s2k.get_count(), + data = _util2.default.concatUint8Array([s2k.salt, passphrase]); + + while (isp.length * data.length < count) { + isp.push(data); + } + + isp = _util2.default.concatUint8Array(isp); + + if (isp.length > count) { + isp = isp.subarray(0, count); + } + + return _crypto2.default.hash.digest(algorithm, _util2.default.concatUint8Array([prefix, isp])); + + case 'gnu': + throw new Error("GNU s2k type not supported."); + + default: + throw new Error("Unknown s2k type."); + } + } + + var arr = [], + rlength = 0, + prefix = new Uint8Array(numBytes); + + for (var i = 0; i < numBytes; i++) { + prefix[i] = 0; + } + i = 0; + + while (rlength < numBytes) { + var result = round(prefix.subarray(0, i), this); + arr.push(result); + rlength += result.length; + i++; + } + + return _util2.default.concatUint8Array(arr).subarray(0, numBytes); +}; + +S2K.fromClone = function (clone) { + var s2k = new S2K(); + s2k.algorithm = clone.algorithm; + s2k.type = clone.type; + s2k.c = clone.c; + s2k.salt = clone.salt; + return s2k; +}; + +},{"../crypto":24,"../enums.js":35,"../util.js":70}],70:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * This object contains utility functions + * @requires config + * @module util + */ + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _config = _dereq_('./config'); + +var _config2 = _interopRequireDefault(_config); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = { + + isString: function isString(data) { + return typeof data === 'string' || String.prototype.isPrototypeOf(data); + }, + + isArray: function isArray(data) { + return Array.prototype.isPrototypeOf(data); + }, + + isUint8Array: function isUint8Array(data) { + return Uint8Array.prototype.isPrototypeOf(data); + }, + + isEmailAddress: function isEmailAddress(data) { + if (!this.isString(data)) { + return false; + } + var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(data); + }, + + isUserId: function isUserId(data) { + if (!this.isString(data)) { + return false; + } + return (/$/.test(data) + ); + }, + + /** + * Get transferable objects to pass buffers with zero copy (similar to "pass by reference" in C++) + * See: https://developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage + * @param {Object} obj the options object to be passed to the web worker + * @return {Array} an array of binary data to be passed + */ + getTransferables: function getTransferables(obj) { + if (_config2.default.zero_copy && Object.prototype.isPrototypeOf(obj)) { + var transferables = []; + this.collectBuffers(obj, transferables); + return transferables.length ? transferables : undefined; + } + }, + + collectBuffers: function collectBuffers(obj, collection) { + if (!obj) { + return; + } + if (this.isUint8Array(obj) && collection.indexOf(obj.buffer) === -1) { + collection.push(obj.buffer); + return; + } + if (Object.prototype.isPrototypeOf(obj)) { + for (var key in obj) { + // recursively search all children + this.collectBuffers(obj[key], collection); + } + } + }, + + readNumber: function readNumber(bytes) { + var n = 0; + for (var i = 0; i < bytes.length; i++) { + n += Math.pow(256, i) * bytes[bytes.length - 1 - i]; + } + return n; + }, + + writeNumber: function writeNumber(n, bytes) { + var b = new Uint8Array(bytes); + for (var i = 0; i < bytes; i++) { + b[i] = n >> 8 * (bytes - i - 1) & 0xFF; + } + + return b; + }, + + readDate: function readDate(bytes) { + var n = this.readNumber(bytes); + var d = new Date(); + d.setTime(n * 1000); + return d; + }, + + writeDate: function writeDate(time) { + var numeric = Math.round(time.getTime() / 1000); + + return this.writeNumber(numeric, 4); + }, + + hexdump: function hexdump(str) { + var r = []; + var e = str.length; + var c = 0; + var h; + var i = 0; + while (c < e) { + h = str.charCodeAt(c++).toString(16); + while (h.length < 2) { + h = "0" + h; + } + r.push(" " + h); + i++; + if (i % 32 === 0) { + r.push("\n "); + } + } + return r.join(''); + }, + + /** + * Create hexstring from a binary + * @param {String} str String to convert + * @return {String} String containing the hexadecimal values + */ + hexstrdump: function hexstrdump(str) { + if (str === null) { + return ""; + } + var r = []; + var e = str.length; + var c = 0; + var h; + while (c < e) { + h = str.charCodeAt(c++).toString(16); + while (h.length < 2) { + h = "0" + h; + } + r.push("" + h); + } + return r.join(''); + }, + + /** + * Create binary string from a hex encoded string + * @param {String} str Hex string to convert + * @return {String} String containing the binary values + */ + hex2bin: function hex2bin(hex) { + var str = ''; + for (var i = 0; i < hex.length; i += 2) { + str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); + } + return str; + }, + + /** + * Creating a hex string from an binary array of integers (0..255) + * @param {String} str Array of bytes to convert + * @return {String} Hexadecimal representation of the array + */ + hexidump: function hexidump(str) { + var r = []; + var e = str.length; + var c = 0; + var h; + while (c < e) { + h = str[c++].toString(16); + while (h.length < 2) { + h = "0" + h; + } + r.push("" + h); + } + return r.join(''); + }, + + /** + * Convert a native javascript string to a string of utf8 bytes + * @param {String} str The string to convert + * @return {String} A valid squence of utf8 bytes + */ + encode_utf8: function encode_utf8(str) { + return unescape(encodeURIComponent(str)); + }, + + /** + * Convert a string of utf8 bytes to a native javascript string + * @param {String} utf8 A valid squence of utf8 bytes + * @return {String} A native javascript string + */ + decode_utf8: function decode_utf8(utf8) { + if (typeof utf8 !== 'string') { + throw new Error('Parameter "utf8" is not of type string'); + } + try { + return decodeURIComponent(escape(utf8)); + } catch (e) { + return utf8; + } + }, + + /** + * Convert an array of integers(0.255) to a string + * @param {Array} bin An array of (binary) integers to convert + * @return {String} The string representation of the array + */ + bin2str: function bin2str(bin) { + var result = []; + for (var i = 0; i < bin.length; i++) { + result[i] = String.fromCharCode(bin[i]); + } + return result.join(''); + }, + + /** + * Convert a string to an array of integers(0.255) + * @param {String} str String to convert + * @return {Array} An array of (binary) integers + */ + str2bin: function str2bin(str) { + var result = []; + for (var i = 0; i < str.length; i++) { + result[i] = str.charCodeAt(i); + } + return result; + }, + + /** + * Convert a string to a Uint8Array + * @param {String} str String to convert + * @return {Uint8Array} The array of (binary) integers + */ + str2Uint8Array: function str2Uint8Array(str) { + if (typeof str !== 'string' && !String.prototype.isPrototypeOf(str)) { + throw new Error('str2Uint8Array: Data must be in the form of a string'); + } + + var result = new Uint8Array(str.length); + for (var i = 0; i < str.length; i++) { + result[i] = str.charCodeAt(i); + } + return result; + }, + + /** + * Convert a Uint8Array to a string. This currently functions + * the same as bin2str. + * @function module:util.Uint8Array2str + * @param {Uint8Array} bin An array of (binary) integers to convert + * @return {String} String representation of the array + */ + Uint8Array2str: function Uint8Array2str(bin) { + if (!Uint8Array.prototype.isPrototypeOf(bin)) { + throw new Error('Uint8Array2str: Data must be in the form of a Uint8Array'); + } + + var result = [], + bs = 16384, + j = bin.length; + + for (var i = 0; i < j; i += bs) { + result.push(String.fromCharCode.apply(String, bin.subarray(i, i + bs < j ? i + bs : j))); + } + return result.join(''); + }, + + /** + * Concat Uint8arrays + * @function module:util.concatUint8Array + * @param {Array} Array of Uint8Arrays to concatenate + * @return {Uint8array} Concatenated array + */ + concatUint8Array: function concatUint8Array(arrays) { + var totalLength = 0; + arrays.forEach(function (element) { + if (!Uint8Array.prototype.isPrototypeOf(element)) { + throw new Error('concatUint8Array: Data must be in the form of a Uint8Array'); + } + + totalLength += element.length; + }); + + var result = new Uint8Array(totalLength); + var pos = 0; + arrays.forEach(function (element) { + result.set(element, pos); + pos += element.length; + }); + + return result; + }, + + /** + * Deep copy Uint8Array + * @function module:util.copyUint8Array + * @param {Uint8Array} Array to copy + * @return {Uint8Array} new Uint8Array + */ + copyUint8Array: function copyUint8Array(array) { + if (!Uint8Array.prototype.isPrototypeOf(array)) { + throw new Error('Data must be in the form of a Uint8Array'); + } + + var copy = new Uint8Array(array.length); + copy.set(array); + return copy; + }, + + /** + * Check Uint8Array equality + * @function module:util.equalsUint8Array + * @param {Uint8Array} first array + * @param {Uint8Array} second array + * @return {Boolean} equality + */ + equalsUint8Array: function equalsUint8Array(array1, array2) { + if (!Uint8Array.prototype.isPrototypeOf(array1) || !Uint8Array.prototype.isPrototypeOf(array2)) { + throw new Error('Data must be in the form of a Uint8Array'); + } + + if (array1.length !== array2.length) { + return false; + } + + for (var i = 0; i < array1.length; i++) { + if (array1[i] !== array2[i]) { + return false; + } + } + return true; + }, + + /** + * Calculates a 16bit sum of a Uint8Array by adding each character + * codes modulus 65535 + * @param {Uint8Array} Uint8Array to create a sum of + * @return {Integer} An integer containing the sum of all character + * codes % 65535 + */ + calc_checksum: function calc_checksum(text) { + var checksum = { + s: 0, + add: function add(sadd) { + this.s = (this.s + sadd) % 65536; + } + }; + for (var i = 0; i < text.length; i++) { + checksum.add(text[i]); + } + return checksum.s; + }, + + /** + * Helper function to print a debug message. Debug + * messages are only printed if + * @link module:config/config.debug is set to true. + * @param {String} str String of the debug message + */ + print_debug: function print_debug(str) { + if (_config2.default.debug) { + console.log(str); + } + }, + + /** + * Helper function to print a debug message. Debug + * messages are only printed if + * @link module:config/config.debug is set to true. + * Different than print_debug because will call hexstrdump iff necessary. + * @param {String} str String of the debug message + */ + print_debug_hexstr_dump: function print_debug_hexstr_dump(str, strToHex) { + if (_config2.default.debug) { + str = str + this.hexstrdump(strToHex); + console.log(str); + } + }, + + getLeftNBits: function getLeftNBits(string, bitcount) { + var rest = bitcount % 8; + if (rest === 0) { + return string.substring(0, bitcount / 8); + } + var bytes = (bitcount - rest) / 8 + 1; + var result = string.substring(0, bytes); + return this.shiftRight(result, 8 - rest); // +String.fromCharCode(string.charCodeAt(bytes -1) << (8-rest) & 0xFF); + }, + + /** + * Shifting a string to n bits right + * @param {String} value The string to shift + * @param {Integer} bitcount Amount of bits to shift (MUST be smaller + * than 9) + * @return {String} Resulting string. + */ + shiftRight: function shiftRight(value, bitcount) { + var temp = this.str2bin(value); + if (bitcount % 8 !== 0) { + for (var i = temp.length - 1; i >= 0; i--) { + temp[i] >>= bitcount % 8; + if (i > 0) { + temp[i] |= temp[i - 1] << 8 - bitcount % 8 & 0xFF; + } + } + } else { + return value; + } + return this.bin2str(temp); + }, + + /** + * Return the algorithm type as string + * @return {String} String representing the message type + */ + get_hashAlgorithmString: function get_hashAlgorithmString(algo) { + switch (algo) { + case 1: + return "MD5"; + case 2: + return "SHA1"; + case 3: + return "RIPEMD160"; + case 8: + return "SHA256"; + case 9: + return "SHA384"; + case 10: + return "SHA512"; + case 11: + return "SHA224"; + } + return "unknown"; + }, + + /** + * Get native Web Cryptography api, only the current version of the spec. + * The default configuration is to use the api when available. But it can + * be deactivated with config.use_native + * @return {Object} The SubtleCrypto api or 'undefined' + */ + getWebCrypto: function getWebCrypto() { + if (!_config2.default.use_native) { + return; + } + + return typeof window !== 'undefined' && window.crypto && window.crypto.subtle; + }, + + /** + * Get native Web Cryptography api for all browsers, including legacy + * implementations of the spec e.g IE11 and Safari 8/9. The default + * configuration is to use the api when available. But it can be deactivated + * with config.use_native + * @return {Object} The SubtleCrypto api or 'undefined' + */ + getWebCryptoAll: function getWebCryptoAll() { + if (!_config2.default.use_native) { + return; + } + + if (typeof window !== 'undefined') { + if (window.crypto) { + return window.crypto.subtle || window.crypto.webkitSubtle; + } + if (window.msCrypto) { + return window.msCrypto.subtle; + } + } + }, + + /** + * Wraps a generic synchronous function in an ES6 Promise. + * @param {Function} fn The function to be wrapped + * @return {Function} The function wrapped in a Promise + */ + promisify: function promisify(fn) { + return function () { + var args = arguments; + return new Promise(function (resolve) { + var result = fn.apply(null, args); + resolve(result); + }); + }; + }, + + /** + * Converts an IE11 web crypro api result to a promise. + * This is required since IE11 implements an old version of the + * Web Crypto specification that does not use promises. + * @param {Object} cryptoOp The return value of an IE11 web cryptro api call + * @param {String} errmsg An error message for a specific operation + * @return {Promise} The resulting Promise + */ + promisifyIE11Op: function promisifyIE11Op(cryptoOp, errmsg) { + return new Promise(function (resolve, reject) { + cryptoOp.onerror = function () { + reject(new Error(errmsg)); + }; + cryptoOp.oncomplete = function (e) { + resolve(e.target.result); + }; + }); + }, + + /** + * Detect Node.js runtime. + */ + detectNode: function detectNode() { + return typeof window === 'undefined'; + }, + + /** + * Get native Node.js crypto api. The default configuration is to use + * the api when available. But it can also be deactivated with config.use_native + * @return {Object} The crypto module or 'undefined' + */ + getNodeCrypto: function getNodeCrypto() { + if (!this.detectNode() || !_config2.default.use_native) { + return; + } + + return _dereq_('crypto'); + }, + + /** + * Get native Node.js Buffer constructor. This should be used since + * Buffer is not available under browserify. + * @return {Function} The Buffer constructor or 'undefined' + */ + getNodeBuffer: function getNodeBuffer() { + if (!this.detectNode()) { + return; + } + + return _dereq_('buffer').Buffer; + } + +}; + +},{"./config":10,"buffer":"buffer","crypto":"crypto"}],71:[function(_dereq_,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3.0 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = AsyncProxy; + +var _util = _dereq_('../util.js'); + +var _util2 = _interopRequireDefault(_util); + +var _crypto = _dereq_('../crypto'); + +var _crypto2 = _interopRequireDefault(_crypto); + +var _packet = _dereq_('../packet'); + +var _packet2 = _interopRequireDefault(_packet); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var INITIAL_RANDOM_SEED = 50000, + // random bytes seeded to worker +RANDOM_SEED_REQUEST = 20000; // random bytes seeded after worker request + +/** + * Initializes a new proxy and loads the web worker + * @constructor + * @param {String} path The path to the worker or 'openpgp.worker.js' by default + * @param {Object} config config The worker configuration + * @param {Object} worker alternative to path parameter: web worker initialized with 'openpgp.worker.js' + * @return {Promise} + */ +function AsyncProxy() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$path = _ref.path, + path = _ref$path === undefined ? 'openpgp.worker.js' : _ref$path, + worker = _ref.worker, + config = _ref.config; + + this.worker = worker || new Worker(path); + this.worker.onmessage = this.onMessage.bind(this); + this.worker.onerror = function (e) { + throw new Error('Unhandled error in openpgp worker: ' + e.message + ' (' + e.filename + ':' + e.lineno + ')'); + }; + this.seedRandom(INITIAL_RANDOM_SEED); + + if (config) { + this.worker.postMessage({ event: 'configure', config: config }); + } + + // Cannot rely on task order being maintained, use object keyed by request ID to track tasks + this.tasks = {}; + this.currentID = 0; +} + +/** + * Get new request ID + * @return {integer} New unique request ID +*/ +AsyncProxy.prototype.getID = function () { + return this.currentID++; +}; + +/** + * Message handling + */ +AsyncProxy.prototype.onMessage = function (event) { + var msg = event.data; + switch (msg.event) { + case 'method-return': + if (msg.err) { + // fail + var err = new Error(msg.err); + // add worker stack + err.workerStack = msg.stack; + this.tasks[msg.id].reject(err); + } else { + // success + this.tasks[msg.id].resolve(msg.data); + } + delete this.tasks[msg.id]; + break; + case 'request-seed': + this.seedRandom(RANDOM_SEED_REQUEST); + break; + default: + throw new Error('Unknown Worker Event.'); + } +}; + +/** + * Send message to worker with random data + * @param {Integer} size Number of bytes to send + */ +AsyncProxy.prototype.seedRandom = function (size) { + var buf = this.getRandomBuffer(size); + this.worker.postMessage({ event: 'seed-random', buf: buf }, _util2.default.getTransferables.call(_util2.default, buf)); +}; + +/** + * Get Uint8Array with random numbers + * @param {Integer} size Length of buffer + * @return {Uint8Array} + */ +AsyncProxy.prototype.getRandomBuffer = function (size) { + if (!size) { + return null; + } + var buf = new Uint8Array(size); + _crypto2.default.random.getRandomValues(buf); + return buf; +}; + +/** + * Terminates the worker + */ +AsyncProxy.prototype.terminate = function () { + this.worker.terminate(); +}; + +/** + * Generic proxy function that handles all commands from the public api. + * @param {String} method the public api function to be delegated to the worker thread + * @param {Object} options the api function's options + * @return {Promise} see the corresponding public api functions for their return types + */ +AsyncProxy.prototype.delegate = function (method, options) { + var _this = this; + + var id = this.getID(); + + return new Promise(function (_resolve, reject) { + // clone packets (for web worker structured cloning algorithm) + _this.worker.postMessage({ id: id, event: method, options: _packet2.default.clone.clonePackets(options) }, _util2.default.getTransferables.call(_util2.default, options)); + + // remember to handle parsing cloned packets from worker + _this.tasks[id] = { resolve: function resolve(data) { + return _resolve(_packet2.default.clone.parseClonedPackets(data, method)); + }, reject: reject }; + }); +}; + +},{"../crypto":24,"../packet":47,"../util.js":70}]},{},[37])(37) +}); \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/debian/patches/correct-magic-path.patch roundcube-1.3.6+dfsg.1/debian/patches/correct-magic-path.patch --- roundcube-1.3.3+dfsg.1/debian/patches/correct-magic-path.patch 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/patches/correct-magic-path.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -On Debian, the magic file is in /usr/share/file/magic. - -Index: b/config/main.inc.php.dist -=================================================================== ---- a/config/main.inc.php.dist 2009-10-21 10:47:40.000000000 +0200 -+++ b/config/main.inc.php.dist 2010-07-17 17:33:23.000000000 +0200 -@@ -301,7 +301,7 @@ - $rcmail_config['identities_level'] = 0; - - // mime magic database --$rcmail_config['mime_magic'] = '/usr/share/misc/magic'; -+$rcmail_config['mime_magic'] = '/usr/share/file/magic'; - - // Enable DNS checking for e-mail address validation - $rcmail_config['email_dns_check'] = false; diff -Nru roundcube-1.3.3+dfsg.1/debian/patches/disable-dns-prefetch.patch roundcube-1.3.6+dfsg.1/debian/patches/disable-dns-prefetch.patch --- roundcube-1.3.3+dfsg.1/debian/patches/disable-dns-prefetch.patch 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/patches/disable-dns-prefetch.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -Disable DNS prefetching to solve CVE-2010-0464. - -Index: b/program/include/rcube_html_page.php -=================================================================== ---- a/program/include/rcube_html_page.php 2009-06-22 18:20:34.000000000 +0200 -+++ b/program/include/rcube_html_page.php 2010-07-17 17:33:25.000000000 +0200 -@@ -165,6 +165,13 @@ - $__page_header.= $this->charset . '" />'."\n"; - } - -+ // add hint to disable DNS prefetching -+ if (!headers_sent()) { -+ header('X-DNS-Prefetch-Control: off'); -+ } else { -+ $__page_header.= ''."\n"; -+ } -+ - // definition of the code to be placed in the document header and footer - if (is_array($this->script_files['head'])) { - foreach ($this->script_files['head'] as $file) { diff -Nru roundcube-1.3.3+dfsg.1/debian/patches/dont-limit-email-local-part.patch roundcube-1.3.6+dfsg.1/debian/patches/dont-limit-email-local-part.patch --- roundcube-1.3.3+dfsg.1/debian/patches/dont-limit-email-local-part.patch 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/patches/dont-limit-email-local-part.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -To fix #568360 and #568537, don't limit local part size. -Index: b/program/include/main.inc -=================================================================== ---- a/program/include/main.inc 2009-10-31 14:44:19.000000000 +0100 -+++ b/program/include/main.inc 2010-07-17 17:33:25.000000000 +0200 -@@ -1427,7 +1427,7 @@ - return false; - - // Check that there's one @ symbol, and that the lengths are right -- if (!preg_match('/^([^@]{1,64})@([^@]{1,255})$/', $email, $email_array)) -+ if (!preg_match('/^([^@]+)@([^@]{1,255})$/', $email, $email_array)) - return false; - - // Check local part diff -Nru roundcube-1.3.3+dfsg.1/debian/patches/fix-599586.patch roundcube-1.3.6+dfsg.1/debian/patches/fix-599586.patch --- roundcube-1.3.3+dfsg.1/debian/patches/fix-599586.patch 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/patches/fix-599586.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -Fix #599586 which was caused by duplicate boundaries. The fix is to -simply use _addMixedPart from original Mail_Mime class which is recent -enough in our case. - ---- roundcube/program/include/rcube_mail_mime.php~ 2009-05-01 19:58:12.000000000 +0200 -+++ roundcube/program/include/rcube_mail_mime.php 2010-10-18 19:31:33.751930400 +0200 -@@ -102,12 +102,12 @@ - * @return object The multipart/mixed mimePart object - * @access private - */ -- function &_addMixedPart() -+ /* function &_addMixedPart() - { - $params['content_type'] = $this->_headers['Content-Type'] ? $this->_headers['Content-Type'] : 'multipart/mixed'; - $ret = new Mail_mimePart('', $params); - return $ret; -- } -+ } */ - - - /** diff -Nru roundcube-1.3.3+dfsg.1/debian/patches/install-jsdeps.sh roundcube-1.3.6+dfsg.1/debian/patches/install-jsdeps.sh --- roundcube-1.3.3+dfsg.1/debian/patches/install-jsdeps.sh 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/patches/install-jsdeps.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,132 +0,0 @@ -Make install-jsdeps.sh usable for debian packaging build process: -* split download and installing phace -* run downloading phase by hand -* the installing phase is run in dh build phase - ---- bin/install-jsdeps.sh 2017-07-09 15:01:01.675103774 +0200 -+++ debian/install-jsdeps.sh 2017-07-09 15:20:06.657867758 +0200 -@@ -2,10 +2,7 @@ - | -+ | Author: Sandro Knauß | -+ | based on bin/install-jsdeps.sh from | -+ | Thomas Bruederli | - +-----------------------------------------------------------------------+ - */ - -@@ -44,16 +45,8 @@ - if (empty($FILEINFO)) { - die("ERROR: Required program 'file' not found\n"); - } --if (empty($CURL) && empty($WGET)) { -- die("ERROR: Required program 'wget' or 'curl' not found\n"); --} -- --$CACHEDIR = sys_get_temp_dir(); -- --if (is_writeable(INSTALL_PATH . 'temp/js_cache') || @mkdir(INSTALL_PATH . 'temp/js_cache', 0774, true)) { -- $CACHEDIR = INSTALL_PATH . 'temp/js_cache'; --} - -+$CACHEDIR = 'debian/missing-sources/'; - - //////////////// License definitions - -@@ -116,10 +109,9 @@ - */ - function fetch_from_source($package, $useCache = true, &$filetype = null) - { -- global $CURL, $WGET, $FILEINFO, $CACHEDIR; -+ global $CURL, $WGET; - -- $filetype = pathinfo($package['url'], PATHINFO_EXTENSION) ?: 'tmp'; -- $cache_file = $CACHEDIR . '/' . $package['lib'] . '-' . $package['version'] . '.' . $filetype; -+ $cache_file = extract_filetype($package, false, $filetype); - - if (!is_readable($cache_file) || !$useCache) { - echo "Fetching $package[url]\n"; -@@ -134,7 +126,17 @@ - } - } - -- if (!empty($package['sha1']) && ($sum = sha1_file($cache_file)) !== $package['sha1']) { -+ return extract_filetype($package, true, $filetype); -+} -+ -+function extract_filetype($package, $check, &$filetype = null) -+{ -+ global $FILEINFO, $CACHEDIR; -+ -+ $filetype = pathinfo($package['url'], PATHINFO_EXTENSION) ?: 'tmp'; -+ $cache_file = $CACHEDIR . '/' . $package['lib'] . '-' . $package['version'] . '.' . $filetype; -+ -+ if ($check == true && !empty($package['sha1']) && ($sum = sha1_file($cache_file)) !== $package['sha1']) { - die("ERROR: Incorrect sha1 sum of $cache_file. Expected: $package[sha1], got: $sum\n"); - } - -@@ -145,6 +147,7 @@ - } - - return $cache_file; -+ - } - - /** -@@ -292,8 +295,8 @@ - - //////////////// Execution - --$args = rcube_utils::get_opt(array('f' => 'force:bool', 'd' => 'delete:bool')) -- + array('force' => false, 'delete' => false); -+$args = rcube_utils::get_opt(array('f' => 'force:bool', 'd' => 'delete:bool', 'g' => 'get:bool', 'e' => 'extract:bool')) -+ + array('force' => false, 'delete' => false, 'get' => true, 'extract' => true); - $WHAT = $args[0]; - - foreach ($SOURCES['dependencies'] as $package) { -@@ -312,14 +315,22 @@ - - echo "Installing $package[name]...\n"; - -- $srcfile = fetch_from_source($package, !$args['force'], $filetype); -- -- if ($filetype === 'zip') { -- extract_zipfile($package, $srcfile); -- } -- else { -- compose_destfile($package, $srcfile); -+ if ($args['get']) { -+ if (empty($CURL) && empty($WGET)) { -+ die("ERROR: Required program 'wget' or 'curl' not found\n"); -+ } -+ $srcfile = fetch_from_source($package, !$args['force'], $filetype); -+ } else { -+ $srcfile = extract_filetype($package, true, $filetype); - } - -+ if ($args['extract']) { -+ if ($filetype === 'zip') { -+ extract_zipfile($package, $srcfile); -+ } -+ else { -+ compose_destfile($package, $srcfile); -+ } -+ } - echo "Done.\n\n"; - } diff -Nru roundcube-1.3.3+dfsg.1/debian/patches/received-headers-sa.patch roundcube-1.3.6+dfsg.1/debian/patches/received-headers-sa.patch --- roundcube-1.3.3+dfsg.1/debian/patches/received-headers-sa.patch 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/patches/received-headers-sa.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -Fix Received headers to behave better with SpamAssassin? - http://trac.roundcube.net/changeset/3291 - http://trac.roundcube.net/ticket/1486513 - ---- a/program/steps/mail/sendmail.inc 2009-11-16 23:49:07 +0000 -+++ a/program/steps/mail/sendmail.inc 2010-02-24 00:48:24 +0000 -@@ -259,8 +259,8 @@ - $http_header .= ' ('. rcmail_encrypt_header($host) . ')'; - } else { - $http_header .= (($host != $hostname) ? $hostname : '[' . $host . ']'); -- $http_header .= ' ('. ($host == $hostname ? '' : $hostname . ' ') . -- '[' . $host .'])'; -+ if ($host != $hostname) -+ $http_header .= ' (['. $host .'])'; - } - $http_header .= $nldlm . ' via '; - } -@@ -272,14 +272,14 @@ - $http_header .= ' ('. rcmail_encrypt_header($host) . ')'; - } else { - $http_header .= (($host != $hostname) ? $hostname : '[' . $host . ']'); -- $http_header .= ' ('. ($host == $hostname ? '' : $hostname . ' ') . -- '[' . $host .'])'; -+ if ($host != $hostname) -+ $http_header .= ' (['. $host .'])'; - } - // BY - $http_header .= $nldlm . 'by ' . $_SERVER['HTTP_HOST']; - // WITH -- $http_header .= $nldlm . 'with ' . $_SERVER['SERVER_PROTOCOL'] . -- ' ('.$_SERVER['REQUEST_METHOD'] . '); ' . date('r'); -+ $http_header .= $nldlm . 'with HTTP (' . $_SERVER['SERVER_PROTOCOL'] . -+ ' '.$_SERVER['REQUEST_METHOD'] . '); ' . date('r'); - $http_header = wordwrap($http_header, 69, $nldlm); - - $headers['Received'] = $http_header; - diff -Nru roundcube-1.3.3+dfsg.1/debian/patches/too-old-mdb2.patch roundcube-1.3.6+dfsg.1/debian/patches/too-old-mdb2.patch --- roundcube-1.3.3+dfsg.1/debian/patches/too-old-mdb2.patch 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/patches/too-old-mdb2.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -Don't use disable_smart_seqname which is not present in our version of MDB2. - ---- roundcube-0.2~stable/program/include/rcube_mdb2.php 2008-10-14 14:49:44.000000000 +0200 -+++ roundcube-0.2~stable-patched/program/include/rcube_mdb2.php 2009-03-11 11:16:43.000000000 +0100 -@@ -86,7 +86,8 @@ - 'portability' => MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_EMPTY_TO_NULL); - - if ($this->db_provider == 'pgsql') { -- $db_options['disable_smart_seqname'] = true; -+ // commented out due toa php-mdb2-driver-pgsql < 1.5.0a in debian -+ // $db_options['disable_smart_seqname'] = true; - $db_options['seqname_format'] = '%s'; - } - diff -Nru roundcube-1.3.3+dfsg.1/debian/patches/update_composer.patch roundcube-1.3.6+dfsg.1/debian/patches/update_composer.patch --- roundcube-1.3.3+dfsg.1/debian/patches/update_composer.patch 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/patches/update_composer.patch 2018-04-14 18:52:38.000000000 +0000 @@ -1,4 +1,4 @@ -Description: Update PHP pear dependecies +Description: Update PHP pear dependencies The current dependencies that are published by upstream are too conservative. * So replace ~ (that only allows minor versions changes) with >= as documented @@ -30,7 +30,7 @@ - "pear/crypt_gpg": "~1.6.0", - "pear/net_sieve": "~1.4.0", - "roundcube/plugin-installer": "~0.1.6", -- "endroid/qrcode": "~1.6.5" +- "endroid/qr-code": "~1.6.5" + "pear-pear.php.net/net-socket": ">=1.0.14", + "pear-pear.php.net/auth_sasl": ">=1.0.6", + "pear-pear.php.net/mail_mime": ">=1.10.0", diff -Nru roundcube-1.3.3+dfsg.1/debian/patches/update_jsdeps.json roundcube-1.3.6+dfsg.1/debian/patches/update_jsdeps.json --- roundcube-1.3.3+dfsg.1/debian/patches/update_jsdeps.json 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/patches/update_jsdeps.json 2018-04-14 18:52:38.000000000 +0000 @@ -30,11 +30,11 @@ { "lib": "tinymce", @@ -68,7 +67,7 @@ - "sha1": "de75af6883019f490f69211e506377c84f49a85b", + "sha1": "cce0087eb20328453b9378a2b01cc6339cef97b2", "license": "LGPL", "copyright": "Copyright (c) OpenPGP Development Team", -- "source": "https://github.com/openpgpjs/openpgpjs/blob/v1.6.2/dist/openpgp.js" -+ "source": "https://github.com/openpgpjs/openpgpjs/raw/v1.6.2/dist/openpgp.js" +- "source": "https://github.com/openpgpjs/openpgpjs/blob/v2.6.2/dist/openpgp.js" ++ "source": "https://github.com/openpgpjs/openpgpjs/raw/v2.6.2/dist/openpgp.js" }, { "lib": "codemirror", diff -Nru roundcube-1.3.3+dfsg.1/debian/patches/use-debian-jquery-ui.patch roundcube-1.3.6+dfsg.1/debian/patches/use-debian-jquery-ui.patch --- roundcube-1.3.3+dfsg.1/debian/patches/use-debian-jquery-ui.patch 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/patches/use-debian-jquery-ui.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -Use packaged libjs-jquery-ui. - -Index: roundcube/plugins/jqueryui/jqueryui.php -=================================================================== ---- roundcube.orig/plugins/jqueryui/jqueryui.php 2013-06-04 22:55:57.757216447 +0200 -+++ roundcube/plugins/jqueryui/jqueryui.php 2013-06-04 22:55:57.749216420 +0200 -@@ -21,7 +21,7 @@ - $this->load_config(); - - // include UI scripts -- $this->include_script("js/jquery-ui-$version.custom.min.js"); -+ $this->include_script("js/jquery-ui.min.js"); - - // include UI stylesheet - $skin = $rcmail->config->get('skin'); diff -Nru roundcube-1.3.3+dfsg.1/debian/patches/uuencoded-attachments.patch roundcube-1.3.6+dfsg.1/debian/patches/uuencoded-attachments.patch --- roundcube-1.3.3+dfsg.1/debian/patches/uuencoded-attachments.patch 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/patches/uuencoded-attachments.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -Roundcube 0.7 doesn't properly recognize uuencoded attachments. Space -(0x20) is a valid character to be found in uuencoded paragraphs while -anything above backquote (0x60) is not valid. - -Source: - http://en.wikipedia.org/wiki/Uuencoding#Formatting_Mechanism - -Patch from Michał Mirosław. - -Index: roundcube/program/include/rcube_message.php -=================================================================== ---- roundcube.orig/program/include/rcube_message.php 2012-09-29 11:30:54.555045159 +0200 -+++ roundcube/program/include/rcube_message.php 2012-09-29 11:31:51.044174849 +0200 -@@ -622,8 +622,7 @@ - $part->body = $this->imap->get_message_part($this->uid, $part->mime_id, $part); - - $parts = array(); -- // FIXME: line length is max.65? -- $uu_regexp = '/begin [0-7]{3,4} ([^\n]+)\n(([\x21-\x7E]{0,65}\n)+)`\nend/s'; -+ $uu_regexp = '/begin [0-7]{3,4} ([^\n]+)\n(([\x20-\x60]{0,65}\n)+)`\nend/s'; - - if (preg_match_all($uu_regexp, $part->body, $matches, PREG_SET_ORDER)) { - // remove attachments bodies from the message body diff -Nru roundcube-1.3.3+dfsg.1/debian/roundcube-core.postinst roundcube-1.3.6+dfsg.1/debian/roundcube-core.postinst --- roundcube-1.3.3+dfsg.1/debian/roundcube-core.postinst 2017-11-20 02:45:14.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/debian/roundcube-core.postinst 2018-04-14 18:52:38.000000000 +0000 @@ -247,10 +247,10 @@ done fi - chown -R www-data:adm /var/log/roundcube - chmod -R 750 /var/log/roundcube - chown -R www-data:www-data /var/lib/roundcube/temp - chmod -R 750 /var/lib/roundcube/temp + chown www-data:adm /var/log/roundcube + chmod 0750 /var/log/roundcube + chown www-data:www-data /var/lib/roundcube/temp + chmod 0750 /var/lib/roundcube/temp ;; diff -Nru roundcube-1.3.3+dfsg.1/index.php roundcube-1.3.6+dfsg.1/index.php --- roundcube-1.3.3+dfsg.1/index.php 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/index.php 2018-04-11 11:14:33.000000000 +0000 @@ -2,7 +2,7 @@ /** +-------------------------------------------------------------------------+ | Roundcube Webmail IMAP Client | - | Version 1.3.3 | + | Version 1.3.6 | | | | Copyright (C) 2005-2017, The Roundcube Dev Team | | | diff -Nru roundcube-1.3.3+dfsg.1/installer/index.php roundcube-1.3.6+dfsg.1/installer/index.php --- roundcube-1.3.3+dfsg.1/installer/index.php 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/installer/index.php 2018-04-11 11:14:34.000000000 +0000 @@ -3,7 +3,7 @@ /** +-------------------------------------------------------------------------+ | Roundcube Webmail setup tool | - | Version 1.3.3 | + | Version 1.3.6 | | | | Copyright (C) 2009-2015, The Roundcube Dev Team | | | @@ -36,25 +36,11 @@ +-------------------------------------------------------------------------+ */ -ini_set('error_reporting', E_ALL &~ (E_NOTICE | E_STRICT)); ini_set('display_errors', 1); define('INSTALL_PATH', realpath(__DIR__ . '/../').'/'); -define('RCUBE_INSTALL_PATH', INSTALL_PATH); -define('RCUBE_CONFIG_DIR', INSTALL_PATH . 'config/'); -$include_path = INSTALL_PATH . 'program/lib' . PATH_SEPARATOR; -$include_path .= INSTALL_PATH . 'program/include' . PATH_SEPARATOR; -$include_path .= ini_get('include_path'); - -set_include_path($include_path); - -// include composer autoloader (if available) -if (@file_exists(INSTALL_PATH . 'vendor/autoload.php')) { - require INSTALL_PATH . 'vendor/autoload.php'; -} - -require_once 'Roundcube/bootstrap.php'; +require INSTALL_PATH . 'program/include/iniset.php'; if (function_exists('session_start')) session_start(); diff -Nru roundcube-1.3.3+dfsg.1/installer/styles.css roundcube-1.3.6+dfsg.1/installer/styles.css --- roundcube-1.3.3+dfsg.1/installer/styles.css 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/installer/styles.css 2018-04-11 11:14:34.000000000 +0000 @@ -141,6 +141,11 @@ text-align: left; } +td > label { + min-width: 6em; + display: inline-block; +} + ul li { margin: 0.3em 0 0.4em -1em; } diff -Nru roundcube-1.3.3+dfsg.1/installer/test.php roundcube-1.3.6+dfsg.1/installer/test.php --- roundcube-1.3.3+dfsg.1/installer/test.php 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/installer/test.php 2018-04-11 11:14:34.000000000 +0000 @@ -240,42 +240,50 @@ echo "
"; } -?> - - -

Test SMTP config

- -

-Server: getprop('smtp_server', 'localhost')); ?>
-Port: getprop('smtp_port'); ?>
- -getprop('smtp_user', '(none)'); +$pass = $RCI->getprop('smtp_pass', '(none)'); -if ($RCI->getprop('smtp_server')) { - $user = $RCI->getprop('smtp_user', '(none)'); - $pass = $RCI->getprop('smtp_pass', '(none)'); - - if ($user == '%u') { - $user_field = new html_inputfield(array('name' => '_smtp_user')); +if ($user == '%u') { + $user_field = new html_inputfield(array('name' => '_smtp_user', 'id' => 'smtp_user')); $user = $user_field->show($_POST['_smtp_user']); - } - if ($pass == '%p') { - $pass_field = new html_passwordfield(array('name' => '_smtp_pass')); +} +if ($pass == '%p') { + $pass_field = new html_passwordfield(array('name' => '_smtp_pass', 'id' => 'smtp_pass')); $pass = $pass_field->show(); - } - - echo "User: $user
"; - echo "Password: $pass
"; } -$from_field = new html_inputfield(array('name' => '_from', 'id' => 'sendmailfrom')); -$to_field = new html_inputfield(array('name' => '_to', 'id' => 'sendmailto')); - ?> + +

Test SMTP config

+ +

+ + + + + + + + + + + + + + + + + + + +
getprop('smtp_server', 'localhost')); ?>
getprop('smtp_port'); ?>

'_from', 'id' => 'sendmailfrom')); +$to_field = new html_inputfield(array('name' => '_to', 'id' => 'sendmailto')); + if (isset($_POST['sendmail'])) { echo '

Trying to send email...
'; diff -Nru roundcube-1.3.3+dfsg.1/jsdeps.json roundcube-1.3.6+dfsg.1/jsdeps.json --- roundcube-1.3.3+dfsg.1/jsdeps.json 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/jsdeps.json 2018-04-11 11:14:34.000000000 +0000 @@ -62,13 +62,13 @@ { "lib": "openpgp", "name": "OpenPGP.js", - "version": "1.6.2", - "url": "https://raw.githubusercontent.com/openpgpjs/openpgpjs/v1.6.2/dist/openpgp.min.js", + "version": "2.6.2", + "url": "https://raw.githubusercontent.com/openpgpjs/openpgpjs/v2.6.2/dist/openpgp.min.js", "dest": "plugins/enigma/openpgp.min.js", - "sha1": "de75af6883019f490f69211e506377c84f49a85b", + "sha1": "cce0087eb20328453b9378a2b01cc6339cef97b2", "license": "LGPL", "copyright": "Copyright (c) OpenPGP Development Team", - "source": "https://github.com/openpgpjs/openpgpjs/blob/v1.6.2/dist/openpgp.js" + "source": "https://github.com/openpgpjs/openpgpjs/blob/v2.6.2/dist/openpgp.js" }, { "lib": "codemirror", diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/acl.php roundcube-1.3.6+dfsg.1/plugins/acl/acl.php --- roundcube-1.3.3+dfsg.1/plugins/acl/acl.php 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/acl.php 2018-04-11 11:14:33.000000000 +0000 @@ -494,6 +494,13 @@ if (!strpos($user, '@') && ($realm = $this->get_realm())) { $user .= '@' . rcube_utils::idn_to_ascii(preg_replace('/^@/', '', $realm)); } + + // Make sure it's valid email address to prevent from "disappearing folder" + // issue in Cyrus IMAP e.g. when the acl user identifier contains spaces inside. + if (strpos($user, '@') && !rcube_utils::check_email($user, false)) { + $user = null; + } + $username = $user; } diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ar.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ar.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ar.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ar.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,27 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ +*/ +$labels['add'] = 'إضافة'; +$labels['aclother'] = 'آخر'; +$labels['acldelete'] = 'حذف'; +$labels['shortaclc'] = 'أنشئ'; +$labels['shortaclk'] = 'أنشئ'; +$labels['shortacld'] = 'حذف'; +$labels['shortaclt'] = 'حذف'; +$labels['shortaclother'] = 'آخر'; +$labels['shortacldelete'] = 'حذف'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ar_SA.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ar_SA.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ar_SA.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ar_SA.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'حقوق الوصول'; $labels['username'] = 'مستخدم:'; $labels['advanced'] = 'وضع متقدم'; +$labels['add'] = 'إضافة'; $labels['newuser'] = 'اضافة مدخل'; $labels['editperms'] = 'تعديل الصلاحيات'; $labels['actions'] = 'اجراءات حقوق الوصول...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ast.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ast.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ast.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ast.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Drechos d\'accesu'; $labels['username'] = 'Usuariu:'; $labels['advanced'] = 'Mou avanzáu'; +$labels['add'] = 'Amestar'; $labels['newuser'] = 'Amestar entrada'; $labels['editperms'] = 'Editar permisos'; $labels['actions'] = 'Aición de drechos d\'accesu...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/az_AZ.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/az_AZ.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/az_AZ.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/az_AZ.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Giriş hüququ'; $labels['username'] = 'İstifadəçi:'; $labels['advanced'] = 'Ekspert rejimi'; +$labels['add'] = 'Əlavə et'; $labels['newuser'] = 'Sahə əlavə et'; $labels['editperms'] = 'Cavabları redaktə et'; $labels['actions'] = 'Giriş hüququ ilə hərəkət...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/be_BE.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/be_BE.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/be_BE.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/be_BE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Правы доступу'; $labels['username'] = 'Карыстальнік:'; $labels['advanced'] = 'Пашыраны рэжым'; +$labels['add'] = 'Дадаць'; $labels['newuser'] = 'Дадаць запіс'; $labels['editperms'] = 'Рэдагаваць правы доступу'; $labels['actions'] = 'Дзеянні з правамі доступу...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/bg_BG.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/bg_BG.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/bg_BG.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/bg_BG.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Права за достъп'; $labels['username'] = 'Потребител:'; $labels['advanced'] = 'Разширен режим'; +$labels['add'] = 'Добави'; $labels['newuser'] = 'Добавяне на запис'; $labels['editperms'] = 'Редакция на права'; $labels['actions'] = 'Действия на права за достъп...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/bn_BD.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/bn_BD.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/bn_BD.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/bn_BD.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,27 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ +*/ +$labels['aclread'] = 'পড়'; +$labels['acldelete'] = 'ফেলে দিন'; +$labels['shortaclr'] = 'পড়'; +$labels['shortaclc'] = 'প্রস্তুত করুন'; +$labels['shortaclk'] = 'প্রস্তুত করুন'; +$labels['shortacld'] = 'ফেলে দিন'; +$labels['shortaclt'] = 'ফেলে দিন'; +$labels['shortaclread'] = 'পড়'; +$labels['shortacldelete'] = 'ফেলে দিন'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/br.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/br.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/br.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/br.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Aotreoù mont e-barzh'; $labels['username'] = 'Implijer:'; $labels['advanced'] = 'Mod kempleshoc\'h'; +$labels['add'] = 'Ouzhpennañ'; $labels['newuser'] = 'Ouzhpennañ un elfenn'; $labels['editperms'] = 'Embann an aotreoù'; $labels['actions'] = 'Aotreoù mont e-barzh'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/bs_BA.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/bs_BA.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/bs_BA.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/bs_BA.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Prava pristupa'; $labels['username'] = 'Korisnik:'; $labels['advanced'] = 'Napredni mod'; +$labels['add'] = 'Dodaj'; $labels['newuser'] = 'Dodaj unos'; $labels['editperms'] = 'Uredi dozvole'; $labels['actions'] = 'Akcije za prava pristupa...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ca_ES.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ca_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ca_ES.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ca_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Permisos d\'accés'; $labels['username'] = 'Usuari:'; $labels['advanced'] = 'Mode Avançat'; +$labels['add'] = 'Afegeix'; $labels['newuser'] = 'Afegeix una entrada'; $labels['editperms'] = 'Editar Permisos'; $labels['actions'] = 'Accions dels permisos d\'accés...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/cs_CZ.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/cs_CZ.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/cs_CZ.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/cs_CZ.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Přístupová práva'; $labels['username'] = 'Uživatel:'; $labels['advanced'] = 'Pokročilý režim'; +$labels['add'] = 'Přidej'; $labels['newuser'] = 'Přidat záznam'; $labels['editperms'] = 'Upravit oprávnění'; $labels['actions'] = 'Přístupové právo akce ...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/cy_GB.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/cy_GB.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/cy_GB.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/cy_GB.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Hawliau Mynediad'; $labels['username'] = 'Defnyddiwr:'; $labels['advanced'] = 'Modd uwch'; +$labels['add'] = 'Ychwanegu'; $labels['newuser'] = 'Ychwanegu cofnod'; $labels['editperms'] = 'Golygu hawliau'; $labels['actions'] = 'Gweithredoedd hawl mynediad...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/da_DK.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/da_DK.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/da_DK.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/da_DK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Adgangrettigheder'; $labels['username'] = 'Bruger:'; $labels['advanced'] = 'Avanceret tilstand'; +$labels['add'] = 'Tilføje'; $labels['newuser'] = 'Tilføj indgang'; $labels['editperms'] = 'Rediger tilladelser'; $labels['actions'] = 'Tilgangsrettigheder...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/de_CH.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/de_CH.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/de_CH.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/de_CH.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Zugriffsrechte'; $labels['username'] = 'Benutzer:'; $labels['advanced'] = 'Expertenmodus'; +$labels['add'] = 'Hinzufügen'; $labels['newuser'] = 'Eintrag hinzufügen'; $labels['editperms'] = 'Zugriffsrechte bearbeiten'; $labels['actions'] = 'Zugriffsrechte Aktionen...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/de_DE.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/de_DE.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/de_DE.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/de_DE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Zugriffsrechte'; $labels['username'] = 'Benutzer:'; $labels['advanced'] = 'Erweiterter Modus'; +$labels['add'] = 'Hinzufügen'; $labels['newuser'] = 'Eintrag hinzufügen'; $labels['editperms'] = 'Zugriffsrechte bearbeiten'; $labels['actions'] = 'Zugriffsrechteaktionen …'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/el_GR.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/el_GR.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/el_GR.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/el_GR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Δικαιώματα Πρόσβασης '; $labels['username'] = 'Χρήστης:'; $labels['advanced'] = 'Προηγμένη λειτουργία'; +$labels['add'] = 'Προσθήκη'; $labels['newuser'] = 'Προσθήκη καταχώρησης '; $labels['editperms'] = 'Μεταβολή δικαιωμάτων'; $labels['actions'] = 'Ενέργειες δικαιωμάτων πρόσβασης...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/en_CA.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/en_CA.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/en_CA.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/en_CA.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Access Rights'; $labels['username'] = 'User:'; $labels['advanced'] = 'Advanced mode'; +$labels['add'] = 'Add'; $labels['newuser'] = 'Add entry'; $labels['editperms'] = 'Edit permissions'; $labels['actions'] = 'Access right actions...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/en_GB.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/en_GB.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/en_GB.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/en_GB.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Access Rights'; $labels['username'] = 'User:'; $labels['advanced'] = 'Advanced mode'; +$labels['add'] = 'Add'; $labels['newuser'] = 'Add entry'; $labels['editperms'] = 'Edit permissions'; $labels['actions'] = 'Access right actions...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/eo.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/eo.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/eo.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/eo.inc 2018-04-11 11:14:33.000000000 +0000 @@ -18,6 +18,7 @@ $labels['sharing'] = 'Kunhavigado'; $labels['myrights'] = 'Atingrajtoj'; $labels['username'] = 'Uzanto:'; +$labels['add'] = 'Aldoni'; $labels['newuser'] = 'Aldoni eron'; $labels['actions'] = 'Agoj de atingrajtoj...'; $labels['anyone'] = 'Ĉiuj uzantoj (iu ajn)'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/es_419.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/es_419.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/es_419.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/es_419.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Permisos de acceso'; $labels['username'] = 'Usuario:'; $labels['advanced'] = 'Modo avanzado'; +$labels['add'] = 'Agregar'; $labels['newuser'] = 'Añadir entrada'; $labels['editperms'] = 'Editar permisos'; $labels['actions'] = 'Acciones de derecho de acceso...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/es_AR.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/es_AR.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/es_AR.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/es_AR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Permisos de acceso'; $labels['username'] = 'Usuario:'; $labels['advanced'] = 'Modo avanzado'; +$labels['add'] = 'Agregar'; $labels['newuser'] = 'Agregar entrada'; $labels['editperms'] = 'Editar permisos'; $labels['actions'] = 'Acciones para los permisos de acceso...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/es_ES.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/es_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/es_ES.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/es_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Permisos de acceso'; $labels['username'] = 'Usuario:'; $labels['advanced'] = 'Modo avanzado'; +$labels['add'] = 'Añadir'; $labels['newuser'] = 'Añadir una entrada'; $labels['editperms'] = 'Editar permisos'; $labels['actions'] = 'Acciones sobre los permisos de acceso…'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/et_EE.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/et_EE.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/et_EE.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/et_EE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Ligipääsuõigused'; $labels['username'] = 'Kasutaja:'; $labels['advanced'] = 'laiendatud režiim'; +$labels['add'] = 'Lisa'; $labels['newuser'] = 'Lisa sissekanne'; $labels['editperms'] = 'Muuda õigusi'; $labels['actions'] = 'Ligipääsuõiguste toimingud...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/eu_ES.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/eu_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/eu_ES.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/eu_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -18,7 +18,8 @@ $labels['sharing'] = 'Partekatzen'; $labels['myrights'] = 'Sarbide-eskubideak'; $labels['username'] = 'Erabiltzailea:'; -$labels['advanced'] = 'modu aurreratua'; +$labels['advanced'] = 'Modu aurreratua'; +$labels['add'] = 'Gehitu'; $labels['newuser'] = 'Gehitu sarrera'; $labels['editperms'] = 'Editatu baimenak'; $labels['actions'] = 'Sarbide-eskubideen ekintzak...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/fa_AF.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/fa_AF.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/fa_AF.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/fa_AF.inc 2018-04-11 11:14:33.000000000 +0000 @@ -17,10 +17,23 @@ */ $labels['sharing'] = 'اشتراک گذاری'; $labels['username'] = 'کاربر:'; +$labels['add'] = 'افزودن'; $labels['newuser'] = 'افزودن مدخل'; $labels['aclw'] = 'نوشتن نشانه ها'; $labels['aclp'] = 'ارسال'; $labels['acla'] = 'مدیر'; $labels['aclfull'] = 'کنترل کامل'; $labels['aclother'] = 'دیگر'; +$labels['aclread'] = 'خواندن'; +$labels['acldelete'] = 'حذف'; +$labels['shortaclr'] = 'خواندن'; +$labels['shortaclp'] = 'ارسال'; +$labels['shortaclc'] = 'ایجاد کردن'; +$labels['shortaclk'] = 'ایجاد کردن'; +$labels['shortacld'] = 'حذف'; +$labels['shortaclt'] = 'حذف'; +$labels['shortacla'] = 'مدیر'; +$labels['shortaclother'] = 'دیگر'; +$labels['shortaclread'] = 'خواندن'; +$labels['shortacldelete'] = 'حذف'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/fa_IR.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/fa_IR.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/fa_IR.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/fa_IR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'حقوق دسترسی'; $labels['username'] = 'کاربر:'; $labels['advanced'] = 'حالت پیشرفته'; +$labels['add'] = 'افزودن'; $labels['newuser'] = 'افزودن ورودی'; $labels['editperms'] = 'ویرایش مجوزها'; $labels['actions'] = 'فعالیت‌های حق دسترسی...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/fi_FI.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/fi_FI.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/fi_FI.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/fi_FI.inc 2018-04-11 11:14:33.000000000 +0000 @@ -18,6 +18,7 @@ $labels['sharing'] = 'Jakaminen'; $labels['myrights'] = 'Käyttöoikeudet'; $labels['username'] = 'Käyttäjä:'; +$labels['add'] = 'Lisää'; $labels['editperms'] = 'Muokkaa oikeuksia'; $labels['anyone'] = 'Kaikki käyttäjät (kuka tahansa)'; $labels['anonymous'] = 'Vieraat (anonyymit)'; @@ -31,6 +32,9 @@ $labels['aclread'] = 'Luku'; $labels['aclwrite'] = 'Kirjoitus'; $labels['acldelete'] = 'Poisto'; +$labels['shortaclr'] = 'Lue'; +$labels['shortacls'] = 'Säilytä'; +$labels['shortaclw'] = 'Kirjoitus'; $labels['shortaclc'] = 'Luo'; $labels['shortaclk'] = 'Luo'; $labels['shortacld'] = 'Poista'; @@ -42,6 +46,7 @@ $labels['longaclr'] = 'Kansion voi avata lukua varten'; $labels['longaclx'] = 'Kansio voidaan poistaa tai nimetä uudelleen'; $labels['longacla'] = 'Kansion käyttöoikeuksia voi muuttaa'; +$labels['longaclread'] = 'Kansion voi avata lukua varten'; $messages['deleting'] = 'Poistetaan käyttöoikeuksia...'; $messages['saving'] = 'Tallennetaan käyttöoikeuksia...'; $messages['updatesuccess'] = 'Käyttöoikeuksia muutettiin onnistuneesti'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/fo_FO.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/fo_FO.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/fo_FO.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/fo_FO.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Atgongdar-rættindi'; $labels['username'] = 'Brúkari:'; $labels['advanced'] = 'Víðkað útgáva'; +$labels['add'] = 'Legg aftrat'; $labels['newuser'] = 'Legg inn'; $labels['editperms'] = 'Broyt atgonguloyvi'; $labels['actions'] = 'Stillingar til atgongu-rættindi'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/fr_FR.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/fr_FR.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/fr_FR.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/fr_FR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Droits d\'accès'; $labels['username'] = 'Utilisateur :'; $labels['advanced'] = 'Mode avancé'; +$labels['add'] = 'Ajouter'; $labels['newuser'] = 'Ajouter une entrée'; $labels['editperms'] = 'Modifier les permissions'; $labels['actions'] = 'Actions des droits d\'accès...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/fy_NL.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/fy_NL.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/fy_NL.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/fy_NL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Tagong Rjochten'; $labels['username'] = 'Brûker:'; $labels['advanced'] = 'Avansearre modus'; +$labels['add'] = 'Tafoegje'; $labels['newuser'] = 'Ynfier taheakje'; $labels['editperms'] = 'Bewurkje tagongsrjochten'; $labels['actions'] = 'Tagong aksjes...'; @@ -35,8 +36,10 @@ $labels['aclk'] = 'Underlizzende mappen oanmeitsje'; $labels['acld'] = 'Berjochten wiskje'; $labels['aclt'] = 'Berjochten wiskje'; +$labels['acle'] = 'Level'; $labels['aclx'] = 'Map ferwiderje'; $labels['acla'] = 'Beheare'; +$labels['acln'] = 'Annotate berjochten'; $labels['aclfull'] = 'Folsleine kontrôle'; $labels['aclother'] = 'Oars'; $labels['aclread'] = 'Lêze'; @@ -52,6 +55,7 @@ $labels['shortaclk'] = 'Oanmeitsje'; $labels['shortacld'] = 'Ferwiderje'; $labels['shortaclt'] = 'Ferwiderje'; +$labels['shortacle'] = 'Level'; $labels['shortaclx'] = 'Map ferwiderje'; $labels['shortacla'] = 'Beheare'; $labels['shortaclother'] = 'Oars'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ga_IE.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ga_IE.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ga_IE.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ga_IE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Cearta rochtana'; $labels['username'] = 'An tÚsáideoir:'; $labels['advanced'] = 'Mód le hardroghanna'; +$labels['add'] = 'Cuir leis'; $labels['newuser'] = 'Cuir iontráil leis'; $labels['editperms'] = 'Cuir na ceadanna in eagar'; $labels['actions'] = 'Gníomhartha maidir le cearta rochtana...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/gl_ES.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/gl_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/gl_ES.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/gl_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Permisos de acceso'; $labels['username'] = 'Utente:'; $labels['advanced'] = 'Modo avanzado'; +$labels['add'] = 'Engadir'; $labels['newuser'] = 'Engadir entrada'; $labels['editperms'] = 'Editar permisos'; $labels['actions'] = 'Accións sobre os Permisos de acceso...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/he_IL.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/he_IL.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/he_IL.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/he_IL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'זכויות גישה'; $labels['username'] = 'משתמש:'; $labels['advanced'] = 'מצב מתקדם'; +$labels['add'] = 'הוספה'; $labels['newuser'] = 'הוסף ערך'; $labels['editperms'] = 'עריכת הרשאות'; $labels['actions'] = 'פעולות על זכויות גישה...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/hi_IN.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/hi_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/hi_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/hi_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,24 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ +*/ +$labels['acldelete'] = 'मिटा'; +$labels['shortaclc'] = 'बनाऐं'; +$labels['shortaclk'] = 'बनाऐं'; +$labels['shortacld'] = 'मिटा'; +$labels['shortaclt'] = 'मिटा'; +$labels['shortacldelete'] = 'मिटा'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/hr_HR.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/hr_HR.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/hr_HR.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/hr_HR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -18,6 +18,7 @@ $labels['sharing'] = 'Dijeljenje'; $labels['myrights'] = 'Prava pristupa'; $labels['username'] = 'Korisnik:'; +$labels['add'] = 'Dodaj'; $labels['newuser'] = 'Dodaj unos/pravilo'; $labels['editperms'] = 'Uredi dozvole'; $labels['actions'] = 'Akcije prava pristupa...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/hu_HU.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/hu_HU.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/hu_HU.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/hu_HU.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Hozzáférési jogok'; $labels['username'] = 'Felhasználó:'; $labels['advanced'] = 'Haladó mód'; +$labels['add'] = 'Hozzáadás'; $labels['newuser'] = 'Elem hozzáadása'; $labels['editperms'] = 'Jogosultságok szerkesztése'; $labels['actions'] = 'Hozzáférési jogok müveletei..'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/hy_AM.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/hy_AM.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/hy_AM.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/hy_AM.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Մուտքի իրավունքներ'; $labels['username'] = 'Օգտատեր`'; $labels['advanced'] = 'Առաջադեմ ռեժիմ'; +$labels['add'] = 'Ավելացնել'; $labels['newuser'] = 'Ավելացնել գրառում'; $labels['editperms'] = 'Խմբագրել թույլտվությունները'; $labels['actions'] = 'Մուտքի իրավունքների գործողություններ…'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ia.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ia.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ia.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ia.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Derectos de accesso'; $labels['username'] = 'Usator:'; $labels['advanced'] = 'Modo avantiate'; +$labels['add'] = 'Adder'; $labels['newuser'] = 'Adder entrata'; $labels['editperms'] = 'Modificar permissiones'; $labels['actions'] = 'Actiones de derecto de accesso...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/id_ID.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/id_ID.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/id_ID.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/id_ID.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Hak Akses'; $labels['username'] = 'Pengguna:'; $labels['advanced'] = 'Mode Lanjut'; +$labels['add'] = 'Tambah'; $labels['newuser'] = 'Tambahkan entri'; $labels['editperms'] = 'Ubah izin'; $labels['actions'] = 'Aksi hak akses...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/is_IS.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/is_IS.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/is_IS.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/is_IS.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Aðgangsheimildir'; $labels['username'] = 'Notandi:'; $labels['advanced'] = 'Flóknari hamur'; +$labels['add'] = 'Bæta við'; $labels['newuser'] = 'Bæta við færslu'; $labels['editperms'] = 'Breyta heimildum'; $labels['anyone'] = 'Allir notendur (hver sem er)'; @@ -30,8 +31,14 @@ $labels['acld'] = 'Eyða skeytum'; $labels['aclt'] = 'Eyða skeytum'; $labels['aclx'] = 'Eyða möppu'; +$labels['acla'] = 'Stjórna'; +$labels['aclother'] = 'Annað'; $labels['aclread'] = 'Lesið'; +$labels['aclwrite'] = 'Skrifa'; +$labels['acldelete'] = 'Eyða'; +$labels['shortacll'] = 'Uppfletting'; $labels['shortaclr'] = 'Lesið'; +$labels['shortacls'] = 'Halda'; $labels['shortaclw'] = 'Skrifa'; $labels['shortacli'] = 'Setja inn'; $labels['shortaclc'] = 'Búa til'; @@ -40,6 +47,7 @@ $labels['shortaclt'] = 'Eyða'; $labels['shortaclx'] = 'Eyða möppu'; $labels['shortacla'] = 'Stjórna'; +$labels['shortaclother'] = 'Annað'; $labels['shortaclread'] = 'Lesið'; $labels['shortaclwrite'] = 'Skrifa'; $labels['shortacldelete'] = 'Eyða'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/it_IT.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/it_IT.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/it_IT.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/it_IT.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Diritti d\'accesso'; $labels['username'] = 'Utente:'; $labels['advanced'] = 'Modalità avanzata'; +$labels['add'] = 'Aggiungi'; $labels['newuser'] = 'Aggiungi voce'; $labels['editperms'] = 'Modifica permessi'; $labels['actions'] = 'Azioni permessi d\'accesso...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ja_JP.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ja_JP.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ja_JP.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ja_JP.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'アクセス権'; $labels['username'] = 'ユーザー:'; $labels['advanced'] = '詳細なモード'; +$labels['add'] = '追加'; $labels['newuser'] = '項目を追加'; $labels['editperms'] = '編集の権限'; $labels['actions'] = 'アクセス権の動作...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/kab.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/kab.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/kab.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/kab.inc 2018-04-11 11:14:33.000000000 +0000 @@ -36,9 +36,19 @@ $labels['aclx'] = 'Kkes akaram'; $labels['acla'] = 'Sefrek'; $labels['acln'] = 'Rnu tizmilin i yiznan'; +$labels['aclother'] = 'Ayen-nniḍen'; +$labels['aclread'] = 'Ɣeṛ'; +$labels['aclwrite'] = 'Aru'; +$labels['acldelete'] = 'Kkes'; +$labels['shortacll'] = 'Nadi'; +$labels['shortaclr'] = 'Ɣeṛ'; +$labels['shortaclw'] = 'Aru'; +$labels['shortaclp'] = 'Aru izen'; +$labels['shortaclc'] = 'Rnu'; $labels['shortaclk'] = 'Rnu'; $labels['shortacld'] = 'Kkes'; $labels['shortaclt'] = 'Kkes'; +$labels['shortacle'] = 'Sfeḍ'; $labels['shortacla'] = 'Sefrek'; $labels['shortacln'] = 'Rnu tazmilt'; $labels['shortaclother'] = 'Ayen-nniḍen'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ka_GE.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ka_GE.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ka_GE.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ka_GE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,7 +15,16 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ */ +$labels['add'] = 'დამატება'; +$labels['aclother'] = 'სხვა'; $labels['aclread'] = 'წაკითხვა'; +$labels['acldelete'] = 'წაშლა'; $labels['shortaclr'] = 'წაკითხვა'; +$labels['shortaclc'] = 'შექმნა'; +$labels['shortaclk'] = 'შექმნა'; +$labels['shortacld'] = 'წაშლა'; +$labels['shortaclt'] = 'წაშლა'; +$labels['shortaclother'] = 'სხვა'; $labels['shortaclread'] = 'წაკითხვა'; +$labels['shortacldelete'] = 'წაშლა'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/km_KH.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/km_KH.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/km_KH.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/km_KH.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'សិទ្ធិ​ចូល'; $labels['username'] = 'អ្នក​ប្រើ៖'; $labels['advanced'] = 'បែប​កម្រិត​ខ្ពស់'; +$labels['add'] = 'បន្ថែម'; $labels['newuser'] = 'បន្ថែម​ធាតុ'; $labels['actions'] = 'សកម្មភាព​សិទ្ធិ​ចូល...'; $labels['anyone'] = 'អ្នក​ប្រើ​ទាំង​អស់ (នរណា​ម្នាក់)'; @@ -60,6 +61,7 @@ $labels['longacle'] = 'សារ​នេះ​អាច​ត្រូវ​បាន​ដក​ចេញ'; $labels['longaclx'] = 'ថត​នេះ អាច​ត្រូវ​បាន​លុប ឬ​ ប្ដូរ​ឈ្មោះ'; $labels['longacla'] = 'សិទ្ធិ​ចូល​ទៅ​កាន់​ថត​នេះ​អាច​ត្រូវ​បាន​​ផ្លាស់​ប្ដូរ​'; +$labels['longaclread'] = 'ថត​នេះ​អាច​បើក​សម្រាប់​អាន'; $labels['longacldelete'] = 'សារ​នេះ​អាច​ត្រូវ​បាន​លុប'; $messages['deleting'] = 'កំពុង​លុប​សិទ្ធិ​ចូល...'; $messages['saving'] = 'រក្សា​ទុក​សិទ្ធិ​ចូល...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/kn_IN.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/kn_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/kn_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/kn_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,21 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ +*/ +$labels['add'] = 'ಸೇರಿಸು'; +$labels['shortaclc'] = 'ರಚಿಸು'; +$labels['shortaclk'] = 'ರಚಿಸು'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ko_KR.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ko_KR.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ko_KR.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ko_KR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = '접근 권한'; $labels['username'] = '사용자:'; $labels['advanced'] = '고급 모드'; +$labels['add'] = '추가'; $labels['newuser'] = '입력내용 추가'; $labels['editperms'] = '권한 수정'; $labels['actions'] = '접근 권한 동작...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ku.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ku.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ku.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ku.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Mafên Têketinê'; $labels['username'] = 'Bikarhêner:'; $labels['advanced'] = 'Moda pêşketî'; +$labels['add'] = 'Tev bike'; $labels['newuser'] = 'Têketinek zêde bike'; $labels['editperms'] = 'Destûrdayînan Sererast Bike'; $labels['actions'] = 'Digihîje tevgerên çê..'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ku_IQ.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ku_IQ.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ku_IQ.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ku_IQ.inc 2018-04-11 11:14:33.000000000 +0000 @@ -18,9 +18,11 @@ $labels['sharing'] = 'هاوبەشکردن'; $labels['username'] = 'بەکارهێنەر:'; $labels['advanced'] = 'شێوازی پێشکەوتوو'; +$labels['acldelete'] = 'سڕینەوە'; $labels['shortaclc'] = 'دروستکردن'; $labels['shortaclk'] = 'دروستکردن'; $labels['shortacld'] = 'سڕینەوە'; $labels['shortaclt'] = 'سڕینەوە'; $labels['shortaclx'] = 'سڕینەوەی بوخچە'; +$labels['shortacldelete'] = 'سڕینەوە'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/lb_LU.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/lb_LU.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/lb_LU.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/lb_LU.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Zougrëffsrechter'; $labels['username'] = 'Benotzer:'; $labels['advanced'] = 'Avancéierte Modus'; +$labels['add'] = 'Dobäisetzen'; $labels['newuser'] = 'Element dobäisetzen'; $labels['actions'] = 'Optioune fir d\'Zougrëffsrechter'; $labels['anyone'] = 'All d\'Benotzer (jiddwereen)'; @@ -27,6 +28,7 @@ $labels['acll'] = 'Noschloen'; $labels['aclr'] = 'Messagë liesen'; $labels['acls'] = 'Lies-Status behalen'; +$labels['aclp'] = 'Schécken'; $labels['acld'] = 'Messagë läschen'; $labels['aclt'] = 'Messagë läschen'; $labels['acle'] = 'Ausläschen'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/lt_LT.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/lt_LT.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/lt_LT.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/lt_LT.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Prieigos teisės'; $labels['username'] = 'Vartotojas:'; $labels['advanced'] = 'Pažengusio vartotojo rėžimas'; +$labels['add'] = 'Pridėti'; $labels['newuser'] = 'Pridėti įrašą'; $labels['editperms'] = 'Tvarkyti leidimus'; $labels['actions'] = 'Prieigos teisių veiksmai...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/lv_LV.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/lv_LV.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/lv_LV.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/lv_LV.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Piekļuves tiesības'; $labels['username'] = 'Lietotājs:'; $labels['advanced'] = 'Paplašinātais režīms'; +$labels['add'] = 'Pievienot'; $labels['newuser'] = 'Pievienot ierakstu'; $labels['editperms'] = 'Rediģēt piejas'; $labels['actions'] = 'Darbības ar piekļuves tiesībām...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/mk_MK.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/mk_MK.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/mk_MK.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/mk_MK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Право на пристап'; $labels['username'] = 'Корисник'; $labels['advanced'] = 'Напредно ниво'; +$labels['add'] = 'Додај'; $labels['newuser'] = 'Додади запис'; $labels['editperms'] = 'Уреди одобрение'; $labels['actions'] = 'Правото на пристапување'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ml_IN.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ml_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ml_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ml_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,28 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ +*/ +$labels['add'] = 'ചേര്‍ക്കു'; +$labels['aclother'] = 'മറ്റുള്ളത്'; +$labels['aclread'] = 'വായിച്ചവ'; +$labels['acldelete'] = 'നീക്കം ചെയ്യുക'; +$labels['shortaclr'] = 'വായിച്ചവ'; +$labels['shortacld'] = 'നീക്കം ചെയ്യുക'; +$labels['shortaclt'] = 'നീക്കം ചെയ്യുക'; +$labels['shortaclother'] = 'മറ്റുള്ളത്'; +$labels['shortaclread'] = 'വായിച്ചവ'; +$labels['shortacldelete'] = 'നീക്കം ചെയ്യുക'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/mn_MN.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/mn_MN.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/mn_MN.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/mn_MN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -46,4 +46,14 @@ $labels['acldelete'] = 'Устгах'; $labels['shortacll'] = 'Хайх'; $labels['shortaclr'] = 'Унших'; +$labels['shortaclw'] = 'Бичих'; +$labels['shortaclp'] = 'Бичлэг'; +$labels['shortacld'] = 'Устгах'; +$labels['shortaclt'] = 'Устгах'; +$labels['shortacle'] = 'Устгах'; +$labels['shortacla'] = 'Зохицуулагч'; +$labels['shortaclother'] = 'Бусад'; +$labels['shortaclread'] = 'Унших'; +$labels['shortaclwrite'] = 'Бичих'; +$labels['shortacldelete'] = 'Устгах'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/mr_IN.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/mr_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/mr_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/mr_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,27 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ +*/ +$labels['add'] = 'समावेश करा'; +$labels['aclother'] = 'इतर'; +$labels['acldelete'] = 'नष्ट करा'; +$labels['shortaclc'] = 'तयार करा'; +$labels['shortaclk'] = 'तयार करा'; +$labels['shortacld'] = 'नष्ट करा'; +$labels['shortaclt'] = 'नष्ट करा'; +$labels['shortaclother'] = 'इतर'; +$labels['shortacldelete'] = 'नष्ट करा'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ms_MY.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ms_MY.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ms_MY.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ms_MY.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,24 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ +*/ +$labels['acldelete'] = 'Padam'; +$labels['shortaclc'] = 'Cipta'; +$labels['shortaclk'] = 'Cipta'; +$labels['shortacld'] = 'Padam'; +$labels['shortaclt'] = 'Padam'; +$labels['shortacldelete'] = 'Padam'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/nb_NO.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/nb_NO.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/nb_NO.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/nb_NO.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Tilgangsrettigheter'; $labels['username'] = 'Bruker:'; $labels['advanced'] = 'Avansert modus'; +$labels['add'] = 'Legg til'; $labels['newuser'] = 'Legg til oppføring'; $labels['editperms'] = 'Rediger tilgangsrettigheter'; $labels['actions'] = 'Valg for tilgangsrettigheter.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ne_NP.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ne_NP.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ne_NP.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ne_NP.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,24 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ +*/ +$labels['acldelete'] = 'मेटाउनुहोस'; +$labels['shortaclc'] = 'बनाउनुहोस'; +$labels['shortaclk'] = 'बनाउनुहोस'; +$labels['shortacld'] = 'मेटाउनुहोस'; +$labels['shortaclt'] = 'मेटाउनुहोस'; +$labels['shortacldelete'] = 'मेटाउनुहोस'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/nl_BE.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/nl_BE.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/nl_BE.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/nl_BE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,13 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ */ +$labels['add'] = 'Toevoegen'; $labels['aclother'] = 'Anders'; +$labels['acldelete'] = 'Verwijderen'; +$labels['shortaclc'] = 'Aanmaken'; +$labels['shortaclk'] = 'Aanmaken'; +$labels['shortacld'] = 'Verwijderen'; +$labels['shortaclt'] = 'Verwijderen'; $labels['shortaclother'] = 'Anders'; +$labels['shortacldelete'] = 'Verwijderen'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/nl_NL.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/nl_NL.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/nl_NL.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/nl_NL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Toegangsrechten'; $labels['username'] = 'Gebruiker:'; $labels['advanced'] = 'Geavanceerde modus'; +$labels['add'] = 'Toevoegen'; $labels['newuser'] = 'Item toevoegen'; $labels['editperms'] = 'Rechten bewerken'; $labels['actions'] = 'Toegangsrechtenopties...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/nn_NO.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/nn_NO.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/nn_NO.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/nn_NO.inc 2018-04-11 11:14:33.000000000 +0000 @@ -18,6 +18,7 @@ $labels['sharing'] = 'Deling'; $labels['myrights'] = 'Tilgangsrettar'; $labels['username'] = 'Brukar:'; +$labels['add'] = 'Legg til'; $labels['newuser'] = 'Legg til oppføring'; $labels['actions'] = 'Val for tilgangsrettar...'; $labels['anyone'] = 'Alle brukarar (alle)'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/pl_PL.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/pl_PL.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/pl_PL.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/pl_PL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Prawa dostępu'; $labels['username'] = 'Użytkownik:'; $labels['advanced'] = 'Tryb zaawansowany'; +$labels['add'] = 'Dodaj'; $labels['newuser'] = 'Dodaj rekord'; $labels['editperms'] = 'Edytuj zezwolenia'; $labels['actions'] = 'Akcje na prawach...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ps.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ps.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ps.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ps.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,24 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ +*/ +$labels['acldelete'] = 'ړنګول'; +$labels['shortaclc'] = 'جوړول، رامنځ ته کول'; +$labels['shortaclk'] = 'جوړول، رامنځ ته کول'; +$labels['shortacld'] = 'ړنګول'; +$labels['shortaclt'] = 'ړنګول'; +$labels['shortacldelete'] = 'ړنګول'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/pt_BR.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/pt_BR.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/pt_BR.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/pt_BR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Permissões de Acesso'; $labels['username'] = 'Usuário:'; $labels['advanced'] = 'Modo avançado'; +$labels['add'] = 'Adicionar'; $labels['newuser'] = 'Adicionar entrada'; $labels['editperms'] = 'Editar permissões'; $labels['actions'] = 'Ações de direito de acesso...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/pt_PT.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/pt_PT.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/pt_PT.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/pt_PT.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Permissões de acesso'; $labels['username'] = 'Utilizador:'; $labels['advanced'] = 'Modo avançado'; +$labels['add'] = 'Adicionar'; $labels['newuser'] = 'Adicionar entrada'; $labels['editperms'] = 'Editar permissões'; $labels['actions'] = 'Acções de permissão de acesso...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ro_RO.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ro_RO.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ro_RO.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ro_RO.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Drepturi de acces'; $labels['username'] = 'Utilizator:'; $labels['advanced'] = 'Modul avansat'; +$labels['add'] = 'Adauga'; $labels['newuser'] = 'Adăugare intrare'; $labels['editperms'] = 'Editare permisiuni'; $labels['actions'] = 'Acțiunea drepturilor de acces...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ru_RU.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ru_RU.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ru_RU.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ru_RU.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Права доступа'; $labels['username'] = 'Пользователь:'; $labels['advanced'] = 'Экспертный режим'; +$labels['add'] = 'Добавить'; $labels['newuser'] = 'Добавить поле'; $labels['editperms'] = 'Редактировать права'; $labels['actions'] = 'Действия с правами доступа...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/si_LK.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/si_LK.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/si_LK.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/si_LK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,30 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ +*/ +$labels['add'] = 'එක් කරන්න'; +$labels['aclother'] = 'වෙනත්'; +$labels['aclread'] = 'කියවන්න'; +$labels['acldelete'] = 'මකන්න'; +$labels['shortaclr'] = 'කියවන්න'; +$labels['shortaclc'] = 'තනන්න'; +$labels['shortaclk'] = 'තනන්න'; +$labels['shortacld'] = 'මකන්න'; +$labels['shortaclt'] = 'මකන්න'; +$labels['shortaclother'] = 'වෙනත්'; +$labels['shortaclread'] = 'කියවන්න'; +$labels['shortacldelete'] = 'මකන්න'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/sk_SK.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/sk_SK.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/sk_SK.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/sk_SK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Prístupové oprávnenia'; $labels['username'] = 'Používateľ:'; $labels['advanced'] = 'Režim pre pokročilých'; +$labels['add'] = 'Pridať'; $labels['newuser'] = 'Pridať záznam'; $labels['editperms'] = 'Upraviť oprávnenia'; $labels['actions'] = 'Prístupové práva pre akcie...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/sl_SI.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/sl_SI.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/sl_SI.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/sl_SI.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Pravice dostopa'; $labels['username'] = 'Uporabnik:'; $labels['advanced'] = 'Napredni način'; +$labels['add'] = 'Dodaj'; $labels['newuser'] = 'Dodaj vnos'; $labels['editperms'] = 'Uredi pravice'; $labels['actions'] = 'Nastavitve pravic dostopa'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/sq_AL.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/sq_AL.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/sq_AL.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/sq_AL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,9 +15,11 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ */ +$labels['sharing'] = 'Ndarje Me të Tjerë'; $labels['myrights'] = 'Të drejta Hyrjeje'; $labels['username'] = 'Përdorues:'; $labels['advanced'] = 'Mënyra e përparuar'; +$labels['add'] = 'Shtoje'; $labels['newuser'] = 'Shtoni zë'; $labels['editperms'] = 'Përpunoni leje'; $labels['actions'] = 'Veprime të drejtash hyrjeje…'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/sr_CS.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/sr_CS.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/sr_CS.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/sr_CS.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Права приступа'; $labels['username'] = 'Корисник:'; $labels['advanced'] = 'Напредни режим'; +$labels['add'] = 'Додај'; $labels['newuser'] = 'Додај унос'; $labels['editperms'] = 'Уреди дозволе'; $labels['actions'] = 'Радње права приступа...'; @@ -49,6 +50,7 @@ $labels['shortaclk'] = 'Направи'; $labels['shortacld'] = 'Обриши'; $labels['shortaclt'] = 'Обриши'; +$labels['shortacla'] = 'Администрирај'; $labels['shortaclother'] = 'Друго'; $labels['shortaclread'] = 'Читање'; $labels['shortaclwrite'] = 'Упис'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/sv_SE.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/sv_SE.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/sv_SE.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/sv_SE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Åtkomsträttigheter'; $labels['username'] = 'Användare:'; $labels['advanced'] = 'Avancerat läge'; +$labels['add'] = 'Lägg till'; $labels['newuser'] = 'Lägg till'; $labels['editperms'] = 'Ändra rättigheter'; $labels['actions'] = 'Hantera åtkomsträttigheter...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ta_IN.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ta_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ta_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ta_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,24 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ +*/ +$labels['acldelete'] = 'நீக்கு'; +$labels['shortaclc'] = 'உருவாக்கு'; +$labels['shortaclk'] = 'உருவாக்கு'; +$labels['shortacld'] = 'நீக்கு'; +$labels['shortaclt'] = 'நீக்கு'; +$labels['shortacldelete'] = 'நீக்கு'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/th_TH.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/th_TH.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/th_TH.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/th_TH.inc 2018-04-11 11:14:33.000000000 +0000 @@ -18,9 +18,11 @@ $labels['sharing'] = 'การแชร์ข้อมูล'; $labels['myrights'] = 'สิทธิ์การเข้าใช้'; $labels['username'] = 'ผู้ใช้งาน:'; +$labels['add'] = 'เพิ่ม'; $labels['newuser'] = 'เพิ่มรายการ'; $labels['anyone'] = 'ผู้ใช้งานทั้งหมด (ใครก็ได้)'; $labels['anonymous'] = 'ผู้เยี่ยมชม (คนแปลกหน้า)'; +$labels['acll'] = 'ดู'; $labels['aclr'] = 'อ่านข้อความ'; $labels['acli'] = 'แทรก (คัดลอกไปไว้)'; $labels['aclp'] = 'โพสต์'; @@ -46,6 +48,7 @@ $labels['shortacld'] = 'ลบ'; $labels['shortaclt'] = 'ลบ'; $labels['shortaclx'] = 'ลบโฟลเดอร์'; +$labels['shortacla'] = 'Administer'; $labels['shortaclother'] = 'อื่นๆ'; $labels['shortaclread'] = 'อ่าน'; $labels['shortaclwrite'] = 'เขียน'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/ti.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/ti.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/ti.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/ti.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,4 +63,5 @@ $labels['longaclw'] = 'ዕላማትን መፍትሕ ቃላትን መልኽትታት ክልወጡ ይኽእሉ, ብዘይካ ዝተረኣዩን ዝጠፍኡን'; $labels['longacli'] = 'መልእኽቲ ናብዚ ማህደር ክጽሓፍ ወይ ክቕዳሕ ይኽእል'; $labels['longaclp'] = 'መልእኽቲ ናብዚ ማህደር ክኣቱ ይኽእል'; +$labels['longaclread'] = 'ማህደር ተኸፊቱ ክንበብ ይኽእል'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/tr_TR.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/tr_TR.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/tr_TR.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/tr_TR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Erişim İzinleri'; $labels['username'] = 'Kullanıcı:'; $labels['advanced'] = 'Gelişmiş kip'; +$labels['add'] = 'Ekle'; $labels['newuser'] = 'Kayıt ekle'; $labels['editperms'] = 'İzinleri düzenle'; $labels['actions'] = 'Erişim izinleri işlemleri...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/tzl.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/tzl.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/tzl.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/tzl.inc 2018-04-11 11:14:33.000000000 +0000 @@ -17,8 +17,11 @@ */ $labels['username'] = 'Uçeir:'; $labels['anonymous'] = 'Gästs (anonimös)'; +$labels['aclread'] = 'Lirarh'; $labels['acldelete'] = 'Zeletarh'; +$labels['shortaclr'] = 'Lirarh'; $labels['shortacld'] = 'Zeletarh'; $labels['shortaclt'] = 'Zeletarh'; +$labels['shortaclread'] = 'Lirarh'; $labels['shortacldelete'] = 'Zeletarh'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/uk_UA.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/uk_UA.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/uk_UA.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/uk_UA.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Права доступу'; $labels['username'] = 'Користувач:'; $labels['advanced'] = 'Розширений режим'; +$labels['add'] = 'Додати'; $labels['newuser'] = 'Додати запис'; $labels['editperms'] = 'Редагувати дозволи'; $labels['actions'] = 'Дії з правами доступу…'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/uz.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/uz.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/uz.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/uz.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Kirish huquqlari'; $labels['username'] = 'Foydalanuvchi:'; $labels['advanced'] = 'Kengaytirilgan rejim'; +$labels['add'] = 'Qo`shish'; $labels['newuser'] = 'Qo‘shish'; $labels['editperms'] = 'Ruxsatlarni tahrirlash'; $labels['actions'] = 'Kirish huquqi harakatlari'; @@ -34,4 +35,17 @@ $labels['acld'] = 'Xabarlarni o‘chirish'; $labels['aclt'] = 'Xabarlarni o‘chirish'; $labels['aclx'] = 'Papkani o‘chirish'; +$labels['aclother'] = 'Boshqa'; +$labels['aclread'] = 'O`qilgan'; +$labels['acldelete'] = 'O`chirish'; +$labels['shortacll'] = 'Qidirish'; +$labels['shortaclr'] = 'O`qilgan'; +$labels['shortaclp'] = 'Xat'; +$labels['shortaclc'] = 'Yaratish'; +$labels['shortaclk'] = 'Yaratish'; +$labels['shortacld'] = 'O`chirish'; +$labels['shortaclt'] = 'O`chirish'; +$labels['shortaclother'] = 'Boshqa'; +$labels['shortaclread'] = 'O`qilgan'; +$labels['shortacldelete'] = 'O`chirish'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/vi_VN.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/vi_VN.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/vi_VN.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/vi_VN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = 'Quyền truy cập'; $labels['username'] = 'Người dùng:'; $labels['advanced'] = 'Chế độ tính năng cao hơn'; +$labels['add'] = 'Thêm'; $labels['newuser'] = 'Thêm bài viết'; $labels['editperms'] = 'Sửa đổi quyền sử dụng'; $labels['actions'] = 'Các thao tác quyền truy cập'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/zh_CN.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/zh_CN.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/zh_CN.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/zh_CN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = '访问权限'; $labels['username'] = '用户:'; $labels['advanced'] = '高级模式'; +$labels['add'] = '添加'; $labels['newuser'] = '新增条目'; $labels['editperms'] = '编辑权限'; $labels['actions'] = '权限设置...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/acl/localization/zh_TW.inc roundcube-1.3.6+dfsg.1/plugins/acl/localization/zh_TW.inc --- roundcube-1.3.3+dfsg.1/plugins/acl/localization/zh_TW.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/acl/localization/zh_TW.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,6 +19,7 @@ $labels['myrights'] = '存取權限'; $labels['username'] = '使用者:'; $labels['advanced'] = '進階模式'; +$labels['add'] = '加入'; $labels['newuser'] = '新增項目'; $labels['editperms'] = '編輯權限'; $labels['actions'] = '權限設定...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/archive.php roundcube-1.3.6+dfsg.1/plugins/archive/archive.php --- roundcube-1.3.3+dfsg.1/plugins/archive/archive.php 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/archive.php 2018-04-11 11:14:33.000000000 +0000 @@ -12,7 +12,7 @@ */ class archive extends rcube_plugin { - public $task = 'settings|mail'; + public $task = 'settings|mail|login'; function init() @@ -127,9 +127,7 @@ $archive_type = $rcmail->config->get('archive_type', ''); $archive_folder = $rcmail->config->get('archive_mbox'); $archive_prefix = $archive_folder . $delimiter; - $current_mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST); $search_request = rcube_utils::get_input_value('_search', rcube_utils::INPUT_GPC); - $uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST); // count messages before changing anything if ($_POST['_from'] != 'show') { @@ -149,8 +147,8 @@ 'destinations' => array(), ); - foreach (rcmail::get_uids(null, null, $multifolder) as $mbox => $uids) { - if (!$archive_folder || strpos($mbox, $archive_prefix) === 0) { + foreach (rcmail::get_uids(null, null, $multifolder, rcube_utils::INPUT_POST) as $mbox => $uids) { + if (!$archive_folder || strpos($mbox, $archive_prefix) === 0) { $count = count($uids); continue; } diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/ar.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/ar.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/ar.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/ar.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Archive plugin | + | Copyright (C) 2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/ +*/ +$labels['unkownsender'] = 'مجهول'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/bn_BD.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/bn_BD.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/bn_BD.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/bn_BD.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Archive plugin | + | Copyright (C) 2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/ +*/ +$labels['unkownsender'] = 'অজানা'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/cs_CZ.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/cs_CZ.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/cs_CZ.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/cs_CZ.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,7 +25,9 @@ $labels['archivetype'] = 'Rozdělit archiv podle'; $labels['archivetypeyear'] = 'Rok (např. Archiv/2012)'; $labels['archivetypemonth'] = 'Měsíc (např. Archiv/2012/06)'; +$labels['archivetypetbmonth'] = 'Měsíc - kompatibilní s Thunderbird klientem (např. Archiv/2012/2012-06)'; $labels['archivetypefolder'] = 'Původní složka'; $labels['archivetypesender'] = 'E-mail odesílatele'; $labels['unkownsender'] = 'neznámý'; +$labels['readonarchive'] = 'Při archivaci označit zprávu jako přečtenou'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/de_DE.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/de_DE.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/de_DE.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/de_DE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,7 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/ */ -$labels['buttontext'] = 'Archiv'; +$labels['buttontext'] = 'Ar­chi­vie­ren'; $labels['buttontitle'] = 'Nachricht archivieren'; $labels['archived'] = 'Nachricht erfolgreich archiviert'; $labels['archivedreload'] = 'Erfolgreich archiviert. Bitte die Seite aktualisieren, um die neuen Archivordner zu sehen.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/en_GB.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/en_GB.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/en_GB.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/en_GB.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['archivetype'] = 'Divide archive by'; $labels['archivetypeyear'] = 'Year (e.g. Archive/2012)'; $labels['archivetypemonth'] = 'Month (e.g. Archive/2012/06)'; +$labels['archivetypetbmonth'] = 'Month - Thunderbird compatible (e.g. Archive/2012/2012-06)'; $labels['archivetypefolder'] = 'Original folder'; $labels['archivetypesender'] = 'Sender email'; $labels['unkownsender'] = 'unknown'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/eo.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/eo.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/eo.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/eo.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,4 +19,6 @@ $labels['buttontitle'] = 'Arkivigi ĉi tiun mesaĝon'; $labels['archived'] = 'Sukcese arkivigita'; $labels['archivefolder'] = 'Arkivo'; +$labels['settingstitle'] = 'Arkivigi'; +$labels['unkownsender'] = 'nekonata'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/eu_ES.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/eu_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/eu_ES.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/eu_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,13 +15,13 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/ */ -$labels['buttontext'] = 'Gorde'; -$labels['buttontitle'] = 'Gorde mezu hau'; -$labels['archived'] = 'Ongi gorde da'; -$labels['archivedreload'] = 'Ongi gorde da. Freskatu orria fitxategi-karpeta berria ikusteko.'; -$labels['archiveerror'] = 'Mezu batzuk ezin dira gorde.'; -$labels['archivefolder'] = 'Gorde'; -$labels['settingstitle'] = 'Gorde'; +$labels['buttontext'] = 'Artxibatu'; +$labels['buttontitle'] = 'Artxibatu mezu hau'; +$labels['archived'] = 'Ongi artxibatu da'; +$labels['archivedreload'] = 'Ongi artxibatu da. Birkargatu orria artxiboan karpeta berriak ikusteko.'; +$labels['archiveerror'] = 'Mezu batzuk ezin izan dira artxibatu'; +$labels['archivefolder'] = 'Artxibatu'; +$labels['settingstitle'] = 'Artxibatu'; $labels['archivetype'] = 'Banatu honen arabera'; $labels['archivetypeyear'] = 'Urtea (e.b. Archive/2012)'; $labels['archivetypemonth'] = 'Hilabete (e.b. Archive/2012/06)'; @@ -29,5 +29,5 @@ $labels['archivetypefolder'] = 'Jatorrizko karpeta'; $labels['archivetypesender'] = 'Bidaltzailearen helbidea'; $labels['unkownsender'] = 'ezezaguna'; -$labels['readonarchive'] = 'Markatu mezua irakurri bezala artxiboan'; +$labels['readonarchive'] = 'Markatu mezua irakurrita bezala artxiboan'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/he_IL.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/he_IL.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/he_IL.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/he_IL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -23,8 +23,9 @@ $labels['archivefolder'] = 'ארכיון'; $labels['settingstitle'] = 'ארכיב'; $labels['archivetype'] = 'לחלק את הארכיב על ידי'; -$labels['archivetypeyear'] = 'שנה ( לדוגמה, ארכיב/2012/96 )'; -$labels['archivetypemonth'] = 'חודש ( לדוגמה, ארכיב/2012/96 )'; +$labels['archivetypeyear'] = 'שנה ( לדוגמה, ארכיב/2012 )'; +$labels['archivetypemonth'] = 'חודש ( לדוגמה, ארכיב/2012/06 )'; +$labels['archivetypetbmonth'] = 'חודש - תואם תאנדרבירד ( לדוגמה, ארכיב/2012/2012-06 )'; $labels['archivetypefolder'] = 'תיקיה מקורית'; $labels['archivetypesender'] = 'שולח ההודעה'; $labels['unkownsender'] = 'לא ידוע'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/hi_IN.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/hi_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/hi_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/hi_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Archive plugin | + | Copyright (C) 2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/ +*/ +$labels['unkownsender'] = 'अज्ञात'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/id_ID.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/id_ID.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/id_ID.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/id_ID.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['archivetype'] = 'Pisah arsip berdasarkan'; $labels['archivetypeyear'] = 'Tahun (contoh: Arsip/2012)'; $labels['archivetypemonth'] = 'Bulan (contoh: Arsip/2012/06)'; +$labels['archivetypetbmonth'] = 'Bulan - Kecocokan Thunderbird ( contoh: Arsip/2012/2012-06 )'; $labels['archivetypefolder'] = 'Folder asli'; $labels['archivetypesender'] = 'Email pengirim'; $labels['unkownsender'] = 'Tidak dikenal'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/ka_GE.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/ka_GE.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/ka_GE.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/ka_GE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Archive plugin | + | Copyright (C) 2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/ +*/ +$labels['unkownsender'] = 'უცნობი'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/ml_IN.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/ml_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/ml_IN.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/ml_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,4 +19,6 @@ $labels['buttontitle'] = 'ഈ മെസ്സേജ് ശേഖരിക്കുക'; $labels['archived'] = 'വിജയകരമായി ശേഖരിച്ചു'; $labels['archivefolder'] = 'ശേഖരം'; +$labels['settingstitle'] = 'ശേഖരം'; +$labels['unkownsender'] = 'അറിയാത്ത'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/mr_IN.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/mr_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/mr_IN.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/mr_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,4 +19,6 @@ $labels['buttontitle'] = 'हा संदेश जतन करा'; $labels['archived'] = 'यशस्वीरीत्या जतन केला'; $labels['archivefolder'] = 'जतन केलेला'; +$labels['settingstitle'] = 'जतन केलेला'; +$labels['unkownsender'] = 'माहित नसलेला'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/ms_MY.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/ms_MY.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/ms_MY.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/ms_MY.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Archive plugin | + | Copyright (C) 2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/ +*/ +$labels['unkownsender'] = 'tidak diketahui'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/ne_NP.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/ne_NP.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/ne_NP.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/ne_NP.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Archive plugin | + | Copyright (C) 2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/ +*/ +$labels['unkownsender'] = 'अज्ञात'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/nl_BE.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/nl_BE.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/nl_BE.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/nl_BE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Archive plugin | + | Copyright (C) 2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/ +*/ +$labels['unkownsender'] = 'onbekend'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/ps.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/ps.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/ps.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/ps.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Archive plugin | + | Copyright (C) 2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/ +*/ +$labels['unkownsender'] = 'نامعلوم'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/si_LK.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/si_LK.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/si_LK.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/si_LK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,4 +19,6 @@ $labels['buttontitle'] = 'මෙම පණිවිඩය සංරක්‍ෂණය කරන්න'; $labels['archived'] = 'සංරක්‍ෂණය සාර්ථකයි'; $labels['archivefolder'] = 'සංරක්‍ෂණය'; +$labels['settingstitle'] = 'සංරක්‍ෂණය'; +$labels['unkownsender'] = 'නොදනී'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/sl_SI.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/sl_SI.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/sl_SI.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/sl_SI.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['archivetype'] = 'Razdeli arhiv glede na'; $labels['archivetypeyear'] = 'Leto (npr. Arhiv/2012)'; $labels['archivetypemonth'] = 'Mesec (npr. Arhiv/2012/06)'; +$labels['archivetypetbmonth'] = 'Mesec - podprto tudi v odjemalcu Thunderbird (npr. Arhiv/2012/2012-06)'; $labels['archivetypefolder'] = 'Izvorna mapa'; $labels['archivetypesender'] = 'Naslov pošiljatelja'; $labels['unkownsender'] = 'neznan'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/sq_AL.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/sq_AL.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/sq_AL.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/sq_AL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['archivetype'] = 'Ndaje arkivin sipas'; $labels['archivetypeyear'] = 'Vit (p.sh. Arkiv/2012)'; $labels['archivetypemonth'] = 'Muaj (p.sh. Arkiv/2012/06)'; +$labels['archivetypetbmonth'] = 'Muaj - i përputhshëm me Thunderbird-in (p.sh. Arkiv/2012/2012-06)'; $labels['archivetypefolder'] = 'Dosje origjinale'; $labels['archivetypesender'] = 'Email dërguesi'; $labels['unkownsender'] = 'e panjohur'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/ta_IN.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/ta_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/ta_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/ta_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Archive plugin | + | Copyright (C) 2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/ +*/ +$labels['unkownsender'] = 'தெரியாத'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/th_TH.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/th_TH.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/th_TH.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/th_TH.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Archive plugin | + | Copyright (C) 2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/ +*/ +$labels['unkownsender'] = 'ไม่ทราบ'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/archive/localization/zh_CN.inc roundcube-1.3.6+dfsg.1/plugins/archive/localization/zh_CN.inc --- roundcube-1.3.3+dfsg.1/plugins/archive/localization/zh_CN.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/archive/localization/zh_CN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['archivetype'] = '分类存档按'; $labels['archivetypeyear'] = '年(例如 存档/2012)'; $labels['archivetypemonth'] = '月(例如 存档/2012/06)'; +$labels['archivetypetbmonth'] = '月份 - Thunderbird 兼容格式 (比如 Archive/2012/2012-06)'; $labels['archivetypefolder'] = '原始文件夹'; $labels['archivetypesender'] = '发件人邮件'; $labels['unkownsender'] = '未知'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/cs_CZ.inc roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/cs_CZ.inc --- roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/cs_CZ.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/cs_CZ.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/ */ +$messages['missingattachment'] = "Chybějící příloha?"; $messages['forgotattachment'] = "Nezapomněli jste připojit přílohu?"; $messages['reminderoption'] = "Upozorňovat na zapomenuté přílohy"; $messages['keywords'] = "příloha,přílohy,příloze,přílohu,přiloženém,připojeném,CV,životopis"; diff -Nru roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/de_CH.inc roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/de_CH.inc --- roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/de_CH.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/de_CH.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/ */ +$messages['missingattachment'] = "Fehlender Anhang?"; $messages['forgotattachment'] = "Haben Sie möglicherweise vergessen eine Datei anzuhängen?"; $messages['reminderoption'] = "Vor vergessenen Anhängen warnen"; $messages['keywords'] = "anbei,anhang,angehängt,angefügt,beigefügt,beliegend"; diff -Nru roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/en_GB.inc roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/en_GB.inc --- roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/en_GB.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/en_GB.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/ */ +$messages['missingattachment'] = "Missing attachment?"; $messages['forgotattachment'] = "Did you forget to attach a file?"; $messages['reminderoption'] = "Remind about forgotten attachments"; $messages['keywords'] = "attachment,file,attach,attached,attaching,enclosed,CV,cover letter"; diff -Nru roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/es_ES.inc roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/es_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/es_ES.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/es_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/ */ +$messages['missingattachment'] = "¿Falta archivo?"; $messages['forgotattachment'] = "¿Olvidó adjuntar un fichero al mensaje?"; $messages['reminderoption'] = "Recordatorio sobre adjuntos olvidados"; $messages['keywords'] = "adjunto, archivo, adjuntar, unido, adjuntando, cerrado, CV, carta de presentación"; diff -Nru roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/he_IL.inc roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/he_IL.inc --- roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/he_IL.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/he_IL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/ */ +$messages['missingattachment'] = "האם חסרה צרופה?"; $messages['forgotattachment'] = "האם שכחת לצרף קובץ?"; $messages['reminderoption'] = "להזכיר לצרף נספח"; $messages['keywords'] = "נספח,קובץ,לצרף,מצורף,מצרף,מצרפת,רצ\"ב,קו\"ח,קורות חיים"; diff -Nru roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/id_ID.inc roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/id_ID.inc --- roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/id_ID.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/id_ID.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/ */ +$messages['missingattachment'] = "Kehilangan lampiran?"; $messages['forgotattachment'] = "Apakah anda lupa melampirkan sebuah file?"; $messages['reminderoption'] = "Ingatkan tentang lampiran yang terlupakan"; -$messages['keywords'] = "attachment,file,attach,attached,attaching,enclosed,CV,cover letter"; +$messages['keywords'] = "lampiran, file, terlampir, dilampirkan, melampirkan, lampiran tertutup, CV, sampul surat"; diff -Nru roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/ja_JP.inc roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/ja_JP.inc --- roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/ja_JP.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/ja_JP.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/ */ +$messages['missingattachment'] = "添付ファイルを忘れてませんか?"; $messages['forgotattachment'] = "ファイルの添付を忘れていませんか?"; $messages['reminderoption'] = "添付ファイルの付け忘れを確認"; $messages['keywords'] = "添付,ファイル,添付ファイル,同封,添え状"; diff -Nru roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/lt_LT.inc roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/lt_LT.inc --- roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/lt_LT.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/lt_LT.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/ */ +$messages['missingattachment'] = "Trūksta priedo?"; $messages['forgotattachment'] = "Ar nepamiršote prisegti priedo?"; $messages['reminderoption'] = "Priminti apie neprisegtus priedus"; $messages['keywords'] = "priedas, byla, prisegti, prisegta, prisegama, uždaras, CV, laiškas"; diff -Nru roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/sl_SI.inc roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/sl_SI.inc --- roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/sl_SI.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/sl_SI.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/ */ +$messages['missingattachment'] = "Ste pozabili na priponko?"; $messages['forgotattachment'] = "Ste pozabili pripeti datoteko?"; $messages['reminderoption'] = "Opozorilo za dodajanje priponk"; $messages['keywords'] = "priponka,datoteka,pripeti,pripeta,pripenjati,priložen,priložiti,CV,spremno pismo"; diff -Nru roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/sq_AL.inc roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/sq_AL.inc --- roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/sq_AL.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/sq_AL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/ */ +$messages['missingattachment'] = "Mungon bashkëngjitje?"; $messages['forgotattachment'] = "Mos harruat të bashkëngjitni një kartelë?"; $messages['reminderoption'] = "Kujtoji për bashkëngjitje të harruara"; -$messages['keywords'] = "bashkëngjitje,skedar,kartelë,bashkëngjite,bashkëngjitur,përfshirë,CV,letër shoqëruese"; +$messages['keywords'] = "bashkëngjitje,kartelë,bashkëngjite,bashkëngjitur,përfshirë,CV,letër shoqëruese"; diff -Nru roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/zh_CN.inc roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/zh_CN.inc --- roundcube-1.3.3+dfsg.1/plugins/attachment_reminder/localization/zh_CN.inc 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/attachment_reminder/localization/zh_CN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/ */ +$messages['missingattachment'] = "缺少附件吗?"; $messages['forgotattachment'] = "您似乎忘记添加附件了,是否继续发送?"; $messages['reminderoption'] = "忘记添加附件提醒"; $messages['keywords'] = "attachment,file,attach,attached,attaching,enclosed,CV,cover letter"; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/enigma.js roundcube-1.3.6+dfsg.1/plugins/enigma/enigma.js --- roundcube-1.3.3+dfsg.1/plugins/enigma/enigma.js 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/enigma.js 2018-04-11 11:14:33.000000000 +0000 @@ -99,7 +99,7 @@ size = $('#key-size').val(); $('[name="identity[]"]:checked').each(function() { - users.push(this.value); + users.push({name: $(this).data('name') || '', email: $(this).data('email')}); }); // validate the form @@ -114,15 +114,15 @@ // generate keys // use OpenPGP.js if browser supports required features - if (window.openpgp && window.crypto && (window.crypto.getRandomValues || window.crypto.subtle)) { + if (window.openpgp && (window.msCrypto || (window.crypto && (window.crypto.getRandomValues || window.crypto.subtle)))) { lock = this.set_busy(true, 'enigma.keygenerating'); options = { numBits: size, - userId: users, + userIds: users, passphrase: password }; - openpgp.generateKeyPair(options).then(function(keypair) { + openpgp.generateKey(options).then(function(keypair) { // success var post = {_a: 'import', _keys: keypair.privateKeyArmored, _generated: 1, _passwd: password, _keyid: keypair.key.primaryKey.fingerprint}; @@ -131,6 +131,7 @@ rcmail.http_post('plugin.enigmakeys', post, lock); }, function(error) { // failure + console.error(error); rcmail.set_busy(false, null, lock); rcmail.display_message(rcmail.get_label('enigma.keygenerateerror'), 'error'); }); diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/lib/enigma_engine.php roundcube-1.3.6+dfsg.1/plugins/enigma/lib/enigma_engine.php --- roundcube-1.3.3+dfsg.1/plugins/enigma/lib/enigma_engine.php 2017-11-08 18:42:57.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/lib/enigma_engine.php 2018-04-11 11:14:33.000000000 +0000 @@ -29,6 +29,7 @@ private $pgp_driver; private $smime_driver; private $password_time; + private $cache = array(); public $decryptions = array(); public $signatures = array(); @@ -348,7 +349,7 @@ $from = $from[1]; // find my key - if ($from && ($key = $this->find_key($from))) { + if ($from && ($key = $this->find_key($from, true))) { $pubkey_armor = $this->export_key($key->id); if (!$pubkey_armor instanceof enigma_error) { @@ -979,6 +980,10 @@ */ function find_key($email, $can_sign = false) { + if ($can_sign && array_key_exists($email, $this->cache)) { + return $this->cache[$email]; + } + $this->load_pgp_driver(); $result = $this->pgp_driver->list_keys($email); @@ -988,13 +993,25 @@ } $mode = $can_sign ? enigma_key::CAN_SIGN : enigma_key::CAN_ENCRYPT; + $ret = null; // check key validity and type foreach ($result as $key) { - if ($subkey = $key->find_subkey($email, $mode)) { - return $key; + if (($subkey = $key->find_subkey($email, $mode)) + && (!$can_sign || $key->get_type() == enigma_key::TYPE_KEYPAIR) + ) { + $ret = $key; + break; } } + + // cache private key info for better performance + // we can skip one list_keys() call when signing and attaching a key + if ($can_sign) { + $this->cache[$email] = $ret; + } + + return $ret; } /** diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/lib/enigma_ui.php roundcube-1.3.6+dfsg.1/plugins/enigma/lib/enigma_ui.php --- roundcube-1.3.3+dfsg.1/plugins/enigma/lib/enigma_ui.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/lib/enigma_ui.php 2018-04-11 11:14:33.000000000 +0000 @@ -721,9 +721,14 @@ // get user's identities $identities = $this->rc->user->list_identities(null, true); $checkbox = new html_checkbox(array('name' => 'identity[]')); - foreach ((array) $identities as $idx => $ident) { + + $plugin = $this->rc->plugins->exec_hook('enigma_user_identities', array('identities' => $identities)); + $identities = $plugin['identities']; + + foreach ($identities as $idx => $ident) { $name = empty($ident['name']) ? ($ident['email']) : $ident['ident']; - $identities[$idx] = html::label(null, $checkbox->show($name, array('value' => $name)) . rcube::Q($name)); + $attr = array('value' => $idx, 'data-name' => $ident['name'], 'data-email' => $ident['email']); + $identities[$idx] = html::label(null, $checkbox->show($idx, $attr) . rcube::Q($name)); } $table->add('title', html::label('key-name', rcube::Q($this->enigma->gettext('newkeyident')))); diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ar.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ar.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ar.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ar.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,21 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['expiresnever'] = 'أبداً'; +$labels['unknown'] = 'مجهول'; +$labels['newkeypass'] = 'كلمة المرور'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ar_SA.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ar_SA.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ar_SA.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ar_SA.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,23 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'الاسم'; +$labels['subkeycreated'] = 'أُنشئ في'; +$labels['expiresnever'] = 'أبداً'; +$labels['unknown'] = 'مجهول'; +$labels['newkeypass'] = 'كلمة المرور'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ast.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ast.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ast.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ast.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,23 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Nome'; +$labels['subkeycreated'] = 'Creáu'; +$labels['expiresnever'] = 'nunca'; +$labels['unknown'] = 'desconocíu'; +$labels['newkeypass'] = 'Contraseña'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/az_AZ.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/az_AZ.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/az_AZ.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/az_AZ.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,25 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Ad'; +$labels['keyid'] = 'Açar ID'; +$labels['typeencrypt'] = 'Şifrələ'; +$labels['subkeycreated'] = 'Yaradılma tarixi'; +$labels['expiresnever'] = 'heç vaxt'; +$labels['unknown'] = 'naməlum'; +$labels['newkeypass'] = 'Şifrə'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/be_BE.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/be_BE.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/be_BE.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/be_BE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,24 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Назва'; +$labels['subkeycreated'] = 'Створаны'; +$labels['expiresnever'] = 'ніколі'; +$labels['unknown'] = 'невядома'; +$labels['keychpass'] = 'Змяніць пароль'; +$labels['newkeypass'] = 'Пароль'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/bg_BG.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/bg_BG.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/bg_BG.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/bg_BG.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = 'Отмяна'; $labels['keysend'] = 'Изпрати писмо с публичен ключ'; $labels['keychpass'] = 'Промени паролата'; -$labels['newkeyident'] = 'Самоличност:'; -$labels['newkeypass'] = 'Парола:'; -$labels['newkeypassconfirm'] = 'Потвърди паролата:'; -$labels['newkeysize'] = 'Размер на ключа:'; +$labels['newkeypass'] = 'Парола'; $labels['key2048'] = '2048 бита (по подразбиране)'; $labels['key4096'] = '4096 бита (по-сигурен)'; $labels['keygenerating'] = 'Генериране на ключове...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/bn_BD.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/bn_BD.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/bn_BD.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/bn_BD.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,21 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['expiresnever'] = 'কখোনোই না'; +$labels['unknown'] = 'অজানা'; +$labels['newkeypass'] = 'গোপোন শব্দ (password)'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/br.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/br.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/br.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/br.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = 'Dizorniañ'; $labels['keysend'] = 'Kas an alc\'hwez foran en ur gemennadenn'; $labels['keychpass'] = 'Kemmañ ar ger-tremen'; -$labels['newkeyident'] = 'Pivelezh:'; -$labels['newkeypass'] = 'Ger-tremen:'; -$labels['newkeypassconfirm'] = 'Kadarnaat ar ger-tremen:'; -$labels['newkeysize'] = 'Ment an alc\'hwez:'; +$labels['newkeypass'] = 'Ger-Tremen'; $labels['key2048'] = '2048 bit - dre ziouer'; $labels['key4096'] = '4096 bit - diogeloc\'h'; $labels['keygenerating'] = 'O c\'henel an alc\'hwezioù...'; @@ -81,6 +78,7 @@ $labels['onlypubkeys'] = 'Ezporzhiañ an alc\'hwezhioù foran hepken'; $labels['withprivkeys'] = 'Ezporzhiañ an alc\'hwezioù kuzh'; $labels['findkey'] = 'Klask war an dafariad(où) alc\'hwezioù'; +$labels['keyimportsearchlabel'] = 'Klask war an dafariad(où) alc\'hwezioù'; $messages['sigvalid'] = 'Sinadur gwiriet a-berzh $sender.'; $messages['sigvalidpartial'] = 'Sinadur gwiriet a-berzh $sender, met ul lodenn eus ar c\'horf n\'eo ket enrineget.'; $messages['siginvalid'] = 'Sinadur didalvoudek a-berzh $sender.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/bs_BA.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/bs_BA.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/bs_BA.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/bs_BA.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,24 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Ime'; +$labels['subkeycreated'] = 'Kreirano'; +$labels['expiresnever'] = 'nikad'; +$labels['unknown'] = 'nepoznato'; +$labels['keychpass'] = 'Promijeni šifru'; +$labels['newkeypass'] = 'Šifra'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ca_ES.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ca_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ca_ES.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ca_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,26 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Nom'; +$labels['keyid'] = 'ID de la clau'; +$labels['typeencrypt'] = 'Xifrar'; +$labels['subkeycreated'] = 'Creat'; +$labels['expiresnever'] = 'mai'; +$labels['unknown'] = 'desconegut'; +$labels['keychpass'] = 'Canvia la contrasenya'; +$labels['newkeypass'] = 'Contrasenya'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/cs_CZ.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/cs_CZ.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/cs_CZ.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/cs_CZ.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Typ klíče'; $labels['fingerprint'] = 'Otisk prstu'; $labels['subkeys'] = 'Podklíče'; +$labels['keyprops'] = 'Vlastnosti klíče'; $labels['basicinfo'] = 'Základní informace'; $labels['userids'] = 'Další uživatelé'; $labels['typepublickey'] = 'veřejný klíč'; @@ -50,6 +51,7 @@ $labels['supportdecryption'] = 'Povolit dešifrování zpráv.'; $labels['signdefault'] = 'Podepisovat všechny zprávy'; $labels['encryptdefault'] = 'Šifrovat všechny zprávy'; +$labels['attachpubkeydefault'] = 'Automaticky připojit svůj veřejný klíč'; $labels['passwordtime'] = 'Uchovat hesla pro privátní klíče pro'; $labels['nminutes'] = '$m minut(a)'; $labels['wholesession'] = 'celá relace'; @@ -62,22 +64,25 @@ $labels['keyrevoke'] = 'Revokovat'; $labels['keysend'] = 'Odeslat veřejný klíč ve zprávě'; $labels['keychpass'] = 'Změnit heslo'; -$labels['newkeyident'] = 'Identita:'; -$labels['newkeypass'] = 'Heslo:'; -$labels['newkeypassconfirm'] = 'Potvrdit heslo:'; -$labels['newkeysize'] = 'Velikost klíče:'; +$labels['newkeyident'] = 'Identita'; +$labels['newkeypass'] = 'Heslo'; +$labels['newkeypassconfirm'] = 'Potvrdit heslo'; +$labels['newkeysize'] = 'Velikost klíče'; $labels['key2048'] = '2048 bitů - výchozí'; $labels['key4096'] = '4093 bítů - více bezpečné'; $labels['keygenerating'] = 'Generuji klíče...'; $labels['encryptionoptions'] = 'Možnosti šifrování...'; $labels['encryptmsg'] = 'Zašifrovat tuto zprávu'; $labels['signmsg'] = 'Digitálně podepsat tuto zprávu'; +$labels['sendunencrypted'] = 'Poslat nešifrovaně'; $labels['enterkeypasstitle'] = 'Zadejte heslo pro klíč'; $labels['enterkeypass'] = 'Heslo je nutné k odemknutí soukromého klíče ($keyid) pro uživatele: $user.'; $labels['arialabelkeyexportoptions'] = 'Možnosti pro export klíčů'; $labels['attachpubkeymsg'] = 'Připojit můj veřejný klíč'; +$labels['keyexportprompt'] = 'Chcete do uloženého souboru s klíči OpenPGP zahrnout i tajné klíče?'; $labels['onlypubkeys'] = 'Exportovat pouze veřejné klíče'; $labels['withprivkeys'] = 'Exportovat soukromé klíče'; +$labels['findkey'] = 'Hledat klíč na keyserveru'; $labels['keyimportlabel'] = 'Importovat ze souboru'; $labels['keyimportsearchlabel'] = 'Hledat klíč na keyserveru'; $messages['sigvalid'] = 'Ověřený podpis od $sender.'; @@ -89,9 +94,12 @@ $messages['decryptok'] = 'Zpráva byla dešifrována.'; $messages['decrypterror'] = 'Dešifrování selhalo.'; $messages['decryptnokey'] = 'Dešifrování selhalo. Veřejný klíč nebyl nalezen. ID klíče: $keyid.'; +$messages['decryptbadpass'] = 'Dešifrování selhalo. Špatné heslo.'; $messages['decryptnopass'] = 'Dešifrování selhalo. Heslo pro klíč je požadováno.'; +$messages['decryptpartial'] = 'Zpráva byla dešifrována, ale část jejího těla nebyla zašifrovaná.'; $messages['signerror'] = 'Podepisování selhalo.'; $messages['signnokey'] = 'Podepisování selhalo. Soukromý klíč nebyl nalezen.'; +$messages['signbadpass'] = 'Podepisování selhalo. Špatné heslo.'; $messages['signnopass'] = 'Podepisování selhalo. Heslo pro klíč je požadováno.'; $messages['encrypterror'] = 'Šifrování selhalo.'; $messages['encryptnokey'] = 'Šifrování selhalo. Veřejný klíč pro email $email nebyl nalezen.'; @@ -106,10 +114,12 @@ $messages['keyremovesuccess'] = 'Klíč(e) byl(y) úspěšně odstraněn(y).'; $messages['keyremoveerror'] = 'Nemohu smazat vybraný/é klíč(e).'; $messages['keyimporttext'] = 'Můžete naimportovat soukromý/é a veřejný/é klíč(e) nebo podpisy pro revokaci ve formátu ASCII-Armor.'; +$messages['keyimportsearchtext'] = 'Veřejné klíče můžete vyhledávat podle identifikátoru klíče, uživatele, nebo e-mailové adresy a potom je přímo importovat.'; $messages['formerror'] = 'Prosím vyplňte tento formulář. Všechna pole jsou požadována.'; $messages['passwordsdiffer'] = 'Zadaná hesla se neshodují!'; $messages['keygenerateerror'] = 'Selhalo generování páru klíčů'; $messages['keygeneratesuccess'] = 'Pár klíčů byl úspěšně vygenerován a naimportován.'; $messages['keygennosupport'] = 'Váš webový prohlížeč nepodporuje kryptografii. Nemohu vygenerovat pár klíčů.'; +$messages['noidentselected'] = 'Pro tento klíč si musíte vybrat alespoň jednu identitu!'; $messages['nonameident'] = 'Identita musí mít definované uživatelské jméno.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/cy_GB.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/cy_GB.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/cy_GB.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/cy_GB.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = 'Dirymu'; $labels['keysend'] = 'Danfon allwedd gyhoeddus mewn neges'; $labels['keychpass'] = 'Newid cyfrinair'; -$labels['newkeyident'] = 'Personoliaeth:'; -$labels['newkeypass'] = 'Cyfrinair:'; -$labels['newkeypassconfirm'] = 'Cadarnhau cyfrinair:'; -$labels['newkeysize'] = 'Maint allwedd:'; +$labels['newkeypass'] = 'Cyfrinair'; $labels['key2048'] = '2048 did - diofyn'; $labels['key4096'] = '4096 did - mwy cadarn'; $labels['keygenerating'] = 'Yn creu allweddi...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/da_DK.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/da_DK.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/da_DK.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/da_DK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -16,9 +16,11 @@ For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ */ $labels['keyname'] = 'Navn'; +$labels['keyid'] = 'NøgleID'; $labels['fingerprint'] = 'Fingeravtryk'; $labels['typeencrypt'] = 'Krypter'; $labels['subkeyid'] = 'ID'; +$labels['subkeycreated'] = 'Oprettet'; $labels['subkeyexpires'] = 'Udløber'; $labels['expiresnever'] = 'aldrig'; $labels['unknown'] = 'ukendt'; @@ -26,7 +28,6 @@ $labels['valid'] = 'valid'; $labels['keyremove'] = 'Fjern'; $labels['keychpass'] = 'Skift kodeord:'; -$labels['newkeyident'] = 'Identitet:'; -$labels['newkeypass'] = 'Kodeord'; +$labels['newkeypass'] = 'Adgangskode'; $labels['keyimportlabel'] = 'Importer fra fil'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/de_CH.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/de_CH.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/de_CH.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/de_CH.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = 'Widerrufen'; $labels['keysend'] = 'Öffentlichen Schlüssel versenden'; $labels['keychpass'] = 'Passwort ändern'; -$labels['newkeyident'] = 'Identität:'; -$labels['newkeypass'] = 'Passwort:'; -$labels['newkeypassconfirm'] = 'Passwort bestätigen:'; -$labels['newkeysize'] = 'Schlüssellänge:'; +$labels['newkeypass'] = 'Passwort'; $labels['key2048'] = '2048 bits - standard'; $labels['key4096'] = '4096 bits - sicher'; $labels['keygenerating'] = 'Schlüssel generieren...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/de_DE.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/de_DE.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/de_DE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/de_DE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Schlüsseltyp'; $labels['fingerprint'] = 'Fingerabdruck'; $labels['subkeys'] = 'Unterschlüssel'; +$labels['keyprops'] = 'Schlüssel-Eigenschaften'; $labels['basicinfo'] = 'Allgemeine Informationen'; $labels['userids'] = 'Zusätzliche Benutzer'; $labels['typepublickey'] = 'Öffentlicher Schlüssel'; @@ -63,10 +64,10 @@ $labels['keyrevoke'] = 'Widerrufen'; $labels['keysend'] = 'Öffentlichen Schlüssel versenden'; $labels['keychpass'] = 'Passwort ändern'; -$labels['newkeyident'] = 'Identität:'; -$labels['newkeypass'] = 'Passwort:'; -$labels['newkeypassconfirm'] = 'Passwort bestätigen:'; -$labels['newkeysize'] = 'Schlüssellänge:'; +$labels['newkeyident'] = 'Identität'; +$labels['newkeypass'] = 'Passwort'; +$labels['newkeypassconfirm'] = 'Passwort bestätigen'; +$labels['newkeysize'] = 'Schlüssel-Größe'; $labels['key2048'] = '2048 Bit - Vorgabe'; $labels['key4096'] = '4096 Bit - mehr Sicherheit'; $labels['keygenerating'] = 'Schlüssel werden erstellt …'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/el_GR.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/el_GR.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/el_GR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/el_GR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = 'Απόσυρση'; $labels['keysend'] = 'Αποστολή δημοσίου κλειδιού στο μήνυμα'; $labels['keychpass'] = 'Αλλαγή κωδικού'; -$labels['newkeyident'] = 'Αναγνωριστικό:'; -$labels['newkeypass'] = 'Κωδικός:'; -$labels['newkeypassconfirm'] = 'Επιβεβαίωση κωδικού:'; -$labels['newkeysize'] = 'Μέγεθος κλειδιού:'; +$labels['newkeypass'] = 'Κωδικός Πρόσβασης'; $labels['key2048'] = '2048 bits - προκαθορισμένο'; $labels['key4096'] = '4096 bits - ασφαλέστερο'; $labels['keygenerating'] = 'Δημιουργία κλειδιών...'; @@ -82,6 +79,7 @@ $labels['withprivkeys'] = 'Εξαγωγή Μυστικών Κλειδιών'; $labels['findkey'] = 'Αναζήτηση στον(ους) εξυπηρετητή(ές) κλειδιών'; $labels['keyimportlabel'] = 'Εισαγωγή από αρχείο'; +$labels['keyimportsearchlabel'] = 'Αναζήτηση στον(ους) εξυπηρετητή(ές) κλειδιών'; $messages['sigvalid'] = 'Επαληθευμένη υπογραφή από τον $sender.'; $messages['sigvalidpartial'] = 'Επαληθευμένη υπογραφή από τον $sender, αλλά τμήμα του κειμένου δεν έχει υπογραφεί.'; $messages['siginvalid'] = 'Άκυρη υπογραφή από τον $sender.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/en_CA.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/en_CA.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/en_CA.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/en_CA.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,23 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Name'; +$labels['subkeycreated'] = 'Created'; +$labels['expiresnever'] = 'never'; +$labels['unknown'] = 'unknown'; +$labels['newkeypass'] = 'Password'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/en_GB.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/en_GB.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/en_GB.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/en_GB.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Key type'; $labels['fingerprint'] = 'Fingerprint'; $labels['subkeys'] = 'Subkeys'; +$labels['keyprops'] = 'Key properties'; $labels['basicinfo'] = 'Basic Information'; $labels['userids'] = 'Additional Users'; $labels['typepublickey'] = 'public key'; @@ -63,10 +64,10 @@ $labels['keyrevoke'] = 'Revoke'; $labels['keysend'] = 'Send public key in a message'; $labels['keychpass'] = 'Change password'; -$labels['newkeyident'] = 'Identity:'; -$labels['newkeypass'] = 'Password:'; -$labels['newkeypassconfirm'] = 'Confirm password:'; -$labels['newkeysize'] = 'Key size:'; +$labels['newkeyident'] = 'Identity'; +$labels['newkeypass'] = 'Password'; +$labels['newkeypassconfirm'] = 'Confirm password'; +$labels['newkeysize'] = 'Key size'; $labels['key2048'] = '2048 bits - default'; $labels['key4096'] = '4096 bits - more secure'; $labels['keygenerating'] = 'Generating keys...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/eo.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/eo.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/eo.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/eo.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,22 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['subkeycreated'] = 'Kreita'; +$labels['expiresnever'] = 'neniam'; +$labels['unknown'] = 'nekonata'; +$labels['newkeypass'] = 'Pasvorto'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/es_419.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/es_419.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/es_419.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/es_419.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,24 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Nombre'; +$labels['subkeycreated'] = 'Creado'; +$labels['expiresnever'] = 'nunca'; +$labels['unknown'] = 'desconocido'; +$labels['keychpass'] = 'Cambiar contraseña'; +$labels['newkeypass'] = 'Contraseña'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/es_AR.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/es_AR.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/es_AR.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/es_AR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,24 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Nombre'; +$labels['subkeycreated'] = 'Creado'; +$labels['expiresnever'] = 'nunca'; +$labels['unknown'] = 'desconocido'; +$labels['keychpass'] = 'Cambiar contraseña'; +$labels['newkeypass'] = 'Contraseña'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/es_ES.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/es_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/es_ES.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/es_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = 'Revocar'; $labels['keysend'] = 'Enviar clave pública en el mensaje'; $labels['keychpass'] = 'Cambiar contraseña'; -$labels['newkeyident'] = 'Identidad:'; -$labels['newkeypass'] = 'Contraseña:'; -$labels['newkeypassconfirm'] = 'Confirmar contraseña:'; -$labels['newkeysize'] = 'Tamaño de clave:'; +$labels['newkeypass'] = 'Contraseña'; $labels['key2048'] = '2048 bits - por defecto'; $labels['key4096'] = '4096 bits - más seguro'; $labels['keygenerating'] = 'Generando claves...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/et_EE.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/et_EE.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/et_EE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/et_EE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -35,13 +35,11 @@ $labels['expiresnever'] = 'mitte kunagi'; $labels['unknown'] = 'teadmata'; $labels['userid'] = 'ID'; +$labels['importkeys'] = 'Impordi võti'; $labels['keyremove'] = 'Eemalda'; $labels['keydisable'] = 'Keela'; $labels['keychpass'] = 'Muuda parooli'; -$labels['newkeyident'] = 'Identiteet:'; -$labels['newkeypass'] = 'Parool:'; -$labels['newkeypassconfirm'] = 'Kinnita parool:'; -$labels['newkeysize'] = 'Võtme suurus:'; +$labels['newkeypass'] = 'Parool'; $labels['key2048'] = '2048 bitti - vailimisi'; $labels['key4096'] = '4096 bitti - turvalisem'; $labels['keygenerating'] = 'Võtmete genereerimine...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/eu_ES.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/eu_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/eu_ES.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/eu_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,16 +63,14 @@ $labels['keyrevoke'] = 'Errebokatu'; $labels['keysend'] = 'Bidali gako publiko mezu batean'; $labels['keychpass'] = 'Aldatu pasahitza'; -$labels['newkeyident'] = 'Identitatea:'; -$labels['newkeypass'] = 'Pasahitza:'; -$labels['newkeypassconfirm'] = 'Berretsi pasahitza:'; -$labels['newkeysize'] = 'Gakoaren tamaina:'; +$labels['newkeypass'] = 'Pasahitza'; $labels['key2048'] = '2048 bit - lehenetsita'; $labels['key4096'] = '4096 bit - seguruagoa'; $labels['keygenerating'] = 'Gakoak sortzen...'; $labels['encryptionoptions'] = 'Zifratze aukerak...'; $labels['encryptmsg'] = 'Zifratu mezu hau'; $labels['signmsg'] = 'Sinatu era digitalean mezu hau'; +$labels['sendunencrypted'] = 'Bidali zifratu gabe'; $labels['enterkeypasstitle'] = 'Sartu gakoaren pasaesaldia'; $labels['enterkeypass'] = 'Pasaesaldi bat behar da erabiltzaile honen gako sekretua ($keyid) desblokeatzeko: $user'; $labels['arialabelkeyexportoptions'] = 'Gakoaren esportazio aukerak'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/fa_AF.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/fa_AF.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/fa_AF.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/fa_AF.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,22 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['subkeycreated'] = 'ایجاد شد'; +$labels['expiresnever'] = 'هیچگاه'; +$labels['unknown'] = 'نا شناس'; +$labels['newkeypass'] = 'شفر'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/fa_IR.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/fa_IR.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/fa_IR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/fa_IR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -17,5 +17,12 @@ */ $labels['encryption'] = 'رمزگذاری'; $labels['keyname'] = 'نام'; +$labels['keyid'] = 'کلید شناسه'; $labels['keyuserid'] = 'شناسه‌ی کاربری'; +$labels['typeencrypt'] = 'رمزگذاری'; +$labels['subkeycreated'] = 'ایجاد شده'; +$labels['expiresnever'] = 'هرگز'; +$labels['unknown'] = 'ناشناخته'; +$labels['keychpass'] = 'تغییر گذرواژه'; +$labels['newkeypass'] = 'گذرواژه'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/fi_FI.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/fi_FI.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/fi_FI.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/fi_FI.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = 'Kumoa'; $labels['keysend'] = 'Lähetä julkinen avain viestissä'; $labels['keychpass'] = 'Vaihda salasana'; -$labels['newkeyident'] = 'Identiteetti:'; -$labels['newkeypass'] = 'Salasana:'; -$labels['newkeypassconfirm'] = 'Vahvista salasana:'; -$labels['newkeysize'] = 'Avaimen koko:'; +$labels['newkeypass'] = 'Salasana'; $labels['key2048'] = '2048 bittiä - oletus'; $labels['key4096'] = '4096 bittiä - turvallisempi'; $labels['keygenerating'] = 'Luodaan avaimia...'; @@ -77,6 +74,7 @@ $labels['arialabelkeyexportoptions'] = 'Avaimien vientivalinnat'; $labels['attachpubkeymsg'] = 'Liitä julkinen avaimeni'; $labels['findkey'] = 'Etsi avainpalvelimilta'; +$labels['keyimportsearchlabel'] = 'Etsi avainpalvelimilta'; $messages['sigvalid'] = 'Vahvistettu allekirjoitus lähettäjältä $sender.'; $messages['siginvalid'] = 'Virheellinen allekirjoitus lähettäjältä $sender.'; $messages['sigunverified'] = 'Vahvistamaton allekirjoitus. Varmennetta ei ole vahvistettu. Varmenteen tunniste: $keyid.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/fo_FO.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/fo_FO.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/fo_FO.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/fo_FO.inc 2018-04-11 11:14:33.000000000 +0000 @@ -62,10 +62,7 @@ $labels['keyrevoke'] = 'Sig úr gildi'; $labels['keysend'] = 'Send almennan lykil í einum boðum'; $labels['keychpass'] = 'Broyt loyniorð'; -$labels['newkeyident'] = 'Samleiki:'; -$labels['newkeypass'] = 'Loyniorð:'; -$labels['newkeypassconfirm'] = 'Vátta loyniorð:'; -$labels['newkeysize'] = 'Lykla stødd:'; +$labels['newkeypass'] = 'Loyniorð'; $labels['key2048'] = '2048 bit - vanligt'; $labels['key4096'] = '4096 bits - meiri trygt'; $labels['keygenerating'] = 'Framleiður lyklar...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/fr_FR.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/fr_FR.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/fr_FR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/fr_FR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Type de clé'; $labels['fingerprint'] = 'Empreinte'; $labels['subkeys'] = 'Sous-clés'; +$labels['keyprops'] = 'Propriétés de la clé'; $labels['basicinfo'] = 'Informations de base'; $labels['userids'] = 'Utilisateurs supplémentaires'; $labels['typepublickey'] = 'Clé publique'; @@ -63,10 +64,10 @@ $labels['keyrevoke'] = 'Révoquer'; $labels['keysend'] = 'Envoyer la clé publique dans un courriel'; $labels['keychpass'] = 'Changer le mot de passe'; -$labels['newkeyident'] = 'Identité :'; -$labels['newkeypass'] = 'Mot de passe :'; -$labels['newkeypassconfirm'] = 'Confirmer le mot de passe :'; -$labels['newkeysize'] = 'Taille de la clé :'; +$labels['newkeyident'] = 'Identité'; +$labels['newkeypass'] = 'Mot de passe'; +$labels['newkeypassconfirm'] = 'Confirmer le mot de passe'; +$labels['newkeysize'] = 'Taille de la clé'; $labels['key2048'] = '2048 bits - par défaut'; $labels['key4096'] = '4096 bits - plus sécurisé'; $labels['keygenerating'] = 'Génération des clés...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/fy_NL.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/fy_NL.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/fy_NL.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/fy_NL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,26 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Namme'; +$labels['keyid'] = 'Kaai ID'; +$labels['typeencrypt'] = 'Fersiferje'; +$labels['subkeycreated'] = 'Oanmakke'; +$labels['expiresnever'] = 'nea'; +$labels['unknown'] = 'ûnbekend'; +$labels['keychpass'] = 'Wachtwurd feroarje'; +$labels['newkeypass'] = 'Wachtwurd'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ga_IE.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ga_IE.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ga_IE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ga_IE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -44,9 +44,7 @@ $labels['keyrevoke'] = 'Aisghairm'; $labels['keysend'] = 'Seol eochair phoiblí i dteachtaireacht'; $labels['keychpass'] = 'Athraigh d\'fhocal faire'; -$labels['newkeyident'] = 'Aitheantas:'; -$labels['newkeypass'] = 'Focal faire:'; -$labels['newkeypassconfirm'] = 'Deimhnigh an focal faire:'; +$labels['newkeypass'] = 'Pasfhocal'; $labels['keygenerating'] = 'Ag cruthú eochracha...'; $labels['encryptmsg'] = 'Criptigh an teachtaireacht seo'; $labels['signmsg'] = 'Sínigh an teachtaireacht seo go digiteach'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/gl_ES.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/gl_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/gl_ES.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/gl_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,24 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Nome'; +$labels['subkeycreated'] = 'Creado'; +$labels['expiresnever'] = 'nunca'; +$labels['unknown'] = 'descoñecido'; +$labels['keychpass'] = 'Cambiar contrasinal'; +$labels['newkeypass'] = 'Contrasinal'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/he_IL.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/he_IL.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/he_IL.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/he_IL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = 'הפקעה'; $labels['keysend'] = 'משלוח מפתח ציבורי בהודעה'; $labels['keychpass'] = 'שינוי סיסמה'; -$labels['newkeyident'] = 'זהות:'; -$labels['newkeypass'] = 'סיסמה:'; -$labels['newkeypassconfirm'] = 'אישור סיסמה:'; -$labels['newkeysize'] = 'גודל מפתח:'; +$labels['newkeypass'] = 'סיסמה'; $labels['key2048'] = 'ברירת מחדל - 2048 סיביות'; $labels['key4096'] = '4096 סיביות - יותר בטוח'; $labels['keygenerating'] = 'מפתחות נוצרים...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/hi_IN.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/hi_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/hi_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/hi_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,21 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['expiresnever'] = 'कभी नहाीं'; +$labels['unknown'] = 'अज्ञात'; +$labels['newkeypass'] = 'पासवर्ड'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/hr_HR.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/hr_HR.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/hr_HR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/hr_HR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,5 +15,10 @@ For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ */ +$labels['keyname'] = 'Naziv'; +$labels['subkeycreated'] = 'Stvoreno'; +$labels['expiresnever'] = 'nikad'; +$labels['unknown'] = 'nepoznato'; $labels['keychpass'] = 'Promjena zaporke'; +$labels['newkeypass'] = 'Lozinka'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/hu_HU.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/hu_HU.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/hu_HU.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/hu_HU.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Kulcs tipus'; $labels['fingerprint'] = 'Ujjlenyomat'; $labels['subkeys'] = 'Alkulcsok'; +$labels['keyprops'] = 'Kulcs tulajdnonságai'; $labels['basicinfo'] = 'Alap információk'; $labels['userids'] = 'További felhasználok'; $labels['typepublickey'] = 'nyilvános kulcs'; @@ -63,10 +64,10 @@ $labels['keyrevoke'] = 'Visszavon'; $labels['keysend'] = 'Kűld el a nyilvános kulcsot az üzenetben'; $labels['keychpass'] = 'Jelszó módosítás'; -$labels['newkeyident'] = 'Azonosító:'; -$labels['newkeypass'] = 'Jelszó:'; -$labels['newkeypassconfirm'] = 'Jelszó megerősítése'; -$labels['newkeysize'] = 'Kulcs méret:'; +$labels['newkeyident'] = 'Azonosító'; +$labels['newkeypass'] = 'Jelszó'; +$labels['newkeypassconfirm'] = 'Jelszó megerősítése'; +$labels['newkeysize'] = 'Kulcs méret'; $labels['key2048'] = '2048 bit - alapértelemzett'; $labels['key4096'] = '4096 bit - biztonságosabb'; $labels['keygenerating'] = 'Kulcsok generálása…'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/hy_AM.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/hy_AM.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/hy_AM.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/hy_AM.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,24 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Անվանում'; +$labels['subkeycreated'] = 'Ստեղծված'; +$labels['expiresnever'] = 'երբեք'; +$labels['unknown'] = 'անհայտ'; +$labels['keychpass'] = 'Փոխել գաղտնաբառը'; +$labels['newkeypass'] = 'Գաղտնաբառ'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ia.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ia.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ia.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ia.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = 'Revocar'; $labels['keysend'] = 'Inviar le clave pubic in un message'; $labels['keychpass'] = 'Cambiar contrasigno'; -$labels['newkeyident'] = 'Identitate:'; -$labels['newkeypass'] = 'Contrasigno:'; -$labels['newkeypassconfirm'] = 'Confirmar contrasigno:'; -$labels['newkeysize'] = 'Dimension del clave:'; +$labels['newkeypass'] = 'Contrasigno'; $labels['key2048'] = '2048 bits - predefinite'; $labels['key4096'] = '4096 bits - plus secur'; $labels['keygenerating'] = 'Genera claves...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/id_ID.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/id_ID.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/id_ID.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/id_ID.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Tipe kunci'; $labels['fingerprint'] = 'Sidik jari'; $labels['subkeys'] = 'Subkunci'; +$labels['keyprops'] = 'Properti untuk kunci'; $labels['basicinfo'] = 'Informasi dasar'; $labels['userids'] = 'Pengguna Tambahan'; $labels['typepublickey'] = 'kunci publik'; @@ -63,16 +64,17 @@ $labels['keyrevoke'] = 'Cabut'; $labels['keysend'] = 'Kirim kunci publik dalam pesan'; $labels['keychpass'] = 'Ubah kata sandi'; -$labels['newkeyident'] = 'Identitas:'; -$labels['newkeypass'] = 'Kata sandi:'; -$labels['newkeypassconfirm'] = 'Konfirmasi kata sandi:'; -$labels['newkeysize'] = 'Ukuran kunci:'; +$labels['newkeyident'] = 'Identitas'; +$labels['newkeypass'] = 'Password'; +$labels['newkeypassconfirm'] = 'Konfirmasi password / kata kunci'; +$labels['newkeysize'] = 'Ukuran kunci'; $labels['key2048'] = '2048 bit - baku'; $labels['key4096'] = '4096 bit - lebih aman'; $labels['keygenerating'] = 'Membuat kunci...'; $labels['encryptionoptions'] = 'Opsi enkripsi...'; $labels['encryptmsg'] = 'Enkripsikan pesan ini'; $labels['signmsg'] = 'Tandatantani pesan ini'; +$labels['sendunencrypted'] = 'Kirim dengan tidak di enskripsi'; $labels['enterkeypasstitle'] = 'Masukkan frasa sandi kunci'; $labels['enterkeypass'] = 'Frasa sandi diperlukan untuk membuka kunci rahasia ($keyid) untuk pengguna: $user.'; $labels['arialabelkeyexportoptions'] = 'Opsi ekspor kunci'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/is_IS.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/is_IS.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/is_IS.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/is_IS.inc 2018-04-11 11:14:33.000000000 +0000 @@ -20,4 +20,9 @@ $labels['keyname'] = 'Heiti'; $labels['keyid'] = 'Auðkenni lykils'; $labels['typeencrypt'] = 'Dulrita'; +$labels['subkeycreated'] = 'Búið til'; +$labels['expiresnever'] = 'aldrei'; +$labels['unknown'] = 'óþekkt'; +$labels['keychpass'] = 'Breyta lykilorði'; +$labels['newkeypass'] = 'Lykilorð'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/it_IT.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/it_IT.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/it_IT.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/it_IT.inc 2018-04-11 11:14:33.000000000 +0000 @@ -58,7 +58,5 @@ $labels['keydisable'] = 'Disabilita'; $labels['keyrevoke'] = 'Revoca'; $labels['keychpass'] = 'Cambia password'; -$labels['newkeyident'] = 'Identità:'; -$labels['newkeypass'] = 'Password:'; -$labels['newkeypassconfirm'] = 'Conferma password:'; +$labels['newkeypass'] = 'Password'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ja_JP.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ja_JP.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ja_JP.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ja_JP.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = '廃止'; $labels['keysend'] = 'メッセージ中に公開鍵を送信'; $labels['keychpass'] = 'パスワードを変更'; -$labels['newkeyident'] = '識別情報:'; -$labels['newkeypass'] = 'パスワード:'; -$labels['newkeypassconfirm'] = 'パスワードの確認:'; -$labels['newkeysize'] = '鍵の大きさ:'; +$labels['newkeypass'] = 'パスワード'; $labels['key2048'] = '2048ビット(初期設定)'; $labels['key4096'] = '4096ビット(より安全)'; $labels['keygenerating'] = 'キーを精製中...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/kab.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/kab.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/kab.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/kab.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['unknown'] = 'arussin'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ka_GE.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ka_GE.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ka_GE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ka_GE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -16,4 +16,7 @@ For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ */ $labels['keyname'] = 'სახელი'; +$labels['expiresnever'] = 'არასდროს'; +$labels['unknown'] = 'უცნობი'; +$labels['newkeypass'] = 'პაროლი'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/km_KH.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/km_KH.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/km_KH.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/km_KH.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,22 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['subkeycreated'] = 'បាន​បង្កើត'; +$labels['expiresnever'] = 'មិនដែល'; +$labels['unknown'] = 'មិន​ស្គាល់'; +$labels['newkeypass'] = 'ពាក្យសំងាត់'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/kn_IN.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/kn_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/kn_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/kn_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,20 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'ಹೆಸರು'; +$labels['newkeypass'] = 'ರಹಸ್ಯ ಪದ'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ko_KR.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ko_KR.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ko_KR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ko_KR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = '폐기'; $labels['keysend'] = '메시지에 공개 키 전송'; $labels['keychpass'] = '암호 변경'; -$labels['newkeyident'] = '신원:'; -$labels['newkeypass'] = '암호:'; -$labels['newkeypassconfirm'] = '암호 확인:'; -$labels['newkeysize'] = '키 크기:'; +$labels['newkeypass'] = '암호'; $labels['key2048'] = '2048 비트 - 기본'; $labels['key4096'] = '4096 비트 - 보안 강화'; $labels['keygenerating'] = '키를 생성하는 중...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ku.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ku.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ku.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ku.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,24 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Nav'; +$labels['subkeycreated'] = 'Hat afirandin'; +$labels['expiresnever'] = 'qet'; +$labels['unknown'] = 'nenas'; +$labels['keychpass'] = 'Şîfreyê biguherîne'; +$labels['newkeypass'] = 'Nasnav'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ku_IQ.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ku_IQ.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ku_IQ.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ku_IQ.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,23 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'ناو'; +$labels['subkeycreated'] = 'دروستکرا'; +$labels['unknown'] = 'نەناسراو'; +$labels['keychpass'] = 'گۆڕینی تێپەڕەوشە'; +$labels['newkeypass'] = 'تێپەڕەوشە'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/lb_LU.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/lb_LU.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/lb_LU.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/lb_LU.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,23 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Numm'; +$labels['subkeycreated'] = 'Erstallt'; +$labels['expiresnever'] = 'ni'; +$labels['unknown'] = 'onbekannt'; +$labels['newkeypass'] = 'Passwuert'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/lt_LT.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/lt_LT.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/lt_LT.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/lt_LT.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Rakto tipas'; $labels['fingerprint'] = 'Kontrolinis kodas'; $labels['subkeys'] = 'Porakčiai'; +$labels['keyprops'] = 'Rakto savybės'; $labels['basicinfo'] = 'Pagrindinė informacija'; $labels['userids'] = 'Papildomi naudotojai'; $labels['typepublickey'] = 'viešasis raktas'; @@ -63,10 +64,10 @@ $labels['keyrevoke'] = 'Atšaukti'; $labels['keysend'] = 'Siųsti viešąjį raktą kartu su laišku'; $labels['keychpass'] = 'Keisti slaptažodį'; -$labels['newkeyident'] = 'Tapatybė:'; -$labels['newkeypass'] = 'Slaptažodis:'; -$labels['newkeypassconfirm'] = 'Patvirtinkite slaptažodį:'; -$labels['newkeysize'] = 'Rakto dydis:'; +$labels['newkeyident'] = 'Tapatybė'; +$labels['newkeypass'] = 'Slaptažodis'; +$labels['newkeypassconfirm'] = 'Pakartokite slaptažodį'; +$labels['newkeysize'] = 'Rakto dydis'; $labels['key2048'] = '2048 bitai – numatytasis'; $labels['key4096'] = '4096 bitai – saugesnis'; $labels['keygenerating'] = 'Raktai generuojami…'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/lv_LV.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/lv_LV.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/lv_LV.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/lv_LV.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Atslēgas tips'; $labels['fingerprint'] = 'Pirksta nospiedums'; $labels['subkeys'] = 'Apakšatslēgas'; +$labels['keyprops'] = 'Atslēgas īpašības'; $labels['basicinfo'] = 'Pamatinformācija'; $labels['userids'] = 'Papildus lietotāji'; $labels['typepublickey'] = 'publiskā atslēga'; @@ -63,16 +64,17 @@ $labels['keyrevoke'] = 'Atsaukt'; $labels['keysend'] = 'Ar e-pastu sūtīt arī publisko atslēgu'; $labels['keychpass'] = 'Mainīt paroli'; -$labels['newkeyident'] = 'Identitāte:'; -$labels['newkeypass'] = 'Parole:'; -$labels['newkeypassconfirm'] = 'Apstiprināt paroli:'; -$labels['newkeysize'] = 'Atslēgas stiprums:'; +$labels['newkeyident'] = 'Identitāte'; +$labels['newkeypass'] = 'Parole'; +$labels['newkeypassconfirm'] = 'Apstiprināt paroli'; +$labels['newkeysize'] = 'Atslēgas stiprums'; $labels['key2048'] = '2048 biti - pec noklusējuma'; $labels['key4096'] = '4096 biti - papildus drošība'; $labels['keygenerating'] = 'Ģenerē atslēgas...'; $labels['encryptionoptions'] = 'Šifrēšanas iestatījumi...'; $labels['encryptmsg'] = 'Šifrēt šo e-pastu'; $labels['signmsg'] = 'Digitāli parakstīt šo e-pastu'; +$labels['sendunencrypted'] = 'Sūtīt nešifrētu'; $labels['enterkeypasstitle'] = 'Ievadiet atslēgas paroli'; $labels['enterkeypass'] = 'Lai atbloķētu lietotāja $user šifrēto atslēgu ($keyid), ir nepieciešama parole.'; $labels['arialabelkeyexportoptions'] = 'Atslēgu eksportēšanas iestatījumi'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/mk_MK.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/mk_MK.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/mk_MK.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/mk_MK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,26 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Име '; +$labels['keyid'] = 'Клуч ID'; +$labels['typeencrypt'] = 'Енкриптирај '; +$labels['subkeycreated'] = 'Создадени '; +$labels['expiresnever'] = 'никогаш'; +$labels['unknown'] = 'Непознато '; +$labels['keychpass'] = 'Променете лозинка'; +$labels['newkeypass'] = 'Лозинка'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ml_IN.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ml_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ml_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ml_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,23 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['subkeycreated'] = 'നിര്‍മ്മിച്ചു'; +$labels['expiresnever'] = 'ഒരിക്കലുമില്ല'; +$labels['unknown'] = 'അറിയാത്ത'; +$labels['keychpass'] = 'രഹസ്യവാക്ക് മാറ്റുക'; +$labels['newkeypass'] = 'രഹസ്യവാക്ക്'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/mn_MN.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/mn_MN.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/mn_MN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/mn_MN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,22 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['subkeycreated'] = 'Үүссэн'; +$labels['unknown'] = 'мэдэгдэхгүй'; +$labels['keychpass'] = 'Нууц үг солих'; +$labels['newkeypass'] = 'Нууц үг'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/mr_IN.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/mr_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/mr_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/mr_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,22 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['subkeycreated'] = 'निर्माण केलेले'; +$labels['expiresnever'] = 'कधीच नाही'; +$labels['unknown'] = 'माहित नसलेला'; +$labels['newkeypass'] = 'परवलीचा शब्द'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ms_MY.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ms_MY.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ms_MY.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ms_MY.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,21 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['expiresnever'] = 'tidak pernah'; +$labels['unknown'] = 'tidak diketahui'; +$labels['newkeypass'] = 'Katalaluan'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/nb_NO.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/nb_NO.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/nb_NO.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/nb_NO.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,23 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Navn'; +$labels['subkeycreated'] = 'Opprettet'; +$labels['expiresnever'] = 'Aldri'; +$labels['unknown'] = 'ukjent'; +$labels['newkeypass'] = 'Passord'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ne_NP.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ne_NP.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ne_NP.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ne_NP.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,21 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['expiresnever'] = 'काहिलै नहुने'; +$labels['unknown'] = 'अज्ञात'; +$labels['newkeypass'] = 'प्रवेश शब्द'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/nl_BE.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/nl_BE.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/nl_BE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/nl_BE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -17,5 +17,8 @@ */ $labels['keyname'] = 'Naam'; $labels['subkeycreated'] = 'Aangemaakt'; +$labels['expiresnever'] = 'nooit'; +$labels['unknown'] = 'onbekend'; $labels['keychpass'] = 'Wijzig wachtwoord'; +$labels['newkeypass'] = 'Wachtwoord'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/nl_NL.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/nl_NL.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/nl_NL.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/nl_NL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = 'Intrekken'; $labels['keysend'] = 'Verstuur publieke sleutel in een bericht'; $labels['keychpass'] = 'Wijzig wachtwoord'; -$labels['newkeyident'] = 'Identiteit:'; -$labels['newkeypass'] = 'Wachtwoord:'; -$labels['newkeypassconfirm'] = 'Bevestig wachtwoord:'; -$labels['newkeysize'] = 'Sleutelgrootte:'; +$labels['newkeypass'] = 'Wachtwoord'; $labels['key2048'] = '2048 bits - standaard'; $labels['key4096'] = '4096 bits - veiliger'; $labels['keygenerating'] = 'Sleutels genereren...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/nn_NO.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/nn_NO.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/nn_NO.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/nn_NO.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,22 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['subkeycreated'] = 'Laga'; +$labels['expiresnever'] = 'aldri'; +$labels['unknown'] = 'ukjent'; +$labels['newkeypass'] = 'Passord'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/pl_PL.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/pl_PL.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/pl_PL.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/pl_PL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Typ klucza'; $labels['fingerprint'] = 'Odcisk palca'; $labels['subkeys'] = 'Podklucze'; +$labels['keyprops'] = 'Właściwości klucza'; $labels['basicinfo'] = 'Informacje podstawowe'; $labels['userids'] = 'Dodatkowi użytkownicy'; $labels['typepublickey'] = 'klucz publiczny'; @@ -63,16 +64,17 @@ $labels['keyrevoke'] = 'Unieważnij'; $labels['keysend'] = 'Wyślij klucz publiczny w wiadomości'; $labels['keychpass'] = 'Zmień hasło'; -$labels['newkeyident'] = 'Tożsamość:'; -$labels['newkeypass'] = 'Hasło:'; -$labels['newkeypassconfirm'] = 'Potwierdź hasło:'; -$labels['newkeysize'] = 'Rozmiar klucza:'; +$labels['newkeyident'] = 'Tożsamość'; +$labels['newkeypass'] = 'Hasło'; +$labels['newkeypassconfirm'] = 'Potwierdź hasło'; +$labels['newkeysize'] = 'Rozmiar klucza'; $labels['key2048'] = '2048 bitów - domyślnie'; $labels['key4096'] = '4096 bitów - bardziej bezpiecznie'; $labels['keygenerating'] = 'Generowanie kluczy...'; $labels['encryptionoptions'] = 'Opcje szyfrowania...'; $labels['encryptmsg'] = 'Szyfruj wiadomość'; $labels['signmsg'] = 'Podpisz wiadomość'; +$labels['sendunencrypted'] = 'Wyślij niezaszyfrowaną'; $labels['enterkeypasstitle'] = 'Wprowadź hasło klucza'; $labels['enterkeypass'] = 'Wymagane jest hasło do klucza ($keyid) użytkownika: $user.'; $labels['arialabelkeyexportoptions'] = 'Opcje eksportu kluczy'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ps.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ps.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ps.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ps.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,21 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['expiresnever'] = 'هېڅ'; +$labels['unknown'] = 'نامعلوم'; +$labels['newkeypass'] = 'پټنوم'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/pt_BR.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/pt_BR.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/pt_BR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/pt_BR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Tipo de chave'; $labels['fingerprint'] = 'Autenticação digital'; $labels['subkeys'] = 'Subchaves'; +$labels['keyprops'] = 'Propriedades-chave'; $labels['basicinfo'] = 'Informação básica'; $labels['userids'] = 'Usuários adicionais'; $labels['typepublickey'] = 'chave pública'; @@ -63,10 +64,10 @@ $labels['keyrevoke'] = 'Revogar'; $labels['keysend'] = 'Mandar chave pública em uma mensagem'; $labels['keychpass'] = 'Trocar senha'; -$labels['newkeyident'] = 'identificação:'; -$labels['newkeypass'] = 'Senha:'; -$labels['newkeypassconfirm'] = 'Confirmar senha:'; -$labels['newkeysize'] = 'Tamanho da chave:'; +$labels['newkeyident'] = 'identificação'; +$labels['newkeypass'] = 'Senha'; +$labels['newkeypassconfirm'] = 'Confirme a senha'; +$labels['newkeysize'] = 'Tamanho da chave'; $labels['key2048'] = '2048 bits - padrão'; $labels['key4096'] = '4096 bits - maise seguro'; $labels['keygenerating'] = 'Gerando chaves...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/pt_PT.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/pt_PT.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/pt_PT.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/pt_PT.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Tipo de chave'; $labels['fingerprint'] = 'Impressão digital'; $labels['subkeys'] = 'Sub-chaves'; +$labels['keyprops'] = 'Propriedades da chave'; $labels['basicinfo'] = 'Informação básica'; $labels['userids'] = 'Utilizadores adicionais'; $labels['typepublickey'] = 'chave publica'; @@ -63,10 +64,10 @@ $labels['keyrevoke'] = 'Revogar'; $labels['keysend'] = 'Enviar chave pública numa mensagem'; $labels['keychpass'] = 'Alterar palavra-passe'; -$labels['newkeyident'] = 'Identidade:'; -$labels['newkeypass'] = 'Palavra-passe:'; -$labels['newkeypassconfirm'] = 'Confirmar palavra-passe:'; -$labels['newkeysize'] = 'Tamanho da chave:'; +$labels['newkeyident'] = 'Identidade'; +$labels['newkeypass'] = 'Palavra-passe'; +$labels['newkeypassconfirm'] = 'Confirmar palavra-passe'; +$labels['newkeysize'] = 'Tamanho da chave'; $labels['key2048'] = '2048 bits - predefinição'; $labels['key4096'] = '4096 bits - mais seguro'; $labels['keygenerating'] = 'A gerar chaves...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ro_RO.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ro_RO.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ro_RO.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ro_RO.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = 'Revocă'; $labels['keysend'] = 'Trimite cheie publică în mesaj'; $labels['keychpass'] = 'Schimbă parola'; -$labels['newkeyident'] = 'Identitate:'; -$labels['newkeypass'] = 'Parola:'; -$labels['newkeypassconfirm'] = 'Confirmă parola:'; -$labels['newkeysize'] = 'Dimensiunea cheii:'; +$labels['newkeypass'] = 'Parolă'; $labels['key2048'] = '2048 biți - implicit'; $labels['key4096'] = '4096 biți - mult mai sigur'; $labels['keygenerating'] = 'Se generează cheile...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ru_RU.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ru_RU.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ru_RU.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ru_RU.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Тип ключа'; $labels['fingerprint'] = 'Отпечаток'; $labels['subkeys'] = 'Подключи'; +$labels['keyprops'] = 'Свойства ключа'; $labels['basicinfo'] = 'Базовая информация'; $labels['userids'] = 'Дополнительные ключи'; $labels['typepublickey'] = 'открытый ключ'; @@ -63,10 +64,10 @@ $labels['keyrevoke'] = 'Отозвать'; $labels['keysend'] = 'Отправить открытый ключ в сообщении'; $labels['keychpass'] = 'Изменить пароль'; -$labels['newkeyident'] = 'Профиль:'; -$labels['newkeypass'] = 'Пароль:'; -$labels['newkeypassconfirm'] = 'Подтвердите пароль:'; -$labels['newkeysize'] = 'Размер ключа:'; +$labels['newkeyident'] = 'Профиль'; +$labels['newkeypass'] = 'Пароль'; +$labels['newkeypassconfirm'] = 'Подтвердите пароль'; +$labels['newkeysize'] = 'Длина ключа'; $labels['key2048'] = '2048 бит - по умолчанию'; $labels['key4096'] = '4096 бит - более безопасный'; $labels['keygenerating'] = 'Создание ключей...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/si_LK.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/si_LK.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/si_LK.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/si_LK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,21 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['expiresnever'] = 'කිසි විටෙකත් නැති'; +$labels['unknown'] = 'නොදනී'; +$labels['newkeypass'] = 'මුරපදය'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/sk_SK.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/sk_SK.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/sk_SK.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/sk_SK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Typ kľúča'; $labels['fingerprint'] = 'Odtlačok'; $labels['subkeys'] = 'Podradené kľúče'; +$labels['keyprops'] = 'Vlastnosti kľúča'; $labels['basicinfo'] = 'Základná informácia'; $labels['userids'] = 'Ďalší používatelia'; $labels['typepublickey'] = 'verejný kľúč'; @@ -63,10 +64,10 @@ $labels['keyrevoke'] = 'Odvolať'; $labels['keysend'] = 'Odoslať verejný kľúč v správe'; $labels['keychpass'] = 'Zmeniť heslo'; -$labels['newkeyident'] = 'Identita:'; -$labels['newkeypass'] = 'Heslo:'; -$labels['newkeypassconfirm'] = 'Potvrdiť heslo:'; -$labels['newkeysize'] = 'Veľkosť kľúča:'; +$labels['newkeyident'] = 'Identita'; +$labels['newkeypass'] = 'Heslo'; +$labels['newkeypassconfirm'] = 'Potvrdenie hesla'; +$labels['newkeysize'] = 'Veľkosť kľúča'; $labels['key2048'] = '2048 bitov – predvolené'; $labels['key4096'] = '4096 bitov - bezpečnejšie'; $labels['keygenerating'] = 'Generovanie kľúčov...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/sl_SI.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/sl_SI.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/sl_SI.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/sl_SI.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,26 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Ime'; +$labels['keyid'] = 'ID ključa'; +$labels['typeencrypt'] = 'Šifriraj'; +$labels['subkeycreated'] = 'Ustvarjen'; +$labels['expiresnever'] = 'nikoli'; +$labels['unknown'] = 'neznan'; +$labels['keychpass'] = 'Spremenjeno geslo'; +$labels['newkeypass'] = 'Geslo'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/sq_AL.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/sq_AL.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/sq_AL.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/sq_AL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Lloj kyçi'; $labels['fingerprint'] = 'Shenja gishtash'; $labels['subkeys'] = 'Nënkyç'; +$labels['keyprops'] = 'Veti kyçi'; $labels['basicinfo'] = 'Informacion bazë'; $labels['userids'] = 'Përdorues Shtesë'; $labels['typepublickey'] = 'kyç publik'; @@ -64,24 +65,25 @@ $labels['keysend'] = 'Dërgo kyç publik në mesazh'; $labels['keychpass'] = 'Ndryshoni fjalëkalimin'; $labels['newkeyident'] = 'Identitet'; -$labels['newkeypass'] = 'Fjalëkalim:'; -$labels['newkeypassconfirm'] = 'Ripohoni fjalëkalimin:'; -$labels['newkeysize'] = 'Madhësi kyçi:'; +$labels['newkeypass'] = 'Fjalëkalimi'; +$labels['newkeypassconfirm'] = 'Ripohoni fjalëkalimin'; +$labels['newkeysize'] = 'Madhësi kyçi'; $labels['key2048'] = '2048 bite - parazgjedhje'; $labels['key4096'] = '4096 bite - më i sigurt'; $labels['keygenerating'] = 'Po prodhohen kyçe…'; $labels['encryptionoptions'] = 'Mundësi fshehtëzimi…'; $labels['encryptmsg'] = 'Fshehtëzoje këtë mesazh'; $labels['signmsg'] = 'Nënshkruaje në mënyrë dixhitale këtë mesazh'; +$labels['sendunencrypted'] = 'Dërgoje të pafshehtëzuar'; $labels['enterkeypasstitle'] = 'Jepni frazëkalim kyçi'; $labels['enterkeypass'] = 'Frazëkalimi është i nevojshëm për të zhbllokuar kyçin e fshehtë ($keyid) për përdoruesin: $user.'; $labels['arialabelkeyexportoptions'] = 'Mundësi eksportimi kyçesh'; $labels['attachpubkeymsg'] = 'Bashkëngjite kyçin tim publik'; -$labels['keyexportprompt'] = 'Doni të përfshihen kyçe të fshehtë te skedari i ruajtur për kyçe OpenPGP?'; +$labels['keyexportprompt'] = 'Doni të përfshihen kyçe të fshehtë te kartela e ruajtur e kyçeve OpenPGP?'; $labels['onlypubkeys'] = 'Eksporto Vetëm Kyçe Publikë'; $labels['withprivkeys'] = 'Eksporto Kyçe të Fshehtë'; $labels['findkey'] = 'Kërko në shërbyes kyçesh'; -$labels['keyimportlabel'] = 'Importo prej skedari'; +$labels['keyimportlabel'] = 'Importo prej kartele'; $labels['keyimportsearchlabel'] = 'Kërko në shërbyes kyçesh'; $messages['sigvalid'] = 'Nënshkrim nga $sender i verifikuar.'; $messages['sigvalidpartial'] = 'Nënshkrim nga $sender i verifikuar, por s’pati të nënshkruar pjesë lënde.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/sr_CS.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/sr_CS.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/sr_CS.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/sr_CS.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,26 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Име'; +$labels['keyid'] = 'ИД кључа'; +$labels['typeencrypt'] = 'Шифруј'; +$labels['subkeycreated'] = 'Направљено'; +$labels['expiresnever'] = 'никад'; +$labels['unknown'] = 'непознато'; +$labels['keychpass'] = 'Измени лозинку'; +$labels['newkeypass'] = 'Лозинка'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/sv_SE.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/sv_SE.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/sv_SE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/sv_SE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Nyckeltyp'; $labels['fingerprint'] = 'Fingeravtryck'; $labels['subkeys'] = 'Undernycklar'; +$labels['keyprops'] = 'Nyckelegenskaper'; $labels['basicinfo'] = 'Grundläggande information'; $labels['userids'] = 'Ytterligare användare'; $labels['typepublickey'] = 'offentlig nyckel'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ta_IN.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ta_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ta_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ta_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,21 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['expiresnever'] = 'எப்போதுமில்லை'; +$labels['unknown'] = 'தெரியாத'; +$labels['newkeypass'] = 'கடவுச்சொல்'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/th_TH.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/th_TH.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/th_TH.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/th_TH.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,26 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'ชื่อ'; +$labels['keyid'] = 'คีย์ไอดี'; +$labels['typeencrypt'] = 'เข้ารหัส'; +$labels['subkeycreated'] = 'สร้าง'; +$labels['expiresnever'] = 'ไม่ใช้'; +$labels['unknown'] = 'ไม่ทราบ'; +$labels['keychpass'] = 'เปลี่ยนรหัสผ่าน'; +$labels['newkeypass'] = 'รหัสผ่าน'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ti.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ti.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ti.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ti.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,20 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['subkeycreated'] = 'እዋን ፍጥረት'; +$labels['newkeypass'] = 'መሐለፊ ቃል'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/tr_TR.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/tr_TR.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/tr_TR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/tr_TR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = 'Anahtar türü'; $labels['fingerprint'] = 'Parmak izi'; $labels['subkeys'] = 'Alt anahtarlar'; +$labels['keyprops'] = 'Anahtar özellikleri'; $labels['basicinfo'] = 'Temel Bilgiler'; $labels['userids'] = 'Ek Kullanıcılar'; $labels['typepublickey'] = 'Genel Anahtar'; @@ -63,10 +64,10 @@ $labels['keyrevoke'] = 'Geri al'; $labels['keysend'] = 'İletiyle birlikte ortak anahtar gönderilsin'; $labels['keychpass'] = 'Parolayı değiştir'; -$labels['newkeyident'] = 'Kimlik:'; -$labels['newkeypass'] = 'Parola:'; -$labels['newkeypassconfirm'] = 'Parola Onayı:'; -$labels['newkeysize'] = 'Anahtar uzunluğu:'; +$labels['newkeyident'] = 'Kimlik'; +$labels['newkeypass'] = 'Parola'; +$labels['newkeypassconfirm'] = 'Parola Onayı'; +$labels['newkeysize'] = 'Anahtar boyutu'; $labels['key2048'] = '2048 bit-Varsayılan'; $labels['key4096'] = '4096 bit- daha güvenli'; $labels['keygenerating'] = 'Anahtarlar oluştur...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/tzl.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/tzl.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/tzl.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/tzl.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,21 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Nómina'; +$labels['unknown'] = 'inschì'; +$labels['newkeypass'] = 'Teßera'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/uk_UA.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/uk_UA.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/uk_UA.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/uk_UA.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = 'Відкликати'; $labels['keysend'] = 'Надіслати публічний ключ в повідомленні'; $labels['keychpass'] = 'Змінити пароль'; -$labels['newkeyident'] = 'Профіль:'; -$labels['newkeypass'] = 'Пароль:'; -$labels['newkeypassconfirm'] = 'Підтвердіть пароль:'; -$labels['newkeysize'] = 'Розмір ключа:'; +$labels['newkeypass'] = 'Пароль'; $labels['key2048'] = '2048 бітів — дефолтно'; $labels['key4096'] = '4096 бітів — безпечніше'; $labels['keygenerating'] = 'Генерування ключів…'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ur_PK.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ur_PK.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/ur_PK.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/ur_PK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['newkeypass'] = 'پاسورڈ'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/uz.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/uz.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/uz.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/uz.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,26 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Nomlanishi'; +$labels['keyid'] = 'Kalit ID si'; +$labels['typeencrypt'] = 'Shiffrlash'; +$labels['subkeycreated'] = 'Yaratildi'; +$labels['expiresnever'] = 'hech qachon'; +$labels['unknown'] = 'noma’lum'; +$labels['keychpass'] = 'Parolni almashtirish'; +$labels['newkeypass'] = 'Parol'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/vi_VN.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/vi_VN.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/vi_VN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/vi_VN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,23 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2016, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/roundcube/roundcube-webmail/plugin-enigma/ +*/ +$labels['keyname'] = 'Tên'; +$labels['subkeycreated'] = 'Được tạo'; +$labels['expiresnever'] = 'không bao giờ'; +$labels['unknown'] = 'Không rõ'; +$labels['newkeypass'] = 'Mật khẩu'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/zh_CN.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/zh_CN.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/zh_CN.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/zh_CN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -25,6 +25,7 @@ $labels['keytype'] = '密钥类型'; $labels['fingerprint'] = '指纹'; $labels['subkeys'] = '子密钥'; +$labels['keyprops'] = '密钥属性'; $labels['basicinfo'] = '基本信息'; $labels['userids'] = '其他用户'; $labels['typepublickey'] = '公钥'; @@ -63,16 +64,17 @@ $labels['keyrevoke'] = '废除'; $labels['keysend'] = '在邮件中发送公钥'; $labels['keychpass'] = '修改密码'; -$labels['newkeyident'] = '身份:'; -$labels['newkeypass'] = '密码:'; -$labels['newkeypassconfirm'] = '确认密码:'; -$labels['newkeysize'] = '密钥大小:'; +$labels['newkeyident'] = '标识'; +$labels['newkeypass'] = '密码'; +$labels['newkeypassconfirm'] = '确认密码'; +$labels['newkeysize'] = '密钥长度'; $labels['key2048'] = '2048 位 - 默认'; $labels['key4096'] = '4096 位 - 更安全'; $labels['keygenerating'] = '正在生成密钥...'; $labels['encryptionoptions'] = '加密选项...'; $labels['encryptmsg'] = '加密此邮件'; $labels['signmsg'] = '数字签名此邮件'; +$labels['sendunencrypted'] = '不加密发送'; $labels['enterkeypasstitle'] = '请输入密钥口令'; $labels['enterkeypass'] = '需要口令解锁私钥 ($keyid),用户:$user。'; $labels['arialabelkeyexportoptions'] = '密钥导出选项'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/enigma/localization/zh_TW.inc roundcube-1.3.6+dfsg.1/plugins/enigma/localization/zh_TW.inc --- roundcube-1.3.3+dfsg.1/plugins/enigma/localization/zh_TW.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/enigma/localization/zh_TW.inc 2018-04-11 11:14:33.000000000 +0000 @@ -63,10 +63,7 @@ $labels['keyrevoke'] = '撤銷'; $labels['keysend'] = '在郵件傳送公開金鑰'; $labels['keychpass'] = '更改密碼'; -$labels['newkeyident'] = '身份:'; -$labels['newkeypass'] = '密碼:'; -$labels['newkeypassconfirm'] = '確認密碼:'; -$labels['newkeysize'] = '金鑰大小:'; +$labels['newkeypass'] = '使用者密碼'; $labels['key2048'] = '2048 位元 - 預設'; $labels['key4096'] = '4096 位元 - 較安全'; $labels['keygenerating'] = '正在製作金鑰...'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/filesystem_attachments/filesystem_attachments.php roundcube-1.3.6+dfsg.1/plugins/filesystem_attachments/filesystem_attachments.php --- roundcube-1.3.3+dfsg.1/plugins/filesystem_attachments/filesystem_attachments.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/filesystem_attachments/filesystem_attachments.php 2018-04-11 11:14:33.000000000 +0000 @@ -210,8 +210,20 @@ $file_path = pathinfo($path, PATHINFO_DIRNAME); if ($temp_dir !== $file_path) { + // When the configured directory is not writable, or out of open_basedir path + // tempnam() fallbacks to system temp without a warning. + // We allow that, but we'll let to know the user about the misconfiguration. + if ($file_path == sys_get_temp_dir()) { + rcube::raise_error(array( + 'file' => __FILE__, + 'line' => __LINE__, + 'message' => "Detected 'temp_dir' change. Access to '$temp_dir' restricted by filesystem permissions or open_basedir", + ), true, false); + + return true; + } + rcube::raise_error(array( - 'code' => 403, 'file' => __FILE__, 'line' => __LINE__, 'message' => sprintf("%s can't read %s (not in temp_dir)", diff -Nru roundcube-1.3.3+dfsg.1/plugins/help/localization/ar.inc roundcube-1.3.6+dfsg.1/plugins/help/localization/ar.inc --- roundcube-1.3.3+dfsg.1/plugins/help/localization/ar.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/help/localization/ar.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,20 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Help plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-help/ +*/ +$labels['about'] = 'نبذة'; +$labels['license'] = 'الترخيص'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/help/localization/mr_IN.inc roundcube-1.3.6+dfsg.1/plugins/help/localization/mr_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/help/localization/mr_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/help/localization/mr_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Help plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-help/ +*/ +$labels['about'] = 'च्या विषयी'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/help/localization/si_LK.inc roundcube-1.3.6+dfsg.1/plugins/help/localization/si_LK.inc --- roundcube-1.3.3+dfsg.1/plugins/help/localization/si_LK.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/help/localization/si_LK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,20 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Help plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-help/ +*/ +$labels['about'] = 'පිළිබඳ'; +$labels['license'] = 'බලපත්‍රය'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/hide_blockquote/localization/ar.inc roundcube-1.3.6+dfsg.1/plugins/hide_blockquote/localization/ar.inc --- roundcube-1.3.3+dfsg.1/plugins/hide_blockquote/localization/ar.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/hide_blockquote/localization/ar.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Hide-Blockquote plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-hide_blockquote/ +*/ +$labels['show'] = 'إظهار'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/hide_blockquote/localization/bn_BD.inc roundcube-1.3.6+dfsg.1/plugins/hide_blockquote/localization/bn_BD.inc --- roundcube-1.3.3+dfsg.1/plugins/hide_blockquote/localization/bn_BD.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/hide_blockquote/localization/bn_BD.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Hide-Blockquote plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-hide_blockquote/ +*/ +$labels['show'] = 'দেখানো'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/hide_blockquote/localization/fa_AF.inc roundcube-1.3.6+dfsg.1/plugins/hide_blockquote/localization/fa_AF.inc --- roundcube-1.3.3+dfsg.1/plugins/hide_blockquote/localization/fa_AF.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/hide_blockquote/localization/fa_AF.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Hide-Blockquote plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-hide_blockquote/ +*/ +$labels['show'] = 'نمایش'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/hide_blockquote/localization/kn_IN.inc roundcube-1.3.6+dfsg.1/plugins/hide_blockquote/localization/kn_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/hide_blockquote/localization/kn_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/hide_blockquote/localization/kn_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Hide-Blockquote plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-hide_blockquote/ +*/ +$labels['show'] = 'ತೋರಿಸು'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/hide_blockquote/localization/ku_IQ.inc roundcube-1.3.6+dfsg.1/plugins/hide_blockquote/localization/ku_IQ.inc --- roundcube-1.3.3+dfsg.1/plugins/hide_blockquote/localization/ku_IQ.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/hide_blockquote/localization/ku_IQ.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Hide-Blockquote plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-hide_blockquote/ +*/ +$labels['show'] = 'پیشاندان'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/Changelog roundcube-1.3.6+dfsg.1/plugins/managesieve/Changelog --- roundcube-1.3.3+dfsg.1/plugins/managesieve/Changelog 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/Changelog 2018-04-11 11:14:33.000000000 +0000 @@ -1,3 +1,5 @@ +- Fix bug where text: syntax was forced for strings longer than 1024 characters (#6143) +- Fix missing Save button in Edit Filter Set page of Classic skin (#6154) - Fix parsing dot-staffed lines in multiline text (#5838) - Fix AM/PM suffix in vacation time selectors - Fix bug where 'exists' operator was reset to 'contains' (#5899) diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php roundcube-1.3.6+dfsg.1/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php --- roundcube-1.3.3+dfsg.1/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php 2018-04-11 11:14:33.000000000 +0000 @@ -467,16 +467,15 @@ // Initialize the form $rules = rcube_utils::get_input_value('r', rcube_utils::INPUT_GET); if (!empty($rules)) { - $i = 0; + $tests = array(); foreach ($rules as $rule) { list($header, $value) = explode(':', $rule, 2); - $tests[$i] = array( + $tests[] = array( 'type' => 'contains', 'test' => 'header', 'arg1' => $header, 'arg2' => $value, ); - $i++; } $this->form = array( @@ -744,7 +743,7 @@ $this->form['tests'][$i]['arg'] = $target; if ($type != 'exists') { - if (!count($target)) { + if (empty($target)) { $this->errors['tests'][$i]['target'] = $this->plugin->gettext('cannotbeempty'); } else if (strpos($type, 'count-') === 0) { @@ -761,7 +760,7 @@ } } - if (!preg_match('/^(regex|matches|count-)/', $type) && count($target)) { + if (!preg_match('/^(regex|matches|count-)/', $type) && !empty($target)) { foreach ($target as $arg) { if (!$this->validate_date_part($datepart, $arg)) { $this->errors['tests'][$i]['target'] = $this->plugin->gettext('invaliddateformat'); @@ -804,7 +803,7 @@ $this->form['tests'][$i]['header'] = $dateheader; if ($type != 'exists') { - if (!count($target)) { + if (empty($target)) { $this->errors['tests'][$i]['target'] = $this->plugin->gettext('cannotbeempty'); } else if (strpos($type, 'count-') === 0) { @@ -821,7 +820,7 @@ } } - if (count($target) && !preg_match('/^(regex|matches|count-)/', $type)) { + if (!empty($target) && !preg_match('/^(regex|matches|count-)/', $type)) { foreach ($target as $arg) { if (!$this->validate_date_part($datepart, $arg)) { $this->errors['tests'][$i]['target'] = $this->plugin->gettext('invaliddateformat'); @@ -1432,7 +1431,7 @@ // 'any' flag if ((!isset($this->form) && empty($scr['tests']) && !empty($scr)) - || (count($scr['tests']) == 1 && $scr['tests'][0]['test'] == 'true' && !$scr['tests'][0]['not']) + || (is_array($scr['tests']) && count($scr['tests']) == 1 && $scr['tests'][0]['test'] == 'true' && !$scr['tests'][0]['not']) ) { $any = true; } @@ -1530,8 +1529,17 @@ function rule_div($fid, $id, $div=true) { - $rule = isset($this->form) ? $this->form['tests'][$id] : $this->script[$fid]['tests'][$id]; - $rows_num = isset($this->form) ? count($this->form['tests']) : count($this->script[$fid]['tests']); + $rule = isset($this->form) ? $this->form['tests'][$id] : $this->script[$fid]['tests'][$id]; + + if (isset($this->form['tests'])) { + $rows_num = count($this->form['tests']); + } + else if (isset($this->script[$fid]['tests'])) { + $rows_num = count($this->script[$fid]['tests']); + } + else { + $rows_num = 0; + } // headers select $select_header = new html_select(array('name' => "_header[]", 'id' => 'header'.$id, @@ -1934,8 +1942,17 @@ function action_div($fid, $id, $div=true) { - $action = isset($this->form) ? $this->form['actions'][$id] : $this->script[$fid]['actions'][$id]; - $rows_num = isset($this->form) ? count($this->form['actions']) : count($this->script[$fid]['actions']); + $action = isset($this->form) ? $this->form['actions'][$id] : $this->script[$fid]['actions'][$id]; + + if (isset($this->form['actions'])) { + $rows_num = count($this->form['actions']); + } + else if (isset($this->script[$fid]['actions'])) { + $rows_num = count($this->script[$fid]['actions']); + } + else { + $rows_num = 0; + } $out = $div ? '

'."\n" : ''; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php roundcube-1.3.6+dfsg.1/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php --- roundcube-1.3.3+dfsg.1/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php 2018-04-11 11:14:33.000000000 +0000 @@ -1100,7 +1100,7 @@ } // multi-line string - if (preg_match('/[\r\n\0]/', $str) || strlen($str) > 1024) { + if (preg_match('/[\r\n\0]/', $str)) { return sprintf("text:\n%s\n.\n", self::escape_multiline_string($str)); } // quoted-string diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php roundcube-1.3.6+dfsg.1/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php --- roundcube-1.3.3+dfsg.1/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php 2018-04-11 11:14:33.000000000 +0000 @@ -287,7 +287,7 @@ } if (empty($vacation_tests)) { - $vacation_tests = $this->rc->config->get('managesieve_vacation_test', array(array('test' => 'true'))); + $vacation_tests = (array) $this->rc->config->get('managesieve_vacation_test', array(array('test' => 'true'))); } if (!$error) { @@ -378,7 +378,7 @@ $action->add($this->plugin->gettext('vacation.copy'), 'copy'); } - if ($this->rc->config->get('managesieve_vacation') != 2 && count($this->vacation['list'])) { + if ($this->rc->config->get('managesieve_vacation') != 2 && !empty($this->vacation['list'])) { $after = new html_select(array('name' => 'vacation_after', 'id' => 'vacation_after')); $after->add('', ''); @@ -887,7 +887,7 @@ } if (empty($vacation_tests)) { - $vacation_tests = $this->rc->config->get('managesieve_vacation_test', array(array('test' => 'true'))); + $vacation_tests = (array) $this->rc->config->get('managesieve_vacation_test', array(array('test' => 'true'))); } $rule = $this->vacation; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ar.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ar.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ar.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ar.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,28 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Managesieve plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ +*/ +$labels['messagedelete'] = 'حذف الرسالة'; +$labels['add'] = 'إضافة'; +$labels['del'] = 'حذف'; +$labels['flagdeleted'] = 'محذوف'; +$labels['flagflagged'] = 'موسوم'; +$labels['notifymethodmailto'] = 'البريد الإلكتروني'; +$labels['notifymethodtel'] = 'الهاتف'; +$labels['datetest'] = 'التاريخ'; +$labels['advancedopts'] = 'خيارات متقدّمة'; +$labels['vacation.subject'] = 'الموضوع'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ar_SA.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ar_SA.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ar_SA.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ar_SA.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'تصفية جديدة'; $labels['filteradd'] = 'اضافة تصفية'; $labels['filterdel'] = 'حذف تصفية'; +$labels['scope'] = 'مجال'; $labels['moveup'] = 'نقل الى الاعلى '; $labels['movedown'] = 'نقل الى الاسفل'; $labels['filterallof'] = 'مطابقة جميع القواعد التالية'; @@ -65,7 +66,6 @@ $labels['filterset'] = 'مجموعة مصفياة'; $labels['filtersets'] = 'مجموعة تصفية'; $labels['filtersetadd'] = 'اضافة مجموعة تصفية'; -$labels['filtersetdel'] = 'حذف مجموعة التصفية الحالية'; $labels['filtersetact'] = 'تفعيل مجموعة التصفية الحالية '; $labels['filtersetdeact'] = 'تعطيل مجموعة التصفية الحالية '; $labels['filterdef'] = 'تعريف التصفية '; @@ -107,6 +107,8 @@ $labels['notifyimportancelow'] = 'منخفض'; $labels['notifyimportancenormal'] = 'عادي'; $labels['notifyimportancehigh'] = 'مرتفع'; +$labels['notifymethodmailto'] = 'البريد الإلكتروني'; +$labels['notifymethodtel'] = 'الهاتف'; $labels['filtercreate'] = 'انشئ تصفية'; $labels['usedata'] = 'استخدم البيانات التالية في الفلتر:'; $labels['nextstep'] = 'الخطوة التالية'; @@ -150,6 +152,11 @@ $labels['vacation.on'] = 'تشغيل'; $labels['vacation.off'] = 'ايقاف'; $labels['vacation.saving'] = 'يتم حفظ البيانات...'; +$labels['vacation.keep'] = 'ابقاء'; +$labels['forward.on'] = 'تشغيل'; +$labels['forward.off'] = 'ايقاف'; +$labels['forward.saving'] = 'يتم حفظ البيانات...'; +$labels['duplicate.header'] = 'الراس:'; $messages['filterunknownerror'] = 'خطا غير معروف من الخادم.'; $messages['filterconnerror'] = 'لا يمكن الاتصال بالخادم.'; $messages['filterdeleteerror'] = 'لا يمكن حذف التصفية.خطا في الخادم.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ast.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ast.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ast.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ast.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Filtru nuevu'; $labels['filteradd'] = 'Amestar filtru'; $labels['filterdel'] = 'Desaniciar filtru'; +$labels['scope'] = 'Algame'; $labels['moveup'] = 'Mover arriba'; $labels['movedown'] = 'Mover abaxo'; $labels['filterany'] = 'tolos mensaxes'; @@ -47,4 +48,13 @@ $labels['flagread'] = 'Lleer'; $labels['flagdeleted'] = 'Desaniciáu'; $labels['flaganswered'] = 'Respondíu'; +$labels['flagflagged'] = 'Etiquetaos'; +$labels['notifymethodmailto'] = 'Corréu'; +$labels['notifymethodtel'] = 'Teléfonu'; +$labels['datetest'] = 'Data'; +$labels['advancedopts'] = 'Opciones avanzaes'; +$labels['body'] = 'Cuerpu'; +$labels['vacation.subject'] = 'Asuntu'; +$labels['vacation.body'] = 'Cuerpu'; +$labels['vacation.keep'] = 'Caltener'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/az_AZ.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/az_AZ.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/az_AZ.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/az_AZ.inc 2018-04-11 11:14:33.000000000 +0000 @@ -65,7 +65,6 @@ $labels['filterset'] = 'Süzgəc dəsti'; $labels['filtersets'] = 'Süzgəc dəstləri'; $labels['filtersetadd'] = 'Süzgəc dəsti əlavə et'; -$labels['filtersetdel'] = 'İndiki sücgəc dəstini sil'; $labels['filtersetact'] = 'İndiki sücgəc dəstini yandır'; $labels['filtersetdeact'] = 'İndiki süzgəc dəstini söndür'; $labels['filterdef'] = 'Süzgəcin təsviri'; @@ -111,6 +110,8 @@ $labels['notifyimportancelow'] = 'aşağı'; $labels['notifyimportancenormal'] = 'normal'; $labels['notifyimportancehigh'] = 'yuxarı'; +$labels['notifymethodmailto'] = 'E-Poçt'; +$labels['notifymethodtel'] = 'Telefon'; $labels['filtercreate'] = 'Süzgəc yarat'; $labels['usedata'] = 'Süzgəcdə bu məlumatları istifadə et:'; $labels['nextstep'] = 'Sonrakı'; @@ -152,6 +153,10 @@ $labels['asciinumeric'] = 'ədədi (ascii-numeric)'; $labels['index'] = 'indeks:'; $labels['indexlast'] = 'arxaya'; +$labels['vacation.subject'] = 'Mövzu'; +$labels['vacation.body'] = 'Mətn'; +$labels['vacation.keep'] = 'Saxla'; +$labels['duplicate.header'] = 'başlıq:'; $messages['filterunknownerror'] = 'Serverin naməlum xətası.'; $messages['filterconnerror'] = 'Serverə qoşulmaq alınmır'; $messages['filterdeleteerror'] = 'Süzgəci silmək mümkün deyil. Server xətası.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/be_BE.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/be_BE.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/be_BE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/be_BE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Новы фільтр'; $labels['filteradd'] = 'Дадаць фільтр'; $labels['filterdel'] = 'Выдаліць фільтр'; +$labels['scope'] = 'Абсяг'; $labels['moveup'] = 'Пасунуць уверх'; $labels['movedown'] = 'Пасунуць уніз'; $labels['filterallof'] = 'выконваюцца ўсе наступныя правілы'; @@ -65,7 +66,6 @@ $labels['filterset'] = 'Набор фільтраў'; $labels['filtersets'] = 'Наборы фільтраў'; $labels['filtersetadd'] = 'Дадаць набор фільтраў'; -$labels['filtersetdel'] = 'Выдаліць бягучы набор фільтраў'; $labels['filtersetact'] = 'Актываваць бягучы набор фільтраў'; $labels['filtersetdeact'] = 'Дэактываваць бягучы набор фільтраў'; $labels['filterdef'] = 'Вызначэнне фільтра'; @@ -111,6 +111,8 @@ $labels['notifyimportancelow'] = 'нізкая'; $labels['notifyimportancenormal'] = 'звычайная'; $labels['notifyimportancehigh'] = 'высокая'; +$labels['notifymethodmailto'] = 'Эл. пошта'; +$labels['notifymethodtel'] = 'Тэлефон'; $labels['filtercreate'] = 'Стварыць фільтр'; $labels['usedata'] = 'Ужываць наступныя дадзеныя ў фільтры:'; $labels['nextstep'] = 'Наступны крок'; @@ -152,6 +154,10 @@ $labels['asciinumeric'] = 'лікавы (ascii-numeric)'; $labels['index'] = 'індэкс:'; $labels['indexlast'] = 'назад'; +$labels['vacation.subject'] = 'Тэма'; +$labels['vacation.body'] = 'Цела'; +$labels['vacation.keep'] = 'Пакінуць'; +$labels['duplicate.header'] = 'загаловак:'; $messages['filterunknownerror'] = 'Невядомая памылка сервера.'; $messages['filterconnerror'] = 'Не ўдалося злучыцца з серверам.'; $messages['filterdeleteerror'] = 'Не ўдалося выдаліць фільтр. Памылка на серверы.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/bg_BG.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/bg_BG.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/bg_BG.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/bg_BG.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Нов филтър'; $labels['filteradd'] = 'Добавяне на филтър'; $labels['filterdel'] = 'Изтриване на филтър'; +$labels['scope'] = 'Обхват'; $labels['moveup'] = 'Преместване нагоре'; $labels['movedown'] = 'Преместване надолу'; $labels['filterallof'] = 'която изпълнява всички условия'; @@ -67,7 +68,6 @@ $labels['filterset'] = 'Набор филтри'; $labels['filtersets'] = 'Набори филтри'; $labels['filtersetadd'] = 'Нов набор филтри'; -$labels['filtersetdel'] = 'Изтриване на текущ набор филтри'; $labels['filtersetact'] = 'Активиране на текущ набор филтри'; $labels['filtersetdeact'] = 'Деактивиране на текущ набор филтри'; $labels['filterseteditraw'] = 'Редакция набор филтри'; @@ -183,6 +183,11 @@ $labels['vacation.discard'] = 'Изхвърли'; $labels['vacation.redirect'] = 'Препрати на'; $labels['vacation.copy'] = 'Прати копие на'; +$labels['forward.redirect'] = 'Препрати на'; +$labels['forward.copy'] = 'Прати копие на'; +$labels['forward.on'] = 'Вкл.'; +$labels['forward.off'] = 'Изкл.'; +$labels['forward.saving'] = 'Запис на данни...'; $labels['filladdresses'] = 'Попълни с всички мои адреси'; $labels['arialabelfiltersetactions'] = 'Действия на набор от филтри'; $labels['arialabelfilteractions'] = 'Действия на филтър'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/bn_BD.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/bn_BD.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/bn_BD.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/bn_BD.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,27 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Managesieve plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ +*/ +$labels['messagedelete'] = 'মেইল/চিঠি ছিড়ে ফেলুন'; +$labels['del'] = 'ফেলে দিন'; +$labels['sender'] = 'প্রেরক'; +$labels['flagread'] = 'পড়'; +$labels['flagflagged'] = 'দাগানো (flagged)'; +$labels['notifymethodmailto'] = 'ই-মেইল/চিঠি'; +$labels['datetest'] = 'তারিখ'; +$labels['advancedopts'] = 'জটিল বিষয়'; +$labels['vacation.subject'] = 'বিষয়'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/br.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/br.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/br.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/br.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Sil nevez'; $labels['filteradd'] = 'Ouzhpennañ ur sil'; $labels['filterdel'] = 'Dilemel ar sil'; +$labels['scope'] = 'Ledennad'; $labels['moveup'] = 'Dilec\'hiañ da grec\'h '; $labels['movedown'] = 'Dilec\'hiañ d\'an traoñ'; $labels['filterallof'] = 'o kenglotañ gant an holl reolennoù da heul'; @@ -67,7 +68,6 @@ $labels['filterset'] = 'Strollad siloù'; $labels['filtersets'] = 'Strolladoù sil'; $labels['filtersetadd'] = 'Ouzhpennañ ur strollad siloù'; -$labels['filtersetdel'] = 'Dilemel ar strollad siloù bremanel'; $labels['filtersetact'] = 'Gweredekaat ar strollad siloù bremanel'; $labels['filtersetdeact'] = 'Diweredekaat ar strollad siloù bremanel'; $labels['filterdef'] = 'Despizadur ar sil'; @@ -181,6 +181,11 @@ $labels['vacation.discard'] = 'Dilezel'; $labels['vacation.redirect'] = 'Adheñchañ da'; $labels['vacation.copy'] = 'Kas un eilenn da'; +$labels['forward.redirect'] = 'Adheñchañ da'; +$labels['forward.copy'] = 'Kas un eilenn da'; +$labels['forward.on'] = 'Ya'; +$labels['forward.off'] = 'Ket'; +$labels['forward.saving'] = 'Oc\'h enrollañ ar roadennoù'; $labels['filladdresses'] = 'Leuniañ gant ma holl chomlec\'hioù'; $labels['arialabelfiltersetactions'] = 'Gweredeoù ar strollad siloù'; $labels['arialabelfilteractions'] = 'Gweredoù ar sil'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/bs_BA.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/bs_BA.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/bs_BA.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/bs_BA.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Novi filter'; $labels['filteradd'] = 'Dodaj filter'; $labels['filterdel'] = 'Obriši filter'; +$labels['scope'] = 'Opseg'; $labels['moveup'] = 'Pomjeri gore'; $labels['movedown'] = 'Pomjeri dole'; $labels['filterallof'] = 'poklapa se sa svim sljedećim pravilima'; @@ -54,6 +55,7 @@ $labels['del'] = 'Obriši'; $labels['sender'] = 'Pošiljaoc'; $labels['recipient'] = 'Primaoc'; +$labels['vacationaddr'] = 'Moje email adrese:'; $labels['vacationdays'] = 'Frekvencija slanja poruka (u danima):'; $labels['vacationinterval'] = 'Frekvencija slanja poruka:'; $labels['vacationreason'] = 'Tijelo poruke (razlog za odmor):'; @@ -65,7 +67,6 @@ $labels['filterset'] = 'Set filtera'; $labels['filtersets'] = 'Setovi filtera'; $labels['filtersetadd'] = 'Dodaj set filtera'; -$labels['filtersetdel'] = 'Obriši trenutni set filtera'; $labels['filtersetact'] = 'Aktiviraj trenutni set filtera'; $labels['filtersetdeact'] = 'Deaktiviraj trenutni set filtera'; $labels['filterdef'] = 'Definicija filtera'; @@ -169,6 +170,7 @@ $labels['vacation.status'] = 'Status'; $labels['vacation.on'] = 'Uključeno'; $labels['vacation.off'] = 'Isključeno'; +$labels['vacation.addresses'] = 'Moje email adrese'; $labels['vacation.interval'] = 'Interval odgovora'; $labels['vacation.after'] = 'Pravilo za odmor stavi nakon'; $labels['vacation.saving'] = 'Snimam podatke...'; @@ -177,6 +179,11 @@ $labels['vacation.discard'] = 'Odbaci'; $labels['vacation.redirect'] = 'Preusmeri ka'; $labels['vacation.copy'] = 'Pošalji kopiju na'; +$labels['forward.redirect'] = 'Preusmeri ka'; +$labels['forward.copy'] = 'Pošalji kopiju na'; +$labels['forward.on'] = 'Uključeno'; +$labels['forward.off'] = 'Isključeno'; +$labels['forward.saving'] = 'Snimam podatke...'; $labels['filladdresses'] = 'Popuni svim mojim adresama'; $labels['arialabelfiltersetactions'] = 'Akcije za filterske setove'; $labels['arialabelfilteractions'] = 'Filterske akcije'; @@ -185,6 +192,7 @@ $labels['ariasummaryfiltersetslist'] = 'Lista filterskih setova'; $labels['filterstitle'] = 'Uredi filtere za dolazni email'; $labels['vacationtitle'] = 'Uredi pravila kada nisam na poslu'; +$labels['duplicate.header'] = 'zaglavlje:'; $messages['filterunknownerror'] = 'Nepoznata serverska greška.'; $messages['filterconnerror'] = 'Nije se moguće povezati na server.'; $messages['filterdeleteerror'] = 'Nije moguće obrisati filter. Desila se serverska greška.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ca_ES.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ca_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ca_ES.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ca_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Filtre Nou'; $labels['filteradd'] = 'Afegeix un filtre'; $labels['filterdel'] = 'Suprimeix el filtre'; +$labels['scope'] = 'Abast'; $labels['moveup'] = 'Mou amunt'; $labels['movedown'] = 'Mou avall'; $labels['filterallof'] = 'que coincideixi amb totes les regles següents'; @@ -67,7 +68,6 @@ $labels['filterset'] = 'Conjunt de filtres'; $labels['filtersets'] = 'Conjunts de filtres'; $labels['filtersetadd'] = 'Afegeix un conjunt de filtres'; -$labels['filtersetdel'] = 'Suprimeix el conjunt de filtres actual'; $labels['filtersetact'] = 'Activa el conjunt de filtres actual'; $labels['filtersetdeact'] = 'Desactiva el conjunt de filtres actual'; $labels['filterseteditraw'] = 'Edita el conjunt de filtres'; @@ -183,6 +183,11 @@ $labels['vacation.discard'] = 'Descarta'; $labels['vacation.redirect'] = 'Redirigeix cap a'; $labels['vacation.copy'] = 'Envia còpia a'; +$labels['forward.redirect'] = 'Redirigeix cap a'; +$labels['forward.copy'] = 'Envia còpia a'; +$labels['forward.on'] = 'Activat'; +$labels['forward.off'] = 'Desactivat'; +$labels['forward.saving'] = 'S\'estan desant les dades...'; $labels['filladdresses'] = 'Emplena-ho amb totes les meves adreces de correu electrònic'; $labels['arialabelfiltersetactions'] = 'Accions pel conjunt de filtres'; $labels['arialabelfilteractions'] = 'Accions del filtre'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/cs_CZ.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/cs_CZ.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/cs_CZ.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/cs_CZ.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Nový filtr'; $labels['filteradd'] = 'Přidej filtr'; $labels['filterdel'] = 'Smaž filtr'; +$labels['rules'] = 'Pravidla'; +$labels['actions'] = 'Akce'; +$labels['scope'] = 'Rozsah'; $labels['moveup'] = 'Posunout nahoru'; $labels['movedown'] = 'Posunout dolů'; $labels['filterallof'] = 'Odpovídají všechna pravidla'; @@ -38,6 +41,14 @@ $labels['filternotregex'] = 'neodpovídá regulárnímu výrazu'; $labels['filterunder'] = 'pod'; $labels['filterover'] = 'nad'; +$labels['mime'] = 'MIME:'; +$labels['mimepart'] = 'Část MIME:'; +$labels['mime-message'] = 'zpráva'; +$labels['mime-anychild'] = 'jakákoli'; +$labels['mime-type'] = 'typ'; +$labels['mime-subtype'] = 'podtyp'; +$labels['mime-contenttype'] = 'typ obsahu'; +$labels['mime-param'] = 'parametr'; $labels['addrule'] = 'Přidej pravidlo'; $labels['delrule'] = 'Smaž pravidlo'; $labels['messagemoveto'] = 'Přesuň zprávu do'; @@ -67,9 +78,11 @@ $labels['filterset'] = 'Sada filtrů'; $labels['filtersets'] = 'Sady filtrů'; $labels['filtersetadd'] = 'Přidat sadu filtrů'; -$labels['filtersetdel'] = 'Odebrat tuto sadu filtrů'; +$labels['filtersetdel'] = 'Smazat sadu filtrů'; $labels['filtersetact'] = 'Activate current filters set'; $labels['filtersetdeact'] = 'Vypnout tuto sadu filtrů'; +$labels['filterseteditraw'] = 'Upravit sadu pravidel'; +$labels['filtersetswitch'] = 'Zapnout/Vypnout sadu filtrů'; $labels['filterdef'] = 'Definice filtru'; $labels['filtersetname'] = 'Nastavit název sady filtrů'; $labels['newfilterset'] = 'Nová sada filtrů'; @@ -90,9 +103,9 @@ $labels['valueislessthanequal'] = 'hodnota je nižší nebo stejná jako'; $labels['valueequals'] = 'hodnota odpovídá'; $labels['valuenotequals'] = 'hodnota neodpovídá'; -$labels['setflags'] = 'Nastavit vlajky u zprávy'; -$labels['addflags'] = 'Přidat vlajky ke zprávě'; -$labels['removeflags'] = 'Odstranit vlajky ze zprávy'; +$labels['setflags'] = 'Nastavit přiznaky u zprávy'; +$labels['addflags'] = 'Přidat příznaky ke zprávě'; +$labels['removeflags'] = 'Odstranit příznaky ze zprávy'; $labels['flagread'] = 'Přečteno'; $labels['flagdeleted'] = 'Smazáno'; $labels['flaganswered'] = 'Odpovězené'; @@ -124,6 +137,7 @@ $labels['usedata'] = 'Použít následující údaje ve filtru:'; $labels['nextstep'] = 'Další krok'; $labels['...'] = '...'; +$labels['string'] = 'Řetězec'; $labels['currdate'] = 'Aktuální datum'; $labels['datetest'] = 'Datum'; $labels['dateheader'] = 'hlavička:'; @@ -181,6 +195,14 @@ $labels['vacation.discard'] = 'Zahodit'; $labels['vacation.redirect'] = 'Přesměrovat na'; $labels['vacation.copy'] = 'Odeslat kopii zprávy na'; +$labels['forward'] = 'Přeposílání'; +$labels['forward.redirect'] = 'Přesměrovat na'; +$labels['forward.copy'] = 'Odeslat kopii zprávy na'; +$labels['forward.on'] = 'Zapnuto'; +$labels['forward.off'] = 'Vypnuto'; +$labels['forward.status'] = 'Stav:'; +$labels['forward.action'] = 'Vykonej následující akci pro příchozí e-maily:'; +$labels['forward.saving'] = 'Ukládám data...'; $labels['filladdresses'] = 'Vyplnit všemi mými adresami'; $labels['arialabelfiltersetactions'] = 'Nastavit akce filtru'; $labels['arialabelfilteractions'] = 'Akce filtru'; @@ -189,14 +211,22 @@ $labels['ariasummaryfiltersetslist'] = 'Seznam sad filtrů'; $labels['filterstitle'] = 'Upravit filtry příchozích emailů'; $labels['vacationtitle'] = 'Upravit pravidlo mimo-kancelář'; -$labels['message'] = 'Zprávy'; +$labels['forwardtitle'] = 'Upravit pravidlo pro přeposílání emailů'; +$labels['message'] = 'Zpráva'; +$labels['duplicate'] = 'je duplicitní'; +$labels['notduplicate'] = 'není duplicitní'; +$labels['duplicate.handle'] = 'popisovač:'; +$labels['duplicate.header'] = 'hlavička:'; $labels['duplicate.uniqueid'] = 'Identifikátor:'; +$labels['duplicate.seconds'] = 'prodleva (sekundy)'; +$labels['duplicate.last'] = 'relativní k poslednímu vykonání'; $messages['filterunknownerror'] = 'Neznámá chyba serveru'; $messages['filterconnerror'] = 'Nebylo možné se připojit k sieve serveru'; $messages['filterdeleteerror'] = 'Nebylo možné smazat filtr. Došlo k chybě serveru.'; $messages['filterdeleted'] = 'Filtr byl smazán'; $messages['filtersaved'] = 'Filtr byl uložen'; $messages['filtersaveerror'] = 'Nebylo možné uložit filtr. Došlo k chybě serveru.'; +$messages['filterformerror'] = 'Formulář filtru obsahuje chyby'; $messages['filterdeleteconfirm'] = 'Opravdu chcete smazat vybraný filtr?'; $messages['ruledeleteconfirm'] = 'Jste si jisti, že chcete smazat vybrané pravidlo?'; $messages['actiondeleteconfirm'] = 'Jste si jisti, že chcete smazat vybranou akci?'; @@ -209,6 +239,7 @@ $messages['setactivated'] = 'Sada filtrů úspěšně zapnuta.'; $messages['setdeactivated'] = 'Sada filtrů úspěšně vypnuta.'; $messages['setdeleted'] = 'Sada filtrů úspěšně odstraněna.'; +$messages['setupdated'] = 'Sada pravidel byla úspúěšně upravena'; $messages['setdeleteconfirm'] = 'Opravdu si přejete odebrat vybranou sadu filtrů.'; $messages['setcreateerror'] = 'Nelze vytvořit sadu filtrů. Došlo k chybě serveru.'; $messages['setcreated'] = 'Sada filtrů úspěšně vytvořena.'; @@ -225,5 +256,8 @@ $messages['invaliddateformat'] = 'Neplatné datum nebo část data'; $messages['saveerror'] = 'Nebylo možné uložit data. Došlo k chybě serveru.'; $messages['vacationsaved'] = 'Data o dovolené byla uložena.'; +$messages['forwardsaved'] = 'Data pro přeposlání byla uložena.'; $messages['emptyvacationbody'] = 'Tělo zprávy'; +$messages['duplicate.conflict.err'] = 'Hlavička a jedinečný identifikátor zároveň nejsou povoleny.'; +$messages['disabledaction'] = 'Akce není povolena'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/cy_GB.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/cy_GB.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/cy_GB.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/cy_GB.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,8 @@ $labels['newfilter'] = 'Hidlydd newydd'; $labels['filteradd'] = 'Ychwanegu hidlydd'; $labels['filterdel'] = 'Dileu hidlydd'; +$labels['actions'] = 'Gweithredoedd'; +$labels['scope'] = 'Amrediad'; $labels['moveup'] = 'Symud i fyny'; $labels['movedown'] = 'Symud i lawr'; $labels['filterallof'] = 'sy\'n cyfateb i\'r holl reolau canlynol'; @@ -67,7 +69,6 @@ $labels['filterset'] = 'Set hidlyddion'; $labels['filtersets'] = 'Setiau hidlyddion'; $labels['filtersetadd'] = 'Ychwanegu set hidlyddion'; -$labels['filtersetdel'] = 'Dileu set hidlyddion cyfredol'; $labels['filtersetact'] = 'Dileu set hidlyddion gweithredol'; $labels['filtersetdeact'] = 'Analluogi set hidlyddion cyfredol'; $labels['filterseteditraw'] = 'Golygu set hidlo'; @@ -183,6 +184,11 @@ $labels['vacation.discard'] = 'Gwaredu'; $labels['vacation.redirect'] = 'Ailgyfeirio i'; $labels['vacation.copy'] = 'Danfon copi i'; +$labels['forward.redirect'] = 'Ailgyfeirio i'; +$labels['forward.copy'] = 'Danfon copi i'; +$labels['forward.on'] = 'Ymlaen'; +$labels['forward.off'] = 'I ffwrdd'; +$labels['forward.saving'] = 'Yn cadw\'r data...'; $labels['filladdresses'] = 'Llenwi gyda fy nghyfeiriadau ychwanegol'; $labels['arialabelfiltersetactions'] = 'Gweithrediadau set hidlydd'; $labels['arialabelfilteractions'] = 'Gweithrediadau hidlydd'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/da_DK.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/da_DK.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/da_DK.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/da_DK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Nyt filter'; $labels['filteradd'] = 'Tilføj filter'; $labels['filterdel'] = 'Slet filter'; +$labels['scope'] = 'Omfang'; $labels['moveup'] = 'Flyt op'; $labels['movedown'] = 'Flyt ned'; $labels['filterallof'] = 'matcher alle af de følgende regler'; @@ -54,6 +55,7 @@ $labels['del'] = 'Fjern'; $labels['sender'] = 'Afsender'; $labels['recipient'] = 'Modtager'; +$labels['vacationaddr'] = 'Min e-mail adresse:'; $labels['vacationdays'] = 'Hvor tit skal besked sendes (i dage):'; $labels['vacationinterval'] = 'Hvor tit skal besked sendes:'; $labels['vacationreason'] = 'Besked (ved ferie):'; @@ -65,7 +67,6 @@ $labels['filterset'] = 'Filter sæt'; $labels['filtersets'] = 'Filtre sæt'; $labels['filtersetadd'] = 'Tilføj filter sæt'; -$labels['filtersetdel'] = 'Slet aktuel filter sæt'; $labels['filtersetact'] = 'Aktiver nuværende filter sæt'; $labels['filtersetdeact'] = 'Deaktiver nuværende filter sæt'; $labels['filterdef'] = 'Filter definition'; @@ -159,6 +160,7 @@ $labels['vacation.reply'] = 'Svar besked'; $labels['vacation.advanced'] = 'Avanceret indstillinger '; $labels['vacation.subject'] = 'Emne'; +$labels['vacation.body'] = 'Body'; $labels['vacation.start'] = 'Ferie star'; $labels['vacation.end'] = 'Ferie slut'; $labels['vacation.status'] = 'Status'; @@ -167,6 +169,10 @@ $labels['vacation.discard'] = 'Kasser'; $labels['vacation.redirect'] = 'Omdiriger til '; $labels['vacation.copy'] = 'Send kopi til'; +$labels['forward.redirect'] = 'Omdiriger til '; +$labels['forward.copy'] = 'Send kopi til'; +$labels['forward.saving'] = 'Gemmer data...'; +$labels['duplicate.header'] = 'header:'; $messages['filterunknownerror'] = 'Ukendt server fejl.'; $messages['filterconnerror'] = 'Kan ikke forbinde til server.'; $messages['filterdeleteerror'] = 'Kunne ikke slette filter. Serverfejl opstod.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/de_CH.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/de_CH.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/de_CH.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/de_CH.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Neuer Filter'; $labels['filteradd'] = 'Filter hinzufügen'; $labels['filterdel'] = 'Filter löschen'; +$labels['scope'] = 'Suchbereich'; $labels['moveup'] = 'Nach oben'; $labels['movedown'] = 'Nach unten'; $labels['filterallof'] = 'UND (alle Regeln müssen zutreffen)'; @@ -67,7 +68,6 @@ $labels['filterset'] = 'Filtersätze'; $labels['filtersets'] = 'Filtersätze'; $labels['filtersetadd'] = 'Filtersatz anlegen'; -$labels['filtersetdel'] = 'Aktuellen Filtersatz löschen'; $labels['filtersetact'] = 'Aktuellen Filtersatz aktivieren'; $labels['filtersetdeact'] = 'Aktuellen Filtersatz deaktivieren'; $labels['filterseteditraw'] = 'Filtersatz bearbeiten'; @@ -183,6 +183,11 @@ $labels['vacation.discard'] = 'Verwerfen'; $labels['vacation.redirect'] = 'Weiterleiten an'; $labels['vacation.copy'] = 'Kopie an'; +$labels['forward.redirect'] = 'Weiterleiten an'; +$labels['forward.copy'] = 'Kopie an'; +$labels['forward.on'] = 'Ein'; +$labels['forward.off'] = 'Aus'; +$labels['forward.saving'] = 'Speichere Daten...'; $labels['filladdresses'] = 'Mit allen meiner Adressen ausfüllen'; $labels['arialabelfiltersetactions'] = 'Filtersatz-Aktionen'; $labels['arialabelfilteractions'] = 'Filteraktionen'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/de_DE.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/de_DE.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/de_DE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/de_DE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Neuer Filter'; $labels['filteradd'] = 'Filter hinzufügen'; $labels['filterdel'] = 'Filter löschen'; +$labels['rules'] = 'Regeln'; +$labels['actions'] = 'Aktionen'; +$labels['scope'] = 'Bereich'; $labels['moveup'] = 'Nach oben'; $labels['movedown'] = 'Nach unten'; $labels['filterallof'] = 'trifft auf alle folgenden Regeln zu'; @@ -38,6 +41,12 @@ $labels['filternotregex'] = 'trifft nicht auf regulären Ausdruck zu'; $labels['filterunder'] = 'unter'; $labels['filterover'] = 'über'; +$labels['mime'] = 'MIME:'; +$labels['mime-message'] = 'Nachricht'; +$labels['mime-type'] = 'Typ'; +$labels['mime-subtype'] = 'Untertyp'; +$labels['mime-contenttype'] = 'Inhaltstyp'; +$labels['mime-param'] = 'Parameter'; $labels['addrule'] = 'Regel hinzufügen'; $labels['delrule'] = 'Regel löschen'; $labels['messagemoveto'] = 'Nachricht verschieben nach'; @@ -67,10 +76,11 @@ $labels['filterset'] = 'Filtersätze'; $labels['filtersets'] = 'Filtersätze'; $labels['filtersetadd'] = 'Filtersatz anlegen'; -$labels['filtersetdel'] = 'Aktuellen Filtersatz löschen'; +$labels['filtersetdel'] = 'Filtersatz löschen'; $labels['filtersetact'] = 'Aktuellen Filtersatz aktivieren'; $labels['filtersetdeact'] = 'Aktuellen Filtersatz deaktivieren'; $labels['filterseteditraw'] = 'Filtersatz bearbeiten'; +$labels['filtersetswitch'] = 'Filtersatz aktivieren/deaktivieren'; $labels['filterdef'] = 'Filterdefinition'; $labels['filtersetname'] = 'Filtersatzname'; $labels['newfilterset'] = 'Neuer Filtersatz'; @@ -183,6 +193,14 @@ $labels['vacation.discard'] = 'Verwerfen'; $labels['vacation.redirect'] = 'Weiterleiten an'; $labels['vacation.copy'] = 'Kopie senden an'; +$labels['forward'] = 'Weiterleitung'; +$labels['forward.redirect'] = 'Weiterleiten an'; +$labels['forward.copy'] = 'Kopie senden an'; +$labels['forward.on'] = 'An'; +$labels['forward.off'] = 'Aus'; +$labels['forward.status'] = 'Status:'; +$labels['forward.action'] = 'Für eingehende Mails die folgende Aktion ausführen:'; +$labels['forward.saving'] = 'Speichere Daten...'; $labels['filladdresses'] = 'Mit allen meinen Adressen ausfüllen'; $labels['arialabelfiltersetactions'] = 'Aktionen für Filtersätze'; $labels['arialabelfilteractions'] = 'Aktionen für Filter'; @@ -191,6 +209,7 @@ $labels['ariasummaryfiltersetslist'] = 'Liste von Filtersätzen'; $labels['filterstitle'] = 'Eingehende Mailfilter bearbeiten'; $labels['vacationtitle'] = 'Abwesendheitsregel bearbeiten'; +$labels['forwardtitle'] = 'Mail-Weiterleitungsregel bearbeiten'; $labels['message'] = 'Nachricht'; $labels['duplicate'] = 'ist doppelt'; $labels['notduplicate'] = 'ist nicht doppelt'; @@ -235,6 +254,8 @@ $messages['invaliddateformat'] = 'Ungültiges Datum oder Teil-Format'; $messages['saveerror'] = 'Ein Serverfehler ist aufgetreten, Speicherung war nicht möglich.'; $messages['vacationsaved'] = 'Urlaubsdaten erfolgreich gespeichert.'; +$messages['forwardsaved'] = 'Weiterleitungsdaten erfolgreich gespeichert.'; $messages['emptyvacationbody'] = 'Inhalt der Abwesenheitsbenachrichtigung wird benötigt!'; $messages['duplicate.conflict.err'] = 'Beides, Kopfzeilen und eindeutige Kennzeichner, sind nicht erlaubt.'; +$messages['disabledaction'] = 'Aktion nicht erlaubt.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/el_GR.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/el_GR.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/el_GR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/el_GR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Δημιουργία φίλτρου'; $labels['filteradd'] = 'Προσθήκη φίλτρου'; $labels['filterdel'] = 'Διαγραφή φίλτρου'; +$labels['scope'] = 'Εύρος'; $labels['moveup'] = 'Μετακίνηση πάνω'; $labels['movedown'] = 'Μετακίνηση κάτω'; $labels['filterallof'] = 'ταιριάζουν με όλους τους παρακάτω κανόνες'; @@ -67,7 +68,6 @@ $labels['filterset'] = 'Φίλτρα'; $labels['filtersets'] = 'Φίλτρο'; $labels['filtersetadd'] = 'Προσθήκη φίλτρων'; -$labels['filtersetdel'] = 'Διαγραφή φίλτρων'; $labels['filtersetact'] = 'Ενεργοποίηση φιλτρων'; $labels['filtersetdeact'] = 'Απενεργοποίηση φιλτρων'; $labels['filterdef'] = 'Ορισμος φιλτρου'; @@ -181,6 +181,11 @@ $labels['vacation.discard'] = 'Διαγραφή'; $labels['vacation.redirect'] = 'Ανακατεύθυνση σε'; $labels['vacation.copy'] = 'Αποστολή αντιγράφου σε'; +$labels['forward.redirect'] = 'Ανακατεύθυνση σε'; +$labels['forward.copy'] = 'Αποστολή αντιγράφου σε'; +$labels['forward.on'] = 'Ενεργό'; +$labels['forward.off'] = 'Ανενεργό'; +$labels['forward.saving'] = 'Αποθήκευση δεδομένων...'; $labels['filladdresses'] = 'Συμπλήρωση με όλες τις email διευθύνσεις μου'; $labels['arialabelfiltersetactions'] = 'Ενέργειες ομάδας φίλτρων'; $labels['arialabelfilteractions'] = 'Ενέργειες φίλτρων'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/en_CA.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/en_CA.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/en_CA.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/en_CA.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'New filter'; $labels['filteradd'] = 'Add filter'; $labels['filterdel'] = 'Delete filter'; +$labels['scope'] = 'Scope'; $labels['moveup'] = 'Move up'; $labels['movedown'] = 'Move down'; $labels['filterallof'] = 'matching all of the following rules'; @@ -65,7 +66,6 @@ $labels['filterset'] = 'Filters set'; $labels['filtersets'] = 'Filter sets'; $labels['filtersetadd'] = 'Add filters set'; -$labels['filtersetdel'] = 'Delete current filters set'; $labels['filtersetact'] = 'Activate current filters set'; $labels['filtersetdeact'] = 'Deactivate current filters set'; $labels['filterdef'] = 'Filter definition'; @@ -170,6 +170,11 @@ $labels['vacation.interval'] = 'Reply interval'; $labels['vacation.after'] = 'Put vacation rule after'; $labels['vacation.saving'] = 'Saving data...'; +$labels['vacation.keep'] = 'Keep'; +$labels['forward.on'] = 'On'; +$labels['forward.off'] = 'Off'; +$labels['forward.saving'] = 'Saving data...'; +$labels['duplicate.header'] = 'header:'; $messages['filterunknownerror'] = 'Unknown server error.'; $messages['filterconnerror'] = 'Unable to connect to server.'; $messages['filterdeleteerror'] = 'Unable to delete filter. Server error occurred.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/en_GB.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/en_GB.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/en_GB.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/en_GB.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'New filter'; $labels['filteradd'] = 'Add filter'; $labels['filterdel'] = 'Delete filter'; +$labels['rules'] = 'Rules'; +$labels['actions'] = 'Actions'; +$labels['scope'] = 'Scope'; $labels['moveup'] = 'Move up'; $labels['movedown'] = 'Move down'; $labels['filterallof'] = 'matching all of the following rules'; @@ -38,6 +41,14 @@ $labels['filternotregex'] = 'not matches regular expression'; $labels['filterunder'] = 'under'; $labels['filterover'] = 'over'; +$labels['mime'] = 'MIME:'; +$labels['mimepart'] = 'MIME part:'; +$labels['mime-message'] = 'message'; +$labels['mime-anychild'] = 'any'; +$labels['mime-type'] = 'type'; +$labels['mime-subtype'] = 'subtype'; +$labels['mime-contenttype'] = 'content-type'; +$labels['mime-param'] = 'parameter'; $labels['addrule'] = 'Add rule'; $labels['delrule'] = 'Delete rule'; $labels['messagemoveto'] = 'Move message to'; @@ -67,10 +78,11 @@ $labels['filterset'] = 'Filters set'; $labels['filtersets'] = 'Filter sets'; $labels['filtersetadd'] = 'Add filters set'; -$labels['filtersetdel'] = 'Delete current filters set'; +$labels['filtersetdel'] = 'Delete filters set'; $labels['filtersetact'] = 'Activate current filters set'; $labels['filtersetdeact'] = 'Deactivate current filters set'; $labels['filterseteditraw'] = 'Edit filter set'; +$labels['filtersetswitch'] = 'Enable/disable filters set'; $labels['filterdef'] = 'Filter definition'; $labels['filtersetname'] = 'Filters set name'; $labels['newfilterset'] = 'New filters set'; @@ -183,6 +195,14 @@ $labels['vacation.discard'] = 'Discard'; $labels['vacation.redirect'] = 'Redirect to'; $labels['vacation.copy'] = 'Send copy to'; +$labels['forward'] = 'Forwarding'; +$labels['forward.redirect'] = 'Redirect to'; +$labels['forward.copy'] = 'Send copy to'; +$labels['forward.on'] = 'On'; +$labels['forward.off'] = 'Off'; +$labels['forward.status'] = 'Status:'; +$labels['forward.action'] = 'For incoming mails execute the following action:'; +$labels['forward.saving'] = 'Saving data...'; $labels['filladdresses'] = 'Fill with all my addresses'; $labels['arialabelfiltersetactions'] = 'Filter set actions'; $labels['arialabelfilteractions'] = 'Filter actions'; @@ -191,6 +211,7 @@ $labels['ariasummaryfiltersetslist'] = 'List of filter sets'; $labels['filterstitle'] = 'Edit incoming mail filters'; $labels['vacationtitle'] = 'Edit out-of-office rule'; +$labels['forwardtitle'] = 'Edit mail forwarding rule'; $labels['message'] = 'Message'; $labels['duplicate'] = 'is duplicate'; $labels['notduplicate'] = 'is not duplicate'; @@ -235,6 +256,8 @@ $messages['invaliddateformat'] = 'Invalid date or date part format'; $messages['saveerror'] = 'Unable to save data. Server error occurred.'; $messages['vacationsaved'] = 'Vacation data saved successfully.'; +$messages['forwardsaved'] = 'Forward data saved successfully.'; $messages['emptyvacationbody'] = 'Body of vacation message is required!'; $messages['duplicate.conflict.err'] = 'Both header and unique identifier are not allowed.'; +$messages['disabledaction'] = 'Action not permitted.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/eo.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/eo.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/eo.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/eo.inc 2018-04-11 11:14:33.000000000 +0000 @@ -48,4 +48,12 @@ $labels['del'] = 'Forigi'; $labels['sender'] = 'Sendanto'; $labels['recipient'] = 'Ricevanto'; +$labels['flagread'] = 'Legi'; +$labels['flagdeleted'] = 'Forigita'; +$labels['flagflagged'] = 'Markita'; +$labels['notifymethodmailto'] = 'Retpoŝto'; +$labels['notifymethodtel'] = 'Telefono'; +$labels['datetest'] = 'Dato'; +$labels['vacation.subject'] = 'Temo'; +$labels['vacation.keep'] = 'Manteni'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/es_419.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/es_419.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/es_419.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/es_419.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Filtro nuevo'; $labels['filteradd'] = 'Agregar filtro'; $labels['filterdel'] = 'Eliminar filtro'; +$labels['scope'] = 'Alcance'; $labels['moveup'] = 'Mover hacia arriba'; $labels['movedown'] = 'Mover hacia abajo'; $labels['filterallof'] = 'coincide con todas las reglas siguientes'; @@ -65,7 +66,6 @@ $labels['filterset'] = 'Set de filtros'; $labels['filtersets'] = 'Filtro acciona'; $labels['filtersetadd'] = 'Agregar set de filtros'; -$labels['filtersetdel'] = 'Eliminar set de filtros actual'; $labels['filtersetact'] = 'Activar set de filtros actual'; $labels['filtersetdeact'] = 'Desactivar set de filtros actual'; $labels['filterdef'] = 'Definición del filtro'; @@ -177,6 +177,11 @@ $labels['vacation.discard'] = 'Descartar'; $labels['vacation.redirect'] = 'Redireccionar a'; $labels['vacation.copy'] = 'Enviar una copia a'; +$labels['forward.redirect'] = 'Redireccionar a'; +$labels['forward.copy'] = 'Enviar una copia a'; +$labels['forward.on'] = 'Encendido'; +$labels['forward.off'] = 'Apagado'; +$labels['forward.saving'] = 'Guardando información...'; $labels['arialabelfiltersetactions'] = 'Acciones del set de filtros'; $labels['arialabelfilteractions'] = 'Acciones de filtros'; $labels['arialabelfilterform'] = 'Propiedades de filtros'; @@ -184,6 +189,7 @@ $labels['ariasummaryfiltersetslist'] = 'Lista de set de filtros'; $labels['filterstitle'] = 'Administrar filtros de correos entrantes'; $labels['vacationtitle'] = 'Editar regla de fuera de oficina'; +$labels['duplicate.header'] = 'encabezado:'; $messages['filterunknownerror'] = 'Error de servidor desconocido.'; $messages['filterconnerror'] = 'No se puede conectar al servidor.'; $messages['filterdeleteerror'] = 'No se puede eliminar el filtro. Ocurrió un error de servidor.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/es_AR.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/es_AR.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/es_AR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/es_AR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Nuevo filtro'; $labels['filteradd'] = 'Agregar filtro'; $labels['filterdel'] = 'Eliminar filtro'; +$labels['scope'] = 'Alcance'; $labels['moveup'] = 'Mover arriba'; $labels['movedown'] = 'Mover abajo'; $labels['filterallof'] = 'coinidir con todas las reglas siguientes'; @@ -65,7 +66,6 @@ $labels['filterset'] = 'Conjunto de filtros'; $labels['filtersets'] = 'Filtro activa'; $labels['filtersetadd'] = 'Agregar conjunto de filtros'; -$labels['filtersetdel'] = 'Eliminar conjunto de filtros'; $labels['filtersetact'] = 'Activar conjunto de filtros'; $labels['filtersetdeact'] = 'Deactivar conjunto de filtros'; $labels['filterdef'] = 'Definicion del conjunto de filtros'; @@ -177,6 +177,11 @@ $labels['vacation.discard'] = 'Descartar'; $labels['vacation.redirect'] = 'Reenviar a'; $labels['vacation.copy'] = 'Enviar copia a'; +$labels['forward.redirect'] = 'Reenviar a'; +$labels['forward.copy'] = 'Enviar copia a'; +$labels['forward.on'] = 'On'; +$labels['forward.off'] = 'Off'; +$labels['forward.saving'] = 'Guardando información...'; $labels['arialabelfiltersetactions'] = 'Acciones de conjunto de filtros'; $labels['arialabelfilteractions'] = 'Filtrar acciones'; $labels['arialabelfilterform'] = 'Filtrar propiedades'; @@ -184,6 +189,7 @@ $labels['ariasummaryfiltersetslist'] = 'Listado de conjunto de filtros'; $labels['filterstitle'] = 'Editar filtros para mensajes entrantes'; $labels['vacationtitle'] = 'Editar reglas "fuera de la oficina"'; +$labels['duplicate.header'] = 'encabezado:'; $messages['filterunknownerror'] = 'Error desconocido de servidor'; $messages['filterconnerror'] = 'Imposible conectar con el servidor managesieve'; $messages['filterdeleteerror'] = 'Imposible borrar filtro. Ha ocurrido un error en el servidor'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/es_ES.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/es_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/es_ES.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/es_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Nuevo filtro'; $labels['filteradd'] = 'Añadir filtro'; $labels['filterdel'] = 'Eliminar filtro'; +$labels['scope'] = 'Ámbito'; $labels['moveup'] = 'Mover arriba'; $labels['movedown'] = 'Mover abajo'; $labels['filterallof'] = 'que coincida con todas las reglas siguientes'; @@ -67,7 +68,6 @@ $labels['filterset'] = 'Conjunto de filtros'; $labels['filtersets'] = 'Conjuntos de filtros'; $labels['filtersetadd'] = 'Agregar conjunto de filtros'; -$labels['filtersetdel'] = 'Eliminar conjunto de filtros actual'; $labels['filtersetact'] = 'Activar conjunto de filtros actual'; $labels['filtersetdeact'] = 'Desactivar conjunto de filtros actual'; $labels['filterseteditraw'] = 'Editar conjunto de filtros'; @@ -183,6 +183,11 @@ $labels['vacation.discard'] = 'Descartar'; $labels['vacation.redirect'] = 'Redireccionar a'; $labels['vacation.copy'] = 'Enviar copia a'; +$labels['forward.redirect'] = 'Redireccionar a'; +$labels['forward.copy'] = 'Enviar copia a'; +$labels['forward.on'] = 'Activado'; +$labels['forward.off'] = 'Desactivado'; +$labels['forward.saving'] = 'Guardando datos...'; $labels['filladdresses'] = 'Rellenar con todas mis direcciones'; $labels['arialabelfiltersetactions'] = 'Acciones de un paquete de filtros'; $labels['arialabelfilteractions'] = 'Acciones de filtro'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/et_EE.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/et_EE.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/et_EE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/et_EE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Uus filter'; $labels['filteradd'] = 'Lisa filter'; $labels['filterdel'] = 'Kustuta filter'; +$labels['scope'] = 'Skoop'; $labels['moveup'] = 'Liiguta üles'; $labels['movedown'] = 'Liiguta alla'; $labels['filterallof'] = 'vastab kõikidele järgnevatele reeglitele'; @@ -64,7 +65,6 @@ $labels['filterset'] = 'Filtrite kogum'; $labels['filtersets'] = 'Filtri kogum'; $labels['filtersetadd'] = 'Lisa filtrite kogum'; -$labels['filtersetdel'] = 'Kustuta praegune filtrite kogum'; $labels['filtersetact'] = 'Aktiveeri praegune filtrite kogum'; $labels['filtersetdeact'] = 'De-aktiveeri praegune filtrite kogum'; $labels['filterdef'] = 'Filtri definitsioon'; @@ -110,6 +110,8 @@ $labels['notifyimportancelow'] = 'madal'; $labels['notifyimportancenormal'] = 'tavaline'; $labels['notifyimportancehigh'] = 'kõrge'; +$labels['notifymethodmailto'] = 'E-post'; +$labels['notifymethodtel'] = 'Telefon'; $labels['filtercreate'] = 'Loo filter'; $labels['usedata'] = 'Kasuta filtris järgmisi andmeid:'; $labels['nextstep'] = 'Järgmine samm'; @@ -151,6 +153,10 @@ $labels['asciinumeric'] = 'numbriline (ascii-numeric)'; $labels['index'] = 'indeks:'; $labels['indexlast'] = 'tagasisuunas'; +$labels['vacation.subject'] = 'Pealkiri'; +$labels['vacation.body'] = 'Keha'; +$labels['vacation.keep'] = 'Säilita'; +$labels['duplicate.header'] = 'päis:'; $messages['filterunknownerror'] = 'Tundmatu serveri tõrge'; $messages['filterconnerror'] = 'Managesieve serveriga ühendumine nurjus'; $messages['filterdeleted'] = 'Filter edukalt kustutatud'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/eu_ES.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/eu_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/eu_ES.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/eu_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Iragazki berria'; $labels['filteradd'] = 'Gehitu iragazkia'; $labels['filterdel'] = 'Ezabatu iragazkia'; +$labels['scope'] = 'Esparrua'; $labels['moveup'] = 'Mugitu gora'; $labels['movedown'] = 'Mugitu behera'; $labels['filterallof'] = 'datozen arau guztiak parekatzen'; @@ -54,7 +55,7 @@ $labels['del'] = 'Ezabatu'; $labels['sender'] = 'Bidaltzailea'; $labels['recipient'] = 'Hartzailea'; -$labels['vacationaddr'] = 'Nire eposta helbideak:'; +$labels['vacationaddr'] = 'Nire e-posta helbideak:'; $labels['vacationdays'] = 'Zenbatero bidali mezuak (egunak)'; $labels['vacationinterval'] = 'Zenbatero bidali mezuak:'; $labels['vacationreason'] = 'Mezuaren gorputza (oporrak direla medio):'; @@ -67,7 +68,6 @@ $labels['filterset'] = 'Iragazki-paketea'; $labels['filtersets'] = 'Iragazki-paketeak'; $labels['filtersetadd'] = 'Gehitu iragazki-paketea'; -$labels['filtersetdel'] = 'Ezabatu uneko iragazki-paketea'; $labels['filtersetact'] = 'Gaitu uneko iragazki-paketea'; $labels['filtersetdeact'] = 'Ezgaitu uneko iragazki-paketea'; $labels['filterseteditraw'] = 'Editatu iragazki multzoa'; @@ -183,6 +183,11 @@ $labels['vacation.discard'] = 'Baztertu'; $labels['vacation.redirect'] = 'Birbideratu hona'; $labels['vacation.copy'] = 'Bidali kopia hona'; +$labels['forward.redirect'] = 'Birbideratu hona'; +$labels['forward.copy'] = 'Bidali kopia hona'; +$labels['forward.on'] = 'Piztuta'; +$labels['forward.off'] = 'Itzalita'; +$labels['forward.saving'] = 'Datuak gordetzen...'; $labels['filladdresses'] = 'Bete nire helbide guztiekin'; $labels['arialabelfiltersetactions'] = 'Iragazki-paketearen ekintzak'; $labels['arialabelfilteractions'] = 'Iragazki-ekintzak'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/fa_AF.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/fa_AF.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/fa_AF.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/fa_AF.inc 2018-04-11 11:14:33.000000000 +0000 @@ -54,6 +54,8 @@ $labels['month'] = 'ماه'; $labels['day'] = 'روز'; $labels['second'] = 'ثانیه'; +$labels['advancedopts'] = 'انتخاب های پیشرفته'; +$labels['body'] = 'متن پیام'; $labels['address'] = 'آدرس'; $labels['envelope'] = 'پاکت نامه'; $labels['modifier'] = 'ویرایش کننده:'; @@ -75,8 +77,11 @@ $labels['vacation.status'] = 'وضعیت'; $labels['vacation.on'] = 'فعال'; $labels['vacation.off'] = 'غیرفعال'; +$labels['forward.on'] = 'فعال'; +$labels['forward.off'] = 'غیرفعال'; $labels['arialabelfilterform'] = 'خصوصیات فیلترها'; $labels['ariasummaryfilterslist'] = 'لیست فیلترها'; +$labels['duplicate.header'] = 'سرایند:'; $messages['filterdeleted'] = 'فیلتر با موفقیت حذف شد.'; $messages['filtersaved'] = 'فیلتر با موفقیت ذخیره شد.'; $messages['deactivated'] = 'فیلتر(ها) با موفقیت غیر فعال شدند'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/fa_IR.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/fa_IR.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/fa_IR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/fa_IR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'پالایه جدید'; $labels['filteradd'] = 'افزودن پالایه'; $labels['filterdel'] = 'حذف پالایه'; +$labels['scope'] = 'حوزه'; $labels['moveup'] = 'انتقال به بالا'; $labels['movedown'] = 'انتقال به پایین'; $labels['filterallof'] = 'مطابقت همه قوانین ذیل'; @@ -65,7 +66,6 @@ $labels['filterset'] = 'مجموعه پالایه‌ها'; $labels['filtersets'] = 'مجموعه‌های پالایه‌ها'; $labels['filtersetadd'] = 'افزودن مجموعه پالایه‌ها'; -$labels['filtersetdel'] = 'حذف مجموعه پالایه‌های جاری'; $labels['filtersetact'] = 'فعال کردن مجموعه پالایه‌های جاری'; $labels['filtersetdeact'] = 'غیرفعال کردن مجموعه پالایه‌های جاری'; $labels['filterdef'] = 'تعریف پالایه'; @@ -177,6 +177,11 @@ $labels['vacation.discard'] = 'دور انداختن'; $labels['vacation.redirect'] = 'بازگردانی به'; $labels['vacation.copy'] = 'ارسال رونوشت به'; +$labels['forward.redirect'] = 'بازگردانی به'; +$labels['forward.copy'] = 'ارسال رونوشت به'; +$labels['forward.on'] = 'روشن'; +$labels['forward.off'] = 'خاموش'; +$labels['forward.saving'] = 'ذخیره داده‌ها...'; $labels['arialabelfiltersetactions'] = 'کنش‌های مجموعه پالایه'; $labels['arialabelfilteractions'] = 'کنش‌های پالایه'; $labels['arialabelfilterform'] = 'خصوصیات پالایه'; @@ -184,6 +189,7 @@ $labels['ariasummaryfiltersetslist'] = 'فهرست مجموعه پالایه‌ها'; $labels['filterstitle'] = 'ویرایش پالایه‌های پست ورودی'; $labels['vacationtitle'] = 'ویرایش نقش بیرون از دفتر'; +$labels['duplicate.header'] = 'سربرگ:'; $messages['filterunknownerror'] = 'خطای سرور نامعلوم.'; $messages['filterconnerror'] = 'ناتوانی در اتصال به سرور.'; $messages['filterdeleteerror'] = 'ناتوانی در حذف پالایه. خطای سرور رخ داد.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/fi_FI.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/fi_FI.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/fi_FI.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/fi_FI.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Uusi suodatin'; $labels['filteradd'] = 'Lisää suodatin'; $labels['filterdel'] = 'Poista suodatin'; +$labels['scope'] = 'Rajaus'; $labels['moveup'] = 'Siirrä ylös'; $labels['movedown'] = 'Siirrä alas'; $labels['filterallof'] = 'Täsmää kaikkiin seuraaviin sääntöihin'; @@ -67,7 +68,6 @@ $labels['filterset'] = 'Suodattimien asetus'; $labels['filtersets'] = 'Suodattimen asetus'; $labels['filtersetadd'] = 'Lisää suodatinasetus'; -$labels['filtersetdel'] = 'Poista nykyiset suodatinasetukset'; $labels['filtersetact'] = 'Aktivoi nykyinen suodattimien asetus'; $labels['filtersetdeact'] = 'Poista käytöstä nykyinen suodattimien asetus'; $labels['filterseteditraw'] = 'Muokkaa suodatinasetusta'; @@ -182,6 +182,11 @@ $labels['vacation.discard'] = 'Hylkää'; $labels['vacation.redirect'] = 'Ohjaa uudelleen osoitteeseen'; $labels['vacation.copy'] = 'Lähetä kopio osoitteeseen'; +$labels['forward.redirect'] = 'Ohjaa uudelleen osoitteeseen'; +$labels['forward.copy'] = 'Lähetä kopio osoitteeseen'; +$labels['forward.on'] = 'Päällä'; +$labels['forward.off'] = 'Pois'; +$labels['forward.saving'] = 'Tallennetaan tietoja...'; $labels['filladdresses'] = 'Lisää kaikki osoitteeni'; $labels['arialabelfiltersetactions'] = 'Suodatinasetuksen toiminnot'; $labels['ariasummaryfilterslist'] = 'Suodatinlista'; @@ -191,6 +196,7 @@ $labels['message'] = 'Viesti'; $labels['duplicate'] = 'on kopio'; $labels['notduplicate'] = 'ei ole kopio'; +$labels['duplicate.header'] = 'otsikko:'; $labels['duplicate.seconds'] = 'aikakatkaisu (sekuntia):'; $messages['filterunknownerror'] = 'Tuntematon palvelinvirhe.'; $messages['filterconnerror'] = 'Yhteys palvelimeen epäonnistui.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/fo_FO.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/fo_FO.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/fo_FO.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/fo_FO.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Nýtt filtur'; $labels['filteradd'] = 'Nýtt filtur'; $labels['filterdel'] = 'Strika filtur'; +$labels['scope'] = 'Leita frá'; $labels['moveup'] = 'Flyt upp'; $labels['movedown'] = 'Flyt niður'; $labels['filterallof'] = 'samsvarar allar fylgjandi reglur'; @@ -54,6 +55,7 @@ $labels['del'] = 'Strika'; $labels['sender'] = 'Avsendari'; $labels['recipient'] = 'Móttakari'; +$labels['vacationaddr'] = 'Mínir teldupost bústaðir:'; $labels['vacationdays'] = 'Hvussu ofta skal sendast (í døgum):'; $labels['vacationinterval'] = 'Hvussu ofta skulu boðini sendast:'; $labels['vacationreason'] = 'Boð innihald (feriu orsøk):'; @@ -66,7 +68,6 @@ $labels['filterset'] = 'Sílu set'; $labels['filtersets'] = 'Sílu sett'; $labels['filtersetadd'] = 'Stovna sílu sett'; -$labels['filtersetdel'] = 'Strika verandi sílu sett'; $labels['filtersetact'] = 'Tendra verandi sílu sett'; $labels['filtersetdeact'] = 'Sløkk verandi sílu sett'; $labels['filterdef'] = 'Sílu avmarking '; @@ -171,6 +172,7 @@ $labels['vacation.status'] = 'Støða'; $labels['vacation.on'] = 'Tendra'; $labels['vacation.off'] = 'Sløkt'; +$labels['vacation.addresses'] = 'Mín teldupost bústaður'; $labels['vacation.interval'] = 'Svar millumbil'; $labels['vacation.after'] = 'Tendra feriu reglar eftir'; $labels['vacation.saving'] = 'Goymur dáta...'; @@ -179,6 +181,11 @@ $labels['vacation.discard'] = 'Strika'; $labels['vacation.redirect'] = 'Leið ti'; $labels['vacation.copy'] = 'Send avrit ti'; +$labels['forward.redirect'] = 'Leið ti'; +$labels['forward.copy'] = 'Send avrit ti'; +$labels['forward.on'] = 'Tendra'; +$labels['forward.off'] = 'Sløkt'; +$labels['forward.saving'] = 'Goymur dáta...'; $labels['filladdresses'] = 'Fyll við øllum mínum bústaðum'; $labels['arialabelfiltersetactions'] = 'Sílu sett gerðir'; $labels['arialabelfilteractions'] = 'Sílu gerðir'; @@ -187,6 +194,7 @@ $labels['ariasummaryfiltersetslist'] = 'Skrá av sílu sett'; $labels['filterstitle'] = 'Broyt mótakandi sílur fyri móttiknan post'; $labels['vacationtitle'] = 'Broyt out-of-office regul'; +$labels['duplicate.header'] = 'Teksthøvd '; $messages['filterunknownerror'] = 'Ókendur ambætara feilur'; $messages['filterconnerror'] = 'Einki samband við ambætara.'; $messages['filterdeleteerror'] = 'Tað bar ikki til at strika sílu. Ambætara feilur kom fyri'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/fr_FR.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/fr_FR.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/fr_FR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/fr_FR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Nouveau filtre'; $labels['filteradd'] = 'Ajouter un filtre'; $labels['filterdel'] = 'Supprimer le filtre'; +$labels['rules'] = 'Règles'; +$labels['actions'] = 'Actions'; +$labels['scope'] = 'Portée'; $labels['moveup'] = 'Monter'; $labels['movedown'] = 'Descendre'; $labels['filterallof'] = 'correspondant à toutes les règles suivantes'; @@ -38,6 +41,14 @@ $labels['filternotregex'] = 'ne correspond pas à l\'expression rationnelle'; $labels['filterunder'] = 'plus petit que'; $labels['filterover'] = 'plus grand que'; +$labels['mime'] = 'MIME :'; +$labels['mimepart'] = 'Partie MIME :'; +$labels['mime-message'] = 'message'; +$labels['mime-anychild'] = 'tout'; +$labels['mime-type'] = 'type'; +$labels['mime-subtype'] = 'sous-type'; +$labels['mime-contenttype'] = 'type de contenu'; +$labels['mime-param'] = 'paramètre'; $labels['addrule'] = 'Ajouter une règle'; $labels['delrule'] = 'Supprimer une règle'; $labels['messagemoveto'] = 'Déplacer le courriel vers'; @@ -67,10 +78,11 @@ $labels['filterset'] = 'Jeu de filtres'; $labels['filtersets'] = 'Jeux de filtres'; $labels['filtersetadd'] = 'Ajouter un jeu de filtres'; -$labels['filtersetdel'] = 'Supprimer le jeu de filtres actuel'; +$labels['filtersetdel'] = 'Supprimer le jeu de filtres'; $labels['filtersetact'] = 'Activer le jeu de filtres actuel'; $labels['filtersetdeact'] = 'Désactiver le jeu de filtres actuel'; $labels['filterseteditraw'] = 'Modifier le jeu de filtres'; +$labels['filtersetswitch'] = 'Activer, désactiver un jeu de filtres'; $labels['filterdef'] = 'Définition du filtre'; $labels['filtersetname'] = 'Nom du jeu de filtres'; $labels['newfilterset'] = 'Nouveau jeu de filtres'; @@ -183,6 +195,14 @@ $labels['vacation.discard'] = 'Rejeter'; $labels['vacation.redirect'] = 'Réacheminer à'; $labels['vacation.copy'] = 'Envoyer une copie à'; +$labels['forward'] = 'Transfert'; +$labels['forward.redirect'] = 'Réacheminer à'; +$labels['forward.copy'] = 'Envoyer une copie à'; +$labels['forward.on'] = 'Marche'; +$labels['forward.off'] = 'Arrêt'; +$labels['forward.status'] = 'État :'; +$labels['forward.action'] = 'Pour les courriels entrants, exécuter l’action suivante :'; +$labels['forward.saving'] = 'Enregistrement des données...'; $labels['filladdresses'] = 'Remplir avec toutes mes adresses'; $labels['arialabelfiltersetactions'] = 'Actions des jeux de filtrage'; $labels['arialabelfilteractions'] = 'Actions de filtrage'; @@ -191,6 +211,7 @@ $labels['ariasummaryfiltersetslist'] = 'Liste des jeux de filtrage'; $labels['filterstitle'] = 'Modifier les filtres de courriels entrants'; $labels['vacationtitle'] = 'Modifier la règle d\'absence du bureau'; +$labels['forwardtitle'] = 'Modifier la règle de transfert des courriels'; $labels['message'] = 'Message'; $labels['duplicate'] = 'est un doublon'; $labels['notduplicate'] = 'n\'est pas un doublon'; @@ -235,6 +256,8 @@ $messages['invaliddateformat'] = 'Format de date ou d\'une partie de la date invalide'; $messages['saveerror'] = 'Impossible d\'enregistrer les données. Une erreur du serveur est survenue.'; $messages['vacationsaved'] = 'Les données de vacances ont été enregistrées avec succès.'; +$messages['forwardsaved'] = 'Les données de transfert ont été enregistrées avec succès.'; $messages['emptyvacationbody'] = 'Le corps du courriel de vacances est exigé !'; $messages['duplicate.conflict.err'] = 'L\'en-tête et l\'identifiant unique ne sont pas permis.'; +$messages['disabledaction'] = 'L\'action n\'est pas permise.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/fy_NL.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/fy_NL.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/fy_NL.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/fy_NL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,11 +15,18 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ */ +$labels['scope'] = 'Berik'; $labels['messagedelete'] = 'Berjocht fuortsmite'; +$labels['add'] = 'Tafoegje'; $labels['del'] = 'Fuortsmite'; +$labels['sender'] = 'Stjoerder'; $labels['none'] = 'gjin'; +$labels['flagread'] = 'Lêze'; +$labels['flagdeleted'] = 'Ferwidere'; +$labels['flagflagged'] = 'Flagge'; $labels['notifyimportance'] = 'Prioriteit:'; $labels['notifymethodmailto'] = 'E-mail'; +$labels['notifymethodtel'] = 'Telefoannûmer'; $labels['notifymethodsms'] = 'SMS'; $labels['...'] = '...'; $labels['datetest'] = 'Date'; @@ -33,9 +40,14 @@ $labels['iso8601'] = 'datum (ISO8601)'; $labels['std11'] = 'datum (RFC2822)'; $labels['zone'] = 'tiidsône'; +$labels['advancedopts'] = 'Avansearre opsjes'; +$labels['body'] = 'Ynhâld'; $labels['text'] = 'tekst'; $labels['modtype'] = 'type:'; $labels['domain'] = 'domein'; $labels['user'] = 'brûker'; +$labels['vacation.subject'] = 'Ûnderwerp'; +$labels['vacation.body'] = 'Ynhâld'; $labels['vacation.status'] = 'Status'; +$labels['vacation.keep'] = 'Hâlde'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ga_IE.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ga_IE.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ga_IE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ga_IE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Scagaire nua'; $labels['filteradd'] = 'Cuir scagaire leis'; $labels['filterdel'] = 'Scrios an scagaire'; +$labels['scope'] = 'Cuimse'; $labels['moveup'] = 'Bog suas'; $labels['movedown'] = 'Bog síos'; $labels['filterany'] = 'gach teachtaireacht'; @@ -133,11 +134,16 @@ $labels['vacation.discard'] = 'Cuileáil'; $labels['vacation.redirect'] = 'Atreoraigh chuig'; $labels['vacation.copy'] = 'Seol macasamhail chuig'; +$labels['forward.redirect'] = 'Atreoraigh chuig'; +$labels['forward.copy'] = 'Seol macasamhail chuig'; +$labels['forward.on'] = 'Ar siúl'; +$labels['forward.off'] = 'As'; $labels['filladdresses'] = 'Líon le mo sheoltaí uile'; $labels['arialabelfilteractions'] = 'Gníomhartha an scagaire'; $labels['arialabelfilterform'] = 'Airíonna an fhillteáin'; $labels['ariasummaryfilterslist'] = 'Liosta de na fillteáin'; $labels['message'] = 'Teachtaireacht'; +$labels['duplicate.header'] = 'ceanntásc:'; $labels['duplicate.uniqueid'] = 'aitheantóir:'; $messages['filterdeleted'] = 'Scriosadh an fillteán go ráthúil.'; $messages['filterdeleteconfirm'] = 'An bhfuil tú cinnte gur mian leat an scagaire roghnaithe a scriosadh?'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/gl_ES.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/gl_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/gl_ES.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/gl_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Novo filtro'; $labels['filteradd'] = 'Engadir filtro'; $labels['filterdel'] = 'Eliminar filtro'; +$labels['scope'] = 'Alcance'; $labels['moveup'] = 'Mover arriba'; $labels['movedown'] = 'Mover abaixo'; $labels['filterallof'] = 'coincidir con todas as regras seguintes'; @@ -65,7 +66,6 @@ $labels['filterset'] = 'Conxunto de filtros'; $labels['filtersets'] = 'Conxunto de filtros'; $labels['filtersetadd'] = 'Engadir un conxunto de filtros'; -$labels['filtersetdel'] = 'Eliminar o conxunto de filtros actual'; $labels['filtersetact'] = 'Activar o conxunto de filtros actual'; $labels['filtersetdeact'] = 'Desactivar o conxunto de filtros actual'; $labels['filterdef'] = 'Definición de filtros'; @@ -167,9 +167,15 @@ $labels['vacation.discard'] = 'Descartar'; $labels['vacation.redirect'] = 'Redirixir a'; $labels['vacation.copy'] = 'Enviar copia a'; +$labels['forward.redirect'] = 'Redirixir a'; +$labels['forward.copy'] = 'Enviar copia a'; +$labels['forward.on'] = 'Activar'; +$labels['forward.off'] = 'Desactivar'; +$labels['forward.saving'] = 'Gardando datos...'; $labels['arialabelfilteractions'] = 'Accións de filtrado'; $labels['arialabelfilterform'] = 'Propiedades dos filtros'; $labels['ariasummaryfilterslist'] = 'Lista de filtros'; +$labels['duplicate.header'] = 'cabeceira:'; $messages['filterunknownerror'] = 'Erro descoñecido do servidor'; $messages['filterconnerror'] = 'Imposíbel conectar co servidor.'; $messages['filterdeleteerror'] = 'Non se pode eliminar filtro. Produciuse un erro de servidor.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/he_IL.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/he_IL.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/he_IL.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/he_IL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'מסנן חדש'; $labels['filteradd'] = 'הוספת מסנן'; $labels['filterdel'] = 'מחיקת מסנן'; +$labels['scope'] = 'היקף'; $labels['moveup'] = 'הזזה מעלה'; $labels['movedown'] = 'הזזה מטה'; $labels['filterallof'] = 'תאימות לכל הכללים שלהלן'; @@ -67,7 +68,6 @@ $labels['filterset'] = 'קבוצת מסננים'; $labels['filtersets'] = 'קבוצות מסננים'; $labels['filtersetadd'] = 'הוספה של קבוצת מסננים'; -$labels['filtersetdel'] = 'מחיקה של מסננים נוכחיים'; $labels['filtersetact'] = 'הפעלה של מסננים נוכחיים'; $labels['filtersetdeact'] = 'השבתה של מסננים נוכחיים'; $labels['filterseteditraw'] = 'עריכת סינון'; @@ -183,6 +183,11 @@ $labels['vacation.discard'] = 'להפטר'; $labels['vacation.redirect'] = 'הפניה אל'; $labels['vacation.copy'] = 'שליחת העתק אל'; +$labels['forward.redirect'] = 'הפניה אל'; +$labels['forward.copy'] = 'שליחת העתק אל'; +$labels['forward.on'] = 'מופעל'; +$labels['forward.off'] = 'כבוי'; +$labels['forward.saving'] = 'שמירת מידע...'; $labels['filladdresses'] = 'שימוש בכל כתובת הדוא"ל שלי'; $labels['arialabelfiltersetactions'] = 'פעולות על קבוצה של חוקי סינון'; $labels['arialabelfilteractions'] = 'פעולות מסנן'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/hi_IN.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/hi_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/hi_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/hi_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,23 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Managesieve plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ +*/ +$labels['messagedelete'] = 'रद्द करें'; +$labels['del'] = 'मिटा'; +$labels['notifymethodmailto'] = 'मेल'; +$labels['datetest'] = 'तारीख'; +$labels['vacation.subject'] = 'विशय'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/hr_HR.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/hr_HR.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/hr_HR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/hr_HR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -65,7 +65,6 @@ $labels['filterset'] = 'Grupa filtera'; $labels['filtersets'] = 'Filteri'; $labels['filtersetadd'] = 'Dodaj grupu filtera'; -$labels['filtersetdel'] = 'Obriši odabranu grupu filtera'; $labels['filtersetact'] = 'Aktiviraj odabranu grupu filtera'; $labels['filtersetdeact'] = 'Deaktiviraj odabranu grupu filtera'; $labels['filterdef'] = 'Definicije filtera'; @@ -111,6 +110,8 @@ $labels['notifyimportancelow'] = 'niska'; $labels['notifyimportancenormal'] = 'normalna'; $labels['notifyimportancehigh'] = 'visoka'; +$labels['notifymethodmailto'] = 'E-mail'; +$labels['notifymethodtel'] = 'Telefon'; $labels['filtercreate'] = 'Stvori filter'; $labels['usedata'] = 'Koristi podatke za filter:'; $labels['nextstep'] = 'Idući korak'; @@ -157,6 +158,9 @@ $labels['vacation.body'] = 'Tijelo poruke'; $labels['vacation.status'] = 'Status'; $labels['vacation.saving'] = 'Spremanje podataka...'; +$labels['vacation.keep'] = 'Zadrži'; +$labels['forward.saving'] = 'Spremanje podataka...'; +$labels['duplicate.header'] = 'zaglavlje:'; $messages['filterunknownerror'] = 'Nepoznata greška na poslužitelju'; $messages['filterconnerror'] = 'Nemoguće spajanje na poslužitelj (managesieve)'; $messages['filterdeleteerror'] = 'Nemoguće brisanje filtera. Greška na poslužitelju.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/hu_HU.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/hu_HU.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/hu_HU.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/hu_HU.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Új szűrő'; $labels['filteradd'] = 'Szűrő hozzáadása'; $labels['filterdel'] = 'Szűrő törlése'; +$labels['rules'] = 'Szabályok'; +$labels['actions'] = 'Műveletek'; +$labels['scope'] = 'Hatókör'; $labels['moveup'] = 'Mozgatás felfelé'; $labels['movedown'] = 'Mozgatás lefelé'; $labels['filterallof'] = 'A következők szabályok mind illeszkedjenek'; @@ -67,10 +70,11 @@ $labels['filterset'] = 'Szűrök készlet'; $labels['filtersets'] = 'Szűrő készletek'; $labels['filtersetadd'] = 'Szűrő hozzáadása a készlethez'; -$labels['filtersetdel'] = 'Az aktuális szűrő készlet törlése'; +$labels['filtersetdel'] = 'Szűrőkészlet törlése'; $labels['filtersetact'] = 'Az aktuális szűrő készlet engedélyezése'; $labels['filtersetdeact'] = 'Az aktuális szűrő készlet tiltása'; $labels['filterseteditraw'] = 'Szűrőkészlet beállítás'; +$labels['filtersetswitch'] = 'Engedélyezni/letíltani a szűrőkészletet'; $labels['filterdef'] = 'Szűrő definíció'; $labels['filtersetname'] = 'Szűrő készlet neve'; $labels['newfilterset'] = 'Új szűrő készlet'; @@ -183,6 +187,11 @@ $labels['vacation.discard'] = 'Érvénytelenít'; $labels['vacation.redirect'] = 'Átírányítás ide'; $labels['vacation.copy'] = 'Másolat kűldése ide'; +$labels['forward.redirect'] = 'Átírányítás ide'; +$labels['forward.copy'] = 'Másolat kűldése ide'; +$labels['forward.on'] = 'Be'; +$labels['forward.off'] = 'Ki'; +$labels['forward.saving'] = 'Adatok mentése...'; $labels['filladdresses'] = 'Töltsd ki mindent a címeimmel'; $labels['arialabelfiltersetactions'] = 'Szűrő készlet müveletek'; $labels['arialabelfilteractions'] = 'Szűrő müveletek'; @@ -237,4 +246,5 @@ $messages['vacationsaved'] = 'Vakáció adatai sikeresen elmentve.'; $messages['emptyvacationbody'] = 'A vakácíó üzenet szövegtörzse kötelező!'; $messages['duplicate.conflict.err'] = 'Egyszerre fejléc és egyedi azonosító nem engedélyezett.'; +$messages['disabledaction'] = 'A művelet nem megengedett.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/hy_AM.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/hy_AM.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/hy_AM.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/hy_AM.inc 2018-04-11 11:14:33.000000000 +0000 @@ -61,7 +61,6 @@ $labels['filterset'] = 'Զտիչների համալիր'; $labels['filtersets'] = 'Զտիչների համալիրներ'; $labels['filtersetadd'] = 'Ավելացնել զտիչների համալիր'; -$labels['filtersetdel'] = 'Ջնջել առկա զտիչների համալիրը'; $labels['filtersetact'] = 'Միացնել առկա զտիչների համալիրը'; $labels['filtersetdeact'] = 'Անջատել առկա զտիչների համալիրը'; $labels['filterdef'] = 'Զտիչի սահմանում'; @@ -90,10 +89,13 @@ $labels['flaganswered'] = 'Պատասխանված'; $labels['flagflagged'] = 'Նշված'; $labels['flagdraft'] = 'Սևագիր'; +$labels['notifymethodmailto'] = 'Էկ–փոստ'; +$labels['notifymethodtel'] = 'Հեռախոս'; $labels['filtercreate'] = 'Ստեղծել զտիչ'; $labels['usedata'] = 'Զտիչում օգտագործել հետևյալ տեղեկությունը.'; $labels['nextstep'] = 'Հաջորդ քայլ'; $labels['...'] = '…'; +$labels['datetest'] = 'Ամսաթիվ'; $labels['advancedopts'] = 'Հավելյալ ընտրանքներ'; $labels['body'] = 'Մարմին'; $labels['address'] = 'հասցե'; @@ -113,6 +115,9 @@ $labels['octet'] = 'անփոփոխ (օկտետ)'; $labels['asciicasemap'] = 'case insensitive (ascii-casemap)'; $labels['asciinumeric'] = 'numeric (ascii-numeric)'; +$labels['vacation.subject'] = 'Վերնագիր'; +$labels['vacation.body'] = 'Մարմին'; +$labels['vacation.keep'] = 'Պահել'; $messages['filterunknownerror'] = 'Սերվերի անհայտ սխալ'; $messages['filterconnerror'] = 'Սերվերի հետ կապի խնդիր։'; $messages['filterdeleted'] = 'Զտիչը ջնջվեց։'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ia.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ia.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ia.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ia.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,10 +21,11 @@ $labels['newfilter'] = 'Nove filtro'; $labels['filteradd'] = 'Adder filtro'; $labels['filterdel'] = 'Deler filtro'; +$labels['scope'] = 'Ambito'; $labels['moveup'] = 'Displaciar in alto'; $labels['movedown'] = 'Displaciar a basso'; $labels['filterallof'] = 'que satisface tote le sequente regulas'; -$labels['filteranyof'] = 'que satisface un del sequente regulas'; +$labels['filteranyof'] = 'que satisface qualcunque del sequente regulas'; $labels['filterany'] = 'tote le messages'; $labels['filtercontains'] = 'contine'; $labels['filternotcontains'] = 'non contine'; @@ -58,6 +59,7 @@ $labels['vacationdays'] = 'Frequentia de invio de messages (in dies):'; $labels['vacationinterval'] = 'Frequentia de invio de messages:'; $labels['vacationreason'] = 'Texto del message (motivo del absentia):'; +$labels['vacationfrom'] = 'Adresse del expeditor pro responder:'; $labels['vacationsubject'] = 'Subjecto del message:'; $labels['days'] = 'dies'; $labels['seconds'] = 'secundas'; @@ -66,7 +68,6 @@ $labels['filterset'] = 'Gruppo de filtros'; $labels['filtersets'] = 'Gruppos de filtros'; $labels['filtersetadd'] = 'Adder gruppo de filtros'; -$labels['filtersetdel'] = 'Deler le gruppo de filtros actual'; $labels['filtersetact'] = 'Activar le gruppo de filtros actual'; $labels['filtersetdeact'] = 'Disactivar le gruppo de filtros actual'; $labels['filterseteditraw'] = 'Modificar gruppo de filtros'; @@ -124,6 +125,7 @@ $labels['usedata'] = 'Usar le sequente datos in le filtro:'; $labels['nextstep'] = 'Proxime passo'; $labels['...'] = '...'; +$labels['string'] = 'Catena'; $labels['currdate'] = 'Data actual'; $labels['datetest'] = 'Data'; $labels['dateheader'] = 'capite:'; @@ -164,6 +166,7 @@ $labels['vacation'] = 'Vacantias'; $labels['vacation.reply'] = 'Message de responsa'; $labels['vacation.advanced'] = 'Configuration avantiate'; +$labels['vacation.from'] = 'Adresse del expeditor pro responder'; $labels['vacation.subject'] = 'Subjecto'; $labels['vacation.body'] = 'Texto'; $labels['vacation.start'] = 'Initio del vacantias'; @@ -180,6 +183,11 @@ $labels['vacation.discard'] = 'Abandonar'; $labels['vacation.redirect'] = 'Rediriger a'; $labels['vacation.copy'] = 'Inviar copia a'; +$labels['forward.redirect'] = 'Rediriger a'; +$labels['forward.copy'] = 'Inviar copia a'; +$labels['forward.on'] = 'Active'; +$labels['forward.off'] = 'Non active'; +$labels['forward.saving'] = 'Salveguarda datos...'; $labels['filladdresses'] = 'Plenar con tote mi adresses'; $labels['arialabelfiltersetactions'] = 'Actiones de gruppo de filtros'; $labels['arialabelfilteractions'] = 'Actiones de filtro'; @@ -191,7 +199,11 @@ $labels['message'] = 'Message'; $labels['duplicate'] = 'es duplicate'; $labels['notduplicate'] = 'non es duplicate'; +$labels['duplicate.handle'] = 'pseudonymo:'; +$labels['duplicate.header'] = 'capite:'; $labels['duplicate.uniqueid'] = 'identificator:'; +$labels['duplicate.seconds'] = 'expiration (secundas):'; +$labels['duplicate.last'] = 'relative al ultime execution'; $messages['filterunknownerror'] = 'Error de servitor incognite.'; $messages['filterconnerror'] = 'Impossibile connecter al servitor.'; $messages['filterdeleteerror'] = 'Impossibile deler le filtro. Un error de servitor ha occurrite.'; @@ -211,6 +223,7 @@ $messages['setactivated'] = 'Le gruppo de filtros ha essite activate.'; $messages['setdeactivated'] = 'Le gruppo de filtros ha essite disactivate.'; $messages['setdeleted'] = 'Le gruppo de filtros ha essite delite.'; +$messages['setupdated'] = 'Le insimul de filtros ha essite actualisate.'; $messages['setdeleteconfirm'] = 'Es vos secur de voler deler le gruppo de filtros seligite?'; $messages['setcreateerror'] = 'Impossibile crear le gruppo de filtros. Un error de servitor ha occurrite.'; $messages['setcreated'] = 'Le gruppo de filtros ha essite create.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/id_ID.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/id_ID.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/id_ID.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/id_ID.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Filter baru'; $labels['filteradd'] = 'Tambah filter'; $labels['filterdel'] = 'Hapus filter'; +$labels['rules'] = 'Peraturan'; +$labels['actions'] = 'Tindakan'; +$labels['scope'] = 'Jangkauan'; $labels['moveup'] = 'Pindah ke atas'; $labels['movedown'] = 'Pindah ke bawah'; $labels['filterallof'] = 'cocok dengan semua aturan berikut ini'; @@ -38,6 +41,14 @@ $labels['filternotregex'] = 'tidak cocok dengan ekspresi reguler'; $labels['filterunder'] = 'di bawah'; $labels['filterover'] = 'di atas'; +$labels['mime'] = 'MIME'; +$labels['mimepart'] = 'MIME part:'; +$labels['mime-message'] = 'Pesan'; +$labels['mime-anychild'] = 'Apapun'; +$labels['mime-type'] = 'Tipe'; +$labels['mime-subtype'] = 'Sub tipe'; +$labels['mime-contenttype'] = 'Konten tipe'; +$labels['mime-param'] = 'Parameter'; $labels['addrule'] = 'Tambah aturan'; $labels['delrule'] = 'Hapus aturan'; $labels['messagemoveto'] = 'Pindah pesan ke'; @@ -67,10 +78,11 @@ $labels['filterset'] = 'Himpunan filter'; $labels['filtersets'] = 'Himpunan banyak filter'; $labels['filtersetadd'] = 'Tambahkan himpunan filter'; -$labels['filtersetdel'] = 'Hapus himpunan filter yang sekarang'; +$labels['filtersetdel'] = 'Hapus set filter'; $labels['filtersetact'] = 'Aktifkan himpunan filter ayng sekarang'; $labels['filtersetdeact'] = 'Matikan himpunan filter ayng sekarang'; $labels['filterseteditraw'] = 'Sunting set penyaring'; +$labels['filtersetswitch'] = 'Hidupkan / matikan set filter'; $labels['filterdef'] = 'Definisi filter'; $labels['filtersetname'] = 'Nama himpunan filter'; $labels['newfilterset'] = 'Himpunan filter baru'; @@ -183,6 +195,14 @@ $labels['vacation.discard'] = 'Buang'; $labels['vacation.redirect'] = 'Alihkan ke'; $labels['vacation.copy'] = 'Kirim salinan ke'; +$labels['forward'] = 'Diteruskan / Meneruskan'; +$labels['forward.redirect'] = 'Alihkan ke'; +$labels['forward.copy'] = 'Kirim salinan ke'; +$labels['forward.on'] = 'Nyala'; +$labels['forward.off'] = 'Mati'; +$labels['forward.status'] = 'Status:'; +$labels['forward.action'] = 'Tindakan untuk eksekusi masuknya surat'; +$labels['forward.saving'] = 'Menyimpan data...'; $labels['filladdresses'] = 'Isi dengan semua alamat saya'; $labels['arialabelfiltersetactions'] = 'Tindakan untuk penyaringan'; $labels['arialabelfilteractions'] = 'Tindakan penyaringan'; @@ -191,6 +211,7 @@ $labels['ariasummaryfiltersetslist'] = 'Daftar penyaringan yang telah di set'; $labels['filterstitle'] = 'Ubah penyaringan untuk email masuk'; $labels['vacationtitle'] = 'Ubah aturan untuk sedang-diluar-kantor'; +$labels['forwardtitle'] = 'Edit peraturan untuk meneruskan surat'; $labels['message'] = 'Pesan'; $labels['duplicate'] = 'duplikat'; $labels['notduplicate'] = 'tidak duplikat'; @@ -235,6 +256,8 @@ $messages['invaliddateformat'] = 'Format tanggal atau bagian dari tanggal salah'; $messages['saveerror'] = 'Tidak dapat menyimpan data. Terjadi kesalahan pada server.'; $messages['vacationsaved'] = 'Data untuk cuti berhasil disimpan.'; +$messages['forwardsaved'] = 'Meneruskan data sukses tersimpan'; $messages['emptyvacationbody'] = 'Tubuh pesan liburan diperlukan!'; $messages['duplicate.conflict.err'] = 'Header dan identifier unik keduanya tidak diijinkan.'; +$messages['disabledaction'] = 'Tindakan tidak di izinkan'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/is_IS.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/is_IS.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/is_IS.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/is_IS.inc 2018-04-11 11:14:33.000000000 +0000 @@ -17,9 +17,11 @@ */ $labels['filters'] = 'Síur'; $labels['filtername'] = 'Heiti síu'; +$labels['scope'] = 'Umfang'; $labels['moveup'] = 'Færa upp'; $labels['movedown'] = 'Færa niður'; $labels['filterany'] = 'öll skeyti'; +$labels['messagedelete'] = 'Eyða skeyti'; $labels['add'] = 'Bæta við'; $labels['del'] = 'Eyða'; $labels['sender'] = 'Sendandi'; @@ -29,6 +31,7 @@ $labels['seconds'] = 'sekúndur'; $labels['flagread'] = 'Lesið'; $labels['flagdeleted'] = 'Eytt'; +$labels['flagflagged'] = 'Flaggað'; $labels['flagdraft'] = 'Drög'; $labels['notifymethodmailto'] = 'Tölvupóstfang'; $labels['notifymethodtel'] = 'Sími'; @@ -75,6 +78,11 @@ $labels['vacation.discard'] = 'Henda'; $labels['vacation.redirect'] = 'Endurbeina til'; $labels['vacation.copy'] = 'Senda afrit á'; +$labels['forward.redirect'] = 'Endurbeina til'; +$labels['forward.copy'] = 'Senda afrit á'; +$labels['forward.on'] = 'Kveikt'; +$labels['forward.off'] = 'Slökkt'; +$labels['forward.saving'] = 'Vista gögn...'; $labels['message'] = 'Skilaboð'; $messages['namereserved'] = 'Nafn er frátekið.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/it_IT.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/it_IT.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/it_IT.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/it_IT.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Nuovo filtro'; $labels['filteradd'] = 'Aggiungi filtro'; $labels['filterdel'] = 'Elimina filtro'; +$labels['scope'] = 'Contesto'; $labels['moveup'] = 'Sposta sopra'; $labels['movedown'] = 'Sposta sotto'; $labels['filterallof'] = 'che soddisfa tutte le regole seguenti'; @@ -67,7 +68,6 @@ $labels['filterset'] = 'Gruppi di filtri'; $labels['filtersets'] = 'gruppo di filtri'; $labels['filtersetadd'] = 'Aggiungi gruppo'; -$labels['filtersetdel'] = 'Cancella gruppo selezionato'; $labels['filtersetact'] = 'Attiva gruppo selezionato'; $labels['filtersetdeact'] = 'Disattiva gruppo selezionato'; $labels['filterseteditraw'] = 'Modifica set di filtri'; @@ -183,6 +183,11 @@ $labels['vacation.discard'] = 'Elimina'; $labels['vacation.redirect'] = 'Ridireziona a'; $labels['vacation.copy'] = 'Invia copia a'; +$labels['forward.redirect'] = 'Ridireziona a'; +$labels['forward.copy'] = 'Invia copia a'; +$labels['forward.on'] = 'Attivato'; +$labels['forward.off'] = 'Disattivato'; +$labels['forward.saving'] = 'Salvataggio...'; $labels['filladdresses'] = 'Riempire con tutti i miei indirizzi'; $labels['arialabelfiltersetactions'] = 'Azione settaggio dei filtri '; $labels['arialabelfilteractions'] = 'Azione Filtri'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ja_JP.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ja_JP.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ja_JP.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ja_JP.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,10 +21,13 @@ $labels['newfilter'] = '新しいフィルター'; $labels['filteradd'] = 'フィルターを追加'; $labels['filterdel'] = 'フィルターを削除'; +$labels['rules'] = '規則'; +$labels['actions'] = '操作'; +$labels['scope'] = 'スコープ'; $labels['moveup'] = '上に移動'; $labels['movedown'] = '下に移動'; -$labels['filterallof'] = '次のルールのすべてに一致'; -$labels['filteranyof'] = '次のルールのいずれかに一致'; +$labels['filterallof'] = '次の規則のすべてに一致'; +$labels['filteranyof'] = '次の規則のいずれかに一致'; $labels['filterany'] = 'すべてのメッセージ'; $labels['filtercontains'] = '含む'; $labels['filternotcontains'] = '含まない'; @@ -38,8 +41,8 @@ $labels['filternotregex'] = '次の正規表現に一致しない'; $labels['filterunder'] = 'より下'; $labels['filterover'] = 'より上'; -$labels['addrule'] = 'ルールを追加'; -$labels['delrule'] = 'ルールを削除'; +$labels['addrule'] = '規則を追加'; +$labels['delrule'] = '規則を削除'; $labels['messagemoveto'] = '次にメッセージを移動'; $labels['messageredirect'] = '次のメールアドレスに転送'; $labels['messagecopyto'] = '次にメッセージをコピー'; @@ -62,15 +65,16 @@ $labels['vacationsubject'] = 'メッセージの件名:'; $labels['days'] = '日'; $labels['seconds'] = '秒'; -$labels['rulestop'] = 'ルールの評価を停止'; +$labels['rulestop'] = '規則の評価を停止'; $labels['enable'] = '有効/無効'; $labels['filterset'] = 'フィルターセット'; $labels['filtersets'] = 'フィルターセット'; $labels['filtersetadd'] = 'フィルターセットを追加'; -$labels['filtersetdel'] = '現在のフィルターセットを削除'; +$labels['filtersetdel'] = 'フィルターセットを削除'; $labels['filtersetact'] = '現在のフィルター セットを有効'; $labels['filtersetdeact'] = '現在のフィルター セットを無効'; $labels['filterseteditraw'] = 'フィルターセットを編集'; +$labels['filtersetswitch'] = 'フィルターセットを有効化・無効化'; $labels['filterdef'] = 'フィルターの定義'; $labels['filtersetname'] = 'フィルターセットの名前'; $labels['newfilterset'] = '新しいフィルターセット'; @@ -176,13 +180,21 @@ $labels['vacation.off'] = 'オフ'; $labels['vacation.addresses'] = '私の電子メールアドレス'; $labels['vacation.interval'] = '返信の間隔'; -$labels['vacation.after'] = '後に休暇のルールを記入'; +$labels['vacation.after'] = '後に休暇の規則を記入'; $labels['vacation.saving'] = 'データを保存中...'; $labels['vacation.action'] = '届いたメッセージの操作'; $labels['vacation.keep'] = '保持'; $labels['vacation.discard'] = '破棄'; $labels['vacation.redirect'] = '次のメールアドレスに転送'; $labels['vacation.copy'] = '次にメッセージを送信'; +$labels['forward'] = '転送'; +$labels['forward.redirect'] = '次のメールアドレスに転送'; +$labels['forward.copy'] = '次にメッセージを送信'; +$labels['forward.on'] = 'オン'; +$labels['forward.off'] = 'オフ'; +$labels['forward.status'] = '状態:'; +$labels['forward.action'] = '到着したメールに以下の操作を実行:'; +$labels['forward.saving'] = 'データを保存中...'; $labels['filladdresses'] = 'すべてのアドレスで満たす'; $labels['arialabelfiltersetactions'] = 'フィルターセットの動作'; $labels['arialabelfilteractions'] = 'フィルターの動作'; @@ -190,7 +202,8 @@ $labels['ariasummaryfilterslist'] = 'フィルターの一覧'; $labels['ariasummaryfiltersetslist'] = 'フィルターセットの一覧'; $labels['filterstitle'] = '届いたメールのフィルターを編集'; -$labels['vacationtitle'] = '勤務時間外のルールを編集'; +$labels['vacationtitle'] = '勤務時間外の規則を編集'; +$labels['forwardtitle'] = 'メールの転送の規則を編集'; $labels['message'] = 'メッセージ'; $labels['duplicate'] = 'は重複'; $labels['notduplicate'] = 'は非重複'; @@ -207,8 +220,8 @@ $messages['filtersaveerror'] = 'フィルターの保存できません。サーバーでエラーが発生しました。'; $messages['filterformerror'] = 'フィルターのフォームにエラーがあります。'; $messages['filterdeleteconfirm'] = '本当に選択したフィルターを削除しますか?'; -$messages['ruledeleteconfirm'] = '本当に選択したルールを削除しますか?'; -$messages['actiondeleteconfirm'] = '本当に選択した操作を削除しますか?'; +$messages['ruledeleteconfirm'] = '本当に選択した規則を削除しますか?'; +$messages['actiondeleteconfirm'] = '本当に選択した動作を削除しますか?'; $messages['forbiddenchars'] = '項目に禁止している文字が含まれています。'; $messages['cannotbeempty'] = '項目は空欄にできません。'; $messages['ruleexist'] = '指定した名前のフィルターが既に存在します。'; @@ -235,6 +248,8 @@ $messages['invaliddateformat'] = '無効な日付または日付部分の書式'; $messages['saveerror'] = 'フィルターの保存できません。サーバーでエラーが発生しました。'; $messages['vacationsaved'] = '休暇のデータを保存しました。'; +$messages['forwardsaved'] = '転送のデータを保存しました。'; $messages['emptyvacationbody'] = '休暇のメッセージの本文が必要です!'; $messages['duplicate.conflict.err'] = 'ヘッダーと一意な識別子の両方は同時に使用できません。'; +$messages['disabledaction'] = '許可されていない動作です。'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/kab.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/kab.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/kab.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/kab.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,20 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Managesieve plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ +*/ +$labels['del'] = 'Kkes'; +$labels['flagread'] = 'Ɣeṛ'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ka_GE.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ka_GE.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ka_GE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ka_GE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,8 +15,18 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ */ +$labels['messagedelete'] = 'წაშლა'; +$labels['add'] = 'დამატება'; +$labels['del'] = 'წაშლა'; $labels['sender'] = 'გამგზავნელი'; $labels['flagread'] = 'წაკითხვა'; +$labels['flagdeleted'] = 'წაშლილი'; +$labels['flagflagged'] = 'მონიშნული'; +$labels['notifymethodmailto'] = 'ელ–ფოსტა'; +$labels['notifymethodtel'] = 'ტელეფონი'; +$labels['datetest'] = 'თარიღი'; +$labels['advancedopts'] = 'დამატებითი პარამეტრები'; $labels['body'] = 'შეტყობინების ტექსტი'; +$labels['vacation.subject'] = 'სათაური'; $labels['vacation.body'] = 'შეტყობინების ტექსტი'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/km_KH.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/km_KH.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/km_KH.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/km_KH.inc 2018-04-11 11:14:33.000000000 +0000 @@ -79,6 +79,8 @@ $labels['notifyimportancelow'] = 'ទាប'; $labels['notifyimportancenormal'] = 'ធម្មតា'; $labels['notifyimportancehigh'] = 'ខ្ពស់'; +$labels['notifymethodmailto'] = 'អ៊ីមែល'; +$labels['notifymethodtel'] = 'ទូរស័ព្ទ'; $labels['filtercreate'] = 'បង្កើត​តម្រង'; $labels['usedata'] = 'ប្រើ​ទិន្នន័យ​ទាំង​នេះ​ក្នុង​តម្រង៖'; $labels['nextstep'] = 'ជំហាន​បន្ទាប់'; @@ -113,4 +115,8 @@ $labels['detail'] = 'លម្អិត'; $labels['index'] = 'លិបិក្រម៖'; $labels['indexlast'] = 'បកក្រោយ'; +$labels['vacation.subject'] = 'ចំណងជើង'; +$labels['vacation.body'] = 'តួ'; +$labels['vacation.keep'] = 'រក្សា'; +$labels['duplicate.header'] = 'ក្បាល៖'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/kn_IN.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/kn_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/kn_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/kn_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,24 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Managesieve plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ +*/ +$labels['messagedelete'] = 'ಸಂದೇಶ ಅಳಿಸು'; +$labels['add'] = 'ಸೇರಿಸು'; +$labels['notifymethodmailto'] = 'ಇಮೇಲ್'; +$labels['notifymethodtel'] = 'ದೂರವಾಣಿ'; +$labels['datetest'] = 'ದಿನಾಂಕ '; +$labels['vacation.subject'] = 'ವಿಷಯ'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ko_KR.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ko_KR.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ko_KR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ko_KR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = '새로운 필터'; $labels['filteradd'] = '필터 추가'; $labels['filterdel'] = '필터 삭제'; +$labels['scope'] = '범위'; $labels['moveup'] = '위로 이동'; $labels['movedown'] = '아래로 이동'; $labels['filterallof'] = '다음 모든 규칙과 일치함'; @@ -67,7 +68,6 @@ $labels['filterset'] = '필터 세트'; $labels['filtersets'] = '필터 세트'; $labels['filtersetadd'] = '필터 세트 추가'; -$labels['filtersetdel'] = '현재 필터 세트를 삭제'; $labels['filtersetact'] = '현재 필터 세트 활성화'; $labels['filtersetdeact'] = '현재 필터 세트 비활성화'; $labels['filterseteditraw'] = '필터 세트 편집'; @@ -183,6 +183,11 @@ $labels['vacation.discard'] = '폐기'; $labels['vacation.redirect'] = '재전송'; $labels['vacation.copy'] = '사본을 다음 대상에게 전송'; +$labels['forward.redirect'] = '재전송'; +$labels['forward.copy'] = '사본을 다음 대상에게 전송'; +$labels['forward.on'] = '켬'; +$labels['forward.off'] = '끔'; +$labels['forward.saving'] = '데이터를 저장하는 중...'; $labels['filladdresses'] = '내 이메일 주소로 모두 채우기'; $labels['arialabelfiltersetactions'] = '필터 세트 동작'; $labels['arialabelfilteractions'] = '필터 동작'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ku.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ku.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ku.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ku.inc 2018-04-11 11:14:33.000000000 +0000 @@ -85,4 +85,6 @@ $labels['vacation.subject'] = 'Mijar'; $labels['vacation.status'] = 'Rewş'; $labels['vacation.on'] = 'Vekirî'; +$labels['vacation.keep'] = 'Bihêle'; +$labels['forward.on'] = 'Vekirî'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ku_IQ.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ku_IQ.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ku_IQ.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ku_IQ.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,22 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Managesieve plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ +*/ +$labels['del'] = 'سڕینەوە'; +$labels['notifymethodtel'] = 'تەلەفۆن'; +$labels['datetest'] = 'بەروار'; +$labels['vacation.subject'] = 'ناونیشان'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/lb_LU.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/lb_LU.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/lb_LU.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/lb_LU.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Neie Filter'; $labels['filteradd'] = 'Filter dobäisetzen'; $labels['filterdel'] = 'Filter läschen'; +$labels['scope'] = 'Ëmfang'; $labels['moveup'] = 'Eropréckelen'; $labels['movedown'] = 'Erofréckelen'; $labels['filterallof'] = 'all dës Reegele mussen zoutreffen'; @@ -46,4 +47,15 @@ $labels['del'] = 'Läschen'; $labels['sender'] = 'Ofsender'; $labels['recipient'] = 'Empfänger'; +$labels['flagread'] = 'Gelies'; +$labels['flagdeleted'] = 'Geläscht'; +$labels['flagflagged'] = 'Mat Fändel'; +$labels['notifymethodmailto'] = 'E-Mail'; +$labels['notifymethodtel'] = 'Telefon'; +$labels['datetest'] = 'Datum'; +$labels['advancedopts'] = 'Avancéiert Optiounen'; +$labels['body'] = 'Kierper'; +$labels['vacation.subject'] = 'Sujet'; +$labels['vacation.body'] = 'Kierper'; +$labels['vacation.keep'] = 'Halen'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/lt_LT.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/lt_LT.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/lt_LT.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/lt_LT.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Naujas filtras'; $labels['filteradd'] = 'Pridėti filtrą'; $labels['filterdel'] = 'Pašalinti filtrą'; +$labels['rules'] = 'Taisyklės'; +$labels['actions'] = 'Veiksmai'; +$labels['scope'] = 'Sritis'; $labels['moveup'] = 'Pakelti aukštyn'; $labels['movedown'] = 'Nuleisti žemyn'; $labels['filterallof'] = 'atitinka visas šias taisykles'; @@ -38,6 +41,14 @@ $labels['filternotregex'] = 'neatitinka reguliariojo reiškinio'; $labels['filterunder'] = 'nesiekia'; $labels['filterover'] = 'viršija'; +$labels['mime'] = 'MIME:'; +$labels['mimepart'] = 'MIME dalis:'; +$labels['mime-message'] = 'laiškas'; +$labels['mime-anychild'] = 'bet kokia'; +$labels['mime-type'] = 'tipas'; +$labels['mime-subtype'] = 'potipis'; +$labels['mime-contenttype'] = 'turinio tipas'; +$labels['mime-param'] = 'parametras'; $labels['addrule'] = 'Pridėti taisyklę'; $labels['delrule'] = 'Pašalinti taisyklę'; $labels['messagemoveto'] = 'Perkelti laišką į'; @@ -67,10 +78,11 @@ $labels['filterset'] = 'Filtrų rinkinys'; $labels['filtersets'] = 'Filtrų rinkiniai'; $labels['filtersetadd'] = 'Pridėti filtrų rinkinį'; -$labels['filtersetdel'] = 'Pašalinti šį filtrų rinkinį'; +$labels['filtersetdel'] = 'Ištrinti filtrų rinkinį'; $labels['filtersetact'] = 'Įgalinti šį filtrų rinkinį'; $labels['filtersetdeact'] = 'Išjungti šį filtrų rinkinį'; $labels['filterseteditraw'] = 'Taisyti filtrų rinkinį'; +$labels['filtersetswitch'] = 'Įjungti/išjungti filtrų rinkinį'; $labels['filterdef'] = 'Filtro aprašas'; $labels['filtersetname'] = 'Filtrų rinkinio pavadinimas'; $labels['newfilterset'] = 'Naujas filtrų rinkinys'; @@ -183,6 +195,14 @@ $labels['vacation.discard'] = 'Panaikinti'; $labels['vacation.redirect'] = 'Peradresuoti kam'; $labels['vacation.copy'] = 'Siųsti kopiją kam'; +$labels['forward'] = 'Persiuntimas'; +$labels['forward.redirect'] = 'Peradresuoti kam'; +$labels['forward.copy'] = 'Siųsti kopiją kam'; +$labels['forward.on'] = 'Įjungta'; +$labels['forward.off'] = 'Išjungta'; +$labels['forward.status'] = 'Būsena:'; +$labels['forward.action'] = 'Gaunamiems laiškams vykdyti šį veiksmą:'; +$labels['forward.saving'] = 'Išsaugomi duomenys...'; $labels['filladdresses'] = 'Įterpti visus mano el. pašto adresus'; $labels['arialabelfiltersetactions'] = 'Filtrų rinkinio veiksmai'; $labels['arialabelfilteractions'] = 'Filtro veiksmai'; @@ -191,6 +211,7 @@ $labels['ariasummaryfiltersetslist'] = 'Filtrų rinkinių sąrašas'; $labels['filterstitle'] = 'Tvarkyti gaunamų laiškų filtrus'; $labels['vacationtitle'] = 'Redaguoti ne-biure taisyklę'; +$labels['forwardtitle'] = 'Taisyti laiškų persiuntimo taisyklę'; $labels['message'] = 'Laiškas'; $labels['duplicate'] = 'yra dubliuojamas'; $labels['notduplicate'] = 'nėra dubliuojamas'; @@ -235,6 +256,8 @@ $messages['invaliddateformat'] = 'Neteisingas datos ar jos dalies formatas'; $messages['saveerror'] = 'Nepavyksta išsaugoti duomenų. Įvyko serverio klaida.'; $messages['vacationsaved'] = 'Sėkmingai išsaugoti atostogų duomenys.'; +$messages['forwardsaved'] = 'Persiuntimo duomenys sėkmingai įrašyti.'; $messages['emptyvacationbody'] = 'Atostogų pranešimui turinys būtinas!'; $messages['duplicate.conflict.err'] = 'Naudojimas antraštės ir identifikatoriaus kartu yra draudžiamas, negalimas.'; +$messages['disabledaction'] = 'Veiksmas neleistinas.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/lv_LV.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/lv_LV.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/lv_LV.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/lv_LV.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Jauns filtrs'; $labels['filteradd'] = 'Pievienot filtru'; $labels['filterdel'] = 'Dzēst filtru'; +$labels['rules'] = 'Noteikumi'; +$labels['actions'] = 'Darbību saraksts'; +$labels['scope'] = 'Kur meklēt'; $labels['moveup'] = 'Pārvietot augšup'; $labels['movedown'] = 'Pārvietot lejup'; $labels['filterallof'] = 'jāatbilst visiem sekojošajiem nosacījumiem'; @@ -38,6 +41,14 @@ $labels['filternotregex'] = 'neatbilst regulārai izteiksmei'; $labels['filterunder'] = 'zem'; $labels['filterover'] = 'virs'; +$labels['mime'] = 'MIME:'; +$labels['mimepart'] = 'MIME daļa:'; +$labels['mime-message'] = 'vēstule'; +$labels['mime-anychild'] = 'jebkurš'; +$labels['mime-type'] = 'tips'; +$labels['mime-subtype'] = 'apakštips'; +$labels['mime-contenttype'] = 'satura-tips'; +$labels['mime-param'] = 'parametrs'; $labels['addrule'] = 'Pievienot nosacījumu'; $labels['delrule'] = 'Dzēst nosacījumu'; $labels['messagemoveto'] = 'Pārvietot vēstuli uz'; @@ -67,10 +78,11 @@ $labels['filterset'] = 'Filtru kopa'; $labels['filtersets'] = 'Filtru kopas'; $labels['filtersetadd'] = 'Pievienot filtru kopu'; -$labels['filtersetdel'] = 'Dzēst pašreizējo filtru kopu'; +$labels['filtersetdel'] = 'Dzēst filtru kopu'; $labels['filtersetact'] = 'Aktivizēt pašreizējo filtru kopu'; $labels['filtersetdeact'] = 'Deaktivizēt pašreizējo filtru kopu'; $labels['filterseteditraw'] = 'Rediģēt filtru kopu'; +$labels['filtersetswitch'] = 'Ieslēgt/izslēgt filtru kopu'; $labels['filterdef'] = 'Filtra apraksts'; $labels['filtersetname'] = 'Filtru kopas nosaukums'; $labels['newfilterset'] = 'Jauna filtru kopa'; @@ -183,6 +195,14 @@ $labels['vacation.discard'] = 'Nesaglabāt'; $labels['vacation.redirect'] = 'Pārsūtīt uz'; $labels['vacation.copy'] = 'Sūtīt kopiju uz'; +$labels['forward'] = 'Pārsūtīšana'; +$labels['forward.redirect'] = 'Pārsūtīt uz'; +$labels['forward.copy'] = 'Sūtīt kopiju uz'; +$labels['forward.on'] = 'Ieslēgts'; +$labels['forward.off'] = 'Izslēgts'; +$labels['forward.status'] = 'Statuss:'; +$labels['forward.action'] = 'Ienākot e-pastam, izpildīt sekojošo darbību:'; +$labels['forward.saving'] = 'Dati tiek saglabāti...'; $labels['filladdresses'] = 'Aizpildīt ar visām manām e-pasta adresēm'; $labels['arialabelfiltersetactions'] = 'Filtra kopas darbības'; $labels['arialabelfilteractions'] = 'Filtra darbības'; @@ -191,6 +211,7 @@ $labels['ariasummaryfiltersetslist'] = 'Filtru kopu saraksts'; $labels['filterstitle'] = 'Rediģēt ienākošo e-pastu filtrus'; $labels['vacationtitle'] = 'Rediģēt "neesmu ofisā" nosacījumu'; +$labels['forwardtitle'] = 'Rediģēt e-pastu pārsūtīšanas noteikumus'; $labels['message'] = 'Vēstule'; $labels['duplicate'] = 'ir dublikāts'; $labels['notduplicate'] = 'nav dublikāts'; @@ -235,6 +256,8 @@ $messages['invaliddateformat'] = 'Nederīgs datums vai datuma formāts'; $messages['saveerror'] = 'Nav iespējams saglabāt datus. Servera kļūda.'; $messages['vacationsaved'] = 'Brīvdienu iestatījumi veiksmīgi saglabāti.'; +$messages['forwardsaved'] = 'Pārsūtīšanas dati veiksmīgi saglabāti.'; $messages['emptyvacationbody'] = 'Brīvdienu e-pastam obligāti jānorāda vēstules teksts!'; $messages['duplicate.conflict.err'] = 'Gan galvenes, gan unikālais identifikators nav atļauts.'; +$messages['disabledaction'] = 'Darbība nav atļauta!'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/mk_MK.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/mk_MK.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/mk_MK.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/mk_MK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Нов филтер '; $labels['filteradd'] = 'Додај филтер '; $labels['filterdel'] = 'Избришај филтер '; +$labels['scope'] = 'Опсег'; $labels['moveup'] = 'Помести нагоре '; $labels['movedown'] = 'Помести надолу '; $labels['filterallof'] = 'Појавување на сите од следниве правила'; @@ -67,7 +68,6 @@ $labels['filterset'] = 'Сет на филтер '; $labels['filtersets'] = 'Сетови филтри'; $labels['filtersetadd'] = 'Постави сет на филтри'; -$labels['filtersetdel'] = 'Избриши го тековниот сет на филтри '; $labels['filtersetact'] = 'Активирај го тековниот сет на филтри '; $labels['filtersetdeact'] = 'Деактивирај го тековниот сет на филтри '; $labels['filterseteditraw'] = 'Уреди го филтер сетот '; @@ -183,6 +183,11 @@ $labels['vacation.discard'] = 'Отфрли'; $labels['vacation.redirect'] = 'Пренасочи до'; $labels['vacation.copy'] = 'Испрати копија до '; +$labels['forward.redirect'] = 'Пренасочи до'; +$labels['forward.copy'] = 'Испрати копија до '; +$labels['forward.on'] = 'Вклучи'; +$labels['forward.off'] = 'Исклучи'; +$labels['forward.saving'] = 'Зачувување на податок...'; $labels['filladdresses'] = 'Пополни со сите мои адреси '; $labels['arialabelfiltersetactions'] = 'Акции на филтер сет '; $labels['arialabelfilteractions'] = 'Акции на филтер '; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ml_IN.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ml_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ml_IN.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ml_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -65,7 +65,6 @@ $labels['filterset'] = 'അരിപ്പകളുടെ കൂട്ടം'; $labels['filtersets'] = 'അരിപ്പകളുടെ കൂട്ടങ്ങള്‍'; $labels['filtersetadd'] = 'അരിപ്പകളുടെ കൂട്ടം ചേര്‍ക്കുക'; -$labels['filtersetdel'] = 'ഇപ്പോഴത്തെ അരിപ്പകളുടെ കൂട്ടം മായ്ക്കുക'; $labels['filtersetact'] = 'ഇപ്പോഴത്തെ അരിപ്പകളുടെ കൂട്ടം പ്രവര്‍ത്തിപ്പിക്കുക'; $labels['filtersetdeact'] = 'ഇപ്പോഴത്തെ അരിപ്പകളുടെ കൂട്ടം പ്രവര്‍ത്തനം അവസാനിപ്പിക്കുക'; $labels['filterdef'] = 'അരിപ്പയുടെ നിര്‍വ്വചനം'; @@ -99,10 +98,13 @@ $labels['setvariable'] = 'വേരിയബിൾ സ്ഥിരപ്പെടുത്തുക'; $labels['setvarname'] = 'വേരിയബിളിന്റെ പേര്'; $labels['setvarvalue'] = 'വേരിയബിളിന്റെ മൂല്യം'; +$labels['notifymethodmailto'] = 'ഇമെയില്‍'; +$labels['notifymethodtel'] = 'ഫോണ്‍'; $labels['filtercreate'] = 'അരിപ്പ ഉണ്ടാക്കുക'; $labels['usedata'] = 'ഈ വിവരങ്ങള്‍ അരിപ്പയില്‍ ഉപയോഗിക്കുക:'; $labels['nextstep'] = 'അടുത്ത പടി'; $labels['...'] = '...'; +$labels['datetest'] = 'തീയതി'; $labels['advancedopts'] = 'വിപുലീക്രിതമായ ക്രമീകരണങ്ങള്‍'; $labels['body'] = 'ഉള്ളടക്കം'; $labels['address'] = 'മേല്‍വിലാസം'; @@ -122,6 +124,8 @@ $labels['octet'] = 'കര്‍ശനം (octet)'; $labels['asciicasemap'] = 'വലിയ-ചെറിയക്ഷരങ്ങള്‍ തമ്മില്‍ വ്യത്യാസമില്ലാത്ത (ascii-casemap)'; $labels['asciinumeric'] = 'സംഖ്യകള്‍ (ascii-numeric)'; +$labels['vacation.subject'] = 'വിഷയം'; +$labels['vacation.body'] = 'ഉള്ളടക്കം'; $messages['filterunknownerror'] = 'അജ്ഞാതമായ സെര്‍വ്വര്‍ പിശക്.'; $messages['filterconnerror'] = 'സെര്‍വ്വറുമായി ബന്ധപ്പെടാന്‍ സാധിക്കുന്നില്ല.'; $messages['filterdeleted'] = 'അരിപ്പ വിജകരമായി മായ്ച്ചു.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/mn_MN.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/mn_MN.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/mn_MN.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/mn_MN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -45,4 +45,9 @@ $labels['messagesendcopy'] = 'Захианы хуулбарыг илгээх'; $labels['messagereply'] = 'Захианд хариулах'; $labels['messagedelete'] = 'Захиа устгах'; +$labels['del'] = 'Устгах'; +$labels['sender'] = 'Илгээгч'; +$labels['flagread'] = 'Унших'; +$labels['datetest'] = 'Огноо'; +$labels['vacation.subject'] = 'Гарчиг'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/mr_IN.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/mr_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/mr_IN.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/mr_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -31,4 +31,11 @@ $labels['add'] = 'समावेश करा'; $labels['del'] = 'नष्ट करा'; $labels['sender'] = 'प्रेषक'; +$labels['flagdeleted'] = 'काढून टाकलेला(ले)'; +$labels['flagflagged'] = 'खूण लावलेले'; +$labels['notifymethodmailto'] = 'इ-मेल्'; +$labels['notifymethodtel'] = 'दूरध्वनी'; +$labels['datetest'] = 'दिनांक'; +$labels['advancedopts'] = 'अधिक पर्याय'; +$labels['vacation.subject'] = 'विषय'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ms_MY.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ms_MY.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ms_MY.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ms_MY.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,25 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Managesieve plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ +*/ +$labels['messagedelete'] = 'Pindah mesej ke sampah'; +$labels['del'] = 'Padam'; +$labels['flagdeleted'] = 'Telah dipadam'; +$labels['flagflagged'] = 'Ditanda'; +$labels['notifymethodmailto'] = 'E-Mel'; +$labels['datetest'] = 'Tarikh'; +$labels['vacation.subject'] = 'Subjek'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/nb_NO.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/nb_NO.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/nb_NO.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/nb_NO.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Nytt filter'; $labels['filteradd'] = 'Legg til filter'; $labels['filterdel'] = 'Slett filter'; +$labels['scope'] = 'Omfanget'; $labels['moveup'] = 'Flytt opp'; $labels['movedown'] = 'Flytt ned'; $labels['filterallof'] = 'som treffer alle følgende regler'; @@ -65,7 +66,6 @@ $labels['filterset'] = 'Filtersett'; $labels['filtersets'] = 'Filtersett'; $labels['filtersetadd'] = 'Nytt filtersett'; -$labels['filtersetdel'] = 'Slett gjeldende filtersett'; $labels['filtersetact'] = 'Aktiver gjeldende filtersett'; $labels['filtersetdeact'] = 'Deaktiver gjeldende filtersett'; $labels['filterdef'] = 'Filterdefinisjon'; @@ -111,6 +111,8 @@ $labels['notifyimportancelow'] = 'lav'; $labels['notifyimportancenormal'] = 'normal'; $labels['notifyimportancehigh'] = 'høy'; +$labels['notifymethodmailto'] = 'E-post'; +$labels['notifymethodtel'] = 'Telefon'; $labels['filtercreate'] = 'Opprett filter'; $labels['usedata'] = 'Bruk følgende data i filteret:'; $labels['nextstep'] = 'Neste steg'; @@ -152,6 +154,10 @@ $labels['asciinumeric'] = 'numerisk (ascii-numeric)'; $labels['index'] = 'index:'; $labels['indexlast'] = 'baklengs'; +$labels['vacation.subject'] = 'Emne'; +$labels['vacation.body'] = 'Meldingstekst'; +$labels['vacation.keep'] = 'Behold'; +$labels['duplicate.header'] = 'header:'; $messages['filterunknownerror'] = 'Ukjent problem med tjener.'; $messages['filterconnerror'] = 'Kunne ikke koble til tjeneren.'; $messages['filterdeleteerror'] = 'Kunne ikke slette filter. Fikk feilmelding fra server.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ne_NP.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ne_NP.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ne_NP.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ne_NP.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,23 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Managesieve plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ +*/ +$labels['messagedelete'] = 'रद्दी टोकरीमा हाल्नुहोस'; +$labels['del'] = 'मेटाउनुहोस'; +$labels['notifymethodmailto'] = 'ई-मेल'; +$labels['datetest'] = 'तारिख'; +$labels['vacation.subject'] = 'विषय'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/nl_BE.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/nl_BE.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/nl_BE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/nl_BE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,15 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ */ +$labels['messagedelete'] = 'Dit bericht verwijderen'; $labels['add'] = 'Toevoegen'; +$labels['del'] = 'Verwijderen'; +$labels['sender'] = 'Afzender'; +$labels['flagdeleted'] = 'Verwijderd'; +$labels['flagflagged'] = 'Geselecteerd'; +$labels['notifymethodmailto'] = 'E-mailadres'; $labels['notifymethodtel'] = 'Telefoonnummer'; +$labels['datetest'] = 'Datum'; +$labels['advancedopts'] = 'Geavanceerde opties'; +$labels['vacation.subject'] = 'Onderwerp'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/nl_NL.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/nl_NL.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/nl_NL.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/nl_NL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Nieuw filter'; $labels['filteradd'] = 'Filter toevoegen'; $labels['filterdel'] = 'Verwijder filter'; +$labels['scope'] = 'Zoekbereik'; $labels['moveup'] = 'Verplaats omhoog'; $labels['movedown'] = 'Verplaats omlaag'; $labels['filterallof'] = 'die voldoet aan alle volgende regels'; @@ -67,7 +68,6 @@ $labels['filterset'] = 'Filterset'; $labels['filtersets'] = 'Filtersets'; $labels['filtersetadd'] = 'Nieuwe filterset'; -$labels['filtersetdel'] = 'Verwijder huidige filterset'; $labels['filtersetact'] = 'Huidige filterset activeren'; $labels['filtersetdeact'] = 'Huidige filterset uitschakelen'; $labels['filterseteditraw'] = 'Filterset bewerken'; @@ -183,6 +183,11 @@ $labels['vacation.discard'] = 'Weggooien'; $labels['vacation.redirect'] = 'Doorsturen naar'; $labels['vacation.copy'] = 'Kopie sturen naar'; +$labels['forward.redirect'] = 'Doorsturen naar'; +$labels['forward.copy'] = 'Kopie sturen naar'; +$labels['forward.on'] = 'Aan'; +$labels['forward.off'] = 'Uit'; +$labels['forward.saving'] = 'Gegevens worden opgeslagen...'; $labels['filladdresses'] = 'Vullen met al mijn adressen'; $labels['arialabelfiltersetactions'] = 'Filtersetacties'; $labels['arialabelfilteractions'] = 'Filteracties'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/nn_NO.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/nn_NO.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/nn_NO.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/nn_NO.inc 2018-04-11 11:14:33.000000000 +0000 @@ -61,7 +61,6 @@ $labels['filterset'] = 'Filtersett'; $labels['filtersets'] = 'Filtersett'; $labels['filtersetadd'] = 'Nytt filtersett'; -$labels['filtersetdel'] = 'Slett gjeldande filtersett'; $labels['filtersetact'] = 'Aktiver gjeldande filtersett'; $labels['filtersetdeact'] = 'Deaktiver gjeldande filtersett'; $labels['filterdef'] = 'Filterdefinisjon'; @@ -104,10 +103,13 @@ $labels['notifyimportancelow'] = 'låg'; $labels['notifyimportancenormal'] = 'normal'; $labels['notifyimportancehigh'] = 'høg'; +$labels['notifymethodmailto'] = 'E-post'; +$labels['notifymethodtel'] = 'Telefon'; $labels['filtercreate'] = 'Opprett filter'; $labels['usedata'] = 'Bruk følgande data i filteret:'; $labels['nextstep'] = 'Neste steg'; $labels['...'] = '…'; +$labels['datetest'] = 'Dato'; $labels['advancedopts'] = 'Avanserte val'; $labels['body'] = 'Meldingstekst'; $labels['address'] = 'adresse'; @@ -127,6 +129,9 @@ $labels['octet'] = 'streng (oktett)'; $labels['asciicasemap'] = 'ikkje skil mellom store og små bokstavar (ascii-casemap)'; $labels['asciinumeric'] = 'numerisk (ascii-numeric)'; +$labels['vacation.subject'] = 'Emne'; +$labels['vacation.body'] = 'Meldingstekst'; +$labels['vacation.keep'] = 'Behald'; $messages['filterunknownerror'] = 'Ukjent problem med tenar.'; $messages['filterconnerror'] = 'Kunne ikkje kople til tenaren.'; $messages['filterdeleted'] = 'Filteret er blitt sletta.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/pl_PL.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/pl_PL.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/pl_PL.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/pl_PL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Nowy filtr'; $labels['filteradd'] = 'Dodaj filtr'; $labels['filterdel'] = 'Usuń filtr'; +$labels['rules'] = 'Reguły'; +$labels['actions'] = 'Akcje'; +$labels['scope'] = 'Zakres'; $labels['moveup'] = 'W górę'; $labels['movedown'] = 'W dół'; $labels['filterallof'] = 'spełniających wszystkie poniższe kryteria'; @@ -67,10 +70,11 @@ $labels['filterset'] = 'Zbiór filtrów'; $labels['filtersets'] = 'Zbiory fitrów'; $labels['filtersetadd'] = 'Dodaj zbiór filtrów'; -$labels['filtersetdel'] = 'Usuń bieżący zbiór filtrów'; +$labels['filtersetdel'] = 'Usuń zbiór filtrów'; $labels['filtersetact'] = 'Aktywuj bieżący zbiór filtrów'; $labels['filtersetdeact'] = 'Deaktywuj bieżący zbiór filtrów'; $labels['filterseteditraw'] = 'Edytuj zbiór filtrów'; +$labels['filtersetswitch'] = 'Włącz/Wyłącz zbiór filtrów'; $labels['filterdef'] = 'Definicja filtra'; $labels['filtersetname'] = 'Nazwa zbioru'; $labels['newfilterset'] = 'Nowy zbiór filtrów'; @@ -183,6 +187,11 @@ $labels['vacation.discard'] = 'Odrzuć'; $labels['vacation.redirect'] = 'Przekaż do'; $labels['vacation.copy'] = 'Wyślij kopię do'; +$labels['forward.redirect'] = 'Przekaż do'; +$labels['forward.copy'] = 'Wyślij kopię do'; +$labels['forward.on'] = 'włączone'; +$labels['forward.off'] = 'wyłączone'; +$labels['forward.saving'] = 'Zapisywanie danych...'; $labels['filladdresses'] = 'Wypełnij wszystkimi moimi adresami'; $labels['arialabelfiltersetactions'] = 'Zbiór filtrów akcji'; $labels['arialabelfilteractions'] = 'Akcje filtrów'; @@ -237,4 +246,5 @@ $messages['vacationsaved'] = 'Dane nieobecności zapisano pomyślnie.'; $messages['emptyvacationbody'] = 'Treść wiadomości jest wymagana!'; $messages['duplicate.conflict.err'] = 'Nagłówek i identyfikator nie mogą być używane równocześnie.'; +$messages['disabledaction'] = 'Niedozwolona akcja'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ps.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ps.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ps.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ps.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,25 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Managesieve plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ +*/ +$labels['messagedelete'] = 'استوزه ړنګول'; +$labels['del'] = 'ړنګول'; +$labels['flagflagged'] = 'بې کاره'; +$labels['notifymethodmailto'] = 'برېښناليک'; +$labels['datetest'] = 'نېټه'; +$labels['advancedopts'] = 'پرمختللي لارې'; +$labels['vacation.subject'] = 'مضمون'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/pt_BR.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/pt_BR.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/pt_BR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/pt_BR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Novo filtro'; $labels['filteradd'] = 'Adicionar filtro'; $labels['filterdel'] = 'Excluir filtro'; +$labels['rules'] = 'Regras'; +$labels['actions'] = 'Ações'; +$labels['scope'] = 'Escopo'; $labels['moveup'] = 'Mover para cima'; $labels['movedown'] = 'Mover para baixo'; $labels['filterallof'] = 'casando todas as seguintes regras'; @@ -38,6 +41,14 @@ $labels['filternotregex'] = 'não combina com a expressão regular'; $labels['filterunder'] = 'inferior a'; $labels['filterover'] = 'superior a'; +$labels['mime'] = 'MIME:'; +$labels['mimepart'] = 'Parte MIME:'; +$labels['mime-message'] = 'mensagem'; +$labels['mime-anychild'] = 'qualquer'; +$labels['mime-type'] = 'tipo'; +$labels['mime-subtype'] = 'subtipo'; +$labels['mime-contenttype'] = 'tipo-de-conteúdo'; +$labels['mime-param'] = 'parâmetro'; $labels['addrule'] = 'Adicionar regra'; $labels['delrule'] = 'Excluir regra'; $labels['messagemoveto'] = 'Mover mensagem para'; @@ -67,10 +78,11 @@ $labels['filterset'] = 'Conjunto de filtros'; $labels['filtersets'] = 'Conjuntos de filtro'; $labels['filtersetadd'] = 'Adicionar conjunto de filtros'; -$labels['filtersetdel'] = 'Excluir conjunto de filtros atual'; +$labels['filtersetdel'] = 'Excluir conjunto de filtros'; $labels['filtersetact'] = 'Ativar conjunto de filtros atual'; $labels['filtersetdeact'] = 'Desativar conjunto de filtros atual'; $labels['filterseteditraw'] = 'Editar conjunto de filtros'; +$labels['filtersetswitch'] = 'Habilitar/desabilitar conjunto de filtros'; $labels['filterdef'] = 'Definição de filtro'; $labels['filtersetname'] = 'Nome do conjunto de filtros'; $labels['newfilterset'] = 'Novo conjunto de filtros'; @@ -183,6 +195,14 @@ $labels['vacation.discard'] = 'Descartar'; $labels['vacation.redirect'] = 'Redirecionar para'; $labels['vacation.copy'] = 'Enviar cópia para'; +$labels['forward'] = 'Encaminhar'; +$labels['forward.redirect'] = 'Redirecionar para'; +$labels['forward.copy'] = 'Enviar cópia para'; +$labels['forward.on'] = 'Ligado'; +$labels['forward.off'] = 'Desligado'; +$labels['forward.status'] = 'Status:'; +$labels['forward.action'] = 'Para e-mails entrantes execute as seguintes ações:'; +$labels['forward.saving'] = 'Salvando dados...'; $labels['filladdresses'] = 'Preencher com todos os meus endereços'; $labels['arialabelfiltersetactions'] = 'Ações do grupo de filtros'; $labels['arialabelfilteractions'] = 'Ações do filtro'; @@ -191,6 +211,7 @@ $labels['ariasummaryfiltersetslist'] = 'Lista de grupo de filtros'; $labels['filterstitle'] = 'Editar filtro dos e-mails recebidos'; $labels['vacationtitle'] = 'Editar regra de ausência'; +$labels['forwardtitle'] = 'Editar regras de encaminhamento'; $labels['message'] = 'Mensagem'; $labels['duplicate'] = 'está duplicada'; $labels['notduplicate'] = 'não está duplicada'; @@ -235,6 +256,8 @@ $messages['invaliddateformat'] = 'Data inválida'; $messages['saveerror'] = 'Impossível salvar dados. Ocorreu um erro no servidor.'; $messages['vacationsaved'] = 'Dados de férias salvos com sucesso.'; +$messages['forwardsaved'] = 'Dados de encaminhamento salvo com sucesso.'; $messages['emptyvacationbody'] = 'Conteúdo da mensagem de férias necessário!'; $messages['duplicate.conflict.err'] = 'Ambos cabeçalho e identificador único não são permitidos.'; +$messages['disabledaction'] = 'Ação não permitida.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/pt_PT.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/pt_PT.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/pt_PT.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/pt_PT.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Novo filtro'; $labels['filteradd'] = 'Adicionar filtro'; $labels['filterdel'] = 'Eliminar filtro'; +$labels['rules'] = 'Regras'; +$labels['actions'] = 'Ações'; +$labels['scope'] = 'Âmbito'; $labels['moveup'] = 'Mover para cima'; $labels['movedown'] = 'Mover para baixo'; $labels['filterallof'] = 'corresponde a todas as seguintes regras'; @@ -38,6 +41,14 @@ $labels['filternotregex'] = 'não corresponde à expressão'; $labels['filterunder'] = 'é inferior a'; $labels['filterover'] = 'é superior a'; +$labels['mime'] = 'MIME:'; +$labels['mimepart'] = 'Parte MIME:'; +$labels['mime-message'] = 'mensagem'; +$labels['mime-anychild'] = 'qualquer'; +$labels['mime-type'] = 'tipo'; +$labels['mime-subtype'] = 'subtipo'; +$labels['mime-contenttype'] = 'tipo de conteúdo'; +$labels['mime-param'] = 'parâmetro'; $labels['addrule'] = 'Adicionar regra'; $labels['delrule'] = 'Eliminar regra'; $labels['messagemoveto'] = 'Mover mensagem para'; @@ -67,10 +78,11 @@ $labels['filterset'] = 'Filtros definidos'; $labels['filtersets'] = 'Filtros definidos'; $labels['filtersetadd'] = 'Adicionar definição de filtros'; -$labels['filtersetdel'] = 'Eliminar definição de filtros actuais'; +$labels['filtersetdel'] = 'Eliminar conjunto de filtros'; $labels['filtersetact'] = 'Activar definição de filtros actuais'; $labels['filtersetdeact'] = 'Desactivar definição de filtros actuais'; $labels['filterseteditraw'] = 'Editar conjunto de filtros'; +$labels['filtersetswitch'] = 'Ativar/desativar conjuntos de filtros'; $labels['filterdef'] = 'Definição de filtros'; $labels['filtersetname'] = 'Nome da definição de filtros'; $labels['newfilterset'] = 'Nova definição de filtros'; @@ -183,6 +195,14 @@ $labels['vacation.discard'] = 'Rejeitar'; $labels['vacation.redirect'] = 'Redireccionar para'; $labels['vacation.copy'] = 'Enviar cópia para'; +$labels['forward'] = 'Reencaminhamento'; +$labels['forward.redirect'] = 'Redireccionar para'; +$labels['forward.copy'] = 'Enviar cópia para'; +$labels['forward.on'] = 'Ligar'; +$labels['forward.off'] = 'Desligar'; +$labels['forward.status'] = 'Estado:'; +$labels['forward.action'] = 'Executar a seguinte ação para os mails recebidos:'; +$labels['forward.saving'] = 'A guardar dados...'; $labels['filladdresses'] = 'Preencher com todos os meus endereços'; $labels['arialabelfiltersetactions'] = 'Acções do conjunto de filtros'; $labels['arialabelfilteractions'] = 'Acções dos filtros'; @@ -191,6 +211,7 @@ $labels['ariasummaryfiltersetslist'] = 'Lista de conjuntos de filtros'; $labels['filterstitle'] = 'Editar filtros de mensagens recebidas'; $labels['vacationtitle'] = 'Editar regra de ausência do escritório'; +$labels['forwardtitle'] = 'Editar regra de reencaminhamento de mail'; $labels['message'] = 'Mensagem'; $labels['duplicate'] = 'é duplicado'; $labels['notduplicate'] = 'não é duplicado'; @@ -235,6 +256,8 @@ $messages['invaliddateformat'] = 'Data ou formato de data inválido.'; $messages['saveerror'] = 'Não foi possível guardar os dados. Ocorreu um erro no servidor.'; $messages['vacationsaved'] = 'Dados de férias guardados com sucesso.'; +$messages['forwardsaved'] = 'Dados de reencaminhamento guardados com sucesso.'; $messages['emptyvacationbody'] = 'É necessário o corpo da mensagem de férias!'; $messages['duplicate.conflict.err'] = 'Ambos, cabeçalho e identificador único, não são permitidos.'; +$messages['disabledaction'] = 'Ação não permitida.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ro_RO.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ro_RO.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ro_RO.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ro_RO.inc 2018-04-11 11:14:33.000000000 +0000 @@ -67,7 +67,6 @@ $labels['filterset'] = 'Filtre setate'; $labels['filtersets'] = 'Filtrul seteaza'; $labels['filtersetadd'] = 'Adauga set de filtre'; -$labels['filtersetdel'] = 'Sterge setul curent de filtre'; $labels['filtersetact'] = 'Activeaza setul curent de filtre'; $labels['filtersetdeact'] = 'Dezactiveaza setul curent de filtre'; $labels['filterseteditraw'] = 'Modifică set filtre'; @@ -183,6 +182,11 @@ $labels['vacation.discard'] = 'Renunță'; $labels['vacation.redirect'] = 'Redirecționează către'; $labels['vacation.copy'] = 'Trimite o copie către'; +$labels['forward.redirect'] = 'Redirecționează către'; +$labels['forward.copy'] = 'Trimite o copie către'; +$labels['forward.on'] = 'Pe'; +$labels['forward.off'] = 'De pe'; +$labels['forward.saving'] = 'Salvez datele...'; $labels['filladdresses'] = 'Completează cu toate adresele mele'; $labels['arialabelfiltersetactions'] = 'Acțiuni set filtre'; $labels['arialabelfilteractions'] = 'Acțiuni filtru'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ru_RU.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ru_RU.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ru_RU.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ru_RU.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Новый фильтр'; $labels['filteradd'] = 'Добавить фильтр'; $labels['filterdel'] = 'Удалить фильтр'; +$labels['rules'] = 'Правила'; +$labels['actions'] = 'Действия'; +$labels['scope'] = 'Область'; $labels['moveup'] = 'Сдвинуть вверх'; $labels['movedown'] = 'Сдвинуть вниз'; $labels['filterallof'] = 'соответствует всем указанным правилам'; @@ -67,10 +70,11 @@ $labels['filterset'] = 'Набор фильтров'; $labels['filtersets'] = 'Наборы фильтров'; $labels['filtersetadd'] = 'Добавить набор фильтров'; -$labels['filtersetdel'] = 'Удалить текущий набор фильтров'; +$labels['filtersetdel'] = 'Удалить набор фильтров'; $labels['filtersetact'] = 'Включить текущий набор фильтров'; $labels['filtersetdeact'] = 'Отключить текущий набор фильтров'; $labels['filterseteditraw'] = 'Изменить набор фильтров'; +$labels['filtersetswitch'] = 'Включить/выключить набор фильтров'; $labels['filterdef'] = 'Описание фильтра'; $labels['filtersetname'] = 'Название набора фильтров'; $labels['newfilterset'] = 'Новый набор фильтров'; @@ -183,6 +187,14 @@ $labels['vacation.discard'] = 'Отменить'; $labels['vacation.redirect'] = 'Перенаправить на'; $labels['vacation.copy'] = 'Отправить копию на'; +$labels['forward'] = 'Переслылка'; +$labels['forward.redirect'] = 'Перенаправить на'; +$labels['forward.copy'] = 'Отправить копию на'; +$labels['forward.on'] = 'Вкл.'; +$labels['forward.off'] = 'Выкл.'; +$labels['forward.status'] = 'Статус:'; +$labels['forward.action'] = 'Выполнить следующее действие для входящих сообщений:'; +$labels['forward.saving'] = 'Сохранение данных...'; $labels['filladdresses'] = 'Заполнить всеми моими адресами'; $labels['arialabelfiltersetactions'] = 'Действия набора фильтров'; $labels['arialabelfilteractions'] = 'Действия фильтра'; @@ -191,6 +203,7 @@ $labels['ariasummaryfiltersetslist'] = 'Список набора фильтров'; $labels['filterstitle'] = 'Редактировать фильтры для входящей почты'; $labels['vacationtitle'] = 'Изменить правило "Не в офисе"'; +$labels['forwardtitle'] = 'Изменить правило пересылки'; $labels['message'] = 'Сообщение'; $labels['duplicate'] = 'дублируется'; $labels['notduplicate'] = 'не дублируется'; @@ -235,6 +248,8 @@ $messages['invaliddateformat'] = 'Неверная дата или формат части даты'; $messages['saveerror'] = 'Невозможно сохранить данные. Ошибка сервера.'; $messages['vacationsaved'] = 'Данные об отпуске успешно сохранены.'; +$messages['forwardsaved'] = 'Данные о пересылке успешно сохранены.'; $messages['emptyvacationbody'] = 'Сообщение о причине отсутствия не может быть пустым!'; $messages['duplicate.conflict.err'] = 'Не разрешено использовать заголовок и уникальный идентификатор вместе.'; +$messages['disabledaction'] = 'Действие не разрешено.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/si_LK.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/si_LK.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/si_LK.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/si_LK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -32,11 +32,15 @@ $labels['flagread'] = 'කියවන්න'; $labels['flagdeleted'] = 'මකන ලදී'; $labels['flagdraft'] = 'කටු සටහන'; +$labels['notifymethodmailto'] = 'විද්‍යුත් තැපෑල'; +$labels['notifymethodtel'] = 'දුරකථනය'; $labels['nextstep'] = 'මීලග පියවර'; $labels['...'] = '...'; +$labels['datetest'] = 'දිනය'; $labels['address'] = 'ලිපිනය'; $labels['envelope'] = 'ලියුම් කවරය'; $labels['modtype'] = 'වර්ගය:'; $labels['allparts'] = 'සියල්ල'; +$labels['vacation.subject'] = 'මාතෘකාව'; $messages['nametoolong'] = 'නම දිග වැඩිය.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/sk_SK.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/sk_SK.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/sk_SK.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/sk_SK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Nový filter'; $labels['filteradd'] = 'Pridať filter'; $labels['filterdel'] = 'Vymazať filter'; +$labels['rules'] = 'Pravidlá'; +$labels['actions'] = 'Akcie'; +$labels['scope'] = 'Rozsah'; $labels['moveup'] = 'Presunúť nahor'; $labels['movedown'] = 'Presunúť nadol'; $labels['filterallof'] = 'vyhovujúca všetkým z nasledujúcich pravidiel'; @@ -38,6 +41,14 @@ $labels['filternotregex'] = 'nevyhovuje regulárnemu výrazu'; $labels['filterunder'] = 'pod'; $labels['filterover'] = 'nad'; +$labels['mime'] = 'MIME:'; +$labels['mimepart'] = 'Časť MIME:'; +$labels['mime-message'] = 'správa'; +$labels['mime-anychild'] = 'akékoľvek'; +$labels['mime-type'] = 'typ'; +$labels['mime-subtype'] = 'pod-typ'; +$labels['mime-contenttype'] = 'typ obsahu'; +$labels['mime-param'] = 'parameter'; $labels['addrule'] = 'Pridať pravidlo'; $labels['delrule'] = 'Vymazať pravidlo'; $labels['messagemoveto'] = 'Presunúť správu do'; @@ -67,10 +78,11 @@ $labels['filterset'] = 'Súprava filtrov'; $labels['filtersets'] = 'Súpravy filtrov'; $labels['filtersetadd'] = 'Pridať súpravu filtrov'; -$labels['filtersetdel'] = 'Vymazať aktuálnu súpravu filtrov'; +$labels['filtersetdel'] = 'Vymazať súpravu filtrov'; $labels['filtersetact'] = 'Aktivovať aktuálnu súpravu filtrov'; $labels['filtersetdeact'] = 'Deaktivovať aktuálnu súpravu filtrov'; $labels['filterseteditraw'] = 'Upraviť súpravu filtrov'; +$labels['filtersetswitch'] = 'Zapnúť/vypnúť súpravu filtrov'; $labels['filterdef'] = 'Definícia filtra'; $labels['filtersetname'] = 'Názov súpravy filtrov'; $labels['newfilterset'] = 'Nová súprava filtrov'; @@ -183,6 +195,14 @@ $labels['vacation.discard'] = 'Vyhodiť do koša'; $labels['vacation.redirect'] = 'Presmerovať na'; $labels['vacation.copy'] = 'Poslať kópiu na'; +$labels['forward'] = 'Preposlanie'; +$labels['forward.redirect'] = 'Presmerovať na'; +$labels['forward.copy'] = 'Poslať kópiu na'; +$labels['forward.on'] = 'Zap.'; +$labels['forward.off'] = 'Vyp.'; +$labels['forward.status'] = 'Stav:'; +$labels['forward.action'] = 'Pre prichádzajúce e-maily vykonať nasledujúcu akciu:'; +$labels['forward.saving'] = 'Ukladanie údajov...'; $labels['filladdresses'] = 'Vyplniť všetko mojimi adresami'; $labels['arialabelfiltersetactions'] = 'Akcie zo súpravy filtrov'; $labels['arialabelfilteractions'] = 'Akcie filtra'; @@ -191,6 +211,7 @@ $labels['ariasummaryfiltersetslist'] = 'Zoznam súprav s filtrami'; $labels['filterstitle'] = 'Upraviť filtre prichádzajúcich e-mailov'; $labels['vacationtitle'] = 'Upraviť pravidlo pre čas mimo kancelárie'; +$labels['forwardtitle'] = 'Upraviť pravidlo preposielania správy'; $labels['message'] = 'Správa'; $labels['duplicate'] = 'je duplikátom'; $labels['notduplicate'] = 'nie je duplikátom'; @@ -235,6 +256,8 @@ $messages['invaliddateformat'] = 'Neplatný formát dátumu alebo časti dátumu'; $messages['saveerror'] = 'Údaje nemožno uložiť. Nastala chyba servera.'; $messages['vacationsaved'] = 'Údaje o dovolenke boli úspešne uložené.'; +$messages['forwardsaved'] = 'Údaje o preposlaní boli úspešne uložené.'; $messages['emptyvacationbody'] = 'Musíte zadať telo správy, zobrazovanej v čase neprítomnosti!'; $messages['duplicate.conflict.err'] = 'Hlavička a aj unikátny identifikátor nie sú povolené.'; +$messages['disabledaction'] = 'Akcia nie je povolená.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/sl_SI.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/sl_SI.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/sl_SI.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/sl_SI.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Nov filter'; $labels['filteradd'] = 'Dodaj filter'; $labels['filterdel'] = 'Izbriši filter'; +$labels['scope'] = 'Obseg'; $labels['moveup'] = 'Pomakni se navzgor'; $labels['movedown'] = 'Pomakni se navzdol'; $labels['filterallof'] = 'izpolnjeni morajo biti vsi pogoji'; @@ -67,7 +68,6 @@ $labels['filterset'] = 'Nastavitev filtrov'; $labels['filtersets'] = 'Nastavitve filtrov'; $labels['filtersetadd'] = 'Dodaj nastavitev filtrov'; -$labels['filtersetdel'] = 'Izbriši trenutne nastavitve filtriranja'; $labels['filtersetact'] = 'Vključi trenutno nastavitev filtriranja'; $labels['filtersetdeact'] = 'Onemogoči trenutno nastavitev filtriranja'; $labels['filterseteditraw'] = 'Uredi nabor filtrov'; @@ -183,6 +183,11 @@ $labels['vacation.discard'] = 'Zavrži'; $labels['vacation.redirect'] = 'Preusmeri na'; $labels['vacation.copy'] = 'Pošlji kopijo na'; +$labels['forward.redirect'] = 'Preusmeri na'; +$labels['forward.copy'] = 'Pošlji kopijo na'; +$labels['forward.on'] = 'Vključeno'; +$labels['forward.off'] = 'Izključeno'; +$labels['forward.saving'] = 'Shranjevanje podatkov...'; $labels['filladdresses'] = 'Dopolni z mojimi naslovi'; $labels['arialabelfiltersetactions'] = 'Nastavitve operacij filtrov'; $labels['arialabelfilteractions'] = 'Operacije filtrov'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/sq_AL.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/sq_AL.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/sq_AL.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/sq_AL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Filtër i ri'; $labels['filteradd'] = 'Shtoni filtër'; $labels['filterdel'] = 'Fshije filtrin'; +$labels['rules'] = 'Rregulla'; +$labels['actions'] = 'Veprime'; +$labels['scope'] = 'Shtrirje'; $labels['moveup'] = 'Ngjitu sipër'; $labels['movedown'] = 'Ulu poshtë'; $labels['filterallof'] = 'që ka përputhje me krejt rregullat vijues'; @@ -38,6 +41,13 @@ $labels['filternotregex'] = 's’ka përputhje me shprehjen e rregullt'; $labels['filterunder'] = 'nën'; $labels['filterover'] = 'mbi'; +$labels['mime'] = 'MIME:'; +$labels['mimepart'] = 'Pjesë MIME:'; +$labels['mime-message'] = 'mesazh'; +$labels['mime-anychild'] = 'çfarëdo'; +$labels['mime-type'] = 'lloj'; +$labels['mime-subtype'] = 'nënlloj'; +$labels['mime-param'] = 'parametër'; $labels['addrule'] = 'Shtoni rregull'; $labels['delrule'] = 'Fshije rregullin'; $labels['messagemoveto'] = 'Kaloje mesazhin te'; @@ -66,17 +76,18 @@ $labels['filterset'] = 'Grup filtrash'; $labels['filtersets'] = 'Grupe filtrash'; $labels['filtersetadd'] = 'Shto grup filtrash'; -$labels['filtersetdel'] = 'Fshije grupin e tanishëm të filtrave'; +$labels['filtersetdel'] = 'Fshi grup filtrash'; $labels['filtersetact'] = 'Aktivizo grupin e tanishëm të filtrave'; $labels['filtersetdeact'] = 'Çaktivizo grupin e tanishëm të filtrave'; $labels['filterseteditraw'] = 'Përpunoni grup filtrash'; +$labels['filtersetswitch'] = 'Aktivizo/çaktivizo grup filtrash'; $labels['filterdef'] = 'Përkufizim filtri'; $labels['filtersetname'] = 'Emër grupi filtrash'; $labels['newfilterset'] = 'Grup i ri filtrash'; $labels['active'] = 'aktiv'; $labels['none'] = 'asnjë'; $labels['fromset'] = 'prej grupi'; -$labels['fromfile'] = 'prej skedari'; +$labels['fromfile'] = 'prej kartele'; $labels['filterdisabled'] = 'Filtër i çaktivizuar'; $labels['countisgreaterthan'] = 'numri është më i madh se'; $labels['countisgreaterthanequal'] = 'numri është më i madh ose baras me'; @@ -98,6 +109,7 @@ $labels['flaganswered'] = 'Me përgjigje'; $labels['flagflagged'] = 'Me shenjë'; $labels['flagdraft'] = 'Skicë'; +$labels['setvariable'] = 'Caktoni ndryshore'; $labels['setvarname'] = 'Emër ndryshoreje:'; $labels['setvarvalue'] = 'Vlerë ndryshoreje:'; $labels['setvarmodifiers'] = 'Modifikues:'; @@ -105,6 +117,7 @@ $labels['varupper'] = 'me të mëdha'; $labels['varlowerfirst'] = 'Shenja e parë me të vogla'; $labels['varupperfirst'] = 'shenja e parë me të mëdha'; +$labels['varquotewildcard'] = 'shenja speciale citimi'; $labels['varlength'] = 'gjatësi'; $labels['notify'] = 'Dërgo njoftim'; $labels['notifytarget'] = 'Objektiv njoftimi:'; @@ -150,6 +163,7 @@ $labels['modtype'] = 'lloj:'; $labels['allparts'] = 'krejt'; $labels['domain'] = 'përkatësi'; +$labels['localpart'] = 'pjesë lokale'; $labels['user'] = 'përdorues'; $labels['detail'] = 'hollësi'; $labels['comparator'] = 'krahasues:'; @@ -178,6 +192,14 @@ $labels['vacation.discard'] = 'Hidhe tej'; $labels['vacation.redirect'] = 'Ridrejtoje te'; $labels['vacation.copy'] = 'Dërgo kopje te'; +$labels['forward'] = 'Përcjellje'; +$labels['forward.redirect'] = 'Ridrejtoje te'; +$labels['forward.copy'] = 'Dërgo kopje te'; +$labels['forward.on'] = 'On'; +$labels['forward.off'] = 'Off'; +$labels['forward.status'] = 'Gjendje:'; +$labels['forward.action'] = 'Për postë mesazhe ardhës kryej veprimin vijues:'; +$labels['forward.saving'] = 'Po ruhen të dhënat…'; $labels['filladdresses'] = 'Plotësoje me krejt adresat e mia'; $labels['arialabelfiltersetactions'] = 'Veprime grupi filtrash'; $labels['arialabelfilteractions'] = 'Veprime filtri'; @@ -186,6 +208,7 @@ $labels['ariasummaryfiltersetslist'] = 'Listë grupe filtrash'; $labels['filterstitle'] = 'Përpunoni filtra për postë ardhëse'; $labels['vacationtitle'] = 'Përpunoni rregullin jashtë-zyre'; +$labels['forwardtitle'] = 'Përpunoni rregull përcjellje mesazhesh'; $labels['message'] = 'Mesazh'; $labels['duplicate'] = 'është përsëdytje'; $labels['notduplicate'] = 's’është përsëdytje'; @@ -229,6 +252,8 @@ $messages['invaliddateformat'] = 'Format i pavlefshëm date ose pjese date'; $messages['saveerror'] = 'S’arrihet të ruhen të dhëna. Ndodhi një gabim shërbyesi.'; $messages['vacationsaved'] = 'Data e pushimeve u ruajt me sukses.'; +$messages['forwardsaved'] = 'Të dhënat e përcjelljes u ruajtën me sukses.'; $messages['emptyvacationbody'] = 'Lënda e mesazhit të pushimeve është e domosdoshme!'; $messages['duplicate.conflict.err'] = 'S’lejohet përdorimi i njëkohshëm i kryes dhe identifikuesit unik.'; +$messages['disabledaction'] = 'Veprim jo i lejuar.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/sr_CS.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/sr_CS.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/sr_CS.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/sr_CS.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Нови филтер'; $labels['filteradd'] = 'Додај филтер'; $labels['filterdel'] = 'Обриши филтер'; +$labels['scope'] = 'Распон'; $labels['moveup'] = 'Помери горе'; $labels['movedown'] = 'Помери доле'; $labels['filterallof'] = 'поклопи сва ова правила'; @@ -49,6 +50,20 @@ $labels['messagediscard'] = 'Одбаци поруком'; $labels['messagekeep'] = 'Задржи поруку у примљеним'; $labels['messagesrules'] = 'За долазну пошту:'; +$labels['add'] = 'Додај'; +$labels['del'] = 'Обриши'; +$labels['sender'] = 'Пошиљалац'; +$labels['flagread'] = 'Читање'; +$labels['flagdeleted'] = 'Обрисано'; +$labels['flagflagged'] = 'Обележено'; +$labels['notifymethodmailto'] = 'Е-пошта'; +$labels['notifymethodtel'] = 'Телефон'; +$labels['datetest'] = 'Датум'; +$labels['advancedopts'] = 'Напредне опције'; +$labels['body'] = 'Тело'; +$labels['vacation.subject'] = 'Наслов'; +$labels['vacation.body'] = 'Тело'; +$labels['vacation.keep'] = 'Задржи'; $messages['filterunknownerror'] = 'Непозната грешка сервера.'; $messages['filterconnerror'] = 'Не могу да се повежем на сервер.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/sv_SE.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/sv_SE.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/sv_SE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/sv_SE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Nytt filter'; $labels['filteradd'] = 'Nytt filter'; $labels['filterdel'] = 'Ta bort filter'; +$labels['rules'] = 'Regler'; +$labels['actions'] = 'Funktioner'; +$labels['scope'] = 'Sökomfattning'; $labels['moveup'] = 'Flytta upp filter'; $labels['movedown'] = 'Flytta ner filter'; $labels['filterallof'] = 'Filtrera på alla följande regler'; @@ -38,6 +41,14 @@ $labels['filternotregex'] = 'inte matchar reguljärt uttryck'; $labels['filterunder'] = 'under'; $labels['filterover'] = 'över'; +$labels['mime'] = 'MIME:'; +$labels['mimepart'] = 'MIME-del:'; +$labels['mime-message'] = 'meddelande'; +$labels['mime-anychild'] = 'någon'; +$labels['mime-type'] = 'typ'; +$labels['mime-subtype'] = 'undertyp'; +$labels['mime-contenttype'] = 'innehållstyp'; +$labels['mime-param'] = 'parameter'; $labels['addrule'] = 'Lägg till regel'; $labels['delrule'] = 'Ta bort regel'; $labels['messagemoveto'] = 'Flytta meddelande till'; @@ -63,14 +74,15 @@ $labels['days'] = 'Dagar'; $labels['seconds'] = 'Sekunder'; $labels['rulestop'] = 'Avsluta filtrering'; -$labels['enable'] = 'Aktivera/avaktivera'; +$labels['enable'] = 'Aktivera/inaktivera'; $labels['filterset'] = 'Filtergrupp'; $labels['filtersets'] = 'Filtergrupper'; $labels['filtersetadd'] = 'Ny filtergrupp'; $labels['filtersetdel'] = 'Ta bort filtergrupp'; $labels['filtersetact'] = 'Aktivera filtergrupp'; -$labels['filtersetdeact'] = 'Avaktivera filtergrupp'; +$labels['filtersetdeact'] = 'Inaktivera filtergrupp'; $labels['filterseteditraw'] = 'Ändra filtergrupp'; +$labels['filtersetswitch'] = 'Aktivera/inaktivera filtergrupp'; $labels['filterdef'] = 'Filterdefinition'; $labels['filtersetname'] = 'Filtergruppsnamn'; $labels['newfilterset'] = 'Ny filtergrupp'; @@ -78,7 +90,7 @@ $labels['none'] = 'ingen'; $labels['fromset'] = 'från grupp'; $labels['fromfile'] = 'från fil'; -$labels['filterdisabled'] = 'Filter avaktiverat'; +$labels['filterdisabled'] = 'Filter inaktiverat'; $labels['countisgreaterthan'] = 'antal är större än'; $labels['countisgreaterthanequal'] = 'antal är större än eller lika med'; $labels['countislessthan'] = 'antal är mindre än'; @@ -183,6 +195,14 @@ $labels['vacation.discard'] = 'Förkasta'; $labels['vacation.redirect'] = 'Ändra mottagare till'; $labels['vacation.copy'] = 'Skicka kopia till'; +$labels['forward'] = 'Skickar vidare'; +$labels['forward.redirect'] = 'Ändra mottagare till'; +$labels['forward.copy'] = 'Skicka kopia till'; +$labels['forward.on'] = 'På'; +$labels['forward.off'] = 'Av'; +$labels['forward.status'] = 'Status:'; +$labels['forward.action'] = 'Utför följande åtgärd på inkommande meddelanden:'; +$labels['forward.saving'] = 'Sparar data...'; $labels['filladdresses'] = 'Fyll i alla mina mottagaradresser'; $labels['arialabelfiltersetactions'] = 'Hantera filtergrupper'; $labels['arialabelfilteractions'] = 'Hantera filter'; @@ -191,6 +211,7 @@ $labels['ariasummaryfiltersetslist'] = 'Lista med filtergrupper'; $labels['filterstitle'] = 'Ändra filter för inkommande meddelanden'; $labels['vacationtitle'] = 'Ändra regel för frånvaromeddelande'; +$labels['forwardtitle'] = 'Ändra regel för skicka vidare meddelande'; $labels['message'] = 'Meddelande'; $labels['duplicate'] = 'är duplikat'; $labels['notduplicate'] = 'är inte duplikat'; @@ -216,16 +237,16 @@ $messages['setdeactivateerror'] = 'Filtergruppen kunde inte deaktiveras på grund av serverfel'; $messages['setdeleteerror'] = 'Filtergruppen kunde inte tas bort på grund av serverfel'; $messages['setactivated'] = 'Filtergruppen är aktiverad'; -$messages['setdeactivated'] = 'Filtergruppen är avaktiverad'; +$messages['setdeactivated'] = 'Filtergruppen är inaktiverad'; $messages['setdeleted'] = 'Filtergruppen är borttagen'; $messages['setupdated'] = 'Filtergruppen är ändrad'; $messages['setdeleteconfirm'] = 'Vill du ta bort filtergruppen?'; $messages['setcreateerror'] = 'Filtergruppen kunde inte läggas till på grund av serverfel'; $messages['setcreated'] = 'Filtergruppen har lagts till'; $messages['activateerror'] = 'Kunde inte aktivera filter på grund av serverfel.'; -$messages['deactivateerror'] = 'Kunde inte avaktivera filter på grund av serverfel.'; -$messages['deactivated'] = 'Filter aktiverat.'; -$messages['activated'] = 'Filter avaktiverat.'; +$messages['deactivateerror'] = 'Kunde inte inaktivera filter på grund av serverfel.'; +$messages['deactivated'] = 'Filter inaktiverat.'; +$messages['activated'] = 'Filter aktiverat.'; $messages['moved'] = 'Filter flyttat.'; $messages['moveerror'] = 'Kunde inte flytta filter på grund av serverfel.'; $messages['nametoolong'] = 'För långt namn.'; @@ -235,6 +256,8 @@ $messages['invaliddateformat'] = 'Ogiltigt datum eller del av datumformat'; $messages['saveerror'] = 'Datan kunde inte sparas på grund av serverfel.'; $messages['vacationsaved'] = 'Frånvarodatan har sparats.'; +$messages['forwardsaved'] = 'Information för skicka vidare har sparats.'; $messages['emptyvacationbody'] = 'Text för frånvaromeddelande saknas!'; $messages['duplicate.conflict.err'] = 'Både huvud och unik identifikation är inte tillåtet.'; +$messages['disabledaction'] = 'Otillåten åtgärd.'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ta_IN.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ta_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ta_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ta_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,26 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Managesieve plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ +*/ +$labels['messagedelete'] = 'செய்தியை நீக்கு'; +$labels['del'] = 'நீக்கு'; +$labels['flagdeleted'] = 'நீக்கியது'; +$labels['flagflagged'] = 'நட்சத்திரமிட்டது'; +$labels['notifymethodmailto'] = 'மின்னஞ்சல்'; +$labels['datetest'] = 'தேதி'; +$labels['advancedopts'] = 'மேம்பட்ட விருப்பங்கள்'; +$labels['vacation.subject'] = 'தலைப்பு'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/th_TH.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/th_TH.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/th_TH.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/th_TH.inc 2018-04-11 11:14:33.000000000 +0000 @@ -16,17 +16,25 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ */ $labels['filters'] = 'ตัวกรองข้อมูล'; +$labels['managefilters'] = 'จัดการตัวกรองอีเมลขาเข้า'; $labels['filtername'] = 'ชื่อตัวกรองข้อมูล'; $labels['newfilter'] = 'สร้างตัวกรองข้อมูลใหม่'; $labels['filteradd'] = 'เพิ่มตัวกรองข้อมูล'; $labels['filterdel'] = 'ลบตัวกรองข้อมูล'; +$labels['scope'] = 'ขอบเขต'; $labels['moveup'] = 'เลื่อนขึ้น'; $labels['movedown'] = 'เลื่อนลง'; +$labels['filterallof'] = 'จับคู่กฎทั้งหมดต่อไปนี้'; +$labels['filteranyof'] = 'จับคู่กฎใด ๆ ต่อไปนี้'; $labels['filterany'] = 'ข้อความทั้งหมด'; $labels['filtercontains'] = 'ที่มีคำว่า'; $labels['filternotcontains'] = 'ไม่มีคำว่า'; $labels['filteris'] = 'ที่มีค่าเท่ากับ'; $labels['filterisnot'] = 'ที่มีค่าไม่เท่ากับ'; +$labels['filterexists'] = 'ที่มีอยู่'; +$labels['filternotexists'] = 'ไม่มีอยู่'; +$labels['filtermatches'] = 'ตรงกับนิพจน์'; +$labels['filternotmatches'] = 'ไม่ตรงกับนิพจน์'; $labels['addrule'] = 'เพิ่มกฏ'; $labels['delrule'] = 'ลบกฏ'; $labels['messagemoveto'] = 'ย้ายข้อความไปที่'; @@ -42,4 +50,15 @@ $labels['recipient'] = 'ผู้รับ'; $labels['vacationsubject'] = 'หัวเรื่องข้อความ:'; $labels['enable'] = 'เปิดใช้งาน/ปิดใช้งาน'; +$labels['flagread'] = 'อ่าน'; +$labels['flagdeleted'] = 'ลบแล้ว'; +$labels['flagflagged'] = 'ปักธง'; +$labels['notifymethodmailto'] = 'อีเมล์'; +$labels['notifymethodtel'] = 'โทรศัพท์'; +$labels['datetest'] = 'วันที่'; +$labels['advancedopts'] = 'ตัวเลือกขั้นสูง'; +$labels['body'] = 'เนื้อหา'; +$labels['vacation.subject'] = 'หัวจดหมาย'; +$labels['vacation.body'] = 'เนื้อหา'; +$labels['vacation.keep'] = 'เก็บ'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ti.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ti.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ti.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ti.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,24 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Managesieve plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ +*/ +$labels['del'] = 'ይጥፋእ'; +$labels['sender'] = 'ልኣኺ(ት)'; +$labels['flagread'] = 'ከንብብ'; +$labels['datetest'] = 'ዕለት'; +$labels['vacation.subject'] = 'ዋኒን'; +$labels['vacation.keep'] = 'ይፅናሕ'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/tr_TR.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/tr_TR.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/tr_TR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/tr_TR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = 'Yeni süzgeç'; $labels['filteradd'] = 'Süzgeç ekle'; $labels['filterdel'] = 'Süzgeci Sil'; +$labels['rules'] = 'Kurallar'; +$labels['actions'] = 'İşlemler'; +$labels['scope'] = 'Kapsam'; $labels['moveup'] = 'Yukarı taşı'; $labels['movedown'] = 'Aşağı taşı'; $labels['filterallof'] = 'Aşağıdaki kuralların hepsine uyan'; @@ -38,6 +41,14 @@ $labels['filternotregex'] = 'kurallı ifadeye uymayan'; $labels['filterunder'] = 'altında'; $labels['filterover'] = 'üzerinde'; +$labels['mime'] = 'MIME:'; +$labels['mimepart'] = 'MIME parçası:'; +$labels['mime-message'] = 'ileti'; +$labels['mime-anychild'] = 'tümü'; +$labels['mime-type'] = 'tür'; +$labels['mime-subtype'] = 'alt tür'; +$labels['mime-contenttype'] = 'içerik türü'; +$labels['mime-param'] = 'parametre'; $labels['addrule'] = 'Kural ekle'; $labels['delrule'] = 'Kuralı sil'; $labels['messagemoveto'] = 'İletiyi şuraya taşı'; @@ -67,10 +78,11 @@ $labels['filterset'] = 'Süzgeç kümesi'; $labels['filtersets'] = 'Süzgeç kümeleri'; $labels['filtersetadd'] = 'Süzgeç kümesi ekle'; -$labels['filtersetdel'] = 'Geçerli süzgeç kümesini sil'; +$labels['filtersetdel'] = 'Süzgeç kümesini sil'; $labels['filtersetact'] = 'Geçerli süzgeç kümesini etkinleştir'; $labels['filtersetdeact'] = 'Geçerli süzgeç kümesini devre dışı bırak'; $labels['filterseteditraw'] = 'Süzgeç kümesini düzenle'; +$labels['filtersetswitch'] = 'Süzgeç kümesini aç/kapat'; $labels['filterdef'] = 'Süzgeç tanımı'; $labels['filtersetname'] = 'Süzgeç kümesi adı'; $labels['newfilterset'] = 'Yeni süzgeç kümesi '; @@ -183,6 +195,14 @@ $labels['vacation.discard'] = 'Yoksay'; $labels['vacation.redirect'] = 'Şuraya yönlendir'; $labels['vacation.copy'] = 'Şuraya kopya gönder'; +$labels['forward'] = 'İletiliyor'; +$labels['forward.redirect'] = 'Şuraya yönlendir'; +$labels['forward.copy'] = 'Şuraya kopya gönder'; +$labels['forward.on'] = 'Etkin'; +$labels['forward.off'] = 'Devre dışı'; +$labels['forward.status'] = 'Durum:'; +$labels['forward.action'] = 'Gelen e-postalar için şu işlem yürütülsün:'; +$labels['forward.saving'] = 'Veriler kaydediliyor...'; $labels['filladdresses'] = 'Benim adreslerimle doldur'; $labels['arialabelfiltersetactions'] = 'Süzgeç kümesi işlemleri'; $labels['arialabelfilteractions'] = 'Süzgeç işlemleri'; @@ -191,6 +211,7 @@ $labels['ariasummaryfiltersetslist'] = 'Süzgeç kümesi listesi'; $labels['filterstitle'] = 'Gelen e-posta süzgeçlerini düzenle'; $labels['vacationtitle'] = 'Ofis dışında kuralını düzenle'; +$labels['forwardtitle'] = 'Posta iletme kuralını düzenle'; $labels['message'] = 'İleti'; $labels['duplicate'] = 'yinelenen'; $labels['notduplicate'] = 'yinelenmeyen'; @@ -235,6 +256,8 @@ $messages['invaliddateformat'] = 'Tarih ya da tarih biçimi geçersiz'; $messages['saveerror'] = 'Veri kaydedilemedi. Sunucuda bir sorun çıktı.'; $messages['vacationsaved'] = 'Tatil verisi kaydedildi.'; +$messages['forwardsaved'] = 'İletim verileri kaydedildi.'; $messages['emptyvacationbody'] = 'Tatil iletisi metnini yazmalısınız!'; $messages['duplicate.conflict.err'] = 'Üst bilgi ve tekil belirteç aynı anda kullanılamaz.'; +$messages['disabledaction'] = 'İşleme izin verilmiyor!'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/tzl.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/tzl.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/tzl.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/tzl.inc 2018-04-11 11:14:33.000000000 +0000 @@ -16,10 +16,12 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ */ $labels['filters'] = 'Strecureirs'; +$labels['messagedelete'] = 'Zeletarh el mensatx'; $labels['del'] = 'Zeletarh'; $labels['days'] = 'ziuas'; $labels['seconds'] = 'secunds'; $labels['active'] = 'actíu'; +$labels['flagread'] = 'Lirarh'; $labels['notifymethodmailto'] = 'Telepost'; $labels['...'] = '...'; $labels['datetest'] = 'Däts'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/uk_UA.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/uk_UA.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/uk_UA.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/uk_UA.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Новий фільтр'; $labels['filteradd'] = 'Додати фільтр'; $labels['filterdel'] = 'Вилучити фільтр'; +$labels['scope'] = 'Масштаб'; $labels['moveup'] = 'Пересунути вгору'; $labels['movedown'] = 'Пересунути вниз'; $labels['filterallof'] = 'задовольняє усі наступні умови'; @@ -67,7 +68,6 @@ $labels['filterset'] = 'Набір фільтрів'; $labels['filtersets'] = 'Набори фільтрів'; $labels['filtersetadd'] = 'Додати набір фільтрів'; -$labels['filtersetdel'] = 'Видалити поточний набір фільтрів'; $labels['filtersetact'] = 'Активувати поточний набір фільтрів'; $labels['filtersetdeact'] = 'Деактивувати поточний набір фільтрів'; $labels['filterdef'] = 'Параметри фільтру'; @@ -182,6 +182,11 @@ $labels['vacation.discard'] = 'Відкинути'; $labels['vacation.redirect'] = 'Перенаправити до '; $labels['vacation.copy'] = 'Надсилати копію до '; +$labels['forward.redirect'] = 'Перенаправити до '; +$labels['forward.copy'] = 'Надсилати копію до '; +$labels['forward.on'] = 'Увімкнено'; +$labels['forward.off'] = 'Вимкнено'; +$labels['forward.saving'] = 'Збереження даних…'; $labels['filladdresses'] = 'Заповнити усіма моїми адресами '; $labels['arialabelfiltersetactions'] = 'Дії набору фільтрів'; $labels['arialabelfilteractions'] = 'Дії фільтра'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ur_PK.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ur_PK.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/ur_PK.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/ur_PK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,21 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Managesieve plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ +*/ +$labels['sender'] = 'بھیجنے والا'; +$labels['flagdeleted'] = 'ختم ہو گیا'; +$labels['vacation.subject'] = 'مضمون'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/uz.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/uz.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/uz.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/uz.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,33 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Managesieve plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/ +*/ +$labels['scope'] = 'Viloyat'; +$labels['messagedelete'] = 'Savatga'; +$labels['add'] = 'Qo`shish'; +$labels['del'] = 'O`chirish'; +$labels['sender'] = 'Jo`natuvchi'; +$labels['flagread'] = 'O`qilgan'; +$labels['flagdeleted'] = 'O`chirilgan'; +$labels['flagflagged'] = 'Belgilangan'; +$labels['notifymethodmailto'] = 'E-Mail'; +$labels['notifymethodtel'] = 'Telefon'; +$labels['datetest'] = 'Sana'; +$labels['advancedopts'] = 'Qo`shimcha xossalar'; +$labels['body'] = 'Xat tarkibi'; +$labels['vacation.subject'] = 'Mavzu'; +$labels['vacation.body'] = 'Xat tarkibi'; +?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/vi_VN.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/vi_VN.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/vi_VN.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/vi_VN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = 'Bộ lọc mới'; $labels['filteradd'] = 'Thêm bộ lọc'; $labels['filterdel'] = 'Xóa bộ lọc'; +$labels['scope'] = 'Phạm vi'; $labels['moveup'] = 'Chuyển lên'; $labels['movedown'] = 'Chuyển xuống'; $labels['filterallof'] = 'Phù hợp với tất cả các qui luật sau đây'; @@ -65,7 +66,6 @@ $labels['filterset'] = 'Đặt các bộ lọc'; $labels['filtersets'] = 'Thiết lập bộ lọc'; $labels['filtersetadd'] = 'Thêm bộ lọc'; -$labels['filtersetdel'] = 'Xóa bộ lọc hiện tại'; $labels['filtersetact'] = 'Kích hoạt bộ lọc hiện tại'; $labels['filtersetdeact'] = 'Ngừng kích hoạt bộ lọc hiện tai'; $labels['filterdef'] = 'Định nghĩa bộ lọc'; @@ -170,6 +170,11 @@ $labels['vacation.interval'] = 'Khoảng thời gian trả lời'; $labels['vacation.after'] = 'Đặt quy định kỳ nghỉ sau'; $labels['vacation.saving'] = 'Lưu lại dữ liệu...'; +$labels['vacation.keep'] = 'Giữ'; +$labels['forward.on'] = 'Bật'; +$labels['forward.off'] = 'Tắt'; +$labels['forward.saving'] = 'Lưu lại dữ liệu...'; +$labels['duplicate.header'] = 'tiêu đề:'; $messages['filterunknownerror'] = 'Không tìm được lỗi máy chủ'; $messages['filterconnerror'] = 'Không kết nối được với máy chủ.'; $messages['filterdeleteerror'] = 'Không thể xóa bộ lọc. Xuất hiện lỗi ở máy chủ'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/zh_CN.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/zh_CN.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/zh_CN.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/zh_CN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,9 @@ $labels['newfilter'] = '新建过滤规则'; $labels['filteradd'] = '添加过滤规则'; $labels['filterdel'] = '删除过滤规则'; +$labels['rules'] = '规则'; +$labels['actions'] = '动作'; +$labels['scope'] = '范围'; $labels['moveup'] = '上移'; $labels['movedown'] = '下移'; $labels['filterallof'] = '匹配所有规则'; @@ -38,6 +41,14 @@ $labels['filternotregex'] = '不匹配正则表达式'; $labels['filterunder'] = '小于'; $labels['filterover'] = '大于'; +$labels['mime'] = 'MIME:'; +$labels['mimepart'] = 'MIME 部分:'; +$labels['mime-message'] = '消息'; +$labels['mime-anychild'] = '任意'; +$labels['mime-type'] = '类型'; +$labels['mime-subtype'] = '子类型'; +$labels['mime-contenttype'] = '内容类型'; +$labels['mime-param'] = '参数'; $labels['addrule'] = '新建规则'; $labels['delrule'] = '删除规则'; $labels['messagemoveto'] = '将邮件移至'; @@ -67,10 +78,11 @@ $labels['filterset'] = '过滤器设置'; $labels['filtersets'] = '过滤器设置集'; $labels['filtersetadd'] = '增加过滤器设置集'; -$labels['filtersetdel'] = '删除当前的过滤器设置集'; +$labels['filtersetdel'] = '删除过滤器设置集'; $labels['filtersetact'] = '激活当前的过滤器设置集'; $labels['filtersetdeact'] = '停用当前的过滤器设置集'; $labels['filterseteditraw'] = '编辑过滤器设置集'; +$labels['filtersetswitch'] = '启用/禁用过滤器集'; $labels['filterdef'] = '过滤器定义'; $labels['filtersetname'] = '过滤器集的名称'; $labels['newfilterset'] = '新的过滤器集'; @@ -183,6 +195,14 @@ $labels['vacation.discard'] = '丢弃'; $labels['vacation.redirect'] = '重定向到'; $labels['vacation.copy'] = '发送副本到'; +$labels['forward'] = '转发'; +$labels['forward.redirect'] = '重定向到'; +$labels['forward.copy'] = '发送副本到'; +$labels['forward.on'] = '开'; +$labels['forward.off'] = '关'; +$labels['forward.status'] = '状态:'; +$labels['forward.action'] = '对于来信执行如下动作:'; +$labels['forward.saving'] = '正在保存数据...'; $labels['filladdresses'] = '填入我的所有地址'; $labels['arialabelfiltersetactions'] = '过滤器集操作'; $labels['arialabelfilteractions'] = '过滤器操作'; @@ -191,6 +211,7 @@ $labels['ariasummaryfiltersetslist'] = '过滤器集列表'; $labels['filterstitle'] = '编辑传入邮件过滤器'; $labels['vacationtitle'] = '编辑非办公室规则'; +$labels['forwardtitle'] = '编辑邮件转发规则'; $labels['message'] = '消息'; $labels['duplicate'] = '是重复'; $labels['notduplicate'] = '是非重复'; @@ -235,6 +256,8 @@ $messages['invaliddateformat'] = '无效的日期或日期格式'; $messages['saveerror'] = '无法保存数据。发生服务器错误。'; $messages['vacationsaved'] = '假期数据保存成功。'; +$messages['forwardsaved'] = '转发数据保存成功'; $messages['emptyvacationbody'] = '假期消息必须有正文!'; $messages['duplicate.conflict.err'] = '不允许头和唯一标识符。'; +$messages['disabledaction'] = '不能执行此操作。'; ?> diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/zh_TW.inc roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/zh_TW.inc --- roundcube-1.3.3+dfsg.1/plugins/managesieve/localization/zh_TW.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/localization/zh_TW.inc 2018-04-11 11:14:33.000000000 +0000 @@ -21,6 +21,7 @@ $labels['newfilter'] = '建立新篩選'; $labels['filteradd'] = '加入篩選'; $labels['filterdel'] = '刪除篩選'; +$labels['scope'] = '範圍'; $labels['moveup'] = '上移'; $labels['movedown'] = '下移'; $labels['filterallof'] = '符合所有規則'; @@ -67,7 +68,6 @@ $labels['filterset'] = '篩選集合'; $labels['filtersets'] = '篩選集合'; $labels['filtersetadd'] = '加入篩選集合'; -$labels['filtersetdel'] = '刪除目前的篩選集合'; $labels['filtersetact'] = '啟用目前的篩選集合'; $labels['filtersetdeact'] = '停用目前的篩選集合'; $labels['filterseteditraw'] = '編輯篩選集合'; @@ -183,6 +183,11 @@ $labels['vacation.discard'] = '丟棄'; $labels['vacation.redirect'] = '重定向至'; $labels['vacation.copy'] = '傳送複本至'; +$labels['forward.redirect'] = '重定向至'; +$labels['forward.copy'] = '傳送複本至'; +$labels['forward.on'] = '開'; +$labels['forward.off'] = '關'; +$labels['forward.saving'] = '正在儲存資料...'; $labels['filladdresses'] = '填入我所有的位址'; $labels['arialabelfiltersetactions'] = '篩選集合動作'; $labels['arialabelfilteractions'] = '篩選動作'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/managesieve.php roundcube-1.3.6+dfsg.1/plugins/managesieve/managesieve.php --- roundcube-1.3.3+dfsg.1/plugins/managesieve/managesieve.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/managesieve.php 2018-04-11 11:14:33.000000000 +0000 @@ -189,9 +189,10 @@ */ function managesieve_actions() { + $uids = rcmail::get_uids(null, null, $multifolder, rcube_utils::INPUT_POST); + // handle fetching email headers for the new filter form - if ($uid = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST)) { - $uids = rcmail::get_uids(); + if (!empty($uids)) { $mailbox = key($uids); $message = new rcube_message($uids[$mailbox][0], $mailbox); $headers = $this->parse_headers($message->headers); diff -Nru roundcube-1.3.3+dfsg.1/plugins/managesieve/skins/classic/templates/seteditraw.html roundcube-1.3.6+dfsg.1/plugins/managesieve/skins/classic/templates/seteditraw.html --- roundcube-1.3.3+dfsg.1/plugins/managesieve/skins/classic/templates/seteditraw.html 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/managesieve/skins/classic/templates/seteditraw.html 2018-04-11 11:14:33.000000000 +0000 @@ -11,9 +11,11 @@
-

+

diff -Nru roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/bn_BD.inc roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/bn_BD.inc --- roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/bn_BD.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/bn_BD.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Mark-As-Junk plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-markasjunk/ +*/ +$labels['buttontext'] = 'আজেবাজে মেইল'; +?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/hi_IN.inc roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/hi_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/hi_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/hi_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Mark-As-Junk plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-markasjunk/ +*/ +$labels['buttontext'] = 'स्पैम'; +?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/ka_GE.inc roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/ka_GE.inc --- roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/ka_GE.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/ka_GE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Mark-As-Junk plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-markasjunk/ +*/ +$labels['buttontext'] = 'სპამი'; +?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/mr_IN.inc roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/mr_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/mr_IN.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/mr_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-markasjunk/ */ +$labels['buttontext'] = 'नको असलेले कचरा संदेश'; $labels['buttontitle'] = 'नको असलेला अशी खूण करा'; $labels['reportedasjunk'] = 'नको आहे असे यशस्वीरीत्या नक्की केले'; ?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/ms_MY.inc roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/ms_MY.inc --- roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/ms_MY.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/ms_MY.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Mark-As-Junk plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-markasjunk/ +*/ +$labels['buttontext'] = 'Junk'; +?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/ne_NP.inc roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/ne_NP.inc --- roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/ne_NP.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/ne_NP.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Mark-As-Junk plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-markasjunk/ +*/ +$labels['buttontext'] = 'स्पाम'; +?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/ps.inc roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/ps.inc --- roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/ps.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/ps.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Mark-As-Junk plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-markasjunk/ +*/ +$labels['buttontext'] = 'جنک'; +?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/si_LK.inc roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/si_LK.inc --- roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/si_LK.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/si_LK.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,6 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-markasjunk/ */ +$labels['buttontext'] = 'සුන්බුන්'; $labels['buttontitle'] = 'සුන්බුන් ලෙස සලකුණු කරන්න'; $labels['reportedasjunk'] = 'සුන්බුන් ලෙස වාර්තා කිරීම සාර්ථකයි'; ?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/ta_IN.inc roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/ta_IN.inc --- roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/ta_IN.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/ta_IN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Mark-As-Junk plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-markasjunk/ +*/ +$labels['buttontext'] = 'எரிதம்'; +?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/ti.inc roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/ti.inc --- roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/ti.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/ti.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Mark-As-Junk plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-markasjunk/ +*/ +$labels['buttontext'] = 'እንዳቅንጠመንጢ'; +?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/uz.inc roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/uz.inc --- roundcube-1.3.3+dfsg.1/plugins/markasjunk/localization/uz.inc 1970-01-01 00:00:00.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/markasjunk/localization/uz.inc 2018-04-11 11:14:33.000000000 +0000 @@ -0,0 +1,19 @@ +.inc | + | | + | Localization file of the Roundcube Webmail Mark-As-Junk plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-markasjunk/ +*/ +$labels['buttontext'] = 'SPAM'; +?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/markasjunk/markasjunk.php roundcube-1.3.6+dfsg.1/plugins/markasjunk/markasjunk.php --- roundcube-1.3.3+dfsg.1/plugins/markasjunk/markasjunk.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/markasjunk/markasjunk.php 2018-04-11 11:14:33.000000000 +0000 @@ -62,7 +62,7 @@ $rcmail = rcmail::get_instance(); $storage = $rcmail->get_storage(); - foreach (rcmail::get_uids() as $mbox => $uids) { + foreach (rcmail::get_uids(null, null, $multifolder, rcube_utils::INPUT_POST) as $mbox => $uids) { $storage->unset_flag($uids, 'NONJUNK', $mbox); $storage->set_flag($uids, 'JUNK', $mbox); } diff -Nru roundcube-1.3.3+dfsg.1/plugins/newmail_notifier/localization/eu_ES.inc roundcube-1.3.6+dfsg.1/plugins/newmail_notifier/localization/eu_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/newmail_notifier/localization/eu_ES.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/newmail_notifier/localization/eu_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,7 +19,7 @@ $labels['desktop'] = 'Bistaratu sistemaren jakinarazpenak mezu berrian'; $labels['sound'] = 'Jo soinu bat mezu berriarekin'; $labels['test'] = 'Testa'; -$labels['title'] = 'ePosta berria'; +$labels['title'] = 'E-posta berria'; $labels['body'] = 'Mezu berria jaso duzu'; $labels['testbody'] = 'Hau jakinarazpen proba bat da'; $labels['desktopdisabled'] = 'Sistemaren jakinarazpenak ezgaituak daude zure nabigatzailean'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/password/localization/cs_CZ.inc roundcube-1.3.6+dfsg.1/plugins/password/localization/cs_CZ.inc --- roundcube-1.3.3+dfsg.1/plugins/password/localization/cs_CZ.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/password/localization/cs_CZ.inc 2018-04-11 11:14:33.000000000 +0000 @@ -31,3 +31,8 @@ $messages['passwordforbidden'] = 'Heslo obsahuje nepovolené znaky.'; $messages['firstloginchange'] = 'Vaše první přihlášení, změňte si prosím heslo.'; $messages['disablednotice'] = 'Z důvodu údržby systému není momentálně možné změnit heslo. Za chvíli by mělo být vše v pořádku, omlouváme se za tuto nepříjemnost.'; +$messages['passwinhistory'] = 'Toto heslo již bylo v minulosti použito.'; +$messages['samepasswd'] = 'Nové heslo musí být odlišné od předchozího.'; +$messages['passwdexpirewarning'] = 'Varování! Vaše heslo bude brzy zneplatněno, změňte ho před $expirationdatetime.'; +$messages['passwdexpired'] = 'Vaše heslo bylo zneplatněno, musíte ho nyní změnit!'; +$messages['passwdconstraintviolation'] = ' Nesplnění nutných pravidel pro heslo. Heslo je zrejmě příliš slabé.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/password/localization/eu_ES.inc roundcube-1.3.6+dfsg.1/plugins/password/localization/eu_ES.inc --- roundcube-1.3.3+dfsg.1/plugins/password/localization/eu_ES.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/password/localization/eu_ES.inc 2018-04-11 11:14:33.000000000 +0000 @@ -15,10 +15,10 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-password/ */ -$labels['changepasswd'] = 'Pasahitza aldatu'; +$labels['changepasswd'] = 'Aldatu pasahitza'; $labels['curpasswd'] = 'Oraingo pasahitza:'; $labels['newpasswd'] = 'Pasahitz berria:'; -$labels['confpasswd'] = 'Konfirmatu pasahitz berria:'; +$labels['confpasswd'] = 'Baieztatu pasahitz berria:'; $messages['nopassword'] = 'Sartu pasahitz berria.'; $messages['nocurpassword'] = 'Sartu oraingo pasahitza.'; $messages['passwordincorrect'] = 'Oraingo pasahitza ez da zuzena.'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/cs_CZ.inc roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/cs_CZ.inc --- roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/cs_CZ.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/cs_CZ.inc 2018-04-11 11:14:33.000000000 +0000 @@ -17,4 +17,7 @@ */ $labels['addvcardmsg'] = 'Přidat vCard do adresáře'; $labels['vcardsavefailed'] = 'Nelze uložit vCard'; +$labels['attachvcard'] = 'Připojit vCard'; +$labels['vcardattached'] = 'vCard soubor připojen.'; +$labels['vcard'] = 'vCard'; ?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/de_DE.inc roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/de_DE.inc --- roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/de_DE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/de_DE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -18,5 +18,6 @@ $labels['addvcardmsg'] = 'Kontakt im Adressbuch speichern'; $labels['vcardsavefailed'] = 'Der Kontakt konnte nicht gespeichert werden'; $labels['attachvcard'] = 'vCard anhängen'; +$labels['vcardattached'] = 'vCard-Datei angehängt.'; $labels['vcard'] = 'vCard'; ?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/lt_LT.inc roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/lt_LT.inc --- roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/lt_LT.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/lt_LT.inc 2018-04-11 11:14:33.000000000 +0000 @@ -18,5 +18,6 @@ $labels['addvcardmsg'] = 'Įtraukti vizitinę kortelę į adresų knygą'; $labels['vcardsavefailed'] = 'Įrašyti vizitinės kortelės nepavyko'; $labels['attachvcard'] = 'Pridėti vCard'; +$labels['vcardattached'] = 'vCard failas pridėtas.'; $labels['vcard'] = 'vCard'; ?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/lv_LV.inc roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/lv_LV.inc --- roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/lv_LV.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/lv_LV.inc 2018-04-11 11:14:33.000000000 +0000 @@ -18,5 +18,6 @@ $labels['addvcardmsg'] = 'Pievienot vizītkarti adrešu grāmatai'; $labels['vcardsavefailed'] = 'Nevarēja saglabāt vizītkarti'; $labels['attachvcard'] = 'Pievienot vCard'; +$labels['vcardattached'] = 'vCard fails pievienots.'; $labels['vcard'] = 'vCard'; ?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/pt_PT.inc roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/pt_PT.inc --- roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/pt_PT.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/pt_PT.inc 2018-04-11 11:14:33.000000000 +0000 @@ -18,5 +18,6 @@ $labels['addvcardmsg'] = 'Adicionar o vCard ao Livro de Endereços'; $labels['vcardsavefailed'] = 'Não foi possível guardar o vCard'; $labels['attachvcard'] = 'Anexar vCard'; +$labels['vcardattached'] = 'Ficheiro vCard anexado.'; $labels['vcard'] = 'vCard'; ?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/sq_AL.inc roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/sq_AL.inc --- roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/sq_AL.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/sq_AL.inc 2018-04-11 11:14:33.000000000 +0000 @@ -18,5 +18,6 @@ $labels['addvcardmsg'] = 'Shtoje vCard-in te libër adresash'; $labels['vcardsavefailed'] = 'S’arrihet të ruhet vCard-i'; $labels['attachvcard'] = 'Bashkëngjitni vCard'; +$labels['vcardattached'] = 'Kartela vCard u bashkëngjit.'; $labels['vcard'] = 'vCard'; ?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/sv_SE.inc roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/sv_SE.inc --- roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/sv_SE.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/sv_SE.inc 2018-04-11 11:14:33.000000000 +0000 @@ -18,5 +18,6 @@ $labels['addvcardmsg'] = 'Lägg till vCard i adressbok'; $labels['vcardsavefailed'] = 'Kunde inte spara vCard'; $labels['attachvcard'] = 'Bifoga vCard'; +$labels['vcardattached'] = 'vCard-fil bifogad.'; $labels['vcard'] = 'vCard'; ?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/tr_TR.inc roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/tr_TR.inc --- roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/tr_TR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/tr_TR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -18,5 +18,6 @@ $labels['addvcardmsg'] = 'Adres defterine vCard ekle'; $labels['vcardsavefailed'] = 'vCard kaydedilemedi'; $labels['attachvcard'] = 'vCard Ekle'; +$labels['vcardattached'] = 'vCard dosyası eklendi.'; $labels['vcard'] = 'vCard'; ?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/zh_CN.inc roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/zh_CN.inc --- roundcube-1.3.3+dfsg.1/plugins/vcard_attachments/localization/zh_CN.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/vcard_attachments/localization/zh_CN.inc 2018-04-11 11:14:33.000000000 +0000 @@ -17,4 +17,6 @@ */ $labels['addvcardmsg'] = '添加 vCard 至地址簿中'; $labels['vcardsavefailed'] = '无法保存 vCard'; +$labels['attachvcard'] = '附加 vCard'; +$labels['vcard'] = 'vCard'; ?> \ No newline at end of file diff -Nru roundcube-1.3.3+dfsg.1/plugins/zipdownload/localization/pt_BR.inc roundcube-1.3.6+dfsg.1/plugins/zipdownload/localization/pt_BR.inc --- roundcube-1.3.3+dfsg.1/plugins/zipdownload/localization/pt_BR.inc 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/zipdownload/localization/pt_BR.inc 2018-04-11 11:14:33.000000000 +0000 @@ -19,4 +19,4 @@ $labels['download'] = 'Baixar...'; $labels['downloadmbox'] = 'Formato mbox (.zip)'; $labels['downloadmaildir'] = 'Formato maildir (.zip)'; -$labels['downloademl'] = 'Original (.eml)'; +$labels['downloademl'] = 'Fonte (.eml)'; diff -Nru roundcube-1.3.3+dfsg.1/plugins/zipdownload/zipdownload.php roundcube-1.3.6+dfsg.1/plugins/zipdownload/zipdownload.php --- roundcube-1.3.3+dfsg.1/plugins/zipdownload/zipdownload.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/plugins/zipdownload/zipdownload.php 2018-04-11 11:14:33.000000000 +0000 @@ -175,8 +175,8 @@ { $rcmail = rcmail::get_instance(); - if ($rcmail->config->get('zipdownload_selection') && !empty($_POST['_uid'])) { - $messageset = rcmail::get_uids(); + if ($rcmail->config->get('zipdownload_selection')) { + $messageset = rcmail::get_uids(null, null, $multi, rcube_utils::INPUT_POST); if (count($messageset)) { $this->_download_messages($messageset); } diff -Nru roundcube-1.3.3+dfsg.1/program/include/iniset.php roundcube-1.3.6+dfsg.1/program/include/iniset.php --- roundcube-1.3.3+dfsg.1/program/include/iniset.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/program/include/iniset.php 2018-04-11 11:14:34.000000000 +0000 @@ -21,7 +21,7 @@ */ // application constants -define('RCMAIL_VERSION', '1.3.3'); +define('RCMAIL_VERSION', '1.3.6'); define('RCMAIL_START', microtime(true)); if (!defined('INSTALL_PATH')) { diff -Nru roundcube-1.3.3+dfsg.1/program/include/rcmail_output_html.php roundcube-1.3.6+dfsg.1/program/include/rcmail_output_html.php --- roundcube-1.3.3+dfsg.1/program/include/rcmail_output_html.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/program/include/rcmail_output_html.php 2018-04-11 11:14:34.000000000 +0000 @@ -68,7 +68,6 @@ $this->devel_mode = $this->config->get('devel_mode'); $this->set_env('task', $task); - $this->set_env('x_frame_options', $this->config->get('x_frame_options', 'sameorigin')); $this->set_env('standard_windows', (bool) $this->config->get('standard_windows')); $this->set_env('locale', $_SESSION['language']); $this->set_env('devel_mode', $this->devel_mode); diff -Nru roundcube-1.3.3+dfsg.1/program/include/rcmail_output_json.php roundcube-1.3.6+dfsg.1/program/include/rcmail_output_json.php --- roundcube-1.3.3+dfsg.1/program/include/rcmail_output_json.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/program/include/rcmail_output_json.php 2018-04-11 11:14:34.000000000 +0000 @@ -232,7 +232,7 @@ $response = $hook['response']; unset($hook['response']); - echo self::json_serialize($response, $this->devel_mode); + echo self::json_serialize($response, $this->devel_mode, false); } /** @@ -245,7 +245,7 @@ foreach ($this->commands as $i => $args) { $method = array_shift($args); foreach ($args as $i => $arg) { - $args[$i] = self::json_serialize($arg, $this->devel_mode); + $args[$i] = self::json_serialize($arg, $this->devel_mode, false); } $out .= sprintf( diff -Nru roundcube-1.3.3+dfsg.1/program/include/rcmail.php roundcube-1.3.6+dfsg.1/program/include/rcmail.php --- roundcube-1.3.3+dfsg.1/program/include/rcmail.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/program/include/rcmail.php 2018-04-11 11:14:34.000000000 +0000 @@ -606,8 +606,10 @@ // Here we need IDNA ASCII // Only rcube_contacts class is using domain names in Unicode - $host = rcube_utils::idn_to_ascii($host); - $username = rcube_utils::idn_to_ascii($username); + $host = rcube_utils::idn_to_ascii($host); + if (strpos($username, '@')) { + $username = rcube_utils::idn_to_ascii($username); + } // user already registered -> overwrite username if ($user = rcube_user::query($username, $host)) { @@ -2393,16 +2395,17 @@ * @param string $uids UID value to decode * @param string $mbox Default mailbox value (if not encoded in UIDs) * @param bool $is_multifolder Will be set to True if multi-folder request + * @param int $mode Request mode. Default: rcube_utils::INPUT_GPC. * * @return array List of message UIDs per folder */ - public static function get_uids($uids = null, $mbox = null, &$is_multifolder = false) + public static function get_uids($uids = null, $mbox = null, &$is_multifolder = false, $mode = null) { // message UID (or comma-separated list of IDs) is provided in // the form of -[,-]* - $_uid = $uids ?: rcube_utils::get_input_value('_uid', rcube_utils::INPUT_GPC); - $_mbox = $mbox ?: (string) rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_GPC); + $_uid = $uids ?: rcube_utils::get_input_value('_uid', $mode ?: rcube_utils::INPUT_GPC); + $_mbox = $mbox ?: (string) rcube_utils::get_input_value('_mbox', $mode ?: rcube_utils::INPUT_GPC); // already a hash array if (is_array($_uid) && !isset($_uid[0])) { @@ -2421,8 +2424,9 @@ } } else { - if (is_string($_uid)) + if (is_string($_uid)) { $_uid = explode(',', $_uid); + } // create a per-folder UIDs array foreach ((array)$_uid as $uid) { @@ -2437,7 +2441,7 @@ if ($uid == '*') { $result[$mbox] = $uid; } - else { + else if (preg_match('/^[0-9:.]+$/', $uid)) { $result[$mbox][] = $uid; } } diff -Nru roundcube-1.3.3+dfsg.1/program/js/app.js roundcube-1.3.6+dfsg.1/program/js/app.js --- roundcube-1.3.3+dfsg.1/program/js/app.js 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/program/js/app.js 2018-04-11 11:14:34.000000000 +0000 @@ -175,24 +175,6 @@ for (n in this.gui_objects) this.gui_objects[n] = rcube_find_object(this.gui_objects[n]); - // clickjacking protection - if (n = this.env.x_frame_options) { - try { - // bust frame if not allowed - if (n.toLowerCase() == 'deny' && top.location.href != self.location.href) - top.location.href = self.location.href; - else if (/^allow-from[\s\t]+(.+)$/i.test(n) && RegExp.$1.indexOf(top.location.origin) != 0) - throw 1; - else if (top.location.hostname != self.location.hostname) - throw 1; - } catch (e) { - // possible clickjacking attack: disable all form elements - $('form').each(function(){ ref.lock_form(this, true); }); - this.display_message("Blocked: possible clickjacking attack!", 'error'); - return; - } - } - // init registered buttons this.init_buttons(); diff -Nru roundcube-1.3.3+dfsg.1/program/js/editor.js roundcube-1.3.6+dfsg.1/program/js/editor.js --- roundcube-1.3.3+dfsg.1/program/js/editor.js 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/program/js/editor.js 2018-04-11 11:14:34.000000000 +0000 @@ -47,6 +47,7 @@ statusbar: false, toolbar_items_size: 'small', extended_valid_elements: 'font[face|size|color|style],span[id|class|align|style]', + fontsize_formats: '8pt 9pt 10pt 11pt 12pt 14pt 18pt 24pt 36pt', relative_urls: false, remove_script_host: false, convert_urls: false, // #1486944 @@ -436,7 +437,7 @@ // replace selection in compose textarea else if (ed = rcube_find_object(this.id)) { var selection = $(ed).is(':focus') ? rcmail.get_input_selection(ed) : {start: 0, end: 0}, - value = ed.value; + value = ed.value, pre = value.substring(0, selection.start), end = value.substring(selection.end, value.length); diff -Nru roundcube-1.3.3+dfsg.1/program/lib/Roundcube/bootstrap.php roundcube-1.3.6+dfsg.1/program/lib/Roundcube/bootstrap.php --- roundcube-1.3.3+dfsg.1/program/lib/Roundcube/bootstrap.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/program/lib/Roundcube/bootstrap.php 2018-04-11 11:14:34.000000000 +0000 @@ -53,7 +53,7 @@ } // framework constants -define('RCUBE_VERSION', '1.3.3'); +define('RCUBE_VERSION', '1.3.6'); define('RCUBE_CHARSET', 'UTF-8'); if (!defined('RCUBE_LIB_DIR')) { diff -Nru roundcube-1.3.3+dfsg.1/program/lib/Roundcube/rcube_addressbook.php roundcube-1.3.6+dfsg.1/program/lib/Roundcube/rcube_addressbook.php --- roundcube-1.3.3+dfsg.1/program/lib/Roundcube/rcube_addressbook.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/program/lib/Roundcube/rcube_addressbook.php 2018-04-11 11:14:34.000000000 +0000 @@ -654,13 +654,16 @@ */ public static function compose_contact_key($contact, $sort_col) { - $key = $contact[$sort_col] . ':' . $contact['sourceid']; + $key = $contact[$sort_col]; // add email to a key to not skip contacts with the same name (#1488375) if (($email = self::get_col_values('email', $contact, true)) && !empty($email)) { $key .= ':' . implode(':', (array)$email); } + // Make the key really unique (as we e.g. support contacts with no email) + $key .= ':' . $contact['sourceid'] . ':' . $contact['ID']; + return $key; } diff -Nru roundcube-1.3.3+dfsg.1/program/lib/Roundcube/rcube_config.php roundcube-1.3.6+dfsg.1/program/lib/Roundcube/rcube_config.php --- roundcube-1.3.3+dfsg.1/program/lib/Roundcube/rcube_config.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/program/lib/Roundcube/rcube_config.php 2018-04-11 11:14:34.000000000 +0000 @@ -109,13 +109,13 @@ // array requires hint to be passed. - if (preg_match('/^[-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?$/', $value) !== false) { + if (preg_match('/^[-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?$/', $value)) { $type = 'double'; } - else if (preg_match('/^\d+$/', $value) !== false) { + else if (preg_match('/^\d+$/', $value)) { $type = 'integer'; } - else if (preg_match('/(t(rue)?)|(f(alse)?)/i', $value) !== false) { + else if (preg_match('/^(t(rue)?)|(f(alse)?)$/i', $value)) { $type = 'boolean'; } diff -Nru roundcube-1.3.3+dfsg.1/program/lib/Roundcube/rcube_image.php roundcube-1.3.6+dfsg.1/program/lib/Roundcube/rcube_image.php --- roundcube-1.3.3+dfsg.1/program/lib/Roundcube/rcube_image.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/program/lib/Roundcube/rcube_image.php 2018-04-11 11:14:34.000000000 +0000 @@ -256,9 +256,9 @@ imagecopyresampled($new_image, $image, 0, 0, 0, 0, $width, $height, $props['width'], $props['height']); $image = $new_image; - // fix rotation of image if EXIF data exists and specifies rotation (GD strips the EXIF data) + // fix orientation of image if EXIF data exists and specifies orientation (GD strips the EXIF data) if ($this->image_file && $type == 'jpg' && function_exists('exif_read_data')) { - $exif = exif_read_data($this->image_file); + $exif = @exif_read_data($this->image_file); if ($exif && $exif['Orientation']) { switch ($exif['Orientation']) { case 3: diff -Nru roundcube-1.3.3+dfsg.1/program/lib/Roundcube/rcube_imap_generic.php roundcube-1.3.6+dfsg.1/program/lib/Roundcube/rcube_imap_generic.php --- roundcube-1.3.3+dfsg.1/program/lib/Roundcube/rcube_imap_generic.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/program/lib/Roundcube/rcube_imap_generic.php 2018-04-11 11:14:34.000000000 +0000 @@ -3733,7 +3733,7 @@ } // parse untagged response for [COPYUID 1204196876 3456:3457 123:124] (RFC6851) - if ($line && $command == 'UID MOVE' && substr_compare($line, '* OK', 0, 4, true)) { + if ($line && $command == 'UID MOVE') { if (preg_match("/^\* OK \[COPYUID [0-9]+ ([0-9,:]+) ([0-9,:]+)\]/i", $line, $m)) { $this->data['COPYUID'] = array($m[1], $m[2]); } @@ -3878,16 +3878,15 @@ { // given a comma delimited list of independent mid's, // compresses by grouping sequences together - if (!is_array($messages)) { // if less than 255 bytes long, let's not bother - if (!$force && strlen($messages)<255) { - return $messages; + if (!$force && strlen($messages) < 255) { + return preg_match('/[^0-9:,*]/', $messages) ? 'INVALID' : $messages; } // see if it's already been compressed if (strpos($messages, ':') !== false) { - return $messages; + return preg_match('/[^0-9:,*]/', $messages) ? 'INVALID' : $messages; } // separate, then sort @@ -3922,7 +3921,9 @@ } // return as comma separated string - return implode(',', $result); + $result = implode(',', $result); + + return preg_match('/[^0-9:,*]/', $result) ? 'INVALID' : $result; } /** diff -Nru roundcube-1.3.3+dfsg.1/program/lib/Roundcube/rcube_ldap.php roundcube-1.3.6+dfsg.1/program/lib/Roundcube/rcube_ldap.php --- roundcube-1.3.3+dfsg.1/program/lib/Roundcube/rcube_ldap.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/program/lib/Roundcube/rcube_ldap.php 2018-04-11 11:14:34.000000000 +0000 @@ -171,12 +171,14 @@ $this->coltypes['address'] = array( 'limit' => max(1, $this->coltypes['locality']['limit'] + $this->coltypes['address']['limit']), 'subtypes' => array_merge((array)$this->coltypes['address']['subtypes'], (array)$this->coltypes['locality']['subtypes']), - 'childs' => array(), + 'childs' => array(), + 'attributes' => array(), ) + (array)$this->coltypes['address']; foreach (array('street','locality','zipcode','region','country') as $childcol) { if ($this->coltypes[$childcol]) { $this->coltypes['address']['childs'][$childcol] = array('type' => 'text'); + $this->coltypes['address']['attributes'] = array_merge($this->coltypes['address']['attributes'], $this->coltypes[$childcol]['attributes']); unset($this->coltypes[$childcol]); // remove address child col from global coltypes list } } diff -Nru roundcube-1.3.3+dfsg.1/program/lib/Roundcube/rcube_mime.php roundcube-1.3.6+dfsg.1/program/lib/Roundcube/rcube_mime.php --- roundcube-1.3.3+dfsg.1/program/lib/Roundcube/rcube_mime.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/program/lib/Roundcube/rcube_mime.php 2018-04-11 11:14:34.000000000 +0000 @@ -212,9 +212,21 @@ // Decode and join encoded-word's chunks if ($encoding == 'B' || $encoding == 'b') { - // base64 must be decoded a segment at a time - for ($i=0; $i<$count; $i++) - $text .= base64_decode($tmp[$i]); + $rest = ''; + // base64 must be decoded a segment at a time. + // However, there are broken implementations that continue + // in the following word, we'll handle that (#6048) + for ($i=0; $i<$count; $i++) { + $chunk = $rest . $tmp[$i]; + $length = strlen($chunk); + if ($length % 4) { + $length = floor($length / 4) * 4; + $rest = substr($chunk, $length); + $chunk = substr($chunk, 0, $length); + } + + $text .= base64_decode($chunk); + } } else { //if ($encoding == 'Q' || $encoding == 'q') { // quoted printable can be combined and processed at once diff -Nru roundcube-1.3.3+dfsg.1/program/lib/Roundcube/rcube_output.php roundcube-1.3.6+dfsg.1/program/lib/Roundcube/rcube_output.php --- roundcube-1.3.3+dfsg.1/program/lib/Roundcube/rcube_output.php 2017-11-08 18:42:58.000000000 +0000 +++ roundcube-1.3.6+dfsg.1/program/lib/Roundcube/rcube_output.php 2018-04-11 11:14:34.000000000 +0000 @@ -267,14 +267,22 @@ * * @param mixed $input Input value * @param boolean $pretty Enable JSON formatting + * @param boolean $inline Enable inline mode (generates output safe for use inside HTML) * * @return string Serialized JSON string */ - public static function json_serialize($input, $pretty = false) + public static function json_serialize($input, $pretty = false, $inline = true) { + // The input need to be valid UTF-8 to use with json_encode() $input = rcube_charset::clean($input); $options = 0; + // JSON_HEX_TAG is needed for inlining JSON inside of the