@mtcute/core 0.1.1 → 0.2.0

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 (325) hide show
  1. package/cjs/base-client.d.ts +3 -6
  2. package/cjs/base-client.js +12 -20
  3. package/cjs/base-client.js.map +1 -1
  4. package/cjs/network/auth-key.test.d.ts +1 -0
  5. package/cjs/network/auth-key.test.js +111 -0
  6. package/cjs/network/auth-key.test.js.map +1 -0
  7. package/cjs/network/config-manager.js +2 -1
  8. package/cjs/network/config-manager.js.map +1 -1
  9. package/cjs/network/config-manager.test.d.ts +1 -0
  10. package/cjs/network/config-manager.test.js +170 -0
  11. package/cjs/network/config-manager.test.js.map +1 -0
  12. package/cjs/network/index.d.ts +1 -1
  13. package/cjs/network/index.js.map +1 -1
  14. package/cjs/network/multi-session-connection.js +17 -4
  15. package/cjs/network/multi-session-connection.js.map +1 -1
  16. package/cjs/network/network-manager.d.ts +1 -1
  17. package/cjs/network/network-manager.js +12 -5
  18. package/cjs/network/network-manager.js.map +1 -1
  19. package/cjs/network/persistent-connection.test.d.ts +1 -0
  20. package/cjs/network/persistent-connection.test.js +157 -0
  21. package/cjs/network/persistent-connection.test.js.map +1 -0
  22. package/cjs/network/session-connection.js +3 -2
  23. package/cjs/network/session-connection.js.map +1 -1
  24. package/cjs/network/transports/intermediate.test.d.ts +1 -0
  25. package/cjs/network/transports/intermediate.test.js +84 -0
  26. package/cjs/network/transports/intermediate.test.js.map +1 -0
  27. package/cjs/network/transports/obfuscated.js +1 -1
  28. package/cjs/network/transports/obfuscated.js.map +1 -1
  29. package/cjs/network/transports/obfuscated.test.d.ts +1 -0
  30. package/cjs/network/transports/obfuscated.test.js +131 -0
  31. package/cjs/network/transports/obfuscated.test.js.map +1 -0
  32. package/cjs/network/transports/tcp.js +1 -1
  33. package/cjs/network/transports/tcp.js.map +1 -1
  34. package/cjs/network/transports/tcp.test.d.ts +1 -0
  35. package/cjs/network/transports/tcp.test.js +103 -0
  36. package/cjs/network/transports/tcp.test.js.map +1 -0
  37. package/cjs/network/transports/websocket.test.d.ts +1 -0
  38. package/cjs/network/transports/websocket.test.js +91 -0
  39. package/cjs/network/transports/websocket.test.js.map +1 -0
  40. package/cjs/storage/abstract.d.ts +18 -0
  41. package/cjs/storage/abstract.js.map +1 -1
  42. package/cjs/storage/idb.d.ts +101 -0
  43. package/cjs/storage/idb.js +458 -0
  44. package/cjs/storage/idb.js.map +1 -0
  45. package/cjs/storage/idb.test.d.ts +1 -0
  46. package/cjs/storage/idb.test.js +21 -0
  47. package/cjs/storage/idb.test.js.map +1 -0
  48. package/cjs/storage/index.d.ts +0 -4
  49. package/cjs/storage/index.js +0 -4
  50. package/cjs/storage/index.js.map +1 -1
  51. package/cjs/storage/json-file.d.ts +12 -0
  52. package/cjs/storage/json-file.js +12 -0
  53. package/cjs/storage/json-file.js.map +1 -1
  54. package/cjs/storage/json.js +3 -2
  55. package/cjs/storage/json.js.map +1 -1
  56. package/cjs/storage/json.test.d.ts +1 -0
  57. package/cjs/storage/json.test.js +36 -0
  58. package/cjs/storage/json.test.js.map +1 -0
  59. package/cjs/storage/localstorage.d.ts +12 -0
  60. package/cjs/storage/localstorage.js +12 -0
  61. package/cjs/storage/localstorage.js.map +1 -1
  62. package/cjs/storage/localstorage.test.d.ts +1 -0
  63. package/cjs/storage/localstorage.test.js +23 -0
  64. package/cjs/storage/localstorage.test.js.map +1 -0
  65. package/cjs/storage/memory.d.ts +12 -1
  66. package/cjs/storage/memory.js +65 -3
  67. package/cjs/storage/memory.js.map +1 -1
  68. package/cjs/storage/memory.test.d.ts +1 -0
  69. package/cjs/storage/memory.test.js +48 -0
  70. package/cjs/storage/memory.test.js.map +1 -0
  71. package/cjs/utils/async-lock.test.d.ts +1 -0
  72. package/cjs/utils/async-lock.test.js +25 -0
  73. package/cjs/utils/async-lock.test.js.map +1 -0
  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.test.d.ts +1 -0
  78. package/cjs/utils/buffer-utils.test.js +69 -0
  79. package/cjs/utils/buffer-utils.test.js.map +1 -0
  80. package/cjs/utils/condition-variable.test.d.ts +1 -0
  81. package/cjs/utils/condition-variable.test.js +27 -0
  82. package/cjs/utils/condition-variable.test.js.map +1 -0
  83. package/cjs/utils/controllable-promise.d.ts +0 -5
  84. package/cjs/utils/controllable-promise.js +1 -7
  85. package/cjs/utils/controllable-promise.js.map +1 -1
  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/keys.test.d.ts +1 -0
  90. package/cjs/utils/crypto/keys.test.js +40 -0
  91. package/cjs/utils/crypto/keys.test.js.map +1 -0
  92. package/cjs/utils/crypto/miller-rabin.test.d.ts +1 -0
  93. package/cjs/utils/crypto/miller-rabin.test.js +60 -0
  94. package/cjs/utils/crypto/miller-rabin.test.js.map +1 -0
  95. package/cjs/utils/crypto/mtproto.test.d.ts +1 -0
  96. package/cjs/utils/crypto/mtproto.test.js +50 -0
  97. package/cjs/utils/crypto/mtproto.test.js.map +1 -0
  98. package/cjs/utils/crypto/node.test.d.ts +1 -0
  99. package/cjs/utils/crypto/node.test.js +14 -0
  100. package/cjs/utils/crypto/node.test.js.map +1 -0
  101. package/cjs/utils/crypto/password.test.d.ts +1 -0
  102. package/cjs/utils/crypto/password.test.js +95 -0
  103. package/cjs/utils/crypto/password.test.js.map +1 -0
  104. package/cjs/utils/crypto/utils.test.d.ts +1 -0
  105. package/cjs/utils/crypto/utils.test.js +49 -0
  106. package/cjs/utils/crypto/utils.test.js.map +1 -0
  107. package/cjs/utils/crypto/web.test.d.ts +1 -0
  108. package/cjs/utils/crypto/web.test.js +17 -0
  109. package/cjs/utils/crypto/web.test.js.map +1 -0
  110. package/cjs/utils/deque.test.d.ts +1 -0
  111. package/cjs/utils/deque.test.js +128 -0
  112. package/cjs/utils/deque.test.js.map +1 -0
  113. package/cjs/utils/function-utils.test.d.ts +1 -0
  114. package/cjs/utils/function-utils.test.js +23 -0
  115. package/cjs/utils/function-utils.test.js.map +1 -0
  116. package/cjs/utils/linked-list.test.d.ts +1 -0
  117. package/cjs/utils/linked-list.test.js +36 -0
  118. package/cjs/utils/linked-list.test.js.map +1 -0
  119. package/cjs/utils/links/bots.test.d.ts +1 -0
  120. package/cjs/utils/links/bots.test.js +152 -0
  121. package/cjs/utils/links/bots.test.js.map +1 -0
  122. package/cjs/utils/links/chat.test.d.ts +1 -0
  123. package/cjs/utils/links/chat.test.js +84 -0
  124. package/cjs/utils/links/chat.test.js.map +1 -0
  125. package/cjs/utils/links/misc.test.d.ts +1 -0
  126. package/cjs/utils/links/misc.test.js +153 -0
  127. package/cjs/utils/links/misc.test.js.map +1 -0
  128. package/cjs/utils/links/proxy.test.d.ts +1 -0
  129. package/cjs/utils/links/proxy.test.js +74 -0
  130. package/cjs/utils/links/proxy.test.js.map +1 -0
  131. package/cjs/utils/links/user.test.d.ts +1 -0
  132. package/cjs/utils/links/user.test.js +63 -0
  133. package/cjs/utils/links/user.test.js.map +1 -0
  134. package/cjs/utils/logger.test.d.ts +1 -0
  135. package/cjs/utils/logger.test.js +127 -0
  136. package/cjs/utils/logger.test.js.map +1 -0
  137. package/cjs/utils/long-utils.test.d.ts +1 -0
  138. package/cjs/utils/long-utils.test.js +158 -0
  139. package/cjs/utils/long-utils.test.js.map +1 -0
  140. package/cjs/utils/lru-map.test.d.ts +1 -0
  141. package/cjs/utils/lru-map.test.js +96 -0
  142. package/cjs/utils/lru-map.test.js.map +1 -0
  143. package/cjs/utils/lru-set.test.d.ts +1 -0
  144. package/cjs/utils/lru-set.test.js +77 -0
  145. package/cjs/utils/lru-set.test.js.map +1 -0
  146. package/cjs/utils/peer-utils.js +3 -1
  147. package/cjs/utils/peer-utils.js.map +1 -1
  148. package/cjs/utils/peer-utils.test.d.ts +1 -0
  149. package/cjs/utils/peer-utils.test.js +122 -0
  150. package/cjs/utils/peer-utils.test.js.map +1 -0
  151. package/cjs/utils/sorted-array.test.d.ts +1 -0
  152. package/cjs/utils/sorted-array.test.js +66 -0
  153. package/cjs/utils/sorted-array.test.js.map +1 -0
  154. package/cjs/utils/string-session.test.d.ts +1 -0
  155. package/cjs/utils/string-session.test.js +106 -0
  156. package/cjs/utils/string-session.test.js.map +1 -0
  157. package/cjs/utils/tl-json.test.d.ts +1 -0
  158. package/cjs/utils/tl-json.test.js +83 -0
  159. package/cjs/utils/tl-json.test.js.map +1 -0
  160. package/cjs/utils/type-assertions.test.d.ts +1 -0
  161. package/cjs/utils/type-assertions.test.js +67 -0
  162. package/cjs/utils/type-assertions.test.js.map +1 -0
  163. package/esm/base-client.d.ts +3 -6
  164. package/esm/base-client.js +2 -10
  165. package/esm/base-client.js.map +1 -1
  166. package/esm/network/auth-key.test.d.ts +1 -0
  167. package/esm/network/auth-key.test.js +106 -0
  168. package/esm/network/auth-key.test.js.map +1 -0
  169. package/esm/network/config-manager.js +2 -1
  170. package/esm/network/config-manager.js.map +1 -1
  171. package/esm/network/config-manager.test.d.ts +1 -0
  172. package/esm/network/config-manager.test.js +168 -0
  173. package/esm/network/config-manager.test.js.map +1 -0
  174. package/esm/network/index.d.ts +1 -1
  175. package/esm/network/index.js.map +1 -1
  176. package/esm/network/multi-session-connection.js +17 -4
  177. package/esm/network/multi-session-connection.js.map +1 -1
  178. package/esm/network/network-manager.d.ts +1 -1
  179. package/esm/network/network-manager.js +12 -5
  180. package/esm/network/network-manager.js.map +1 -1
  181. package/esm/network/persistent-connection.test.d.ts +1 -0
  182. package/esm/network/persistent-connection.test.js +155 -0
  183. package/esm/network/persistent-connection.test.js.map +1 -0
  184. package/esm/network/session-connection.js +3 -2
  185. package/esm/network/session-connection.js.map +1 -1
  186. package/esm/network/transports/intermediate.test.d.ts +1 -0
  187. package/esm/network/transports/intermediate.test.js +82 -0
  188. package/esm/network/transports/intermediate.test.js.map +1 -0
  189. package/esm/network/transports/obfuscated.js +1 -1
  190. package/esm/network/transports/obfuscated.js.map +1 -1
  191. package/esm/network/transports/obfuscated.test.d.ts +1 -0
  192. package/esm/network/transports/obfuscated.test.js +129 -0
  193. package/esm/network/transports/obfuscated.test.js.map +1 -0
  194. package/esm/network/transports/tcp.js +1 -1
  195. package/esm/network/transports/tcp.js.map +1 -1
  196. package/esm/network/transports/tcp.test.d.ts +1 -0
  197. package/esm/network/transports/tcp.test.js +101 -0
  198. package/esm/network/transports/tcp.test.js.map +1 -0
  199. package/esm/network/transports/websocket.test.d.ts +1 -0
  200. package/esm/network/transports/websocket.test.js +89 -0
  201. package/esm/network/transports/websocket.test.js.map +1 -0
  202. package/esm/storage/abstract.d.ts +18 -0
  203. package/esm/storage/abstract.js.map +1 -1
  204. package/esm/storage/idb.d.ts +101 -0
  205. package/esm/storage/idb.js +454 -0
  206. package/esm/storage/idb.js.map +1 -0
  207. package/esm/storage/idb.test.d.ts +1 -0
  208. package/esm/storage/idb.test.js +19 -0
  209. package/esm/storage/idb.test.js.map +1 -0
  210. package/esm/storage/index.d.ts +0 -4
  211. package/esm/storage/index.js +0 -4
  212. package/esm/storage/index.js.map +1 -1
  213. package/esm/storage/json-file.d.ts +12 -0
  214. package/esm/storage/json-file.js +12 -0
  215. package/esm/storage/json-file.js.map +1 -1
  216. package/esm/storage/json.js +3 -2
  217. package/esm/storage/json.js.map +1 -1
  218. package/esm/storage/json.test.d.ts +1 -0
  219. package/esm/storage/json.test.js +34 -0
  220. package/esm/storage/json.test.js.map +1 -0
  221. package/esm/storage/localstorage.d.ts +12 -0
  222. package/esm/storage/localstorage.js +12 -0
  223. package/esm/storage/localstorage.js.map +1 -1
  224. package/esm/storage/localstorage.test.d.ts +1 -0
  225. package/esm/storage/localstorage.test.js +21 -0
  226. package/esm/storage/localstorage.test.js.map +1 -0
  227. package/esm/storage/memory.d.ts +12 -1
  228. package/esm/storage/memory.js +65 -3
  229. package/esm/storage/memory.js.map +1 -1
  230. package/esm/storage/memory.test.d.ts +1 -0
  231. package/esm/storage/memory.test.js +46 -0
  232. package/esm/storage/memory.test.js.map +1 -0
  233. package/esm/utils/async-lock.test.d.ts +1 -0
  234. package/esm/utils/async-lock.test.js +23 -0
  235. package/esm/utils/async-lock.test.js.map +1 -0
  236. package/esm/utils/bigint-utils.test.d.ts +1 -0
  237. package/esm/utils/bigint-utils.test.js +148 -0
  238. package/esm/utils/bigint-utils.test.js.map +1 -0
  239. package/esm/utils/buffer-utils.test.d.ts +1 -0
  240. package/esm/utils/buffer-utils.test.js +67 -0
  241. package/esm/utils/buffer-utils.test.js.map +1 -0
  242. package/esm/utils/condition-variable.test.d.ts +1 -0
  243. package/esm/utils/condition-variable.test.js +25 -0
  244. package/esm/utils/condition-variable.test.js.map +1 -0
  245. package/esm/utils/controllable-promise.d.ts +0 -5
  246. package/esm/utils/controllable-promise.js +0 -5
  247. package/esm/utils/controllable-promise.js.map +1 -1
  248. package/esm/utils/controllable-promise.test.d.ts +1 -0
  249. package/esm/utils/controllable-promise.test.js +15 -0
  250. package/esm/utils/controllable-promise.test.js.map +1 -0
  251. package/esm/utils/crypto/keys.test.d.ts +1 -0
  252. package/esm/utils/crypto/keys.test.js +38 -0
  253. package/esm/utils/crypto/keys.test.js.map +1 -0
  254. package/esm/utils/crypto/miller-rabin.test.d.ts +1 -0
  255. package/esm/utils/crypto/miller-rabin.test.js +58 -0
  256. package/esm/utils/crypto/miller-rabin.test.js.map +1 -0
  257. package/esm/utils/crypto/mtproto.test.d.ts +1 -0
  258. package/esm/utils/crypto/mtproto.test.js +48 -0
  259. package/esm/utils/crypto/mtproto.test.js.map +1 -0
  260. package/esm/utils/crypto/node.test.d.ts +1 -0
  261. package/esm/utils/crypto/node.test.js +12 -0
  262. package/esm/utils/crypto/node.test.js.map +1 -0
  263. package/esm/utils/crypto/password.test.d.ts +1 -0
  264. package/esm/utils/crypto/password.test.js +90 -0
  265. package/esm/utils/crypto/password.test.js.map +1 -0
  266. package/esm/utils/crypto/utils.test.d.ts +1 -0
  267. package/esm/utils/crypto/utils.test.js +47 -0
  268. package/esm/utils/crypto/utils.test.js.map +1 -0
  269. package/esm/utils/crypto/web.test.d.ts +1 -0
  270. package/esm/utils/crypto/web.test.js +15 -0
  271. package/esm/utils/crypto/web.test.js.map +1 -0
  272. package/esm/utils/deque.test.d.ts +1 -0
  273. package/esm/utils/deque.test.js +126 -0
  274. package/esm/utils/deque.test.js.map +1 -0
  275. package/esm/utils/function-utils.test.d.ts +1 -0
  276. package/esm/utils/function-utils.test.js +21 -0
  277. package/esm/utils/function-utils.test.js.map +1 -0
  278. package/esm/utils/linked-list.test.d.ts +1 -0
  279. package/esm/utils/linked-list.test.js +34 -0
  280. package/esm/utils/linked-list.test.js.map +1 -0
  281. package/esm/utils/links/bots.test.d.ts +1 -0
  282. package/esm/utils/links/bots.test.js +150 -0
  283. package/esm/utils/links/bots.test.js.map +1 -0
  284. package/esm/utils/links/chat.test.d.ts +1 -0
  285. package/esm/utils/links/chat.test.js +82 -0
  286. package/esm/utils/links/chat.test.js.map +1 -0
  287. package/esm/utils/links/misc.test.d.ts +1 -0
  288. package/esm/utils/links/misc.test.js +151 -0
  289. package/esm/utils/links/misc.test.js.map +1 -0
  290. package/esm/utils/links/proxy.test.d.ts +1 -0
  291. package/esm/utils/links/proxy.test.js +72 -0
  292. package/esm/utils/links/proxy.test.js.map +1 -0
  293. package/esm/utils/links/user.test.d.ts +1 -0
  294. package/esm/utils/links/user.test.js +61 -0
  295. package/esm/utils/links/user.test.js.map +1 -0
  296. package/esm/utils/logger.test.d.ts +1 -0
  297. package/esm/utils/logger.test.js +122 -0
  298. package/esm/utils/logger.test.js.map +1 -0
  299. package/esm/utils/long-utils.test.d.ts +1 -0
  300. package/esm/utils/long-utils.test.js +153 -0
  301. package/esm/utils/long-utils.test.js.map +1 -0
  302. package/esm/utils/lru-map.test.d.ts +1 -0
  303. package/esm/utils/lru-map.test.js +94 -0
  304. package/esm/utils/lru-map.test.js.map +1 -0
  305. package/esm/utils/lru-set.test.d.ts +1 -0
  306. package/esm/utils/lru-set.test.js +72 -0
  307. package/esm/utils/lru-set.test.js.map +1 -0
  308. package/esm/utils/peer-utils.js +3 -1
  309. package/esm/utils/peer-utils.js.map +1 -1
  310. package/esm/utils/peer-utils.test.d.ts +1 -0
  311. package/esm/utils/peer-utils.test.js +117 -0
  312. package/esm/utils/peer-utils.test.js.map +1 -0
  313. package/esm/utils/sorted-array.test.d.ts +1 -0
  314. package/esm/utils/sorted-array.test.js +64 -0
  315. package/esm/utils/sorted-array.test.js.map +1 -0
  316. package/esm/utils/string-session.test.d.ts +1 -0
  317. package/esm/utils/string-session.test.js +104 -0
  318. package/esm/utils/string-session.test.js.map +1 -0
  319. package/esm/utils/tl-json.test.d.ts +1 -0
  320. package/esm/utils/tl-json.test.js +81 -0
  321. package/esm/utils/tl-json.test.js.map +1 -0
  322. package/esm/utils/type-assertions.test.d.ts +1 -0
  323. package/esm/utils/type-assertions.test.js +65 -0
  324. package/esm/utils/type-assertions.test.js.map +1 -0
  325. package/package.json +20 -16
@@ -0,0 +1,38 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { findKeyByFingerprints, parsePublicKey } from '../index.js';
3
+ import { NodeCryptoProvider } from './node.js';
4
+ const crypto = new NodeCryptoProvider();
5
+ describe('parsePublicKey', () => {
6
+ it('should parse telegram public keys', () => {
7
+ expect(parsePublicKey(crypto, `-----BEGIN RSA PUBLIC KEY-----
8
+ MIIBCgKCAQEAruw2yP/BCcsJliRoW5eBVBVle9dtjJw+OYED160Wybum9SXtBBLX
9
+ riwt4rROd9csv0t0OHCaTmRqBcQ0J8fxhN6/cpR1GWgOZRUAiQxoMnlt0R93LCX/
10
+ j1dnVa/gVbCjdSxpbrfY2g2L4frzjJvdl84Kd9ORYjDEAyFnEA7dD556OptgLQQ2
11
+ e2iVNq8NZLYTzLp5YpOdO1doK+ttrltggTCy5SrKeLoCPPbOgGsdxJxyz5KKcZnS
12
+ Lj16yE5HvJQn0CNpRdENvRUXe6tBP78O39oJ8BTHp9oIjd6XWXAsp2CvK45Ol8wF
13
+ XGF710w9lwCGNbmNxNYhtIkdqfsEcwR5JwIDAQAB
14
+ -----END RSA PUBLIC KEY-----`)).eql({
15
+ modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',
16
+ exponent: '010001',
17
+ fingerprint: '0bc35f3509f7b7a5',
18
+ old: false,
19
+ });
20
+ });
21
+ it('should be able to find a key by its fingerprint', () => {
22
+ expect(findKeyByFingerprints(['b25898df208d2603'])).toMatchInlineSnapshot(`
23
+ {
24
+ "exponent": "010001",
25
+ "fingerprint": "b25898df208d2603",
26
+ "modulus": "c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",
27
+ "old": false,
28
+ }
29
+ `);
30
+ });
31
+ it('should prefer new keys over old', () => {
32
+ expect(findKeyByFingerprints(['71e025b6c76033e3', 'b25898df208d2603'])?.fingerprint).toEqual('b25898df208d2603');
33
+ });
34
+ it('should return null if not found', () => {
35
+ expect(findKeyByFingerprints(['deadbeefdeadbeef'])).toBeNull();
36
+ });
37
+ });
38
+ //# sourceMappingURL=keys.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/keys.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAE9C,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAA;AAEvC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,MAAM,CACF,cAAc,CACV,MAAM,EACN;;;;;;;6BAOa,CAChB,CACJ,CAAC,GAAG,CAAC;YACF,OAAO,EACH,kgBAAkgB;YACtgB,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,kBAAkB;YAC/B,GAAG,EAAE,KAAK;SACb,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,qBAAqB,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;;SAOzE,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,qBAAqB,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACpH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,qBAAqB,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAClE,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { findKeyByFingerprints, parsePublicKey } from '../index.js'\nimport { NodeCryptoProvider } from './node.js'\n\nconst crypto = new NodeCryptoProvider()\n\ndescribe('parsePublicKey', () => {\n it('should parse telegram public keys', () => {\n expect(\n parsePublicKey(\n crypto,\n `-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAruw2yP/BCcsJliRoW5eBVBVle9dtjJw+OYED160Wybum9SXtBBLX\nriwt4rROd9csv0t0OHCaTmRqBcQ0J8fxhN6/cpR1GWgOZRUAiQxoMnlt0R93LCX/\nj1dnVa/gVbCjdSxpbrfY2g2L4frzjJvdl84Kd9ORYjDEAyFnEA7dD556OptgLQQ2\ne2iVNq8NZLYTzLp5YpOdO1doK+ttrltggTCy5SrKeLoCPPbOgGsdxJxyz5KKcZnS\nLj16yE5HvJQn0CNpRdENvRUXe6tBP78O39oJ8BTHp9oIjd6XWXAsp2CvK45Ol8wF\nXGF710w9lwCGNbmNxNYhtIkdqfsEcwR5JwIDAQAB\n-----END RSA PUBLIC KEY-----`,\n ),\n ).eql({\n modulus:\n 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\n exponent: '010001',\n fingerprint: '0bc35f3509f7b7a5',\n old: false,\n })\n })\n\n it('should be able to find a key by its fingerprint', () => {\n expect(findKeyByFingerprints(['b25898df208d2603'])).toMatchInlineSnapshot(`\n {\n \"exponent\": \"010001\",\n \"fingerprint\": \"b25898df208d2603\",\n \"modulus\": \"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5\",\n \"old\": false,\n }\n `)\n })\n\n it('should prefer new keys over old', () => {\n expect(findKeyByFingerprints(['71e025b6c76033e3', 'b25898df208d2603'])?.fingerprint).toEqual('b25898df208d2603')\n })\n\n it('should return null if not found', () => {\n expect(findKeyByFingerprints(['deadbeefdeadbeef'])).toBeNull()\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,58 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { defaultCryptoProviderFactory } from './index.js';
3
+ import { millerRabin } from './miller-rabin.js';
4
+ describe('miller-rabin test', function () {
5
+ // miller-rabin factorization relies on RNG, so we should use a real random number generator
6
+ const c = defaultCryptoProviderFactory();
7
+ const testMillerRabin = (n, isPrime) => {
8
+ expect(millerRabin(c, BigInt(n))).eq(isPrime);
9
+ };
10
+ it('should correctly label small primes as probable primes', () => {
11
+ const smallOddPrimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31];
12
+ for (const prime of smallOddPrimes) {
13
+ testMillerRabin(prime, true);
14
+ }
15
+ });
16
+ it('should correctly label small odd composite numbers as composite', () => {
17
+ const smallOddPrimes = [9, 15, 21, 25, 27, 33, 35];
18
+ for (const prime of smallOddPrimes) {
19
+ testMillerRabin(prime, false);
20
+ }
21
+ });
22
+ // primes are generated using `openssl prime -generate -bits <bits>`
23
+ it('should work for 512-bit numbers', () => {
24
+ testMillerRabin('8411445470921866378538628788380866906358949375899610911537071281076627385046125382763689993349183284546479522400013151510610266158235924343045768103605519', true);
25
+ testMillerRabin('11167561990563990242158096122232207092938761092751537312016255867850441858086589598418467012717458858604863547175649456433632887622140170743409535470973399', true);
26
+ testMillerRabin('11006717791910450367418249787526506184731090161438431250022510598653874155081488487035840577645711578911087148186160668569071839053453201592321650008610329', true);
27
+ testMillerRabin('12224330340162812215033324917156282302617911690617664923428569636370785775561435789211091021550357876767050350997458404009005800772805534351607294516706177', true);
28
+ // above numbers but -2 (not prime)
29
+ testMillerRabin('8411445470921866378538628788380866906358949375899610911537071281076627385046125382763689993349183284546479522400013151510610266158235924343045768103605517', false);
30
+ testMillerRabin('11167561990563990242158096122232207092938761092751537312016255867850441858086589598418467012717458858604863547175649456433632887622140170743409535470973397', false);
31
+ testMillerRabin('11006717791910450367418249787526506184731090161438431250022510598653874155081488487035840577645711578911087148186160668569071839053453201592321650008610327', false);
32
+ testMillerRabin('12224330340162812215033324917156282302617911690617664923428569636370785775561435789211091021550357876767050350997458404009005800772805534351607294516706175', false);
33
+ });
34
+ it('should work for 1024-bit numbers', () => {
35
+ testMillerRabin('94163180970530844245052892199633535954736903357996153321496979115367320260897793334681106861766748541439161886270777106456088209508872459550450259737267142959061663564218457086654112219462515165219295402175541003899136060178102898376369981338103600856012709228116661479275753497725541132207243717937379815409', true);
36
+ testMillerRabin('97324962433497727515811278760066576725849776656602017497363465683978397629803148191267105308901733336070351381654371470561376353774017284623969415330564867697353080030917333974193741719718950105404732792050882127213356260415251087867407489400712288570880407613514781891914135956778687719588061176455381937003', true);
37
+ testMillerRabin('92511311413226091818378551616231701579277597795073142338527410334932345968554993390789667936819230228388142960299649466238701015865565141753710450319875546944139442823075990348978746055937500467483161699883905850192191164043687791185635729923497381849380102040768674652775240505782671289535260164547714030567', true);
38
+ testMillerRabin('98801756216479639848708157708947504990501845258427605711852570166662700681215707617225664134994147912417941920327932092748574265476658124536672887141144222716123085451749764522435906007567360583062117498919471220566974634924384147341592903939264267901029640119196259026154529723870788246284629644039137378253', true);
39
+ // above numbers but -2 (not prime)
40
+ testMillerRabin('94163180970530844245052892199633535954736903357996153321496979115367320260897793334681106861766748541439161886270777106456088209508872459550450259737267142959061663564218457086654112219462515165219295402175541003899136060178102898376369981338103600856012709228116661479275753497725541132207243717937379815407', false);
41
+ testMillerRabin('97324962433497727515811278760066576725849776656602017497363465683978397629803148191267105308901733336070351381654371470561376353774017284623969415330564867697353080030917333974193741719718950105404732792050882127213356260415251087867407489400712288570880407613514781891914135956778687719588061176455381937001', false);
42
+ testMillerRabin('92511311413226091818378551616231701579277597795073142338527410334932345968554993390789667936819230228388142960299649466238701015865565141753710450319875546944139442823075990348978746055937500467483161699883905850192191164043687791185635729923497381849380102040768674652775240505782671289535260164547714030565', false);
43
+ testMillerRabin('98801756216479639848708157708947504990501845258427605711852570166662700681215707617225664134994147912417941920327932092748574265476658124536672887141144222716123085451749764522435906007567360583062117498919471220566974634924384147341592903939264267901029640119196259026154529723870788246284629644039137378251', false);
44
+ });
45
+ it('should work for 2048-bit numbers', () => {
46
+ testMillerRabin('28608382334358769588283288249494859626901014972463291352091976543138105382282108662849885913053034513852843449409838151123568984617793641641937583673207501643041336002587032201383537626393235736734494131431069043382068545865505150651648610506542819001961332454611129372758714288168807328523359776577571626967649079147416191592855529888846889532625386469236278694936872628305052827422772792103722178298844645210242389265273407924858034431614414896134561928996888883994953322861399988094086562513898527391555490352156627307769278185444897960555995383228897584818577375695810423475039211516849716140051437120083274285367', true);
47
+ testMillerRabin('30244022694659482453371920976249272809817388822378671144866806600284132009663832003348737406289715119965835410140834733465553787513841966120831322372642881643693711233087233983267648392814127424201572290931937482043046169402667397610783447368703776842799852222745601531140231486417855517072392416789672922529566643118973930252809010605519948446055538976582290902060054788109497630796585770940656002892943575479533099350429655210881833493066716819282707441553612603960556051122162329171373373251909387401572866056121964608595895425640834764028568120995397759283490218181167000161310959711677055741632674632758727382743', true);
48
+ testMillerRabin('30560953105766401423987964658775999222308579908395527900931049506803845883459894704297458477118152899910620180302473409631442956208933061650967001020981432894530064472547770442696756724169958362395601360296775798187903794894866967342028337982275745956538015473621792510615113531964380246815875830970404687926061637030085629909804357717955251735074071072456074274947993921828878633638119117086342305530526661796817095624933200483138188878398983149622639425550360394901699701985050966685840649129419227936413574227792077082510807968104733387734970009620450108276446659342203263759999068046251645984039420643003580284779', true);
49
+ // above numbers but -2 (not prime)
50
+ testMillerRabin('28608382334358769588283288249494859626901014972463291352091976543138105382282108662849885913053034513852843449409838151123568984617793641641937583673207501643041336002587032201383537626393235736734494131431069043382068545865505150651648610506542819001961332454611129372758714288168807328523359776577571626967649079147416191592855529888846889532625386469236278694936872628305052827422772792103722178298844645210242389265273407924858034431614414896134561928996888883994953322861399988094086562513898527391555490352156627307769278185444897960555995383228897584818577375695810423475039211516849716140051437120083274285365', false);
51
+ testMillerRabin('30244022694659482453371920976249272809817388822378671144866806600284132009663832003348737406289715119965835410140834733465553787513841966120831322372642881643693711233087233983267648392814127424201572290931937482043046169402667397610783447368703776842799852222745601531140231486417855517072392416789672922529566643118973930252809010605519948446055538976582290902060054788109497630796585770940656002892943575479533099350429655210881833493066716819282707441553612603960556051122162329171373373251909387401572866056121964608595895425640834764028568120995397759283490218181167000161310959711677055741632674632758727382741', false);
52
+ testMillerRabin('30560953105766401423987964658775999222308579908395527900931049506803845883459894704297458477118152899910620180302473409631442956208933061650967001020981432894530064472547770442696756724169958362395601360296775798187903794894866967342028337982275745956538015473621792510615113531964380246815875830970404687926061637030085629909804357717955251735074071072456074274947993921828878633638119117086342305530526661796817095624933200483138188878398983149622639425550360394901699701985050966685840649129419227936413574227792077082510807968104733387734970009620450108276446659342203263759999068046251645984039420643003580284777', false);
53
+ // dh_prime used by telegram, as seen in https://core.telegram.org/mtproto/security_guidelines
54
+ 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';
55
+ testMillerRabin(BigInt('0x' + telegramDhPrime.replace(/ /g, '')), true);
56
+ });
57
+ }, { timeout: 10000 }); // since miller-rabin factorization relies on RNG, it may take a while (or may not!)
58
+ //# 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"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,48 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { defaultTestCryptoProvider, u8HexDecode } from '@mtcute/test';
3
+ import { concatBuffers, hexDecodeToBuffer, hexEncode } from '../index.js';
4
+ import { createAesIgeForMessage, createAesIgeForMessageOld, generateKeyAndIvFromNonce } from './mtproto.js';
5
+ const authKeyChunk = hexDecodeToBuffer('98cb29c6ffa89e79da695a54f572e6cb101e81c688b63a4bf73c3622dec230e0');
6
+ const authKey = concatBuffers(Array.from({ length: 8 }, () => authKeyChunk));
7
+ const messageKey = hexDecodeToBuffer('25d701f2a29205526757825a99eb2d32');
8
+ describe('mtproto 2.0', async () => {
9
+ const crypto = await defaultTestCryptoProvider();
10
+ const createAesIgeSpy = vi.spyOn(crypto, 'createAesIge');
11
+ beforeEach(() => void createAesIgeSpy.mockClear());
12
+ it('should correctly derive message key and iv for client', () => {
13
+ createAesIgeForMessage(crypto, authKey, messageKey, true);
14
+ expect(hexEncode(createAesIgeSpy.mock.calls[0][0])).toEqual('af3f8e1ffa75f4c981eec33a3e5bbaa2ea48f9bb93e91597627eb1f67960a0c9');
15
+ expect(hexEncode(createAesIgeSpy.mock.calls[0][1])).toEqual('9874d77f95155b35221bff94b7df4594c6996e2a62e44fcb7d93c8c4e41b79ee');
16
+ });
17
+ it('should correctly derive message key and iv for server', () => {
18
+ createAesIgeForMessage(crypto, authKey, messageKey, false);
19
+ expect(hexEncode(createAesIgeSpy.mock.calls[0][0])).toEqual('d4b378e1e0525f10ff9d4c42807ccce5b30a033a8088c0b922b5259421751648');
20
+ expect(hexEncode(createAesIgeSpy.mock.calls[0][1])).toEqual('4d7194f42f0135d2fd83050b403265b4c40ee3e9e9fba56f0f4d8ea6bcb121f5');
21
+ });
22
+ });
23
+ describe('mtproto 1.0', async () => {
24
+ const crypto = await defaultTestCryptoProvider();
25
+ const createAesIgeSpy = vi.spyOn(crypto, 'createAesIge');
26
+ beforeEach(() => void createAesIgeSpy.mockClear());
27
+ it('should correctly derive message key and iv for client', () => {
28
+ createAesIgeForMessageOld(crypto, authKey, messageKey, true);
29
+ expect(hexEncode(createAesIgeSpy.mock.calls[0][0])).toEqual('1fc7b40b1d9ffbdaf4d652525a748864259698f89214abf27c0d36cb9d4cd5db');
30
+ expect(hexEncode(createAesIgeSpy.mock.calls[0][1])).toEqual('7251fbda39ec5e6e089f15ded5963b03d6d8d0f7078898431fc7b40b1d9ffbda');
31
+ });
32
+ it('should correctly derive message key and iv for server', () => {
33
+ createAesIgeForMessageOld(crypto, authKey, messageKey, false);
34
+ expect(hexEncode(createAesIgeSpy.mock.calls[0][0])).toEqual('af0e4e01318654be40ab42b125909d43b44bdeef571ff1a5dfb81474ae26d467');
35
+ expect(hexEncode(createAesIgeSpy.mock.calls[0][1])).toEqual('15c9ba6021d2c5cf04f0842540ae216a970b4eac8f46ef01af0e4e01318654be');
36
+ });
37
+ });
38
+ describe('mtproto key/iv from nonce', async () => {
39
+ const crypto = await defaultTestCryptoProvider();
40
+ it('should correctly derive message key and iv for given nonces', () => {
41
+ const res = generateKeyAndIvFromNonce(crypto, u8HexDecode('8af24c551836e5ed7002f5857e6e71b2'), u8HexDecode('3bf48b2d3152f383d82d1f2b32ac7fb5'));
42
+ expect(res).to.eql([
43
+ u8HexDecode('b0b5ffeadff0249fa6292f5ae0351556fd6619ba5dd4809601669292456d3e5a'),
44
+ u8HexDecode('13fef5bfd8c46b12dfd1753013b86cc012e1ce8ed6f8ecdd7bf36f3a3bf48b2d'),
45
+ ]);
46
+ });
47
+ });
48
+ //# 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":["import { beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport { defaultTestCryptoProvider, u8HexDecode } from '@mtcute/test'\n\nimport { concatBuffers, hexDecodeToBuffer, hexEncode } from '../index.js'\nimport { createAesIgeForMessage, createAesIgeForMessageOld, generateKeyAndIvFromNonce } from './mtproto.js'\n\nconst authKeyChunk = hexDecodeToBuffer('98cb29c6ffa89e79da695a54f572e6cb101e81c688b63a4bf73c3622dec230e0')\nconst authKey = concatBuffers(Array.from({ length: 8 }, () => authKeyChunk))\nconst messageKey = hexDecodeToBuffer('25d701f2a29205526757825a99eb2d32')\n\ndescribe('mtproto 2.0', async () => {\n const crypto = await defaultTestCryptoProvider()\n const createAesIgeSpy = vi.spyOn(crypto, 'createAesIge')\n\n beforeEach(() => void createAesIgeSpy.mockClear())\n\n it('should correctly derive message key and iv for client', () => {\n createAesIgeForMessage(crypto, authKey, messageKey, true)\n\n expect(hexEncode(createAesIgeSpy.mock.calls[0][0])).toEqual(\n 'af3f8e1ffa75f4c981eec33a3e5bbaa2ea48f9bb93e91597627eb1f67960a0c9',\n )\n expect(hexEncode(createAesIgeSpy.mock.calls[0][1])).toEqual(\n '9874d77f95155b35221bff94b7df4594c6996e2a62e44fcb7d93c8c4e41b79ee',\n )\n })\n\n it('should correctly derive message key and iv for server', () => {\n createAesIgeForMessage(crypto, authKey, messageKey, false)\n\n expect(hexEncode(createAesIgeSpy.mock.calls[0][0])).toEqual(\n 'd4b378e1e0525f10ff9d4c42807ccce5b30a033a8088c0b922b5259421751648',\n )\n expect(hexEncode(createAesIgeSpy.mock.calls[0][1])).toEqual(\n '4d7194f42f0135d2fd83050b403265b4c40ee3e9e9fba56f0f4d8ea6bcb121f5',\n )\n })\n})\n\ndescribe('mtproto 1.0', async () => {\n const crypto = await defaultTestCryptoProvider()\n const createAesIgeSpy = vi.spyOn(crypto, 'createAesIge')\n\n beforeEach(() => void createAesIgeSpy.mockClear())\n\n it('should correctly derive message key and iv for client', () => {\n createAesIgeForMessageOld(crypto, authKey, messageKey, true)\n\n expect(hexEncode(createAesIgeSpy.mock.calls[0][0])).toEqual(\n '1fc7b40b1d9ffbdaf4d652525a748864259698f89214abf27c0d36cb9d4cd5db',\n )\n expect(hexEncode(createAesIgeSpy.mock.calls[0][1])).toEqual(\n '7251fbda39ec5e6e089f15ded5963b03d6d8d0f7078898431fc7b40b1d9ffbda',\n )\n })\n\n it('should correctly derive message key and iv for server', () => {\n createAesIgeForMessageOld(crypto, authKey, messageKey, false)\n\n expect(hexEncode(createAesIgeSpy.mock.calls[0][0])).toEqual(\n 'af0e4e01318654be40ab42b125909d43b44bdeef571ff1a5dfb81474ae26d467',\n )\n expect(hexEncode(createAesIgeSpy.mock.calls[0][1])).toEqual(\n '15c9ba6021d2c5cf04f0842540ae216a970b4eac8f46ef01af0e4e01318654be',\n )\n })\n})\n\ndescribe('mtproto key/iv from nonce', async () => {\n const crypto = await defaultTestCryptoProvider()\n\n it('should correctly derive message key and iv for given nonces', () => {\n const res = generateKeyAndIvFromNonce(\n crypto,\n u8HexDecode('8af24c551836e5ed7002f5857e6e71b2'),\n u8HexDecode('3bf48b2d3152f383d82d1f2b32ac7fb5'),\n )\n\n expect(res).to.eql([\n u8HexDecode('b0b5ffeadff0249fa6292f5ae0351556fd6619ba5dd4809601669292456d3e5a'),\n u8HexDecode('13fef5bfd8c46b12dfd1753013b86cc012e1ce8ed6f8ecdd7bf36f3a3bf48b2d'),\n ])\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { describe } from 'vitest';
2
+ import { testCryptoProvider } from '@mtcute/test';
3
+ if (import.meta.env.TEST_ENV === 'node') {
4
+ describe('NodeCryptoProvider', async () => {
5
+ const { NodeCryptoProvider } = await import('./node.js');
6
+ testCryptoProvider(new NodeCryptoProvider());
7
+ });
8
+ }
9
+ else {
10
+ describe.skip('NodeCryptoProvider', () => { });
11
+ }
12
+ //# 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,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjD,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE;IACrC,QAAQ,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAA;QAExD,kBAAkB,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;CACL;KAAM;IACH,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;CAChD","sourcesContent":["import { describe } from 'vitest'\n\nimport { testCryptoProvider } from '@mtcute/test'\n\nif (import.meta.env.TEST_ENV === 'node') {\n describe('NodeCryptoProvider', async () => {\n const { NodeCryptoProvider } = await import('./node.js')\n\n testCryptoProvider(new NodeCryptoProvider())\n })\n} else {\n describe.skip('NodeCryptoProvider', () => {})\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,90 @@
1
+ import Long from 'long';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { defaultTestCryptoProvider } from '@mtcute/test';
4
+ import { hexDecodeToBuffer, hexEncode, utf8EncodeToBuffer } from '@mtcute/tl-runtime';
5
+ import { computeNewPasswordHash, computePasswordHash, computeSrpParams } from './index.js';
6
+ // a real-world request from an account with "qwe123" password
7
+ const fakeAlgo = {
8
+ _: 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow',
9
+ salt1: hexDecodeToBuffer('9b3accc457c0d5288e8cff31eb21094048bc11902f6614dbb9afb839ee7641c37619537d8ebe749e'),
10
+ salt2: hexDecodeToBuffer('6c619bb0786dc4ed1bf211d23f6e4065'),
11
+ g: 3,
12
+ p: hexDecodeToBuffer('c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f' +
13
+ '48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c37' +
14
+ '20fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f64' +
15
+ '2477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4' +
16
+ 'a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754' +
17
+ 'fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4' +
18
+ 'e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f' +
19
+ '0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b'),
20
+ };
21
+ const fakeRequest = {
22
+ _: 'account.password',
23
+ hasRecovery: false,
24
+ hasSecureValues: false,
25
+ hasPassword: true,
26
+ currentAlgo: fakeAlgo,
27
+ srpB: hexDecodeToBuffer('1476a7b5991d7f028bbee33b3455cad3f2cd0eb3737409fcce92fa7d4cd5c733' +
28
+ 'ec6d2cb3454e587d4c17eda2fd7ef9a57327215f38292cc8bd5dc77d3e1d31cd' +
29
+ 'dae2652f8347c4b0093f7c78242f70e6cc13137ee7acc257a49855a63113db8f' +
30
+ '163992b9101551f3b6f7eb5d196cee3647c359553b1bcbe82ba8933c0fb1ac35' +
31
+ '0243c535b8e634613e1f626ba8a6d141ef957c859e71a117b557c0298bfbb107' +
32
+ 'c91f71f5b4275fded58289aa1e87c612f44b7aa0b5e0de7def4458f58db80019' +
33
+ 'd2e7b181eb66dc270374af2d160dd0c53edd677b2701694d71ea8718c49df6a9' +
34
+ 'dbe2cbae051ffc1986336cd26f11a8ab426dfe0813d7b3f4eedf4e34182ccc3a'),
35
+ srpId: Long.fromBits(-2046015018, 875006452),
36
+ newAlgo: {
37
+ _: 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow',
38
+ salt1: hexDecodeToBuffer('9b3accc457c0d528'),
39
+ salt2: hexDecodeToBuffer('6c619bb0786dc4ed1bf211d23f6e4065'),
40
+ g: 3,
41
+ p: hexDecodeToBuffer('c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f' +
42
+ '48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c37' +
43
+ '20fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f64' +
44
+ '2477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4' +
45
+ 'a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754' +
46
+ 'fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4' +
47
+ 'e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f' +
48
+ '0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b'),
49
+ },
50
+ newSecureAlgo: {
51
+ _: 'securePasswordKdfAlgoPBKDF2HMACSHA512iter100000',
52
+ salt: hexDecodeToBuffer('fdd59abc0bffb24d'),
53
+ },
54
+ secureRandom: new Uint8Array(), // unused
55
+ };
56
+ const password = 'qwe123';
57
+ describe('SRP', () => {
58
+ it('should correctly compute password hash as defined by MTProto', async () => {
59
+ const crypto = await defaultTestCryptoProvider();
60
+ const hash = await computePasswordHash(crypto, utf8EncodeToBuffer(password), fakeAlgo.salt1, fakeAlgo.salt2);
61
+ expect(hexEncode(hash)).toEqual('750f1fe282965e63ce17b98427b35549fb864465211840f6a7c1f2fb657cc33b');
62
+ });
63
+ it('should correctly compute new password hash as defined by MTProto', async () => {
64
+ const crypto = await defaultTestCryptoProvider();
65
+ const hash = await computeNewPasswordHash(crypto, fakeAlgo, '123qwe');
66
+ expect(hexEncode(hash)).toEqual('2540539ceeffd4543cd845bf319b8392e6b17bf7cf26bafcf6282ce9ae795368' +
67
+ '4ff49469c2863b17e6d65ddb16ae6f60bc07cc254c00e5ba389292f6cea0b3aa' +
68
+ 'c459d1d08984d65319df8c5d124042169bbe2ab8c0c93bc7178827f2ea84e7c3' +
69
+ 'a4f2660099fb6a4c38984c914283d3015278369521a4b81ecf927669b8c89746' +
70
+ 'ef49ec7b019af7f3addc746362f298d96409bef4677b9c3d8e5b5afe7a44c0bc' +
71
+ '130ebc7a79b5d5980966d88d3d9eba511b101b0703abd86df7410cd120edad12' +
72
+ '2a7a3ccad92d906dbf6f43bba13555bafb626b45551275f3626a4ae26a14908d' +
73
+ '38d640680e501f52bd08a0e3ff9d9185eebdae890c167459449b2c205b3ecde4');
74
+ });
75
+ it('should correctly compute srp parameters as defined by MTProto', async () => {
76
+ const crypto = await defaultTestCryptoProvider();
77
+ const params = await computeSrpParams(crypto, fakeRequest, password);
78
+ expect(params.srpId).toEqual(fakeRequest.srpId);
79
+ expect(hexEncode(params.A)).toEqual('363976f55edb57cc5cc0c4aaca9b7539eff98a43a93fa84be34860d18ac3a80f' +
80
+ 'ffd57c4617896ff667677d0552a079eb189d25d147ec96edd4495c946a18652d' +
81
+ '31d78eede40a8b29da340c19b32ccac78f8482406e392102c03d850d1db87223' +
82
+ '2c144bfacadb58856971aafb70ca3aac4efa7f73977ddc50dfc0a2c76c0ac950' +
83
+ '728d58b8480fa89c701703855148fadd885aaf1ca313ae3a3b2942de58a9a6fb' +
84
+ '9e3e65c7ac7a1b7f4e6aa4742b957f81927bd8cc761b76f90229dec34d6f15d3' +
85
+ '4fa454aa69d9219d9c5fa3625f5c6f1ac03892a70aa17269c76cd9bf2949a961' +
86
+ 'fad2a71e5fa961824b32db037130c7e9aad4c1e9f02ebc5b832622f98b59597e');
87
+ expect(hexEncode(params.M1)).toEqual('25a91b21c634ad670a144165a9829192d152e131a716f676abc48cd817f508c6');
88
+ });
89
+ });
90
+ //# sourceMappingURL=password.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/password.test.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\nimport { describe, expect, it } from 'vitest'\n\nimport { defaultTestCryptoProvider } from '@mtcute/test'\nimport { tl } from '@mtcute/tl'\nimport { hexDecodeToBuffer, hexEncode, utf8EncodeToBuffer } from '@mtcute/tl-runtime'\n\nimport { computeNewPasswordHash, computePasswordHash, computeSrpParams } from './index.js'\n\n// a real-world request from an account with \"qwe123\" password\nconst fakeAlgo: tl.RawPasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow = {\n _: 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow',\n salt1: hexDecodeToBuffer('9b3accc457c0d5288e8cff31eb21094048bc11902f6614dbb9afb839ee7641c37619537d8ebe749e'),\n salt2: hexDecodeToBuffer('6c619bb0786dc4ed1bf211d23f6e4065'),\n g: 3,\n p: hexDecodeToBuffer(\n 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f' +\n '48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c37' +\n '20fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f64' +\n '2477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4' +\n 'a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754' +\n 'fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4' +\n 'e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f' +\n '0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b',\n ),\n}\nconst fakeRequest: tl.account.RawPassword = {\n _: 'account.password',\n hasRecovery: false,\n hasSecureValues: false,\n hasPassword: true,\n currentAlgo: fakeAlgo,\n srpB: hexDecodeToBuffer(\n '1476a7b5991d7f028bbee33b3455cad3f2cd0eb3737409fcce92fa7d4cd5c733' +\n 'ec6d2cb3454e587d4c17eda2fd7ef9a57327215f38292cc8bd5dc77d3e1d31cd' +\n 'dae2652f8347c4b0093f7c78242f70e6cc13137ee7acc257a49855a63113db8f' +\n '163992b9101551f3b6f7eb5d196cee3647c359553b1bcbe82ba8933c0fb1ac35' +\n '0243c535b8e634613e1f626ba8a6d141ef957c859e71a117b557c0298bfbb107' +\n 'c91f71f5b4275fded58289aa1e87c612f44b7aa0b5e0de7def4458f58db80019' +\n 'd2e7b181eb66dc270374af2d160dd0c53edd677b2701694d71ea8718c49df6a9' +\n 'dbe2cbae051ffc1986336cd26f11a8ab426dfe0813d7b3f4eedf4e34182ccc3a',\n ),\n srpId: Long.fromBits(-2046015018, 875006452),\n newAlgo: {\n _: 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow',\n salt1: hexDecodeToBuffer('9b3accc457c0d528'),\n salt2: hexDecodeToBuffer('6c619bb0786dc4ed1bf211d23f6e4065'),\n g: 3,\n p: hexDecodeToBuffer(\n 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f' +\n '48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c37' +\n '20fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f64' +\n '2477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4' +\n 'a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754' +\n 'fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4' +\n 'e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f' +\n '0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b',\n ),\n },\n newSecureAlgo: {\n _: 'securePasswordKdfAlgoPBKDF2HMACSHA512iter100000',\n salt: hexDecodeToBuffer('fdd59abc0bffb24d'),\n },\n secureRandom: new Uint8Array(), // unused\n}\nconst password = 'qwe123'\n\ndescribe('SRP', () => {\n it('should correctly compute password hash as defined by MTProto', async () => {\n const crypto = await defaultTestCryptoProvider()\n const hash = await computePasswordHash(crypto, utf8EncodeToBuffer(password), fakeAlgo.salt1, fakeAlgo.salt2)\n\n expect(hexEncode(hash)).toEqual('750f1fe282965e63ce17b98427b35549fb864465211840f6a7c1f2fb657cc33b')\n })\n\n it('should correctly compute new password hash as defined by MTProto', async () => {\n const crypto = await defaultTestCryptoProvider()\n const hash = await computeNewPasswordHash(crypto, fakeAlgo, '123qwe')\n\n expect(hexEncode(hash)).toEqual(\n '2540539ceeffd4543cd845bf319b8392e6b17bf7cf26bafcf6282ce9ae795368' +\n '4ff49469c2863b17e6d65ddb16ae6f60bc07cc254c00e5ba389292f6cea0b3aa' +\n 'c459d1d08984d65319df8c5d124042169bbe2ab8c0c93bc7178827f2ea84e7c3' +\n 'a4f2660099fb6a4c38984c914283d3015278369521a4b81ecf927669b8c89746' +\n 'ef49ec7b019af7f3addc746362f298d96409bef4677b9c3d8e5b5afe7a44c0bc' +\n '130ebc7a79b5d5980966d88d3d9eba511b101b0703abd86df7410cd120edad12' +\n '2a7a3ccad92d906dbf6f43bba13555bafb626b45551275f3626a4ae26a14908d' +\n '38d640680e501f52bd08a0e3ff9d9185eebdae890c167459449b2c205b3ecde4',\n )\n })\n\n it('should correctly compute srp parameters as defined by MTProto', async () => {\n const crypto = await defaultTestCryptoProvider()\n const params = await computeSrpParams(crypto, fakeRequest, password)\n\n expect(params.srpId).toEqual(fakeRequest.srpId)\n expect(hexEncode(params.A)).toEqual(\n '363976f55edb57cc5cc0c4aaca9b7539eff98a43a93fa84be34860d18ac3a80f' +\n 'ffd57c4617896ff667677d0552a079eb189d25d147ec96edd4495c946a18652d' +\n '31d78eede40a8b29da340c19b32ccac78f8482406e392102c03d850d1db87223' +\n '2c144bfacadb58856971aafb70ca3aac4efa7f73977ddc50dfc0a2c76c0ac950' +\n '728d58b8480fa89c701703855148fadd885aaf1ca313ae3a3b2942de58a9a6fb' +\n '9e3e65c7ac7a1b7f4e6aa4742b957f81927bd8cc761b76f90229dec34d6f15d3' +\n '4fa454aa69d9219d9c5fa3625f5c6f1ac03892a70aa17269c76cd9bf2949a961' +\n 'fad2a71e5fa961824b32db037130c7e9aad4c1e9f02ebc5b832622f98b59597e',\n )\n expect(hexEncode(params.M1)).toEqual('25a91b21c634ad670a144165a9829192d152e131a716f676abc48cd817f508c6')\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,47 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { hexEncode, utf8Decode, utf8EncodeToBuffer } from '@mtcute/tl-runtime';
3
+ import { xorBuffer, xorBufferInPlace } from './utils.js';
4
+ describe('xorBuffer', () => {
5
+ it('should xor buffers without modifying original', () => {
6
+ const data = utf8EncodeToBuffer('hello');
7
+ const key = utf8EncodeToBuffer('xor');
8
+ const xored = xorBuffer(data, key);
9
+ expect(utf8Decode(data)).eq('hello');
10
+ expect(utf8Decode(key)).eq('xor');
11
+ expect(hexEncode(xored)).eq('100a1e6c6f');
12
+ });
13
+ it('should be deterministic', () => {
14
+ const data = utf8EncodeToBuffer('hello');
15
+ const key = utf8EncodeToBuffer('xor');
16
+ const xored1 = xorBuffer(data, key);
17
+ expect(hexEncode(xored1)).eq('100a1e6c6f');
18
+ const xored2 = xorBuffer(data, key);
19
+ expect(hexEncode(xored2)).eq('100a1e6c6f');
20
+ });
21
+ it('second call should decode content', () => {
22
+ const data = utf8EncodeToBuffer('hello');
23
+ const key = utf8EncodeToBuffer('xor');
24
+ const xored1 = xorBuffer(data, key);
25
+ expect(hexEncode(xored1)).eq('100a1e6c6f');
26
+ const xored2 = xorBuffer(xored1, key);
27
+ expect(utf8Decode(xored2)).eq('hello');
28
+ });
29
+ });
30
+ describe('xorBufferInPlace', () => {
31
+ it('should xor buffers by modifying original', () => {
32
+ const data = utf8EncodeToBuffer('hello');
33
+ const key = utf8EncodeToBuffer('xor');
34
+ xorBufferInPlace(data, key);
35
+ expect(hexEncode(data)).eq('100a1e6c6f');
36
+ expect(utf8Decode(key)).eq('xor');
37
+ });
38
+ it('second call should decode content', () => {
39
+ const data = utf8EncodeToBuffer('hello');
40
+ const key = utf8EncodeToBuffer('xor');
41
+ xorBufferInPlace(data, key);
42
+ expect(hexEncode(data)).eq('100a1e6c6f');
43
+ xorBufferInPlace(data, key);
44
+ expect(utf8Decode(data)).eq('hello');
45
+ });
46
+ });
47
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { hexEncode, utf8Decode, utf8EncodeToBuffer } from '@mtcute/tl-runtime'\n\nimport { xorBuffer, xorBufferInPlace } from './utils.js'\n\ndescribe('xorBuffer', () => {\n it('should xor buffers without modifying original', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n const xored = xorBuffer(data, key)\n expect(utf8Decode(data)).eq('hello')\n expect(utf8Decode(key)).eq('xor')\n expect(hexEncode(xored)).eq('100a1e6c6f')\n })\n\n it('should be deterministic', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n const xored1 = xorBuffer(data, key)\n expect(hexEncode(xored1)).eq('100a1e6c6f')\n\n const xored2 = xorBuffer(data, key)\n expect(hexEncode(xored2)).eq('100a1e6c6f')\n })\n\n it('second call should decode content', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n const xored1 = xorBuffer(data, key)\n expect(hexEncode(xored1)).eq('100a1e6c6f')\n\n const xored2 = xorBuffer(xored1, key)\n expect(utf8Decode(xored2)).eq('hello')\n })\n})\n\ndescribe('xorBufferInPlace', () => {\n it('should xor buffers by modifying original', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n xorBufferInPlace(data, key)\n expect(hexEncode(data)).eq('100a1e6c6f')\n expect(utf8Decode(key)).eq('xor')\n })\n\n it('second call should decode content', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n xorBufferInPlace(data, key)\n expect(hexEncode(data)).eq('100a1e6c6f')\n\n xorBufferInPlace(data, key)\n expect(utf8Decode(data)).eq('hello')\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ import { describe } from 'vitest';
2
+ import { testCryptoProvider } from '@mtcute/test';
3
+ import { WebCryptoProvider } from './web.js';
4
+ describe('WebCryptoProvider', async () => {
5
+ let crypto = globalThis.crypto;
6
+ if (!crypto && typeof process !== 'undefined') {
7
+ crypto = await import('crypto').then((m) => m.webcrypto);
8
+ }
9
+ if (!crypto) {
10
+ console.warn('Skipping WebCryptoProvider tests (no webcrypto)');
11
+ return;
12
+ }
13
+ testCryptoProvider(new WebCryptoProvider({ crypto }));
14
+ });
15
+ //# sourceMappingURL=web.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/web.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAE5C,QAAQ,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;IACrC,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;IAE9B,IAAI,CAAC,MAAM,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE;QAC3C,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAmB,CAAC,CAAA;KACrE;IAED,IAAI,CAAC,MAAM,EAAE;QACT,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;QAE/D,OAAM;KACT;IAED,kBAAkB,CAAC,IAAI,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;AACzD,CAAC,CAAC,CAAA","sourcesContent":["import { describe } from 'vitest'\n\nimport { testCryptoProvider } from '@mtcute/test'\n\nimport { WebCryptoProvider } from './web.js'\n\ndescribe('WebCryptoProvider', async () => {\n let crypto = globalThis.crypto\n\n if (!crypto && typeof process !== 'undefined') {\n crypto = await import('crypto').then((m) => m.webcrypto as Crypto)\n }\n\n if (!crypto) {\n console.warn('Skipping WebCryptoProvider tests (no webcrypto)')\n\n return\n }\n\n testCryptoProvider(new WebCryptoProvider({ crypto }))\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,126 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { Deque } from './deque.js';
3
+ describe('Deque', () => {
4
+ function setupWrapping() {
5
+ const d = new Deque(Infinity, /* capacity: */ 8);
6
+ for (let i = 1; i <= 7; i++) {
7
+ d.pushBack(i);
8
+ }
9
+ // [1, 2, 3, 4, 5, 6, 7, _]
10
+ d.popFront();
11
+ d.popFront();
12
+ d.popFront();
13
+ // [_, _, _, 4, 5, 6, 7, _]
14
+ d.pushBack(8);
15
+ d.pushBack(9);
16
+ d.pushBack(10);
17
+ // [9, 10, _, 4, 5, 6, 7, 8]
18
+ return d;
19
+ }
20
+ it('should push items to the end correctly', () => {
21
+ const d = new Deque();
22
+ d.pushBack(1);
23
+ d.pushBack(2);
24
+ d.pushBack(3);
25
+ expect(d.toArray()).eql([1, 2, 3]);
26
+ expect([...d.iter()]).eql([1, 2, 3]);
27
+ });
28
+ it('should push items to the start correctly', () => {
29
+ const d = new Deque();
30
+ d.pushFront(1);
31
+ d.pushFront(2);
32
+ d.pushFront(3);
33
+ expect(d.toArray()).eql([3, 2, 1]);
34
+ });
35
+ it('should pop items from the end correctly', () => {
36
+ const d = new Deque();
37
+ d.pushBack(1);
38
+ d.pushBack(2);
39
+ d.pushBack(3);
40
+ expect(d.popBack()).eql(3);
41
+ expect(d.popBack()).eql(2);
42
+ expect(d.popBack()).eql(1);
43
+ });
44
+ it('should pop items from the start correctly', () => {
45
+ const d = new Deque();
46
+ d.pushFront(1);
47
+ d.pushFront(2);
48
+ d.pushFront(3);
49
+ expect(d.popFront()).eql(3);
50
+ expect(d.popFront()).eql(2);
51
+ expect(d.popFront()).eql(1);
52
+ });
53
+ it('should return the correct length', () => {
54
+ const d = new Deque();
55
+ d.pushBack(1);
56
+ d.pushBack(2);
57
+ d.pushBack(3);
58
+ expect(d.length).eql(3);
59
+ });
60
+ it('accessors should correctly wrap around', () => {
61
+ const d = setupWrapping();
62
+ expect(d.toArray()).eql([4, 5, 6, 7, 8, 9, 10]);
63
+ expect([...d.iter()]).eql([4, 5, 6, 7, 8, 9, 10]);
64
+ expect(d.at(6)).eql(10);
65
+ });
66
+ it('should handle maxLength by removing items from the other end', () => {
67
+ const d = new Deque(4);
68
+ d.pushBack(1);
69
+ d.pushBack(2);
70
+ d.pushBack(3);
71
+ d.pushBack(4);
72
+ d.pushBack(5);
73
+ expect(d.toArray()).eql([2, 3, 4, 5]);
74
+ d.pushFront(6);
75
+ expect(d.toArray()).eql([6, 2, 3, 4]);
76
+ });
77
+ it('should correctly resize', () => {
78
+ const d = new Deque(Infinity, /* capacity: */ 8);
79
+ for (let i = 0; i <= 16; i++) {
80
+ d.pushBack(i);
81
+ }
82
+ const expected = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
83
+ expect(d.length).eql(17);
84
+ expect(d.toArray()).eql(expected);
85
+ expect([...d.iter()]).eql(expected);
86
+ expect(d.at(16)).eql(16);
87
+ });
88
+ it('should correctly remove items', () => {
89
+ const d = new Deque(Infinity, /* capacity: */ 16);
90
+ d.pushBack(1);
91
+ d.pushBack(2);
92
+ d.pushBack(3);
93
+ d.pushBack(4);
94
+ d.pushBack(5);
95
+ d.remove(1);
96
+ d.remove(4);
97
+ expect(d.toArray()).eql([2, 3, 5]);
98
+ });
99
+ it('should correctly remove items by predicate (the first matched)', () => {
100
+ const d = new Deque(Infinity, /* capacity: */ 4);
101
+ d.pushBack(1);
102
+ d.pushBack(2);
103
+ d.pushBack(3);
104
+ d.pushBack(4);
105
+ d.pushBack(5);
106
+ d.removeBy((it) => it >= 2);
107
+ expect(d.toArray()).eql([1, 3, 4, 5]);
108
+ });
109
+ it('should correctly peek at edges', () => {
110
+ const d = new Deque();
111
+ d.pushBack(1);
112
+ d.pushBack(2);
113
+ expect(d.peekFront()).eql(1);
114
+ expect(d.peekBack()).eql(2);
115
+ });
116
+ it('should correctly clear', () => {
117
+ const d = new Deque();
118
+ d.pushBack(1);
119
+ d.pushBack(2);
120
+ d.clear();
121
+ expect(d.length).eql(0);
122
+ expect(d.toArray()).eql([]);
123
+ expect([...d.iter()]).eql([]);
124
+ });
125
+ });
126
+ //# sourceMappingURL=deque.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deque.test.js","sourceRoot":"","sources":["../../../src/utils/deque.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { Deque } from './deque.js'\n\ndescribe('Deque', () => {\n function setupWrapping() {\n const d = new Deque<number>(Infinity, /* capacity: */ 8)\n\n for (let i = 1; i <= 7; i++) {\n d.pushBack(i)\n }\n\n // [1, 2, 3, 4, 5, 6, 7, _]\n\n d.popFront()\n d.popFront()\n d.popFront()\n\n // [_, _, _, 4, 5, 6, 7, _]\n\n d.pushBack(8)\n d.pushBack(9)\n d.pushBack(10)\n\n // [9, 10, _, 4, 5, 6, 7, 8]\n return d\n }\n\n it('should push items to the end correctly', () => {\n const d = new Deque<number>()\n\n d.pushBack(1)\n d.pushBack(2)\n d.pushBack(3)\n\n expect(d.toArray()).eql([1, 2, 3])\n expect([...d.iter()]).eql([1, 2, 3])\n })\n\n it('should push items to the start correctly', () => {\n const d = new Deque<number>()\n\n d.pushFront(1)\n d.pushFront(2)\n d.pushFront(3)\n\n expect(d.toArray()).eql([3, 2, 1])\n })\n\n it('should pop items from the end correctly', () => {\n const d = new Deque<number>()\n\n d.pushBack(1)\n d.pushBack(2)\n d.pushBack(3)\n\n expect(d.popBack()).eql(3)\n expect(d.popBack()).eql(2)\n expect(d.popBack()).eql(1)\n })\n\n it('should pop items from the start correctly', () => {\n const d = new Deque<number>()\n\n d.pushFront(1)\n d.pushFront(2)\n d.pushFront(3)\n\n expect(d.popFront()).eql(3)\n expect(d.popFront()).eql(2)\n expect(d.popFront()).eql(1)\n })\n\n it('should return the correct length', () => {\n const d = new Deque<number>()\n\n d.pushBack(1)\n d.pushBack(2)\n d.pushBack(3)\n\n expect(d.length).eql(3)\n })\n\n it('accessors should correctly wrap around', () => {\n const d = setupWrapping()\n\n expect(d.toArray()).eql([4, 5, 6, 7, 8, 9, 10])\n expect([...d.iter()]).eql([4, 5, 6, 7, 8, 9, 10])\n expect(d.at(6)).eql(10)\n })\n\n it('should handle maxLength by removing items from the other end', () => {\n const d = new Deque<number>(4)\n\n d.pushBack(1)\n d.pushBack(2)\n d.pushBack(3)\n d.pushBack(4)\n\n d.pushBack(5)\n expect(d.toArray()).eql([2, 3, 4, 5])\n\n d.pushFront(6)\n expect(d.toArray()).eql([6, 2, 3, 4])\n })\n\n it('should correctly resize', () => {\n const d = new Deque<number>(Infinity, /* capacity: */ 8)\n\n for (let i = 0; i <= 16; i++) {\n d.pushBack(i)\n }\n\n const expected = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]\n\n expect(d.length).eql(17)\n expect(d.toArray()).eql(expected)\n expect([...d.iter()]).eql(expected)\n expect(d.at(16)).eql(16)\n })\n\n it('should correctly remove items', () => {\n const d = new Deque<number>(Infinity, /* capacity: */ 16)\n\n d.pushBack(1)\n d.pushBack(2)\n d.pushBack(3)\n d.pushBack(4)\n d.pushBack(5)\n\n d.remove(1)\n d.remove(4)\n\n expect(d.toArray()).eql([2, 3, 5])\n })\n\n it('should correctly remove items by predicate (the first matched)', () => {\n const d = new Deque<number>(Infinity, /* capacity: */ 4)\n\n d.pushBack(1)\n d.pushBack(2)\n d.pushBack(3)\n d.pushBack(4)\n d.pushBack(5)\n\n d.removeBy((it) => it >= 2)\n\n expect(d.toArray()).eql([1, 3, 4, 5])\n })\n\n it('should correctly peek at edges', () => {\n const d = new Deque<number>()\n\n d.pushBack(1)\n d.pushBack(2)\n\n expect(d.peekFront()).eql(1)\n expect(d.peekBack()).eql(2)\n })\n\n it('should correctly clear', () => {\n const d = new Deque<number>()\n\n d.pushBack(1)\n d.pushBack(2)\n\n d.clear()\n\n expect(d.length).eql(0)\n expect(d.toArray()).eql([])\n expect([...d.iter()]).eql([])\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};