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.
- package/README.md +56 -15
- package/dist/assets/caladea-bold.cjs +5 -0
- package/dist/assets/caladea-bold.d.cts +4 -0
- package/dist/assets/caladea-bold.d.ts +4 -0
- package/dist/assets/caladea-bold.js +4 -0
- package/dist/assets/caladea-bolditalic.cjs +5 -0
- package/dist/assets/caladea-bolditalic.d.cts +4 -0
- package/dist/assets/caladea-bolditalic.d.ts +4 -0
- package/dist/assets/caladea-bolditalic.js +4 -0
- package/dist/assets/caladea-italic.cjs +5 -0
- package/dist/assets/caladea-italic.d.cts +4 -0
- package/dist/assets/caladea-italic.d.ts +4 -0
- package/dist/assets/caladea-italic.js +4 -0
- package/dist/assets/caladea-regular.cjs +5 -0
- package/dist/assets/caladea-regular.d.cts +4 -0
- package/dist/assets/caladea-regular.d.ts +4 -0
- package/dist/assets/caladea-regular.js +4 -0
- package/dist/assets/carlito-bold.cjs +5 -0
- package/dist/assets/carlito-bold.d.cts +4 -0
- package/dist/assets/carlito-bold.d.ts +4 -0
- package/dist/assets/carlito-bold.js +4 -0
- package/dist/assets/carlito-bolditalic.cjs +5 -0
- package/dist/assets/carlito-bolditalic.d.cts +4 -0
- package/dist/assets/carlito-bolditalic.d.ts +4 -0
- package/dist/assets/carlito-bolditalic.js +4 -0
- package/dist/assets/carlito-italic.cjs +5 -0
- package/dist/assets/carlito-italic.d.cts +4 -0
- package/dist/assets/carlito-italic.d.ts +4 -0
- package/dist/assets/carlito-italic.js +4 -0
- package/dist/assets/carlito-regular.cjs +5 -0
- package/dist/assets/carlito-regular.d.cts +4 -0
- package/dist/assets/carlito-regular.d.ts +4 -0
- package/dist/assets/carlito-regular.js +4 -0
- package/dist/cff-probe.cjs +133 -0
- package/dist/cff-probe.d.cts +10 -0
- package/dist/cff-probe.d.ts +10 -0
- package/dist/cff-probe.js +132 -0
- package/dist/cmap-table.cjs +108 -0
- package/dist/cmap-table.d.cts +6 -0
- package/dist/cmap-table.d.ts +6 -0
- package/dist/cmap-table.js +107 -0
- package/dist/content-write.cjs +36 -17
- package/dist/content-write.d.cts +9 -2
- package/dist/content-write.d.ts +9 -2
- package/dist/content-write.js +35 -16
- package/dist/crypto/aes.cjs +166 -0
- package/dist/crypto/aes.d.cts +6 -0
- package/dist/crypto/aes.d.ts +6 -0
- package/dist/crypto/aes.js +163 -0
- package/dist/crypto/md5.cjs +215 -0
- package/dist/crypto/md5.d.cts +4 -0
- package/dist/crypto/md5.d.ts +4 -0
- package/dist/crypto/md5.js +214 -0
- package/dist/crypto/rc4.cjs +29 -0
- package/dist/crypto/rc4.d.cts +4 -0
- package/dist/crypto/rc4.d.ts +4 -0
- package/dist/crypto/rc4.js +28 -0
- package/dist/crypto/sha2.cjs +261 -0
- package/dist/crypto/sha2.d.cts +6 -0
- package/dist/crypto/sha2.d.ts +6 -0
- package/dist/crypto/sha2.js +258 -0
- package/dist/diagnostics.cjs +7 -0
- package/dist/diagnostics.d.cts +4 -1
- package/dist/diagnostics.d.ts +4 -1
- package/dist/diagnostics.js +7 -1
- package/dist/document.cjs +38 -2
- package/dist/document.js +38 -2
- package/dist/embedded-font-CLedn-mT.d.cts +42 -0
- package/dist/embedded-font-CbqkKgBl.d.ts +42 -0
- package/dist/embedded-font-write.cjs +92 -0
- package/dist/embedded-font-write.d.cts +22 -0
- package/dist/embedded-font-write.d.ts +22 -0
- package/dist/embedded-font-write.js +90 -0
- package/dist/embedded-font.cjs +142 -0
- package/dist/embedded-font.d.cts +2 -0
- package/dist/embedded-font.d.ts +2 -0
- package/dist/embedded-font.js +138 -0
- package/dist/encrypt.cjs +264 -0
- package/dist/encrypt.d.cts +11 -0
- package/dist/encrypt.d.ts +11 -0
- package/dist/encrypt.js +263 -0
- package/dist/filters.cjs +19 -1
- package/dist/filters.js +19 -1
- package/dist/font-registry-Cn7P9lAh.d.ts +38 -0
- package/dist/font-registry-yby02snZ.d.cts +38 -0
- package/dist/font-registry.cjs +152 -0
- package/dist/font-registry.d.cts +2 -0
- package/dist/font-registry.d.ts +2 -0
- package/dist/font-registry.js +150 -0
- package/dist/font-substitutes.cjs +13 -0
- package/dist/font-substitutes.d.cts +5 -0
- package/dist/font-substitutes.d.ts +5 -0
- package/dist/font-substitutes.js +12 -0
- package/dist/font-tables.cjs +127 -0
- package/dist/font-tables.d.cts +43 -0
- package/dist/font-tables.d.ts +43 -0
- package/dist/font-tables.js +122 -0
- package/dist/fonts.cjs +1 -0
- package/dist/fonts.d.cts +2 -1
- package/dist/fonts.d.ts +2 -1
- package/dist/fonts.js +1 -1
- package/dist/glyf.cjs +127 -0
- package/dist/glyf.d.cts +31 -0
- package/dist/glyf.d.ts +31 -0
- package/dist/glyf.js +125 -0
- package/dist/{math-hmtx.cjs → hmtx-table.cjs} +3 -3
- package/dist/{math-hmtx.d.ts → hmtx-table.d.cts} +2 -2
- package/dist/{math-hmtx.d.cts → hmtx-table.d.ts} +2 -2
- package/dist/{math-hmtx.js → hmtx-table.js} +3 -3
- package/dist/image/ccitt.cjs +488 -0
- package/dist/image/ccitt.d.cts +17 -0
- package/dist/image/ccitt.d.ts +17 -0
- package/dist/image/ccitt.js +487 -0
- package/dist/images-read.cjs +1 -4
- package/dist/images-read.js +2 -5
- package/dist/index.cjs +8 -0
- package/dist/index.d.cts +7 -4
- package/dist/index.d.ts +7 -4
- package/dist/index.js +5 -3
- package/dist/interpret.cjs +173 -38
- package/dist/interpret.d.cts +27 -10
- package/dist/interpret.d.ts +27 -10
- package/dist/interpret.js +174 -39
- package/dist/math-font-write.cjs +3 -32
- package/dist/math-font-write.js +2 -31
- package/dist/math-font.cjs +7 -5
- package/dist/math-font.js +5 -3
- package/dist/math-table.d.cts +1 -1
- package/dist/math-table.d.ts +1 -1
- package/dist/{matrix-B3c2_a2f.d.cts → matrix-BHzJESll.d.cts} +2 -1
- package/dist/{matrix-B3c2_a2f.d.ts → matrix-BHzJESll.d.ts} +2 -1
- package/dist/matrix.cjs +2 -0
- package/dist/matrix.d.cts +2 -2
- package/dist/matrix.d.ts +2 -2
- package/dist/matrix.js +2 -1
- package/dist/measure.cjs +65 -14
- package/dist/measure.d.cts +8 -1
- package/dist/measure.d.ts +8 -1
- package/dist/measure.js +64 -15
- package/dist/objects.cjs +4 -0
- package/dist/objects.d.cts +2 -1
- package/dist/objects.d.ts +2 -1
- package/dist/objects.js +4 -1
- package/dist/read.cjs +43 -4
- package/dist/read.d.cts +1 -1
- package/dist/read.d.ts +1 -1
- package/dist/read.js +43 -4
- package/dist/sfnt-V08bb5ut.d.cts +21 -0
- package/dist/sfnt-V08bb5ut.d.ts +21 -0
- package/dist/sfnt-subset.cjs +250 -0
- package/dist/sfnt-subset.d.cts +11 -0
- package/dist/sfnt-subset.d.ts +11 -0
- package/dist/sfnt-subset.js +249 -0
- package/dist/sfnt.cjs +50 -4
- package/dist/sfnt.d.cts +2 -17
- package/dist/sfnt.d.ts +2 -17
- package/dist/sfnt.js +47 -5
- package/dist/tounicode.cjs +34 -0
- package/dist/tounicode.d.cts +5 -0
- package/dist/tounicode.d.ts +5 -0
- package/dist/tounicode.js +33 -0
- package/dist/write.cjs +81 -11
- package/dist/write.d.cts +6 -0
- package/dist/write.d.ts +6 -0
- package/dist/write.js +82 -12
- package/package.json +1 -1
- package/dist/math-cmap.cjs +0 -81
- package/dist/math-cmap.d.cts +0 -6
- package/dist/math-cmap.d.ts +0 -6
- package/dist/math-cmap.js +0 -80
package/dist/content-write.js
CHANGED
|
@@ -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
|
|
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,
|
|
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
|
|
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(`/${
|
|
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(
|
|
41
|
+
writeObject(writer, pdfHexString(codes));
|
|
45
42
|
writer.writeAscii(" Tj\n");
|
|
46
43
|
writer.writeAscii("ET\n");
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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;
|