@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
@@ -445,7 +445,7 @@
445
445
  Object.assign(config, DEFAULT_CONFIGURATION);
446
446
  }
447
447
 
448
- 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=()=>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();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;
448
+ 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=new Uint8Array(288);q.fill(8,0,144),q.fill(9,144,256),q.fill(7,256,280),q.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),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;
449
449
 
450
450
  /*
451
451
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -575,7 +575,7 @@
575
575
  T[k][n] = (previous >>> 8) ^ T[0][previous & 0xFF];
576
576
  }
577
577
  }
578
- const [T0, T1, T2, T3, T4, T5, T6, T7] = T;
578
+ const [T0$1, T1$1, T2$1, T3$1, T4, T5, T6, T7] = T;
579
579
 
580
580
  class Crc32 {
581
581
 
@@ -597,12 +597,12 @@
597
597
  const a = crc ^ view.getInt32(offset, true);
598
598
  const b = view.getInt32(offset + 4, true);
599
599
  crc = T7[a & 0xFF] ^ T6[(a >>> 8) & 0xFF] ^ T5[(a >>> 16) & 0xFF] ^ T4[(a >>> 24) & 0xFF] ^
600
- T3[b & 0xFF] ^ T2[(b >>> 8) & 0xFF] ^ T1[(b >>> 16) & 0xFF] ^ T0[(b >>> 24) & 0xFF];
600
+ T3$1[b & 0xFF] ^ T2$1[(b >>> 8) & 0xFF] ^ T1$1[(b >>> 16) & 0xFF] ^ T0$1[(b >>> 24) & 0xFF];
601
601
  }
602
602
  }
603
603
  // Remaining tail (and non-typed inputs) byte-at-a-time with the base table.
604
604
  for (; offset < length; offset++) {
605
- crc = (crc >>> 8) ^ T0[(crc ^ data[offset]) & 0xFF];
605
+ crc = (crc >>> 8) ^ T0$1[(crc ^ data[offset]) & 0xFF];
606
606
  }
607
607
  this.crc = crc;
608
608
  }
@@ -706,794 +706,349 @@
706
706
  }
707
707
  }
708
708
 
709
- // Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
710
-
711
- // deno-lint-ignore-file no-this-alias
712
-
713
709
  /*
714
- * SJCL is open. You can use, modify and redistribute it under a BSD
715
- * license or under the GNU GPL, version 2.0.
716
- */
717
-
718
- /** @fileOverview Javascript cryptography implementation.
719
- *
720
- * Crush to remove comments, shorten variable names and
721
- * generally reduce transmission size.
722
- *
723
- * @author Emily Stark
724
- * @author Mike Hamburg
725
- * @author Dan Boneh
726
- */
727
-
728
- /*jslint indent: 2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */
729
-
730
- /** @fileOverview Arrays of bits, encoded as arrays of Numbers.
731
- *
732
- * @author Emily Stark
733
- * @author Mike Hamburg
734
- * @author Dan Boneh
735
- */
736
-
737
- /**
738
- * Arrays of bits, encoded as arrays of Numbers.
739
- * @namespace
740
- * @description
741
- * <p>
742
- * These objects are the currency accepted by SJCL's crypto functions.
743
- * </p>
744
- *
745
- * <p>
746
- * Most of our crypto primitives operate on arrays of 4-byte words internally,
747
- * but many of them can take arguments that are not a multiple of 4 bytes.
748
- * This library encodes arrays of bits (whose size need not be a multiple of 8
749
- * bits) as arrays of 32-bit words. The bits are packed, big-endian, into an
750
- * array of words, 32 bits at a time. Since the words are double-precision
751
- * floating point numbers, they fit some extra data. We use this (in a private,
752
- * possibly-changing manner) to encode the number of bits actually present
753
- * in the last word of the array.
754
- * </p>
755
- *
756
- * <p>
757
- * Because bitwise ops clear this out-of-band data, these arrays can be passed
758
- * to ciphers like AES which want arrays of words.
759
- * </p>
760
- */
761
- const bitArray = {
762
- /**
763
- * Concatenate two bit arrays.
764
- * @param {bitArray} a1 The first array.
765
- * @param {bitArray} a2 The second array.
766
- * @return {bitArray} The concatenation of a1 and a2.
767
- */
768
- concat(a1, a2) {
769
- if (a1.length === 0 || a2.length === 0) {
770
- return a1.concat(a2);
771
- }
772
-
773
- const last = a1[a1.length - 1], shift = bitArray.getPartial(last);
774
- if (shift === 32) {
775
- return a1.concat(a2);
776
- } else {
777
- return bitArray._shiftRight(a2, shift, last | 0, a1.slice(0, a1.length - 1));
778
- }
779
- },
780
-
781
- /**
782
- * Find the length of an array of bits.
783
- * @param {bitArray} a The array.
784
- * @return {Number} The length of a, in bits.
785
- */
786
- bitLength(a) {
787
- const l = a.length;
788
- if (l === 0) {
789
- return 0;
790
- }
791
- const x = a[l - 1];
792
- return (l - 1) * 32 + bitArray.getPartial(x);
793
- },
794
-
795
- /**
796
- * Truncate an array.
797
- * @param {bitArray} a The array.
798
- * @param {Number} len The length to truncate to, in bits.
799
- * @return {bitArray} A new array, truncated to len bits.
800
- */
801
- clamp(a, len) {
802
- if (a.length * 32 < len) {
803
- return a;
804
- }
805
- a = a.slice(0, Math.ceil(len / 32));
806
- const l = a.length;
807
- len = len & 31;
808
- if (l > 0 && len) {
809
- a[l - 1] = bitArray.partial(len, a[l - 1] & 0x80000000 >> (len - 1), 1);
810
- }
811
- return a;
812
- },
813
-
814
- /**
815
- * Make a partial word for a bit array.
816
- * @param {Number} len The number of bits in the word.
817
- * @param {Number} x The bits.
818
- * @param {Number} [_end=0] Pass 1 if x has already been shifted to the high side.
819
- * @return {Number} The partial word.
820
- */
821
- partial(len, x, _end) {
822
- if (len === 32) {
823
- return x;
824
- }
825
- return (_end ? x | 0 : x << (32 - len)) + len * 0x10000000000;
826
- },
710
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
827
711
 
828
- /**
829
- * Get the number of bits used by a partial word.
830
- * @param {Number} x The partial word.
831
- * @return {Number} The number of bits used by the partial word.
832
- */
833
- getPartial(x) {
834
- return Math.round(x / 0x10000000000) || 32;
835
- },
712
+ Redistribution and use in source and binary forms, with or without
713
+ modification, are permitted provided that the following conditions are met:
836
714
 
837
- /** Shift an array right.
838
- * @param {bitArray} a The array to shift.
839
- * @param {Number} shift The number of bits to shift.
840
- * @param {Number} [carry=0] A byte to carry in
841
- * @param {bitArray} [out=[]] An array to prepend to the output.
842
- * @private
843
- */
844
- _shiftRight(a, shift, carry, out) {
845
- if (out === undefined) {
846
- out = [];
847
- }
715
+ 1. Redistributions of source code must retain the above copyright notice,
716
+ this list of conditions and the following disclaimer.
848
717
 
849
- for (; shift >= 32; shift -= 32) {
850
- out.push(carry);
851
- carry = 0;
852
- }
853
- if (shift === 0) {
854
- return out.concat(a);
855
- }
718
+ 2. Redistributions in binary form must reproduce the above copyright
719
+ notice, this list of conditions and the following disclaimer in
720
+ the documentation and/or other materials provided with the distribution.
856
721
 
857
- for (let i = 0; i < a.length; i++) {
858
- out.push(carry | a[i] >>> shift);
859
- carry = a[i] << (32 - shift);
860
- }
861
- const last2 = a.length ? a[a.length - 1] : 0;
862
- const shift2 = bitArray.getPartial(last2);
863
- out.push(bitArray.partial(shift + shift2 & 31, (shift + shift2 > 32) ? carry : out.pop(), 1));
864
- return out;
865
- }
866
- };
722
+ 3. The names of the authors may not be used to endorse or promote products
723
+ derived from this software without specific prior written permission.
867
724
 
868
- /** @fileOverview Bit array codec implementations.
869
- *
870
- * @author Emily Stark
871
- * @author Mike Hamburg
872
- * @author Dan Boneh
725
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
726
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
727
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
728
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
729
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
730
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
731
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
732
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
733
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
734
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
873
735
  */
874
736
 
875
- /**
876
- * Arrays of bytes
877
- * @namespace
878
- */
879
- const codec = {
880
- bytes: {
881
- /** Convert from a bitArray to an array of bytes. */
882
- fromBits(arr) {
883
- const bl = bitArray.bitLength(arr);
884
- const byteLength = bl / 8;
885
- const out = new Uint8Array(byteLength);
886
- let tmp;
887
- for (let i = 0; i < byteLength; i++) {
888
- if ((i & 3) === 0) {
889
- tmp = arr[i / 4];
890
- }
891
- out[i] = tmp >>> 24;
892
- tmp <<= 8;
893
- }
894
- return out;
895
- },
896
- /** Convert from an array of bytes to a bitArray. */
897
- toBits(bytes) {
898
- const out = [];
899
- let i;
900
- let tmp = 0;
901
- for (i = 0; i < bytes.length; i++) {
902
- tmp = tmp << 8 | bytes[i];
903
- if ((i & 3) === 3) {
904
- out.push(tmp);
905
- tmp = 0;
906
- }
737
+ const BLOCK_LENGTH$1 = 16;
738
+ const ROUND_KEYS_LENGTH = 60;
739
+ const SHA1_BLOCK_LENGTH = 64;
740
+ const SHA1_DIGEST_LENGTH = 20;
741
+ const SHA1_SCHEDULE_LENGTH = 80;
742
+ const SHA1_LENGTH_OFFSET = 56;
743
+ const SHA1_PADDING = new Uint8Array([0x80]);
744
+ const SHA1_ZERO = new Uint8Array(1);
745
+ const SHA1_INITIAL_STATE = new Int32Array([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
746
+ const HMAC_INNER_PADDING = 0x36;
747
+ const HMAC_OUTER_PADDING = 0x5c;
748
+ const S_BOX = new Uint8Array(256);
749
+ const T0 = new Int32Array(256);
750
+ const T1 = new Int32Array(256);
751
+ const T2 = new Int32Array(256);
752
+ const T3 = new Int32Array(256);
753
+
754
+ let tablesInitialized = false;
755
+
756
+ function createEngine$1(key, authenticationKey) {
757
+ initTables();
758
+ const roundKeys = new Int32Array(ROUND_KEYS_LENGTH);
759
+ const rounds = expandKey(key, roundKeys);
760
+ const counter = new Uint8Array(BLOCK_LENGTH$1);
761
+ const keystream = new Int32Array(BLOCK_LENGTH$1 / 4);
762
+ const hmac = createHmac(authenticationKey);
763
+ return {
764
+ process(data, decrypt) {
765
+ if (decrypt) {
766
+ hmac.update(data, 0, data.length);
907
767
  }
908
- if (i & 3) {
909
- out.push(bitArray.partial(8 * (i & 3), tmp));
768
+ encrypt(data);
769
+ if (!decrypt) {
770
+ hmac.update(data, 0, data.length);
910
771
  }
911
- return out;
912
- }
913
- }
914
- };
915
-
916
- const hash = {};
917
-
918
- /**
919
- * Context for a SHA-1 operation in progress.
920
- * @constructor
921
- */
922
- hash.sha1 = class {
923
- constructor(hash) {
924
- const sha1 = this;
925
- /**
926
- * The hash's block size, in bits.
927
- * @constant
928
- */
929
- sha1.blockSize = 512;
930
- /**
931
- * The SHA-1 initialization vector.
932
- * @private
933
- */
934
- sha1._init = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0];
935
- /**
936
- * The SHA-1 hash key.
937
- * @private
938
- */
939
- sha1._key = [0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6];
940
- if (hash) {
941
- sha1._h = hash._h.slice(0);
942
- sha1._buffer = hash._buffer.slice(0);
943
- sha1._length = hash._length;
944
- } else {
945
- sha1.reset();
946
- }
947
- }
948
-
949
- /**
950
- * Reset the hash state.
951
- * @return this
952
- */
953
- reset() {
954
- const sha1 = this;
955
- sha1._h = sha1._init.slice(0);
956
- sha1._buffer = [];
957
- sha1._length = 0;
958
- return sha1;
959
- }
960
-
961
- /**
962
- * Input several words to the hash.
963
- * @param {bitArray|String} data the data to hash.
964
- * @return this
965
- */
966
- update(data) {
967
- const sha1 = this;
968
- if (typeof data === "string") {
969
- data = codec.utf8String.toBits(data);
970
- }
971
- const b = sha1._buffer = bitArray.concat(sha1._buffer, data);
972
- const ol = sha1._length;
973
- const nl = sha1._length = ol + bitArray.bitLength(data);
974
- if (nl > 9007199254740991) {
975
- throw new Error("Cannot hash more than 2^53 - 1 bits");
976
- }
977
- const c = new Uint32Array(b);
978
- let j = 0;
979
- for (let i = sha1.blockSize + ol - ((sha1.blockSize + ol) & (sha1.blockSize - 1)); i <= nl;
980
- i += sha1.blockSize) {
981
- sha1._block(c.subarray(16 * j, 16 * (j + 1)));
982
- j += 1;
983
- }
984
- b.splice(0, 16 * j);
985
- return sha1;
986
- }
987
-
988
- /**
989
- * Complete hashing and output the hash value.
990
- * @return {bitArray} The hash value, an array of 5 big-endian words. TODO
991
- */
992
- finalize() {
993
- const sha1 = this;
994
- let b = sha1._buffer;
995
- const h = sha1._h;
996
-
997
- // Round out and push the buffer
998
- b = bitArray.concat(b, [bitArray.partial(1, 1)]);
999
- // Round out the buffer to a multiple of 16 words, less the 2 length words.
1000
- for (let i = b.length + 2; i & 15; i++) {
1001
- b.push(0);
1002
- }
1003
-
1004
- // append the length
1005
- b.push(Math.floor(sha1._length / 0x100000000));
1006
- b.push(sha1._length | 0);
1007
-
1008
- while (b.length) {
1009
- sha1._block(b.splice(0, 16));
1010
- }
1011
-
1012
- sha1.reset();
1013
- return h;
1014
- }
1015
-
1016
- /**
1017
- * The SHA-1 logical functions f(0), f(1), ..., f(79).
1018
- * @private
1019
- */
1020
- _f(t, b, c, d) {
1021
- if (t <= 19) {
1022
- return (b & c) | (~b & d);
1023
- } else if (t <= 39) {
1024
- return b ^ c ^ d;
1025
- } else if (t <= 59) {
1026
- return (b & c) | (b & d) | (c & d);
1027
- } else if (t <= 79) {
1028
- return b ^ c ^ d;
1029
- }
1030
- }
1031
-
1032
- /**
1033
- * Circular left-shift operator.
1034
- * @private
1035
- */
1036
- _S(n, x) {
1037
- return (x << n) | (x >>> 32 - n);
1038
- }
1039
-
1040
- /**
1041
- * Perform one cycle of SHA-1.
1042
- * @param {Uint32Array|bitArray} words one block of words.
1043
- * @private
1044
- */
1045
- _block(words) {
1046
- const sha1 = this;
1047
- const h = sha1._h;
1048
- // When words is passed to _block, it has 16 elements. SHA1 _block
1049
- // function extends words with new elements (at the end there are 80 elements).
1050
- // The problem is that if we use Uint32Array instead of Array,
1051
- // the length of Uint32Array cannot be changed. Thus, we replace words with a
1052
- // normal Array here.
1053
- const w = Array(80); // do not use Uint32Array here as the instantiation is slower
1054
- for (let j = 0; j < 16; j++) {
1055
- w[j] = words[j];
1056
- }
1057
-
1058
- let a = h[0];
1059
- let b = h[1];
1060
- let c = h[2];
1061
- let d = h[3];
1062
- let e = h[4];
1063
-
1064
- for (let t = 0; t <= 79; t++) {
1065
- if (t >= 16) {
1066
- w[t] = sha1._S(1, w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16]);
1067
- }
1068
- const tmp = (sha1._S(5, a) + sha1._f(t, b, c, d) + e + w[t] +
1069
- sha1._key[Math.floor(t / 20)]) | 0;
1070
- e = d;
1071
- d = c;
1072
- c = sha1._S(30, b);
1073
- b = a;
1074
- a = tmp;
772
+ },
773
+ digest() {
774
+ return hmac.digest();
1075
775
  }
776
+ };
1076
777
 
1077
- h[0] = (h[0] + a) | 0;
1078
- h[1] = (h[1] + b) | 0;
1079
- h[2] = (h[2] + c) | 0;
1080
- h[3] = (h[3] + d) | 0;
1081
- h[4] = (h[4] + e) | 0;
778
+ function encrypt(data) {
779
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
780
+ const length = data.length;
781
+ let offset = 0;
782
+ for (; offset + BLOCK_LENGTH$1 <= length; offset += BLOCK_LENGTH$1) {
783
+ nextKeystream();
784
+ view.setInt32(offset, view.getInt32(offset) ^ keystream[0]);
785
+ view.setInt32(offset + 4, view.getInt32(offset + 4) ^ keystream[1]);
786
+ view.setInt32(offset + 8, view.getInt32(offset + 8) ^ keystream[2]);
787
+ view.setInt32(offset + 12, view.getInt32(offset + 12) ^ keystream[3]);
788
+ }
789
+ if (offset < length) {
790
+ nextKeystream();
791
+ for (let indexByte = 0; offset < length; offset++, indexByte++) {
792
+ data[offset] ^= keystream[indexByte >> 2] >>> (24 - 8 * (indexByte & 3));
793
+ }
794
+ }
795
+ }
796
+
797
+ function nextKeystream() {
798
+ for (let indexByte = 0; indexByte < BLOCK_LENGTH$1; indexByte++) {
799
+ counter[indexByte]++;
800
+ if (counter[indexByte] !== 0) {
801
+ break;
802
+ }
803
+ }
804
+ let s0 = ((counter[0] << 24) | (counter[1] << 16) | (counter[2] << 8) | counter[3]) ^ roundKeys[0];
805
+ let s1 = ((counter[4] << 24) | (counter[5] << 16) | (counter[6] << 8) | counter[7]) ^ roundKeys[1];
806
+ let s2 = ((counter[8] << 24) | (counter[9] << 16) | (counter[10] << 8) | counter[11]) ^ roundKeys[2];
807
+ let s3 = ((counter[12] << 24) | (counter[13] << 16) | (counter[14] << 8) | counter[15]) ^ roundKeys[3];
808
+ let indexKey = 4;
809
+ for (let round = 1; round < rounds; round++, indexKey += 4) {
810
+ const t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[indexKey];
811
+ const t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[indexKey + 1];
812
+ const t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[indexKey + 2];
813
+ const t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[indexKey + 3];
814
+ s0 = t0;
815
+ s1 = t1;
816
+ s2 = t2;
817
+ s3 = t3;
818
+ }
819
+ keystream[0] = ((S_BOX[s0 >>> 24] << 24) | (S_BOX[(s1 >>> 16) & 255] << 16) | (S_BOX[(s2 >>> 8) & 255] << 8) | S_BOX[s3 & 255]) ^ roundKeys[indexKey];
820
+ keystream[1] = ((S_BOX[s1 >>> 24] << 24) | (S_BOX[(s2 >>> 16) & 255] << 16) | (S_BOX[(s3 >>> 8) & 255] << 8) | S_BOX[s0 & 255]) ^ roundKeys[indexKey + 1];
821
+ keystream[2] = ((S_BOX[s2 >>> 24] << 24) | (S_BOX[(s3 >>> 16) & 255] << 16) | (S_BOX[(s0 >>> 8) & 255] << 8) | S_BOX[s1 & 255]) ^ roundKeys[indexKey + 2];
822
+ keystream[3] = ((S_BOX[s3 >>> 24] << 24) | (S_BOX[(s0 >>> 16) & 255] << 16) | (S_BOX[(s1 >>> 8) & 255] << 8) | S_BOX[s2 & 255]) ^ roundKeys[indexKey + 3];
823
+ }
824
+ }
825
+
826
+ function pbkdf2(password, salt, iterations, length) {
827
+ const hmac = createHmac(password);
828
+ const result = new Uint8Array(length);
829
+ const block = new Uint8Array(salt.length + 4);
830
+ const blockView = new DataView(block.buffer);
831
+ block.set(salt);
832
+ for (let indexBlock = 1, offset = 0; offset < length; indexBlock++, offset += SHA1_DIGEST_LENGTH) {
833
+ blockView.setUint32(salt.length, indexBlock);
834
+ hmac.update(block, 0, block.length);
835
+ let previous = hmac.digest();
836
+ const output = previous.slice();
837
+ for (let iteration = 1; iteration < iterations; iteration++) {
838
+ hmac.update(previous, 0, SHA1_DIGEST_LENGTH);
839
+ previous = hmac.digest();
840
+ for (let indexByte = 0; indexByte < SHA1_DIGEST_LENGTH; indexByte++) {
841
+ output[indexByte] ^= previous[indexByte];
842
+ }
843
+ }
844
+ result.set(output.subarray(0, Math.min(SHA1_DIGEST_LENGTH, length - offset)), offset);
1082
845
  }
1083
- };
1084
-
1085
- /** @fileOverview Low-level AES implementation.
1086
- *
1087
- * This file contains a low-level implementation of AES, optimized for
1088
- * size and for efficiency on several browsers. It is based on
1089
- * OpenSSL's aes_core.c, a public-domain implementation by Vincent
1090
- * Rijmen, Antoon Bosselaers and Paulo Barreto.
1091
- *
1092
- * An older version of this implementation is available in the public
1093
- * domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh,
1094
- * Stanford University 2008-2010 and BSD-licensed for liability
1095
- * reasons.
1096
- *
1097
- * @author Emily Stark
1098
- * @author Mike Hamburg
1099
- * @author Dan Boneh
1100
- */
1101
-
1102
- const cipher = {};
1103
-
1104
- /**
1105
- * Schedule out an AES key for both encryption and decryption. This
1106
- * is a low-level class. Use a cipher mode to do bulk encryption.
1107
- *
1108
- * @constructor
1109
- * @param {Array} key The key as an array of 4, 6 or 8 words.
1110
- */
1111
- cipher.aes = class {
1112
- constructor(key) {
1113
- /**
1114
- * The expanded S-box and inverse S-box tables. These will be computed
1115
- * on the client so that we don't have to send them down the wire.
1116
- *
1117
- * There are two tables, _tables[0] is for encryption and
1118
- * _tables[1] is for decryption.
1119
- *
1120
- * The first 4 sub-tables are the expanded S-box with MixColumns. The
1121
- * last (_tables[01][4]) is the S-box itself.
1122
- *
1123
- * @private
1124
- */
1125
- const aes = this;
1126
- aes._tables = [[[], [], [], [], []], [[], [], [], [], []]];
1127
-
1128
- if (!aes._tables[0][0][0]) {
1129
- aes._precompute();
1130
- }
1131
-
1132
- const sbox = aes._tables[0][4];
1133
- const decTable = aes._tables[1];
1134
- const keyLen = key.length;
1135
-
1136
- let i, encKey, decKey, rcon = 1;
1137
-
1138
- if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) {
1139
- throw new Error("invalid aes key size");
1140
- }
1141
-
1142
- aes._key = [encKey = key.slice(0), decKey = []];
1143
-
1144
- // schedule encryption keys
1145
- for (i = keyLen; i < 4 * keyLen + 28; i++) {
1146
- let tmp = encKey[i - 1];
1147
-
1148
- // apply sbox
1149
- if (i % keyLen === 0 || (keyLen === 8 && i % keyLen === 4)) {
1150
- tmp = sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255];
1151
-
1152
- // shift rows and add rcon
1153
- if (i % keyLen === 0) {
1154
- tmp = tmp << 8 ^ tmp >>> 24 ^ rcon << 24;
1155
- rcon = rcon << 1 ^ (rcon >> 7) * 283;
1156
- }
1157
- }
1158
-
1159
- encKey[i] = encKey[i - keyLen] ^ tmp;
1160
- }
846
+ return result;
847
+ }
1161
848
 
1162
- // schedule decryption keys
1163
- for (let j = 0; i; j++, i--) {
1164
- const tmp = encKey[j & 3 ? i : i - 4];
1165
- if (i <= 4 || j < 4) {
1166
- decKey[j] = tmp;
1167
- } else {
1168
- decKey[j] = decTable[0][sbox[tmp >>> 24]] ^
1169
- decTable[1][sbox[tmp >> 16 & 255]] ^
1170
- decTable[2][sbox[tmp >> 8 & 255]] ^
1171
- decTable[3][sbox[tmp & 255]];
1172
- }
1173
- }
1174
- }
1175
- // public
1176
- /* Something like this might appear here eventually
1177
- name: "AES",
1178
- blockSize: 4,
1179
- keySizes: [4,6,8],
1180
- */
1181
-
1182
- /**
1183
- * Encrypt an array of 4 big-endian words.
1184
- * @param {Array} data The plaintext.
1185
- * @return {Array} The ciphertext.
1186
- */
1187
- encrypt(data) {
1188
- return this._crypt(data, 0);
1189
- }
1190
-
1191
- /**
1192
- * Decrypt an array of 4 big-endian words.
1193
- * @param {Array} data The ciphertext.
1194
- * @return {Array} The plaintext.
1195
- */
1196
- decrypt(data) {
1197
- return this._crypt(data, 1);
1198
- }
1199
-
1200
- /**
1201
- * Expand the S-box tables.
1202
- *
1203
- * @private
1204
- */
1205
- _precompute() {
1206
- const encTable = this._tables[0];
1207
- const decTable = this._tables[1];
1208
- const sbox = encTable[4];
1209
- const sboxInv = decTable[4];
1210
- const d = [];
1211
- const th = [];
1212
- let xInv, x2, x4, x8;
1213
-
1214
- // Compute double and third tables
1215
- for (let i = 0; i < 256; i++) {
1216
- th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i;
1217
- }
1218
-
1219
- for (let x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {
1220
- // Compute sbox
1221
- let s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;
1222
- s = s >> 8 ^ s & 255 ^ 99;
1223
- sbox[x] = s;
1224
- sboxInv[s] = x;
1225
-
1226
- // Compute MixColumns
1227
- x8 = d[x4 = d[x2 = d[x]]];
1228
- let tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;
1229
- let tEnc = d[s] * 0x101 ^ s * 0x1010100;
1230
-
1231
- for (let i = 0; i < 4; i++) {
1232
- encTable[i][x] = tEnc = tEnc << 24 ^ tEnc >>> 8;
1233
- decTable[i][s] = tDec = tDec << 24 ^ tDec >>> 8;
1234
- }
1235
- }
1236
-
1237
- // Compactify. Considerable speedup on Firefox.
1238
- for (let i = 0; i < 5; i++) {
1239
- encTable[i] = encTable[i].slice(0);
1240
- decTable[i] = decTable[i].slice(0);
1241
- }
1242
- }
1243
-
1244
- /**
1245
- * Encryption and decryption core.
1246
- * @param {Array} input Four words to be encrypted or decrypted.
1247
- * @param dir The direction, 0 for encrypt and 1 for decrypt.
1248
- * @return {Array} The four encrypted or decrypted words.
1249
- * @private
1250
- */
1251
- _crypt(input, dir) {
1252
- if (input.length !== 4) {
1253
- throw new Error("invalid aes block size");
1254
- }
1255
-
1256
- const key = this._key[dir];
1257
-
1258
- const nInnerRounds = key.length / 4 - 2;
1259
- const out = [0, 0, 0, 0];
1260
- const table = this._tables[dir];
1261
-
1262
- // load up the tables
1263
- const t0 = table[0];
1264
- const t1 = table[1];
1265
- const t2 = table[2];
1266
- const t3 = table[3];
1267
- const sbox = table[4];
1268
-
1269
- // state variables a,b,c,d are loaded with pre-whitened data
1270
- let a = input[0] ^ key[0];
1271
- let b = input[dir ? 3 : 1] ^ key[1];
1272
- let c = input[2] ^ key[2];
1273
- let d = input[dir ? 1 : 3] ^ key[3];
1274
- let kIndex = 4;
1275
- let a2, b2, c2;
1276
-
1277
- // Inner rounds. Cribbed from OpenSSL.
1278
- for (let i = 0; i < nInnerRounds; i++) {
1279
- a2 = t0[a >>> 24] ^ t1[b >> 16 & 255] ^ t2[c >> 8 & 255] ^ t3[d & 255] ^ key[kIndex];
1280
- b2 = t0[b >>> 24] ^ t1[c >> 16 & 255] ^ t2[d >> 8 & 255] ^ t3[a & 255] ^ key[kIndex + 1];
1281
- c2 = t0[c >>> 24] ^ t1[d >> 16 & 255] ^ t2[a >> 8 & 255] ^ t3[b & 255] ^ key[kIndex + 2];
1282
- d = t0[d >>> 24] ^ t1[a >> 16 & 255] ^ t2[b >> 8 & 255] ^ t3[c & 255] ^ key[kIndex + 3];
1283
- kIndex += 4;
1284
- a = a2; b = b2; c = c2;
1285
- }
1286
-
1287
- // Last round.
1288
- for (let i = 0; i < 4; i++) {
1289
- out[dir ? 3 & -i : i] =
1290
- sbox[a >>> 24] << 24 ^
1291
- sbox[b >> 16 & 255] << 16 ^
1292
- sbox[c >> 8 & 255] << 8 ^
1293
- sbox[d & 255] ^
1294
- key[kIndex++];
1295
- a2 = a; a = b; b = c; c = d; d = a2;
1296
- }
1297
-
1298
- return out;
849
+ function createHmac(key) {
850
+ const sha1 = createSha1();
851
+ const innerKey = new Uint8Array(SHA1_BLOCK_LENGTH);
852
+ const outerKey = new Uint8Array(SHA1_BLOCK_LENGTH);
853
+ if (key.length > SHA1_BLOCK_LENGTH) {
854
+ sha1.update(key, 0, key.length);
855
+ key = sha1.digest();
1299
856
  }
1300
- };
1301
-
1302
- /** @fileOverview CTR mode implementation.
1303
- *
1304
- * Special thanks to Roy Nicholson for pointing out a bug in our
1305
- * implementation.
1306
- *
1307
- * @author Emily Stark
1308
- * @author Mike Hamburg
1309
- * @author Dan Boneh
1310
- */
1311
-
1312
- /** Brian Gladman's CTR Mode.
1313
- * @constructor
1314
- * @param {Object} _prf The aes instance to generate key.
1315
- * @param {bitArray} _iv The iv for ctr mode, it must be 128 bits.
1316
- */
1317
-
1318
- const mode = {};
1319
-
1320
- /**
1321
- * Brian Gladman's CTR Mode.
1322
- * @namespace
1323
- */
1324
- mode.ctrGladman = class {
1325
- constructor(prf, iv) {
1326
- this._prf = prf;
1327
- this._initIv = iv;
1328
- this._iv = iv;
857
+ for (let indexByte = 0; indexByte < SHA1_BLOCK_LENGTH; indexByte++) {
858
+ const keyByte = indexByte < key.length ? key[indexByte] : 0;
859
+ innerKey[indexByte] = keyByte ^ HMAC_INNER_PADDING;
860
+ outerKey[indexByte] = keyByte ^ HMAC_OUTER_PADDING;
1329
861
  }
862
+ sha1.update(innerKey, 0, SHA1_BLOCK_LENGTH);
863
+ return {
864
+ update(data, offset, length) {
865
+ sha1.update(data, offset, length);
866
+ },
867
+ digest() {
868
+ const innerDigest = sha1.digest();
869
+ sha1.update(outerKey, 0, SHA1_BLOCK_LENGTH);
870
+ sha1.update(innerDigest, 0, SHA1_DIGEST_LENGTH);
871
+ const result = sha1.digest();
872
+ sha1.update(innerKey, 0, SHA1_BLOCK_LENGTH);
873
+ return result;
874
+ }
875
+ };
876
+ }
1330
877
 
1331
- reset() {
1332
- this._iv = this._initIv;
1333
- }
878
+ function createSha1() {
879
+ const state = new Int32Array(SHA1_INITIAL_STATE);
880
+ const schedule = new Int32Array(SHA1_SCHEDULE_LENGTH);
881
+ const block = new Uint8Array(SHA1_BLOCK_LENGTH);
882
+ const blockView = new DataView(block.buffer);
883
+ const lengthBytes = new Uint8Array(8);
884
+ let blockLength = 0;
885
+ let totalLength = 0;
886
+ return {
887
+ update,
888
+ digest
889
+ };
1334
890
 
1335
- /** Input some data to calculate.
1336
- * @param {bitArray} data the data to process, it must be intergral multiple of 128 bits unless it's the last.
1337
- */
1338
- update(data) {
1339
- return this.calculate(this._prf, data, this._iv);
891
+ function update(data, offset, length) {
892
+ const end = offset + length;
893
+ totalLength += length;
894
+ if (blockLength) {
895
+ while (offset < end && blockLength < SHA1_BLOCK_LENGTH) {
896
+ block[blockLength++] = data[offset++];
897
+ }
898
+ if (blockLength == SHA1_BLOCK_LENGTH) {
899
+ compress(blockView, 0);
900
+ blockLength = 0;
901
+ }
902
+ }
903
+ if (offset + SHA1_BLOCK_LENGTH <= end) {
904
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
905
+ for (; offset + SHA1_BLOCK_LENGTH <= end; offset += SHA1_BLOCK_LENGTH) {
906
+ compress(view, offset);
907
+ }
908
+ }
909
+ while (offset < end) {
910
+ block[blockLength++] = data[offset++];
911
+ }
912
+ }
913
+
914
+ function digest() {
915
+ const bits = totalLength * 8;
916
+ const high = Math.floor(bits / 0x100000000);
917
+ const low = bits >>> 0;
918
+ update(SHA1_PADDING, 0, 1);
919
+ while (blockLength != SHA1_LENGTH_OFFSET) {
920
+ update(SHA1_ZERO, 0, 1);
921
+ }
922
+ lengthBytes[0] = high >>> 24;
923
+ lengthBytes[1] = high >>> 16;
924
+ lengthBytes[2] = high >>> 8;
925
+ lengthBytes[3] = high;
926
+ lengthBytes[4] = low >>> 24;
927
+ lengthBytes[5] = low >>> 16;
928
+ lengthBytes[6] = low >>> 8;
929
+ lengthBytes[7] = low;
930
+ update(lengthBytes, 0, 8);
931
+ const result = new Uint8Array(SHA1_DIGEST_LENGTH);
932
+ const resultView = new DataView(result.buffer);
933
+ for (let indexWord = 0; indexWord < state.length; indexWord++) {
934
+ resultView.setInt32(4 * indexWord, state[indexWord]);
935
+ }
936
+ state.set(SHA1_INITIAL_STATE);
937
+ blockLength = 0;
938
+ totalLength = 0;
939
+ return result;
1340
940
  }
1341
941
 
1342
- incWord(word) {
1343
- if (((word >> 24) & 0xff) === 0xff) { //overflow
1344
- let b1 = (word >> 16) & 0xff;
1345
- let b2 = (word >> 8) & 0xff;
1346
- let b3 = word & 0xff;
1347
-
1348
- if (b1 === 0xff) { // overflow b1
1349
- b1 = 0;
1350
- if (b2 === 0xff) {
1351
- b2 = 0;
1352
- if (b3 === 0xff) {
1353
- b3 = 0;
1354
- } else {
1355
- ++b3;
1356
- }
1357
- } else {
1358
- ++b2;
1359
- }
1360
- } else {
1361
- ++b1;
1362
- }
1363
-
1364
- word = 0;
1365
- word += (b1 << 16);
1366
- word += (b2 << 8);
1367
- word += b3;
1368
- } else {
1369
- word += (0x01 << 24);
942
+ function compress(view, offset) {
943
+ for (let index = 0; index < 16; index++) {
944
+ schedule[index] = view.getInt32(offset + 4 * index);
1370
945
  }
1371
- return word;
1372
- }
1373
-
1374
- incCounter(counter) {
1375
- if ((counter[0] = this.incWord(counter[0])) === 0) {
1376
- // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8
1377
- counter[1] = this.incWord(counter[1]);
946
+ for (let index = 16; index < SHA1_SCHEDULE_LENGTH; index++) {
947
+ const word = schedule[index - 3] ^ schedule[index - 8] ^ schedule[index - 14] ^ schedule[index - 16];
948
+ schedule[index] = (word << 1) | (word >>> 31);
1378
949
  }
1379
- }
1380
-
1381
- calculate(prf, data, iv) {
1382
- let l;
1383
- if (!(l = data.length)) {
1384
- return [];
950
+ let a = state[0];
951
+ let b = state[1];
952
+ let c = state[2];
953
+ let d = state[3];
954
+ let e = state[4];
955
+ let t;
956
+ for (let index = 0; index < 20; index++) {
957
+ t = (((a << 5) | (a >>> 27)) + ((b & c) | (~b & d)) + e + 0x5A827999 + schedule[index]) | 0;
958
+ e = d;
959
+ d = c;
960
+ c = (b << 30) | (b >>> 2);
961
+ b = a;
962
+ a = t;
963
+ }
964
+ for (let index = 20; index < 40; index++) {
965
+ t = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0x6ED9EBA1 + schedule[index]) | 0;
966
+ e = d;
967
+ d = c;
968
+ c = (b << 30) | (b >>> 2);
969
+ b = a;
970
+ a = t;
1385
971
  }
1386
- const bl = bitArray.bitLength(data);
1387
- for (let i = 0; i < l; i += 4) {
1388
- this.incCounter(iv);
1389
- const e = prf.encrypt(iv);
1390
- data[i] ^= e[0];
1391
- data[i + 1] ^= e[1];
1392
- data[i + 2] ^= e[2];
1393
- data[i + 3] ^= e[3];
972
+ for (let index = 40; index < 60; index++) {
973
+ t = (((a << 5) | (a >>> 27)) + ((b & c) | (b & d) | (c & d)) + e + 0x8F1BBCDC + schedule[index]) | 0;
974
+ e = d;
975
+ d = c;
976
+ c = (b << 30) | (b >>> 2);
977
+ b = a;
978
+ a = t;
979
+ }
980
+ for (let index = 60; index < SHA1_SCHEDULE_LENGTH; index++) {
981
+ t = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0xCA62C1D6 + schedule[index]) | 0;
982
+ e = d;
983
+ d = c;
984
+ c = (b << 30) | (b >>> 2);
985
+ b = a;
986
+ a = t;
1394
987
  }
1395
- return bitArray.clamp(data, bl);
988
+ state[0] = (state[0] + a) | 0;
989
+ state[1] = (state[1] + b) | 0;
990
+ state[2] = (state[2] + c) | 0;
991
+ state[3] = (state[3] + d) | 0;
992
+ state[4] = (state[4] + e) | 0;
1396
993
  }
1397
- };
994
+ }
1398
995
 
1399
- const misc = {
1400
- importKey(password) {
1401
- return new misc.hmacSha1(codec.bytes.toBits(password));
1402
- },
1403
- pbkdf2(prf, salt, count, length) {
1404
- count = count || 10000;
1405
- if (length < 0 || count < 0) {
1406
- throw new Error("invalid params to pbkdf2");
1407
- }
1408
- const byteLength = ((length >> 5) + 1) << 2;
1409
- let u, ui, i, j, k;
1410
- const arrayBuffer = new ArrayBuffer(byteLength);
1411
- const out = new DataView(arrayBuffer);
1412
- let outLength = 0;
1413
- const b = bitArray;
1414
- salt = codec.bytes.toBits(salt);
1415
- for (k = 1; outLength < (byteLength || 1); k++) {
1416
- u = ui = prf.encrypt(b.concat(salt, [k]));
1417
- for (i = 1; i < count; i++) {
1418
- ui = prf.encrypt(ui);
1419
- for (j = 0; j < ui.length; j++) {
1420
- u[j] ^= ui[j];
1421
- }
1422
- }
1423
- for (i = 0; outLength < (byteLength || 1) && i < u.length; i++) {
1424
- out.setInt32(outLength, u[i]);
1425
- outLength += 4;
996
+ function initTables() {
997
+ if (!tablesInitialized) {
998
+ let p = 1;
999
+ let q = 1;
1000
+ do {
1001
+ p = (p ^ (p << 1) ^ ((p & 0x80) ? 0x1b : 0)) & 255;
1002
+ q = (q ^ (q << 1)) & 255;
1003
+ q = (q ^ (q << 2)) & 255;
1004
+ q = (q ^ (q << 4)) & 255;
1005
+ if (q & 0x80) {
1006
+ q ^= 0x09;
1426
1007
  }
1008
+ S_BOX[p] = (q ^ ((q << 1) | (q >> 7)) ^ ((q << 2) | (q >> 6)) ^ ((q << 3) | (q >> 5)) ^ ((q << 4) | (q >> 4)) ^ 0x63) & 255;
1009
+ } while (p != 1);
1010
+ S_BOX[0] = 0x63;
1011
+ for (let index = 0; index < 256; index++) {
1012
+ const s = S_BOX[index];
1013
+ const s2 = multiplyByTwo(s);
1014
+ const t = (s2 << 24) | (s << 16) | (s << 8) | (s2 ^ s);
1015
+ T0[index] = t;
1016
+ T1[index] = (t >>> 8) | (t << 24);
1017
+ T2[index] = (t >>> 16) | (t << 16);
1018
+ T3[index] = (t >>> 24) | (t << 8);
1427
1019
  }
1428
- return arrayBuffer.slice(0, length / 8);
1020
+ tablesInitialized = true;
1429
1021
  }
1430
- };
1431
-
1432
- /** @fileOverview HMAC implementation.
1433
- *
1434
- * @author Emily Stark
1435
- * @author Mike Hamburg
1436
- * @author Dan Boneh
1437
- */
1438
-
1439
- /** HMAC with the specified hash function.
1440
- * @constructor
1441
- * @param {bitArray} key the key for HMAC.
1442
- * @param {Object} [Hash=hash.sha1] The hash function to use.
1443
- */
1444
- misc.hmacSha1 = class {
1445
-
1446
- constructor(key) {
1447
- const hmac = this;
1448
- const Hash = hmac._hash = hash.sha1;
1449
- const exKey = [[], []];
1450
- hmac._baseHash = [new Hash(), new Hash()];
1451
- const bs = hmac._baseHash[0].blockSize / 32;
1452
-
1453
- if (key.length > bs) {
1454
- key = new Hash().update(key).finalize();
1455
- }
1456
-
1457
- for (let i = 0; i < bs; i++) {
1458
- exKey[0][i] = key[i] ^ 0x36363636;
1459
- exKey[1][i] = key[i] ^ 0x5C5C5C5C;
1460
- }
1022
+ }
1461
1023
 
1462
- hmac._baseHash[0].update(exKey[0]);
1463
- hmac._baseHash[1].update(exKey[1]);
1464
- hmac._resultHash = new Hash(hmac._baseHash[0]);
1465
- }
1466
- reset() {
1467
- const hmac = this;
1468
- hmac._resultHash = new hmac._hash(hmac._baseHash[0]);
1469
- hmac._updated = false;
1024
+ function expandKey(key, roundKeys) {
1025
+ const keyWords = key.length >> 2;
1026
+ const rounds = keyWords + 6;
1027
+ const total = 4 * (rounds + 1);
1028
+ let roundConstant = 1;
1029
+ for (let index = 0; index < keyWords; index++) {
1030
+ roundKeys[index] = (key[4 * index] << 24) | (key[4 * index + 1] << 16) | (key[4 * index + 2] << 8) | key[4 * index + 3];
1470
1031
  }
1471
-
1472
- update(data) {
1473
- const hmac = this;
1474
- hmac._updated = true;
1475
- hmac._resultHash.update(data);
1032
+ for (let index = keyWords; index < total; index++) {
1033
+ let word = roundKeys[index - 1];
1034
+ if (index % keyWords == 0) {
1035
+ word = substituteWord((word << 8) | (word >>> 24)) ^ (roundConstant << 24);
1036
+ roundConstant = multiplyByTwo(roundConstant);
1037
+ } else if (keyWords > 6 && index % keyWords == 4) {
1038
+ word = substituteWord(word);
1039
+ }
1040
+ roundKeys[index] = roundKeys[index - keyWords] ^ word;
1476
1041
  }
1042
+ return rounds;
1043
+ }
1477
1044
 
1478
- digest() {
1479
- const hmac = this;
1480
- const w = hmac._resultHash.finalize();
1481
- const result = new (hmac._hash)(hmac._baseHash[1]).update(w).finalize();
1482
-
1483
- hmac.reset();
1484
-
1485
- return result;
1486
- }
1045
+ function substituteWord(word) {
1046
+ return (S_BOX[word >>> 24] << 24) | (S_BOX[(word >>> 16) & 255] << 16) | (S_BOX[(word >>> 8) & 255] << 8) | S_BOX[word & 255];
1047
+ }
1487
1048
 
1488
- encrypt(data) {
1489
- if (!this._updated) {
1490
- this.update(data);
1491
- return this.digest(data);
1492
- } else {
1493
- throw new Error("encrypt on already updated hmac called!");
1494
- }
1495
- }
1496
- };
1049
+ function multiplyByTwo(value) {
1050
+ return ((value << 1) ^ ((value >> 7) * 0x1b)) & 255;
1051
+ }
1497
1052
 
1498
1053
  /*
1499
1054
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
@@ -1548,8 +1103,8 @@
1548
1103
  1. Redistributions of source code must retain the above copyright notice,
1549
1104
  this list of conditions and the following disclaimer.
1550
1105
 
1551
- 2. Redistributions in binary form must reproduce the above copyright
1552
- notice, this list of conditions and the following disclaimer in
1106
+ 2. Redistributions in binary form must reproduce the above copyright
1107
+ notice, this list of conditions and the following disclaimer in
1553
1108
  the documentation and/or other materials provided with the distribution.
1554
1109
 
1555
1110
  3. The names of the authors may not be used to endorse or promote products
@@ -1573,24 +1128,21 @@
1573
1128
  const PBKDF2_ALGORITHM = { name: "PBKDF2" };
1574
1129
  const HASH_ALGORITHM = { name: "HMAC" };
1575
1130
  const HASH_FUNCTION = "SHA-1";
1131
+ const PBKDF2_ITERATIONS = 1000;
1576
1132
  const BASE_KEY_ALGORITHM = Object.assign({ hash: HASH_ALGORITHM }, PBKDF2_ALGORITHM);
1577
- const DERIVED_BITS_ALGORITHM = Object.assign({ iterations: 1000, hash: { name: HASH_FUNCTION } }, PBKDF2_ALGORITHM);
1133
+ const DERIVED_BITS_ALGORITHM = Object.assign({ iterations: PBKDF2_ITERATIONS, hash: { name: HASH_FUNCTION } }, PBKDF2_ALGORITHM);
1578
1134
  const DERIVED_BITS_USAGE = ["deriveBits"];
1579
1135
  const SALT_LENGTH = [8, 12, 16];
1580
1136
  const KEY_LENGTH = [16, 24, 32];
1581
1137
  const AUTHENTICATION_CODE_LENGTH = 10;
1582
- const COUNTER_DEFAULT_VALUE = [0, 0, 0, 0];
1138
+ const PASSWORD_VERIFICATION_LENGTH = 2;
1583
1139
  // deno-lint-ignore valid-typeof
1584
1140
  const CRYPTO_API_SUPPORTED = typeof crypto != UNDEFINED_TYPE;
1585
1141
  const subtle = CRYPTO_API_SUPPORTED && crypto.subtle;
1586
1142
  const SUBTLE_API_SUPPORTED = CRYPTO_API_SUPPORTED && typeof subtle != UNDEFINED_TYPE;
1587
- const codecBytes = codec.bytes;
1588
- const Aes = cipher.aes;
1589
- const CtrGladman = mode.ctrGladman;
1590
- const HmacSha1 = misc.hmacSha1;
1591
1143
 
1592
- let IMPORT_KEY_SUPPORTED = CRYPTO_API_SUPPORTED && SUBTLE_API_SUPPORTED && typeof subtle.importKey == FUNCTION_TYPE;
1593
- let DERIVE_BITS_SUPPORTED = CRYPTO_API_SUPPORTED && SUBTLE_API_SUPPORTED && typeof subtle.deriveBits == FUNCTION_TYPE;
1144
+ let DERIVE_BITS_SUPPORTED = SUBTLE_API_SUPPORTED && typeof subtle.importKey == FUNCTION_TYPE && typeof subtle.deriveBits == FUNCTION_TYPE;
1145
+ let createEngine = createEngine$1;
1594
1146
 
1595
1147
  class AESDecryptionStream extends TransformStream {
1596
1148
 
@@ -1608,9 +1160,10 @@
1608
1160
  ready
1609
1161
  } = aesCrypto;
1610
1162
  if (password) {
1611
- await createDecryptionKeys(aesCrypto, strength, password, subarray(chunk, 0, SALT_LENGTH[strength] + 2));
1612
- chunk = subarray(chunk, SALT_LENGTH[strength] + 2);
1163
+ await createDecryptionKeys(aesCrypto, strength, password, subarray(chunk, 0, SALT_LENGTH[strength] + PASSWORD_VERIFICATION_LENGTH));
1164
+ chunk = subarray(chunk, SALT_LENGTH[strength] + PASSWORD_VERIFICATION_LENGTH);
1613
1165
  if (checkPasswordOnly) {
1166
+ disposeEngine(aesCrypto);
1614
1167
  controller.error(new Error(ERR_ABORT_CHECK_PASSWORD));
1615
1168
  } else {
1616
1169
  resolveReady();
@@ -1623,23 +1176,16 @@
1623
1176
  },
1624
1177
  async flush(controller) {
1625
1178
  const {
1626
- ctr,
1627
- hmac,
1179
+ engine,
1628
1180
  pendingInput,
1629
1181
  ready
1630
1182
  } = this;
1631
- if (hmac && ctr) {
1183
+ if (engine) {
1632
1184
  await ready;
1633
- const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
1634
1185
  const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
1635
- let decryptedChunkArray = EMPTY_UINT8_ARRAY;
1636
- if (chunkToDecrypt.length) {
1637
- const encryptedChunk = toBits(codecBytes, chunkToDecrypt);
1638
- hmac.update(encryptedChunk);
1639
- const decryptedChunk = ctr.update(encryptedChunk);
1640
- decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
1641
- }
1642
- const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
1186
+ const decryptedChunkArray = new Uint8Array(subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH));
1187
+ engine.process(decryptedChunkArray, true);
1188
+ const authenticationCode = engine.digest();
1643
1189
  let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
1644
1190
  for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
1645
1191
  invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
@@ -1649,6 +1195,9 @@
1649
1195
  }
1650
1196
  controller.enqueue(decryptedChunkArray);
1651
1197
  }
1198
+ },
1199
+ cancel() {
1200
+ disposeEngine(this);
1652
1201
  }
1653
1202
  });
1654
1203
  }
@@ -1678,26 +1227,24 @@
1678
1227
  }
1679
1228
  const output = new Uint8Array(preamble.length + chunk.length - (chunk.length % BLOCK_LENGTH));
1680
1229
  output.set(preamble, 0);
1681
- controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0));
1230
+ controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0, false));
1682
1231
  },
1683
1232
  async flush(controller) {
1684
1233
  const {
1685
- ctr,
1686
- hmac,
1234
+ engine,
1687
1235
  pendingInput,
1688
1236
  ready
1689
1237
  } = this;
1690
- if (hmac && ctr) {
1238
+ if (engine) {
1691
1239
  await ready;
1692
- let encryptedChunkArray = EMPTY_UINT8_ARRAY;
1693
- if (pendingInput.length) {
1694
- const encryptedChunk = ctr.update(toBits(codecBytes, pendingInput));
1695
- hmac.update(encryptedChunk);
1696
- encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
1697
- }
1698
- const authenticationCode = fromBits(codecBytes, hmac.digest()).slice(0, AUTHENTICATION_CODE_LENGTH);
1240
+ const encryptedChunkArray = new Uint8Array(pendingInput);
1241
+ engine.process(encryptedChunkArray, false);
1242
+ const authenticationCode = subarray(engine.digest(), 0, AUTHENTICATION_CODE_LENGTH);
1699
1243
  controller.enqueue(concat(encryptedChunkArray, authenticationCode));
1700
1244
  }
1245
+ },
1246
+ cancel() {
1247
+ disposeEngine(this);
1701
1248
  }
1702
1249
  });
1703
1250
  }
@@ -1712,30 +1259,23 @@
1712
1259
  });
1713
1260
  }
1714
1261
 
1715
- function append(aesCrypto, input, output, paddingStart, paddingEnd, verifyAuthenticationCode) {
1262
+ function append(aesCrypto, input, output, paddingStart, paddingEnd, decrypt) {
1716
1263
  const {
1717
- ctr,
1718
- hmac,
1264
+ engine,
1719
1265
  pendingInput
1720
1266
  } = aesCrypto;
1721
1267
  if (pendingInput.length) {
1722
1268
  input = concat(pendingInput, input);
1723
1269
  }
1724
1270
  const inputLength = input.length - paddingEnd;
1725
- output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
1726
- let offset;
1727
- for (offset = 0; offset <= inputLength - BLOCK_LENGTH; offset += BLOCK_LENGTH) {
1728
- const inputChunk = toBits(codecBytes, subarray(input, offset, offset + BLOCK_LENGTH));
1729
- if (verifyAuthenticationCode) {
1730
- hmac.update(inputChunk);
1731
- }
1732
- const outputChunk = ctr.update(inputChunk);
1733
- if (!verifyAuthenticationCode) {
1734
- hmac.update(outputChunk);
1735
- }
1736
- output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
1737
- }
1738
- aesCrypto.pendingInput = subarray(input, offset);
1271
+ const alignedLength = inputLength - (inputLength % BLOCK_LENGTH);
1272
+ output = expand(output, paddingStart + alignedLength);
1273
+ if (alignedLength) {
1274
+ const chunk = subarray(output, paddingStart, paddingStart + alignedLength);
1275
+ chunk.set(subarray(input, 0, alignedLength));
1276
+ engine.process(chunk, decrypt);
1277
+ }
1278
+ aesCrypto.pendingInput = subarray(input, alignedLength);
1739
1279
  return output;
1740
1280
  }
1741
1281
 
@@ -1743,10 +1283,17 @@
1743
1283
  const passwordVerificationKey = await createKeys$1(decrypt, strength, password, subarray(preamble, 0, SALT_LENGTH[strength]));
1744
1284
  const passwordVerification = subarray(preamble, SALT_LENGTH[strength]);
1745
1285
  if (passwordVerificationKey[0] != passwordVerification[0] || passwordVerificationKey[1] != passwordVerification[1]) {
1286
+ disposeEngine(decrypt);
1746
1287
  throw new Error(ERR_INVALID_PASSWORD);
1747
1288
  }
1748
1289
  }
1749
1290
 
1291
+ function disposeEngine({ engine }) {
1292
+ if (engine && engine.dispose) {
1293
+ engine.dispose();
1294
+ }
1295
+ }
1296
+
1750
1297
  async function createEncryptionKeys(encrypt, strength, password) {
1751
1298
  const salt = getRandomValues(new Uint8Array(SALT_LENGTH[strength]));
1752
1299
  const passwordVerification = await createKeys$1(encrypt, strength, password, salt);
@@ -1755,48 +1302,22 @@
1755
1302
 
1756
1303
  async function createKeys$1(aesCrypto, strength, password, salt) {
1757
1304
  aesCrypto.password = null;
1758
- const baseKey = await importKey(RAW_FORMAT, password, BASE_KEY_ALGORITHM, false, DERIVED_BITS_USAGE);
1759
- const derivedBits = await deriveBits(Object.assign({ salt }, DERIVED_BITS_ALGORITHM), baseKey, 8 * ((KEY_LENGTH[strength] * 2) + 2));
1760
- const compositeKey = new Uint8Array(derivedBits);
1761
- const key = toBits(codecBytes, subarray(compositeKey, 0, KEY_LENGTH[strength]));
1762
- const authentication = toBits(codecBytes, subarray(compositeKey, KEY_LENGTH[strength], KEY_LENGTH[strength] * 2));
1763
- const passwordVerification = subarray(compositeKey, KEY_LENGTH[strength] * 2);
1764
- Object.assign(aesCrypto, {
1765
- keys: {
1766
- key,
1767
- authentication,
1768
- passwordVerification
1769
- },
1770
- ctr: new CtrGladman(new Aes(key), Array.from(COUNTER_DEFAULT_VALUE)),
1771
- hmac: new HmacSha1(authentication)
1772
- });
1773
- return passwordVerification;
1774
- }
1775
-
1776
- async function importKey(format, password, algorithm, extractable, keyUsages) {
1777
- if (IMPORT_KEY_SUPPORTED) {
1778
- try {
1779
- return await subtle.importKey(format, password, algorithm, extractable, keyUsages);
1780
- } catch {
1781
- IMPORT_KEY_SUPPORTED = false;
1782
- return misc.importKey(password);
1783
- }
1784
- } else {
1785
- return misc.importKey(password);
1786
- }
1305
+ const keyLength = KEY_LENGTH[strength];
1306
+ const compositeKey = await deriveKey(password, salt, keyLength * 2 + PASSWORD_VERIFICATION_LENGTH);
1307
+ aesCrypto.engine = createEngine(subarray(compositeKey, 0, keyLength), subarray(compositeKey, keyLength, keyLength * 2));
1308
+ return subarray(compositeKey, keyLength * 2);
1787
1309
  }
1788
1310
 
1789
- async function deriveBits(algorithm, baseKey, length) {
1311
+ async function deriveKey(password, salt, length) {
1790
1312
  if (DERIVE_BITS_SUPPORTED) {
1791
1313
  try {
1792
- return await subtle.deriveBits(algorithm, baseKey, length);
1314
+ const baseKey = await subtle.importKey(RAW_FORMAT, password, BASE_KEY_ALGORITHM, false, DERIVED_BITS_USAGE);
1315
+ return new Uint8Array(await subtle.deriveBits(Object.assign({ salt }, DERIVED_BITS_ALGORITHM), baseKey, length * 8));
1793
1316
  } catch {
1794
1317
  DERIVE_BITS_SUPPORTED = false;
1795
- return misc.pbkdf2(baseKey, algorithm.salt, DERIVED_BITS_ALGORITHM.iterations, length);
1796
1318
  }
1797
- } else {
1798
- return misc.pbkdf2(baseKey, algorithm.salt, DERIVED_BITS_ALGORITHM.iterations, length);
1799
1319
  }
1320
+ return pbkdf2(password, salt, PBKDF2_ITERATIONS, length);
1800
1321
  }
1801
1322
 
1802
1323
  function encodePassword(password, rawPassword) {
@@ -1820,13 +1341,6 @@
1820
1341
  return array.subarray(begin, end);
1821
1342
  }
1822
1343
 
1823
- function fromBits(codecBytes, chunk) {
1824
- return codecBytes.fromBits(chunk);
1825
- }
1826
- function toBits(codecBytes, chunk) {
1827
- return codecBytes.toBits(chunk);
1828
- }
1829
-
1830
1344
  /*
1831
1345
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
1832
1346
 
@@ -2766,11 +2280,18 @@
2766
2280
  return true;
2767
2281
  }
2768
2282
  if (FallbackStream) {
2283
+ return await loadModule(config);
2284
+ }
2285
+ return false;
2286
+ }
2287
+
2288
+ async function loadModule(config) {
2289
+ if (initModule) {
2769
2290
  try {
2770
2291
  await initModule(config);
2771
2292
  return true;
2772
2293
  } catch {
2773
- return false;
2294
+ // ignored
2774
2295
  }
2775
2296
  }
2776
2297
  return false;
@@ -2813,26 +2334,27 @@
2813
2334
  terminate() {
2814
2335
  return new Promise(resolve => {
2815
2336
  const { worker, busy } = workerData;
2816
- if (worker) {
2817
- if (busy) {
2818
- workerData.resolveTerminated = resolve;
2819
- } else {
2337
+ if (busy) {
2338
+ workerData.resolveTerminated = resolve;
2339
+ } else {
2340
+ if (worker) {
2820
2341
  worker.terminate();
2821
- resolve();
2342
+ workerData.worker = null;
2822
2343
  }
2823
- workerData.interface = null;
2824
- } else {
2825
2344
  resolve();
2826
2345
  }
2346
+ workerData.interface = null;
2827
2347
  });
2828
2348
  },
2829
2349
  onTaskFinished() {
2830
2350
  if (workerData.busy) {
2831
- const { resolveTerminated } = workerData;
2351
+ const { resolveTerminated, worker } = workerData;
2832
2352
  if (resolveTerminated) {
2833
2353
  workerData.resolveTerminated = null;
2834
- workerData.terminated = true;
2835
- workerData.worker.terminate();
2354
+ if (worker) {
2355
+ workerData.terminated = true;
2356
+ worker.terminate();
2357
+ }
2836
2358
  resolveTerminated();
2837
2359
  }
2838
2360
  workerData.busy = false;
@@ -2889,28 +2411,23 @@
2889
2411
  }
2890
2412
 
2891
2413
  async function runWorker$1({ options, readable, writable, onTaskFinished, workerOptions }, config) {
2892
- let codecStream, chunkStream;
2414
+ let codecStream, chunkStream, modulePromise;
2893
2415
  try {
2894
2416
  if (options.compressed && !options.format) {
2895
2417
  const deflate = options.codecType.startsWith(CODEC_DEFLATE);
2896
2418
  const FallbackStream = deflate ? config.CompressionStreamFallback : config.DecompressionStreamFallback;
2897
2419
  const NativeStream = deflate ? config.CompressionStream : config.DecompressionStream;
2898
2420
  if (!options.useCompressionStream) {
2899
- try {
2900
- await initModule(config);
2901
- } catch {
2902
- if (!FallbackStream || FallbackStream.requiresModule) {
2903
- options.useCompressionStream = true;
2904
- }
2421
+ if (!await moduleLoaded() && (!FallbackStream || FallbackStream.requiresModule)) {
2422
+ options.useCompressionStream = true;
2905
2423
  }
2906
2424
  } else if (FallbackStream && FallbackStream.requiresModule && !supportsDeflateRaw(NativeStream)) {
2907
- try {
2908
- await initModule(config);
2909
- } catch {
2910
- // ignored
2911
- }
2425
+ await moduleLoaded();
2912
2426
  }
2913
2427
  }
2428
+ if (options.encrypted && !options.zipCrypto) {
2429
+ await moduleLoaded();
2430
+ }
2914
2431
  codecStream = new CodecStream(options, config);
2915
2432
  chunkStream = new ChunkStream(getChunkSize(config));
2916
2433
  await readable
@@ -2943,6 +2460,13 @@
2943
2460
  } finally {
2944
2461
  onTaskFinished();
2945
2462
  }
2463
+
2464
+ function moduleLoaded() {
2465
+ if (!modulePromise) {
2466
+ modulePromise = loadModule(config);
2467
+ }
2468
+ return modulePromise;
2469
+ }
2946
2470
  }
2947
2471
 
2948
2472
  /*
@@ -4079,16 +3603,14 @@
4079
3603
  combineSizeEocd
4080
3604
  } = httpReader;
4081
3605
  if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest == UNDEFINED_TYPE || preventHeadRequest)) {
4082
- const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -END_OF_CENTRAL_DIR_LENGTH : undefined));
3606
+ const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -65557 : undefined));
4083
3607
  const acceptRanges = response.headers.get(HTTP_HEADER_ACCEPT_RANGES);
4084
3608
  if (!forceRangeRequests && (!acceptRanges || acceptRanges.toLowerCase() != HTTP_RANGE_UNIT)) {
4085
3609
  throw new Error(ERR_HTTP_RANGE);
4086
3610
  } else {
4087
- if (combineSizeEocd) {
4088
- const eocdCache = new Uint8Array(await response.arrayBuffer());
4089
- if (response.status == 206 && eocdCache.length == END_OF_CENTRAL_DIR_LENGTH) {
4090
- httpReader.eocdCache = eocdCache;
4091
- }
3611
+ let eocdCache;
3612
+ if (combineSizeEocd && response.status == 206) {
3613
+ eocdCache = new Uint8Array(await response.arrayBuffer());
4092
3614
  }
4093
3615
  setResourceValidators(httpReader, response);
4094
3616
  const contentSize = getContentRangeSize(response);
@@ -4097,6 +3619,9 @@
4097
3619
  } else {
4098
3620
  httpReader.size = contentSize;
4099
3621
  }
3622
+ if (eocdCache && eocdCache.length && getContentRangeOffset(response) === httpReader.size - eocdCache.length) {
3623
+ httpReader.eocdCache = eocdCache;
3624
+ }
4100
3625
  }
4101
3626
  } else {
4102
3627
  await getContentLength(httpReader, sendRequest, getRequestData);
@@ -4112,25 +3637,23 @@
4112
3637
  options
4113
3638
  } = httpReader;
4114
3639
  if (useRangeHeader || forceRangeRequests) {
4115
- if (eocdCache && index == size - END_OF_CENTRAL_DIR_LENGTH && length == END_OF_CENTRAL_DIR_LENGTH) {
4116
- return eocdCache;
4117
- }
4118
3640
  if (index >= size || length === 0) {
4119
3641
  return EMPTY_UINT8_ARRAY;
4120
3642
  } else {
4121
3643
  if (index + length > size) {
4122
3644
  length = size - index;
4123
3645
  }
3646
+ if (eocdCache && index >= size - eocdCache.length) {
3647
+ const cacheIndex = index - (size - eocdCache.length);
3648
+ return eocdCache.slice(cacheIndex, cacheIndex + length);
3649
+ }
4124
3650
  const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, index, length));
4125
3651
  if (response.status != 206) {
4126
3652
  throw new Error(ERR_HTTP_RANGE);
4127
3653
  }
4128
- const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
4129
- if (contentRangeHeader) {
4130
- const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
4131
- if (!Number.isNaN(rangeStart) && rangeStart != index) {
4132
- throw new Error(ERR_HTTP_RANGE);
4133
- }
3654
+ const rangeStart = getContentRangeOffset(response);
3655
+ if (rangeStart !== UNDEFINED_VALUE && rangeStart != index) {
3656
+ throw new Error(ERR_HTTP_RANGE);
4134
3657
  }
4135
3658
  checkResourceValidators(httpReader, response);
4136
3659
  setResourceValidators(httpReader, response);
@@ -4190,12 +3713,9 @@
4190
3713
  if (response.status != 206) {
4191
3714
  throw new Error(ERR_HTTP_RANGE);
4192
3715
  }
4193
- const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
4194
- if (contentRangeHeader) {
4195
- const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
4196
- if (!Number.isNaN(rangeStart) && rangeStart != windowOffset) {
4197
- throw new Error(ERR_HTTP_RANGE);
4198
- }
3716
+ const rangeStart = getContentRangeOffset(response);
3717
+ if (rangeStart !== UNDEFINED_VALUE && rangeStart != windowOffset) {
3718
+ throw new Error(ERR_HTTP_RANGE);
4199
3719
  }
4200
3720
  checkResourceValidators(httpReader, response);
4201
3721
  setResourceValidators(httpReader, response);
@@ -4211,6 +3731,16 @@
4211
3731
  }
4212
3732
  }
4213
3733
 
3734
+ function getContentRangeOffset(response) {
3735
+ const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
3736
+ if (contentRangeHeader) {
3737
+ const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
3738
+ if (!Number.isNaN(rangeStart)) {
3739
+ return rangeStart;
3740
+ }
3741
+ }
3742
+ }
3743
+
4214
3744
  function getContentRangeSize(response) {
4215
3745
  const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
4216
3746
  if (contentRangeHeader) {
@@ -6730,7 +6260,6 @@
6730
6260
  rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
6731
6261
  rawExtraField,
6732
6262
  rawCentralExtraField: EMPTY_UINT8_ARRAY,
6733
- extendedTimestamp: false,
6734
6263
  headerArray,
6735
6264
  headerView
6736
6265
  });
@@ -7474,7 +7003,7 @@
7474
7003
  }
7475
7004
  }
7476
7005
  const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
7477
- if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
7006
+ if (emptyEntry && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
7478
7007
  dataDescriptor = false;
7479
7008
  }
7480
7009
  const zip64UncompressedSize = zip64Enabled || unknownSize || uncompressedSize >= MAX_32_BITS;
@@ -8986,7 +8515,7 @@
8986
8515
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8987
8516
  */
8988
8517
 
8989
- const VERSION = "2.13.1";
8518
+ const VERSION = "2.14.0";
8990
8519
 
8991
8520
  /*
8992
8521
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9464,7 +8993,7 @@
9464
8993
  */
9465
8994
 
9466
8995
 
9467
- i(setDefaultConfiguration);
8996
+ c(setDefaultConfiguration);
9468
8997
 
9469
8998
  exports.BlobReader = BlobReader;
9470
8999
  exports.BlobWriter = BlobWriter;