pdf-codec 1.4.2 → 1.6.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 (170) hide show
  1. package/README.md +56 -15
  2. package/dist/assets/caladea-bold.cjs +5 -0
  3. package/dist/assets/caladea-bold.d.cts +4 -0
  4. package/dist/assets/caladea-bold.d.ts +4 -0
  5. package/dist/assets/caladea-bold.js +4 -0
  6. package/dist/assets/caladea-bolditalic.cjs +5 -0
  7. package/dist/assets/caladea-bolditalic.d.cts +4 -0
  8. package/dist/assets/caladea-bolditalic.d.ts +4 -0
  9. package/dist/assets/caladea-bolditalic.js +4 -0
  10. package/dist/assets/caladea-italic.cjs +5 -0
  11. package/dist/assets/caladea-italic.d.cts +4 -0
  12. package/dist/assets/caladea-italic.d.ts +4 -0
  13. package/dist/assets/caladea-italic.js +4 -0
  14. package/dist/assets/caladea-regular.cjs +5 -0
  15. package/dist/assets/caladea-regular.d.cts +4 -0
  16. package/dist/assets/caladea-regular.d.ts +4 -0
  17. package/dist/assets/caladea-regular.js +4 -0
  18. package/dist/assets/carlito-bold.cjs +5 -0
  19. package/dist/assets/carlito-bold.d.cts +4 -0
  20. package/dist/assets/carlito-bold.d.ts +4 -0
  21. package/dist/assets/carlito-bold.js +4 -0
  22. package/dist/assets/carlito-bolditalic.cjs +5 -0
  23. package/dist/assets/carlito-bolditalic.d.cts +4 -0
  24. package/dist/assets/carlito-bolditalic.d.ts +4 -0
  25. package/dist/assets/carlito-bolditalic.js +4 -0
  26. package/dist/assets/carlito-italic.cjs +5 -0
  27. package/dist/assets/carlito-italic.d.cts +4 -0
  28. package/dist/assets/carlito-italic.d.ts +4 -0
  29. package/dist/assets/carlito-italic.js +4 -0
  30. package/dist/assets/carlito-regular.cjs +5 -0
  31. package/dist/assets/carlito-regular.d.cts +4 -0
  32. package/dist/assets/carlito-regular.d.ts +4 -0
  33. package/dist/assets/carlito-regular.js +4 -0
  34. package/dist/cff-probe.cjs +133 -0
  35. package/dist/cff-probe.d.cts +10 -0
  36. package/dist/cff-probe.d.ts +10 -0
  37. package/dist/cff-probe.js +132 -0
  38. package/dist/cmap-table.cjs +108 -0
  39. package/dist/cmap-table.d.cts +6 -0
  40. package/dist/cmap-table.d.ts +6 -0
  41. package/dist/cmap-table.js +107 -0
  42. package/dist/content-write.cjs +36 -17
  43. package/dist/content-write.d.cts +9 -2
  44. package/dist/content-write.d.ts +9 -2
  45. package/dist/content-write.js +35 -16
  46. package/dist/crypto/aes.cjs +166 -0
  47. package/dist/crypto/aes.d.cts +6 -0
  48. package/dist/crypto/aes.d.ts +6 -0
  49. package/dist/crypto/aes.js +163 -0
  50. package/dist/crypto/md5.cjs +215 -0
  51. package/dist/crypto/md5.d.cts +4 -0
  52. package/dist/crypto/md5.d.ts +4 -0
  53. package/dist/crypto/md5.js +214 -0
  54. package/dist/crypto/rc4.cjs +29 -0
  55. package/dist/crypto/rc4.d.cts +4 -0
  56. package/dist/crypto/rc4.d.ts +4 -0
  57. package/dist/crypto/rc4.js +28 -0
  58. package/dist/crypto/sha2.cjs +261 -0
  59. package/dist/crypto/sha2.d.cts +6 -0
  60. package/dist/crypto/sha2.d.ts +6 -0
  61. package/dist/crypto/sha2.js +258 -0
  62. package/dist/diagnostics.cjs +7 -0
  63. package/dist/diagnostics.d.cts +4 -1
  64. package/dist/diagnostics.d.ts +4 -1
  65. package/dist/diagnostics.js +7 -1
  66. package/dist/document.cjs +38 -2
  67. package/dist/document.js +38 -2
  68. package/dist/embedded-font-CLedn-mT.d.cts +42 -0
  69. package/dist/embedded-font-CbqkKgBl.d.ts +42 -0
  70. package/dist/embedded-font-write.cjs +92 -0
  71. package/dist/embedded-font-write.d.cts +22 -0
  72. package/dist/embedded-font-write.d.ts +22 -0
  73. package/dist/embedded-font-write.js +90 -0
  74. package/dist/embedded-font.cjs +142 -0
  75. package/dist/embedded-font.d.cts +2 -0
  76. package/dist/embedded-font.d.ts +2 -0
  77. package/dist/embedded-font.js +138 -0
  78. package/dist/encrypt.cjs +264 -0
  79. package/dist/encrypt.d.cts +11 -0
  80. package/dist/encrypt.d.ts +11 -0
  81. package/dist/encrypt.js +263 -0
  82. package/dist/filters.cjs +19 -1
  83. package/dist/filters.js +19 -1
  84. package/dist/font-registry-Cn7P9lAh.d.ts +38 -0
  85. package/dist/font-registry-yby02snZ.d.cts +38 -0
  86. package/dist/font-registry.cjs +152 -0
  87. package/dist/font-registry.d.cts +2 -0
  88. package/dist/font-registry.d.ts +2 -0
  89. package/dist/font-registry.js +150 -0
  90. package/dist/font-substitutes.cjs +13 -0
  91. package/dist/font-substitutes.d.cts +5 -0
  92. package/dist/font-substitutes.d.ts +5 -0
  93. package/dist/font-substitutes.js +12 -0
  94. package/dist/font-tables.cjs +127 -0
  95. package/dist/font-tables.d.cts +43 -0
  96. package/dist/font-tables.d.ts +43 -0
  97. package/dist/font-tables.js +122 -0
  98. package/dist/fonts.cjs +1 -0
  99. package/dist/fonts.d.cts +2 -1
  100. package/dist/fonts.d.ts +2 -1
  101. package/dist/fonts.js +1 -1
  102. package/dist/glyf.cjs +127 -0
  103. package/dist/glyf.d.cts +31 -0
  104. package/dist/glyf.d.ts +31 -0
  105. package/dist/glyf.js +125 -0
  106. package/dist/{math-hmtx.cjs → hmtx-table.cjs} +3 -3
  107. package/dist/{math-hmtx.d.ts → hmtx-table.d.cts} +2 -2
  108. package/dist/{math-hmtx.d.cts → hmtx-table.d.ts} +2 -2
  109. package/dist/{math-hmtx.js → hmtx-table.js} +3 -3
  110. package/dist/image/ccitt.cjs +488 -0
  111. package/dist/image/ccitt.d.cts +17 -0
  112. package/dist/image/ccitt.d.ts +17 -0
  113. package/dist/image/ccitt.js +487 -0
  114. package/dist/images-read.cjs +1 -4
  115. package/dist/images-read.js +2 -5
  116. package/dist/index.cjs +8 -0
  117. package/dist/index.d.cts +7 -4
  118. package/dist/index.d.ts +7 -4
  119. package/dist/index.js +5 -3
  120. package/dist/interpret.cjs +173 -38
  121. package/dist/interpret.d.cts +27 -10
  122. package/dist/interpret.d.ts +27 -10
  123. package/dist/interpret.js +174 -39
  124. package/dist/math-font-write.cjs +3 -32
  125. package/dist/math-font-write.js +2 -31
  126. package/dist/math-font.cjs +7 -5
  127. package/dist/math-font.js +5 -3
  128. package/dist/math-table.d.cts +1 -1
  129. package/dist/math-table.d.ts +1 -1
  130. package/dist/{matrix-B3c2_a2f.d.cts → matrix-BHzJESll.d.cts} +2 -1
  131. package/dist/{matrix-B3c2_a2f.d.ts → matrix-BHzJESll.d.ts} +2 -1
  132. package/dist/matrix.cjs +2 -0
  133. package/dist/matrix.d.cts +2 -2
  134. package/dist/matrix.d.ts +2 -2
  135. package/dist/matrix.js +2 -1
  136. package/dist/measure.cjs +65 -14
  137. package/dist/measure.d.cts +8 -1
  138. package/dist/measure.d.ts +8 -1
  139. package/dist/measure.js +64 -15
  140. package/dist/objects.cjs +4 -0
  141. package/dist/objects.d.cts +2 -1
  142. package/dist/objects.d.ts +2 -1
  143. package/dist/objects.js +4 -1
  144. package/dist/read.cjs +43 -4
  145. package/dist/read.d.cts +1 -1
  146. package/dist/read.d.ts +1 -1
  147. package/dist/read.js +43 -4
  148. package/dist/sfnt-V08bb5ut.d.cts +21 -0
  149. package/dist/sfnt-V08bb5ut.d.ts +21 -0
  150. package/dist/sfnt-subset.cjs +250 -0
  151. package/dist/sfnt-subset.d.cts +11 -0
  152. package/dist/sfnt-subset.d.ts +11 -0
  153. package/dist/sfnt-subset.js +249 -0
  154. package/dist/sfnt.cjs +50 -4
  155. package/dist/sfnt.d.cts +2 -17
  156. package/dist/sfnt.d.ts +2 -17
  157. package/dist/sfnt.js +47 -5
  158. package/dist/tounicode.cjs +34 -0
  159. package/dist/tounicode.d.cts +5 -0
  160. package/dist/tounicode.d.ts +5 -0
  161. package/dist/tounicode.js +33 -0
  162. package/dist/write.cjs +81 -11
  163. package/dist/write.d.cts +6 -0
  164. package/dist/write.d.ts +6 -0
  165. package/dist/write.js +82 -12
  166. package/package.json +1 -1
  167. package/dist/math-cmap.cjs +0 -81
  168. package/dist/math-cmap.d.cts +0 -6
  169. package/dist/math-cmap.d.ts +0 -6
  170. package/dist/math-cmap.js +0 -80
@@ -1,10 +1,12 @@
1
1
  import { o as encodeForShow } from "./afm-widths-Dxucrg7D.js";
2
2
  import { ByteWriter } from "./bytes/writer.js";
3
3
  import { pdfHexString } from "./objects.js";
4
- import { multiplyMatrices, rotationMatrix, scaleMatrix, translationMatrix } from "./matrix.js";
4
+ import { BEZIER_KAPPA, multiplyMatrices, rotationMatrix, scaleMatrix, translationMatrix } from "./matrix.js";
5
+ import { encodeForShowEmbedded } from "./embedded-font.js";
5
6
  import { formatNumber, writeObject } from "./serialize.js";
6
7
  //#region src/content-write.ts
7
- const BEZIER_KAPPA = .5522847498;
8
+ const GLYPH_SPACE_UNITS_PER_EM = 1e3;
9
+ const EMBEDDED_HORIZONTAL_SCALE_PERCENT = 100;
8
10
  function writeRgbOperator(writer, color, operator) {
9
11
  writer.writeAscii(`${formatNumber(color.r)} ${formatNumber(color.g)} ${formatNumber(color.b)} ${operator}\n`);
10
12
  }
@@ -22,8 +24,7 @@ function anchorMatrix(xPt, yPt, rotationDeg) {
22
24
  yPt
23
25
  ];
24
26
  }
25
- function writeUnderline(writer, item, widthPt, measurer) {
26
- const underline = measurer.underlineAtSize(item.font, item.sizePt);
27
+ function writeUnderline(writer, item, widthPt, underline) {
27
28
  writer.writeAscii("q\n");
28
29
  writeMatrixOperator(writer, anchorMatrix(item.xPt, item.yPt, item.rotationDeg), "cm");
29
30
  writeRgbOperator(writer, item.color, "rg");
@@ -31,23 +32,39 @@ function writeUnderline(writer, item, widthPt, measurer) {
31
32
  writer.writeAscii("f\n");
32
33
  writer.writeAscii("Q\n");
33
34
  }
34
- function writeText(writer, item, context, substitutions) {
35
- const font = context.resolveFont(item.font);
36
- const encoded = encodeForShow(item.text, font.standardName);
37
- substitutions.push(...encoded.substitutions);
38
- const scalePercent = context.measurer.horizontalScaleFor(item.font) * 100;
35
+ function writeShowTextBlock(writer, item, resourceName, scalePercent, codes) {
39
36
  writer.writeAscii("BT\n");
40
- writer.writeAscii(`/${font.resourceName} ${formatNumber(item.sizePt)} Tf\n`);
37
+ writer.writeAscii(`/${resourceName} ${formatNumber(item.sizePt)} Tf\n`);
41
38
  writer.writeAscii(`${formatNumber(scalePercent)} Tz\n`);
42
39
  writeRgbOperator(writer, item.color, "rg");
43
40
  writeMatrixOperator(writer, anchorMatrix(item.xPt, item.yPt, item.rotationDeg), "Tm");
44
- writeObject(writer, pdfHexString(encoded.codes));
41
+ writeObject(writer, pdfHexString(codes));
45
42
  writer.writeAscii(" Tj\n");
46
43
  writer.writeAscii("ET\n");
47
- if (item.underline === true) {
48
- const scale = context.measurer.horizontalScaleFor(item.font);
49
- writeUnderline(writer, item, item.widthPt ?? encoded.width1000 / 1e3 * item.sizePt * scale, context.measurer);
44
+ }
45
+ function writeStandardText(writer, item, standardName, resourceName, measurer, substitutions) {
46
+ const encoded = encodeForShow(item.text, standardName);
47
+ substitutions.push(...encoded.substitutions);
48
+ const scale = measurer.horizontalScaleFor(item.font);
49
+ writeShowTextBlock(writer, item, resourceName, scale * 100, encoded.codes);
50
+ if (item.underline === true) writeUnderline(writer, item, item.widthPt ?? encoded.width1000 / GLYPH_SPACE_UNITS_PER_EM * item.sizePt * scale, measurer.underlineAtSize(item.font, item.sizePt));
51
+ }
52
+ function writeEmbeddedText(writer, item, face, resourceName, missingGlyphs) {
53
+ const encoded = encodeForShowEmbedded(item.text, face);
54
+ missingGlyphs.push(...encoded.substitutions);
55
+ writeShowTextBlock(writer, item, resourceName, EMBEDDED_HORIZONTAL_SCALE_PERCENT, encoded.codes);
56
+ if (item.underline === true) writeUnderline(writer, item, item.widthPt ?? encoded.width1000 / GLYPH_SPACE_UNITS_PER_EM * item.sizePt, {
57
+ offsetPt: face.metrics.underlinePositionGlyphSpace / GLYPH_SPACE_UNITS_PER_EM * item.sizePt,
58
+ thicknessPt: face.metrics.underlineThicknessGlyphSpace / GLYPH_SPACE_UNITS_PER_EM * item.sizePt
59
+ });
60
+ }
61
+ function writeText(writer, item, context, substitutions, missingGlyphs) {
62
+ const font = context.resolveFont(item.font);
63
+ if (font.kind === "embedded") {
64
+ writeEmbeddedText(writer, item, font.face, font.resourceName, missingGlyphs);
65
+ return;
50
66
  }
67
+ writeStandardText(writer, item, font.standardName, font.resourceName, context.measurer, substitutions);
51
68
  }
52
69
  function paintOperatorFor(fill, stroke, fillRule) {
53
70
  const evenOdd = fillRule === "evenodd";
@@ -122,7 +139,8 @@ function writeImage(writer, item, context) {
122
139
  function writeContentStream(items, context) {
123
140
  const writer = new ByteWriter();
124
141
  const substitutions = [];
125
- for (const item of items) if (item.kind === "text") writeText(writer, item, context, substitutions);
142
+ const missingGlyphs = [];
143
+ for (const item of items) if (item.kind === "text") writeText(writer, item, context, substitutions, missingGlyphs);
126
144
  else if (item.kind === "image") writeImage(writer, item, context);
127
145
  else if (item.kind === "rect") writeRect(writer, item);
128
146
  else if (item.kind === "line") writeLine(writer, item);
@@ -130,7 +148,8 @@ function writeContentStream(items, context) {
130
148
  else if (item.kind === "path") writePath(writer, item);
131
149
  return {
132
150
  bytes: writer.toBytes(),
133
- substitutions
151
+ substitutions,
152
+ missingGlyphs
134
153
  };
135
154
  }
136
155
  //#endregion
@@ -0,0 +1,166 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/crypto/aes.ts
3
+ const AES_BLOCK_BYTES = 16;
4
+ const WORDS_PER_BLOCK = 4;
5
+ const GF_MODULUS = 283;
6
+ const AFFINE_CONSTANT = 99;
7
+ function xtime(a) {
8
+ const doubled = a << 1;
9
+ return (doubled & 256) !== 0 ? (doubled ^ GF_MODULUS) & 255 : doubled;
10
+ }
11
+ function gmul(a, b) {
12
+ let product = 0;
13
+ let left = a;
14
+ let right = b;
15
+ while (right !== 0) {
16
+ if ((right & 1) !== 0) product ^= left;
17
+ left = xtime(left);
18
+ right >>= 1;
19
+ }
20
+ return product & 255;
21
+ }
22
+ function rotl8(value, bits) {
23
+ return (value << bits | value >>> 8 - bits) & 255;
24
+ }
25
+ const { SBOX, INV_SBOX } = (() => {
26
+ const inverse = /* @__PURE__ */ new Uint8Array(256);
27
+ for (let a = 1; a < 256; a++) for (let b = 1; b < 256; b++) if (gmul(a, b) === 1) {
28
+ inverse[a] = b;
29
+ break;
30
+ }
31
+ const sbox = /* @__PURE__ */ new Uint8Array(256);
32
+ const invSbox = /* @__PURE__ */ new Uint8Array(256);
33
+ for (let i = 0; i < 256; i++) {
34
+ const b = inverse[i];
35
+ const s = (b ^ rotl8(b, 1) ^ rotl8(b, 2) ^ rotl8(b, 3) ^ rotl8(b, 4) ^ AFFINE_CONSTANT) & 255;
36
+ sbox[i] = s;
37
+ invSbox[s] = i;
38
+ }
39
+ return {
40
+ SBOX: sbox,
41
+ INV_SBOX: invSbox
42
+ };
43
+ })();
44
+ function subWord(word) {
45
+ return (SBOX[word >>> 24 & 255] << 24 | SBOX[word >>> 16 & 255] << 16 | SBOX[word >>> 8 & 255] << 8 | SBOX[word & 255]) >>> 0;
46
+ }
47
+ function rotWord(word) {
48
+ return (word << 8 | word >>> 24) >>> 0;
49
+ }
50
+ function expandKey(key) {
51
+ if (key.length !== 16 && key.length !== 24 && key.length !== 32) throw new Error(`AES key must be 16, 24, or 32 bytes; got ${String(key.length)}`);
52
+ const nk = key.length / 4;
53
+ const rounds = nk + 6;
54
+ const words = new Uint32Array(WORDS_PER_BLOCK * (rounds + 1));
55
+ for (let i = 0; i < nk; i++) words[i] = (key[4 * i] << 24 | key[4 * i + 1] << 16 | key[4 * i + 2] << 8 | key[4 * i + 3]) >>> 0;
56
+ let rcon = 1;
57
+ for (let i = nk; i < words.length; i++) {
58
+ let temp = words[i - 1];
59
+ if (i % nk === 0) {
60
+ temp = (subWord(rotWord(temp)) ^ rcon << 24) >>> 0;
61
+ rcon = xtime(rcon);
62
+ } else if (nk > 6 && i % nk === 4) temp = subWord(temp);
63
+ words[i] = (words[i - nk] ^ temp) >>> 0;
64
+ }
65
+ return {
66
+ words,
67
+ rounds
68
+ };
69
+ }
70
+ function addRoundKey(state, words, round) {
71
+ for (let c = 0; c < WORDS_PER_BLOCK; c++) {
72
+ const word = words[round * WORDS_PER_BLOCK + c];
73
+ for (let r = 0; r < WORDS_PER_BLOCK; r++) state[4 * c + r] = state[4 * c + r] ^ word >>> 24 - r * 8 & 255;
74
+ }
75
+ }
76
+ function substituteBytes(state, table) {
77
+ for (let i = 0; i < 16; i++) state[i] = table[state[i]];
78
+ }
79
+ function shiftRows(state, direction) {
80
+ const source = Uint8Array.from(state);
81
+ for (let r = 1; r < WORDS_PER_BLOCK; r++) for (let c = 0; c < WORDS_PER_BLOCK; c++) state[r + 4 * c] = source[r + 4 * (((c + direction * r) % WORDS_PER_BLOCK + WORDS_PER_BLOCK) % WORDS_PER_BLOCK)];
82
+ }
83
+ function mixColumns(state, coefficients) {
84
+ const [k0, k1, k2, k3] = coefficients;
85
+ for (let c = 0; c < WORDS_PER_BLOCK; c++) {
86
+ const a0 = state[4 * c];
87
+ const a1 = state[4 * c + 1];
88
+ const a2 = state[4 * c + 2];
89
+ const a3 = state[4 * c + 3];
90
+ state[4 * c] = gmul(a0, k0) ^ gmul(a1, k1) ^ gmul(a2, k2) ^ gmul(a3, k3);
91
+ state[4 * c + 1] = gmul(a0, k3) ^ gmul(a1, k0) ^ gmul(a2, k1) ^ gmul(a3, k2);
92
+ state[4 * c + 2] = gmul(a0, k2) ^ gmul(a1, k3) ^ gmul(a2, k0) ^ gmul(a3, k1);
93
+ state[4 * c + 3] = gmul(a0, k1) ^ gmul(a1, k2) ^ gmul(a2, k3) ^ gmul(a3, k0);
94
+ }
95
+ }
96
+ const FORWARD_MIX = [
97
+ 2,
98
+ 3,
99
+ 1,
100
+ 1
101
+ ];
102
+ const INVERSE_MIX = [
103
+ 14,
104
+ 11,
105
+ 13,
106
+ 9
107
+ ];
108
+ function encryptBlock(state, key) {
109
+ addRoundKey(state, key.words, 0);
110
+ for (let round = 1; round < key.rounds; round++) {
111
+ substituteBytes(state, SBOX);
112
+ shiftRows(state, 1);
113
+ mixColumns(state, FORWARD_MIX);
114
+ addRoundKey(state, key.words, round);
115
+ }
116
+ substituteBytes(state, SBOX);
117
+ shiftRows(state, 1);
118
+ addRoundKey(state, key.words, key.rounds);
119
+ }
120
+ function decryptBlock(state, key) {
121
+ addRoundKey(state, key.words, key.rounds);
122
+ for (let round = key.rounds - 1; round >= 1; round--) {
123
+ shiftRows(state, -1);
124
+ substituteBytes(state, INV_SBOX);
125
+ addRoundKey(state, key.words, round);
126
+ mixColumns(state, INVERSE_MIX);
127
+ }
128
+ shiftRows(state, -1);
129
+ substituteBytes(state, INV_SBOX);
130
+ addRoundKey(state, key.words, 0);
131
+ }
132
+ function wholeBlockCount(byteLength) {
133
+ return Math.floor(byteLength / 16);
134
+ }
135
+ function aesCbcDecrypt(key, iv, data) {
136
+ const expanded = expandKey(key);
137
+ const blocks = wholeBlockCount(data.length);
138
+ const out = new Uint8Array(blocks * 16);
139
+ const chain = Uint8Array.from(iv.subarray(0, 16));
140
+ for (let b = 0; b < blocks; b++) {
141
+ const cipherBlock = data.subarray(b * 16, (b + 1) * 16);
142
+ const state = Uint8Array.from(cipherBlock);
143
+ decryptBlock(state, expanded);
144
+ for (let i = 0; i < 16; i++) out[b * 16 + i] = state[i] ^ chain[i];
145
+ chain.set(cipherBlock);
146
+ }
147
+ return out;
148
+ }
149
+ function aesCbcEncrypt(key, iv, data) {
150
+ const expanded = expandKey(key);
151
+ const blocks = wholeBlockCount(data.length);
152
+ const out = new Uint8Array(blocks * 16);
153
+ const chain = Uint8Array.from(iv.subarray(0, 16));
154
+ for (let b = 0; b < blocks; b++) {
155
+ const state = /* @__PURE__ */ new Uint8Array(16);
156
+ for (let i = 0; i < 16; i++) state[i] = data[b * 16 + i] ^ chain[i];
157
+ encryptBlock(state, expanded);
158
+ out.set(state, b * 16);
159
+ chain.set(state);
160
+ }
161
+ return out;
162
+ }
163
+ //#endregion
164
+ exports.AES_BLOCK_BYTES = AES_BLOCK_BYTES;
165
+ exports.aesCbcDecrypt = aesCbcDecrypt;
166
+ exports.aesCbcEncrypt = aesCbcEncrypt;
@@ -0,0 +1,6 @@
1
+ //#region src/crypto/aes.d.ts
2
+ declare const AES_BLOCK_BYTES = 16;
3
+ declare function aesCbcDecrypt(key: Uint8Array<ArrayBuffer>, iv: Uint8Array<ArrayBuffer>, data: Uint8Array<ArrayBuffer>): Uint8Array<ArrayBuffer>;
4
+ declare function aesCbcEncrypt(key: Uint8Array<ArrayBuffer>, iv: Uint8Array<ArrayBuffer>, data: Uint8Array<ArrayBuffer>): Uint8Array<ArrayBuffer>;
5
+ //#endregion
6
+ export { AES_BLOCK_BYTES, aesCbcDecrypt, aesCbcEncrypt };
@@ -0,0 +1,6 @@
1
+ //#region src/crypto/aes.d.ts
2
+ declare const AES_BLOCK_BYTES = 16;
3
+ declare function aesCbcDecrypt(key: Uint8Array<ArrayBuffer>, iv: Uint8Array<ArrayBuffer>, data: Uint8Array<ArrayBuffer>): Uint8Array<ArrayBuffer>;
4
+ declare function aesCbcEncrypt(key: Uint8Array<ArrayBuffer>, iv: Uint8Array<ArrayBuffer>, data: Uint8Array<ArrayBuffer>): Uint8Array<ArrayBuffer>;
5
+ //#endregion
6
+ export { AES_BLOCK_BYTES, aesCbcDecrypt, aesCbcEncrypt };
@@ -0,0 +1,163 @@
1
+ //#region src/crypto/aes.ts
2
+ const AES_BLOCK_BYTES = 16;
3
+ const WORDS_PER_BLOCK = 4;
4
+ const GF_MODULUS = 283;
5
+ const AFFINE_CONSTANT = 99;
6
+ function xtime(a) {
7
+ const doubled = a << 1;
8
+ return (doubled & 256) !== 0 ? (doubled ^ GF_MODULUS) & 255 : doubled;
9
+ }
10
+ function gmul(a, b) {
11
+ let product = 0;
12
+ let left = a;
13
+ let right = b;
14
+ while (right !== 0) {
15
+ if ((right & 1) !== 0) product ^= left;
16
+ left = xtime(left);
17
+ right >>= 1;
18
+ }
19
+ return product & 255;
20
+ }
21
+ function rotl8(value, bits) {
22
+ return (value << bits | value >>> 8 - bits) & 255;
23
+ }
24
+ const { SBOX, INV_SBOX } = (() => {
25
+ const inverse = /* @__PURE__ */ new Uint8Array(256);
26
+ for (let a = 1; a < 256; a++) for (let b = 1; b < 256; b++) if (gmul(a, b) === 1) {
27
+ inverse[a] = b;
28
+ break;
29
+ }
30
+ const sbox = /* @__PURE__ */ new Uint8Array(256);
31
+ const invSbox = /* @__PURE__ */ new Uint8Array(256);
32
+ for (let i = 0; i < 256; i++) {
33
+ const b = inverse[i];
34
+ const s = (b ^ rotl8(b, 1) ^ rotl8(b, 2) ^ rotl8(b, 3) ^ rotl8(b, 4) ^ AFFINE_CONSTANT) & 255;
35
+ sbox[i] = s;
36
+ invSbox[s] = i;
37
+ }
38
+ return {
39
+ SBOX: sbox,
40
+ INV_SBOX: invSbox
41
+ };
42
+ })();
43
+ function subWord(word) {
44
+ return (SBOX[word >>> 24 & 255] << 24 | SBOX[word >>> 16 & 255] << 16 | SBOX[word >>> 8 & 255] << 8 | SBOX[word & 255]) >>> 0;
45
+ }
46
+ function rotWord(word) {
47
+ return (word << 8 | word >>> 24) >>> 0;
48
+ }
49
+ function expandKey(key) {
50
+ if (key.length !== 16 && key.length !== 24 && key.length !== 32) throw new Error(`AES key must be 16, 24, or 32 bytes; got ${String(key.length)}`);
51
+ const nk = key.length / 4;
52
+ const rounds = nk + 6;
53
+ const words = new Uint32Array(WORDS_PER_BLOCK * (rounds + 1));
54
+ for (let i = 0; i < nk; i++) words[i] = (key[4 * i] << 24 | key[4 * i + 1] << 16 | key[4 * i + 2] << 8 | key[4 * i + 3]) >>> 0;
55
+ let rcon = 1;
56
+ for (let i = nk; i < words.length; i++) {
57
+ let temp = words[i - 1];
58
+ if (i % nk === 0) {
59
+ temp = (subWord(rotWord(temp)) ^ rcon << 24) >>> 0;
60
+ rcon = xtime(rcon);
61
+ } else if (nk > 6 && i % nk === 4) temp = subWord(temp);
62
+ words[i] = (words[i - nk] ^ temp) >>> 0;
63
+ }
64
+ return {
65
+ words,
66
+ rounds
67
+ };
68
+ }
69
+ function addRoundKey(state, words, round) {
70
+ for (let c = 0; c < WORDS_PER_BLOCK; c++) {
71
+ const word = words[round * WORDS_PER_BLOCK + c];
72
+ for (let r = 0; r < WORDS_PER_BLOCK; r++) state[4 * c + r] = state[4 * c + r] ^ word >>> 24 - r * 8 & 255;
73
+ }
74
+ }
75
+ function substituteBytes(state, table) {
76
+ for (let i = 0; i < 16; i++) state[i] = table[state[i]];
77
+ }
78
+ function shiftRows(state, direction) {
79
+ const source = Uint8Array.from(state);
80
+ for (let r = 1; r < WORDS_PER_BLOCK; r++) for (let c = 0; c < WORDS_PER_BLOCK; c++) state[r + 4 * c] = source[r + 4 * (((c + direction * r) % WORDS_PER_BLOCK + WORDS_PER_BLOCK) % WORDS_PER_BLOCK)];
81
+ }
82
+ function mixColumns(state, coefficients) {
83
+ const [k0, k1, k2, k3] = coefficients;
84
+ for (let c = 0; c < WORDS_PER_BLOCK; c++) {
85
+ const a0 = state[4 * c];
86
+ const a1 = state[4 * c + 1];
87
+ const a2 = state[4 * c + 2];
88
+ const a3 = state[4 * c + 3];
89
+ state[4 * c] = gmul(a0, k0) ^ gmul(a1, k1) ^ gmul(a2, k2) ^ gmul(a3, k3);
90
+ state[4 * c + 1] = gmul(a0, k3) ^ gmul(a1, k0) ^ gmul(a2, k1) ^ gmul(a3, k2);
91
+ state[4 * c + 2] = gmul(a0, k2) ^ gmul(a1, k3) ^ gmul(a2, k0) ^ gmul(a3, k1);
92
+ state[4 * c + 3] = gmul(a0, k1) ^ gmul(a1, k2) ^ gmul(a2, k3) ^ gmul(a3, k0);
93
+ }
94
+ }
95
+ const FORWARD_MIX = [
96
+ 2,
97
+ 3,
98
+ 1,
99
+ 1
100
+ ];
101
+ const INVERSE_MIX = [
102
+ 14,
103
+ 11,
104
+ 13,
105
+ 9
106
+ ];
107
+ function encryptBlock(state, key) {
108
+ addRoundKey(state, key.words, 0);
109
+ for (let round = 1; round < key.rounds; round++) {
110
+ substituteBytes(state, SBOX);
111
+ shiftRows(state, 1);
112
+ mixColumns(state, FORWARD_MIX);
113
+ addRoundKey(state, key.words, round);
114
+ }
115
+ substituteBytes(state, SBOX);
116
+ shiftRows(state, 1);
117
+ addRoundKey(state, key.words, key.rounds);
118
+ }
119
+ function decryptBlock(state, key) {
120
+ addRoundKey(state, key.words, key.rounds);
121
+ for (let round = key.rounds - 1; round >= 1; round--) {
122
+ shiftRows(state, -1);
123
+ substituteBytes(state, INV_SBOX);
124
+ addRoundKey(state, key.words, round);
125
+ mixColumns(state, INVERSE_MIX);
126
+ }
127
+ shiftRows(state, -1);
128
+ substituteBytes(state, INV_SBOX);
129
+ addRoundKey(state, key.words, 0);
130
+ }
131
+ function wholeBlockCount(byteLength) {
132
+ return Math.floor(byteLength / 16);
133
+ }
134
+ function aesCbcDecrypt(key, iv, data) {
135
+ const expanded = expandKey(key);
136
+ const blocks = wholeBlockCount(data.length);
137
+ const out = new Uint8Array(blocks * 16);
138
+ const chain = Uint8Array.from(iv.subarray(0, 16));
139
+ for (let b = 0; b < blocks; b++) {
140
+ const cipherBlock = data.subarray(b * 16, (b + 1) * 16);
141
+ const state = Uint8Array.from(cipherBlock);
142
+ decryptBlock(state, expanded);
143
+ for (let i = 0; i < 16; i++) out[b * 16 + i] = state[i] ^ chain[i];
144
+ chain.set(cipherBlock);
145
+ }
146
+ return out;
147
+ }
148
+ function aesCbcEncrypt(key, iv, data) {
149
+ const expanded = expandKey(key);
150
+ const blocks = wholeBlockCount(data.length);
151
+ const out = new Uint8Array(blocks * 16);
152
+ const chain = Uint8Array.from(iv.subarray(0, 16));
153
+ for (let b = 0; b < blocks; b++) {
154
+ const state = /* @__PURE__ */ new Uint8Array(16);
155
+ for (let i = 0; i < 16; i++) state[i] = data[b * 16 + i] ^ chain[i];
156
+ encryptBlock(state, expanded);
157
+ out.set(state, b * 16);
158
+ chain.set(state);
159
+ }
160
+ return out;
161
+ }
162
+ //#endregion
163
+ export { AES_BLOCK_BYTES, aesCbcDecrypt, aesCbcEncrypt };
@@ -0,0 +1,215 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/crypto/md5.ts
3
+ const BLOCK_BYTES = 64;
4
+ const DIGEST_BYTES = 16;
5
+ const ROUNDS = 64;
6
+ const WORDS_PER_BLOCK = 16;
7
+ const T = new Uint32Array([
8
+ 3614090360,
9
+ 3905402710,
10
+ 606105819,
11
+ 3250441966,
12
+ 4118548399,
13
+ 1200080426,
14
+ 2821735955,
15
+ 4249261313,
16
+ 1770035416,
17
+ 2336552879,
18
+ 4294925233,
19
+ 2304563134,
20
+ 1804603682,
21
+ 4254626195,
22
+ 2792965006,
23
+ 1236535329,
24
+ 4129170786,
25
+ 3225465664,
26
+ 643717713,
27
+ 3921069994,
28
+ 3593408605,
29
+ 38016083,
30
+ 3634488961,
31
+ 3889429448,
32
+ 568446438,
33
+ 3275163606,
34
+ 4107603335,
35
+ 1163531501,
36
+ 2850285829,
37
+ 4243563512,
38
+ 1735328473,
39
+ 2368359562,
40
+ 4294588738,
41
+ 2272392833,
42
+ 1839030562,
43
+ 4259657740,
44
+ 2763975236,
45
+ 1272893353,
46
+ 4139469664,
47
+ 3200236656,
48
+ 681279174,
49
+ 3936430074,
50
+ 3572445317,
51
+ 76029189,
52
+ 3654602809,
53
+ 3873151461,
54
+ 530742520,
55
+ 3299628645,
56
+ 4096336452,
57
+ 1126891415,
58
+ 2878612391,
59
+ 4237533241,
60
+ 1700485571,
61
+ 2399980690,
62
+ 4293915773,
63
+ 2240044497,
64
+ 1873313359,
65
+ 4264355552,
66
+ 2734768916,
67
+ 1309151649,
68
+ 4149444226,
69
+ 3174756917,
70
+ 718787259,
71
+ 3951481745
72
+ ]);
73
+ const SHIFT = [
74
+ 7,
75
+ 12,
76
+ 17,
77
+ 22,
78
+ 7,
79
+ 12,
80
+ 17,
81
+ 22,
82
+ 7,
83
+ 12,
84
+ 17,
85
+ 22,
86
+ 7,
87
+ 12,
88
+ 17,
89
+ 22,
90
+ 5,
91
+ 9,
92
+ 14,
93
+ 20,
94
+ 5,
95
+ 9,
96
+ 14,
97
+ 20,
98
+ 5,
99
+ 9,
100
+ 14,
101
+ 20,
102
+ 5,
103
+ 9,
104
+ 14,
105
+ 20,
106
+ 4,
107
+ 11,
108
+ 16,
109
+ 23,
110
+ 4,
111
+ 11,
112
+ 16,
113
+ 23,
114
+ 4,
115
+ 11,
116
+ 16,
117
+ 23,
118
+ 4,
119
+ 11,
120
+ 16,
121
+ 23,
122
+ 6,
123
+ 10,
124
+ 15,
125
+ 21,
126
+ 6,
127
+ 10,
128
+ 15,
129
+ 21,
130
+ 6,
131
+ 10,
132
+ 15,
133
+ 21,
134
+ 6,
135
+ 10,
136
+ 15,
137
+ 21
138
+ ];
139
+ const INITIAL_STATE = [
140
+ 1732584193,
141
+ 4023233417,
142
+ 2562383102,
143
+ 271733878
144
+ ];
145
+ function rotl32(value, bits) {
146
+ return (value << bits | value >>> 32 - bits) >>> 0;
147
+ }
148
+ function padMessage(bytes) {
149
+ const paddedLength = (Math.floor((bytes.length + 8) / BLOCK_BYTES) + 1) * BLOCK_BYTES;
150
+ const padded = new Uint8Array(paddedLength);
151
+ padded.set(bytes);
152
+ padded[bytes.length] = 128;
153
+ const bitLength = bytes.length * 8;
154
+ let low = bitLength % 4294967296;
155
+ let high = Math.floor(bitLength / 4294967296);
156
+ for (let i = 0; i < 4; i++) {
157
+ padded[paddedLength - 8 + i] = low & 255;
158
+ low = Math.floor(low / 256);
159
+ padded[paddedLength - 4 + i] = high & 255;
160
+ high = Math.floor(high / 256);
161
+ }
162
+ return padded;
163
+ }
164
+ function md5(bytes) {
165
+ const padded = padMessage(bytes);
166
+ const state = Int32Array.from(INITIAL_STATE);
167
+ const block = new Uint32Array(WORDS_PER_BLOCK);
168
+ for (let offset = 0; offset < padded.length; offset += BLOCK_BYTES) {
169
+ for (let i = 0; i < WORDS_PER_BLOCK; i++) {
170
+ const at = offset + i * 4;
171
+ block[i] = (padded[at] | padded[at + 1] << 8 | padded[at + 2] << 16 | padded[at + 3] << 24) >>> 0;
172
+ }
173
+ let a = state[0];
174
+ let b = state[1];
175
+ let c = state[2];
176
+ let d = state[3];
177
+ for (let i = 0; i < ROUNDS; i++) {
178
+ let f;
179
+ let g;
180
+ if (i < 16) {
181
+ f = b & c | ~b & d;
182
+ g = i;
183
+ } else if (i < 32) {
184
+ f = d & b | ~d & c;
185
+ g = (5 * i + 1) % WORDS_PER_BLOCK;
186
+ } else if (i < 48) {
187
+ f = b ^ c ^ d;
188
+ g = (3 * i + 5) % WORDS_PER_BLOCK;
189
+ } else {
190
+ f = c ^ (b | ~d);
191
+ g = 7 * i % WORDS_PER_BLOCK;
192
+ }
193
+ const rotated = rotl32(a + (f >>> 0) + T[i] + block[g] >>> 0, SHIFT[i]);
194
+ a = d;
195
+ d = c;
196
+ c = b;
197
+ b = b + rotated >>> 0;
198
+ }
199
+ state[0] = state[0] + a | 0;
200
+ state[1] = state[1] + b | 0;
201
+ state[2] = state[2] + c | 0;
202
+ state[3] = state[3] + d | 0;
203
+ }
204
+ const digest = new Uint8Array(DIGEST_BYTES);
205
+ for (let i = 0; i < state.length; i++) {
206
+ const word = state[i];
207
+ digest[i * 4] = word & 255;
208
+ digest[i * 4 + 1] = word >>> 8 & 255;
209
+ digest[i * 4 + 2] = word >>> 16 & 255;
210
+ digest[i * 4 + 3] = word >>> 24 & 255;
211
+ }
212
+ return digest;
213
+ }
214
+ //#endregion
215
+ exports.md5 = md5;
@@ -0,0 +1,4 @@
1
+ //#region src/crypto/md5.d.ts
2
+ declare function md5(bytes: Uint8Array<ArrayBuffer>): Uint8Array<ArrayBuffer>;
3
+ //#endregion
4
+ export { md5 };
@@ -0,0 +1,4 @@
1
+ //#region src/crypto/md5.d.ts
2
+ declare function md5(bytes: Uint8Array<ArrayBuffer>): Uint8Array<ArrayBuffer>;
3
+ //#endregion
4
+ export { md5 };