@honeybbq/teamspeak-client 0.3.1 → 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +322 -60
- package/dist/abort.d.ts +5 -0
- package/dist/abort.d.ts.map +1 -0
- package/dist/address.d.ts +8 -0
- package/dist/address.d.ts.map +1 -1
- package/dist/api/voice.d.ts +24 -0
- package/dist/api/voice.d.ts.map +1 -0
- package/dist/capabilities.d.ts +62 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/client.d.ts +172 -39
- package/dist/client.d.ts.map +1 -1
- package/dist/commands.d.ts +45 -27
- package/dist/commands.d.ts.map +1 -1
- package/dist/crypto/crypt.d.ts +19 -4
- package/dist/crypto/crypt.d.ts.map +1 -1
- package/dist/crypto/identity.d.ts +87 -8
- package/dist/crypto/identity.d.ts.map +1 -1
- package/dist/crypto/index.d.ts +2 -1
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/diagnostics.d.ts +45 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/discovery/resolver.d.ts +21 -3
- package/dist/discovery/resolver.d.ts.map +1 -1
- package/dist/errors.d.ts +70 -16
- package/dist/errors.d.ts.map +1 -1
- package/dist/events.d.ts +4 -5
- package/dist/events.d.ts.map +1 -1
- package/dist/handshake/crypt-handshake.d.ts +1 -0
- package/dist/handshake/crypt-handshake.d.ts.map +1 -1
- package/dist/handshake/crypt-init2.d.ts.map +1 -1
- package/dist/handshake/license.d.ts +7 -0
- package/dist/handshake/license.d.ts.map +1 -1
- package/dist/handshake.d.ts +14 -5
- package/dist/handshake.d.ts.map +1 -1
- package/dist/helpers.d.ts +0 -8
- package/dist/helpers.d.ts.map +1 -1
- package/dist/index.d.ts +20 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3967 -0
- package/dist/index.js.map +1 -0
- package/dist/notifications.d.ts +7 -15
- package/dist/notifications.d.ts.map +1 -1
- package/dist/reconnect.d.ts +69 -0
- package/dist/reconnect.d.ts.map +1 -0
- package/dist/throttle.d.ts +9 -0
- package/dist/throttle.d.ts.map +1 -1
- package/dist/transfer.d.ts +27 -25
- package/dist/transfer.d.ts.map +1 -1
- package/dist/transport/handler.d.ts +37 -5
- package/dist/transport/handler.d.ts.map +1 -1
- package/dist/transport/quicklz.d.ts +19 -0
- package/dist/transport/quicklz.d.ts.map +1 -1
- package/dist/types.d.ts +277 -97
- package/dist/types.d.ts.map +1 -1
- package/package.json +21 -56
- package/src/abort.ts +24 -0
- package/src/address.ts +74 -0
- package/src/api/voice.ts +61 -0
- package/src/capabilities.ts +92 -0
- package/src/client.ts +1392 -0
- package/src/commands.ts +193 -0
- package/src/crypto/crypt-ops.ts +6 -0
- package/src/crypto/crypt.ts +274 -0
- package/src/crypto/eax.ts +152 -0
- package/src/crypto/identity.ts +484 -0
- package/src/crypto/index.ts +21 -0
- package/src/crypto/primitives.ts +141 -0
- package/src/diagnostics.ts +58 -0
- package/src/discovery/index.ts +1 -0
- package/src/discovery/resolver.ts +272 -0
- package/src/errors.ts +156 -0
- package/src/events.ts +28 -0
- package/src/handshake/crypt-handshake.ts +135 -0
- package/src/handshake/crypt-init2.ts +48 -0
- package/src/handshake/index.ts +3 -0
- package/src/handshake/license.test.ts +49 -0
- package/src/handshake/license.ts +208 -0
- package/src/handshake.ts +136 -0
- package/src/helpers.ts +10 -0
- package/src/index.ts +74 -0
- package/src/notifications.ts +136 -0
- package/src/reconnect.ts +141 -0
- package/src/throttle.ts +92 -0
- package/src/transfer.ts +127 -0
- package/src/transport/generation-window.ts +77 -0
- package/src/transport/handler.ts +914 -0
- package/src/transport/index.ts +14 -0
- package/src/transport/packet.ts +69 -0
- package/src/transport/quicklz.ts +209 -0
- package/src/types.ts +349 -0
- package/dist/address-BR-5unVo.cjs +0 -2
- package/dist/address-BR-5unVo.cjs.map +0 -1
- package/dist/address-BfmovVpp.js +0 -65
- package/dist/address-BfmovVpp.js.map +0 -1
- package/dist/api.d.ts +0 -17
- package/dist/api.d.ts.map +0 -1
- package/dist/command/command.d.ts +0 -12
- package/dist/command/command.d.ts.map +0 -1
- package/dist/command/index.cjs +0 -1
- package/dist/command/index.d.ts +0 -4
- package/dist/command/index.d.ts.map +0 -1
- package/dist/command/index.mjs +0 -3
- package/dist/command/parser.d.ts +0 -3
- package/dist/command/parser.d.ts.map +0 -1
- package/dist/command-BLe-C2L2.js +0 -74
- package/dist/command-BLe-C2L2.js.map +0 -1
- package/dist/command-DAK4pUBP.cjs +0 -4
- package/dist/command-DAK4pUBP.cjs.map +0 -1
- package/dist/crypt-handshake-CQkQreLx.cjs +0 -2
- package/dist/crypt-handshake-CQkQreLx.cjs.map +0 -1
- package/dist/crypt-handshake-DziOY4Lq.js +0 -55
- package/dist/crypt-handshake-DziOY4Lq.js.map +0 -1
- package/dist/crypt-init2-D70ha4LB.js +0 -158
- package/dist/crypt-init2-D70ha4LB.js.map +0 -1
- package/dist/crypt-init2-DparLekm.cjs +0 -2
- package/dist/crypt-init2-DparLekm.cjs.map +0 -1
- package/dist/crypto/index.cjs +0 -1
- package/dist/crypto/index.mjs +0 -3
- package/dist/crypto-Bg02m4ZE.js +0 -165
- package/dist/crypto-Bg02m4ZE.js.map +0 -1
- package/dist/crypto-CDlweUL3.cjs +0 -2
- package/dist/crypto-CDlweUL3.cjs.map +0 -1
- package/dist/discovery/index.cjs +0 -1
- package/dist/discovery/index.mjs +0 -2
- package/dist/handler-DI_abe9c.js +0 -483
- package/dist/handler-DI_abe9c.js.map +0 -1
- package/dist/handler-DuwoO5RC.cjs +0 -2
- package/dist/handler-DuwoO5RC.cjs.map +0 -1
- package/dist/handshake/index.cjs +0 -1
- package/dist/handshake/index.mjs +0 -3
- package/dist/index.cjs +0 -4
- package/dist/index.cjs.map +0 -1
- package/dist/index.mjs +0 -827
- package/dist/index.mjs.map +0 -1
- package/dist/parser-CL33R9tr.cjs +0 -2
- package/dist/parser-CL33R9tr.cjs.map +0 -1
- package/dist/parser-DZMv3Jm-.js +0 -33
- package/dist/parser-DZMv3Jm-.js.map +0 -1
- package/dist/primitives-cNNAeFCo.cjs +0 -2
- package/dist/primitives-cNNAeFCo.cjs.map +0 -1
- package/dist/primitives-xIr6Tjk4.js +0 -1457
- package/dist/primitives-xIr6Tjk4.js.map +0 -1
- package/dist/resolver-6B8dI9gr.js +0 -141
- package/dist/resolver-6B8dI9gr.js.map +0 -1
- package/dist/resolver-DCcmyWSK.cjs +0 -4
- package/dist/resolver-DCcmyWSK.cjs.map +0 -1
- package/dist/transport/index.cjs +0 -1
- package/dist/transport/index.mjs +0 -2
package/dist/crypto-Bg02m4ZE.js
DELETED
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import { m as e, v as t, y as n } from "./primitives-xIr6Tjk4.js";
|
|
2
|
-
import { createCipheriv as r, createECDH as i, createHash as a, timingSafeEqual as o } from "node:crypto";
|
|
3
|
-
//#region src/crypto/eax.ts
|
|
4
|
-
var s = 8, c = 16, l = class {
|
|
5
|
-
#e;
|
|
6
|
-
constructor(e) {
|
|
7
|
-
if (e.length !== 16) throw Error("EAX requires a 16-byte key");
|
|
8
|
-
this.#e = e;
|
|
9
|
-
}
|
|
10
|
-
encrypt(e, t, n) {
|
|
11
|
-
let r = this.#t(0, e), i = this.#t(1, t), a = u(this.#e, r, n), o = this.#t(2, a), c = new Uint8Array(s);
|
|
12
|
-
for (let e = 0; e < s; e++) c[e] = r[e] ^ i[e] ^ o[e];
|
|
13
|
-
return [a, c];
|
|
14
|
-
}
|
|
15
|
-
decrypt(e, n, r, i) {
|
|
16
|
-
let a = this.#t(0, e), c = this.#t(1, n), l = this.#t(2, r), d = new Uint8Array(s);
|
|
17
|
-
for (let e = 0; e < s; e++) d[e] = a[e] ^ c[e] ^ l[e];
|
|
18
|
-
if (!o(Buffer.from(d), Buffer.from(i.slice(0, s)))) throw new t();
|
|
19
|
-
return u(this.#e, a, r);
|
|
20
|
-
}
|
|
21
|
-
#t(e, t) {
|
|
22
|
-
let n = new Uint8Array(c + t.length);
|
|
23
|
-
return n[15] = e, n.set(t, c), g(this.#e, n);
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
function u(e, t, n) {
|
|
27
|
-
let i = r("aes-128-ctr", Buffer.from(e), Buffer.from(t));
|
|
28
|
-
return Buffer.concat([i.update(Buffer.from(n)), i.final()]);
|
|
29
|
-
}
|
|
30
|
-
function d(e, t) {
|
|
31
|
-
let n = r("aes-128-ecb", Buffer.from(e), null);
|
|
32
|
-
return n.setAutoPadding(!1), Buffer.concat([n.update(Buffer.from(t)), n.final()]);
|
|
33
|
-
}
|
|
34
|
-
function f(e, t) {
|
|
35
|
-
let n = new Uint8Array(c);
|
|
36
|
-
for (let r = 0; r < c; r++) n[r] = e[r] ^ t[r];
|
|
37
|
-
return n;
|
|
38
|
-
}
|
|
39
|
-
function p(e) {
|
|
40
|
-
let t = new Uint8Array(c), n = 0;
|
|
41
|
-
for (let r = 15; r >= 0; r--) {
|
|
42
|
-
let i = (e[r] << 1 | n) & 255;
|
|
43
|
-
n = e[r] >> 7, t[r] = i;
|
|
44
|
-
}
|
|
45
|
-
return t;
|
|
46
|
-
}
|
|
47
|
-
var m = new Uint8Array(c);
|
|
48
|
-
m[15] = 135;
|
|
49
|
-
function h(e) {
|
|
50
|
-
let t = d(e, new Uint8Array(c)), n = p(t);
|
|
51
|
-
t[0] & 128 && (n = f(n, m));
|
|
52
|
-
let r = p(n);
|
|
53
|
-
return n[0] & 128 && (r = f(r, m)), [n, r];
|
|
54
|
-
}
|
|
55
|
-
function g(e, t) {
|
|
56
|
-
let [n, r] = h(e), i = Math.max(1, Math.ceil(t.length / c)), a = t.length > 0 && t.length % c === 0, o = new Uint8Array(c);
|
|
57
|
-
for (let n = 0; n < i - 1; n++) {
|
|
58
|
-
let r = t.slice(n * c, (n + 1) * c);
|
|
59
|
-
o = Uint8Array.from(d(e, f(o, r)));
|
|
60
|
-
}
|
|
61
|
-
let s = new Uint8Array(c), l = (i - 1) * c, u = t.slice(l);
|
|
62
|
-
s.set(u);
|
|
63
|
-
let p;
|
|
64
|
-
return a ? p = f(s, n) : (u.length < c && (s[u.length] = 128), p = f(s, r)), Uint8Array.from(d(e, f(o, p)));
|
|
65
|
-
}
|
|
66
|
-
//#endregion
|
|
67
|
-
//#region src/crypto/crypt.ts
|
|
68
|
-
var _ = 8, v = 10, y = 8, b = 15, x = Buffer.from("TS3INIT1"), S = Buffer.from("c:\\windows\\syste"), C = Buffer.from("m\\firewall32.cpl"), w = class {
|
|
69
|
-
identity;
|
|
70
|
-
ivStruct = /* @__PURE__ */ new Uint8Array();
|
|
71
|
-
fakeSignature = new Uint8Array(_);
|
|
72
|
-
alphaTmp = /* @__PURE__ */ new Uint8Array();
|
|
73
|
-
cryptoInitComplete = !1;
|
|
74
|
-
#e = /* @__PURE__ */ new Map();
|
|
75
|
-
constructor(e) {
|
|
76
|
-
this.identity = e;
|
|
77
|
-
}
|
|
78
|
-
solveRsaChallenge(e, t, n) {
|
|
79
|
-
if (n < 0 || n > 1e6) throw Error("RSA challenge level out of range");
|
|
80
|
-
let r = e.slice(t, t + 64), i = e.slice(t + 64, t + 128), a = E(r), o = E(i);
|
|
81
|
-
for (let e = 0; e < n; e++) a = a * a % o;
|
|
82
|
-
return D(a, 64);
|
|
83
|
-
}
|
|
84
|
-
initCrypto(t, n, r) {
|
|
85
|
-
let i = Buffer.from(t, "base64"), a = Buffer.from(n, "base64"), o = Buffer.from(r, "base64"), s = e(o), c = this.#t(s);
|
|
86
|
-
this.setSharedSecret(i, a, c);
|
|
87
|
-
}
|
|
88
|
-
setSharedSecret(e, t, n) {
|
|
89
|
-
this.ivStruct = new Uint8Array(v + t.length);
|
|
90
|
-
for (let t = 0; t < v; t++) {
|
|
91
|
-
let r = n[t], i = e[t];
|
|
92
|
-
this.ivStruct[t] = ((r === void 0 ? 0 : r) ^ (i === void 0 ? 0 : i)) & 255;
|
|
93
|
-
}
|
|
94
|
-
for (let e = 0; e < t.length; e++) {
|
|
95
|
-
let r = n[v + e], i = t[e];
|
|
96
|
-
this.ivStruct[v + e] = ((r === void 0 ? 0 : r) ^ (i === void 0 ? 0 : i)) & 255;
|
|
97
|
-
}
|
|
98
|
-
let r = a("sha1").update(this.ivStruct).digest();
|
|
99
|
-
this.fakeSignature = new Uint8Array(r.buffer, r.byteOffset, _), this.cryptoInitComplete = !0;
|
|
100
|
-
}
|
|
101
|
-
getKeyNonce(e, t, n, r, i) {
|
|
102
|
-
if (i) return [Uint8Array.from(S), Uint8Array.from(C)];
|
|
103
|
-
let o = T(e, r, n), s = this.#e.get(o);
|
|
104
|
-
if (s === void 0) {
|
|
105
|
-
let t = new Uint8Array(6 + this.ivStruct.length);
|
|
106
|
-
t[0] = e ? 48 : 49, t[1] = r & b, new DataView(t.buffer).setUint32(2, n, !1), t.set(this.ivStruct, 6);
|
|
107
|
-
let i = a("sha256").update(t).digest();
|
|
108
|
-
s = {
|
|
109
|
-
key: Uint8Array.from(i.slice(0, 16)),
|
|
110
|
-
nonce: Uint8Array.from(i.slice(16, 32)),
|
|
111
|
-
gen: n
|
|
112
|
-
}, this.#e.set(o, s);
|
|
113
|
-
}
|
|
114
|
-
let c = Uint8Array.from(s.key);
|
|
115
|
-
return c[0] = (c[0] === void 0 ? 0 : c[0]) ^ t >> 8 & 255, c[1] = (c[1] === void 0 ? 0 : c[1]) ^ t & 255, [c, s.nonce];
|
|
116
|
-
}
|
|
117
|
-
encrypt(e, t, n, r, i, a, o) {
|
|
118
|
-
if (e === y) return [i, x];
|
|
119
|
-
if (o) return [i, this.fakeSignature];
|
|
120
|
-
let [s, c] = this.getKeyNonce(!1, t, n, e, a);
|
|
121
|
-
return new l(s).encrypt(c, r, i);
|
|
122
|
-
}
|
|
123
|
-
decrypt(e, t, r, i, a, o, s, c) {
|
|
124
|
-
if (e === y) return a;
|
|
125
|
-
if (c) {
|
|
126
|
-
let e = o.slice(0, _);
|
|
127
|
-
if (!Buffer.from(e).equals(Buffer.from(this.fakeSignature))) throw new n();
|
|
128
|
-
return a;
|
|
129
|
-
}
|
|
130
|
-
let [u, d] = this.getKeyNonce(!0, t, r, e, s);
|
|
131
|
-
return new l(u).decrypt(d, i, a, o);
|
|
132
|
-
}
|
|
133
|
-
#t(e) {
|
|
134
|
-
let t = this.identity.privateKey.export({ format: "jwk" }), n = e.export({ format: "jwk" }), r = i("prime256v1"), o = Buffer.from(t.d, "base64url");
|
|
135
|
-
r.setPrivateKey(o);
|
|
136
|
-
let s = O(n.x, 32), c = O(n.y, 32), l = Buffer.alloc(65);
|
|
137
|
-
l[0] = 4, s.copy(l, 1), c.copy(l, 33);
|
|
138
|
-
let u = r.computeSecret(l);
|
|
139
|
-
return a("sha1").update(u).digest();
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
function T(e, t, n) {
|
|
143
|
-
let r = 0n;
|
|
144
|
-
return e && (r |= 1n << 40n), r |= BigInt(t & b) << 32n, r |= BigInt(n), r;
|
|
145
|
-
}
|
|
146
|
-
function E(e) {
|
|
147
|
-
let t = 0n;
|
|
148
|
-
for (let n of e) t = t << 8n | BigInt(n);
|
|
149
|
-
return t;
|
|
150
|
-
}
|
|
151
|
-
function D(e, t) {
|
|
152
|
-
let n = new Uint8Array(t), r = e;
|
|
153
|
-
for (let e = t - 1; e >= 0; e--) n[e] = Number(r & 255n), r >>= 8n;
|
|
154
|
-
return n;
|
|
155
|
-
}
|
|
156
|
-
function O(e, t) {
|
|
157
|
-
let n = Buffer.from(e, "base64url");
|
|
158
|
-
if (n.length === t) return n;
|
|
159
|
-
let r = Buffer.alloc(t);
|
|
160
|
-
return n.copy(r, t - n.length), r;
|
|
161
|
-
}
|
|
162
|
-
//#endregion
|
|
163
|
-
export { l as n, g as r, w as t };
|
|
164
|
-
|
|
165
|
-
//# sourceMappingURL=crypto-Bg02m4ZE.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypto-Bg02m4ZE.js","names":["importPublicKey","EAXTagMismatchError","FakeSignatureMismatchError","EAX_TAG_SIZE","EAX_BLOCK_SIZE","EAX","key","#key","nStar","#cmac","nonce","hStar","header","ciphertext","aesCtr","plaintext","cStar","tag","i","expected","timingSafeEqual","input","data","tagByte","aesCmac","cipher","createCipheriv","iv","aesEcb","block","xorBlock","out","a","b","shiftLeft1","carry","shifted","RB","generateSubkeys","L","K1","K2","n","message","lastBlockComplete","X","lastBlock","lastStart","lastSlice","Mn","FAKE_SIGNATURE_SIZE","IV_ALPHA_SIZE","INIT1_PACKET_TYPE","PACKET_TYPE_MASK","INIT1_MAC","DUMMY_KEY","DUMMY_NONCE","Crypt","identity","level","xBytes","offset","nBytes","y","bytesToBigInt","bigIntToBytes","alphaBytes","alpha","betaBytes","beta","omegaBytes","omega","serverPubKey","sharedSecret","#getSharedSecret","sharedKey","digest","createHash","dummy","cacheKey","makeCacheKey","fromServer","packetType","generationID","kn","#cachedKeys","tmpToHash","hash","packetID","unencrypted","fsSub","privJwk","pubJwk","ecdh","createECDH","dBytes","base64UrlToBytes","yBytes","uncompressed","rawSecret","result","bytes","size","v","value","buf","b64url","padded"],"sources":["../src/crypto/eax.ts","../src/crypto/crypt.ts"],"sourcesContent":["import { createCipheriv, timingSafeEqual } from \"node:crypto\";\nimport { EAXTagMismatchError } from \"../errors.js\";\n\nconst EAX_TAG_SIZE = 8;\nconst EAX_BLOCK_SIZE = 16;\n\n/**\n * AES-EAX AEAD implementation for TS3 (64-bit tag, AES-128).\n * Uses AES-CMAC for authentication and AES-CTR for encryption.\n */\nexport class EAX {\n readonly #key: Uint8Array;\n\n constructor(key: Uint8Array) {\n if (key.length !== 16) throw new Error(\"EAX requires a 16-byte key\");\n this.#key = key;\n }\n\n encrypt(\n nonce: Uint8Array,\n header: Uint8Array,\n plaintext: Uint8Array,\n ): [ciphertext: Uint8Array, tag: Uint8Array] {\n const nStar = this.#cmac(0, nonce);\n const hStar = this.#cmac(1, header);\n\n const ciphertext = aesCtr(this.#key, nStar, plaintext);\n\n const cStar = this.#cmac(2, ciphertext);\n\n const tag = new Uint8Array(EAX_TAG_SIZE);\n for (let i = 0; i < EAX_TAG_SIZE; i++) {\n tag[i] = nStar[i]! ^ hStar[i]! ^ cStar[i]!;\n }\n\n return [ciphertext, tag];\n }\n\n decrypt(\n nonce: Uint8Array,\n header: Uint8Array,\n ciphertext: Uint8Array,\n tag: Uint8Array,\n ): Uint8Array {\n const nStar = this.#cmac(0, nonce);\n const hStar = this.#cmac(1, header);\n const cStar = this.#cmac(2, ciphertext);\n\n const expected = new Uint8Array(EAX_TAG_SIZE);\n for (let i = 0; i < EAX_TAG_SIZE; i++) {\n expected[i] = nStar[i]! ^ hStar[i]! ^ cStar[i]!;\n }\n\n if (!timingSafeEqual(Buffer.from(expected), Buffer.from(tag.slice(0, EAX_TAG_SIZE)))) {\n throw new EAXTagMismatchError();\n }\n\n return aesCtr(this.#key, nStar, ciphertext);\n }\n\n /**\n * AES-CMAC per RFC 4493:\n * input = [0…0 tag] ++ data (one block prefix)\n */\n #cmac(tagByte: number, data: Uint8Array): Uint8Array {\n const input = new Uint8Array(EAX_BLOCK_SIZE + data.length);\n // first block: zeros then tag byte at the last position\n input[EAX_BLOCK_SIZE - 1] = tagByte;\n input.set(data, EAX_BLOCK_SIZE);\n\n return aesCmac(this.#key, input);\n }\n}\n\n// ---- AES-CTR ----------------------------------------------------------------\n\nfunction aesCtr(key: Uint8Array, iv: Uint8Array, data: Uint8Array): Uint8Array {\n const cipher = createCipheriv(\"aes-128-ctr\", Buffer.from(key), Buffer.from(iv));\n return Buffer.concat([cipher.update(Buffer.from(data)), cipher.final()]);\n}\n\n// ---- AES-CMAC (RFC 4493) ----------------------------------------------------\n\nfunction aesEcb(key: Uint8Array, block: Uint8Array): Uint8Array {\n // Node.js does not expose ECB directly; simulate via CTR with zero IV and\n // a zero-input (CTR of 0-block XOR with input = ECB)\n const cipher = createCipheriv(\"aes-128-ecb\", Buffer.from(key), null);\n cipher.setAutoPadding(false);\n return Buffer.concat([cipher.update(Buffer.from(block)), cipher.final()]);\n}\n\nfunction xorBlock(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(EAX_BLOCK_SIZE);\n for (let i = 0; i < EAX_BLOCK_SIZE; i++) out[i] = a[i]! ^ b[i]!;\n return out;\n}\n\nfunction shiftLeft1(b: Uint8Array): Uint8Array {\n const out = new Uint8Array(EAX_BLOCK_SIZE);\n let carry = 0;\n for (let i = EAX_BLOCK_SIZE - 1; i >= 0; i--) {\n const shifted = ((b[i]! << 1) | carry) & 0xff;\n carry = b[i]! >> 7;\n out[i] = shifted;\n }\n return out;\n}\n\nconst RB = new Uint8Array(EAX_BLOCK_SIZE);\nRB[EAX_BLOCK_SIZE - 1] = 0x87;\n\nfunction generateSubkeys(key: Uint8Array): [Uint8Array, Uint8Array] {\n const zero = new Uint8Array(EAX_BLOCK_SIZE);\n const L = aesEcb(key, zero);\n\n let K1 = shiftLeft1(L);\n if ((L[0]! & 0x80) !== 0) K1 = xorBlock(K1, RB);\n\n let K2 = shiftLeft1(K1);\n if ((K1[0]! & 0x80) !== 0) K2 = xorBlock(K2, RB);\n\n return [K1, K2];\n}\n\nexport function aesCmac(key: Uint8Array, message: Uint8Array): Uint8Array {\n const [K1, K2] = generateSubkeys(key);\n\n const n = Math.max(1, Math.ceil(message.length / EAX_BLOCK_SIZE));\n const lastBlockComplete = message.length > 0 && message.length % EAX_BLOCK_SIZE === 0;\n\n let X: Uint8Array = new Uint8Array(EAX_BLOCK_SIZE);\n\n for (let i = 0; i < n - 1; i++) {\n const block = message.slice(i * EAX_BLOCK_SIZE, (i + 1) * EAX_BLOCK_SIZE);\n X = Uint8Array.from(aesEcb(key, xorBlock(X, block)));\n }\n\n const lastBlock = new Uint8Array(EAX_BLOCK_SIZE);\n const lastStart = (n - 1) * EAX_BLOCK_SIZE;\n const lastSlice = message.slice(lastStart);\n lastBlock.set(lastSlice);\n\n let Mn: Uint8Array;\n if (lastBlockComplete) {\n Mn = xorBlock(lastBlock, K1);\n } else {\n if (lastSlice.length < EAX_BLOCK_SIZE) lastBlock[lastSlice.length] = 0x80;\n Mn = xorBlock(lastBlock, K2);\n }\n\n return Uint8Array.from(aesEcb(key, xorBlock(X, Mn)));\n}\n","import { createHash, createECDH } from \"node:crypto\";\nimport { FakeSignatureMismatchError } from \"../errors.js\";\nimport type { Identity } from \"./identity.js\";\nimport { importPublicKey } from \"./identity.js\";\nimport { EAX } from \"./eax.js\";\n\nconst FAKE_SIGNATURE_SIZE = 8;\nconst IV_ALPHA_SIZE = 10;\nconst INIT1_PACKET_TYPE = 8;\nconst PACKET_TYPE_MASK = 0x0f;\n\nconst INIT1_MAC = Buffer.from(\"TS3INIT1\");\n\nexport interface KeyNonce {\n key: Uint8Array;\n nonce: Uint8Array;\n gen: number;\n}\n\n/** Precomputed dummy key/nonce matching the TS3 client pre-crypto placeholder. */\nconst DUMMY_KEY = Buffer.from(\"c:\\\\windows\\\\syste\");\nconst DUMMY_NONCE = Buffer.from(\"m\\\\firewall32.cpl\");\n\nexport class Crypt {\n readonly identity: Identity;\n\n ivStruct: Uint8Array = new Uint8Array(0);\n fakeSignature: Uint8Array = new Uint8Array(FAKE_SIGNATURE_SIZE);\n alphaTmp: Uint8Array = new Uint8Array(0);\n cryptoInitComplete = false;\n\n readonly #cachedKeys = new Map<bigint, KeyNonce>();\n\n constructor(identity: Identity) {\n this.identity = identity;\n }\n\n solveRsaChallenge(data: Uint8Array, offset: number, level: number): Uint8Array {\n if (level < 0 || level > 1_000_000) {\n throw new Error(\"RSA challenge level out of range\");\n }\n\n const xBytes = data.slice(offset, offset + 64);\n const nBytes = data.slice(offset + 64, offset + 128);\n\n let y = bytesToBigInt(xBytes);\n const n = bytesToBigInt(nBytes);\n\n for (let i = 0; i < level; i++) {\n y = (y * y) % n;\n }\n\n return bigIntToBytes(y, 64);\n }\n\n initCrypto(alpha: string, beta: string, omega: string): void {\n const alphaBytes = Buffer.from(alpha, \"base64\");\n const betaBytes = Buffer.from(beta, \"base64\");\n const omegaBytes = Buffer.from(omega, \"base64\");\n\n const serverPubKey = importPublicKey(omegaBytes);\n const sharedSecret = this.#getSharedSecret(serverPubKey);\n\n this.setSharedSecret(alphaBytes, betaBytes, sharedSecret);\n }\n\n setSharedSecret(alpha: Uint8Array, beta: Uint8Array, sharedKey: Uint8Array): void {\n this.ivStruct = new Uint8Array(IV_ALPHA_SIZE + beta.length);\n for (let i = 0; i < IV_ALPHA_SIZE; i++) {\n const a = sharedKey[i];\n const b = alpha[i];\n this.ivStruct[i] = ((a !== undefined ? a : 0) ^ (b !== undefined ? b : 0)) & 0xff;\n }\n for (let i = 0; i < beta.length; i++) {\n const a = sharedKey[IV_ALPHA_SIZE + i];\n const b = beta[i];\n this.ivStruct[IV_ALPHA_SIZE + i] =\n ((a !== undefined ? a : 0) ^ (b !== undefined ? b : 0)) & 0xff;\n }\n\n const digest = createHash(\"sha1\").update(this.ivStruct).digest();\n this.fakeSignature = new Uint8Array(digest.buffer, digest.byteOffset, FAKE_SIGNATURE_SIZE);\n this.cryptoInitComplete = true;\n }\n\n getKeyNonce(\n fromServer: boolean,\n packetID: number,\n generationID: number,\n packetType: number,\n dummy: boolean,\n ): [key: Uint8Array, nonce: Uint8Array] {\n if (dummy) {\n return [Uint8Array.from(DUMMY_KEY), Uint8Array.from(DUMMY_NONCE)];\n }\n\n const cacheKey = makeCacheKey(fromServer, packetType, generationID);\n let kn = this.#cachedKeys.get(cacheKey);\n\n if (kn === undefined) {\n const tmpToHash = new Uint8Array(6 + this.ivStruct.length);\n tmpToHash[0] = fromServer ? 0x30 : 0x31;\n tmpToHash[1] = packetType & PACKET_TYPE_MASK;\n new DataView(tmpToHash.buffer).setUint32(2, generationID, false);\n tmpToHash.set(this.ivStruct, 6);\n\n const hash = createHash(\"sha256\").update(tmpToHash).digest();\n kn = {\n key: Uint8Array.from(hash.slice(0, 16)),\n nonce: Uint8Array.from(hash.slice(16, 32)),\n gen: generationID,\n };\n this.#cachedKeys.set(cacheKey, kn);\n }\n\n const key = Uint8Array.from(kn.key);\n key[0] = (key[0] !== undefined ? key[0] : 0) ^ ((packetID >> 8) & 0xff);\n key[1] = (key[1] !== undefined ? key[1] : 0) ^ (packetID & 0xff);\n\n return [key, kn.nonce];\n }\n\n encrypt(\n packetType: number,\n packetID: number,\n generationID: number,\n header: Uint8Array,\n plaintext: Uint8Array,\n dummy: boolean,\n unencrypted: boolean,\n ): [ciphertext: Uint8Array, mac: Uint8Array] {\n if (packetType === INIT1_PACKET_TYPE) {\n return [plaintext, INIT1_MAC];\n }\n if (unencrypted) {\n return [plaintext, this.fakeSignature];\n }\n\n const [key, nonce] = this.getKeyNonce(false, packetID, generationID, packetType, dummy);\n const eax = new EAX(key);\n return eax.encrypt(nonce, header, plaintext);\n }\n\n decrypt(\n packetType: number,\n packetID: number,\n generationID: number,\n header: Uint8Array,\n ciphertext: Uint8Array,\n tag: Uint8Array,\n dummy: boolean,\n unencrypted: boolean,\n ): Uint8Array {\n if (packetType === INIT1_PACKET_TYPE) {\n return ciphertext;\n }\n if (unencrypted) {\n const fsSub = tag.slice(0, FAKE_SIGNATURE_SIZE);\n if (!Buffer.from(fsSub).equals(Buffer.from(this.fakeSignature))) {\n throw new FakeSignatureMismatchError();\n }\n return ciphertext;\n }\n\n const [key, nonce] = this.getKeyNonce(true, packetID, generationID, packetType, dummy);\n const eax = new EAX(key);\n return eax.decrypt(nonce, header, ciphertext, tag);\n }\n\n #getSharedSecret(serverPubKey: import(\"node:crypto\").KeyObject): Uint8Array {\n const privJwk = this.identity.privateKey.export({ format: \"jwk\" }) as {\n d: string;\n };\n const pubJwk = serverPubKey.export({ format: \"jwk\" }) as {\n x: string;\n y: string;\n };\n\n const ecdh = createECDH(\"prime256v1\");\n const dBytes = Buffer.from(privJwk.d, \"base64url\");\n ecdh.setPrivateKey(dBytes);\n\n const xBytes = base64UrlToBytes(pubJwk.x, 32);\n const yBytes = base64UrlToBytes(pubJwk.y, 32);\n const uncompressed = Buffer.alloc(65);\n uncompressed[0] = 0x04;\n xBytes.copy(uncompressed, 1);\n yBytes.copy(uncompressed, 33);\n\n const rawSecret = ecdh.computeSecret(uncompressed);\n return createHash(\"sha1\").update(rawSecret).digest();\n }\n}\n\n// ---- Helpers ----------------------------------------------------------------\n\nfunction makeCacheKey(fromServer: boolean, packetType: number, generationID: number): bigint {\n let key = 0n;\n if (fromServer) key |= 1n << 40n;\n key |= BigInt(packetType & PACKET_TYPE_MASK) << 32n;\n key |= BigInt(generationID);\n return key;\n}\n\nfunction bytesToBigInt(bytes: Uint8Array): bigint {\n let result = 0n;\n for (const b of bytes) result = (result << 8n) | BigInt(b);\n return result;\n}\n\nfunction bigIntToBytes(value: bigint, size: number): Uint8Array {\n const result = new Uint8Array(size);\n let v = value;\n for (let i = size - 1; i >= 0; i--) {\n result[i] = Number(v & 0xffn);\n v >>= 8n;\n }\n return result;\n}\n\nfunction base64UrlToBytes(b64url: string, size: number): Buffer {\n const buf = Buffer.from(b64url, \"base64url\");\n if (buf.length === size) return buf;\n const padded = Buffer.alloc(size);\n buf.copy(padded, size - buf.length);\n return padded;\n}\n"],"mappings":"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"}
|
package/dist/crypto-CDlweUL3.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("./primitives-cNNAeFCo.cjs");let t=require("node:crypto");var n=8,r=16,i=class{#e;constructor(e){if(e.length!==16)throw Error(`EAX requires a 16-byte key`);this.#e=e}encrypt(e,t,r){let i=this.#t(0,e),o=this.#t(1,t),s=a(this.#e,i,r),c=this.#t(2,s),l=new Uint8Array(n);for(let e=0;e<n;e++)l[e]=i[e]^o[e]^c[e];return[s,l]}decrypt(r,i,o,s){let c=this.#t(0,r),l=this.#t(1,i),u=this.#t(2,o),d=new Uint8Array(n);for(let e=0;e<n;e++)d[e]=c[e]^l[e]^u[e];if(!(0,t.timingSafeEqual)(Buffer.from(d),Buffer.from(s.slice(0,n))))throw new e.v;return a(this.#e,c,o)}#t(e,t){let n=new Uint8Array(r+t.length);return n[15]=e,n.set(t,r),d(this.#e,n)}};function a(e,n,r){let i=(0,t.createCipheriv)(`aes-128-ctr`,Buffer.from(e),Buffer.from(n));return Buffer.concat([i.update(Buffer.from(r)),i.final()])}function o(e,n){let r=(0,t.createCipheriv)(`aes-128-ecb`,Buffer.from(e),null);return r.setAutoPadding(!1),Buffer.concat([r.update(Buffer.from(n)),r.final()])}function s(e,t){let n=new Uint8Array(r);for(let i=0;i<r;i++)n[i]=e[i]^t[i];return n}function c(e){let t=new Uint8Array(r),n=0;for(let r=15;r>=0;r--){let i=(e[r]<<1|n)&255;n=e[r]>>7,t[r]=i}return t}var l=new Uint8Array(r);l[15]=135;function u(e){let t=o(e,new Uint8Array(r)),n=c(t);t[0]&128&&(n=s(n,l));let i=c(n);return n[0]&128&&(i=s(i,l)),[n,i]}function d(e,t){let[n,i]=u(e),a=Math.max(1,Math.ceil(t.length/r)),c=t.length>0&&t.length%r===0,l=new Uint8Array(r);for(let n=0;n<a-1;n++){let i=t.slice(n*r,(n+1)*r);l=Uint8Array.from(o(e,s(l,i)))}let d=new Uint8Array(r),f=(a-1)*r,p=t.slice(f);d.set(p);let m;return c?m=s(d,n):(p.length<r&&(d[p.length]=128),m=s(d,i)),Uint8Array.from(o(e,s(l,m)))}var f=8,p=10,m=8,h=15,g=Buffer.from(`TS3INIT1`),_=Buffer.from(`c:\\windows\\syste`),v=Buffer.from(`m\\firewall32.cpl`),y=class{identity;ivStruct=new Uint8Array;fakeSignature=new Uint8Array(f);alphaTmp=new Uint8Array;cryptoInitComplete=!1;#e=new Map;constructor(e){this.identity=e}solveRsaChallenge(e,t,n){if(n<0||n>1e6)throw Error(`RSA challenge level out of range`);let r=e.slice(t,t+64),i=e.slice(t+64,t+128),a=x(r),o=x(i);for(let e=0;e<n;e++)a=a*a%o;return S(a,64)}initCrypto(t,n,r){let i=Buffer.from(t,`base64`),a=Buffer.from(n,`base64`),o=Buffer.from(r,`base64`),s=e.m(o),c=this.#t(s);this.setSharedSecret(i,a,c)}setSharedSecret(e,n,r){this.ivStruct=new Uint8Array(p+n.length);for(let t=0;t<p;t++){let n=r[t],i=e[t];this.ivStruct[t]=((n===void 0?0:n)^(i===void 0?0:i))&255}for(let e=0;e<n.length;e++){let t=r[p+e],i=n[e];this.ivStruct[p+e]=((t===void 0?0:t)^(i===void 0?0:i))&255}let i=(0,t.createHash)(`sha1`).update(this.ivStruct).digest();this.fakeSignature=new Uint8Array(i.buffer,i.byteOffset,f),this.cryptoInitComplete=!0}getKeyNonce(e,n,r,i,a){if(a)return[Uint8Array.from(_),Uint8Array.from(v)];let o=b(e,i,r),s=this.#e.get(o);if(s===void 0){let n=new Uint8Array(6+this.ivStruct.length);n[0]=e?48:49,n[1]=i&h,new DataView(n.buffer).setUint32(2,r,!1),n.set(this.ivStruct,6);let a=(0,t.createHash)(`sha256`).update(n).digest();s={key:Uint8Array.from(a.slice(0,16)),nonce:Uint8Array.from(a.slice(16,32)),gen:r},this.#e.set(o,s)}let c=Uint8Array.from(s.key);return c[0]=(c[0]===void 0?0:c[0])^n>>8&255,c[1]=(c[1]===void 0?0:c[1])^n&255,[c,s.nonce]}encrypt(e,t,n,r,a,o,s){if(e===m)return[a,g];if(s)return[a,this.fakeSignature];let[c,l]=this.getKeyNonce(!1,t,n,e,o);return new i(c).encrypt(l,r,a)}decrypt(t,n,r,a,o,s,c,l){if(t===m)return o;if(l){let t=s.slice(0,f);if(!Buffer.from(t).equals(Buffer.from(this.fakeSignature)))throw new e.y;return o}let[u,d]=this.getKeyNonce(!0,n,r,t,c);return new i(u).decrypt(d,a,o,s)}#t(e){let n=this.identity.privateKey.export({format:`jwk`}),r=e.export({format:`jwk`}),i=(0,t.createECDH)(`prime256v1`),a=Buffer.from(n.d,`base64url`);i.setPrivateKey(a);let o=C(r.x,32),s=C(r.y,32),c=Buffer.alloc(65);c[0]=4,o.copy(c,1),s.copy(c,33);let l=i.computeSecret(c);return(0,t.createHash)(`sha1`).update(l).digest()}};function b(e,t,n){let r=0n;return e&&(r|=1n<<40n),r|=BigInt(t&h)<<32n,r|=BigInt(n),r}function x(e){let t=0n;for(let n of e)t=t<<8n|BigInt(n);return t}function S(e,t){let n=new Uint8Array(t),r=e;for(let e=t-1;e>=0;e--)n[e]=Number(r&255n),r>>=8n;return n}function C(e,t){let n=Buffer.from(e,`base64url`);if(n.length===t)return n;let r=Buffer.alloc(t);return n.copy(r,t-n.length),r}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return y}});
|
|
2
|
-
//# sourceMappingURL=crypto-CDlweUL3.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypto-CDlweUL3.cjs","names":["timingSafeEqual","EAXTagMismatchError","createCipheriv","importPublicKey","createHash","FakeSignatureMismatchError","createECDH","require_primitives","node_crypto","EAX_TAG_SIZE","EAX_BLOCK_SIZE","EAX","key","#key","nStar","#cmac","nonce","hStar","header","ciphertext","aesCtr","plaintext","cStar","tag","i","expected","input","data","tagByte","aesCmac","cipher","iv","aesEcb","block","xorBlock","out","a","b","shiftLeft1","carry","shifted","RB","generateSubkeys","L","K1","K2","n","message","lastBlockComplete","X","lastBlock","lastStart","lastSlice","Mn","FAKE_SIGNATURE_SIZE","IV_ALPHA_SIZE","INIT1_PACKET_TYPE","PACKET_TYPE_MASK","INIT1_MAC","DUMMY_KEY","DUMMY_NONCE","Crypt","identity","level","xBytes","offset","nBytes","y","bytesToBigInt","bigIntToBytes","alphaBytes","alpha","betaBytes","beta","omegaBytes","omega","serverPubKey","sharedSecret","#getSharedSecret","sharedKey","digest","dummy","cacheKey","makeCacheKey","fromServer","packetType","generationID","kn","#cachedKeys","tmpToHash","hash","packetID","unencrypted","fsSub","privJwk","pubJwk","ecdh","dBytes","base64UrlToBytes","yBytes","uncompressed","rawSecret","result","bytes","size","v","value","buf","b64url","padded"],"sources":["../src/crypto/eax.ts","../src/crypto/crypt.ts"],"sourcesContent":["import { createCipheriv, timingSafeEqual } from \"node:crypto\";\nimport { EAXTagMismatchError } from \"../errors.js\";\n\nconst EAX_TAG_SIZE = 8;\nconst EAX_BLOCK_SIZE = 16;\n\n/**\n * AES-EAX AEAD implementation for TS3 (64-bit tag, AES-128).\n * Uses AES-CMAC for authentication and AES-CTR for encryption.\n */\nexport class EAX {\n readonly #key: Uint8Array;\n\n constructor(key: Uint8Array) {\n if (key.length !== 16) throw new Error(\"EAX requires a 16-byte key\");\n this.#key = key;\n }\n\n encrypt(\n nonce: Uint8Array,\n header: Uint8Array,\n plaintext: Uint8Array,\n ): [ciphertext: Uint8Array, tag: Uint8Array] {\n const nStar = this.#cmac(0, nonce);\n const hStar = this.#cmac(1, header);\n\n const ciphertext = aesCtr(this.#key, nStar, plaintext);\n\n const cStar = this.#cmac(2, ciphertext);\n\n const tag = new Uint8Array(EAX_TAG_SIZE);\n for (let i = 0; i < EAX_TAG_SIZE; i++) {\n tag[i] = nStar[i]! ^ hStar[i]! ^ cStar[i]!;\n }\n\n return [ciphertext, tag];\n }\n\n decrypt(\n nonce: Uint8Array,\n header: Uint8Array,\n ciphertext: Uint8Array,\n tag: Uint8Array,\n ): Uint8Array {\n const nStar = this.#cmac(0, nonce);\n const hStar = this.#cmac(1, header);\n const cStar = this.#cmac(2, ciphertext);\n\n const expected = new Uint8Array(EAX_TAG_SIZE);\n for (let i = 0; i < EAX_TAG_SIZE; i++) {\n expected[i] = nStar[i]! ^ hStar[i]! ^ cStar[i]!;\n }\n\n if (!timingSafeEqual(Buffer.from(expected), Buffer.from(tag.slice(0, EAX_TAG_SIZE)))) {\n throw new EAXTagMismatchError();\n }\n\n return aesCtr(this.#key, nStar, ciphertext);\n }\n\n /**\n * AES-CMAC per RFC 4493:\n * input = [0…0 tag] ++ data (one block prefix)\n */\n #cmac(tagByte: number, data: Uint8Array): Uint8Array {\n const input = new Uint8Array(EAX_BLOCK_SIZE + data.length);\n // first block: zeros then tag byte at the last position\n input[EAX_BLOCK_SIZE - 1] = tagByte;\n input.set(data, EAX_BLOCK_SIZE);\n\n return aesCmac(this.#key, input);\n }\n}\n\n// ---- AES-CTR ----------------------------------------------------------------\n\nfunction aesCtr(key: Uint8Array, iv: Uint8Array, data: Uint8Array): Uint8Array {\n const cipher = createCipheriv(\"aes-128-ctr\", Buffer.from(key), Buffer.from(iv));\n return Buffer.concat([cipher.update(Buffer.from(data)), cipher.final()]);\n}\n\n// ---- AES-CMAC (RFC 4493) ----------------------------------------------------\n\nfunction aesEcb(key: Uint8Array, block: Uint8Array): Uint8Array {\n // Node.js does not expose ECB directly; simulate via CTR with zero IV and\n // a zero-input (CTR of 0-block XOR with input = ECB)\n const cipher = createCipheriv(\"aes-128-ecb\", Buffer.from(key), null);\n cipher.setAutoPadding(false);\n return Buffer.concat([cipher.update(Buffer.from(block)), cipher.final()]);\n}\n\nfunction xorBlock(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(EAX_BLOCK_SIZE);\n for (let i = 0; i < EAX_BLOCK_SIZE; i++) out[i] = a[i]! ^ b[i]!;\n return out;\n}\n\nfunction shiftLeft1(b: Uint8Array): Uint8Array {\n const out = new Uint8Array(EAX_BLOCK_SIZE);\n let carry = 0;\n for (let i = EAX_BLOCK_SIZE - 1; i >= 0; i--) {\n const shifted = ((b[i]! << 1) | carry) & 0xff;\n carry = b[i]! >> 7;\n out[i] = shifted;\n }\n return out;\n}\n\nconst RB = new Uint8Array(EAX_BLOCK_SIZE);\nRB[EAX_BLOCK_SIZE - 1] = 0x87;\n\nfunction generateSubkeys(key: Uint8Array): [Uint8Array, Uint8Array] {\n const zero = new Uint8Array(EAX_BLOCK_SIZE);\n const L = aesEcb(key, zero);\n\n let K1 = shiftLeft1(L);\n if ((L[0]! & 0x80) !== 0) K1 = xorBlock(K1, RB);\n\n let K2 = shiftLeft1(K1);\n if ((K1[0]! & 0x80) !== 0) K2 = xorBlock(K2, RB);\n\n return [K1, K2];\n}\n\nexport function aesCmac(key: Uint8Array, message: Uint8Array): Uint8Array {\n const [K1, K2] = generateSubkeys(key);\n\n const n = Math.max(1, Math.ceil(message.length / EAX_BLOCK_SIZE));\n const lastBlockComplete = message.length > 0 && message.length % EAX_BLOCK_SIZE === 0;\n\n let X: Uint8Array = new Uint8Array(EAX_BLOCK_SIZE);\n\n for (let i = 0; i < n - 1; i++) {\n const block = message.slice(i * EAX_BLOCK_SIZE, (i + 1) * EAX_BLOCK_SIZE);\n X = Uint8Array.from(aesEcb(key, xorBlock(X, block)));\n }\n\n const lastBlock = new Uint8Array(EAX_BLOCK_SIZE);\n const lastStart = (n - 1) * EAX_BLOCK_SIZE;\n const lastSlice = message.slice(lastStart);\n lastBlock.set(lastSlice);\n\n let Mn: Uint8Array;\n if (lastBlockComplete) {\n Mn = xorBlock(lastBlock, K1);\n } else {\n if (lastSlice.length < EAX_BLOCK_SIZE) lastBlock[lastSlice.length] = 0x80;\n Mn = xorBlock(lastBlock, K2);\n }\n\n return Uint8Array.from(aesEcb(key, xorBlock(X, Mn)));\n}\n","import { createHash, createECDH } from \"node:crypto\";\nimport { FakeSignatureMismatchError } from \"../errors.js\";\nimport type { Identity } from \"./identity.js\";\nimport { importPublicKey } from \"./identity.js\";\nimport { EAX } from \"./eax.js\";\n\nconst FAKE_SIGNATURE_SIZE = 8;\nconst IV_ALPHA_SIZE = 10;\nconst INIT1_PACKET_TYPE = 8;\nconst PACKET_TYPE_MASK = 0x0f;\n\nconst INIT1_MAC = Buffer.from(\"TS3INIT1\");\n\nexport interface KeyNonce {\n key: Uint8Array;\n nonce: Uint8Array;\n gen: number;\n}\n\n/** Precomputed dummy key/nonce matching the TS3 client pre-crypto placeholder. */\nconst DUMMY_KEY = Buffer.from(\"c:\\\\windows\\\\syste\");\nconst DUMMY_NONCE = Buffer.from(\"m\\\\firewall32.cpl\");\n\nexport class Crypt {\n readonly identity: Identity;\n\n ivStruct: Uint8Array = new Uint8Array(0);\n fakeSignature: Uint8Array = new Uint8Array(FAKE_SIGNATURE_SIZE);\n alphaTmp: Uint8Array = new Uint8Array(0);\n cryptoInitComplete = false;\n\n readonly #cachedKeys = new Map<bigint, KeyNonce>();\n\n constructor(identity: Identity) {\n this.identity = identity;\n }\n\n solveRsaChallenge(data: Uint8Array, offset: number, level: number): Uint8Array {\n if (level < 0 || level > 1_000_000) {\n throw new Error(\"RSA challenge level out of range\");\n }\n\n const xBytes = data.slice(offset, offset + 64);\n const nBytes = data.slice(offset + 64, offset + 128);\n\n let y = bytesToBigInt(xBytes);\n const n = bytesToBigInt(nBytes);\n\n for (let i = 0; i < level; i++) {\n y = (y * y) % n;\n }\n\n return bigIntToBytes(y, 64);\n }\n\n initCrypto(alpha: string, beta: string, omega: string): void {\n const alphaBytes = Buffer.from(alpha, \"base64\");\n const betaBytes = Buffer.from(beta, \"base64\");\n const omegaBytes = Buffer.from(omega, \"base64\");\n\n const serverPubKey = importPublicKey(omegaBytes);\n const sharedSecret = this.#getSharedSecret(serverPubKey);\n\n this.setSharedSecret(alphaBytes, betaBytes, sharedSecret);\n }\n\n setSharedSecret(alpha: Uint8Array, beta: Uint8Array, sharedKey: Uint8Array): void {\n this.ivStruct = new Uint8Array(IV_ALPHA_SIZE + beta.length);\n for (let i = 0; i < IV_ALPHA_SIZE; i++) {\n const a = sharedKey[i];\n const b = alpha[i];\n this.ivStruct[i] = ((a !== undefined ? a : 0) ^ (b !== undefined ? b : 0)) & 0xff;\n }\n for (let i = 0; i < beta.length; i++) {\n const a = sharedKey[IV_ALPHA_SIZE + i];\n const b = beta[i];\n this.ivStruct[IV_ALPHA_SIZE + i] =\n ((a !== undefined ? a : 0) ^ (b !== undefined ? b : 0)) & 0xff;\n }\n\n const digest = createHash(\"sha1\").update(this.ivStruct).digest();\n this.fakeSignature = new Uint8Array(digest.buffer, digest.byteOffset, FAKE_SIGNATURE_SIZE);\n this.cryptoInitComplete = true;\n }\n\n getKeyNonce(\n fromServer: boolean,\n packetID: number,\n generationID: number,\n packetType: number,\n dummy: boolean,\n ): [key: Uint8Array, nonce: Uint8Array] {\n if (dummy) {\n return [Uint8Array.from(DUMMY_KEY), Uint8Array.from(DUMMY_NONCE)];\n }\n\n const cacheKey = makeCacheKey(fromServer, packetType, generationID);\n let kn = this.#cachedKeys.get(cacheKey);\n\n if (kn === undefined) {\n const tmpToHash = new Uint8Array(6 + this.ivStruct.length);\n tmpToHash[0] = fromServer ? 0x30 : 0x31;\n tmpToHash[1] = packetType & PACKET_TYPE_MASK;\n new DataView(tmpToHash.buffer).setUint32(2, generationID, false);\n tmpToHash.set(this.ivStruct, 6);\n\n const hash = createHash(\"sha256\").update(tmpToHash).digest();\n kn = {\n key: Uint8Array.from(hash.slice(0, 16)),\n nonce: Uint8Array.from(hash.slice(16, 32)),\n gen: generationID,\n };\n this.#cachedKeys.set(cacheKey, kn);\n }\n\n const key = Uint8Array.from(kn.key);\n key[0] = (key[0] !== undefined ? key[0] : 0) ^ ((packetID >> 8) & 0xff);\n key[1] = (key[1] !== undefined ? key[1] : 0) ^ (packetID & 0xff);\n\n return [key, kn.nonce];\n }\n\n encrypt(\n packetType: number,\n packetID: number,\n generationID: number,\n header: Uint8Array,\n plaintext: Uint8Array,\n dummy: boolean,\n unencrypted: boolean,\n ): [ciphertext: Uint8Array, mac: Uint8Array] {\n if (packetType === INIT1_PACKET_TYPE) {\n return [plaintext, INIT1_MAC];\n }\n if (unencrypted) {\n return [plaintext, this.fakeSignature];\n }\n\n const [key, nonce] = this.getKeyNonce(false, packetID, generationID, packetType, dummy);\n const eax = new EAX(key);\n return eax.encrypt(nonce, header, plaintext);\n }\n\n decrypt(\n packetType: number,\n packetID: number,\n generationID: number,\n header: Uint8Array,\n ciphertext: Uint8Array,\n tag: Uint8Array,\n dummy: boolean,\n unencrypted: boolean,\n ): Uint8Array {\n if (packetType === INIT1_PACKET_TYPE) {\n return ciphertext;\n }\n if (unencrypted) {\n const fsSub = tag.slice(0, FAKE_SIGNATURE_SIZE);\n if (!Buffer.from(fsSub).equals(Buffer.from(this.fakeSignature))) {\n throw new FakeSignatureMismatchError();\n }\n return ciphertext;\n }\n\n const [key, nonce] = this.getKeyNonce(true, packetID, generationID, packetType, dummy);\n const eax = new EAX(key);\n return eax.decrypt(nonce, header, ciphertext, tag);\n }\n\n #getSharedSecret(serverPubKey: import(\"node:crypto\").KeyObject): Uint8Array {\n const privJwk = this.identity.privateKey.export({ format: \"jwk\" }) as {\n d: string;\n };\n const pubJwk = serverPubKey.export({ format: \"jwk\" }) as {\n x: string;\n y: string;\n };\n\n const ecdh = createECDH(\"prime256v1\");\n const dBytes = Buffer.from(privJwk.d, \"base64url\");\n ecdh.setPrivateKey(dBytes);\n\n const xBytes = base64UrlToBytes(pubJwk.x, 32);\n const yBytes = base64UrlToBytes(pubJwk.y, 32);\n const uncompressed = Buffer.alloc(65);\n uncompressed[0] = 0x04;\n xBytes.copy(uncompressed, 1);\n yBytes.copy(uncompressed, 33);\n\n const rawSecret = ecdh.computeSecret(uncompressed);\n return createHash(\"sha1\").update(rawSecret).digest();\n }\n}\n\n// ---- Helpers ----------------------------------------------------------------\n\nfunction makeCacheKey(fromServer: boolean, packetType: number, generationID: number): bigint {\n let key = 0n;\n if (fromServer) key |= 1n << 40n;\n key |= BigInt(packetType & PACKET_TYPE_MASK) << 32n;\n key |= BigInt(generationID);\n return key;\n}\n\nfunction bytesToBigInt(bytes: Uint8Array): bigint {\n let result = 0n;\n for (const b of bytes) result = (result << 8n) | BigInt(b);\n return result;\n}\n\nfunction bigIntToBytes(value: bigint, size: number): Uint8Array {\n const result = new Uint8Array(size);\n let v = value;\n for (let i = size - 1; i >= 0; i--) {\n result[i] = Number(v & 0xffn);\n v >>= 8n;\n }\n return result;\n}\n\nfunction base64UrlToBytes(b64url: string, size: number): Buffer {\n const buf = Buffer.from(b64url, \"base64url\");\n if (buf.length === size) return buf;\n const padded = Buffer.alloc(size);\n buf.copy(padded, size - buf.length);\n return padded;\n}\n"],"mappings":"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"}
|
package/dist/discovery/index.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../resolver-DCcmyWSK.cjs");exports.Resolver=e.t;
|
package/dist/discovery/index.mjs
DELETED