@honeybbq/teamspeak-client 0.2.1 → 0.2.3

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 (71) hide show
  1. package/dist/client.d.ts.map +1 -1
  2. package/dist/command/index.cjs +1 -1
  3. package/dist/command/index.mjs +2 -2
  4. package/dist/{command-caXc4h0n.js → command-CTDmBXd_.js} +1 -1
  5. package/dist/{command-caXc4h0n.js.map → command-CTDmBXd_.js.map} +1 -1
  6. package/dist/{command-Cu2v-5-K.cjs → command-CUPNiKRl.cjs} +2 -2
  7. package/dist/{command-Cu2v-5-K.cjs.map → command-CUPNiKRl.cjs.map} +1 -1
  8. package/dist/crypt-handshake-D2Rsi2e3.cjs +2 -0
  9. package/dist/{crypt-handshake-Dbj2cSBZ.cjs.map → crypt-handshake-D2Rsi2e3.cjs.map} +1 -1
  10. package/dist/crypt-handshake-DIj51kno.js +55 -0
  11. package/dist/{crypt-handshake-CHmvZ2qs.js.map → crypt-handshake-DIj51kno.js.map} +1 -1
  12. package/dist/{crypt-init2-DWX7Tp-_.js → crypt-init2-C2X9oK4i.js} +24 -26
  13. package/dist/{crypt-init2-DWX7Tp-_.js.map → crypt-init2-C2X9oK4i.js.map} +1 -1
  14. package/dist/crypt-init2-CazdFwqF.cjs +2 -0
  15. package/dist/{crypt-init2-C2oihZ7e.cjs.map → crypt-init2-CazdFwqF.cjs.map} +1 -1
  16. package/dist/crypto/identity.d.ts.map +1 -1
  17. package/dist/crypto/index.cjs +1 -1
  18. package/dist/crypto/index.mjs +2 -2
  19. package/dist/{crypto-VC7n6YJb.js → crypto-CwIMggQG.js} +4 -4
  20. package/dist/{crypto-VC7n6YJb.js.map → crypto-CwIMggQG.js.map} +1 -1
  21. package/dist/{crypto-2veVY1fC.cjs → crypto-IbzNNTgO.cjs} +2 -2
  22. package/dist/{crypto-2veVY1fC.cjs.map → crypto-IbzNNTgO.cjs.map} +1 -1
  23. package/dist/discovery/index.cjs +1 -1
  24. package/dist/discovery/index.mjs +1 -1
  25. package/dist/discovery/resolver.d.ts +1 -1
  26. package/dist/discovery/resolver.d.ts.map +1 -1
  27. package/dist/handler-BJdwhtkp.cjs +2 -0
  28. package/dist/handler-BJdwhtkp.cjs.map +1 -0
  29. package/dist/{handler-C_JhqGTd.js → handler-BP38rMNl.js} +18 -18
  30. package/dist/handler-BP38rMNl.js.map +1 -0
  31. package/dist/handshake/index.cjs +1 -1
  32. package/dist/handshake/index.mjs +2 -2
  33. package/dist/index.cjs +3 -1
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.mjs +12 -12
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/{parser-DhAWj-TI.cjs → parser-B6cGUByG.cjs} +2 -2
  38. package/dist/{parser-DhAWj-TI.cjs.map → parser-B6cGUByG.cjs.map} +1 -1
  39. package/dist/{parser-CJjP3LlO.js → parser-BPzO8py_.js} +2 -2
  40. package/dist/{parser-CJjP3LlO.js.map → parser-BPzO8py_.js.map} +1 -1
  41. package/dist/primitives-Bt-L4BZa.js +1483 -0
  42. package/dist/primitives-Bt-L4BZa.js.map +1 -0
  43. package/dist/primitives-ClIhDdNZ.cjs +2 -0
  44. package/dist/primitives-ClIhDdNZ.cjs.map +1 -0
  45. package/dist/resolver-B7jho9CP.cjs +4 -0
  46. package/dist/resolver-B7jho9CP.cjs.map +1 -0
  47. package/dist/{resolver-DDZWomrF.js → resolver-BDCF2KbM.js} +19 -22
  48. package/dist/resolver-BDCF2KbM.js.map +1 -0
  49. package/dist/transfer.d.ts +5 -9
  50. package/dist/transfer.d.ts.map +1 -1
  51. package/dist/transport/handler.d.ts.map +1 -1
  52. package/dist/transport/index.cjs +1 -1
  53. package/dist/transport/index.mjs +1 -1
  54. package/dist/{types-DrnoCdSW.cjs → types-ANvuLFWH.cjs} +2 -2
  55. package/dist/{types-DrnoCdSW.cjs.map → types-ANvuLFWH.cjs.map} +1 -1
  56. package/dist/{types-CGKgXvpG.js → types-Xm1vrW4s.js} +1 -1
  57. package/dist/{types-CGKgXvpG.js.map → types-Xm1vrW4s.js.map} +1 -1
  58. package/package.json +7 -7
  59. package/dist/crypt-handshake-CHmvZ2qs.js +0 -55
  60. package/dist/crypt-handshake-Dbj2cSBZ.cjs +0 -2
  61. package/dist/crypt-init2-C2oihZ7e.cjs +0 -2
  62. package/dist/handler-C_JhqGTd.js.map +0 -1
  63. package/dist/handler-CqCD93f0.cjs +0 -2
  64. package/dist/handler-CqCD93f0.cjs.map +0 -1
  65. package/dist/primitives-BIAYfJ2Y.js +0 -1842
  66. package/dist/primitives-BIAYfJ2Y.js.map +0 -1
  67. package/dist/primitives-bj-ml31v.cjs +0 -2
  68. package/dist/primitives-bj-ml31v.cjs.map +0 -1
  69. package/dist/resolver-DDZWomrF.js.map +0 -1
  70. package/dist/resolver-Dey6omBe.cjs +0 -4
  71. package/dist/resolver-Dey6omBe.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,MAAM,EAGX,YAAY,EAEb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAkBvD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnE,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAmBD,qBAAa,MAAM;;IAEjB,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC;IAC9B,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC;IACxC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClC,gBAAgB,CAAC,IAAI,SAAK;gBA8Bd,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB;IAwB3F,IAAI,MAAM,IAAI,YAAY,CAEzB;IAED,gBAAgB;IAChB,oBAAoB,IAAI,QAAQ,CAAC;QAC/B,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,sBAAsB,EAAE,MAAM,CAAC;KAChC,CAAC;IAMI,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAaxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBjC,aAAa,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5C,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,uBAAuB,CAC3B,GAAG,EAAE,MAAM,EACX,SAAS,SAAS,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IA2BpC,EAAE,CAAC,CAAC,SAAS,MAAM,QAAQ,EACzB,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAC9E,IAAI;IAiCP,oBAAoB,CAAC,GAAG,EAAE,EAAE,iBAAiB,EAAE,GAAG,IAAI;IAMtD,kBAAkB,CAAC,GAAG,EAAE,EAAE,eAAe,EAAE,GAAG,IAAI;IAQlD,QAAQ,IAAI,MAAM;IAIlB,SAAS,IAAI,MAAM;IAKnB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAM1C,sBAAsB,CAC1B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,SAAS,UAAQ,GAChB,OAAO,CAAC,cAAc,CAAC;IA2BpB,wBAAwB,CAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC;IA2B5B,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjF,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrF,gBAAgB;IAChB,cAAc,IAAI,IAAI;CA0RvB"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../command-Cu2v-5-K.cjs`),t=require(`../parser-DhAWj-TI.cjs`);exports.buildCommand=e.t,exports.buildCommandOrdered=e.n,exports.escape=e.r,exports.parseCommand=t.t,exports.unescape=e.i;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../command-CUPNiKRl.cjs"),t=require("../parser-B6cGUByG.cjs");exports.buildCommand=e.t,exports.buildCommandOrdered=e.n,exports.escape=e.r,exports.parseCommand=t.t,exports.unescape=e.i;
@@ -1,3 +1,3 @@
1
- import { i as e, n as t, r as n, t as r } from "../command-caXc4h0n.js";
2
- import { t as i } from "../parser-CJjP3LlO.js";
1
+ import { i as e, n as t, r as n, t as r } from "../command-CTDmBXd_.js";
2
+ import { t as i } from "../parser-BPzO8py_.js";
3
3
  export { r as buildCommand, t as buildCommandOrdered, n as escape, i as parseCommand, e as unescape };
@@ -73,4 +73,4 @@ function i(e, n) {
73
73
  //#endregion
74
74
  export { n as i, i as n, t as r, r as t };
75
75
 
76
- //# sourceMappingURL=command-caXc4h0n.js.map
76
+ //# sourceMappingURL=command-CTDmBXd_.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command-caXc4h0n.js","names":[],"sources":["../src/command/command.ts"],"sourcesContent":["import type { EscapedString } from \"../types.js\";\n\nconst ESCAPE_MAP: [string, string][] = [\n [\"\\\\\", \"\\\\\\\\\"],\n [\"/\", \"\\\\/\"],\n [\" \", \"\\\\s\"],\n [\"|\", \"\\\\p\"],\n [\"\\x07\", \"\\\\a\"],\n [\"\\x08\", \"\\\\b\"],\n [\"\\x0C\", \"\\\\f\"],\n [\"\\n\", \"\\\\n\"],\n [\"\\r\", \"\\\\r\"],\n [\"\\t\", \"\\\\t\"],\n [\"\\x0B\", \"\\\\v\"],\n];\n\nexport function escape(s: string): EscapedString {\n let result = s;\n for (const [from, to] of ESCAPE_MAP) {\n result = result.split(from).join(to);\n }\n return result as EscapedString;\n}\n\nexport function unescape(s: string): string {\n // Process escape sequences in a single pass to avoid double-substitution\n let result = \"\";\n let i = 0;\n while (i < s.length) {\n if (s[i] === \"\\\\\" && i + 1 < s.length) {\n const next = s[i + 1];\n switch (next) {\n case \"\\\\\":\n result += \"\\\\\";\n i += 2;\n break;\n case \"/\":\n result += \"/\";\n i += 2;\n break;\n case \"s\":\n result += \" \";\n i += 2;\n break;\n case \"p\":\n result += \"|\";\n i += 2;\n break;\n case \"a\":\n result += \"\\x07\";\n i += 2;\n break;\n case \"b\":\n result += \"\\x08\";\n i += 2;\n break;\n case \"f\":\n result += \"\\x0C\";\n i += 2;\n break;\n case \"n\":\n result += \"\\n\";\n i += 2;\n break;\n case \"r\":\n result += \"\\r\";\n i += 2;\n break;\n case \"t\":\n result += \"\\t\";\n i += 2;\n break;\n case \"v\":\n result += \"\\x0B\";\n i += 2;\n break;\n default:\n result += s[i] ?? \"\";\n i++;\n break;\n }\n } else {\n result += s[i] ?? \"\";\n i++;\n }\n }\n return result;\n}\n\nexport interface Command {\n name: string;\n params: Record<string, string>;\n}\n\n/** Build a TS3 command string from an unordered params map. */\nexport function buildCommand(cmd: string, params: Record<string, string>): string {\n const parts: string[] = [escape(cmd)];\n for (const [k, v] of Object.entries(params)) {\n parts.push(`${k}=${escape(v)}`);\n }\n return parts.join(\" \");\n}\n\n/** Build a TS3 command string preserving parameter order. */\nexport function buildCommandOrdered(\n cmd: string,\n params: ReadonlyArray<readonly [string, string]>,\n): string {\n const parts: string[] = [escape(cmd)];\n for (const [k, v] of params) {\n parts.push(`${k}=${escape(v)}`);\n }\n return parts.join(\" \");\n}\n"],"mappings":";AAEA,IAAM,IAAiC;CACrC,CAAC,MAAM,OAAO;CACd,CAAC,KAAK,MAAM;CACZ,CAAC,KAAK,MAAM;CACZ,CAAC,KAAK,MAAM;CACZ,CAAC,QAAQ,MAAM;CACf,CAAC,MAAQ,MAAM;CACf,CAAC,MAAQ,MAAM;CACf,CAAC,MAAM,MAAM;CACb,CAAC,MAAM,MAAM;CACb,CAAC,KAAM,MAAM;CACb,CAAC,MAAQ,MAAM;CAChB;AAED,SAAgB,EAAO,GAA0B;CAC/C,IAAI,IAAS;AACb,MAAK,IAAM,CAAC,GAAM,MAAO,EACvB,KAAS,EAAO,MAAM,EAAK,CAAC,KAAK,EAAG;AAEtC,QAAO;;AAGT,SAAgB,EAAS,GAAmB;CAE1C,IAAI,IAAS,IACT,IAAI;AACR,QAAO,IAAI,EAAE,QACX,KAAI,EAAE,OAAO,QAAQ,IAAI,IAAI,EAAE,OAE7B,SADa,EAAE,IAAI,IACnB;EACE,KAAK;AAEH,GADA,KAAU,MACV,KAAK;AACL;EACF,KAAK;AAEH,GADA,KAAU,KACV,KAAK;AACL;EACF,KAAK;AAEH,GADA,KAAU,KACV,KAAK;AACL;EACF,KAAK;AAEH,GADA,KAAU,KACV,KAAK;AACL;EACF,KAAK;AAEH,GADA,KAAU,QACV,KAAK;AACL;EACF,KAAK;AAEH,GADA,KAAU,MACV,KAAK;AACL;EACF,KAAK;AAEH,GADA,KAAU,MACV,KAAK;AACL;EACF,KAAK;AAEH,GADA,KAAU,MACV,KAAK;AACL;EACF,KAAK;AAEH,GADA,KAAU,MACV,KAAK;AACL;EACF,KAAK;AAEH,GADA,KAAU,KACV,KAAK;AACL;EACF,KAAK;AAEH,GADA,KAAU,MACV,KAAK;AACL;EACF;AAEE,GADA,KAAU,EAAE,MAAM,IAClB;AACA;;KAIJ,CADA,KAAU,EAAE,MAAM,IAClB;AAGJ,QAAO;;AAST,SAAgB,EAAa,GAAa,GAAwC;CAChF,IAAM,IAAkB,CAAC,EAAO,EAAI,CAAC;AACrC,MAAK,IAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,EAAO,CACzC,GAAM,KAAK,GAAG,EAAE,GAAG,EAAO,EAAE,GAAG;AAEjC,QAAO,EAAM,KAAK,IAAI;;AAIxB,SAAgB,EACd,GACA,GACQ;CACR,IAAM,IAAkB,CAAC,EAAO,EAAI,CAAC;AACrC,MAAK,IAAM,CAAC,GAAG,MAAM,EACnB,GAAM,KAAK,GAAG,EAAE,GAAG,EAAO,EAAE,GAAG;AAEjC,QAAO,EAAM,KAAK,IAAI"}
1
+ {"version":3,"file":"command-CTDmBXd_.js","names":[],"sources":["../src/command/command.ts"],"sourcesContent":["import type { EscapedString } from \"../types.js\";\n\nconst ESCAPE_MAP: [string, string][] = [\n [\"\\\\\", \"\\\\\\\\\"],\n [\"/\", \"\\\\/\"],\n [\" \", \"\\\\s\"],\n [\"|\", \"\\\\p\"],\n [\"\\x07\", \"\\\\a\"],\n [\"\\x08\", \"\\\\b\"],\n [\"\\x0C\", \"\\\\f\"],\n [\"\\n\", \"\\\\n\"],\n [\"\\r\", \"\\\\r\"],\n [\"\\t\", \"\\\\t\"],\n [\"\\x0B\", \"\\\\v\"],\n];\n\nexport function escape(s: string): EscapedString {\n let result = s;\n for (const [from, to] of ESCAPE_MAP) {\n result = result.split(from).join(to);\n }\n return result as EscapedString;\n}\n\nexport function unescape(s: string): string {\n // Process escape sequences in a single pass to avoid double-substitution\n let result = \"\";\n let i = 0;\n while (i < s.length) {\n if (s[i] === \"\\\\\" && i + 1 < s.length) {\n const next = s[i + 1];\n switch (next) {\n case \"\\\\\":\n result += \"\\\\\";\n i += 2;\n break;\n case \"/\":\n result += \"/\";\n i += 2;\n break;\n case \"s\":\n result += \" \";\n i += 2;\n break;\n case \"p\":\n result += \"|\";\n i += 2;\n break;\n case \"a\":\n result += \"\\x07\";\n i += 2;\n break;\n case \"b\":\n result += \"\\x08\";\n i += 2;\n break;\n case \"f\":\n result += \"\\x0C\";\n i += 2;\n break;\n case \"n\":\n result += \"\\n\";\n i += 2;\n break;\n case \"r\":\n result += \"\\r\";\n i += 2;\n break;\n case \"t\":\n result += \"\\t\";\n i += 2;\n break;\n case \"v\":\n result += \"\\x0B\";\n i += 2;\n break;\n default:\n result += s[i] ?? \"\";\n i++;\n break;\n }\n } else {\n result += s[i] ?? \"\";\n i++;\n }\n }\n return result;\n}\n\nexport interface Command {\n name: string;\n params: Record<string, string>;\n}\n\n/** Build a TS3 command string from an unordered params map. */\nexport function buildCommand(cmd: string, params: Record<string, string>): string {\n const parts: string[] = [escape(cmd)];\n for (const [k, v] of Object.entries(params)) {\n parts.push(`${k}=${escape(v)}`);\n }\n return parts.join(\" \");\n}\n\n/** Build a TS3 command string preserving parameter order. */\nexport function buildCommandOrdered(\n cmd: string,\n params: ReadonlyArray<readonly [string, string]>,\n): string {\n const parts: string[] = [escape(cmd)];\n for (const [k, v] of params) {\n parts.push(`${k}=${escape(v)}`);\n }\n return parts.join(\" \");\n}\n"],"mappings":";AAEA,IAAM,IAAiC;CACrC,CAAC,MAAM,MAAM;CACb,CAAC,KAAK,KAAK;CACX,CAAC,KAAK,KAAK;CACX,CAAC,KAAK,KAAK;CACX,CAAC,QAAQ,KAAK;CACd,CAAC,MAAQ,KAAK;CACd,CAAC,MAAQ,KAAK;CACd,CAAC,MAAM,KAAK;CACZ,CAAC,MAAM,KAAK;CACZ,CAAC,KAAM,KAAK;CACZ,CAAC,MAAQ,KAAK;AAChB;AAEA,SAAgB,EAAO,GAA0B;CAC/C,IAAI,IAAS;CACb,KAAK,IAAM,CAAC,GAAM,MAAO,GACvB,IAAS,EAAO,MAAM,CAAI,CAAC,CAAC,KAAK,CAAE;CAErC,OAAO;AACT;AAEA,SAAgB,EAAS,GAAmB;CAE1C,IAAI,IAAS,IACT,IAAI;CACR,OAAO,IAAI,EAAE,SACX,IAAI,EAAE,OAAO,QAAQ,IAAI,IAAI,EAAE,QAE7B,QADa,EAAE,IAAI,IACnB;EACE,KAAK;GAEH,AADA,KAAU,MACV,KAAK;GACL;EACF,KAAK;GAEH,AADA,KAAU,KACV,KAAK;GACL;EACF,KAAK;GAEH,AADA,KAAU,KACV,KAAK;GACL;EACF,KAAK;GAEH,AADA,KAAU,KACV,KAAK;GACL;EACF,KAAK;GAEH,AADA,KAAU,QACV,KAAK;GACL;EACF,KAAK;GAEH,AADA,KAAU,MACV,KAAK;GACL;EACF,KAAK;GAEH,AADA,KAAU,MACV,KAAK;GACL;EACF,KAAK;GAEH,AADA,KAAU,MACV,KAAK;GACL;EACF,KAAK;GAEH,AADA,KAAU,MACV,KAAK;GACL;EACF,KAAK;GAEH,AADA,KAAU,KACV,KAAK;GACL;EACF,KAAK;GAEH,AADA,KAAU,MACV,KAAK;GACL;EACF;GAEE,AADA,KAAU,EAAE,MAAM,IAClB;GACA;CACJ;MAGA,AADA,KAAU,EAAE,MAAM,IAClB;CAGJ,OAAO;AACT;AAQA,SAAgB,EAAa,GAAa,GAAwC;CAChF,IAAM,IAAkB,CAAC,EAAO,CAAG,CAAC;CACpC,KAAK,IAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,CAAM,GACxC,EAAM,KAAK,GAAG,EAAE,GAAG,EAAO,CAAC,GAAG;CAEhC,OAAO,EAAM,KAAK,GAAG;AACvB;AAGA,SAAgB,EACd,GACA,GACQ;CACR,IAAM,IAAkB,CAAC,EAAO,CAAG,CAAC;CACpC,KAAK,IAAM,CAAC,GAAG,MAAM,GACnB,EAAM,KAAK,GAAG,EAAE,GAAG,EAAO,CAAC,GAAG;CAEhC,OAAO,EAAM,KAAK,GAAG;AACvB"}
@@ -1,4 +1,4 @@
1
1
  var e=[[`\\`,`\\\\`],[`/`,`\\/`],[` `,`\\s`],[`|`,`\\p`],[`\x07`,`\\a`],[`\b`,`\\b`],[`\f`,`\\f`],[`
2
2
  `,`\\n`],[`\r`,`\\r`],[` `,`\\t`],[`\v`,`\\v`]];function t(t){let n=t;for(let[t,r]of e)n=n.split(t).join(r);return n}function n(e){let t=``,n=0;for(;n<e.length;)if(e[n]===`\\`&&n+1<e.length)switch(e[n+1]){case`\\`:t+=`\\`,n+=2;break;case`/`:t+=`/`,n+=2;break;case`s`:t+=` `,n+=2;break;case`p`:t+=`|`,n+=2;break;case`a`:t+=`\x07`,n+=2;break;case`b`:t+=`\b`,n+=2;break;case`f`:t+=`\f`,n+=2;break;case`n`:t+=`
3
- `,n+=2;break;case`r`:t+=`\r`,n+=2;break;case`t`:t+=` `,n+=2;break;case`v`:t+=`\v`,n+=2;break;default:t+=e[n]??``,n++;break}else t+=e[n]??``,n++;return t}function r(e,n){let r=[t(e)];for(let[e,i]of Object.entries(n))r.push(`${e}=${t(i)}`);return r.join(` `)}function i(e,n){let r=[t(e)];for(let[e,i]of n)r.push(`${e}=${t(i)}`);return r.join(` `)}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}});
4
- //# sourceMappingURL=command-Cu2v-5-K.cjs.map
3
+ `,n+=2;break;case`r`:t+=`\r`,n+=2;break;case`t`:t+=` `,n+=2;break;case`v`:t+=`\v`,n+=2;break;default:t+=e[n]??``,n++;break}else t+=e[n]??``,n++;return t}function r(e,n){let r=[t(e)];for(let[e,i]of Object.entries(n))r.push(`${e}=${t(i)}`);return r.join(` `)}function i(e,n){let r=[t(e)];for(let[e,i]of n)r.push(`${e}=${t(i)}`);return r.join(` `)}Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return r}});
4
+ //# sourceMappingURL=command-CUPNiKRl.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"command-Cu2v-5-K.cjs","names":[],"sources":["../src/command/command.ts"],"sourcesContent":["import type { EscapedString } from \"../types.js\";\n\nconst ESCAPE_MAP: [string, string][] = [\n [\"\\\\\", \"\\\\\\\\\"],\n [\"/\", \"\\\\/\"],\n [\" \", \"\\\\s\"],\n [\"|\", \"\\\\p\"],\n [\"\\x07\", \"\\\\a\"],\n [\"\\x08\", \"\\\\b\"],\n [\"\\x0C\", \"\\\\f\"],\n [\"\\n\", \"\\\\n\"],\n [\"\\r\", \"\\\\r\"],\n [\"\\t\", \"\\\\t\"],\n [\"\\x0B\", \"\\\\v\"],\n];\n\nexport function escape(s: string): EscapedString {\n let result = s;\n for (const [from, to] of ESCAPE_MAP) {\n result = result.split(from).join(to);\n }\n return result as EscapedString;\n}\n\nexport function unescape(s: string): string {\n // Process escape sequences in a single pass to avoid double-substitution\n let result = \"\";\n let i = 0;\n while (i < s.length) {\n if (s[i] === \"\\\\\" && i + 1 < s.length) {\n const next = s[i + 1];\n switch (next) {\n case \"\\\\\":\n result += \"\\\\\";\n i += 2;\n break;\n case \"/\":\n result += \"/\";\n i += 2;\n break;\n case \"s\":\n result += \" \";\n i += 2;\n break;\n case \"p\":\n result += \"|\";\n i += 2;\n break;\n case \"a\":\n result += \"\\x07\";\n i += 2;\n break;\n case \"b\":\n result += \"\\x08\";\n i += 2;\n break;\n case \"f\":\n result += \"\\x0C\";\n i += 2;\n break;\n case \"n\":\n result += \"\\n\";\n i += 2;\n break;\n case \"r\":\n result += \"\\r\";\n i += 2;\n break;\n case \"t\":\n result += \"\\t\";\n i += 2;\n break;\n case \"v\":\n result += \"\\x0B\";\n i += 2;\n break;\n default:\n result += s[i] ?? \"\";\n i++;\n break;\n }\n } else {\n result += s[i] ?? \"\";\n i++;\n }\n }\n return result;\n}\n\nexport interface Command {\n name: string;\n params: Record<string, string>;\n}\n\n/** Build a TS3 command string from an unordered params map. */\nexport function buildCommand(cmd: string, params: Record<string, string>): string {\n const parts: string[] = [escape(cmd)];\n for (const [k, v] of Object.entries(params)) {\n parts.push(`${k}=${escape(v)}`);\n }\n return parts.join(\" \");\n}\n\n/** Build a TS3 command string preserving parameter order. */\nexport function buildCommandOrdered(\n cmd: string,\n params: ReadonlyArray<readonly [string, string]>,\n): string {\n const parts: string[] = [escape(cmd)];\n for (const [k, v] of params) {\n parts.push(`${k}=${escape(v)}`);\n }\n return parts.join(\" \");\n}\n"],"mappings":"AAEA,IAAM,EAAiC,CACrC,CAAC,KAAM,OAAO,CACd,CAAC,IAAK,MAAM,CACZ,CAAC,IAAK,MAAM,CACZ,CAAC,IAAK,MAAM,CACZ,CAAC,OAAQ,MAAM,CACf,CAAC,KAAQ,MAAM,CACf,CAAC,KAAQ,MAAM,CACf,CAAC;EAAM,MAAM,CACb,CAAC,KAAM,MAAM,CACb,CAAC,IAAM,MAAM,CACb,CAAC,KAAQ,MAAM,CAChB,CAED,SAAgB,EAAO,EAA0B,CAC/C,IAAI,EAAS,EACb,IAAK,GAAM,CAAC,EAAM,KAAO,EACvB,EAAS,EAAO,MAAM,EAAK,CAAC,KAAK,EAAG,CAEtC,OAAO,EAGT,SAAgB,EAAS,EAAmB,CAE1C,IAAI,EAAS,GACT,EAAI,EACR,KAAO,EAAI,EAAE,QACX,GAAI,EAAE,KAAO,MAAQ,EAAI,EAAI,EAAE,OAE7B,OADa,EAAE,EAAI,GACnB,CACE,IAAK,KACH,GAAU,KACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,IACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,IACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,IACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,OACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,KACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,KACV,GAAK,EACL,MACF,IAAK,IACH,GAAU;EACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,KACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,IACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,KACV,GAAK,EACL,MACF,QACE,GAAU,EAAE,IAAM,GAClB,IACA,WAGJ,GAAU,EAAE,IAAM,GAClB,IAGJ,OAAO,EAST,SAAgB,EAAa,EAAa,EAAwC,CAChF,IAAM,EAAkB,CAAC,EAAO,EAAI,CAAC,CACrC,IAAK,GAAM,CAAC,EAAG,KAAM,OAAO,QAAQ,EAAO,CACzC,EAAM,KAAK,GAAG,EAAE,GAAG,EAAO,EAAE,GAAG,CAEjC,OAAO,EAAM,KAAK,IAAI,CAIxB,SAAgB,EACd,EACA,EACQ,CACR,IAAM,EAAkB,CAAC,EAAO,EAAI,CAAC,CACrC,IAAK,GAAM,CAAC,EAAG,KAAM,EACnB,EAAM,KAAK,GAAG,EAAE,GAAG,EAAO,EAAE,GAAG,CAEjC,OAAO,EAAM,KAAK,IAAI"}
1
+ {"version":3,"file":"command-CUPNiKRl.cjs","names":[],"sources":["../src/command/command.ts"],"sourcesContent":["import type { EscapedString } from \"../types.js\";\n\nconst ESCAPE_MAP: [string, string][] = [\n [\"\\\\\", \"\\\\\\\\\"],\n [\"/\", \"\\\\/\"],\n [\" \", \"\\\\s\"],\n [\"|\", \"\\\\p\"],\n [\"\\x07\", \"\\\\a\"],\n [\"\\x08\", \"\\\\b\"],\n [\"\\x0C\", \"\\\\f\"],\n [\"\\n\", \"\\\\n\"],\n [\"\\r\", \"\\\\r\"],\n [\"\\t\", \"\\\\t\"],\n [\"\\x0B\", \"\\\\v\"],\n];\n\nexport function escape(s: string): EscapedString {\n let result = s;\n for (const [from, to] of ESCAPE_MAP) {\n result = result.split(from).join(to);\n }\n return result as EscapedString;\n}\n\nexport function unescape(s: string): string {\n // Process escape sequences in a single pass to avoid double-substitution\n let result = \"\";\n let i = 0;\n while (i < s.length) {\n if (s[i] === \"\\\\\" && i + 1 < s.length) {\n const next = s[i + 1];\n switch (next) {\n case \"\\\\\":\n result += \"\\\\\";\n i += 2;\n break;\n case \"/\":\n result += \"/\";\n i += 2;\n break;\n case \"s\":\n result += \" \";\n i += 2;\n break;\n case \"p\":\n result += \"|\";\n i += 2;\n break;\n case \"a\":\n result += \"\\x07\";\n i += 2;\n break;\n case \"b\":\n result += \"\\x08\";\n i += 2;\n break;\n case \"f\":\n result += \"\\x0C\";\n i += 2;\n break;\n case \"n\":\n result += \"\\n\";\n i += 2;\n break;\n case \"r\":\n result += \"\\r\";\n i += 2;\n break;\n case \"t\":\n result += \"\\t\";\n i += 2;\n break;\n case \"v\":\n result += \"\\x0B\";\n i += 2;\n break;\n default:\n result += s[i] ?? \"\";\n i++;\n break;\n }\n } else {\n result += s[i] ?? \"\";\n i++;\n }\n }\n return result;\n}\n\nexport interface Command {\n name: string;\n params: Record<string, string>;\n}\n\n/** Build a TS3 command string from an unordered params map. */\nexport function buildCommand(cmd: string, params: Record<string, string>): string {\n const parts: string[] = [escape(cmd)];\n for (const [k, v] of Object.entries(params)) {\n parts.push(`${k}=${escape(v)}`);\n }\n return parts.join(\" \");\n}\n\n/** Build a TS3 command string preserving parameter order. */\nexport function buildCommandOrdered(\n cmd: string,\n params: ReadonlyArray<readonly [string, string]>,\n): string {\n const parts: string[] = [escape(cmd)];\n for (const [k, v] of params) {\n parts.push(`${k}=${escape(v)}`);\n }\n return parts.join(\" \");\n}\n"],"mappings":"AAEA,IAAM,EAAiC,CACrC,CAAC,KAAM,MAAM,EACb,CAAC,IAAK,KAAK,EACX,CAAC,IAAK,KAAK,EACX,CAAC,IAAK,KAAK,EACX,CAAC,OAAQ,KAAK,EACd,CAAC,KAAQ,KAAK,EACd,CAAC,KAAQ,KAAK,EACd,CAAC;EAAM,KAAK,EACZ,CAAC,KAAM,KAAK,EACZ,CAAC,IAAM,KAAK,EACZ,CAAC,KAAQ,KAAK,CAChB,EAEA,SAAgB,EAAO,EAA0B,CAC/C,IAAI,EAAS,EACb,IAAK,GAAM,CAAC,EAAM,KAAO,EACvB,EAAS,EAAO,MAAM,CAAI,CAAC,CAAC,KAAK,CAAE,EAErC,OAAO,CACT,CAEA,SAAgB,EAAS,EAAmB,CAE1C,IAAI,EAAS,GACT,EAAI,EACR,KAAO,EAAI,EAAE,QACX,GAAI,EAAE,KAAO,MAAQ,EAAI,EAAI,EAAE,OAE7B,OADa,EAAE,EAAI,GACnB,CACE,IAAK,KACH,GAAU,KACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,IACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,IACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,IACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,OACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,KACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,KACV,GAAK,EACL,MACF,IAAK,IACH,GAAU;EACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,KACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,IACV,GAAK,EACL,MACF,IAAK,IACH,GAAU,KACV,GAAK,EACL,MACF,QACE,GAAU,EAAE,IAAM,GAClB,IACA,KACJ,KAEA,IAAU,EAAE,IAAM,GAClB,IAGJ,OAAO,CACT,CAQA,SAAgB,EAAa,EAAa,EAAwC,CAChF,IAAM,EAAkB,CAAC,EAAO,CAAG,CAAC,EACpC,IAAK,GAAM,CAAC,EAAG,KAAM,OAAO,QAAQ,CAAM,EACxC,EAAM,KAAK,GAAG,EAAE,GAAG,EAAO,CAAC,GAAG,EAEhC,OAAO,EAAM,KAAK,GAAG,CACvB,CAGA,SAAgB,EACd,EACA,EACQ,CACR,IAAM,EAAkB,CAAC,EAAO,CAAG,CAAC,EACpC,IAAK,GAAM,CAAC,EAAG,KAAM,EACnB,EAAM,KAAK,GAAG,EAAE,GAAG,EAAO,CAAC,GAAG,EAEhC,OAAO,EAAM,KAAK,GAAG,CACvB"}
@@ -0,0 +1,2 @@
1
+ const e=require("./command-CUPNiKRl.cjs");let t=require("node:crypto");var n=1566914096,r=21;function i(e,t){if(t===null||t.length>=1&&t[0]===127)return a();switch(t[0]){case 0:return o(t);case 1:return s(t);case 2:return c(t);case 3:return l(e,t);default:return null}}function a(){let e=new Uint8Array(21),r=new DataView(e.buffer);r.setUint32(0,n,!1),e[4]=0;let i=Math.floor(Date.now()/1e3),a=Math.max(0,Math.min(i,4294967295));r.setUint32(5,a,!1);let o=(0,t.randomBytes)(4);return e.set(o,9),e}function o(e){if(e.length!==r)return null;let t=new Uint8Array(21);t[0]=1;let n=e[9]|e[10]<<8|e[11]<<16|e[12]<<24;return new DataView(t.buffer).setUint32(17,n>>>0,!1),t}function s(e){if(e.length!==r)return null;let t=new Uint8Array(25);return new DataView(t.buffer).setUint32(0,n,!1),t[4]=2,t.set(e.slice(1,21),5),t}function c(e){if(e.length!==25)return null;let t=new Uint8Array(233);return t[0]=3,t[64]=1,t[128]=1,new DataView(t.buffer).setUint32(129,1,!1),t}function l(r,i){if(i.length!==233)return null;let a=new DataView(i.buffer,i.byteOffset).getUint32(129,!1),o=r.solveRsaChallenge(i,1,a);r.alphaTmp=new Uint8Array((0,t.randomBytes)(10));let s=Buffer.from(r.alphaTmp).toString(`base64`),c=r.identity.publicKeyBase64(),l=e.n(`clientinitiv`,[[`alpha`,s],[`omega`,c],[`ot`,`1`],[`ip`,``]]),u=Buffer.from(l),d=new Uint8Array(301+u.length);return new DataView(d.buffer).setUint32(0,n,!1),d[4]=4,d.set(i.slice(1,233),5),d.set(o.slice(0,64),237),d.set(u,301),d}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return n}});
2
+ //# sourceMappingURL=crypt-handshake-D2Rsi2e3.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"crypt-handshake-Dbj2cSBZ.cjs","names":[],"sources":["../src/handshake/crypt-handshake.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { buildCommandOrdered } from \"../command/command.js\";\nimport type { Crypt } from \"../crypto/crypt.js\";\n\nexport const INIT_VERSION = 1566914096; // 3.5.0 [Stable]\n\nconst INIT_VERSION_LEN = 4;\nconst INIT_TYPE_LEN = 1;\nconst INIT_STEP_LEN = 21;\n\n/**\n * Handle the TS3INIT1 handshake steps.\n * Returns the response bytes to send, or null if nothing should be sent.\n */\nexport function processInit1(crypt: Crypt, data: Uint8Array | null): Uint8Array | null {\n if (data === null || (data.length >= 1 && data[0] === 0x7f)) {\n return buildInit1StartPacket();\n }\n\n switch (data[0]) {\n case 0:\n return buildInit1Step1Packet(data);\n case 1:\n return buildInit1Step2Packet(data);\n case 2:\n return buildInit1Step3Packet(data);\n case 3:\n return buildInit1Step4Packet(crypt, data);\n default:\n return null;\n }\n}\n\nfunction buildInit1StartPacket(): Uint8Array {\n const sendData = new Uint8Array(INIT_VERSION_LEN + INIT_TYPE_LEN + 4 + 4 + 8);\n const view = new DataView(sendData.buffer);\n\n view.setUint32(0, INIT_VERSION, false);\n sendData[4] = 0x00;\n\n const nowSec = Math.floor(Date.now() / 1000);\n const clampedNow = Math.max(0, Math.min(nowSec, 0xffff_ffff));\n view.setUint32(5, clampedNow, false);\n\n const rng = randomBytes(4);\n sendData.set(rng, 9);\n\n return sendData;\n}\n\nfunction buildInit1Step1Packet(data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_STEP_LEN) return null;\n\n const sendData = new Uint8Array(INIT_TYPE_LEN + 16 + 4);\n sendData[0] = 0x01;\n\n // TS rand: little-endian uint32 at offset [INIT_VERSION_LEN + INIT_TYPE_LEN + 4]\n const tsRandOffset = INIT_VERSION_LEN + INIT_TYPE_LEN + 4;\n const tsRand =\n data[tsRandOffset]! |\n (data[tsRandOffset + 1]! << 8) |\n (data[tsRandOffset + 2]! << 16) |\n (data[tsRandOffset + 3]! << 24);\n\n new DataView(sendData.buffer).setUint32(INIT_TYPE_LEN + 16, tsRand >>> 0, false);\n return sendData;\n}\n\nfunction buildInit1Step2Packet(data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_STEP_LEN) return null;\n\n const sendData = new Uint8Array(INIT_VERSION_LEN + INIT_TYPE_LEN + 16 + 4);\n new DataView(sendData.buffer).setUint32(0, INIT_VERSION, false);\n sendData[4] = 0x02;\n sendData.set(data.slice(1, 21), 5);\n return sendData;\n}\n\nfunction buildInit1Step3Packet(data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_VERSION_LEN + INIT_TYPE_LEN + 16 + 4) return null;\n\n const sendData = new Uint8Array(INIT_TYPE_LEN + 64 + 64 + 4 + 100);\n sendData[0] = 0x03;\n sendData[INIT_TYPE_LEN + 64 - 1] = 1;\n sendData[INIT_TYPE_LEN + 64 + 64 - 1] = 1;\n new DataView(sendData.buffer).setUint32(INIT_TYPE_LEN + 64 + 64, 1, false);\n return sendData;\n}\n\nfunction buildInit1Step4Packet(crypt: Crypt, data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_TYPE_LEN + 64 + 64 + 4 + 100) return null;\n\n const level = new DataView(data.buffer, data.byteOffset).getUint32(1 + 128, false);\n const y = crypt.solveRsaChallenge(data, 1, level);\n\n crypt.alphaTmp = new Uint8Array(randomBytes(10));\n\n const alphaB64 = Buffer.from(crypt.alphaTmp).toString(\"base64\");\n const omegaB64 = crypt.identity.publicKeyBase64();\n\n const cmd = buildCommandOrdered(\"clientinitiv\", [\n [\"alpha\", alphaB64],\n [\"omega\", omegaB64],\n [\"ot\", \"1\"],\n [\"ip\", \"\"],\n ]);\n const cmdBytes = Buffer.from(cmd);\n\n const sendData = new Uint8Array(INIT_VERSION_LEN + INIT_TYPE_LEN + 232 + 64 + cmdBytes.length);\n const view = new DataView(sendData.buffer);\n view.setUint32(0, INIT_VERSION, false);\n sendData[4] = 0x04;\n sendData.set(data.slice(1, 233), 5);\n sendData.set(y.slice(0, 64), 5 + 232);\n sendData.set(cmdBytes, 5 + 232 + 64);\n\n return sendData;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"crypt-handshake-D2Rsi2e3.cjs","names":[],"sources":["../src/handshake/crypt-handshake.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { buildCommandOrdered } from \"../command/command.js\";\nimport type { Crypt } from \"../crypto/crypt.js\";\n\nexport const INIT_VERSION = 1566914096; // 3.5.0 [Stable]\n\nconst INIT_VERSION_LEN = 4;\nconst INIT_TYPE_LEN = 1;\nconst INIT_STEP_LEN = 21;\n\n/**\n * Handle the TS3INIT1 handshake steps.\n * Returns the response bytes to send, or null if nothing should be sent.\n */\nexport function processInit1(crypt: Crypt, data: Uint8Array | null): Uint8Array | null {\n if (data === null || (data.length >= 1 && data[0] === 0x7f)) {\n return buildInit1StartPacket();\n }\n\n switch (data[0]) {\n case 0:\n return buildInit1Step1Packet(data);\n case 1:\n return buildInit1Step2Packet(data);\n case 2:\n return buildInit1Step3Packet(data);\n case 3:\n return buildInit1Step4Packet(crypt, data);\n default:\n return null;\n }\n}\n\nfunction buildInit1StartPacket(): Uint8Array {\n const sendData = new Uint8Array(INIT_VERSION_LEN + INIT_TYPE_LEN + 4 + 4 + 8);\n const view = new DataView(sendData.buffer);\n\n view.setUint32(0, INIT_VERSION, false);\n sendData[4] = 0x00;\n\n const nowSec = Math.floor(Date.now() / 1000);\n const clampedNow = Math.max(0, Math.min(nowSec, 0xffff_ffff));\n view.setUint32(5, clampedNow, false);\n\n const rng = randomBytes(4);\n sendData.set(rng, 9);\n\n return sendData;\n}\n\nfunction buildInit1Step1Packet(data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_STEP_LEN) return null;\n\n const sendData = new Uint8Array(INIT_TYPE_LEN + 16 + 4);\n sendData[0] = 0x01;\n\n // TS rand: little-endian uint32 at offset [INIT_VERSION_LEN + INIT_TYPE_LEN + 4]\n const tsRandOffset = INIT_VERSION_LEN + INIT_TYPE_LEN + 4;\n const tsRand =\n data[tsRandOffset]! |\n (data[tsRandOffset + 1]! << 8) |\n (data[tsRandOffset + 2]! << 16) |\n (data[tsRandOffset + 3]! << 24);\n\n new DataView(sendData.buffer).setUint32(INIT_TYPE_LEN + 16, tsRand >>> 0, false);\n return sendData;\n}\n\nfunction buildInit1Step2Packet(data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_STEP_LEN) return null;\n\n const sendData = new Uint8Array(INIT_VERSION_LEN + INIT_TYPE_LEN + 16 + 4);\n new DataView(sendData.buffer).setUint32(0, INIT_VERSION, false);\n sendData[4] = 0x02;\n sendData.set(data.slice(1, 21), 5);\n return sendData;\n}\n\nfunction buildInit1Step3Packet(data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_VERSION_LEN + INIT_TYPE_LEN + 16 + 4) return null;\n\n const sendData = new Uint8Array(INIT_TYPE_LEN + 64 + 64 + 4 + 100);\n sendData[0] = 0x03;\n sendData[INIT_TYPE_LEN + 64 - 1] = 1;\n sendData[INIT_TYPE_LEN + 64 + 64 - 1] = 1;\n new DataView(sendData.buffer).setUint32(INIT_TYPE_LEN + 64 + 64, 1, false);\n return sendData;\n}\n\nfunction buildInit1Step4Packet(crypt: Crypt, data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_TYPE_LEN + 64 + 64 + 4 + 100) return null;\n\n const level = new DataView(data.buffer, data.byteOffset).getUint32(1 + 128, false);\n const y = crypt.solveRsaChallenge(data, 1, level);\n\n crypt.alphaTmp = new Uint8Array(randomBytes(10));\n\n const alphaB64 = Buffer.from(crypt.alphaTmp).toString(\"base64\");\n const omegaB64 = crypt.identity.publicKeyBase64();\n\n const cmd = buildCommandOrdered(\"clientinitiv\", [\n [\"alpha\", alphaB64],\n [\"omega\", omegaB64],\n [\"ot\", \"1\"],\n [\"ip\", \"\"],\n ]);\n const cmdBytes = Buffer.from(cmd);\n\n const sendData = new Uint8Array(INIT_VERSION_LEN + INIT_TYPE_LEN + 232 + 64 + cmdBytes.length);\n const view = new DataView(sendData.buffer);\n view.setUint32(0, INIT_VERSION, false);\n sendData[4] = 0x04;\n sendData.set(data.slice(1, 233), 5);\n sendData.set(y.slice(0, 64), 5 + 232);\n sendData.set(cmdBytes, 5 + 232 + 64);\n\n return sendData;\n}\n"],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { n as e } from "./command-CTDmBXd_.js";
2
+ import { randomBytes as t } from "node:crypto";
3
+ //#region src/handshake/crypt-handshake.ts
4
+ var n = 1566914096, r = 21;
5
+ function i(e, t) {
6
+ if (t === null || t.length >= 1 && t[0] === 127) return a();
7
+ switch (t[0]) {
8
+ case 0: return o(t);
9
+ case 1: return s(t);
10
+ case 2: return c(t);
11
+ case 3: return l(e, t);
12
+ default: return null;
13
+ }
14
+ }
15
+ function a() {
16
+ let e = /* @__PURE__ */ new Uint8Array(21), r = new DataView(e.buffer);
17
+ r.setUint32(0, n, !1), e[4] = 0;
18
+ let i = Math.floor(Date.now() / 1e3), a = Math.max(0, Math.min(i, 4294967295));
19
+ r.setUint32(5, a, !1);
20
+ let o = t(4);
21
+ return e.set(o, 9), e;
22
+ }
23
+ function o(e) {
24
+ if (e.length !== r) return null;
25
+ let t = /* @__PURE__ */ new Uint8Array(21);
26
+ t[0] = 1;
27
+ let n = e[9] | e[10] << 8 | e[11] << 16 | e[12] << 24;
28
+ return new DataView(t.buffer).setUint32(17, n >>> 0, !1), t;
29
+ }
30
+ function s(e) {
31
+ if (e.length !== r) return null;
32
+ let t = /* @__PURE__ */ new Uint8Array(25);
33
+ return new DataView(t.buffer).setUint32(0, n, !1), t[4] = 2, t.set(e.slice(1, 21), 5), t;
34
+ }
35
+ function c(e) {
36
+ if (e.length !== 25) return null;
37
+ let t = /* @__PURE__ */ new Uint8Array(233);
38
+ return t[0] = 3, t[64] = 1, t[128] = 1, new DataView(t.buffer).setUint32(129, 1, !1), t;
39
+ }
40
+ function l(r, i) {
41
+ if (i.length !== 233) return null;
42
+ let a = new DataView(i.buffer, i.byteOffset).getUint32(129, !1), o = r.solveRsaChallenge(i, 1, a);
43
+ r.alphaTmp = new Uint8Array(t(10));
44
+ let s = Buffer.from(r.alphaTmp).toString("base64"), c = r.identity.publicKeyBase64(), l = e("clientinitiv", [
45
+ ["alpha", s],
46
+ ["omega", c],
47
+ ["ot", "1"],
48
+ ["ip", ""]
49
+ ]), u = Buffer.from(l), d = new Uint8Array(301 + u.length);
50
+ return new DataView(d.buffer).setUint32(0, n, !1), d[4] = 4, d.set(i.slice(1, 233), 5), d.set(o.slice(0, 64), 237), d.set(u, 301), d;
51
+ }
52
+ //#endregion
53
+ export { i as n, n as t };
54
+
55
+ //# sourceMappingURL=crypt-handshake-DIj51kno.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"crypt-handshake-CHmvZ2qs.js","names":[],"sources":["../src/handshake/crypt-handshake.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { buildCommandOrdered } from \"../command/command.js\";\nimport type { Crypt } from \"../crypto/crypt.js\";\n\nexport const INIT_VERSION = 1566914096; // 3.5.0 [Stable]\n\nconst INIT_VERSION_LEN = 4;\nconst INIT_TYPE_LEN = 1;\nconst INIT_STEP_LEN = 21;\n\n/**\n * Handle the TS3INIT1 handshake steps.\n * Returns the response bytes to send, or null if nothing should be sent.\n */\nexport function processInit1(crypt: Crypt, data: Uint8Array | null): Uint8Array | null {\n if (data === null || (data.length >= 1 && data[0] === 0x7f)) {\n return buildInit1StartPacket();\n }\n\n switch (data[0]) {\n case 0:\n return buildInit1Step1Packet(data);\n case 1:\n return buildInit1Step2Packet(data);\n case 2:\n return buildInit1Step3Packet(data);\n case 3:\n return buildInit1Step4Packet(crypt, data);\n default:\n return null;\n }\n}\n\nfunction buildInit1StartPacket(): Uint8Array {\n const sendData = new Uint8Array(INIT_VERSION_LEN + INIT_TYPE_LEN + 4 + 4 + 8);\n const view = new DataView(sendData.buffer);\n\n view.setUint32(0, INIT_VERSION, false);\n sendData[4] = 0x00;\n\n const nowSec = Math.floor(Date.now() / 1000);\n const clampedNow = Math.max(0, Math.min(nowSec, 0xffff_ffff));\n view.setUint32(5, clampedNow, false);\n\n const rng = randomBytes(4);\n sendData.set(rng, 9);\n\n return sendData;\n}\n\nfunction buildInit1Step1Packet(data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_STEP_LEN) return null;\n\n const sendData = new Uint8Array(INIT_TYPE_LEN + 16 + 4);\n sendData[0] = 0x01;\n\n // TS rand: little-endian uint32 at offset [INIT_VERSION_LEN + INIT_TYPE_LEN + 4]\n const tsRandOffset = INIT_VERSION_LEN + INIT_TYPE_LEN + 4;\n const tsRand =\n data[tsRandOffset]! |\n (data[tsRandOffset + 1]! << 8) |\n (data[tsRandOffset + 2]! << 16) |\n (data[tsRandOffset + 3]! << 24);\n\n new DataView(sendData.buffer).setUint32(INIT_TYPE_LEN + 16, tsRand >>> 0, false);\n return sendData;\n}\n\nfunction buildInit1Step2Packet(data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_STEP_LEN) return null;\n\n const sendData = new Uint8Array(INIT_VERSION_LEN + INIT_TYPE_LEN + 16 + 4);\n new DataView(sendData.buffer).setUint32(0, INIT_VERSION, false);\n sendData[4] = 0x02;\n sendData.set(data.slice(1, 21), 5);\n return sendData;\n}\n\nfunction buildInit1Step3Packet(data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_VERSION_LEN + INIT_TYPE_LEN + 16 + 4) return null;\n\n const sendData = new Uint8Array(INIT_TYPE_LEN + 64 + 64 + 4 + 100);\n sendData[0] = 0x03;\n sendData[INIT_TYPE_LEN + 64 - 1] = 1;\n sendData[INIT_TYPE_LEN + 64 + 64 - 1] = 1;\n new DataView(sendData.buffer).setUint32(INIT_TYPE_LEN + 64 + 64, 1, false);\n return sendData;\n}\n\nfunction buildInit1Step4Packet(crypt: Crypt, data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_TYPE_LEN + 64 + 64 + 4 + 100) return null;\n\n const level = new DataView(data.buffer, data.byteOffset).getUint32(1 + 128, false);\n const y = crypt.solveRsaChallenge(data, 1, level);\n\n crypt.alphaTmp = new Uint8Array(randomBytes(10));\n\n const alphaB64 = Buffer.from(crypt.alphaTmp).toString(\"base64\");\n const omegaB64 = crypt.identity.publicKeyBase64();\n\n const cmd = buildCommandOrdered(\"clientinitiv\", [\n [\"alpha\", alphaB64],\n [\"omega\", omegaB64],\n [\"ot\", \"1\"],\n [\"ip\", \"\"],\n ]);\n const cmdBytes = Buffer.from(cmd);\n\n const sendData = new Uint8Array(INIT_VERSION_LEN + INIT_TYPE_LEN + 232 + 64 + cmdBytes.length);\n const view = new DataView(sendData.buffer);\n view.setUint32(0, INIT_VERSION, false);\n sendData[4] = 0x04;\n sendData.set(data.slice(1, 233), 5);\n sendData.set(y.slice(0, 64), 5 + 232);\n sendData.set(cmdBytes, 5 + 232 + 64);\n\n return sendData;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"crypt-handshake-DIj51kno.js","names":[],"sources":["../src/handshake/crypt-handshake.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { buildCommandOrdered } from \"../command/command.js\";\nimport type { Crypt } from \"../crypto/crypt.js\";\n\nexport const INIT_VERSION = 1566914096; // 3.5.0 [Stable]\n\nconst INIT_VERSION_LEN = 4;\nconst INIT_TYPE_LEN = 1;\nconst INIT_STEP_LEN = 21;\n\n/**\n * Handle the TS3INIT1 handshake steps.\n * Returns the response bytes to send, or null if nothing should be sent.\n */\nexport function processInit1(crypt: Crypt, data: Uint8Array | null): Uint8Array | null {\n if (data === null || (data.length >= 1 && data[0] === 0x7f)) {\n return buildInit1StartPacket();\n }\n\n switch (data[0]) {\n case 0:\n return buildInit1Step1Packet(data);\n case 1:\n return buildInit1Step2Packet(data);\n case 2:\n return buildInit1Step3Packet(data);\n case 3:\n return buildInit1Step4Packet(crypt, data);\n default:\n return null;\n }\n}\n\nfunction buildInit1StartPacket(): Uint8Array {\n const sendData = new Uint8Array(INIT_VERSION_LEN + INIT_TYPE_LEN + 4 + 4 + 8);\n const view = new DataView(sendData.buffer);\n\n view.setUint32(0, INIT_VERSION, false);\n sendData[4] = 0x00;\n\n const nowSec = Math.floor(Date.now() / 1000);\n const clampedNow = Math.max(0, Math.min(nowSec, 0xffff_ffff));\n view.setUint32(5, clampedNow, false);\n\n const rng = randomBytes(4);\n sendData.set(rng, 9);\n\n return sendData;\n}\n\nfunction buildInit1Step1Packet(data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_STEP_LEN) return null;\n\n const sendData = new Uint8Array(INIT_TYPE_LEN + 16 + 4);\n sendData[0] = 0x01;\n\n // TS rand: little-endian uint32 at offset [INIT_VERSION_LEN + INIT_TYPE_LEN + 4]\n const tsRandOffset = INIT_VERSION_LEN + INIT_TYPE_LEN + 4;\n const tsRand =\n data[tsRandOffset]! |\n (data[tsRandOffset + 1]! << 8) |\n (data[tsRandOffset + 2]! << 16) |\n (data[tsRandOffset + 3]! << 24);\n\n new DataView(sendData.buffer).setUint32(INIT_TYPE_LEN + 16, tsRand >>> 0, false);\n return sendData;\n}\n\nfunction buildInit1Step2Packet(data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_STEP_LEN) return null;\n\n const sendData = new Uint8Array(INIT_VERSION_LEN + INIT_TYPE_LEN + 16 + 4);\n new DataView(sendData.buffer).setUint32(0, INIT_VERSION, false);\n sendData[4] = 0x02;\n sendData.set(data.slice(1, 21), 5);\n return sendData;\n}\n\nfunction buildInit1Step3Packet(data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_VERSION_LEN + INIT_TYPE_LEN + 16 + 4) return null;\n\n const sendData = new Uint8Array(INIT_TYPE_LEN + 64 + 64 + 4 + 100);\n sendData[0] = 0x03;\n sendData[INIT_TYPE_LEN + 64 - 1] = 1;\n sendData[INIT_TYPE_LEN + 64 + 64 - 1] = 1;\n new DataView(sendData.buffer).setUint32(INIT_TYPE_LEN + 64 + 64, 1, false);\n return sendData;\n}\n\nfunction buildInit1Step4Packet(crypt: Crypt, data: Uint8Array): Uint8Array | null {\n if (data.length !== INIT_TYPE_LEN + 64 + 64 + 4 + 100) return null;\n\n const level = new DataView(data.buffer, data.byteOffset).getUint32(1 + 128, false);\n const y = crypt.solveRsaChallenge(data, 1, level);\n\n crypt.alphaTmp = new Uint8Array(randomBytes(10));\n\n const alphaB64 = Buffer.from(crypt.alphaTmp).toString(\"base64\");\n const omegaB64 = crypt.identity.publicKeyBase64();\n\n const cmd = buildCommandOrdered(\"clientinitiv\", [\n [\"alpha\", alphaB64],\n [\"omega\", omegaB64],\n [\"ot\", \"1\"],\n [\"ip\", \"\"],\n ]);\n const cmdBytes = Buffer.from(cmd);\n\n const sendData = new Uint8Array(INIT_VERSION_LEN + INIT_TYPE_LEN + 232 + 64 + cmdBytes.length);\n const view = new DataView(sendData.buffer);\n view.setUint32(0, INIT_VERSION, false);\n sendData[4] = 0x04;\n sendData.set(data.slice(1, 233), 5);\n sendData.set(y.slice(0, 64), 5 + 232);\n sendData.set(cmdBytes, 5 + 232 + 64);\n\n return sendData;\n}\n"],"mappings":";;;AAIA,IAAa,IAAe,YAItB,IAAgB;AAMtB,SAAgB,EAAa,GAAc,GAA4C;CACrF,IAAI,MAAS,QAAS,EAAK,UAAU,KAAK,EAAK,OAAO,KACpD,OAAO,EAAsB;CAG/B,QAAQ,EAAK,IAAb;EACE,KAAK,GACH,OAAO,EAAsB,CAAI;EACnC,KAAK,GACH,OAAO,EAAsB,CAAI;EACnC,KAAK,GACH,OAAO,EAAsB,CAAI;EACnC,KAAK,GACH,OAAO,EAAsB,GAAO,CAAI;EAC1C,SACE,OAAO;CACX;AACF;AAEA,SAAS,IAAoC;CAC3C,IAAM,oBAAW,IAAI,WAAW,EAA4C,GACtE,IAAO,IAAI,SAAS,EAAS,MAAM;CAGzC,AADA,EAAK,UAAU,GAAG,GAAc,EAAK,GACrC,EAAS,KAAK;CAEd,IAAM,IAAS,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,GACrC,IAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAQ,UAAW,CAAC;CAC5D,EAAK,UAAU,GAAG,GAAY,EAAK;CAEnC,IAAM,IAAM,EAAY,CAAC;CAGzB,OAFA,EAAS,IAAI,GAAK,CAAC,GAEZ;AACT;AAEA,SAAS,EAAsB,GAAqC;CAClE,IAAI,EAAK,WAAW,GAAe,OAAO;CAE1C,IAAM,oBAAW,IAAI,WAAW,EAAsB;CACtD,EAAS,KAAK;CAId,IAAM,IACJ,EAAK,KACJ,EAAK,OAAsB,IAC3B,EAAK,OAAsB,KAC3B,EAAK,OAAsB;CAG9B,OADA,IAAI,SAAS,EAAS,MAAM,CAAC,CAAC,UAAU,IAAoB,MAAW,GAAG,EAAK,GACxE;AACT;AAEA,SAAS,EAAsB,GAAqC;CAClE,IAAI,EAAK,WAAW,GAAe,OAAO;CAE1C,IAAM,oBAAW,IAAI,WAAW,EAAyC;CAIzE,OAHA,IAAI,SAAS,EAAS,MAAM,CAAC,CAAC,UAAU,GAAG,GAAc,EAAK,GAC9D,EAAS,KAAK,GACd,EAAS,IAAI,EAAK,MAAM,GAAG,EAAE,GAAG,CAAC,GAC1B;AACT;AAEA,SAAS,EAAsB,GAAqC;CAClE,IAAI,EAAK,WAAW,IAA2C,OAAO;CAEtE,IAAM,oBAAW,IAAI,WAAW,GAAiC;CAKjE,OAJA,EAAS,KAAK,GACd,EAAS,MAA0B,GACnC,EAAS,OAA+B,GACxC,IAAI,SAAS,EAAS,MAAM,CAAC,CAAC,UAAU,KAAyB,GAAG,EAAK,GAClE;AACT;AAEA,SAAS,EAAsB,GAAc,GAAqC;CAChF,IAAI,EAAK,WAAW,KAAmC,OAAO;CAE9D,IAAM,IAAQ,IAAI,SAAS,EAAK,QAAQ,EAAK,UAAU,CAAC,CAAC,UAAU,KAAS,EAAK,GAC3E,IAAI,EAAM,kBAAkB,GAAM,GAAG,CAAK;CAEhD,EAAM,WAAW,IAAI,WAAW,EAAY,EAAE,CAAC;CAE/C,IAAM,IAAW,OAAO,KAAK,EAAM,QAAQ,CAAC,CAAC,SAAS,QAAQ,GACxD,IAAW,EAAM,SAAS,gBAAgB,GAE1C,IAAM,EAAoB,gBAAgB;EAC9C,CAAC,SAAS,CAAQ;EAClB,CAAC,SAAS,CAAQ;EAClB,CAAC,MAAM,GAAG;EACV,CAAC,MAAM,EAAE;CACX,CAAC,GACK,IAAW,OAAO,KAAK,CAAG,GAE1B,IAAW,IAAI,WAAW,MAA8C,EAAS,MAAM;CAQ7F,OANA,IADiB,SAAS,EAAS,MACnC,CAAA,CAAK,UAAU,GAAG,GAAc,EAAK,GACrC,EAAS,KAAK,GACd,EAAS,IAAI,EAAK,MAAM,GAAG,GAAG,GAAG,CAAC,GAClC,EAAS,IAAI,EAAE,MAAM,GAAG,EAAE,GAAG,GAAO,GACpC,EAAS,IAAI,GAAU,GAAY,GAE5B;AACT"}
@@ -1,4 +1,4 @@
1
- import { a as e, c as t, f as n, i as r, m as i, n as a, s as o, t as s } from "./primitives-BIAYfJ2Y.js";
1
+ import { a as e, c as t, f as n, i as r, m as i, n as a, s as o, t as s } from "./primitives-Bt-L4BZa.js";
2
2
  //#region src/handshake/license.ts
3
3
  var c = new Uint8Array([
4
4
  205,
@@ -33,39 +33,37 @@ var c = new Uint8Array([
33
33
  18,
34
34
  64,
35
35
  138
36
- ]), l = /* @__PURE__ */ function(e) {
37
- return e[e.Intermediate = 0] = "Intermediate", e[e.Server = 2] = "Server", e[e.Ts5Server = 8] = "Ts5Server", e[e.Ephemeral = 32] = "Ephemeral", e;
38
- }(l || {}), u = class {
36
+ ]), l = class {
39
37
  blocks;
40
38
  constructor(e) {
41
39
  this.blocks = e;
42
40
  }
43
41
  deriveKey() {
44
42
  let e = Uint8Array.from(c);
45
- for (let t of this.blocks) e = h(t, e);
43
+ for (let t of this.blocks) e = m(t, e);
46
44
  return e;
47
45
  }
48
46
  };
49
- function d(e) {
47
+ function u(e) {
50
48
  if (e.length < 1) throw Error("license too short");
51
49
  if (e[0] !== 1) throw Error("unsupported license version");
52
50
  let t = e.slice(1), n = [];
53
51
  for (; t.length > 0;) {
54
- let { block: e, consumed: r } = f(t);
52
+ let { block: e, consumed: r } = d(t);
55
53
  n.push(e), t = t.slice(r);
56
54
  }
57
- return new u(n);
55
+ return new l(n);
58
56
  }
59
- function f(e) {
57
+ function d(e) {
60
58
  if (e.length < 42) throw Error("license too short");
61
59
  if (e[0] !== 0) throw Error(`wrong key kind in license: ${e[0]}`);
62
60
  let t = e[33], r = 1356998400, i = new DataView(e.buffer, e.byteOffset, e.byteLength), a = /* @__PURE__ */ new Date((i.getUint32(34, !1) + r) * 1e3), o = /* @__PURE__ */ new Date((i.getUint32(38, !1) + r) * 1e3);
63
61
  if (o < a) throw Error("license times are invalid");
64
- let s = Uint8Array.from(e.slice(1, 33)), { payload: c, payloadRead: l } = p(t, e, 42), u = 42 + l, d = e.slice(1, u), f = n(Uint8Array.from(d));
62
+ let s = Uint8Array.from(e.slice(1, 33)), { payload: c, payloadRead: l } = f(t, e, 42), u = 42 + l, d = e.slice(1, u), p = n(Uint8Array.from(d));
65
63
  return {
66
64
  block: {
67
65
  key: s,
68
- hash: Uint8Array.from(f.slice(0, 32)),
66
+ hash: Uint8Array.from(p.slice(0, 32)),
69
67
  properties: c.properties,
70
68
  issuer: c.issuer,
71
69
  notValidBefore: a,
@@ -76,10 +74,10 @@ function f(e) {
76
74
  consumed: u
77
75
  };
78
76
  }
79
- function p(e, t, n) {
77
+ function f(e, t, n) {
80
78
  switch (e) {
81
- case l.Intermediate: {
82
- let { str: e, read: n } = m(t.slice(46));
79
+ case 0: {
80
+ let { str: e, read: n } = p(t.slice(46));
83
81
  return {
84
82
  payload: {
85
83
  issuer: e,
@@ -90,8 +88,8 @@ function p(e, t, n) {
90
88
  payloadRead: 5 + n
91
89
  };
92
90
  }
93
- case l.Server: {
94
- let { str: e, read: n } = m(t.slice(47));
91
+ case 2: {
92
+ let { str: e, read: n } = p(t.slice(47));
95
93
  return {
96
94
  payload: {
97
95
  issuer: e,
@@ -102,7 +100,7 @@ function p(e, t, n) {
102
100
  payloadRead: 6 + n
103
101
  };
104
102
  }
105
- case l.Ts5Server: {
103
+ case 8: {
106
104
  let e = t[43] === void 0 ? 0 : t[43], r = 44, i = [];
107
105
  for (let n = 0; n < e; n++) {
108
106
  if (r >= t.length) throw Error("license too short");
@@ -120,7 +118,7 @@ function p(e, t, n) {
120
118
  payloadRead: r - n
121
119
  };
122
120
  }
123
- case l.Ephemeral: return {
121
+ case 32: return {
124
122
  payload: {
125
123
  issuer: "",
126
124
  serverType: 0,
@@ -132,14 +130,14 @@ function p(e, t, n) {
132
130
  default: throw Error(`invalid license block type: ${e}`);
133
131
  }
134
132
  }
135
- function m(e) {
133
+ function p(e) {
136
134
  for (let t = 0; t < e.length; t++) if (e[t] === 0) return {
137
135
  str: new TextDecoder().decode(e.slice(0, t)),
138
136
  read: t
139
137
  };
140
138
  throw Error("non-null-terminated issuer string");
141
139
  }
142
- function h(n, r) {
140
+ function m(n, r) {
143
141
  let i = Uint8Array.from(n.hash);
144
142
  a(i);
145
143
  let o = s(i), c = t.Point.fromBytes(n.key).negate(), l = t.Point.fromBytes(r).negate(), u = e(c, o).add(l).toBytes(), d = new Uint8Array(u.length);
@@ -147,14 +145,14 @@ function h(n, r) {
147
145
  }
148
146
  //#endregion
149
147
  //#region src/handshake/crypt-init2.ts
150
- function g(e, t, n, a, s, c) {
148
+ function h(e, t, n, a, s, c) {
151
149
  if (e.alphaTmp.length === 0) throw Error("alpha is not initialized");
152
- let l = Buffer.from(t, "base64"), u = Buffer.from(n, "base64"), f = Buffer.from(a, "base64"), p = Buffer.from(s, "base64");
153
- if (!o(i(u), l, f)) throw Error("init proof is not valid");
154
- let m = r(d(l).deriveKey(), c);
150
+ let l = Buffer.from(t, "base64"), d = Buffer.from(n, "base64"), f = Buffer.from(a, "base64"), p = Buffer.from(s, "base64");
151
+ if (!o(i(d), l, f)) throw Error("init proof is not valid");
152
+ let m = r(u(l).deriveKey(), c);
155
153
  e.setSharedSecret(e.alphaTmp, p, m);
156
154
  }
157
155
  //#endregion
158
- export { u as n, d as r, g as t };
156
+ export { l as n, u as r, h as t };
159
157
 
160
- //# sourceMappingURL=crypt-init2-DWX7Tp-_.js.map
158
+ //# sourceMappingURL=crypt-init2-C2X9oK4i.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"crypt-init2-DWX7Tp-_.js","names":[],"sources":["../src/handshake/license.ts","../src/handshake/crypt-init2.ts"],"sourcesContent":["import { hash512 } from \"../crypto/identity.js\";\nimport { clampScalar, scalarMultFull, bytesToBigIntLE } from \"../crypto/primitives.js\";\nimport { ed25519 } from \"@noble/curves/ed25519.js\";\n\n// The root key is a 33-byte Ed25519 point\nconst LICENSE_ROOT_KEY = new Uint8Array([\n 0xcd, 0x0d, 0xe2, 0xae, 0xd4, 0x63, 0x45, 0x50, 0x9a, 0x7e, 0x3c, 0xfd, 0x8f, 0x68, 0xb3, 0xdc,\n 0x75, 0x55, 0xb2, 0x9d, 0xcc, 0xec, 0x73, 0xcd, 0x18, 0x75, 0x0f, 0x99, 0x38, 0x12, 0x40, 0x8a,\n]);\n\nconst enum LicenseBlockType {\n Intermediate = 0,\n Server = 2,\n Ts5Server = 8,\n Ephemeral = 32,\n}\n\ninterface LicenseBlock {\n readonly key: Uint8Array; // 32-byte Ed25519 point\n readonly hash: Uint8Array; // SHA-512 truncated to 32 bytes\n properties: Uint8Array[];\n issuer: string;\n notValidBefore: Date;\n notValidAfter: Date;\n blockType: LicenseBlockType;\n serverType: number;\n}\n\nexport class LicenseChain {\n readonly blocks: LicenseBlock[];\n\n constructor(blocks: LicenseBlock[]) {\n this.blocks = blocks;\n }\n\n /**\n * Derive the session key by chaining Ed25519 point arithmetic starting from\n * the root key through each license block.\n */\n deriveKey(): Uint8Array<ArrayBuffer> {\n let round: Uint8Array<ArrayBuffer> = Uint8Array.from(LICENSE_ROOT_KEY);\n for (const block of this.blocks) {\n round = deriveKeyFromBlock(block, round);\n }\n return round;\n }\n}\n\nexport function parseLicenses(data: Uint8Array): LicenseChain {\n if (data.length < 1) throw new Error(\"license too short\");\n if (data[0] !== 1) throw new Error(\"unsupported license version\");\n\n let remaining = data.slice(1);\n const blocks: LicenseBlock[] = [];\n\n while (remaining.length > 0) {\n const { block, consumed } = parseLicenseBlock(remaining);\n blocks.push(block);\n remaining = remaining.slice(consumed);\n }\n\n return new LicenseChain(blocks);\n}\n\nfunction parseLicenseBlock(data: Uint8Array): { block: LicenseBlock; consumed: number } {\n const MIN_BLOCK_LEN = 42;\n if (data.length < MIN_BLOCK_LEN) throw new Error(\"license too short\");\n if (data[0] !== 0) throw new Error(`wrong key kind in license: ${data[0]}`);\n\n const blockType = data[33] as LicenseBlockType;\n\n // Timestamps are seconds since Unix epoch offset by 0x50e22700\n const UNIX_OFFSET = 0x50e22700;\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const notValidBefore = new Date((view.getUint32(34, false) + UNIX_OFFSET) * 1000);\n const notValidAfter = new Date((view.getUint32(38, false) + UNIX_OFFSET) * 1000);\n\n if (notValidAfter < notValidBefore) {\n throw new Error(\"license times are invalid\");\n }\n\n const key = Uint8Array.from(data.slice(1, 33));\n\n const { payload, payloadRead } = parseBlockPayload(blockType, data, MIN_BLOCK_LEN);\n\n const allLen = MIN_BLOCK_LEN + payloadRead;\n const hashInput = data.slice(1, allLen);\n const hashFull = hash512(Uint8Array.from(hashInput));\n const hash = Uint8Array.from(hashFull.slice(0, 32));\n\n return {\n block: {\n key,\n hash,\n properties: payload.properties,\n issuer: payload.issuer,\n notValidBefore,\n notValidAfter,\n blockType,\n serverType: payload.serverType,\n },\n consumed: allLen,\n };\n}\n\ninterface BlockPayload {\n issuer: string;\n serverType: number;\n properties: Uint8Array[];\n read: number;\n}\n\nfunction parseBlockPayload(\n blockType: LicenseBlockType,\n data: Uint8Array,\n minBlockLen: number,\n): { payload: BlockPayload; payloadRead: number } {\n switch (blockType) {\n case LicenseBlockType.Intermediate: {\n const { str, read } = readNullString(data.slice(46));\n return {\n payload: { issuer: str, serverType: 0, properties: [], read: 5 + read },\n payloadRead: 5 + read,\n };\n }\n case LicenseBlockType.Server: {\n const { str, read } = readNullString(data.slice(47));\n return {\n payload: { issuer: str, serverType: data[42] ?? 0, properties: [], read: 6 + read },\n payloadRead: 6 + read,\n };\n }\n case LicenseBlockType.Ts5Server: {\n const propCount = data[43] !== undefined ? data[43] : 0;\n let pos = 44;\n const properties: Uint8Array[] = [];\n for (let i = 0; i < propCount; i++) {\n if (pos >= data.length) throw new Error(\"license too short\");\n const propLen = data[pos++]!;\n if (pos + propLen > data.length) throw new Error(\"license too short\");\n properties.push(Uint8Array.from(data.slice(pos, pos + propLen)));\n pos += propLen;\n }\n return {\n payload: { issuer: \"\", serverType: data[42] ?? 0, properties, read: pos - minBlockLen },\n payloadRead: pos - minBlockLen,\n };\n }\n case LicenseBlockType.Ephemeral:\n return { payload: { issuer: \"\", serverType: 0, properties: [], read: 0 }, payloadRead: 0 };\n default:\n throw new Error(`invalid license block type: ${blockType}`);\n }\n}\n\n/**\n * Scan for a null-terminated string and return its content and the index\n * of the null byte (NOT including it in the count, matching Go behaviour).\n * The parent formulas (`5 + read`, `6 + read`) already add 1 for the null.\n */\nfunction readNullString(data: Uint8Array): { str: string; read: number } {\n for (let i = 0; i < data.length; i++) {\n if (data[i] === 0) {\n return { str: new TextDecoder().decode(data.slice(0, i)), read: i };\n }\n }\n throw new Error(\"non-null-terminated issuer string\");\n}\n\n/**\n * Derive the next key given a parent key and a license block.\n * Mirrors Go's licenseBlock.deriveKey.\n */\nfunction deriveKeyFromBlock(block: LicenseBlock, parent: Uint8Array): Uint8Array<ArrayBuffer> {\n const scalarBytes = Uint8Array.from(block.hash);\n clampScalar(scalarBytes);\n\n // Use raw scalar WITHOUT reducing mod n — NaCl's ge_scalarmult_vartime\n // uses the raw 256-bit scalar. Reducing mod n changes the result when\n // the point has a small-order component (Ed25519 cofactor = 8).\n const scalar = bytesToBigIntLE(scalarBytes);\n\n const pub = ed25519.Point.fromBytes(block.key);\n const negPub = pub.negate();\n\n const par = ed25519.Point.fromBytes(parent);\n const negPar = par.negate();\n\n const res = scalarMultFull(negPub, scalar).add(negPar);\n const raw = res.toBytes();\n const final = new Uint8Array(raw.length) as Uint8Array<ArrayBuffer>;\n final.set(raw);\n final[31] = (final[31] !== undefined ? final[31] : 0) ^ 0x80;\n\n return final;\n}\n","import type { Crypt } from \"../crypto/crypt.js\";\nimport { importPublicKey } from \"../crypto/identity.js\";\nimport { verifySign, getSharedSecret2 } from \"../crypto/primitives.js\";\nimport { parseLicenses } from \"./license.js\";\n\n/**\n * CryptoInit2 performs the second stage of crypto initialization (Ed25519 ECDH).\n * Mirrors Go's handshake.CryptoInit2.\n */\nexport function cryptoInit2(\n crypt: Crypt,\n license: string,\n omega: string,\n proof: string,\n beta: string,\n privateKey: Uint8Array,\n): void {\n if (crypt.alphaTmp.length === 0) {\n throw new Error(\"alpha is not initialized\");\n }\n\n const licenseBytes = Buffer.from(license, \"base64\");\n const omegaBytes = Buffer.from(omega, \"base64\");\n const proofBytes = Buffer.from(proof, \"base64\");\n const betaBytes = Buffer.from(beta, \"base64\");\n\n const serverPubKey = importPublicKey(omegaBytes);\n if (!verifySign(serverPubKey, licenseBytes, proofBytes)) {\n throw new Error(\"init proof is not valid\");\n }\n\n const licenses = parseLicenses(licenseBytes);\n const key = licenses.deriveKey();\n\n const sharedSecret = getSharedSecret2(key, privateKey);\n\n crypt.setSharedSecret(crypt.alphaTmp, betaBytes, sharedSecret);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"crypt-init2-C2X9oK4i.js","names":[],"sources":["../src/handshake/license.ts","../src/handshake/crypt-init2.ts"],"sourcesContent":["import { hash512 } from \"../crypto/identity.js\";\nimport { clampScalar, scalarMultFull, bytesToBigIntLE } from \"../crypto/primitives.js\";\nimport { ed25519 } from \"@noble/curves/ed25519.js\";\n\n// The root key is a 33-byte Ed25519 point\nconst LICENSE_ROOT_KEY = new Uint8Array([\n 0xcd, 0x0d, 0xe2, 0xae, 0xd4, 0x63, 0x45, 0x50, 0x9a, 0x7e, 0x3c, 0xfd, 0x8f, 0x68, 0xb3, 0xdc,\n 0x75, 0x55, 0xb2, 0x9d, 0xcc, 0xec, 0x73, 0xcd, 0x18, 0x75, 0x0f, 0x99, 0x38, 0x12, 0x40, 0x8a,\n]);\n\nconst enum LicenseBlockType {\n Intermediate = 0,\n Server = 2,\n Ts5Server = 8,\n Ephemeral = 32,\n}\n\ninterface LicenseBlock {\n readonly key: Uint8Array; // 32-byte Ed25519 point\n readonly hash: Uint8Array; // SHA-512 truncated to 32 bytes\n properties: Uint8Array[];\n issuer: string;\n notValidBefore: Date;\n notValidAfter: Date;\n blockType: LicenseBlockType;\n serverType: number;\n}\n\nexport class LicenseChain {\n readonly blocks: LicenseBlock[];\n\n constructor(blocks: LicenseBlock[]) {\n this.blocks = blocks;\n }\n\n /**\n * Derive the session key by chaining Ed25519 point arithmetic starting from\n * the root key through each license block.\n */\n deriveKey(): Uint8Array<ArrayBuffer> {\n let round: Uint8Array<ArrayBuffer> = Uint8Array.from(LICENSE_ROOT_KEY);\n for (const block of this.blocks) {\n round = deriveKeyFromBlock(block, round);\n }\n return round;\n }\n}\n\nexport function parseLicenses(data: Uint8Array): LicenseChain {\n if (data.length < 1) throw new Error(\"license too short\");\n if (data[0] !== 1) throw new Error(\"unsupported license version\");\n\n let remaining = data.slice(1);\n const blocks: LicenseBlock[] = [];\n\n while (remaining.length > 0) {\n const { block, consumed } = parseLicenseBlock(remaining);\n blocks.push(block);\n remaining = remaining.slice(consumed);\n }\n\n return new LicenseChain(blocks);\n}\n\nfunction parseLicenseBlock(data: Uint8Array): { block: LicenseBlock; consumed: number } {\n const MIN_BLOCK_LEN = 42;\n if (data.length < MIN_BLOCK_LEN) throw new Error(\"license too short\");\n if (data[0] !== 0) throw new Error(`wrong key kind in license: ${data[0]}`);\n\n const blockType = data[33] as LicenseBlockType;\n\n // Timestamps are seconds since Unix epoch offset by 0x50e22700\n const UNIX_OFFSET = 0x50e22700;\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const notValidBefore = new Date((view.getUint32(34, false) + UNIX_OFFSET) * 1000);\n const notValidAfter = new Date((view.getUint32(38, false) + UNIX_OFFSET) * 1000);\n\n if (notValidAfter < notValidBefore) {\n throw new Error(\"license times are invalid\");\n }\n\n const key = Uint8Array.from(data.slice(1, 33));\n\n const { payload, payloadRead } = parseBlockPayload(blockType, data, MIN_BLOCK_LEN);\n\n const allLen = MIN_BLOCK_LEN + payloadRead;\n const hashInput = data.slice(1, allLen);\n const hashFull = hash512(Uint8Array.from(hashInput));\n const hash = Uint8Array.from(hashFull.slice(0, 32));\n\n return {\n block: {\n key,\n hash,\n properties: payload.properties,\n issuer: payload.issuer,\n notValidBefore,\n notValidAfter,\n blockType,\n serverType: payload.serverType,\n },\n consumed: allLen,\n };\n}\n\ninterface BlockPayload {\n issuer: string;\n serverType: number;\n properties: Uint8Array[];\n read: number;\n}\n\nfunction parseBlockPayload(\n blockType: LicenseBlockType,\n data: Uint8Array,\n minBlockLen: number,\n): { payload: BlockPayload; payloadRead: number } {\n switch (blockType) {\n case LicenseBlockType.Intermediate: {\n const { str, read } = readNullString(data.slice(46));\n return {\n payload: { issuer: str, serverType: 0, properties: [], read: 5 + read },\n payloadRead: 5 + read,\n };\n }\n case LicenseBlockType.Server: {\n const { str, read } = readNullString(data.slice(47));\n return {\n payload: { issuer: str, serverType: data[42] ?? 0, properties: [], read: 6 + read },\n payloadRead: 6 + read,\n };\n }\n case LicenseBlockType.Ts5Server: {\n const propCount = data[43] !== undefined ? data[43] : 0;\n let pos = 44;\n const properties: Uint8Array[] = [];\n for (let i = 0; i < propCount; i++) {\n if (pos >= data.length) throw new Error(\"license too short\");\n const propLen = data[pos++]!;\n if (pos + propLen > data.length) throw new Error(\"license too short\");\n properties.push(Uint8Array.from(data.slice(pos, pos + propLen)));\n pos += propLen;\n }\n return {\n payload: { issuer: \"\", serverType: data[42] ?? 0, properties, read: pos - minBlockLen },\n payloadRead: pos - minBlockLen,\n };\n }\n case LicenseBlockType.Ephemeral:\n return { payload: { issuer: \"\", serverType: 0, properties: [], read: 0 }, payloadRead: 0 };\n default:\n throw new Error(`invalid license block type: ${blockType}`);\n }\n}\n\n/**\n * Scan for a null-terminated string and return its content and the index\n * of the null byte (NOT including it in the count, matching Go behaviour).\n * The parent formulas (`5 + read`, `6 + read`) already add 1 for the null.\n */\nfunction readNullString(data: Uint8Array): { str: string; read: number } {\n for (let i = 0; i < data.length; i++) {\n if (data[i] === 0) {\n return { str: new TextDecoder().decode(data.slice(0, i)), read: i };\n }\n }\n throw new Error(\"non-null-terminated issuer string\");\n}\n\n/**\n * Derive the next key given a parent key and a license block.\n * Mirrors Go's licenseBlock.deriveKey.\n */\nfunction deriveKeyFromBlock(block: LicenseBlock, parent: Uint8Array): Uint8Array<ArrayBuffer> {\n const scalarBytes = Uint8Array.from(block.hash);\n clampScalar(scalarBytes);\n\n // Use raw scalar WITHOUT reducing mod n — NaCl's ge_scalarmult_vartime\n // uses the raw 256-bit scalar. Reducing mod n changes the result when\n // the point has a small-order component (Ed25519 cofactor = 8).\n const scalar = bytesToBigIntLE(scalarBytes);\n\n const pub = ed25519.Point.fromBytes(block.key);\n const negPub = pub.negate();\n\n const par = ed25519.Point.fromBytes(parent);\n const negPar = par.negate();\n\n const res = scalarMultFull(negPub, scalar).add(negPar);\n const raw = res.toBytes();\n const final = new Uint8Array(raw.length) as Uint8Array<ArrayBuffer>;\n final.set(raw);\n final[31] = (final[31] !== undefined ? final[31] : 0) ^ 0x80;\n\n return final;\n}\n","import type { Crypt } from \"../crypto/crypt.js\";\nimport { importPublicKey } from \"../crypto/identity.js\";\nimport { verifySign, getSharedSecret2 } from \"../crypto/primitives.js\";\nimport { parseLicenses } from \"./license.js\";\n\n/**\n * CryptoInit2 performs the second stage of crypto initialization (Ed25519 ECDH).\n * Mirrors Go's handshake.CryptoInit2.\n */\nexport function cryptoInit2(\n crypt: Crypt,\n license: string,\n omega: string,\n proof: string,\n beta: string,\n privateKey: Uint8Array,\n): void {\n if (crypt.alphaTmp.length === 0) {\n throw new Error(\"alpha is not initialized\");\n }\n\n const licenseBytes = Buffer.from(license, \"base64\");\n const omegaBytes = Buffer.from(omega, \"base64\");\n const proofBytes = Buffer.from(proof, \"base64\");\n const betaBytes = Buffer.from(beta, \"base64\");\n\n const serverPubKey = importPublicKey(omegaBytes);\n if (!verifySign(serverPubKey, licenseBytes, proofBytes)) {\n throw new Error(\"init proof is not valid\");\n }\n\n const licenses = parseLicenses(licenseBytes);\n const key = licenses.deriveKey();\n\n const sharedSecret = getSharedSecret2(key, privateKey);\n\n crypt.setSharedSecret(crypt.alphaTmp, betaBytes, sharedSecret);\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require("./primitives-ClIhDdNZ.cjs");var t=new Uint8Array([205,13,226,174,212,99,69,80,154,126,60,253,143,104,179,220,117,85,178,157,204,236,115,205,24,117,15,153,56,18,64,138]),n=class{blocks;constructor(e){this.blocks=e}deriveKey(){let e=Uint8Array.from(t);for(let t of this.blocks)e=s(t,e);return e}};function r(e){if(e.length<1)throw Error(`license too short`);if(e[0]!==1)throw Error(`unsupported license version`);let t=e.slice(1),r=[];for(;t.length>0;){let{block:e,consumed:n}=i(t);r.push(e),t=t.slice(n)}return new n(r)}function i(t){if(t.length<42)throw Error(`license too short`);if(t[0]!==0)throw Error(`wrong key kind in license: ${t[0]}`);let n=t[33],r=1356998400,i=new DataView(t.buffer,t.byteOffset,t.byteLength),o=new Date((i.getUint32(34,!1)+r)*1e3),s=new Date((i.getUint32(38,!1)+r)*1e3);if(s<o)throw Error(`license times are invalid`);let c=Uint8Array.from(t.slice(1,33)),{payload:l,payloadRead:u}=a(n,t,42),d=42+u,f=t.slice(1,d),p=e.f(Uint8Array.from(f));return{block:{key:c,hash:Uint8Array.from(p.slice(0,32)),properties:l.properties,issuer:l.issuer,notValidBefore:o,notValidAfter:s,blockType:n,serverType:l.serverType},consumed:d}}function a(e,t,n){switch(e){case 0:{let{str:e,read:n}=o(t.slice(46));return{payload:{issuer:e,serverType:0,properties:[],read:5+n},payloadRead:5+n}}case 2:{let{str:e,read:n}=o(t.slice(47));return{payload:{issuer:e,serverType:t[42]??0,properties:[],read:6+n},payloadRead:6+n}}case 8:{let e=t[43]===void 0?0:t[43],r=44,i=[];for(let n=0;n<e;n++){if(r>=t.length)throw Error(`license too short`);let e=t[r++];if(r+e>t.length)throw Error(`license too short`);i.push(Uint8Array.from(t.slice(r,r+e))),r+=e}return{payload:{issuer:``,serverType:t[42]??0,properties:i,read:r-n},payloadRead:r-n}}case 32:return{payload:{issuer:``,serverType:0,properties:[],read:0},payloadRead:0};default:throw Error(`invalid license block type: ${e}`)}}function o(e){for(let t=0;t<e.length;t++)if(e[t]===0)return{str:new TextDecoder().decode(e.slice(0,t)),read:t};throw Error(`non-null-terminated issuer string`)}function s(t,n){let r=Uint8Array.from(t.hash);e.n(r);let i=e.t(r),a=e.c.Point.fromBytes(t.key).negate(),o=e.c.Point.fromBytes(n).negate(),s=e.a(a,i).add(o).toBytes(),c=new Uint8Array(s.length);return c.set(s),c[31]=(c[31]===void 0?0:c[31])^128,c}function c(t,n,i,a,o,s){if(t.alphaTmp.length===0)throw Error(`alpha is not initialized`);let c=Buffer.from(n,`base64`),l=Buffer.from(i,`base64`),u=Buffer.from(a,`base64`),d=Buffer.from(o,`base64`);if(!e.s(e.m(l),c,u))throw Error(`init proof is not valid`);let f=e.i(r(c).deriveKey(),s);t.setSharedSecret(t.alphaTmp,d,f)}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return c}});
2
+ //# sourceMappingURL=crypt-init2-CazdFwqF.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"crypt-init2-C2oihZ7e.cjs","names":[],"sources":["../src/handshake/license.ts","../src/handshake/crypt-init2.ts"],"sourcesContent":["import { hash512 } from \"../crypto/identity.js\";\nimport { clampScalar, scalarMultFull, bytesToBigIntLE } from \"../crypto/primitives.js\";\nimport { ed25519 } from \"@noble/curves/ed25519.js\";\n\n// The root key is a 33-byte Ed25519 point\nconst LICENSE_ROOT_KEY = new Uint8Array([\n 0xcd, 0x0d, 0xe2, 0xae, 0xd4, 0x63, 0x45, 0x50, 0x9a, 0x7e, 0x3c, 0xfd, 0x8f, 0x68, 0xb3, 0xdc,\n 0x75, 0x55, 0xb2, 0x9d, 0xcc, 0xec, 0x73, 0xcd, 0x18, 0x75, 0x0f, 0x99, 0x38, 0x12, 0x40, 0x8a,\n]);\n\nconst enum LicenseBlockType {\n Intermediate = 0,\n Server = 2,\n Ts5Server = 8,\n Ephemeral = 32,\n}\n\ninterface LicenseBlock {\n readonly key: Uint8Array; // 32-byte Ed25519 point\n readonly hash: Uint8Array; // SHA-512 truncated to 32 bytes\n properties: Uint8Array[];\n issuer: string;\n notValidBefore: Date;\n notValidAfter: Date;\n blockType: LicenseBlockType;\n serverType: number;\n}\n\nexport class LicenseChain {\n readonly blocks: LicenseBlock[];\n\n constructor(blocks: LicenseBlock[]) {\n this.blocks = blocks;\n }\n\n /**\n * Derive the session key by chaining Ed25519 point arithmetic starting from\n * the root key through each license block.\n */\n deriveKey(): Uint8Array<ArrayBuffer> {\n let round: Uint8Array<ArrayBuffer> = Uint8Array.from(LICENSE_ROOT_KEY);\n for (const block of this.blocks) {\n round = deriveKeyFromBlock(block, round);\n }\n return round;\n }\n}\n\nexport function parseLicenses(data: Uint8Array): LicenseChain {\n if (data.length < 1) throw new Error(\"license too short\");\n if (data[0] !== 1) throw new Error(\"unsupported license version\");\n\n let remaining = data.slice(1);\n const blocks: LicenseBlock[] = [];\n\n while (remaining.length > 0) {\n const { block, consumed } = parseLicenseBlock(remaining);\n blocks.push(block);\n remaining = remaining.slice(consumed);\n }\n\n return new LicenseChain(blocks);\n}\n\nfunction parseLicenseBlock(data: Uint8Array): { block: LicenseBlock; consumed: number } {\n const MIN_BLOCK_LEN = 42;\n if (data.length < MIN_BLOCK_LEN) throw new Error(\"license too short\");\n if (data[0] !== 0) throw new Error(`wrong key kind in license: ${data[0]}`);\n\n const blockType = data[33] as LicenseBlockType;\n\n // Timestamps are seconds since Unix epoch offset by 0x50e22700\n const UNIX_OFFSET = 0x50e22700;\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const notValidBefore = new Date((view.getUint32(34, false) + UNIX_OFFSET) * 1000);\n const notValidAfter = new Date((view.getUint32(38, false) + UNIX_OFFSET) * 1000);\n\n if (notValidAfter < notValidBefore) {\n throw new Error(\"license times are invalid\");\n }\n\n const key = Uint8Array.from(data.slice(1, 33));\n\n const { payload, payloadRead } = parseBlockPayload(blockType, data, MIN_BLOCK_LEN);\n\n const allLen = MIN_BLOCK_LEN + payloadRead;\n const hashInput = data.slice(1, allLen);\n const hashFull = hash512(Uint8Array.from(hashInput));\n const hash = Uint8Array.from(hashFull.slice(0, 32));\n\n return {\n block: {\n key,\n hash,\n properties: payload.properties,\n issuer: payload.issuer,\n notValidBefore,\n notValidAfter,\n blockType,\n serverType: payload.serverType,\n },\n consumed: allLen,\n };\n}\n\ninterface BlockPayload {\n issuer: string;\n serverType: number;\n properties: Uint8Array[];\n read: number;\n}\n\nfunction parseBlockPayload(\n blockType: LicenseBlockType,\n data: Uint8Array,\n minBlockLen: number,\n): { payload: BlockPayload; payloadRead: number } {\n switch (blockType) {\n case LicenseBlockType.Intermediate: {\n const { str, read } = readNullString(data.slice(46));\n return {\n payload: { issuer: str, serverType: 0, properties: [], read: 5 + read },\n payloadRead: 5 + read,\n };\n }\n case LicenseBlockType.Server: {\n const { str, read } = readNullString(data.slice(47));\n return {\n payload: { issuer: str, serverType: data[42] ?? 0, properties: [], read: 6 + read },\n payloadRead: 6 + read,\n };\n }\n case LicenseBlockType.Ts5Server: {\n const propCount = data[43] !== undefined ? data[43] : 0;\n let pos = 44;\n const properties: Uint8Array[] = [];\n for (let i = 0; i < propCount; i++) {\n if (pos >= data.length) throw new Error(\"license too short\");\n const propLen = data[pos++]!;\n if (pos + propLen > data.length) throw new Error(\"license too short\");\n properties.push(Uint8Array.from(data.slice(pos, pos + propLen)));\n pos += propLen;\n }\n return {\n payload: { issuer: \"\", serverType: data[42] ?? 0, properties, read: pos - minBlockLen },\n payloadRead: pos - minBlockLen,\n };\n }\n case LicenseBlockType.Ephemeral:\n return { payload: { issuer: \"\", serverType: 0, properties: [], read: 0 }, payloadRead: 0 };\n default:\n throw new Error(`invalid license block type: ${blockType}`);\n }\n}\n\n/**\n * Scan for a null-terminated string and return its content and the index\n * of the null byte (NOT including it in the count, matching Go behaviour).\n * The parent formulas (`5 + read`, `6 + read`) already add 1 for the null.\n */\nfunction readNullString(data: Uint8Array): { str: string; read: number } {\n for (let i = 0; i < data.length; i++) {\n if (data[i] === 0) {\n return { str: new TextDecoder().decode(data.slice(0, i)), read: i };\n }\n }\n throw new Error(\"non-null-terminated issuer string\");\n}\n\n/**\n * Derive the next key given a parent key and a license block.\n * Mirrors Go's licenseBlock.deriveKey.\n */\nfunction deriveKeyFromBlock(block: LicenseBlock, parent: Uint8Array): Uint8Array<ArrayBuffer> {\n const scalarBytes = Uint8Array.from(block.hash);\n clampScalar(scalarBytes);\n\n // Use raw scalar WITHOUT reducing mod n — NaCl's ge_scalarmult_vartime\n // uses the raw 256-bit scalar. Reducing mod n changes the result when\n // the point has a small-order component (Ed25519 cofactor = 8).\n const scalar = bytesToBigIntLE(scalarBytes);\n\n const pub = ed25519.Point.fromBytes(block.key);\n const negPub = pub.negate();\n\n const par = ed25519.Point.fromBytes(parent);\n const negPar = par.negate();\n\n const res = scalarMultFull(negPub, scalar).add(negPar);\n const raw = res.toBytes();\n const final = new Uint8Array(raw.length) as Uint8Array<ArrayBuffer>;\n final.set(raw);\n final[31] = (final[31] !== undefined ? final[31] : 0) ^ 0x80;\n\n return final;\n}\n","import type { Crypt } from \"../crypto/crypt.js\";\nimport { importPublicKey } from \"../crypto/identity.js\";\nimport { verifySign, getSharedSecret2 } from \"../crypto/primitives.js\";\nimport { parseLicenses } from \"./license.js\";\n\n/**\n * CryptoInit2 performs the second stage of crypto initialization (Ed25519 ECDH).\n * Mirrors Go's handshake.CryptoInit2.\n */\nexport function cryptoInit2(\n crypt: Crypt,\n license: string,\n omega: string,\n proof: string,\n beta: string,\n privateKey: Uint8Array,\n): void {\n if (crypt.alphaTmp.length === 0) {\n throw new Error(\"alpha is not initialized\");\n }\n\n const licenseBytes = Buffer.from(license, \"base64\");\n const omegaBytes = Buffer.from(omega, \"base64\");\n const proofBytes = Buffer.from(proof, \"base64\");\n const betaBytes = Buffer.from(beta, \"base64\");\n\n const serverPubKey = importPublicKey(omegaBytes);\n if (!verifySign(serverPubKey, licenseBytes, proofBytes)) {\n throw new Error(\"init proof is not valid\");\n }\n\n const licenses = parseLicenses(licenseBytes);\n const key = licenses.deriveKey();\n\n const sharedSecret = getSharedSecret2(key, privateKey);\n\n crypt.setSharedSecret(crypt.alphaTmp, betaBytes, sharedSecret);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"crypt-init2-CazdFwqF.cjs","names":[],"sources":["../src/handshake/license.ts","../src/handshake/crypt-init2.ts"],"sourcesContent":["import { hash512 } from \"../crypto/identity.js\";\nimport { clampScalar, scalarMultFull, bytesToBigIntLE } from \"../crypto/primitives.js\";\nimport { ed25519 } from \"@noble/curves/ed25519.js\";\n\n// The root key is a 33-byte Ed25519 point\nconst LICENSE_ROOT_KEY = new Uint8Array([\n 0xcd, 0x0d, 0xe2, 0xae, 0xd4, 0x63, 0x45, 0x50, 0x9a, 0x7e, 0x3c, 0xfd, 0x8f, 0x68, 0xb3, 0xdc,\n 0x75, 0x55, 0xb2, 0x9d, 0xcc, 0xec, 0x73, 0xcd, 0x18, 0x75, 0x0f, 0x99, 0x38, 0x12, 0x40, 0x8a,\n]);\n\nconst enum LicenseBlockType {\n Intermediate = 0,\n Server = 2,\n Ts5Server = 8,\n Ephemeral = 32,\n}\n\ninterface LicenseBlock {\n readonly key: Uint8Array; // 32-byte Ed25519 point\n readonly hash: Uint8Array; // SHA-512 truncated to 32 bytes\n properties: Uint8Array[];\n issuer: string;\n notValidBefore: Date;\n notValidAfter: Date;\n blockType: LicenseBlockType;\n serverType: number;\n}\n\nexport class LicenseChain {\n readonly blocks: LicenseBlock[];\n\n constructor(blocks: LicenseBlock[]) {\n this.blocks = blocks;\n }\n\n /**\n * Derive the session key by chaining Ed25519 point arithmetic starting from\n * the root key through each license block.\n */\n deriveKey(): Uint8Array<ArrayBuffer> {\n let round: Uint8Array<ArrayBuffer> = Uint8Array.from(LICENSE_ROOT_KEY);\n for (const block of this.blocks) {\n round = deriveKeyFromBlock(block, round);\n }\n return round;\n }\n}\n\nexport function parseLicenses(data: Uint8Array): LicenseChain {\n if (data.length < 1) throw new Error(\"license too short\");\n if (data[0] !== 1) throw new Error(\"unsupported license version\");\n\n let remaining = data.slice(1);\n const blocks: LicenseBlock[] = [];\n\n while (remaining.length > 0) {\n const { block, consumed } = parseLicenseBlock(remaining);\n blocks.push(block);\n remaining = remaining.slice(consumed);\n }\n\n return new LicenseChain(blocks);\n}\n\nfunction parseLicenseBlock(data: Uint8Array): { block: LicenseBlock; consumed: number } {\n const MIN_BLOCK_LEN = 42;\n if (data.length < MIN_BLOCK_LEN) throw new Error(\"license too short\");\n if (data[0] !== 0) throw new Error(`wrong key kind in license: ${data[0]}`);\n\n const blockType = data[33] as LicenseBlockType;\n\n // Timestamps are seconds since Unix epoch offset by 0x50e22700\n const UNIX_OFFSET = 0x50e22700;\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const notValidBefore = new Date((view.getUint32(34, false) + UNIX_OFFSET) * 1000);\n const notValidAfter = new Date((view.getUint32(38, false) + UNIX_OFFSET) * 1000);\n\n if (notValidAfter < notValidBefore) {\n throw new Error(\"license times are invalid\");\n }\n\n const key = Uint8Array.from(data.slice(1, 33));\n\n const { payload, payloadRead } = parseBlockPayload(blockType, data, MIN_BLOCK_LEN);\n\n const allLen = MIN_BLOCK_LEN + payloadRead;\n const hashInput = data.slice(1, allLen);\n const hashFull = hash512(Uint8Array.from(hashInput));\n const hash = Uint8Array.from(hashFull.slice(0, 32));\n\n return {\n block: {\n key,\n hash,\n properties: payload.properties,\n issuer: payload.issuer,\n notValidBefore,\n notValidAfter,\n blockType,\n serverType: payload.serverType,\n },\n consumed: allLen,\n };\n}\n\ninterface BlockPayload {\n issuer: string;\n serverType: number;\n properties: Uint8Array[];\n read: number;\n}\n\nfunction parseBlockPayload(\n blockType: LicenseBlockType,\n data: Uint8Array,\n minBlockLen: number,\n): { payload: BlockPayload; payloadRead: number } {\n switch (blockType) {\n case LicenseBlockType.Intermediate: {\n const { str, read } = readNullString(data.slice(46));\n return {\n payload: { issuer: str, serverType: 0, properties: [], read: 5 + read },\n payloadRead: 5 + read,\n };\n }\n case LicenseBlockType.Server: {\n const { str, read } = readNullString(data.slice(47));\n return {\n payload: { issuer: str, serverType: data[42] ?? 0, properties: [], read: 6 + read },\n payloadRead: 6 + read,\n };\n }\n case LicenseBlockType.Ts5Server: {\n const propCount = data[43] !== undefined ? data[43] : 0;\n let pos = 44;\n const properties: Uint8Array[] = [];\n for (let i = 0; i < propCount; i++) {\n if (pos >= data.length) throw new Error(\"license too short\");\n const propLen = data[pos++]!;\n if (pos + propLen > data.length) throw new Error(\"license too short\");\n properties.push(Uint8Array.from(data.slice(pos, pos + propLen)));\n pos += propLen;\n }\n return {\n payload: { issuer: \"\", serverType: data[42] ?? 0, properties, read: pos - minBlockLen },\n payloadRead: pos - minBlockLen,\n };\n }\n case LicenseBlockType.Ephemeral:\n return { payload: { issuer: \"\", serverType: 0, properties: [], read: 0 }, payloadRead: 0 };\n default:\n throw new Error(`invalid license block type: ${blockType}`);\n }\n}\n\n/**\n * Scan for a null-terminated string and return its content and the index\n * of the null byte (NOT including it in the count, matching Go behaviour).\n * The parent formulas (`5 + read`, `6 + read`) already add 1 for the null.\n */\nfunction readNullString(data: Uint8Array): { str: string; read: number } {\n for (let i = 0; i < data.length; i++) {\n if (data[i] === 0) {\n return { str: new TextDecoder().decode(data.slice(0, i)), read: i };\n }\n }\n throw new Error(\"non-null-terminated issuer string\");\n}\n\n/**\n * Derive the next key given a parent key and a license block.\n * Mirrors Go's licenseBlock.deriveKey.\n */\nfunction deriveKeyFromBlock(block: LicenseBlock, parent: Uint8Array): Uint8Array<ArrayBuffer> {\n const scalarBytes = Uint8Array.from(block.hash);\n clampScalar(scalarBytes);\n\n // Use raw scalar WITHOUT reducing mod n — NaCl's ge_scalarmult_vartime\n // uses the raw 256-bit scalar. Reducing mod n changes the result when\n // the point has a small-order component (Ed25519 cofactor = 8).\n const scalar = bytesToBigIntLE(scalarBytes);\n\n const pub = ed25519.Point.fromBytes(block.key);\n const negPub = pub.negate();\n\n const par = ed25519.Point.fromBytes(parent);\n const negPar = par.negate();\n\n const res = scalarMultFull(negPub, scalar).add(negPar);\n const raw = res.toBytes();\n const final = new Uint8Array(raw.length) as Uint8Array<ArrayBuffer>;\n final.set(raw);\n final[31] = (final[31] !== undefined ? final[31] : 0) ^ 0x80;\n\n return final;\n}\n","import type { Crypt } from \"../crypto/crypt.js\";\nimport { importPublicKey } from \"../crypto/identity.js\";\nimport { verifySign, getSharedSecret2 } from \"../crypto/primitives.js\";\nimport { parseLicenses } from \"./license.js\";\n\n/**\n * CryptoInit2 performs the second stage of crypto initialization (Ed25519 ECDH).\n * Mirrors Go's handshake.CryptoInit2.\n */\nexport function cryptoInit2(\n crypt: Crypt,\n license: string,\n omega: string,\n proof: string,\n beta: string,\n privateKey: Uint8Array,\n): void {\n if (crypt.alphaTmp.length === 0) {\n throw new Error(\"alpha is not initialized\");\n }\n\n const licenseBytes = Buffer.from(license, \"base64\");\n const omegaBytes = Buffer.from(omega, \"base64\");\n const proofBytes = Buffer.from(proof, \"base64\");\n const betaBytes = Buffer.from(beta, \"base64\");\n\n const serverPubKey = importPublicKey(omegaBytes);\n if (!verifySign(serverPubKey, licenseBytes, proofBytes)) {\n throw new Error(\"init proof is not valid\");\n }\n\n const licenses = parseLicenses(licenseBytes);\n const key = licenses.deriveKey();\n\n const sharedSecret = getSharedSecret2(key, privateKey);\n\n crypt.setSharedSecret(crypt.alphaTmp, betaBytes, sharedSecret);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/crypto/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AAOrB,qBAAa,QAAQ;IACnB,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;gBAEH,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM;IAKjD,eAAe,IAAI,MAAM;IAoBzB,QAAQ,IAAI,MAAM;IAUlB,aAAa,IAAI,MAAM;IAOjB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAe/E;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CA+BtD;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAc9D;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAEpD;AA+BD;mDACmD;AACnD,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAS3D"}
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/crypto/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AAOrB,qBAAa,QAAQ;IACnB,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;gBAEH,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM;IAKjD,eAAe,IAAI,MAAM;IAoBzB,QAAQ,IAAI,MAAM;IAUlB,aAAa,IAAI,MAAM;IAOjB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAe/E;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CA+BtD;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAc9D;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAEpD;AA+BD;mDACmD;AACnD,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAS3D"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../primitives-bj-ml31v.cjs`),t=require(`../crypto-2veVY1fC.cjs`);exports.Crypt=t.t,exports.EAX=t.n,exports.Identity=e.l,exports.aesCmac=t.r,exports.clampScalar=e.n,exports.generateIdentity=e.u,exports.generateTemporaryKey=e.r,exports.getSharedSecret2=e.i,exports.getUidFromPublicKey=e.d,exports.hash512=e.f,exports.identityFromString=e.p,exports.importPublicKey=e.m,exports.sign=e.o,exports.verifySign=e.s;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../primitives-ClIhDdNZ.cjs"),t=require("../crypto-IbzNNTgO.cjs");exports.Crypt=t.t,exports.EAX=t.n,exports.Identity=e.l,exports.aesCmac=t.r,exports.clampScalar=e.n,exports.generateIdentity=e.u,exports.generateTemporaryKey=e.r,exports.getSharedSecret2=e.i,exports.getUidFromPublicKey=e.d,exports.hash512=e.f,exports.identityFromString=e.p,exports.importPublicKey=e.m,exports.sign=e.o,exports.verifySign=e.s;
@@ -1,3 +1,3 @@
1
- import { d as e, f as t, i as n, l as r, m as i, n as a, o, p as s, r as c, s as l, u } from "../primitives-BIAYfJ2Y.js";
2
- import { n as d, r as f, t as p } from "../crypto-VC7n6YJb.js";
1
+ import { d as e, f as t, i as n, l as r, m as i, n as a, o, p as s, r as c, s as l, u } from "../primitives-Bt-L4BZa.js";
2
+ import { n as d, r as f, t as p } from "../crypto-CwIMggQG.js";
3
3
  export { p as Crypt, d as EAX, r as Identity, f as aesCmac, a as clampScalar, u as generateIdentity, c as generateTemporaryKey, n as getSharedSecret2, e as getUidFromPublicKey, t as hash512, s as identityFromString, i as importPublicKey, o as sign, l as verifySign };
@@ -1,4 +1,4 @@
1
- import { m as e, v as t, y as n } from "./primitives-BIAYfJ2Y.js";
1
+ import { m as e, v as t, y as n } from "./primitives-Bt-L4BZa.js";
2
2
  import { createCipheriv as r, createECDH as i, createHash as a, timingSafeEqual as o } from "node:crypto";
3
3
  //#region src/crypto/eax.ts
4
4
  var s = 8, c = 16, l = class {
@@ -67,9 +67,9 @@ function g(e, t) {
67
67
  //#region src/crypto/crypt.ts
68
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
69
  identity;
70
- ivStruct = new Uint8Array();
70
+ ivStruct = /* @__PURE__ */ new Uint8Array();
71
71
  fakeSignature = new Uint8Array(_);
72
- alphaTmp = new Uint8Array();
72
+ alphaTmp = /* @__PURE__ */ new Uint8Array();
73
73
  cryptoInitComplete = !1;
74
74
  #e = /* @__PURE__ */ new Map();
75
75
  constructor(e) {
@@ -162,4 +162,4 @@ function O(e, t) {
162
162
  //#endregion
163
163
  export { l as n, g as r, w as t };
164
164
 
165
- //# sourceMappingURL=crypto-VC7n6YJb.js.map
165
+ //# sourceMappingURL=crypto-CwIMggQG.js.map