@zip.js/zip.js 2.13.1 → 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.
Files changed (49) hide show
  1. package/BENCHMARKS.md +46 -1
  2. package/deno.json +1 -1
  3. package/dist/zip-core-external.js +559 -924
  4. package/dist/zip-core-external.min.js +1 -1
  5. package/dist/zip-core.js +426 -897
  6. package/dist/zip-core.min.js +1 -1
  7. package/dist/zip-fs-core-external.js +566 -927
  8. package/dist/zip-fs-core-external.min.js +1 -1
  9. package/dist/zip-fs-core.js +433 -900
  10. package/dist/zip-fs-core.min.js +1 -1
  11. package/dist/zip-fs-external.js +566 -927
  12. package/dist/zip-fs-external.min.js +1 -1
  13. package/dist/zip-fs-native.js +435 -902
  14. package/dist/zip-fs-native.min.js +1 -1
  15. package/dist/zip-fs.js +569 -930
  16. package/dist/zip-fs.min.js +1 -1
  17. package/dist/zip-legacy.js +428 -899
  18. package/dist/zip-legacy.min.js +1 -1
  19. package/dist/zip-module.wasm +0 -0
  20. package/dist/zip-native.js +428 -899
  21. package/dist/zip-native.min.js +1 -1
  22. package/dist/zip-web-worker-native.js +1 -1
  23. package/dist/zip-web-worker.js +1 -1
  24. package/dist/zip.js +562 -927
  25. package/dist/zip.min.js +1 -1
  26. package/index-native.cjs +435 -902
  27. package/index-native.min.js +1 -1
  28. package/index.cjs +569 -930
  29. package/index.d.cts +52 -12
  30. package/index.d.ts +52 -12
  31. package/index.min.js +1 -1
  32. package/lib/core/codec-worker.js +33 -23
  33. package/lib/core/io.js +29 -21
  34. package/lib/core/streams/aes-crypto-stream.js +58 -99
  35. package/lib/core/streams/codecs/aes-hmac-sha1.js +348 -0
  36. package/lib/core/streams/zlib-wasm/aes-hmac-sha1-wasm.js +106 -0
  37. package/lib/core/streams/zlib-wasm/zlib-streams-loader.js +4 -0
  38. package/lib/core/streams/zlib-wasm/zlib-streams.wasm +0 -0
  39. package/lib/core/version.js +1 -1
  40. package/lib/core/web-worker-base.js +15 -9
  41. package/lib/core/web-worker-inline-native.js +1 -1
  42. package/lib/core/web-worker-inline-wasm.js +1 -1
  43. package/lib/core/web-worker-wasm.js +2 -0
  44. package/lib/core/zip-fs.js +7 -3
  45. package/lib/core/zip-writer.js +1 -2
  46. package/lib/core/zlib-streams-inline.js +1 -1
  47. package/lib/zip-module-wasm-base.js +3 -1
  48. package/package.json +1 -1
  49. package/lib/core/streams/codecs/sjcl.js +0 -795
package/index-native.cjs CHANGED
@@ -439,7 +439,7 @@ function resetConfiguration() {
439
439
  Object.assign(config, DEFAULT_CONFIGURATION);
440
440
  }
441
441
 
442
- 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],o=[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],r=[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],n=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],A=new Uint8Array(288);A.fill(8,0,144),A.fill(9,144,256),A.fill(7,256,280),A.fill(8,280,288);const s=new Uint8Array(30).fill(5);function B(t){const o=new Uint16Array(16);for(const r of t)o[r]++;o[0]=0;const r=new Uint16Array(17);for(let t=1;t<=15;t++)r[t+1]=r[t]+o[t];const e=new Uint16Array(t.length);for(let o=0;o<t.length;o++)t[o]&&(e[r[t[o]]++]=o);return {o:o,symbols:e}}const l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=(z$1=()=>function(l){let i=0,z=0,V=0,w=new Uint8Array(1024),F=0,a=0;for(;!a;){a=d(1);const t=d(2);if(0==t)b();else if(1==t)f(B(A),B(s));else {if(2!=t)throw new Error("invalid deflate block type");f(...N());}}return w.subarray(0,F);function g(){if(i>=l.length)throw new Error("unexpected end of deflate data");return l[i++]}function d(t){for(;V<t;)z|=g()<<V,V+=8;const o=z&(1<<t)-1;return z>>>=t,V-=t,o}function b(){z=0,V=0;const t=g()|g()<<8;i+=2,v(F+t);for(let o=0;o<t;o++)w[F++]=g();}function f(n,A){let s=u(n);for(;256!=s;){if(s<256)v(F+1),w[F++]=s;else {const n=s-257,B=t[n]+d(o[n]),l=u(A),i=r[l]+d(e[l]);v(F+B);const z=F-i;for(let t=0;t<B;t++)w[F++]=w[z+t];}s=u(n);}}function N(){const t=d(5)+257,o=d(5)+1,r=d(4)+4,e=new Uint8Array(19);for(let t=0;t<r;t++)e[n[t]]=d(3);const A=B(e),s=new Uint8Array(t+o);let l=0;for(;l<s.length;){const t=u(A);if(t<16)s[l++]=t;else if(16==t){const t=s[l-1];let o=d(2)+3;for(;o--;)s[l++]=t;}else l+=17==t?d(3)+3:d(7)+11;}return [B(s.subarray(0,t)),B(s.subarray(t))]}function u(t){const{o:o,symbols:r}=t;let e=0,n=0,A=0;for(let t=1;t<=15;t++){e|=d(1);const s=o[t];if(e-n<s)return r[A+(e-n)];A+=s,n=n+s<<1,e<<=1;}throw new Error("invalid huffman code")}function v(t){if(w.length<t){let o=2*w.length;for(;o<t;)o*=2;const r=new Uint8Array(o);r.set(w.subarray(0,F)),w=r;}}}(function(t){const o=(t=String(t).replace(/[^A-Za-z0-9+/=]/g,"")).length,r=[];for(let e=0;e<o;e+=4){const o=l.indexOf(t[e])<<18|l.indexOf(t[e+1])<<12|(63&l.indexOf(t[e+2]))<<6|63&l.indexOf(t[e+3]);r.push(o>>16&255),"="!==t[e+2]&&r.push(o>>8&255),"="!==t[e+3]&&r.push(255&o);}return new Uint8Array(r)}("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")),t=>t({workerURI:t=>{const o="text/javascript";let r=z$1();if("string"==typeof r&&(r=(new TextEncoder).encode(r)),t){const t=new Blob([r],{type:o});return URL.createObjectURL(t)}return "data:"+o+";base64,"+function(t){let o="";const r=t.length;let e=0;for(;e+2<r;e+=3){const r=t[e]<<16|t[e+1]<<8|t[e+2];o+=l[r>>18&63]+l[r>>12&63]+l[r>>6&63]+l[63&r];}const n=r-e;if(1===n){const r=t[e]<<16;o+=l[r>>18&63]+l[r>>12&63]+"==";}else if(2===n){const r=t[e]<<16|t[e+1]<<8;o+=l[r>>18&63]+l[r>>12&63]+l[r>>6&63]+"=";}return o}(r)}}));var z$1;
442
+ const n=[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],t=[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],r=[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],f=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],q$1=new Uint8Array(288);q$1.fill(8,0,144),q$1.fill(9,144,256),q$1.fill(7,256,280),q$1.fill(8,280,288);const o=new Uint8Array(30).fill(5);function u(n){const e=new Uint16Array(16);for(const t of n)e[t]++;e[0]=0;const t=new Uint16Array(17);for(let n=1;n<=15;n++)t[n+1]=t[n]+e[n];const r=new Uint16Array(n.length);for(let e=0;e<n.length;e++)n[e]&&(r[t[n[e]]++]=e);return {o:e,symbols:r}}const v="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",c=(a=()=>function(v){let c=0,a=0,y=0,V=new Uint8Array(1024),z=0,i=0;for(;!i;){i=P(1);const n=P(2);if(0==n)j();else if(1==n)T(u(q$1),u(o));else {if(2!=n)throw new Error("invalid deflate block type");T(...O());}}return V.subarray(0,z);function X(){if(c>=v.length)throw new Error("unexpected end of deflate data");return v[c++]}function P(n){for(;y<n;)a|=X()<<y,y+=8;const e=a&(1<<n)-1;return a>>>=n,y-=n,e}function j(){a=0,y=0;const n=X()|X()<<8;c+=2,h(z+n);for(let e=0;e<n;e++)V[z++]=X();}function T(f,q){let o=C(f);for(;256!=o;){if(o<256)h(z+1),V[z++]=o;else {const f=o-257,u=n[f]+P(e[f]),v=C(q),c=t[v]+P(r[v]);h(z+u);const a=z-c;for(let n=0;n<u;n++)V[z++]=V[a+n];}o=C(f);}}function O(){const n=P(5)+257,e=P(5)+1,t=P(4)+4,r=new Uint8Array(19);for(let n=0;n<t;n++)r[f[n]]=P(3);const q=u(r),o=new Uint8Array(n+e);let v=0;for(;v<o.length;){const n=C(q);if(n<16)o[v++]=n;else if(16==n){const n=o[v-1];let e=P(2)+3;for(;e--;)o[v++]=n;}else v+=17==n?P(3)+3:P(7)+11;}return [u(o.subarray(0,n)),u(o.subarray(n))]}function C(n){const{o:e,symbols:t}=n;let r=0,f=0,q=0;for(let n=1;n<=15;n++){r|=P(1);const o=e[n];if(r-f<o)return t[q+(r-f)];q+=o,f=f+o<<1,r<<=1;}throw new Error("invalid huffman code")}function h(n){if(V.length<n){let e=2*V.length;for(;e<n;)e*=2;const t=new Uint8Array(e);t.set(V.subarray(0,z)),V=t;}}}(function(n){const e=(n=String(n).replace(/[^A-Za-z0-9+/=]/g,"")).length,t=[];for(let r=0;r<e;r+=4){const e=v.indexOf(n[r])<<18|v.indexOf(n[r+1])<<12|(63&v.indexOf(n[r+2]))<<6|63&v.indexOf(n[r+3]);t.push(e>>16&255),"="!==n[r+2]&&t.push(e>>8&255),"="!==n[r+3]&&t.push(255&e);}return new Uint8Array(t)}("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")),n=>n({workerURI:n=>{const e="text/javascript";let t=a();if("string"==typeof t&&(t=(new TextEncoder).encode(t)),n){const n=new Blob([t],{type:e});return URL.createObjectURL(n)}return "data:"+e+";base64,"+function(n){let e="";const t=n.length;let r=0;for(;r+2<t;r+=3){const t=n[r]<<16|n[r+1]<<8|n[r+2];e+=v[t>>18&63]+v[t>>12&63]+v[t>>6&63]+v[63&t];}const f=t-r;if(1===f){const t=n[r]<<16;e+=v[t>>18&63]+v[t>>12&63]+"==";}else if(2===f){const t=n[r]<<16|n[r+1]<<8;e+=v[t>>18&63]+v[t>>12&63]+v[t>>6&63]+"=";}return e}(t)}}));var a;
443
443
 
444
444
  /*
445
445
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -569,7 +569,7 @@ for (let n = 0; n < 256; n++) {
569
569
  T$1[k][n] = (previous >>> 8) ^ T$1[0][previous & 0xFF];
570
570
  }
571
571
  }
572
- const [T0, T1, T2, T3, T4, T5, T6, T7] = T$1;
572
+ const [T0$1, T1$1, T2$1, T3$1, T4, T5, T6, T7] = T$1;
573
573
 
574
574
  class Crc32 {
575
575
 
@@ -591,12 +591,12 @@ class Crc32 {
591
591
  const a = crc ^ view.getInt32(offset, true);
592
592
  const b = view.getInt32(offset + 4, true);
593
593
  crc = T7[a & 0xFF] ^ T6[(a >>> 8) & 0xFF] ^ T5[(a >>> 16) & 0xFF] ^ T4[(a >>> 24) & 0xFF] ^
594
- T3[b & 0xFF] ^ T2[(b >>> 8) & 0xFF] ^ T1[(b >>> 16) & 0xFF] ^ T0[(b >>> 24) & 0xFF];
594
+ T3$1[b & 0xFF] ^ T2$1[(b >>> 8) & 0xFF] ^ T1$1[(b >>> 16) & 0xFF] ^ T0$1[(b >>> 24) & 0xFF];
595
595
  }
596
596
  }
597
597
  // Remaining tail (and non-typed inputs) byte-at-a-time with the base table.
598
598
  for (; offset < length; offset++) {
599
- crc = (crc >>> 8) ^ T0[(crc ^ data[offset]) & 0xFF];
599
+ crc = (crc >>> 8) ^ T0$1[(crc ^ data[offset]) & 0xFF];
600
600
  }
601
601
  this.crc = crc;
602
602
  }
@@ -700,794 +700,349 @@ function encodeText(value) {
700
700
  }
701
701
  }
702
702
 
703
- // Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
704
-
705
- // deno-lint-ignore-file no-this-alias
706
-
707
703
  /*
708
- * SJCL is open. You can use, modify and redistribute it under a BSD
709
- * license or under the GNU GPL, version 2.0.
710
- */
711
-
712
- /** @fileOverview Javascript cryptography implementation.
713
- *
714
- * Crush to remove comments, shorten variable names and
715
- * generally reduce transmission size.
716
- *
717
- * @author Emily Stark
718
- * @author Mike Hamburg
719
- * @author Dan Boneh
720
- */
721
-
722
- /*jslint indent: 2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */
723
-
724
- /** @fileOverview Arrays of bits, encoded as arrays of Numbers.
725
- *
726
- * @author Emily Stark
727
- * @author Mike Hamburg
728
- * @author Dan Boneh
729
- */
730
-
731
- /**
732
- * Arrays of bits, encoded as arrays of Numbers.
733
- * @namespace
734
- * @description
735
- * <p>
736
- * These objects are the currency accepted by SJCL's crypto functions.
737
- * </p>
738
- *
739
- * <p>
740
- * Most of our crypto primitives operate on arrays of 4-byte words internally,
741
- * but many of them can take arguments that are not a multiple of 4 bytes.
742
- * This library encodes arrays of bits (whose size need not be a multiple of 8
743
- * bits) as arrays of 32-bit words. The bits are packed, big-endian, into an
744
- * array of words, 32 bits at a time. Since the words are double-precision
745
- * floating point numbers, they fit some extra data. We use this (in a private,
746
- * possibly-changing manner) to encode the number of bits actually present
747
- * in the last word of the array.
748
- * </p>
749
- *
750
- * <p>
751
- * Because bitwise ops clear this out-of-band data, these arrays can be passed
752
- * to ciphers like AES which want arrays of words.
753
- * </p>
754
- */
755
- const bitArray = {
756
- /**
757
- * Concatenate two bit arrays.
758
- * @param {bitArray} a1 The first array.
759
- * @param {bitArray} a2 The second array.
760
- * @return {bitArray} The concatenation of a1 and a2.
761
- */
762
- concat(a1, a2) {
763
- if (a1.length === 0 || a2.length === 0) {
764
- return a1.concat(a2);
765
- }
766
-
767
- const last = a1[a1.length - 1], shift = bitArray.getPartial(last);
768
- if (shift === 32) {
769
- return a1.concat(a2);
770
- } else {
771
- return bitArray._shiftRight(a2, shift, last | 0, a1.slice(0, a1.length - 1));
772
- }
773
- },
774
-
775
- /**
776
- * Find the length of an array of bits.
777
- * @param {bitArray} a The array.
778
- * @return {Number} The length of a, in bits.
779
- */
780
- bitLength(a) {
781
- const l = a.length;
782
- if (l === 0) {
783
- return 0;
784
- }
785
- const x = a[l - 1];
786
- return (l - 1) * 32 + bitArray.getPartial(x);
787
- },
788
-
789
- /**
790
- * Truncate an array.
791
- * @param {bitArray} a The array.
792
- * @param {Number} len The length to truncate to, in bits.
793
- * @return {bitArray} A new array, truncated to len bits.
794
- */
795
- clamp(a, len) {
796
- if (a.length * 32 < len) {
797
- return a;
798
- }
799
- a = a.slice(0, Math.ceil(len / 32));
800
- const l = a.length;
801
- len = len & 31;
802
- if (l > 0 && len) {
803
- a[l - 1] = bitArray.partial(len, a[l - 1] & 0x80000000 >> (len - 1), 1);
804
- }
805
- return a;
806
- },
807
-
808
- /**
809
- * Make a partial word for a bit array.
810
- * @param {Number} len The number of bits in the word.
811
- * @param {Number} x The bits.
812
- * @param {Number} [_end=0] Pass 1 if x has already been shifted to the high side.
813
- * @return {Number} The partial word.
814
- */
815
- partial(len, x, _end) {
816
- if (len === 32) {
817
- return x;
818
- }
819
- return (_end ? x | 0 : x << (32 - len)) + len * 0x10000000000;
820
- },
704
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
821
705
 
822
- /**
823
- * Get the number of bits used by a partial word.
824
- * @param {Number} x The partial word.
825
- * @return {Number} The number of bits used by the partial word.
826
- */
827
- getPartial(x) {
828
- return Math.round(x / 0x10000000000) || 32;
829
- },
706
+ Redistribution and use in source and binary forms, with or without
707
+ modification, are permitted provided that the following conditions are met:
830
708
 
831
- /** Shift an array right.
832
- * @param {bitArray} a The array to shift.
833
- * @param {Number} shift The number of bits to shift.
834
- * @param {Number} [carry=0] A byte to carry in
835
- * @param {bitArray} [out=[]] An array to prepend to the output.
836
- * @private
837
- */
838
- _shiftRight(a, shift, carry, out) {
839
- if (out === undefined) {
840
- out = [];
841
- }
709
+ 1. Redistributions of source code must retain the above copyright notice,
710
+ this list of conditions and the following disclaimer.
842
711
 
843
- for (; shift >= 32; shift -= 32) {
844
- out.push(carry);
845
- carry = 0;
846
- }
847
- if (shift === 0) {
848
- return out.concat(a);
849
- }
712
+ 2. Redistributions in binary form must reproduce the above copyright
713
+ notice, this list of conditions and the following disclaimer in
714
+ the documentation and/or other materials provided with the distribution.
850
715
 
851
- for (let i = 0; i < a.length; i++) {
852
- out.push(carry | a[i] >>> shift);
853
- carry = a[i] << (32 - shift);
854
- }
855
- const last2 = a.length ? a[a.length - 1] : 0;
856
- const shift2 = bitArray.getPartial(last2);
857
- out.push(bitArray.partial(shift + shift2 & 31, (shift + shift2 > 32) ? carry : out.pop(), 1));
858
- return out;
859
- }
860
- };
716
+ 3. The names of the authors may not be used to endorse or promote products
717
+ derived from this software without specific prior written permission.
861
718
 
862
- /** @fileOverview Bit array codec implementations.
863
- *
864
- * @author Emily Stark
865
- * @author Mike Hamburg
866
- * @author Dan Boneh
719
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
720
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
721
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
722
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
723
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
724
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
725
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
726
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
727
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
728
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
867
729
  */
868
730
 
869
- /**
870
- * Arrays of bytes
871
- * @namespace
872
- */
873
- const codec = {
874
- bytes: {
875
- /** Convert from a bitArray to an array of bytes. */
876
- fromBits(arr) {
877
- const bl = bitArray.bitLength(arr);
878
- const byteLength = bl / 8;
879
- const out = new Uint8Array(byteLength);
880
- let tmp;
881
- for (let i = 0; i < byteLength; i++) {
882
- if ((i & 3) === 0) {
883
- tmp = arr[i / 4];
884
- }
885
- out[i] = tmp >>> 24;
886
- tmp <<= 8;
887
- }
888
- return out;
889
- },
890
- /** Convert from an array of bytes to a bitArray. */
891
- toBits(bytes) {
892
- const out = [];
893
- let i;
894
- let tmp = 0;
895
- for (i = 0; i < bytes.length; i++) {
896
- tmp = tmp << 8 | bytes[i];
897
- if ((i & 3) === 3) {
898
- out.push(tmp);
899
- tmp = 0;
900
- }
731
+ const BLOCK_LENGTH$1 = 16;
732
+ const ROUND_KEYS_LENGTH = 60;
733
+ const SHA1_BLOCK_LENGTH = 64;
734
+ const SHA1_DIGEST_LENGTH = 20;
735
+ const SHA1_SCHEDULE_LENGTH = 80;
736
+ const SHA1_LENGTH_OFFSET = 56;
737
+ const SHA1_PADDING = new Uint8Array([0x80]);
738
+ const SHA1_ZERO = new Uint8Array(1);
739
+ const SHA1_INITIAL_STATE = new Int32Array([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
740
+ const HMAC_INNER_PADDING = 0x36;
741
+ const HMAC_OUTER_PADDING = 0x5c;
742
+ const S_BOX = new Uint8Array(256);
743
+ const T0 = new Int32Array(256);
744
+ const T1 = new Int32Array(256);
745
+ const T2 = new Int32Array(256);
746
+ const T3 = new Int32Array(256);
747
+
748
+ let tablesInitialized = false;
749
+
750
+ function createEngine$1(key, authenticationKey) {
751
+ initTables();
752
+ const roundKeys = new Int32Array(ROUND_KEYS_LENGTH);
753
+ const rounds = expandKey(key, roundKeys);
754
+ const counter = new Uint8Array(BLOCK_LENGTH$1);
755
+ const keystream = new Int32Array(BLOCK_LENGTH$1 / 4);
756
+ const hmac = createHmac(authenticationKey);
757
+ return {
758
+ process(data, decrypt) {
759
+ if (decrypt) {
760
+ hmac.update(data, 0, data.length);
901
761
  }
902
- if (i & 3) {
903
- out.push(bitArray.partial(8 * (i & 3), tmp));
762
+ encrypt(data);
763
+ if (!decrypt) {
764
+ hmac.update(data, 0, data.length);
904
765
  }
905
- return out;
906
- }
907
- }
908
- };
909
-
910
- const hash = {};
911
-
912
- /**
913
- * Context for a SHA-1 operation in progress.
914
- * @constructor
915
- */
916
- hash.sha1 = class {
917
- constructor(hash) {
918
- const sha1 = this;
919
- /**
920
- * The hash's block size, in bits.
921
- * @constant
922
- */
923
- sha1.blockSize = 512;
924
- /**
925
- * The SHA-1 initialization vector.
926
- * @private
927
- */
928
- sha1._init = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0];
929
- /**
930
- * The SHA-1 hash key.
931
- * @private
932
- */
933
- sha1._key = [0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6];
934
- if (hash) {
935
- sha1._h = hash._h.slice(0);
936
- sha1._buffer = hash._buffer.slice(0);
937
- sha1._length = hash._length;
938
- } else {
939
- sha1.reset();
940
- }
941
- }
942
-
943
- /**
944
- * Reset the hash state.
945
- * @return this
946
- */
947
- reset() {
948
- const sha1 = this;
949
- sha1._h = sha1._init.slice(0);
950
- sha1._buffer = [];
951
- sha1._length = 0;
952
- return sha1;
953
- }
954
-
955
- /**
956
- * Input several words to the hash.
957
- * @param {bitArray|String} data the data to hash.
958
- * @return this
959
- */
960
- update(data) {
961
- const sha1 = this;
962
- if (typeof data === "string") {
963
- data = codec.utf8String.toBits(data);
964
- }
965
- const b = sha1._buffer = bitArray.concat(sha1._buffer, data);
966
- const ol = sha1._length;
967
- const nl = sha1._length = ol + bitArray.bitLength(data);
968
- if (nl > 9007199254740991) {
969
- throw new Error("Cannot hash more than 2^53 - 1 bits");
970
- }
971
- const c = new Uint32Array(b);
972
- let j = 0;
973
- for (let i = sha1.blockSize + ol - ((sha1.blockSize + ol) & (sha1.blockSize - 1)); i <= nl;
974
- i += sha1.blockSize) {
975
- sha1._block(c.subarray(16 * j, 16 * (j + 1)));
976
- j += 1;
977
- }
978
- b.splice(0, 16 * j);
979
- return sha1;
980
- }
981
-
982
- /**
983
- * Complete hashing and output the hash value.
984
- * @return {bitArray} The hash value, an array of 5 big-endian words. TODO
985
- */
986
- finalize() {
987
- const sha1 = this;
988
- let b = sha1._buffer;
989
- const h = sha1._h;
990
-
991
- // Round out and push the buffer
992
- b = bitArray.concat(b, [bitArray.partial(1, 1)]);
993
- // Round out the buffer to a multiple of 16 words, less the 2 length words.
994
- for (let i = b.length + 2; i & 15; i++) {
995
- b.push(0);
996
- }
997
-
998
- // append the length
999
- b.push(Math.floor(sha1._length / 0x100000000));
1000
- b.push(sha1._length | 0);
1001
-
1002
- while (b.length) {
1003
- sha1._block(b.splice(0, 16));
1004
- }
1005
-
1006
- sha1.reset();
1007
- return h;
1008
- }
1009
-
1010
- /**
1011
- * The SHA-1 logical functions f(0), f(1), ..., f(79).
1012
- * @private
1013
- */
1014
- _f(t, b, c, d) {
1015
- if (t <= 19) {
1016
- return (b & c) | (~b & d);
1017
- } else if (t <= 39) {
1018
- return b ^ c ^ d;
1019
- } else if (t <= 59) {
1020
- return (b & c) | (b & d) | (c & d);
1021
- } else if (t <= 79) {
1022
- return b ^ c ^ d;
1023
- }
1024
- }
1025
-
1026
- /**
1027
- * Circular left-shift operator.
1028
- * @private
1029
- */
1030
- _S(n, x) {
1031
- return (x << n) | (x >>> 32 - n);
1032
- }
1033
-
1034
- /**
1035
- * Perform one cycle of SHA-1.
1036
- * @param {Uint32Array|bitArray} words one block of words.
1037
- * @private
1038
- */
1039
- _block(words) {
1040
- const sha1 = this;
1041
- const h = sha1._h;
1042
- // When words is passed to _block, it has 16 elements. SHA1 _block
1043
- // function extends words with new elements (at the end there are 80 elements).
1044
- // The problem is that if we use Uint32Array instead of Array,
1045
- // the length of Uint32Array cannot be changed. Thus, we replace words with a
1046
- // normal Array here.
1047
- const w = Array(80); // do not use Uint32Array here as the instantiation is slower
1048
- for (let j = 0; j < 16; j++) {
1049
- w[j] = words[j];
1050
- }
1051
-
1052
- let a = h[0];
1053
- let b = h[1];
1054
- let c = h[2];
1055
- let d = h[3];
1056
- let e = h[4];
1057
-
1058
- for (let t = 0; t <= 79; t++) {
1059
- if (t >= 16) {
1060
- w[t] = sha1._S(1, w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16]);
1061
- }
1062
- const tmp = (sha1._S(5, a) + sha1._f(t, b, c, d) + e + w[t] +
1063
- sha1._key[Math.floor(t / 20)]) | 0;
1064
- e = d;
1065
- d = c;
1066
- c = sha1._S(30, b);
1067
- b = a;
1068
- a = tmp;
766
+ },
767
+ digest() {
768
+ return hmac.digest();
1069
769
  }
770
+ };
1070
771
 
1071
- h[0] = (h[0] + a) | 0;
1072
- h[1] = (h[1] + b) | 0;
1073
- h[2] = (h[2] + c) | 0;
1074
- h[3] = (h[3] + d) | 0;
1075
- h[4] = (h[4] + e) | 0;
772
+ function encrypt(data) {
773
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
774
+ const length = data.length;
775
+ let offset = 0;
776
+ for (; offset + BLOCK_LENGTH$1 <= length; offset += BLOCK_LENGTH$1) {
777
+ nextKeystream();
778
+ view.setInt32(offset, view.getInt32(offset) ^ keystream[0]);
779
+ view.setInt32(offset + 4, view.getInt32(offset + 4) ^ keystream[1]);
780
+ view.setInt32(offset + 8, view.getInt32(offset + 8) ^ keystream[2]);
781
+ view.setInt32(offset + 12, view.getInt32(offset + 12) ^ keystream[3]);
782
+ }
783
+ if (offset < length) {
784
+ nextKeystream();
785
+ for (let indexByte = 0; offset < length; offset++, indexByte++) {
786
+ data[offset] ^= keystream[indexByte >> 2] >>> (24 - 8 * (indexByte & 3));
787
+ }
788
+ }
789
+ }
790
+
791
+ function nextKeystream() {
792
+ for (let indexByte = 0; indexByte < BLOCK_LENGTH$1; indexByte++) {
793
+ counter[indexByte]++;
794
+ if (counter[indexByte] !== 0) {
795
+ break;
796
+ }
797
+ }
798
+ let s0 = ((counter[0] << 24) | (counter[1] << 16) | (counter[2] << 8) | counter[3]) ^ roundKeys[0];
799
+ let s1 = ((counter[4] << 24) | (counter[5] << 16) | (counter[6] << 8) | counter[7]) ^ roundKeys[1];
800
+ let s2 = ((counter[8] << 24) | (counter[9] << 16) | (counter[10] << 8) | counter[11]) ^ roundKeys[2];
801
+ let s3 = ((counter[12] << 24) | (counter[13] << 16) | (counter[14] << 8) | counter[15]) ^ roundKeys[3];
802
+ let indexKey = 4;
803
+ for (let round = 1; round < rounds; round++, indexKey += 4) {
804
+ const t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[indexKey];
805
+ const t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[indexKey + 1];
806
+ const t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[indexKey + 2];
807
+ const t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[indexKey + 3];
808
+ s0 = t0;
809
+ s1 = t1;
810
+ s2 = t2;
811
+ s3 = t3;
812
+ }
813
+ keystream[0] = ((S_BOX[s0 >>> 24] << 24) | (S_BOX[(s1 >>> 16) & 255] << 16) | (S_BOX[(s2 >>> 8) & 255] << 8) | S_BOX[s3 & 255]) ^ roundKeys[indexKey];
814
+ keystream[1] = ((S_BOX[s1 >>> 24] << 24) | (S_BOX[(s2 >>> 16) & 255] << 16) | (S_BOX[(s3 >>> 8) & 255] << 8) | S_BOX[s0 & 255]) ^ roundKeys[indexKey + 1];
815
+ keystream[2] = ((S_BOX[s2 >>> 24] << 24) | (S_BOX[(s3 >>> 16) & 255] << 16) | (S_BOX[(s0 >>> 8) & 255] << 8) | S_BOX[s1 & 255]) ^ roundKeys[indexKey + 2];
816
+ keystream[3] = ((S_BOX[s3 >>> 24] << 24) | (S_BOX[(s0 >>> 16) & 255] << 16) | (S_BOX[(s1 >>> 8) & 255] << 8) | S_BOX[s2 & 255]) ^ roundKeys[indexKey + 3];
817
+ }
818
+ }
819
+
820
+ function pbkdf2(password, salt, iterations, length) {
821
+ const hmac = createHmac(password);
822
+ const result = new Uint8Array(length);
823
+ const block = new Uint8Array(salt.length + 4);
824
+ const blockView = new DataView(block.buffer);
825
+ block.set(salt);
826
+ for (let indexBlock = 1, offset = 0; offset < length; indexBlock++, offset += SHA1_DIGEST_LENGTH) {
827
+ blockView.setUint32(salt.length, indexBlock);
828
+ hmac.update(block, 0, block.length);
829
+ let previous = hmac.digest();
830
+ const output = previous.slice();
831
+ for (let iteration = 1; iteration < iterations; iteration++) {
832
+ hmac.update(previous, 0, SHA1_DIGEST_LENGTH);
833
+ previous = hmac.digest();
834
+ for (let indexByte = 0; indexByte < SHA1_DIGEST_LENGTH; indexByte++) {
835
+ output[indexByte] ^= previous[indexByte];
836
+ }
837
+ }
838
+ result.set(output.subarray(0, Math.min(SHA1_DIGEST_LENGTH, length - offset)), offset);
1076
839
  }
1077
- };
1078
-
1079
- /** @fileOverview Low-level AES implementation.
1080
- *
1081
- * This file contains a low-level implementation of AES, optimized for
1082
- * size and for efficiency on several browsers. It is based on
1083
- * OpenSSL's aes_core.c, a public-domain implementation by Vincent
1084
- * Rijmen, Antoon Bosselaers and Paulo Barreto.
1085
- *
1086
- * An older version of this implementation is available in the public
1087
- * domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh,
1088
- * Stanford University 2008-2010 and BSD-licensed for liability
1089
- * reasons.
1090
- *
1091
- * @author Emily Stark
1092
- * @author Mike Hamburg
1093
- * @author Dan Boneh
1094
- */
1095
-
1096
- const cipher = {};
1097
-
1098
- /**
1099
- * Schedule out an AES key for both encryption and decryption. This
1100
- * is a low-level class. Use a cipher mode to do bulk encryption.
1101
- *
1102
- * @constructor
1103
- * @param {Array} key The key as an array of 4, 6 or 8 words.
1104
- */
1105
- cipher.aes = class {
1106
- constructor(key) {
1107
- /**
1108
- * The expanded S-box and inverse S-box tables. These will be computed
1109
- * on the client so that we don't have to send them down the wire.
1110
- *
1111
- * There are two tables, _tables[0] is for encryption and
1112
- * _tables[1] is for decryption.
1113
- *
1114
- * The first 4 sub-tables are the expanded S-box with MixColumns. The
1115
- * last (_tables[01][4]) is the S-box itself.
1116
- *
1117
- * @private
1118
- */
1119
- const aes = this;
1120
- aes._tables = [[[], [], [], [], []], [[], [], [], [], []]];
1121
-
1122
- if (!aes._tables[0][0][0]) {
1123
- aes._precompute();
1124
- }
1125
-
1126
- const sbox = aes._tables[0][4];
1127
- const decTable = aes._tables[1];
1128
- const keyLen = key.length;
1129
-
1130
- let i, encKey, decKey, rcon = 1;
1131
-
1132
- if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) {
1133
- throw new Error("invalid aes key size");
1134
- }
1135
-
1136
- aes._key = [encKey = key.slice(0), decKey = []];
1137
-
1138
- // schedule encryption keys
1139
- for (i = keyLen; i < 4 * keyLen + 28; i++) {
1140
- let tmp = encKey[i - 1];
1141
-
1142
- // apply sbox
1143
- if (i % keyLen === 0 || (keyLen === 8 && i % keyLen === 4)) {
1144
- tmp = sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255];
1145
-
1146
- // shift rows and add rcon
1147
- if (i % keyLen === 0) {
1148
- tmp = tmp << 8 ^ tmp >>> 24 ^ rcon << 24;
1149
- rcon = rcon << 1 ^ (rcon >> 7) * 283;
1150
- }
1151
- }
1152
-
1153
- encKey[i] = encKey[i - keyLen] ^ tmp;
1154
- }
840
+ return result;
841
+ }
1155
842
 
1156
- // schedule decryption keys
1157
- for (let j = 0; i; j++, i--) {
1158
- const tmp = encKey[j & 3 ? i : i - 4];
1159
- if (i <= 4 || j < 4) {
1160
- decKey[j] = tmp;
1161
- } else {
1162
- decKey[j] = decTable[0][sbox[tmp >>> 24]] ^
1163
- decTable[1][sbox[tmp >> 16 & 255]] ^
1164
- decTable[2][sbox[tmp >> 8 & 255]] ^
1165
- decTable[3][sbox[tmp & 255]];
1166
- }
1167
- }
1168
- }
1169
- // public
1170
- /* Something like this might appear here eventually
1171
- name: "AES",
1172
- blockSize: 4,
1173
- keySizes: [4,6,8],
1174
- */
1175
-
1176
- /**
1177
- * Encrypt an array of 4 big-endian words.
1178
- * @param {Array} data The plaintext.
1179
- * @return {Array} The ciphertext.
1180
- */
1181
- encrypt(data) {
1182
- return this._crypt(data, 0);
1183
- }
1184
-
1185
- /**
1186
- * Decrypt an array of 4 big-endian words.
1187
- * @param {Array} data The ciphertext.
1188
- * @return {Array} The plaintext.
1189
- */
1190
- decrypt(data) {
1191
- return this._crypt(data, 1);
1192
- }
1193
-
1194
- /**
1195
- * Expand the S-box tables.
1196
- *
1197
- * @private
1198
- */
1199
- _precompute() {
1200
- const encTable = this._tables[0];
1201
- const decTable = this._tables[1];
1202
- const sbox = encTable[4];
1203
- const sboxInv = decTable[4];
1204
- const d = [];
1205
- const th = [];
1206
- let xInv, x2, x4, x8;
1207
-
1208
- // Compute double and third tables
1209
- for (let i = 0; i < 256; i++) {
1210
- th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i;
1211
- }
1212
-
1213
- for (let x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {
1214
- // Compute sbox
1215
- let s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;
1216
- s = s >> 8 ^ s & 255 ^ 99;
1217
- sbox[x] = s;
1218
- sboxInv[s] = x;
1219
-
1220
- // Compute MixColumns
1221
- x8 = d[x4 = d[x2 = d[x]]];
1222
- let tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;
1223
- let tEnc = d[s] * 0x101 ^ s * 0x1010100;
1224
-
1225
- for (let i = 0; i < 4; i++) {
1226
- encTable[i][x] = tEnc = tEnc << 24 ^ tEnc >>> 8;
1227
- decTable[i][s] = tDec = tDec << 24 ^ tDec >>> 8;
1228
- }
1229
- }
1230
-
1231
- // Compactify. Considerable speedup on Firefox.
1232
- for (let i = 0; i < 5; i++) {
1233
- encTable[i] = encTable[i].slice(0);
1234
- decTable[i] = decTable[i].slice(0);
1235
- }
1236
- }
1237
-
1238
- /**
1239
- * Encryption and decryption core.
1240
- * @param {Array} input Four words to be encrypted or decrypted.
1241
- * @param dir The direction, 0 for encrypt and 1 for decrypt.
1242
- * @return {Array} The four encrypted or decrypted words.
1243
- * @private
1244
- */
1245
- _crypt(input, dir) {
1246
- if (input.length !== 4) {
1247
- throw new Error("invalid aes block size");
1248
- }
1249
-
1250
- const key = this._key[dir];
1251
-
1252
- const nInnerRounds = key.length / 4 - 2;
1253
- const out = [0, 0, 0, 0];
1254
- const table = this._tables[dir];
1255
-
1256
- // load up the tables
1257
- const t0 = table[0];
1258
- const t1 = table[1];
1259
- const t2 = table[2];
1260
- const t3 = table[3];
1261
- const sbox = table[4];
1262
-
1263
- // state variables a,b,c,d are loaded with pre-whitened data
1264
- let a = input[0] ^ key[0];
1265
- let b = input[dir ? 3 : 1] ^ key[1];
1266
- let c = input[2] ^ key[2];
1267
- let d = input[dir ? 1 : 3] ^ key[3];
1268
- let kIndex = 4;
1269
- let a2, b2, c2;
1270
-
1271
- // Inner rounds. Cribbed from OpenSSL.
1272
- for (let i = 0; i < nInnerRounds; i++) {
1273
- a2 = t0[a >>> 24] ^ t1[b >> 16 & 255] ^ t2[c >> 8 & 255] ^ t3[d & 255] ^ key[kIndex];
1274
- b2 = t0[b >>> 24] ^ t1[c >> 16 & 255] ^ t2[d >> 8 & 255] ^ t3[a & 255] ^ key[kIndex + 1];
1275
- c2 = t0[c >>> 24] ^ t1[d >> 16 & 255] ^ t2[a >> 8 & 255] ^ t3[b & 255] ^ key[kIndex + 2];
1276
- d = t0[d >>> 24] ^ t1[a >> 16 & 255] ^ t2[b >> 8 & 255] ^ t3[c & 255] ^ key[kIndex + 3];
1277
- kIndex += 4;
1278
- a = a2; b = b2; c = c2;
1279
- }
1280
-
1281
- // Last round.
1282
- for (let i = 0; i < 4; i++) {
1283
- out[dir ? 3 & -i : i] =
1284
- sbox[a >>> 24] << 24 ^
1285
- sbox[b >> 16 & 255] << 16 ^
1286
- sbox[c >> 8 & 255] << 8 ^
1287
- sbox[d & 255] ^
1288
- key[kIndex++];
1289
- a2 = a; a = b; b = c; c = d; d = a2;
1290
- }
1291
-
1292
- return out;
843
+ function createHmac(key) {
844
+ const sha1 = createSha1();
845
+ const innerKey = new Uint8Array(SHA1_BLOCK_LENGTH);
846
+ const outerKey = new Uint8Array(SHA1_BLOCK_LENGTH);
847
+ if (key.length > SHA1_BLOCK_LENGTH) {
848
+ sha1.update(key, 0, key.length);
849
+ key = sha1.digest();
1293
850
  }
1294
- };
1295
-
1296
- /** @fileOverview CTR mode implementation.
1297
- *
1298
- * Special thanks to Roy Nicholson for pointing out a bug in our
1299
- * implementation.
1300
- *
1301
- * @author Emily Stark
1302
- * @author Mike Hamburg
1303
- * @author Dan Boneh
1304
- */
1305
-
1306
- /** Brian Gladman's CTR Mode.
1307
- * @constructor
1308
- * @param {Object} _prf The aes instance to generate key.
1309
- * @param {bitArray} _iv The iv for ctr mode, it must be 128 bits.
1310
- */
1311
-
1312
- const mode = {};
1313
-
1314
- /**
1315
- * Brian Gladman's CTR Mode.
1316
- * @namespace
1317
- */
1318
- mode.ctrGladman = class {
1319
- constructor(prf, iv) {
1320
- this._prf = prf;
1321
- this._initIv = iv;
1322
- this._iv = iv;
851
+ for (let indexByte = 0; indexByte < SHA1_BLOCK_LENGTH; indexByte++) {
852
+ const keyByte = indexByte < key.length ? key[indexByte] : 0;
853
+ innerKey[indexByte] = keyByte ^ HMAC_INNER_PADDING;
854
+ outerKey[indexByte] = keyByte ^ HMAC_OUTER_PADDING;
1323
855
  }
856
+ sha1.update(innerKey, 0, SHA1_BLOCK_LENGTH);
857
+ return {
858
+ update(data, offset, length) {
859
+ sha1.update(data, offset, length);
860
+ },
861
+ digest() {
862
+ const innerDigest = sha1.digest();
863
+ sha1.update(outerKey, 0, SHA1_BLOCK_LENGTH);
864
+ sha1.update(innerDigest, 0, SHA1_DIGEST_LENGTH);
865
+ const result = sha1.digest();
866
+ sha1.update(innerKey, 0, SHA1_BLOCK_LENGTH);
867
+ return result;
868
+ }
869
+ };
870
+ }
1324
871
 
1325
- reset() {
1326
- this._iv = this._initIv;
1327
- }
872
+ function createSha1() {
873
+ const state = new Int32Array(SHA1_INITIAL_STATE);
874
+ const schedule = new Int32Array(SHA1_SCHEDULE_LENGTH);
875
+ const block = new Uint8Array(SHA1_BLOCK_LENGTH);
876
+ const blockView = new DataView(block.buffer);
877
+ const lengthBytes = new Uint8Array(8);
878
+ let blockLength = 0;
879
+ let totalLength = 0;
880
+ return {
881
+ update,
882
+ digest
883
+ };
1328
884
 
1329
- /** Input some data to calculate.
1330
- * @param {bitArray} data the data to process, it must be intergral multiple of 128 bits unless it's the last.
1331
- */
1332
- update(data) {
1333
- return this.calculate(this._prf, data, this._iv);
885
+ function update(data, offset, length) {
886
+ const end = offset + length;
887
+ totalLength += length;
888
+ if (blockLength) {
889
+ while (offset < end && blockLength < SHA1_BLOCK_LENGTH) {
890
+ block[blockLength++] = data[offset++];
891
+ }
892
+ if (blockLength == SHA1_BLOCK_LENGTH) {
893
+ compress(blockView, 0);
894
+ blockLength = 0;
895
+ }
896
+ }
897
+ if (offset + SHA1_BLOCK_LENGTH <= end) {
898
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
899
+ for (; offset + SHA1_BLOCK_LENGTH <= end; offset += SHA1_BLOCK_LENGTH) {
900
+ compress(view, offset);
901
+ }
902
+ }
903
+ while (offset < end) {
904
+ block[blockLength++] = data[offset++];
905
+ }
906
+ }
907
+
908
+ function digest() {
909
+ const bits = totalLength * 8;
910
+ const high = Math.floor(bits / 0x100000000);
911
+ const low = bits >>> 0;
912
+ update(SHA1_PADDING, 0, 1);
913
+ while (blockLength != SHA1_LENGTH_OFFSET) {
914
+ update(SHA1_ZERO, 0, 1);
915
+ }
916
+ lengthBytes[0] = high >>> 24;
917
+ lengthBytes[1] = high >>> 16;
918
+ lengthBytes[2] = high >>> 8;
919
+ lengthBytes[3] = high;
920
+ lengthBytes[4] = low >>> 24;
921
+ lengthBytes[5] = low >>> 16;
922
+ lengthBytes[6] = low >>> 8;
923
+ lengthBytes[7] = low;
924
+ update(lengthBytes, 0, 8);
925
+ const result = new Uint8Array(SHA1_DIGEST_LENGTH);
926
+ const resultView = new DataView(result.buffer);
927
+ for (let indexWord = 0; indexWord < state.length; indexWord++) {
928
+ resultView.setInt32(4 * indexWord, state[indexWord]);
929
+ }
930
+ state.set(SHA1_INITIAL_STATE);
931
+ blockLength = 0;
932
+ totalLength = 0;
933
+ return result;
1334
934
  }
1335
935
 
1336
- incWord(word) {
1337
- if (((word >> 24) & 0xff) === 0xff) { //overflow
1338
- let b1 = (word >> 16) & 0xff;
1339
- let b2 = (word >> 8) & 0xff;
1340
- let b3 = word & 0xff;
1341
-
1342
- if (b1 === 0xff) { // overflow b1
1343
- b1 = 0;
1344
- if (b2 === 0xff) {
1345
- b2 = 0;
1346
- if (b3 === 0xff) {
1347
- b3 = 0;
1348
- } else {
1349
- ++b3;
1350
- }
1351
- } else {
1352
- ++b2;
1353
- }
1354
- } else {
1355
- ++b1;
1356
- }
1357
-
1358
- word = 0;
1359
- word += (b1 << 16);
1360
- word += (b2 << 8);
1361
- word += b3;
1362
- } else {
1363
- word += (0x01 << 24);
936
+ function compress(view, offset) {
937
+ for (let index = 0; index < 16; index++) {
938
+ schedule[index] = view.getInt32(offset + 4 * index);
1364
939
  }
1365
- return word;
1366
- }
1367
-
1368
- incCounter(counter) {
1369
- if ((counter[0] = this.incWord(counter[0])) === 0) {
1370
- // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8
1371
- counter[1] = this.incWord(counter[1]);
940
+ for (let index = 16; index < SHA1_SCHEDULE_LENGTH; index++) {
941
+ const word = schedule[index - 3] ^ schedule[index - 8] ^ schedule[index - 14] ^ schedule[index - 16];
942
+ schedule[index] = (word << 1) | (word >>> 31);
1372
943
  }
1373
- }
1374
-
1375
- calculate(prf, data, iv) {
1376
- let l;
1377
- if (!(l = data.length)) {
1378
- return [];
944
+ let a = state[0];
945
+ let b = state[1];
946
+ let c = state[2];
947
+ let d = state[3];
948
+ let e = state[4];
949
+ let t;
950
+ for (let index = 0; index < 20; index++) {
951
+ t = (((a << 5) | (a >>> 27)) + ((b & c) | (~b & d)) + e + 0x5A827999 + schedule[index]) | 0;
952
+ e = d;
953
+ d = c;
954
+ c = (b << 30) | (b >>> 2);
955
+ b = a;
956
+ a = t;
957
+ }
958
+ for (let index = 20; index < 40; index++) {
959
+ t = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0x6ED9EBA1 + schedule[index]) | 0;
960
+ e = d;
961
+ d = c;
962
+ c = (b << 30) | (b >>> 2);
963
+ b = a;
964
+ a = t;
1379
965
  }
1380
- const bl = bitArray.bitLength(data);
1381
- for (let i = 0; i < l; i += 4) {
1382
- this.incCounter(iv);
1383
- const e = prf.encrypt(iv);
1384
- data[i] ^= e[0];
1385
- data[i + 1] ^= e[1];
1386
- data[i + 2] ^= e[2];
1387
- data[i + 3] ^= e[3];
966
+ for (let index = 40; index < 60; index++) {
967
+ t = (((a << 5) | (a >>> 27)) + ((b & c) | (b & d) | (c & d)) + e + 0x8F1BBCDC + schedule[index]) | 0;
968
+ e = d;
969
+ d = c;
970
+ c = (b << 30) | (b >>> 2);
971
+ b = a;
972
+ a = t;
973
+ }
974
+ for (let index = 60; index < SHA1_SCHEDULE_LENGTH; index++) {
975
+ t = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0xCA62C1D6 + schedule[index]) | 0;
976
+ e = d;
977
+ d = c;
978
+ c = (b << 30) | (b >>> 2);
979
+ b = a;
980
+ a = t;
1388
981
  }
1389
- return bitArray.clamp(data, bl);
982
+ state[0] = (state[0] + a) | 0;
983
+ state[1] = (state[1] + b) | 0;
984
+ state[2] = (state[2] + c) | 0;
985
+ state[3] = (state[3] + d) | 0;
986
+ state[4] = (state[4] + e) | 0;
1390
987
  }
1391
- };
988
+ }
1392
989
 
1393
- const misc = {
1394
- importKey(password) {
1395
- return new misc.hmacSha1(codec.bytes.toBits(password));
1396
- },
1397
- pbkdf2(prf, salt, count, length) {
1398
- count = count || 10000;
1399
- if (length < 0 || count < 0) {
1400
- throw new Error("invalid params to pbkdf2");
1401
- }
1402
- const byteLength = ((length >> 5) + 1) << 2;
1403
- let u, ui, i, j, k;
1404
- const arrayBuffer = new ArrayBuffer(byteLength);
1405
- const out = new DataView(arrayBuffer);
1406
- let outLength = 0;
1407
- const b = bitArray;
1408
- salt = codec.bytes.toBits(salt);
1409
- for (k = 1; outLength < (byteLength || 1); k++) {
1410
- u = ui = prf.encrypt(b.concat(salt, [k]));
1411
- for (i = 1; i < count; i++) {
1412
- ui = prf.encrypt(ui);
1413
- for (j = 0; j < ui.length; j++) {
1414
- u[j] ^= ui[j];
1415
- }
1416
- }
1417
- for (i = 0; outLength < (byteLength || 1) && i < u.length; i++) {
1418
- out.setInt32(outLength, u[i]);
1419
- outLength += 4;
990
+ function initTables() {
991
+ if (!tablesInitialized) {
992
+ let p = 1;
993
+ let q = 1;
994
+ do {
995
+ p = (p ^ (p << 1) ^ ((p & 0x80) ? 0x1b : 0)) & 255;
996
+ q = (q ^ (q << 1)) & 255;
997
+ q = (q ^ (q << 2)) & 255;
998
+ q = (q ^ (q << 4)) & 255;
999
+ if (q & 0x80) {
1000
+ q ^= 0x09;
1420
1001
  }
1002
+ S_BOX[p] = (q ^ ((q << 1) | (q >> 7)) ^ ((q << 2) | (q >> 6)) ^ ((q << 3) | (q >> 5)) ^ ((q << 4) | (q >> 4)) ^ 0x63) & 255;
1003
+ } while (p != 1);
1004
+ S_BOX[0] = 0x63;
1005
+ for (let index = 0; index < 256; index++) {
1006
+ const s = S_BOX[index];
1007
+ const s2 = multiplyByTwo(s);
1008
+ const t = (s2 << 24) | (s << 16) | (s << 8) | (s2 ^ s);
1009
+ T0[index] = t;
1010
+ T1[index] = (t >>> 8) | (t << 24);
1011
+ T2[index] = (t >>> 16) | (t << 16);
1012
+ T3[index] = (t >>> 24) | (t << 8);
1421
1013
  }
1422
- return arrayBuffer.slice(0, length / 8);
1014
+ tablesInitialized = true;
1423
1015
  }
1424
- };
1425
-
1426
- /** @fileOverview HMAC implementation.
1427
- *
1428
- * @author Emily Stark
1429
- * @author Mike Hamburg
1430
- * @author Dan Boneh
1431
- */
1432
-
1433
- /** HMAC with the specified hash function.
1434
- * @constructor
1435
- * @param {bitArray} key the key for HMAC.
1436
- * @param {Object} [Hash=hash.sha1] The hash function to use.
1437
- */
1438
- misc.hmacSha1 = class {
1439
-
1440
- constructor(key) {
1441
- const hmac = this;
1442
- const Hash = hmac._hash = hash.sha1;
1443
- const exKey = [[], []];
1444
- hmac._baseHash = [new Hash(), new Hash()];
1445
- const bs = hmac._baseHash[0].blockSize / 32;
1446
-
1447
- if (key.length > bs) {
1448
- key = new Hash().update(key).finalize();
1449
- }
1450
-
1451
- for (let i = 0; i < bs; i++) {
1452
- exKey[0][i] = key[i] ^ 0x36363636;
1453
- exKey[1][i] = key[i] ^ 0x5C5C5C5C;
1454
- }
1016
+ }
1455
1017
 
1456
- hmac._baseHash[0].update(exKey[0]);
1457
- hmac._baseHash[1].update(exKey[1]);
1458
- hmac._resultHash = new Hash(hmac._baseHash[0]);
1459
- }
1460
- reset() {
1461
- const hmac = this;
1462
- hmac._resultHash = new hmac._hash(hmac._baseHash[0]);
1463
- hmac._updated = false;
1018
+ function expandKey(key, roundKeys) {
1019
+ const keyWords = key.length >> 2;
1020
+ const rounds = keyWords + 6;
1021
+ const total = 4 * (rounds + 1);
1022
+ let roundConstant = 1;
1023
+ for (let index = 0; index < keyWords; index++) {
1024
+ roundKeys[index] = (key[4 * index] << 24) | (key[4 * index + 1] << 16) | (key[4 * index + 2] << 8) | key[4 * index + 3];
1464
1025
  }
1465
-
1466
- update(data) {
1467
- const hmac = this;
1468
- hmac._updated = true;
1469
- hmac._resultHash.update(data);
1026
+ for (let index = keyWords; index < total; index++) {
1027
+ let word = roundKeys[index - 1];
1028
+ if (index % keyWords == 0) {
1029
+ word = substituteWord((word << 8) | (word >>> 24)) ^ (roundConstant << 24);
1030
+ roundConstant = multiplyByTwo(roundConstant);
1031
+ } else if (keyWords > 6 && index % keyWords == 4) {
1032
+ word = substituteWord(word);
1033
+ }
1034
+ roundKeys[index] = roundKeys[index - keyWords] ^ word;
1470
1035
  }
1036
+ return rounds;
1037
+ }
1471
1038
 
1472
- digest() {
1473
- const hmac = this;
1474
- const w = hmac._resultHash.finalize();
1475
- const result = new (hmac._hash)(hmac._baseHash[1]).update(w).finalize();
1476
-
1477
- hmac.reset();
1478
-
1479
- return result;
1480
- }
1039
+ function substituteWord(word) {
1040
+ return (S_BOX[word >>> 24] << 24) | (S_BOX[(word >>> 16) & 255] << 16) | (S_BOX[(word >>> 8) & 255] << 8) | S_BOX[word & 255];
1041
+ }
1481
1042
 
1482
- encrypt(data) {
1483
- if (!this._updated) {
1484
- this.update(data);
1485
- return this.digest(data);
1486
- } else {
1487
- throw new Error("encrypt on already updated hmac called!");
1488
- }
1489
- }
1490
- };
1043
+ function multiplyByTwo(value) {
1044
+ return ((value << 1) ^ ((value >> 7) * 0x1b)) & 255;
1045
+ }
1491
1046
 
1492
1047
  /*
1493
1048
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
@@ -1542,8 +1097,8 @@ function getRandomValues(array) {
1542
1097
  1. Redistributions of source code must retain the above copyright notice,
1543
1098
  this list of conditions and the following disclaimer.
1544
1099
 
1545
- 2. Redistributions in binary form must reproduce the above copyright
1546
- notice, this list of conditions and the following disclaimer in
1100
+ 2. Redistributions in binary form must reproduce the above copyright
1101
+ notice, this list of conditions and the following disclaimer in
1547
1102
  the documentation and/or other materials provided with the distribution.
1548
1103
 
1549
1104
  3. The names of the authors may not be used to endorse or promote products
@@ -1567,24 +1122,21 @@ const RAW_FORMAT = "raw";
1567
1122
  const PBKDF2_ALGORITHM = { name: "PBKDF2" };
1568
1123
  const HASH_ALGORITHM = { name: "HMAC" };
1569
1124
  const HASH_FUNCTION = "SHA-1";
1125
+ const PBKDF2_ITERATIONS = 1000;
1570
1126
  const BASE_KEY_ALGORITHM = Object.assign({ hash: HASH_ALGORITHM }, PBKDF2_ALGORITHM);
1571
- const DERIVED_BITS_ALGORITHM = Object.assign({ iterations: 1000, hash: { name: HASH_FUNCTION } }, PBKDF2_ALGORITHM);
1127
+ const DERIVED_BITS_ALGORITHM = Object.assign({ iterations: PBKDF2_ITERATIONS, hash: { name: HASH_FUNCTION } }, PBKDF2_ALGORITHM);
1572
1128
  const DERIVED_BITS_USAGE = ["deriveBits"];
1573
1129
  const SALT_LENGTH = [8, 12, 16];
1574
1130
  const KEY_LENGTH = [16, 24, 32];
1575
1131
  const AUTHENTICATION_CODE_LENGTH = 10;
1576
- const COUNTER_DEFAULT_VALUE = [0, 0, 0, 0];
1132
+ const PASSWORD_VERIFICATION_LENGTH = 2;
1577
1133
  // deno-lint-ignore valid-typeof
1578
1134
  const CRYPTO_API_SUPPORTED = typeof crypto != UNDEFINED_TYPE;
1579
1135
  const subtle = CRYPTO_API_SUPPORTED && crypto.subtle;
1580
1136
  const SUBTLE_API_SUPPORTED = CRYPTO_API_SUPPORTED && typeof subtle != UNDEFINED_TYPE;
1581
- const codecBytes = codec.bytes;
1582
- const Aes = cipher.aes;
1583
- const CtrGladman = mode.ctrGladman;
1584
- const HmacSha1 = misc.hmacSha1;
1585
1137
 
1586
- let IMPORT_KEY_SUPPORTED = CRYPTO_API_SUPPORTED && SUBTLE_API_SUPPORTED && typeof subtle.importKey == FUNCTION_TYPE;
1587
- let DERIVE_BITS_SUPPORTED = CRYPTO_API_SUPPORTED && SUBTLE_API_SUPPORTED && typeof subtle.deriveBits == FUNCTION_TYPE;
1138
+ let DERIVE_BITS_SUPPORTED = SUBTLE_API_SUPPORTED && typeof subtle.importKey == FUNCTION_TYPE && typeof subtle.deriveBits == FUNCTION_TYPE;
1139
+ let createEngine = createEngine$1;
1588
1140
 
1589
1141
  class AESDecryptionStream extends TransformStream {
1590
1142
 
@@ -1602,9 +1154,10 @@ class AESDecryptionStream extends TransformStream {
1602
1154
  ready
1603
1155
  } = aesCrypto;
1604
1156
  if (password) {
1605
- await createDecryptionKeys(aesCrypto, strength, password, subarray(chunk, 0, SALT_LENGTH[strength] + 2));
1606
- chunk = subarray(chunk, SALT_LENGTH[strength] + 2);
1157
+ await createDecryptionKeys(aesCrypto, strength, password, subarray(chunk, 0, SALT_LENGTH[strength] + PASSWORD_VERIFICATION_LENGTH));
1158
+ chunk = subarray(chunk, SALT_LENGTH[strength] + PASSWORD_VERIFICATION_LENGTH);
1607
1159
  if (checkPasswordOnly) {
1160
+ disposeEngine(aesCrypto);
1608
1161
  controller.error(new Error(ERR_ABORT_CHECK_PASSWORD));
1609
1162
  } else {
1610
1163
  resolveReady();
@@ -1617,23 +1170,16 @@ class AESDecryptionStream extends TransformStream {
1617
1170
  },
1618
1171
  async flush(controller) {
1619
1172
  const {
1620
- ctr,
1621
- hmac,
1173
+ engine,
1622
1174
  pendingInput,
1623
1175
  ready
1624
1176
  } = this;
1625
- if (hmac && ctr) {
1177
+ if (engine) {
1626
1178
  await ready;
1627
- const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
1628
1179
  const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
1629
- let decryptedChunkArray = EMPTY_UINT8_ARRAY;
1630
- if (chunkToDecrypt.length) {
1631
- const encryptedChunk = toBits(codecBytes, chunkToDecrypt);
1632
- hmac.update(encryptedChunk);
1633
- const decryptedChunk = ctr.update(encryptedChunk);
1634
- decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
1635
- }
1636
- const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
1180
+ const decryptedChunkArray = new Uint8Array(subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH));
1181
+ engine.process(decryptedChunkArray, true);
1182
+ const authenticationCode = engine.digest();
1637
1183
  let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
1638
1184
  for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
1639
1185
  invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
@@ -1643,6 +1189,9 @@ class AESDecryptionStream extends TransformStream {
1643
1189
  }
1644
1190
  controller.enqueue(decryptedChunkArray);
1645
1191
  }
1192
+ },
1193
+ cancel() {
1194
+ disposeEngine(this);
1646
1195
  }
1647
1196
  });
1648
1197
  }
@@ -1672,26 +1221,24 @@ class AESEncryptionStream extends TransformStream {
1672
1221
  }
1673
1222
  const output = new Uint8Array(preamble.length + chunk.length - (chunk.length % BLOCK_LENGTH));
1674
1223
  output.set(preamble, 0);
1675
- controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0));
1224
+ controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0, false));
1676
1225
  },
1677
1226
  async flush(controller) {
1678
1227
  const {
1679
- ctr,
1680
- hmac,
1228
+ engine,
1681
1229
  pendingInput,
1682
1230
  ready
1683
1231
  } = this;
1684
- if (hmac && ctr) {
1232
+ if (engine) {
1685
1233
  await ready;
1686
- let encryptedChunkArray = EMPTY_UINT8_ARRAY;
1687
- if (pendingInput.length) {
1688
- const encryptedChunk = ctr.update(toBits(codecBytes, pendingInput));
1689
- hmac.update(encryptedChunk);
1690
- encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
1691
- }
1692
- const authenticationCode = fromBits(codecBytes, hmac.digest()).slice(0, AUTHENTICATION_CODE_LENGTH);
1234
+ const encryptedChunkArray = new Uint8Array(pendingInput);
1235
+ engine.process(encryptedChunkArray, false);
1236
+ const authenticationCode = subarray(engine.digest(), 0, AUTHENTICATION_CODE_LENGTH);
1693
1237
  controller.enqueue(concat(encryptedChunkArray, authenticationCode));
1694
1238
  }
1239
+ },
1240
+ cancel() {
1241
+ disposeEngine(this);
1695
1242
  }
1696
1243
  });
1697
1244
  }
@@ -1706,30 +1253,23 @@ function initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength) {
1706
1253
  });
1707
1254
  }
1708
1255
 
1709
- function append(aesCrypto, input, output, paddingStart, paddingEnd, verifyAuthenticationCode) {
1256
+ function append(aesCrypto, input, output, paddingStart, paddingEnd, decrypt) {
1710
1257
  const {
1711
- ctr,
1712
- hmac,
1258
+ engine,
1713
1259
  pendingInput
1714
1260
  } = aesCrypto;
1715
1261
  if (pendingInput.length) {
1716
1262
  input = concat(pendingInput, input);
1717
1263
  }
1718
1264
  const inputLength = input.length - paddingEnd;
1719
- output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
1720
- let offset;
1721
- for (offset = 0; offset <= inputLength - BLOCK_LENGTH; offset += BLOCK_LENGTH) {
1722
- const inputChunk = toBits(codecBytes, subarray(input, offset, offset + BLOCK_LENGTH));
1723
- if (verifyAuthenticationCode) {
1724
- hmac.update(inputChunk);
1725
- }
1726
- const outputChunk = ctr.update(inputChunk);
1727
- if (!verifyAuthenticationCode) {
1728
- hmac.update(outputChunk);
1729
- }
1730
- output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
1731
- }
1732
- aesCrypto.pendingInput = subarray(input, offset);
1265
+ const alignedLength = inputLength - (inputLength % BLOCK_LENGTH);
1266
+ output = expand(output, paddingStart + alignedLength);
1267
+ if (alignedLength) {
1268
+ const chunk = subarray(output, paddingStart, paddingStart + alignedLength);
1269
+ chunk.set(subarray(input, 0, alignedLength));
1270
+ engine.process(chunk, decrypt);
1271
+ }
1272
+ aesCrypto.pendingInput = subarray(input, alignedLength);
1733
1273
  return output;
1734
1274
  }
1735
1275
 
@@ -1737,10 +1277,17 @@ async function createDecryptionKeys(decrypt, strength, password, preamble) {
1737
1277
  const passwordVerificationKey = await createKeys$1(decrypt, strength, password, subarray(preamble, 0, SALT_LENGTH[strength]));
1738
1278
  const passwordVerification = subarray(preamble, SALT_LENGTH[strength]);
1739
1279
  if (passwordVerificationKey[0] != passwordVerification[0] || passwordVerificationKey[1] != passwordVerification[1]) {
1280
+ disposeEngine(decrypt);
1740
1281
  throw new Error(ERR_INVALID_PASSWORD);
1741
1282
  }
1742
1283
  }
1743
1284
 
1285
+ function disposeEngine({ engine }) {
1286
+ if (engine && engine.dispose) {
1287
+ engine.dispose();
1288
+ }
1289
+ }
1290
+
1744
1291
  async function createEncryptionKeys(encrypt, strength, password) {
1745
1292
  const salt = getRandomValues(new Uint8Array(SALT_LENGTH[strength]));
1746
1293
  const passwordVerification = await createKeys$1(encrypt, strength, password, salt);
@@ -1749,48 +1296,22 @@ async function createEncryptionKeys(encrypt, strength, password) {
1749
1296
 
1750
1297
  async function createKeys$1(aesCrypto, strength, password, salt) {
1751
1298
  aesCrypto.password = null;
1752
- const baseKey = await importKey(RAW_FORMAT, password, BASE_KEY_ALGORITHM, false, DERIVED_BITS_USAGE);
1753
- const derivedBits = await deriveBits(Object.assign({ salt }, DERIVED_BITS_ALGORITHM), baseKey, 8 * ((KEY_LENGTH[strength] * 2) + 2));
1754
- const compositeKey = new Uint8Array(derivedBits);
1755
- const key = toBits(codecBytes, subarray(compositeKey, 0, KEY_LENGTH[strength]));
1756
- const authentication = toBits(codecBytes, subarray(compositeKey, KEY_LENGTH[strength], KEY_LENGTH[strength] * 2));
1757
- const passwordVerification = subarray(compositeKey, KEY_LENGTH[strength] * 2);
1758
- Object.assign(aesCrypto, {
1759
- keys: {
1760
- key,
1761
- authentication,
1762
- passwordVerification
1763
- },
1764
- ctr: new CtrGladman(new Aes(key), Array.from(COUNTER_DEFAULT_VALUE)),
1765
- hmac: new HmacSha1(authentication)
1766
- });
1767
- return passwordVerification;
1768
- }
1769
-
1770
- async function importKey(format, password, algorithm, extractable, keyUsages) {
1771
- if (IMPORT_KEY_SUPPORTED) {
1772
- try {
1773
- return await subtle.importKey(format, password, algorithm, extractable, keyUsages);
1774
- } catch {
1775
- IMPORT_KEY_SUPPORTED = false;
1776
- return misc.importKey(password);
1777
- }
1778
- } else {
1779
- return misc.importKey(password);
1780
- }
1299
+ const keyLength = KEY_LENGTH[strength];
1300
+ const compositeKey = await deriveKey(password, salt, keyLength * 2 + PASSWORD_VERIFICATION_LENGTH);
1301
+ aesCrypto.engine = createEngine(subarray(compositeKey, 0, keyLength), subarray(compositeKey, keyLength, keyLength * 2));
1302
+ return subarray(compositeKey, keyLength * 2);
1781
1303
  }
1782
1304
 
1783
- async function deriveBits(algorithm, baseKey, length) {
1305
+ async function deriveKey(password, salt, length) {
1784
1306
  if (DERIVE_BITS_SUPPORTED) {
1785
1307
  try {
1786
- return await subtle.deriveBits(algorithm, baseKey, length);
1308
+ const baseKey = await subtle.importKey(RAW_FORMAT, password, BASE_KEY_ALGORITHM, false, DERIVED_BITS_USAGE);
1309
+ return new Uint8Array(await subtle.deriveBits(Object.assign({ salt }, DERIVED_BITS_ALGORITHM), baseKey, length * 8));
1787
1310
  } catch {
1788
1311
  DERIVE_BITS_SUPPORTED = false;
1789
- return misc.pbkdf2(baseKey, algorithm.salt, DERIVED_BITS_ALGORITHM.iterations, length);
1790
1312
  }
1791
- } else {
1792
- return misc.pbkdf2(baseKey, algorithm.salt, DERIVED_BITS_ALGORITHM.iterations, length);
1793
1313
  }
1314
+ return pbkdf2(password, salt, PBKDF2_ITERATIONS, length);
1794
1315
  }
1795
1316
 
1796
1317
  function encodePassword(password, rawPassword) {
@@ -1814,13 +1335,6 @@ function subarray(array, begin, end) {
1814
1335
  return array.subarray(begin, end);
1815
1336
  }
1816
1337
 
1817
- function fromBits(codecBytes, chunk) {
1818
- return codecBytes.fromBits(chunk);
1819
- }
1820
- function toBits(codecBytes, chunk) {
1821
- return codecBytes.toBits(chunk);
1822
- }
1823
-
1824
1338
  /*
1825
1339
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
1826
1340
 
@@ -2760,11 +2274,18 @@ async function supportsDeflate(config) {
2760
2274
  return true;
2761
2275
  }
2762
2276
  if (FallbackStream) {
2277
+ return await loadModule(config);
2278
+ }
2279
+ return false;
2280
+ }
2281
+
2282
+ async function loadModule(config) {
2283
+ if (initModule) {
2763
2284
  try {
2764
2285
  await initModule(config);
2765
2286
  return true;
2766
2287
  } catch {
2767
- return false;
2288
+ // ignored
2768
2289
  }
2769
2290
  }
2770
2291
  return false;
@@ -2807,26 +2328,27 @@ class CodecWorker {
2807
2328
  terminate() {
2808
2329
  return new Promise(resolve => {
2809
2330
  const { worker, busy } = workerData;
2810
- if (worker) {
2811
- if (busy) {
2812
- workerData.resolveTerminated = resolve;
2813
- } else {
2331
+ if (busy) {
2332
+ workerData.resolveTerminated = resolve;
2333
+ } else {
2334
+ if (worker) {
2814
2335
  worker.terminate();
2815
- resolve();
2336
+ workerData.worker = null;
2816
2337
  }
2817
- workerData.interface = null;
2818
- } else {
2819
2338
  resolve();
2820
2339
  }
2340
+ workerData.interface = null;
2821
2341
  });
2822
2342
  },
2823
2343
  onTaskFinished() {
2824
2344
  if (workerData.busy) {
2825
- const { resolveTerminated } = workerData;
2345
+ const { resolveTerminated, worker } = workerData;
2826
2346
  if (resolveTerminated) {
2827
2347
  workerData.resolveTerminated = null;
2828
- workerData.terminated = true;
2829
- workerData.worker.terminate();
2348
+ if (worker) {
2349
+ workerData.terminated = true;
2350
+ worker.terminate();
2351
+ }
2830
2352
  resolveTerminated();
2831
2353
  }
2832
2354
  workerData.busy = false;
@@ -2883,28 +2405,23 @@ function createWorkerInterface(workerData, config) {
2883
2405
  }
2884
2406
 
2885
2407
  async function runWorker$1({ options, readable, writable, onTaskFinished, workerOptions }, config) {
2886
- let codecStream, chunkStream;
2408
+ let codecStream, chunkStream, modulePromise;
2887
2409
  try {
2888
2410
  if (options.compressed && !options.format) {
2889
2411
  const deflate = options.codecType.startsWith(CODEC_DEFLATE);
2890
2412
  const FallbackStream = deflate ? config.CompressionStreamFallback : config.DecompressionStreamFallback;
2891
2413
  const NativeStream = deflate ? config.CompressionStream : config.DecompressionStream;
2892
2414
  if (!options.useCompressionStream) {
2893
- try {
2894
- await initModule(config);
2895
- } catch {
2896
- if (!FallbackStream || FallbackStream.requiresModule) {
2897
- options.useCompressionStream = true;
2898
- }
2415
+ if (!await moduleLoaded() && (!FallbackStream || FallbackStream.requiresModule)) {
2416
+ options.useCompressionStream = true;
2899
2417
  }
2900
2418
  } else if (FallbackStream && FallbackStream.requiresModule && !supportsDeflateRaw(NativeStream)) {
2901
- try {
2902
- await initModule(config);
2903
- } catch {
2904
- // ignored
2905
- }
2419
+ await moduleLoaded();
2906
2420
  }
2907
2421
  }
2422
+ if (options.encrypted && !options.zipCrypto) {
2423
+ await moduleLoaded();
2424
+ }
2908
2425
  codecStream = new CodecStream(options, config);
2909
2426
  chunkStream = new ChunkStream(getChunkSize(config));
2910
2427
  await readable
@@ -2937,6 +2454,13 @@ async function runWorker$1({ options, readable, writable, onTaskFinished, worker
2937
2454
  } finally {
2938
2455
  onTaskFinished();
2939
2456
  }
2457
+
2458
+ function moduleLoaded() {
2459
+ if (!modulePromise) {
2460
+ modulePromise = loadModule(config);
2461
+ }
2462
+ return modulePromise;
2463
+ }
2940
2464
  }
2941
2465
 
2942
2466
  /*
@@ -4093,16 +3617,14 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
4093
3617
  combineSizeEocd
4094
3618
  } = httpReader;
4095
3619
  if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest == UNDEFINED_TYPE || preventHeadRequest)) {
4096
- const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -END_OF_CENTRAL_DIR_LENGTH : undefined));
3620
+ const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -65557 : undefined));
4097
3621
  const acceptRanges = response.headers.get(HTTP_HEADER_ACCEPT_RANGES);
4098
3622
  if (!forceRangeRequests && (!acceptRanges || acceptRanges.toLowerCase() != HTTP_RANGE_UNIT)) {
4099
3623
  throw new Error(ERR_HTTP_RANGE);
4100
3624
  } else {
4101
- if (combineSizeEocd) {
4102
- const eocdCache = new Uint8Array(await response.arrayBuffer());
4103
- if (response.status == 206 && eocdCache.length == END_OF_CENTRAL_DIR_LENGTH) {
4104
- httpReader.eocdCache = eocdCache;
4105
- }
3625
+ let eocdCache;
3626
+ if (combineSizeEocd && response.status == 206) {
3627
+ eocdCache = new Uint8Array(await response.arrayBuffer());
4106
3628
  }
4107
3629
  setResourceValidators(httpReader, response);
4108
3630
  const contentSize = getContentRangeSize(response);
@@ -4111,6 +3633,9 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
4111
3633
  } else {
4112
3634
  httpReader.size = contentSize;
4113
3635
  }
3636
+ if (eocdCache && eocdCache.length && getContentRangeOffset(response) === httpReader.size - eocdCache.length) {
3637
+ httpReader.eocdCache = eocdCache;
3638
+ }
4114
3639
  }
4115
3640
  } else {
4116
3641
  await getContentLength(httpReader, sendRequest, getRequestData);
@@ -4126,25 +3651,23 @@ async function readUint8ArrayHttpReader(httpReader, index, length, sendRequest,
4126
3651
  options
4127
3652
  } = httpReader;
4128
3653
  if (useRangeHeader || forceRangeRequests) {
4129
- if (eocdCache && index == size - END_OF_CENTRAL_DIR_LENGTH && length == END_OF_CENTRAL_DIR_LENGTH) {
4130
- return eocdCache;
4131
- }
4132
3654
  if (index >= size || length === 0) {
4133
3655
  return EMPTY_UINT8_ARRAY;
4134
3656
  } else {
4135
3657
  if (index + length > size) {
4136
3658
  length = size - index;
4137
3659
  }
3660
+ if (eocdCache && index >= size - eocdCache.length) {
3661
+ const cacheIndex = index - (size - eocdCache.length);
3662
+ return eocdCache.slice(cacheIndex, cacheIndex + length);
3663
+ }
4138
3664
  const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, index, length));
4139
3665
  if (response.status != 206) {
4140
3666
  throw new Error(ERR_HTTP_RANGE);
4141
3667
  }
4142
- const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
4143
- if (contentRangeHeader) {
4144
- const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
4145
- if (!Number.isNaN(rangeStart) && rangeStart != index) {
4146
- throw new Error(ERR_HTTP_RANGE);
4147
- }
3668
+ const rangeStart = getContentRangeOffset(response);
3669
+ if (rangeStart !== UNDEFINED_VALUE && rangeStart != index) {
3670
+ throw new Error(ERR_HTTP_RANGE);
4148
3671
  }
4149
3672
  checkResourceValidators(httpReader, response);
4150
3673
  setResourceValidators(httpReader, response);
@@ -4204,12 +3727,9 @@ function createRangeReadable(httpReader, offset, size) {
4204
3727
  if (response.status != 206) {
4205
3728
  throw new Error(ERR_HTTP_RANGE);
4206
3729
  }
4207
- const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
4208
- if (contentRangeHeader) {
4209
- const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
4210
- if (!Number.isNaN(rangeStart) && rangeStart != windowOffset) {
4211
- throw new Error(ERR_HTTP_RANGE);
4212
- }
3730
+ const rangeStart = getContentRangeOffset(response);
3731
+ if (rangeStart !== UNDEFINED_VALUE && rangeStart != windowOffset) {
3732
+ throw new Error(ERR_HTTP_RANGE);
4213
3733
  }
4214
3734
  checkResourceValidators(httpReader, response);
4215
3735
  setResourceValidators(httpReader, response);
@@ -4225,6 +3745,16 @@ function createRangeReadable(httpReader, offset, size) {
4225
3745
  }
4226
3746
  }
4227
3747
 
3748
+ function getContentRangeOffset(response) {
3749
+ const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
3750
+ if (contentRangeHeader) {
3751
+ const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
3752
+ if (!Number.isNaN(rangeStart)) {
3753
+ return rangeStart;
3754
+ }
3755
+ }
3756
+ }
3757
+
4228
3758
  function getContentRangeSize(response) {
4229
3759
  const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
4230
3760
  if (contentRangeHeader) {
@@ -6744,7 +6274,6 @@ class ZipWriter {
6744
6274
  rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
6745
6275
  rawExtraField,
6746
6276
  rawCentralExtraField: EMPTY_UINT8_ARRAY,
6747
- extendedTimestamp: false,
6748
6277
  headerArray,
6749
6278
  headerView
6750
6279
  });
@@ -7488,7 +7017,7 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
7488
7017
  }
7489
7018
  }
7490
7019
  const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
7491
- if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
7020
+ if (emptyEntry && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
7492
7021
  dataDescriptor = false;
7493
7022
  }
7494
7023
  const zip64UncompressedSize = zip64Enabled || unknownSize || uncompressedSize >= MAX_32_BITS;
@@ -9098,7 +8627,7 @@ function formatSupported(StreamClass, format) {
9098
8627
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
9099
8628
  */
9100
8629
 
9101
- const VERSION = "2.13.1";
8630
+ const VERSION = "2.14.0";
9102
8631
 
9103
8632
  /*
9104
8633
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -10056,12 +9585,16 @@ class ZipDirectoryEntry extends ZipEntry {
10056
9585
  let directoryEntry = parent;
10057
9586
  if (name) {
10058
9587
  directoryEntry = parent.getChildByName(name);
10059
- if (directoryEntry && !directoryEntry.directory) {
9588
+ if (directoryEntry && (!directoryEntry.directory || directoryEntry.data)) {
10060
9589
  if (duplicates == DUPLICATES_KEEP_FIRST) {
10061
9590
  continue;
10062
9591
  } else if (duplicates == DUPLICATES_KEEP_LAST) {
10063
- this.fs.remove(directoryEntry);
10064
- directoryEntry = UNDEFINED_VALUE;
9592
+ if (directoryEntry.directory) {
9593
+ directoryEntry.data = entry;
9594
+ } else {
9595
+ this.fs.remove(directoryEntry);
9596
+ directoryEntry = UNDEFINED_VALUE;
9597
+ }
10065
9598
  } else {
10066
9599
  throw new Error(ERR_DUPLICATE_IMPORTED_ENTRY);
10067
9600
  }
@@ -11031,7 +10564,7 @@ function decodeMimeTypes(data) {
11031
10564
  */
11032
10565
 
11033
10566
 
11034
- i(setDefaultConfiguration);
10567
+ c(setDefaultConfiguration);
11035
10568
 
11036
10569
  exports.BlobReader = BlobReader;
11037
10570
  exports.BlobWriter = BlobWriter;