@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
@@ -1,41 +1,39 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.millerRabin = void 0;
7
- const big_integer_1 = __importDefault(require("big-integer"));
8
4
  const bigint_utils_js_1 = require("../bigint-utils.js");
9
- function millerRabin(n, rounds = 20) {
5
+ function millerRabin(crypto, n, rounds = 20) {
10
6
  // small numbers: 0, 1 are not prime, 2, 3 are prime
11
- if (n.lt(big_integer_1.default[4]))
12
- return n.gt(big_integer_1.default[1]);
13
- if (n.isEven() || n.isNegative())
7
+ if (n < 4n)
8
+ return n > 1n;
9
+ if (n % 2n === 0n || n < 0n)
14
10
  return false;
15
- const nBits = n.bitLength().toJSNumber();
16
- const nSub = n.minus(1);
11
+ const nBits = (0, bigint_utils_js_1.bigIntBitLength)(n);
12
+ const nSub = n - 1n;
17
13
  const r = (0, bigint_utils_js_1.twoMultiplicity)(nSub);
18
- const d = nSub.shiftRight(r);
14
+ const d = nSub >> r;
19
15
  for (let i = 0; i < rounds; i++) {
20
16
  let base;
21
17
  do {
22
- base = (0, bigint_utils_js_1.randomBigIntBits)(nBits);
23
- } while (base.leq(big_integer_1.default.one) || base.geq(nSub));
24
- let x = base.modPow(d, n);
25
- if (x.eq(big_integer_1.default.one) || x.eq(nSub))
18
+ base = (0, bigint_utils_js_1.randomBigIntBits)(crypto, nBits);
19
+ } while (base <= 1n || base >= nSub);
20
+ let x = (0, bigint_utils_js_1.bigIntModPow)(base, d, n);
21
+ // if (x.eq(bigInt.one) || x.eq(nSub)) continue
22
+ if (x === 1n || x === nSub)
26
23
  continue;
27
- let i = big_integer_1.default.zero;
24
+ let i = 0n;
28
25
  let y;
29
- while (i.lt(r)) {
30
- y = x.modPow(big_integer_1.default[2], n);
31
- if (x.eq(big_integer_1.default.one))
26
+ while (i < r) {
27
+ // y = x.modPow(bigInt[2], n)
28
+ y = (0, bigint_utils_js_1.bigIntModPow)(x, 2n, n);
29
+ if (x === 1n)
32
30
  return false;
33
- if (x.eq(nSub))
31
+ if (x === nSub)
34
32
  break;
35
- i = i.plus(big_integer_1.default.one);
33
+ i += 1n;
36
34
  x = y;
37
35
  }
38
- if (i.eq(r))
36
+ if (i === r)
39
37
  return false;
40
38
  }
41
39
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"miller-rabin.js","sourceRoot":"","sources":["../../../../src/utils/crypto/miller-rabin.ts"],"names":[],"mappings":";;;;;;AAAA,8DAAgD;AAEhD,wDAAsE;AAEtE,SAAgB,WAAW,CAAC,CAAa,EAAE,MAAM,GAAG,EAAE;IAClD,oDAAoD;IACpD,IAAI,CAAC,CAAC,EAAE,CAAC,qBAAM,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,qBAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,UAAU,EAAE;QAAE,OAAO,KAAK,CAAA;IAE9C,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,CAAA;IACxC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAEvB,MAAM,CAAC,GAAG,IAAA,iCAAe,EAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;QAC7B,IAAI,IAAI,CAAA;QAER,GAAG;YACC,IAAI,GAAG,IAAA,kCAAgB,EAAC,KAAK,CAAC,CAAA;SACjC,QAAQ,IAAI,CAAC,GAAG,CAAC,qBAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAC;QAEhD,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACzB,IAAI,CAAC,CAAC,EAAE,CAAC,qBAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;YAAE,SAAQ;QAE5C,IAAI,CAAC,GAAG,qBAAM,CAAC,IAAI,CAAA;QACnB,IAAI,CAAa,CAAA;QAEjB,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACZ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,qBAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAE1B,IAAI,CAAC,CAAC,EAAE,CAAC,qBAAM,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAA;YAClC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;gBAAE,MAAK;YACrB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,qBAAM,CAAC,GAAG,CAAC,CAAA;YAEtB,CAAC,GAAG,CAAC,CAAA;SACR;QAED,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;KAC5B;IAED,OAAO,IAAI,CAAA;AACf,CAAC;AAtCD,kCAsCC","sourcesContent":["import bigInt, { BigInteger } from 'big-integer'\n\nimport { randomBigIntBits, twoMultiplicity } from '../bigint-utils.js'\n\nexport function millerRabin(n: BigInteger, rounds = 20): boolean {\n // small numbers: 0, 1 are not prime, 2, 3 are prime\n if (n.lt(bigInt[4])) return n.gt(bigInt[1])\n if (n.isEven() || n.isNegative()) return false\n\n const nBits = n.bitLength().toJSNumber()\n const nSub = n.minus(1)\n\n const r = twoMultiplicity(nSub)\n const d = nSub.shiftRight(r)\n\n for (let i = 0; i < rounds; i++) {\n let base\n\n do {\n base = randomBigIntBits(nBits)\n } while (base.leq(bigInt.one) || base.geq(nSub))\n\n let x = base.modPow(d, n)\n if (x.eq(bigInt.one) || x.eq(nSub)) continue\n\n let i = bigInt.zero\n let y: BigInteger\n\n while (i.lt(r)) {\n y = x.modPow(bigInt[2], n)\n\n if (x.eq(bigInt.one)) return false\n if (x.eq(nSub)) break\n i = i.plus(bigInt.one)\n\n x = y\n }\n\n if (i.eq(r)) return false\n }\n\n return true\n}\n"]}
1
+ {"version":3,"file":"miller-rabin.js","sourceRoot":"","sources":["../../../../src/utils/crypto/miller-rabin.ts"],"names":[],"mappings":";;;AAAA,wDAAqG;AAGrG,SAAgB,WAAW,CAAC,MAAuB,EAAE,CAAS,EAAE,MAAM,GAAG,EAAE;IACvE,oDAAoD;IACpD,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,KAAK,CAAA;IAEzC,MAAM,KAAK,GAAG,IAAA,iCAAe,EAAC,CAAC,CAAC,CAAA;IAChC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAA;IAEnB,MAAM,CAAC,GAAG,IAAA,iCAAe,EAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;QAC7B,IAAI,IAAI,CAAA;QAER,GAAG;YACC,IAAI,GAAG,IAAA,kCAAgB,EAAC,MAAM,EAAE,KAAK,CAAC,CAAA;SACzC,QAAQ,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAC;QAEpC,IAAI,CAAC,GAAG,IAAA,8BAAY,EAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAChC,+CAA+C;QAC/C,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI;YAAE,SAAQ;QAEpC,IAAI,CAAC,GAAG,EAAE,CAAA;QACV,IAAI,CAAS,CAAA;QAEb,OAAO,CAAC,GAAG,CAAC,EAAE;YACV,6BAA6B;YAC7B,CAAC,GAAG,IAAA,8BAAY,EAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;YAE1B,IAAI,CAAC,KAAK,EAAE;gBAAE,OAAO,KAAK,CAAA;YAC1B,IAAI,CAAC,KAAK,IAAI;gBAAE,MAAK;YACrB,CAAC,IAAI,EAAE,CAAA;YAEP,CAAC,GAAG,CAAC,CAAA;SACR;QAED,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;KAC5B;IAED,OAAO,IAAI,CAAA;AACf,CAAC;AAxCD,kCAwCC","sourcesContent":["import { bigIntBitLength, bigIntModPow, randomBigIntBits, twoMultiplicity } from '../bigint-utils.js'\nimport { ICryptoProvider } from './abstract.js'\n\nexport function millerRabin(crypto: ICryptoProvider, n: bigint, rounds = 20): boolean {\n // small numbers: 0, 1 are not prime, 2, 3 are prime\n if (n < 4n) return n > 1n\n if (n % 2n === 0n || n < 0n) return false\n\n const nBits = bigIntBitLength(n)\n const nSub = n - 1n\n\n const r = twoMultiplicity(nSub)\n const d = nSub >> r\n\n for (let i = 0; i < rounds; i++) {\n let base\n\n do {\n base = randomBigIntBits(crypto, nBits)\n } while (base <= 1n || base >= nSub)\n\n let x = bigIntModPow(base, d, n)\n // if (x.eq(bigInt.one) || x.eq(nSub)) continue\n if (x === 1n || x === nSub) continue\n\n let i = 0n\n let y: bigint\n\n while (i < r) {\n // y = x.modPow(bigInt[2], n)\n y = bigIntModPow(x, 2n, n)\n\n if (x === 1n) return false\n if (x === nSub) break\n i += 1n\n\n x = y\n }\n\n if (i === r) return false\n }\n\n return true\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const index_js_1 = require("./index.js");
5
+ const miller_rabin_js_1 = require("./miller-rabin.js");
6
+ (0, vitest_1.describe)('miller-rabin test', function () {
7
+ // miller-rabin factorization relies on RNG, so we should use a real random number generator
8
+ const c = (0, index_js_1.defaultCryptoProviderFactory)();
9
+ const testMillerRabin = (n, isPrime) => {
10
+ (0, vitest_1.expect)((0, miller_rabin_js_1.millerRabin)(c, BigInt(n))).eq(isPrime);
11
+ };
12
+ (0, vitest_1.it)('should correctly label small primes as probable primes', () => {
13
+ const smallOddPrimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31];
14
+ for (const prime of smallOddPrimes) {
15
+ testMillerRabin(prime, true);
16
+ }
17
+ });
18
+ (0, vitest_1.it)('should correctly label small odd composite numbers as composite', () => {
19
+ const smallOddPrimes = [9, 15, 21, 25, 27, 33, 35];
20
+ for (const prime of smallOddPrimes) {
21
+ testMillerRabin(prime, false);
22
+ }
23
+ });
24
+ // primes are generated using `openssl prime -generate -bits <bits>`
25
+ (0, vitest_1.it)('should work for 512-bit numbers', () => {
26
+ testMillerRabin('8411445470921866378538628788380866906358949375899610911537071281076627385046125382763689993349183284546479522400013151510610266158235924343045768103605519', true);
27
+ testMillerRabin('11167561990563990242158096122232207092938761092751537312016255867850441858086589598418467012717458858604863547175649456433632887622140170743409535470973399', true);
28
+ testMillerRabin('11006717791910450367418249787526506184731090161438431250022510598653874155081488487035840577645711578911087148186160668569071839053453201592321650008610329', true);
29
+ testMillerRabin('12224330340162812215033324917156282302617911690617664923428569636370785775561435789211091021550357876767050350997458404009005800772805534351607294516706177', true);
30
+ // above numbers but -2 (not prime)
31
+ testMillerRabin('8411445470921866378538628788380866906358949375899610911537071281076627385046125382763689993349183284546479522400013151510610266158235924343045768103605517', false);
32
+ testMillerRabin('11167561990563990242158096122232207092938761092751537312016255867850441858086589598418467012717458858604863547175649456433632887622140170743409535470973397', false);
33
+ testMillerRabin('11006717791910450367418249787526506184731090161438431250022510598653874155081488487035840577645711578911087148186160668569071839053453201592321650008610327', false);
34
+ testMillerRabin('12224330340162812215033324917156282302617911690617664923428569636370785775561435789211091021550357876767050350997458404009005800772805534351607294516706175', false);
35
+ });
36
+ (0, vitest_1.it)('should work for 1024-bit numbers', () => {
37
+ testMillerRabin('94163180970530844245052892199633535954736903357996153321496979115367320260897793334681106861766748541439161886270777106456088209508872459550450259737267142959061663564218457086654112219462515165219295402175541003899136060178102898376369981338103600856012709228116661479275753497725541132207243717937379815409', true);
38
+ testMillerRabin('97324962433497727515811278760066576725849776656602017497363465683978397629803148191267105308901733336070351381654371470561376353774017284623969415330564867697353080030917333974193741719718950105404732792050882127213356260415251087867407489400712288570880407613514781891914135956778687719588061176455381937003', true);
39
+ testMillerRabin('92511311413226091818378551616231701579277597795073142338527410334932345968554993390789667936819230228388142960299649466238701015865565141753710450319875546944139442823075990348978746055937500467483161699883905850192191164043687791185635729923497381849380102040768674652775240505782671289535260164547714030567', true);
40
+ testMillerRabin('98801756216479639848708157708947504990501845258427605711852570166662700681215707617225664134994147912417941920327932092748574265476658124536672887141144222716123085451749764522435906007567360583062117498919471220566974634924384147341592903939264267901029640119196259026154529723870788246284629644039137378253', true);
41
+ // above numbers but -2 (not prime)
42
+ testMillerRabin('94163180970530844245052892199633535954736903357996153321496979115367320260897793334681106861766748541439161886270777106456088209508872459550450259737267142959061663564218457086654112219462515165219295402175541003899136060178102898376369981338103600856012709228116661479275753497725541132207243717937379815407', false);
43
+ testMillerRabin('97324962433497727515811278760066576725849776656602017497363465683978397629803148191267105308901733336070351381654371470561376353774017284623969415330564867697353080030917333974193741719718950105404732792050882127213356260415251087867407489400712288570880407613514781891914135956778687719588061176455381937001', false);
44
+ testMillerRabin('92511311413226091818378551616231701579277597795073142338527410334932345968554993390789667936819230228388142960299649466238701015865565141753710450319875546944139442823075990348978746055937500467483161699883905850192191164043687791185635729923497381849380102040768674652775240505782671289535260164547714030565', false);
45
+ testMillerRabin('98801756216479639848708157708947504990501845258427605711852570166662700681215707617225664134994147912417941920327932092748574265476658124536672887141144222716123085451749764522435906007567360583062117498919471220566974634924384147341592903939264267901029640119196259026154529723870788246284629644039137378251', false);
46
+ });
47
+ (0, vitest_1.it)('should work for 2048-bit numbers', () => {
48
+ testMillerRabin('28608382334358769588283288249494859626901014972463291352091976543138105382282108662849885913053034513852843449409838151123568984617793641641937583673207501643041336002587032201383537626393235736734494131431069043382068545865505150651648610506542819001961332454611129372758714288168807328523359776577571626967649079147416191592855529888846889532625386469236278694936872628305052827422772792103722178298844645210242389265273407924858034431614414896134561928996888883994953322861399988094086562513898527391555490352156627307769278185444897960555995383228897584818577375695810423475039211516849716140051437120083274285367', true);
49
+ testMillerRabin('30244022694659482453371920976249272809817388822378671144866806600284132009663832003348737406289715119965835410140834733465553787513841966120831322372642881643693711233087233983267648392814127424201572290931937482043046169402667397610783447368703776842799852222745601531140231486417855517072392416789672922529566643118973930252809010605519948446055538976582290902060054788109497630796585770940656002892943575479533099350429655210881833493066716819282707441553612603960556051122162329171373373251909387401572866056121964608595895425640834764028568120995397759283490218181167000161310959711677055741632674632758727382743', true);
50
+ testMillerRabin('30560953105766401423987964658775999222308579908395527900931049506803845883459894704297458477118152899910620180302473409631442956208933061650967001020981432894530064472547770442696756724169958362395601360296775798187903794894866967342028337982275745956538015473621792510615113531964380246815875830970404687926061637030085629909804357717955251735074071072456074274947993921828878633638119117086342305530526661796817095624933200483138188878398983149622639425550360394901699701985050966685840649129419227936413574227792077082510807968104733387734970009620450108276446659342203263759999068046251645984039420643003580284779', true);
51
+ // above numbers but -2 (not prime)
52
+ testMillerRabin('28608382334358769588283288249494859626901014972463291352091976543138105382282108662849885913053034513852843449409838151123568984617793641641937583673207501643041336002587032201383537626393235736734494131431069043382068545865505150651648610506542819001961332454611129372758714288168807328523359776577571626967649079147416191592855529888846889532625386469236278694936872628305052827422772792103722178298844645210242389265273407924858034431614414896134561928996888883994953322861399988094086562513898527391555490352156627307769278185444897960555995383228897584818577375695810423475039211516849716140051437120083274285365', false);
53
+ testMillerRabin('30244022694659482453371920976249272809817388822378671144866806600284132009663832003348737406289715119965835410140834733465553787513841966120831322372642881643693711233087233983267648392814127424201572290931937482043046169402667397610783447368703776842799852222745601531140231486417855517072392416789672922529566643118973930252809010605519948446055538976582290902060054788109497630796585770940656002892943575479533099350429655210881833493066716819282707441553612603960556051122162329171373373251909387401572866056121964608595895425640834764028568120995397759283490218181167000161310959711677055741632674632758727382741', false);
54
+ testMillerRabin('30560953105766401423987964658775999222308579908395527900931049506803845883459894704297458477118152899910620180302473409631442956208933061650967001020981432894530064472547770442696756724169958362395601360296775798187903794894866967342028337982275745956538015473621792510615113531964380246815875830970404687926061637030085629909804357717955251735074071072456074274947993921828878633638119117086342305530526661796817095624933200483138188878398983149622639425550360394901699701985050966685840649129419227936413574227792077082510807968104733387734970009620450108276446659342203263759999068046251645984039420643003580284777', false);
55
+ // dh_prime used by telegram, as seen in https://core.telegram.org/mtproto/security_guidelines
56
+ const telegramDhPrime = 'C7 1C AE B9 C6 B1 C9 04 8E 6C 52 2F 70 F1 3F 73 98 0D 40 23 8E 3E 21 C1 49 34 D0 37 56 3D 93 0F 48 19 8A 0A A7 C1 40 58 22 94 93 D2 25 30 F4 DB FA 33 6F 6E 0A C9 25 13 95 43 AE D4 4C CE 7C 37 20 FD 51 F6 94 58 70 5A C6 8C D4 FE 6B 6B 13 AB DC 97 46 51 29 69 32 84 54 F1 8F AF 8C 59 5F 64 24 77 FE 96 BB 2A 94 1D 5B CD 1D 4A C8 CC 49 88 07 08 FA 9B 37 8E 3C 4F 3A 90 60 BE E6 7C F9 A4 A4 A6 95 81 10 51 90 7E 16 27 53 B5 6B 0F 6B 41 0D BA 74 D8 A8 4B 2A 14 B3 14 4E 0E F1 28 47 54 FD 17 ED 95 0D 59 65 B4 B9 DD 46 58 2D B1 17 8D 16 9C 6B C4 65 B0 D6 FF 9C A3 92 8F EF 5B 9A E4 E4 18 FC 15 E8 3E BE A0 F8 7F A9 FF 5E ED 70 05 0D ED 28 49 F4 7B F9 59 D9 56 85 0C E9 29 85 1F 0D 81 15 F6 35 B1 05 EE 2E 4E 15 D0 4B 24 54 BF 6F 4F AD F0 34 B1 04 03 11 9C D8 E3 B9 2F CC 5B';
57
+ testMillerRabin(BigInt('0x' + telegramDhPrime.replace(/ /g, '')), true);
58
+ });
59
+ }, { timeout: 10000 }); // since miller-rabin factorization relies on RNG, it may take a while (or may not!)
60
+ //# sourceMappingURL=miller-rabin.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"miller-rabin.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/miller-rabin.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { defaultCryptoProviderFactory } from './index.js'\nimport { millerRabin } from './miller-rabin.js'\n\ndescribe(\n 'miller-rabin test',\n function () {\n // miller-rabin factorization relies on RNG, so we should use a real random number generator\n const c = defaultCryptoProviderFactory()\n\n const testMillerRabin = (n: number | string | bigint, isPrime: boolean) => {\n expect(millerRabin(c, BigInt(n))).eq(isPrime)\n }\n\n it('should correctly label small primes as probable primes', () => {\n const smallOddPrimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]\n\n for (const prime of smallOddPrimes) {\n testMillerRabin(prime, true)\n }\n })\n\n it('should correctly label small odd composite numbers as composite', () => {\n const smallOddPrimes = [9, 15, 21, 25, 27, 33, 35]\n\n for (const prime of smallOddPrimes) {\n testMillerRabin(prime, false)\n }\n })\n\n // primes are generated using `openssl prime -generate -bits <bits>`\n\n it('should work for 512-bit numbers', () => {\n testMillerRabin(\n '8411445470921866378538628788380866906358949375899610911537071281076627385046125382763689993349183284546479522400013151510610266158235924343045768103605519',\n true,\n )\n testMillerRabin(\n '11167561990563990242158096122232207092938761092751537312016255867850441858086589598418467012717458858604863547175649456433632887622140170743409535470973399',\n true,\n )\n testMillerRabin(\n '11006717791910450367418249787526506184731090161438431250022510598653874155081488487035840577645711578911087148186160668569071839053453201592321650008610329',\n true,\n )\n testMillerRabin(\n '12224330340162812215033324917156282302617911690617664923428569636370785775561435789211091021550357876767050350997458404009005800772805534351607294516706177',\n true,\n )\n\n // above numbers but -2 (not prime)\n testMillerRabin(\n '8411445470921866378538628788380866906358949375899610911537071281076627385046125382763689993349183284546479522400013151510610266158235924343045768103605517',\n false,\n )\n testMillerRabin(\n '11167561990563990242158096122232207092938761092751537312016255867850441858086589598418467012717458858604863547175649456433632887622140170743409535470973397',\n false,\n )\n testMillerRabin(\n '11006717791910450367418249787526506184731090161438431250022510598653874155081488487035840577645711578911087148186160668569071839053453201592321650008610327',\n false,\n )\n testMillerRabin(\n '12224330340162812215033324917156282302617911690617664923428569636370785775561435789211091021550357876767050350997458404009005800772805534351607294516706175',\n false,\n )\n })\n\n it('should work for 1024-bit numbers', () => {\n testMillerRabin(\n '94163180970530844245052892199633535954736903357996153321496979115367320260897793334681106861766748541439161886270777106456088209508872459550450259737267142959061663564218457086654112219462515165219295402175541003899136060178102898376369981338103600856012709228116661479275753497725541132207243717937379815409',\n true,\n )\n testMillerRabin(\n '97324962433497727515811278760066576725849776656602017497363465683978397629803148191267105308901733336070351381654371470561376353774017284623969415330564867697353080030917333974193741719718950105404732792050882127213356260415251087867407489400712288570880407613514781891914135956778687719588061176455381937003',\n true,\n )\n testMillerRabin(\n '92511311413226091818378551616231701579277597795073142338527410334932345968554993390789667936819230228388142960299649466238701015865565141753710450319875546944139442823075990348978746055937500467483161699883905850192191164043687791185635729923497381849380102040768674652775240505782671289535260164547714030567',\n true,\n )\n testMillerRabin(\n '98801756216479639848708157708947504990501845258427605711852570166662700681215707617225664134994147912417941920327932092748574265476658124536672887141144222716123085451749764522435906007567360583062117498919471220566974634924384147341592903939264267901029640119196259026154529723870788246284629644039137378253',\n true,\n )\n\n // above numbers but -2 (not prime)\n testMillerRabin(\n '94163180970530844245052892199633535954736903357996153321496979115367320260897793334681106861766748541439161886270777106456088209508872459550450259737267142959061663564218457086654112219462515165219295402175541003899136060178102898376369981338103600856012709228116661479275753497725541132207243717937379815407',\n false,\n )\n testMillerRabin(\n '97324962433497727515811278760066576725849776656602017497363465683978397629803148191267105308901733336070351381654371470561376353774017284623969415330564867697353080030917333974193741719718950105404732792050882127213356260415251087867407489400712288570880407613514781891914135956778687719588061176455381937001',\n false,\n )\n testMillerRabin(\n '92511311413226091818378551616231701579277597795073142338527410334932345968554993390789667936819230228388142960299649466238701015865565141753710450319875546944139442823075990348978746055937500467483161699883905850192191164043687791185635729923497381849380102040768674652775240505782671289535260164547714030565',\n false,\n )\n testMillerRabin(\n '98801756216479639848708157708947504990501845258427605711852570166662700681215707617225664134994147912417941920327932092748574265476658124536672887141144222716123085451749764522435906007567360583062117498919471220566974634924384147341592903939264267901029640119196259026154529723870788246284629644039137378251',\n false,\n )\n })\n\n it('should work for 2048-bit numbers', () => {\n testMillerRabin(\n '28608382334358769588283288249494859626901014972463291352091976543138105382282108662849885913053034513852843449409838151123568984617793641641937583673207501643041336002587032201383537626393235736734494131431069043382068545865505150651648610506542819001961332454611129372758714288168807328523359776577571626967649079147416191592855529888846889532625386469236278694936872628305052827422772792103722178298844645210242389265273407924858034431614414896134561928996888883994953322861399988094086562513898527391555490352156627307769278185444897960555995383228897584818577375695810423475039211516849716140051437120083274285367',\n true,\n )\n testMillerRabin(\n '30244022694659482453371920976249272809817388822378671144866806600284132009663832003348737406289715119965835410140834733465553787513841966120831322372642881643693711233087233983267648392814127424201572290931937482043046169402667397610783447368703776842799852222745601531140231486417855517072392416789672922529566643118973930252809010605519948446055538976582290902060054788109497630796585770940656002892943575479533099350429655210881833493066716819282707441553612603960556051122162329171373373251909387401572866056121964608595895425640834764028568120995397759283490218181167000161310959711677055741632674632758727382743',\n true,\n )\n testMillerRabin(\n '30560953105766401423987964658775999222308579908395527900931049506803845883459894704297458477118152899910620180302473409631442956208933061650967001020981432894530064472547770442696756724169958362395601360296775798187903794894866967342028337982275745956538015473621792510615113531964380246815875830970404687926061637030085629909804357717955251735074071072456074274947993921828878633638119117086342305530526661796817095624933200483138188878398983149622639425550360394901699701985050966685840649129419227936413574227792077082510807968104733387734970009620450108276446659342203263759999068046251645984039420643003580284779',\n true,\n )\n\n // above numbers but -2 (not prime)\n testMillerRabin(\n '28608382334358769588283288249494859626901014972463291352091976543138105382282108662849885913053034513852843449409838151123568984617793641641937583673207501643041336002587032201383537626393235736734494131431069043382068545865505150651648610506542819001961332454611129372758714288168807328523359776577571626967649079147416191592855529888846889532625386469236278694936872628305052827422772792103722178298844645210242389265273407924858034431614414896134561928996888883994953322861399988094086562513898527391555490352156627307769278185444897960555995383228897584818577375695810423475039211516849716140051437120083274285365',\n false,\n )\n testMillerRabin(\n '30244022694659482453371920976249272809817388822378671144866806600284132009663832003348737406289715119965835410140834733465553787513841966120831322372642881643693711233087233983267648392814127424201572290931937482043046169402667397610783447368703776842799852222745601531140231486417855517072392416789672922529566643118973930252809010605519948446055538976582290902060054788109497630796585770940656002892943575479533099350429655210881833493066716819282707441553612603960556051122162329171373373251909387401572866056121964608595895425640834764028568120995397759283490218181167000161310959711677055741632674632758727382741',\n false,\n )\n testMillerRabin(\n '30560953105766401423987964658775999222308579908395527900931049506803845883459894704297458477118152899910620180302473409631442956208933061650967001020981432894530064472547770442696756724169958362395601360296775798187903794894866967342028337982275745956538015473621792510615113531964380246815875830970404687926061637030085629909804357717955251735074071072456074274947993921828878633638119117086342305530526661796817095624933200483138188878398983149622639425550360394901699701985050966685840649129419227936413574227792077082510807968104733387734970009620450108276446659342203263759999068046251645984039420643003580284777',\n false,\n )\n\n // dh_prime used by telegram, as seen in https://core.telegram.org/mtproto/security_guidelines\n const telegramDhPrime =\n 'C7 1C AE B9 C6 B1 C9 04 8E 6C 52 2F 70 F1 3F 73 98 0D 40 23 8E 3E 21 C1 49 34 D0 37 56 3D 93 0F 48 19 8A 0A A7 C1 40 58 22 94 93 D2 25 30 F4 DB FA 33 6F 6E 0A C9 25 13 95 43 AE D4 4C CE 7C 37 20 FD 51 F6 94 58 70 5A C6 8C D4 FE 6B 6B 13 AB DC 97 46 51 29 69 32 84 54 F1 8F AF 8C 59 5F 64 24 77 FE 96 BB 2A 94 1D 5B CD 1D 4A C8 CC 49 88 07 08 FA 9B 37 8E 3C 4F 3A 90 60 BE E6 7C F9 A4 A4 A6 95 81 10 51 90 7E 16 27 53 B5 6B 0F 6B 41 0D BA 74 D8 A8 4B 2A 14 B3 14 4E 0E F1 28 47 54 FD 17 ED 95 0D 59 65 B4 B9 DD 46 58 2D B1 17 8D 16 9C 6B C4 65 B0 D6 FF 9C A3 92 8F EF 5B 9A E4 E4 18 FC 15 E8 3E BE A0 F8 7F A9 FF 5E ED 70 05 0D ED 28 49 F4 7B F9 59 D9 56 85 0C E9 29 85 1F 0D 81 15 F6 35 B1 05 EE 2E 4E 15 D0 4B 24 54 BF 6F 4F AD F0 34 B1 04 03 11 9C D8 E3 B9 2F CC 5B'\n testMillerRabin(BigInt('0x' + telegramDhPrime.replace(/ /g, '')), true)\n })\n },\n { timeout: 10000 },\n) // since miller-rabin factorization relies on RNG, it may take a while (or may not!)\n"]}
@@ -8,7 +8,7 @@ import { ICryptoProvider, IEncryptionScheme } from './abstract.js';
8
8
  * @param newNonce New nonce
9
9
  * @returns Tuple: `[key, iv]`
10
10
  */
11
- export declare function generateKeyAndIvFromNonce(crypto: ICryptoProvider, serverNonce: Uint8Array, newNonce: Uint8Array): Promise<[Uint8Array, Uint8Array]>;
11
+ export declare function generateKeyAndIvFromNonce(crypto: ICryptoProvider, serverNonce: Uint8Array, newNonce: Uint8Array): [Uint8Array, Uint8Array];
12
12
  /**
13
13
  * Create AES IGE instance for message (given auth key and message key)
14
14
  * as defined by MTProto v2.
@@ -18,7 +18,7 @@ export declare function generateKeyAndIvFromNonce(crypto: ICryptoProvider, serve
18
18
  * @param messageKey Message key
19
19
  * @param client Whether this is a client to server message
20
20
  */
21
- export declare function createAesIgeForMessage(crypto: ICryptoProvider, authKey: Uint8Array, messageKey: Uint8Array, client: boolean): Promise<IEncryptionScheme>;
21
+ export declare function createAesIgeForMessage(crypto: ICryptoProvider, authKey: Uint8Array, messageKey: Uint8Array, client: boolean): IEncryptionScheme;
22
22
  /**
23
23
  * Create AES IGE instance for file (given auth key and message key)
24
24
  * as defined by MTProto v1.
@@ -28,4 +28,4 @@ export declare function createAesIgeForMessage(crypto: ICryptoProvider, authKey:
28
28
  * @param messageKey Message key
29
29
  * @param client Whether this is a client to server message
30
30
  */
31
- export declare function createAesIgeForMessageOld(crypto: ICryptoProvider, authKey: Uint8Array, messageKey: Uint8Array, client: boolean): Promise<IEncryptionScheme>;
31
+ export declare function createAesIgeForMessageOld(crypto: ICryptoProvider, authKey: Uint8Array, messageKey: Uint8Array, client: boolean): IEncryptionScheme;
@@ -11,10 +11,10 @@ const buffer_utils_js_1 = require("../buffer-utils.js");
11
11
  * @param newNonce New nonce
12
12
  * @returns Tuple: `[key, iv]`
13
13
  */
14
- async function generateKeyAndIvFromNonce(crypto, serverNonce, newNonce) {
15
- const hash1 = await crypto.sha1((0, buffer_utils_js_1.concatBuffers)([newNonce, serverNonce]));
16
- const hash2 = await crypto.sha1((0, buffer_utils_js_1.concatBuffers)([serverNonce, newNonce]));
17
- const hash3 = await crypto.sha1((0, buffer_utils_js_1.concatBuffers)([newNonce, newNonce]));
14
+ function generateKeyAndIvFromNonce(crypto, serverNonce, newNonce) {
15
+ const hash1 = crypto.sha1((0, buffer_utils_js_1.concatBuffers)([newNonce, serverNonce]));
16
+ const hash2 = crypto.sha1((0, buffer_utils_js_1.concatBuffers)([serverNonce, newNonce]));
17
+ const hash3 = crypto.sha1((0, buffer_utils_js_1.concatBuffers)([newNonce, newNonce]));
18
18
  const key = (0, buffer_utils_js_1.concatBuffers)([hash1, hash2.subarray(0, 12)]);
19
19
  const iv = (0, buffer_utils_js_1.concatBuffers)([hash2.subarray(12, 20), hash3, newNonce.subarray(0, 4)]);
20
20
  return [key, iv];
@@ -29,10 +29,10 @@ exports.generateKeyAndIvFromNonce = generateKeyAndIvFromNonce;
29
29
  * @param messageKey Message key
30
30
  * @param client Whether this is a client to server message
31
31
  */
32
- async function createAesIgeForMessage(crypto, authKey, messageKey, client) {
32
+ function createAesIgeForMessage(crypto, authKey, messageKey, client) {
33
33
  const x = client ? 0 : 8;
34
- const sha256a = await crypto.sha256((0, buffer_utils_js_1.concatBuffers)([messageKey, authKey.subarray(x, 36 + x)]));
35
- const sha256b = await crypto.sha256((0, buffer_utils_js_1.concatBuffers)([authKey.subarray(40 + x, 76 + x), messageKey]));
34
+ const sha256a = crypto.sha256((0, buffer_utils_js_1.concatBuffers)([messageKey, authKey.subarray(x, 36 + x)]));
35
+ const sha256b = crypto.sha256((0, buffer_utils_js_1.concatBuffers)([authKey.subarray(40 + x, 76 + x), messageKey]));
36
36
  const key = (0, buffer_utils_js_1.concatBuffers)([sha256a.subarray(0, 8), sha256b.subarray(8, 24), sha256a.subarray(24, 32)]);
37
37
  const iv = (0, buffer_utils_js_1.concatBuffers)([sha256b.subarray(0, 8), sha256a.subarray(8, 24), sha256b.subarray(24, 32)]);
38
38
  return crypto.createAesIge(key, iv);
@@ -47,12 +47,12 @@ exports.createAesIgeForMessage = createAesIgeForMessage;
47
47
  * @param messageKey Message key
48
48
  * @param client Whether this is a client to server message
49
49
  */
50
- async function createAesIgeForMessageOld(crypto, authKey, messageKey, client) {
50
+ function createAesIgeForMessageOld(crypto, authKey, messageKey, client) {
51
51
  const x = client ? 0 : 8;
52
- const sha1a = await crypto.sha1((0, buffer_utils_js_1.concatBuffers)([messageKey, authKey.subarray(x, 32 + x)]));
53
- const sha1b = await crypto.sha1((0, buffer_utils_js_1.concatBuffers)([authKey.subarray(32 + x, 48 + x), messageKey, authKey.subarray(48 + x, 64 + x)]));
54
- const sha1c = await crypto.sha1((0, buffer_utils_js_1.concatBuffers)([authKey.subarray(64 + x, 96 + x), messageKey]));
55
- const sha1d = await crypto.sha1((0, buffer_utils_js_1.concatBuffers)([messageKey, authKey.subarray(96 + x, 128 + x)]));
52
+ const sha1a = crypto.sha1((0, buffer_utils_js_1.concatBuffers)([messageKey, authKey.subarray(x, 32 + x)]));
53
+ const sha1b = crypto.sha1((0, buffer_utils_js_1.concatBuffers)([authKey.subarray(32 + x, 48 + x), messageKey, authKey.subarray(48 + x, 64 + x)]));
54
+ const sha1c = crypto.sha1((0, buffer_utils_js_1.concatBuffers)([authKey.subarray(64 + x, 96 + x), messageKey]));
55
+ const sha1d = crypto.sha1((0, buffer_utils_js_1.concatBuffers)([messageKey, authKey.subarray(96 + x, 128 + x)]));
56
56
  const key = (0, buffer_utils_js_1.concatBuffers)([sha1a.subarray(0, 8), sha1b.subarray(8, 20), sha1c.subarray(4, 16)]);
57
57
  const iv = (0, buffer_utils_js_1.concatBuffers)([
58
58
  sha1a.subarray(8, 20),
@@ -1 +1 @@
1
- {"version":3,"file":"mtproto.js","sourceRoot":"","sources":["../../../../src/utils/crypto/mtproto.ts"],"names":[],"mappings":"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","sourcesContent":["import { concatBuffers } from '../buffer-utils.js'\nimport { ICryptoProvider, IEncryptionScheme } from './abstract.js'\n\n/**\n * Generate AES key and IV from nonces as defined by MTProto.\n * Used in authorization flow.\n *\n * @param crypto Crypto provider\n * @param serverNonce Server nonce\n * @param newNonce New nonce\n * @returns Tuple: `[key, iv]`\n */\nexport async function generateKeyAndIvFromNonce(\n crypto: ICryptoProvider,\n serverNonce: Uint8Array,\n newNonce: Uint8Array,\n): Promise<[Uint8Array, Uint8Array]> {\n const hash1 = await crypto.sha1(concatBuffers([newNonce, serverNonce]))\n const hash2 = await crypto.sha1(concatBuffers([serverNonce, newNonce]))\n const hash3 = await crypto.sha1(concatBuffers([newNonce, newNonce]))\n\n const key = concatBuffers([hash1, hash2.subarray(0, 12)])\n const iv = concatBuffers([hash2.subarray(12, 20), hash3, newNonce.subarray(0, 4)])\n\n return [key, iv]\n}\n\n/**\n * Create AES IGE instance for message (given auth key and message key)\n * as defined by MTProto v2.\n *\n * @param crypto Crypto provider\n * @param authKey Authorization key\n * @param messageKey Message key\n * @param client Whether this is a client to server message\n */\nexport async function createAesIgeForMessage(\n crypto: ICryptoProvider,\n authKey: Uint8Array,\n messageKey: Uint8Array,\n client: boolean,\n): Promise<IEncryptionScheme> {\n const x = client ? 0 : 8\n const sha256a = await crypto.sha256(concatBuffers([messageKey, authKey.subarray(x, 36 + x)]))\n const sha256b = await crypto.sha256(concatBuffers([authKey.subarray(40 + x, 76 + x), messageKey]))\n\n const key = concatBuffers([sha256a.subarray(0, 8), sha256b.subarray(8, 24), sha256a.subarray(24, 32)])\n const iv = concatBuffers([sha256b.subarray(0, 8), sha256a.subarray(8, 24), sha256b.subarray(24, 32)])\n\n return crypto.createAesIge(key, iv)\n}\n\n/**\n * Create AES IGE instance for file (given auth key and message key)\n * as defined by MTProto v1.\n *\n * @param crypto Crypto provider\n * @param authKey Authorization key\n * @param messageKey Message key\n * @param client Whether this is a client to server message\n */\nexport async function createAesIgeForMessageOld(\n crypto: ICryptoProvider,\n authKey: Uint8Array,\n messageKey: Uint8Array,\n client: boolean,\n): Promise<IEncryptionScheme> {\n const x = client ? 0 : 8\n const sha1a = await crypto.sha1(concatBuffers([messageKey, authKey.subarray(x, 32 + x)]))\n const sha1b = await crypto.sha1(\n concatBuffers([authKey.subarray(32 + x, 48 + x), messageKey, authKey.subarray(48 + x, 64 + x)]),\n )\n const sha1c = await crypto.sha1(concatBuffers([authKey.subarray(64 + x, 96 + x), messageKey]))\n const sha1d = await crypto.sha1(concatBuffers([messageKey, authKey.subarray(96 + x, 128 + x)]))\n\n const key = concatBuffers([sha1a.subarray(0, 8), sha1b.subarray(8, 20), sha1c.subarray(4, 16)])\n const iv = concatBuffers([\n sha1a.subarray(8, 20),\n sha1b.subarray(0, 8),\n sha1c.subarray(16, 20),\n sha1d.subarray(0, 8),\n ])\n\n return crypto.createAesIge(key, iv)\n}\n"]}
1
+ {"version":3,"file":"mtproto.js","sourceRoot":"","sources":["../../../../src/utils/crypto/mtproto.ts"],"names":[],"mappings":"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","sourcesContent":["import { concatBuffers } from '../buffer-utils.js'\nimport { ICryptoProvider, IEncryptionScheme } from './abstract.js'\n\n/**\n * Generate AES key and IV from nonces as defined by MTProto.\n * Used in authorization flow.\n *\n * @param crypto Crypto provider\n * @param serverNonce Server nonce\n * @param newNonce New nonce\n * @returns Tuple: `[key, iv]`\n */\nexport function generateKeyAndIvFromNonce(\n crypto: ICryptoProvider,\n serverNonce: Uint8Array,\n newNonce: Uint8Array,\n): [Uint8Array, Uint8Array] {\n const hash1 = crypto.sha1(concatBuffers([newNonce, serverNonce]))\n const hash2 = crypto.sha1(concatBuffers([serverNonce, newNonce]))\n const hash3 = crypto.sha1(concatBuffers([newNonce, newNonce]))\n\n const key = concatBuffers([hash1, hash2.subarray(0, 12)])\n const iv = concatBuffers([hash2.subarray(12, 20), hash3, newNonce.subarray(0, 4)])\n\n return [key, iv]\n}\n\n/**\n * Create AES IGE instance for message (given auth key and message key)\n * as defined by MTProto v2.\n *\n * @param crypto Crypto provider\n * @param authKey Authorization key\n * @param messageKey Message key\n * @param client Whether this is a client to server message\n */\nexport function createAesIgeForMessage(\n crypto: ICryptoProvider,\n authKey: Uint8Array,\n messageKey: Uint8Array,\n client: boolean,\n): IEncryptionScheme {\n const x = client ? 0 : 8\n const sha256a = crypto.sha256(concatBuffers([messageKey, authKey.subarray(x, 36 + x)]))\n const sha256b = crypto.sha256(concatBuffers([authKey.subarray(40 + x, 76 + x), messageKey]))\n\n const key = concatBuffers([sha256a.subarray(0, 8), sha256b.subarray(8, 24), sha256a.subarray(24, 32)])\n const iv = concatBuffers([sha256b.subarray(0, 8), sha256a.subarray(8, 24), sha256b.subarray(24, 32)])\n\n return crypto.createAesIge(key, iv)\n}\n\n/**\n * Create AES IGE instance for file (given auth key and message key)\n * as defined by MTProto v1.\n *\n * @param crypto Crypto provider\n * @param authKey Authorization key\n * @param messageKey Message key\n * @param client Whether this is a client to server message\n */\nexport function createAesIgeForMessageOld(\n crypto: ICryptoProvider,\n authKey: Uint8Array,\n messageKey: Uint8Array,\n client: boolean,\n): IEncryptionScheme {\n const x = client ? 0 : 8\n const sha1a = crypto.sha1(concatBuffers([messageKey, authKey.subarray(x, 32 + x)]))\n const sha1b = crypto.sha1(\n concatBuffers([authKey.subarray(32 + x, 48 + x), messageKey, authKey.subarray(48 + x, 64 + x)]),\n )\n const sha1c = crypto.sha1(concatBuffers([authKey.subarray(64 + x, 96 + x), messageKey]))\n const sha1d = crypto.sha1(concatBuffers([messageKey, authKey.subarray(96 + x, 128 + x)]))\n\n const key = concatBuffers([sha1a.subarray(0, 8), sha1b.subarray(8, 20), sha1c.subarray(4, 16)])\n const iv = concatBuffers([\n sha1a.subarray(8, 20),\n sha1b.subarray(0, 8),\n sha1c.subarray(16, 20),\n sha1d.subarray(0, 8),\n ])\n\n return crypto.createAesIge(key, iv)\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable no-restricted-globals */
4
+ const vitest_1 = require("vitest");
5
+ const mtproto_js_1 = require("./mtproto.js");
6
+ const node_js_1 = require("./node.js");
7
+ const authKey = Buffer.alloc(2048 / 8, Buffer.from('98cb29c6ffa89e79da695a54f572e6cb101e81c688b63a4bf73c3622dec230e0', 'hex'));
8
+ const messageKey = Buffer.from('25d701f2a29205526757825a99eb2d32');
9
+ (0, vitest_1.describe)('mtproto 2.0', () => {
10
+ (0, vitest_1.it)('should correctly derive message key and iv for client', () => {
11
+ const crypto = new node_js_1.NodeCryptoProvider();
12
+ const spy = vitest_1.vi.spyOn(crypto, 'createAesIge');
13
+ (0, mtproto_js_1.createAesIgeForMessage)(crypto, authKey, messageKey, true);
14
+ (0, vitest_1.expect)(spy).toHaveBeenCalledWith(Buffer.from('7acac59ab48cd370e478daf6c64545ab9f32d5c9197f25febe052110f61875ca', 'hex'), Buffer.from('2746ccc19fc260c08f3d2696389f415392103dbcc3a8bf69da9394c3c3d95bd3', 'hex'));
15
+ });
16
+ (0, vitest_1.it)('should correctly derive message key and iv for server', () => {
17
+ const crypto = new node_js_1.NodeCryptoProvider();
18
+ const spy = vitest_1.vi.spyOn(crypto, 'createAesIge');
19
+ (0, mtproto_js_1.createAesIgeForMessage)(crypto, authKey, messageKey, false);
20
+ (0, vitest_1.expect)(spy).toHaveBeenCalledWith(Buffer.from('c7cf179e7ebab144ba87de05415db4157d2fc66df4790b2fd405a6c8cbe4c0b3', 'hex'), Buffer.from('0916a7bd9880eacd4eeb868577a4c6a50e76fca4ac5c1bcfbafe3b9f76ccd806', 'hex'));
21
+ });
22
+ });
23
+ (0, vitest_1.describe)('mtproto 1.0', () => {
24
+ (0, vitest_1.it)('should correctly derive message key and iv for client', () => {
25
+ const crypto = new node_js_1.NodeCryptoProvider();
26
+ const spy = vitest_1.vi.spyOn(crypto, 'createAesIge');
27
+ (0, mtproto_js_1.createAesIgeForMessageOld)(crypto, authKey, messageKey, true);
28
+ (0, vitest_1.expect)(spy).toHaveBeenCalledWith(Buffer.from('aad61cb5b7be5e8435174d74665f8a978e85806d0970ad4958642ca49e3c8834', 'hex'), Buffer.from('4065736fe6586e94aad9f024062f1b9988e8a44e2aff4e11aad61cb5b7be5e84', 'hex'));
29
+ });
30
+ (0, vitest_1.it)('should correctly derive message key and iv for server', () => {
31
+ const crypto = new node_js_1.NodeCryptoProvider();
32
+ const spy = vitest_1.vi.spyOn(crypto, 'createAesIge');
33
+ (0, mtproto_js_1.createAesIgeForMessageOld)(crypto, authKey, messageKey, false);
34
+ (0, vitest_1.expect)(spy).toHaveBeenCalledWith(Buffer.from('d57682a17105e43b92bc5025ea80e88ef708240fc19450dfe072a8760f9534da', 'hex'), Buffer.from('07addff7beeb7705ef3a9d5090bd73c992d57291bb8a7079d57682a17105e43b', 'hex'));
35
+ });
36
+ });
37
+ (0, vitest_1.describe)('mtproto key/iv from nonce', () => {
38
+ (0, vitest_1.it)('should correctly derive message key and iv for given nonces', () => {
39
+ const crypto = new node_js_1.NodeCryptoProvider();
40
+ const res = (0, mtproto_js_1.generateKeyAndIvFromNonce)(crypto, Buffer.from('8af24c551836e5ed7002f5857e6e71b2', 'hex'), Buffer.from('3bf48b2d3152f383d82d1f2b32ac7fb5', 'hex'));
41
+ (0, vitest_1.expect)(res).to.eql([
42
+ Buffer.from('b0b5ffeadff0249fa6292f5ae0351556fd6619ba5dd4809601669292456d3e5a', 'hex'),
43
+ Buffer.from('13fef5bfd8c46b12dfd1753013b86cc012e1ce8ed6f8ecdd7bf36f3a3bf48b2d', 'hex'),
44
+ ]);
45
+ });
46
+ });
47
+ //# sourceMappingURL=mtproto.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mtproto.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/mtproto.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { describe, expect, it, vi } from 'vitest'\n\nimport { createAesIgeForMessage, createAesIgeForMessageOld, generateKeyAndIvFromNonce } from './mtproto.js'\nimport { NodeCryptoProvider } from './node.js'\n\nconst authKey = Buffer.alloc(\n 2048 / 8,\n Buffer.from('98cb29c6ffa89e79da695a54f572e6cb101e81c688b63a4bf73c3622dec230e0', 'hex'),\n)\nconst messageKey = Buffer.from('25d701f2a29205526757825a99eb2d32')\n\ndescribe('mtproto 2.0', () => {\n it('should correctly derive message key and iv for client', () => {\n const crypto = new NodeCryptoProvider()\n const spy = vi.spyOn(crypto, 'createAesIge')\n\n createAesIgeForMessage(crypto, authKey, messageKey, true)\n\n expect(spy).toHaveBeenCalledWith(\n Buffer.from('7acac59ab48cd370e478daf6c64545ab9f32d5c9197f25febe052110f61875ca', 'hex'),\n Buffer.from('2746ccc19fc260c08f3d2696389f415392103dbcc3a8bf69da9394c3c3d95bd3', 'hex'),\n )\n })\n\n it('should correctly derive message key and iv for server', () => {\n const crypto = new NodeCryptoProvider()\n const spy = vi.spyOn(crypto, 'createAesIge')\n\n createAesIgeForMessage(crypto, authKey, messageKey, false)\n\n expect(spy).toHaveBeenCalledWith(\n Buffer.from('c7cf179e7ebab144ba87de05415db4157d2fc66df4790b2fd405a6c8cbe4c0b3', 'hex'),\n Buffer.from('0916a7bd9880eacd4eeb868577a4c6a50e76fca4ac5c1bcfbafe3b9f76ccd806', 'hex'),\n )\n })\n})\n\ndescribe('mtproto 1.0', () => {\n it('should correctly derive message key and iv for client', () => {\n const crypto = new NodeCryptoProvider()\n const spy = vi.spyOn(crypto, 'createAesIge')\n\n createAesIgeForMessageOld(crypto, authKey, messageKey, true)\n\n expect(spy).toHaveBeenCalledWith(\n Buffer.from('aad61cb5b7be5e8435174d74665f8a978e85806d0970ad4958642ca49e3c8834', 'hex'),\n Buffer.from('4065736fe6586e94aad9f024062f1b9988e8a44e2aff4e11aad61cb5b7be5e84', 'hex'),\n )\n })\n\n it('should correctly derive message key and iv for server', () => {\n const crypto = new NodeCryptoProvider()\n const spy = vi.spyOn(crypto, 'createAesIge')\n\n createAesIgeForMessageOld(crypto, authKey, messageKey, false)\n\n expect(spy).toHaveBeenCalledWith(\n Buffer.from('d57682a17105e43b92bc5025ea80e88ef708240fc19450dfe072a8760f9534da', 'hex'),\n Buffer.from('07addff7beeb7705ef3a9d5090bd73c992d57291bb8a7079d57682a17105e43b', 'hex'),\n )\n })\n})\n\ndescribe('mtproto key/iv from nonce', () => {\n it('should correctly derive message key and iv for given nonces', () => {\n const crypto = new NodeCryptoProvider()\n\n const res = generateKeyAndIvFromNonce(\n crypto,\n Buffer.from('8af24c551836e5ed7002f5857e6e71b2', 'hex'),\n Buffer.from('3bf48b2d3152f383d82d1f2b32ac7fb5', 'hex'),\n )\n\n expect(res).to.eql([\n Buffer.from('b0b5ffeadff0249fa6292f5ae0351556fd6619ba5dd4809601669292456d3e5a', 'hex'),\n Buffer.from('13fef5bfd8c46b12dfd1753013b86cc012e1ce8ed6f8ecdd7bf36f3a3bf48b2d', 'hex'),\n ])\n })\n})\n"]}
@@ -0,0 +1,21 @@
1
+ import { InitInput } from '@mtcute/wasm';
2
+ import { MaybeAsync } from '../../types/index.js';
3
+ import { BaseCryptoProvider, IAesCtr, ICryptoProvider, IEncryptionScheme } from './abstract.js';
4
+ export declare abstract class BaseNodeCryptoProvider extends BaseCryptoProvider {
5
+ createAesCtr(key: Uint8Array, iv: Uint8Array): IAesCtr;
6
+ pbkdf2(password: Uint8Array, salt: Uint8Array, iterations: number, keylen?: number, algo?: string): MaybeAsync<Uint8Array>;
7
+ sha1(data: Uint8Array): Uint8Array;
8
+ sha256(data: Uint8Array): Uint8Array;
9
+ hmacSha256(data: Uint8Array, key: Uint8Array): Uint8Array;
10
+ gzip(data: Uint8Array, maxSize: number): Uint8Array | null;
11
+ gunzip(data: Uint8Array): Uint8Array;
12
+ randomFill(buf: Uint8Array): void;
13
+ }
14
+ export declare class NodeCryptoProvider extends BaseNodeCryptoProvider implements ICryptoProvider {
15
+ private wasmInput?;
16
+ constructor(params?: {
17
+ wasmInput?: InitInput;
18
+ });
19
+ initialize(): Promise<void>;
20
+ createAesIge(key: Uint8Array, iv: Uint8Array): IEncryptionScheme;
21
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NodeCryptoProvider = exports.BaseNodeCryptoProvider = void 0;
4
+ // eslint-disable-next-line no-restricted-imports
5
+ const crypto_1 = require("crypto");
6
+ const zlib_1 = require("zlib");
7
+ const wasm_1 = require("@mtcute/wasm");
8
+ const abstract_js_1 = require("./abstract.js");
9
+ class BaseNodeCryptoProvider extends abstract_js_1.BaseCryptoProvider {
10
+ createAesCtr(key, iv) {
11
+ const cipher = (0, crypto_1.createCipheriv)(`aes-${key.length * 8}-ctr`, key, iv);
12
+ const update = (data) => cipher.update(data);
13
+ return {
14
+ process: update,
15
+ };
16
+ }
17
+ pbkdf2(password, salt, iterations, keylen = 64, algo = 'sha512') {
18
+ return new Promise((resolve, reject) => (0, crypto_1.pbkdf2)(password, salt, iterations, keylen, algo, (err, buf) => err !== null ? reject(err) : resolve(buf)));
19
+ }
20
+ sha1(data) {
21
+ return (0, crypto_1.createHash)('sha1').update(data).digest();
22
+ }
23
+ sha256(data) {
24
+ return (0, crypto_1.createHash)('sha256').update(data).digest();
25
+ }
26
+ hmacSha256(data, key) {
27
+ return (0, crypto_1.createHmac)('sha256', key).update(data).digest();
28
+ }
29
+ gzip(data, maxSize) {
30
+ // todo: test if wasm impl is better fit here
31
+ try {
32
+ // telegram accepts both zlib and gzip, but zlib is faster and has less overhead, so we use it here
33
+ return (0, zlib_1.deflateSync)(data, {
34
+ maxOutputLength: maxSize,
35
+ });
36
+ // hot path, avoid additional runtime checks
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ }
39
+ catch (e) {
40
+ if (e.code === 'ERR_BUFFER_TOO_LARGE') {
41
+ return null;
42
+ }
43
+ throw e;
44
+ }
45
+ }
46
+ gunzip(data) {
47
+ return (0, zlib_1.gunzipSync)(data);
48
+ }
49
+ randomFill(buf) {
50
+ (0, crypto_1.randomFillSync)(buf);
51
+ }
52
+ }
53
+ exports.BaseNodeCryptoProvider = BaseNodeCryptoProvider;
54
+ class NodeCryptoProvider extends BaseNodeCryptoProvider {
55
+ constructor(params) {
56
+ super();
57
+ this.wasmInput = params?.wasmInput;
58
+ }
59
+ initialize() {
60
+ return (0, wasm_1.initAsync)(this.wasmInput);
61
+ }
62
+ createAesIge(key, iv) {
63
+ return {
64
+ encrypt(data) {
65
+ return (0, wasm_1.ige256Encrypt)(data, key, iv);
66
+ },
67
+ decrypt(data) {
68
+ return (0, wasm_1.ige256Decrypt)(data, key, iv);
69
+ },
70
+ };
71
+ }
72
+ }
73
+ exports.NodeCryptoProvider = NodeCryptoProvider;
74
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../../src/utils/crypto/node.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line no-restricted-imports\nimport { createCipheriv, createHash, createHmac, pbkdf2, randomFillSync } from 'crypto'\nimport { deflateSync, gunzipSync } from 'zlib'\n\nimport { ige256Decrypt, ige256Encrypt, initAsync, InitInput } from '@mtcute/wasm'\n\nimport { MaybeAsync } from '../../types/index.js'\nimport { BaseCryptoProvider, IAesCtr, ICryptoProvider, IEncryptionScheme } from './abstract.js'\n\nexport abstract class BaseNodeCryptoProvider extends BaseCryptoProvider {\n createAesCtr(key: Uint8Array, iv: Uint8Array): IAesCtr {\n const cipher = createCipheriv(`aes-${key.length * 8}-ctr`, key, iv)\n\n const update = (data: Uint8Array) => cipher.update(data)\n\n return {\n process: update,\n }\n }\n\n pbkdf2(\n password: Uint8Array,\n salt: Uint8Array,\n iterations: number,\n keylen = 64,\n algo = 'sha512',\n ): MaybeAsync<Uint8Array> {\n return new Promise((resolve, reject) =>\n pbkdf2(password, salt, iterations, keylen, algo, (err: Error | null, buf: Uint8Array) =>\n err !== null ? reject(err) : resolve(buf),\n ),\n )\n }\n\n sha1(data: Uint8Array): Uint8Array {\n return createHash('sha1').update(data).digest()\n }\n\n sha256(data: Uint8Array): Uint8Array {\n return createHash('sha256').update(data).digest()\n }\n\n hmacSha256(data: Uint8Array, key: Uint8Array): Uint8Array {\n return createHmac('sha256', key).update(data).digest()\n }\n\n gzip(data: Uint8Array, maxSize: number): Uint8Array | null {\n // todo: test if wasm impl is better fit here\n try {\n // telegram accepts both zlib and gzip, but zlib is faster and has less overhead, so we use it here\n return deflateSync(data, {\n maxOutputLength: maxSize,\n })\n // hot path, avoid additional runtime checks\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.code === 'ERR_BUFFER_TOO_LARGE') {\n return null\n }\n\n throw e\n }\n }\n\n gunzip(data: Uint8Array): Uint8Array {\n return gunzipSync(data)\n }\n\n randomFill(buf: Uint8Array) {\n randomFillSync(buf)\n }\n}\n\nexport class NodeCryptoProvider extends BaseNodeCryptoProvider implements ICryptoProvider {\n private wasmInput?: InitInput\n\n constructor(params?: { wasmInput?: InitInput }) {\n super()\n this.wasmInput = params?.wasmInput\n }\n\n initialize(): Promise<void> {\n return initAsync(this.wasmInput)\n }\n\n createAesIge(key: Uint8Array, iv: Uint8Array): IEncryptionScheme {\n return {\n encrypt(data: Uint8Array): Uint8Array {\n return ige256Encrypt(data, key, iv)\n },\n decrypt(data: Uint8Array): Uint8Array {\n return ige256Decrypt(data, key, iv)\n },\n }\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const test_1 = require("@mtcute/test");
5
+ const node_js_1 = require("./node.js");
6
+ (0, vitest_1.describe)('NodeCryptoProvider', () => {
7
+ if (typeof process === 'undefined') {
8
+ console.warn('Skipping NodeCryptoProvider tests');
9
+ return;
10
+ }
11
+ (0, test_1.testCryptoProvider)(new node_js_1.NodeCryptoProvider());
12
+ });
13
+ //# sourceMappingURL=node.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/node.test.ts"],"names":[],"mappings":";;AAAA,mCAAiC;AAEjC,uCAAiD;AAEjD,uCAA8C;AAE9C,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAChC,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE;QAChC,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;QAEjD,OAAM;KACT;IAED,IAAA,yBAAkB,EAAC,IAAI,4BAAkB,EAAE,CAAC,CAAA;AAChD,CAAC,CAAC,CAAA","sourcesContent":["import { describe } from 'vitest'\n\nimport { testCryptoProvider } from '@mtcute/test'\n\nimport { NodeCryptoProvider } from './node.js'\n\ndescribe('NodeCryptoProvider', () => {\n if (typeof process === 'undefined') {\n console.warn('Skipping NodeCryptoProvider tests')\n\n return\n }\n\n testCryptoProvider(new NodeCryptoProvider())\n})\n"]}
@@ -1,10 +1,6 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.computeSrpParams = exports.computeNewPasswordHash = exports.computePasswordHash = void 0;
7
- const big_integer_1 = __importDefault(require("big-integer"));
8
4
  const tl_runtime_1 = require("@mtcute/tl-runtime");
9
5
  const errors_js_1 = require("../../types/errors.js");
10
6
  const bigint_utils_js_1 = require("../bigint-utils.js");
@@ -22,8 +18,8 @@ const utils_js_1 = require("./utils.js");
22
18
  */
23
19
  async function computePasswordHash(crypto, password, salt1, salt2) {
24
20
  const SH = (data, salt) => crypto.sha256((0, buffer_utils_js_1.concatBuffers)([salt, data, salt]));
25
- const PH1 = async (pwd, salt1, salt2) => SH(await SH(pwd, salt1), salt2);
26
- return SH(await crypto.pbkdf2(await PH1(password, salt1, salt2), salt1, 100000), salt2);
21
+ const PH1 = (pwd, salt1, salt2) => SH(SH(pwd, salt1), salt2);
22
+ return SH(await crypto.pbkdf2(PH1(password, salt1, salt2), salt1, 100000), salt2);
27
23
  }
28
24
  exports.computePasswordHash = computePasswordHash;
29
25
  /**
@@ -34,12 +30,15 @@ exports.computePasswordHash = computePasswordHash;
34
30
  * @param password Password
35
31
  */
36
32
  async function computeNewPasswordHash(crypto, algo, password) {
37
- algo.salt1 = (0, buffer_utils_js_1.concatBuffers)([algo.salt1, (0, buffer_utils_js_1.randomBytes)(32)]);
33
+ const salt1 = new Uint8Array(algo.salt1.length + 32);
34
+ salt1.set(algo.salt1);
35
+ crypto.randomFill(salt1.subarray(algo.salt1.length));
36
+ algo.salt1 = salt1;
38
37
  const _x = await computePasswordHash(crypto, (0, tl_runtime_1.utf8EncodeToBuffer)(password), algo.salt1, algo.salt2);
39
- const g = (0, big_integer_1.default)(algo.g);
38
+ const g = BigInt(algo.g);
40
39
  const p = (0, bigint_utils_js_1.bufferToBigInt)(algo.p);
41
40
  const x = (0, bigint_utils_js_1.bufferToBigInt)(_x);
42
- return (0, bigint_utils_js_1.bigIntToBuffer)(g.modPow(x, p), 256);
41
+ return (0, bigint_utils_js_1.bigIntToBuffer)((0, bigint_utils_js_1.bigIntModPow)(g, x, p), 256);
43
42
  }
44
43
  exports.computeNewPasswordHash = computeNewPasswordHash;
45
44
  /**
@@ -63,38 +62,28 @@ async function computeSrpParams(crypto, request, password) {
63
62
  if (!request.srpId) {
64
63
  throw new errors_js_1.MtSecurityError('SRP_ID is not present in the request');
65
64
  }
66
- const g = (0, big_integer_1.default)(algo.g);
65
+ const g = BigInt(algo.g);
67
66
  const _g = (0, bigint_utils_js_1.bigIntToBuffer)(g, 256);
68
67
  const p = (0, bigint_utils_js_1.bufferToBigInt)(algo.p);
69
68
  const gB = (0, bigint_utils_js_1.bufferToBigInt)(request.srpB);
70
- const a = (0, bigint_utils_js_1.bufferToBigInt)((0, buffer_utils_js_1.randomBytes)(256));
71
- const gA = g.modPow(a, p);
69
+ const a = (0, bigint_utils_js_1.bufferToBigInt)(crypto.randomBytes(256));
70
+ const gA = (0, bigint_utils_js_1.bigIntModPow)(g, a, p);
72
71
  const _gA = (0, bigint_utils_js_1.bigIntToBuffer)(gA, 256);
73
72
  const H = (data) => crypto.sha256(data);
74
- const [_k, _u, _x] = await Promise.all([
75
- // maybe, just maybe this will be a bit faster with some crypto providers
76
- /* k = */ crypto.sha256((0, buffer_utils_js_1.concatBuffers)([algo.p, _g])),
77
- /* u = */ crypto.sha256((0, buffer_utils_js_1.concatBuffers)([_gA, request.srpB])),
78
- /* x = */ computePasswordHash(crypto, (0, tl_runtime_1.utf8EncodeToBuffer)(password), algo.salt1, algo.salt2),
79
- ]);
73
+ const _k = crypto.sha256((0, buffer_utils_js_1.concatBuffers)([algo.p, _g]));
74
+ const _u = crypto.sha256((0, buffer_utils_js_1.concatBuffers)([_gA, request.srpB]));
75
+ const _x = await computePasswordHash(crypto, (0, tl_runtime_1.utf8EncodeToBuffer)(password), algo.salt1, algo.salt2);
80
76
  const k = (0, bigint_utils_js_1.bufferToBigInt)(_k);
81
77
  const u = (0, bigint_utils_js_1.bufferToBigInt)(_u);
82
78
  const x = (0, bigint_utils_js_1.bufferToBigInt)(_x);
83
- const v = g.modPow(x, p);
84
- const kV = k.multiply(v).mod(p);
85
- let t = gB.minus(kV).mod(p);
86
- if (t.isNegative())
87
- t = t.plus(p);
88
- const sA = t.modPow(a.plus(u.multiply(x)), p);
89
- const _kA = await H((0, bigint_utils_js_1.bigIntToBuffer)(sA, 256));
90
- const _M1 = await H((0, buffer_utils_js_1.concatBuffers)([
91
- (0, utils_js_1.xorBuffer)(await H(algo.p), await H(_g)),
92
- await H(algo.salt1),
93
- await H(algo.salt2),
94
- _gA,
95
- request.srpB,
96
- _kA,
97
- ]));
79
+ const v = (0, bigint_utils_js_1.bigIntModPow)(g, x, p);
80
+ const kV = (k * v) % p;
81
+ let t = gB - kV;
82
+ if (t < 0n)
83
+ t += p;
84
+ const sA = (0, bigint_utils_js_1.bigIntModPow)(t, a + u * x, p);
85
+ const _kA = H((0, bigint_utils_js_1.bigIntToBuffer)(sA, 256));
86
+ const _M1 = H((0, buffer_utils_js_1.concatBuffers)([(0, utils_js_1.xorBuffer)(H(algo.p), H(_g)), H(algo.salt1), H(algo.salt2), _gA, request.srpB, _kA]));
98
87
  return {
99
88
  _: 'inputCheckPasswordSRP',
100
89
  srpId: request.srpId,