@zip.js/zip.js 2.13.0 → 2.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BENCHMARKS.md +46 -1
- package/deno.json +1 -1
- package/dist/zip-core-external.js +594 -935
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +461 -908
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +601 -938
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +468 -911
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +601 -938
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +470 -913
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +604 -941
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +463 -910
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-module.wasm +0 -0
- package/dist/zip-native.js +463 -910
- package/dist/zip-native.min.js +1 -1
- package/dist/zip-web-worker-native.js +1 -1
- package/dist/zip-web-worker.js +1 -1
- package/dist/zip.js +597 -938
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +470 -913
- package/index-native.min.js +1 -1
- package/index.cjs +604 -941
- package/index.d.cts +58 -12
- package/index.d.ts +58 -12
- package/index.min.js +1 -1
- package/lib/core/codec-worker-web.js +35 -11
- package/lib/core/codec-worker.js +33 -23
- package/lib/core/io.js +29 -21
- package/lib/core/streams/aes-crypto-stream.js +58 -99
- package/lib/core/streams/codecs/aes-hmac-sha1.js +348 -0
- package/lib/core/streams/zlib-wasm/aes-hmac-sha1-wasm.js +106 -0
- package/lib/core/streams/zlib-wasm/zlib-streams-loader.js +4 -0
- package/lib/core/streams/zlib-wasm/zlib-streams.wasm +0 -0
- package/lib/core/version.js +1 -1
- package/lib/core/web-worker-base.js +15 -9
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/web-worker-wasm.js +2 -0
- package/lib/core/zip-fs.js +7 -3
- package/lib/core/zip-writer.js +1 -2
- package/lib/core/zlib-streams-inline.js +1 -1
- package/lib/zip-module-wasm-base.js +3 -1
- package/package.json +1 -1
- package/lib/core/streams/codecs/sjcl.js +0 -795
package/index.cjs
CHANGED
|
@@ -439,7 +439,7 @@ function resetConfiguration() {
|
|
|
439
439
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
440
440
|
}
|
|
441
441
|
|
|
442
|
-
const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let r='!function(t){"function"==typeof define&&define.amd?define(t):t()}(function(){"use strict";const{Array:t,Object:n,Number:e,Math:r,Error:s,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:u,Promise:l,TextEncoder:w,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;t<256;t++){let n=t;for(let t=0;t<8;t++)n=1&n?n>>>1^3988292384:n>>>1;C[0][t]=n}for(let t=0;t<256;t++)for(let n=1;n<8;n++){const e=C[n-1][t];C[n][t]=e>>>8^C[0][255&e]}const[I,A,x,M,P,B,D,F]=C;class R{constructor(t){this.o=t||-1}append(t){let n=0|this.o;const e=0|t.length;let r=0;if(e>=8&&t.buffer){const s=new u(t.buffer,t.byteOffset,e),o=e-8;for(;r<=o;r+=8){const t=n^s.getInt32(r,!0),e=s.getInt32(r+4,!0);n=F[255&t]^D[t>>>8&255]^B[t>>>16&255]^P[t>>>24&255]^M[255&e]^x[e>>>8&255]^A[e>>>16&255]^I[e>>>24&255]}}for(;r<e;r++)n=n>>>8^I[255&(n^t[r])];this.o=n}get(){return~this.o}}class U extends d{constructor(){let t;const n=new R;super({transform(t,e){n.append(t),e.enqueue(t)},flush(){const e=new o(4);new u(e.buffer).setUint32(0,n.get()),t.value=e}}),t=this}}function V(t,n){const e=new o(t.length+n.length);return e.set(t),e.set(n,t.length),e}function W(t){return new u(t.buffer,t.byteOffset,t.byteLength)}const _={concat(t,n){if(0===t.length||0===n.length)return t.concat(n);const e=t[t.length-1],r=_.l(e);return 32===r?t.concat(n):_.h(n,r,0|e,t.slice(0,t.length-1))},bitLength(t){const n=t.length;if(0===n)return 0;const e=t[n-1];return 32*(n-1)+_.l(e)},m(t,n){if(32*t.length<n)return t;const e=(t=t.slice(0,r.ceil(n/32))).length;return n&=31,e>0&&n&&(t[e-1]=_.S(n,t[e-1]&2147483648>>n-1,1)),t},S:(t,n,e)=>32===t?n:(e?0|n:n<<32-t)+1099511627776*t,l:t=>r.round(t/1099511627776)||32,h(t,n,e,r){for(void 0===r&&(r=[]);n>=32;n-=32)r.push(e),e=0;if(0===n)return r.concat(t);for(let s=0;s<t.length;s++)r.push(e|t[s]>>>n),e=t[s]<<32-n;const s=t.length?t[t.length-1]:0,o=_.l(s);return r.push(_.S(n+o&31,n+o>32?e:r.pop(),1)),r}},T={bytes:{v(t){const n=_.bitLength(t)/8,e=new o(n);let r;for(let s=0;s<n;s++)3&s||(r=t[s/4]),e[s]=r>>>24,r<<=8;return e},C(t){const n=[];let e,r=0;for(e=0;e<t.length;e++)r=r<<8|t[e],3&~e||(n.push(r),r=0);return 3&e&&n.push(_.S(8*(3&e),r)),n}}},K=class{constructor(t){const n=this;n.blockSize=512,n.I=[1732584193,4023233417,2562383102,271733878,3285377520],n.A=[1518500249,1859775393,2400959708,3395469782],t?(n.M=t.M.slice(0),n.P=t.P.slice(0),n.B=t.B):n.reset()}reset(){const t=this;return t.M=t.I.slice(0),t.P=[],t.B=0,t}update(t){const n=this;"string"==typeof t&&(t=T.D.C(t));const e=n.P=_.concat(n.P,t),r=n.B,o=n.B=r+_.bitLength(t);if(o>9007199254740991)throw new s("Cannot hash more than 2^53 - 1 bits");const c=new i(e);let a=0;for(let t=n.blockSize+r-(n.blockSize+r&n.blockSize-1);t<=o;t+=n.blockSize)n.F(c.subarray(16*a,16*(a+1))),a+=1;return e.splice(0,16*a),n}R(){const t=this;let n=t.P;const e=t.M;n=_.concat(n,[_.S(1,1)]);for(let t=n.length+2;15&t;t++)n.push(0);for(n.push(r.floor(t.B/4294967296)),n.push(0|t.B);n.length;)t.F(n.splice(0,16));return t.reset(),e}U(t,n,e,r){return t<=19?n&e|~n&r:t<=39?n^e^r:t<=59?n&e|n&r|e&r:t<=79?n^e^r:void 0}V(t,n){return n<<t|n>>>32-t}F(n){const e=this,s=e.M,o=t(80);for(let t=0;t<16;t++)o[t]=n[t];let c=s[0],i=s[1],a=s[2],f=s[3],u=s[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=e.V(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const n=e.V(5,c)+e.U(t,i,a,f)+u+o[t]+e.A[r.floor(t/20)]|0;u=f,f=a,a=e.V(30,i),i=c,c=n}s[0]=s[0]+c|0,s[1]=s[1]+i|0,s[2]=s[2]+a|0,s[3]=s[3]+f|0,s[4]=s[4]+u|0}},j={importKey:t=>new j.W(T.bytes.C(t)),_(t,n,e,r){if(e=e||1e4,r<0||e<0)throw new s("invalid params to pbkdf2");const o=1+(r>>5)<<2;let c,i,a,f,l;const w=new ArrayBuffer(o),h=new u(w);let p=0;const d=_;for(n=T.bytes.C(n),l=1;p<(o||1);l++){for(c=i=t.encrypt(d.concat(n,[l])),a=1;a<e;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;p<(o||1)&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return w.slice(0,r/8)},W:class{constructor(t){const n=this,e=n.T=K,r=[[],[]];n.K=[new e,new e];const s=n.K[0].blockSize/32;t.length>s&&(t=(new e).update(t).R());for(let n=0;n<s;n++)r[0][n]=909522486^t[n],r[1][n]=1549556828^t[n];n.K[0].update(r[0]),n.K[1].update(r[1]),n.j=new e(n.K[0])}reset(){const t=this;t.j=new t.T(t.K[0]),t.L=!1}update(t){this.L=!0,this.j.update(t)}digest(){const t=this,n=t.j.R(),e=new t.T(t.K[1]).update(n).R();return t.reset(),e}encrypt(t){if(this.L)throw new s("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},E=typeof h!=b&&typeof h.getRandomValues==k,L="Invalid password",O="zipjs-abort-check-password";function H(t){if(E)return h.getRandomValues(t);throw new s("Crypto API not supported")}const N=16,q={name:"PBKDF2"},G=n.assign({hash:{name:"HMAC"}},q),J=n.assign({iterations:1e3,hash:{name:"SHA-1"}},q),Q=["deriveBits"],X=[8,12,16],Y=[16,24,32],Z=10,$=[0,0,0,0],tt=typeof h!=b,nt=tt&&h.subtle,et=tt&&typeof nt!=b,rt=T.bytes,st=class{constructor(t){const n=this;n.O=[[[],[],[],[],[]],[[],[],[],[],[]]],n.O[0][0][0]||n.H();const e=n.O[0][4],r=n.O[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new s("invalid aes key size");for(n.A=[i=t.slice(0),a=[]],c=o;c<4*o+28;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=e[t>>>24]<<24^e[t>>16&255]<<16^e[t>>8&255]<<8^e[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const n=i[3&t?c:c-4];a[t]=c<=4||t<4?n:r[0][e[n>>>24]]^r[1][e[n>>16&255]]^r[2][e[n>>8&255]]^r[3][e[255&n]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.O[0],n=this.O[1],e=t[4],r=n[4],s=[],o=[];let c,i,a,f;for(let t=0;t<256;t++)o[(s[t]=t<<1^283*(t>>7))^t]=t;for(let u=c=0;!e[u];u^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,e[u]=o,r[o]=u,f=s[a=s[i=s[u]]];let l=16843009*f^65537*a^257*i^16843008*u,w=257*s[o]^16843008*o;for(let e=0;e<4;e++)t[e][u]=w=w<<24^w>>>8,n[e][o]=l=l<<24^l>>>8}for(let e=0;e<5;e++)t[e]=t[e].slice(0),n[e]=n[e].slice(0)}N(t,n){if(4!==t.length)throw new s("invalid aes block size");const e=this.A[n],r=e.length/4-2,o=[0,0,0,0],c=this.O[n],i=c[0],a=c[1],f=c[2],u=c[3],l=c[4];let w,h,p,d=t[0]^e[0],y=t[n?3:1]^e[1],m=t[2]^e[2],S=t[n?1:3]^e[3],g=4;for(let t=0;t<r;t++)w=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^u[255&S]^e[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^u[255&d]^e[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^u[255&y]^e[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^u[255&m]^e[g+3],g+=4,d=w,y=h,m=p;for(let t=0;t<4;t++)o[n?3&-t:t]=l[d>>>24]<<24^l[y>>16&255]<<16^l[m>>8&255]<<8^l[255&S]^e[g++],w=d,d=y,y=m,m=S,S=w;return o}},ot=class{constructor(t,n){this.G=t,this.J=n,this.X=n}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let n=t>>16&255,e=t>>8&255,r=255&t;255===n?(n=0,255===e?(e=0,255===r?r=0:++r):++e):++n,t=0,t+=n<<16,t+=e<<8,t+=r}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,n,e){let r;if(!(r=n.length))return[];const s=_.bitLength(n);for(let s=0;s<r;s+=4){this.$(e);const r=t.encrypt(e);n[s]^=r[0],n[s+1]^=r[1],n[s+2]^=r[2],n[s+3]^=r[3]}return _.m(n,s)}},ct=j.W;let it=tt&&et&&typeof nt.importKey==k,at=tt&&et&&typeof nt.deriveBits==k;class ft extends d{constructor({password:t,rawPassword:n,encryptionStrength:e,checkPasswordOnly:r,checkAuthenticationCode:c=!0}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:c,strength:i,nt:a,ready:f}=e;c?(await async function(t,n,e,r){const o=await ht(t,n,e,dt(r,0,X[n])),c=dt(r,X[n]);if(o[0]!=c[0]||o[1]!=c[1])throw new s(L)}(e,i,c,dt(t,0,X[i]+2)),t=dt(t,X[i]+2),r?n.error(new s(O)):a()):await f;const u=new o(t.length-Z-(t.length-Z)%N);n.enqueue(wt(e,t,u,0,Z,!0))},async flush(t){const{et:n,st:e,ot:r,ready:o}=this;if(e&&n){await o;const i=dt(r,0,r.length-Z),a=dt(r,r.length-Z);let f=z;if(i.length){const t=mt(rt,i);e.update(t);const r=n.update(t);f=yt(rt,r)}const u=dt(yt(rt,e.digest()),0,Z);let l=r.length<Z?1:0;for(let t=0;t<Z;t++)l|=u[t]^a[t];if(l&&c)throw new s("Invalid authentication code");t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:n,encryptionStrength:e}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:r,strength:s,nt:c,ready:i}=e;let a=z;r?(a=await async function(t,n,e){const r=H(new o(X[n]));return V(r,await ht(t,n,e,r))}(e,s,r),c()):await i;const f=new o(a.length+t.length-t.length%N);f.set(a,0),n.enqueue(wt(e,t,f,a.length,0))},async flush(t){const{et:n,st:e,ot:r,ready:s}=this;if(e&&n){await s;let o=z;if(r.length){const t=n.update(mt(rt,r));e.update(t),o=yt(rt,t)}const c=yt(rt,e.digest()).slice(0,Z);t.enqueue(V(o,c))}}})}}function lt(t,e,r,s){n.assign(t,{ready:new l(n=>t.nt=n),password:pt(e,r),strength:s-1,ot:z})}function wt(t,n,e,r,s,c){const{et:i,st:a,ot:f}=t;f.length&&(n=V(f,n));const u=n.length-s;let l;for(e=function(t,n){if(n&&n>t.length){const e=t;(t=new o(n)).set(e,0)}return t}(e,r+(u-u%N)),l=0;l<=u-N;l+=N){const t=mt(rt,dt(n,l,l+N));c&&a.update(t);const s=i.update(t);c||a.update(s),e.set(yt(rt,s),l+r)}return t.ot=dt(n,l),e}async function ht(e,r,s,c){e.password=null;const i=await async function(t,n,e,r,s){if(!it)return j.importKey(n);try{return await nt.importKey("raw",n,e,!1,s)}catch{return it=!1,j.importKey(n)}}(0,s,G,0,Q),a=await async function(t,n,e){if(!at)return j._(n,t.salt,J.iterations,e);try{return await nt.deriveBits(t,n,e)}catch{return at=!1,j._(n,t.salt,J.iterations,e)}}(n.assign({salt:c},J),i,8*(2*Y[r]+2)),f=new o(a),u=mt(rt,dt(f,0,Y[r])),l=mt(rt,dt(f,Y[r],2*Y[r])),w=dt(f,2*Y[r]);return n.assign(e,{keys:{key:u,ct:l,passwordVerification:w},et:new ot(new st(u),t.from($)),st:new ct(l)}),w}function pt(t,n){return n===v?function(t){if(typeof w==b){t=unescape(encodeURIComponent(t));const n=new o(t.length);for(let e=0;e<n.length;e++)n[e]=t.charCodeAt(e);return n}return(new w).encode(t)}(t):n}function dt(t,n,e){return t.subarray(n,e)}function yt(t,n){return t.v(n)}function mt(t,n){return t.C(n)}class St extends d{constructor({password:t,rawPassword:n,passwordVerification:e,checkPasswordOnly:r}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;if(e.password||e.rawPassword){const n=bt(e,t.subarray(0,12));if(e.password=e.rawPassword=null,0!=(n[11]^e.passwordVerification))throw new s(L);t=t.subarray(12)}r?n.error(new s(O)):n.enqueue(bt(e,t))}})}}class gt extends d{constructor({password:t,rawPassword:n,passwordVerification:e}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;let r,s;if(e.password||e.rawPassword){e.password=e.rawPassword=null;const n=H(new o(12));n[11]=e.passwordVerification,r=new o(t.length+n.length),r.set(kt(e,n),0),s=12}else r=new o(t.length),s=0;r.set(kt(e,t),s),n.enqueue(r)}})}}function vt(t,e,r,s){n.assign(t,{password:e,rawPassword:r,passwordVerification:s}),function(t,e,r){const s=[305419896,591751049,878082192];if(n.assign(t,{keys:s,it:new R(s[0]),ft:new R(s[2])}),r)for(let n=0;n<r.length;n++)zt(t,r[n]);else for(let n=0;n<e.length;n++)zt(t,e.charCodeAt(n))}(t,e,r)}function bt(t,n){const e=new o(n.length);for(let r=0;r<n.length;r++)e[r]=Ct(t)^n[r],zt(t,e[r]);return e}function kt(t,n){const e=new o(n.length);for(let r=0;r<n.length;r++)e[r]=Ct(t)^n[r],zt(t,n[r]);return e}function zt(t,n){let[,e]=t.keys;t.it.append([n]);const s=~t.it.get();e=At(r.imul(At(e+It(s)),134775813)+1),t.ft.append([e>>>24]);const o=~t.ft.get();t.keys=[s,e,o]}function Ct(t){const n=2|t.keys[2];return It(r.imul(n,1^n)>>>8)}function It(t){return 255&t}function At(t){return 4294967295&t}function xt(t){if(t instanceof y)return t;const n=t.getReader();return new y({async pull(t){const{value:e,done:r}=await n.read();r?t.close():t.enqueue(e)},cancel:t=>n.cancel(t)})}const Mt=new f;function Pt(t){return Mt.get(t)}const Bt="Invalid uncompressed size",Dt="deflate-raw",Ft="gzip",Rt=[31,139,8];class Ut extends d{constructor(t,{chunkSize:n,CompressionStreamFallback:e,CompressionStream:r}){super({});const{compressed:s,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:l,format:w,compressionMethod:h,inputSize:p}=t,d=this;let y,m,S,g=super.readable;const v=w&&Pt(w),b=a&&s&&!l&&!v&&(!o||i)&&Boolean(c&&r);if(o&&!i||!a||b||(y=new U,g=Et(g,y)),s)if(v)g=Lt(g,Kt(v.CompressionStream,w,{level:f,chunkSize:n,compressionMethod:h,uncompressedSize:p}));else if(b)S=new Vt,g=Lt(g,new r(Ft)),g=Et(g,S);else try{g=jt(g,c,{level:f,chunkSize:n},r,e)}catch(t){let n;try{n=new r(Ft)}catch{throw t}g=Lt(g,n),g=Et(g,new Vt)}o&&(i?g=Et(g,new gt(t)):(m=new ut(t),g=Et(g,m))),Tt(d,g,()=>{o&&!i||!a||(d.crc32=b?S.crc32:new u(y.value.buffer).getUint32(0))})}}class Vt extends d{constructor(){let t,n=10,e=new o(0);super({transform(t,s){if(n){const e=r.min(n,t.length);if(n-=e,!(t=t.subarray(e)).length)return}const o=e.length+t.length;if(o<=8)return void(e=V(e,t));const c=o-8,i=r.min(c,e.length);s.enqueue(V(e.subarray(0,i),t.subarray(0,c-i))),e=V(e.subarray(i),t.subarray(c-i))},flush(){const n=W(e);t.crc32=n.getUint32(0,!0),t.uncompressedSize=n.getUint32(4,!0)}}),t=this}}class Wt extends d{constructor(t,{chunkSize:n,DecompressionStreamFallback:e,DecompressionStream:r}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:w,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=Et(C,new St(t)):(z=new ft(t),C=Et(C,z))),w){const t=m&&Pt(m);if(t)C=Lt(C,Kt(t.DecompressionStream,m,{chunkSize:n,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=jt(C,h,{chunkSize:n,deflate64:p},r,e)}catch(t){if(p||b===v)throw t;let n;try{n=new r(Ft)}catch{throw t}C=function(t,n,e){const r=new R;let c,i,a,f=0,u=!1;const w=new l((t,n)=>{i=t,a=n});w.catch(()=>{}),e||i();const h=new d({start(t){const n=new o(10);n.set(Rt),t.enqueue(n)},transform(t,n){n.enqueue(t)},async flush(t){u=!0,y();try{await w}finally{m()}const n=new o(8),s=W(n);s.setUint32(0,r.get(),!0),s.setUint32(4,e,!0),t.enqueue(n)},cancel(t){a(t)}}),p=new d({transform(t,n){r.append(t),f+=t.length,f>=e?i():u&&y(),n.enqueue(t)},cancel(t){a(t)}});return t=Et(t,h),Et(t=Lt(t,n),p);function y(){m(),c=setTimeout(()=>a(new s(Bt)),5e3)}function m(){clearTimeout(c)}}(C,n,b)}C=function(t){const n=t.getReader();return new y({async pull(t){let e;try{e=await n.read()}catch(t){if(t&&t.message)throw t;const n=new s("Invalid compressed data");throw n.cause=t,n}const{value:r,done:o}=e;o?t.close():t.enqueue(r)},cancel:t=>n.cancel(t)})}(C)}a&&(k=new U,C=Et(C,k)),Tt(this,C,()=>{if(a){const t=new u(k.value.buffer);if(f!=t.getUint32(0,!1))throw new s("Invalid CRC32")}})}}const _t=new f;function Tt(t,e,r){e=Et(e,new d({flush:r})),n.defineProperty(t,"readable",{get:()=>e})}function Kt(t,n,e){if(!t)throw new s("Compression method not supported");return new t(n,e)}function jt(t,n,e,r,s){const o=n&&r?r:s||r,c=e.deflate64?"deflate64-raw":Dt;let i;try{i=new o(c,e)}catch(t){if(!n||!s||o==s)throw t;i=new s(c,e)}return Lt(t,i)}function Et(t,n){return xt(t).pipeThrough(n)}function Lt(t,n){const e=n.writable.getWriter(),r=t.getReader();return async function(){try{for(;;){await e.ready;const t=await r.read();if(t.done){await e.close();break}await e.write(t.value)}}catch(t){await async function(t,n){try{await t.abort(n)}catch{}}(e,t),await async function(t,n){try{await t.cancel(n)}catch{}}(r,t)}}(),n.readable}const Ot="data",Ht="close",Nt="deflate";class qt extends d{constructor(t,e){super({});const r=this,{codecType:o}=t;let c;o.startsWith(Nt)?c=Ut:o.startsWith("inflate")&&(c=Wt),r.outputSize=0;let i=0;const a=new c(t,e),f=super.readable,u=new d({transform(t,n){t&&t.length&&(i+=t.length,n.enqueue(t))},flush(){n.assign(r,{inputSize:i})}}),l=new d({transform(n,e){if(n&&n.length&&(e.enqueue(n),r.outputSize+=n.length,t.outputSize!==v&&r.outputSize>t.outputSize))throw new s(Bt)},flush(){const{crc32:t}=a;n.assign(r,{crc32:t,inputSize:i})}});n.defineProperty(r,"readable",{get:()=>f.pipeThrough(u).pipeThrough(a).pipeThrough(l)})}}class Gt extends d{constructor(t){const r=[];let s=0,c=0;function i(){const n=new o(t);let e=0;for(;e<t;){const s=r[0],o=t-e;s.length<=o?(n.set(s,e),e+=s.length,r.shift()):(n.set(s.subarray(0,o),e),r[0]=s.subarray(o),e+=o)}return s-=t,n}(!e.isFinite(t)||t<1)&&(t=65536),super({transform(n,e){for(r.push(n),s+=n.length;s>t;)c+=t,e.enqueue(i())},flush(t){s&&(c+=s,t.enqueue(function(t,n){const e=new o(n);let r=0;for(const n of t)e.set(n,r),r+=n.length;return e}(r,s)))}}),n.defineProperty(this,"outputSize",{get:()=>c})}}let Jt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Jt=navigator.hardwareConcurrency)}catch{}function Qt(t){return Boolean(t)&&"object"==typeof t}const Xt=new f,Yt=new f,Zt=function(){try{return structuredClone(new s)instanceof s}catch{return!1}}();let $t,tn=0;async function nn(t){let n,o,c;try{const{options:i,config:a}=t;if(i.format)try{await async function(t,n){!Mt.has(t)&&n&&function(t,n){const{CompressionStream:e,DecompressionStream:r}=n;if(typeof e!=k&&typeof r!=k)throw new s("Invalid codec module");Mt.set(t,{CompressionStream:e,DecompressionStream:r})}(t,await(import(n)))}(i.format,i.codecURI)}catch(t){if(Qt(t))try{t.codecImportFailed=!0}catch{}throw t}if(a.CompressionStream=self.CompressionStream,a.DecompressionStream=self.DecompressionStream,i.compressed&&!i.format)if(i.useCompressionStream){if(!function(t,n){if(!t)return!1;let e=_t.get(t);e||(e=new f,_t.set(t,e));let r=e.get(n);if(r===v){try{new t(n),r=!0}catch{r=!1}e.set(n,r)}return r}(i.codecType.startsWith(Nt)?a.CompressionStream:a.DecompressionStream,Dt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{i.useCompressionStream=!0}!a.CompressionStreamFallback&&a.CompressionStreamZlib&&(a.CompressionStreamFallback=a.CompressionStreamZlib),!a.DecompressionStreamFallback&&a.DecompressionStreamZlib&&(a.DecompressionStreamFallback=a.DecompressionStreamZlib);const u={highWaterMark:1},w=t.readable?xt(t.readable):new y({async pull(t){const n=new l(t=>Xt.set(tn,t));en({type:"pull",messageId:tn}),tn=(tn+1)%e.MAX_SAFE_INTEGER;const{value:r,done:s}=await n;t.enqueue(r),s&&t.close()}},u);c=t.writable?function(t){if(t instanceof m)return t;const n=t.getWriter();return new m({write:t=>n.write(t),close:()=>n.close(),abort:t=>n.abort(t)})}(t.writable):new m({async write(t){let n;const r=new l(t=>n=t);Yt.set(tn,n),en({type:Ot,value:t,messageId:tn}),tn=(tn+1)%e.MAX_SAFE_INTEGER,await r}},u),n=new qt(i,a),o=new Gt(function(t){return s="string"==typeof(n=s=t.chunkSize)&&n.trim()?e(n):n,e.isInteger(s)&&s>=1?r.max(s,64):65536;var n,s}(a)),$t=new AbortController;const{signal:h}=$t;await w.pipeThrough(n).pipeThrough(o).pipeTo(c,{signal:h,preventClose:!0,preventAbort:!0}),await c.getWriter().close();const{crc32:p,inputSize:d,outputSize:S}=n;en({type:Ht,result:{crc32:p,inputSize:d,outputSize:S}})}catch(t){const n=o?o.outputSize:0;if(Qt(t))try{t.outputSize=n}catch{}if(c&&!c.locked)try{await c.getWriter().close()}catch{}rn(t,n)}}function en(t){const{value:n}=t;if(n)if(n.length)try{t.value=(e=n,e.byteOffset||e.byteLength!=e.buffer.byteLength?new o(e):e).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var e}function rn(t,n){const{message:e,stack:r,code:o,name:c,outputSize:i,cause:a,codecImportFailed:f}=function(t=new s("Unknown error")){return Qt(t)?t:new s(String(t))}(t),u={message:e,stack:r,code:o,name:c,outputSize:i===v?n:i};if(a&&(u.cause={name:a.name,message:a.message}),f&&(u.codecImportFailed=!0),Zt)try{return void p({error:u,errorValue:{value:t}})}catch{}p({error:u})}addEventListener("message",({data:t})=>{const{type:n,messageId:e,value:r,done:s}=t;try{if("start"==n&&nn(t),n==Ot){const t=Xt.get(e);Xt.delete(e),t({value:r||new o,done:s})}if("ack"==n){const t=Yt.get(e);Yt.delete(e),t()}n==Ht&&$t.abort()}catch(t){rn(t)}}),p({type:"ready"});const sn="deflate",on="deflate-raw",cn="deflate64-raw",an="gzip";let fn,un,ln,wn,hn;function pn(t,n,e={}){if(!fn){const t=new s("WASM module not loaded");throw t.cause=hn,t}const c="number"==typeof e.level?e.level:-1,i="number"==typeof e.outBuffer?e.outBuffer:65536,a="number"==typeof e.inBufferSize?e.inBufferSize:65536;return new d({start(){try{let e;if(this.ut=un(i),this.in=un(a),this.inBufferSize=a,!this.ut||!this.in)throw new s("allocation failed");if(this.lt=new o(i),t?(this.wt=fn.deflate_process,this.ht=fn.deflate_last_consumed,this.yt=fn.deflate_end,this.St=fn.deflate_new(),e=n===an?fn.deflate_init_gzip(this.St,c):n===on?fn.deflate_init_raw(this.St,c):fn.deflate_init(this.St,c)):n===cn?(this.wt=fn.inflate9_process,this.ht=fn.inflate9_last_consumed,this.yt=fn.inflate9_end,this.St=fn.inflate9_new(),e=fn.inflate9_init_raw(this.St)):(this.wt=fn.inflate_process,this.ht=fn.inflate_last_consumed,this.yt=fn.inflate_end,this.St=fn.inflate_new(),e=n===on?fn.inflate_init_raw(this.St):n===an?fn.inflate_init_gzip(this.St):fn.inflate_init(this.St)),0!==e)throw new s("init failed:"+e)}catch(t){throw f(this),t}},transform(t,n){try{const e=t,c=new o(wn.buffer),a=this.wt,f=this.ht,u=this.ut,l=this.lt;let w=0;for(;w<e.length;){const t=r.min(e.length-w,32768);if((!this.in||this.inBufferSize<t)&&(this.in&&ln&&(ln(this.in),this.in=0),this.in=un(t),this.inBufferSize=t,!this.in))throw new s("allocation failed");c.set(e.subarray(w,w+t),this.in);const o=a(this.St,this.in,t,u,i,0),h=o>>24&255,p=128&h?h-256:h;if(p<0)throw new s("process error:"+p);const d=16777215&o;d&&(l.set(c.subarray(u,u+d),0),n.enqueue(l.slice(0,d)));const y=f(this.St);if(0===y&&0===d)break;w+=y}}catch(t){f(this),n.error(t)}},flush(t){try{const n=new o(wn.buffer),e=this.wt,r=this.ut,c=this.lt;for(;;){const o=e(this.St,0,0,r,i,4),a=o>>24&255,f=128&a?a-256:a;if(f<0)throw new s("process error:"+f);const u=16777215&o;if(u&&(c.set(n.subarray(r,r+u),0),t.enqueue(c.slice(0,u))),1===a||0===u)break}}catch(n){t.error(n)}finally{const n=f(this);0!==n&&t.error(new s("end error:"+n))}},cancel(){f(this)}});function f(t){let n=0;return t.St&&t.yt&&(n=t.yt(t.St)),t.St=0,t.in&&ln&&ln(t.in),t.in=0,t.ut&&ln&&ln(t.ut),t.ut=0,n}}class dn{constructor(t=sn,n){return pn(!0,t,n)}}class yn{constructor(t=sn,n){return pn(!1,t,n)}}dn.gt=!0,yn.gt=!0,dn.vt=[sn,on,an],yn.vt=[sn,on,an,cn];let mn=!1;!function(t={}){const{init:n}=t,e=t.CompressionStreamFallback||t.CompressionStreamZlib,r=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{n&&await n(t),e&&(t.CompressionStreamFallback=e),r&&(t.DecompressionStreamFallback=r)}}({CompressionStreamFallback:dn,DecompressionStreamFallback:yn,init:t=>async function(t,{baseURI:n}){if(!mn)try{await async function(t,n){let e,r;try{try{r=new URL(t,n)}catch{}const s=await fetch(r);e=await s.arrayBuffer()}catch(n){if(!t.startsWith("data:application/wasm;base64,"))throw n;e=function(t){const n=t.split(",")[1],e=atob(n),r=e.length,s=new o(r);for(let t=0;t<r;++t)s[t]=e.charCodeAt(t);return s.buffer}(t)}!function(t){if(fn=t,({malloc:un,free:ln,memory:wn}=fn),"function"!=typeof un||"function"!=typeof ln||!wn)throw fn=un=ln=wn=null,new s("Invalid WASM module")}((await WebAssembly.instantiate(e)).instance.exports)}(t,n),mn=!0}catch(t){throw function(t){hn=t}(t),t}}(t.wasmURI,t)})});\n';if("string"==typeof r&&(r=(new TextEncoder).encode(r)),t){const t=new Blob([r],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+function(t){let n="";const r=t.length;let s=0;for(;s+2<r;s+=3){const r=t[s]<<16|t[s+1]<<8|t[s+2];n+=e$1[r>>18&63]+e$1[r>>12&63]+e$1[r>>6&63]+e$1[63&r];}const o=r-s;if(1===o){const r=t[s]<<16;n+=e$1[r>>18&63]+e$1[r>>12&63]+"==";}else if(2===o){const r=t[s]<<16|t[s+1]<<8;n+=e$1[r>>18&63]+e$1[r>>12&63]+e$1[r>>6&63]+"=";}return n}(r)}});
|
|
442
|
+
const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='!function(t){"function"==typeof define&&define.amd?define(t):t()}(function(){"use strict";const{Array:t,Object:n,Number:e,Math:o,Error:s,Uint8Array:r,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:u,Promise:w,TextEncoder:l,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",z="function",k=new r,C=[[],[],[],[],[],[],[],[]];for(let t=0;t<256;t++){let n=t;for(let t=0;t<8;t++)n=1&n?n>>>1^3988292384:n>>>1;C[0][t]=n}for(let t=0;t<256;t++)for(let n=1;n<8;n++){const e=C[n-1][t];C[n][t]=e>>>8^C[0][255&e]}const[I,A,x,M,P,D,F,E]=C;class R{constructor(t){this.o=t||-1}append(t){let n=0|this.o;const e=0|t.length;let o=0;if(e>=8&&t.buffer){const s=new u(t.buffer,t.byteOffset,e),r=e-8;for(;o<=r;o+=8){const t=n^s.getInt32(o,!0),e=s.getInt32(o+4,!0);n=E[255&t]^F[t>>>8&255]^D[t>>>16&255]^P[t>>>24&255]^M[255&e]^x[e>>>8&255]^A[e>>>16&255]^I[e>>>24&255]}}for(;o<e;o++)n=n>>>8^I[255&(n^t[o])];this.o=n}get(){return~this.o}}class U extends d{constructor(){let t;const n=new R;super({transform(t,e){n.append(t),e.enqueue(t)},flush(){const e=new r(4);new u(e.buffer).setUint32(0,n.get()),t.value=e}}),t=this}}function B(t,n){const e=new r(t.length+n.length);return e.set(t),e.set(n,t.length),e}function T(t){return new u(t.buffer,t.byteOffset,t.byteLength)}const V=64,W=20,j=new r([128]),K=new r(1),O=new a([1732584193,4023233417,2562383102,271733878,3285377520]),H=new r(256),L=new a(256),N=new a(256),q=new a(256),G=new a(256);let J=!1;function Q(t,n){!function(){if(!J){let t=1,n=1;do{t=255&(t^t<<1^(128&t?27:0)),n=255&(n^n<<1),n=255&(n^n<<2),n=255&(n^n<<4),128&n&&(n^=9),H[t]=255&(n^(n<<1|n>>7)^(n<<2|n>>6)^(n<<3|n>>5)^(n<<4|n>>4)^99)}while(1!=t);H[0]=99;for(let t=0;t<256;t++){const n=H[t],e=Z(n),o=e<<24|n<<16|n<<8|e^n;L[t]=o,N[t]=o>>>8|o<<24,q[t]=o>>>16|o<<16,G[t]=o>>>24|o<<8}J=!0}}();const e=new a(60),o=function(t,n){const e=t.length>>2,o=e+6,s=4*(o+1);let r=1;for(let o=0;o<e;o++)n[o]=t[4*o]<<24|t[4*o+1]<<16|t[4*o+2]<<8|t[4*o+3];for(let t=e;t<s;t++){let o=n[t-1];t%e==0?(o=Y(o<<8|o>>>24)^r<<24,r=Z(r)):e>6&&t%e==4&&(o=Y(o)),n[t]=n[t-e]^o}return o}(t,e),s=new r(16),c=new a(4),i=X(n);return{process(t,n){n&&i.update(t,0,t.length),function(t){const n=new u(t.buffer,t.byteOffset,t.byteLength),e=t.length;let o=0;for(;o+16<=e;o+=16)f(),n.setInt32(o,n.getInt32(o)^c[0]),n.setInt32(o+4,n.getInt32(o+4)^c[1]),n.setInt32(o+8,n.getInt32(o+8)^c[2]),n.setInt32(o+12,n.getInt32(o+12)^c[3]);if(o<e){f();for(let n=0;o<e;o++,n++)t[o]^=c[n>>2]>>>24-8*(3&n)}}(t),n||i.update(t,0,t.length)},digest:()=>i.digest()};function f(){for(let t=0;t<16&&(s[t]++,0===s[t]);t++);let t=(s[0]<<24|s[1]<<16|s[2]<<8|s[3])^e[0],n=(s[4]<<24|s[5]<<16|s[6]<<8|s[7])^e[1],r=(s[8]<<24|s[9]<<16|s[10]<<8|s[11])^e[2],i=(s[12]<<24|s[13]<<16|s[14]<<8|s[15])^e[3],a=4;for(let s=1;s<o;s++,a+=4){const o=L[t>>>24]^N[n>>>16&255]^q[r>>>8&255]^G[255&i]^e[a],s=L[n>>>24]^N[r>>>16&255]^q[i>>>8&255]^G[255&t]^e[a+1],c=L[r>>>24]^N[i>>>16&255]^q[t>>>8&255]^G[255&n]^e[a+2],f=L[i>>>24]^N[t>>>16&255]^q[n>>>8&255]^G[255&r]^e[a+3];t=o,n=s,r=c,i=f}c[0]=(H[t>>>24]<<24|H[n>>>16&255]<<16|H[r>>>8&255]<<8|H[255&i])^e[a],c[1]=(H[n>>>24]<<24|H[r>>>16&255]<<16|H[i>>>8&255]<<8|H[255&t])^e[a+1],c[2]=(H[r>>>24]<<24|H[i>>>16&255]<<16|H[t>>>8&255]<<8|H[255&n])^e[a+2],c[3]=(H[i>>>24]<<24|H[t>>>16&255]<<16|H[n>>>8&255]<<8|H[255&r])^e[a+3]}}function X(t){const n=function(){const t=new a(O),n=new a(80),e=new r(V),s=new u(e.buffer),c=new r(8);let i=0,f=0;return{update:w,digest:function(){const n=8*f,e=o.floor(n/4294967296),s=n>>>0;for(w(j,0,1);56!=i;)w(K,0,1);c[0]=e>>>24,c[1]=e>>>16,c[2]=e>>>8,c[3]=e,c[4]=s>>>24,c[5]=s>>>16,c[6]=s>>>8,c[7]=s,w(c,0,8);const a=new r(W),l=new u(a.buffer);for(let n=0;n<t.length;n++)l.setInt32(4*n,t[n]);return t.set(O),i=0,f=0,a}};function w(t,n,o){const r=n+o;if(f+=o,i){for(;n<r&&i<V;)e[i++]=t[n++];i==V&&(l(s,0),i=0)}if(n+V<=r){const e=new u(t.buffer,t.byteOffset,t.byteLength);for(;n+V<=r;n+=V)l(e,n)}for(;n<r;)e[i++]=t[n++]}function l(e,o){for(let t=0;t<16;t++)n[t]=e.getInt32(o+4*t);for(let t=16;t<80;t++){const e=n[t-3]^n[t-8]^n[t-14]^n[t-16];n[t]=e<<1|e>>>31}let s,r=t[0],c=t[1],i=t[2],a=t[3],f=t[4];for(let t=0;t<20;t++)s=(r<<5|r>>>27)+(c&i|~c&a)+f+1518500249+n[t]|0,f=a,a=i,i=c<<30|c>>>2,c=r,r=s;for(let t=20;t<40;t++)s=(r<<5|r>>>27)+(c^i^a)+f+1859775393+n[t]|0,f=a,a=i,i=c<<30|c>>>2,c=r,r=s;for(let t=40;t<60;t++)s=(r<<5|r>>>27)+(c&i|c&a|i&a)+f+2400959708+n[t]|0,f=a,a=i,i=c<<30|c>>>2,c=r,r=s;for(let t=60;t<80;t++)s=(r<<5|r>>>27)+(c^i^a)+f+3395469782+n[t]|0,f=a,a=i,i=c<<30|c>>>2,c=r,r=s;t[0]=t[0]+r|0,t[1]=t[1]+c|0,t[2]=t[2]+i|0,t[3]=t[3]+a|0,t[4]=t[4]+f|0}}(),e=new r(V),s=new r(V);t.length>V&&(n.update(t,0,t.length),t=n.digest());for(let n=0;n<V;n++){const o=n<t.length?t[n]:0;e[n]=54^o,s[n]=92^o}return n.update(e,0,V),{update(t,e,o){n.update(t,e,o)},digest(){const t=n.digest();n.update(s,0,V),n.update(t,0,W);const o=n.digest();return n.update(e,0,V),o}}}function Y(t){return H[t>>>24]<<24|H[t>>>16&255]<<16|H[t>>>8&255]<<8|H[255&t]}function Z(t){return 255&(t<<1^27*(t>>7))}const $=typeof h!=b&&typeof h.getRandomValues==z,_="Invalid password",tt="zipjs-abort-check-password";function nt(t){if($)return h.getRandomValues(t);throw new s("Crypto API not supported")}const et={name:"PBKDF2"},ot=n.assign({hash:{name:"HMAC"}},et),st=n.assign({iterations:1e3,hash:{name:"SHA-1"}},et),rt=["deriveBits"],ct=[8,12,16],it=[16,24,32],at=10,ft=typeof h!=b,ut=ft&&h.subtle;let wt=ft&&typeof ut!=b&&typeof ut.importKey==z&&typeof ut.deriveBits==z,lt=Q;class ht extends d{constructor({password:t,rawPassword:n,encryptionStrength:e,checkPasswordOnly:o,checkAuthenticationCode:c=!0}){super({start(){dt(this,t,n,e)},async transform(t,n){const e=this,{password:c,strength:i,l:a,ready:f}=e;c?(await async function(t,n,e,o){const r=await St(t,n,e,vt(o,0,ct[n])),c=vt(o,ct[n]);if(r[0]!=c[0]||r[1]!=c[1])throw mt(t),new s(_)}(e,i,c,vt(t,0,ct[i]+2)),t=vt(t,ct[i]+2),o?(mt(e),n.error(new s(tt))):a()):await f;const u=new r(t.length-at-(t.length-at)%16);n.enqueue(yt(e,t,u,0,at,!0))},async flush(t){const{h:n,m:e,ready:o}=this;if(n){await o;const i=vt(e,e.length-at),a=new r(vt(e,0,e.length-at));n.process(a,!0);const f=n.digest();let u=e.length<at?1:0;for(let t=0;t<at;t++)u|=f[t]^i[t];if(u&&c)throw new s("Invalid authentication code");t.enqueue(a)}},cancel(){mt(this)}})}}class pt extends d{constructor({password:t,rawPassword:n,encryptionStrength:e}){super({start(){dt(this,t,n,e)},async transform(t,n){const e=this,{password:o,strength:s,l:c,ready:i}=e;let a=k;o?(a=await async function(t,n,e){const o=nt(new r(ct[n]));return B(o,await St(t,n,e,o))}(e,s,o),c()):await i;const f=new r(a.length+t.length-t.length%16);f.set(a,0),n.enqueue(yt(e,t,f,a.length,0,!1))},async flush(t){const{h:n,m:e,ready:o}=this;if(n){await o;const s=new r(e);n.process(s,!1);const c=vt(n.digest(),0,at);t.enqueue(B(s,c))}},cancel(){mt(this)}})}}function dt(t,e,o,s){n.assign(t,{ready:new w(n=>t.l=n),password:gt(e,o),strength:s-1,m:k})}function yt(t,n,e,o,s,c){const{h:i,m:a}=t;a.length&&(n=B(a,n));const f=n.length-s,u=f-f%16;if(e=function(t,n){if(n&&n>t.length){const e=t;(t=new r(n)).set(e,0)}return t}(e,o+u),u){const t=vt(e,o,o+u);t.set(vt(n,0,u)),i.process(t,c)}return t.m=vt(n,u),e}function mt({h:t}){t&&t.dispose&&t.dispose()}async function St(t,e,s,c){t.password=null;const i=it[e],a=await async function(t,e,s){if(wt)try{const o=await ut.importKey("raw",t,ot,!1,rt);return new r(await ut.deriveBits(n.assign({salt:e},st),o,8*s))}catch{wt=!1}return function(t,n,e,s){const c=X(t),i=new r(s),a=new r(n.length+4),f=new u(a.buffer);a.set(n);for(let t=1,e=0;e<s;t++,e+=W){f.setUint32(n.length,t),c.update(a,0,a.length);let r=c.digest();const u=r.slice();for(let t=1;t<1e3;t++){c.update(r,0,W),r=c.digest();for(let t=0;t<W;t++)u[t]^=r[t]}i.set(u.subarray(0,o.min(W,s-e)),e)}return i}(t,e,0,s)}(s,c,2*i+2);return t.h=lt(vt(a,0,i),vt(a,i,2*i)),vt(a,2*i)}function gt(t,n){return n===v?function(t){if(typeof l==b){t=unescape(encodeURIComponent(t));const n=new r(t.length);for(let e=0;e<n.length;e++)n[e]=t.charCodeAt(e);return n}return(new l).encode(t)}(t):n}function vt(t,n,e){return t.subarray(n,e)}class bt extends d{constructor({password:t,rawPassword:n,passwordVerification:e,checkPasswordOnly:o}){super({start(){kt(this,t,n,e)},transform(t,n){const e=this;if(e.password||e.rawPassword){const n=Ct(e,t.subarray(0,12));if(e.password=e.rawPassword=null,0!=(n[11]^e.passwordVerification))throw new s(_);t=t.subarray(12)}o?n.error(new s(tt)):n.enqueue(Ct(e,t))}})}}class zt extends d{constructor({password:t,rawPassword:n,passwordVerification:e}){super({start(){kt(this,t,n,e)},transform(t,n){const e=this;let o,s;if(e.password||e.rawPassword){e.password=e.rawPassword=null;const n=nt(new r(12));n[11]=e.passwordVerification,o=new r(t.length+n.length),o.set(It(e,n),0),s=12}else o=new r(t.length),s=0;o.set(It(e,t),s),n.enqueue(o)}})}}function kt(t,e,o,s){n.assign(t,{password:e,rawPassword:o,passwordVerification:s}),function(t,e,o){const s=[305419896,591751049,878082192];if(n.assign(t,{keys:s,S:new R(s[0]),v:new R(s[2])}),o)for(let n=0;n<o.length;n++)At(t,o[n]);else for(let n=0;n<e.length;n++)At(t,e.charCodeAt(n))}(t,e,o)}function Ct(t,n){const e=new r(n.length);for(let o=0;o<n.length;o++)e[o]=xt(t)^n[o],At(t,e[o]);return e}function It(t,n){const e=new r(n.length);for(let o=0;o<n.length;o++)e[o]=xt(t)^n[o],At(t,n[o]);return e}function At(t,n){let[,e]=t.keys;t.S.append([n]);const s=~t.S.get();e=Pt(o.imul(Pt(e+Mt(s)),134775813)+1),t.v.append([e>>>24]);const r=~t.v.get();t.keys=[s,e,r]}function xt(t){const n=2|t.keys[2];return Mt(o.imul(n,1^n)>>>8)}function Mt(t){return 255&t}function Pt(t){return 4294967295&t}function Dt(t){if(t instanceof y)return t;const n=t.getReader();return new y({async pull(t){const{value:e,done:o}=await n.read();o?t.close():t.enqueue(e)},cancel:t=>n.cancel(t)})}const Ft=new f;function Et(t){return Ft.get(t)}const Rt="Invalid uncompressed size",Ut="deflate-raw",Bt="gzip",Tt=[31,139,8];class Vt extends d{constructor(t,{chunkSize:n,CompressionStreamFallback:e,CompressionStream:o}){super({});const{compressed:s,encrypted:r,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:w,format:l,compressionMethod:h,inputSize:p}=t,d=this;let y,m,S,g=super.readable;const v=l&&Et(l),b=a&&s&&!w&&!v&&(!r||i)&&Boolean(c&&o);if(r&&!i||!a||b||(y=new U,g=Nt(g,y)),s)if(v)g=qt(g,Ht(v.CompressionStream,l,{level:f,chunkSize:n,compressionMethod:h,uncompressedSize:p}));else if(b)S=new Wt,g=qt(g,new o(Bt)),g=Nt(g,S);else try{g=Lt(g,c,{level:f,chunkSize:n},o,e)}catch(t){let n;try{n=new o(Bt)}catch{throw t}g=qt(g,n),g=Nt(g,new Wt)}r&&(i?g=Nt(g,new zt(t)):(m=new pt(t),g=Nt(g,m))),Ot(d,g,()=>{r&&!i||!a||(d.crc32=b?S.crc32:new u(y.value.buffer).getUint32(0))})}}class Wt extends d{constructor(){let t,n=10,e=new r(0);super({transform(t,s){if(n){const e=o.min(n,t.length);if(n-=e,!(t=t.subarray(e)).length)return}const r=e.length+t.length;if(r<=8)return void(e=B(e,t));const c=r-8,i=o.min(c,e.length);s.enqueue(B(e.subarray(0,i),t.subarray(0,c-i))),e=B(e.subarray(i),t.subarray(c-i))},flush(){const n=T(e);t.crc32=n.getUint32(0,!0),t.uncompressedSize=n.getUint32(4,!0)}}),t=this}}class jt extends d{constructor(t,{chunkSize:n,DecompressionStreamFallback:e,DecompressionStream:o}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:l,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let z,k,C=super.readable;if(i&&(c?C=Nt(C,new bt(t)):(k=new ht(t),C=Nt(C,k))),l){const t=m&&Et(m);if(t)C=qt(C,Ht(t.DecompressionStream,m,{chunkSize:n,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=Lt(C,h,{chunkSize:n,deflate64:p},o,e)}catch(t){if(p||b===v)throw t;let n;try{n=new o(Bt)}catch{throw t}C=function(t,n,e){const o=new R;let c,i,a,f=0,u=!1;const l=new w((t,n)=>{i=t,a=n});l.catch(()=>{}),e||i();const h=new d({start(t){const n=new r(10);n.set(Tt),t.enqueue(n)},transform(t,n){n.enqueue(t)},async flush(t){u=!0,y();try{await l}finally{m()}const n=new r(8),s=T(n);s.setUint32(0,o.get(),!0),s.setUint32(4,e,!0),t.enqueue(n)},cancel(t){a(t)}}),p=new d({transform(t,n){o.append(t),f+=t.length,f>=e?i():u&&y(),n.enqueue(t)},cancel(t){a(t)}});return t=Nt(t,h),Nt(t=qt(t,n),p);function y(){m(),c=setTimeout(()=>a(new s(Rt)),5e3)}function m(){clearTimeout(c)}}(C,n,b)}C=function(t){const n=t.getReader();return new y({async pull(t){let e;try{e=await n.read()}catch(t){if(t&&t.message)throw t;const n=new s("Invalid compressed data");throw n.cause=t,n}const{value:o,done:r}=e;r?t.close():t.enqueue(o)},cancel:t=>n.cancel(t)})}(C)}a&&(z=new U,C=Nt(C,z)),Ot(this,C,()=>{if(a){const t=new u(z.value.buffer);if(f!=t.getUint32(0,!1))throw new s("Invalid CRC32")}})}}const Kt=new f;function Ot(t,e,o){e=Nt(e,new d({flush:o})),n.defineProperty(t,"readable",{get:()=>e})}function Ht(t,n,e){if(!t)throw new s("Compression method not supported");return new t(n,e)}function Lt(t,n,e,o,s){const r=n&&o?o:s||o,c=e.deflate64?"deflate64-raw":Ut;let i;try{i=new r(c,e)}catch(t){if(!n||!s||r==s)throw t;i=new s(c,e)}return qt(t,i)}function Nt(t,n){return Dt(t).pipeThrough(n)}function qt(t,n){const e=n.writable.getWriter(),o=t.getReader();return async function(){try{for(;;){await e.ready;const t=await o.read();if(t.done){await e.close();break}await e.write(t.value)}}catch(t){await async function(t,n){try{await t.abort(n)}catch{}}(e,t),await async function(t,n){try{await t.cancel(n)}catch{}}(o,t)}}(),n.readable}const Gt="data",Jt="deflate";class Qt extends d{constructor(t,e){super({});const o=this,{codecType:r}=t;let c;r.startsWith(Jt)?c=Vt:r.startsWith("inflate")&&(c=jt),o.outputSize=0;let i=0;const a=new c(t,e),f=super.readable,u=new d({transform(t,n){t&&t.length&&(i+=t.length,n.enqueue(t))},flush(){n.assign(o,{inputSize:i})}}),w=new d({transform(n,e){if(n&&n.length&&(e.enqueue(n),o.outputSize+=n.length,t.outputSize!==v&&o.outputSize>t.outputSize))throw new s(Rt)},flush(){const{crc32:t}=a;n.assign(o,{crc32:t,inputSize:i})}});n.defineProperty(o,"readable",{get:()=>f.pipeThrough(u).pipeThrough(a).pipeThrough(w)})}}class Xt extends d{constructor(t){const o=[];let s=0,c=0;function i(){const n=new r(t);let e=0;for(;e<t;){const s=o[0],r=t-e;s.length<=r?(n.set(s,e),e+=s.length,o.shift()):(n.set(s.subarray(0,r),e),o[0]=s.subarray(r),e+=r)}return s-=t,n}(!e.isFinite(t)||t<1)&&(t=65536),super({transform(n,e){for(o.push(n),s+=n.length;s>t;)c+=t,e.enqueue(i())},flush(t){s&&(c+=s,t.enqueue(function(t,n){const e=new r(n);let o=0;for(const n of t)e.set(n,o),o+=n.length;return e}(o,s)))}}),n.defineProperty(this,"outputSize",{get:()=>c})}}let Yt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Yt=navigator.hardwareConcurrency)}catch{}function Zt(t){return Boolean(t)&&"object"==typeof t}const $t=new f,_t=new f,tn=function(){try{return structuredClone(new s)instanceof s}catch{return!1}}();let nn=0;async function en(t){let n,r,c;try{const{options:i,config:a}=t;if(i.format)try{await async function(t,n){!Ft.has(t)&&n&&function(t,n){const{CompressionStream:e,DecompressionStream:o}=n;if(typeof e!=z&&typeof o!=z)throw new s("Invalid codec module");Ft.set(t,{CompressionStream:e,DecompressionStream:o})}(t,await(import(n)))}(i.format,i.codecURI)}catch(t){if(Zt(t))try{t.codecImportFailed=!0}catch{}throw t}if(a.CompressionStream=self.CompressionStream,a.DecompressionStream=self.DecompressionStream,i.compressed&&!i.format)if(i.useCompressionStream){if(!function(t,n){if(!t)return!1;let e=Kt.get(t);e||(e=new f,Kt.set(t,e));let o=e.get(n);if(o===v){try{new t(n),o=!0}catch{o=!1}e.set(n,o)}return o}(i.codecType.startsWith(Jt)?a.CompressionStream:a.DecompressionStream,Ut))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{i.useCompressionStream=!0}if(i.encrypted&&!i.zipCrypto)try{await self.initModule(t.config)}catch{}!a.CompressionStreamFallback&&a.CompressionStreamZlib&&(a.CompressionStreamFallback=a.CompressionStreamZlib),!a.DecompressionStreamFallback&&a.DecompressionStreamZlib&&(a.DecompressionStreamFallback=a.DecompressionStreamZlib);const u={highWaterMark:1},l=t.readable?Dt(t.readable):new y({async pull(t){const n=new w(t=>$t.set(nn,t));on({type:"pull",messageId:nn}),nn=(nn+1)%e.MAX_SAFE_INTEGER;const{value:o,done:s}=await n;t.enqueue(o),s&&t.close()}},u);c=t.writable?function(t){if(t instanceof m)return t;const n=t.getWriter();return new m({write:t=>n.write(t),close:()=>n.close(),abort:t=>n.abort(t)})}(t.writable):new m({async write(t){let n;const o=new w(t=>n=t);_t.set(nn,n),on({type:Gt,value:t,messageId:nn}),nn=(nn+1)%e.MAX_SAFE_INTEGER,await o}},u),n=new Qt(i,a),r=new Xt(function(t){return s="string"==typeof(n=s=t.chunkSize)&&n.trim()?e(n):n,e.isInteger(s)&&s>=1?o.max(s,64):65536;var n,s}(a)),await l.pipeThrough(n).pipeThrough(r).pipeTo(c,{preventClose:!0,preventAbort:!0}),await c.getWriter().close();const{crc32:h,inputSize:p,outputSize:d}=n;on({type:"close",result:{crc32:h,inputSize:p,outputSize:d}})}catch(t){const n=r?r.outputSize:0;if(Zt(t))try{t.outputSize=n}catch{}if(c&&!c.locked)try{await c.getWriter().close()}catch{}sn(t,n)}}function on(t){const{value:n}=t;if(n)if(n.length)try{t.value=(e=n,e.byteOffset||e.byteLength!=e.buffer.byteLength?new r(e):e).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var e}function sn(t,n){const{message:e,stack:o,code:r,name:c,outputSize:i,cause:a,codecImportFailed:f}=function(t=new s("Unknown error")){return Zt(t)?t:new s(String(t))}(t),u={message:e,stack:o,code:r,name:c,outputSize:i===v?n:i};if(a&&(u.cause={name:a.name,message:a.message}),f&&(u.codecImportFailed=!0),tn)try{return void p({error:u,errorValue:{value:t}})}catch{}p({error:u})}addEventListener("message",({data:t})=>{const{type:n,messageId:e,value:o,done:s}=t;try{if("start"==n&&en(t),n==Gt){const t=$t.get(e);$t.delete(e),t({value:o||new r,done:s})}if("ack"==n){const t=_t.get(e);_t.delete(e),t()}}catch(t){sn(t)}}),p({type:"ready"});const rn="deflate",cn="deflate-raw",an="deflate64-raw",fn="gzip";let un,wn,ln,hn,pn;function dn(t,n,e={}){if(!un){const t=new s("WASM module not loaded");throw t.cause=pn,t}const c="number"==typeof e.level?e.level:-1,i="number"==typeof e.outBuffer?e.outBuffer:65536,a="number"==typeof e.inBufferSize?e.inBufferSize:65536;return new d({start(){try{let e;if(this.C=wn(i),this.in=wn(a),this.inBufferSize=a,!this.C||!this.in)throw new s("allocation failed");if(this.I=new r(i),t?(this.A=un.deflate_process,this.M=un.deflate_last_consumed,this.P=un.deflate_end,this.D=un.deflate_new(),e=n===fn?un.deflate_init_gzip(this.D,c):n===cn?un.deflate_init_raw(this.D,c):un.deflate_init(this.D,c)):n===an?(this.A=un.inflate9_process,this.M=un.inflate9_last_consumed,this.P=un.inflate9_end,this.D=un.inflate9_new(),e=un.inflate9_init_raw(this.D)):(this.A=un.inflate_process,this.M=un.inflate_last_consumed,this.P=un.inflate_end,this.D=un.inflate_new(),e=n===cn?un.inflate_init_raw(this.D):n===fn?un.inflate_init_gzip(this.D):un.inflate_init(this.D)),0!==e)throw new s("init failed:"+e)}catch(t){throw f(this),t}},transform(t,n){try{const e=t,c=new r(hn.buffer),a=this.A,f=this.M,u=this.C,w=this.I;let l=0;for(;l<e.length;){const t=o.min(e.length-l,32768);if((!this.in||this.inBufferSize<t)&&(this.in&&ln&&(ln(this.in),this.in=0),this.in=wn(t),this.inBufferSize=t,!this.in))throw new s("allocation failed");c.set(e.subarray(l,l+t),this.in);const r=a(this.D,this.in,t,u,i,0),h=r>>24&255,p=128&h?h-256:h;if(p<0)throw new s("process error:"+p);const d=16777215&r;d&&(w.set(c.subarray(u,u+d),0),n.enqueue(w.slice(0,d)));const y=f(this.D);if(0===y&&0===d)break;l+=y}}catch(t){f(this),n.error(t)}},flush(t){try{const n=new r(hn.buffer),e=this.A,o=this.C,c=this.I;for(;;){const r=e(this.D,0,0,o,i,4),a=r>>24&255,f=128&a?a-256:a;if(f<0)throw new s("process error:"+f);const u=16777215&r;if(u&&(c.set(n.subarray(o,o+u),0),t.enqueue(c.slice(0,u))),1===a||0===u)break}}catch(n){t.error(n)}finally{const n=f(this);0!==n&&t.error(new s("end error:"+n))}},cancel(){f(this)}});function f(t){let n=0;return t.D&&t.P&&(n=t.P(t.D)),t.D=0,t.in&&ln&&ln(t.in),t.in=0,t.C&&ln&&ln(t.C),t.C=0,n}}class yn{constructor(t=rn,n){return dn(!0,t,n)}}class mn{constructor(t=rn,n){return dn(!1,t,n)}}yn.F=!0,mn.F=!0,yn.R=[rn,cn,fn],mn.R=[rn,cn,fn,an];const Sn=65536;let gn,vn;function bn(t){return new r(t.memory.buffer)}let zn=!1;!function(t={}){const{init:n,U:e}=t,o=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;e&&(lt=e||Q),self.initModule=async t=>{n&&await n(t),o&&(t.CompressionStreamFallback=o),s&&(t.DecompressionStreamFallback=s)}}({CompressionStreamFallback:yn,DecompressionStreamFallback:mn,U:function(t,n){const e=gn;let o=e?function(t,n,e){vn||(vn=t.malloc(Sn));const o=vn?t.aes_hmac_new():0;if(o){const s=bn(t);if(s.set(n,vn),s.set(e,vn+n.length),t.aes_hmac_init(o,vn,n.length,vn+n.length,e.length))return t.aes_hmac_end(o,0),0}return o}(e,t,n):0;if(!o)return Q(t,n);const s=vn;return{process(t,n){for(let r=0;r<t.length;r+=Sn){const c=t.subarray(r,r+Sn),i=bn(e);i.set(c,s),e.aes_hmac_process(o,s,c.length,n?1:0),c.set(i.subarray(s,s+c.length))}},digest:()=>(e.aes_hmac_end(o,s),o=0,bn(e).slice(s,s+20)),dispose(){o&&(e.aes_hmac_end(o,0),o=0)}}},init:t=>async function(t,{baseURI:n}){if(!zn)try{await async function(t,n){let e,o;try{try{o=new URL(t,n)}catch{}const s=await fetch(o);e=await s.arrayBuffer()}catch(n){if(!t.startsWith("data:application/wasm;base64,"))throw n;e=function(t){const n=t.split(",")[1],e=atob(n),o=e.length,s=new r(o);for(let t=0;t<o;++t)s[t]=e.charCodeAt(t);return s.buffer}(t)}const c=await WebAssembly.instantiate(e);var i;(function(t){if(un=t,({malloc:wn,free:ln,memory:hn}=un),"function"!=typeof wn||"function"!=typeof ln||!hn)throw un=wn=ln=hn=null,new s("Invalid WASM module")})(c.instance.exports),typeof(i=c.instance.exports).aes_hmac_new==z&&(gn=i,vn=0)}(t,n),zn=!0}catch(t){throw function(t){pn=t}(t),t}}(t.wasmURI,t)})});\n';if("string"==typeof s&&(s=(new TextEncoder).encode(s)),t){const t=new Blob([s],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+function(t){let n="";const s=t.length;let o=0;for(;o+2<s;o+=3){const s=t[o]<<16|t[o+1]<<8|t[o+2];n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+e$1[63&s];}const r=s-o;if(1===r){const s=t[o]<<16;n+=e$1[s>>18&63]+e$1[s>>12&63]+"==";}else if(2===r){const s=t[o]<<16|t[o+1]<<8;n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+"=";}return n}(s)}});
|
|
443
443
|
|
|
444
444
|
/*
|
|
445
445
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -569,7 +569,7 @@ for (let n = 0; n < 256; n++) {
|
|
|
569
569
|
T[k][n] = (previous >>> 8) ^ T[0][previous & 0xFF];
|
|
570
570
|
}
|
|
571
571
|
}
|
|
572
|
-
const [T0, T1, T2, T3, T4, T5, T6, T7] = T;
|
|
572
|
+
const [T0$1, T1$1, T2$1, T3$1, T4, T5, T6, T7] = T;
|
|
573
573
|
|
|
574
574
|
class Crc32 {
|
|
575
575
|
|
|
@@ -591,12 +591,12 @@ class Crc32 {
|
|
|
591
591
|
const a = crc ^ view.getInt32(offset, true);
|
|
592
592
|
const b = view.getInt32(offset + 4, true);
|
|
593
593
|
crc = T7[a & 0xFF] ^ T6[(a >>> 8) & 0xFF] ^ T5[(a >>> 16) & 0xFF] ^ T4[(a >>> 24) & 0xFF] ^
|
|
594
|
-
T3[b & 0xFF] ^ T2[(b >>> 8) & 0xFF] ^ T1[(b >>> 16) & 0xFF] ^ T0[(b >>> 24) & 0xFF];
|
|
594
|
+
T3$1[b & 0xFF] ^ T2$1[(b >>> 8) & 0xFF] ^ T1$1[(b >>> 16) & 0xFF] ^ T0$1[(b >>> 24) & 0xFF];
|
|
595
595
|
}
|
|
596
596
|
}
|
|
597
597
|
// Remaining tail (and non-typed inputs) byte-at-a-time with the base table.
|
|
598
598
|
for (; offset < length; offset++) {
|
|
599
|
-
crc = (crc >>> 8) ^ T0[(crc ^ data[offset]) & 0xFF];
|
|
599
|
+
crc = (crc >>> 8) ^ T0$1[(crc ^ data[offset]) & 0xFF];
|
|
600
600
|
}
|
|
601
601
|
this.crc = crc;
|
|
602
602
|
}
|
|
@@ -700,794 +700,349 @@ function encodeText(value) {
|
|
|
700
700
|
}
|
|
701
701
|
}
|
|
702
702
|
|
|
703
|
-
// Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
|
|
704
|
-
|
|
705
|
-
// deno-lint-ignore-file no-this-alias
|
|
706
|
-
|
|
707
703
|
/*
|
|
708
|
-
|
|
709
|
-
* license or under the GNU GPL, version 2.0.
|
|
710
|
-
*/
|
|
711
|
-
|
|
712
|
-
/** @fileOverview Javascript cryptography implementation.
|
|
713
|
-
*
|
|
714
|
-
* Crush to remove comments, shorten variable names and
|
|
715
|
-
* generally reduce transmission size.
|
|
716
|
-
*
|
|
717
|
-
* @author Emily Stark
|
|
718
|
-
* @author Mike Hamburg
|
|
719
|
-
* @author Dan Boneh
|
|
720
|
-
*/
|
|
721
|
-
|
|
722
|
-
/*jslint indent: 2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */
|
|
723
|
-
|
|
724
|
-
/** @fileOverview Arrays of bits, encoded as arrays of Numbers.
|
|
725
|
-
*
|
|
726
|
-
* @author Emily Stark
|
|
727
|
-
* @author Mike Hamburg
|
|
728
|
-
* @author Dan Boneh
|
|
729
|
-
*/
|
|
730
|
-
|
|
731
|
-
/**
|
|
732
|
-
* Arrays of bits, encoded as arrays of Numbers.
|
|
733
|
-
* @namespace
|
|
734
|
-
* @description
|
|
735
|
-
* <p>
|
|
736
|
-
* These objects are the currency accepted by SJCL's crypto functions.
|
|
737
|
-
* </p>
|
|
738
|
-
*
|
|
739
|
-
* <p>
|
|
740
|
-
* Most of our crypto primitives operate on arrays of 4-byte words internally,
|
|
741
|
-
* but many of them can take arguments that are not a multiple of 4 bytes.
|
|
742
|
-
* This library encodes arrays of bits (whose size need not be a multiple of 8
|
|
743
|
-
* bits) as arrays of 32-bit words. The bits are packed, big-endian, into an
|
|
744
|
-
* array of words, 32 bits at a time. Since the words are double-precision
|
|
745
|
-
* floating point numbers, they fit some extra data. We use this (in a private,
|
|
746
|
-
* possibly-changing manner) to encode the number of bits actually present
|
|
747
|
-
* in the last word of the array.
|
|
748
|
-
* </p>
|
|
749
|
-
*
|
|
750
|
-
* <p>
|
|
751
|
-
* Because bitwise ops clear this out-of-band data, these arrays can be passed
|
|
752
|
-
* to ciphers like AES which want arrays of words.
|
|
753
|
-
* </p>
|
|
754
|
-
*/
|
|
755
|
-
const bitArray = {
|
|
756
|
-
/**
|
|
757
|
-
* Concatenate two bit arrays.
|
|
758
|
-
* @param {bitArray} a1 The first array.
|
|
759
|
-
* @param {bitArray} a2 The second array.
|
|
760
|
-
* @return {bitArray} The concatenation of a1 and a2.
|
|
761
|
-
*/
|
|
762
|
-
concat(a1, a2) {
|
|
763
|
-
if (a1.length === 0 || a2.length === 0) {
|
|
764
|
-
return a1.concat(a2);
|
|
765
|
-
}
|
|
766
|
-
|
|
767
|
-
const last = a1[a1.length - 1], shift = bitArray.getPartial(last);
|
|
768
|
-
if (shift === 32) {
|
|
769
|
-
return a1.concat(a2);
|
|
770
|
-
} else {
|
|
771
|
-
return bitArray._shiftRight(a2, shift, last | 0, a1.slice(0, a1.length - 1));
|
|
772
|
-
}
|
|
773
|
-
},
|
|
774
|
-
|
|
775
|
-
/**
|
|
776
|
-
* Find the length of an array of bits.
|
|
777
|
-
* @param {bitArray} a The array.
|
|
778
|
-
* @return {Number} The length of a, in bits.
|
|
779
|
-
*/
|
|
780
|
-
bitLength(a) {
|
|
781
|
-
const l = a.length;
|
|
782
|
-
if (l === 0) {
|
|
783
|
-
return 0;
|
|
784
|
-
}
|
|
785
|
-
const x = a[l - 1];
|
|
786
|
-
return (l - 1) * 32 + bitArray.getPartial(x);
|
|
787
|
-
},
|
|
788
|
-
|
|
789
|
-
/**
|
|
790
|
-
* Truncate an array.
|
|
791
|
-
* @param {bitArray} a The array.
|
|
792
|
-
* @param {Number} len The length to truncate to, in bits.
|
|
793
|
-
* @return {bitArray} A new array, truncated to len bits.
|
|
794
|
-
*/
|
|
795
|
-
clamp(a, len) {
|
|
796
|
-
if (a.length * 32 < len) {
|
|
797
|
-
return a;
|
|
798
|
-
}
|
|
799
|
-
a = a.slice(0, Math.ceil(len / 32));
|
|
800
|
-
const l = a.length;
|
|
801
|
-
len = len & 31;
|
|
802
|
-
if (l > 0 && len) {
|
|
803
|
-
a[l - 1] = bitArray.partial(len, a[l - 1] & 0x80000000 >> (len - 1), 1);
|
|
804
|
-
}
|
|
805
|
-
return a;
|
|
806
|
-
},
|
|
807
|
-
|
|
808
|
-
/**
|
|
809
|
-
* Make a partial word for a bit array.
|
|
810
|
-
* @param {Number} len The number of bits in the word.
|
|
811
|
-
* @param {Number} x The bits.
|
|
812
|
-
* @param {Number} [_end=0] Pass 1 if x has already been shifted to the high side.
|
|
813
|
-
* @return {Number} The partial word.
|
|
814
|
-
*/
|
|
815
|
-
partial(len, x, _end) {
|
|
816
|
-
if (len === 32) {
|
|
817
|
-
return x;
|
|
818
|
-
}
|
|
819
|
-
return (_end ? x | 0 : x << (32 - len)) + len * 0x10000000000;
|
|
820
|
-
},
|
|
704
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
821
705
|
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
* @param {Number} x The partial word.
|
|
825
|
-
* @return {Number} The number of bits used by the partial word.
|
|
826
|
-
*/
|
|
827
|
-
getPartial(x) {
|
|
828
|
-
return Math.round(x / 0x10000000000) || 32;
|
|
829
|
-
},
|
|
706
|
+
Redistribution and use in source and binary forms, with or without
|
|
707
|
+
modification, are permitted provided that the following conditions are met:
|
|
830
708
|
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
* @param {Number} shift The number of bits to shift.
|
|
834
|
-
* @param {Number} [carry=0] A byte to carry in
|
|
835
|
-
* @param {bitArray} [out=[]] An array to prepend to the output.
|
|
836
|
-
* @private
|
|
837
|
-
*/
|
|
838
|
-
_shiftRight(a, shift, carry, out) {
|
|
839
|
-
if (out === undefined) {
|
|
840
|
-
out = [];
|
|
841
|
-
}
|
|
709
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
710
|
+
this list of conditions and the following disclaimer.
|
|
842
711
|
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
}
|
|
847
|
-
if (shift === 0) {
|
|
848
|
-
return out.concat(a);
|
|
849
|
-
}
|
|
712
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
713
|
+
notice, this list of conditions and the following disclaimer in
|
|
714
|
+
the documentation and/or other materials provided with the distribution.
|
|
850
715
|
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
carry = a[i] << (32 - shift);
|
|
854
|
-
}
|
|
855
|
-
const last2 = a.length ? a[a.length - 1] : 0;
|
|
856
|
-
const shift2 = bitArray.getPartial(last2);
|
|
857
|
-
out.push(bitArray.partial(shift + shift2 & 31, (shift + shift2 > 32) ? carry : out.pop(), 1));
|
|
858
|
-
return out;
|
|
859
|
-
}
|
|
860
|
-
};
|
|
716
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
717
|
+
derived from this software without specific prior written permission.
|
|
861
718
|
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
719
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
720
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
721
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
722
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
723
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
724
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
725
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
726
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
727
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
728
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
867
729
|
*/
|
|
868
730
|
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
const
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
tmp = 0;
|
|
900
|
-
}
|
|
731
|
+
const BLOCK_LENGTH$1 = 16;
|
|
732
|
+
const ROUND_KEYS_LENGTH = 60;
|
|
733
|
+
const SHA1_BLOCK_LENGTH = 64;
|
|
734
|
+
const SHA1_DIGEST_LENGTH = 20;
|
|
735
|
+
const SHA1_SCHEDULE_LENGTH = 80;
|
|
736
|
+
const SHA1_LENGTH_OFFSET = 56;
|
|
737
|
+
const SHA1_PADDING = new Uint8Array([0x80]);
|
|
738
|
+
const SHA1_ZERO = new Uint8Array(1);
|
|
739
|
+
const SHA1_INITIAL_STATE = new Int32Array([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
|
|
740
|
+
const HMAC_INNER_PADDING = 0x36;
|
|
741
|
+
const HMAC_OUTER_PADDING = 0x5c;
|
|
742
|
+
const S_BOX = new Uint8Array(256);
|
|
743
|
+
const T0 = new Int32Array(256);
|
|
744
|
+
const T1 = new Int32Array(256);
|
|
745
|
+
const T2 = new Int32Array(256);
|
|
746
|
+
const T3 = new Int32Array(256);
|
|
747
|
+
|
|
748
|
+
let tablesInitialized = false;
|
|
749
|
+
|
|
750
|
+
function createEngine$2(key, authenticationKey) {
|
|
751
|
+
initTables();
|
|
752
|
+
const roundKeys = new Int32Array(ROUND_KEYS_LENGTH);
|
|
753
|
+
const rounds = expandKey(key, roundKeys);
|
|
754
|
+
const counter = new Uint8Array(BLOCK_LENGTH$1);
|
|
755
|
+
const keystream = new Int32Array(BLOCK_LENGTH$1 / 4);
|
|
756
|
+
const hmac = createHmac(authenticationKey);
|
|
757
|
+
return {
|
|
758
|
+
process(data, decrypt) {
|
|
759
|
+
if (decrypt) {
|
|
760
|
+
hmac.update(data, 0, data.length);
|
|
901
761
|
}
|
|
902
|
-
|
|
903
|
-
|
|
762
|
+
encrypt(data);
|
|
763
|
+
if (!decrypt) {
|
|
764
|
+
hmac.update(data, 0, data.length);
|
|
904
765
|
}
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
};
|
|
909
|
-
|
|
910
|
-
const hash = {};
|
|
911
|
-
|
|
912
|
-
/**
|
|
913
|
-
* Context for a SHA-1 operation in progress.
|
|
914
|
-
* @constructor
|
|
915
|
-
*/
|
|
916
|
-
hash.sha1 = class {
|
|
917
|
-
constructor(hash) {
|
|
918
|
-
const sha1 = this;
|
|
919
|
-
/**
|
|
920
|
-
* The hash's block size, in bits.
|
|
921
|
-
* @constant
|
|
922
|
-
*/
|
|
923
|
-
sha1.blockSize = 512;
|
|
924
|
-
/**
|
|
925
|
-
* The SHA-1 initialization vector.
|
|
926
|
-
* @private
|
|
927
|
-
*/
|
|
928
|
-
sha1._init = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0];
|
|
929
|
-
/**
|
|
930
|
-
* The SHA-1 hash key.
|
|
931
|
-
* @private
|
|
932
|
-
*/
|
|
933
|
-
sha1._key = [0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6];
|
|
934
|
-
if (hash) {
|
|
935
|
-
sha1._h = hash._h.slice(0);
|
|
936
|
-
sha1._buffer = hash._buffer.slice(0);
|
|
937
|
-
sha1._length = hash._length;
|
|
938
|
-
} else {
|
|
939
|
-
sha1.reset();
|
|
940
|
-
}
|
|
941
|
-
}
|
|
942
|
-
|
|
943
|
-
/**
|
|
944
|
-
* Reset the hash state.
|
|
945
|
-
* @return this
|
|
946
|
-
*/
|
|
947
|
-
reset() {
|
|
948
|
-
const sha1 = this;
|
|
949
|
-
sha1._h = sha1._init.slice(0);
|
|
950
|
-
sha1._buffer = [];
|
|
951
|
-
sha1._length = 0;
|
|
952
|
-
return sha1;
|
|
953
|
-
}
|
|
954
|
-
|
|
955
|
-
/**
|
|
956
|
-
* Input several words to the hash.
|
|
957
|
-
* @param {bitArray|String} data the data to hash.
|
|
958
|
-
* @return this
|
|
959
|
-
*/
|
|
960
|
-
update(data) {
|
|
961
|
-
const sha1 = this;
|
|
962
|
-
if (typeof data === "string") {
|
|
963
|
-
data = codec.utf8String.toBits(data);
|
|
964
|
-
}
|
|
965
|
-
const b = sha1._buffer = bitArray.concat(sha1._buffer, data);
|
|
966
|
-
const ol = sha1._length;
|
|
967
|
-
const nl = sha1._length = ol + bitArray.bitLength(data);
|
|
968
|
-
if (nl > 9007199254740991) {
|
|
969
|
-
throw new Error("Cannot hash more than 2^53 - 1 bits");
|
|
970
|
-
}
|
|
971
|
-
const c = new Uint32Array(b);
|
|
972
|
-
let j = 0;
|
|
973
|
-
for (let i = sha1.blockSize + ol - ((sha1.blockSize + ol) & (sha1.blockSize - 1)); i <= nl;
|
|
974
|
-
i += sha1.blockSize) {
|
|
975
|
-
sha1._block(c.subarray(16 * j, 16 * (j + 1)));
|
|
976
|
-
j += 1;
|
|
977
|
-
}
|
|
978
|
-
b.splice(0, 16 * j);
|
|
979
|
-
return sha1;
|
|
980
|
-
}
|
|
981
|
-
|
|
982
|
-
/**
|
|
983
|
-
* Complete hashing and output the hash value.
|
|
984
|
-
* @return {bitArray} The hash value, an array of 5 big-endian words. TODO
|
|
985
|
-
*/
|
|
986
|
-
finalize() {
|
|
987
|
-
const sha1 = this;
|
|
988
|
-
let b = sha1._buffer;
|
|
989
|
-
const h = sha1._h;
|
|
990
|
-
|
|
991
|
-
// Round out and push the buffer
|
|
992
|
-
b = bitArray.concat(b, [bitArray.partial(1, 1)]);
|
|
993
|
-
// Round out the buffer to a multiple of 16 words, less the 2 length words.
|
|
994
|
-
for (let i = b.length + 2; i & 15; i++) {
|
|
995
|
-
b.push(0);
|
|
996
|
-
}
|
|
997
|
-
|
|
998
|
-
// append the length
|
|
999
|
-
b.push(Math.floor(sha1._length / 0x100000000));
|
|
1000
|
-
b.push(sha1._length | 0);
|
|
1001
|
-
|
|
1002
|
-
while (b.length) {
|
|
1003
|
-
sha1._block(b.splice(0, 16));
|
|
1004
|
-
}
|
|
1005
|
-
|
|
1006
|
-
sha1.reset();
|
|
1007
|
-
return h;
|
|
1008
|
-
}
|
|
1009
|
-
|
|
1010
|
-
/**
|
|
1011
|
-
* The SHA-1 logical functions f(0), f(1), ..., f(79).
|
|
1012
|
-
* @private
|
|
1013
|
-
*/
|
|
1014
|
-
_f(t, b, c, d) {
|
|
1015
|
-
if (t <= 19) {
|
|
1016
|
-
return (b & c) | (~b & d);
|
|
1017
|
-
} else if (t <= 39) {
|
|
1018
|
-
return b ^ c ^ d;
|
|
1019
|
-
} else if (t <= 59) {
|
|
1020
|
-
return (b & c) | (b & d) | (c & d);
|
|
1021
|
-
} else if (t <= 79) {
|
|
1022
|
-
return b ^ c ^ d;
|
|
1023
|
-
}
|
|
1024
|
-
}
|
|
1025
|
-
|
|
1026
|
-
/**
|
|
1027
|
-
* Circular left-shift operator.
|
|
1028
|
-
* @private
|
|
1029
|
-
*/
|
|
1030
|
-
_S(n, x) {
|
|
1031
|
-
return (x << n) | (x >>> 32 - n);
|
|
1032
|
-
}
|
|
1033
|
-
|
|
1034
|
-
/**
|
|
1035
|
-
* Perform one cycle of SHA-1.
|
|
1036
|
-
* @param {Uint32Array|bitArray} words one block of words.
|
|
1037
|
-
* @private
|
|
1038
|
-
*/
|
|
1039
|
-
_block(words) {
|
|
1040
|
-
const sha1 = this;
|
|
1041
|
-
const h = sha1._h;
|
|
1042
|
-
// When words is passed to _block, it has 16 elements. SHA1 _block
|
|
1043
|
-
// function extends words with new elements (at the end there are 80 elements).
|
|
1044
|
-
// The problem is that if we use Uint32Array instead of Array,
|
|
1045
|
-
// the length of Uint32Array cannot be changed. Thus, we replace words with a
|
|
1046
|
-
// normal Array here.
|
|
1047
|
-
const w = Array(80); // do not use Uint32Array here as the instantiation is slower
|
|
1048
|
-
for (let j = 0; j < 16; j++) {
|
|
1049
|
-
w[j] = words[j];
|
|
1050
|
-
}
|
|
1051
|
-
|
|
1052
|
-
let a = h[0];
|
|
1053
|
-
let b = h[1];
|
|
1054
|
-
let c = h[2];
|
|
1055
|
-
let d = h[3];
|
|
1056
|
-
let e = h[4];
|
|
1057
|
-
|
|
1058
|
-
for (let t = 0; t <= 79; t++) {
|
|
1059
|
-
if (t >= 16) {
|
|
1060
|
-
w[t] = sha1._S(1, w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16]);
|
|
1061
|
-
}
|
|
1062
|
-
const tmp = (sha1._S(5, a) + sha1._f(t, b, c, d) + e + w[t] +
|
|
1063
|
-
sha1._key[Math.floor(t / 20)]) | 0;
|
|
1064
|
-
e = d;
|
|
1065
|
-
d = c;
|
|
1066
|
-
c = sha1._S(30, b);
|
|
1067
|
-
b = a;
|
|
1068
|
-
a = tmp;
|
|
766
|
+
},
|
|
767
|
+
digest() {
|
|
768
|
+
return hmac.digest();
|
|
1069
769
|
}
|
|
770
|
+
};
|
|
1070
771
|
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
772
|
+
function encrypt(data) {
|
|
773
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
774
|
+
const length = data.length;
|
|
775
|
+
let offset = 0;
|
|
776
|
+
for (; offset + BLOCK_LENGTH$1 <= length; offset += BLOCK_LENGTH$1) {
|
|
777
|
+
nextKeystream();
|
|
778
|
+
view.setInt32(offset, view.getInt32(offset) ^ keystream[0]);
|
|
779
|
+
view.setInt32(offset + 4, view.getInt32(offset + 4) ^ keystream[1]);
|
|
780
|
+
view.setInt32(offset + 8, view.getInt32(offset + 8) ^ keystream[2]);
|
|
781
|
+
view.setInt32(offset + 12, view.getInt32(offset + 12) ^ keystream[3]);
|
|
782
|
+
}
|
|
783
|
+
if (offset < length) {
|
|
784
|
+
nextKeystream();
|
|
785
|
+
for (let indexByte = 0; offset < length; offset++, indexByte++) {
|
|
786
|
+
data[offset] ^= keystream[indexByte >> 2] >>> (24 - 8 * (indexByte & 3));
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
function nextKeystream() {
|
|
792
|
+
for (let indexByte = 0; indexByte < BLOCK_LENGTH$1; indexByte++) {
|
|
793
|
+
counter[indexByte]++;
|
|
794
|
+
if (counter[indexByte] !== 0) {
|
|
795
|
+
break;
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
let s0 = ((counter[0] << 24) | (counter[1] << 16) | (counter[2] << 8) | counter[3]) ^ roundKeys[0];
|
|
799
|
+
let s1 = ((counter[4] << 24) | (counter[5] << 16) | (counter[6] << 8) | counter[7]) ^ roundKeys[1];
|
|
800
|
+
let s2 = ((counter[8] << 24) | (counter[9] << 16) | (counter[10] << 8) | counter[11]) ^ roundKeys[2];
|
|
801
|
+
let s3 = ((counter[12] << 24) | (counter[13] << 16) | (counter[14] << 8) | counter[15]) ^ roundKeys[3];
|
|
802
|
+
let indexKey = 4;
|
|
803
|
+
for (let round = 1; round < rounds; round++, indexKey += 4) {
|
|
804
|
+
const t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[indexKey];
|
|
805
|
+
const t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[indexKey + 1];
|
|
806
|
+
const t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[indexKey + 2];
|
|
807
|
+
const t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[indexKey + 3];
|
|
808
|
+
s0 = t0;
|
|
809
|
+
s1 = t1;
|
|
810
|
+
s2 = t2;
|
|
811
|
+
s3 = t3;
|
|
812
|
+
}
|
|
813
|
+
keystream[0] = ((S_BOX[s0 >>> 24] << 24) | (S_BOX[(s1 >>> 16) & 255] << 16) | (S_BOX[(s2 >>> 8) & 255] << 8) | S_BOX[s3 & 255]) ^ roundKeys[indexKey];
|
|
814
|
+
keystream[1] = ((S_BOX[s1 >>> 24] << 24) | (S_BOX[(s2 >>> 16) & 255] << 16) | (S_BOX[(s3 >>> 8) & 255] << 8) | S_BOX[s0 & 255]) ^ roundKeys[indexKey + 1];
|
|
815
|
+
keystream[2] = ((S_BOX[s2 >>> 24] << 24) | (S_BOX[(s3 >>> 16) & 255] << 16) | (S_BOX[(s0 >>> 8) & 255] << 8) | S_BOX[s1 & 255]) ^ roundKeys[indexKey + 2];
|
|
816
|
+
keystream[3] = ((S_BOX[s3 >>> 24] << 24) | (S_BOX[(s0 >>> 16) & 255] << 16) | (S_BOX[(s1 >>> 8) & 255] << 8) | S_BOX[s2 & 255]) ^ roundKeys[indexKey + 3];
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
function pbkdf2(password, salt, iterations, length) {
|
|
821
|
+
const hmac = createHmac(password);
|
|
822
|
+
const result = new Uint8Array(length);
|
|
823
|
+
const block = new Uint8Array(salt.length + 4);
|
|
824
|
+
const blockView = new DataView(block.buffer);
|
|
825
|
+
block.set(salt);
|
|
826
|
+
for (let indexBlock = 1, offset = 0; offset < length; indexBlock++, offset += SHA1_DIGEST_LENGTH) {
|
|
827
|
+
blockView.setUint32(salt.length, indexBlock);
|
|
828
|
+
hmac.update(block, 0, block.length);
|
|
829
|
+
let previous = hmac.digest();
|
|
830
|
+
const output = previous.slice();
|
|
831
|
+
for (let iteration = 1; iteration < iterations; iteration++) {
|
|
832
|
+
hmac.update(previous, 0, SHA1_DIGEST_LENGTH);
|
|
833
|
+
previous = hmac.digest();
|
|
834
|
+
for (let indexByte = 0; indexByte < SHA1_DIGEST_LENGTH; indexByte++) {
|
|
835
|
+
output[indexByte] ^= previous[indexByte];
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
result.set(output.subarray(0, Math.min(SHA1_DIGEST_LENGTH, length - offset)), offset);
|
|
1076
839
|
}
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
/** @fileOverview Low-level AES implementation.
|
|
1080
|
-
*
|
|
1081
|
-
* This file contains a low-level implementation of AES, optimized for
|
|
1082
|
-
* size and for efficiency on several browsers. It is based on
|
|
1083
|
-
* OpenSSL's aes_core.c, a public-domain implementation by Vincent
|
|
1084
|
-
* Rijmen, Antoon Bosselaers and Paulo Barreto.
|
|
1085
|
-
*
|
|
1086
|
-
* An older version of this implementation is available in the public
|
|
1087
|
-
* domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh,
|
|
1088
|
-
* Stanford University 2008-2010 and BSD-licensed for liability
|
|
1089
|
-
* reasons.
|
|
1090
|
-
*
|
|
1091
|
-
* @author Emily Stark
|
|
1092
|
-
* @author Mike Hamburg
|
|
1093
|
-
* @author Dan Boneh
|
|
1094
|
-
*/
|
|
1095
|
-
|
|
1096
|
-
const cipher = {};
|
|
1097
|
-
|
|
1098
|
-
/**
|
|
1099
|
-
* Schedule out an AES key for both encryption and decryption. This
|
|
1100
|
-
* is a low-level class. Use a cipher mode to do bulk encryption.
|
|
1101
|
-
*
|
|
1102
|
-
* @constructor
|
|
1103
|
-
* @param {Array} key The key as an array of 4, 6 or 8 words.
|
|
1104
|
-
*/
|
|
1105
|
-
cipher.aes = class {
|
|
1106
|
-
constructor(key) {
|
|
1107
|
-
/**
|
|
1108
|
-
* The expanded S-box and inverse S-box tables. These will be computed
|
|
1109
|
-
* on the client so that we don't have to send them down the wire.
|
|
1110
|
-
*
|
|
1111
|
-
* There are two tables, _tables[0] is for encryption and
|
|
1112
|
-
* _tables[1] is for decryption.
|
|
1113
|
-
*
|
|
1114
|
-
* The first 4 sub-tables are the expanded S-box with MixColumns. The
|
|
1115
|
-
* last (_tables[01][4]) is the S-box itself.
|
|
1116
|
-
*
|
|
1117
|
-
* @private
|
|
1118
|
-
*/
|
|
1119
|
-
const aes = this;
|
|
1120
|
-
aes._tables = [[[], [], [], [], []], [[], [], [], [], []]];
|
|
1121
|
-
|
|
1122
|
-
if (!aes._tables[0][0][0]) {
|
|
1123
|
-
aes._precompute();
|
|
1124
|
-
}
|
|
1125
|
-
|
|
1126
|
-
const sbox = aes._tables[0][4];
|
|
1127
|
-
const decTable = aes._tables[1];
|
|
1128
|
-
const keyLen = key.length;
|
|
1129
|
-
|
|
1130
|
-
let i, encKey, decKey, rcon = 1;
|
|
1131
|
-
|
|
1132
|
-
if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) {
|
|
1133
|
-
throw new Error("invalid aes key size");
|
|
1134
|
-
}
|
|
1135
|
-
|
|
1136
|
-
aes._key = [encKey = key.slice(0), decKey = []];
|
|
1137
|
-
|
|
1138
|
-
// schedule encryption keys
|
|
1139
|
-
for (i = keyLen; i < 4 * keyLen + 28; i++) {
|
|
1140
|
-
let tmp = encKey[i - 1];
|
|
1141
|
-
|
|
1142
|
-
// apply sbox
|
|
1143
|
-
if (i % keyLen === 0 || (keyLen === 8 && i % keyLen === 4)) {
|
|
1144
|
-
tmp = sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255];
|
|
1145
|
-
|
|
1146
|
-
// shift rows and add rcon
|
|
1147
|
-
if (i % keyLen === 0) {
|
|
1148
|
-
tmp = tmp << 8 ^ tmp >>> 24 ^ rcon << 24;
|
|
1149
|
-
rcon = rcon << 1 ^ (rcon >> 7) * 283;
|
|
1150
|
-
}
|
|
1151
|
-
}
|
|
1152
|
-
|
|
1153
|
-
encKey[i] = encKey[i - keyLen] ^ tmp;
|
|
1154
|
-
}
|
|
840
|
+
return result;
|
|
841
|
+
}
|
|
1155
842
|
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
decTable[1][sbox[tmp >> 16 & 255]] ^
|
|
1164
|
-
decTable[2][sbox[tmp >> 8 & 255]] ^
|
|
1165
|
-
decTable[3][sbox[tmp & 255]];
|
|
1166
|
-
}
|
|
1167
|
-
}
|
|
1168
|
-
}
|
|
1169
|
-
// public
|
|
1170
|
-
/* Something like this might appear here eventually
|
|
1171
|
-
name: "AES",
|
|
1172
|
-
blockSize: 4,
|
|
1173
|
-
keySizes: [4,6,8],
|
|
1174
|
-
*/
|
|
1175
|
-
|
|
1176
|
-
/**
|
|
1177
|
-
* Encrypt an array of 4 big-endian words.
|
|
1178
|
-
* @param {Array} data The plaintext.
|
|
1179
|
-
* @return {Array} The ciphertext.
|
|
1180
|
-
*/
|
|
1181
|
-
encrypt(data) {
|
|
1182
|
-
return this._crypt(data, 0);
|
|
1183
|
-
}
|
|
1184
|
-
|
|
1185
|
-
/**
|
|
1186
|
-
* Decrypt an array of 4 big-endian words.
|
|
1187
|
-
* @param {Array} data The ciphertext.
|
|
1188
|
-
* @return {Array} The plaintext.
|
|
1189
|
-
*/
|
|
1190
|
-
decrypt(data) {
|
|
1191
|
-
return this._crypt(data, 1);
|
|
1192
|
-
}
|
|
1193
|
-
|
|
1194
|
-
/**
|
|
1195
|
-
* Expand the S-box tables.
|
|
1196
|
-
*
|
|
1197
|
-
* @private
|
|
1198
|
-
*/
|
|
1199
|
-
_precompute() {
|
|
1200
|
-
const encTable = this._tables[0];
|
|
1201
|
-
const decTable = this._tables[1];
|
|
1202
|
-
const sbox = encTable[4];
|
|
1203
|
-
const sboxInv = decTable[4];
|
|
1204
|
-
const d = [];
|
|
1205
|
-
const th = [];
|
|
1206
|
-
let xInv, x2, x4, x8;
|
|
1207
|
-
|
|
1208
|
-
// Compute double and third tables
|
|
1209
|
-
for (let i = 0; i < 256; i++) {
|
|
1210
|
-
th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i;
|
|
1211
|
-
}
|
|
1212
|
-
|
|
1213
|
-
for (let x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {
|
|
1214
|
-
// Compute sbox
|
|
1215
|
-
let s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;
|
|
1216
|
-
s = s >> 8 ^ s & 255 ^ 99;
|
|
1217
|
-
sbox[x] = s;
|
|
1218
|
-
sboxInv[s] = x;
|
|
1219
|
-
|
|
1220
|
-
// Compute MixColumns
|
|
1221
|
-
x8 = d[x4 = d[x2 = d[x]]];
|
|
1222
|
-
let tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;
|
|
1223
|
-
let tEnc = d[s] * 0x101 ^ s * 0x1010100;
|
|
1224
|
-
|
|
1225
|
-
for (let i = 0; i < 4; i++) {
|
|
1226
|
-
encTable[i][x] = tEnc = tEnc << 24 ^ tEnc >>> 8;
|
|
1227
|
-
decTable[i][s] = tDec = tDec << 24 ^ tDec >>> 8;
|
|
1228
|
-
}
|
|
1229
|
-
}
|
|
1230
|
-
|
|
1231
|
-
// Compactify. Considerable speedup on Firefox.
|
|
1232
|
-
for (let i = 0; i < 5; i++) {
|
|
1233
|
-
encTable[i] = encTable[i].slice(0);
|
|
1234
|
-
decTable[i] = decTable[i].slice(0);
|
|
1235
|
-
}
|
|
1236
|
-
}
|
|
1237
|
-
|
|
1238
|
-
/**
|
|
1239
|
-
* Encryption and decryption core.
|
|
1240
|
-
* @param {Array} input Four words to be encrypted or decrypted.
|
|
1241
|
-
* @param dir The direction, 0 for encrypt and 1 for decrypt.
|
|
1242
|
-
* @return {Array} The four encrypted or decrypted words.
|
|
1243
|
-
* @private
|
|
1244
|
-
*/
|
|
1245
|
-
_crypt(input, dir) {
|
|
1246
|
-
if (input.length !== 4) {
|
|
1247
|
-
throw new Error("invalid aes block size");
|
|
1248
|
-
}
|
|
1249
|
-
|
|
1250
|
-
const key = this._key[dir];
|
|
1251
|
-
|
|
1252
|
-
const nInnerRounds = key.length / 4 - 2;
|
|
1253
|
-
const out = [0, 0, 0, 0];
|
|
1254
|
-
const table = this._tables[dir];
|
|
1255
|
-
|
|
1256
|
-
// load up the tables
|
|
1257
|
-
const t0 = table[0];
|
|
1258
|
-
const t1 = table[1];
|
|
1259
|
-
const t2 = table[2];
|
|
1260
|
-
const t3 = table[3];
|
|
1261
|
-
const sbox = table[4];
|
|
1262
|
-
|
|
1263
|
-
// state variables a,b,c,d are loaded with pre-whitened data
|
|
1264
|
-
let a = input[0] ^ key[0];
|
|
1265
|
-
let b = input[dir ? 3 : 1] ^ key[1];
|
|
1266
|
-
let c = input[2] ^ key[2];
|
|
1267
|
-
let d = input[dir ? 1 : 3] ^ key[3];
|
|
1268
|
-
let kIndex = 4;
|
|
1269
|
-
let a2, b2, c2;
|
|
1270
|
-
|
|
1271
|
-
// Inner rounds. Cribbed from OpenSSL.
|
|
1272
|
-
for (let i = 0; i < nInnerRounds; i++) {
|
|
1273
|
-
a2 = t0[a >>> 24] ^ t1[b >> 16 & 255] ^ t2[c >> 8 & 255] ^ t3[d & 255] ^ key[kIndex];
|
|
1274
|
-
b2 = t0[b >>> 24] ^ t1[c >> 16 & 255] ^ t2[d >> 8 & 255] ^ t3[a & 255] ^ key[kIndex + 1];
|
|
1275
|
-
c2 = t0[c >>> 24] ^ t1[d >> 16 & 255] ^ t2[a >> 8 & 255] ^ t3[b & 255] ^ key[kIndex + 2];
|
|
1276
|
-
d = t0[d >>> 24] ^ t1[a >> 16 & 255] ^ t2[b >> 8 & 255] ^ t3[c & 255] ^ key[kIndex + 3];
|
|
1277
|
-
kIndex += 4;
|
|
1278
|
-
a = a2; b = b2; c = c2;
|
|
1279
|
-
}
|
|
1280
|
-
|
|
1281
|
-
// Last round.
|
|
1282
|
-
for (let i = 0; i < 4; i++) {
|
|
1283
|
-
out[dir ? 3 & -i : i] =
|
|
1284
|
-
sbox[a >>> 24] << 24 ^
|
|
1285
|
-
sbox[b >> 16 & 255] << 16 ^
|
|
1286
|
-
sbox[c >> 8 & 255] << 8 ^
|
|
1287
|
-
sbox[d & 255] ^
|
|
1288
|
-
key[kIndex++];
|
|
1289
|
-
a2 = a; a = b; b = c; c = d; d = a2;
|
|
1290
|
-
}
|
|
1291
|
-
|
|
1292
|
-
return out;
|
|
843
|
+
function createHmac(key) {
|
|
844
|
+
const sha1 = createSha1();
|
|
845
|
+
const innerKey = new Uint8Array(SHA1_BLOCK_LENGTH);
|
|
846
|
+
const outerKey = new Uint8Array(SHA1_BLOCK_LENGTH);
|
|
847
|
+
if (key.length > SHA1_BLOCK_LENGTH) {
|
|
848
|
+
sha1.update(key, 0, key.length);
|
|
849
|
+
key = sha1.digest();
|
|
1293
850
|
}
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
* Special thanks to Roy Nicholson for pointing out a bug in our
|
|
1299
|
-
* implementation.
|
|
1300
|
-
*
|
|
1301
|
-
* @author Emily Stark
|
|
1302
|
-
* @author Mike Hamburg
|
|
1303
|
-
* @author Dan Boneh
|
|
1304
|
-
*/
|
|
1305
|
-
|
|
1306
|
-
/** Brian Gladman's CTR Mode.
|
|
1307
|
-
* @constructor
|
|
1308
|
-
* @param {Object} _prf The aes instance to generate key.
|
|
1309
|
-
* @param {bitArray} _iv The iv for ctr mode, it must be 128 bits.
|
|
1310
|
-
*/
|
|
1311
|
-
|
|
1312
|
-
const mode = {};
|
|
1313
|
-
|
|
1314
|
-
/**
|
|
1315
|
-
* Brian Gladman's CTR Mode.
|
|
1316
|
-
* @namespace
|
|
1317
|
-
*/
|
|
1318
|
-
mode.ctrGladman = class {
|
|
1319
|
-
constructor(prf, iv) {
|
|
1320
|
-
this._prf = prf;
|
|
1321
|
-
this._initIv = iv;
|
|
1322
|
-
this._iv = iv;
|
|
851
|
+
for (let indexByte = 0; indexByte < SHA1_BLOCK_LENGTH; indexByte++) {
|
|
852
|
+
const keyByte = indexByte < key.length ? key[indexByte] : 0;
|
|
853
|
+
innerKey[indexByte] = keyByte ^ HMAC_INNER_PADDING;
|
|
854
|
+
outerKey[indexByte] = keyByte ^ HMAC_OUTER_PADDING;
|
|
1323
855
|
}
|
|
856
|
+
sha1.update(innerKey, 0, SHA1_BLOCK_LENGTH);
|
|
857
|
+
return {
|
|
858
|
+
update(data, offset, length) {
|
|
859
|
+
sha1.update(data, offset, length);
|
|
860
|
+
},
|
|
861
|
+
digest() {
|
|
862
|
+
const innerDigest = sha1.digest();
|
|
863
|
+
sha1.update(outerKey, 0, SHA1_BLOCK_LENGTH);
|
|
864
|
+
sha1.update(innerDigest, 0, SHA1_DIGEST_LENGTH);
|
|
865
|
+
const result = sha1.digest();
|
|
866
|
+
sha1.update(innerKey, 0, SHA1_BLOCK_LENGTH);
|
|
867
|
+
return result;
|
|
868
|
+
}
|
|
869
|
+
};
|
|
870
|
+
}
|
|
1324
871
|
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
872
|
+
function createSha1() {
|
|
873
|
+
const state = new Int32Array(SHA1_INITIAL_STATE);
|
|
874
|
+
const schedule = new Int32Array(SHA1_SCHEDULE_LENGTH);
|
|
875
|
+
const block = new Uint8Array(SHA1_BLOCK_LENGTH);
|
|
876
|
+
const blockView = new DataView(block.buffer);
|
|
877
|
+
const lengthBytes = new Uint8Array(8);
|
|
878
|
+
let blockLength = 0;
|
|
879
|
+
let totalLength = 0;
|
|
880
|
+
return {
|
|
881
|
+
update,
|
|
882
|
+
digest
|
|
883
|
+
};
|
|
1328
884
|
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
885
|
+
function update(data, offset, length) {
|
|
886
|
+
const end = offset + length;
|
|
887
|
+
totalLength += length;
|
|
888
|
+
if (blockLength) {
|
|
889
|
+
while (offset < end && blockLength < SHA1_BLOCK_LENGTH) {
|
|
890
|
+
block[blockLength++] = data[offset++];
|
|
891
|
+
}
|
|
892
|
+
if (blockLength == SHA1_BLOCK_LENGTH) {
|
|
893
|
+
compress(blockView, 0);
|
|
894
|
+
blockLength = 0;
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
if (offset + SHA1_BLOCK_LENGTH <= end) {
|
|
898
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
899
|
+
for (; offset + SHA1_BLOCK_LENGTH <= end; offset += SHA1_BLOCK_LENGTH) {
|
|
900
|
+
compress(view, offset);
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
while (offset < end) {
|
|
904
|
+
block[blockLength++] = data[offset++];
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
function digest() {
|
|
909
|
+
const bits = totalLength * 8;
|
|
910
|
+
const high = Math.floor(bits / 0x100000000);
|
|
911
|
+
const low = bits >>> 0;
|
|
912
|
+
update(SHA1_PADDING, 0, 1);
|
|
913
|
+
while (blockLength != SHA1_LENGTH_OFFSET) {
|
|
914
|
+
update(SHA1_ZERO, 0, 1);
|
|
915
|
+
}
|
|
916
|
+
lengthBytes[0] = high >>> 24;
|
|
917
|
+
lengthBytes[1] = high >>> 16;
|
|
918
|
+
lengthBytes[2] = high >>> 8;
|
|
919
|
+
lengthBytes[3] = high;
|
|
920
|
+
lengthBytes[4] = low >>> 24;
|
|
921
|
+
lengthBytes[5] = low >>> 16;
|
|
922
|
+
lengthBytes[6] = low >>> 8;
|
|
923
|
+
lengthBytes[7] = low;
|
|
924
|
+
update(lengthBytes, 0, 8);
|
|
925
|
+
const result = new Uint8Array(SHA1_DIGEST_LENGTH);
|
|
926
|
+
const resultView = new DataView(result.buffer);
|
|
927
|
+
for (let indexWord = 0; indexWord < state.length; indexWord++) {
|
|
928
|
+
resultView.setInt32(4 * indexWord, state[indexWord]);
|
|
929
|
+
}
|
|
930
|
+
state.set(SHA1_INITIAL_STATE);
|
|
931
|
+
blockLength = 0;
|
|
932
|
+
totalLength = 0;
|
|
933
|
+
return result;
|
|
1334
934
|
}
|
|
1335
935
|
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
let b2 = (word >> 8) & 0xff;
|
|
1340
|
-
let b3 = word & 0xff;
|
|
1341
|
-
|
|
1342
|
-
if (b1 === 0xff) { // overflow b1
|
|
1343
|
-
b1 = 0;
|
|
1344
|
-
if (b2 === 0xff) {
|
|
1345
|
-
b2 = 0;
|
|
1346
|
-
if (b3 === 0xff) {
|
|
1347
|
-
b3 = 0;
|
|
1348
|
-
} else {
|
|
1349
|
-
++b3;
|
|
1350
|
-
}
|
|
1351
|
-
} else {
|
|
1352
|
-
++b2;
|
|
1353
|
-
}
|
|
1354
|
-
} else {
|
|
1355
|
-
++b1;
|
|
1356
|
-
}
|
|
1357
|
-
|
|
1358
|
-
word = 0;
|
|
1359
|
-
word += (b1 << 16);
|
|
1360
|
-
word += (b2 << 8);
|
|
1361
|
-
word += b3;
|
|
1362
|
-
} else {
|
|
1363
|
-
word += (0x01 << 24);
|
|
936
|
+
function compress(view, offset) {
|
|
937
|
+
for (let index = 0; index < 16; index++) {
|
|
938
|
+
schedule[index] = view.getInt32(offset + 4 * index);
|
|
1364
939
|
}
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
incCounter(counter) {
|
|
1369
|
-
if ((counter[0] = this.incWord(counter[0])) === 0) {
|
|
1370
|
-
// encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8
|
|
1371
|
-
counter[1] = this.incWord(counter[1]);
|
|
940
|
+
for (let index = 16; index < SHA1_SCHEDULE_LENGTH; index++) {
|
|
941
|
+
const word = schedule[index - 3] ^ schedule[index - 8] ^ schedule[index - 14] ^ schedule[index - 16];
|
|
942
|
+
schedule[index] = (word << 1) | (word >>> 31);
|
|
1372
943
|
}
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
let
|
|
1377
|
-
|
|
1378
|
-
|
|
944
|
+
let a = state[0];
|
|
945
|
+
let b = state[1];
|
|
946
|
+
let c = state[2];
|
|
947
|
+
let d = state[3];
|
|
948
|
+
let e = state[4];
|
|
949
|
+
let t;
|
|
950
|
+
for (let index = 0; index < 20; index++) {
|
|
951
|
+
t = (((a << 5) | (a >>> 27)) + ((b & c) | (~b & d)) + e + 0x5A827999 + schedule[index]) | 0;
|
|
952
|
+
e = d;
|
|
953
|
+
d = c;
|
|
954
|
+
c = (b << 30) | (b >>> 2);
|
|
955
|
+
b = a;
|
|
956
|
+
a = t;
|
|
957
|
+
}
|
|
958
|
+
for (let index = 20; index < 40; index++) {
|
|
959
|
+
t = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0x6ED9EBA1 + schedule[index]) | 0;
|
|
960
|
+
e = d;
|
|
961
|
+
d = c;
|
|
962
|
+
c = (b << 30) | (b >>> 2);
|
|
963
|
+
b = a;
|
|
964
|
+
a = t;
|
|
1379
965
|
}
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
data[i + 3] ^= e[3];
|
|
966
|
+
for (let index = 40; index < 60; index++) {
|
|
967
|
+
t = (((a << 5) | (a >>> 27)) + ((b & c) | (b & d) | (c & d)) + e + 0x8F1BBCDC + schedule[index]) | 0;
|
|
968
|
+
e = d;
|
|
969
|
+
d = c;
|
|
970
|
+
c = (b << 30) | (b >>> 2);
|
|
971
|
+
b = a;
|
|
972
|
+
a = t;
|
|
1388
973
|
}
|
|
1389
|
-
|
|
974
|
+
for (let index = 60; index < SHA1_SCHEDULE_LENGTH; index++) {
|
|
975
|
+
t = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0xCA62C1D6 + schedule[index]) | 0;
|
|
976
|
+
e = d;
|
|
977
|
+
d = c;
|
|
978
|
+
c = (b << 30) | (b >>> 2);
|
|
979
|
+
b = a;
|
|
980
|
+
a = t;
|
|
981
|
+
}
|
|
982
|
+
state[0] = (state[0] + a) | 0;
|
|
983
|
+
state[1] = (state[1] + b) | 0;
|
|
984
|
+
state[2] = (state[2] + c) | 0;
|
|
985
|
+
state[3] = (state[3] + d) | 0;
|
|
986
|
+
state[4] = (state[4] + e) | 0;
|
|
1390
987
|
}
|
|
1391
|
-
}
|
|
988
|
+
}
|
|
1392
989
|
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
const arrayBuffer = new ArrayBuffer(byteLength);
|
|
1405
|
-
const out = new DataView(arrayBuffer);
|
|
1406
|
-
let outLength = 0;
|
|
1407
|
-
const b = bitArray;
|
|
1408
|
-
salt = codec.bytes.toBits(salt);
|
|
1409
|
-
for (k = 1; outLength < (byteLength || 1); k++) {
|
|
1410
|
-
u = ui = prf.encrypt(b.concat(salt, [k]));
|
|
1411
|
-
for (i = 1; i < count; i++) {
|
|
1412
|
-
ui = prf.encrypt(ui);
|
|
1413
|
-
for (j = 0; j < ui.length; j++) {
|
|
1414
|
-
u[j] ^= ui[j];
|
|
1415
|
-
}
|
|
1416
|
-
}
|
|
1417
|
-
for (i = 0; outLength < (byteLength || 1) && i < u.length; i++) {
|
|
1418
|
-
out.setInt32(outLength, u[i]);
|
|
1419
|
-
outLength += 4;
|
|
990
|
+
function initTables() {
|
|
991
|
+
if (!tablesInitialized) {
|
|
992
|
+
let p = 1;
|
|
993
|
+
let q = 1;
|
|
994
|
+
do {
|
|
995
|
+
p = (p ^ (p << 1) ^ ((p & 0x80) ? 0x1b : 0)) & 255;
|
|
996
|
+
q = (q ^ (q << 1)) & 255;
|
|
997
|
+
q = (q ^ (q << 2)) & 255;
|
|
998
|
+
q = (q ^ (q << 4)) & 255;
|
|
999
|
+
if (q & 0x80) {
|
|
1000
|
+
q ^= 0x09;
|
|
1420
1001
|
}
|
|
1002
|
+
S_BOX[p] = (q ^ ((q << 1) | (q >> 7)) ^ ((q << 2) | (q >> 6)) ^ ((q << 3) | (q >> 5)) ^ ((q << 4) | (q >> 4)) ^ 0x63) & 255;
|
|
1003
|
+
} while (p != 1);
|
|
1004
|
+
S_BOX[0] = 0x63;
|
|
1005
|
+
for (let index = 0; index < 256; index++) {
|
|
1006
|
+
const s = S_BOX[index];
|
|
1007
|
+
const s2 = multiplyByTwo(s);
|
|
1008
|
+
const t = (s2 << 24) | (s << 16) | (s << 8) | (s2 ^ s);
|
|
1009
|
+
T0[index] = t;
|
|
1010
|
+
T1[index] = (t >>> 8) | (t << 24);
|
|
1011
|
+
T2[index] = (t >>> 16) | (t << 16);
|
|
1012
|
+
T3[index] = (t >>> 24) | (t << 8);
|
|
1421
1013
|
}
|
|
1422
|
-
|
|
1014
|
+
tablesInitialized = true;
|
|
1423
1015
|
}
|
|
1424
|
-
}
|
|
1425
|
-
|
|
1426
|
-
/** @fileOverview HMAC implementation.
|
|
1427
|
-
*
|
|
1428
|
-
* @author Emily Stark
|
|
1429
|
-
* @author Mike Hamburg
|
|
1430
|
-
* @author Dan Boneh
|
|
1431
|
-
*/
|
|
1432
|
-
|
|
1433
|
-
/** HMAC with the specified hash function.
|
|
1434
|
-
* @constructor
|
|
1435
|
-
* @param {bitArray} key the key for HMAC.
|
|
1436
|
-
* @param {Object} [Hash=hash.sha1] The hash function to use.
|
|
1437
|
-
*/
|
|
1438
|
-
misc.hmacSha1 = class {
|
|
1439
|
-
|
|
1440
|
-
constructor(key) {
|
|
1441
|
-
const hmac = this;
|
|
1442
|
-
const Hash = hmac._hash = hash.sha1;
|
|
1443
|
-
const exKey = [[], []];
|
|
1444
|
-
hmac._baseHash = [new Hash(), new Hash()];
|
|
1445
|
-
const bs = hmac._baseHash[0].blockSize / 32;
|
|
1446
|
-
|
|
1447
|
-
if (key.length > bs) {
|
|
1448
|
-
key = new Hash().update(key).finalize();
|
|
1449
|
-
}
|
|
1450
|
-
|
|
1451
|
-
for (let i = 0; i < bs; i++) {
|
|
1452
|
-
exKey[0][i] = key[i] ^ 0x36363636;
|
|
1453
|
-
exKey[1][i] = key[i] ^ 0x5C5C5C5C;
|
|
1454
|
-
}
|
|
1016
|
+
}
|
|
1455
1017
|
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1018
|
+
function expandKey(key, roundKeys) {
|
|
1019
|
+
const keyWords = key.length >> 2;
|
|
1020
|
+
const rounds = keyWords + 6;
|
|
1021
|
+
const total = 4 * (rounds + 1);
|
|
1022
|
+
let roundConstant = 1;
|
|
1023
|
+
for (let index = 0; index < keyWords; index++) {
|
|
1024
|
+
roundKeys[index] = (key[4 * index] << 24) | (key[4 * index + 1] << 16) | (key[4 * index + 2] << 8) | key[4 * index + 3];
|
|
1459
1025
|
}
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
hmac._resultHash.update(data);
|
|
1026
|
+
for (let index = keyWords; index < total; index++) {
|
|
1027
|
+
let word = roundKeys[index - 1];
|
|
1028
|
+
if (index % keyWords == 0) {
|
|
1029
|
+
word = substituteWord((word << 8) | (word >>> 24)) ^ (roundConstant << 24);
|
|
1030
|
+
roundConstant = multiplyByTwo(roundConstant);
|
|
1031
|
+
} else if (keyWords > 6 && index % keyWords == 4) {
|
|
1032
|
+
word = substituteWord(word);
|
|
1033
|
+
}
|
|
1034
|
+
roundKeys[index] = roundKeys[index - keyWords] ^ word;
|
|
1470
1035
|
}
|
|
1036
|
+
return rounds;
|
|
1037
|
+
}
|
|
1471
1038
|
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
const result = new (hmac._hash)(hmac._baseHash[1]).update(w).finalize();
|
|
1476
|
-
|
|
1477
|
-
hmac.reset();
|
|
1478
|
-
|
|
1479
|
-
return result;
|
|
1480
|
-
}
|
|
1039
|
+
function substituteWord(word) {
|
|
1040
|
+
return (S_BOX[word >>> 24] << 24) | (S_BOX[(word >>> 16) & 255] << 16) | (S_BOX[(word >>> 8) & 255] << 8) | S_BOX[word & 255];
|
|
1041
|
+
}
|
|
1481
1042
|
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
return this.digest(data);
|
|
1486
|
-
} else {
|
|
1487
|
-
throw new Error("encrypt on already updated hmac called!");
|
|
1488
|
-
}
|
|
1489
|
-
}
|
|
1490
|
-
};
|
|
1043
|
+
function multiplyByTwo(value) {
|
|
1044
|
+
return ((value << 1) ^ ((value >> 7) * 0x1b)) & 255;
|
|
1045
|
+
}
|
|
1491
1046
|
|
|
1492
1047
|
/*
|
|
1493
1048
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -1542,8 +1097,8 @@ function getRandomValues(array) {
|
|
|
1542
1097
|
1. Redistributions of source code must retain the above copyright notice,
|
|
1543
1098
|
this list of conditions and the following disclaimer.
|
|
1544
1099
|
|
|
1545
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
1546
|
-
notice, this list of conditions and the following disclaimer in
|
|
1100
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
1101
|
+
notice, this list of conditions and the following disclaimer in
|
|
1547
1102
|
the documentation and/or other materials provided with the distribution.
|
|
1548
1103
|
|
|
1549
1104
|
3. The names of the authors may not be used to endorse or promote products
|
|
@@ -1567,24 +1122,21 @@ const RAW_FORMAT = "raw";
|
|
|
1567
1122
|
const PBKDF2_ALGORITHM = { name: "PBKDF2" };
|
|
1568
1123
|
const HASH_ALGORITHM = { name: "HMAC" };
|
|
1569
1124
|
const HASH_FUNCTION = "SHA-1";
|
|
1125
|
+
const PBKDF2_ITERATIONS = 1000;
|
|
1570
1126
|
const BASE_KEY_ALGORITHM = Object.assign({ hash: HASH_ALGORITHM }, PBKDF2_ALGORITHM);
|
|
1571
|
-
const DERIVED_BITS_ALGORITHM = Object.assign({ iterations:
|
|
1127
|
+
const DERIVED_BITS_ALGORITHM = Object.assign({ iterations: PBKDF2_ITERATIONS, hash: { name: HASH_FUNCTION } }, PBKDF2_ALGORITHM);
|
|
1572
1128
|
const DERIVED_BITS_USAGE = ["deriveBits"];
|
|
1573
1129
|
const SALT_LENGTH = [8, 12, 16];
|
|
1574
1130
|
const KEY_LENGTH = [16, 24, 32];
|
|
1575
1131
|
const AUTHENTICATION_CODE_LENGTH = 10;
|
|
1576
|
-
const
|
|
1132
|
+
const PASSWORD_VERIFICATION_LENGTH = 2;
|
|
1577
1133
|
// deno-lint-ignore valid-typeof
|
|
1578
1134
|
const CRYPTO_API_SUPPORTED = typeof crypto != UNDEFINED_TYPE;
|
|
1579
1135
|
const subtle = CRYPTO_API_SUPPORTED && crypto.subtle;
|
|
1580
1136
|
const SUBTLE_API_SUPPORTED = CRYPTO_API_SUPPORTED && typeof subtle != UNDEFINED_TYPE;
|
|
1581
|
-
const codecBytes = codec.bytes;
|
|
1582
|
-
const Aes = cipher.aes;
|
|
1583
|
-
const CtrGladman = mode.ctrGladman;
|
|
1584
|
-
const HmacSha1 = misc.hmacSha1;
|
|
1585
1137
|
|
|
1586
|
-
let
|
|
1587
|
-
let
|
|
1138
|
+
let DERIVE_BITS_SUPPORTED = SUBTLE_API_SUPPORTED && typeof subtle.importKey == FUNCTION_TYPE && typeof subtle.deriveBits == FUNCTION_TYPE;
|
|
1139
|
+
let createEngine$1 = createEngine$2;
|
|
1588
1140
|
|
|
1589
1141
|
class AESDecryptionStream extends TransformStream {
|
|
1590
1142
|
|
|
@@ -1602,9 +1154,10 @@ class AESDecryptionStream extends TransformStream {
|
|
|
1602
1154
|
ready
|
|
1603
1155
|
} = aesCrypto;
|
|
1604
1156
|
if (password) {
|
|
1605
|
-
await createDecryptionKeys(aesCrypto, strength, password, subarray(chunk, 0, SALT_LENGTH[strength] +
|
|
1606
|
-
chunk = subarray(chunk, SALT_LENGTH[strength] +
|
|
1157
|
+
await createDecryptionKeys(aesCrypto, strength, password, subarray(chunk, 0, SALT_LENGTH[strength] + PASSWORD_VERIFICATION_LENGTH));
|
|
1158
|
+
chunk = subarray(chunk, SALT_LENGTH[strength] + PASSWORD_VERIFICATION_LENGTH);
|
|
1607
1159
|
if (checkPasswordOnly) {
|
|
1160
|
+
disposeEngine(aesCrypto);
|
|
1608
1161
|
controller.error(new Error(ERR_ABORT_CHECK_PASSWORD));
|
|
1609
1162
|
} else {
|
|
1610
1163
|
resolveReady();
|
|
@@ -1617,23 +1170,16 @@ class AESDecryptionStream extends TransformStream {
|
|
|
1617
1170
|
},
|
|
1618
1171
|
async flush(controller) {
|
|
1619
1172
|
const {
|
|
1620
|
-
|
|
1621
|
-
hmac,
|
|
1173
|
+
engine,
|
|
1622
1174
|
pendingInput,
|
|
1623
1175
|
ready
|
|
1624
1176
|
} = this;
|
|
1625
|
-
if (
|
|
1177
|
+
if (engine) {
|
|
1626
1178
|
await ready;
|
|
1627
|
-
const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1628
1179
|
const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
hmac.update(encryptedChunk);
|
|
1633
|
-
const decryptedChunk = ctr.update(encryptedChunk);
|
|
1634
|
-
decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
|
|
1635
|
-
}
|
|
1636
|
-
const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
|
|
1180
|
+
const decryptedChunkArray = new Uint8Array(subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH));
|
|
1181
|
+
engine.process(decryptedChunkArray, true);
|
|
1182
|
+
const authenticationCode = engine.digest();
|
|
1637
1183
|
let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
|
|
1638
1184
|
for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
|
|
1639
1185
|
invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
|
|
@@ -1643,6 +1189,9 @@ class AESDecryptionStream extends TransformStream {
|
|
|
1643
1189
|
}
|
|
1644
1190
|
controller.enqueue(decryptedChunkArray);
|
|
1645
1191
|
}
|
|
1192
|
+
},
|
|
1193
|
+
cancel() {
|
|
1194
|
+
disposeEngine(this);
|
|
1646
1195
|
}
|
|
1647
1196
|
});
|
|
1648
1197
|
}
|
|
@@ -1672,31 +1221,33 @@ class AESEncryptionStream extends TransformStream {
|
|
|
1672
1221
|
}
|
|
1673
1222
|
const output = new Uint8Array(preamble.length + chunk.length - (chunk.length % BLOCK_LENGTH));
|
|
1674
1223
|
output.set(preamble, 0);
|
|
1675
|
-
controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0));
|
|
1224
|
+
controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0, false));
|
|
1676
1225
|
},
|
|
1677
1226
|
async flush(controller) {
|
|
1678
1227
|
const {
|
|
1679
|
-
|
|
1680
|
-
hmac,
|
|
1228
|
+
engine,
|
|
1681
1229
|
pendingInput,
|
|
1682
1230
|
ready
|
|
1683
1231
|
} = this;
|
|
1684
|
-
if (
|
|
1232
|
+
if (engine) {
|
|
1685
1233
|
await ready;
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
hmac.update(encryptedChunk);
|
|
1690
|
-
encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
|
|
1691
|
-
}
|
|
1692
|
-
const authenticationCode = fromBits(codecBytes, hmac.digest()).slice(0, AUTHENTICATION_CODE_LENGTH);
|
|
1234
|
+
const encryptedChunkArray = new Uint8Array(pendingInput);
|
|
1235
|
+
engine.process(encryptedChunkArray, false);
|
|
1236
|
+
const authenticationCode = subarray(engine.digest(), 0, AUTHENTICATION_CODE_LENGTH);
|
|
1693
1237
|
controller.enqueue(concat(encryptedChunkArray, authenticationCode));
|
|
1694
1238
|
}
|
|
1239
|
+
},
|
|
1240
|
+
cancel() {
|
|
1241
|
+
disposeEngine(this);
|
|
1695
1242
|
}
|
|
1696
1243
|
});
|
|
1697
1244
|
}
|
|
1698
1245
|
}
|
|
1699
1246
|
|
|
1247
|
+
function setAESEngine(createEngineFunction) {
|
|
1248
|
+
createEngine$1 = createEngineFunction || createEngine$2;
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1700
1251
|
function initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength) {
|
|
1701
1252
|
Object.assign(aesCrypto, {
|
|
1702
1253
|
ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
|
|
@@ -1706,30 +1257,23 @@ function initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength) {
|
|
|
1706
1257
|
});
|
|
1707
1258
|
}
|
|
1708
1259
|
|
|
1709
|
-
function append(aesCrypto, input, output, paddingStart, paddingEnd,
|
|
1260
|
+
function append(aesCrypto, input, output, paddingStart, paddingEnd, decrypt) {
|
|
1710
1261
|
const {
|
|
1711
|
-
|
|
1712
|
-
hmac,
|
|
1262
|
+
engine,
|
|
1713
1263
|
pendingInput
|
|
1714
1264
|
} = aesCrypto;
|
|
1715
1265
|
if (pendingInput.length) {
|
|
1716
1266
|
input = concat(pendingInput, input);
|
|
1717
1267
|
}
|
|
1718
1268
|
const inputLength = input.length - paddingEnd;
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
const
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
if (!verifyAuthenticationCode) {
|
|
1728
|
-
hmac.update(outputChunk);
|
|
1729
|
-
}
|
|
1730
|
-
output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
|
|
1731
|
-
}
|
|
1732
|
-
aesCrypto.pendingInput = subarray(input, offset);
|
|
1269
|
+
const alignedLength = inputLength - (inputLength % BLOCK_LENGTH);
|
|
1270
|
+
output = expand(output, paddingStart + alignedLength);
|
|
1271
|
+
if (alignedLength) {
|
|
1272
|
+
const chunk = subarray(output, paddingStart, paddingStart + alignedLength);
|
|
1273
|
+
chunk.set(subarray(input, 0, alignedLength));
|
|
1274
|
+
engine.process(chunk, decrypt);
|
|
1275
|
+
}
|
|
1276
|
+
aesCrypto.pendingInput = subarray(input, alignedLength);
|
|
1733
1277
|
return output;
|
|
1734
1278
|
}
|
|
1735
1279
|
|
|
@@ -1737,10 +1281,17 @@ async function createDecryptionKeys(decrypt, strength, password, preamble) {
|
|
|
1737
1281
|
const passwordVerificationKey = await createKeys$1(decrypt, strength, password, subarray(preamble, 0, SALT_LENGTH[strength]));
|
|
1738
1282
|
const passwordVerification = subarray(preamble, SALT_LENGTH[strength]);
|
|
1739
1283
|
if (passwordVerificationKey[0] != passwordVerification[0] || passwordVerificationKey[1] != passwordVerification[1]) {
|
|
1284
|
+
disposeEngine(decrypt);
|
|
1740
1285
|
throw new Error(ERR_INVALID_PASSWORD);
|
|
1741
1286
|
}
|
|
1742
1287
|
}
|
|
1743
1288
|
|
|
1289
|
+
function disposeEngine({ engine }) {
|
|
1290
|
+
if (engine && engine.dispose) {
|
|
1291
|
+
engine.dispose();
|
|
1292
|
+
}
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1744
1295
|
async function createEncryptionKeys(encrypt, strength, password) {
|
|
1745
1296
|
const salt = getRandomValues(new Uint8Array(SALT_LENGTH[strength]));
|
|
1746
1297
|
const passwordVerification = await createKeys$1(encrypt, strength, password, salt);
|
|
@@ -1749,48 +1300,22 @@ async function createEncryptionKeys(encrypt, strength, password) {
|
|
|
1749
1300
|
|
|
1750
1301
|
async function createKeys$1(aesCrypto, strength, password, salt) {
|
|
1751
1302
|
aesCrypto.password = null;
|
|
1752
|
-
const
|
|
1753
|
-
const
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
const authentication = toBits(codecBytes, subarray(compositeKey, KEY_LENGTH[strength], KEY_LENGTH[strength] * 2));
|
|
1757
|
-
const passwordVerification = subarray(compositeKey, KEY_LENGTH[strength] * 2);
|
|
1758
|
-
Object.assign(aesCrypto, {
|
|
1759
|
-
keys: {
|
|
1760
|
-
key,
|
|
1761
|
-
authentication,
|
|
1762
|
-
passwordVerification
|
|
1763
|
-
},
|
|
1764
|
-
ctr: new CtrGladman(new Aes(key), Array.from(COUNTER_DEFAULT_VALUE)),
|
|
1765
|
-
hmac: new HmacSha1(authentication)
|
|
1766
|
-
});
|
|
1767
|
-
return passwordVerification;
|
|
1303
|
+
const keyLength = KEY_LENGTH[strength];
|
|
1304
|
+
const compositeKey = await deriveKey(password, salt, keyLength * 2 + PASSWORD_VERIFICATION_LENGTH);
|
|
1305
|
+
aesCrypto.engine = createEngine$1(subarray(compositeKey, 0, keyLength), subarray(compositeKey, keyLength, keyLength * 2));
|
|
1306
|
+
return subarray(compositeKey, keyLength * 2);
|
|
1768
1307
|
}
|
|
1769
1308
|
|
|
1770
|
-
async function
|
|
1771
|
-
if (IMPORT_KEY_SUPPORTED) {
|
|
1772
|
-
try {
|
|
1773
|
-
return await subtle.importKey(format, password, algorithm, extractable, keyUsages);
|
|
1774
|
-
} catch {
|
|
1775
|
-
IMPORT_KEY_SUPPORTED = false;
|
|
1776
|
-
return misc.importKey(password);
|
|
1777
|
-
}
|
|
1778
|
-
} else {
|
|
1779
|
-
return misc.importKey(password);
|
|
1780
|
-
}
|
|
1781
|
-
}
|
|
1782
|
-
|
|
1783
|
-
async function deriveBits(algorithm, baseKey, length) {
|
|
1309
|
+
async function deriveKey(password, salt, length) {
|
|
1784
1310
|
if (DERIVE_BITS_SUPPORTED) {
|
|
1785
1311
|
try {
|
|
1786
|
-
|
|
1312
|
+
const baseKey = await subtle.importKey(RAW_FORMAT, password, BASE_KEY_ALGORITHM, false, DERIVED_BITS_USAGE);
|
|
1313
|
+
return new Uint8Array(await subtle.deriveBits(Object.assign({ salt }, DERIVED_BITS_ALGORITHM), baseKey, length * 8));
|
|
1787
1314
|
} catch {
|
|
1788
1315
|
DERIVE_BITS_SUPPORTED = false;
|
|
1789
|
-
return misc.pbkdf2(baseKey, algorithm.salt, DERIVED_BITS_ALGORITHM.iterations, length);
|
|
1790
1316
|
}
|
|
1791
|
-
} else {
|
|
1792
|
-
return misc.pbkdf2(baseKey, algorithm.salt, DERIVED_BITS_ALGORITHM.iterations, length);
|
|
1793
1317
|
}
|
|
1318
|
+
return pbkdf2(password, salt, PBKDF2_ITERATIONS, length);
|
|
1794
1319
|
}
|
|
1795
1320
|
|
|
1796
1321
|
function encodePassword(password, rawPassword) {
|
|
@@ -1814,13 +1339,6 @@ function subarray(array, begin, end) {
|
|
|
1814
1339
|
return array.subarray(begin, end);
|
|
1815
1340
|
}
|
|
1816
1341
|
|
|
1817
|
-
function fromBits(codecBytes, chunk) {
|
|
1818
|
-
return codecBytes.fromBits(chunk);
|
|
1819
|
-
}
|
|
1820
|
-
function toBits(codecBytes, chunk) {
|
|
1821
|
-
return codecBytes.toBits(chunk);
|
|
1822
|
-
}
|
|
1823
|
-
|
|
1824
1342
|
/*
|
|
1825
1343
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
1826
1344
|
|
|
@@ -2764,11 +2282,18 @@ async function supportsDeflate(config) {
|
|
|
2764
2282
|
return true;
|
|
2765
2283
|
}
|
|
2766
2284
|
if (FallbackStream) {
|
|
2285
|
+
return await loadModule(config);
|
|
2286
|
+
}
|
|
2287
|
+
return false;
|
|
2288
|
+
}
|
|
2289
|
+
|
|
2290
|
+
async function loadModule(config) {
|
|
2291
|
+
if (initModule$1) {
|
|
2767
2292
|
try {
|
|
2768
2293
|
await initModule$1(config);
|
|
2769
2294
|
return true;
|
|
2770
2295
|
} catch {
|
|
2771
|
-
|
|
2296
|
+
// ignored
|
|
2772
2297
|
}
|
|
2773
2298
|
}
|
|
2774
2299
|
return false;
|
|
@@ -2811,26 +2336,27 @@ class CodecWorker {
|
|
|
2811
2336
|
terminate() {
|
|
2812
2337
|
return new Promise(resolve => {
|
|
2813
2338
|
const { worker, busy } = workerData;
|
|
2814
|
-
if (
|
|
2815
|
-
|
|
2816
|
-
|
|
2817
|
-
|
|
2339
|
+
if (busy) {
|
|
2340
|
+
workerData.resolveTerminated = resolve;
|
|
2341
|
+
} else {
|
|
2342
|
+
if (worker) {
|
|
2818
2343
|
worker.terminate();
|
|
2819
|
-
|
|
2344
|
+
workerData.worker = null;
|
|
2820
2345
|
}
|
|
2821
|
-
workerData.interface = null;
|
|
2822
|
-
} else {
|
|
2823
2346
|
resolve();
|
|
2824
2347
|
}
|
|
2348
|
+
workerData.interface = null;
|
|
2825
2349
|
});
|
|
2826
2350
|
},
|
|
2827
2351
|
onTaskFinished() {
|
|
2828
2352
|
if (workerData.busy) {
|
|
2829
|
-
const { resolveTerminated } = workerData;
|
|
2353
|
+
const { resolveTerminated, worker } = workerData;
|
|
2830
2354
|
if (resolveTerminated) {
|
|
2831
2355
|
workerData.resolveTerminated = null;
|
|
2832
|
-
|
|
2833
|
-
|
|
2356
|
+
if (worker) {
|
|
2357
|
+
workerData.terminated = true;
|
|
2358
|
+
worker.terminate();
|
|
2359
|
+
}
|
|
2834
2360
|
resolveTerminated();
|
|
2835
2361
|
}
|
|
2836
2362
|
workerData.busy = false;
|
|
@@ -2887,28 +2413,23 @@ function createWorkerInterface(workerData, config) {
|
|
|
2887
2413
|
}
|
|
2888
2414
|
|
|
2889
2415
|
async function runWorker$1({ options, readable, writable, onTaskFinished, workerOptions }, config) {
|
|
2890
|
-
let codecStream, chunkStream;
|
|
2416
|
+
let codecStream, chunkStream, modulePromise;
|
|
2891
2417
|
try {
|
|
2892
2418
|
if (options.compressed && !options.format) {
|
|
2893
2419
|
const deflate = options.codecType.startsWith(CODEC_DEFLATE);
|
|
2894
2420
|
const FallbackStream = deflate ? config.CompressionStreamFallback : config.DecompressionStreamFallback;
|
|
2895
2421
|
const NativeStream = deflate ? config.CompressionStream : config.DecompressionStream;
|
|
2896
2422
|
if (!options.useCompressionStream) {
|
|
2897
|
-
|
|
2898
|
-
|
|
2899
|
-
} catch {
|
|
2900
|
-
if (!FallbackStream || FallbackStream.requiresModule) {
|
|
2901
|
-
options.useCompressionStream = true;
|
|
2902
|
-
}
|
|
2423
|
+
if (!await moduleLoaded() && (!FallbackStream || FallbackStream.requiresModule)) {
|
|
2424
|
+
options.useCompressionStream = true;
|
|
2903
2425
|
}
|
|
2904
2426
|
} else if (FallbackStream && FallbackStream.requiresModule && !supportsDeflateRaw(NativeStream)) {
|
|
2905
|
-
|
|
2906
|
-
await initModule$1(config);
|
|
2907
|
-
} catch {
|
|
2908
|
-
// ignored
|
|
2909
|
-
}
|
|
2427
|
+
await moduleLoaded();
|
|
2910
2428
|
}
|
|
2911
2429
|
}
|
|
2430
|
+
if (options.encrypted && !options.zipCrypto) {
|
|
2431
|
+
await moduleLoaded();
|
|
2432
|
+
}
|
|
2912
2433
|
codecStream = new CodecStream(options, config);
|
|
2913
2434
|
chunkStream = new ChunkStream(getChunkSize(config));
|
|
2914
2435
|
await readable
|
|
@@ -2941,6 +2462,13 @@ async function runWorker$1({ options, readable, writable, onTaskFinished, worker
|
|
|
2941
2462
|
} finally {
|
|
2942
2463
|
onTaskFinished();
|
|
2943
2464
|
}
|
|
2465
|
+
|
|
2466
|
+
function moduleLoaded() {
|
|
2467
|
+
if (!modulePromise) {
|
|
2468
|
+
modulePromise = loadModule(config);
|
|
2469
|
+
}
|
|
2470
|
+
return modulePromise;
|
|
2471
|
+
}
|
|
2944
2472
|
}
|
|
2945
2473
|
|
|
2946
2474
|
/*
|
|
@@ -3047,7 +2575,7 @@ async function runWebWorker(workerData, config) {
|
|
|
3047
2575
|
rejectResult = error => {
|
|
3048
2576
|
const { outputSize, workerOptions } = workerData;
|
|
3049
2577
|
workerOptions.outputSize = outputSize;
|
|
3050
|
-
if (isErrorObject(error)
|
|
2578
|
+
if (isErrorObject(error)) {
|
|
3051
2579
|
try {
|
|
3052
2580
|
error.outputSize = outputSize;
|
|
3053
2581
|
} catch {
|
|
@@ -3061,12 +2589,14 @@ async function runWebWorker(workerData, config) {
|
|
|
3061
2589
|
reader: null,
|
|
3062
2590
|
writer: null,
|
|
3063
2591
|
outputSize: 0,
|
|
2592
|
+
destinationFailed: false,
|
|
2593
|
+
destinationError: null,
|
|
3064
2594
|
resolveResult,
|
|
3065
2595
|
rejectResult,
|
|
3066
2596
|
result
|
|
3067
2597
|
});
|
|
3068
2598
|
const { readable, options } = workerData;
|
|
3069
|
-
const { writable, closed, abortPipe } = watchClosedStream(workerData.writable);
|
|
2599
|
+
const { writable, closed, abortPipe } = watchClosedStream(workerData.writable, workerData);
|
|
3070
2600
|
let streamsTransferred;
|
|
3071
2601
|
try {
|
|
3072
2602
|
streamsTransferred = sendMessage({
|
|
@@ -3109,7 +2639,18 @@ async function runWebWorker(workerData, config) {
|
|
|
3109
2639
|
} catch {
|
|
3110
2640
|
// ignored
|
|
3111
2641
|
}
|
|
3112
|
-
|
|
2642
|
+
const { outputSize, workerOptions, destinationFailed, destinationError } = workerData;
|
|
2643
|
+
workerOptions.outputSize = outputSize;
|
|
2644
|
+
const workerFailed = isErrorObject(error) && (error.codecImportFailed || error.workerStartupFailed);
|
|
2645
|
+
const reportedError = destinationFailed && !workerFailed ? destinationError : error;
|
|
2646
|
+
if (isErrorObject(reportedError)) {
|
|
2647
|
+
try {
|
|
2648
|
+
reportedError.outputSize = outputSize;
|
|
2649
|
+
} catch {
|
|
2650
|
+
// ignored
|
|
2651
|
+
}
|
|
2652
|
+
}
|
|
2653
|
+
throw reportedError;
|
|
3113
2654
|
}
|
|
3114
2655
|
|
|
3115
2656
|
async function closeWritable() {
|
|
@@ -3123,12 +2664,27 @@ async function runWebWorker(workerData, config) {
|
|
|
3123
2664
|
}
|
|
3124
2665
|
}
|
|
3125
2666
|
|
|
3126
|
-
function watchClosedStream(writableSource) {
|
|
2667
|
+
function watchClosedStream(writableSource, workerData) {
|
|
3127
2668
|
const abortController = new AbortController();
|
|
3128
|
-
|
|
2669
|
+
let aborting;
|
|
2670
|
+
const { writable, readable } = new TransformStream({
|
|
2671
|
+
transform(chunk, controller) {
|
|
2672
|
+
workerData.outputSize += chunk.length;
|
|
2673
|
+
controller.enqueue(chunk);
|
|
2674
|
+
}
|
|
2675
|
+
});
|
|
3129
2676
|
const closed = readable.pipeTo(writableSource, { preventClose: true, preventAbort: true, signal: abortController.signal });
|
|
3130
|
-
closed.catch(
|
|
3131
|
-
|
|
2677
|
+
closed.catch(error => {
|
|
2678
|
+
if (!aborting) {
|
|
2679
|
+
Object.assign(workerData, { destinationFailed: true, destinationError: error });
|
|
2680
|
+
}
|
|
2681
|
+
});
|
|
2682
|
+
return {
|
|
2683
|
+
writable, closed, abortPipe: () => {
|
|
2684
|
+
aborting = true;
|
|
2685
|
+
abortController.abort();
|
|
2686
|
+
}
|
|
2687
|
+
};
|
|
3132
2688
|
}
|
|
3133
2689
|
|
|
3134
2690
|
function releaseWorkerStreams(workerData) {
|
|
@@ -3326,9 +2882,6 @@ async function onMessage({ data }, workerData) {
|
|
|
3326
2882
|
const stale = () => workerData.generation != generation;
|
|
3327
2883
|
try {
|
|
3328
2884
|
if (error) {
|
|
3329
|
-
if (error.outputSize !== UNDEFINED_VALUE) {
|
|
3330
|
-
workerData.outputSize = error.outputSize;
|
|
3331
|
-
}
|
|
3332
2885
|
fail(getResponseError(error, errorValue));
|
|
3333
2886
|
} else {
|
|
3334
2887
|
if (type == MESSAGE_PULL) {
|
|
@@ -3341,7 +2894,6 @@ async function onMessage({ data }, workerData) {
|
|
|
3341
2894
|
const chunk = new Uint8Array(value);
|
|
3342
2895
|
await writer.ready;
|
|
3343
2896
|
await writer.write(chunk);
|
|
3344
|
-
workerData.outputSize += chunk.length;
|
|
3345
2897
|
if (!stale()) {
|
|
3346
2898
|
sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
|
|
3347
2899
|
}
|
|
@@ -4073,16 +3625,14 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
|
|
|
4073
3625
|
combineSizeEocd
|
|
4074
3626
|
} = httpReader;
|
|
4075
3627
|
if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest == UNDEFINED_TYPE || preventHeadRequest)) {
|
|
4076
|
-
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -
|
|
3628
|
+
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -65557 : undefined));
|
|
4077
3629
|
const acceptRanges = response.headers.get(HTTP_HEADER_ACCEPT_RANGES);
|
|
4078
3630
|
if (!forceRangeRequests && (!acceptRanges || acceptRanges.toLowerCase() != HTTP_RANGE_UNIT)) {
|
|
4079
3631
|
throw new Error(ERR_HTTP_RANGE);
|
|
4080
3632
|
} else {
|
|
4081
|
-
|
|
4082
|
-
|
|
4083
|
-
|
|
4084
|
-
httpReader.eocdCache = eocdCache;
|
|
4085
|
-
}
|
|
3633
|
+
let eocdCache;
|
|
3634
|
+
if (combineSizeEocd && response.status == 206) {
|
|
3635
|
+
eocdCache = new Uint8Array(await response.arrayBuffer());
|
|
4086
3636
|
}
|
|
4087
3637
|
setResourceValidators(httpReader, response);
|
|
4088
3638
|
const contentSize = getContentRangeSize(response);
|
|
@@ -4091,6 +3641,9 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
|
|
|
4091
3641
|
} else {
|
|
4092
3642
|
httpReader.size = contentSize;
|
|
4093
3643
|
}
|
|
3644
|
+
if (eocdCache && eocdCache.length && getContentRangeOffset(response) === httpReader.size - eocdCache.length) {
|
|
3645
|
+
httpReader.eocdCache = eocdCache;
|
|
3646
|
+
}
|
|
4094
3647
|
}
|
|
4095
3648
|
} else {
|
|
4096
3649
|
await getContentLength(httpReader, sendRequest, getRequestData);
|
|
@@ -4106,25 +3659,23 @@ async function readUint8ArrayHttpReader(httpReader, index, length, sendRequest,
|
|
|
4106
3659
|
options
|
|
4107
3660
|
} = httpReader;
|
|
4108
3661
|
if (useRangeHeader || forceRangeRequests) {
|
|
4109
|
-
if (eocdCache && index == size - END_OF_CENTRAL_DIR_LENGTH && length == END_OF_CENTRAL_DIR_LENGTH) {
|
|
4110
|
-
return eocdCache;
|
|
4111
|
-
}
|
|
4112
3662
|
if (index >= size || length === 0) {
|
|
4113
3663
|
return EMPTY_UINT8_ARRAY;
|
|
4114
3664
|
} else {
|
|
4115
3665
|
if (index + length > size) {
|
|
4116
3666
|
length = size - index;
|
|
4117
3667
|
}
|
|
3668
|
+
if (eocdCache && index >= size - eocdCache.length) {
|
|
3669
|
+
const cacheIndex = index - (size - eocdCache.length);
|
|
3670
|
+
return eocdCache.slice(cacheIndex, cacheIndex + length);
|
|
3671
|
+
}
|
|
4118
3672
|
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, index, length));
|
|
4119
3673
|
if (response.status != 206) {
|
|
4120
3674
|
throw new Error(ERR_HTTP_RANGE);
|
|
4121
3675
|
}
|
|
4122
|
-
const
|
|
4123
|
-
if (
|
|
4124
|
-
|
|
4125
|
-
if (!Number.isNaN(rangeStart) && rangeStart != index) {
|
|
4126
|
-
throw new Error(ERR_HTTP_RANGE);
|
|
4127
|
-
}
|
|
3676
|
+
const rangeStart = getContentRangeOffset(response);
|
|
3677
|
+
if (rangeStart !== UNDEFINED_VALUE && rangeStart != index) {
|
|
3678
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
4128
3679
|
}
|
|
4129
3680
|
checkResourceValidators(httpReader, response);
|
|
4130
3681
|
setResourceValidators(httpReader, response);
|
|
@@ -4184,12 +3735,9 @@ function createRangeReadable(httpReader, offset, size) {
|
|
|
4184
3735
|
if (response.status != 206) {
|
|
4185
3736
|
throw new Error(ERR_HTTP_RANGE);
|
|
4186
3737
|
}
|
|
4187
|
-
const
|
|
4188
|
-
if (
|
|
4189
|
-
|
|
4190
|
-
if (!Number.isNaN(rangeStart) && rangeStart != windowOffset) {
|
|
4191
|
-
throw new Error(ERR_HTTP_RANGE);
|
|
4192
|
-
}
|
|
3738
|
+
const rangeStart = getContentRangeOffset(response);
|
|
3739
|
+
if (rangeStart !== UNDEFINED_VALUE && rangeStart != windowOffset) {
|
|
3740
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
4193
3741
|
}
|
|
4194
3742
|
checkResourceValidators(httpReader, response);
|
|
4195
3743
|
setResourceValidators(httpReader, response);
|
|
@@ -4205,6 +3753,16 @@ function createRangeReadable(httpReader, offset, size) {
|
|
|
4205
3753
|
}
|
|
4206
3754
|
}
|
|
4207
3755
|
|
|
3756
|
+
function getContentRangeOffset(response) {
|
|
3757
|
+
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
3758
|
+
if (contentRangeHeader) {
|
|
3759
|
+
const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
|
|
3760
|
+
if (!Number.isNaN(rangeStart)) {
|
|
3761
|
+
return rangeStart;
|
|
3762
|
+
}
|
|
3763
|
+
}
|
|
3764
|
+
}
|
|
3765
|
+
|
|
4208
3766
|
function getContentRangeSize(response) {
|
|
4209
3767
|
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
4210
3768
|
if (contentRangeHeader) {
|
|
@@ -6724,7 +6282,6 @@ class ZipWriter {
|
|
|
6724
6282
|
rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
|
|
6725
6283
|
rawExtraField,
|
|
6726
6284
|
rawCentralExtraField: EMPTY_UINT8_ARRAY,
|
|
6727
|
-
extendedTimestamp: false,
|
|
6728
6285
|
headerArray,
|
|
6729
6286
|
headerView
|
|
6730
6287
|
});
|
|
@@ -7468,7 +7025,7 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
|
|
|
7468
7025
|
}
|
|
7469
7026
|
}
|
|
7470
7027
|
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
|
|
7471
|
-
if (emptyEntry &&
|
|
7028
|
+
if (emptyEntry && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
|
|
7472
7029
|
dataDescriptor = false;
|
|
7473
7030
|
}
|
|
7474
7031
|
const zip64UncompressedSize = zip64Enabled || unknownSize || uncompressedSize >= MAX_32_BITS;
|
|
@@ -9078,7 +8635,7 @@ function formatSupported(StreamClass, format) {
|
|
|
9078
8635
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
9079
8636
|
*/
|
|
9080
8637
|
|
|
9081
|
-
const VERSION = "2.
|
|
8638
|
+
const VERSION = "2.14.0";
|
|
9082
8639
|
|
|
9083
8640
|
/*
|
|
9084
8641
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9527,7 +9084,7 @@ try {
|
|
|
9527
9084
|
// ignored
|
|
9528
9085
|
}
|
|
9529
9086
|
|
|
9530
|
-
const t=[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],e=[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],n=[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],o=[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],r=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],V=new Uint8Array(288);V.fill(8,0,144),V.fill(9,144,256),V.fill(7,256,280),V.fill(8,280,288);const l=new Uint8Array(30).fill(5);function a(t){const e=new Uint16Array(16);for(const n of t)e[n]++;e[0]=0;const n=new Uint16Array(17);for(let t=1;t<=15;t++)n[t+1]=n[t]+e[t];const o=new Uint16Array(t.length);for(let e=0;e<t.length;e++)t[e]&&(o[n[t[e]]++]=e);return {o:e,symbols:o}}const f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function s(s){let m;s({wasmURI:()=>(m||(m="data:application/wasm;base64,"+function(t){let e="";const n=t.length;let o=0;for(;o+2<n;o+=3){const n=t[o]<<16|t[o+1]<<8|t[o+2];e+=f[n>>18&63]+f[n>>12&63]+f[n>>6&63]+f[63&n];}const r=n-o;if(1===r){const n=t[o]<<16;e+=f[n>>18&63]+f[n>>12&63]+"==";}else if(2===r){const n=t[o]<<16|t[o+1]<<8;e+=f[n>>18&63]+f[n>>12&63]+f[n>>6&63]+"=";}return e}(function(f){let s=0,m=0,q=0,i=new Uint8Array(1024),K=0,y=0;for(;!y;){y=W(1);const t=W(2);if(0==t)Y();else if(1==t)c(a(V),a(l));else {if(2!=t)throw new Error("invalid deflate block type");c(...p());}}return i.subarray(0,K);function z(){if(s>=f.length)throw new Error("unexpected end of deflate data");return f[s++]}function W(t){for(;q<t;)m|=z()<<q,q+=8;const e=m&(1<<t)-1;return m>>>=t,q-=t,e}function Y(){m=0,q=0;const t=z()|z()<<8;s+=2,Z(K+t);for(let e=0;e<t;e++)i[K++]=z();}function c(r,V){let l=u(r);for(;256!=l;){if(l<256)Z(K+1),i[K++]=l;else {const r=l-257,a=t[r]+W(e[r]),f=u(V),s=n[f]+W(o[f]);Z(K+a);const m=K-s;for(let t=0;t<a;t++)i[K++]=i[m+t];}l=u(r);}}function p(){const t=W(5)+257,e=W(5)+1,n=W(4)+4,o=new Uint8Array(19);for(let t=0;t<n;t++)o[r[t]]=W(3);const V=a(o),l=new Uint8Array(t+e);let f=0;for(;f<l.length;){const t=u(V);if(t<16)l[f++]=t;else if(16==t){const t=l[f-1];let e=W(2)+3;for(;e--;)l[f++]=t;}else f+=17==t?W(3)+3:W(7)+11;}return [a(l.subarray(0,t)),a(l.subarray(t))]}function u(t){const{o:e,symbols:n}=t;let o=0,r=0,V=0;for(let t=1;t<=15;t++){o|=W(1);const l=e[t];if(o-r<l)return n[V+(o-r)];V+=l,r=r+l<<1,o<<=1;}throw new Error("invalid huffman code")}function Z(t){if(i.length<t){let e=2*i.length;for(;e<t;)e*=2;const n=new Uint8Array(e);n.set(i.subarray(0,K)),i=n;}}}(function(t){const e=(t=String(t).replace(/[^A-Za-z0-9+/=]/g,"")).length,n=[];for(let o=0;o<e;o+=4){const e=f.indexOf(t[o])<<18|f.indexOf(t[o+1])<<12|(63&f.indexOf(t[o+2]))<<6|63&f.indexOf(t[o+3]);n.push(e>>16&255),"="!==t[o+2]&&n.push(e>>8&255),"="!==t[o+3]&&n.push(255&e);}return new Uint8Array(n)}("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")))),m)});}
|
|
9087
|
+
const t=[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],r=[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],n=[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],e=[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=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],s=new Uint8Array(288);s.fill(8,0,144),s.fill(9,144,256),s.fill(7,256,280),s.fill(8,280,288);const z=new Uint8Array(30).fill(5);function p(t){const r=new Uint16Array(16);for(const n of t)r[n]++;r[0]=0;const n=new Uint16Array(17);for(let t=1;t<=15;t++)n[t+1]=n[t]+r[t];const e=new Uint16Array(t.length);for(let r=0;r<t.length;r++)t[r]&&(e[n[t[r]]++]=r);return {l:r,symbols:e}}const f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function o(o){let h;o({wasmURI:()=>(h||(h="data:application/wasm;base64,"+function(t){let r="";const n=t.length;let e=0;for(;e+2<n;e+=3){const n=t[e]<<16|t[e+1]<<8|t[e+2];r+=f[n>>18&63]+f[n>>12&63]+f[n>>6&63]+f[63&n];}const l=n-e;if(1===l){const n=t[e]<<16;r+=f[n>>18&63]+f[n>>12&63]+"==";}else if(2===l){const n=t[e]<<16|t[e+1]<<8;r+=f[n>>18&63]+f[n>>12&63]+f[n>>6&63]+"=";}return r}(function(f){let o=0,h=0,u=0,V=new Uint8Array(1024),c=0,T=0;for(;!T;){T=O(1);const t=O(2);if(0==t)Z();else if(1==t)i(p(s),p(z));else {if(2!=t)throw new Error("invalid deflate block type");i(...w());}}return V.subarray(0,c);function v(){if(o>=f.length)throw new Error("unexpected end of deflate data");return f[o++]}function O(t){for(;u<t;)h|=v()<<u,u+=8;const r=h&(1<<t)-1;return h>>>=t,u-=t,r}function Z(){h=0,u=0;const t=v()|v()<<8;o+=2,a(c+t);for(let r=0;r<t;r++)V[c++]=v();}function i(l,s){let z=X(l);for(;256!=z;){if(z<256)a(c+1),V[c++]=z;else {const l=z-257,p=t[l]+O(r[l]),f=X(s),o=n[f]+O(e[f]);a(c+p);const h=c-o;for(let t=0;t<p;t++)V[c++]=V[h+t];}z=X(l);}}function w(){const t=O(5)+257,r=O(5)+1,n=O(4)+4,e=new Uint8Array(19);for(let t=0;t<n;t++)e[l[t]]=O(3);const s=p(e),z=new Uint8Array(t+r);let f=0;for(;f<z.length;){const t=X(s);if(t<16)z[f++]=t;else if(16==t){const t=z[f-1];let r=O(2)+3;for(;r--;)z[f++]=t;}else f+=17==t?O(3)+3:O(7)+11;}return [p(z.subarray(0,t)),p(z.subarray(t))]}function X(t){const{l:r,symbols:n}=t;let e=0,l=0,s=0;for(let t=1;t<=15;t++){e|=O(1);const z=r[t];if(e-l<z)return n[s+(e-l)];s+=z,l=l+z<<1,e<<=1;}throw new Error("invalid huffman code")}function a(t){if(V.length<t){let r=2*V.length;for(;r<t;)r*=2;const n=new Uint8Array(r);n.set(V.subarray(0,c)),V=n;}}}(function(t){const r=(t=String(t).replace(/[^A-Za-z0-9+/=]/g,"")).length,n=[];for(let e=0;e<r;e+=4){const r=f.indexOf(t[e])<<18|f.indexOf(t[e+1])<<12|(63&f.indexOf(t[e+2]))<<6|63&f.indexOf(t[e+3]);n.push(r>>16&255),"="!==t[e+2]&&n.push(r>>8&255),"="!==t[e+3]&&n.push(255&r);}return new Uint8Array(n)}("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")))),h)});}
|
|
9531
9088
|
|
|
9532
9089
|
/*
|
|
9533
9090
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9564,13 +9121,13 @@ const FORMAT_DEFLATE_RAW = "deflate-raw";
|
|
|
9564
9121
|
const FORMAT_DEFLATE64_RAW = "deflate64-raw";
|
|
9565
9122
|
const FORMAT_GZIP = "gzip";
|
|
9566
9123
|
|
|
9567
|
-
let wasm, malloc, free, memory, initError;
|
|
9124
|
+
let wasm$1, malloc, free, memory, initError;
|
|
9568
9125
|
|
|
9569
|
-
function setWasmExports(wasmAPI) {
|
|
9570
|
-
wasm = wasmAPI;
|
|
9571
|
-
({ malloc, free, memory } = wasm);
|
|
9126
|
+
function setWasmExports$1(wasmAPI) {
|
|
9127
|
+
wasm$1 = wasmAPI;
|
|
9128
|
+
({ malloc, free, memory } = wasm$1);
|
|
9572
9129
|
if (typeof malloc !== "function" || typeof free !== "function" || !memory) {
|
|
9573
|
-
wasm = malloc = free = memory = null;
|
|
9130
|
+
wasm$1 = malloc = free = memory = null;
|
|
9574
9131
|
throw new Error("Invalid WASM module");
|
|
9575
9132
|
}
|
|
9576
9133
|
}
|
|
@@ -9579,12 +9136,12 @@ function setInitError(error) {
|
|
|
9579
9136
|
initError = error;
|
|
9580
9137
|
}
|
|
9581
9138
|
|
|
9582
|
-
function resetWasmExports() {
|
|
9583
|
-
wasm = malloc = free = memory = initError = null;
|
|
9139
|
+
function resetWasmExports$1() {
|
|
9140
|
+
wasm$1 = malloc = free = memory = initError = null;
|
|
9584
9141
|
}
|
|
9585
9142
|
|
|
9586
9143
|
function _make(isCompress, type, options = {}) {
|
|
9587
|
-
if (!wasm) {
|
|
9144
|
+
if (!wasm$1) {
|
|
9588
9145
|
const error = new Error("WASM module not loaded");
|
|
9589
9146
|
error.cause = initError;
|
|
9590
9147
|
throw error;
|
|
@@ -9605,35 +9162,35 @@ function _make(isCompress, type, options = {}) {
|
|
|
9605
9162
|
}
|
|
9606
9163
|
this._scratch = new Uint8Array(outBufferSize);
|
|
9607
9164
|
if (isCompress) {
|
|
9608
|
-
this._process = wasm.deflate_process;
|
|
9609
|
-
this._last_consumed = wasm.deflate_last_consumed;
|
|
9610
|
-
this._end = wasm.deflate_end;
|
|
9611
|
-
this.streamHandle = wasm.deflate_new();
|
|
9165
|
+
this._process = wasm$1.deflate_process;
|
|
9166
|
+
this._last_consumed = wasm$1.deflate_last_consumed;
|
|
9167
|
+
this._end = wasm$1.deflate_end;
|
|
9168
|
+
this.streamHandle = wasm$1.deflate_new();
|
|
9612
9169
|
if (type === FORMAT_GZIP) {
|
|
9613
|
-
result = wasm.deflate_init_gzip(this.streamHandle, level);
|
|
9170
|
+
result = wasm$1.deflate_init_gzip(this.streamHandle, level);
|
|
9614
9171
|
} else if (type === FORMAT_DEFLATE_RAW) {
|
|
9615
|
-
result = wasm.deflate_init_raw(this.streamHandle, level);
|
|
9172
|
+
result = wasm$1.deflate_init_raw(this.streamHandle, level);
|
|
9616
9173
|
} else {
|
|
9617
|
-
result = wasm.deflate_init(this.streamHandle, level);
|
|
9174
|
+
result = wasm$1.deflate_init(this.streamHandle, level);
|
|
9618
9175
|
}
|
|
9619
9176
|
} else {
|
|
9620
9177
|
if (type === FORMAT_DEFLATE64_RAW) {
|
|
9621
|
-
this._process = wasm.inflate9_process;
|
|
9622
|
-
this._last_consumed = wasm.inflate9_last_consumed;
|
|
9623
|
-
this._end = wasm.inflate9_end;
|
|
9624
|
-
this.streamHandle = wasm.inflate9_new();
|
|
9625
|
-
result = wasm.inflate9_init_raw(this.streamHandle);
|
|
9178
|
+
this._process = wasm$1.inflate9_process;
|
|
9179
|
+
this._last_consumed = wasm$1.inflate9_last_consumed;
|
|
9180
|
+
this._end = wasm$1.inflate9_end;
|
|
9181
|
+
this.streamHandle = wasm$1.inflate9_new();
|
|
9182
|
+
result = wasm$1.inflate9_init_raw(this.streamHandle);
|
|
9626
9183
|
} else {
|
|
9627
|
-
this._process = wasm.inflate_process;
|
|
9628
|
-
this._last_consumed = wasm.inflate_last_consumed;
|
|
9629
|
-
this._end = wasm.inflate_end;
|
|
9630
|
-
this.streamHandle = wasm.inflate_new();
|
|
9184
|
+
this._process = wasm$1.inflate_process;
|
|
9185
|
+
this._last_consumed = wasm$1.inflate_last_consumed;
|
|
9186
|
+
this._end = wasm$1.inflate_end;
|
|
9187
|
+
this.streamHandle = wasm$1.inflate_new();
|
|
9631
9188
|
if (type === FORMAT_DEFLATE_RAW) {
|
|
9632
|
-
result = wasm.inflate_init_raw(this.streamHandle);
|
|
9189
|
+
result = wasm$1.inflate_init_raw(this.streamHandle);
|
|
9633
9190
|
} else if (type === FORMAT_GZIP) {
|
|
9634
|
-
result = wasm.inflate_init_gzip(this.streamHandle);
|
|
9191
|
+
result = wasm$1.inflate_init_gzip(this.streamHandle);
|
|
9635
9192
|
} else {
|
|
9636
|
-
result = wasm.inflate_init(this.streamHandle);
|
|
9193
|
+
result = wasm$1.inflate_init(this.streamHandle);
|
|
9637
9194
|
}
|
|
9638
9195
|
}
|
|
9639
9196
|
}
|
|
@@ -9768,6 +9325,105 @@ DecompressionStreamZlib.requiresModule = true;
|
|
|
9768
9325
|
CompressionStreamZlib.supportedFormats = [FORMAT_DEFLATE, FORMAT_DEFLATE_RAW, FORMAT_GZIP];
|
|
9769
9326
|
DecompressionStreamZlib.supportedFormats = [FORMAT_DEFLATE, FORMAT_DEFLATE_RAW, FORMAT_GZIP, FORMAT_DEFLATE64_RAW];
|
|
9770
9327
|
|
|
9328
|
+
/*
|
|
9329
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
9330
|
+
|
|
9331
|
+
Redistribution and use in source and binary forms, with or without
|
|
9332
|
+
modification, are permitted provided that the following conditions are met:
|
|
9333
|
+
|
|
9334
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
9335
|
+
this list of conditions and the following disclaimer.
|
|
9336
|
+
|
|
9337
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
9338
|
+
notice, this list of conditions and the following disclaimer in
|
|
9339
|
+
the documentation and/or other materials provided with the distribution.
|
|
9340
|
+
|
|
9341
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
9342
|
+
derived from this software without specific prior written permission.
|
|
9343
|
+
|
|
9344
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
9345
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
9346
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
9347
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
9348
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
9349
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
9350
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
9351
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
9352
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
9353
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
9354
|
+
*/
|
|
9355
|
+
|
|
9356
|
+
|
|
9357
|
+
const BUFFER_LENGTH = 64 * 1024;
|
|
9358
|
+
const DIGEST_LENGTH = 20;
|
|
9359
|
+
|
|
9360
|
+
let wasm, buffer;
|
|
9361
|
+
|
|
9362
|
+
function setWasmExports(wasmAPI) {
|
|
9363
|
+
// deno-lint-ignore valid-typeof
|
|
9364
|
+
if (typeof wasmAPI.aes_hmac_new == FUNCTION_TYPE) {
|
|
9365
|
+
wasm = wasmAPI;
|
|
9366
|
+
buffer = 0;
|
|
9367
|
+
}
|
|
9368
|
+
}
|
|
9369
|
+
|
|
9370
|
+
function resetWasmExports() {
|
|
9371
|
+
wasm = null;
|
|
9372
|
+
buffer = 0;
|
|
9373
|
+
}
|
|
9374
|
+
|
|
9375
|
+
function createEngine(key, authenticationKey) {
|
|
9376
|
+
const exports = wasm;
|
|
9377
|
+
let context = exports ? createContext(exports, key, authenticationKey) : 0;
|
|
9378
|
+
if (!context) {
|
|
9379
|
+
return createEngine$2(key, authenticationKey);
|
|
9380
|
+
}
|
|
9381
|
+
const scratch = buffer;
|
|
9382
|
+
return {
|
|
9383
|
+
process(data, decrypt) {
|
|
9384
|
+
for (let offset = 0; offset < data.length; offset += BUFFER_LENGTH) {
|
|
9385
|
+
const chunk = data.subarray(offset, offset + BUFFER_LENGTH);
|
|
9386
|
+
const heap = getHeap(exports);
|
|
9387
|
+
heap.set(chunk, scratch);
|
|
9388
|
+
exports.aes_hmac_process(context, scratch, chunk.length, decrypt ? 1 : 0);
|
|
9389
|
+
chunk.set(heap.subarray(scratch, scratch + chunk.length));
|
|
9390
|
+
}
|
|
9391
|
+
},
|
|
9392
|
+
digest() {
|
|
9393
|
+
exports.aes_hmac_end(context, scratch);
|
|
9394
|
+
context = 0;
|
|
9395
|
+
return getHeap(exports).slice(scratch, scratch + DIGEST_LENGTH);
|
|
9396
|
+
},
|
|
9397
|
+
dispose() {
|
|
9398
|
+
if (context) {
|
|
9399
|
+
exports.aes_hmac_end(context, 0);
|
|
9400
|
+
context = 0;
|
|
9401
|
+
}
|
|
9402
|
+
}
|
|
9403
|
+
};
|
|
9404
|
+
}
|
|
9405
|
+
|
|
9406
|
+
function createContext(exports, key, authenticationKey) {
|
|
9407
|
+
if (!buffer) {
|
|
9408
|
+
buffer = exports.malloc(BUFFER_LENGTH);
|
|
9409
|
+
}
|
|
9410
|
+
const context = buffer ? exports.aes_hmac_new() : 0;
|
|
9411
|
+
if (context) {
|
|
9412
|
+
const heap = getHeap(exports);
|
|
9413
|
+
heap.set(key, buffer);
|
|
9414
|
+
heap.set(authenticationKey, buffer + key.length);
|
|
9415
|
+
if (exports.aes_hmac_init(context, buffer, key.length, buffer + key.length, authenticationKey.length)) {
|
|
9416
|
+
exports.aes_hmac_end(context, 0);
|
|
9417
|
+
return 0;
|
|
9418
|
+
}
|
|
9419
|
+
}
|
|
9420
|
+
return context;
|
|
9421
|
+
}
|
|
9422
|
+
|
|
9423
|
+
function getHeap(exports) {
|
|
9424
|
+
return new Uint8Array(exports.memory.buffer);
|
|
9425
|
+
}
|
|
9426
|
+
|
|
9771
9427
|
/*
|
|
9772
9428
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
9773
9429
|
|
|
@@ -9829,11 +9485,13 @@ async function instantiateModule(wasmURI, baseURI) {
|
|
|
9829
9485
|
}
|
|
9830
9486
|
}
|
|
9831
9487
|
const wasmInstance = await WebAssembly.instantiate(arrayBuffer);
|
|
9488
|
+
setWasmExports$1(wasmInstance.instance.exports);
|
|
9832
9489
|
setWasmExports(wasmInstance.instance.exports);
|
|
9833
9490
|
}
|
|
9834
9491
|
|
|
9835
9492
|
function resetWasmModule() {
|
|
9836
9493
|
initializedModule = false;
|
|
9494
|
+
resetWasmExports$1();
|
|
9837
9495
|
resetWasmExports();
|
|
9838
9496
|
}
|
|
9839
9497
|
|
|
@@ -9879,6 +9537,7 @@ function arrayBufferFromDataURI(dataURI) {
|
|
|
9879
9537
|
|
|
9880
9538
|
let modulePromise;
|
|
9881
9539
|
|
|
9540
|
+
setAESEngine(createEngine);
|
|
9882
9541
|
configureWorker({
|
|
9883
9542
|
initModule: config => {
|
|
9884
9543
|
if (!modulePromise) {
|
|
@@ -9935,7 +9594,7 @@ async function terminateWorkersAndModule() {
|
|
|
9935
9594
|
*/
|
|
9936
9595
|
|
|
9937
9596
|
|
|
9938
|
-
|
|
9597
|
+
o(setDefaultConfiguration);
|
|
9939
9598
|
|
|
9940
9599
|
/*
|
|
9941
9600
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -10408,12 +10067,16 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
10408
10067
|
let directoryEntry = parent;
|
|
10409
10068
|
if (name) {
|
|
10410
10069
|
directoryEntry = parent.getChildByName(name);
|
|
10411
|
-
if (directoryEntry && !directoryEntry.directory) {
|
|
10070
|
+
if (directoryEntry && (!directoryEntry.directory || directoryEntry.data)) {
|
|
10412
10071
|
if (duplicates == DUPLICATES_KEEP_FIRST) {
|
|
10413
10072
|
continue;
|
|
10414
10073
|
} else if (duplicates == DUPLICATES_KEEP_LAST) {
|
|
10415
|
-
|
|
10416
|
-
|
|
10074
|
+
if (directoryEntry.directory) {
|
|
10075
|
+
directoryEntry.data = entry;
|
|
10076
|
+
} else {
|
|
10077
|
+
this.fs.remove(directoryEntry);
|
|
10078
|
+
directoryEntry = UNDEFINED_VALUE;
|
|
10079
|
+
}
|
|
10417
10080
|
} else {
|
|
10418
10081
|
throw new Error(ERR_DUPLICATE_IMPORTED_ENTRY);
|
|
10419
10082
|
}
|