@honeybbq/teamspeak 0.0.1 → 1.0.0-beta.7

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 (393) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +726 -2
  3. package/dist/client/abort.d.ts +5 -0
  4. package/dist/client/abort.d.ts.map +1 -0
  5. package/dist/client/abort.js +23 -0
  6. package/dist/client/abort.js.map +1 -0
  7. package/dist/client/address.d.ts +17 -0
  8. package/dist/client/address.d.ts.map +1 -0
  9. package/dist/client/address.js +66 -0
  10. package/dist/client/address.js.map +1 -0
  11. package/dist/client/api/voice.d.ts +24 -0
  12. package/dist/client/api/voice.d.ts.map +1 -0
  13. package/dist/client/api/voice.js +33 -0
  14. package/dist/client/api/voice.js.map +1 -0
  15. package/dist/client/capabilities.d.ts +68 -0
  16. package/dist/client/capabilities.d.ts.map +1 -0
  17. package/dist/client/capabilities.js +59 -0
  18. package/dist/client/capabilities.js.map +1 -0
  19. package/dist/client/client.d.ts +196 -0
  20. package/dist/client/client.d.ts.map +1 -0
  21. package/dist/client/client.js +1523 -0
  22. package/dist/client/client.js.map +1 -0
  23. package/dist/client/commands.d.ts +66 -0
  24. package/dist/client/commands.d.ts.map +1 -0
  25. package/dist/client/commands.js +162 -0
  26. package/dist/client/commands.js.map +1 -0
  27. package/dist/client/crypto/crypt-ops.d.ts +7 -0
  28. package/dist/client/crypto/crypt-ops.d.ts.map +1 -0
  29. package/dist/client/crypto/crypt-ops.js +2 -0
  30. package/dist/client/crypto/crypt-ops.js.map +1 -0
  31. package/dist/client/crypto/crypt.d.ts +37 -0
  32. package/dist/client/crypto/crypt.d.ts.map +1 -0
  33. package/dist/client/crypto/crypt.js +203 -0
  34. package/dist/client/crypto/crypt.js.map +1 -0
  35. package/dist/client/crypto/eax.d.ts +12 -0
  36. package/dist/client/crypto/eax.d.ts.map +1 -0
  37. package/dist/client/crypto/eax.js +118 -0
  38. package/dist/client/crypto/eax.js.map +1 -0
  39. package/dist/client/crypto/identity.d.ts +97 -0
  40. package/dist/client/crypto/identity.d.ts.map +1 -0
  41. package/dist/client/crypto/identity.js +412 -0
  42. package/dist/client/crypto/identity.js.map +1 -0
  43. package/dist/client/crypto/index.d.ts +7 -0
  44. package/dist/client/crypto/index.d.ts.map +1 -0
  45. package/dist/client/crypto/index.js +5 -0
  46. package/dist/client/crypto/index.js.map +1 -0
  47. package/dist/client/crypto/primitives.d.ts +43 -0
  48. package/dist/client/crypto/primitives.d.ts.map +1 -0
  49. package/dist/client/crypto/primitives.js +116 -0
  50. package/dist/client/crypto/primitives.js.map +1 -0
  51. package/dist/client/diagnostics.d.ts +45 -0
  52. package/dist/client/diagnostics.d.ts.map +1 -0
  53. package/dist/client/diagnostics.js +30 -0
  54. package/dist/client/diagnostics.js.map +1 -0
  55. package/dist/client/discovery/index.d.ts +2 -0
  56. package/dist/client/discovery/index.d.ts.map +1 -0
  57. package/dist/client/discovery/index.js +2 -0
  58. package/dist/client/discovery/index.js.map +1 -0
  59. package/dist/client/discovery/resolver.d.ts +26 -0
  60. package/dist/client/discovery/resolver.d.ts.map +1 -0
  61. package/dist/client/discovery/resolver.js +275 -0
  62. package/dist/client/discovery/resolver.js.map +1 -0
  63. package/dist/client/errors.d.ts +82 -0
  64. package/dist/client/errors.d.ts.map +1 -0
  65. package/dist/client/errors.js +201 -0
  66. package/dist/client/errors.js.map +1 -0
  67. package/dist/client/events.d.ts +3 -0
  68. package/dist/client/events.d.ts.map +1 -0
  69. package/dist/client/events.js +8 -0
  70. package/dist/client/events.js.map +1 -0
  71. package/dist/client/handshake/crypt-handshake.d.ts +17 -0
  72. package/dist/client/handshake/crypt-handshake.d.ts.map +1 -0
  73. package/dist/client/handshake/crypt-handshake.js +128 -0
  74. package/dist/client/handshake/crypt-handshake.js.map +1 -0
  75. package/dist/client/handshake/crypt-init2.d.ts +7 -0
  76. package/dist/client/handshake/crypt-init2.d.ts.map +1 -0
  77. package/dist/client/handshake/crypt-init2.js +37 -0
  78. package/dist/client/handshake/crypt-init2.js.map +1 -0
  79. package/dist/client/handshake/index.d.ts +4 -0
  80. package/dist/client/handshake/index.d.ts.map +1 -0
  81. package/dist/client/handshake/index.js +4 -0
  82. package/dist/client/handshake/index.js.map +1 -0
  83. package/dist/client/handshake/license.d.ts +35 -0
  84. package/dist/client/handshake/license.d.ts.map +1 -0
  85. package/dist/client/handshake/license.js +169 -0
  86. package/dist/client/handshake/license.js.map +1 -0
  87. package/dist/client/handshake.d.ts +27 -0
  88. package/dist/client/handshake.d.ts.map +1 -0
  89. package/dist/client/handshake.js +126 -0
  90. package/dist/client/handshake.js.map +1 -0
  91. package/dist/client/helpers.d.ts +6 -0
  92. package/dist/client/helpers.d.ts.map +1 -0
  93. package/dist/client/helpers.js +13 -0
  94. package/dist/client/helpers.js.map +1 -0
  95. package/dist/client/hooks.d.ts +7 -0
  96. package/dist/client/hooks.d.ts.map +1 -0
  97. package/dist/client/hooks.js +28 -0
  98. package/dist/client/hooks.js.map +1 -0
  99. package/dist/client/index.d.ts +26 -0
  100. package/dist/client/index.d.ts.map +1 -0
  101. package/dist/client/index.js +28 -0
  102. package/dist/client/index.js.map +1 -0
  103. package/dist/client/reconnect.d.ts +12 -0
  104. package/dist/client/reconnect.d.ts.map +1 -0
  105. package/dist/client/reconnect.js +44 -0
  106. package/dist/client/reconnect.js.map +1 -0
  107. package/dist/client/throttle.d.ts +20 -0
  108. package/dist/client/throttle.d.ts.map +1 -0
  109. package/dist/client/throttle.js +83 -0
  110. package/dist/client/throttle.js.map +1 -0
  111. package/dist/client/trace.d.ts +223 -0
  112. package/dist/client/trace.d.ts.map +1 -0
  113. package/dist/client/trace.js +13 -0
  114. package/dist/client/trace.js.map +1 -0
  115. package/dist/client/transfer.d.ts +111 -0
  116. package/dist/client/transfer.d.ts.map +1 -0
  117. package/dist/client/transfer.js +243 -0
  118. package/dist/client/transfer.js.map +1 -0
  119. package/dist/client/transport/generation-window.d.ts +30 -0
  120. package/dist/client/transport/generation-window.d.ts.map +1 -0
  121. package/dist/client/transport/generation-window.js +97 -0
  122. package/dist/client/transport/generation-window.js.map +1 -0
  123. package/dist/client/transport/handler.d.ts +61 -0
  124. package/dist/client/transport/handler.d.ts.map +1 -0
  125. package/dist/client/transport/handler.js +793 -0
  126. package/dist/client/transport/handler.js.map +1 -0
  127. package/dist/client/transport/index.d.ts +6 -0
  128. package/dist/client/transport/index.d.ts.map +1 -0
  129. package/dist/client/transport/index.js +5 -0
  130. package/dist/client/transport/index.js.map +1 -0
  131. package/dist/client/transport/packet.d.ts +36 -0
  132. package/dist/client/transport/packet.d.ts.map +1 -0
  133. package/dist/client/transport/packet.js +55 -0
  134. package/dist/client/transport/packet.js.map +1 -0
  135. package/dist/client/transport/quicklz.d.ts +24 -0
  136. package/dist/client/transport/quicklz.d.ts.map +1 -0
  137. package/dist/client/transport/quicklz.js +179 -0
  138. package/dist/client/transport/quicklz.js.map +1 -0
  139. package/dist/client/types.d.ts +226 -0
  140. package/dist/client/types.d.ts.map +1 -0
  141. package/dist/client/types.js +39 -0
  142. package/dist/client/types.js.map +1 -0
  143. package/dist/core/api/channels.d.ts +182 -0
  144. package/dist/core/api/channels.d.ts.map +1 -0
  145. package/dist/core/api/channels.js +155 -0
  146. package/dist/core/api/channels.js.map +1 -0
  147. package/dist/core/api/clients.d.ts +304 -0
  148. package/dist/core/api/clients.d.ts.map +1 -0
  149. package/dist/core/api/clients.js +260 -0
  150. package/dist/core/api/clients.js.map +1 -0
  151. package/dist/core/api/command.d.ts +305 -0
  152. package/dist/core/api/command.d.ts.map +1 -0
  153. package/dist/core/api/command.js +363 -0
  154. package/dist/core/api/command.js.map +1 -0
  155. package/dist/core/api/files.d.ts +153 -0
  156. package/dist/core/api/files.d.ts.map +1 -0
  157. package/dist/core/api/files.js +181 -0
  158. package/dist/core/api/files.js.map +1 -0
  159. package/dist/core/api/groups.d.ts +248 -0
  160. package/dist/core/api/groups.d.ts.map +1 -0
  161. package/dist/core/api/groups.js +271 -0
  162. package/dist/core/api/groups.js.map +1 -0
  163. package/dist/core/api/moderation.d.ts +205 -0
  164. package/dist/core/api/moderation.d.ts.map +1 -0
  165. package/dist/core/api/moderation.js +209 -0
  166. package/dist/core/api/moderation.js.map +1 -0
  167. package/dist/core/api/parse.d.ts +16 -0
  168. package/dist/core/api/parse.d.ts.map +1 -0
  169. package/dist/core/api/parse.js +40 -0
  170. package/dist/core/api/parse.js.map +1 -0
  171. package/dist/core/api/server.d.ts +310 -0
  172. package/dist/core/api/server.d.ts.map +1 -0
  173. package/dist/core/api/server.js +290 -0
  174. package/dist/core/api/server.js.map +1 -0
  175. package/dist/core/command/command.d.ts +20 -0
  176. package/dist/core/command/command.d.ts.map +1 -0
  177. package/dist/core/command/command.js +112 -0
  178. package/dist/core/command/command.js.map +1 -0
  179. package/dist/core/command/ids.d.ts +125 -0
  180. package/dist/core/command/ids.d.ts.map +1 -0
  181. package/dist/core/command/ids.js +85 -0
  182. package/dist/core/command/ids.js.map +1 -0
  183. package/dist/core/command/parser.d.ts +17 -0
  184. package/dist/core/command/parser.d.ts.map +1 -0
  185. package/dist/core/command/parser.js +65 -0
  186. package/dist/core/command/parser.js.map +1 -0
  187. package/dist/core/command/request.d.ts +61 -0
  188. package/dist/core/command/request.d.ts.map +1 -0
  189. package/dist/core/command/request.js +64 -0
  190. package/dist/core/command/request.js.map +1 -0
  191. package/dist/core/command/responses.d.ts +59 -0
  192. package/dist/core/command/responses.d.ts.map +1 -0
  193. package/dist/core/command/responses.js +74 -0
  194. package/dist/core/command/responses.js.map +1 -0
  195. package/dist/core/command-name.d.ts +333 -0
  196. package/dist/core/command-name.d.ts.map +1 -0
  197. package/dist/core/command-name.js +331 -0
  198. package/dist/core/command-name.js.map +1 -0
  199. package/dist/core/enums.d.ts +146 -0
  200. package/dist/core/enums.d.ts.map +1 -0
  201. package/dist/core/enums.js +132 -0
  202. package/dist/core/enums.js.map +1 -0
  203. package/dist/core/errorcode.d.ts +413 -0
  204. package/dist/core/errorcode.d.ts.map +1 -0
  205. package/dist/core/errorcode.js +410 -0
  206. package/dist/core/errorcode.js.map +1 -0
  207. package/dist/core/errors.d.ts +111 -0
  208. package/dist/core/errors.d.ts.map +1 -0
  209. package/dist/core/errors.js +233 -0
  210. package/dist/core/errors.js.map +1 -0
  211. package/dist/core/events.d.ts +207 -0
  212. package/dist/core/events.d.ts.map +1 -0
  213. package/dist/core/events.js +6 -0
  214. package/dist/core/events.js.map +1 -0
  215. package/dist/core/helpers.d.ts +42 -0
  216. package/dist/core/helpers.d.ts.map +1 -0
  217. package/dist/core/helpers.js +156 -0
  218. package/dist/core/helpers.js.map +1 -0
  219. package/dist/core/index.d.ts +35 -0
  220. package/dist/core/index.d.ts.map +1 -0
  221. package/dist/core/index.js +34 -0
  222. package/dist/core/index.js.map +1 -0
  223. package/dist/core/internal.d.ts +23 -0
  224. package/dist/core/internal.d.ts.map +1 -0
  225. package/dist/core/internal.js +20 -0
  226. package/dist/core/internal.js.map +1 -0
  227. package/dist/core/middleware.d.ts +14 -0
  228. package/dist/core/middleware.d.ts.map +1 -0
  229. package/dist/core/middleware.js +18 -0
  230. package/dist/core/middleware.js.map +1 -0
  231. package/dist/core/notification-name.d.ts +154 -0
  232. package/dist/core/notification-name.d.ts.map +1 -0
  233. package/dist/core/notification-name.js +152 -0
  234. package/dist/core/notification-name.js.map +1 -0
  235. package/dist/core/notifications.d.ts +43 -0
  236. package/dist/core/notifications.d.ts.map +1 -0
  237. package/dist/core/notifications.js +116 -0
  238. package/dist/core/notifications.js.map +1 -0
  239. package/dist/core/permission-name.d.ts +533 -0
  240. package/dist/core/permission-name.d.ts.map +1 -0
  241. package/dist/core/permission-name.js +531 -0
  242. package/dist/core/permission-name.js.map +1 -0
  243. package/dist/core/permission.d.ts +31 -0
  244. package/dist/core/permission.d.ts.map +1 -0
  245. package/dist/core/permission.js +20 -0
  246. package/dist/core/permission.js.map +1 -0
  247. package/dist/core/property-name.d.ts +403 -0
  248. package/dist/core/property-name.d.ts.map +1 -0
  249. package/dist/core/property-name.js +405 -0
  250. package/dist/core/property-name.js.map +1 -0
  251. package/dist/core/reason.d.ts +39 -0
  252. package/dist/core/reason.d.ts.map +1 -0
  253. package/dist/core/reason.js +36 -0
  254. package/dist/core/reason.js.map +1 -0
  255. package/dist/core/reconnect.d.ts +59 -0
  256. package/dist/core/reconnect.d.ts.map +1 -0
  257. package/dist/core/reconnect.js +55 -0
  258. package/dist/core/reconnect.js.map +1 -0
  259. package/dist/core/types.d.ts +110 -0
  260. package/dist/core/types.d.ts.map +1 -0
  261. package/dist/core/types.js +27 -0
  262. package/dist/core/types.js.map +1 -0
  263. package/dist/query/client.d.ts +194 -0
  264. package/dist/query/client.d.ts.map +1 -0
  265. package/dist/query/client.js +967 -0
  266. package/dist/query/client.js.map +1 -0
  267. package/dist/query/errors.d.ts +61 -0
  268. package/dist/query/errors.d.ts.map +1 -0
  269. package/dist/query/errors.js +100 -0
  270. package/dist/query/errors.js.map +1 -0
  271. package/dist/query/index.d.ts +36 -0
  272. package/dist/query/index.d.ts.map +1 -0
  273. package/dist/query/index.js +34 -0
  274. package/dist/query/index.js.map +1 -0
  275. package/dist/query/knownhosts.d.ts +61 -0
  276. package/dist/query/knownhosts.d.ts.map +1 -0
  277. package/dist/query/knownhosts.js +223 -0
  278. package/dist/query/knownhosts.js.map +1 -0
  279. package/dist/query/lines.d.ts +14 -0
  280. package/dist/query/lines.d.ts.map +1 -0
  281. package/dist/query/lines.js +29 -0
  282. package/dist/query/lines.js.map +1 -0
  283. package/dist/query/options.d.ts +187 -0
  284. package/dist/query/options.d.ts.map +1 -0
  285. package/dist/query/options.js +213 -0
  286. package/dist/query/options.js.map +1 -0
  287. package/dist/query/reconnect.d.ts +29 -0
  288. package/dist/query/reconnect.d.ts.map +1 -0
  289. package/dist/query/reconnect.js +87 -0
  290. package/dist/query/reconnect.js.map +1 -0
  291. package/dist/query/ssh.d.ts +345 -0
  292. package/dist/query/ssh.d.ts.map +1 -0
  293. package/dist/query/ssh.js +241 -0
  294. package/dist/query/ssh.js.map +1 -0
  295. package/dist/query/stream.d.ts +38 -0
  296. package/dist/query/stream.d.ts.map +1 -0
  297. package/dist/query/stream.js +70 -0
  298. package/dist/query/stream.js.map +1 -0
  299. package/dist/query/tcp.d.ts +38 -0
  300. package/dist/query/tcp.d.ts.map +1 -0
  301. package/dist/query/tcp.js +53 -0
  302. package/dist/query/tcp.js.map +1 -0
  303. package/dist/query/transport.d.ts +36 -0
  304. package/dist/query/transport.d.ts.map +1 -0
  305. package/dist/query/transport.js +2 -0
  306. package/dist/query/transport.js.map +1 -0
  307. package/dist/query/web.d.ts +54 -0
  308. package/dist/query/web.d.ts.map +1 -0
  309. package/dist/query/web.js +146 -0
  310. package/dist/query/web.js.map +1 -0
  311. package/dist/versions/index.d.ts +3094 -0
  312. package/dist/versions/index.d.ts.map +1 -0
  313. package/dist/versions/index.js +9237 -0
  314. package/dist/versions/index.js.map +1 -0
  315. package/package.json +118 -4
  316. package/src/client/abort.ts +24 -0
  317. package/src/client/address.ts +74 -0
  318. package/src/client/api/voice.ts +61 -0
  319. package/src/client/capabilities.ts +106 -0
  320. package/src/client/client.ts +1809 -0
  321. package/src/client/commands.ts +193 -0
  322. package/src/client/crypto/crypt-ops.ts +6 -0
  323. package/src/client/crypto/crypt.ts +275 -0
  324. package/src/client/crypto/eax.ts +152 -0
  325. package/src/client/crypto/identity.ts +484 -0
  326. package/src/client/crypto/index.ts +21 -0
  327. package/src/client/crypto/primitives.ts +141 -0
  328. package/src/client/diagnostics.ts +58 -0
  329. package/src/client/discovery/index.ts +1 -0
  330. package/src/client/discovery/resolver.ts +325 -0
  331. package/src/client/errors.ts +217 -0
  332. package/src/client/events.ts +12 -0
  333. package/src/client/handshake/crypt-handshake.ts +157 -0
  334. package/src/client/handshake/crypt-init2.ts +48 -0
  335. package/src/client/handshake/index.ts +3 -0
  336. package/src/client/handshake/license.ts +208 -0
  337. package/src/client/handshake.ts +150 -0
  338. package/src/client/helpers.ts +10 -0
  339. package/src/client/hooks.ts +30 -0
  340. package/src/client/index.ts +93 -0
  341. package/src/client/reconnect.ts +43 -0
  342. package/src/client/throttle.ts +92 -0
  343. package/src/client/trace.ts +237 -0
  344. package/src/client/transfer.ts +436 -0
  345. package/src/client/transport/generation-window.ts +108 -0
  346. package/src/client/transport/handler.ts +926 -0
  347. package/src/client/transport/index.ts +14 -0
  348. package/src/client/transport/packet.ts +69 -0
  349. package/src/client/transport/quicklz.ts +209 -0
  350. package/src/client/types.ts +268 -0
  351. package/src/core/api/channels.ts +396 -0
  352. package/src/core/api/clients.ts +654 -0
  353. package/src/core/api/command.ts +563 -0
  354. package/src/core/api/files.ts +405 -0
  355. package/src/core/api/groups.ts +622 -0
  356. package/src/core/api/moderation.ts +525 -0
  357. package/src/core/api/parse.ts +52 -0
  358. package/src/core/api/server.ts +709 -0
  359. package/src/core/command/command.ts +125 -0
  360. package/src/core/command/ids.ts +149 -0
  361. package/src/core/command/parser.ts +68 -0
  362. package/src/core/command/request.ts +119 -0
  363. package/src/core/command/responses.ts +114 -0
  364. package/src/core/command-name.ts +334 -0
  365. package/src/core/enums.ts +167 -0
  366. package/src/core/errorcode.ts +412 -0
  367. package/src/core/errors.ts +258 -0
  368. package/src/core/events.ts +219 -0
  369. package/src/core/helpers.ts +161 -0
  370. package/src/core/index.ts +126 -0
  371. package/src/core/internal.ts +23 -0
  372. package/src/core/middleware.ts +24 -0
  373. package/src/core/notification-name.ts +155 -0
  374. package/src/core/notifications.ts +157 -0
  375. package/src/core/permission-name.ts +538 -0
  376. package/src/core/permission.ts +34 -0
  377. package/src/core/property-name.ts +411 -0
  378. package/src/core/reason.ts +38 -0
  379. package/src/core/reconnect.ts +98 -0
  380. package/src/core/types.ts +138 -0
  381. package/src/query/client.ts +1132 -0
  382. package/src/query/errors.ts +108 -0
  383. package/src/query/index.ts +65 -0
  384. package/src/query/knownhosts.ts +257 -0
  385. package/src/query/lines.ts +28 -0
  386. package/src/query/options.ts +388 -0
  387. package/src/query/reconnect.ts +84 -0
  388. package/src/query/ssh.ts +614 -0
  389. package/src/query/stream.ts +91 -0
  390. package/src/query/tcp.ts +85 -0
  391. package/src/query/transport.ts +35 -0
  392. package/src/query/web.ts +195 -0
  393. package/src/versions/index.ts +10774 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eax.d.ts","sourceRoot":"","sources":["../../../src/client/crypto/eax.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,qBAAa,GAAG;;IAGd,YAAY,GAAG,EAAE,UAAU,EAG1B;IAED,OAAO,CACL,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,UAAU,GACpB,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,CAAC,CAc3C;IAED,OAAO,CACL,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,UAAU,GACd,UAAU,CAeZ;CAcF;AAoDD,wBAAgB,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,GAAG,UAAU,CA2BxE"}
@@ -0,0 +1,118 @@
1
+ import { createCipheriv, timingSafeEqual } from "node:crypto";
2
+ import { EAXTagMismatchError } from "../errors.js";
3
+ const EAX_TAG_SIZE = 8;
4
+ const EAX_BLOCK_SIZE = 16;
5
+ /**
6
+ * AES-EAX AEAD implementation for TS3 (64-bit tag, AES-128).
7
+ * Uses AES-CMAC for authentication and AES-CTR for encryption.
8
+ */
9
+ export class EAX {
10
+ #key;
11
+ constructor(key) {
12
+ if (key.length !== 16)
13
+ throw new Error("EAX requires a 16-byte key");
14
+ this.#key = key;
15
+ }
16
+ encrypt(nonce, header, plaintext) {
17
+ const nStar = this.#cmac(0, nonce);
18
+ const hStar = this.#cmac(1, header);
19
+ const ciphertext = aesCtr(this.#key, nStar, plaintext);
20
+ const cStar = this.#cmac(2, ciphertext);
21
+ const tag = new Uint8Array(EAX_TAG_SIZE);
22
+ for (let i = 0; i < EAX_TAG_SIZE; i++) {
23
+ tag[i] = nStar[i] ^ hStar[i] ^ cStar[i];
24
+ }
25
+ return [ciphertext, tag];
26
+ }
27
+ decrypt(nonce, header, ciphertext, tag) {
28
+ const nStar = this.#cmac(0, nonce);
29
+ const hStar = this.#cmac(1, header);
30
+ const cStar = this.#cmac(2, ciphertext);
31
+ const expected = new Uint8Array(EAX_TAG_SIZE);
32
+ for (let i = 0; i < EAX_TAG_SIZE; i++) {
33
+ expected[i] = nStar[i] ^ hStar[i] ^ cStar[i];
34
+ }
35
+ if (!timingSafeEqual(Buffer.from(expected), Buffer.from(tag.slice(0, EAX_TAG_SIZE)))) {
36
+ throw new EAXTagMismatchError();
37
+ }
38
+ return aesCtr(this.#key, nStar, ciphertext);
39
+ }
40
+ /**
41
+ * AES-CMAC per RFC 4493:
42
+ * input = [0…0 tag] ++ data (one block prefix)
43
+ */
44
+ #cmac(tagByte, data) {
45
+ const input = new Uint8Array(EAX_BLOCK_SIZE + data.length);
46
+ // first block: zeros then tag byte at the last position
47
+ input[EAX_BLOCK_SIZE - 1] = tagByte;
48
+ input.set(data, EAX_BLOCK_SIZE);
49
+ return aesCmac(this.#key, input);
50
+ }
51
+ }
52
+ // ---- AES-CTR ----------------------------------------------------------------
53
+ function aesCtr(key, iv, data) {
54
+ const cipher = createCipheriv("aes-128-ctr", Buffer.from(key), Buffer.from(iv));
55
+ return Buffer.concat([cipher.update(Buffer.from(data)), cipher.final()]);
56
+ }
57
+ // ---- AES-CMAC (RFC 4493) ----------------------------------------------------
58
+ function aesEcb(key, block) {
59
+ // Node.js does not expose ECB directly; simulate via CTR with zero IV and
60
+ // a zero-input (CTR of 0-block XOR with input = ECB)
61
+ const cipher = createCipheriv("aes-128-ecb", Buffer.from(key), null);
62
+ cipher.setAutoPadding(false);
63
+ return Buffer.concat([cipher.update(Buffer.from(block)), cipher.final()]);
64
+ }
65
+ function xorBlock(a, b) {
66
+ const out = new Uint8Array(EAX_BLOCK_SIZE);
67
+ for (let i = 0; i < EAX_BLOCK_SIZE; i++)
68
+ out[i] = a[i] ^ b[i];
69
+ return out;
70
+ }
71
+ function shiftLeft1(b) {
72
+ const out = new Uint8Array(EAX_BLOCK_SIZE);
73
+ let carry = 0;
74
+ for (let i = EAX_BLOCK_SIZE - 1; i >= 0; i--) {
75
+ const shifted = ((b[i] << 1) | carry) & 0xff;
76
+ carry = b[i] >> 7;
77
+ out[i] = shifted;
78
+ }
79
+ return out;
80
+ }
81
+ const RB = new Uint8Array(EAX_BLOCK_SIZE);
82
+ RB[EAX_BLOCK_SIZE - 1] = 0x87;
83
+ function generateSubkeys(key) {
84
+ const zero = new Uint8Array(EAX_BLOCK_SIZE);
85
+ const L = aesEcb(key, zero);
86
+ let K1 = shiftLeft1(L);
87
+ if ((L[0] & 0x80) !== 0)
88
+ K1 = xorBlock(K1, RB);
89
+ let K2 = shiftLeft1(K1);
90
+ if ((K1[0] & 0x80) !== 0)
91
+ K2 = xorBlock(K2, RB);
92
+ return [K1, K2];
93
+ }
94
+ export function aesCmac(key, message) {
95
+ const [K1, K2] = generateSubkeys(key);
96
+ const n = Math.max(1, Math.ceil(message.length / EAX_BLOCK_SIZE));
97
+ const lastBlockComplete = message.length > 0 && message.length % EAX_BLOCK_SIZE === 0;
98
+ let X = new Uint8Array(EAX_BLOCK_SIZE);
99
+ for (let i = 0; i < n - 1; i++) {
100
+ const block = message.slice(i * EAX_BLOCK_SIZE, (i + 1) * EAX_BLOCK_SIZE);
101
+ X = Uint8Array.from(aesEcb(key, xorBlock(X, block)));
102
+ }
103
+ const lastBlock = new Uint8Array(EAX_BLOCK_SIZE);
104
+ const lastStart = (n - 1) * EAX_BLOCK_SIZE;
105
+ const lastSlice = message.slice(lastStart);
106
+ lastBlock.set(lastSlice);
107
+ let Mn;
108
+ if (lastBlockComplete) {
109
+ Mn = xorBlock(lastBlock, K1);
110
+ }
111
+ else {
112
+ if (lastSlice.length < EAX_BLOCK_SIZE)
113
+ lastBlock[lastSlice.length] = 0x80;
114
+ Mn = xorBlock(lastBlock, K2);
115
+ }
116
+ return Uint8Array.from(aesEcb(key, xorBlock(X, Mn)));
117
+ }
118
+ //# sourceMappingURL=eax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eax.js","sourceRoot":"","sources":["../../../src/client/crypto/eax.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import { type KeyObject } from "node:crypto";
2
+ import { type UID } from "@honeybbq/teamspeak";
3
+ /**
4
+ * A TeamSpeak client identity: a P-256 key pair plus a counter, the offset,
5
+ * whose hash with the public key sets the identity's security level.
6
+ *
7
+ * Immutable: raising the level returns a new identity. Opaque: the private
8
+ * key is never exposed, and `toString()`, `toJSON()` and `util.inspect()`
9
+ * describe the identity without it, so an identity that reaches a log or an
10
+ * error message does not leak; `export()` is the one way to get the secret
11
+ * form, for storing it. Make one with `generateIdentity()` or
12
+ * `parseIdentity()`.
13
+ */
14
+ export declare class Identity {
15
+ #private;
16
+ private constructor();
17
+ /** The counter whose hash with the public key sets the security level. */
18
+ get offset(): bigint;
19
+ /** The public key in TeamSpeak's encoding: base64 of its DER form. */
20
+ publicKey(): string;
21
+ /**
22
+ * The identity's unique identifier, hashed with `algorithm`: SHA-1 for a
23
+ * TeamSpeak 3 server, SHA-256 for TeamSpeak 6. A connected client's `uid`
24
+ * already uses the one its server does.
25
+ */
26
+ uid(algorithm: UIDAlgorithm): UID;
27
+ /**
28
+ * The identity in the form `parseIdentity()` reads, private key included.
29
+ * Store it as you would a password.
30
+ */
31
+ export(): string;
32
+ /** Describes the identity, by its SHA-1 unique identifier, without its private key. */
33
+ toString(): string;
34
+ /** The same as `toString()`, so serialising an identity cannot leak its key. */
35
+ toJSON(): string;
36
+ /** The security level: trailing zero bits in SHA-1 of the public key and offset. */
37
+ securityLevel(): number;
38
+ /**
39
+ * The same key at an offset whose security level reaches `targetLevel`, as
40
+ * a new identity; this one is unchanged, and returned as it is when it
41
+ * already reaches the level.
42
+ *
43
+ * Each level doubles the expected work, so a high level can take a long
44
+ * time; `signal` bounds it, and the event loop keeps running meanwhile. A
45
+ * level above 160, the width of SHA-1, can never be reached and is refused
46
+ * with a RangeError.
47
+ */
48
+ upgradeToLevel(targetLevel: number, options?: {
49
+ readonly signal?: AbortSignal | undefined;
50
+ }): Promise<Identity>;
51
+ }
52
+ /**
53
+ * Read an identity from the form `Identity.export()` writes: the private key
54
+ * as canonical base64 of at most 32 bytes, a colon, and the offset as a
55
+ * decimal unsigned 64-bit integer. Anything else throws an
56
+ * InvalidIdentityError, with the underlying failure as its cause.
57
+ */
58
+ export declare function parseIdentity(s: string): Identity;
59
+ /**
60
+ * Create an identity at the given security level, at most 160. Each level
61
+ * doubles the expected work; `signal` bounds it, and the event loop keeps
62
+ * running meanwhile.
63
+ */
64
+ export declare function generateIdentity(targetLevel: number, options?: {
65
+ readonly signal?: AbortSignal | undefined;
66
+ }): Promise<Identity>;
67
+ /**
68
+ * Create an identity at the given security level, at most 160, blocking until
69
+ * done. Fine for a low level; a high one can block the event loop for minutes,
70
+ * so prefer `generateIdentity()` there.
71
+ */
72
+ export declare function generateIdentitySync(targetLevel: number): Identity;
73
+ /**
74
+ * The hash a server uses for `client_unique_identifier`, keyed by the server's
75
+ * major version.
76
+ *
77
+ * TeamSpeak 3 hashes the canonical public key with SHA-1 (20 bytes); TeamSpeak
78
+ * 6 switched to SHA-256 (32 bytes). The algorithm is not negotiable on the
79
+ * wire, so a client that guesses wrong computes a UID that matches nothing the
80
+ * server ever sends — self-identification by UID silently fails.
81
+ *
82
+ * May gain members in a minor release, should a server generation change the
83
+ * hash again: a `switch` over it needs a default case.
84
+ */
85
+ export type UIDAlgorithm = "sha1" | "sha256";
86
+ /** Pick the UID hash from a `virtualserver_version` string, e.g. "6.0.0-beta13.1". */
87
+ export declare function uidAlgorithmForVersion(version: string): UIDAlgorithm;
88
+ /**
89
+ * The unique identifier of a public key in TeamSpeak's encoding, hashed with
90
+ * `algorithm`: SHA-1 for a TeamSpeak 3 server, SHA-256 for TeamSpeak 6.
91
+ */
92
+ export declare function uidFromPublicKey(publicKey: string, algorithm: UIDAlgorithm): UID;
93
+ export declare function hash512(data: Uint8Array): Uint8Array;
94
+ /** Import a TS3 public key (canonical or legacy ASN.1 DER) and return the
95
+ * uncompressed 65-byte point [0x04 || x || y]. */
96
+ export declare function importPublicKey(data: Uint8Array): KeyObject;
97
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/client/crypto/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAS,KAAK,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAYtD;;;;;;;;;;GAUG;AACH,qBAAa,QAAQ;;IAUnB,OAAO,eAGN;IAED,0EAA0E;IAC1E,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,sEAAsE;IACtE,SAAS,IAAI,MAAM,CAUlB;IAED;;;;OAIG;IACH,GAAG,CAAC,SAAS,EAAE,YAAY,GAAG,GAAG,CAEhC;IAED;;;OAGG;IACH,MAAM,IAAI,MAAM,CAKf;IAED,uFAAuF;IACvF,QAAQ,IAAI,MAAM,CAEjB;IAED,gFAAgF;IAChF,MAAM,IAAI,MAAM,CAEf;IAED,oFAAoF;IACpF,aAAa,IAAI,MAAM,CAEtB;IAED;;;;;;;;;OASG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;KAAO,GAC1D,OAAO,CAAC,QAAQ,CAAC,CAgBnB;CACF;AAqCD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CA0CjD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CAAO,GAC1D,OAAO,CAAC,QAAQ,CAAC,CAGnB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAOlE;AAMD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7C,sFAAsF;AACtF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAGpE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,GAAG,CAEhF;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAEpD;AA+BD;mDACmD;AACnD,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAS3D"}
@@ -0,0 +1,412 @@
1
+ import { createHash, createECDH, generateKeyPairSync, createPrivateKey, createPublicKey, } from "node:crypto";
2
+ import { InvalidIdentityError } from "../errors.js";
3
+ import { asUID } from "@honeybbq/teamspeak";
4
+ const P256_SCALAR_SIZE = 32;
5
+ const P256_UNCOMPRESSED_KEY_SIZE = 65;
6
+ const P256_POINT_PREFIX = 0x04;
7
+ /** The most a security level can be: SHA-1 is 160 bits wide. */
8
+ const MAX_SECURITY_LEVEL = 160;
9
+ let createIdentity;
10
+ let privateKeyOf;
11
+ /**
12
+ * A TeamSpeak client identity: a P-256 key pair plus a counter, the offset,
13
+ * whose hash with the public key sets the identity's security level.
14
+ *
15
+ * Immutable: raising the level returns a new identity. Opaque: the private
16
+ * key is never exposed, and `toString()`, `toJSON()` and `util.inspect()`
17
+ * describe the identity without it, so an identity that reaches a log or an
18
+ * error message does not leak; `export()` is the one way to get the secret
19
+ * form, for storing it. Make one with `generateIdentity()` or
20
+ * `parseIdentity()`.
21
+ */
22
+ export class Identity {
23
+ static {
24
+ createIdentity = (privateKey, offset) => new Identity(privateKey, offset);
25
+ privateKeyOf = (identity) => identity.#privateKey;
26
+ }
27
+ #privateKey;
28
+ #offset;
29
+ #publicKey;
30
+ constructor(privateKey, offset) {
31
+ this.#privateKey = privateKey;
32
+ this.#offset = offset;
33
+ }
34
+ /** The counter whose hash with the public key sets the security level. */
35
+ get offset() {
36
+ return this.#offset;
37
+ }
38
+ /** The public key in TeamSpeak's encoding: base64 of its DER form. */
39
+ publicKey() {
40
+ if (this.#publicKey !== undefined)
41
+ return this.#publicKey;
42
+ const rawJwk = this.#privateKey.export({ format: "jwk" });
43
+ if (typeof rawJwk.x !== "string" || typeof rawJwk.y !== "string")
44
+ return "";
45
+ const xBytes = base64UrlToBytes(rawJwk.x, P256_SCALAR_SIZE);
46
+ const yBytes = base64UrlToBytes(rawJwk.y, P256_SCALAR_SIZE);
47
+ // Encode as TS3 canonical ASN.1: SEQUENCE { BIT STRING, INTEGER(32), INTEGER(x), INTEGER(y) }
48
+ this.#publicKey = encodeTsPublicKey(xBytes, yBytes);
49
+ return this.#publicKey;
50
+ }
51
+ /**
52
+ * The identity's unique identifier, hashed with `algorithm`: SHA-1 for a
53
+ * TeamSpeak 3 server, SHA-256 for TeamSpeak 6. A connected client's `uid`
54
+ * already uses the one its server does.
55
+ */
56
+ uid(algorithm) {
57
+ return uidFromPublicKey(this.publicKey(), algorithm);
58
+ }
59
+ /**
60
+ * The identity in the form `parseIdentity()` reads, private key included.
61
+ * Store it as you would a password.
62
+ */
63
+ export() {
64
+ const jwk = this.#privateKey.export({ format: "jwk" });
65
+ if (!jwk.d)
66
+ return `:${this.#offset}`;
67
+ const dBytes = base64UrlToBytes(jwk.d, P256_SCALAR_SIZE);
68
+ return `${Buffer.from(dBytes).toString("base64")}:${this.#offset}`;
69
+ }
70
+ /** Describes the identity, by its SHA-1 unique identifier, without its private key. */
71
+ toString() {
72
+ return `identity ${this.uid("sha1")} (private key redacted)`;
73
+ }
74
+ /** The same as `toString()`, so serialising an identity cannot leak its key. */
75
+ toJSON() {
76
+ return this.toString();
77
+ }
78
+ /** The security level: trailing zero bits in SHA-1 of the public key and offset. */
79
+ securityLevel() {
80
+ return levelAt(this.publicKey(), this.#offset);
81
+ }
82
+ /**
83
+ * The same key at an offset whose security level reaches `targetLevel`, as
84
+ * a new identity; this one is unchanged, and returned as it is when it
85
+ * already reaches the level.
86
+ *
87
+ * Each level doubles the expected work, so a high level can take a long
88
+ * time; `signal` bounds it, and the event loop keeps running meanwhile. A
89
+ * level above 160, the width of SHA-1, can never be reached and is refused
90
+ * with a RangeError.
91
+ */
92
+ async upgradeToLevel(targetLevel, options = {}) {
93
+ checkLevel(targetLevel);
94
+ const { signal } = options;
95
+ const prefix = this.publicKey();
96
+ let offset = this.#offset;
97
+ while (true) {
98
+ signal?.throwIfAborted();
99
+ if (levelAt(prefix, offset) >= targetLevel) {
100
+ return offset === this.#offset ? this : new Identity(this.#privateKey, offset);
101
+ }
102
+ offset++;
103
+ // Yield to the event loop now and then rather than blocking it.
104
+ if (offset % 10000n === 0n) {
105
+ await new Promise((resolve) => setImmediate(resolve));
106
+ }
107
+ }
108
+ }
109
+ }
110
+ // Defined outside the class body: a computed key there would have to be
111
+ // inferred, which isolatedDeclarations rules out. By its registered name, so
112
+ // this module needs no node:util.
113
+ Object.defineProperty(Identity.prototype, Symbol.for("nodejs.util.inspect.custom"), {
114
+ value() {
115
+ return `Identity <${this.toString()}>`;
116
+ },
117
+ });
118
+ /**
119
+ * The private key of an identity, for the handshake. Not exported from the
120
+ * package.
121
+ *
122
+ * @internal
123
+ */
124
+ export function identityPrivateKey(identity) {
125
+ return privateKeyOf(identity);
126
+ }
127
+ function checkLevel(level) {
128
+ if (!Number.isInteger(level) || level < 0 || level > MAX_SECURITY_LEVEL) {
129
+ throw new RangeError(`a security level is an integer from 0 to 160, not ${level}`);
130
+ }
131
+ }
132
+ function levelAt(publicKey, offset) {
133
+ const h = createHash("sha1");
134
+ h.update(publicKey);
135
+ h.update(offset.toString(10));
136
+ return countLeadingZeros(h.digest());
137
+ }
138
+ /** The largest offset, an unsigned 64-bit counter. */
139
+ const MAX_UINT64 = (1n << 64n) - 1n;
140
+ /**
141
+ * Read an identity from the form `Identity.export()` writes: the private key
142
+ * as canonical base64 of at most 32 bytes, a colon, and the offset as a
143
+ * decimal unsigned 64-bit integer. Anything else throws an
144
+ * InvalidIdentityError, with the underlying failure as its cause.
145
+ */
146
+ export function parseIdentity(s) {
147
+ const colonIdx = s.lastIndexOf(":");
148
+ if (colonIdx < 0)
149
+ throw new InvalidIdentityError();
150
+ const dBase64 = s.slice(0, colonIdx);
151
+ const offsetStr = s.slice(colonIdx + 1);
152
+ if (!/^\d+$/.test(offsetStr) || BigInt(offsetStr) > MAX_UINT64) {
153
+ throw new InvalidIdentityError("invalid identity offset");
154
+ }
155
+ const offset = BigInt(offsetStr);
156
+ // Node's base64 decoder skips what it cannot read, so the key is checked by
157
+ // a round trip: anything but canonical base64 would otherwise decode to some
158
+ // other key, silently.
159
+ const dBytes = Buffer.from(dBase64, "base64");
160
+ if (dBytes.length === 0 || dBytes.toString("base64") !== dBase64) {
161
+ throw new InvalidIdentityError("the private key is not canonical base64");
162
+ }
163
+ if (dBytes.length > P256_SCALAR_SIZE) {
164
+ throw new InvalidIdentityError("private key scalar too large");
165
+ }
166
+ // Pad to P256_SCALAR_SIZE
167
+ const padded = Buffer.alloc(P256_SCALAR_SIZE);
168
+ dBytes.copy(padded, P256_SCALAR_SIZE - dBytes.length);
169
+ try {
170
+ // node:crypto JWK import requires x and y to be present.
171
+ // Derive the public key from the private scalar via ECDH.
172
+ const ecdh = createECDH("prime256v1");
173
+ ecdh.setPrivateKey(padded);
174
+ const pub = ecdh.getPublicKey(null, "uncompressed"); // 65 bytes: 0x04 || x(32) || y(32)
175
+ const x = Buffer.from(pub.subarray(1, 33)).toString("base64url");
176
+ const y = Buffer.from(pub.subarray(33, 65)).toString("base64url");
177
+ const d = padded.toString("base64url");
178
+ const jwk = { kty: "EC", crv: "P-256", d, x, y };
179
+ return createIdentity(createPrivateKey({ key: jwk, format: "jwk" }), offset);
180
+ }
181
+ catch (error) {
182
+ throw new InvalidIdentityError("invalid private key", { cause: error });
183
+ }
184
+ }
185
+ /**
186
+ * Create an identity at the given security level, at most 160. Each level
187
+ * doubles the expected work; `signal` bounds it, and the event loop keeps
188
+ * running meanwhile.
189
+ */
190
+ export async function generateIdentity(targetLevel, options = {}) {
191
+ checkLevel(targetLevel);
192
+ return createIdentity(generateKey(), 0n).upgradeToLevel(targetLevel, options);
193
+ }
194
+ /**
195
+ * Create an identity at the given security level, at most 160, blocking until
196
+ * done. Fine for a low level; a high one can block the event loop for minutes,
197
+ * so prefer `generateIdentity()` there.
198
+ */
199
+ export function generateIdentitySync(targetLevel) {
200
+ checkLevel(targetLevel);
201
+ const key = generateKey();
202
+ const prefix = createIdentity(key, 0n).publicKey();
203
+ let offset = 0n;
204
+ while (levelAt(prefix, offset) < targetLevel)
205
+ offset++;
206
+ return createIdentity(key, offset);
207
+ }
208
+ function generateKey() {
209
+ return generateKeyPairSync("ec", { namedCurve: "prime256v1" }).privateKey;
210
+ }
211
+ /** Pick the UID hash from a `virtualserver_version` string, e.g. "6.0.0-beta13.1". */
212
+ export function uidAlgorithmForVersion(version) {
213
+ const major = Number.parseInt(version, 10);
214
+ return Number.isNaN(major) || major < 6 ? "sha1" : "sha256";
215
+ }
216
+ /**
217
+ * The unique identifier of a public key in TeamSpeak's encoding, hashed with
218
+ * `algorithm`: SHA-1 for a TeamSpeak 3 server, SHA-256 for TeamSpeak 6.
219
+ */
220
+ export function uidFromPublicKey(publicKey, algorithm) {
221
+ return asUID(createHash(algorithm).update(publicKey).digest("base64"));
222
+ }
223
+ export function hash512(data) {
224
+ return createHash("sha512").update(data).digest();
225
+ }
226
+ // ---- Internal ASN.1 DER helpers for TS3 canonical P-256 public key ----------
227
+ /**
228
+ * Encode a P-256 public key as the TS3 canonical ASN.1 SEQUENCE and return
229
+ * its base64 representation.
230
+ *
231
+ * TS3 canonical format (v3+):
232
+ * SEQUENCE {
233
+ * BIT STRING { unused=7, value=0x00 } — DER: 03 02 07 00
234
+ * INTEGER 32
235
+ * INTEGER x
236
+ * INTEGER y
237
+ * }
238
+ */
239
+ function encodeTsPublicKey(x, y) {
240
+ // BIT STRING with 7 unused bits + value byte 0x00 — matches C# DerBitString(0x00, 7)
241
+ const bitStringBody = Buffer.from([0x07, 0x00]);
242
+ const bitStringDer = encodeDerTlv(0x03, bitStringBody);
243
+ const integerSize = encodeDerTlv(0x02, encodePositiveInt(32));
244
+ const integerX = encodeDerTlv(0x02, encodePositiveInt(x));
245
+ const integerY = encodeDerTlv(0x02, encodePositiveInt(y));
246
+ const seqBody = Buffer.concat([bitStringDer, integerSize, integerX, integerY]);
247
+ const seqDer = encodeDerTlv(0x30, seqBody);
248
+ return seqDer.toString("base64");
249
+ }
250
+ /** Import a TS3 public key (canonical or legacy ASN.1 DER) and return the
251
+ * uncompressed 65-byte point [0x04 || x || y]. */
252
+ export function importPublicKey(data) {
253
+ const point = parseTsPublicKeyDer(data);
254
+ const jwk = {
255
+ kty: "EC",
256
+ crv: "P-256",
257
+ x: Buffer.from(point.slice(1, 33)).toString("base64url"),
258
+ y: Buffer.from(point.slice(33, 65)).toString("base64url"),
259
+ };
260
+ return createPublicKey({ key: jwk, format: "jwk" });
261
+ }
262
+ /**
263
+ * Parse both TS3 canonical and legacy ASN.1 formats and return the
264
+ * uncompressed 65-byte point [0x04 || x || y].
265
+ */
266
+ function parseTsPublicKeyDer(data) {
267
+ // Try canonical: SEQUENCE { BIT_STRING, INTEGER(32), INTEGER(x), INTEGER(y) }
268
+ try {
269
+ return parseTsCanonicalPublicKey(data);
270
+ }
271
+ catch {
272
+ // fall through to legacy
273
+ }
274
+ // Try legacy: SEQUENCE { INTEGER(x), INTEGER(y), BIT_STRING, INTEGER }
275
+ return parseTsLegacyPublicKey(data);
276
+ }
277
+ function parseTsCanonicalPublicKey(data) {
278
+ const seqTlv = parseDerTlv(data, 0x30);
279
+ const seq = seqTlv.value;
280
+ let offset = 0;
281
+ // BIT_STRING
282
+ const bs = parseDerTlv(seq, 0x03, offset);
283
+ offset += bs.consumed;
284
+ // INTEGER (32)
285
+ const sizeInt = parseDerTlv(seq, 0x02, offset);
286
+ offset += sizeInt.consumed;
287
+ // INTEGER x
288
+ const xInt = parseDerTlv(seq, 0x02, offset);
289
+ offset += xInt.consumed;
290
+ // INTEGER y
291
+ const yInt = parseDerTlv(seq, 0x02, offset);
292
+ return buildUncompressedPoint(positiveIntToBytes(xInt.value, P256_SCALAR_SIZE), positiveIntToBytes(yInt.value, P256_SCALAR_SIZE));
293
+ }
294
+ function parseTsLegacyPublicKey(data) {
295
+ const seqTlv = parseDerTlv(data, 0x30);
296
+ const seq = seqTlv.value;
297
+ let offset = 0;
298
+ const xInt = parseDerTlv(seq, 0x02, offset);
299
+ offset += xInt.consumed;
300
+ const yInt = parseDerTlv(seq, 0x02, offset);
301
+ return buildUncompressedPoint(positiveIntToBytes(xInt.value, P256_SCALAR_SIZE), positiveIntToBytes(yInt.value, P256_SCALAR_SIZE));
302
+ }
303
+ function buildUncompressedPoint(x, y) {
304
+ if (x.length > P256_SCALAR_SIZE || y.length > P256_SCALAR_SIZE) {
305
+ throw new Error("invalid public key point encoding");
306
+ }
307
+ const point = new Uint8Array(P256_UNCOMPRESSED_KEY_SIZE);
308
+ point[0] = P256_POINT_PREFIX;
309
+ point.set(x, 1 + P256_SCALAR_SIZE - x.length);
310
+ point.set(y, 1 + 2 * P256_SCALAR_SIZE - y.length);
311
+ return point;
312
+ }
313
+ // ---- DER encoding helpers ---------------------------------------------------
314
+ function encodeDerTlv(tag, value) {
315
+ const lenBytes = encodeDerLength(value.length);
316
+ return Buffer.concat([Buffer.from([tag]), lenBytes, value]);
317
+ }
318
+ function encodeDerLength(len) {
319
+ if (len < 128)
320
+ return Buffer.from([len]);
321
+ if (len < 256)
322
+ return Buffer.from([0x81, len]);
323
+ return Buffer.from([0x82, (len >> 8) & 0xff, len & 0xff]);
324
+ }
325
+ /** Encode a non-negative value as a DER INTEGER (with 0x00 prefix if high bit set). */
326
+ function encodePositiveInt(v) {
327
+ if (typeof v === "number") {
328
+ const bytes = [];
329
+ let n = v;
330
+ do {
331
+ bytes.unshift(n & 0xff);
332
+ n >>= 8;
333
+ } while (n > 0);
334
+ if ((bytes[0] & 0x80) !== 0)
335
+ bytes.unshift(0x00);
336
+ return Buffer.from(bytes);
337
+ }
338
+ // Uint8Array — strip leading zeros, add 0x00 if high bit set
339
+ let start = 0;
340
+ while (start < v.length - 1 && v[start] === 0)
341
+ start++;
342
+ const trimmed = v.slice(start);
343
+ if ((trimmed[0] & 0x80) !== 0) {
344
+ return Buffer.concat([Buffer.from([0x00]), trimmed]);
345
+ }
346
+ return Buffer.from(trimmed);
347
+ }
348
+ function parseDerTlv(data, expectedTag, offset = 0) {
349
+ if (data[offset] !== expectedTag) {
350
+ throw new Error(`expected DER tag 0x${expectedTag.toString(16)}, got 0x${(data[offset] ?? 0).toString(16)}`);
351
+ }
352
+ let pos = offset + 1;
353
+ let len;
354
+ const firstLenByte = data[pos++];
355
+ if (firstLenByte < 0x80) {
356
+ len = firstLenByte;
357
+ }
358
+ else if (firstLenByte === 0x81) {
359
+ len = data[pos++];
360
+ }
361
+ else if (firstLenByte === 0x82) {
362
+ len = ((data[pos] << 8) | data[pos + 1]) >>> 0;
363
+ pos += 2;
364
+ }
365
+ else {
366
+ throw new Error("unsupported DER length encoding");
367
+ }
368
+ const value = data.slice(pos, pos + len);
369
+ return { value, consumed: pos - offset + len };
370
+ }
371
+ /** Convert a DER INTEGER value (may have leading 0x00) to fixed-length bytes. */
372
+ function positiveIntToBytes(int, size) {
373
+ // Strip leading 0x00 sign byte
374
+ let start = 0;
375
+ while (start < int.length - 1 && int[start] === 0x00)
376
+ start++;
377
+ const stripped = int.slice(start);
378
+ if (stripped.length > size)
379
+ throw new Error("integer too large");
380
+ if (stripped.length === size)
381
+ return stripped;
382
+ const padded = new Uint8Array(size);
383
+ padded.set(stripped, size - stripped.length);
384
+ return padded;
385
+ }
386
+ // ---- Misc helpers -----------------------------------------------------------
387
+ function base64UrlToBytes(b64url, size) {
388
+ const buf = Buffer.from(b64url, "base64url");
389
+ if (buf.length === size)
390
+ return buf;
391
+ const padded = Buffer.alloc(size);
392
+ buf.copy(padded, size - buf.length);
393
+ return padded;
394
+ }
395
+ function countLeadingZeros(data) {
396
+ let zeros = 0;
397
+ for (const b of data) {
398
+ if (b === 0) {
399
+ zeros += 8;
400
+ }
401
+ else {
402
+ for (let i = 0; i < 8; i++) {
403
+ if ((b & (1 << i)) === 0)
404
+ zeros++;
405
+ else
406
+ return zeros;
407
+ }
408
+ }
409
+ }
410
+ return zeros;
411
+ }
412
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/client/crypto/identity.ts"],"names":[],"mappings":"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"}