@mtcute/core 0.1.0 → 0.1.1

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 (219) 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/authorization.js +62 -57
  7. package/cjs/network/authorization.js.map +1 -1
  8. package/cjs/network/mtproto-session.d.ts +2 -2
  9. package/cjs/network/mtproto-session.js +2 -2
  10. package/cjs/network/mtproto-session.js.map +1 -1
  11. package/cjs/network/multi-session-connection.d.ts +1 -1
  12. package/cjs/network/multi-session-connection.js +2 -2
  13. package/cjs/network/multi-session-connection.js.map +1 -1
  14. package/cjs/network/network-manager.d.ts +1 -0
  15. package/cjs/network/network-manager.js +21 -27
  16. package/cjs/network/network-manager.js.map +1 -1
  17. package/cjs/network/session-connection.d.ts +2 -1
  18. package/cjs/network/session-connection.js +48 -35
  19. package/cjs/network/session-connection.js.map +1 -1
  20. package/cjs/network/transports/intermediate.d.ts +3 -0
  21. package/cjs/network/transports/intermediate.js +5 -3
  22. package/cjs/network/transports/intermediate.js.map +1 -1
  23. package/cjs/network/transports/obfuscated.js +14 -18
  24. package/cjs/network/transports/obfuscated.js.map +1 -1
  25. package/cjs/storage/abstract.d.ts +23 -2
  26. package/cjs/storage/abstract.js.map +1 -1
  27. package/cjs/storage/json.js +8 -9
  28. package/cjs/storage/json.js.map +1 -1
  29. package/cjs/storage/localstorage.js +5 -2
  30. package/cjs/storage/localstorage.js.map +1 -1
  31. package/cjs/storage/memory.d.ts +7 -8
  32. package/cjs/storage/memory.js +7 -7
  33. package/cjs/storage/memory.js.map +1 -1
  34. package/cjs/utils/bigint-utils.d.ts +18 -11
  35. package/cjs/utils/bigint-utils.js +148 -47
  36. package/cjs/utils/bigint-utils.js.map +1 -1
  37. package/cjs/utils/buffer-utils.d.ts +7 -1
  38. package/cjs/utils/buffer-utils.js +16 -3
  39. package/cjs/utils/buffer-utils.js.map +1 -1
  40. package/cjs/utils/crypto/abstract.d.ts +16 -9
  41. package/cjs/utils/crypto/abstract.js +6 -9
  42. package/cjs/utils/crypto/abstract.js.map +1 -1
  43. package/cjs/utils/crypto/factorization.d.ts +2 -1
  44. package/cjs/utils/crypto/factorization.js +28 -36
  45. package/cjs/utils/crypto/factorization.js.map +1 -1
  46. package/cjs/utils/crypto/index.d.ts +4 -0
  47. package/cjs/utils/crypto/index.js +4 -0
  48. package/cjs/utils/crypto/index.js.map +1 -1
  49. package/cjs/utils/crypto/keys.d.ts +2 -2
  50. package/cjs/utils/crypto/keys.js +4 -4
  51. package/cjs/utils/crypto/keys.js.map +1 -1
  52. package/cjs/utils/crypto/miller-rabin.d.ts +2 -2
  53. package/cjs/utils/crypto/miller-rabin.js +20 -22
  54. package/cjs/utils/crypto/miller-rabin.js.map +1 -1
  55. package/cjs/utils/crypto/mtproto.d.ts +3 -3
  56. package/cjs/utils/crypto/mtproto.js +12 -12
  57. package/cjs/utils/crypto/mtproto.js.map +1 -1
  58. package/cjs/utils/crypto/node.d.ts +21 -0
  59. package/cjs/utils/crypto/node.js +74 -0
  60. package/cjs/utils/crypto/node.js.map +1 -0
  61. package/cjs/utils/crypto/password.js +22 -33
  62. package/cjs/utils/crypto/password.js.map +1 -1
  63. package/cjs/utils/crypto/wasm.d.ts +22 -0
  64. package/cjs/utils/crypto/wasm.js +41 -0
  65. package/cjs/utils/crypto/wasm.js.map +1 -0
  66. package/cjs/utils/crypto/web.d.ts +11 -0
  67. package/cjs/utils/crypto/web.js +40 -0
  68. package/cjs/utils/crypto/web.js.map +1 -0
  69. package/cjs/utils/deque.d.ts +1 -1
  70. package/cjs/utils/deque.js +9 -3
  71. package/cjs/utils/deque.js.map +1 -1
  72. package/cjs/utils/function-utils.d.ts +4 -1
  73. package/cjs/utils/function-utils.js +8 -1
  74. package/cjs/utils/function-utils.js.map +1 -1
  75. package/cjs/utils/index.d.ts +0 -1
  76. package/cjs/utils/index.js +0 -1
  77. package/cjs/utils/index.js.map +1 -1
  78. package/cjs/utils/logger.d.ts +0 -1
  79. package/cjs/utils/logger.js +3 -4
  80. package/cjs/utils/logger.js.map +1 -1
  81. package/cjs/utils/lru-map.d.ts +1 -0
  82. package/cjs/utils/lru-map.js +6 -0
  83. package/cjs/utils/lru-map.js.map +1 -1
  84. package/cjs/utils/peer-utils.js +5 -1
  85. package/cjs/utils/peer-utils.js.map +1 -1
  86. package/cjs/utils/platform/crypto.js +2 -2
  87. package/cjs/utils/platform/crypto.js.map +1 -1
  88. package/cjs/utils/platform/crypto.web.js +2 -2
  89. package/cjs/utils/platform/crypto.web.js.map +1 -1
  90. package/cjs/utils/string-session.js +4 -2
  91. package/cjs/utils/string-session.js.map +1 -1
  92. package/esm/base-client.js +4 -1
  93. package/esm/base-client.js.map +1 -1
  94. package/esm/network/auth-key.d.ts +3 -3
  95. package/esm/network/auth-key.js +13 -13
  96. package/esm/network/auth-key.js.map +1 -1
  97. package/esm/network/authorization.js +64 -59
  98. package/esm/network/authorization.js.map +1 -1
  99. package/esm/network/mtproto-session.d.ts +2 -2
  100. package/esm/network/mtproto-session.js +2 -2
  101. package/esm/network/mtproto-session.js.map +1 -1
  102. package/esm/network/multi-session-connection.d.ts +1 -1
  103. package/esm/network/multi-session-connection.js +2 -2
  104. package/esm/network/multi-session-connection.js.map +1 -1
  105. package/esm/network/network-manager.d.ts +1 -0
  106. package/esm/network/network-manager.js +21 -27
  107. package/esm/network/network-manager.js.map +1 -1
  108. package/esm/network/session-connection.d.ts +2 -1
  109. package/esm/network/session-connection.js +50 -37
  110. package/esm/network/session-connection.js.map +1 -1
  111. package/esm/network/transports/intermediate.d.ts +3 -0
  112. package/esm/network/transports/intermediate.js +6 -4
  113. package/esm/network/transports/intermediate.js.map +1 -1
  114. package/esm/network/transports/obfuscated.js +15 -19
  115. package/esm/network/transports/obfuscated.js.map +1 -1
  116. package/esm/storage/abstract.d.ts +23 -2
  117. package/esm/storage/abstract.js.map +1 -1
  118. package/esm/storage/json.js +8 -9
  119. package/esm/storage/json.js.map +1 -1
  120. package/esm/storage/localstorage.js +5 -2
  121. package/esm/storage/localstorage.js.map +1 -1
  122. package/esm/storage/memory.d.ts +7 -8
  123. package/esm/storage/memory.js +7 -7
  124. package/esm/storage/memory.js.map +1 -1
  125. package/esm/utils/bigint-utils.d.ts +18 -11
  126. package/esm/utils/bigint-utils.js +142 -44
  127. package/esm/utils/bigint-utils.js.map +1 -1
  128. package/esm/utils/buffer-utils.d.ts +7 -1
  129. package/esm/utils/buffer-utils.js +14 -1
  130. package/esm/utils/buffer-utils.js.map +1 -1
  131. package/esm/utils/crypto/abstract.d.ts +16 -9
  132. package/esm/utils/crypto/abstract.js +6 -9
  133. package/esm/utils/crypto/abstract.js.map +1 -1
  134. package/esm/utils/crypto/factorization.d.ts +2 -1
  135. package/esm/utils/crypto/factorization.js +29 -34
  136. package/esm/utils/crypto/factorization.js.map +1 -1
  137. package/esm/utils/crypto/index.d.ts +4 -0
  138. package/esm/utils/crypto/index.js +4 -0
  139. package/esm/utils/crypto/index.js.map +1 -1
  140. package/esm/utils/crypto/keys.d.ts +2 -2
  141. package/esm/utils/crypto/keys.js +4 -4
  142. package/esm/utils/crypto/keys.js.map +1 -1
  143. package/esm/utils/crypto/miller-rabin.d.ts +2 -2
  144. package/esm/utils/crypto/miller-rabin.js +21 -20
  145. package/esm/utils/crypto/miller-rabin.js.map +1 -1
  146. package/esm/utils/crypto/mtproto.d.ts +3 -3
  147. package/esm/utils/crypto/mtproto.js +12 -12
  148. package/esm/utils/crypto/mtproto.js.map +1 -1
  149. package/esm/utils/crypto/node.d.ts +21 -0
  150. package/esm/utils/crypto/node.js +69 -0
  151. package/esm/utils/crypto/node.js.map +1 -0
  152. package/esm/utils/crypto/password.js +24 -32
  153. package/esm/utils/crypto/password.js.map +1 -1
  154. package/esm/utils/crypto/wasm.d.ts +22 -0
  155. package/esm/utils/crypto/wasm.js +37 -0
  156. package/esm/utils/crypto/wasm.js.map +1 -0
  157. package/esm/utils/crypto/web.d.ts +11 -0
  158. package/esm/utils/crypto/web.js +36 -0
  159. package/esm/utils/crypto/web.js.map +1 -0
  160. package/esm/utils/deque.d.ts +1 -1
  161. package/esm/utils/deque.js +9 -3
  162. package/esm/utils/deque.js.map +1 -1
  163. package/esm/utils/function-utils.d.ts +4 -1
  164. package/esm/utils/function-utils.js +8 -1
  165. package/esm/utils/function-utils.js.map +1 -1
  166. package/esm/utils/index.d.ts +0 -1
  167. package/esm/utils/index.js +0 -1
  168. package/esm/utils/index.js.map +1 -1
  169. package/esm/utils/logger.d.ts +0 -1
  170. package/esm/utils/logger.js +3 -4
  171. package/esm/utils/logger.js.map +1 -1
  172. package/esm/utils/lru-map.d.ts +1 -0
  173. package/esm/utils/lru-map.js +6 -0
  174. package/esm/utils/lru-map.js.map +1 -1
  175. package/esm/utils/peer-utils.js +5 -1
  176. package/esm/utils/peer-utils.js.map +1 -1
  177. package/esm/utils/platform/crypto.js +1 -1
  178. package/esm/utils/platform/crypto.js.map +1 -1
  179. package/esm/utils/platform/crypto.web.js +2 -2
  180. package/esm/utils/platform/crypto.web.js.map +1 -1
  181. package/esm/utils/string-session.js +4 -2
  182. package/esm/utils/string-session.js.map +1 -1
  183. package/package.json +4 -5
  184. package/cjs/utils/crypto/common.d.ts +0 -12
  185. package/cjs/utils/crypto/common.js +0 -54
  186. package/cjs/utils/crypto/common.js.map +0 -1
  187. package/cjs/utils/crypto/node-crypto.d.ts +0 -10
  188. package/cjs/utils/crypto/node-crypto.js +0 -46
  189. package/cjs/utils/crypto/node-crypto.js.map +0 -1
  190. package/cjs/utils/crypto/subtle.d.ts +0 -12
  191. package/cjs/utils/crypto/subtle.js +0 -86
  192. package/cjs/utils/crypto/subtle.js.map +0 -1
  193. package/cjs/utils/flood-control.d.ts +0 -14
  194. package/cjs/utils/flood-control.js +0 -65
  195. package/cjs/utils/flood-control.js.map +0 -1
  196. package/cjs/utils/platform/random.d.ts +0 -1
  197. package/cjs/utils/platform/random.js +0 -7
  198. package/cjs/utils/platform/random.js.map +0 -1
  199. package/cjs/utils/platform/random.web.d.ts +0 -1
  200. package/cjs/utils/platform/random.web.js +0 -10
  201. package/cjs/utils/platform/random.web.js.map +0 -1
  202. package/esm/utils/crypto/common.d.ts +0 -12
  203. package/esm/utils/crypto/common.js +0 -50
  204. package/esm/utils/crypto/common.js.map +0 -1
  205. package/esm/utils/crypto/node-crypto.d.ts +0 -10
  206. package/esm/utils/crypto/node-crypto.js +0 -42
  207. package/esm/utils/crypto/node-crypto.js.map +0 -1
  208. package/esm/utils/crypto/subtle.d.ts +0 -12
  209. package/esm/utils/crypto/subtle.js +0 -59
  210. package/esm/utils/crypto/subtle.js.map +0 -1
  211. package/esm/utils/flood-control.d.ts +0 -14
  212. package/esm/utils/flood-control.js +0 -61
  213. package/esm/utils/flood-control.js.map +0 -1
  214. package/esm/utils/platform/random.d.ts +0 -1
  215. package/esm/utils/platform/random.js +0 -4
  216. package/esm/utils/platform/random.js.map +0 -1
  217. package/esm/utils/platform/random.web.d.ts +0 -1
  218. package/esm/utils/platform/random.web.js +0 -6
  219. package/esm/utils/platform/random.web.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../../src/utils/crypto/keys.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,IAAI,SAAS,EAAe,MAAM,+BAA+B,CAAA;AAC1F,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAE9D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAGtE;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAuB,EAAE,GAAW,EAAE,GAAG,GAAG,KAAK;IAClF,MAAM,IAAI,GAAG,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACzC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;IAEhE,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACzC,yDAAyD;IACzD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACrB,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAEtB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;IAC5B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;IAE7C,OAAO;QACH,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC;QAC3B,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC;QAC7B,WAAW,EAAE,EAAE;QACf,GAAG;KACN,CAAA;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAuB,EAAE,GAAW,EAAE,GAAG,GAAG,KAAK;IAChF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACrD,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,CAAA;AAC1C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,YAA+B,EAAE,QAAQ,GAAG,KAAK;IACnF,KAAK,IAAI,EAAE,IAAI,YAAY,EAAE;QACzB,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE;YACxB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;SACpC;QACD,IAAI,EAAE,IAAI,SAAS,EAAE;YACjB,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;gBAAE,SAAQ;YAE5C,OAAO,SAAS,CAAC,EAAE,CAAC,CAAA;SACvB;KACJ;IACD,IAAI,CAAC,QAAQ;QAAE,OAAO,qBAAqB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;IAE/D,OAAO,IAAI,CAAA;AACf,CAAC","sourcesContent":["import Long from 'long'\n\nimport { __publicKeyIndex as keysIndex, TlPublicKey } from '@mtcute/tl/binary/rsa-keys.js'\nimport { hexEncode, TlBinaryWriter } from '@mtcute/tl-runtime'\n\nimport { parseAsn1, parsePemContents } from '../binary/asn1-parser.js'\nimport { ICryptoProvider } from './abstract.js'\n\n/**\n * Parse PEM-encoded RSA public key information into modulus and exponent\n * and compute its fingerprint as defined by MTProto.\n *\n * @param crypto Crypto provider\n * @param key PEM-encoded RSA public key\n * @param old Whether this is an \"old\" key\n */\nexport async function parsePublicKey(crypto: ICryptoProvider, key: string, old = false): Promise<TlPublicKey> {\n const asn1 = parseAsn1(parsePemContents(key))\n const modulus = asn1.children?.[0].value\n const exponent = asn1.children?.[1].value\n if (!modulus || !exponent) throw new Error('Invalid public key')\n\n const writer = TlBinaryWriter.manual(512)\n // they are actually smaller, about 270 bytes, but idc :D\n writer.bytes(modulus)\n writer.bytes(exponent)\n\n const data = writer.result()\n const sha = await crypto.sha1(data)\n const fp = hexEncode(sha.slice(-8).reverse())\n\n return {\n modulus: hexEncode(modulus),\n exponent: hexEncode(exponent),\n fingerprint: fp,\n old,\n }\n}\n\n/**\n * Add public key to the global index.\n *\n * @param crypto Crypto provider\n * @param key PEM-encoded RSA public key\n * @param old Whether this is an \"old\" key\n */\nexport async function addPublicKey(crypto: ICryptoProvider, key: string, old = false): Promise<void> {\n const parsed = await parsePublicKey(crypto, key, old)\n keysIndex[parsed.fingerprint] = parsed\n}\n\n/**\n * Get public key by its fingerprint.\n *\n * @param fingerprints Fingerprints to match. The first one to match is returned.\n * @param allowOld Whether to allow \"old\" keys\n */\nexport function findKeyByFingerprints(fingerprints: (string | Long)[], allowOld = false): TlPublicKey | null {\n for (let fp of fingerprints) {\n if (typeof fp !== 'string') {\n fp = fp.toUnsigned().toString(16)\n }\n if (fp in keysIndex) {\n if (keysIndex[fp].old && !allowOld) continue\n\n return keysIndex[fp]\n }\n }\n if (!allowOld) return findKeyByFingerprints(fingerprints, true)\n\n return null\n}\n"]}
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../../src/utils/crypto/keys.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,IAAI,SAAS,EAAe,MAAM,+BAA+B,CAAA;AAC1F,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAE9D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAGtE;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,MAAuB,EAAE,GAAW,EAAE,GAAG,GAAG,KAAK;IAC5E,MAAM,IAAI,GAAG,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACzC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;IAEhE,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACzC,yDAAyD;IACzD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACrB,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAEtB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7B,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;IAE7C,OAAO;QACH,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC;QAC3B,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC;QAC7B,WAAW,EAAE,EAAE;QACf,GAAG;KACN,CAAA;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,MAAuB,EAAE,GAAW,EAAE,GAAG,GAAG,KAAK;IAC1E,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IAC/C,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,CAAA;AAC1C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,YAA+B,EAAE,QAAQ,GAAG,KAAK;IACnF,KAAK,IAAI,EAAE,IAAI,YAAY,EAAE;QACzB,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE;YACxB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;SACpC;QACD,IAAI,EAAE,IAAI,SAAS,EAAE;YACjB,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;gBAAE,SAAQ;YAE5C,OAAO,SAAS,CAAC,EAAE,CAAC,CAAA;SACvB;KACJ;IACD,IAAI,CAAC,QAAQ;QAAE,OAAO,qBAAqB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;IAE/D,OAAO,IAAI,CAAA;AACf,CAAC","sourcesContent":["import Long from 'long'\n\nimport { __publicKeyIndex as keysIndex, TlPublicKey } from '@mtcute/tl/binary/rsa-keys.js'\nimport { hexEncode, TlBinaryWriter } from '@mtcute/tl-runtime'\n\nimport { parseAsn1, parsePemContents } from '../binary/asn1-parser.js'\nimport { ICryptoProvider } from './abstract.js'\n\n/**\n * Parse PEM-encoded RSA public key information into modulus and exponent\n * and compute its fingerprint as defined by MTProto.\n *\n * @param crypto Crypto provider\n * @param key PEM-encoded RSA public key\n * @param old Whether this is an \"old\" key\n */\nexport function parsePublicKey(crypto: ICryptoProvider, key: string, old = false): TlPublicKey {\n const asn1 = parseAsn1(parsePemContents(key))\n const modulus = asn1.children?.[0].value\n const exponent = asn1.children?.[1].value\n if (!modulus || !exponent) throw new Error('Invalid public key')\n\n const writer = TlBinaryWriter.manual(512)\n // they are actually smaller, about 270 bytes, but idc :D\n writer.bytes(modulus)\n writer.bytes(exponent)\n\n const data = writer.result()\n const sha = crypto.sha1(data)\n const fp = hexEncode(sha.slice(-8).reverse())\n\n return {\n modulus: hexEncode(modulus),\n exponent: hexEncode(exponent),\n fingerprint: fp,\n old,\n }\n}\n\n/**\n * Add public key to the global index.\n *\n * @param crypto Crypto provider\n * @param key PEM-encoded RSA public key\n * @param old Whether this is an \"old\" key\n */\nexport function addPublicKey(crypto: ICryptoProvider, key: string, old = false): void {\n const parsed = parsePublicKey(crypto, key, old)\n keysIndex[parsed.fingerprint] = parsed\n}\n\n/**\n * Get public key by its fingerprint.\n *\n * @param fingerprints Fingerprints to match. The first one to match is returned.\n * @param allowOld Whether to allow \"old\" keys\n */\nexport function findKeyByFingerprints(fingerprints: (string | Long)[], allowOld = false): TlPublicKey | null {\n for (let fp of fingerprints) {\n if (typeof fp !== 'string') {\n fp = fp.toUnsigned().toString(16)\n }\n if (fp in keysIndex) {\n if (keysIndex[fp].old && !allowOld) continue\n\n return keysIndex[fp]\n }\n }\n if (!allowOld) return findKeyByFingerprints(fingerprints, true)\n\n return null\n}\n"]}
@@ -1,2 +1,2 @@
1
- import { BigInteger } from 'big-integer';
2
- export declare function millerRabin(n: BigInteger, rounds?: number): boolean;
1
+ import { ICryptoProvider } from './abstract.js';
2
+ export declare function millerRabin(crypto: ICryptoProvider, n: bigint, rounds?: number): boolean;
@@ -1,35 +1,36 @@
1
- import bigInt from 'big-integer';
2
- import { randomBigIntBits, twoMultiplicity } from '../bigint-utils.js';
3
- export function millerRabin(n, rounds = 20) {
1
+ import { bigIntBitLength, bigIntModPow, randomBigIntBits, twoMultiplicity } from '../bigint-utils.js';
2
+ export function millerRabin(crypto, n, rounds = 20) {
4
3
  // small numbers: 0, 1 are not prime, 2, 3 are prime
5
- if (n.lt(bigInt[4]))
6
- return n.gt(bigInt[1]);
7
- if (n.isEven() || n.isNegative())
4
+ if (n < 4n)
5
+ return n > 1n;
6
+ if (n % 2n === 0n || n < 0n)
8
7
  return false;
9
- const nBits = n.bitLength().toJSNumber();
10
- const nSub = n.minus(1);
8
+ const nBits = bigIntBitLength(n);
9
+ const nSub = n - 1n;
11
10
  const r = twoMultiplicity(nSub);
12
- const d = nSub.shiftRight(r);
11
+ const d = nSub >> r;
13
12
  for (let i = 0; i < rounds; i++) {
14
13
  let base;
15
14
  do {
16
- base = randomBigIntBits(nBits);
17
- } while (base.leq(bigInt.one) || base.geq(nSub));
18
- let x = base.modPow(d, n);
19
- if (x.eq(bigInt.one) || x.eq(nSub))
15
+ base = randomBigIntBits(crypto, nBits);
16
+ } while (base <= 1n || base >= nSub);
17
+ let x = bigIntModPow(base, d, n);
18
+ // if (x.eq(bigInt.one) || x.eq(nSub)) continue
19
+ if (x === 1n || x === nSub)
20
20
  continue;
21
- let i = bigInt.zero;
21
+ let i = 0n;
22
22
  let y;
23
- while (i.lt(r)) {
24
- y = x.modPow(bigInt[2], n);
25
- if (x.eq(bigInt.one))
23
+ while (i < r) {
24
+ // y = x.modPow(bigInt[2], n)
25
+ y = bigIntModPow(x, 2n, n);
26
+ if (x === 1n)
26
27
  return false;
27
- if (x.eq(nSub))
28
+ if (x === nSub)
28
29
  break;
29
- i = i.plus(bigInt.one);
30
+ i += 1n;
30
31
  x = y;
31
32
  }
32
- if (i.eq(r))
33
+ if (i === r)
33
34
  return false;
34
35
  }
35
36
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"miller-rabin.js","sourceRoot":"","sources":["../../../../src/utils/crypto/miller-rabin.ts"],"names":[],"mappings":"AAAA,OAAO,MAAsB,MAAM,aAAa,CAAA;AAEhD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEtE,MAAM,UAAU,WAAW,CAAC,CAAa,EAAE,MAAM,GAAG,EAAE;IAClD,oDAAoD;IACpD,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,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,eAAe,CAAC,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,gBAAgB,CAAC,KAAK,CAAC,CAAA;SACjC,QAAQ,IAAI,CAAC,GAAG,CAAC,MAAM,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,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;YAAE,SAAQ;QAE5C,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAA;QACnB,IAAI,CAAa,CAAA;QAEjB,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACZ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAE1B,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAA;YAClC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;gBAAE,MAAK;YACrB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,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","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,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGrG,MAAM,UAAU,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,eAAe,CAAC,CAAC,CAAC,CAAA;IAChC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAA;IAEnB,MAAM,CAAC,GAAG,eAAe,CAAC,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,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;SACzC,QAAQ,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAC;QAEpC,IAAI,CAAC,GAAG,YAAY,CAAC,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,YAAY,CAAC,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","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"]}
@@ -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;
@@ -8,10 +8,10 @@ import { concatBuffers } from '../buffer-utils.js';
8
8
  * @param newNonce New nonce
9
9
  * @returns Tuple: `[key, iv]`
10
10
  */
11
- export async function generateKeyAndIvFromNonce(crypto, serverNonce, newNonce) {
12
- const hash1 = await crypto.sha1(concatBuffers([newNonce, serverNonce]));
13
- const hash2 = await crypto.sha1(concatBuffers([serverNonce, newNonce]));
14
- const hash3 = await crypto.sha1(concatBuffers([newNonce, newNonce]));
11
+ export function generateKeyAndIvFromNonce(crypto, serverNonce, newNonce) {
12
+ const hash1 = crypto.sha1(concatBuffers([newNonce, serverNonce]));
13
+ const hash2 = crypto.sha1(concatBuffers([serverNonce, newNonce]));
14
+ const hash3 = crypto.sha1(concatBuffers([newNonce, newNonce]));
15
15
  const key = concatBuffers([hash1, hash2.subarray(0, 12)]);
16
16
  const iv = concatBuffers([hash2.subarray(12, 20), hash3, newNonce.subarray(0, 4)]);
17
17
  return [key, iv];
@@ -25,10 +25,10 @@ export async function generateKeyAndIvFromNonce(crypto, serverNonce, newNonce) {
25
25
  * @param messageKey Message key
26
26
  * @param client Whether this is a client to server message
27
27
  */
28
- export async function createAesIgeForMessage(crypto, authKey, messageKey, client) {
28
+ export function createAesIgeForMessage(crypto, authKey, messageKey, client) {
29
29
  const x = client ? 0 : 8;
30
- const sha256a = await crypto.sha256(concatBuffers([messageKey, authKey.subarray(x, 36 + x)]));
31
- const sha256b = await crypto.sha256(concatBuffers([authKey.subarray(40 + x, 76 + x), messageKey]));
30
+ const sha256a = crypto.sha256(concatBuffers([messageKey, authKey.subarray(x, 36 + x)]));
31
+ const sha256b = crypto.sha256(concatBuffers([authKey.subarray(40 + x, 76 + x), messageKey]));
32
32
  const key = concatBuffers([sha256a.subarray(0, 8), sha256b.subarray(8, 24), sha256a.subarray(24, 32)]);
33
33
  const iv = concatBuffers([sha256b.subarray(0, 8), sha256a.subarray(8, 24), sha256b.subarray(24, 32)]);
34
34
  return crypto.createAesIge(key, iv);
@@ -42,12 +42,12 @@ export async function createAesIgeForMessage(crypto, authKey, messageKey, client
42
42
  * @param messageKey Message key
43
43
  * @param client Whether this is a client to server message
44
44
  */
45
- export async function createAesIgeForMessageOld(crypto, authKey, messageKey, client) {
45
+ export function createAesIgeForMessageOld(crypto, authKey, messageKey, client) {
46
46
  const x = client ? 0 : 8;
47
- const sha1a = await crypto.sha1(concatBuffers([messageKey, authKey.subarray(x, 32 + x)]));
48
- const sha1b = await crypto.sha1(concatBuffers([authKey.subarray(32 + x, 48 + x), messageKey, authKey.subarray(48 + x, 64 + x)]));
49
- const sha1c = await crypto.sha1(concatBuffers([authKey.subarray(64 + x, 96 + x), messageKey]));
50
- const sha1d = await crypto.sha1(concatBuffers([messageKey, authKey.subarray(96 + x, 128 + x)]));
47
+ const sha1a = crypto.sha1(concatBuffers([messageKey, authKey.subarray(x, 32 + x)]));
48
+ const sha1b = crypto.sha1(concatBuffers([authKey.subarray(32 + x, 48 + x), messageKey, authKey.subarray(48 + x, 64 + x)]));
49
+ const sha1c = crypto.sha1(concatBuffers([authKey.subarray(64 + x, 96 + x), messageKey]));
50
+ const sha1d = crypto.sha1(concatBuffers([messageKey, authKey.subarray(96 + x, 128 + x)]));
51
51
  const key = concatBuffers([sha1a.subarray(0, 8), sha1b.subarray(8, 20), sha1c.subarray(4, 16)]);
52
52
  const iv = concatBuffers([
53
53
  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,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,69 @@
1
+ // eslint-disable-next-line no-restricted-imports
2
+ import { createCipheriv, createHash, createHmac, pbkdf2, randomFillSync } from 'crypto';
3
+ import { deflateSync, gunzipSync } from 'zlib';
4
+ import { ige256Decrypt, ige256Encrypt, initAsync } from '@mtcute/wasm';
5
+ import { BaseCryptoProvider } from './abstract.js';
6
+ export class BaseNodeCryptoProvider extends BaseCryptoProvider {
7
+ createAesCtr(key, iv) {
8
+ const cipher = createCipheriv(`aes-${key.length * 8}-ctr`, key, iv);
9
+ const update = (data) => cipher.update(data);
10
+ return {
11
+ process: update,
12
+ };
13
+ }
14
+ pbkdf2(password, salt, iterations, keylen = 64, algo = 'sha512') {
15
+ return new Promise((resolve, reject) => pbkdf2(password, salt, iterations, keylen, algo, (err, buf) => err !== null ? reject(err) : resolve(buf)));
16
+ }
17
+ sha1(data) {
18
+ return createHash('sha1').update(data).digest();
19
+ }
20
+ sha256(data) {
21
+ return createHash('sha256').update(data).digest();
22
+ }
23
+ hmacSha256(data, key) {
24
+ return createHmac('sha256', key).update(data).digest();
25
+ }
26
+ gzip(data, maxSize) {
27
+ // todo: test if wasm impl is better fit here
28
+ try {
29
+ // telegram accepts both zlib and gzip, but zlib is faster and has less overhead, so we use it here
30
+ return deflateSync(data, {
31
+ maxOutputLength: maxSize,
32
+ });
33
+ // hot path, avoid additional runtime checks
34
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
+ }
36
+ catch (e) {
37
+ if (e.code === 'ERR_BUFFER_TOO_LARGE') {
38
+ return null;
39
+ }
40
+ throw e;
41
+ }
42
+ }
43
+ gunzip(data) {
44
+ return gunzipSync(data);
45
+ }
46
+ randomFill(buf) {
47
+ randomFillSync(buf);
48
+ }
49
+ }
50
+ export class NodeCryptoProvider extends BaseNodeCryptoProvider {
51
+ constructor(params) {
52
+ super();
53
+ this.wasmInput = params?.wasmInput;
54
+ }
55
+ initialize() {
56
+ return initAsync(this.wasmInput);
57
+ }
58
+ createAesIge(key, iv) {
59
+ return {
60
+ encrypt(data) {
61
+ return ige256Encrypt(data, key, iv);
62
+ },
63
+ decrypt(data) {
64
+ return ige256Decrypt(data, key, iv);
65
+ },
66
+ };
67
+ }
68
+ }
69
+ //# 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"]}
@@ -1,8 +1,7 @@
1
- import bigInt from 'big-integer';
2
1
  import { utf8EncodeToBuffer } from '@mtcute/tl-runtime';
3
2
  import { MtSecurityError, MtUnsupportedError } from '../../types/errors.js';
4
- import { bigIntToBuffer, bufferToBigInt } from '../bigint-utils.js';
5
- import { concatBuffers, randomBytes } from '../buffer-utils.js';
3
+ import { bigIntModPow, bigIntToBuffer, bufferToBigInt } from '../bigint-utils.js';
4
+ import { concatBuffers } from '../buffer-utils.js';
6
5
  import { xorBuffer } from './utils.js';
7
6
  /**
8
7
  * Compute password hash as defined by MTProto.
@@ -16,8 +15,8 @@ import { xorBuffer } from './utils.js';
16
15
  */
17
16
  export async function computePasswordHash(crypto, password, salt1, salt2) {
18
17
  const SH = (data, salt) => crypto.sha256(concatBuffers([salt, data, salt]));
19
- const PH1 = async (pwd, salt1, salt2) => SH(await SH(pwd, salt1), salt2);
20
- return SH(await crypto.pbkdf2(await PH1(password, salt1, salt2), salt1, 100000), salt2);
18
+ const PH1 = (pwd, salt1, salt2) => SH(SH(pwd, salt1), salt2);
19
+ return SH(await crypto.pbkdf2(PH1(password, salt1, salt2), salt1, 100000), salt2);
21
20
  }
22
21
  /**
23
22
  * Compute new password SRP hash as defined by MTProto.
@@ -27,12 +26,15 @@ export async function computePasswordHash(crypto, password, salt1, salt2) {
27
26
  * @param password Password
28
27
  */
29
28
  export async function computeNewPasswordHash(crypto, algo, password) {
30
- algo.salt1 = concatBuffers([algo.salt1, randomBytes(32)]);
29
+ const salt1 = new Uint8Array(algo.salt1.length + 32);
30
+ salt1.set(algo.salt1);
31
+ crypto.randomFill(salt1.subarray(algo.salt1.length));
32
+ algo.salt1 = salt1;
31
33
  const _x = await computePasswordHash(crypto, utf8EncodeToBuffer(password), algo.salt1, algo.salt2);
32
- const g = bigInt(algo.g);
34
+ const g = BigInt(algo.g);
33
35
  const p = bufferToBigInt(algo.p);
34
36
  const x = bufferToBigInt(_x);
35
- return bigIntToBuffer(g.modPow(x, p), 256);
37
+ return bigIntToBuffer(bigIntModPow(g, x, p), 256);
36
38
  }
37
39
  /**
38
40
  * Compute SRP check parameters for 2fa password as defined by MTProto.
@@ -55,38 +57,28 @@ export async function computeSrpParams(crypto, request, password) {
55
57
  if (!request.srpId) {
56
58
  throw new MtSecurityError('SRP_ID is not present in the request');
57
59
  }
58
- const g = bigInt(algo.g);
60
+ const g = BigInt(algo.g);
59
61
  const _g = bigIntToBuffer(g, 256);
60
62
  const p = bufferToBigInt(algo.p);
61
63
  const gB = bufferToBigInt(request.srpB);
62
- const a = bufferToBigInt(randomBytes(256));
63
- const gA = g.modPow(a, p);
64
+ const a = bufferToBigInt(crypto.randomBytes(256));
65
+ const gA = bigIntModPow(g, a, p);
64
66
  const _gA = bigIntToBuffer(gA, 256);
65
67
  const H = (data) => crypto.sha256(data);
66
- const [_k, _u, _x] = await Promise.all([
67
- // maybe, just maybe this will be a bit faster with some crypto providers
68
- /* k = */ crypto.sha256(concatBuffers([algo.p, _g])),
69
- /* u = */ crypto.sha256(concatBuffers([_gA, request.srpB])),
70
- /* x = */ computePasswordHash(crypto, utf8EncodeToBuffer(password), algo.salt1, algo.salt2),
71
- ]);
68
+ const _k = crypto.sha256(concatBuffers([algo.p, _g]));
69
+ const _u = crypto.sha256(concatBuffers([_gA, request.srpB]));
70
+ const _x = await computePasswordHash(crypto, utf8EncodeToBuffer(password), algo.salt1, algo.salt2);
72
71
  const k = bufferToBigInt(_k);
73
72
  const u = bufferToBigInt(_u);
74
73
  const x = bufferToBigInt(_x);
75
- const v = g.modPow(x, p);
76
- const kV = k.multiply(v).mod(p);
77
- let t = gB.minus(kV).mod(p);
78
- if (t.isNegative())
79
- t = t.plus(p);
80
- const sA = t.modPow(a.plus(u.multiply(x)), p);
81
- const _kA = await H(bigIntToBuffer(sA, 256));
82
- const _M1 = await H(concatBuffers([
83
- xorBuffer(await H(algo.p), await H(_g)),
84
- await H(algo.salt1),
85
- await H(algo.salt2),
86
- _gA,
87
- request.srpB,
88
- _kA,
89
- ]));
74
+ const v = bigIntModPow(g, x, p);
75
+ const kV = (k * v) % p;
76
+ let t = gB - kV;
77
+ if (t < 0n)
78
+ t += p;
79
+ const sA = bigIntModPow(t, a + u * x, p);
80
+ const _kA = H(bigIntToBuffer(sA, 256));
81
+ const _M1 = H(concatBuffers([xorBuffer(H(algo.p), H(_g)), H(algo.salt1), H(algo.salt2), _gA, request.srpB, _kA]));
90
82
  return {
91
83
  _: 'inputCheckPasswordSRP',
92
84
  srpId: request.srpId,
@@ -1 +1 @@
1
- {"version":3,"file":"password.js","sourceRoot":"","sources":["../../../../src/utils/crypto/password.ts"],"names":[],"mappings":"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","sourcesContent":["import bigInt from 'big-integer'\n\nimport { tl } from '@mtcute/tl'\nimport { utf8EncodeToBuffer } from '@mtcute/tl-runtime'\n\nimport { MtSecurityError, MtUnsupportedError } from '../../types/errors.js'\nimport { bigIntToBuffer, bufferToBigInt } from '../bigint-utils.js'\nimport { concatBuffers, randomBytes } from '../buffer-utils.js'\nimport { ICryptoProvider } from './abstract.js'\nimport { xorBuffer } from './utils.js'\n\n/**\n * Compute password hash as defined by MTProto.\n *\n * See https://core.telegram.org/api/srp#checking-the-password-with-srp\n *\n * @param crypto Crypto provider\n * @param password Password\n * @param salt1 Salt 1\n * @param salt2 Salt 2\n */\nexport async function computePasswordHash(\n crypto: ICryptoProvider,\n password: Uint8Array,\n salt1: Uint8Array,\n salt2: Uint8Array,\n): Promise<Uint8Array> {\n const SH = (data: Uint8Array, salt: Uint8Array) => crypto.sha256(concatBuffers([salt, data, salt]))\n const PH1 = async (pwd: Uint8Array, salt1: Uint8Array, salt2: Uint8Array) => SH(await SH(pwd, salt1), salt2)\n\n return SH(await crypto.pbkdf2(await PH1(password, salt1, salt2), salt1, 100000), salt2)\n}\n\n/**\n * Compute new password SRP hash as defined by MTProto.\n *\n * @param crypto Crypto provider\n * @param algo KDF algorithm\n * @param password Password\n */\nexport async function computeNewPasswordHash(\n crypto: ICryptoProvider,\n algo: tl.RawPasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow,\n password: string,\n): Promise<Uint8Array> {\n (algo as tl.Mutable<typeof algo>).salt1 = concatBuffers([algo.salt1, randomBytes(32)])\n\n const _x = await computePasswordHash(crypto, utf8EncodeToBuffer(password), algo.salt1, algo.salt2)\n\n const g = bigInt(algo.g)\n const p = bufferToBigInt(algo.p)\n const x = bufferToBigInt(_x)\n\n return bigIntToBuffer(g.modPow(x, p), 256)\n}\n\n/**\n * Compute SRP check parameters for 2fa password as defined by MTProto.\n *\n * @param crypto Crypto provider\n * @param request SRP request\n * @param password 2fa password\n */\nexport async function computeSrpParams(\n crypto: ICryptoProvider,\n request: tl.account.RawPassword,\n password: string,\n): Promise<tl.RawInputCheckPasswordSRP> {\n // nice naming thx durov\n if (\n !request.currentAlgo ||\n request.currentAlgo._ !== 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow'\n ) {\n throw new MtUnsupportedError(`Unknown algo ${request.currentAlgo?._}`)\n }\n\n const algo = request.currentAlgo\n\n // here and after: underscored variables are buffers, non-underscored are bigInts\n\n if (!request.srpB) {\n throw new MtSecurityError('SRP_B is not present in the request')\n }\n\n if (!request.srpId) {\n throw new MtSecurityError('SRP_ID is not present in the request')\n }\n\n const g = bigInt(algo.g)\n const _g = bigIntToBuffer(g, 256)\n const p = bufferToBigInt(algo.p)\n const gB = bufferToBigInt(request.srpB)\n\n const a = bufferToBigInt(randomBytes(256))\n const gA = g.modPow(a, p)\n const _gA = bigIntToBuffer(gA, 256)\n\n const H = (data: Uint8Array) => crypto.sha256(data)\n\n const [_k, _u, _x] = await Promise.all([\n // maybe, just maybe this will be a bit faster with some crypto providers\n /* k = */ crypto.sha256(concatBuffers([algo.p, _g])),\n /* u = */ crypto.sha256(concatBuffers([_gA, request.srpB])),\n /* x = */ computePasswordHash(crypto, utf8EncodeToBuffer(password), algo.salt1, algo.salt2),\n ])\n const k = bufferToBigInt(_k)\n const u = bufferToBigInt(_u)\n const x = bufferToBigInt(_x)\n\n const v = g.modPow(x, p)\n const kV = k.multiply(v).mod(p)\n\n let t = gB.minus(kV).mod(p)\n if (t.isNegative()) t = t.plus(p)\n const sA = t.modPow(a.plus(u.multiply(x)), p)\n const _kA = await H(bigIntToBuffer(sA, 256))\n\n const _M1 = await H(\n concatBuffers([\n xorBuffer(await H(algo.p), await H(_g)),\n await H(algo.salt1),\n await H(algo.salt2),\n _gA,\n request.srpB,\n _kA,\n ]),\n )\n\n return {\n _: 'inputCheckPasswordSRP',\n srpId: request.srpId,\n A: _gA,\n M1: _M1,\n }\n}\n"]}
1
+ {"version":3,"file":"password.js","sourceRoot":"","sources":["../../../../src/utils/crypto/password.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\nimport { utf8EncodeToBuffer } from '@mtcute/tl-runtime'\n\nimport { MtSecurityError, MtUnsupportedError } from '../../types/errors.js'\nimport { bigIntModPow, bigIntToBuffer, bufferToBigInt } from '../bigint-utils.js'\nimport { concatBuffers } from '../buffer-utils.js'\nimport { ICryptoProvider } from './abstract.js'\nimport { xorBuffer } from './utils.js'\n\n/**\n * Compute password hash as defined by MTProto.\n *\n * See https://core.telegram.org/api/srp#checking-the-password-with-srp\n *\n * @param crypto Crypto provider\n * @param password Password\n * @param salt1 Salt 1\n * @param salt2 Salt 2\n */\nexport async function computePasswordHash(\n crypto: ICryptoProvider,\n password: Uint8Array,\n salt1: Uint8Array,\n salt2: Uint8Array,\n): Promise<Uint8Array> {\n const SH = (data: Uint8Array, salt: Uint8Array) => crypto.sha256(concatBuffers([salt, data, salt]))\n const PH1 = (pwd: Uint8Array, salt1: Uint8Array, salt2: Uint8Array) => SH(SH(pwd, salt1), salt2)\n\n return SH(await crypto.pbkdf2(PH1(password, salt1, salt2), salt1, 100000), salt2)\n}\n\n/**\n * Compute new password SRP hash as defined by MTProto.\n *\n * @param crypto Crypto provider\n * @param algo KDF algorithm\n * @param password Password\n */\nexport async function computeNewPasswordHash(\n crypto: ICryptoProvider,\n algo: tl.RawPasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow,\n password: string,\n): Promise<Uint8Array> {\n const salt1 = new Uint8Array(algo.salt1.length + 32)\n salt1.set(algo.salt1)\n crypto.randomFill(salt1.subarray(algo.salt1.length))\n ;(algo as tl.Mutable<typeof algo>).salt1 = salt1\n\n const _x = await computePasswordHash(crypto, utf8EncodeToBuffer(password), algo.salt1, algo.salt2)\n\n const g = BigInt(algo.g)\n const p = bufferToBigInt(algo.p)\n const x = bufferToBigInt(_x)\n\n return bigIntToBuffer(bigIntModPow(g, x, p), 256)\n}\n\n/**\n * Compute SRP check parameters for 2fa password as defined by MTProto.\n *\n * @param crypto Crypto provider\n * @param request SRP request\n * @param password 2fa password\n */\nexport async function computeSrpParams(\n crypto: ICryptoProvider,\n request: tl.account.RawPassword,\n password: string,\n): Promise<tl.RawInputCheckPasswordSRP> {\n // nice naming thx durov\n if (\n !request.currentAlgo ||\n request.currentAlgo._ !== 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow'\n ) {\n throw new MtUnsupportedError(`Unknown algo ${request.currentAlgo?._}`)\n }\n\n const algo = request.currentAlgo\n\n // here and after: underscored variables are buffers, non-underscored are bigInts\n\n if (!request.srpB) {\n throw new MtSecurityError('SRP_B is not present in the request')\n }\n\n if (!request.srpId) {\n throw new MtSecurityError('SRP_ID is not present in the request')\n }\n\n const g = BigInt(algo.g)\n const _g = bigIntToBuffer(g, 256)\n const p = bufferToBigInt(algo.p)\n const gB = bufferToBigInt(request.srpB)\n\n const a = bufferToBigInt(crypto.randomBytes(256))\n const gA = bigIntModPow(g, a, p)\n const _gA = bigIntToBuffer(gA, 256)\n\n const H = (data: Uint8Array) => crypto.sha256(data)\n\n const _k = crypto.sha256(concatBuffers([algo.p, _g]))\n const _u = crypto.sha256(concatBuffers([_gA, request.srpB]))\n const _x = await computePasswordHash(crypto, utf8EncodeToBuffer(password), algo.salt1, algo.salt2)\n const k = bufferToBigInt(_k)\n const u = bufferToBigInt(_u)\n const x = bufferToBigInt(_x)\n\n const v = bigIntModPow(g, x, p)\n const kV = (k * v) % p\n\n let t = gB - kV\n if (t < 0n) t += p\n const sA = bigIntModPow(t, a + u * x, p)\n const _kA = H(bigIntToBuffer(sA, 256))\n\n const _M1 = H(concatBuffers([xorBuffer(H(algo.p), H(_g)), H(algo.salt1), H(algo.salt2), _gA, request.srpB, _kA]))\n\n return {\n _: 'inputCheckPasswordSRP',\n srpId: request.srpId,\n A: _gA,\n M1: _M1,\n }\n}\n"]}
@@ -0,0 +1,22 @@
1
+ import { InitInput } from '@mtcute/wasm';
2
+ import { BaseCryptoProvider, IAesCtr, ICryptoProvider, IEncryptionScheme } from './abstract.js';
3
+ export interface WasmCryptoProviderOptions {
4
+ /**
5
+ * WASM blob to use for crypto operations.
6
+ *
7
+ * Must conform to `@mtcute/wasm` interface.
8
+ */
9
+ wasmInput?: InitInput;
10
+ }
11
+ export declare abstract class WasmCryptoProvider extends BaseCryptoProvider implements Partial<ICryptoProvider> {
12
+ readonly wasmInput?: InitInput;
13
+ abstract randomFill(buf: Uint8Array): void;
14
+ constructor(params?: WasmCryptoProviderOptions);
15
+ initialize(): Promise<void>;
16
+ sha1(data: Uint8Array): Uint8Array;
17
+ sha256(data: Uint8Array): Uint8Array;
18
+ createAesCtr(key: Uint8Array, iv: Uint8Array): IAesCtr;
19
+ createAesIge(key: Uint8Array, iv: Uint8Array): IEncryptionScheme;
20
+ gzip(data: Uint8Array, maxSize: number): Uint8Array | null;
21
+ gunzip(data: Uint8Array): Uint8Array;
22
+ }
@@ -0,0 +1,37 @@
1
+ import { createCtr256, ctr256, deflateMaxSize, freeCtr256, gunzip, ige256Decrypt, ige256Encrypt, initAsync, sha1, sha256, } from '@mtcute/wasm';
2
+ import { BaseCryptoProvider } from './abstract.js';
3
+ export class WasmCryptoProvider extends BaseCryptoProvider {
4
+ constructor(params) {
5
+ super();
6
+ this.wasmInput = params?.wasmInput;
7
+ }
8
+ initialize() {
9
+ return initAsync(this.wasmInput);
10
+ }
11
+ sha1(data) {
12
+ return sha1(data);
13
+ }
14
+ sha256(data) {
15
+ return sha256(data);
16
+ }
17
+ createAesCtr(key, iv) {
18
+ const ctx = createCtr256(key, iv);
19
+ return {
20
+ process: (data) => ctr256(ctx, data),
21
+ close: () => freeCtr256(ctx),
22
+ };
23
+ }
24
+ createAesIge(key, iv) {
25
+ return {
26
+ encrypt: (data) => ige256Encrypt(data, key, iv),
27
+ decrypt: (data) => ige256Decrypt(data, key, iv),
28
+ };
29
+ }
30
+ gzip(data, maxSize) {
31
+ return deflateMaxSize(data, maxSize);
32
+ }
33
+ gunzip(data) {
34
+ return gunzip(data);
35
+ }
36
+ }
37
+ //# sourceMappingURL=wasm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../../../src/utils/crypto/wasm.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,MAAM,EACN,cAAc,EACd,UAAU,EACV,MAAM,EACN,aAAa,EACb,aAAa,EACb,SAAS,EAET,IAAI,EACJ,MAAM,GACT,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,kBAAkB,EAA+C,MAAM,eAAe,CAAA;AAW/F,MAAM,OAAgB,kBAAmB,SAAQ,kBAAkB;IAK/D,YAAY,MAAkC;QAC1C,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,SAAS,GAAG,MAAM,EAAE,SAAS,CAAA;IACtC,CAAC;IAED,UAAU;QACN,OAAO,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACpC,CAAC;IAED,IAAI,CAAC,IAAgB;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,IAAgB;QACnB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;IAED,YAAY,CAAC,GAAe,EAAE,EAAc;QACxC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAEjC,OAAO;YACH,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;YACpC,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;SAC/B,CAAA;IACL,CAAC;IAED,YAAY,CAAC,GAAe,EAAE,EAAc;QACxC,OAAO;YACH,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YAC/C,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;SAClD,CAAA;IACL,CAAC;IAED,IAAI,CAAC,IAAgB,EAAE,OAAe;QAClC,OAAO,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACxC,CAAC;IAED,MAAM,CAAC,IAAgB;QACnB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;CACJ","sourcesContent":["import {\n createCtr256,\n ctr256,\n deflateMaxSize,\n freeCtr256,\n gunzip,\n ige256Decrypt,\n ige256Encrypt,\n initAsync,\n InitInput,\n sha1,\n sha256,\n} from '@mtcute/wasm'\n\nimport { BaseCryptoProvider, IAesCtr, ICryptoProvider, IEncryptionScheme } from './abstract.js'\n\nexport interface WasmCryptoProviderOptions {\n /**\n * WASM blob to use for crypto operations.\n *\n * Must conform to `@mtcute/wasm` interface.\n */\n wasmInput?: InitInput\n}\n\nexport abstract class WasmCryptoProvider extends BaseCryptoProvider implements Partial<ICryptoProvider> {\n readonly wasmInput?: InitInput\n\n abstract randomFill(buf: Uint8Array): void\n\n constructor(params?: WasmCryptoProviderOptions) {\n super()\n this.wasmInput = params?.wasmInput\n }\n\n initialize(): Promise<void> {\n return initAsync(this.wasmInput)\n }\n\n sha1(data: Uint8Array): Uint8Array {\n return sha1(data)\n }\n\n sha256(data: Uint8Array): Uint8Array {\n return sha256(data)\n }\n\n createAesCtr(key: Uint8Array, iv: Uint8Array): IAesCtr {\n const ctx = createCtr256(key, iv)\n\n return {\n process: (data) => ctr256(ctx, data),\n close: () => freeCtr256(ctx),\n }\n }\n\n createAesIge(key: Uint8Array, iv: Uint8Array): IEncryptionScheme {\n return {\n encrypt: (data) => ige256Encrypt(data, key, iv),\n decrypt: (data) => ige256Decrypt(data, key, iv),\n }\n }\n\n gzip(data: Uint8Array, maxSize: number): Uint8Array | null {\n return deflateMaxSize(data, maxSize)\n }\n\n gunzip(data: Uint8Array): Uint8Array {\n return gunzip(data)\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { ICryptoProvider } from './abstract.js';
2
+ import { WasmCryptoProvider, WasmCryptoProviderOptions } from './wasm.js';
3
+ export declare class WebCryptoProvider extends WasmCryptoProvider implements ICryptoProvider {
4
+ readonly crypto: Crypto;
5
+ constructor(params?: WasmCryptoProviderOptions & {
6
+ crypto?: Crypto;
7
+ });
8
+ pbkdf2(password: Uint8Array, salt: Uint8Array, iterations: number, keylen?: number | undefined, algo?: string | undefined): Promise<Uint8Array>;
9
+ hmacSha256(data: Uint8Array, key: Uint8Array): Promise<Uint8Array>;
10
+ randomFill(buf: Uint8Array): void;
11
+ }
@@ -0,0 +1,36 @@
1
+ import { WasmCryptoProvider } from './wasm.js';
2
+ const ALGO_TO_SUBTLE = {
3
+ sha256: 'SHA-256',
4
+ sha1: 'SHA-1',
5
+ sha512: 'SHA-512',
6
+ };
7
+ export class WebCryptoProvider extends WasmCryptoProvider {
8
+ constructor(params) {
9
+ super(params);
10
+ const crypto = params?.crypto ?? globalThis.crypto;
11
+ if (!crypto || !crypto.subtle) {
12
+ throw new Error('WebCrypto is not available');
13
+ }
14
+ this.crypto = crypto;
15
+ }
16
+ async pbkdf2(password, salt, iterations, keylen, algo) {
17
+ const keyMaterial = await this.crypto.subtle.importKey('raw', password, 'PBKDF2', false, ['deriveBits']);
18
+ return this.crypto.subtle
19
+ .deriveBits({
20
+ name: 'PBKDF2',
21
+ salt,
22
+ iterations,
23
+ hash: algo ? ALGO_TO_SUBTLE[algo] : 'SHA-512',
24
+ }, keyMaterial, (keylen || 64) * 8)
25
+ .then((result) => new Uint8Array(result));
26
+ }
27
+ async hmacSha256(data, key) {
28
+ const keyMaterial = await this.crypto.subtle.importKey('raw', key, { name: 'HMAC', hash: { name: 'SHA-256' } }, false, ['sign']);
29
+ const res = await this.crypto.subtle.sign({ name: 'HMAC' }, keyMaterial, data);
30
+ return new Uint8Array(res);
31
+ }
32
+ randomFill(buf) {
33
+ this.crypto.getRandomValues(buf);
34
+ }
35
+ }
36
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../../../src/utils/crypto/web.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAA6B,MAAM,WAAW,CAAA;AAEzE,MAAM,cAAc,GAA2B;IAC3C,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,OAAO;IACb,MAAM,EAAE,SAAS;CACpB,CAAA;AAED,MAAM,OAAO,iBAAkB,SAAQ,kBAAkB;IAGrD,YAAY,MAAwD;QAChE,KAAK,CAAC,MAAM,CAAC,CAAA;QACb,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,UAAU,CAAC,MAAM,CAAA;QAElD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;SAChD;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,MAAM,CACR,QAAoB,EACpB,IAAgB,EAChB,UAAkB,EAClB,MAA2B,EAC3B,IAAyB;QAEzB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;QAExG,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM;aACpB,UAAU,CACP;YACI,IAAI,EAAE,QAAQ;YACd,IAAI;YACJ,UAAU;YACV,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAChD,EACD,WAAW,EACX,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CACrB;aACA,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;IACjD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAgB,EAAE,GAAe;QAC9C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAClD,KAAK,EACL,GAAG,EACH,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAC3C,KAAK,EACL,CAAC,MAAM,CAAC,CACX,CAAA;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;QAE9E,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;IAC9B,CAAC;IAED,UAAU,CAAC,GAAe;QACtB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC;CACJ","sourcesContent":["import { ICryptoProvider } from './abstract.js'\nimport { WasmCryptoProvider, WasmCryptoProviderOptions } from './wasm.js'\n\nconst ALGO_TO_SUBTLE: Record<string, string> = {\n sha256: 'SHA-256',\n sha1: 'SHA-1',\n sha512: 'SHA-512',\n}\n\nexport class WebCryptoProvider extends WasmCryptoProvider implements ICryptoProvider {\n readonly crypto: Crypto\n\n constructor(params?: WasmCryptoProviderOptions & { crypto?: Crypto }) {\n super(params)\n const crypto = params?.crypto ?? globalThis.crypto\n\n if (!crypto || !crypto.subtle) {\n throw new Error('WebCrypto is not available')\n }\n this.crypto = crypto\n }\n\n async pbkdf2(\n password: Uint8Array,\n salt: Uint8Array,\n iterations: number,\n keylen?: number | undefined,\n algo?: string | undefined,\n ): Promise<Uint8Array> {\n const keyMaterial = await this.crypto.subtle.importKey('raw', password, 'PBKDF2', false, ['deriveBits'])\n\n return this.crypto.subtle\n .deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: algo ? ALGO_TO_SUBTLE[algo] : 'SHA-512',\n },\n keyMaterial,\n (keylen || 64) * 8,\n )\n .then((result) => new Uint8Array(result))\n }\n\n async hmacSha256(data: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n const keyMaterial = await this.crypto.subtle.importKey(\n 'raw',\n key,\n { name: 'HMAC', hash: { name: 'SHA-256' } },\n false,\n ['sign'],\n )\n\n const res = await this.crypto.subtle.sign({ name: 'HMAC' }, keyMaterial, data)\n\n return new Uint8Array(res)\n }\n\n randomFill(buf: Uint8Array): void {\n this.crypto.getRandomValues(buf)\n }\n}\n"]}
@@ -10,7 +10,7 @@ export declare class Deque<T> {
10
10
  protected _head: number;
11
11
  protected _tail: number;
12
12
  protected _capacity: number;
13
- constructor(minCapacity?: number, maxLength?: number);
13
+ constructor(maxLength?: number, minCapacity?: number);
14
14
  protected _resize(): void;
15
15
  pushBack(item: T): void;
16
16
  pushFront(item: T): void;