@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/dist/zip-fs.js
CHANGED
|
@@ -445,7 +445,7 @@
|
|
|
445
445
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
446
446
|
}
|
|
447
447
|
|
|
448
|
-
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)}});
|
|
448
|
+
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)}});
|
|
449
449
|
|
|
450
450
|
/*
|
|
451
451
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -575,7 +575,7 @@
|
|
|
575
575
|
T[k][n] = (previous >>> 8) ^ T[0][previous & 0xFF];
|
|
576
576
|
}
|
|
577
577
|
}
|
|
578
|
-
const [T0, T1, T2, T3, T4, T5, T6, T7] = T;
|
|
578
|
+
const [T0$1, T1$1, T2$1, T3$1, T4, T5, T6, T7] = T;
|
|
579
579
|
|
|
580
580
|
class Crc32 {
|
|
581
581
|
|
|
@@ -597,12 +597,12 @@
|
|
|
597
597
|
const a = crc ^ view.getInt32(offset, true);
|
|
598
598
|
const b = view.getInt32(offset + 4, true);
|
|
599
599
|
crc = T7[a & 0xFF] ^ T6[(a >>> 8) & 0xFF] ^ T5[(a >>> 16) & 0xFF] ^ T4[(a >>> 24) & 0xFF] ^
|
|
600
|
-
T3[b & 0xFF] ^ T2[(b >>> 8) & 0xFF] ^ T1[(b >>> 16) & 0xFF] ^ T0[(b >>> 24) & 0xFF];
|
|
600
|
+
T3$1[b & 0xFF] ^ T2$1[(b >>> 8) & 0xFF] ^ T1$1[(b >>> 16) & 0xFF] ^ T0$1[(b >>> 24) & 0xFF];
|
|
601
601
|
}
|
|
602
602
|
}
|
|
603
603
|
// Remaining tail (and non-typed inputs) byte-at-a-time with the base table.
|
|
604
604
|
for (; offset < length; offset++) {
|
|
605
|
-
crc = (crc >>> 8) ^ T0[(crc ^ data[offset]) & 0xFF];
|
|
605
|
+
crc = (crc >>> 8) ^ T0$1[(crc ^ data[offset]) & 0xFF];
|
|
606
606
|
}
|
|
607
607
|
this.crc = crc;
|
|
608
608
|
}
|
|
@@ -706,794 +706,349 @@
|
|
|
706
706
|
}
|
|
707
707
|
}
|
|
708
708
|
|
|
709
|
-
// Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
|
|
710
|
-
|
|
711
|
-
// deno-lint-ignore-file no-this-alias
|
|
712
|
-
|
|
713
709
|
/*
|
|
714
|
-
|
|
715
|
-
* license or under the GNU GPL, version 2.0.
|
|
716
|
-
*/
|
|
717
|
-
|
|
718
|
-
/** @fileOverview Javascript cryptography implementation.
|
|
719
|
-
*
|
|
720
|
-
* Crush to remove comments, shorten variable names and
|
|
721
|
-
* generally reduce transmission size.
|
|
722
|
-
*
|
|
723
|
-
* @author Emily Stark
|
|
724
|
-
* @author Mike Hamburg
|
|
725
|
-
* @author Dan Boneh
|
|
726
|
-
*/
|
|
727
|
-
|
|
728
|
-
/*jslint indent: 2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */
|
|
729
|
-
|
|
730
|
-
/** @fileOverview Arrays of bits, encoded as arrays of Numbers.
|
|
731
|
-
*
|
|
732
|
-
* @author Emily Stark
|
|
733
|
-
* @author Mike Hamburg
|
|
734
|
-
* @author Dan Boneh
|
|
735
|
-
*/
|
|
736
|
-
|
|
737
|
-
/**
|
|
738
|
-
* Arrays of bits, encoded as arrays of Numbers.
|
|
739
|
-
* @namespace
|
|
740
|
-
* @description
|
|
741
|
-
* <p>
|
|
742
|
-
* These objects are the currency accepted by SJCL's crypto functions.
|
|
743
|
-
* </p>
|
|
744
|
-
*
|
|
745
|
-
* <p>
|
|
746
|
-
* Most of our crypto primitives operate on arrays of 4-byte words internally,
|
|
747
|
-
* but many of them can take arguments that are not a multiple of 4 bytes.
|
|
748
|
-
* This library encodes arrays of bits (whose size need not be a multiple of 8
|
|
749
|
-
* bits) as arrays of 32-bit words. The bits are packed, big-endian, into an
|
|
750
|
-
* array of words, 32 bits at a time. Since the words are double-precision
|
|
751
|
-
* floating point numbers, they fit some extra data. We use this (in a private,
|
|
752
|
-
* possibly-changing manner) to encode the number of bits actually present
|
|
753
|
-
* in the last word of the array.
|
|
754
|
-
* </p>
|
|
755
|
-
*
|
|
756
|
-
* <p>
|
|
757
|
-
* Because bitwise ops clear this out-of-band data, these arrays can be passed
|
|
758
|
-
* to ciphers like AES which want arrays of words.
|
|
759
|
-
* </p>
|
|
760
|
-
*/
|
|
761
|
-
const bitArray = {
|
|
762
|
-
/**
|
|
763
|
-
* Concatenate two bit arrays.
|
|
764
|
-
* @param {bitArray} a1 The first array.
|
|
765
|
-
* @param {bitArray} a2 The second array.
|
|
766
|
-
* @return {bitArray} The concatenation of a1 and a2.
|
|
767
|
-
*/
|
|
768
|
-
concat(a1, a2) {
|
|
769
|
-
if (a1.length === 0 || a2.length === 0) {
|
|
770
|
-
return a1.concat(a2);
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
const last = a1[a1.length - 1], shift = bitArray.getPartial(last);
|
|
774
|
-
if (shift === 32) {
|
|
775
|
-
return a1.concat(a2);
|
|
776
|
-
} else {
|
|
777
|
-
return bitArray._shiftRight(a2, shift, last | 0, a1.slice(0, a1.length - 1));
|
|
778
|
-
}
|
|
779
|
-
},
|
|
780
|
-
|
|
781
|
-
/**
|
|
782
|
-
* Find the length of an array of bits.
|
|
783
|
-
* @param {bitArray} a The array.
|
|
784
|
-
* @return {Number} The length of a, in bits.
|
|
785
|
-
*/
|
|
786
|
-
bitLength(a) {
|
|
787
|
-
const l = a.length;
|
|
788
|
-
if (l === 0) {
|
|
789
|
-
return 0;
|
|
790
|
-
}
|
|
791
|
-
const x = a[l - 1];
|
|
792
|
-
return (l - 1) * 32 + bitArray.getPartial(x);
|
|
793
|
-
},
|
|
794
|
-
|
|
795
|
-
/**
|
|
796
|
-
* Truncate an array.
|
|
797
|
-
* @param {bitArray} a The array.
|
|
798
|
-
* @param {Number} len The length to truncate to, in bits.
|
|
799
|
-
* @return {bitArray} A new array, truncated to len bits.
|
|
800
|
-
*/
|
|
801
|
-
clamp(a, len) {
|
|
802
|
-
if (a.length * 32 < len) {
|
|
803
|
-
return a;
|
|
804
|
-
}
|
|
805
|
-
a = a.slice(0, Math.ceil(len / 32));
|
|
806
|
-
const l = a.length;
|
|
807
|
-
len = len & 31;
|
|
808
|
-
if (l > 0 && len) {
|
|
809
|
-
a[l - 1] = bitArray.partial(len, a[l - 1] & 0x80000000 >> (len - 1), 1);
|
|
810
|
-
}
|
|
811
|
-
return a;
|
|
812
|
-
},
|
|
813
|
-
|
|
814
|
-
/**
|
|
815
|
-
* Make a partial word for a bit array.
|
|
816
|
-
* @param {Number} len The number of bits in the word.
|
|
817
|
-
* @param {Number} x The bits.
|
|
818
|
-
* @param {Number} [_end=0] Pass 1 if x has already been shifted to the high side.
|
|
819
|
-
* @return {Number} The partial word.
|
|
820
|
-
*/
|
|
821
|
-
partial(len, x, _end) {
|
|
822
|
-
if (len === 32) {
|
|
823
|
-
return x;
|
|
824
|
-
}
|
|
825
|
-
return (_end ? x | 0 : x << (32 - len)) + len * 0x10000000000;
|
|
826
|
-
},
|
|
710
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
827
711
|
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
* @param {Number} x The partial word.
|
|
831
|
-
* @return {Number} The number of bits used by the partial word.
|
|
832
|
-
*/
|
|
833
|
-
getPartial(x) {
|
|
834
|
-
return Math.round(x / 0x10000000000) || 32;
|
|
835
|
-
},
|
|
712
|
+
Redistribution and use in source and binary forms, with or without
|
|
713
|
+
modification, are permitted provided that the following conditions are met:
|
|
836
714
|
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
* @param {Number} shift The number of bits to shift.
|
|
840
|
-
* @param {Number} [carry=0] A byte to carry in
|
|
841
|
-
* @param {bitArray} [out=[]] An array to prepend to the output.
|
|
842
|
-
* @private
|
|
843
|
-
*/
|
|
844
|
-
_shiftRight(a, shift, carry, out) {
|
|
845
|
-
if (out === undefined) {
|
|
846
|
-
out = [];
|
|
847
|
-
}
|
|
715
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
716
|
+
this list of conditions and the following disclaimer.
|
|
848
717
|
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
}
|
|
853
|
-
if (shift === 0) {
|
|
854
|
-
return out.concat(a);
|
|
855
|
-
}
|
|
718
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
719
|
+
notice, this list of conditions and the following disclaimer in
|
|
720
|
+
the documentation and/or other materials provided with the distribution.
|
|
856
721
|
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
carry = a[i] << (32 - shift);
|
|
860
|
-
}
|
|
861
|
-
const last2 = a.length ? a[a.length - 1] : 0;
|
|
862
|
-
const shift2 = bitArray.getPartial(last2);
|
|
863
|
-
out.push(bitArray.partial(shift + shift2 & 31, (shift + shift2 > 32) ? carry : out.pop(), 1));
|
|
864
|
-
return out;
|
|
865
|
-
}
|
|
866
|
-
};
|
|
722
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
723
|
+
derived from this software without specific prior written permission.
|
|
867
724
|
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
725
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
726
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
727
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
728
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
729
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
730
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
731
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
732
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
733
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
734
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
873
735
|
*/
|
|
874
736
|
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
const
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
tmp = 0;
|
|
906
|
-
}
|
|
737
|
+
const BLOCK_LENGTH$1 = 16;
|
|
738
|
+
const ROUND_KEYS_LENGTH = 60;
|
|
739
|
+
const SHA1_BLOCK_LENGTH = 64;
|
|
740
|
+
const SHA1_DIGEST_LENGTH = 20;
|
|
741
|
+
const SHA1_SCHEDULE_LENGTH = 80;
|
|
742
|
+
const SHA1_LENGTH_OFFSET = 56;
|
|
743
|
+
const SHA1_PADDING = new Uint8Array([0x80]);
|
|
744
|
+
const SHA1_ZERO = new Uint8Array(1);
|
|
745
|
+
const SHA1_INITIAL_STATE = new Int32Array([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
|
|
746
|
+
const HMAC_INNER_PADDING = 0x36;
|
|
747
|
+
const HMAC_OUTER_PADDING = 0x5c;
|
|
748
|
+
const S_BOX = new Uint8Array(256);
|
|
749
|
+
const T0 = new Int32Array(256);
|
|
750
|
+
const T1 = new Int32Array(256);
|
|
751
|
+
const T2 = new Int32Array(256);
|
|
752
|
+
const T3 = new Int32Array(256);
|
|
753
|
+
|
|
754
|
+
let tablesInitialized = false;
|
|
755
|
+
|
|
756
|
+
function createEngine$2(key, authenticationKey) {
|
|
757
|
+
initTables();
|
|
758
|
+
const roundKeys = new Int32Array(ROUND_KEYS_LENGTH);
|
|
759
|
+
const rounds = expandKey(key, roundKeys);
|
|
760
|
+
const counter = new Uint8Array(BLOCK_LENGTH$1);
|
|
761
|
+
const keystream = new Int32Array(BLOCK_LENGTH$1 / 4);
|
|
762
|
+
const hmac = createHmac(authenticationKey);
|
|
763
|
+
return {
|
|
764
|
+
process(data, decrypt) {
|
|
765
|
+
if (decrypt) {
|
|
766
|
+
hmac.update(data, 0, data.length);
|
|
907
767
|
}
|
|
908
|
-
|
|
909
|
-
|
|
768
|
+
encrypt(data);
|
|
769
|
+
if (!decrypt) {
|
|
770
|
+
hmac.update(data, 0, data.length);
|
|
910
771
|
}
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
};
|
|
915
|
-
|
|
916
|
-
const hash = {};
|
|
917
|
-
|
|
918
|
-
/**
|
|
919
|
-
* Context for a SHA-1 operation in progress.
|
|
920
|
-
* @constructor
|
|
921
|
-
*/
|
|
922
|
-
hash.sha1 = class {
|
|
923
|
-
constructor(hash) {
|
|
924
|
-
const sha1 = this;
|
|
925
|
-
/**
|
|
926
|
-
* The hash's block size, in bits.
|
|
927
|
-
* @constant
|
|
928
|
-
*/
|
|
929
|
-
sha1.blockSize = 512;
|
|
930
|
-
/**
|
|
931
|
-
* The SHA-1 initialization vector.
|
|
932
|
-
* @private
|
|
933
|
-
*/
|
|
934
|
-
sha1._init = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0];
|
|
935
|
-
/**
|
|
936
|
-
* The SHA-1 hash key.
|
|
937
|
-
* @private
|
|
938
|
-
*/
|
|
939
|
-
sha1._key = [0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6];
|
|
940
|
-
if (hash) {
|
|
941
|
-
sha1._h = hash._h.slice(0);
|
|
942
|
-
sha1._buffer = hash._buffer.slice(0);
|
|
943
|
-
sha1._length = hash._length;
|
|
944
|
-
} else {
|
|
945
|
-
sha1.reset();
|
|
946
|
-
}
|
|
947
|
-
}
|
|
948
|
-
|
|
949
|
-
/**
|
|
950
|
-
* Reset the hash state.
|
|
951
|
-
* @return this
|
|
952
|
-
*/
|
|
953
|
-
reset() {
|
|
954
|
-
const sha1 = this;
|
|
955
|
-
sha1._h = sha1._init.slice(0);
|
|
956
|
-
sha1._buffer = [];
|
|
957
|
-
sha1._length = 0;
|
|
958
|
-
return sha1;
|
|
959
|
-
}
|
|
960
|
-
|
|
961
|
-
/**
|
|
962
|
-
* Input several words to the hash.
|
|
963
|
-
* @param {bitArray|String} data the data to hash.
|
|
964
|
-
* @return this
|
|
965
|
-
*/
|
|
966
|
-
update(data) {
|
|
967
|
-
const sha1 = this;
|
|
968
|
-
if (typeof data === "string") {
|
|
969
|
-
data = codec.utf8String.toBits(data);
|
|
970
|
-
}
|
|
971
|
-
const b = sha1._buffer = bitArray.concat(sha1._buffer, data);
|
|
972
|
-
const ol = sha1._length;
|
|
973
|
-
const nl = sha1._length = ol + bitArray.bitLength(data);
|
|
974
|
-
if (nl > 9007199254740991) {
|
|
975
|
-
throw new Error("Cannot hash more than 2^53 - 1 bits");
|
|
976
|
-
}
|
|
977
|
-
const c = new Uint32Array(b);
|
|
978
|
-
let j = 0;
|
|
979
|
-
for (let i = sha1.blockSize + ol - ((sha1.blockSize + ol) & (sha1.blockSize - 1)); i <= nl;
|
|
980
|
-
i += sha1.blockSize) {
|
|
981
|
-
sha1._block(c.subarray(16 * j, 16 * (j + 1)));
|
|
982
|
-
j += 1;
|
|
983
|
-
}
|
|
984
|
-
b.splice(0, 16 * j);
|
|
985
|
-
return sha1;
|
|
986
|
-
}
|
|
987
|
-
|
|
988
|
-
/**
|
|
989
|
-
* Complete hashing and output the hash value.
|
|
990
|
-
* @return {bitArray} The hash value, an array of 5 big-endian words. TODO
|
|
991
|
-
*/
|
|
992
|
-
finalize() {
|
|
993
|
-
const sha1 = this;
|
|
994
|
-
let b = sha1._buffer;
|
|
995
|
-
const h = sha1._h;
|
|
996
|
-
|
|
997
|
-
// Round out and push the buffer
|
|
998
|
-
b = bitArray.concat(b, [bitArray.partial(1, 1)]);
|
|
999
|
-
// Round out the buffer to a multiple of 16 words, less the 2 length words.
|
|
1000
|
-
for (let i = b.length + 2; i & 15; i++) {
|
|
1001
|
-
b.push(0);
|
|
1002
|
-
}
|
|
1003
|
-
|
|
1004
|
-
// append the length
|
|
1005
|
-
b.push(Math.floor(sha1._length / 0x100000000));
|
|
1006
|
-
b.push(sha1._length | 0);
|
|
1007
|
-
|
|
1008
|
-
while (b.length) {
|
|
1009
|
-
sha1._block(b.splice(0, 16));
|
|
1010
|
-
}
|
|
1011
|
-
|
|
1012
|
-
sha1.reset();
|
|
1013
|
-
return h;
|
|
1014
|
-
}
|
|
1015
|
-
|
|
1016
|
-
/**
|
|
1017
|
-
* The SHA-1 logical functions f(0), f(1), ..., f(79).
|
|
1018
|
-
* @private
|
|
1019
|
-
*/
|
|
1020
|
-
_f(t, b, c, d) {
|
|
1021
|
-
if (t <= 19) {
|
|
1022
|
-
return (b & c) | (~b & d);
|
|
1023
|
-
} else if (t <= 39) {
|
|
1024
|
-
return b ^ c ^ d;
|
|
1025
|
-
} else if (t <= 59) {
|
|
1026
|
-
return (b & c) | (b & d) | (c & d);
|
|
1027
|
-
} else if (t <= 79) {
|
|
1028
|
-
return b ^ c ^ d;
|
|
1029
|
-
}
|
|
1030
|
-
}
|
|
1031
|
-
|
|
1032
|
-
/**
|
|
1033
|
-
* Circular left-shift operator.
|
|
1034
|
-
* @private
|
|
1035
|
-
*/
|
|
1036
|
-
_S(n, x) {
|
|
1037
|
-
return (x << n) | (x >>> 32 - n);
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
|
-
/**
|
|
1041
|
-
* Perform one cycle of SHA-1.
|
|
1042
|
-
* @param {Uint32Array|bitArray} words one block of words.
|
|
1043
|
-
* @private
|
|
1044
|
-
*/
|
|
1045
|
-
_block(words) {
|
|
1046
|
-
const sha1 = this;
|
|
1047
|
-
const h = sha1._h;
|
|
1048
|
-
// When words is passed to _block, it has 16 elements. SHA1 _block
|
|
1049
|
-
// function extends words with new elements (at the end there are 80 elements).
|
|
1050
|
-
// The problem is that if we use Uint32Array instead of Array,
|
|
1051
|
-
// the length of Uint32Array cannot be changed. Thus, we replace words with a
|
|
1052
|
-
// normal Array here.
|
|
1053
|
-
const w = Array(80); // do not use Uint32Array here as the instantiation is slower
|
|
1054
|
-
for (let j = 0; j < 16; j++) {
|
|
1055
|
-
w[j] = words[j];
|
|
1056
|
-
}
|
|
1057
|
-
|
|
1058
|
-
let a = h[0];
|
|
1059
|
-
let b = h[1];
|
|
1060
|
-
let c = h[2];
|
|
1061
|
-
let d = h[3];
|
|
1062
|
-
let e = h[4];
|
|
1063
|
-
|
|
1064
|
-
for (let t = 0; t <= 79; t++) {
|
|
1065
|
-
if (t >= 16) {
|
|
1066
|
-
w[t] = sha1._S(1, w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16]);
|
|
1067
|
-
}
|
|
1068
|
-
const tmp = (sha1._S(5, a) + sha1._f(t, b, c, d) + e + w[t] +
|
|
1069
|
-
sha1._key[Math.floor(t / 20)]) | 0;
|
|
1070
|
-
e = d;
|
|
1071
|
-
d = c;
|
|
1072
|
-
c = sha1._S(30, b);
|
|
1073
|
-
b = a;
|
|
1074
|
-
a = tmp;
|
|
772
|
+
},
|
|
773
|
+
digest() {
|
|
774
|
+
return hmac.digest();
|
|
1075
775
|
}
|
|
776
|
+
};
|
|
1076
777
|
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
778
|
+
function encrypt(data) {
|
|
779
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
780
|
+
const length = data.length;
|
|
781
|
+
let offset = 0;
|
|
782
|
+
for (; offset + BLOCK_LENGTH$1 <= length; offset += BLOCK_LENGTH$1) {
|
|
783
|
+
nextKeystream();
|
|
784
|
+
view.setInt32(offset, view.getInt32(offset) ^ keystream[0]);
|
|
785
|
+
view.setInt32(offset + 4, view.getInt32(offset + 4) ^ keystream[1]);
|
|
786
|
+
view.setInt32(offset + 8, view.getInt32(offset + 8) ^ keystream[2]);
|
|
787
|
+
view.setInt32(offset + 12, view.getInt32(offset + 12) ^ keystream[3]);
|
|
788
|
+
}
|
|
789
|
+
if (offset < length) {
|
|
790
|
+
nextKeystream();
|
|
791
|
+
for (let indexByte = 0; offset < length; offset++, indexByte++) {
|
|
792
|
+
data[offset] ^= keystream[indexByte >> 2] >>> (24 - 8 * (indexByte & 3));
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
function nextKeystream() {
|
|
798
|
+
for (let indexByte = 0; indexByte < BLOCK_LENGTH$1; indexByte++) {
|
|
799
|
+
counter[indexByte]++;
|
|
800
|
+
if (counter[indexByte] !== 0) {
|
|
801
|
+
break;
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
let s0 = ((counter[0] << 24) | (counter[1] << 16) | (counter[2] << 8) | counter[3]) ^ roundKeys[0];
|
|
805
|
+
let s1 = ((counter[4] << 24) | (counter[5] << 16) | (counter[6] << 8) | counter[7]) ^ roundKeys[1];
|
|
806
|
+
let s2 = ((counter[8] << 24) | (counter[9] << 16) | (counter[10] << 8) | counter[11]) ^ roundKeys[2];
|
|
807
|
+
let s3 = ((counter[12] << 24) | (counter[13] << 16) | (counter[14] << 8) | counter[15]) ^ roundKeys[3];
|
|
808
|
+
let indexKey = 4;
|
|
809
|
+
for (let round = 1; round < rounds; round++, indexKey += 4) {
|
|
810
|
+
const t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[indexKey];
|
|
811
|
+
const t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[indexKey + 1];
|
|
812
|
+
const t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[indexKey + 2];
|
|
813
|
+
const t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[indexKey + 3];
|
|
814
|
+
s0 = t0;
|
|
815
|
+
s1 = t1;
|
|
816
|
+
s2 = t2;
|
|
817
|
+
s3 = t3;
|
|
818
|
+
}
|
|
819
|
+
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];
|
|
820
|
+
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];
|
|
821
|
+
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];
|
|
822
|
+
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];
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
function pbkdf2(password, salt, iterations, length) {
|
|
827
|
+
const hmac = createHmac(password);
|
|
828
|
+
const result = new Uint8Array(length);
|
|
829
|
+
const block = new Uint8Array(salt.length + 4);
|
|
830
|
+
const blockView = new DataView(block.buffer);
|
|
831
|
+
block.set(salt);
|
|
832
|
+
for (let indexBlock = 1, offset = 0; offset < length; indexBlock++, offset += SHA1_DIGEST_LENGTH) {
|
|
833
|
+
blockView.setUint32(salt.length, indexBlock);
|
|
834
|
+
hmac.update(block, 0, block.length);
|
|
835
|
+
let previous = hmac.digest();
|
|
836
|
+
const output = previous.slice();
|
|
837
|
+
for (let iteration = 1; iteration < iterations; iteration++) {
|
|
838
|
+
hmac.update(previous, 0, SHA1_DIGEST_LENGTH);
|
|
839
|
+
previous = hmac.digest();
|
|
840
|
+
for (let indexByte = 0; indexByte < SHA1_DIGEST_LENGTH; indexByte++) {
|
|
841
|
+
output[indexByte] ^= previous[indexByte];
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
result.set(output.subarray(0, Math.min(SHA1_DIGEST_LENGTH, length - offset)), offset);
|
|
1082
845
|
}
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
/** @fileOverview Low-level AES implementation.
|
|
1086
|
-
*
|
|
1087
|
-
* This file contains a low-level implementation of AES, optimized for
|
|
1088
|
-
* size and for efficiency on several browsers. It is based on
|
|
1089
|
-
* OpenSSL's aes_core.c, a public-domain implementation by Vincent
|
|
1090
|
-
* Rijmen, Antoon Bosselaers and Paulo Barreto.
|
|
1091
|
-
*
|
|
1092
|
-
* An older version of this implementation is available in the public
|
|
1093
|
-
* domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh,
|
|
1094
|
-
* Stanford University 2008-2010 and BSD-licensed for liability
|
|
1095
|
-
* reasons.
|
|
1096
|
-
*
|
|
1097
|
-
* @author Emily Stark
|
|
1098
|
-
* @author Mike Hamburg
|
|
1099
|
-
* @author Dan Boneh
|
|
1100
|
-
*/
|
|
1101
|
-
|
|
1102
|
-
const cipher = {};
|
|
1103
|
-
|
|
1104
|
-
/**
|
|
1105
|
-
* Schedule out an AES key for both encryption and decryption. This
|
|
1106
|
-
* is a low-level class. Use a cipher mode to do bulk encryption.
|
|
1107
|
-
*
|
|
1108
|
-
* @constructor
|
|
1109
|
-
* @param {Array} key The key as an array of 4, 6 or 8 words.
|
|
1110
|
-
*/
|
|
1111
|
-
cipher.aes = class {
|
|
1112
|
-
constructor(key) {
|
|
1113
|
-
/**
|
|
1114
|
-
* The expanded S-box and inverse S-box tables. These will be computed
|
|
1115
|
-
* on the client so that we don't have to send them down the wire.
|
|
1116
|
-
*
|
|
1117
|
-
* There are two tables, _tables[0] is for encryption and
|
|
1118
|
-
* _tables[1] is for decryption.
|
|
1119
|
-
*
|
|
1120
|
-
* The first 4 sub-tables are the expanded S-box with MixColumns. The
|
|
1121
|
-
* last (_tables[01][4]) is the S-box itself.
|
|
1122
|
-
*
|
|
1123
|
-
* @private
|
|
1124
|
-
*/
|
|
1125
|
-
const aes = this;
|
|
1126
|
-
aes._tables = [[[], [], [], [], []], [[], [], [], [], []]];
|
|
1127
|
-
|
|
1128
|
-
if (!aes._tables[0][0][0]) {
|
|
1129
|
-
aes._precompute();
|
|
1130
|
-
}
|
|
1131
|
-
|
|
1132
|
-
const sbox = aes._tables[0][4];
|
|
1133
|
-
const decTable = aes._tables[1];
|
|
1134
|
-
const keyLen = key.length;
|
|
1135
|
-
|
|
1136
|
-
let i, encKey, decKey, rcon = 1;
|
|
1137
|
-
|
|
1138
|
-
if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) {
|
|
1139
|
-
throw new Error("invalid aes key size");
|
|
1140
|
-
}
|
|
1141
|
-
|
|
1142
|
-
aes._key = [encKey = key.slice(0), decKey = []];
|
|
1143
|
-
|
|
1144
|
-
// schedule encryption keys
|
|
1145
|
-
for (i = keyLen; i < 4 * keyLen + 28; i++) {
|
|
1146
|
-
let tmp = encKey[i - 1];
|
|
1147
|
-
|
|
1148
|
-
// apply sbox
|
|
1149
|
-
if (i % keyLen === 0 || (keyLen === 8 && i % keyLen === 4)) {
|
|
1150
|
-
tmp = sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255];
|
|
1151
|
-
|
|
1152
|
-
// shift rows and add rcon
|
|
1153
|
-
if (i % keyLen === 0) {
|
|
1154
|
-
tmp = tmp << 8 ^ tmp >>> 24 ^ rcon << 24;
|
|
1155
|
-
rcon = rcon << 1 ^ (rcon >> 7) * 283;
|
|
1156
|
-
}
|
|
1157
|
-
}
|
|
1158
|
-
|
|
1159
|
-
encKey[i] = encKey[i - keyLen] ^ tmp;
|
|
1160
|
-
}
|
|
846
|
+
return result;
|
|
847
|
+
}
|
|
1161
848
|
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
decTable[1][sbox[tmp >> 16 & 255]] ^
|
|
1170
|
-
decTable[2][sbox[tmp >> 8 & 255]] ^
|
|
1171
|
-
decTable[3][sbox[tmp & 255]];
|
|
1172
|
-
}
|
|
1173
|
-
}
|
|
1174
|
-
}
|
|
1175
|
-
// public
|
|
1176
|
-
/* Something like this might appear here eventually
|
|
1177
|
-
name: "AES",
|
|
1178
|
-
blockSize: 4,
|
|
1179
|
-
keySizes: [4,6,8],
|
|
1180
|
-
*/
|
|
1181
|
-
|
|
1182
|
-
/**
|
|
1183
|
-
* Encrypt an array of 4 big-endian words.
|
|
1184
|
-
* @param {Array} data The plaintext.
|
|
1185
|
-
* @return {Array} The ciphertext.
|
|
1186
|
-
*/
|
|
1187
|
-
encrypt(data) {
|
|
1188
|
-
return this._crypt(data, 0);
|
|
1189
|
-
}
|
|
1190
|
-
|
|
1191
|
-
/**
|
|
1192
|
-
* Decrypt an array of 4 big-endian words.
|
|
1193
|
-
* @param {Array} data The ciphertext.
|
|
1194
|
-
* @return {Array} The plaintext.
|
|
1195
|
-
*/
|
|
1196
|
-
decrypt(data) {
|
|
1197
|
-
return this._crypt(data, 1);
|
|
1198
|
-
}
|
|
1199
|
-
|
|
1200
|
-
/**
|
|
1201
|
-
* Expand the S-box tables.
|
|
1202
|
-
*
|
|
1203
|
-
* @private
|
|
1204
|
-
*/
|
|
1205
|
-
_precompute() {
|
|
1206
|
-
const encTable = this._tables[0];
|
|
1207
|
-
const decTable = this._tables[1];
|
|
1208
|
-
const sbox = encTable[4];
|
|
1209
|
-
const sboxInv = decTable[4];
|
|
1210
|
-
const d = [];
|
|
1211
|
-
const th = [];
|
|
1212
|
-
let xInv, x2, x4, x8;
|
|
1213
|
-
|
|
1214
|
-
// Compute double and third tables
|
|
1215
|
-
for (let i = 0; i < 256; i++) {
|
|
1216
|
-
th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i;
|
|
1217
|
-
}
|
|
1218
|
-
|
|
1219
|
-
for (let x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {
|
|
1220
|
-
// Compute sbox
|
|
1221
|
-
let s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;
|
|
1222
|
-
s = s >> 8 ^ s & 255 ^ 99;
|
|
1223
|
-
sbox[x] = s;
|
|
1224
|
-
sboxInv[s] = x;
|
|
1225
|
-
|
|
1226
|
-
// Compute MixColumns
|
|
1227
|
-
x8 = d[x4 = d[x2 = d[x]]];
|
|
1228
|
-
let tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;
|
|
1229
|
-
let tEnc = d[s] * 0x101 ^ s * 0x1010100;
|
|
1230
|
-
|
|
1231
|
-
for (let i = 0; i < 4; i++) {
|
|
1232
|
-
encTable[i][x] = tEnc = tEnc << 24 ^ tEnc >>> 8;
|
|
1233
|
-
decTable[i][s] = tDec = tDec << 24 ^ tDec >>> 8;
|
|
1234
|
-
}
|
|
1235
|
-
}
|
|
1236
|
-
|
|
1237
|
-
// Compactify. Considerable speedup on Firefox.
|
|
1238
|
-
for (let i = 0; i < 5; i++) {
|
|
1239
|
-
encTable[i] = encTable[i].slice(0);
|
|
1240
|
-
decTable[i] = decTable[i].slice(0);
|
|
1241
|
-
}
|
|
1242
|
-
}
|
|
1243
|
-
|
|
1244
|
-
/**
|
|
1245
|
-
* Encryption and decryption core.
|
|
1246
|
-
* @param {Array} input Four words to be encrypted or decrypted.
|
|
1247
|
-
* @param dir The direction, 0 for encrypt and 1 for decrypt.
|
|
1248
|
-
* @return {Array} The four encrypted or decrypted words.
|
|
1249
|
-
* @private
|
|
1250
|
-
*/
|
|
1251
|
-
_crypt(input, dir) {
|
|
1252
|
-
if (input.length !== 4) {
|
|
1253
|
-
throw new Error("invalid aes block size");
|
|
1254
|
-
}
|
|
1255
|
-
|
|
1256
|
-
const key = this._key[dir];
|
|
1257
|
-
|
|
1258
|
-
const nInnerRounds = key.length / 4 - 2;
|
|
1259
|
-
const out = [0, 0, 0, 0];
|
|
1260
|
-
const table = this._tables[dir];
|
|
1261
|
-
|
|
1262
|
-
// load up the tables
|
|
1263
|
-
const t0 = table[0];
|
|
1264
|
-
const t1 = table[1];
|
|
1265
|
-
const t2 = table[2];
|
|
1266
|
-
const t3 = table[3];
|
|
1267
|
-
const sbox = table[4];
|
|
1268
|
-
|
|
1269
|
-
// state variables a,b,c,d are loaded with pre-whitened data
|
|
1270
|
-
let a = input[0] ^ key[0];
|
|
1271
|
-
let b = input[dir ? 3 : 1] ^ key[1];
|
|
1272
|
-
let c = input[2] ^ key[2];
|
|
1273
|
-
let d = input[dir ? 1 : 3] ^ key[3];
|
|
1274
|
-
let kIndex = 4;
|
|
1275
|
-
let a2, b2, c2;
|
|
1276
|
-
|
|
1277
|
-
// Inner rounds. Cribbed from OpenSSL.
|
|
1278
|
-
for (let i = 0; i < nInnerRounds; i++) {
|
|
1279
|
-
a2 = t0[a >>> 24] ^ t1[b >> 16 & 255] ^ t2[c >> 8 & 255] ^ t3[d & 255] ^ key[kIndex];
|
|
1280
|
-
b2 = t0[b >>> 24] ^ t1[c >> 16 & 255] ^ t2[d >> 8 & 255] ^ t3[a & 255] ^ key[kIndex + 1];
|
|
1281
|
-
c2 = t0[c >>> 24] ^ t1[d >> 16 & 255] ^ t2[a >> 8 & 255] ^ t3[b & 255] ^ key[kIndex + 2];
|
|
1282
|
-
d = t0[d >>> 24] ^ t1[a >> 16 & 255] ^ t2[b >> 8 & 255] ^ t3[c & 255] ^ key[kIndex + 3];
|
|
1283
|
-
kIndex += 4;
|
|
1284
|
-
a = a2; b = b2; c = c2;
|
|
1285
|
-
}
|
|
1286
|
-
|
|
1287
|
-
// Last round.
|
|
1288
|
-
for (let i = 0; i < 4; i++) {
|
|
1289
|
-
out[dir ? 3 & -i : i] =
|
|
1290
|
-
sbox[a >>> 24] << 24 ^
|
|
1291
|
-
sbox[b >> 16 & 255] << 16 ^
|
|
1292
|
-
sbox[c >> 8 & 255] << 8 ^
|
|
1293
|
-
sbox[d & 255] ^
|
|
1294
|
-
key[kIndex++];
|
|
1295
|
-
a2 = a; a = b; b = c; c = d; d = a2;
|
|
1296
|
-
}
|
|
1297
|
-
|
|
1298
|
-
return out;
|
|
849
|
+
function createHmac(key) {
|
|
850
|
+
const sha1 = createSha1();
|
|
851
|
+
const innerKey = new Uint8Array(SHA1_BLOCK_LENGTH);
|
|
852
|
+
const outerKey = new Uint8Array(SHA1_BLOCK_LENGTH);
|
|
853
|
+
if (key.length > SHA1_BLOCK_LENGTH) {
|
|
854
|
+
sha1.update(key, 0, key.length);
|
|
855
|
+
key = sha1.digest();
|
|
1299
856
|
}
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
* Special thanks to Roy Nicholson for pointing out a bug in our
|
|
1305
|
-
* implementation.
|
|
1306
|
-
*
|
|
1307
|
-
* @author Emily Stark
|
|
1308
|
-
* @author Mike Hamburg
|
|
1309
|
-
* @author Dan Boneh
|
|
1310
|
-
*/
|
|
1311
|
-
|
|
1312
|
-
/** Brian Gladman's CTR Mode.
|
|
1313
|
-
* @constructor
|
|
1314
|
-
* @param {Object} _prf The aes instance to generate key.
|
|
1315
|
-
* @param {bitArray} _iv The iv for ctr mode, it must be 128 bits.
|
|
1316
|
-
*/
|
|
1317
|
-
|
|
1318
|
-
const mode = {};
|
|
1319
|
-
|
|
1320
|
-
/**
|
|
1321
|
-
* Brian Gladman's CTR Mode.
|
|
1322
|
-
* @namespace
|
|
1323
|
-
*/
|
|
1324
|
-
mode.ctrGladman = class {
|
|
1325
|
-
constructor(prf, iv) {
|
|
1326
|
-
this._prf = prf;
|
|
1327
|
-
this._initIv = iv;
|
|
1328
|
-
this._iv = iv;
|
|
857
|
+
for (let indexByte = 0; indexByte < SHA1_BLOCK_LENGTH; indexByte++) {
|
|
858
|
+
const keyByte = indexByte < key.length ? key[indexByte] : 0;
|
|
859
|
+
innerKey[indexByte] = keyByte ^ HMAC_INNER_PADDING;
|
|
860
|
+
outerKey[indexByte] = keyByte ^ HMAC_OUTER_PADDING;
|
|
1329
861
|
}
|
|
862
|
+
sha1.update(innerKey, 0, SHA1_BLOCK_LENGTH);
|
|
863
|
+
return {
|
|
864
|
+
update(data, offset, length) {
|
|
865
|
+
sha1.update(data, offset, length);
|
|
866
|
+
},
|
|
867
|
+
digest() {
|
|
868
|
+
const innerDigest = sha1.digest();
|
|
869
|
+
sha1.update(outerKey, 0, SHA1_BLOCK_LENGTH);
|
|
870
|
+
sha1.update(innerDigest, 0, SHA1_DIGEST_LENGTH);
|
|
871
|
+
const result = sha1.digest();
|
|
872
|
+
sha1.update(innerKey, 0, SHA1_BLOCK_LENGTH);
|
|
873
|
+
return result;
|
|
874
|
+
}
|
|
875
|
+
};
|
|
876
|
+
}
|
|
1330
877
|
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
878
|
+
function createSha1() {
|
|
879
|
+
const state = new Int32Array(SHA1_INITIAL_STATE);
|
|
880
|
+
const schedule = new Int32Array(SHA1_SCHEDULE_LENGTH);
|
|
881
|
+
const block = new Uint8Array(SHA1_BLOCK_LENGTH);
|
|
882
|
+
const blockView = new DataView(block.buffer);
|
|
883
|
+
const lengthBytes = new Uint8Array(8);
|
|
884
|
+
let blockLength = 0;
|
|
885
|
+
let totalLength = 0;
|
|
886
|
+
return {
|
|
887
|
+
update,
|
|
888
|
+
digest
|
|
889
|
+
};
|
|
1334
890
|
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
891
|
+
function update(data, offset, length) {
|
|
892
|
+
const end = offset + length;
|
|
893
|
+
totalLength += length;
|
|
894
|
+
if (blockLength) {
|
|
895
|
+
while (offset < end && blockLength < SHA1_BLOCK_LENGTH) {
|
|
896
|
+
block[blockLength++] = data[offset++];
|
|
897
|
+
}
|
|
898
|
+
if (blockLength == SHA1_BLOCK_LENGTH) {
|
|
899
|
+
compress(blockView, 0);
|
|
900
|
+
blockLength = 0;
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
if (offset + SHA1_BLOCK_LENGTH <= end) {
|
|
904
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
905
|
+
for (; offset + SHA1_BLOCK_LENGTH <= end; offset += SHA1_BLOCK_LENGTH) {
|
|
906
|
+
compress(view, offset);
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
while (offset < end) {
|
|
910
|
+
block[blockLength++] = data[offset++];
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
function digest() {
|
|
915
|
+
const bits = totalLength * 8;
|
|
916
|
+
const high = Math.floor(bits / 0x100000000);
|
|
917
|
+
const low = bits >>> 0;
|
|
918
|
+
update(SHA1_PADDING, 0, 1);
|
|
919
|
+
while (blockLength != SHA1_LENGTH_OFFSET) {
|
|
920
|
+
update(SHA1_ZERO, 0, 1);
|
|
921
|
+
}
|
|
922
|
+
lengthBytes[0] = high >>> 24;
|
|
923
|
+
lengthBytes[1] = high >>> 16;
|
|
924
|
+
lengthBytes[2] = high >>> 8;
|
|
925
|
+
lengthBytes[3] = high;
|
|
926
|
+
lengthBytes[4] = low >>> 24;
|
|
927
|
+
lengthBytes[5] = low >>> 16;
|
|
928
|
+
lengthBytes[6] = low >>> 8;
|
|
929
|
+
lengthBytes[7] = low;
|
|
930
|
+
update(lengthBytes, 0, 8);
|
|
931
|
+
const result = new Uint8Array(SHA1_DIGEST_LENGTH);
|
|
932
|
+
const resultView = new DataView(result.buffer);
|
|
933
|
+
for (let indexWord = 0; indexWord < state.length; indexWord++) {
|
|
934
|
+
resultView.setInt32(4 * indexWord, state[indexWord]);
|
|
935
|
+
}
|
|
936
|
+
state.set(SHA1_INITIAL_STATE);
|
|
937
|
+
blockLength = 0;
|
|
938
|
+
totalLength = 0;
|
|
939
|
+
return result;
|
|
1340
940
|
}
|
|
1341
941
|
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
let b2 = (word >> 8) & 0xff;
|
|
1346
|
-
let b3 = word & 0xff;
|
|
1347
|
-
|
|
1348
|
-
if (b1 === 0xff) { // overflow b1
|
|
1349
|
-
b1 = 0;
|
|
1350
|
-
if (b2 === 0xff) {
|
|
1351
|
-
b2 = 0;
|
|
1352
|
-
if (b3 === 0xff) {
|
|
1353
|
-
b3 = 0;
|
|
1354
|
-
} else {
|
|
1355
|
-
++b3;
|
|
1356
|
-
}
|
|
1357
|
-
} else {
|
|
1358
|
-
++b2;
|
|
1359
|
-
}
|
|
1360
|
-
} else {
|
|
1361
|
-
++b1;
|
|
1362
|
-
}
|
|
1363
|
-
|
|
1364
|
-
word = 0;
|
|
1365
|
-
word += (b1 << 16);
|
|
1366
|
-
word += (b2 << 8);
|
|
1367
|
-
word += b3;
|
|
1368
|
-
} else {
|
|
1369
|
-
word += (0x01 << 24);
|
|
942
|
+
function compress(view, offset) {
|
|
943
|
+
for (let index = 0; index < 16; index++) {
|
|
944
|
+
schedule[index] = view.getInt32(offset + 4 * index);
|
|
1370
945
|
}
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
incCounter(counter) {
|
|
1375
|
-
if ((counter[0] = this.incWord(counter[0])) === 0) {
|
|
1376
|
-
// encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8
|
|
1377
|
-
counter[1] = this.incWord(counter[1]);
|
|
946
|
+
for (let index = 16; index < SHA1_SCHEDULE_LENGTH; index++) {
|
|
947
|
+
const word = schedule[index - 3] ^ schedule[index - 8] ^ schedule[index - 14] ^ schedule[index - 16];
|
|
948
|
+
schedule[index] = (word << 1) | (word >>> 31);
|
|
1378
949
|
}
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
let
|
|
1383
|
-
|
|
1384
|
-
|
|
950
|
+
let a = state[0];
|
|
951
|
+
let b = state[1];
|
|
952
|
+
let c = state[2];
|
|
953
|
+
let d = state[3];
|
|
954
|
+
let e = state[4];
|
|
955
|
+
let t;
|
|
956
|
+
for (let index = 0; index < 20; index++) {
|
|
957
|
+
t = (((a << 5) | (a >>> 27)) + ((b & c) | (~b & d)) + e + 0x5A827999 + schedule[index]) | 0;
|
|
958
|
+
e = d;
|
|
959
|
+
d = c;
|
|
960
|
+
c = (b << 30) | (b >>> 2);
|
|
961
|
+
b = a;
|
|
962
|
+
a = t;
|
|
963
|
+
}
|
|
964
|
+
for (let index = 20; index < 40; index++) {
|
|
965
|
+
t = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0x6ED9EBA1 + schedule[index]) | 0;
|
|
966
|
+
e = d;
|
|
967
|
+
d = c;
|
|
968
|
+
c = (b << 30) | (b >>> 2);
|
|
969
|
+
b = a;
|
|
970
|
+
a = t;
|
|
1385
971
|
}
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
data[i + 3] ^= e[3];
|
|
972
|
+
for (let index = 40; index < 60; index++) {
|
|
973
|
+
t = (((a << 5) | (a >>> 27)) + ((b & c) | (b & d) | (c & d)) + e + 0x8F1BBCDC + schedule[index]) | 0;
|
|
974
|
+
e = d;
|
|
975
|
+
d = c;
|
|
976
|
+
c = (b << 30) | (b >>> 2);
|
|
977
|
+
b = a;
|
|
978
|
+
a = t;
|
|
1394
979
|
}
|
|
1395
|
-
|
|
980
|
+
for (let index = 60; index < SHA1_SCHEDULE_LENGTH; index++) {
|
|
981
|
+
t = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0xCA62C1D6 + schedule[index]) | 0;
|
|
982
|
+
e = d;
|
|
983
|
+
d = c;
|
|
984
|
+
c = (b << 30) | (b >>> 2);
|
|
985
|
+
b = a;
|
|
986
|
+
a = t;
|
|
987
|
+
}
|
|
988
|
+
state[0] = (state[0] + a) | 0;
|
|
989
|
+
state[1] = (state[1] + b) | 0;
|
|
990
|
+
state[2] = (state[2] + c) | 0;
|
|
991
|
+
state[3] = (state[3] + d) | 0;
|
|
992
|
+
state[4] = (state[4] + e) | 0;
|
|
1396
993
|
}
|
|
1397
|
-
}
|
|
994
|
+
}
|
|
1398
995
|
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
const arrayBuffer = new ArrayBuffer(byteLength);
|
|
1411
|
-
const out = new DataView(arrayBuffer);
|
|
1412
|
-
let outLength = 0;
|
|
1413
|
-
const b = bitArray;
|
|
1414
|
-
salt = codec.bytes.toBits(salt);
|
|
1415
|
-
for (k = 1; outLength < (byteLength || 1); k++) {
|
|
1416
|
-
u = ui = prf.encrypt(b.concat(salt, [k]));
|
|
1417
|
-
for (i = 1; i < count; i++) {
|
|
1418
|
-
ui = prf.encrypt(ui);
|
|
1419
|
-
for (j = 0; j < ui.length; j++) {
|
|
1420
|
-
u[j] ^= ui[j];
|
|
1421
|
-
}
|
|
1422
|
-
}
|
|
1423
|
-
for (i = 0; outLength < (byteLength || 1) && i < u.length; i++) {
|
|
1424
|
-
out.setInt32(outLength, u[i]);
|
|
1425
|
-
outLength += 4;
|
|
996
|
+
function initTables() {
|
|
997
|
+
if (!tablesInitialized) {
|
|
998
|
+
let p = 1;
|
|
999
|
+
let q = 1;
|
|
1000
|
+
do {
|
|
1001
|
+
p = (p ^ (p << 1) ^ ((p & 0x80) ? 0x1b : 0)) & 255;
|
|
1002
|
+
q = (q ^ (q << 1)) & 255;
|
|
1003
|
+
q = (q ^ (q << 2)) & 255;
|
|
1004
|
+
q = (q ^ (q << 4)) & 255;
|
|
1005
|
+
if (q & 0x80) {
|
|
1006
|
+
q ^= 0x09;
|
|
1426
1007
|
}
|
|
1008
|
+
S_BOX[p] = (q ^ ((q << 1) | (q >> 7)) ^ ((q << 2) | (q >> 6)) ^ ((q << 3) | (q >> 5)) ^ ((q << 4) | (q >> 4)) ^ 0x63) & 255;
|
|
1009
|
+
} while (p != 1);
|
|
1010
|
+
S_BOX[0] = 0x63;
|
|
1011
|
+
for (let index = 0; index < 256; index++) {
|
|
1012
|
+
const s = S_BOX[index];
|
|
1013
|
+
const s2 = multiplyByTwo(s);
|
|
1014
|
+
const t = (s2 << 24) | (s << 16) | (s << 8) | (s2 ^ s);
|
|
1015
|
+
T0[index] = t;
|
|
1016
|
+
T1[index] = (t >>> 8) | (t << 24);
|
|
1017
|
+
T2[index] = (t >>> 16) | (t << 16);
|
|
1018
|
+
T3[index] = (t >>> 24) | (t << 8);
|
|
1427
1019
|
}
|
|
1428
|
-
|
|
1020
|
+
tablesInitialized = true;
|
|
1429
1021
|
}
|
|
1430
|
-
}
|
|
1431
|
-
|
|
1432
|
-
/** @fileOverview HMAC implementation.
|
|
1433
|
-
*
|
|
1434
|
-
* @author Emily Stark
|
|
1435
|
-
* @author Mike Hamburg
|
|
1436
|
-
* @author Dan Boneh
|
|
1437
|
-
*/
|
|
1438
|
-
|
|
1439
|
-
/** HMAC with the specified hash function.
|
|
1440
|
-
* @constructor
|
|
1441
|
-
* @param {bitArray} key the key for HMAC.
|
|
1442
|
-
* @param {Object} [Hash=hash.sha1] The hash function to use.
|
|
1443
|
-
*/
|
|
1444
|
-
misc.hmacSha1 = class {
|
|
1445
|
-
|
|
1446
|
-
constructor(key) {
|
|
1447
|
-
const hmac = this;
|
|
1448
|
-
const Hash = hmac._hash = hash.sha1;
|
|
1449
|
-
const exKey = [[], []];
|
|
1450
|
-
hmac._baseHash = [new Hash(), new Hash()];
|
|
1451
|
-
const bs = hmac._baseHash[0].blockSize / 32;
|
|
1452
|
-
|
|
1453
|
-
if (key.length > bs) {
|
|
1454
|
-
key = new Hash().update(key).finalize();
|
|
1455
|
-
}
|
|
1456
|
-
|
|
1457
|
-
for (let i = 0; i < bs; i++) {
|
|
1458
|
-
exKey[0][i] = key[i] ^ 0x36363636;
|
|
1459
|
-
exKey[1][i] = key[i] ^ 0x5C5C5C5C;
|
|
1460
|
-
}
|
|
1022
|
+
}
|
|
1461
1023
|
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1024
|
+
function expandKey(key, roundKeys) {
|
|
1025
|
+
const keyWords = key.length >> 2;
|
|
1026
|
+
const rounds = keyWords + 6;
|
|
1027
|
+
const total = 4 * (rounds + 1);
|
|
1028
|
+
let roundConstant = 1;
|
|
1029
|
+
for (let index = 0; index < keyWords; index++) {
|
|
1030
|
+
roundKeys[index] = (key[4 * index] << 24) | (key[4 * index + 1] << 16) | (key[4 * index + 2] << 8) | key[4 * index + 3];
|
|
1465
1031
|
}
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
hmac._resultHash.update(data);
|
|
1032
|
+
for (let index = keyWords; index < total; index++) {
|
|
1033
|
+
let word = roundKeys[index - 1];
|
|
1034
|
+
if (index % keyWords == 0) {
|
|
1035
|
+
word = substituteWord((word << 8) | (word >>> 24)) ^ (roundConstant << 24);
|
|
1036
|
+
roundConstant = multiplyByTwo(roundConstant);
|
|
1037
|
+
} else if (keyWords > 6 && index % keyWords == 4) {
|
|
1038
|
+
word = substituteWord(word);
|
|
1039
|
+
}
|
|
1040
|
+
roundKeys[index] = roundKeys[index - keyWords] ^ word;
|
|
1476
1041
|
}
|
|
1042
|
+
return rounds;
|
|
1043
|
+
}
|
|
1477
1044
|
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
const result = new (hmac._hash)(hmac._baseHash[1]).update(w).finalize();
|
|
1482
|
-
|
|
1483
|
-
hmac.reset();
|
|
1484
|
-
|
|
1485
|
-
return result;
|
|
1486
|
-
}
|
|
1045
|
+
function substituteWord(word) {
|
|
1046
|
+
return (S_BOX[word >>> 24] << 24) | (S_BOX[(word >>> 16) & 255] << 16) | (S_BOX[(word >>> 8) & 255] << 8) | S_BOX[word & 255];
|
|
1047
|
+
}
|
|
1487
1048
|
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
return this.digest(data);
|
|
1492
|
-
} else {
|
|
1493
|
-
throw new Error("encrypt on already updated hmac called!");
|
|
1494
|
-
}
|
|
1495
|
-
}
|
|
1496
|
-
};
|
|
1049
|
+
function multiplyByTwo(value) {
|
|
1050
|
+
return ((value << 1) ^ ((value >> 7) * 0x1b)) & 255;
|
|
1051
|
+
}
|
|
1497
1052
|
|
|
1498
1053
|
/*
|
|
1499
1054
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -1548,8 +1103,8 @@
|
|
|
1548
1103
|
1. Redistributions of source code must retain the above copyright notice,
|
|
1549
1104
|
this list of conditions and the following disclaimer.
|
|
1550
1105
|
|
|
1551
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
1552
|
-
notice, this list of conditions and the following disclaimer in
|
|
1106
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
1107
|
+
notice, this list of conditions and the following disclaimer in
|
|
1553
1108
|
the documentation and/or other materials provided with the distribution.
|
|
1554
1109
|
|
|
1555
1110
|
3. The names of the authors may not be used to endorse or promote products
|
|
@@ -1573,24 +1128,21 @@
|
|
|
1573
1128
|
const PBKDF2_ALGORITHM = { name: "PBKDF2" };
|
|
1574
1129
|
const HASH_ALGORITHM = { name: "HMAC" };
|
|
1575
1130
|
const HASH_FUNCTION = "SHA-1";
|
|
1131
|
+
const PBKDF2_ITERATIONS = 1000;
|
|
1576
1132
|
const BASE_KEY_ALGORITHM = Object.assign({ hash: HASH_ALGORITHM }, PBKDF2_ALGORITHM);
|
|
1577
|
-
const DERIVED_BITS_ALGORITHM = Object.assign({ iterations:
|
|
1133
|
+
const DERIVED_BITS_ALGORITHM = Object.assign({ iterations: PBKDF2_ITERATIONS, hash: { name: HASH_FUNCTION } }, PBKDF2_ALGORITHM);
|
|
1578
1134
|
const DERIVED_BITS_USAGE = ["deriveBits"];
|
|
1579
1135
|
const SALT_LENGTH = [8, 12, 16];
|
|
1580
1136
|
const KEY_LENGTH = [16, 24, 32];
|
|
1581
1137
|
const AUTHENTICATION_CODE_LENGTH = 10;
|
|
1582
|
-
const
|
|
1138
|
+
const PASSWORD_VERIFICATION_LENGTH = 2;
|
|
1583
1139
|
// deno-lint-ignore valid-typeof
|
|
1584
1140
|
const CRYPTO_API_SUPPORTED = typeof crypto != UNDEFINED_TYPE;
|
|
1585
1141
|
const subtle = CRYPTO_API_SUPPORTED && crypto.subtle;
|
|
1586
1142
|
const SUBTLE_API_SUPPORTED = CRYPTO_API_SUPPORTED && typeof subtle != UNDEFINED_TYPE;
|
|
1587
|
-
const codecBytes = codec.bytes;
|
|
1588
|
-
const Aes = cipher.aes;
|
|
1589
|
-
const CtrGladman = mode.ctrGladman;
|
|
1590
|
-
const HmacSha1 = misc.hmacSha1;
|
|
1591
1143
|
|
|
1592
|
-
let
|
|
1593
|
-
let
|
|
1144
|
+
let DERIVE_BITS_SUPPORTED = SUBTLE_API_SUPPORTED && typeof subtle.importKey == FUNCTION_TYPE && typeof subtle.deriveBits == FUNCTION_TYPE;
|
|
1145
|
+
let createEngine$1 = createEngine$2;
|
|
1594
1146
|
|
|
1595
1147
|
class AESDecryptionStream extends TransformStream {
|
|
1596
1148
|
|
|
@@ -1608,9 +1160,10 @@
|
|
|
1608
1160
|
ready
|
|
1609
1161
|
} = aesCrypto;
|
|
1610
1162
|
if (password) {
|
|
1611
|
-
await createDecryptionKeys(aesCrypto, strength, password, subarray(chunk, 0, SALT_LENGTH[strength] +
|
|
1612
|
-
chunk = subarray(chunk, SALT_LENGTH[strength] +
|
|
1163
|
+
await createDecryptionKeys(aesCrypto, strength, password, subarray(chunk, 0, SALT_LENGTH[strength] + PASSWORD_VERIFICATION_LENGTH));
|
|
1164
|
+
chunk = subarray(chunk, SALT_LENGTH[strength] + PASSWORD_VERIFICATION_LENGTH);
|
|
1613
1165
|
if (checkPasswordOnly) {
|
|
1166
|
+
disposeEngine(aesCrypto);
|
|
1614
1167
|
controller.error(new Error(ERR_ABORT_CHECK_PASSWORD));
|
|
1615
1168
|
} else {
|
|
1616
1169
|
resolveReady();
|
|
@@ -1623,23 +1176,16 @@
|
|
|
1623
1176
|
},
|
|
1624
1177
|
async flush(controller) {
|
|
1625
1178
|
const {
|
|
1626
|
-
|
|
1627
|
-
hmac,
|
|
1179
|
+
engine,
|
|
1628
1180
|
pendingInput,
|
|
1629
1181
|
ready
|
|
1630
1182
|
} = this;
|
|
1631
|
-
if (
|
|
1183
|
+
if (engine) {
|
|
1632
1184
|
await ready;
|
|
1633
|
-
const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1634
1185
|
const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
hmac.update(encryptedChunk);
|
|
1639
|
-
const decryptedChunk = ctr.update(encryptedChunk);
|
|
1640
|
-
decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
|
|
1641
|
-
}
|
|
1642
|
-
const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
|
|
1186
|
+
const decryptedChunkArray = new Uint8Array(subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH));
|
|
1187
|
+
engine.process(decryptedChunkArray, true);
|
|
1188
|
+
const authenticationCode = engine.digest();
|
|
1643
1189
|
let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
|
|
1644
1190
|
for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
|
|
1645
1191
|
invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
|
|
@@ -1649,6 +1195,9 @@
|
|
|
1649
1195
|
}
|
|
1650
1196
|
controller.enqueue(decryptedChunkArray);
|
|
1651
1197
|
}
|
|
1198
|
+
},
|
|
1199
|
+
cancel() {
|
|
1200
|
+
disposeEngine(this);
|
|
1652
1201
|
}
|
|
1653
1202
|
});
|
|
1654
1203
|
}
|
|
@@ -1678,31 +1227,33 @@
|
|
|
1678
1227
|
}
|
|
1679
1228
|
const output = new Uint8Array(preamble.length + chunk.length - (chunk.length % BLOCK_LENGTH));
|
|
1680
1229
|
output.set(preamble, 0);
|
|
1681
|
-
controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0));
|
|
1230
|
+
controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0, false));
|
|
1682
1231
|
},
|
|
1683
1232
|
async flush(controller) {
|
|
1684
1233
|
const {
|
|
1685
|
-
|
|
1686
|
-
hmac,
|
|
1234
|
+
engine,
|
|
1687
1235
|
pendingInput,
|
|
1688
1236
|
ready
|
|
1689
1237
|
} = this;
|
|
1690
|
-
if (
|
|
1238
|
+
if (engine) {
|
|
1691
1239
|
await ready;
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
hmac.update(encryptedChunk);
|
|
1696
|
-
encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
|
|
1697
|
-
}
|
|
1698
|
-
const authenticationCode = fromBits(codecBytes, hmac.digest()).slice(0, AUTHENTICATION_CODE_LENGTH);
|
|
1240
|
+
const encryptedChunkArray = new Uint8Array(pendingInput);
|
|
1241
|
+
engine.process(encryptedChunkArray, false);
|
|
1242
|
+
const authenticationCode = subarray(engine.digest(), 0, AUTHENTICATION_CODE_LENGTH);
|
|
1699
1243
|
controller.enqueue(concat(encryptedChunkArray, authenticationCode));
|
|
1700
1244
|
}
|
|
1245
|
+
},
|
|
1246
|
+
cancel() {
|
|
1247
|
+
disposeEngine(this);
|
|
1701
1248
|
}
|
|
1702
1249
|
});
|
|
1703
1250
|
}
|
|
1704
1251
|
}
|
|
1705
1252
|
|
|
1253
|
+
function setAESEngine(createEngineFunction) {
|
|
1254
|
+
createEngine$1 = createEngineFunction || createEngine$2;
|
|
1255
|
+
}
|
|
1256
|
+
|
|
1706
1257
|
function initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength) {
|
|
1707
1258
|
Object.assign(aesCrypto, {
|
|
1708
1259
|
ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
|
|
@@ -1712,30 +1263,23 @@
|
|
|
1712
1263
|
});
|
|
1713
1264
|
}
|
|
1714
1265
|
|
|
1715
|
-
function append(aesCrypto, input, output, paddingStart, paddingEnd,
|
|
1266
|
+
function append(aesCrypto, input, output, paddingStart, paddingEnd, decrypt) {
|
|
1716
1267
|
const {
|
|
1717
|
-
|
|
1718
|
-
hmac,
|
|
1268
|
+
engine,
|
|
1719
1269
|
pendingInput
|
|
1720
1270
|
} = aesCrypto;
|
|
1721
1271
|
if (pendingInput.length) {
|
|
1722
1272
|
input = concat(pendingInput, input);
|
|
1723
1273
|
}
|
|
1724
1274
|
const inputLength = input.length - paddingEnd;
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
const
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
if (!verifyAuthenticationCode) {
|
|
1734
|
-
hmac.update(outputChunk);
|
|
1735
|
-
}
|
|
1736
|
-
output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
|
|
1737
|
-
}
|
|
1738
|
-
aesCrypto.pendingInput = subarray(input, offset);
|
|
1275
|
+
const alignedLength = inputLength - (inputLength % BLOCK_LENGTH);
|
|
1276
|
+
output = expand(output, paddingStart + alignedLength);
|
|
1277
|
+
if (alignedLength) {
|
|
1278
|
+
const chunk = subarray(output, paddingStart, paddingStart + alignedLength);
|
|
1279
|
+
chunk.set(subarray(input, 0, alignedLength));
|
|
1280
|
+
engine.process(chunk, decrypt);
|
|
1281
|
+
}
|
|
1282
|
+
aesCrypto.pendingInput = subarray(input, alignedLength);
|
|
1739
1283
|
return output;
|
|
1740
1284
|
}
|
|
1741
1285
|
|
|
@@ -1743,10 +1287,17 @@
|
|
|
1743
1287
|
const passwordVerificationKey = await createKeys$1(decrypt, strength, password, subarray(preamble, 0, SALT_LENGTH[strength]));
|
|
1744
1288
|
const passwordVerification = subarray(preamble, SALT_LENGTH[strength]);
|
|
1745
1289
|
if (passwordVerificationKey[0] != passwordVerification[0] || passwordVerificationKey[1] != passwordVerification[1]) {
|
|
1290
|
+
disposeEngine(decrypt);
|
|
1746
1291
|
throw new Error(ERR_INVALID_PASSWORD);
|
|
1747
1292
|
}
|
|
1748
1293
|
}
|
|
1749
1294
|
|
|
1295
|
+
function disposeEngine({ engine }) {
|
|
1296
|
+
if (engine && engine.dispose) {
|
|
1297
|
+
engine.dispose();
|
|
1298
|
+
}
|
|
1299
|
+
}
|
|
1300
|
+
|
|
1750
1301
|
async function createEncryptionKeys(encrypt, strength, password) {
|
|
1751
1302
|
const salt = getRandomValues(new Uint8Array(SALT_LENGTH[strength]));
|
|
1752
1303
|
const passwordVerification = await createKeys$1(encrypt, strength, password, salt);
|
|
@@ -1755,48 +1306,22 @@
|
|
|
1755
1306
|
|
|
1756
1307
|
async function createKeys$1(aesCrypto, strength, password, salt) {
|
|
1757
1308
|
aesCrypto.password = null;
|
|
1758
|
-
const
|
|
1759
|
-
const
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
const authentication = toBits(codecBytes, subarray(compositeKey, KEY_LENGTH[strength], KEY_LENGTH[strength] * 2));
|
|
1763
|
-
const passwordVerification = subarray(compositeKey, KEY_LENGTH[strength] * 2);
|
|
1764
|
-
Object.assign(aesCrypto, {
|
|
1765
|
-
keys: {
|
|
1766
|
-
key,
|
|
1767
|
-
authentication,
|
|
1768
|
-
passwordVerification
|
|
1769
|
-
},
|
|
1770
|
-
ctr: new CtrGladman(new Aes(key), Array.from(COUNTER_DEFAULT_VALUE)),
|
|
1771
|
-
hmac: new HmacSha1(authentication)
|
|
1772
|
-
});
|
|
1773
|
-
return passwordVerification;
|
|
1309
|
+
const keyLength = KEY_LENGTH[strength];
|
|
1310
|
+
const compositeKey = await deriveKey(password, salt, keyLength * 2 + PASSWORD_VERIFICATION_LENGTH);
|
|
1311
|
+
aesCrypto.engine = createEngine$1(subarray(compositeKey, 0, keyLength), subarray(compositeKey, keyLength, keyLength * 2));
|
|
1312
|
+
return subarray(compositeKey, keyLength * 2);
|
|
1774
1313
|
}
|
|
1775
1314
|
|
|
1776
|
-
async function
|
|
1777
|
-
if (IMPORT_KEY_SUPPORTED) {
|
|
1778
|
-
try {
|
|
1779
|
-
return await subtle.importKey(format, password, algorithm, extractable, keyUsages);
|
|
1780
|
-
} catch {
|
|
1781
|
-
IMPORT_KEY_SUPPORTED = false;
|
|
1782
|
-
return misc.importKey(password);
|
|
1783
|
-
}
|
|
1784
|
-
} else {
|
|
1785
|
-
return misc.importKey(password);
|
|
1786
|
-
}
|
|
1787
|
-
}
|
|
1788
|
-
|
|
1789
|
-
async function deriveBits(algorithm, baseKey, length) {
|
|
1315
|
+
async function deriveKey(password, salt, length) {
|
|
1790
1316
|
if (DERIVE_BITS_SUPPORTED) {
|
|
1791
1317
|
try {
|
|
1792
|
-
|
|
1318
|
+
const baseKey = await subtle.importKey(RAW_FORMAT, password, BASE_KEY_ALGORITHM, false, DERIVED_BITS_USAGE);
|
|
1319
|
+
return new Uint8Array(await subtle.deriveBits(Object.assign({ salt }, DERIVED_BITS_ALGORITHM), baseKey, length * 8));
|
|
1793
1320
|
} catch {
|
|
1794
1321
|
DERIVE_BITS_SUPPORTED = false;
|
|
1795
|
-
return misc.pbkdf2(baseKey, algorithm.salt, DERIVED_BITS_ALGORITHM.iterations, length);
|
|
1796
1322
|
}
|
|
1797
|
-
} else {
|
|
1798
|
-
return misc.pbkdf2(baseKey, algorithm.salt, DERIVED_BITS_ALGORITHM.iterations, length);
|
|
1799
1323
|
}
|
|
1324
|
+
return pbkdf2(password, salt, PBKDF2_ITERATIONS, length);
|
|
1800
1325
|
}
|
|
1801
1326
|
|
|
1802
1327
|
function encodePassword(password, rawPassword) {
|
|
@@ -1820,13 +1345,6 @@
|
|
|
1820
1345
|
return array.subarray(begin, end);
|
|
1821
1346
|
}
|
|
1822
1347
|
|
|
1823
|
-
function fromBits(codecBytes, chunk) {
|
|
1824
|
-
return codecBytes.fromBits(chunk);
|
|
1825
|
-
}
|
|
1826
|
-
function toBits(codecBytes, chunk) {
|
|
1827
|
-
return codecBytes.toBits(chunk);
|
|
1828
|
-
}
|
|
1829
|
-
|
|
1830
1348
|
/*
|
|
1831
1349
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
1832
1350
|
|
|
@@ -2770,11 +2288,18 @@
|
|
|
2770
2288
|
return true;
|
|
2771
2289
|
}
|
|
2772
2290
|
if (FallbackStream) {
|
|
2291
|
+
return await loadModule(config);
|
|
2292
|
+
}
|
|
2293
|
+
return false;
|
|
2294
|
+
}
|
|
2295
|
+
|
|
2296
|
+
async function loadModule(config) {
|
|
2297
|
+
if (initModule$1) {
|
|
2773
2298
|
try {
|
|
2774
2299
|
await initModule$1(config);
|
|
2775
2300
|
return true;
|
|
2776
2301
|
} catch {
|
|
2777
|
-
|
|
2302
|
+
// ignored
|
|
2778
2303
|
}
|
|
2779
2304
|
}
|
|
2780
2305
|
return false;
|
|
@@ -2817,26 +2342,27 @@
|
|
|
2817
2342
|
terminate() {
|
|
2818
2343
|
return new Promise(resolve => {
|
|
2819
2344
|
const { worker, busy } = workerData;
|
|
2820
|
-
if (
|
|
2821
|
-
|
|
2822
|
-
|
|
2823
|
-
|
|
2345
|
+
if (busy) {
|
|
2346
|
+
workerData.resolveTerminated = resolve;
|
|
2347
|
+
} else {
|
|
2348
|
+
if (worker) {
|
|
2824
2349
|
worker.terminate();
|
|
2825
|
-
|
|
2350
|
+
workerData.worker = null;
|
|
2826
2351
|
}
|
|
2827
|
-
workerData.interface = null;
|
|
2828
|
-
} else {
|
|
2829
2352
|
resolve();
|
|
2830
2353
|
}
|
|
2354
|
+
workerData.interface = null;
|
|
2831
2355
|
});
|
|
2832
2356
|
},
|
|
2833
2357
|
onTaskFinished() {
|
|
2834
2358
|
if (workerData.busy) {
|
|
2835
|
-
const { resolveTerminated } = workerData;
|
|
2359
|
+
const { resolveTerminated, worker } = workerData;
|
|
2836
2360
|
if (resolveTerminated) {
|
|
2837
2361
|
workerData.resolveTerminated = null;
|
|
2838
|
-
|
|
2839
|
-
|
|
2362
|
+
if (worker) {
|
|
2363
|
+
workerData.terminated = true;
|
|
2364
|
+
worker.terminate();
|
|
2365
|
+
}
|
|
2840
2366
|
resolveTerminated();
|
|
2841
2367
|
}
|
|
2842
2368
|
workerData.busy = false;
|
|
@@ -2893,28 +2419,23 @@
|
|
|
2893
2419
|
}
|
|
2894
2420
|
|
|
2895
2421
|
async function runWorker$1({ options, readable, writable, onTaskFinished, workerOptions }, config) {
|
|
2896
|
-
let codecStream, chunkStream;
|
|
2422
|
+
let codecStream, chunkStream, modulePromise;
|
|
2897
2423
|
try {
|
|
2898
2424
|
if (options.compressed && !options.format) {
|
|
2899
2425
|
const deflate = options.codecType.startsWith(CODEC_DEFLATE);
|
|
2900
2426
|
const FallbackStream = deflate ? config.CompressionStreamFallback : config.DecompressionStreamFallback;
|
|
2901
2427
|
const NativeStream = deflate ? config.CompressionStream : config.DecompressionStream;
|
|
2902
2428
|
if (!options.useCompressionStream) {
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
} catch {
|
|
2906
|
-
if (!FallbackStream || FallbackStream.requiresModule) {
|
|
2907
|
-
options.useCompressionStream = true;
|
|
2908
|
-
}
|
|
2429
|
+
if (!await moduleLoaded() && (!FallbackStream || FallbackStream.requiresModule)) {
|
|
2430
|
+
options.useCompressionStream = true;
|
|
2909
2431
|
}
|
|
2910
2432
|
} else if (FallbackStream && FallbackStream.requiresModule && !supportsDeflateRaw(NativeStream)) {
|
|
2911
|
-
|
|
2912
|
-
await initModule$1(config);
|
|
2913
|
-
} catch {
|
|
2914
|
-
// ignored
|
|
2915
|
-
}
|
|
2433
|
+
await moduleLoaded();
|
|
2916
2434
|
}
|
|
2917
2435
|
}
|
|
2436
|
+
if (options.encrypted && !options.zipCrypto) {
|
|
2437
|
+
await moduleLoaded();
|
|
2438
|
+
}
|
|
2918
2439
|
codecStream = new CodecStream(options, config);
|
|
2919
2440
|
chunkStream = new ChunkStream(getChunkSize(config));
|
|
2920
2441
|
await readable
|
|
@@ -2947,6 +2468,13 @@
|
|
|
2947
2468
|
} finally {
|
|
2948
2469
|
onTaskFinished();
|
|
2949
2470
|
}
|
|
2471
|
+
|
|
2472
|
+
function moduleLoaded() {
|
|
2473
|
+
if (!modulePromise) {
|
|
2474
|
+
modulePromise = loadModule(config);
|
|
2475
|
+
}
|
|
2476
|
+
return modulePromise;
|
|
2477
|
+
}
|
|
2950
2478
|
}
|
|
2951
2479
|
|
|
2952
2480
|
/*
|
|
@@ -3053,7 +2581,7 @@
|
|
|
3053
2581
|
rejectResult = error => {
|
|
3054
2582
|
const { outputSize, workerOptions } = workerData;
|
|
3055
2583
|
workerOptions.outputSize = outputSize;
|
|
3056
|
-
if (isErrorObject(error)
|
|
2584
|
+
if (isErrorObject(error)) {
|
|
3057
2585
|
try {
|
|
3058
2586
|
error.outputSize = outputSize;
|
|
3059
2587
|
} catch {
|
|
@@ -3067,12 +2595,14 @@
|
|
|
3067
2595
|
reader: null,
|
|
3068
2596
|
writer: null,
|
|
3069
2597
|
outputSize: 0,
|
|
2598
|
+
destinationFailed: false,
|
|
2599
|
+
destinationError: null,
|
|
3070
2600
|
resolveResult,
|
|
3071
2601
|
rejectResult,
|
|
3072
2602
|
result
|
|
3073
2603
|
});
|
|
3074
2604
|
const { readable, options } = workerData;
|
|
3075
|
-
const { writable, closed, abortPipe } = watchClosedStream(workerData.writable);
|
|
2605
|
+
const { writable, closed, abortPipe } = watchClosedStream(workerData.writable, workerData);
|
|
3076
2606
|
let streamsTransferred;
|
|
3077
2607
|
try {
|
|
3078
2608
|
streamsTransferred = sendMessage({
|
|
@@ -3115,7 +2645,18 @@
|
|
|
3115
2645
|
} catch {
|
|
3116
2646
|
// ignored
|
|
3117
2647
|
}
|
|
3118
|
-
|
|
2648
|
+
const { outputSize, workerOptions, destinationFailed, destinationError } = workerData;
|
|
2649
|
+
workerOptions.outputSize = outputSize;
|
|
2650
|
+
const workerFailed = isErrorObject(error) && (error.codecImportFailed || error.workerStartupFailed);
|
|
2651
|
+
const reportedError = destinationFailed && !workerFailed ? destinationError : error;
|
|
2652
|
+
if (isErrorObject(reportedError)) {
|
|
2653
|
+
try {
|
|
2654
|
+
reportedError.outputSize = outputSize;
|
|
2655
|
+
} catch {
|
|
2656
|
+
// ignored
|
|
2657
|
+
}
|
|
2658
|
+
}
|
|
2659
|
+
throw reportedError;
|
|
3119
2660
|
}
|
|
3120
2661
|
|
|
3121
2662
|
async function closeWritable() {
|
|
@@ -3129,12 +2670,27 @@
|
|
|
3129
2670
|
}
|
|
3130
2671
|
}
|
|
3131
2672
|
|
|
3132
|
-
function watchClosedStream(writableSource) {
|
|
2673
|
+
function watchClosedStream(writableSource, workerData) {
|
|
3133
2674
|
const abortController = new AbortController();
|
|
3134
|
-
|
|
2675
|
+
let aborting;
|
|
2676
|
+
const { writable, readable } = new TransformStream({
|
|
2677
|
+
transform(chunk, controller) {
|
|
2678
|
+
workerData.outputSize += chunk.length;
|
|
2679
|
+
controller.enqueue(chunk);
|
|
2680
|
+
}
|
|
2681
|
+
});
|
|
3135
2682
|
const closed = readable.pipeTo(writableSource, { preventClose: true, preventAbort: true, signal: abortController.signal });
|
|
3136
|
-
closed.catch(
|
|
3137
|
-
|
|
2683
|
+
closed.catch(error => {
|
|
2684
|
+
if (!aborting) {
|
|
2685
|
+
Object.assign(workerData, { destinationFailed: true, destinationError: error });
|
|
2686
|
+
}
|
|
2687
|
+
});
|
|
2688
|
+
return {
|
|
2689
|
+
writable, closed, abortPipe: () => {
|
|
2690
|
+
aborting = true;
|
|
2691
|
+
abortController.abort();
|
|
2692
|
+
}
|
|
2693
|
+
};
|
|
3138
2694
|
}
|
|
3139
2695
|
|
|
3140
2696
|
function releaseWorkerStreams(workerData) {
|
|
@@ -3332,9 +2888,6 @@
|
|
|
3332
2888
|
const stale = () => workerData.generation != generation;
|
|
3333
2889
|
try {
|
|
3334
2890
|
if (error) {
|
|
3335
|
-
if (error.outputSize !== UNDEFINED_VALUE) {
|
|
3336
|
-
workerData.outputSize = error.outputSize;
|
|
3337
|
-
}
|
|
3338
2891
|
fail(getResponseError(error, errorValue));
|
|
3339
2892
|
} else {
|
|
3340
2893
|
if (type == MESSAGE_PULL) {
|
|
@@ -3347,7 +2900,6 @@
|
|
|
3347
2900
|
const chunk = new Uint8Array(value);
|
|
3348
2901
|
await writer.ready;
|
|
3349
2902
|
await writer.write(chunk);
|
|
3350
|
-
workerData.outputSize += chunk.length;
|
|
3351
2903
|
if (!stale()) {
|
|
3352
2904
|
sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
|
|
3353
2905
|
}
|
|
@@ -4079,16 +3631,14 @@
|
|
|
4079
3631
|
combineSizeEocd
|
|
4080
3632
|
} = httpReader;
|
|
4081
3633
|
if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest == UNDEFINED_TYPE || preventHeadRequest)) {
|
|
4082
|
-
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -
|
|
3634
|
+
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -65557 : undefined));
|
|
4083
3635
|
const acceptRanges = response.headers.get(HTTP_HEADER_ACCEPT_RANGES);
|
|
4084
3636
|
if (!forceRangeRequests && (!acceptRanges || acceptRanges.toLowerCase() != HTTP_RANGE_UNIT)) {
|
|
4085
3637
|
throw new Error(ERR_HTTP_RANGE);
|
|
4086
3638
|
} else {
|
|
4087
|
-
|
|
4088
|
-
|
|
4089
|
-
|
|
4090
|
-
httpReader.eocdCache = eocdCache;
|
|
4091
|
-
}
|
|
3639
|
+
let eocdCache;
|
|
3640
|
+
if (combineSizeEocd && response.status == 206) {
|
|
3641
|
+
eocdCache = new Uint8Array(await response.arrayBuffer());
|
|
4092
3642
|
}
|
|
4093
3643
|
setResourceValidators(httpReader, response);
|
|
4094
3644
|
const contentSize = getContentRangeSize(response);
|
|
@@ -4097,6 +3647,9 @@
|
|
|
4097
3647
|
} else {
|
|
4098
3648
|
httpReader.size = contentSize;
|
|
4099
3649
|
}
|
|
3650
|
+
if (eocdCache && eocdCache.length && getContentRangeOffset(response) === httpReader.size - eocdCache.length) {
|
|
3651
|
+
httpReader.eocdCache = eocdCache;
|
|
3652
|
+
}
|
|
4100
3653
|
}
|
|
4101
3654
|
} else {
|
|
4102
3655
|
await getContentLength(httpReader, sendRequest, getRequestData);
|
|
@@ -4112,25 +3665,23 @@
|
|
|
4112
3665
|
options
|
|
4113
3666
|
} = httpReader;
|
|
4114
3667
|
if (useRangeHeader || forceRangeRequests) {
|
|
4115
|
-
if (eocdCache && index == size - END_OF_CENTRAL_DIR_LENGTH && length == END_OF_CENTRAL_DIR_LENGTH) {
|
|
4116
|
-
return eocdCache;
|
|
4117
|
-
}
|
|
4118
3668
|
if (index >= size || length === 0) {
|
|
4119
3669
|
return EMPTY_UINT8_ARRAY;
|
|
4120
3670
|
} else {
|
|
4121
3671
|
if (index + length > size) {
|
|
4122
3672
|
length = size - index;
|
|
4123
3673
|
}
|
|
3674
|
+
if (eocdCache && index >= size - eocdCache.length) {
|
|
3675
|
+
const cacheIndex = index - (size - eocdCache.length);
|
|
3676
|
+
return eocdCache.slice(cacheIndex, cacheIndex + length);
|
|
3677
|
+
}
|
|
4124
3678
|
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, index, length));
|
|
4125
3679
|
if (response.status != 206) {
|
|
4126
3680
|
throw new Error(ERR_HTTP_RANGE);
|
|
4127
3681
|
}
|
|
4128
|
-
const
|
|
4129
|
-
if (
|
|
4130
|
-
|
|
4131
|
-
if (!Number.isNaN(rangeStart) && rangeStart != index) {
|
|
4132
|
-
throw new Error(ERR_HTTP_RANGE);
|
|
4133
|
-
}
|
|
3682
|
+
const rangeStart = getContentRangeOffset(response);
|
|
3683
|
+
if (rangeStart !== UNDEFINED_VALUE && rangeStart != index) {
|
|
3684
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
4134
3685
|
}
|
|
4135
3686
|
checkResourceValidators(httpReader, response);
|
|
4136
3687
|
setResourceValidators(httpReader, response);
|
|
@@ -4190,12 +3741,9 @@
|
|
|
4190
3741
|
if (response.status != 206) {
|
|
4191
3742
|
throw new Error(ERR_HTTP_RANGE);
|
|
4192
3743
|
}
|
|
4193
|
-
const
|
|
4194
|
-
if (
|
|
4195
|
-
|
|
4196
|
-
if (!Number.isNaN(rangeStart) && rangeStart != windowOffset) {
|
|
4197
|
-
throw new Error(ERR_HTTP_RANGE);
|
|
4198
|
-
}
|
|
3744
|
+
const rangeStart = getContentRangeOffset(response);
|
|
3745
|
+
if (rangeStart !== UNDEFINED_VALUE && rangeStart != windowOffset) {
|
|
3746
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
4199
3747
|
}
|
|
4200
3748
|
checkResourceValidators(httpReader, response);
|
|
4201
3749
|
setResourceValidators(httpReader, response);
|
|
@@ -4211,6 +3759,16 @@
|
|
|
4211
3759
|
}
|
|
4212
3760
|
}
|
|
4213
3761
|
|
|
3762
|
+
function getContentRangeOffset(response) {
|
|
3763
|
+
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
3764
|
+
if (contentRangeHeader) {
|
|
3765
|
+
const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
|
|
3766
|
+
if (!Number.isNaN(rangeStart)) {
|
|
3767
|
+
return rangeStart;
|
|
3768
|
+
}
|
|
3769
|
+
}
|
|
3770
|
+
}
|
|
3771
|
+
|
|
4214
3772
|
function getContentRangeSize(response) {
|
|
4215
3773
|
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
4216
3774
|
if (contentRangeHeader) {
|
|
@@ -6730,7 +6288,6 @@
|
|
|
6730
6288
|
rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
|
|
6731
6289
|
rawExtraField,
|
|
6732
6290
|
rawCentralExtraField: EMPTY_UINT8_ARRAY,
|
|
6733
|
-
extendedTimestamp: false,
|
|
6734
6291
|
headerArray,
|
|
6735
6292
|
headerView
|
|
6736
6293
|
});
|
|
@@ -7474,7 +7031,7 @@
|
|
|
7474
7031
|
}
|
|
7475
7032
|
}
|
|
7476
7033
|
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
|
|
7477
|
-
if (emptyEntry &&
|
|
7034
|
+
if (emptyEntry && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
|
|
7478
7035
|
dataDescriptor = false;
|
|
7479
7036
|
}
|
|
7480
7037
|
const zip64UncompressedSize = zip64Enabled || unknownSize || uncompressedSize >= MAX_32_BITS;
|
|
@@ -9084,7 +8641,7 @@
|
|
|
9084
8641
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
9085
8642
|
*/
|
|
9086
8643
|
|
|
9087
|
-
const VERSION = "2.
|
|
8644
|
+
const VERSION = "2.14.0";
|
|
9088
8645
|
|
|
9089
8646
|
/*
|
|
9090
8647
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9533,7 +9090,7 @@
|
|
|
9533
9090
|
// ignored
|
|
9534
9091
|
}
|
|
9535
9092
|
|
|
9536
|
-
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)});}
|
|
9093
|
+
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)});}
|
|
9537
9094
|
|
|
9538
9095
|
/*
|
|
9539
9096
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9570,13 +9127,13 @@
|
|
|
9570
9127
|
const FORMAT_DEFLATE64_RAW = "deflate64-raw";
|
|
9571
9128
|
const FORMAT_GZIP = "gzip";
|
|
9572
9129
|
|
|
9573
|
-
let wasm, malloc, free, memory, initError;
|
|
9130
|
+
let wasm$1, malloc, free, memory, initError;
|
|
9574
9131
|
|
|
9575
|
-
function setWasmExports(wasmAPI) {
|
|
9576
|
-
wasm = wasmAPI;
|
|
9577
|
-
({ malloc, free, memory } = wasm);
|
|
9132
|
+
function setWasmExports$1(wasmAPI) {
|
|
9133
|
+
wasm$1 = wasmAPI;
|
|
9134
|
+
({ malloc, free, memory } = wasm$1);
|
|
9578
9135
|
if (typeof malloc !== "function" || typeof free !== "function" || !memory) {
|
|
9579
|
-
wasm = malloc = free = memory = null;
|
|
9136
|
+
wasm$1 = malloc = free = memory = null;
|
|
9580
9137
|
throw new Error("Invalid WASM module");
|
|
9581
9138
|
}
|
|
9582
9139
|
}
|
|
@@ -9585,12 +9142,12 @@
|
|
|
9585
9142
|
initError = error;
|
|
9586
9143
|
}
|
|
9587
9144
|
|
|
9588
|
-
function resetWasmExports() {
|
|
9589
|
-
wasm = malloc = free = memory = initError = null;
|
|
9145
|
+
function resetWasmExports$1() {
|
|
9146
|
+
wasm$1 = malloc = free = memory = initError = null;
|
|
9590
9147
|
}
|
|
9591
9148
|
|
|
9592
9149
|
function _make(isCompress, type, options = {}) {
|
|
9593
|
-
if (!wasm) {
|
|
9150
|
+
if (!wasm$1) {
|
|
9594
9151
|
const error = new Error("WASM module not loaded");
|
|
9595
9152
|
error.cause = initError;
|
|
9596
9153
|
throw error;
|
|
@@ -9611,35 +9168,35 @@
|
|
|
9611
9168
|
}
|
|
9612
9169
|
this._scratch = new Uint8Array(outBufferSize);
|
|
9613
9170
|
if (isCompress) {
|
|
9614
|
-
this._process = wasm.deflate_process;
|
|
9615
|
-
this._last_consumed = wasm.deflate_last_consumed;
|
|
9616
|
-
this._end = wasm.deflate_end;
|
|
9617
|
-
this.streamHandle = wasm.deflate_new();
|
|
9171
|
+
this._process = wasm$1.deflate_process;
|
|
9172
|
+
this._last_consumed = wasm$1.deflate_last_consumed;
|
|
9173
|
+
this._end = wasm$1.deflate_end;
|
|
9174
|
+
this.streamHandle = wasm$1.deflate_new();
|
|
9618
9175
|
if (type === FORMAT_GZIP) {
|
|
9619
|
-
result = wasm.deflate_init_gzip(this.streamHandle, level);
|
|
9176
|
+
result = wasm$1.deflate_init_gzip(this.streamHandle, level);
|
|
9620
9177
|
} else if (type === FORMAT_DEFLATE_RAW) {
|
|
9621
|
-
result = wasm.deflate_init_raw(this.streamHandle, level);
|
|
9178
|
+
result = wasm$1.deflate_init_raw(this.streamHandle, level);
|
|
9622
9179
|
} else {
|
|
9623
|
-
result = wasm.deflate_init(this.streamHandle, level);
|
|
9180
|
+
result = wasm$1.deflate_init(this.streamHandle, level);
|
|
9624
9181
|
}
|
|
9625
9182
|
} else {
|
|
9626
9183
|
if (type === FORMAT_DEFLATE64_RAW) {
|
|
9627
|
-
this._process = wasm.inflate9_process;
|
|
9628
|
-
this._last_consumed = wasm.inflate9_last_consumed;
|
|
9629
|
-
this._end = wasm.inflate9_end;
|
|
9630
|
-
this.streamHandle = wasm.inflate9_new();
|
|
9631
|
-
result = wasm.inflate9_init_raw(this.streamHandle);
|
|
9184
|
+
this._process = wasm$1.inflate9_process;
|
|
9185
|
+
this._last_consumed = wasm$1.inflate9_last_consumed;
|
|
9186
|
+
this._end = wasm$1.inflate9_end;
|
|
9187
|
+
this.streamHandle = wasm$1.inflate9_new();
|
|
9188
|
+
result = wasm$1.inflate9_init_raw(this.streamHandle);
|
|
9632
9189
|
} else {
|
|
9633
|
-
this._process = wasm.inflate_process;
|
|
9634
|
-
this._last_consumed = wasm.inflate_last_consumed;
|
|
9635
|
-
this._end = wasm.inflate_end;
|
|
9636
|
-
this.streamHandle = wasm.inflate_new();
|
|
9190
|
+
this._process = wasm$1.inflate_process;
|
|
9191
|
+
this._last_consumed = wasm$1.inflate_last_consumed;
|
|
9192
|
+
this._end = wasm$1.inflate_end;
|
|
9193
|
+
this.streamHandle = wasm$1.inflate_new();
|
|
9637
9194
|
if (type === FORMAT_DEFLATE_RAW) {
|
|
9638
|
-
result = wasm.inflate_init_raw(this.streamHandle);
|
|
9195
|
+
result = wasm$1.inflate_init_raw(this.streamHandle);
|
|
9639
9196
|
} else if (type === FORMAT_GZIP) {
|
|
9640
|
-
result = wasm.inflate_init_gzip(this.streamHandle);
|
|
9197
|
+
result = wasm$1.inflate_init_gzip(this.streamHandle);
|
|
9641
9198
|
} else {
|
|
9642
|
-
result = wasm.inflate_init(this.streamHandle);
|
|
9199
|
+
result = wasm$1.inflate_init(this.streamHandle);
|
|
9643
9200
|
}
|
|
9644
9201
|
}
|
|
9645
9202
|
}
|
|
@@ -9774,6 +9331,105 @@
|
|
|
9774
9331
|
CompressionStreamZlib.supportedFormats = [FORMAT_DEFLATE, FORMAT_DEFLATE_RAW, FORMAT_GZIP];
|
|
9775
9332
|
DecompressionStreamZlib.supportedFormats = [FORMAT_DEFLATE, FORMAT_DEFLATE_RAW, FORMAT_GZIP, FORMAT_DEFLATE64_RAW];
|
|
9776
9333
|
|
|
9334
|
+
/*
|
|
9335
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
9336
|
+
|
|
9337
|
+
Redistribution and use in source and binary forms, with or without
|
|
9338
|
+
modification, are permitted provided that the following conditions are met:
|
|
9339
|
+
|
|
9340
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
9341
|
+
this list of conditions and the following disclaimer.
|
|
9342
|
+
|
|
9343
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
9344
|
+
notice, this list of conditions and the following disclaimer in
|
|
9345
|
+
the documentation and/or other materials provided with the distribution.
|
|
9346
|
+
|
|
9347
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
9348
|
+
derived from this software without specific prior written permission.
|
|
9349
|
+
|
|
9350
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
9351
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
9352
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
9353
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
9354
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
9355
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
9356
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
9357
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
9358
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
9359
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
9360
|
+
*/
|
|
9361
|
+
|
|
9362
|
+
|
|
9363
|
+
const BUFFER_LENGTH = 64 * 1024;
|
|
9364
|
+
const DIGEST_LENGTH = 20;
|
|
9365
|
+
|
|
9366
|
+
let wasm, buffer;
|
|
9367
|
+
|
|
9368
|
+
function setWasmExports(wasmAPI) {
|
|
9369
|
+
// deno-lint-ignore valid-typeof
|
|
9370
|
+
if (typeof wasmAPI.aes_hmac_new == FUNCTION_TYPE) {
|
|
9371
|
+
wasm = wasmAPI;
|
|
9372
|
+
buffer = 0;
|
|
9373
|
+
}
|
|
9374
|
+
}
|
|
9375
|
+
|
|
9376
|
+
function resetWasmExports() {
|
|
9377
|
+
wasm = null;
|
|
9378
|
+
buffer = 0;
|
|
9379
|
+
}
|
|
9380
|
+
|
|
9381
|
+
function createEngine(key, authenticationKey) {
|
|
9382
|
+
const exports = wasm;
|
|
9383
|
+
let context = exports ? createContext(exports, key, authenticationKey) : 0;
|
|
9384
|
+
if (!context) {
|
|
9385
|
+
return createEngine$2(key, authenticationKey);
|
|
9386
|
+
}
|
|
9387
|
+
const scratch = buffer;
|
|
9388
|
+
return {
|
|
9389
|
+
process(data, decrypt) {
|
|
9390
|
+
for (let offset = 0; offset < data.length; offset += BUFFER_LENGTH) {
|
|
9391
|
+
const chunk = data.subarray(offset, offset + BUFFER_LENGTH);
|
|
9392
|
+
const heap = getHeap(exports);
|
|
9393
|
+
heap.set(chunk, scratch);
|
|
9394
|
+
exports.aes_hmac_process(context, scratch, chunk.length, decrypt ? 1 : 0);
|
|
9395
|
+
chunk.set(heap.subarray(scratch, scratch + chunk.length));
|
|
9396
|
+
}
|
|
9397
|
+
},
|
|
9398
|
+
digest() {
|
|
9399
|
+
exports.aes_hmac_end(context, scratch);
|
|
9400
|
+
context = 0;
|
|
9401
|
+
return getHeap(exports).slice(scratch, scratch + DIGEST_LENGTH);
|
|
9402
|
+
},
|
|
9403
|
+
dispose() {
|
|
9404
|
+
if (context) {
|
|
9405
|
+
exports.aes_hmac_end(context, 0);
|
|
9406
|
+
context = 0;
|
|
9407
|
+
}
|
|
9408
|
+
}
|
|
9409
|
+
};
|
|
9410
|
+
}
|
|
9411
|
+
|
|
9412
|
+
function createContext(exports, key, authenticationKey) {
|
|
9413
|
+
if (!buffer) {
|
|
9414
|
+
buffer = exports.malloc(BUFFER_LENGTH);
|
|
9415
|
+
}
|
|
9416
|
+
const context = buffer ? exports.aes_hmac_new() : 0;
|
|
9417
|
+
if (context) {
|
|
9418
|
+
const heap = getHeap(exports);
|
|
9419
|
+
heap.set(key, buffer);
|
|
9420
|
+
heap.set(authenticationKey, buffer + key.length);
|
|
9421
|
+
if (exports.aes_hmac_init(context, buffer, key.length, buffer + key.length, authenticationKey.length)) {
|
|
9422
|
+
exports.aes_hmac_end(context, 0);
|
|
9423
|
+
return 0;
|
|
9424
|
+
}
|
|
9425
|
+
}
|
|
9426
|
+
return context;
|
|
9427
|
+
}
|
|
9428
|
+
|
|
9429
|
+
function getHeap(exports) {
|
|
9430
|
+
return new Uint8Array(exports.memory.buffer);
|
|
9431
|
+
}
|
|
9432
|
+
|
|
9777
9433
|
/*
|
|
9778
9434
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
9779
9435
|
|
|
@@ -9835,11 +9491,13 @@
|
|
|
9835
9491
|
}
|
|
9836
9492
|
}
|
|
9837
9493
|
const wasmInstance = await WebAssembly.instantiate(arrayBuffer);
|
|
9494
|
+
setWasmExports$1(wasmInstance.instance.exports);
|
|
9838
9495
|
setWasmExports(wasmInstance.instance.exports);
|
|
9839
9496
|
}
|
|
9840
9497
|
|
|
9841
9498
|
function resetWasmModule() {
|
|
9842
9499
|
initializedModule = false;
|
|
9500
|
+
resetWasmExports$1();
|
|
9843
9501
|
resetWasmExports();
|
|
9844
9502
|
}
|
|
9845
9503
|
|
|
@@ -9885,6 +9543,7 @@
|
|
|
9885
9543
|
|
|
9886
9544
|
let modulePromise;
|
|
9887
9545
|
|
|
9546
|
+
setAESEngine(createEngine);
|
|
9888
9547
|
configureWorker({
|
|
9889
9548
|
initModule: config => {
|
|
9890
9549
|
if (!modulePromise) {
|
|
@@ -9941,7 +9600,7 @@
|
|
|
9941
9600
|
*/
|
|
9942
9601
|
|
|
9943
9602
|
|
|
9944
|
-
|
|
9603
|
+
o(setDefaultConfiguration);
|
|
9945
9604
|
|
|
9946
9605
|
/*
|
|
9947
9606
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -10414,12 +10073,16 @@
|
|
|
10414
10073
|
let directoryEntry = parent;
|
|
10415
10074
|
if (name) {
|
|
10416
10075
|
directoryEntry = parent.getChildByName(name);
|
|
10417
|
-
if (directoryEntry && !directoryEntry.directory) {
|
|
10076
|
+
if (directoryEntry && (!directoryEntry.directory || directoryEntry.data)) {
|
|
10418
10077
|
if (duplicates == DUPLICATES_KEEP_FIRST) {
|
|
10419
10078
|
continue;
|
|
10420
10079
|
} else if (duplicates == DUPLICATES_KEEP_LAST) {
|
|
10421
|
-
|
|
10422
|
-
|
|
10080
|
+
if (directoryEntry.directory) {
|
|
10081
|
+
directoryEntry.data = entry;
|
|
10082
|
+
} else {
|
|
10083
|
+
this.fs.remove(directoryEntry);
|
|
10084
|
+
directoryEntry = UNDEFINED_VALUE;
|
|
10085
|
+
}
|
|
10423
10086
|
} else {
|
|
10424
10087
|
throw new Error(ERR_DUPLICATE_IMPORTED_ENTRY);
|
|
10425
10088
|
}
|