@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.
Files changed (148) hide show
  1. package/README.md +322 -60
  2. package/dist/abort.d.ts +5 -0
  3. package/dist/abort.d.ts.map +1 -0
  4. package/dist/address.d.ts +8 -0
  5. package/dist/address.d.ts.map +1 -1
  6. package/dist/api/voice.d.ts +24 -0
  7. package/dist/api/voice.d.ts.map +1 -0
  8. package/dist/capabilities.d.ts +62 -0
  9. package/dist/capabilities.d.ts.map +1 -0
  10. package/dist/client.d.ts +172 -39
  11. package/dist/client.d.ts.map +1 -1
  12. package/dist/commands.d.ts +45 -27
  13. package/dist/commands.d.ts.map +1 -1
  14. package/dist/crypto/crypt.d.ts +19 -4
  15. package/dist/crypto/crypt.d.ts.map +1 -1
  16. package/dist/crypto/identity.d.ts +87 -8
  17. package/dist/crypto/identity.d.ts.map +1 -1
  18. package/dist/crypto/index.d.ts +2 -1
  19. package/dist/crypto/index.d.ts.map +1 -1
  20. package/dist/diagnostics.d.ts +45 -0
  21. package/dist/diagnostics.d.ts.map +1 -0
  22. package/dist/discovery/resolver.d.ts +21 -3
  23. package/dist/discovery/resolver.d.ts.map +1 -1
  24. package/dist/errors.d.ts +70 -16
  25. package/dist/errors.d.ts.map +1 -1
  26. package/dist/events.d.ts +4 -5
  27. package/dist/events.d.ts.map +1 -1
  28. package/dist/handshake/crypt-handshake.d.ts +1 -0
  29. package/dist/handshake/crypt-handshake.d.ts.map +1 -1
  30. package/dist/handshake/crypt-init2.d.ts.map +1 -1
  31. package/dist/handshake/license.d.ts +7 -0
  32. package/dist/handshake/license.d.ts.map +1 -1
  33. package/dist/handshake.d.ts +14 -5
  34. package/dist/handshake.d.ts.map +1 -1
  35. package/dist/helpers.d.ts +0 -8
  36. package/dist/helpers.d.ts.map +1 -1
  37. package/dist/index.d.ts +20 -6
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +3967 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/notifications.d.ts +7 -15
  42. package/dist/notifications.d.ts.map +1 -1
  43. package/dist/reconnect.d.ts +69 -0
  44. package/dist/reconnect.d.ts.map +1 -0
  45. package/dist/throttle.d.ts +9 -0
  46. package/dist/throttle.d.ts.map +1 -1
  47. package/dist/transfer.d.ts +27 -25
  48. package/dist/transfer.d.ts.map +1 -1
  49. package/dist/transport/handler.d.ts +37 -5
  50. package/dist/transport/handler.d.ts.map +1 -1
  51. package/dist/transport/quicklz.d.ts +19 -0
  52. package/dist/transport/quicklz.d.ts.map +1 -1
  53. package/dist/types.d.ts +277 -97
  54. package/dist/types.d.ts.map +1 -1
  55. package/package.json +21 -56
  56. package/src/abort.ts +24 -0
  57. package/src/address.ts +74 -0
  58. package/src/api/voice.ts +61 -0
  59. package/src/capabilities.ts +92 -0
  60. package/src/client.ts +1392 -0
  61. package/src/commands.ts +193 -0
  62. package/src/crypto/crypt-ops.ts +6 -0
  63. package/src/crypto/crypt.ts +274 -0
  64. package/src/crypto/eax.ts +152 -0
  65. package/src/crypto/identity.ts +484 -0
  66. package/src/crypto/index.ts +21 -0
  67. package/src/crypto/primitives.ts +141 -0
  68. package/src/diagnostics.ts +58 -0
  69. package/src/discovery/index.ts +1 -0
  70. package/src/discovery/resolver.ts +272 -0
  71. package/src/errors.ts +156 -0
  72. package/src/events.ts +28 -0
  73. package/src/handshake/crypt-handshake.ts +135 -0
  74. package/src/handshake/crypt-init2.ts +48 -0
  75. package/src/handshake/index.ts +3 -0
  76. package/src/handshake/license.test.ts +49 -0
  77. package/src/handshake/license.ts +208 -0
  78. package/src/handshake.ts +136 -0
  79. package/src/helpers.ts +10 -0
  80. package/src/index.ts +74 -0
  81. package/src/notifications.ts +136 -0
  82. package/src/reconnect.ts +141 -0
  83. package/src/throttle.ts +92 -0
  84. package/src/transfer.ts +127 -0
  85. package/src/transport/generation-window.ts +77 -0
  86. package/src/transport/handler.ts +914 -0
  87. package/src/transport/index.ts +14 -0
  88. package/src/transport/packet.ts +69 -0
  89. package/src/transport/quicklz.ts +209 -0
  90. package/src/types.ts +349 -0
  91. package/dist/address-BR-5unVo.cjs +0 -2
  92. package/dist/address-BR-5unVo.cjs.map +0 -1
  93. package/dist/address-BfmovVpp.js +0 -65
  94. package/dist/address-BfmovVpp.js.map +0 -1
  95. package/dist/api.d.ts +0 -17
  96. package/dist/api.d.ts.map +0 -1
  97. package/dist/command/command.d.ts +0 -12
  98. package/dist/command/command.d.ts.map +0 -1
  99. package/dist/command/index.cjs +0 -1
  100. package/dist/command/index.d.ts +0 -4
  101. package/dist/command/index.d.ts.map +0 -1
  102. package/dist/command/index.mjs +0 -3
  103. package/dist/command/parser.d.ts +0 -3
  104. package/dist/command/parser.d.ts.map +0 -1
  105. package/dist/command-BLe-C2L2.js +0 -74
  106. package/dist/command-BLe-C2L2.js.map +0 -1
  107. package/dist/command-DAK4pUBP.cjs +0 -4
  108. package/dist/command-DAK4pUBP.cjs.map +0 -1
  109. package/dist/crypt-handshake-CQkQreLx.cjs +0 -2
  110. package/dist/crypt-handshake-CQkQreLx.cjs.map +0 -1
  111. package/dist/crypt-handshake-DziOY4Lq.js +0 -55
  112. package/dist/crypt-handshake-DziOY4Lq.js.map +0 -1
  113. package/dist/crypt-init2-D70ha4LB.js +0 -158
  114. package/dist/crypt-init2-D70ha4LB.js.map +0 -1
  115. package/dist/crypt-init2-DparLekm.cjs +0 -2
  116. package/dist/crypt-init2-DparLekm.cjs.map +0 -1
  117. package/dist/crypto/index.cjs +0 -1
  118. package/dist/crypto/index.mjs +0 -3
  119. package/dist/crypto-Bg02m4ZE.js +0 -165
  120. package/dist/crypto-Bg02m4ZE.js.map +0 -1
  121. package/dist/crypto-CDlweUL3.cjs +0 -2
  122. package/dist/crypto-CDlweUL3.cjs.map +0 -1
  123. package/dist/discovery/index.cjs +0 -1
  124. package/dist/discovery/index.mjs +0 -2
  125. package/dist/handler-DI_abe9c.js +0 -483
  126. package/dist/handler-DI_abe9c.js.map +0 -1
  127. package/dist/handler-DuwoO5RC.cjs +0 -2
  128. package/dist/handler-DuwoO5RC.cjs.map +0 -1
  129. package/dist/handshake/index.cjs +0 -1
  130. package/dist/handshake/index.mjs +0 -3
  131. package/dist/index.cjs +0 -4
  132. package/dist/index.cjs.map +0 -1
  133. package/dist/index.mjs +0 -827
  134. package/dist/index.mjs.map +0 -1
  135. package/dist/parser-CL33R9tr.cjs +0 -2
  136. package/dist/parser-CL33R9tr.cjs.map +0 -1
  137. package/dist/parser-DZMv3Jm-.js +0 -33
  138. package/dist/parser-DZMv3Jm-.js.map +0 -1
  139. package/dist/primitives-cNNAeFCo.cjs +0 -2
  140. package/dist/primitives-cNNAeFCo.cjs.map +0 -1
  141. package/dist/primitives-xIr6Tjk4.js +0 -1457
  142. package/dist/primitives-xIr6Tjk4.js.map +0 -1
  143. package/dist/resolver-6B8dI9gr.js +0 -141
  144. package/dist/resolver-6B8dI9gr.js.map +0 -1
  145. package/dist/resolver-DCcmyWSK.cjs +0 -4
  146. package/dist/resolver-DCcmyWSK.cjs.map +0 -1
  147. package/dist/transport/index.cjs +0 -1
  148. package/dist/transport/index.mjs +0 -2
@@ -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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"}
@@ -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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"}
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../resolver-DCcmyWSK.cjs");exports.Resolver=e.t;
@@ -1,2 +0,0 @@
1
- import { t as e } from "../resolver-6B8dI9gr.js";
2
- export { e as Resolver };