@zip.js/zip.js 2.8.43 → 2.8.45

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.
Files changed (56) hide show
  1. package/README.md +0 -37
  2. package/deno.json +21 -1
  3. package/dist/zip-core-external.js +194 -159
  4. package/dist/zip-core-external.min.js +1 -1
  5. package/dist/zip-core.js +194 -131
  6. package/dist/zip-core.min.js +1 -1
  7. package/dist/zip-fs-core-external.js +246 -167
  8. package/dist/zip-fs-core-external.min.js +1 -1
  9. package/dist/zip-fs-core.js +244 -139
  10. package/dist/zip-fs-core.min.js +1 -1
  11. package/dist/zip-fs-external.js +267 -1761
  12. package/dist/zip-fs-external.min.js +1 -1
  13. package/dist/zip-fs-native.js +269 -1735
  14. package/dist/zip-fs-native.min.js +1 -1
  15. package/dist/zip-fs.js +268 -1734
  16. package/dist/zip-fs.min.js +1 -1
  17. package/dist/zip-legacy.js +196 -133
  18. package/dist/zip-legacy.min.js +1 -1
  19. package/dist/zip-native.js +196 -133
  20. package/dist/zip-native.min.js +1 -1
  21. package/dist/zip-web-worker-native.js +1 -1
  22. package/dist/zip-web-worker.js +1 -1
  23. package/dist/zip.js +195 -132
  24. package/dist/zip.min.js +1 -1
  25. package/eslint.config.mjs +31 -2
  26. package/index-native.cjs +269 -1735
  27. package/index-native.min.js +1 -1
  28. package/index.cjs +268 -1734
  29. package/index.d.cts +129 -8
  30. package/index.d.ts +129 -8
  31. package/index.min.js +1 -1
  32. package/lib/core/codec-pool.js +6 -2
  33. package/lib/core/codec-worker.js +2 -2
  34. package/lib/core/constants.js +4 -0
  35. package/lib/core/options.js +6 -0
  36. package/lib/core/streams/aes-crypto-stream.js +18 -21
  37. package/lib/core/streams/codec-stream.js +6 -2
  38. package/lib/core/streams/common-crypto.js +2 -0
  39. package/lib/core/streams/zip-entry-stream.js +16 -17
  40. package/lib/core/util/mime-type-data.js +3 -0
  41. package/lib/core/util/mime-type.js +23 -1596
  42. package/lib/core/web-worker-base.js +2 -2
  43. package/lib/core/web-worker-inline-native.js +1 -1
  44. package/lib/core/web-worker-inline-wasm.js +1 -1
  45. package/lib/core/web-worker-wasm.js +4 -8
  46. package/lib/core/zip-entry.js +11 -1
  47. package/lib/core/zip-fs.js +62 -5
  48. package/lib/core/zip-reader.js +80 -43
  49. package/lib/core/zip-writer.js +68 -45
  50. package/lib/zip-core-external.js +2 -0
  51. package/lib/zip-core-reader.js +2 -0
  52. package/lib/zip-fs-core-external.js +2 -0
  53. package/lib/zip-fs-external.js +2 -0
  54. package/lib/zip-mime-types.js +2 -0
  55. package/package.json +9 -3
  56. package/worker-message-property-names.js +1 -1
package/dist/zip.js CHANGED
@@ -71,6 +71,8 @@
71
71
  const EXTRAFIELD_TYPE_USDZ = 0x1986;
72
72
  const EXTRAFIELD_TYPE_INFOZIP = 0x7875;
73
73
  const EXTRAFIELD_TYPE_UNIX = 0x7855;
74
+ const EXTRAFIELD_TYPE_UNIX_TYPE1 = 0x5855;
75
+ const EXTRAFIELD_TYPE_PKWARE_UNIX = 0x000d;
74
76
 
75
77
  const BITFLAG_ENCRYPTED = 0b1;
76
78
  const BITFLAG_LEVEL = 0b0110;
@@ -224,7 +226,7 @@
224
226
  Object.assign(config, DEFAULT_CONFIGURATION);
225
227
  }
226
228
 
227
- function t$1(t){const e='(t=>{"function"==typeof define&&define.amd?define(t):t()})(function(){"use strict";const{Array:t,Object:e,Number:n,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:l,Promise:w,TextEncoder:u,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:g,DecompressionStream:S}=self,v=void 0,b="undefined",z="function",k=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;256>t;t++){let e=t;for(let t=0;8>t;t++)e=1&e?e>>>1^3988292384:e>>>1;C[0][t]=e}for(let t=0;256>t;t++)for(let e=1;8>e;e++){const n=C[e-1][t];C[e][t]=n>>>8^C[0][255&n]}const[A,I,x,M,P,B,D,R]=C;class U{constructor(t){this.o=t||-1}append(t){let e=0|this.o;const n=0|t.length;let s=0;if(n>=8&&t.buffer){const r=new l(t.buffer,t.byteOffset,n),o=n-8;for(;o>=s;s+=8){const t=e^r.getInt32(s,!0),n=r.getInt32(s+4,!0);e=R[255&t]^D[t>>>8&255]^B[t>>>16&255]^P[t>>>24&255]^M[255&n]^x[n>>>8&255]^I[n>>>16&255]^A[n>>>24&255]}}for(;n>s;s++)e=e>>>8^A[255&(e^t[s])];this.o=e}get(){return~this.o}}class W extends d{constructor(){let t;const e=new U;super({transform(t,n){e.append(t),n.enqueue(t)},flush(){const n=new o(4);new l(n.buffer).setUint32(0,e.get()),t.value=n}}),t=this}}function _(t,e){const n=new o(t.length+e.length);return n.set(t),n.set(e,t.length),n}function T(t){return new l(t.buffer,t.byteOffset,t.byteLength)}const V={concat(t,e){if(0===t.length||0===e.length)return t.concat(e);const n=t[t.length-1],s=V.l(n);return 32===s?t.concat(e):V.h(e,s,0|n,t.slice(0,t.length-1))},m(t){const e=t.length;if(0===e)return 0;const n=t[e-1];return 32*(e-1)+V.l(n)},S(t,e){if(32*t.length<e)return t;const n=(t=t.slice(0,s.ceil(e/32))).length;return e&=31,n>0&&e&&(t[n-1]=V.v(e,t[n-1]&2147483648>>e-1,1)),t},v:(t,e,n)=>32===t?e:(n?0|e:e<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,e,n,s){for(void 0===s&&(s=[]);e>=32;e-=32)s.push(n),n=0;if(0===e)return s.concat(t);for(let r=0;r<t.length;r++)s.push(n|t[r]>>>e),n=t[r]<<32-e;const r=t.length?t[t.length-1]:0,o=V.l(r);return s.push(V.v(e+o&31,e+o>32?n:s.pop(),1)),s}},K={bytes:{C(t){const e=V.m(t)/8,n=new o(e);let s;for(let r=0;e>r;r++)3&r||(s=t[r/4]),n[r]=s>>>24,s<<=8;return n},A(t){const e=[];let n,s=0;for(n=0;n<t.length;n++)s=s<<8|t[n],3&~n||(e.push(s),s=0);return 3&n&&e.push(V.v(8*(3&n),s)),e}}},E=class{constructor(t){const e=this;e.blockSize=512,e.I=[1732584193,4023233417,2562383102,271733878,3285377520],e.M=[1518500249,1859775393,2400959708,3395469782],t?(e.P=t.P.slice(0),e.B=t.B.slice(0),e.D=t.D):e.reset()}reset(){const t=this;return t.P=t.I.slice(0),t.B=[],t.D=0,t}update(t){const e=this;"string"==typeof t&&(t=K.R.A(t));const n=e.B=V.concat(e.B,t),s=e.D,o=e.D=s+V.m(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(n);let a=0;for(let t=e.blockSize+s-(e.blockSize+s&e.blockSize-1);o>=t;t+=e.blockSize)e.U(c.subarray(16*a,16*(a+1))),a+=1;return n.splice(0,16*a),e}W(){const t=this;let e=t.B;const n=t.P;e=V.concat(e,[V.v(1,1)]);for(let t=e.length+2;15&t;t++)e.push(0);for(e.push(s.floor(t.D/4294967296)),e.push(0|t.D);e.length;)t.U(e.splice(0,16));return t.reset(),n}_(t,e,n,s){return t>19?t>39?t>59?t>79?void 0:e^n^s:e&n|e&s|n&s:e^n^s:e&n|~e&s}T(t,e){return e<<t|e>>>32-t}U(e){const n=this,r=n.P,o=t(80);for(let t=0;16>t;t++)o[t]=e[t];let c=r[0],i=r[1],a=r[2],f=r[3],l=r[4];for(let t=0;79>=t;t++){16>t||(o[t]=n.T(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const e=n.T(5,c)+n._(t,i,a,f)+l+o[t]+n.M[s.floor(t/20)]|0;l=f,f=a,a=n.T(30,i),i=c,c=e}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+l|0}},F={importKey:t=>new F.V(K.bytes.A(t)),K(t,e,n,s){if(n=n||1e4,0>s||0>n)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,w;const u=new ArrayBuffer(o),h=new l(u);let p=0;const d=V;for(e=K.bytes.A(e),w=1;(o||1)>p;w++){for(c=i=t.encrypt(d.concat(e,[w])),a=1;n>a;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;(o||1)>p&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return u.slice(0,s/8)},V:class{constructor(t){const e=this,n=e.F=E,s=[[],[]];e.L=[new n,new n];const r=e.L[0].blockSize/32;t.length>r&&(t=(new n).update(t).W());for(let e=0;r>e;e++)s[0][e]=909522486^t[e],s[1][e]=1549556828^t[e];e.L[0].update(s[0]),e.L[1].update(s[1]),e.O=new n(e.L[0])}reset(){const t=this;t.O=new t.F(t.L[0]),t.j=!1}update(t){this.j=!0,this.O.update(t)}digest(){const t=this,e=t.O.W(),n=new t.F(t.L[1]).update(e).W();return t.reset(),n}encrypt(t){if(this.j)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==z,O="Invalid password",j="Invalid signature",H="zipjs-abort-check-password";function Z(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const N=16,q={name:"PBKDF2"},G=e.assign({hash:{name:"HMAC"}},q),J=e.assign({iterations:1e3,hash:{name:"SHA-1"}},q),Q=["deriveBits"],X=[8,12,16],Y=[16,24,32],$=10,tt=[0,0,0,0],et=typeof h!=b,nt=et&&h.subtle,st=et&&typeof nt!=b,rt=K.bytes,ot=class{constructor(t){const e=this;e.H=[[[],[],[],[],[]],[[],[],[],[],[]]],e.H[0][0][0]||e.Z();const n=e.H[0][4],s=e.H[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(e.M=[i=t.slice(0),a=[]],c=o;4*o+28>c;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=n[t>>>24]<<24^n[t>>16&255]<<16^n[t>>8&255]<<8^n[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 e=i[3&t?c:c-4];a[t]=4>=c||4>t?e:s[0][n[e>>>24]]^s[1][n[e>>16&255]]^s[2][n[e>>8&255]]^s[3][n[255&e]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}Z(){const t=this.H[0],e=this.H[1],n=t[4],s=e[4],r=[],o=[];let c,i,a,f;for(let t=0;256>t;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let l=c=0;!n[l];l^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,n[l]=o,s[o]=l,f=r[a=r[i=r[l]]];let w=16843009*f^65537*a^257*i^16843008*l,u=257*r[o]^16843008*o;for(let n=0;4>n;n++)t[n][l]=u=u<<24^u>>>8,e[n][o]=w=w<<24^w>>>8}for(let n=0;5>n;n++)t[n]=t[n].slice(0),e[n]=e[n].slice(0)}N(t,e){if(4!==t.length)throw new r("invalid aes block size");const n=this.M[e],s=n.length/4-2,o=[0,0,0,0],c=this.H[e],i=c[0],a=c[1],f=c[2],l=c[3],w=c[4];let u,h,p,d=t[0]^n[0],y=t[e?3:1]^n[1],m=t[2]^n[2],g=t[e?1:3]^n[3],S=4;for(let t=0;s>t;t++)u=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^l[255&g]^n[S],h=i[y>>>24]^a[m>>16&255]^f[g>>8&255]^l[255&d]^n[S+1],p=i[m>>>24]^a[g>>16&255]^f[d>>8&255]^l[255&y]^n[S+2],g=i[g>>>24]^a[d>>16&255]^f[y>>8&255]^l[255&m]^n[S+3],S+=4,d=u,y=h,m=p;for(let t=0;4>t;t++)o[e?3&-t:t]=w[d>>>24]<<24^w[y>>16&255]<<16^w[m>>8&255]<<8^w[255&g]^n[S++],u=d,d=y,y=m,m=g,g=u;return o}},ct=class{constructor(t,e){this.G=t,this.J=e,this.X=e}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}$(t){if(255&~(t>>24))t+=1<<24;else{let e=t>>16&255,n=t>>8&255,s=255&t;255===e?(e=0,255===n?(n=0,255===s?s=0:++s):++n):++e,t=0,t+=e<<16,t+=n<<8,t+=s}return t}et(t){0===(t[0]=this.$(t[0]))&&(t[1]=this.$(t[1]))}Y(t,e,n){let s;if(!(s=e.length))return[];const r=V.m(e);for(let r=0;s>r;r+=4){this.et(n);const s=t.encrypt(n);e[r]^=s[0],e[r+1]^=s[1],e[r+2]^=s[2],e[r+3]^=s[3]}return V.S(e,r)}},it=F.V;let at=et&&st&&typeof nt.importKey==z,ft=et&&st&&typeof nt.deriveBits==z;class lt extends d{constructor({password:t,rawPassword:e,encryptionStrength:n,checkPasswordOnly:s}){super({start(){ut(this,t,e,n)},async transform(t,e){const n=this,{password:c,strength:i,nt:a,ready:f}=n;c?(await(async(t,e,n,s)=>{const o=await pt(t,e,n,yt(s,0,X[e])),c=yt(s,X[e]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)})(n,i,c,yt(t,0,X[i]+2)),t=yt(t,X[i]+2),s?e.error(new r(H)):a()):await f;const l=new o(t.length-$-(t.length-$)%N);e.enqueue(ht(n,t,l,0,$,!0))},async flush(t){const{st:e,ot:n,pending:s,ready:o}=this;if(n&&e){await o;const c=yt(s,0,s.length-$),i=yt(s,s.length-$);let a=k;if(c.length){const t=gt(rt,c);n.update(t);const s=e.update(t);a=mt(rt,s)}const f=yt(mt(rt,n.digest()),0,$);let l=s.length<$?1:0;for(let t=0;$>t;t++)l|=f[t]^i[t];if(l)throw new r(j);t.enqueue(a)}}})}}class wt extends d{constructor({password:t,rawPassword:e,encryptionStrength:n}){let s;super({start(){ut(this,t,e,n)},async transform(t,e){const n=this,{password:s,strength:r,nt:c,ready:i}=n;let a=k;s?(a=await(async(t,e,n)=>{const s=Z(new o(X[e]));return _(s,await pt(t,e,n,s))})(n,r,s),c()):await i;const f=new o(a.length+t.length-t.length%N);f.set(a,0),e.enqueue(ht(n,t,f,a.length,0))},async flush(t){const{st:e,ot:n,pending:r,ready:o}=this;if(n&&e){await o;let c=k;if(r.length){const t=e.update(gt(rt,r));n.update(t),c=mt(rt,t)}s.signature=mt(rt,n.digest()).slice(0,$),t.enqueue(_(c,s.signature))}}}),s=this}}function ut(t,n,s,r){e.assign(t,{ready:new w(e=>t.nt=e),password:dt(n,s),strength:r-1,pending:k})}function ht(t,e,n,s,r,c){const{st:i,ot:a,pending:f}=t;f.length&&(e=_(f,e));const l=e.length-r;let w;for(n=((t,e)=>{if(e&&e>t.length){const n=t;(t=new o(e)).set(n,0)}return t})(n,s+(l-l%N)),w=0;l-N>=w;w+=N){const t=gt(rt,yt(e,w,w+N));c&&a.update(t);const r=i.update(t);c||a.update(r),n.set(mt(rt,r),w+s)}return t.pending=yt(e,w),n}async function pt(n,s,r,c){n.password=null;const i=await(async(t,e,n,s,r)=>{if(!at)return F.importKey(e);try{return await nt.importKey("raw",e,n,!1,r)}catch{return at=!1,F.importKey(e)}})(0,r,G,0,Q),a=await(async(t,e,n)=>{if(!ft)return F.K(e,t.salt,J.iterations,n);try{return await nt.deriveBits(t,e,n)}catch{return ft=!1,F.K(e,t.salt,J.iterations,n)}})(e.assign({salt:c},J),i,8*(2*Y[s]+2)),f=new o(a),l=gt(rt,yt(f,0,Y[s])),w=gt(rt,yt(f,Y[s],2*Y[s])),u=yt(f,2*Y[s]);return e.assign(n,{keys:{key:l,ct:w,passwordVerification:u},st:new ct(new ot(l),t.from(tt)),ot:new it(w)}),u}function dt(t,e){return e===v?(t=>{if(typeof u==b){const e=new o((t=unescape(encodeURIComponent(t))).length);for(let n=0;n<e.length;n++)e[n]=t.charCodeAt(n);return e}return(new u).encode(t)})(t):e}function yt(t,e,n){return t.subarray(e,n)}function mt(t,e){return t.C(e)}function gt(t,e){return t.A(e)}class St extends d{constructor({password:t,rawPassword:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){bt(this,t,e,n)},transform(t,e){const n=this;if(n.password||n.rawPassword){const e=zt(n,t.subarray(0,12));if(n.password=n.rawPassword=null,0!=(e[11]^n.passwordVerification))throw new r(O);t=t.subarray(12)}s?e.error(new r(H)):e.enqueue(zt(n,t))}})}}class vt extends d{constructor({password:t,rawPassword:e,passwordVerification:n}){super({start(){bt(this,t,e,n)},transform(t,e){const n=this;let s,r;if(n.password||n.rawPassword){n.password=n.rawPassword=null;const e=Z(new o(12));e[11]=n.passwordVerification,s=new o(t.length+e.length),s.set(kt(n,e),0),r=12}else s=new o(t.length),r=0;s.set(kt(n,t),r),e.enqueue(s)}})}}function bt(t,n,s,r){e.assign(t,{password:n,rawPassword:s,passwordVerification:r}),((t,n,s)=>{const r=[305419896,591751049,878082192];if(e.assign(t,{keys:r,it:new U(r[0]),ft:new U(r[2])}),s)for(let e=0;e<s.length;e++)Ct(t,s[e]);else for(let e=0;e<n.length;e++)Ct(t,n.charCodeAt(e))})(t,n,s)}function zt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=At(t)^e[s],Ct(t,n[s]);return n}function kt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=At(t)^e[s],Ct(t,e[s]);return n}function Ct(t,e){let[,n]=t.keys;t.it.append([e]);const r=~t.it.get();n=xt(s.imul(xt(n+It(r)),134775813)+1),t.ft.append([n>>>24]);const o=~t.ft.get();t.keys=[r,n,o]}function At(t){const e=2|t.keys[2];return It(s.imul(e,1^e)>>>8)}function It(t){return 255&t}function xt(t){return 4294967295&t}const Mt=new f;function Pt(t){return Mt.get(t)}const Bt="Invalid uncompressed size",Dt="deflate-raw",Rt="gzip",Ut=[31,139,8];class Wt extends d{constructor(t,{chunkSize:e,CompressionStreamZlib:n,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,signed:a,level:f,deflate64:w,format:u,compressionMethod:h}=t,p=this;let d,y,m,g=super.readable;const S=u&&Pt(u),v=a&&r&&!w&&!S&&(!o||i)&&!(!c||!s);if(o&&!i||!a||v||(d=new W,g=Lt(g,d)),r)if(S)g=Ot(g,Et(S.CompressionStream,u,{level:f,chunkSize:e,compressionMethod:h}));else if(v)m=new _t,g=Ot(g,new s(Rt)),g=Lt(g,m);else try{g=Ft(g,c,{level:f,chunkSize:e},s,n)}catch(t){let e;try{e=new s(Rt)}catch{throw t}g=Ot(g,e),g=Lt(g,new _t)}o&&(i?g=Lt(g,new vt(t)):(y=new wt(t),g=Lt(g,y))),Kt(p,g,()=>{let t;o&&!i&&(t=y.signature),o&&!i||!a||(t=v?m.signature:new l(d.value.buffer).getUint32(0)),p.signature=t})}}class _t extends d{constructor(){let t,e=10,n=new o(0);super({transform(t,r){if(e){const n=s.min(e,t.length);if(e-=n,!(t=t.subarray(n)).length)return}const o=n.length+t.length;if(8>=o)return void(n=_(n,t));const c=o-8,i=s.min(c,n.length);r.enqueue(_(n.subarray(0,i),t.subarray(0,c-i))),n=_(n.subarray(i),t.subarray(c-i))},flush(){const e=T(n);t.signature=e.getUint32(0,!0),t.uncompressedSize=e.getUint32(4,!0)}}),t=this}}class Tt extends d{constructor(t,{chunkSize:e,DecompressionStreamZlib:n,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,signed:a,signature:f,compressed:u,useCompressionStream:h,deflate64:p,format:m,compressionMethod:g,rawBitFlag:S,outputSize:b}=t;let z,k,C=super.readable;if(i&&(c?C=Lt(C,new St(t)):(k=new lt(t),C=Lt(C,k))),u){const t=m&&Pt(m);if(t)C=Ot(C,Et(t.DecompressionStream,m,{chunkSize:e,compressionMethod:g,rawBitFlag:S,uncompressedSize:b}));else try{C=Ft(C,h,{chunkSize:e,deflate64:p},s,n)}catch(t){if(p||b===v)throw t;let e;try{e=new s(Rt)}catch{throw t}C=((t,e,n)=>{const s=new U;let c,i,a,f=0,l=!1;const u=new w((t,e)=>{i=t,a=e});u.catch(()=>{}),n||i();const h=new d({start(t){const e=new o(10);e.set(Ut),t.enqueue(e)},transform(t,e){e.enqueue(t)},async flush(t){l=!0,y();try{await u}finally{m()}const e=new o(8),r=T(e);r.setUint32(0,s.get(),!0),r.setUint32(4,n,!0),t.enqueue(e)},cancel(t){a(t)}}),p=new d({transform(t,e){s.append(t),f+=t.length,n>f?l&&y():i(),e.enqueue(t)},cancel(t){a(t)}});return t=Lt(t,h),Lt(t=Ot(t,e),p);function y(){m(),c=setTimeout(()=>a(new r(Bt)),5e3)}function m(){clearTimeout(c)}})(C,e,b)}C=(t=>{const e=t.getReader();return new y({async pull(t){let n;try{n=await e.read()}catch(t){if(t&&t.message)throw t;const e=new r("Invalid compressed data");throw e.cause=t,e}const{value:s,done:o}=n;o?t.close():t.enqueue(s)},cancel:t=>e.cancel(t)})})(C)}i&&!c||!a||(z=new W,C=Lt(C,z)),Kt(this,C,()=>{if((!i||c)&&a){const t=new l(z.value.buffer);if(f!=t.getUint32(0,!1))throw new r(j)}})}}const Vt=new f;function Kt(t,n,s){n=Lt(n,new d({flush:s})),e.defineProperty(t,"readable",{get:()=>n})}function Et(t,e,n){if(!t)throw new r("Compression method not supported");return new t(e,n)}function Ft(t,e,n,s,r){const o=e&&s?s:r||s,c=n.deflate64?"deflate64-raw":Dt;let i;try{i=new o(c,n)}catch(t){if(!e||!r||o==r)throw t;i=new r(c,n)}return Ot(t,i)}function Lt(t,e){return(t=>{if(t instanceof y)return t;const e=t.getReader();return new y({async pull(t){const{value:n,done:s}=await e.read();s?t.close():t.enqueue(n)},cancel:t=>e.cancel(t)})})(t).pipeThrough(e)}function Ot(t,e){const n=e.writable.getWriter(),s=t.getReader();return(async()=>{try{for(;;){await n.ready;const t=await s.read();if(t.done){await n.close();break}await n.write(t.value)}}catch(t){await(async(t,e)=>{try{await t.abort(e)}catch{}})(n,t),await(async(t,e)=>{try{await t.cancel(e)}catch{}})(s,t)}})(),e.readable}const jt="data",Ht="close",Zt="deflate";class Nt extends d{constructor(t,n){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Zt)?c=Wt:o.startsWith("inflate")&&(c=Tt),s.outputSize=0;let i=0;const a=new c(t,n),f=super.readable,l=new d({transform(t,e){t&&t.length&&(i+=t.length,e.enqueue(t))},flush(){e.assign(s,{inputSize:i})}}),w=new d({transform(e,n){if(e&&e.length&&(n.enqueue(e),s.outputSize+=e.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Bt)},flush(){const{signature:t}=a;e.assign(s,{signature:t,inputSize:i})}});e.defineProperty(s,"readable",{get:()=>f.pipeThrough(l).pipeThrough(a).pipeThrough(w)})}}class qt extends d{constructor(t){const e=[];let s=0;function r(){const n=new o(t);let r=0;for(;t>r;){const s=e[0],o=t-r;s.length>o?(n.set(s.subarray(0,o),r),e[0]=s.subarray(o),r+=o):(n.set(s,r),r+=s.length,e.shift())}return s-=t,n}n.isFinite(t)&&t>=1||(t=65536),super({transform(n,o){for(e.push(n),s+=n.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(((t,e)=>{const n=new o(e);let s=0;for(const e of t)n.set(e,s),s+=e.length;return n})(e,s))}})}}let Gt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Gt=navigator.hardwareConcurrency)}catch{}const Jt=new f,Qt=new f;let Xt,Yt,$t,te,ee,ne,se=0;async function re(t){let e,o;try{const{options:c,config:i}=t;if(c.format&&await(async(t,e)=>{!Mt.has(t)&&e&&((t,e)=>{const{CompressionStream:n,DecompressionStream:s}=e;if(typeof n!=z&&typeof s!=z)throw new r("Invalid codec module");Mt.set(t,{CompressionStream:n,DecompressionStream:s})})(t,await(import(e)))})(c.format,c.codecURI),i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream,c.compressed&&!c.format)if(c.useCompressionStream){if(!((t,e)=>{if(!t)return!1;let n=Vt.get(t);n||(n=new f,Vt.set(t,n));let s=n.get(e);if(s===v){try{new t(e),s=!0}catch{s=!1}n.set(e,s)}return s})(c.codecType.startsWith(Zt)?i.CompressionStream:i.DecompressionStream,Dt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{c.useCompressionStream=!0}const a={highWaterMark:1},l=t.readable||new y({async pull(t){const e=new w(t=>Jt.set(se,t));oe({type:"pull",messageId:se}),se=(se+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await e;t.enqueue(s),r&&t.close()}},a);o=t.writable||new m({async write(t){let e;const s=new w(t=>e=t);Qt.set(se,e),oe({type:jt,value:t,messageId:se}),se=(se+1)%n.MAX_SAFE_INTEGER,await s}},a),e=new Nt(c,i),Xt=new AbortController;const{signal:u}=Xt;await l.pipeThrough(e).pipeThrough(new qt((t=>s.max(t.chunkSize,64))(i))).pipeTo(o,{signal:u,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{signature:h,inputSize:p,outputSize:d}=e;oe({type:Ht,result:{signature:h,inputSize:p,outputSize:d}})}catch(t){if(t.outputSize=e?e.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}ce(t)}}function oe(t){const{value:e}=t;if(e)if(e.length)try{t.value=(n=e,n.byteOffset||n.byteLength!=n.buffer.byteLength?new o(n):n).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var n}function ce(t=new r("Unknown error")){const{message:e,stack:n,code:s,name:o,outputSize:c,cause:i}=t,a={message:e,stack:n,code:s,name:o,outputSize:c};i&&(a.cause={name:i.name,message:i.message}),p({error:a})}function ie(t,e,n={}){if(!Yt){const t=new r("WASM module not loaded");throw t.cause=ne,t}const c="number"==typeof n.level?n.level:-1,i="number"==typeof n.outBuffer?n.outBuffer:65536,a="number"==typeof n.inBufferSize?n.inBufferSize:65536;return new d({start(){try{let n;if(this.lt=$t(i),this.in=$t(a),this.inBufferSize=a,!this.lt||!this.in)throw new r("allocation failed");if(this.wt=new o(i),t?(this.ut=Yt.deflate_process,this.ht=Yt.deflate_last_consumed,this.yt=Yt.deflate_end,this.gt=Yt.deflate_new(),n="gzip"===e?Yt.deflate_init_gzip(this.gt,c):"deflate-raw"===e?Yt.deflate_init_raw(this.gt,c):Yt.deflate_init(this.gt,c)):"deflate64-raw"===e?(this.ut=Yt.inflate9_process,this.ht=Yt.inflate9_last_consumed,this.yt=Yt.inflate9_end,this.gt=Yt.inflate9_new(),n=Yt.inflate9_init_raw(this.gt)):(this.ut=Yt.inflate_process,this.ht=Yt.inflate_last_consumed,this.yt=Yt.inflate_end,this.gt=Yt.inflate_new(),n="deflate-raw"===e?Yt.inflate_init_raw(this.gt):"gzip"===e?Yt.inflate_init_gzip(this.gt):Yt.inflate_init(this.gt)),0!==n)throw new r("init failed:"+n)}catch(t){throw f(this),t}},transform(e,n){try{const c=e,a=new o(ee.buffer),f=this.ut,l=this.ht,w=this.lt,u=this.wt;let h=0;for(;h<c.length;){const e=s.min(c.length-h,32768);if((!this.in||this.inBufferSize<e)&&(this.in&&te&&(te(this.in),this.in=0),this.in=$t(e),this.inBufferSize=e,!this.in))throw new r("allocation failed");a.set(c.subarray(h,h+e),this.in);const o=f(this.gt,this.in,e,w,i,0),p=16777215&o;if(p&&(u.set(a.subarray(w,w+p),0),n.enqueue(u.slice(0,p))),!t){const t=o>>24&255,e=128&t?t-256:t;if(0>e)throw new r("process error:"+e)}const d=l(this.gt);if(0===d)break;h+=d}}catch(t){f(this),n.error(t)}},flush(e){try{const n=new o(ee.buffer),s=this.ut,c=this.lt,a=this.wt;for(;;){const o=s(this.gt,0,0,c,i,4),f=16777215&o,l=o>>24&255;if(!t){const t=128&l?l-256:l;if(0>t)throw new r("process error:"+t)}if(f&&(a.set(n.subarray(c,c+f),0),e.enqueue(a.slice(0,f))),1===l||0===f)break}}catch(t){e.error(t)}finally{const t=f(this);0!==t&&e.error(new r("end error:"+t))}},cancel(){f(this)}});function f(t){let e=0;return t.gt&&t.yt&&(e=t.yt(t.gt)),t.gt=0,t.in&&te&&te(t.in),t.in=0,t.lt&&te&&te(t.lt),t.lt=0,e}}addEventListener("message",({data:t})=>{const{type:e,messageId:n,value:s,done:r}=t;try{if("start"==e&&re(t),e==jt){const t=Jt.get(n);Jt.delete(n),t({value:s||new o,done:r})}if("ack"==e){const t=Qt.get(n);Qt.delete(n),t()}e==Ht&&Xt.abort()}catch(t){ce(t)}}),p({type:"ready"});class ae{constructor(t="deflate",e){return ie(!0,t,e)}}class fe{constructor(t="deflate",e){return ie(!1,t,e)}}ae.St=!0,fe.St=!0;let le=!1;self.initModule=async t=>{try{const e=await(async(t,{baseURI:e})=>{if(!le)try{await(async(t,e)=>{let n,s;try{try{s=new URL(t,e)}catch{}const r=await fetch(s);n=await r.arrayBuffer()}catch(e){if(!t.startsWith("data:application/wasm;base64,"))throw e;n=(t=>{const e=t.split(",")[1],n=atob(e),s=n.length,r=new o(s);for(let t=0;s>t;++t)r[t]=n.charCodeAt(t);return r.buffer})(t)}(t=>{if(Yt=t,({malloc:$t,free:te,memory:ee}=Yt),"function"!=typeof $t||"function"!=typeof te||!ee)throw Yt=$t=te=ee=null,new r("Invalid WASM module")})((await WebAssembly.instantiate(n)).instance.exports)})(t,e),le=!0}catch(t){throw(t=>{ne=t})(t),t}})(t.wasmURI,t);return t.CompressionStreamZlib=ae,t.DecompressionStreamZlib=fe,e}catch{}}});\n';t({workerURI:t=>{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return "data:"+n+","+encodeURIComponent(e)}});}
229
+ function t$1(t){const e='(t=>{"function"==typeof define&&define.amd?define(t):t()})(function(){"use strict";const{Array:t,Object:e,Number:n,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:l,Promise:w,TextEncoder:u,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:g,DecompressionStream:S}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;256>t;t++){let e=t;for(let t=0;8>t;t++)e=1&e?e>>>1^3988292384:e>>>1;C[0][t]=e}for(let t=0;256>t;t++)for(let e=1;8>e;e++){const n=C[e-1][t];C[e][t]=n>>>8^C[0][255&n]}const[A,I,x,M,P,B,D,R]=C;class U{constructor(t){this.o=t||-1}append(t){let e=0|this.o;const n=0|t.length;let s=0;if(n>=8&&t.buffer){const r=new l(t.buffer,t.byteOffset,n),o=n-8;for(;o>=s;s+=8){const t=e^r.getInt32(s,!0),n=r.getInt32(s+4,!0);e=R[255&t]^D[t>>>8&255]^B[t>>>16&255]^P[t>>>24&255]^M[255&n]^x[n>>>8&255]^I[n>>>16&255]^A[n>>>24&255]}}for(;n>s;s++)e=e>>>8^A[255&(e^t[s])];this.o=e}get(){return~this.o}}class W extends d{constructor(){let t;const e=new U;super({transform(t,n){e.append(t),n.enqueue(t)},flush(){const n=new o(4);new l(n.buffer).setUint32(0,e.get()),t.value=n}}),t=this}}function _(t,e){const n=new o(t.length+e.length);return n.set(t),n.set(e,t.length),n}function T(t){return new l(t.buffer,t.byteOffset,t.byteLength)}const V={concat(t,e){if(0===t.length||0===e.length)return t.concat(e);const n=t[t.length-1],s=V.l(n);return 32===s?t.concat(e):V.h(e,s,0|n,t.slice(0,t.length-1))},m(t){const e=t.length;if(0===e)return 0;const n=t[e-1];return 32*(e-1)+V.l(n)},S(t,e){if(32*t.length<e)return t;const n=(t=t.slice(0,s.ceil(e/32))).length;return e&=31,n>0&&e&&(t[n-1]=V.v(e,t[n-1]&2147483648>>e-1,1)),t},v:(t,e,n)=>32===t?e:(n?0|e:e<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,e,n,s){for(void 0===s&&(s=[]);e>=32;e-=32)s.push(n),n=0;if(0===e)return s.concat(t);for(let r=0;r<t.length;r++)s.push(n|t[r]>>>e),n=t[r]<<32-e;const r=t.length?t[t.length-1]:0,o=V.l(r);return s.push(V.v(e+o&31,e+o>32?n:s.pop(),1)),s}},K={bytes:{C(t){const e=V.m(t)/8,n=new o(e);let s;for(let r=0;e>r;r++)3&r||(s=t[r/4]),n[r]=s>>>24,s<<=8;return n},A(t){const e=[];let n,s=0;for(n=0;n<t.length;n++)s=s<<8|t[n],3&~n||(e.push(s),s=0);return 3&n&&e.push(V.v(8*(3&n),s)),e}}},E=class{constructor(t){const e=this;e.blockSize=512,e.I=[1732584193,4023233417,2562383102,271733878,3285377520],e.M=[1518500249,1859775393,2400959708,3395469782],t?(e.P=t.P.slice(0),e.B=t.B.slice(0),e.D=t.D):e.reset()}reset(){const t=this;return t.P=t.I.slice(0),t.B=[],t.D=0,t}update(t){const e=this;"string"==typeof t&&(t=K.R.A(t));const n=e.B=V.concat(e.B,t),s=e.D,o=e.D=s+V.m(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(n);let a=0;for(let t=e.blockSize+s-(e.blockSize+s&e.blockSize-1);o>=t;t+=e.blockSize)e.U(c.subarray(16*a,16*(a+1))),a+=1;return n.splice(0,16*a),e}W(){const t=this;let e=t.B;const n=t.P;e=V.concat(e,[V.v(1,1)]);for(let t=e.length+2;15&t;t++)e.push(0);for(e.push(s.floor(t.D/4294967296)),e.push(0|t.D);e.length;)t.U(e.splice(0,16));return t.reset(),n}_(t,e,n,s){return t>19?t>39?t>59?t>79?void 0:e^n^s:e&n|e&s|n&s:e^n^s:e&n|~e&s}T(t,e){return e<<t|e>>>32-t}U(e){const n=this,r=n.P,o=t(80);for(let t=0;16>t;t++)o[t]=e[t];let c=r[0],i=r[1],a=r[2],f=r[3],l=r[4];for(let t=0;79>=t;t++){16>t||(o[t]=n.T(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const e=n.T(5,c)+n._(t,i,a,f)+l+o[t]+n.M[s.floor(t/20)]|0;l=f,f=a,a=n.T(30,i),i=c,c=e}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+l|0}},F={importKey:t=>new F.V(K.bytes.A(t)),K(t,e,n,s){if(n=n||1e4,0>s||0>n)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,w;const u=new ArrayBuffer(o),h=new l(u);let p=0;const d=V;for(e=K.bytes.A(e),w=1;(o||1)>p;w++){for(c=i=t.encrypt(d.concat(e,[w])),a=1;n>a;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;(o||1)>p&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return u.slice(0,s/8)},V:class{constructor(t){const e=this,n=e.F=E,s=[[],[]];e.L=[new n,new n];const r=e.L[0].blockSize/32;t.length>r&&(t=(new n).update(t).W());for(let e=0;r>e;e++)s[0][e]=909522486^t[e],s[1][e]=1549556828^t[e];e.L[0].update(s[0]),e.L[1].update(s[1]),e.O=new n(e.L[0])}reset(){const t=this;t.O=new t.F(t.L[0]),t.j=!1}update(t){this.j=!0,this.O.update(t)}digest(){const t=this,e=t.O.W(),n=new t.F(t.L[1]).update(e).W();return t.reset(),n}encrypt(t){if(this.j)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==k,O="Invalid password",j="Invalid signature",H=j,Z="zipjs-abort-check-password";function N(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const q=16,G={name:"PBKDF2"},J=e.assign({hash:{name:"HMAC"}},G),Q=e.assign({iterations:1e3,hash:{name:"SHA-1"}},G),X=["deriveBits"],Y=[8,12,16],$=[16,24,32],tt=10,et=[0,0,0,0],nt=typeof h!=b,st=nt&&h.subtle,rt=nt&&typeof st!=b,ot=K.bytes,ct=class{constructor(t){const e=this;e.H=[[[],[],[],[],[]],[[],[],[],[],[]]],e.H[0][0][0]||e.Z();const n=e.H[0][4],s=e.H[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(e.M=[i=t.slice(0),a=[]],c=o;4*o+28>c;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=n[t>>>24]<<24^n[t>>16&255]<<16^n[t>>8&255]<<8^n[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 e=i[3&t?c:c-4];a[t]=4>=c||4>t?e:s[0][n[e>>>24]]^s[1][n[e>>16&255]]^s[2][n[e>>8&255]]^s[3][n[255&e]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}Z(){const t=this.H[0],e=this.H[1],n=t[4],s=e[4],r=[],o=[];let c,i,a,f;for(let t=0;256>t;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let l=c=0;!n[l];l^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,n[l]=o,s[o]=l,f=r[a=r[i=r[l]]];let w=16843009*f^65537*a^257*i^16843008*l,u=257*r[o]^16843008*o;for(let n=0;4>n;n++)t[n][l]=u=u<<24^u>>>8,e[n][o]=w=w<<24^w>>>8}for(let n=0;5>n;n++)t[n]=t[n].slice(0),e[n]=e[n].slice(0)}N(t,e){if(4!==t.length)throw new r("invalid aes block size");const n=this.M[e],s=n.length/4-2,o=[0,0,0,0],c=this.H[e],i=c[0],a=c[1],f=c[2],l=c[3],w=c[4];let u,h,p,d=t[0]^n[0],y=t[e?3:1]^n[1],m=t[2]^n[2],g=t[e?1:3]^n[3],S=4;for(let t=0;s>t;t++)u=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^l[255&g]^n[S],h=i[y>>>24]^a[m>>16&255]^f[g>>8&255]^l[255&d]^n[S+1],p=i[m>>>24]^a[g>>16&255]^f[d>>8&255]^l[255&y]^n[S+2],g=i[g>>>24]^a[d>>16&255]^f[y>>8&255]^l[255&m]^n[S+3],S+=4,d=u,y=h,m=p;for(let t=0;4>t;t++)o[e?3&-t:t]=w[d>>>24]<<24^w[y>>16&255]<<16^w[m>>8&255]<<8^w[255&g]^n[S++],u=d,d=y,y=m,m=g,g=u;return o}},it=class{constructor(t,e){this.G=t,this.J=e,this.X=e}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}$(t){if(255&~(t>>24))t+=1<<24;else{let e=t>>16&255,n=t>>8&255,s=255&t;255===e?(e=0,255===n?(n=0,255===s?s=0:++s):++n):++e,t=0,t+=e<<16,t+=n<<8,t+=s}return t}et(t){0===(t[0]=this.$(t[0]))&&(t[1]=this.$(t[1]))}Y(t,e,n){let s;if(!(s=e.length))return[];const r=V.m(e);for(let r=0;s>r;r+=4){this.et(n);const s=t.encrypt(n);e[r]^=s[0],e[r+1]^=s[1],e[r+2]^=s[2],e[r+3]^=s[3]}return V.S(e,r)}},at=F.V;let ft=nt&&rt&&typeof st.importKey==k,lt=nt&&rt&&typeof st.deriveBits==k;class wt extends d{constructor({password:t,rawPassword:e,encryptionStrength:n,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:c,strength:i,nt:a,ready:f}=n;c?(await(async(t,e,n,s)=>{const o=await dt(t,e,n,mt(s,0,Y[e])),c=mt(s,Y[e]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)})(n,i,c,mt(t,0,Y[i]+2)),t=mt(t,Y[i]+2),s?e.error(new r(Z)):a()):await f;const l=new o(t.length-tt-(t.length-tt)%q);e.enqueue(pt(n,t,l,0,tt,!0))},async flush(t){const{st:e,ot:n,pending:s,ready:o}=this;if(n&&e){await o;const i=mt(s,0,s.length-tt),a=mt(s,s.length-tt);let f=z;if(i.length){const t=St(ot,i);n.update(t);const s=e.update(t);f=gt(ot,s)}const l=mt(gt(ot,n.digest()),0,tt);let w=s.length<tt?1:0;for(let t=0;tt>t;t++)w|=l[t]^a[t];if(w&&c)throw new r(H);t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:e,encryptionStrength:n}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:s,strength:r,nt:c,ready:i}=n;let a=z;s?(a=await(async(t,e,n)=>{const s=N(new o(Y[e]));return _(s,await dt(t,e,n,s))})(n,r,s),c()):await i;const f=new o(a.length+t.length-t.length%q);f.set(a,0),e.enqueue(pt(n,t,f,a.length,0))},async flush(t){const{st:e,ot:n,pending:s,ready:r}=this;if(n&&e){await r;let o=z;if(s.length){const t=e.update(St(ot,s));n.update(t),o=gt(ot,t)}const c=gt(ot,n.digest()).slice(0,tt);t.enqueue(_(o,c))}}})}}function ht(t,n,s,r){e.assign(t,{ready:new w(e=>t.nt=e),password:yt(n,s),strength:r-1,pending:z})}function pt(t,e,n,s,r,c){const{st:i,ot:a,pending:f}=t;f.length&&(e=_(f,e));const l=e.length-r;let w;for(n=((t,e)=>{if(e&&e>t.length){const n=t;(t=new o(e)).set(n,0)}return t})(n,s+(l-l%q)),w=0;l-q>=w;w+=q){const t=St(ot,mt(e,w,w+q));c&&a.update(t);const r=i.update(t);c||a.update(r),n.set(gt(ot,r),w+s)}return t.pending=mt(e,w),n}async function dt(n,s,r,c){n.password=null;const i=await(async(t,e,n,s,r)=>{if(!ft)return F.importKey(e);try{return await st.importKey("raw",e,n,!1,r)}catch{return ft=!1,F.importKey(e)}})(0,r,J,0,X),a=await(async(t,e,n)=>{if(!lt)return F.K(e,t.salt,Q.iterations,n);try{return await st.deriveBits(t,e,n)}catch{return lt=!1,F.K(e,t.salt,Q.iterations,n)}})(e.assign({salt:c},Q),i,8*(2*$[s]+2)),f=new o(a),l=St(ot,mt(f,0,$[s])),w=St(ot,mt(f,$[s],2*$[s])),u=mt(f,2*$[s]);return e.assign(n,{keys:{key:l,ct:w,passwordVerification:u},st:new it(new ct(l),t.from(et)),ot:new at(w)}),u}function yt(t,e){return e===v?(t=>{if(typeof u==b){const e=new o((t=unescape(encodeURIComponent(t))).length);for(let n=0;n<e.length;n++)e[n]=t.charCodeAt(n);return e}return(new u).encode(t)})(t):e}function mt(t,e,n){return t.subarray(e,n)}function gt(t,e){return t.C(e)}function St(t,e){return t.A(e)}class vt extends d{constructor({password:t,rawPassword:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){kt(this,t,e,n)},transform(t,e){const n=this;if(n.password||n.rawPassword){const e=zt(n,t.subarray(0,12));if(n.password=n.rawPassword=null,0!=(e[11]^n.passwordVerification))throw new r(O);t=t.subarray(12)}s?e.error(new r(Z)):e.enqueue(zt(n,t))}})}}class bt extends d{constructor({password:t,rawPassword:e,passwordVerification:n}){super({start(){kt(this,t,e,n)},transform(t,e){const n=this;let s,r;if(n.password||n.rawPassword){n.password=n.rawPassword=null;const e=N(new o(12));e[11]=n.passwordVerification,s=new o(t.length+e.length),s.set(Ct(n,e),0),r=12}else s=new o(t.length),r=0;s.set(Ct(n,t),r),e.enqueue(s)}})}}function kt(t,n,s,r){e.assign(t,{password:n,rawPassword:s,passwordVerification:r}),((t,n,s)=>{const r=[305419896,591751049,878082192];if(e.assign(t,{keys:r,it:new U(r[0]),ft:new U(r[2])}),s)for(let e=0;e<s.length;e++)At(t,s[e]);else for(let e=0;e<n.length;e++)At(t,n.charCodeAt(e))})(t,n,s)}function zt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=It(t)^e[s],At(t,n[s]);return n}function Ct(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=It(t)^e[s],At(t,e[s]);return n}function At(t,e){let[,n]=t.keys;t.it.append([e]);const r=~t.it.get();n=Mt(s.imul(Mt(n+xt(r)),134775813)+1),t.ft.append([n>>>24]);const o=~t.ft.get();t.keys=[r,n,o]}function It(t){const e=2|t.keys[2];return xt(s.imul(e,1^e)>>>8)}function xt(t){return 255&t}function Mt(t){return 4294967295&t}const Pt=new f;function Bt(t){return Pt.get(t)}const Dt="Invalid uncompressed size",Rt=j,Ut="deflate-raw",Wt="gzip",_t=[31,139,8];class Tt extends d{constructor(t,{chunkSize:e,CompressionStreamZlib:n,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:w,format:u,compressionMethod:h}=t,p=this;let d,y,m,g=super.readable;const S=u&&Bt(u),v=a&&r&&!w&&!S&&(!o||i)&&!(!c||!s);if(o&&!i||!a||v||(d=new W,g=jt(g,d)),r)if(S)g=Ht(g,Lt(S.CompressionStream,u,{level:f,chunkSize:e,compressionMethod:h}));else if(v)m=new Vt,g=Ht(g,new s(Wt)),g=jt(g,m);else try{g=Ot(g,c,{level:f,chunkSize:e},s,n)}catch(t){let e;try{e=new s(Wt)}catch{throw t}g=Ht(g,e),g=jt(g,new Vt)}o&&(i?g=jt(g,new bt(t)):(y=new ut(t),g=jt(g,y))),Ft(p,g,()=>{o&&!i||!a||(p.crc32=v?m.crc32:new l(d.value.buffer).getUint32(0))})}}class Vt extends d{constructor(){let t,e=10,n=new o(0);super({transform(t,r){if(e){const n=s.min(e,t.length);if(e-=n,!(t=t.subarray(n)).length)return}const o=n.length+t.length;if(8>=o)return void(n=_(n,t));const c=o-8,i=s.min(c,n.length);r.enqueue(_(n.subarray(0,i),t.subarray(0,c-i))),n=_(n.subarray(i),t.subarray(c-i))},flush(){const e=T(n);t.crc32=e.getUint32(0,!0),t.uncompressedSize=e.getUint32(4,!0)}}),t=this}}class Kt extends d{constructor(t,{chunkSize:e,DecompressionStreamZlib:n,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:u,useCompressionStream:h,deflate64:p,format:m,compressionMethod:g,rawBitFlag:S,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=jt(C,new vt(t)):(z=new wt(t),C=jt(C,z))),u){const t=m&&Bt(m);if(t)C=Ht(C,Lt(t.DecompressionStream,m,{chunkSize:e,compressionMethod:g,rawBitFlag:S,uncompressedSize:b}));else try{C=Ot(C,h,{chunkSize:e,deflate64:p},s,n)}catch(t){if(p||b===v)throw t;let e;try{e=new s(Wt)}catch{throw t}C=((t,e,n)=>{const s=new U;let c,i,a,f=0,l=!1;const u=new w((t,e)=>{i=t,a=e});u.catch(()=>{}),n||i();const h=new d({start(t){const e=new o(10);e.set(_t),t.enqueue(e)},transform(t,e){e.enqueue(t)},async flush(t){l=!0,y();try{await u}finally{m()}const e=new o(8),r=T(e);r.setUint32(0,s.get(),!0),r.setUint32(4,n,!0),t.enqueue(e)},cancel(t){a(t)}}),p=new d({transform(t,e){s.append(t),f+=t.length,n>f?l&&y():i(),e.enqueue(t)},cancel(t){a(t)}});return t=jt(t,h),jt(t=Ht(t,e),p);function y(){m(),c=setTimeout(()=>a(new r(Dt)),5e3)}function m(){clearTimeout(c)}})(C,e,b)}C=(t=>{const e=t.getReader();return new y({async pull(t){let n;try{n=await e.read()}catch(t){if(t&&t.message)throw t;const e=new r("Invalid compressed data");throw e.cause=t,e}const{value:s,done:o}=n;o?t.close():t.enqueue(s)},cancel:t=>e.cancel(t)})})(C)}a&&(k=new W,C=jt(C,k)),Ft(this,C,()=>{if(a){const t=new l(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r(Rt)}})}}const Et=new f;function Ft(t,n,s){n=jt(n,new d({flush:s})),e.defineProperty(t,"readable",{get:()=>n})}function Lt(t,e,n){if(!t)throw new r("Compression method not supported");return new t(e,n)}function Ot(t,e,n,s,r){const o=e&&s?s:r||s,c=n.deflate64?"deflate64-raw":Ut;let i;try{i=new o(c,n)}catch(t){if(!e||!r||o==r)throw t;i=new r(c,n)}return Ht(t,i)}function jt(t,e){return(t=>{if(t instanceof y)return t;const e=t.getReader();return new y({async pull(t){const{value:n,done:s}=await e.read();s?t.close():t.enqueue(n)},cancel:t=>e.cancel(t)})})(t).pipeThrough(e)}function Ht(t,e){const n=e.writable.getWriter(),s=t.getReader();return(async()=>{try{for(;;){await n.ready;const t=await s.read();if(t.done){await n.close();break}await n.write(t.value)}}catch(t){await(async(t,e)=>{try{await t.abort(e)}catch{}})(n,t),await(async(t,e)=>{try{await t.cancel(e)}catch{}})(s,t)}})(),e.readable}const Zt="data",Nt="close",qt="deflate";class Gt extends d{constructor(t,n){super({});const s=this,{codecType:o}=t;let c;o.startsWith(qt)?c=Tt:o.startsWith("inflate")&&(c=Kt),s.outputSize=0;let i=0;const a=new c(t,n),f=super.readable,l=new d({transform(t,e){t&&t.length&&(i+=t.length,e.enqueue(t))},flush(){e.assign(s,{inputSize:i})}}),w=new d({transform(e,n){if(e&&e.length&&(n.enqueue(e),s.outputSize+=e.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Dt)},flush(){const{crc32:t}=a;e.assign(s,{crc32:t,inputSize:i})}});e.defineProperty(s,"readable",{get:()=>f.pipeThrough(l).pipeThrough(a).pipeThrough(w)})}}class Jt extends d{constructor(t){const e=[];let s=0;function r(){const n=new o(t);let r=0;for(;t>r;){const s=e[0],o=t-r;s.length>o?(n.set(s.subarray(0,o),r),e[0]=s.subarray(o),r+=o):(n.set(s,r),r+=s.length,e.shift())}return s-=t,n}n.isFinite(t)&&t>=1||(t=65536),super({transform(n,o){for(e.push(n),s+=n.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(((t,e)=>{const n=new o(e);let s=0;for(const e of t)n.set(e,s),s+=e.length;return n})(e,s))}})}}let Qt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Qt=navigator.hardwareConcurrency)}catch{}const Xt=new f,Yt=new f;let $t,te,ee,ne,se,re,oe=0;async function ce(t){let e,o;try{const{options:c,config:i}=t;if(c.format&&await(async(t,e)=>{!Pt.has(t)&&e&&((t,e)=>{const{CompressionStream:n,DecompressionStream:s}=e;if(typeof n!=k&&typeof s!=k)throw new r("Invalid codec module");Pt.set(t,{CompressionStream:n,DecompressionStream:s})})(t,await(import(e)))})(c.format,c.codecURI),i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream,c.compressed&&!c.format)if(c.useCompressionStream){if(!((t,e)=>{if(!t)return!1;let n=Et.get(t);n||(n=new f,Et.set(t,n));let s=n.get(e);if(s===v){try{new t(e),s=!0}catch{s=!1}n.set(e,s)}return s})(c.codecType.startsWith(qt)?i.CompressionStream:i.DecompressionStream,Ut))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{c.useCompressionStream=!0}const a={highWaterMark:1},l=t.readable||new y({async pull(t){const e=new w(t=>Xt.set(oe,t));ie({type:"pull",messageId:oe}),oe=(oe+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await e;t.enqueue(s),r&&t.close()}},a);o=t.writable||new m({async write(t){let e;const s=new w(t=>e=t);Yt.set(oe,e),ie({type:Zt,value:t,messageId:oe}),oe=(oe+1)%n.MAX_SAFE_INTEGER,await s}},a),e=new Gt(c,i),$t=new AbortController;const{signal:u}=$t;await l.pipeThrough(e).pipeThrough(new Jt((t=>s.max(t.chunkSize,64))(i))).pipeTo(o,{signal:u,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{crc32:h,inputSize:p,outputSize:d}=e;ie({type:Nt,result:{crc32:h,inputSize:p,outputSize:d}})}catch(t){if(t.outputSize=e?e.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}ae(t)}}function ie(t){const{value:e}=t;if(e)if(e.length)try{t.value=(n=e,n.byteOffset||n.byteLength!=n.buffer.byteLength?new o(n):n).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var n}function ae(t=new r("Unknown error")){const{message:e,stack:n,code:s,name:o,outputSize:c,cause:i}=t,a={message:e,stack:n,code:s,name:o,outputSize:c};i&&(a.cause={name:i.name,message:i.message}),p({error:a})}function fe(t,e,n={}){if(!te){const t=new r("WASM module not loaded");throw t.cause=re,t}const c="number"==typeof n.level?n.level:-1,i="number"==typeof n.outBuffer?n.outBuffer:65536,a="number"==typeof n.inBufferSize?n.inBufferSize:65536;return new d({start(){try{let n;if(this.lt=ee(i),this.in=ee(a),this.inBufferSize=a,!this.lt||!this.in)throw new r("allocation failed");if(this.wt=new o(i),t?(this.ut=te.deflate_process,this.ht=te.deflate_last_consumed,this.yt=te.deflate_end,this.gt=te.deflate_new(),n="gzip"===e?te.deflate_init_gzip(this.gt,c):"deflate-raw"===e?te.deflate_init_raw(this.gt,c):te.deflate_init(this.gt,c)):"deflate64-raw"===e?(this.ut=te.inflate9_process,this.ht=te.inflate9_last_consumed,this.yt=te.inflate9_end,this.gt=te.inflate9_new(),n=te.inflate9_init_raw(this.gt)):(this.ut=te.inflate_process,this.ht=te.inflate_last_consumed,this.yt=te.inflate_end,this.gt=te.inflate_new(),n="deflate-raw"===e?te.inflate_init_raw(this.gt):"gzip"===e?te.inflate_init_gzip(this.gt):te.inflate_init(this.gt)),0!==n)throw new r("init failed:"+n)}catch(t){throw f(this),t}},transform(e,n){try{const c=e,a=new o(se.buffer),f=this.ut,l=this.ht,w=this.lt,u=this.wt;let h=0;for(;h<c.length;){const e=s.min(c.length-h,32768);if((!this.in||this.inBufferSize<e)&&(this.in&&ne&&(ne(this.in),this.in=0),this.in=ee(e),this.inBufferSize=e,!this.in))throw new r("allocation failed");a.set(c.subarray(h,h+e),this.in);const o=f(this.gt,this.in,e,w,i,0),p=16777215&o;if(p&&(u.set(a.subarray(w,w+p),0),n.enqueue(u.slice(0,p))),!t){const t=o>>24&255,e=128&t?t-256:t;if(0>e)throw new r("process error:"+e)}const d=l(this.gt);if(0===d)break;h+=d}}catch(t){f(this),n.error(t)}},flush(e){try{const n=new o(se.buffer),s=this.ut,c=this.lt,a=this.wt;for(;;){const o=s(this.gt,0,0,c,i,4),f=16777215&o,l=o>>24&255;if(!t){const t=128&l?l-256:l;if(0>t)throw new r("process error:"+t)}if(f&&(a.set(n.subarray(c,c+f),0),e.enqueue(a.slice(0,f))),1===l||0===f)break}}catch(t){e.error(t)}finally{const t=f(this);0!==t&&e.error(new r("end error:"+t))}},cancel(){f(this)}});function f(t){let e=0;return t.gt&&t.yt&&(e=t.yt(t.gt)),t.gt=0,t.in&&ne&&ne(t.in),t.in=0,t.lt&&ne&&ne(t.lt),t.lt=0,e}}addEventListener("message",({data:t})=>{const{type:e,messageId:n,value:s,done:r}=t;try{if("start"==e&&ce(t),e==Zt){const t=Xt.get(n);Xt.delete(n),t({value:s||new o,done:r})}if("ack"==e){const t=Yt.get(n);Yt.delete(n),t()}e==Nt&&$t.abort()}catch(t){ae(t)}}),p({type:"ready"});class le{constructor(t="deflate",e){return fe(!0,t,e)}}class we{constructor(t="deflate",e){return fe(!1,t,e)}}le.St=!0,we.St=!0;let ue=!1;self.initModule=async t=>{const e=await(async(t,{baseURI:e})=>{if(!ue)try{await(async(t,e)=>{let n,s;try{try{s=new URL(t,e)}catch{}const r=await fetch(s);n=await r.arrayBuffer()}catch(e){if(!t.startsWith("data:application/wasm;base64,"))throw e;n=(t=>{const e=t.split(",")[1],n=atob(e),s=n.length,r=new o(s);for(let t=0;s>t;++t)r[t]=n.charCodeAt(t);return r.buffer})(t)}(t=>{if(te=t,({malloc:ee,free:ne,memory:se}=te),"function"!=typeof ee||"function"!=typeof ne||!se)throw te=ee=ne=se=null,new r("Invalid WASM module")})((await WebAssembly.instantiate(n)).instance.exports)})(t,e),ue=!0}catch(t){throw(t=>{re=t})(t),t}})(t.wasmURI,t);return t.CompressionStreamZlib=le,t.DecompressionStreamZlib=we,e}});\n';t({workerURI:t=>{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return "data:"+n+","+encodeURIComponent(e)}});}
228
230
 
229
231
  /*
230
232
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -1371,6 +1373,7 @@
1371
1373
 
1372
1374
  const ERR_INVALID_PASSWORD = "Invalid password";
1373
1375
  const ERR_INVALID_SIGNATURE = "Invalid signature";
1376
+ const ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_SIGNATURE;
1374
1377
  const ERR_ABORT_CHECK_PASSWORD = "zipjs-abort-check-password";
1375
1378
  const ERR_UNSUPPORTED_CRYPTO_API = "Crypto API not supported";
1376
1379
 
@@ -1421,7 +1424,7 @@
1421
1424
  const DERIVED_BITS_USAGE = ["deriveBits"];
1422
1425
  const SALT_LENGTH = [8, 12, 16];
1423
1426
  const KEY_LENGTH = [16, 24, 32];
1424
- const SIGNATURE_LENGTH = 10;
1427
+ const AUTHENTICATION_CODE_LENGTH = 10;
1425
1428
  const COUNTER_DEFAULT_VALUE = [0, 0, 0, 0];
1426
1429
  // deno-lint-ignore valid-typeof
1427
1430
  const CRYPTO_API_SUPPORTED = typeof crypto != UNDEFINED_TYPE;
@@ -1437,7 +1440,7 @@
1437
1440
 
1438
1441
  class AESDecryptionStream extends TransformStream {
1439
1442
 
1440
- constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly }) {
1443
+ constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly, checkAuthenticationCode = true }) {
1441
1444
  super({
1442
1445
  start() {
1443
1446
  initAesCrypto(this, password, rawPassword, encryptionStrength);
@@ -1461,8 +1464,8 @@
1461
1464
  } else {
1462
1465
  await ready;
1463
1466
  }
1464
- const output = new Uint8Array(chunk.length - SIGNATURE_LENGTH - ((chunk.length - SIGNATURE_LENGTH) % BLOCK_LENGTH));
1465
- controller.enqueue(append(aesCrypto, chunk, output, 0, SIGNATURE_LENGTH, true));
1467
+ const output = new Uint8Array(chunk.length - AUTHENTICATION_CODE_LENGTH - ((chunk.length - AUTHENTICATION_CODE_LENGTH) % BLOCK_LENGTH));
1468
+ controller.enqueue(append(aesCrypto, chunk, output, 0, AUTHENTICATION_CODE_LENGTH, true));
1466
1469
  },
1467
1470
  async flush(controller) {
1468
1471
  const {
@@ -1473,8 +1476,8 @@
1473
1476
  } = this;
1474
1477
  if (hmac && ctr) {
1475
1478
  await ready;
1476
- const chunkToDecrypt = subarray(pending, 0, pending.length - SIGNATURE_LENGTH);
1477
- const originalSignature = subarray(pending, pending.length - SIGNATURE_LENGTH);
1479
+ const chunkToDecrypt = subarray(pending, 0, pending.length - AUTHENTICATION_CODE_LENGTH);
1480
+ const originalAuthenticationCode = subarray(pending, pending.length - AUTHENTICATION_CODE_LENGTH);
1478
1481
  let decryptedChunkArray = EMPTY_UINT8_ARRAY;
1479
1482
  if (chunkToDecrypt.length) {
1480
1483
  const encryptedChunk = toBits(codecBytes, chunkToDecrypt);
@@ -1482,13 +1485,13 @@
1482
1485
  const decryptedChunk = ctr.update(encryptedChunk);
1483
1486
  decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
1484
1487
  }
1485
- const signature = subarray(fromBits(codecBytes, hmac.digest()), 0, SIGNATURE_LENGTH);
1486
- let invalidSignature = pending.length < SIGNATURE_LENGTH ? 1 : 0;
1487
- for (let indexSignature = 0; indexSignature < SIGNATURE_LENGTH; indexSignature++) {
1488
- invalidSignature |= signature[indexSignature] ^ originalSignature[indexSignature];
1488
+ const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
1489
+ let invalidAuthenticationCode = pending.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
1490
+ for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
1491
+ invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
1489
1492
  }
1490
- if (invalidSignature) {
1491
- throw new Error(ERR_INVALID_SIGNATURE);
1493
+ if (invalidAuthenticationCode && checkAuthenticationCode) {
1494
+ throw new Error(ERR_INVALID_AUTHENTICATION_CODE);
1492
1495
  }
1493
1496
  controller.enqueue(decryptedChunkArray);
1494
1497
  }
@@ -1500,8 +1503,6 @@
1500
1503
  class AESEncryptionStream extends TransformStream {
1501
1504
 
1502
1505
  constructor({ password, rawPassword, encryptionStrength }) {
1503
- // deno-lint-ignore prefer-const
1504
- let stream;
1505
1506
  super({
1506
1507
  start() {
1507
1508
  initAesCrypto(this, password, rawPassword, encryptionStrength);
@@ -1540,12 +1541,11 @@
1540
1541
  hmac.update(encryptedChunk);
1541
1542
  encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
1542
1543
  }
1543
- stream.signature = fromBits(codecBytes, hmac.digest()).slice(0, SIGNATURE_LENGTH);
1544
- controller.enqueue(concat(encryptedChunkArray, stream.signature));
1544
+ const authenticationCode = fromBits(codecBytes, hmac.digest()).slice(0, AUTHENTICATION_CODE_LENGTH);
1545
+ controller.enqueue(concat(encryptedChunkArray, authenticationCode));
1545
1546
  }
1546
1547
  }
1547
1548
  });
1548
- stream = this;
1549
1549
  }
1550
1550
  }
1551
1551
 
@@ -1558,7 +1558,7 @@
1558
1558
  });
1559
1559
  }
1560
1560
 
1561
- function append(aesCrypto, input, output, paddingStart, paddingEnd, verifySignature) {
1561
+ function append(aesCrypto, input, output, paddingStart, paddingEnd, verifyAuthenticationCode) {
1562
1562
  const {
1563
1563
  ctr,
1564
1564
  hmac,
@@ -1572,11 +1572,11 @@
1572
1572
  let offset;
1573
1573
  for (offset = 0; offset <= inputLength - BLOCK_LENGTH; offset += BLOCK_LENGTH) {
1574
1574
  const inputChunk = toBits(codecBytes, subarray(input, offset, offset + BLOCK_LENGTH));
1575
- if (verifySignature) {
1575
+ if (verifyAuthenticationCode) {
1576
1576
  hmac.update(inputChunk);
1577
1577
  }
1578
1578
  const outputChunk = ctr.update(inputChunk);
1579
- if (!verifySignature) {
1579
+ if (!verifyAuthenticationCode) {
1580
1580
  hmac.update(outputChunk);
1581
1581
  }
1582
1582
  output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
@@ -1926,6 +1926,7 @@
1926
1926
 
1927
1927
  const ERR_INVALID_UNCOMPRESSED_SIZE = "Invalid uncompressed size";
1928
1928
  const ERR_INVALID_COMPRESSED_DATA = "Invalid compressed data";
1929
+ const ERR_INVALID_CRC32 = ERR_INVALID_SIGNATURE;
1929
1930
  const ERR_UNSUPPORTED_COMPRESSION$2 = "Compression method not supported";
1930
1931
  const FORMAT_DEFLATE_RAW = "deflate-raw";
1931
1932
  const FORMAT_DEFLATE64_RAW = "deflate64-raw";
@@ -1939,14 +1940,14 @@
1939
1940
 
1940
1941
  constructor(options, { chunkSize, CompressionStreamZlib, CompressionStream }) {
1941
1942
  super({});
1942
- const { compressed, encrypted, useCompressionStream, zipCrypto, signed, level, deflate64, format, compressionMethod } = options;
1943
+ const { compressed, encrypted, useCompressionStream, zipCrypto, computeCrc32, level, deflate64, format, compressionMethod } = options;
1943
1944
  const stream = this;
1944
1945
  let crc32Stream, encryptionStream, gzipCrc32Stream;
1945
1946
  let readable = super.readable;
1946
1947
  const codecStreams = format && getCodecStreams(format);
1947
- const useGzipCrc32 = signed && compressed && !deflate64 && !codecStreams && (!encrypted || zipCrypto) &&
1948
+ const useGzipCrc32 = computeCrc32 && compressed && !deflate64 && !codecStreams && (!encrypted || zipCrypto) &&
1948
1949
  Boolean(useCompressionStream && CompressionStream);
1949
- if ((!encrypted || zipCrypto) && signed && !useGzipCrc32) {
1950
+ if ((!encrypted || zipCrypto) && computeCrc32 && !useGzipCrc32) {
1950
1951
  crc32Stream = new Crc32Stream();
1951
1952
  readable = pipeThrough(readable, crc32Stream);
1952
1953
  }
@@ -1981,14 +1982,9 @@
1981
1982
  }
1982
1983
  }
1983
1984
  setReadable(stream, readable, () => {
1984
- let signature;
1985
- if (encrypted && !zipCrypto) {
1986
- signature = encryptionStream.signature;
1985
+ if ((!encrypted || zipCrypto) && computeCrc32) {
1986
+ stream.crc32 = useGzipCrc32 ? gzipCrc32Stream.crc32 : new DataView(crc32Stream.value.buffer).getUint32(0);
1987
1987
  }
1988
- if ((!encrypted || zipCrypto) && signed) {
1989
- signature = useGzipCrc32 ? gzipCrc32Stream.signature : new DataView(crc32Stream.value.buffer).getUint32(0);
1990
- }
1991
- stream.signature = signature;
1992
1988
  });
1993
1989
  }
1994
1990
  }
@@ -2026,7 +2022,7 @@
2026
2022
  },
2027
2023
  flush() {
2028
2024
  const dataView = getDataView(trailerCandidate);
2029
- stream.signature = dataView.getUint32(0, true);
2025
+ stream.crc32 = dataView.getUint32(0, true);
2030
2026
  stream.uncompressedSize = dataView.getUint32(4, true);
2031
2027
  }
2032
2028
  });
@@ -2108,7 +2104,7 @@
2108
2104
 
2109
2105
  constructor(options, { chunkSize, DecompressionStreamZlib, DecompressionStream }) {
2110
2106
  super({});
2111
- const { zipCrypto, encrypted, signed, signature, compressed, useCompressionStream, deflate64, format, compressionMethod, rawBitFlag, outputSize } = options;
2107
+ const { zipCrypto, encrypted, checkCrc32, crc32, compressed, useCompressionStream, deflate64, format, compressionMethod, rawBitFlag, outputSize } = options;
2112
2108
  let crc32Stream, decryptionStream;
2113
2109
  let readable = super.readable;
2114
2110
  if (encrypted) {
@@ -2141,15 +2137,15 @@
2141
2137
  }
2142
2138
  readable = mapInflateStreamError(readable);
2143
2139
  }
2144
- if ((!encrypted || zipCrypto) && signed) {
2140
+ if (checkCrc32) {
2145
2141
  crc32Stream = new Crc32Stream();
2146
2142
  readable = pipeThrough(readable, crc32Stream);
2147
2143
  }
2148
2144
  setReadable(this, readable, () => {
2149
- if ((!encrypted || zipCrypto) && signed) {
2150
- const dataViewSignature = new DataView(crc32Stream.value.buffer);
2151
- if (signature != dataViewSignature.getUint32(0, false)) {
2152
- throw new Error(ERR_INVALID_SIGNATURE);
2145
+ if (checkCrc32) {
2146
+ const computedCrc32View = new DataView(crc32Stream.value.buffer);
2147
+ if (crc32 != computedCrc32View.getUint32(0, false)) {
2148
+ throw new Error(ERR_INVALID_CRC32);
2153
2149
  }
2154
2150
  }
2155
2151
  });
@@ -2373,9 +2369,9 @@
2373
2369
  }
2374
2370
  },
2375
2371
  flush() {
2376
- const { signature } = stream;
2372
+ const { crc32 } = stream;
2377
2373
  Object.assign(codec, {
2378
- signature,
2374
+ crc32,
2379
2375
  inputSize
2380
2376
  });
2381
2377
  }
@@ -2678,12 +2674,12 @@
2678
2674
  .pipeThrough(new ChunkStream(getChunkSize(config)))
2679
2675
  .pipeTo(writable, { preventClose: true, preventAbort: true });
2680
2676
  const {
2681
- signature,
2677
+ crc32,
2682
2678
  inputSize,
2683
2679
  outputSize
2684
2680
  } = codecStream;
2685
2681
  return {
2686
- signature,
2682
+ crc32,
2687
2683
  inputSize,
2688
2684
  outputSize
2689
2685
  };
@@ -3044,7 +3040,7 @@
3044
3040
 
3045
3041
  async function runWorker(stream, workerOptions) {
3046
3042
  const { options, config } = workerOptions;
3047
- const { transferStreams, useWebWorkers, useCompressionStream, compressed, signed, encrypted, format, codecURI } = options;
3043
+ const { transferStreams, useWebWorkers, useCompressionStream, compressed, checkCrc32, computeCrc32, encrypted, format, codecURI } = options;
3048
3044
  const { workerURI, maxWorkers } = config;
3049
3045
  if (format) {
3050
3046
  if (codecURI) {
@@ -3053,7 +3049,7 @@
3053
3049
  await ensureCodecStreams(format, options.codecURI);
3054
3050
  }
3055
3051
  workerOptions.transferStreams = transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams);
3056
- const streamCopy = !compressed && !signed && !encrypted;
3052
+ const streamCopy = !compressed && !checkCrc32 && !computeCrc32 && !encrypted;
3057
3053
  const workerSupported = format === UNDEFINED_VALUE || Boolean(options.codecURI);
3058
3054
  workerOptions.useWebWorkers = !streamCopy && workerSupported && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
3059
3055
  workerOptions.workerURI = workerOptions.useWebWorkers && workerURI ? workerURI : UNDEFINED_VALUE;
@@ -4277,9 +4273,12 @@
4277
4273
  const PROPERTY_NAME_EXECUTABLE = "executable";
4278
4274
  const PROPERTY_NAME_COMPRESSION_METHOD = "compressionMethod";
4279
4275
  const PROPERTY_NAME_SIGNATURE = "signature";
4276
+ const PROPERTY_NAME_CRC32 = "crc32";
4280
4277
  const PROPERTY_NAME_EXTRA_FIELD = "extraField";
4281
4278
  const PROPERTY_NAME_EXTRA_FIELD_INFOZIP = "extraFieldInfoZip";
4282
4279
  const PROPERTY_NAME_EXTRA_FIELD_UNIX = "extraFieldUnix";
4280
+ const PROPERTY_NAME_EXTRA_FIELD_UNIX_TYPE1 = "extraFieldUnixType1";
4281
+ const PROPERTY_NAME_EXTRA_FIELD_PKWARE_UNIX = "extraFieldPkwareUnix";
4283
4282
  const PROPERTY_NAME_UID = "uid";
4284
4283
  const PROPERTY_NAME_GID = "gid";
4285
4284
  const PROPERTY_NAME_UNIX_MODE = "unixMode";
@@ -4296,6 +4295,7 @@
4296
4295
  const PROPERTY_NAME_EXTRA_FIELD_AES = "extraFieldAES";
4297
4296
  const PROPERTY_NAME_EXTRA_FIELD_NTFS = "extraFieldNTFS";
4298
4297
  const PROPERTY_NAME_EXTRA_FIELD_EXTENDED_TIMESTAMP = "extraFieldExtendedTimestamp";
4298
+ const PROPERTY_NAME_EXTRA_FIELD_USDZ = "extraFieldUSDZ";
4299
4299
 
4300
4300
  const PROPERTY_NAMES = [
4301
4301
  PROPERTY_NAME_FILENAME,
@@ -4307,6 +4307,7 @@
4307
4307
  PROPERTY_NAME_COMMENT,
4308
4308
  PROPERTY_NAME_RAW_COMMENT,
4309
4309
  PROPERTY_NAME_LAST_ACCESS_DATE,
4310
+ PROPERTY_NAME_RAW_LAST_ACCESS_DATE,
4310
4311
  PROPERTY_NAME_CREATION_DATE,
4311
4312
  PROPERTY_NAME_RAW_CREATION_DATE,
4312
4313
  PROPERTY_NAME_OFFSET,
@@ -4325,9 +4326,12 @@
4325
4326
  PROPERTY_NAME_EXECUTABLE,
4326
4327
  PROPERTY_NAME_COMPRESSION_METHOD,
4327
4328
  PROPERTY_NAME_SIGNATURE,
4329
+ PROPERTY_NAME_CRC32,
4328
4330
  PROPERTY_NAME_EXTRA_FIELD,
4329
4331
  PROPERTY_NAME_EXTRA_FIELD_UNIX,
4330
4332
  PROPERTY_NAME_EXTRA_FIELD_INFOZIP,
4333
+ PROPERTY_NAME_EXTRA_FIELD_UNIX_TYPE1,
4334
+ PROPERTY_NAME_EXTRA_FIELD_PKWARE_UNIX,
4331
4335
  PROPERTY_NAME_UID,
4332
4336
  PROPERTY_NAME_GID,
4333
4337
  PROPERTY_NAME_UNIX_MODE,
@@ -4343,7 +4347,8 @@
4343
4347
  PROPERTY_NAME_EXTRA_FIELD_UNICODE_COMMENT,
4344
4348
  PROPERTY_NAME_EXTRA_FIELD_AES,
4345
4349
  PROPERTY_NAME_EXTRA_FIELD_NTFS,
4346
- PROPERTY_NAME_EXTRA_FIELD_EXTENDED_TIMESTAMP
4350
+ PROPERTY_NAME_EXTRA_FIELD_EXTENDED_TIMESTAMP,
4351
+ PROPERTY_NAME_EXTRA_FIELD_USDZ
4347
4352
  ];
4348
4353
 
4349
4354
  class Entry {
@@ -4396,6 +4401,8 @@
4396
4401
  const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
4397
4402
  const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
4398
4403
  const OPTION_CHECK_SIGNATURE = "checkSignature";
4404
+ const OPTION_CHECK_CRC32 = "checkCrc32";
4405
+ const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
4399
4406
  const OPTION_USE_WEB_WORKERS = "useWebWorkers";
4400
4407
  const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
4401
4408
  const OPTION_TRANSFER_STREAMS = "transferStreams";
@@ -4415,6 +4422,7 @@
4415
4422
  const OPTION_OFFSET = "offset";
4416
4423
  const OPTION_USDZ = "usdz";
4417
4424
  const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
4425
+ const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
4418
4426
  const OPTION_STRICTNESS = "strictness";
4419
4427
  const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
4420
4428
  const STRICTNESS_STRICT = "strict";
@@ -4467,6 +4475,7 @@
4467
4475
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
4468
4476
  const CHARSET_CP437 = "cp437";
4469
4477
  const BITFLAG_AMBIGUITY_MASK = BITFLAG_ENCRYPTED | BITFLAG_DATA_DESCRIPTOR | BITFLAG_LANG_ENCODING_FLAG;
4478
+ const VENDOR_VERSION_AE_1$1 = 1;
4470
4479
  const ZIP64_PROPERTIES = [
4471
4480
  [PROPERTY_NAME_UNCOMPRESSED_SIZE, MAX_32_BITS],
4472
4481
  [PROPERTY_NAME_COMPRESSED_SIZE, MAX_32_BITS],
@@ -4859,7 +4868,7 @@
4859
4868
  config,
4860
4869
  bitFlag,
4861
4870
  rawBitFlag,
4862
- signature,
4871
+ crc32,
4863
4872
  rawLastModDate,
4864
4873
  uncompressedSize,
4865
4874
  compressedSize
@@ -4946,6 +4955,11 @@
4946
4955
  if (deflate64) {
4947
4956
  useCompressionStream = false;
4948
4957
  }
4958
+ const checkCrc32Option = getOptionValue$1(zipEntry, options, OPTION_CHECK_CRC32);
4959
+ const checkCrc32 = (checkCrc32Option === UNDEFINED_VALUE ?
4960
+ getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) :
4961
+ checkCrc32Option) && !passThrough &&
4962
+ (!encrypted || zipCrypto || (extraFieldAES && extraFieldAES.vendorVersion == VENDOR_VERSION_AE_1$1));
4949
4963
  const workerOptions = {
4950
4964
  options: {
4951
4965
  codecType: CODEC_INFLATE,
@@ -4953,10 +4967,11 @@
4953
4967
  rawPassword,
4954
4968
  zipCrypto,
4955
4969
  encryptionStrength: extraFieldAES && extraFieldAES.strength,
4956
- signed: getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) && !passThrough,
4957
- passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & MAX_8_BITS) : ((signature >>> 24) & MAX_8_BITS)),
4970
+ checkCrc32,
4971
+ checkAuthenticationCode: getOptionValue$1(zipEntry, options, OPTION_CHECK_AUTHENTICATION_CODE),
4972
+ passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & MAX_8_BITS) : ((crc32 >>> 24) & MAX_8_BITS)),
4958
4973
  outputSize: passThrough ? compressedSize : uncompressedSize,
4959
- signature,
4974
+ crc32,
4960
4975
  compressed: compressionMethod != 0 && !passThrough,
4961
4976
  encrypted,
4962
4977
  useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
@@ -4978,7 +4993,7 @@
4978
4993
  fileEntry,
4979
4994
  index,
4980
4995
  offset: localHeaderOffset,
4981
- signature,
4996
+ crc32,
4982
4997
  compressedSize,
4983
4998
  uncompressedSize,
4984
4999
  dataOffset,
@@ -5069,6 +5084,7 @@
5069
5084
  const compressionMethod = getUint16(dataView, offset + 4);
5070
5085
  Object.assign(directory, {
5071
5086
  signature: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
5087
+ crc32: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
5072
5088
  compressedSize: getUint32(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
5073
5089
  uncompressedSize: getUint32(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
5074
5090
  });
@@ -5094,6 +5110,16 @@
5094
5110
  } else {
5095
5111
  directory.compressionMethod = compressionMethod;
5096
5112
  }
5113
+ const extraFieldPkwareUnix = extraField.get(EXTRAFIELD_TYPE_PKWARE_UNIX);
5114
+ if (extraFieldPkwareUnix) {
5115
+ readExtraFieldUnixDates(extraFieldPkwareUnix, directory);
5116
+ directory.extraFieldPkwareUnix = extraFieldPkwareUnix;
5117
+ }
5118
+ const extraFieldUnixType1 = extraField.get(EXTRAFIELD_TYPE_UNIX_TYPE1);
5119
+ if (extraFieldUnixType1) {
5120
+ readExtraFieldUnixDates(extraFieldUnixType1, directory);
5121
+ directory.extraFieldUnixType1 = extraFieldUnixType1;
5122
+ }
5097
5123
  const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
5098
5124
  if (extraFieldNTFS) {
5099
5125
  readExtraFieldNTFS(extraFieldNTFS, directory);
@@ -5143,15 +5169,15 @@
5143
5169
  return;
5144
5170
  }
5145
5171
  const extraFieldView = getDataView(extraFieldUnicode.data);
5146
- const crc32 = new Crc32();
5147
- crc32.append(fileEntry[rawPropertyName]);
5148
- const dataViewSignature = getDataView(new Uint8Array(4));
5149
- dataViewSignature.setUint32(0, crc32.get(), true);
5150
- const signature = getUint32(extraFieldView, 1);
5172
+ const computedCrc32 = new Crc32();
5173
+ computedCrc32.append(fileEntry[rawPropertyName]);
5174
+ const computedCrc32View = getDataView(new Uint8Array(4));
5175
+ computedCrc32View.setUint32(0, computedCrc32.get(), true);
5176
+ const nameCrc32 = getUint32(extraFieldView, 1);
5151
5177
  Object.assign(extraFieldUnicode, {
5152
5178
  version: getUint8(extraFieldView, 0),
5153
5179
  [propertyName]: decodeText(extraFieldUnicode.data.subarray(5)),
5154
- valid: !fileEntry.bitFlag.languageEncodingFlag && signature == getUint32(dataViewSignature, 0)
5180
+ valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32(computedCrc32View, 0)
5155
5181
  });
5156
5182
  if (extraFieldUnicode.valid) {
5157
5183
  directory[propertyName] = extraFieldUnicode[propertyName];
@@ -5170,6 +5196,9 @@
5170
5196
  compressionMethod: getUint16(extraFieldView, 5)
5171
5197
  });
5172
5198
  directory.compressionMethod = extraFieldAES.compressionMethod;
5199
+ if (extraFieldAES.vendorVersion != VENDOR_VERSION_AE_1$1) {
5200
+ directory.crc32 = UNDEFINED_VALUE;
5201
+ }
5173
5202
  }
5174
5203
 
5175
5204
  function readExtraFieldNTFS(extraFieldNTFS, directory) {
@@ -5188,29 +5217,41 @@
5188
5217
  } catch {
5189
5218
  // ignored
5190
5219
  }
5191
- try {
5192
- if (tag1Data && tag1Data.length == 24) {
5193
- const tag1View = getDataView(tag1Data);
5194
- const rawLastModDate = tag1View.getBigUint64(0, true);
5195
- const rawLastAccessDate = tag1View.getBigUint64(8, true);
5196
- const rawCreationDate = tag1View.getBigUint64(16, true);
5197
- Object.assign(extraFieldNTFS, {
5198
- rawLastModDate,
5199
- rawLastAccessDate,
5200
- rawCreationDate
5201
- });
5202
- const lastModDate = getDateNTFS(rawLastModDate);
5203
- const lastAccessDate = getDateNTFS(rawLastAccessDate);
5204
- const creationDate = getDateNTFS(rawCreationDate);
5205
- const extraFieldData = { lastModDate, lastAccessDate, creationDate };
5206
- Object.assign(extraFieldNTFS, extraFieldData);
5207
- Object.assign(directory, extraFieldData);
5208
- }
5209
- } catch {
5210
- // ignored
5220
+ if (tag1Data && tag1Data.length == 24) {
5221
+ const tag1View = getDataView(tag1Data);
5222
+ const rawLastModDate = tag1View.getBigUint64(0, true);
5223
+ const rawLastAccessDate = tag1View.getBigUint64(8, true);
5224
+ const rawCreationDate = tag1View.getBigUint64(16, true);
5225
+ Object.assign(extraFieldNTFS, {
5226
+ rawLastModDate,
5227
+ rawLastAccessDate,
5228
+ rawCreationDate
5229
+ });
5230
+ const lastModDate = getDateNTFS(rawLastModDate);
5231
+ const lastAccessDate = getDateNTFS(rawLastAccessDate);
5232
+ const creationDate = getDateNTFS(rawCreationDate);
5233
+ const extraFieldData = { lastModDate, lastAccessDate, creationDate };
5234
+ Object.assign(extraFieldNTFS, extraFieldData);
5235
+ Object.assign(directory, extraFieldData);
5211
5236
  }
5212
5237
  }
5213
5238
 
5239
+ function readExtraFieldUnixDates(extraField, directory) {
5240
+ if (extraField.data.length < 8) {
5241
+ return;
5242
+ }
5243
+ const extraFieldView = getDataView(extraField.data);
5244
+ const lastAccessDate = new Date(getUint32(extraFieldView, 0) * 1000);
5245
+ const lastModDate = new Date(getUint32(extraFieldView, 4) * 1000);
5246
+ const extraFieldData = { lastAccessDate, lastModDate };
5247
+ if (extraField.data.length >= 12) {
5248
+ extraFieldData.uid = getUint16(extraFieldView, 8);
5249
+ extraFieldData.gid = getUint16(extraFieldView, 10);
5250
+ }
5251
+ Object.assign(extraField, extraFieldData);
5252
+ Object.assign(directory, extraFieldData);
5253
+ }
5254
+
5214
5255
  function readExtraFieldUnix(extraField, directory, isInfoZip) {
5215
5256
  try {
5216
5257
  const view = getDataView(extraField.data);
@@ -5289,7 +5330,7 @@
5289
5330
  fileEntry,
5290
5331
  index,
5291
5332
  offset,
5292
- signature,
5333
+ crc32,
5293
5334
  compressedSize,
5294
5335
  uncompressedSize,
5295
5336
  dataOffset,
@@ -5310,7 +5351,7 @@
5310
5351
  const dataDescriptorSignature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
5311
5352
  getUint32(getDataView(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
5312
5353
  if (dataDescriptorSignature) {
5313
- const readSignature = getUint32(getDataView(dataDescriptorArray), 4);
5354
+ const readCrc32 = getUint32(getDataView(dataDescriptorArray), 4);
5314
5355
  let readCompressedSize;
5315
5356
  let readUncompressedSize;
5316
5357
  if (extraFieldZip64) {
@@ -5320,8 +5361,8 @@
5320
5361
  readCompressedSize = getUint32(getDataView(dataDescriptorArray), 8);
5321
5362
  readUncompressedSize = getUint32(getDataView(dataDescriptorArray), 12);
5322
5363
  }
5323
- const matchSignature = (fileEntry.encrypted && !fileEntry.zipCrypto) || readSignature == signature;
5324
- if (matchSignature &&
5364
+ const matchCrc32 = (fileEntry.encrypted && !fileEntry.zipCrypto) || readCrc32 == crc32;
5365
+ if (matchCrc32 &&
5325
5366
  readCompressedSize == compressedSize &&
5326
5367
  readUncompressedSize == uncompressedSize) {
5327
5368
  dataDescriptorLength += DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH;
@@ -5490,11 +5531,11 @@
5490
5531
  throwAmbiguousArchive("mismatched local file header (compression method)");
5491
5532
  }
5492
5533
  if (!localDirectory.bitFlag.dataDescriptor &&
5493
- (localDirectory.signature || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
5494
- (localDirectory.signature != zipEntry.signature ||
5534
+ (localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
5535
+ (localDirectory.crc32 != zipEntry.crc32 ||
5495
5536
  localDirectory.compressedSize != zipEntry.compressedSize ||
5496
5537
  localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
5497
- throwAmbiguousArchive("mismatched local file header (signature or sizes)");
5538
+ throwAmbiguousArchive("mismatched local file header (crc32 or sizes)");
5498
5539
  }
5499
5540
  }
5500
5541
 
@@ -5510,11 +5551,7 @@
5510
5551
 
5511
5552
  function getDate(timeRaw) {
5512
5553
  const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
5513
- try {
5514
- return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
5515
- } catch {
5516
- // ignored
5517
- }
5554
+ return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
5518
5555
  }
5519
5556
 
5520
5557
  function getDateNTFS(timeRaw) {
@@ -5547,7 +5584,9 @@
5547
5584
  ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
5548
5585
  ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
5549
5586
  ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
5587
+ ERR_INVALID_AUTHENTICATION_CODE: ERR_INVALID_AUTHENTICATION_CODE,
5550
5588
  ERR_INVALID_COMPRESSED_DATA: ERR_INVALID_COMPRESSED_DATA,
5589
+ ERR_INVALID_CRC32: ERR_INVALID_CRC32,
5551
5590
  ERR_INVALID_PASSWORD: ERR_INVALID_PASSWORD,
5552
5591
  ERR_INVALID_SIGNATURE: ERR_INVALID_SIGNATURE,
5553
5592
  ERR_INVALID_UNCOMPRESSED_SIZE: ERR_INVALID_UNCOMPRESSED_SIZE,
@@ -5601,6 +5640,8 @@
5601
5640
  const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
5602
5641
  const MIN_UNIX_TIME = -2147483648;
5603
5642
  const MAX_UNIX_TIME = 2147483647;
5643
+ const MIN_NTFS_TIME = BigInt(0);
5644
+ const MAX_NTFS_TIME = BigInt("0x7fffffffffffffff");
5604
5645
  const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
5605
5646
  const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
5606
5647
  const ERR_UNDEFINED_READER = "Undefined reader";
@@ -5614,6 +5655,8 @@
5614
5655
  const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
5615
5656
 
5616
5657
  const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
5658
+ const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
5659
+ const VENDOR_VERSION_AE_1 = 1;
5617
5660
  const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
5618
5661
  const UNIX_EXTRA_FIELD_TYPE = "unix";
5619
5662
 
@@ -5708,9 +5751,9 @@
5708
5751
  zip64UncompressedSize,
5709
5752
  extraFieldLength
5710
5753
  });
5711
- const { signature } = entry;
5712
- if (signature !== UNDEFINED_VALUE) {
5713
- setUint32(headerView, HEADER_OFFSET_SIGNATURE, signature);
5754
+ const { crc32 } = entry;
5755
+ if (crc32 !== UNDEFINED_VALUE) {
5756
+ setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
5714
5757
  }
5715
5758
  Object.assign(entry, {
5716
5759
  zip64UncompressedSize,
@@ -5895,6 +5938,7 @@
5895
5938
  internalFileAttribute: metadataInfo.resolvedOptions.internalFileAttributes,
5896
5939
  externalFileAttribute: attributesInfo.resolvedOptions.externalFileAttributes,
5897
5940
  signature: options[PROPERTY_NAME_SIGNATURE],
5941
+ crc32: options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32,
5898
5942
  offset: zipWriter.offset - diskOffset,
5899
5943
  diskNumberStart: diskNumber
5900
5944
  });
@@ -6111,27 +6155,8 @@
6111
6155
  if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(encryptionStrength >= 1 && encryptionStrength <= 3)) {
6112
6156
  throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH);
6113
6157
  }
6114
- let rawExtraField = EMPTY_UINT8_ARRAY;
6115
- const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
6116
- if (extraField) {
6117
- let extraFieldSize = 0;
6118
- let offset = 0;
6119
- extraField.forEach(data => extraFieldSize += 4 + getLength(data));
6120
- rawExtraField = new Uint8Array(extraFieldSize);
6121
- const rawExtraFieldView = getDataView(rawExtraField);
6122
- extraField.forEach((data, type) => {
6123
- if (type > MAX_16_BITS) {
6124
- throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
6125
- }
6126
- if (getLength(data) > MAX_16_BITS) {
6127
- throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
6128
- }
6129
- setUint16(rawExtraFieldView, offset, type);
6130
- setUint16(rawExtraFieldView, offset + 2, getLength(data));
6131
- arraySet(rawExtraField, data, offset + 4);
6132
- offset += 4 + getLength(data);
6133
- });
6134
- }
6158
+ const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
6159
+ const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
6135
6160
  return {
6136
6161
  comment,
6137
6162
  resolvedOptions: {
@@ -6165,11 +6190,36 @@
6165
6190
  useCompressionStream,
6166
6191
  dataDescriptor,
6167
6192
  zip64,
6168
- rawExtraField
6193
+ rawExtraField,
6194
+ rawLocalExtraField
6169
6195
  }
6170
6196
  };
6171
6197
  }
6172
6198
 
6199
+ function serializeExtraField(extraField) {
6200
+ if (!extraField) {
6201
+ return EMPTY_UINT8_ARRAY;
6202
+ }
6203
+ let extraFieldSize = 0;
6204
+ let offset = 0;
6205
+ extraField.forEach(data => extraFieldSize += 4 + getLength(data));
6206
+ const rawExtraField = new Uint8Array(extraFieldSize);
6207
+ const rawExtraFieldView = getDataView(rawExtraField);
6208
+ extraField.forEach((data, type) => {
6209
+ if (type > MAX_16_BITS) {
6210
+ throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
6211
+ }
6212
+ if (getLength(data) > MAX_16_BITS) {
6213
+ throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
6214
+ }
6215
+ setUint16(rawExtraFieldView, offset, type);
6216
+ setUint16(rawExtraFieldView, offset + 2, getLength(data));
6217
+ arraySet(rawExtraField, data, offset + 4);
6218
+ offset += 4 + getLength(data);
6219
+ });
6220
+ return rawExtraField;
6221
+ }
6222
+
6173
6223
  async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
6174
6224
  const { passThrough, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
6175
6225
  let { dataDescriptor, zip64, level, compressionMethod } = metadata;
@@ -6494,7 +6544,7 @@
6494
6544
  msdosAttributes
6495
6545
  };
6496
6546
  let {
6497
- signature,
6547
+ crc32,
6498
6548
  uncompressedSize
6499
6549
  } = options;
6500
6550
  let compressedSize = 0;
@@ -6514,7 +6564,7 @@
6514
6564
  encryptionStrength,
6515
6565
  zipCrypto: encrypted && zipCrypto,
6516
6566
  passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & MAX_8_BITS,
6517
- signed: !passThrough,
6567
+ computeCrc32: !passThrough,
6518
6568
  compressed: compressed && !passThrough,
6519
6569
  encrypted: encrypted && !passThrough,
6520
6570
  useWebWorkers,
@@ -6533,7 +6583,9 @@
6533
6583
  writer.size += compressedSize;
6534
6584
  if (!passThrough) {
6535
6585
  uncompressedSize = result.inputSize;
6536
- signature = result.signature;
6586
+ if (!encrypted || zipCrypto) {
6587
+ crc32 = result.crc32;
6588
+ }
6537
6589
  }
6538
6590
  if ((!zip64CompressedSize && compressedSize >= MAX_32_BITS) ||
6539
6591
  (!zip64UncompressedSize && uncompressedSize >= MAX_32_BITS)) {
@@ -6548,7 +6600,7 @@
6548
6600
 
6549
6601
  }
6550
6602
  setEntryInfo({
6551
- signature,
6603
+ crc32,
6552
6604
  compressedSize,
6553
6605
  uncompressedSize,
6554
6606
  headerInfo,
@@ -6571,7 +6623,8 @@
6571
6623
  version,
6572
6624
  headerArray,
6573
6625
  headerView,
6574
- signature,
6626
+ signature: crc32,
6627
+ crc32: encrypted && !zipCrypto && !passThrough ? UNDEFINED_VALUE : crc32,
6575
6628
  extraFieldExtendedTimestampFlag,
6576
6629
  zip64UncompressedSize,
6577
6630
  zip64CompressedSize
@@ -6592,6 +6645,7 @@
6592
6645
  dataDescriptor,
6593
6646
  directory,
6594
6647
  rawExtraField,
6648
+ rawLocalExtraField,
6595
6649
  encryptionStrength,
6596
6650
  extendedTimestamp,
6597
6651
  ntfsTimestamp,
@@ -6599,7 +6653,8 @@
6599
6653
  encrypted,
6600
6654
  zip64UncompressedSize,
6601
6655
  zip64CompressedSize,
6602
- uncompressedSize
6656
+ uncompressedSize,
6657
+ crc32
6603
6658
  } = options;
6604
6659
  let { version, compressionMethod } = options;
6605
6660
  const compressed = !directory && (compressionMethod === UNDEFINED_VALUE
@@ -6672,8 +6727,8 @@
6672
6727
  extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS_TAG1);
6673
6728
  extraFieldNTFS.uint16(24);
6674
6729
  extraFieldNTFS.uint64(lastModTimeNTFS);
6675
- extraFieldNTFS.uint64(getTimeNTFS(lastAccessDate) || lastModTimeNTFS);
6676
- extraFieldNTFS.uint64(getTimeNTFS(creationDate) || lastModTimeNTFS);
6730
+ extraFieldNTFS.uint64(lastAccessDate ? getTimeNTFS(lastAccessDate) : lastModTimeNTFS);
6731
+ extraFieldNTFS.uint64(creationDate ? getTimeNTFS(creationDate) : lastModTimeNTFS);
6677
6732
  rawExtraFieldNTFS = extraFieldNTFS.array;
6678
6733
  } catch {
6679
6734
  rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
@@ -6725,15 +6780,18 @@
6725
6780
  }
6726
6781
  if (encrypted && !zipCrypto) {
6727
6782
  version = version > VERSION_AES ? version : VERSION_AES;
6783
+ if (passThrough && crc32 !== UNDEFINED_VALUE) {
6784
+ rawExtraFieldAES[EXTRAFIELD_OFFSET_AES_VENDOR_VERSION] = VENDOR_VERSION_AE_1;
6785
+ }
6728
6786
  rawExtraFieldAES[9] = compressionMethod;
6729
6787
  compressionMethod = COMPRESSION_METHOD_AES;
6730
6788
  }
6731
6789
  const localExtraFieldZip64Length = writeLocalExtraFieldZip64 ? getLength(rawLocalExtraFieldZip64) : 0;
6732
- const extraFieldLength = localExtraFieldZip64Length + getLength(rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
6790
+ const extraFieldLength = localExtraFieldZip64Length + getLength(rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawLocalExtraField);
6733
6791
  if (extraFieldLength > MAX_16_BITS) {
6734
6792
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
6735
6793
  }
6736
- const dosLastModDate = new Date(Math.ceil(lastModDate.getTime() / 2000) * 2000);
6794
+ const dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
6737
6795
  const {
6738
6796
  headerArray,
6739
6797
  headerView,
@@ -6763,6 +6821,7 @@
6763
6821
  localHeader.bytes(rawExtraFieldNTFS);
6764
6822
  localHeader.bytes(rawExtraFieldUnix);
6765
6823
  localHeader.bytes(rawExtraField);
6824
+ localHeader.bytes(rawLocalExtraField);
6766
6825
  if (dataDescriptor) {
6767
6826
  if (!zip64CompressedSize) {
6768
6827
  setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
@@ -6881,7 +6940,7 @@
6881
6940
  }
6882
6941
 
6883
6942
  function setEntryInfo({
6884
- signature,
6943
+ crc32,
6885
6944
  compressedSize,
6886
6945
  uncompressedSize,
6887
6946
  headerInfo,
@@ -6889,6 +6948,7 @@
6889
6948
  }, {
6890
6949
  zip64,
6891
6950
  zipCrypto,
6951
+ passThrough,
6892
6952
  dataDescriptor
6893
6953
  }) {
6894
6954
  const {
@@ -6899,10 +6959,10 @@
6899
6959
  dataDescriptorView,
6900
6960
  dataDescriptorOffset
6901
6961
  } = dataDescriptorInfo;
6902
- if ((!encrypted || zipCrypto) && signature !== UNDEFINED_VALUE) {
6903
- setUint32(headerView, HEADER_OFFSET_SIGNATURE, signature);
6962
+ if ((!encrypted || zipCrypto || passThrough) && crc32 !== UNDEFINED_VALUE) {
6963
+ setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
6904
6964
  if (dataDescriptor) {
6905
- setUint32(dataDescriptorView, dataDescriptorOffset, signature);
6965
+ setUint32(dataDescriptorView, dataDescriptorOffset, crc32);
6906
6966
  }
6907
6967
  }
6908
6968
  if (zip64) {
@@ -6925,15 +6985,15 @@
6925
6985
  encrypted,
6926
6986
  zip64,
6927
6987
  localExtraFieldZip64Length,
6928
- signature,
6988
+ crc32,
6929
6989
  compressedSize,
6930
6990
  uncompressedSize,
6931
6991
  zip64UncompressedSize,
6932
6992
  zip64CompressedSize
6933
- }, localHeaderView, { dataDescriptor }) {
6993
+ }, localHeaderView, { dataDescriptor, passThrough }) {
6934
6994
  if (!dataDescriptor) {
6935
- if (!encrypted) {
6936
- setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, signature);
6995
+ if (!encrypted || (passThrough && crc32 !== UNDEFINED_VALUE)) {
6996
+ setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, crc32);
6937
6997
  }
6938
6998
  if (!zip64CompressedSize) {
6939
6999
  setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, compressedSize);
@@ -7242,7 +7302,8 @@
7242
7302
 
7243
7303
  function getTimeNTFS(date) {
7244
7304
  if (date) {
7245
- return ((BigInt(date.getTime()) + BigInt(11644473600000)) * BigInt(10000));
7305
+ const timeNTFS = ((BigInt(date.getTime()) + BigInt(11644473600000)) * BigInt(10000));
7306
+ return timeNTFS < MIN_NTFS_TIME ? MIN_NTFS_TIME : timeNTFS > MAX_NTFS_TIME ? MAX_NTFS_TIME : timeNTFS;
7246
7307
  }
7247
7308
  }
7248
7309
 
@@ -8281,10 +8342,12 @@
8281
8342
  exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
8282
8343
  exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
8283
8344
  exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
8345
+ exports.ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_AUTHENTICATION_CODE;
8284
8346
  exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
8285
8347
  exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
8286
8348
  exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
8287
8349
  exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
8350
+ exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
8288
8351
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
8289
8352
  exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
8290
8353
  exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;