@mtcute/core 0.1.0 → 0.1.2

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 (461) hide show
  1. package/cjs/base-client.js +4 -1
  2. package/cjs/base-client.js.map +1 -1
  3. package/cjs/network/auth-key.d.ts +3 -3
  4. package/cjs/network/auth-key.js +12 -12
  5. package/cjs/network/auth-key.js.map +1 -1
  6. package/cjs/network/auth-key.test.d.ts +1 -0
  7. package/cjs/network/auth-key.test.js +111 -0
  8. package/cjs/network/auth-key.test.js.map +1 -0
  9. package/cjs/network/authorization.js +62 -57
  10. package/cjs/network/authorization.js.map +1 -1
  11. package/cjs/network/config-manager.js +2 -1
  12. package/cjs/network/config-manager.js.map +1 -1
  13. package/cjs/network/config-manager.test.d.ts +1 -0
  14. package/cjs/network/config-manager.test.js +170 -0
  15. package/cjs/network/config-manager.test.js.map +1 -0
  16. package/cjs/network/mtproto-session.d.ts +2 -2
  17. package/cjs/network/mtproto-session.js +2 -2
  18. package/cjs/network/mtproto-session.js.map +1 -1
  19. package/cjs/network/multi-session-connection.d.ts +1 -1
  20. package/cjs/network/multi-session-connection.js +2 -2
  21. package/cjs/network/multi-session-connection.js.map +1 -1
  22. package/cjs/network/network-manager.d.ts +1 -0
  23. package/cjs/network/network-manager.js +21 -27
  24. package/cjs/network/network-manager.js.map +1 -1
  25. package/cjs/network/persistent-connection.test.d.ts +1 -0
  26. package/cjs/network/persistent-connection.test.js +157 -0
  27. package/cjs/network/persistent-connection.test.js.map +1 -0
  28. package/cjs/network/session-connection.d.ts +2 -1
  29. package/cjs/network/session-connection.js +51 -37
  30. package/cjs/network/session-connection.js.map +1 -1
  31. package/cjs/network/transports/intermediate.d.ts +3 -0
  32. package/cjs/network/transports/intermediate.js +5 -3
  33. package/cjs/network/transports/intermediate.js.map +1 -1
  34. package/cjs/network/transports/intermediate.test.d.ts +1 -0
  35. package/cjs/network/transports/intermediate.test.js +86 -0
  36. package/cjs/network/transports/intermediate.test.js.map +1 -0
  37. package/cjs/network/transports/obfuscated.js +15 -19
  38. package/cjs/network/transports/obfuscated.js.map +1 -1
  39. package/cjs/network/transports/obfuscated.test.d.ts +1 -0
  40. package/cjs/network/transports/obfuscated.test.js +131 -0
  41. package/cjs/network/transports/obfuscated.test.js.map +1 -0
  42. package/cjs/network/transports/tcp.js +1 -1
  43. package/cjs/network/transports/tcp.js.map +1 -1
  44. package/cjs/network/transports/tcp.test.d.ts +1 -0
  45. package/cjs/network/transports/tcp.test.js +97 -0
  46. package/cjs/network/transports/tcp.test.js.map +1 -0
  47. package/cjs/network/transports/websocket.test.d.ts +1 -0
  48. package/cjs/network/transports/websocket.test.js +91 -0
  49. package/cjs/network/transports/websocket.test.js.map +1 -0
  50. package/cjs/storage/abstract.d.ts +23 -2
  51. package/cjs/storage/abstract.js.map +1 -1
  52. package/cjs/storage/json.js +8 -9
  53. package/cjs/storage/json.js.map +1 -1
  54. package/cjs/storage/json.test.d.ts +1 -0
  55. package/cjs/storage/json.test.js +37 -0
  56. package/cjs/storage/json.test.js.map +1 -0
  57. package/cjs/storage/localstorage.js +5 -2
  58. package/cjs/storage/localstorage.js.map +1 -1
  59. package/cjs/storage/localstorage.test.d.ts +1 -0
  60. package/cjs/storage/localstorage.test.js +23 -0
  61. package/cjs/storage/localstorage.test.js.map +1 -0
  62. package/cjs/storage/memory.d.ts +7 -8
  63. package/cjs/storage/memory.js +7 -7
  64. package/cjs/storage/memory.js.map +1 -1
  65. package/cjs/storage/memory.test.d.ts +1 -0
  66. package/cjs/storage/memory.test.js +47 -0
  67. package/cjs/storage/memory.test.js.map +1 -0
  68. package/cjs/utils/async-lock.test.d.ts +1 -0
  69. package/cjs/utils/async-lock.test.js +25 -0
  70. package/cjs/utils/async-lock.test.js.map +1 -0
  71. package/cjs/utils/bigint-utils.d.ts +18 -11
  72. package/cjs/utils/bigint-utils.js +148 -47
  73. package/cjs/utils/bigint-utils.js.map +1 -1
  74. package/cjs/utils/bigint-utils.test.d.ts +1 -0
  75. package/cjs/utils/bigint-utils.test.js +150 -0
  76. package/cjs/utils/bigint-utils.test.js.map +1 -0
  77. package/cjs/utils/buffer-utils.d.ts +7 -1
  78. package/cjs/utils/buffer-utils.js +16 -3
  79. package/cjs/utils/buffer-utils.js.map +1 -1
  80. package/cjs/utils/buffer-utils.test.d.ts +1 -0
  81. package/cjs/utils/buffer-utils.test.js +69 -0
  82. package/cjs/utils/buffer-utils.test.js.map +1 -0
  83. package/cjs/utils/condition-variable.test.d.ts +1 -0
  84. package/cjs/utils/condition-variable.test.js +27 -0
  85. package/cjs/utils/condition-variable.test.js.map +1 -0
  86. package/cjs/utils/controllable-promise.test.d.ts +1 -0
  87. package/cjs/utils/controllable-promise.test.js +17 -0
  88. package/cjs/utils/controllable-promise.test.js.map +1 -0
  89. package/cjs/utils/crypto/abstract.d.ts +16 -9
  90. package/cjs/utils/crypto/abstract.js +6 -9
  91. package/cjs/utils/crypto/abstract.js.map +1 -1
  92. package/cjs/utils/crypto/factorization.d.ts +2 -1
  93. package/cjs/utils/crypto/factorization.js +28 -36
  94. package/cjs/utils/crypto/factorization.js.map +1 -1
  95. package/cjs/utils/crypto/index.d.ts +4 -0
  96. package/cjs/utils/crypto/index.js +4 -0
  97. package/cjs/utils/crypto/index.js.map +1 -1
  98. package/cjs/utils/crypto/keys.d.ts +2 -2
  99. package/cjs/utils/crypto/keys.js +4 -4
  100. package/cjs/utils/crypto/keys.js.map +1 -1
  101. package/cjs/utils/crypto/keys.test.d.ts +1 -0
  102. package/cjs/utils/crypto/keys.test.js +40 -0
  103. package/cjs/utils/crypto/keys.test.js.map +1 -0
  104. package/cjs/utils/crypto/miller-rabin.d.ts +2 -2
  105. package/cjs/utils/crypto/miller-rabin.js +20 -22
  106. package/cjs/utils/crypto/miller-rabin.js.map +1 -1
  107. package/cjs/utils/crypto/miller-rabin.test.d.ts +1 -0
  108. package/cjs/utils/crypto/miller-rabin.test.js +60 -0
  109. package/cjs/utils/crypto/miller-rabin.test.js.map +1 -0
  110. package/cjs/utils/crypto/mtproto.d.ts +3 -3
  111. package/cjs/utils/crypto/mtproto.js +12 -12
  112. package/cjs/utils/crypto/mtproto.js.map +1 -1
  113. package/cjs/utils/crypto/mtproto.test.d.ts +1 -0
  114. package/cjs/utils/crypto/mtproto.test.js +47 -0
  115. package/cjs/utils/crypto/mtproto.test.js.map +1 -0
  116. package/cjs/utils/crypto/node.d.ts +21 -0
  117. package/cjs/utils/crypto/node.js +74 -0
  118. package/cjs/utils/crypto/node.js.map +1 -0
  119. package/cjs/utils/crypto/node.test.d.ts +1 -0
  120. package/cjs/utils/crypto/node.test.js +13 -0
  121. package/cjs/utils/crypto/node.test.js.map +1 -0
  122. package/cjs/utils/crypto/password.js +22 -33
  123. package/cjs/utils/crypto/password.js.map +1 -1
  124. package/cjs/utils/crypto/password.test.d.ts +1 -0
  125. package/cjs/utils/crypto/password.test.js +95 -0
  126. package/cjs/utils/crypto/password.test.js.map +1 -0
  127. package/cjs/utils/crypto/utils.test.d.ts +1 -0
  128. package/cjs/utils/crypto/utils.test.js +49 -0
  129. package/cjs/utils/crypto/utils.test.js.map +1 -0
  130. package/cjs/utils/crypto/wasm.d.ts +22 -0
  131. package/cjs/utils/crypto/wasm.js +41 -0
  132. package/cjs/utils/crypto/wasm.js.map +1 -0
  133. package/cjs/utils/crypto/web.d.ts +11 -0
  134. package/cjs/utils/crypto/web.js +40 -0
  135. package/cjs/utils/crypto/web.js.map +1 -0
  136. package/cjs/utils/crypto/web.test.d.ts +1 -0
  137. package/cjs/utils/crypto/web.test.js +17 -0
  138. package/cjs/utils/crypto/web.test.js.map +1 -0
  139. package/cjs/utils/deque.d.ts +1 -1
  140. package/cjs/utils/deque.js +9 -3
  141. package/cjs/utils/deque.js.map +1 -1
  142. package/cjs/utils/deque.test.d.ts +1 -0
  143. package/cjs/utils/deque.test.js +128 -0
  144. package/cjs/utils/deque.test.js.map +1 -0
  145. package/cjs/utils/function-utils.d.ts +4 -1
  146. package/cjs/utils/function-utils.js +8 -1
  147. package/cjs/utils/function-utils.js.map +1 -1
  148. package/cjs/utils/function-utils.test.d.ts +1 -0
  149. package/cjs/utils/function-utils.test.js +23 -0
  150. package/cjs/utils/function-utils.test.js.map +1 -0
  151. package/cjs/utils/index.d.ts +0 -1
  152. package/cjs/utils/index.js +0 -1
  153. package/cjs/utils/index.js.map +1 -1
  154. package/cjs/utils/linked-list.test.d.ts +1 -0
  155. package/cjs/utils/linked-list.test.js +36 -0
  156. package/cjs/utils/linked-list.test.js.map +1 -0
  157. package/cjs/utils/links/bots.test.d.ts +1 -0
  158. package/cjs/utils/links/bots.test.js +152 -0
  159. package/cjs/utils/links/bots.test.js.map +1 -0
  160. package/cjs/utils/links/chat.test.d.ts +1 -0
  161. package/cjs/utils/links/chat.test.js +84 -0
  162. package/cjs/utils/links/chat.test.js.map +1 -0
  163. package/cjs/utils/links/misc.test.d.ts +1 -0
  164. package/cjs/utils/links/misc.test.js +153 -0
  165. package/cjs/utils/links/misc.test.js.map +1 -0
  166. package/cjs/utils/links/proxy.test.d.ts +1 -0
  167. package/cjs/utils/links/proxy.test.js +74 -0
  168. package/cjs/utils/links/proxy.test.js.map +1 -0
  169. package/cjs/utils/links/user.test.d.ts +1 -0
  170. package/cjs/utils/links/user.test.js +63 -0
  171. package/cjs/utils/links/user.test.js.map +1 -0
  172. package/cjs/utils/logger.d.ts +0 -1
  173. package/cjs/utils/logger.js +3 -4
  174. package/cjs/utils/logger.js.map +1 -1
  175. package/cjs/utils/logger.test.d.ts +1 -0
  176. package/cjs/utils/logger.test.js +125 -0
  177. package/cjs/utils/logger.test.js.map +1 -0
  178. package/cjs/utils/long-utils.test.d.ts +1 -0
  179. package/cjs/utils/long-utils.test.js +158 -0
  180. package/cjs/utils/long-utils.test.js.map +1 -0
  181. package/cjs/utils/lru-map.d.ts +1 -0
  182. package/cjs/utils/lru-map.js +6 -0
  183. package/cjs/utils/lru-map.js.map +1 -1
  184. package/cjs/utils/lru-map.test.d.ts +1 -0
  185. package/cjs/utils/lru-map.test.js +96 -0
  186. package/cjs/utils/lru-map.test.js.map +1 -0
  187. package/cjs/utils/lru-set.test.d.ts +1 -0
  188. package/cjs/utils/lru-set.test.js +77 -0
  189. package/cjs/utils/lru-set.test.js.map +1 -0
  190. package/cjs/utils/peer-utils.js +5 -1
  191. package/cjs/utils/peer-utils.js.map +1 -1
  192. package/cjs/utils/peer-utils.test.d.ts +1 -0
  193. package/cjs/utils/peer-utils.test.js +122 -0
  194. package/cjs/utils/peer-utils.test.js.map +1 -0
  195. package/cjs/utils/platform/crypto.js +2 -2
  196. package/cjs/utils/platform/crypto.js.map +1 -1
  197. package/cjs/utils/platform/crypto.web.js +2 -2
  198. package/cjs/utils/platform/crypto.web.js.map +1 -1
  199. package/cjs/utils/sorted-array.test.d.ts +1 -0
  200. package/cjs/utils/sorted-array.test.js +66 -0
  201. package/cjs/utils/sorted-array.test.js.map +1 -0
  202. package/cjs/utils/string-session.js +4 -2
  203. package/cjs/utils/string-session.js.map +1 -1
  204. package/cjs/utils/string-session.test.d.ts +1 -0
  205. package/cjs/utils/string-session.test.js +106 -0
  206. package/cjs/utils/string-session.test.js.map +1 -0
  207. package/cjs/utils/tl-json.test.d.ts +1 -0
  208. package/cjs/utils/tl-json.test.js +83 -0
  209. package/cjs/utils/tl-json.test.js.map +1 -0
  210. package/cjs/utils/type-assertions.test.d.ts +1 -0
  211. package/cjs/utils/type-assertions.test.js +67 -0
  212. package/cjs/utils/type-assertions.test.js.map +1 -0
  213. package/esm/base-client.js +4 -1
  214. package/esm/base-client.js.map +1 -1
  215. package/esm/network/auth-key.d.ts +3 -3
  216. package/esm/network/auth-key.js +13 -13
  217. package/esm/network/auth-key.js.map +1 -1
  218. package/esm/network/auth-key.test.d.ts +1 -0
  219. package/esm/network/auth-key.test.js +106 -0
  220. package/esm/network/auth-key.test.js.map +1 -0
  221. package/esm/network/authorization.js +64 -59
  222. package/esm/network/authorization.js.map +1 -1
  223. package/esm/network/config-manager.js +2 -1
  224. package/esm/network/config-manager.js.map +1 -1
  225. package/esm/network/config-manager.test.d.ts +1 -0
  226. package/esm/network/config-manager.test.js +168 -0
  227. package/esm/network/config-manager.test.js.map +1 -0
  228. package/esm/network/mtproto-session.d.ts +2 -2
  229. package/esm/network/mtproto-session.js +2 -2
  230. package/esm/network/mtproto-session.js.map +1 -1
  231. package/esm/network/multi-session-connection.d.ts +1 -1
  232. package/esm/network/multi-session-connection.js +2 -2
  233. package/esm/network/multi-session-connection.js.map +1 -1
  234. package/esm/network/network-manager.d.ts +1 -0
  235. package/esm/network/network-manager.js +21 -27
  236. package/esm/network/network-manager.js.map +1 -1
  237. package/esm/network/persistent-connection.test.d.ts +1 -0
  238. package/esm/network/persistent-connection.test.js +155 -0
  239. package/esm/network/persistent-connection.test.js.map +1 -0
  240. package/esm/network/session-connection.d.ts +2 -1
  241. package/esm/network/session-connection.js +53 -39
  242. package/esm/network/session-connection.js.map +1 -1
  243. package/esm/network/transports/intermediate.d.ts +3 -0
  244. package/esm/network/transports/intermediate.js +6 -4
  245. package/esm/network/transports/intermediate.js.map +1 -1
  246. package/esm/network/transports/intermediate.test.d.ts +1 -0
  247. package/esm/network/transports/intermediate.test.js +84 -0
  248. package/esm/network/transports/intermediate.test.js.map +1 -0
  249. package/esm/network/transports/obfuscated.js +16 -20
  250. package/esm/network/transports/obfuscated.js.map +1 -1
  251. package/esm/network/transports/obfuscated.test.d.ts +1 -0
  252. package/esm/network/transports/obfuscated.test.js +129 -0
  253. package/esm/network/transports/obfuscated.test.js.map +1 -0
  254. package/esm/network/transports/tcp.js +1 -1
  255. package/esm/network/transports/tcp.js.map +1 -1
  256. package/esm/network/transports/tcp.test.d.ts +1 -0
  257. package/esm/network/transports/tcp.test.js +95 -0
  258. package/esm/network/transports/tcp.test.js.map +1 -0
  259. package/esm/network/transports/websocket.test.d.ts +1 -0
  260. package/esm/network/transports/websocket.test.js +89 -0
  261. package/esm/network/transports/websocket.test.js.map +1 -0
  262. package/esm/storage/abstract.d.ts +23 -2
  263. package/esm/storage/abstract.js.map +1 -1
  264. package/esm/storage/json.js +8 -9
  265. package/esm/storage/json.js.map +1 -1
  266. package/esm/storage/json.test.d.ts +1 -0
  267. package/esm/storage/json.test.js +35 -0
  268. package/esm/storage/json.test.js.map +1 -0
  269. package/esm/storage/localstorage.js +5 -2
  270. package/esm/storage/localstorage.js.map +1 -1
  271. package/esm/storage/localstorage.test.d.ts +1 -0
  272. package/esm/storage/localstorage.test.js +21 -0
  273. package/esm/storage/localstorage.test.js.map +1 -0
  274. package/esm/storage/memory.d.ts +7 -8
  275. package/esm/storage/memory.js +7 -7
  276. package/esm/storage/memory.js.map +1 -1
  277. package/esm/storage/memory.test.d.ts +1 -0
  278. package/esm/storage/memory.test.js +45 -0
  279. package/esm/storage/memory.test.js.map +1 -0
  280. package/esm/utils/async-lock.test.d.ts +1 -0
  281. package/esm/utils/async-lock.test.js +23 -0
  282. package/esm/utils/async-lock.test.js.map +1 -0
  283. package/esm/utils/bigint-utils.d.ts +18 -11
  284. package/esm/utils/bigint-utils.js +142 -44
  285. package/esm/utils/bigint-utils.js.map +1 -1
  286. package/esm/utils/bigint-utils.test.d.ts +1 -0
  287. package/esm/utils/bigint-utils.test.js +148 -0
  288. package/esm/utils/bigint-utils.test.js.map +1 -0
  289. package/esm/utils/buffer-utils.d.ts +7 -1
  290. package/esm/utils/buffer-utils.js +14 -1
  291. package/esm/utils/buffer-utils.js.map +1 -1
  292. package/esm/utils/buffer-utils.test.d.ts +1 -0
  293. package/esm/utils/buffer-utils.test.js +67 -0
  294. package/esm/utils/buffer-utils.test.js.map +1 -0
  295. package/esm/utils/condition-variable.test.d.ts +1 -0
  296. package/esm/utils/condition-variable.test.js +25 -0
  297. package/esm/utils/condition-variable.test.js.map +1 -0
  298. package/esm/utils/controllable-promise.test.d.ts +1 -0
  299. package/esm/utils/controllable-promise.test.js +15 -0
  300. package/esm/utils/controllable-promise.test.js.map +1 -0
  301. package/esm/utils/crypto/abstract.d.ts +16 -9
  302. package/esm/utils/crypto/abstract.js +6 -9
  303. package/esm/utils/crypto/abstract.js.map +1 -1
  304. package/esm/utils/crypto/factorization.d.ts +2 -1
  305. package/esm/utils/crypto/factorization.js +29 -34
  306. package/esm/utils/crypto/factorization.js.map +1 -1
  307. package/esm/utils/crypto/index.d.ts +4 -0
  308. package/esm/utils/crypto/index.js +4 -0
  309. package/esm/utils/crypto/index.js.map +1 -1
  310. package/esm/utils/crypto/keys.d.ts +2 -2
  311. package/esm/utils/crypto/keys.js +4 -4
  312. package/esm/utils/crypto/keys.js.map +1 -1
  313. package/esm/utils/crypto/keys.test.d.ts +1 -0
  314. package/esm/utils/crypto/keys.test.js +38 -0
  315. package/esm/utils/crypto/keys.test.js.map +1 -0
  316. package/esm/utils/crypto/miller-rabin.d.ts +2 -2
  317. package/esm/utils/crypto/miller-rabin.js +21 -20
  318. package/esm/utils/crypto/miller-rabin.js.map +1 -1
  319. package/esm/utils/crypto/miller-rabin.test.d.ts +1 -0
  320. package/esm/utils/crypto/miller-rabin.test.js +58 -0
  321. package/esm/utils/crypto/miller-rabin.test.js.map +1 -0
  322. package/esm/utils/crypto/mtproto.d.ts +3 -3
  323. package/esm/utils/crypto/mtproto.js +12 -12
  324. package/esm/utils/crypto/mtproto.js.map +1 -1
  325. package/esm/utils/crypto/mtproto.test.d.ts +1 -0
  326. package/esm/utils/crypto/mtproto.test.js +45 -0
  327. package/esm/utils/crypto/mtproto.test.js.map +1 -0
  328. package/esm/utils/crypto/node.d.ts +21 -0
  329. package/esm/utils/crypto/node.js +69 -0
  330. package/esm/utils/crypto/node.js.map +1 -0
  331. package/esm/utils/crypto/node.test.d.ts +1 -0
  332. package/esm/utils/crypto/node.test.js +11 -0
  333. package/esm/utils/crypto/node.test.js.map +1 -0
  334. package/esm/utils/crypto/password.js +24 -32
  335. package/esm/utils/crypto/password.js.map +1 -1
  336. package/esm/utils/crypto/password.test.d.ts +1 -0
  337. package/esm/utils/crypto/password.test.js +90 -0
  338. package/esm/utils/crypto/password.test.js.map +1 -0
  339. package/esm/utils/crypto/utils.test.d.ts +1 -0
  340. package/esm/utils/crypto/utils.test.js +47 -0
  341. package/esm/utils/crypto/utils.test.js.map +1 -0
  342. package/esm/utils/crypto/wasm.d.ts +22 -0
  343. package/esm/utils/crypto/wasm.js +37 -0
  344. package/esm/utils/crypto/wasm.js.map +1 -0
  345. package/esm/utils/crypto/web.d.ts +11 -0
  346. package/esm/utils/crypto/web.js +36 -0
  347. package/esm/utils/crypto/web.js.map +1 -0
  348. package/esm/utils/crypto/web.test.d.ts +1 -0
  349. package/esm/utils/crypto/web.test.js +15 -0
  350. package/esm/utils/crypto/web.test.js.map +1 -0
  351. package/esm/utils/deque.d.ts +1 -1
  352. package/esm/utils/deque.js +9 -3
  353. package/esm/utils/deque.js.map +1 -1
  354. package/esm/utils/deque.test.d.ts +1 -0
  355. package/esm/utils/deque.test.js +126 -0
  356. package/esm/utils/deque.test.js.map +1 -0
  357. package/esm/utils/function-utils.d.ts +4 -1
  358. package/esm/utils/function-utils.js +8 -1
  359. package/esm/utils/function-utils.js.map +1 -1
  360. package/esm/utils/function-utils.test.d.ts +1 -0
  361. package/esm/utils/function-utils.test.js +21 -0
  362. package/esm/utils/function-utils.test.js.map +1 -0
  363. package/esm/utils/index.d.ts +0 -1
  364. package/esm/utils/index.js +0 -1
  365. package/esm/utils/index.js.map +1 -1
  366. package/esm/utils/linked-list.test.d.ts +1 -0
  367. package/esm/utils/linked-list.test.js +34 -0
  368. package/esm/utils/linked-list.test.js.map +1 -0
  369. package/esm/utils/links/bots.test.d.ts +1 -0
  370. package/esm/utils/links/bots.test.js +150 -0
  371. package/esm/utils/links/bots.test.js.map +1 -0
  372. package/esm/utils/links/chat.test.d.ts +1 -0
  373. package/esm/utils/links/chat.test.js +82 -0
  374. package/esm/utils/links/chat.test.js.map +1 -0
  375. package/esm/utils/links/misc.test.d.ts +1 -0
  376. package/esm/utils/links/misc.test.js +151 -0
  377. package/esm/utils/links/misc.test.js.map +1 -0
  378. package/esm/utils/links/proxy.test.d.ts +1 -0
  379. package/esm/utils/links/proxy.test.js +72 -0
  380. package/esm/utils/links/proxy.test.js.map +1 -0
  381. package/esm/utils/links/user.test.d.ts +1 -0
  382. package/esm/utils/links/user.test.js +61 -0
  383. package/esm/utils/links/user.test.js.map +1 -0
  384. package/esm/utils/logger.d.ts +0 -1
  385. package/esm/utils/logger.js +3 -4
  386. package/esm/utils/logger.js.map +1 -1
  387. package/esm/utils/logger.test.d.ts +1 -0
  388. package/esm/utils/logger.test.js +120 -0
  389. package/esm/utils/logger.test.js.map +1 -0
  390. package/esm/utils/long-utils.test.d.ts +1 -0
  391. package/esm/utils/long-utils.test.js +153 -0
  392. package/esm/utils/long-utils.test.js.map +1 -0
  393. package/esm/utils/lru-map.d.ts +1 -0
  394. package/esm/utils/lru-map.js +6 -0
  395. package/esm/utils/lru-map.js.map +1 -1
  396. package/esm/utils/lru-map.test.d.ts +1 -0
  397. package/esm/utils/lru-map.test.js +94 -0
  398. package/esm/utils/lru-map.test.js.map +1 -0
  399. package/esm/utils/lru-set.test.d.ts +1 -0
  400. package/esm/utils/lru-set.test.js +72 -0
  401. package/esm/utils/lru-set.test.js.map +1 -0
  402. package/esm/utils/peer-utils.js +5 -1
  403. package/esm/utils/peer-utils.js.map +1 -1
  404. package/esm/utils/peer-utils.test.d.ts +1 -0
  405. package/esm/utils/peer-utils.test.js +117 -0
  406. package/esm/utils/peer-utils.test.js.map +1 -0
  407. package/esm/utils/platform/crypto.js +1 -1
  408. package/esm/utils/platform/crypto.js.map +1 -1
  409. package/esm/utils/platform/crypto.web.js +2 -2
  410. package/esm/utils/platform/crypto.web.js.map +1 -1
  411. package/esm/utils/sorted-array.test.d.ts +1 -0
  412. package/esm/utils/sorted-array.test.js +64 -0
  413. package/esm/utils/sorted-array.test.js.map +1 -0
  414. package/esm/utils/string-session.js +4 -2
  415. package/esm/utils/string-session.js.map +1 -1
  416. package/esm/utils/string-session.test.d.ts +1 -0
  417. package/esm/utils/string-session.test.js +104 -0
  418. package/esm/utils/string-session.test.js.map +1 -0
  419. package/esm/utils/tl-json.test.d.ts +1 -0
  420. package/esm/utils/tl-json.test.js +81 -0
  421. package/esm/utils/tl-json.test.js.map +1 -0
  422. package/esm/utils/type-assertions.test.d.ts +1 -0
  423. package/esm/utils/type-assertions.test.js +65 -0
  424. package/esm/utils/type-assertions.test.js.map +1 -0
  425. package/package.json +4 -5
  426. package/cjs/utils/crypto/common.d.ts +0 -12
  427. package/cjs/utils/crypto/common.js +0 -54
  428. package/cjs/utils/crypto/common.js.map +0 -1
  429. package/cjs/utils/crypto/node-crypto.d.ts +0 -10
  430. package/cjs/utils/crypto/node-crypto.js +0 -46
  431. package/cjs/utils/crypto/node-crypto.js.map +0 -1
  432. package/cjs/utils/crypto/subtle.d.ts +0 -12
  433. package/cjs/utils/crypto/subtle.js +0 -86
  434. package/cjs/utils/crypto/subtle.js.map +0 -1
  435. package/cjs/utils/flood-control.d.ts +0 -14
  436. package/cjs/utils/flood-control.js +0 -65
  437. package/cjs/utils/flood-control.js.map +0 -1
  438. package/cjs/utils/platform/random.d.ts +0 -1
  439. package/cjs/utils/platform/random.js +0 -7
  440. package/cjs/utils/platform/random.js.map +0 -1
  441. package/cjs/utils/platform/random.web.d.ts +0 -1
  442. package/cjs/utils/platform/random.web.js +0 -10
  443. package/cjs/utils/platform/random.web.js.map +0 -1
  444. package/esm/utils/crypto/common.d.ts +0 -12
  445. package/esm/utils/crypto/common.js +0 -50
  446. package/esm/utils/crypto/common.js.map +0 -1
  447. package/esm/utils/crypto/node-crypto.d.ts +0 -10
  448. package/esm/utils/crypto/node-crypto.js +0 -42
  449. package/esm/utils/crypto/node-crypto.js.map +0 -1
  450. package/esm/utils/crypto/subtle.d.ts +0 -12
  451. package/esm/utils/crypto/subtle.js +0 -59
  452. package/esm/utils/crypto/subtle.js.map +0 -1
  453. package/esm/utils/flood-control.d.ts +0 -14
  454. package/esm/utils/flood-control.js +0 -61
  455. package/esm/utils/flood-control.js.map +0 -1
  456. package/esm/utils/platform/random.d.ts +0 -1
  457. package/esm/utils/platform/random.js +0 -4
  458. package/esm/utils/platform/random.js.map +0 -1
  459. package/esm/utils/platform/random.web.d.ts +0 -1
  460. package/esm/utils/platform/random.web.js +0 -6
  461. package/esm/utils/platform/random.web.js.map +0 -1
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.doAuthorization = void 0;
7
- const big_integer_1 = __importDefault(require("big-integer"));
8
7
  const long_1 = __importDefault(require("long"));
9
8
  const tl_1 = require("@mtcute/tl");
10
9
  const tl_runtime_1 = require("@mtcute/tl-runtime");
@@ -18,25 +17,28 @@ const index_js_2 = require("../utils/index.js");
18
17
  const type_assertions_js_1 = require("../utils/type-assertions.js");
19
18
  // Heavily based on code from https://github.com/LonamiWebs/Telethon/blob/master/telethon/network/authenticator.py
20
19
  // see https://core.telegram.org/mtproto/security_guidelines
21
- const DH_SAFETY_RANGE = big_integer_1.default[2].pow(2048 - 64);
22
- const KNOWN_DH_PRIME = (0, big_integer_1.default)('C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5B', 16);
23
- const TWO_POW_2047 = big_integer_1.default[2].pow(2047);
24
- const TWO_POW_2048 = big_integer_1.default[2].pow(2048);
20
+ // const DH_SAFETY_RANGE = bigInt[2].pow(2048 - 64)
21
+ const DH_SAFETY_RANGE = 2n ** (2048n - 64n);
22
+ const KNOWN_DH_PRIME =
23
+ // eslint-disable-next-line max-len
24
+ 0xc71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5bn;
25
+ const TWO_POW_2047 = 2n ** 2047n;
26
+ const TWO_POW_2048 = 2n ** 2048n;
25
27
  const checkedPrimesCache = [];
26
- function checkDhPrime(log, dhPrime, g) {
27
- if (KNOWN_DH_PRIME.eq(dhPrime)) {
28
+ function checkDhPrime(crypto, log, dhPrime, g) {
29
+ if (KNOWN_DH_PRIME === dhPrime) {
28
30
  log.debug('server is using known dh prime, skipping validation');
29
31
  return;
30
32
  }
31
- let checkedPrime = checkedPrimesCache.find((x) => x.prime.eq(dhPrime));
33
+ let checkedPrime = checkedPrimesCache.find((x) => x.prime === dhPrime);
32
34
  if (!checkedPrime) {
33
- if (dhPrime.lesserOrEquals(TWO_POW_2047) || dhPrime.greaterOrEquals(TWO_POW_2048)) {
35
+ if (dhPrime <= TWO_POW_2047 || dhPrime >= TWO_POW_2048) {
34
36
  throw new index_js_1.MtSecurityError('Step 3: dh_prime is not in the 2048-bit range');
35
37
  }
36
- if (!(0, miller_rabin_js_1.millerRabin)(dhPrime)) {
38
+ if (!(0, miller_rabin_js_1.millerRabin)(crypto, dhPrime)) {
37
39
  throw new index_js_1.MtSecurityError('Step 3: dh_prime is not prime');
38
40
  }
39
- if (!(0, miller_rabin_js_1.millerRabin)(dhPrime.minus(1).divide(2))) {
41
+ if (!(0, miller_rabin_js_1.millerRabin)(crypto, (dhPrime - 1n) / 2n)) {
40
42
  throw new index_js_1.MtSecurityError('Step 3: dh_prime is not a safe prime - (dh_prime-1)/2 is not prime');
41
43
  }
42
44
  log.debug('dh_prime is probably prime');
@@ -56,34 +58,34 @@ function checkDhPrime(log, dhPrime, g) {
56
58
  }
57
59
  switch (g) {
58
60
  case 2:
59
- if (dhPrime.mod(8).notEquals(7)) {
61
+ if (dhPrime % 8n !== 7n) {
60
62
  throw new index_js_1.MtSecurityError('Step 3: ivalid g - dh_prime mod 8 != 7');
61
63
  }
62
64
  break;
63
65
  case 3:
64
- if (dhPrime.mod(3).notEquals(2)) {
66
+ if (dhPrime % 3n !== 2n) {
65
67
  throw new index_js_1.MtSecurityError('Step 3: ivalid g - dh_prime mod 3 != 2');
66
68
  }
67
69
  break;
68
70
  case 4:
69
71
  break;
70
72
  case 5: {
71
- const mod = dhPrime.mod(5);
72
- if (mod.notEquals(1) && mod.notEquals(4)) {
73
+ const mod = dhPrime % 5n;
74
+ if (mod !== 1n && mod !== 4n) {
73
75
  throw new index_js_1.MtSecurityError('Step 3: ivalid g - dh_prime mod 5 != 1 && dh_prime mod 5 != 4');
74
76
  }
75
77
  break;
76
78
  }
77
79
  case 6: {
78
- const mod = dhPrime.mod(24);
79
- if (mod.notEquals(19) && mod.notEquals(23)) {
80
+ const mod = dhPrime % 24n;
81
+ if (mod !== 19n && mod !== 23n) {
80
82
  throw new index_js_1.MtSecurityError('Step 3: ivalid g - dh_prime mod 24 != 19 && dh_prime mod 24 != 23');
81
83
  }
82
84
  break;
83
85
  }
84
86
  case 7: {
85
- const mod = dhPrime.mod(7);
86
- if (mod.notEquals(3) && mod.notEquals(5) && mod.notEquals(6)) {
87
+ const mod = dhPrime % 7n;
88
+ if (mod !== 3n && mod !== 5n && mod !== 6n) {
87
89
  throw new index_js_1.MtSecurityError('Step 3: ivalid g - dh_prime mod 7 != 3 && dh_prime mod 7 != 5 && dh_prime mod 7 != 6');
88
90
  }
89
91
  break;
@@ -94,41 +96,44 @@ function checkDhPrime(log, dhPrime, g) {
94
96
  checkedPrime.generators.push(g);
95
97
  log.debug('g = %d is safe to use with dh_prime', g);
96
98
  }
97
- async function rsaPad(data, crypto, key) {
99
+ function rsaPad(data, crypto, key) {
98
100
  // since Summer 2021, they use "version of RSA with a variant of OAEP+ padding explained below"
99
- const keyModulus = (0, big_integer_1.default)(key.modulus, 16);
100
- const keyExponent = (0, big_integer_1.default)(key.exponent, 16);
101
+ const keyModulus = BigInt(`0x${key.modulus}`);
102
+ const keyExponent = BigInt(`0x${key.exponent}`);
101
103
  if (data.length > 144) {
102
104
  throw new index_js_1.MtArgumentError('Failed to pad: too big data');
103
105
  }
104
- data = (0, buffer_utils_js_1.concatBuffers)([data, (0, buffer_utils_js_1.randomBytes)(192 - data.length)]);
106
+ const dataPadded = new Uint8Array(192);
107
+ dataPadded.set(data, 0);
108
+ crypto.randomFill(dataPadded.subarray(data.length));
109
+ data = dataPadded;
105
110
  for (;;) {
106
111
  const aesIv = new Uint8Array(32);
107
- const aesKey = (0, buffer_utils_js_1.randomBytes)(32);
108
- const dataWithHash = (0, buffer_utils_js_1.concatBuffers)([data, await crypto.sha256((0, buffer_utils_js_1.concatBuffers)([aesKey, data]))]);
112
+ const aesKey = crypto.randomBytes(32);
113
+ const dataWithHash = (0, buffer_utils_js_1.concatBuffers)([data, crypto.sha256((0, buffer_utils_js_1.concatBuffers)([aesKey, data]))]);
109
114
  // we only need to reverse the data
110
115
  dataWithHash.subarray(0, 192).reverse();
111
- const aes = await crypto.createAesIge(aesKey, aesIv);
112
- const encrypted = await aes.encrypt(dataWithHash);
113
- const encryptedHash = await crypto.sha256(encrypted);
116
+ const aes = crypto.createAesIge(aesKey, aesIv);
117
+ const encrypted = aes.encrypt(dataWithHash);
118
+ const encryptedHash = crypto.sha256(encrypted);
114
119
  (0, utils_js_1.xorBufferInPlace)(aesKey, encryptedHash);
115
120
  const decryptedData = (0, buffer_utils_js_1.concatBuffers)([aesKey, encrypted]);
116
121
  const decryptedDataBigint = (0, index_js_2.bufferToBigInt)(decryptedData);
117
- if (decryptedDataBigint.geq(keyModulus)) {
122
+ if (decryptedDataBigint >= keyModulus) {
118
123
  continue;
119
124
  }
120
- const encryptedBigint = decryptedDataBigint.modPow(keyExponent, keyModulus);
125
+ const encryptedBigint = (0, index_js_2.bigIntModPow)(decryptedDataBigint, keyExponent, keyModulus);
121
126
  return (0, index_js_2.bigIntToBuffer)(encryptedBigint, 256);
122
127
  }
123
128
  }
124
- async function rsaEncrypt(data, crypto, key) {
129
+ function rsaEncrypt(data, crypto, key) {
125
130
  const toEncrypt = (0, buffer_utils_js_1.concatBuffers)([
126
- await crypto.sha1(data),
131
+ crypto.sha1(data),
127
132
  data,
128
133
  // sha1 is always 20 bytes, so we're left with 255 - 20 - x padding
129
- (0, buffer_utils_js_1.randomBytes)(235 - data.length),
134
+ crypto.randomBytes(235 - data.length),
130
135
  ]);
131
- const encryptedBigInt = (0, index_js_2.bufferToBigInt)(toEncrypt).modPow((0, big_integer_1.default)(key.exponent, 16), (0, big_integer_1.default)(key.modulus, 16));
136
+ const encryptedBigInt = (0, index_js_2.bigIntModPow)((0, index_js_2.bufferToBigInt)(toEncrypt), BigInt(`0x${key.exponent}`), BigInt(`0x${key.modulus}`));
132
137
  return (0, index_js_2.bigIntToBuffer)(encryptedBigInt);
133
138
  }
134
139
  /**
@@ -160,7 +165,7 @@ async function doAuthorization(connection, crypto, expiresIn) {
160
165
  }
161
166
  if (expiresIn)
162
167
  log.prefix = '[PFS] ';
163
- const nonce = (0, buffer_utils_js_1.randomBytes)(16);
168
+ const nonce = crypto.randomBytes(16);
164
169
  // Step 1: PQ request
165
170
  log.debug('starting PQ handshake (temp = %b), nonce = %h', expiresIn, nonce);
166
171
  await sendPlainMessage({ _: 'mt_req_pq_multi', nonce });
@@ -179,7 +184,7 @@ async function doAuthorization(connection, crypto, expiresIn) {
179
184
  log.debug('found server key, fp = %s, old = %s', publicKey.fingerprint, publicKey.old);
180
185
  const [p, q] = await crypto.factorizePQ(resPq.pq);
181
186
  log.debug('factorized PQ: PQ = %h, P = %h, Q = %h', resPq.pq, p, q);
182
- const newNonce = (0, buffer_utils_js_1.randomBytes)(32);
187
+ const newNonce = crypto.randomBytes(32);
183
188
  let dcId = connection.params.dc.id;
184
189
  if (connection.params.testMode)
185
190
  dcId += 10000;
@@ -198,8 +203,8 @@ async function doAuthorization(connection, crypto, expiresIn) {
198
203
  };
199
204
  const pqInnerData = tl_runtime_1.TlBinaryWriter.serializeObject(writerMap, _pqInnerData);
200
205
  const encryptedData = publicKey.old ?
201
- await rsaEncrypt(pqInnerData, crypto, publicKey) :
202
- await rsaPad(pqInnerData, crypto, publicKey);
206
+ rsaEncrypt(pqInnerData, crypto, publicKey) :
207
+ rsaPad(pqInnerData, crypto, publicKey);
203
208
  log.debug('requesting DH params');
204
209
  await sendPlainMessage({
205
210
  _: 'mt_req_DH_params',
@@ -223,13 +228,13 @@ async function doAuthorization(connection, crypto, expiresIn) {
223
228
  throw new index_js_1.MtSecurityError('Step 2: AES block size is invalid');
224
229
  }
225
230
  // Step 3: complete DH exchange
226
- const [key, iv] = await (0, mtproto_js_1.generateKeyAndIvFromNonce)(crypto, resPq.serverNonce, newNonce);
227
- const ige = await crypto.createAesIge(key, iv);
228
- const plainTextAnswer = await ige.decrypt(serverDhParams.encryptedAnswer);
231
+ const [key, iv] = (0, mtproto_js_1.generateKeyAndIvFromNonce)(crypto, resPq.serverNonce, newNonce);
232
+ const ige = crypto.createAesIge(key, iv);
233
+ const plainTextAnswer = ige.decrypt(serverDhParams.encryptedAnswer);
229
234
  const innerDataHash = plainTextAnswer.subarray(0, 20);
230
235
  const serverDhInnerReader = new tl_runtime_1.TlBinaryReader(readerMap, plainTextAnswer, 20);
231
236
  const serverDhInner = serverDhInnerReader.object();
232
- if (!(0, buffer_utils_js_1.buffersEqual)(innerDataHash, await crypto.sha1(plainTextAnswer.subarray(20, serverDhInnerReader.pos)))) {
237
+ if (!(0, buffer_utils_js_1.buffersEqual)(innerDataHash, crypto.sha1(plainTextAnswer.subarray(20, serverDhInnerReader.pos)))) {
233
238
  throw new index_js_1.MtSecurityError('Step 3: invalid inner data hash');
234
239
  }
235
240
  (0, type_assertions_js_1.mtpAssertTypeIs)('auth step 3', serverDhInner, 'mt_server_DH_inner_data');
@@ -241,30 +246,30 @@ async function doAuthorization(connection, crypto, expiresIn) {
241
246
  }
242
247
  const dhPrime = (0, index_js_2.bufferToBigInt)(serverDhInner.dhPrime);
243
248
  const timeOffset = Math.floor(Date.now() / 1000) - serverDhInner.serverTime;
244
- const g = (0, big_integer_1.default)(serverDhInner.g);
249
+ const g = BigInt(serverDhInner.g);
245
250
  const gA = (0, index_js_2.bufferToBigInt)(serverDhInner.gA);
246
- checkDhPrime(log, dhPrime, serverDhInner.g);
251
+ checkDhPrime(crypto, log, dhPrime, serverDhInner.g);
247
252
  let retryId = long_1.default.ZERO;
248
253
  const serverSalt = (0, utils_js_1.xorBuffer)(newNonce.subarray(0, 8), resPq.serverNonce.subarray(0, 8));
249
254
  for (;;) {
250
- const b = (0, index_js_2.bufferToBigInt)((0, buffer_utils_js_1.randomBytes)(256));
251
- const gB = g.modPow(b, dhPrime);
252
- const authKey = (0, index_js_2.bigIntToBuffer)(gA.modPow(b, dhPrime));
253
- const authKeyAuxHash = (await crypto.sha1(authKey)).subarray(0, 8);
255
+ const b = (0, index_js_2.bufferToBigInt)(crypto.randomBytes(256));
256
+ const gB = (0, index_js_2.bigIntModPow)(g, b, dhPrime);
257
+ const authKey = (0, index_js_2.bigIntToBuffer)((0, index_js_2.bigIntModPow)(gA, b, dhPrime));
258
+ const authKeyAuxHash = crypto.sha1(authKey).subarray(0, 8);
254
259
  // validate DH params
255
- if (g.lesserOrEquals(1) || g.greaterOrEquals(dhPrime.minus(big_integer_1.default.one))) {
260
+ if (g <= 1 || g >= dhPrime - 1n) {
256
261
  throw new index_js_1.MtSecurityError('g is not within (1, dh_prime - 1)');
257
262
  }
258
- if (gA.lesserOrEquals(1) || gA.greaterOrEquals(dhPrime.minus(big_integer_1.default.one))) {
263
+ if (gA <= 1 || gA >= dhPrime - 1n) {
259
264
  throw new index_js_1.MtSecurityError('g_a is not within (1, dh_prime - 1)');
260
265
  }
261
- if (gB.lesserOrEquals(1) || gB.greaterOrEquals(dhPrime.minus(big_integer_1.default.one))) {
266
+ if (gB <= 1 || gB >= dhPrime - 1n) {
262
267
  throw new index_js_1.MtSecurityError('g_b is not within (1, dh_prime - 1)');
263
268
  }
264
- if (gA.lt(DH_SAFETY_RANGE) || gA.gt(dhPrime.minus(DH_SAFETY_RANGE))) {
269
+ if (gA <= DH_SAFETY_RANGE || gA >= dhPrime - DH_SAFETY_RANGE) {
265
270
  throw new index_js_1.MtSecurityError('g_a is not within (2^{2048-64}, dh_prime - 2^{2048-64})');
266
271
  }
267
- if (gB.lt(DH_SAFETY_RANGE) || gB.gt(dhPrime.minus(DH_SAFETY_RANGE))) {
272
+ if (gB <= DH_SAFETY_RANGE || gB >= dhPrime - DH_SAFETY_RANGE) {
268
273
  throw new index_js_1.MtSecurityError('g_b is not within (2^{2048-64}, dh_prime - 2^{2048-64})');
269
274
  }
270
275
  const gB_ = (0, index_js_2.bigIntToBuffer)(gB, 0, false);
@@ -283,11 +288,11 @@ async function doAuthorization(connection, crypto, expiresIn) {
283
288
  const clientDhInnerWriter = tl_runtime_1.TlBinaryWriter.alloc(writerMap, innerLength);
284
289
  clientDhInnerWriter.pos = 20;
285
290
  clientDhInnerWriter.object(clientDhInner);
286
- const clientDhInnerHash = await crypto.sha1(clientDhInnerWriter.uint8View.subarray(20, clientDhInnerWriter.pos));
291
+ const clientDhInnerHash = crypto.sha1(clientDhInnerWriter.uint8View.subarray(20, clientDhInnerWriter.pos));
287
292
  clientDhInnerWriter.pos = 0;
288
293
  clientDhInnerWriter.raw(clientDhInnerHash);
289
294
  log.debug('sending client DH (timeOffset = %d)', timeOffset);
290
- const clientDhEncrypted = await ige.encrypt(clientDhInnerWriter.uint8View);
295
+ const clientDhEncrypted = ige.encrypt(clientDhInnerWriter.uint8View);
291
296
  await sendPlainMessage({
292
297
  _: 'mt_set_client_DH_params',
293
298
  nonce,
@@ -310,7 +315,7 @@ async function doAuthorization(connection, crypto, expiresIn) {
310
315
  throw new index_js_1.MtTypeAssertionError('auth step 4', '!mt_dh_gen_fail', dhGen._);
311
316
  }
312
317
  if (dhGen._ === 'mt_dh_gen_retry') {
313
- const expectedHash = await crypto.sha1((0, buffer_utils_js_1.concatBuffers)([newNonce, new Uint8Array([2]), authKeyAuxHash]));
318
+ const expectedHash = crypto.sha1((0, buffer_utils_js_1.concatBuffers)([newNonce, new Uint8Array([2]), authKeyAuxHash]));
314
319
  if (!(0, buffer_utils_js_1.buffersEqual)(expectedHash.subarray(4, 20), dhGen.newNonceHash2)) {
315
320
  throw Error('Step 4: invalid retry nonce hash from server');
316
321
  }
@@ -319,7 +324,7 @@ async function doAuthorization(connection, crypto, expiresIn) {
319
324
  }
320
325
  if (dhGen._ !== 'mt_dh_gen_ok')
321
326
  throw new Error(); // unreachable
322
- const expectedHash = await crypto.sha1((0, buffer_utils_js_1.concatBuffers)([newNonce, new Uint8Array([1]), authKeyAuxHash]));
327
+ const expectedHash = crypto.sha1((0, buffer_utils_js_1.concatBuffers)([newNonce, new Uint8Array([1]), authKeyAuxHash]));
323
328
  if (!(0, buffer_utils_js_1.buffersEqual)(expectedHash.subarray(4, 20), dhGen.newNonceHash1)) {
324
329
  throw Error('Step 4: invalid nonce hash from server');
325
330
  }
@@ -1 +1 @@
1
- {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../../../src/network/authorization.ts"],"names":[],"mappings":"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","sourcesContent":["import bigInt from 'big-integer'\nimport Long from 'long'\n\nimport { mtp } from '@mtcute/tl'\nimport { TlPublicKey } from '@mtcute/tl/binary/rsa-keys.js'\nimport { TlBinaryReader, TlBinaryWriter, TlSerializationCounter } from '@mtcute/tl-runtime'\n\nimport { MtArgumentError, MtSecurityError, MtTypeAssertionError } from '../types/index.js'\nimport { buffersEqual, concatBuffers, dataViewFromBuffer, randomBytes } from '../utils/buffer-utils.js'\nimport { findKeyByFingerprints } from '../utils/crypto/keys.js'\nimport { millerRabin } from '../utils/crypto/miller-rabin.js'\nimport { generateKeyAndIvFromNonce } from '../utils/crypto/mtproto.js'\nimport { xorBuffer, xorBufferInPlace } from '../utils/crypto/utils.js'\nimport { bigIntToBuffer, bufferToBigInt, ICryptoProvider, Logger } from '../utils/index.js'\nimport { mtpAssertTypeIs } from '../utils/type-assertions.js'\nimport { SessionConnection } from './session-connection.js'\n\n// Heavily based on code from https://github.com/LonamiWebs/Telethon/blob/master/telethon/network/authenticator.py\n\n// see https://core.telegram.org/mtproto/security_guidelines\nconst DH_SAFETY_RANGE = bigInt[2].pow(2048 - 64)\nconst KNOWN_DH_PRIME = bigInt(\n 'C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5B',\n 16,\n)\nconst TWO_POW_2047 = bigInt[2].pow(2047)\nconst TWO_POW_2048 = bigInt[2].pow(2048)\n\ninterface CheckedPrime {\n prime: bigInt.BigInteger\n generators: number[]\n}\nconst checkedPrimesCache: CheckedPrime[] = []\n\nfunction checkDhPrime(log: Logger, dhPrime: bigInt.BigInteger, g: number) {\n if (KNOWN_DH_PRIME.eq(dhPrime)) {\n log.debug('server is using known dh prime, skipping validation')\n\n return\n }\n\n let checkedPrime = checkedPrimesCache.find((x) => x.prime.eq(dhPrime))\n\n if (!checkedPrime) {\n if (dhPrime.lesserOrEquals(TWO_POW_2047) || dhPrime.greaterOrEquals(TWO_POW_2048)) {\n throw new MtSecurityError('Step 3: dh_prime is not in the 2048-bit range')\n }\n\n if (!millerRabin(dhPrime)) {\n throw new MtSecurityError('Step 3: dh_prime is not prime')\n }\n if (!millerRabin(dhPrime.minus(1).divide(2))) {\n throw new MtSecurityError('Step 3: dh_prime is not a safe prime - (dh_prime-1)/2 is not prime')\n }\n\n log.debug('dh_prime is probably prime')\n\n checkedPrime = {\n prime: dhPrime,\n generators: [],\n }\n checkedPrimesCache.push(checkedPrime)\n } else {\n log.debug('dh_prime is probably prime (cached)')\n }\n\n const generatorChecked = checkedPrime.generators.includes(g)\n\n if (generatorChecked) {\n log.debug('g = %d is already checked for dh_prime', g)\n\n return\n }\n\n switch (g) {\n case 2:\n if (dhPrime.mod(8).notEquals(7)) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 8 != 7')\n }\n break\n case 3:\n if (dhPrime.mod(3).notEquals(2)) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 3 != 2')\n }\n break\n case 4:\n break\n case 5: {\n const mod = dhPrime.mod(5)\n\n if (mod.notEquals(1) && mod.notEquals(4)) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 5 != 1 && dh_prime mod 5 != 4')\n }\n break\n }\n case 6: {\n const mod = dhPrime.mod(24)\n\n if (mod.notEquals(19) && mod.notEquals(23)) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 24 != 19 && dh_prime mod 24 != 23')\n }\n break\n }\n case 7: {\n const mod = dhPrime.mod(7)\n\n if (mod.notEquals(3) && mod.notEquals(5) && mod.notEquals(6)) {\n throw new MtSecurityError(\n 'Step 3: ivalid g - dh_prime mod 7 != 3 && dh_prime mod 7 != 5 && dh_prime mod 7 != 6',\n )\n }\n break\n }\n default:\n throw new MtSecurityError(`Step 3: ivalid g - unknown g = ${g}`)\n }\n\n checkedPrime.generators.push(g)\n\n log.debug('g = %d is safe to use with dh_prime', g)\n}\n\nasync function rsaPad(data: Uint8Array, crypto: ICryptoProvider, key: TlPublicKey): Promise<Uint8Array> {\n // since Summer 2021, they use \"version of RSA with a variant of OAEP+ padding explained below\"\n\n const keyModulus = bigInt(key.modulus, 16)\n const keyExponent = bigInt(key.exponent, 16)\n\n if (data.length > 144) {\n throw new MtArgumentError('Failed to pad: too big data')\n }\n\n data = concatBuffers([data, randomBytes(192 - data.length)])\n\n for (;;) {\n const aesIv = new Uint8Array(32)\n\n const aesKey = randomBytes(32)\n\n const dataWithHash = concatBuffers([data, await crypto.sha256(concatBuffers([aesKey, data]))])\n // we only need to reverse the data\n dataWithHash.subarray(0, 192).reverse()\n\n const aes = await crypto.createAesIge(aesKey, aesIv)\n const encrypted = await aes.encrypt(dataWithHash)\n const encryptedHash = await crypto.sha256(encrypted)\n\n xorBufferInPlace(aesKey, encryptedHash)\n const decryptedData = concatBuffers([aesKey, encrypted])\n\n const decryptedDataBigint = bufferToBigInt(decryptedData)\n\n if (decryptedDataBigint.geq(keyModulus)) {\n continue\n }\n\n const encryptedBigint = decryptedDataBigint.modPow(keyExponent, keyModulus)\n\n return bigIntToBuffer(encryptedBigint, 256)\n }\n}\n\nasync function rsaEncrypt(data: Uint8Array, crypto: ICryptoProvider, key: TlPublicKey): Promise<Uint8Array> {\n const toEncrypt = concatBuffers([\n await crypto.sha1(data),\n data,\n // sha1 is always 20 bytes, so we're left with 255 - 20 - x padding\n randomBytes(235 - data.length),\n ])\n\n const encryptedBigInt = bufferToBigInt(toEncrypt).modPow(bigInt(key.exponent, 16), bigInt(key.modulus, 16))\n\n return bigIntToBuffer(encryptedBigInt)\n}\n\n/**\n * Execute authorization flow on `connection` using `crypto`.\n *\n * @returns tuple: [authKey, serverSalt, timeOffset]\n */\nexport async function doAuthorization(\n connection: SessionConnection,\n crypto: ICryptoProvider,\n expiresIn?: number,\n): Promise<[Uint8Array, Long, number]> {\n // eslint-disable-next-line dot-notation\n const session = connection['_session']\n const readerMap = session._readerMap\n const writerMap = session._writerMap\n const log = connection.log.create('auth')\n\n function sendPlainMessage(message: mtp.TlObject): Promise<void> {\n const length = TlSerializationCounter.countNeededBytes(writerMap, message)\n const writer = TlBinaryWriter.alloc(writerMap, length + 20) // 20 bytes for mtproto header\n\n const messageId = session.getMessageId()\n\n log.verbose('[PLAIN] >>> %j', message)\n writer.long(Long.ZERO)\n writer.long(messageId)\n writer.uint(length)\n writer.object(message)\n\n return connection.send(writer.result())\n }\n\n async function readNext(): Promise<mtp.TlObject> {\n const res = TlBinaryReader.deserializeObject<mtp.TlObject>(\n readerMap,\n await connection.waitForUnencryptedMessage(),\n 20, // skip mtproto header\n )\n\n log.verbose('[PLAIN] <<< %j', res)\n\n return res\n }\n\n if (expiresIn) log.prefix = '[PFS] '\n\n const nonce = randomBytes(16)\n // Step 1: PQ request\n log.debug('starting PQ handshake (temp = %b), nonce = %h', expiresIn, nonce)\n\n await sendPlainMessage({ _: 'mt_req_pq_multi', nonce })\n const resPq = await readNext()\n\n mtpAssertTypeIs('auth step 1', resPq, 'mt_resPQ')\n\n if (!buffersEqual(resPq.nonce, nonce)) {\n throw new MtSecurityError('Step 1: invalid nonce from server')\n }\n\n const serverKeys = resPq.serverPublicKeyFingerprints.map((it) => it.toUnsigned().toString(16))\n log.debug('received PQ, keys: %j', serverKeys)\n\n // Step 2: DH exchange\n const publicKey = findKeyByFingerprints(serverKeys)\n\n if (!publicKey) {\n throw new MtSecurityError(\n 'Step 2: Could not find server public key with any of these fingerprints: ' + serverKeys.join(', '),\n )\n }\n log.debug('found server key, fp = %s, old = %s', publicKey.fingerprint, publicKey.old)\n\n const [p, q] = await crypto.factorizePQ(resPq.pq)\n log.debug('factorized PQ: PQ = %h, P = %h, Q = %h', resPq.pq, p, q)\n\n const newNonce = randomBytes(32)\n\n let dcId = connection.params.dc.id\n if (connection.params.testMode) dcId += 10000\n if (connection.params.dc.mediaOnly) dcId = -dcId\n\n const _pqInnerData: mtp.TypeP_Q_inner_data = {\n _: expiresIn ? 'mt_p_q_inner_data_temp_dc' : 'mt_p_q_inner_data_dc',\n pq: resPq.pq,\n p,\n q,\n nonce,\n newNonce,\n serverNonce: resPq.serverNonce,\n dc: dcId,\n expiresIn: expiresIn!, // whatever\n }\n const pqInnerData = TlBinaryWriter.serializeObject(writerMap, _pqInnerData)\n\n const encryptedData = publicKey.old ?\n await rsaEncrypt(pqInnerData, crypto, publicKey) :\n await rsaPad(pqInnerData, crypto, publicKey)\n\n log.debug('requesting DH params')\n\n await sendPlainMessage({\n _: 'mt_req_DH_params',\n nonce,\n serverNonce: resPq.serverNonce,\n p,\n q,\n publicKeyFingerprint: Long.fromString(publicKey.fingerprint, true, 16),\n encryptedData,\n })\n const serverDhParams = await readNext()\n\n mtpAssertTypeIs('auth step 2', serverDhParams, 'mt_server_DH_params_ok')\n\n if (!buffersEqual(serverDhParams.nonce, nonce)) {\n throw new MtSecurityError('Step 2: invalid nonce from server')\n }\n if (!buffersEqual(serverDhParams.serverNonce, resPq.serverNonce)) {\n throw new MtSecurityError('Step 2: invalid server nonce from server')\n }\n\n log.debug('server DH ok')\n\n if (serverDhParams.encryptedAnswer.length % 16 !== 0) {\n throw new MtSecurityError('Step 2: AES block size is invalid')\n }\n\n // Step 3: complete DH exchange\n const [key, iv] = await generateKeyAndIvFromNonce(crypto, resPq.serverNonce, newNonce)\n const ige = await crypto.createAesIge(key, iv)\n\n const plainTextAnswer = await ige.decrypt(serverDhParams.encryptedAnswer)\n const innerDataHash = plainTextAnswer.subarray(0, 20)\n const serverDhInnerReader = new TlBinaryReader(readerMap, plainTextAnswer, 20)\n const serverDhInner = serverDhInnerReader.object() as mtp.TlObject\n\n if (!buffersEqual(innerDataHash, await crypto.sha1(plainTextAnswer.subarray(20, serverDhInnerReader.pos)))) {\n throw new MtSecurityError('Step 3: invalid inner data hash')\n }\n\n mtpAssertTypeIs('auth step 3', serverDhInner, 'mt_server_DH_inner_data')\n\n if (!buffersEqual(serverDhInner.nonce, nonce)) {\n throw Error('Step 3: invalid nonce from server')\n }\n if (!buffersEqual(serverDhInner.serverNonce, resPq.serverNonce)) {\n throw Error('Step 3: invalid server nonce from server')\n }\n\n const dhPrime = bufferToBigInt(serverDhInner.dhPrime)\n const timeOffset = Math.floor(Date.now() / 1000) - serverDhInner.serverTime\n\n const g = bigInt(serverDhInner.g)\n const gA = bufferToBigInt(serverDhInner.gA)\n\n checkDhPrime(log, dhPrime, serverDhInner.g)\n\n let retryId = Long.ZERO\n const serverSalt = xorBuffer(newNonce.subarray(0, 8), resPq.serverNonce.subarray(0, 8))\n\n for (;;) {\n const b = bufferToBigInt(randomBytes(256))\n const gB = g.modPow(b, dhPrime)\n\n const authKey = bigIntToBuffer(gA.modPow(b, dhPrime))\n const authKeyAuxHash = (await crypto.sha1(authKey)).subarray(0, 8)\n\n // validate DH params\n if (g.lesserOrEquals(1) || g.greaterOrEquals(dhPrime.minus(bigInt.one))) {\n throw new MtSecurityError('g is not within (1, dh_prime - 1)')\n }\n if (gA.lesserOrEquals(1) || gA.greaterOrEquals(dhPrime.minus(bigInt.one))) {\n throw new MtSecurityError('g_a is not within (1, dh_prime - 1)')\n }\n if (gB.lesserOrEquals(1) || gB.greaterOrEquals(dhPrime.minus(bigInt.one))) {\n throw new MtSecurityError('g_b is not within (1, dh_prime - 1)')\n }\n\n if (gA.lt(DH_SAFETY_RANGE) || gA.gt(dhPrime.minus(DH_SAFETY_RANGE))) {\n throw new MtSecurityError('g_a is not within (2^{2048-64}, dh_prime - 2^{2048-64})')\n }\n if (gB.lt(DH_SAFETY_RANGE) || gB.gt(dhPrime.minus(DH_SAFETY_RANGE))) {\n throw new MtSecurityError('g_b is not within (2^{2048-64}, dh_prime - 2^{2048-64})')\n }\n\n const gB_ = bigIntToBuffer(gB, 0, false)\n\n // Step 4: send client DH\n const clientDhInner: mtp.RawMt_client_DH_inner_data = {\n _: 'mt_client_DH_inner_data',\n nonce,\n serverNonce: resPq.serverNonce,\n retryId,\n gB: gB_,\n }\n let innerLength = TlSerializationCounter.countNeededBytes(writerMap, clientDhInner) + 20 // for hash\n const innerPaddingLength = innerLength % 16\n if (innerPaddingLength > 0) innerLength += 16 - innerPaddingLength\n\n const clientDhInnerWriter = TlBinaryWriter.alloc(writerMap, innerLength)\n clientDhInnerWriter.pos = 20\n clientDhInnerWriter.object(clientDhInner)\n const clientDhInnerHash = await crypto.sha1(clientDhInnerWriter.uint8View.subarray(20, clientDhInnerWriter.pos))\n clientDhInnerWriter.pos = 0\n clientDhInnerWriter.raw(clientDhInnerHash)\n\n log.debug('sending client DH (timeOffset = %d)', timeOffset)\n\n const clientDhEncrypted = await ige.encrypt(clientDhInnerWriter.uint8View)\n await sendPlainMessage({\n _: 'mt_set_client_DH_params',\n nonce,\n serverNonce: resPq.serverNonce,\n encryptedData: clientDhEncrypted,\n })\n\n const dhGen = await readNext()\n\n if (!mtp.isAnySet_client_DH_params_answer(dhGen)) {\n throw new MtTypeAssertionError('auth step 4', 'set_client_DH_params_answer', dhGen._)\n }\n\n if (!buffersEqual(dhGen.nonce, nonce)) {\n throw Error('Step 4: invalid nonce from server')\n }\n if (!buffersEqual(dhGen.serverNonce, resPq.serverNonce)) {\n throw Error('Step 4: invalid server nonce from server')\n }\n\n log.debug('DH result: %s', dhGen._)\n\n if (dhGen._ === 'mt_dh_gen_fail') {\n // in theory i would be supposed to calculate newNonceHash, but why, we are failing anyway\n throw new MtTypeAssertionError('auth step 4', '!mt_dh_gen_fail', dhGen._)\n }\n\n if (dhGen._ === 'mt_dh_gen_retry') {\n const expectedHash = await crypto.sha1(concatBuffers([newNonce, new Uint8Array([2]), authKeyAuxHash]))\n\n if (!buffersEqual(expectedHash.subarray(4, 20), dhGen.newNonceHash2)) {\n throw Error('Step 4: invalid retry nonce hash from server')\n }\n retryId = Long.fromBytesLE(authKeyAuxHash as unknown as number[])\n continue\n }\n\n if (dhGen._ !== 'mt_dh_gen_ok') throw new Error() // unreachable\n\n const expectedHash = await crypto.sha1(concatBuffers([newNonce, new Uint8Array([1]), authKeyAuxHash]))\n\n if (!buffersEqual(expectedHash.subarray(4, 20), dhGen.newNonceHash1)) {\n throw Error('Step 4: invalid nonce hash from server')\n }\n\n log.info('authorization successful')\n\n const dv = dataViewFromBuffer(serverSalt)\n\n return [authKey, new Long(dv.getInt32(0, true), dv.getInt32(4, true)), timeOffset]\n }\n}\n"]}
1
+ {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../../../src/network/authorization.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\n\nimport { mtp } from '@mtcute/tl'\nimport { TlPublicKey } from '@mtcute/tl/binary/rsa-keys.js'\nimport { TlBinaryReader, TlBinaryWriter, TlSerializationCounter } from '@mtcute/tl-runtime'\n\nimport { MtArgumentError, MtSecurityError, MtTypeAssertionError } from '../types/index.js'\nimport { buffersEqual, concatBuffers, dataViewFromBuffer } from '../utils/buffer-utils.js'\nimport { findKeyByFingerprints } from '../utils/crypto/keys.js'\nimport { millerRabin } from '../utils/crypto/miller-rabin.js'\nimport { generateKeyAndIvFromNonce } from '../utils/crypto/mtproto.js'\nimport { xorBuffer, xorBufferInPlace } from '../utils/crypto/utils.js'\nimport { bigIntModPow, bigIntToBuffer, bufferToBigInt, ICryptoProvider, Logger } from '../utils/index.js'\nimport { mtpAssertTypeIs } from '../utils/type-assertions.js'\nimport { SessionConnection } from './session-connection.js'\n\n// Heavily based on code from https://github.com/LonamiWebs/Telethon/blob/master/telethon/network/authenticator.py\n\n// see https://core.telegram.org/mtproto/security_guidelines\n// const DH_SAFETY_RANGE = bigInt[2].pow(2048 - 64)\nconst DH_SAFETY_RANGE = 2n ** (2048n - 64n)\nconst KNOWN_DH_PRIME =\n // eslint-disable-next-line max-len\n 0xc71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5bn\nconst TWO_POW_2047 = 2n ** 2047n\nconst TWO_POW_2048 = 2n ** 2048n\n\ninterface CheckedPrime {\n prime: bigint\n generators: number[]\n}\n\nconst checkedPrimesCache: CheckedPrime[] = []\n\nfunction checkDhPrime(crypto: ICryptoProvider, log: Logger, dhPrime: bigint, g: number) {\n if (KNOWN_DH_PRIME === dhPrime) {\n log.debug('server is using known dh prime, skipping validation')\n\n return\n }\n\n let checkedPrime = checkedPrimesCache.find((x) => x.prime === dhPrime)\n\n if (!checkedPrime) {\n if (dhPrime <= TWO_POW_2047 || dhPrime >= TWO_POW_2048) {\n throw new MtSecurityError('Step 3: dh_prime is not in the 2048-bit range')\n }\n\n if (!millerRabin(crypto, dhPrime)) {\n throw new MtSecurityError('Step 3: dh_prime is not prime')\n }\n if (!millerRabin(crypto, (dhPrime - 1n) / 2n)) {\n throw new MtSecurityError('Step 3: dh_prime is not a safe prime - (dh_prime-1)/2 is not prime')\n }\n\n log.debug('dh_prime is probably prime')\n\n checkedPrime = {\n prime: dhPrime,\n generators: [],\n }\n checkedPrimesCache.push(checkedPrime)\n } else {\n log.debug('dh_prime is probably prime (cached)')\n }\n\n const generatorChecked = checkedPrime.generators.includes(g)\n\n if (generatorChecked) {\n log.debug('g = %d is already checked for dh_prime', g)\n\n return\n }\n\n switch (g) {\n case 2:\n if (dhPrime % 8n !== 7n) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 8 != 7')\n }\n break\n case 3:\n if (dhPrime % 3n !== 2n) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 3 != 2')\n }\n break\n case 4:\n break\n case 5: {\n const mod = dhPrime % 5n\n\n if (mod !== 1n && mod !== 4n) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 5 != 1 && dh_prime mod 5 != 4')\n }\n break\n }\n case 6: {\n const mod = dhPrime % 24n\n\n if (mod !== 19n && mod !== 23n) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 24 != 19 && dh_prime mod 24 != 23')\n }\n break\n }\n case 7: {\n const mod = dhPrime % 7n\n\n if (mod !== 3n && mod !== 5n && mod !== 6n) {\n throw new MtSecurityError(\n 'Step 3: ivalid g - dh_prime mod 7 != 3 && dh_prime mod 7 != 5 && dh_prime mod 7 != 6',\n )\n }\n break\n }\n default:\n throw new MtSecurityError(`Step 3: ivalid g - unknown g = ${g}`)\n }\n\n checkedPrime.generators.push(g)\n\n log.debug('g = %d is safe to use with dh_prime', g)\n}\n\nfunction rsaPad(data: Uint8Array, crypto: ICryptoProvider, key: TlPublicKey): Uint8Array {\n // since Summer 2021, they use \"version of RSA with a variant of OAEP+ padding explained below\"\n\n const keyModulus = BigInt(`0x${key.modulus}`)\n const keyExponent = BigInt(`0x${key.exponent}`)\n\n if (data.length > 144) {\n throw new MtArgumentError('Failed to pad: too big data')\n }\n\n const dataPadded = new Uint8Array(192)\n dataPadded.set(data, 0)\n crypto.randomFill(dataPadded.subarray(data.length))\n data = dataPadded\n\n for (;;) {\n const aesIv = new Uint8Array(32)\n\n const aesKey = crypto.randomBytes(32)\n\n const dataWithHash = concatBuffers([data, crypto.sha256(concatBuffers([aesKey, data]))])\n // we only need to reverse the data\n dataWithHash.subarray(0, 192).reverse()\n\n const aes = crypto.createAesIge(aesKey, aesIv)\n const encrypted = aes.encrypt(dataWithHash)\n const encryptedHash = crypto.sha256(encrypted)\n\n xorBufferInPlace(aesKey, encryptedHash)\n const decryptedData = concatBuffers([aesKey, encrypted])\n\n const decryptedDataBigint = bufferToBigInt(decryptedData)\n\n if (decryptedDataBigint >= keyModulus) {\n continue\n }\n\n const encryptedBigint = bigIntModPow(decryptedDataBigint, keyExponent, keyModulus)\n\n return bigIntToBuffer(encryptedBigint, 256)\n }\n}\n\nfunction rsaEncrypt(data: Uint8Array, crypto: ICryptoProvider, key: TlPublicKey): Uint8Array {\n const toEncrypt = concatBuffers([\n crypto.sha1(data),\n data,\n // sha1 is always 20 bytes, so we're left with 255 - 20 - x padding\n crypto.randomBytes(235 - data.length),\n ])\n\n const encryptedBigInt = bigIntModPow(\n bufferToBigInt(toEncrypt),\n BigInt(`0x${key.exponent}`),\n BigInt(`0x${key.modulus}`),\n )\n\n return bigIntToBuffer(encryptedBigInt)\n}\n\n/**\n * Execute authorization flow on `connection` using `crypto`.\n *\n * @returns tuple: [authKey, serverSalt, timeOffset]\n */\nexport async function doAuthorization(\n connection: SessionConnection,\n crypto: ICryptoProvider,\n expiresIn?: number,\n): Promise<[Uint8Array, Long, number]> {\n // eslint-disable-next-line dot-notation\n const session = connection['_session']\n const readerMap = session._readerMap\n const writerMap = session._writerMap\n const log = connection.log.create('auth')\n\n function sendPlainMessage(message: mtp.TlObject): Promise<void> {\n const length = TlSerializationCounter.countNeededBytes(writerMap, message)\n const writer = TlBinaryWriter.alloc(writerMap, length + 20) // 20 bytes for mtproto header\n\n const messageId = session.getMessageId()\n\n log.verbose('[PLAIN] >>> %j', message)\n writer.long(Long.ZERO)\n writer.long(messageId)\n writer.uint(length)\n writer.object(message)\n\n return connection.send(writer.result())\n }\n\n async function readNext(): Promise<mtp.TlObject> {\n const res = TlBinaryReader.deserializeObject<mtp.TlObject>(\n readerMap,\n await connection.waitForUnencryptedMessage(),\n 20, // skip mtproto header\n )\n\n log.verbose('[PLAIN] <<< %j', res)\n\n return res\n }\n\n if (expiresIn) log.prefix = '[PFS] '\n\n const nonce = crypto.randomBytes(16)\n // Step 1: PQ request\n log.debug('starting PQ handshake (temp = %b), nonce = %h', expiresIn, nonce)\n\n await sendPlainMessage({ _: 'mt_req_pq_multi', nonce })\n const resPq = await readNext()\n\n mtpAssertTypeIs('auth step 1', resPq, 'mt_resPQ')\n\n if (!buffersEqual(resPq.nonce, nonce)) {\n throw new MtSecurityError('Step 1: invalid nonce from server')\n }\n\n const serverKeys = resPq.serverPublicKeyFingerprints.map((it) => it.toUnsigned().toString(16))\n log.debug('received PQ, keys: %j', serverKeys)\n\n // Step 2: DH exchange\n const publicKey = findKeyByFingerprints(serverKeys)\n\n if (!publicKey) {\n throw new MtSecurityError(\n 'Step 2: Could not find server public key with any of these fingerprints: ' + serverKeys.join(', '),\n )\n }\n log.debug('found server key, fp = %s, old = %s', publicKey.fingerprint, publicKey.old)\n\n const [p, q] = await crypto.factorizePQ(resPq.pq)\n log.debug('factorized PQ: PQ = %h, P = %h, Q = %h', resPq.pq, p, q)\n\n const newNonce = crypto.randomBytes(32)\n\n let dcId = connection.params.dc.id\n if (connection.params.testMode) dcId += 10000\n if (connection.params.dc.mediaOnly) dcId = -dcId\n\n const _pqInnerData: mtp.TypeP_Q_inner_data = {\n _: expiresIn ? 'mt_p_q_inner_data_temp_dc' : 'mt_p_q_inner_data_dc',\n pq: resPq.pq,\n p,\n q,\n nonce,\n newNonce,\n serverNonce: resPq.serverNonce,\n dc: dcId,\n expiresIn: expiresIn!, // whatever\n }\n const pqInnerData = TlBinaryWriter.serializeObject(writerMap, _pqInnerData)\n\n const encryptedData = publicKey.old ?\n rsaEncrypt(pqInnerData, crypto, publicKey) :\n rsaPad(pqInnerData, crypto, publicKey)\n\n log.debug('requesting DH params')\n\n await sendPlainMessage({\n _: 'mt_req_DH_params',\n nonce,\n serverNonce: resPq.serverNonce,\n p,\n q,\n publicKeyFingerprint: Long.fromString(publicKey.fingerprint, true, 16),\n encryptedData,\n })\n const serverDhParams = await readNext()\n\n mtpAssertTypeIs('auth step 2', serverDhParams, 'mt_server_DH_params_ok')\n\n if (!buffersEqual(serverDhParams.nonce, nonce)) {\n throw new MtSecurityError('Step 2: invalid nonce from server')\n }\n if (!buffersEqual(serverDhParams.serverNonce, resPq.serverNonce)) {\n throw new MtSecurityError('Step 2: invalid server nonce from server')\n }\n\n log.debug('server DH ok')\n\n if (serverDhParams.encryptedAnswer.length % 16 !== 0) {\n throw new MtSecurityError('Step 2: AES block size is invalid')\n }\n\n // Step 3: complete DH exchange\n const [key, iv] = generateKeyAndIvFromNonce(crypto, resPq.serverNonce, newNonce)\n const ige = crypto.createAesIge(key, iv)\n\n const plainTextAnswer = ige.decrypt(serverDhParams.encryptedAnswer)\n const innerDataHash = plainTextAnswer.subarray(0, 20)\n const serverDhInnerReader = new TlBinaryReader(readerMap, plainTextAnswer, 20)\n const serverDhInner = serverDhInnerReader.object() as mtp.TlObject\n\n if (!buffersEqual(innerDataHash, crypto.sha1(plainTextAnswer.subarray(20, serverDhInnerReader.pos)))) {\n throw new MtSecurityError('Step 3: invalid inner data hash')\n }\n\n mtpAssertTypeIs('auth step 3', serverDhInner, 'mt_server_DH_inner_data')\n\n if (!buffersEqual(serverDhInner.nonce, nonce)) {\n throw Error('Step 3: invalid nonce from server')\n }\n if (!buffersEqual(serverDhInner.serverNonce, resPq.serverNonce)) {\n throw Error('Step 3: invalid server nonce from server')\n }\n\n const dhPrime = bufferToBigInt(serverDhInner.dhPrime)\n const timeOffset = Math.floor(Date.now() / 1000) - serverDhInner.serverTime\n\n const g = BigInt(serverDhInner.g)\n const gA = bufferToBigInt(serverDhInner.gA)\n\n checkDhPrime(crypto, log, dhPrime, serverDhInner.g)\n\n let retryId = Long.ZERO\n const serverSalt = xorBuffer(newNonce.subarray(0, 8), resPq.serverNonce.subarray(0, 8))\n\n for (;;) {\n const b = bufferToBigInt(crypto.randomBytes(256))\n const gB = bigIntModPow(g, b, dhPrime)\n\n const authKey = bigIntToBuffer(bigIntModPow(gA, b, dhPrime))\n const authKeyAuxHash = crypto.sha1(authKey).subarray(0, 8)\n\n // validate DH params\n if (g <= 1 || g >= dhPrime - 1n) {\n throw new MtSecurityError('g is not within (1, dh_prime - 1)')\n }\n if (gA <= 1 || gA >= dhPrime - 1n) {\n throw new MtSecurityError('g_a is not within (1, dh_prime - 1)')\n }\n if (gB <= 1 || gB >= dhPrime - 1n) {\n throw new MtSecurityError('g_b is not within (1, dh_prime - 1)')\n }\n\n if (gA <= DH_SAFETY_RANGE || gA >= dhPrime - DH_SAFETY_RANGE) {\n throw new MtSecurityError('g_a is not within (2^{2048-64}, dh_prime - 2^{2048-64})')\n }\n if (gB <= DH_SAFETY_RANGE || gB >= dhPrime - DH_SAFETY_RANGE) {\n throw new MtSecurityError('g_b is not within (2^{2048-64}, dh_prime - 2^{2048-64})')\n }\n\n const gB_ = bigIntToBuffer(gB, 0, false)\n\n // Step 4: send client DH\n const clientDhInner: mtp.RawMt_client_DH_inner_data = {\n _: 'mt_client_DH_inner_data',\n nonce,\n serverNonce: resPq.serverNonce,\n retryId,\n gB: gB_,\n }\n let innerLength = TlSerializationCounter.countNeededBytes(writerMap, clientDhInner) + 20 // for hash\n const innerPaddingLength = innerLength % 16\n if (innerPaddingLength > 0) innerLength += 16 - innerPaddingLength\n\n const clientDhInnerWriter = TlBinaryWriter.alloc(writerMap, innerLength)\n clientDhInnerWriter.pos = 20\n clientDhInnerWriter.object(clientDhInner)\n const clientDhInnerHash = crypto.sha1(clientDhInnerWriter.uint8View.subarray(20, clientDhInnerWriter.pos))\n clientDhInnerWriter.pos = 0\n clientDhInnerWriter.raw(clientDhInnerHash)\n\n log.debug('sending client DH (timeOffset = %d)', timeOffset)\n\n const clientDhEncrypted = ige.encrypt(clientDhInnerWriter.uint8View)\n await sendPlainMessage({\n _: 'mt_set_client_DH_params',\n nonce,\n serverNonce: resPq.serverNonce,\n encryptedData: clientDhEncrypted,\n })\n\n const dhGen = await readNext()\n\n if (!mtp.isAnySet_client_DH_params_answer(dhGen)) {\n throw new MtTypeAssertionError('auth step 4', 'set_client_DH_params_answer', dhGen._)\n }\n\n if (!buffersEqual(dhGen.nonce, nonce)) {\n throw Error('Step 4: invalid nonce from server')\n }\n if (!buffersEqual(dhGen.serverNonce, resPq.serverNonce)) {\n throw Error('Step 4: invalid server nonce from server')\n }\n\n log.debug('DH result: %s', dhGen._)\n\n if (dhGen._ === 'mt_dh_gen_fail') {\n // in theory i would be supposed to calculate newNonceHash, but why, we are failing anyway\n throw new MtTypeAssertionError('auth step 4', '!mt_dh_gen_fail', dhGen._)\n }\n\n if (dhGen._ === 'mt_dh_gen_retry') {\n const expectedHash = crypto.sha1(concatBuffers([newNonce, new Uint8Array([2]), authKeyAuxHash]))\n\n if (!buffersEqual(expectedHash.subarray(4, 20), dhGen.newNonceHash2)) {\n throw Error('Step 4: invalid retry nonce hash from server')\n }\n retryId = Long.fromBytesLE(authKeyAuxHash as unknown as number[])\n continue\n }\n\n if (dhGen._ !== 'mt_dh_gen_ok') throw new Error() // unreachable\n\n const expectedHash = crypto.sha1(concatBuffers([newNonce, new Uint8Array([1]), authKeyAuxHash]))\n\n if (!buffersEqual(expectedHash.subarray(4, 20), dhGen.newNonceHash1)) {\n throw Error('Step 4: invalid nonce hash from server')\n }\n\n log.info('authorization successful')\n\n const dv = dataViewFromBuffer(serverSalt)\n\n return [authKey, new Long(dv.getInt32(0, true), dv.getInt32(4, true)), timeOffset]\n }\n}\n"]}
@@ -14,7 +14,7 @@ class ConfigManager {
14
14
  this._listeners = [];
15
15
  }
16
16
  get isStale() {
17
- return !this._config || this._config.expires < Date.now() / 1000;
17
+ return !this._config || this._config.expires <= Date.now() / 1000;
18
18
  }
19
19
  update(force = false) {
20
20
  if (!force && !this.isStale)
@@ -24,6 +24,7 @@ class ConfigManager {
24
24
  return (this._updatingPromise = this._update().then((config) => {
25
25
  if (this._destroyed)
26
26
  return;
27
+ this._updatingPromise = undefined;
27
28
  this.setConfig(config);
28
29
  }));
29
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/network/config-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\n/**\n * Config manager is responsible for keeping\n * the current server configuration up-to-date\n * and providing methods to find the best DC\n * option for the current session.\n */\nexport class ConfigManager {\n constructor(private _update: () => Promise<tl.RawConfig>) {}\n\n private _destroyed = false\n private _config?: tl.RawConfig\n private _cdnConfig?: tl.RawCdnConfig\n\n private _updateTimeout?: NodeJS.Timeout\n private _updatingPromise?: Promise<void>\n\n private _listeners: ((config: tl.RawConfig) => void)[] = []\n\n get isStale(): boolean {\n return !this._config || this._config.expires < Date.now() / 1000\n }\n\n update(force = false): Promise<void> {\n if (!force && !this.isStale) return Promise.resolve()\n if (this._updatingPromise) return this._updatingPromise\n\n return (this._updatingPromise = this._update().then((config) => {\n if (this._destroyed) return\n\n this.setConfig(config)\n }))\n }\n\n setConfig(config: tl.RawConfig): void {\n this._config = config\n\n if (this._updateTimeout) clearTimeout(this._updateTimeout)\n this._updateTimeout = setTimeout(\n () => void this.update().catch(() => {}),\n (config.expires - Date.now() / 1000) * 1000,\n )\n\n for (const cb of this._listeners) cb(config)\n }\n\n onConfigUpdate(cb: (config: tl.RawConfig) => void): void {\n this._listeners.push(cb)\n }\n\n offConfigUpdate(cb: (config: tl.RawConfig) => void): void {\n const idx = this._listeners.indexOf(cb)\n if (idx >= 0) this._listeners.splice(idx, 1)\n }\n\n getNow(): tl.RawConfig | undefined {\n return this._config\n }\n\n async get(): Promise<tl.RawConfig> {\n if (this.isStale) await this.update()\n\n return this._config!\n }\n\n destroy(): void {\n if (this._updateTimeout) clearTimeout(this._updateTimeout)\n this._listeners.length = 0\n this._destroyed = true\n }\n\n async findOption(params: {\n dcId: number\n allowIpv6?: boolean\n preferIpv6?: boolean\n allowMedia?: boolean\n preferMedia?: boolean\n cdn?: boolean\n }): Promise<tl.RawDcOption | undefined> {\n if (this.isStale) await this.update()\n\n const options = this._config!.dcOptions.filter((opt) => {\n if (opt.tcpoOnly) return false // unsupported\n if (opt.ipv6 && !params.allowIpv6) return false\n if (opt.mediaOnly && !params.allowMedia) return false\n if (opt.cdn && !params.cdn) return false\n\n return opt.id === params.dcId\n })\n\n if (params.preferMedia && params.preferIpv6) {\n const r = options.find((opt) => opt.mediaOnly && opt.ipv6)\n if (r) return r\n }\n\n if (params.preferMedia) {\n const r = options.find((opt) => opt.mediaOnly)\n if (r) return r\n }\n\n if (params.preferIpv6) {\n const r = options.find((opt) => opt.ipv6)\n if (r) return r\n }\n\n return options[0]\n }\n}\n"]}
1
+ {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/network/config-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\n/**\n * Config manager is responsible for keeping\n * the current server configuration up-to-date\n * and providing methods to find the best DC\n * option for the current session.\n */\nexport class ConfigManager {\n constructor(private _update: () => Promise<tl.RawConfig>) {}\n\n private _destroyed = false\n private _config?: tl.RawConfig\n private _cdnConfig?: tl.RawCdnConfig\n\n private _updateTimeout?: NodeJS.Timeout\n private _updatingPromise?: Promise<void>\n\n private _listeners: ((config: tl.RawConfig) => void)[] = []\n\n get isStale(): boolean {\n return !this._config || this._config.expires <= Date.now() / 1000\n }\n\n update(force = false): Promise<void> {\n if (!force && !this.isStale) return Promise.resolve()\n if (this._updatingPromise) return this._updatingPromise\n\n return (this._updatingPromise = this._update().then((config) => {\n if (this._destroyed) return\n this._updatingPromise = undefined\n\n this.setConfig(config)\n }))\n }\n\n setConfig(config: tl.RawConfig): void {\n this._config = config\n\n if (this._updateTimeout) clearTimeout(this._updateTimeout)\n this._updateTimeout = setTimeout(\n () => void this.update().catch(() => {}),\n (config.expires - Date.now() / 1000) * 1000,\n )\n\n for (const cb of this._listeners) cb(config)\n }\n\n onConfigUpdate(cb: (config: tl.RawConfig) => void): void {\n this._listeners.push(cb)\n }\n\n offConfigUpdate(cb: (config: tl.RawConfig) => void): void {\n const idx = this._listeners.indexOf(cb)\n if (idx >= 0) this._listeners.splice(idx, 1)\n }\n\n getNow(): tl.RawConfig | undefined {\n return this._config\n }\n\n async get(): Promise<tl.RawConfig> {\n if (this.isStale) await this.update()\n\n return this._config!\n }\n\n destroy(): void {\n if (this._updateTimeout) clearTimeout(this._updateTimeout)\n this._listeners.length = 0\n this._destroyed = true\n }\n\n async findOption(params: {\n dcId: number\n allowIpv6?: boolean\n preferIpv6?: boolean\n allowMedia?: boolean\n preferMedia?: boolean\n cdn?: boolean\n }): Promise<tl.RawDcOption | undefined> {\n if (this.isStale) await this.update()\n\n const options = this._config!.dcOptions.filter((opt) => {\n if (opt.tcpoOnly) return false // unsupported\n if (opt.ipv6 && !params.allowIpv6) return false\n if (opt.mediaOnly && !params.allowMedia) return false\n if (opt.cdn && !params.cdn) return false\n\n return opt.id === params.dcId\n })\n\n if (params.preferMedia && params.preferIpv6) {\n const r = options.find((opt) => opt.mediaOnly && opt.ipv6)\n if (r) return r\n }\n\n if (params.preferMedia) {\n const r = options.find((opt) => opt.mediaOnly)\n if (r) return r\n }\n\n if (params.preferIpv6) {\n const r = options.find((opt) => opt.ipv6)\n if (r) return r\n }\n\n return options[0]\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};