@zip.js/zip.js 2.14.0 → 2.14.1

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 (39) hide show
  1. package/BENCHMARKS.md +342 -454
  2. package/deno.json +1 -1
  3. package/dist/zip-core-external.js +262 -81
  4. package/dist/zip-core-external.min.js +1 -1
  5. package/dist/zip-core.js +260 -74
  6. package/dist/zip-core.min.js +1 -1
  7. package/dist/zip-fs-core-external.js +262 -81
  8. package/dist/zip-fs-core-external.min.js +1 -1
  9. package/dist/zip-fs-core.js +260 -74
  10. package/dist/zip-fs-core.min.js +1 -1
  11. package/dist/zip-fs-external.js +262 -81
  12. package/dist/zip-fs-external.min.js +1 -1
  13. package/dist/zip-fs-native.js +262 -76
  14. package/dist/zip-fs-native.min.js +1 -1
  15. package/dist/zip-fs.js +266 -85
  16. package/dist/zip-fs.min.js +1 -1
  17. package/dist/zip-legacy.js +262 -76
  18. package/dist/zip-legacy.min.js +1 -1
  19. package/dist/zip-module.wasm +0 -0
  20. package/dist/zip-native.js +262 -76
  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 +266 -85
  25. package/dist/zip.min.js +1 -1
  26. package/index-native.cjs +262 -76
  27. package/index-native.min.js +1 -1
  28. package/index.cjs +266 -85
  29. package/index.min.js +1 -1
  30. package/lib/core/codec-worker.js +6 -5
  31. package/lib/core/streams/codecs/aes-hmac-sha1.js +194 -56
  32. package/lib/core/streams/zlib-wasm/zlib-streams.js +2 -7
  33. package/lib/core/streams/zlib-wasm/zlib-streams.wasm +0 -0
  34. package/lib/core/version.js +1 -1
  35. package/lib/core/web-worker-inline-native.js +1 -1
  36. package/lib/core/web-worker-inline-wasm.js +1 -1
  37. package/lib/core/zip-reader.js +53 -6
  38. package/lib/core/zlib-streams-inline.js +1 -1
  39. package/package.json +1 -1
@@ -736,7 +736,7 @@
736
736
  const ROUND_KEYS_LENGTH = 60;
737
737
  const SHA1_BLOCK_LENGTH = 64;
738
738
  const SHA1_DIGEST_LENGTH = 20;
739
- const SHA1_SCHEDULE_LENGTH = 80;
739
+ const SHA1_SCHEDULE_LENGTH = 16;
740
740
  const SHA1_LENGTH_OFFSET = 56;
741
741
  const SHA1_PADDING = new Uint8Array([0x80]);
742
742
  const SHA1_ZERO = new Uint8Array(1);
@@ -755,9 +755,12 @@
755
755
  initTables();
756
756
  const roundKeys = new Int32Array(ROUND_KEYS_LENGTH);
757
757
  const rounds = expandKey(key, roundKeys);
758
- const counter = new Uint8Array(BLOCK_LENGTH$1);
759
758
  const keystream = new Int32Array(BLOCK_LENGTH$1 / 4);
760
759
  const hmac = createHmac(authenticationKey);
760
+ let counter0 = 0;
761
+ let counter1 = 0;
762
+ let counter2 = 0;
763
+ let counter3 = 0;
761
764
  return {
762
765
  process(data, decrypt) {
763
766
  if (decrypt) {
@@ -793,31 +796,83 @@
793
796
  }
794
797
 
795
798
  function nextKeystream() {
796
- for (let indexByte = 0; indexByte < BLOCK_LENGTH$1; indexByte++) {
797
- counter[indexByte]++;
798
- if (counter[indexByte] !== 0) {
799
- break;
800
- }
801
- }
802
- let s0 = ((counter[0] << 24) | (counter[1] << 16) | (counter[2] << 8) | counter[3]) ^ roundKeys[0];
803
- let s1 = ((counter[4] << 24) | (counter[5] << 16) | (counter[6] << 8) | counter[7]) ^ roundKeys[1];
804
- let s2 = ((counter[8] << 24) | (counter[9] << 16) | (counter[10] << 8) | counter[11]) ^ roundKeys[2];
805
- let s3 = ((counter[12] << 24) | (counter[13] << 16) | (counter[14] << 8) | counter[15]) ^ roundKeys[3];
806
- let indexKey = 4;
807
- for (let round = 1; round < rounds; round++, indexKey += 4) {
808
- const t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[indexKey];
809
- const t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[indexKey + 1];
810
- const t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[indexKey + 2];
811
- const t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[indexKey + 3];
812
- s0 = t0;
813
- s1 = t1;
814
- s2 = t2;
815
- s3 = t3;
816
- }
817
- 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];
818
- 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];
819
- 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];
820
- 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];
799
+ counter0 = (counter0 + 1) | 0;
800
+ if (!counter0) {
801
+ counter1 = (counter1 + 1) | 0;
802
+ if (!counter1) {
803
+ counter2 = (counter2 + 1) | 0;
804
+ if (!counter2) {
805
+ counter3 = (counter3 + 1) | 0;
806
+ }
807
+ }
808
+ }
809
+ let s0 = swapBytes(counter0) ^ roundKeys[0];
810
+ let s1 = swapBytes(counter1) ^ roundKeys[1];
811
+ let s2 = swapBytes(counter2) ^ roundKeys[2];
812
+ let s3 = swapBytes(counter3) ^ roundKeys[3];
813
+ let t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[4];
814
+ let t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[5];
815
+ let t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[6];
816
+ let t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[7];
817
+ s0 = T0[t0 >>> 24] ^ T1[(t1 >>> 16) & 255] ^ T2[(t2 >>> 8) & 255] ^ T3[t3 & 255] ^ roundKeys[8];
818
+ s1 = T0[t1 >>> 24] ^ T1[(t2 >>> 16) & 255] ^ T2[(t3 >>> 8) & 255] ^ T3[t0 & 255] ^ roundKeys[9];
819
+ s2 = T0[t2 >>> 24] ^ T1[(t3 >>> 16) & 255] ^ T2[(t0 >>> 8) & 255] ^ T3[t1 & 255] ^ roundKeys[10];
820
+ s3 = T0[t3 >>> 24] ^ T1[(t0 >>> 16) & 255] ^ T2[(t1 >>> 8) & 255] ^ T3[t2 & 255] ^ roundKeys[11];
821
+ t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[12];
822
+ t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[13];
823
+ t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[14];
824
+ t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[15];
825
+ s0 = T0[t0 >>> 24] ^ T1[(t1 >>> 16) & 255] ^ T2[(t2 >>> 8) & 255] ^ T3[t3 & 255] ^ roundKeys[16];
826
+ s1 = T0[t1 >>> 24] ^ T1[(t2 >>> 16) & 255] ^ T2[(t3 >>> 8) & 255] ^ T3[t0 & 255] ^ roundKeys[17];
827
+ s2 = T0[t2 >>> 24] ^ T1[(t3 >>> 16) & 255] ^ T2[(t0 >>> 8) & 255] ^ T3[t1 & 255] ^ roundKeys[18];
828
+ s3 = T0[t3 >>> 24] ^ T1[(t0 >>> 16) & 255] ^ T2[(t1 >>> 8) & 255] ^ T3[t2 & 255] ^ roundKeys[19];
829
+ t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[20];
830
+ t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[21];
831
+ t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[22];
832
+ t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[23];
833
+ s0 = T0[t0 >>> 24] ^ T1[(t1 >>> 16) & 255] ^ T2[(t2 >>> 8) & 255] ^ T3[t3 & 255] ^ roundKeys[24];
834
+ s1 = T0[t1 >>> 24] ^ T1[(t2 >>> 16) & 255] ^ T2[(t3 >>> 8) & 255] ^ T3[t0 & 255] ^ roundKeys[25];
835
+ s2 = T0[t2 >>> 24] ^ T1[(t3 >>> 16) & 255] ^ T2[(t0 >>> 8) & 255] ^ T3[t1 & 255] ^ roundKeys[26];
836
+ s3 = T0[t3 >>> 24] ^ T1[(t0 >>> 16) & 255] ^ T2[(t1 >>> 8) & 255] ^ T3[t2 & 255] ^ roundKeys[27];
837
+ t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[28];
838
+ t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[29];
839
+ t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[30];
840
+ t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[31];
841
+ s0 = T0[t0 >>> 24] ^ T1[(t1 >>> 16) & 255] ^ T2[(t2 >>> 8) & 255] ^ T3[t3 & 255] ^ roundKeys[32];
842
+ s1 = T0[t1 >>> 24] ^ T1[(t2 >>> 16) & 255] ^ T2[(t3 >>> 8) & 255] ^ T3[t0 & 255] ^ roundKeys[33];
843
+ s2 = T0[t2 >>> 24] ^ T1[(t3 >>> 16) & 255] ^ T2[(t0 >>> 8) & 255] ^ T3[t1 & 255] ^ roundKeys[34];
844
+ s3 = T0[t3 >>> 24] ^ T1[(t0 >>> 16) & 255] ^ T2[(t1 >>> 8) & 255] ^ T3[t2 & 255] ^ roundKeys[35];
845
+ t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[36];
846
+ t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[37];
847
+ t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[38];
848
+ t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[39];
849
+ let indexKey = 40;
850
+ if (rounds > 10) {
851
+ s0 = T0[t0 >>> 24] ^ T1[(t1 >>> 16) & 255] ^ T2[(t2 >>> 8) & 255] ^ T3[t3 & 255] ^ roundKeys[40];
852
+ s1 = T0[t1 >>> 24] ^ T1[(t2 >>> 16) & 255] ^ T2[(t3 >>> 8) & 255] ^ T3[t0 & 255] ^ roundKeys[41];
853
+ s2 = T0[t2 >>> 24] ^ T1[(t3 >>> 16) & 255] ^ T2[(t0 >>> 8) & 255] ^ T3[t1 & 255] ^ roundKeys[42];
854
+ s3 = T0[t3 >>> 24] ^ T1[(t0 >>> 16) & 255] ^ T2[(t1 >>> 8) & 255] ^ T3[t2 & 255] ^ roundKeys[43];
855
+ t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[44];
856
+ t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[45];
857
+ t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[46];
858
+ t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[47];
859
+ indexKey = 48;
860
+ }
861
+ if (rounds > 12) {
862
+ s0 = T0[t0 >>> 24] ^ T1[(t1 >>> 16) & 255] ^ T2[(t2 >>> 8) & 255] ^ T3[t3 & 255] ^ roundKeys[48];
863
+ s1 = T0[t1 >>> 24] ^ T1[(t2 >>> 16) & 255] ^ T2[(t3 >>> 8) & 255] ^ T3[t0 & 255] ^ roundKeys[49];
864
+ s2 = T0[t2 >>> 24] ^ T1[(t3 >>> 16) & 255] ^ T2[(t0 >>> 8) & 255] ^ T3[t1 & 255] ^ roundKeys[50];
865
+ s3 = T0[t3 >>> 24] ^ T1[(t0 >>> 16) & 255] ^ T2[(t1 >>> 8) & 255] ^ T3[t2 & 255] ^ roundKeys[51];
866
+ t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[52];
867
+ t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[53];
868
+ t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[54];
869
+ t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[55];
870
+ indexKey = 56;
871
+ }
872
+ keystream[0] = ((S_BOX[t0 >>> 24] << 24) | (S_BOX[(t1 >>> 16) & 255] << 16) | (S_BOX[(t2 >>> 8) & 255] << 8) | S_BOX[t3 & 255]) ^ roundKeys[indexKey];
873
+ keystream[1] = ((S_BOX[t1 >>> 24] << 24) | (S_BOX[(t2 >>> 16) & 255] << 16) | (S_BOX[(t3 >>> 8) & 255] << 8) | S_BOX[t0 & 255]) ^ roundKeys[indexKey + 1];
874
+ keystream[2] = ((S_BOX[t2 >>> 24] << 24) | (S_BOX[(t3 >>> 16) & 255] << 16) | (S_BOX[(t0 >>> 8) & 255] << 8) | S_BOX[t1 & 255]) ^ roundKeys[indexKey + 2];
875
+ keystream[3] = ((S_BOX[t3 >>> 24] << 24) | (S_BOX[(t0 >>> 16) & 255] << 16) | (S_BOX[(t1 >>> 8) & 255] << 8) | S_BOX[t2 & 255]) ^ roundKeys[indexKey + 3];
821
876
  }
822
877
  }
823
878
 
@@ -941,47 +996,126 @@
941
996
  for (let index = 0; index < 16; index++) {
942
997
  schedule[index] = view.getInt32(offset + 4 * index);
943
998
  }
944
- for (let index = 16; index < SHA1_SCHEDULE_LENGTH; index++) {
945
- const word = schedule[index - 3] ^ schedule[index - 8] ^ schedule[index - 14] ^ schedule[index - 16];
946
- schedule[index] = (word << 1) | (word >>> 31);
947
- }
948
999
  let a = state[0];
949
1000
  let b = state[1];
950
1001
  let c = state[2];
951
1002
  let d = state[3];
952
1003
  let e = state[4];
953
1004
  let t;
954
- for (let index = 0; index < 20; index++) {
955
- t = (((a << 5) | (a >>> 27)) + ((b & c) | (~b & d)) + e + 0x5A827999 + schedule[index]) | 0;
956
- e = d;
957
- d = c;
958
- c = (b << 30) | (b >>> 2);
959
- b = a;
960
- a = t;
961
- }
962
- for (let index = 20; index < 40; index++) {
963
- t = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0x6ED9EBA1 + schedule[index]) | 0;
964
- e = d;
965
- d = c;
966
- c = (b << 30) | (b >>> 2);
967
- b = a;
968
- a = t;
969
- }
970
- for (let index = 40; index < 60; index++) {
971
- t = (((a << 5) | (a >>> 27)) + ((b & c) | (b & d) | (c & d)) + e + 0x8F1BBCDC + schedule[index]) | 0;
972
- e = d;
973
- d = c;
974
- c = (b << 30) | (b >>> 2);
975
- b = a;
976
- a = t;
977
- }
978
- for (let index = 60; index < SHA1_SCHEDULE_LENGTH; index++) {
979
- t = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0xCA62C1D6 + schedule[index]) | 0;
980
- e = d;
981
- d = c;
982
- c = (b << 30) | (b >>> 2);
983
- b = a;
984
- a = t;
1005
+ for (let index = 0; index < 15; index += 5) {
1006
+ e = (((a << 5) | (a >>> 27)) + (((c ^ d) & b) ^ d) + e + 0x5A827999 + schedule[index]) | 0;
1007
+ b = (b << 30) | (b >>> 2);
1008
+ d = (((e << 5) | (e >>> 27)) + (((b ^ c) & a) ^ c) + d + 0x5A827999 + schedule[index + 1]) | 0;
1009
+ a = (a << 30) | (a >>> 2);
1010
+ c = (((d << 5) | (d >>> 27)) + (((a ^ b) & e) ^ b) + c + 0x5A827999 + schedule[index + 2]) | 0;
1011
+ e = (e << 30) | (e >>> 2);
1012
+ b = (((c << 5) | (c >>> 27)) + (((e ^ a) & d) ^ a) + b + 0x5A827999 + schedule[index + 3]) | 0;
1013
+ d = (d << 30) | (d >>> 2);
1014
+ a = (((b << 5) | (b >>> 27)) + (((d ^ e) & c) ^ e) + a + 0x5A827999 + schedule[index + 4]) | 0;
1015
+ c = (c << 30) | (c >>> 2);
1016
+ }
1017
+ e = (((a << 5) | (a >>> 27)) + (((c ^ d) & b) ^ d) + e + 0x5A827999 + schedule[15]) | 0;
1018
+ b = (b << 30) | (b >>> 2);
1019
+ t = schedule[13] ^ schedule[8] ^ schedule[2] ^ schedule[0];
1020
+ t = (t << 1) | (t >>> 31);
1021
+ schedule[0] = t;
1022
+ d = (((e << 5) | (e >>> 27)) + (((b ^ c) & a) ^ c) + d + 0x5A827999 + t) | 0;
1023
+ a = (a << 30) | (a >>> 2);
1024
+ t = schedule[14] ^ schedule[9] ^ schedule[3] ^ schedule[1];
1025
+ t = (t << 1) | (t >>> 31);
1026
+ schedule[1] = t;
1027
+ c = (((d << 5) | (d >>> 27)) + (((a ^ b) & e) ^ b) + c + 0x5A827999 + t) | 0;
1028
+ e = (e << 30) | (e >>> 2);
1029
+ t = schedule[15] ^ schedule[10] ^ schedule[4] ^ schedule[2];
1030
+ t = (t << 1) | (t >>> 31);
1031
+ schedule[2] = t;
1032
+ b = (((c << 5) | (c >>> 27)) + (((e ^ a) & d) ^ a) + b + 0x5A827999 + t) | 0;
1033
+ d = (d << 30) | (d >>> 2);
1034
+ t = schedule[0] ^ schedule[11] ^ schedule[5] ^ schedule[3];
1035
+ t = (t << 1) | (t >>> 31);
1036
+ schedule[3] = t;
1037
+ a = (((b << 5) | (b >>> 27)) + (((d ^ e) & c) ^ e) + a + 0x5A827999 + t) | 0;
1038
+ c = (c << 30) | (c >>> 2);
1039
+ for (let index = 20; index < 40; index += 5) {
1040
+ t = schedule[(index - 3) & 15] ^ schedule[(index - 8) & 15] ^ schedule[(index - 14) & 15] ^ schedule[(index) & 15];
1041
+ t = (t << 1) | (t >>> 31);
1042
+ schedule[(index) & 15] = t;
1043
+ e = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0x6ED9EBA1 + t) | 0;
1044
+ b = (b << 30) | (b >>> 2);
1045
+ t = schedule[(index - 2) & 15] ^ schedule[(index - 7) & 15] ^ schedule[(index - 13) & 15] ^ schedule[(index + 1) & 15];
1046
+ t = (t << 1) | (t >>> 31);
1047
+ schedule[(index + 1) & 15] = t;
1048
+ d = (((e << 5) | (e >>> 27)) + (a ^ b ^ c) + d + 0x6ED9EBA1 + t) | 0;
1049
+ a = (a << 30) | (a >>> 2);
1050
+ t = schedule[(index - 1) & 15] ^ schedule[(index - 6) & 15] ^ schedule[(index - 12) & 15] ^ schedule[(index + 2) & 15];
1051
+ t = (t << 1) | (t >>> 31);
1052
+ schedule[(index + 2) & 15] = t;
1053
+ c = (((d << 5) | (d >>> 27)) + (e ^ a ^ b) + c + 0x6ED9EBA1 + t) | 0;
1054
+ e = (e << 30) | (e >>> 2);
1055
+ t = schedule[(index) & 15] ^ schedule[(index - 5) & 15] ^ schedule[(index - 11) & 15] ^ schedule[(index + 3) & 15];
1056
+ t = (t << 1) | (t >>> 31);
1057
+ schedule[(index + 3) & 15] = t;
1058
+ b = (((c << 5) | (c >>> 27)) + (d ^ e ^ a) + b + 0x6ED9EBA1 + t) | 0;
1059
+ d = (d << 30) | (d >>> 2);
1060
+ t = schedule[(index + 1) & 15] ^ schedule[(index - 4) & 15] ^ schedule[(index - 10) & 15] ^ schedule[(index + 4) & 15];
1061
+ t = (t << 1) | (t >>> 31);
1062
+ schedule[(index + 4) & 15] = t;
1063
+ a = (((b << 5) | (b >>> 27)) + (c ^ d ^ e) + a + 0x6ED9EBA1 + t) | 0;
1064
+ c = (c << 30) | (c >>> 2);
1065
+ }
1066
+ for (let index = 40; index < 60; index += 5) {
1067
+ t = schedule[(index - 3) & 15] ^ schedule[(index - 8) & 15] ^ schedule[(index - 14) & 15] ^ schedule[(index) & 15];
1068
+ t = (t << 1) | (t >>> 31);
1069
+ schedule[(index) & 15] = t;
1070
+ e = (((a << 5) | (a >>> 27)) + ((b & c) | ((b | c) & d)) + e + 0x8F1BBCDC + t) | 0;
1071
+ b = (b << 30) | (b >>> 2);
1072
+ t = schedule[(index - 2) & 15] ^ schedule[(index - 7) & 15] ^ schedule[(index - 13) & 15] ^ schedule[(index + 1) & 15];
1073
+ t = (t << 1) | (t >>> 31);
1074
+ schedule[(index + 1) & 15] = t;
1075
+ d = (((e << 5) | (e >>> 27)) + ((a & b) | ((a | b) & c)) + d + 0x8F1BBCDC + t) | 0;
1076
+ a = (a << 30) | (a >>> 2);
1077
+ t = schedule[(index - 1) & 15] ^ schedule[(index - 6) & 15] ^ schedule[(index - 12) & 15] ^ schedule[(index + 2) & 15];
1078
+ t = (t << 1) | (t >>> 31);
1079
+ schedule[(index + 2) & 15] = t;
1080
+ c = (((d << 5) | (d >>> 27)) + ((e & a) | ((e | a) & b)) + c + 0x8F1BBCDC + t) | 0;
1081
+ e = (e << 30) | (e >>> 2);
1082
+ t = schedule[(index) & 15] ^ schedule[(index - 5) & 15] ^ schedule[(index - 11) & 15] ^ schedule[(index + 3) & 15];
1083
+ t = (t << 1) | (t >>> 31);
1084
+ schedule[(index + 3) & 15] = t;
1085
+ b = (((c << 5) | (c >>> 27)) + ((d & e) | ((d | e) & a)) + b + 0x8F1BBCDC + t) | 0;
1086
+ d = (d << 30) | (d >>> 2);
1087
+ t = schedule[(index + 1) & 15] ^ schedule[(index - 4) & 15] ^ schedule[(index - 10) & 15] ^ schedule[(index + 4) & 15];
1088
+ t = (t << 1) | (t >>> 31);
1089
+ schedule[(index + 4) & 15] = t;
1090
+ a = (((b << 5) | (b >>> 27)) + ((c & d) | ((c | d) & e)) + a + 0x8F1BBCDC + t) | 0;
1091
+ c = (c << 30) | (c >>> 2);
1092
+ }
1093
+ for (let index = 60; index < 80; index += 5) {
1094
+ t = schedule[(index - 3) & 15] ^ schedule[(index - 8) & 15] ^ schedule[(index - 14) & 15] ^ schedule[(index) & 15];
1095
+ t = (t << 1) | (t >>> 31);
1096
+ schedule[(index) & 15] = t;
1097
+ e = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0xCA62C1D6 + t) | 0;
1098
+ b = (b << 30) | (b >>> 2);
1099
+ t = schedule[(index - 2) & 15] ^ schedule[(index - 7) & 15] ^ schedule[(index - 13) & 15] ^ schedule[(index + 1) & 15];
1100
+ t = (t << 1) | (t >>> 31);
1101
+ schedule[(index + 1) & 15] = t;
1102
+ d = (((e << 5) | (e >>> 27)) + (a ^ b ^ c) + d + 0xCA62C1D6 + t) | 0;
1103
+ a = (a << 30) | (a >>> 2);
1104
+ t = schedule[(index - 1) & 15] ^ schedule[(index - 6) & 15] ^ schedule[(index - 12) & 15] ^ schedule[(index + 2) & 15];
1105
+ t = (t << 1) | (t >>> 31);
1106
+ schedule[(index + 2) & 15] = t;
1107
+ c = (((d << 5) | (d >>> 27)) + (e ^ a ^ b) + c + 0xCA62C1D6 + t) | 0;
1108
+ e = (e << 30) | (e >>> 2);
1109
+ t = schedule[(index) & 15] ^ schedule[(index - 5) & 15] ^ schedule[(index - 11) & 15] ^ schedule[(index + 3) & 15];
1110
+ t = (t << 1) | (t >>> 31);
1111
+ schedule[(index + 3) & 15] = t;
1112
+ b = (((c << 5) | (c >>> 27)) + (d ^ e ^ a) + b + 0xCA62C1D6 + t) | 0;
1113
+ d = (d << 30) | (d >>> 2);
1114
+ t = schedule[(index + 1) & 15] ^ schedule[(index - 4) & 15] ^ schedule[(index - 10) & 15] ^ schedule[(index + 4) & 15];
1115
+ t = (t << 1) | (t >>> 31);
1116
+ schedule[(index + 4) & 15] = t;
1117
+ a = (((b << 5) | (b >>> 27)) + (c ^ d ^ e) + a + 0xCA62C1D6 + t) | 0;
1118
+ c = (c << 30) | (c >>> 2);
985
1119
  }
986
1120
  state[0] = (state[0] + a) | 0;
987
1121
  state[1] = (state[1] + b) | 0;
@@ -1044,6 +1178,10 @@
1044
1178
  return (S_BOX[word >>> 24] << 24) | (S_BOX[(word >>> 16) & 255] << 16) | (S_BOX[(word >>> 8) & 255] << 8) | S_BOX[word & 255];
1045
1179
  }
1046
1180
 
1181
+ function swapBytes(value) {
1182
+ return (value << 24) | ((value & 0xff00) << 8) | ((value >>> 8) & 0xff00) | (value >>> 24);
1183
+ }
1184
+
1047
1185
  function multiplyByTwo(value) {
1048
1186
  return ((value << 1) ^ ((value >> 7) * 0x1b)) & 255;
1049
1187
  }
@@ -2333,7 +2471,8 @@
2333
2471
  return new Promise(resolve => {
2334
2472
  const { worker, busy } = workerData;
2335
2473
  if (busy) {
2336
- workerData.resolveTerminated = resolve;
2474
+ workerData.terminateResolvers = workerData.terminateResolvers || [];
2475
+ workerData.terminateResolvers.push(resolve);
2337
2476
  } else {
2338
2477
  if (worker) {
2339
2478
  worker.terminate();
@@ -2346,14 +2485,14 @@
2346
2485
  },
2347
2486
  onTaskFinished() {
2348
2487
  if (workerData.busy) {
2349
- const { resolveTerminated, worker } = workerData;
2350
- if (resolveTerminated) {
2351
- workerData.resolveTerminated = null;
2488
+ const { terminateResolvers, worker } = workerData;
2489
+ if (terminateResolvers) {
2490
+ workerData.terminateResolvers = null;
2352
2491
  if (worker) {
2353
2492
  workerData.terminated = true;
2354
2493
  worker.terminate();
2355
2494
  }
2356
- resolveTerminated();
2495
+ terminateResolvers.forEach(resolve => resolve());
2357
2496
  }
2358
2497
  workerData.busy = false;
2359
2498
  onTaskFinished(workerData);
@@ -4539,7 +4678,7 @@
4539
4678
  Object.assign(this, {
4540
4679
  reader: new GenericReader(reader),
4541
4680
  options,
4542
- readRanges: new Map()
4681
+ readRanges: { indexes: new Set(), sortedRanges: [], pendingRanges: [] }
4543
4682
  });
4544
4683
  }
4545
4684
 
@@ -5184,7 +5323,6 @@
5184
5323
  throw new Error(ERR_ENTRY_DATA_OUT_OF_BOUNDS);
5185
5324
  }
5186
5325
  const size = compressedSize;
5187
- const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
5188
5326
  const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
5189
5327
  throwIfAborted(signal);
5190
5328
  let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
@@ -5258,6 +5396,7 @@
5258
5396
  writer = new GenericWriter(writer);
5259
5397
  await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
5260
5398
  ({ writable } = writer);
5399
+ const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
5261
5400
  const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
5262
5401
  if (writtenSize != outputSize) {
5263
5402
  throw Object.assign(new Error(ERR_INVALID_UNCOMPRESSED_SIZE), { outputSize: writtenSize });
@@ -5693,14 +5832,61 @@
5693
5832
  end: dataOffset + compressedSize + dataDescriptorLength,
5694
5833
  fileEntry
5695
5834
  };
5696
- for (const [otherIndex, otherRange] of readRanges) {
5697
- if (otherIndex != index && range.start < otherRange.end && otherRange.start < range.end) {
5835
+ const { indexes, sortedRanges, pendingRanges } = readRanges;
5836
+ if (!indexes.has(index)) {
5837
+ const overlappingRange = findOverlappingRange(sortedRanges, range) || pendingRanges.find(otherRange => rangesOverlap(range, otherRange));
5838
+ if (overlappingRange) {
5698
5839
  const error = new Error(ERR_OVERLAPPING_ENTRY);
5699
- error.overlappingEntry = otherRange.fileEntry;
5840
+ error.overlappingEntry = overlappingRange.fileEntry;
5700
5841
  throw error;
5701
5842
  }
5843
+ indexes.add(index);
5844
+ pendingRanges.push(range);
5845
+ if (pendingRanges.length * pendingRanges.length > sortedRanges.length) {
5846
+ pendingRanges.sort((range, otherRange) => range.start - otherRange.start);
5847
+ readRanges.sortedRanges = mergeRanges(sortedRanges, pendingRanges);
5848
+ pendingRanges.length = 0;
5849
+ }
5850
+ }
5851
+ }
5852
+
5853
+ function findOverlappingRange(sortedRanges, range) {
5854
+ let low = 0;
5855
+ let high = sortedRanges.length;
5856
+ while (low < high) {
5857
+ const middle = (low + high) >>> 1;
5858
+ if (sortedRanges[middle].start < range.start) {
5859
+ low = middle + 1;
5860
+ } else {
5861
+ high = middle;
5862
+ }
5863
+ }
5864
+ const previousRange = sortedRanges[low - 1];
5865
+ const nextRange = sortedRanges[low];
5866
+ if (previousRange && rangesOverlap(range, previousRange)) {
5867
+ return previousRange;
5868
+ }
5869
+ if (nextRange && rangesOverlap(range, nextRange)) {
5870
+ return nextRange;
5871
+ }
5872
+ }
5873
+
5874
+ function rangesOverlap(range, otherRange) {
5875
+ return range.start < otherRange.end && otherRange.start < range.end;
5876
+ }
5877
+
5878
+ function mergeRanges(sortedRanges, pendingRanges) {
5879
+ const mergedRanges = [];
5880
+ let indexSorted = 0;
5881
+ let indexPending = 0;
5882
+ while (indexSorted < sortedRanges.length || indexPending < pendingRanges.length) {
5883
+ if (indexPending == pendingRanges.length || (indexSorted < sortedRanges.length && sortedRanges[indexSorted].start < pendingRanges[indexPending].start)) {
5884
+ mergedRanges.push(sortedRanges[indexSorted++]);
5885
+ } else {
5886
+ mergedRanges.push(pendingRanges[indexPending++]);
5887
+ }
5702
5888
  }
5703
- readRanges.set(index, range);
5889
+ return mergedRanges;
5704
5890
  }
5705
5891
 
5706
5892
  function readDataDescriptor(dataDescriptorView, offset, extraFieldZip64) {
@@ -8631,7 +8817,7 @@
8631
8817
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8632
8818
  */
8633
8819
 
8634
- const VERSION = "2.14.0";
8820
+ const VERSION = "2.14.1";
8635
8821
 
8636
8822
  /*
8637
8823
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.