@mtcute/core 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/base-client.js +4 -1
- package/cjs/base-client.js.map +1 -1
- package/cjs/network/auth-key.d.ts +3 -3
- package/cjs/network/auth-key.js +12 -12
- package/cjs/network/auth-key.js.map +1 -1
- package/cjs/network/auth-key.test.d.ts +1 -0
- package/cjs/network/auth-key.test.js +111 -0
- package/cjs/network/auth-key.test.js.map +1 -0
- package/cjs/network/authorization.js +62 -57
- package/cjs/network/authorization.js.map +1 -1
- package/cjs/network/config-manager.js +2 -1
- package/cjs/network/config-manager.js.map +1 -1
- package/cjs/network/config-manager.test.d.ts +1 -0
- package/cjs/network/config-manager.test.js +170 -0
- package/cjs/network/config-manager.test.js.map +1 -0
- package/cjs/network/mtproto-session.d.ts +2 -2
- package/cjs/network/mtproto-session.js +2 -2
- package/cjs/network/mtproto-session.js.map +1 -1
- package/cjs/network/multi-session-connection.d.ts +1 -1
- package/cjs/network/multi-session-connection.js +2 -2
- package/cjs/network/multi-session-connection.js.map +1 -1
- package/cjs/network/network-manager.d.ts +1 -0
- package/cjs/network/network-manager.js +21 -27
- package/cjs/network/network-manager.js.map +1 -1
- package/cjs/network/persistent-connection.test.d.ts +1 -0
- package/cjs/network/persistent-connection.test.js +157 -0
- package/cjs/network/persistent-connection.test.js.map +1 -0
- package/cjs/network/session-connection.d.ts +2 -1
- package/cjs/network/session-connection.js +51 -37
- package/cjs/network/session-connection.js.map +1 -1
- package/cjs/network/transports/intermediate.d.ts +3 -0
- package/cjs/network/transports/intermediate.js +5 -3
- package/cjs/network/transports/intermediate.js.map +1 -1
- package/cjs/network/transports/intermediate.test.d.ts +1 -0
- package/cjs/network/transports/intermediate.test.js +86 -0
- package/cjs/network/transports/intermediate.test.js.map +1 -0
- package/cjs/network/transports/obfuscated.js +15 -19
- package/cjs/network/transports/obfuscated.js.map +1 -1
- package/cjs/network/transports/obfuscated.test.d.ts +1 -0
- package/cjs/network/transports/obfuscated.test.js +131 -0
- package/cjs/network/transports/obfuscated.test.js.map +1 -0
- package/cjs/network/transports/tcp.js +1 -1
- package/cjs/network/transports/tcp.js.map +1 -1
- package/cjs/network/transports/tcp.test.d.ts +1 -0
- package/cjs/network/transports/tcp.test.js +97 -0
- package/cjs/network/transports/tcp.test.js.map +1 -0
- package/cjs/network/transports/websocket.test.d.ts +1 -0
- package/cjs/network/transports/websocket.test.js +91 -0
- package/cjs/network/transports/websocket.test.js.map +1 -0
- package/cjs/storage/abstract.d.ts +23 -2
- package/cjs/storage/abstract.js.map +1 -1
- package/cjs/storage/json.js +8 -9
- package/cjs/storage/json.js.map +1 -1
- package/cjs/storage/json.test.d.ts +1 -0
- package/cjs/storage/json.test.js +37 -0
- package/cjs/storage/json.test.js.map +1 -0
- package/cjs/storage/localstorage.js +5 -2
- package/cjs/storage/localstorage.js.map +1 -1
- package/cjs/storage/localstorage.test.d.ts +1 -0
- package/cjs/storage/localstorage.test.js +23 -0
- package/cjs/storage/localstorage.test.js.map +1 -0
- package/cjs/storage/memory.d.ts +7 -8
- package/cjs/storage/memory.js +7 -7
- package/cjs/storage/memory.js.map +1 -1
- package/cjs/storage/memory.test.d.ts +1 -0
- package/cjs/storage/memory.test.js +47 -0
- package/cjs/storage/memory.test.js.map +1 -0
- package/cjs/utils/async-lock.test.d.ts +1 -0
- package/cjs/utils/async-lock.test.js +25 -0
- package/cjs/utils/async-lock.test.js.map +1 -0
- package/cjs/utils/bigint-utils.d.ts +18 -11
- package/cjs/utils/bigint-utils.js +148 -47
- package/cjs/utils/bigint-utils.js.map +1 -1
- package/cjs/utils/bigint-utils.test.d.ts +1 -0
- package/cjs/utils/bigint-utils.test.js +150 -0
- package/cjs/utils/bigint-utils.test.js.map +1 -0
- package/cjs/utils/buffer-utils.d.ts +7 -1
- package/cjs/utils/buffer-utils.js +16 -3
- package/cjs/utils/buffer-utils.js.map +1 -1
- package/cjs/utils/buffer-utils.test.d.ts +1 -0
- package/cjs/utils/buffer-utils.test.js +69 -0
- package/cjs/utils/buffer-utils.test.js.map +1 -0
- package/cjs/utils/condition-variable.test.d.ts +1 -0
- package/cjs/utils/condition-variable.test.js +27 -0
- package/cjs/utils/condition-variable.test.js.map +1 -0
- package/cjs/utils/controllable-promise.test.d.ts +1 -0
- package/cjs/utils/controllable-promise.test.js +17 -0
- package/cjs/utils/controllable-promise.test.js.map +1 -0
- package/cjs/utils/crypto/abstract.d.ts +16 -9
- package/cjs/utils/crypto/abstract.js +6 -9
- package/cjs/utils/crypto/abstract.js.map +1 -1
- package/cjs/utils/crypto/factorization.d.ts +2 -1
- package/cjs/utils/crypto/factorization.js +28 -36
- package/cjs/utils/crypto/factorization.js.map +1 -1
- package/cjs/utils/crypto/index.d.ts +4 -0
- package/cjs/utils/crypto/index.js +4 -0
- package/cjs/utils/crypto/index.js.map +1 -1
- package/cjs/utils/crypto/keys.d.ts +2 -2
- package/cjs/utils/crypto/keys.js +4 -4
- package/cjs/utils/crypto/keys.js.map +1 -1
- package/cjs/utils/crypto/keys.test.d.ts +1 -0
- package/cjs/utils/crypto/keys.test.js +40 -0
- package/cjs/utils/crypto/keys.test.js.map +1 -0
- package/cjs/utils/crypto/miller-rabin.d.ts +2 -2
- package/cjs/utils/crypto/miller-rabin.js +20 -22
- package/cjs/utils/crypto/miller-rabin.js.map +1 -1
- package/cjs/utils/crypto/miller-rabin.test.d.ts +1 -0
- package/cjs/utils/crypto/miller-rabin.test.js +60 -0
- package/cjs/utils/crypto/miller-rabin.test.js.map +1 -0
- package/cjs/utils/crypto/mtproto.d.ts +3 -3
- package/cjs/utils/crypto/mtproto.js +12 -12
- package/cjs/utils/crypto/mtproto.js.map +1 -1
- package/cjs/utils/crypto/mtproto.test.d.ts +1 -0
- package/cjs/utils/crypto/mtproto.test.js +47 -0
- package/cjs/utils/crypto/mtproto.test.js.map +1 -0
- package/cjs/utils/crypto/node.d.ts +21 -0
- package/cjs/utils/crypto/node.js +74 -0
- package/cjs/utils/crypto/node.js.map +1 -0
- package/cjs/utils/crypto/node.test.d.ts +1 -0
- package/cjs/utils/crypto/node.test.js +13 -0
- package/cjs/utils/crypto/node.test.js.map +1 -0
- package/cjs/utils/crypto/password.js +22 -33
- package/cjs/utils/crypto/password.js.map +1 -1
- package/cjs/utils/crypto/password.test.d.ts +1 -0
- package/cjs/utils/crypto/password.test.js +95 -0
- package/cjs/utils/crypto/password.test.js.map +1 -0
- package/cjs/utils/crypto/utils.test.d.ts +1 -0
- package/cjs/utils/crypto/utils.test.js +49 -0
- package/cjs/utils/crypto/utils.test.js.map +1 -0
- package/cjs/utils/crypto/wasm.d.ts +22 -0
- package/cjs/utils/crypto/wasm.js +41 -0
- package/cjs/utils/crypto/wasm.js.map +1 -0
- package/cjs/utils/crypto/web.d.ts +11 -0
- package/cjs/utils/crypto/web.js +40 -0
- package/cjs/utils/crypto/web.js.map +1 -0
- package/cjs/utils/crypto/web.test.d.ts +1 -0
- package/cjs/utils/crypto/web.test.js +17 -0
- package/cjs/utils/crypto/web.test.js.map +1 -0
- package/cjs/utils/deque.d.ts +1 -1
- package/cjs/utils/deque.js +9 -3
- package/cjs/utils/deque.js.map +1 -1
- package/cjs/utils/deque.test.d.ts +1 -0
- package/cjs/utils/deque.test.js +128 -0
- package/cjs/utils/deque.test.js.map +1 -0
- package/cjs/utils/function-utils.d.ts +4 -1
- package/cjs/utils/function-utils.js +8 -1
- package/cjs/utils/function-utils.js.map +1 -1
- package/cjs/utils/function-utils.test.d.ts +1 -0
- package/cjs/utils/function-utils.test.js +23 -0
- package/cjs/utils/function-utils.test.js.map +1 -0
- package/cjs/utils/index.d.ts +0 -1
- package/cjs/utils/index.js +0 -1
- package/cjs/utils/index.js.map +1 -1
- package/cjs/utils/linked-list.test.d.ts +1 -0
- package/cjs/utils/linked-list.test.js +36 -0
- package/cjs/utils/linked-list.test.js.map +1 -0
- package/cjs/utils/links/bots.test.d.ts +1 -0
- package/cjs/utils/links/bots.test.js +152 -0
- package/cjs/utils/links/bots.test.js.map +1 -0
- package/cjs/utils/links/chat.test.d.ts +1 -0
- package/cjs/utils/links/chat.test.js +84 -0
- package/cjs/utils/links/chat.test.js.map +1 -0
- package/cjs/utils/links/misc.test.d.ts +1 -0
- package/cjs/utils/links/misc.test.js +153 -0
- package/cjs/utils/links/misc.test.js.map +1 -0
- package/cjs/utils/links/proxy.test.d.ts +1 -0
- package/cjs/utils/links/proxy.test.js +74 -0
- package/cjs/utils/links/proxy.test.js.map +1 -0
- package/cjs/utils/links/user.test.d.ts +1 -0
- package/cjs/utils/links/user.test.js +63 -0
- package/cjs/utils/links/user.test.js.map +1 -0
- package/cjs/utils/logger.d.ts +0 -1
- package/cjs/utils/logger.js +3 -4
- package/cjs/utils/logger.js.map +1 -1
- package/cjs/utils/logger.test.d.ts +1 -0
- package/cjs/utils/logger.test.js +125 -0
- package/cjs/utils/logger.test.js.map +1 -0
- package/cjs/utils/long-utils.test.d.ts +1 -0
- package/cjs/utils/long-utils.test.js +158 -0
- package/cjs/utils/long-utils.test.js.map +1 -0
- package/cjs/utils/lru-map.d.ts +1 -0
- package/cjs/utils/lru-map.js +6 -0
- package/cjs/utils/lru-map.js.map +1 -1
- package/cjs/utils/lru-map.test.d.ts +1 -0
- package/cjs/utils/lru-map.test.js +96 -0
- package/cjs/utils/lru-map.test.js.map +1 -0
- package/cjs/utils/lru-set.test.d.ts +1 -0
- package/cjs/utils/lru-set.test.js +77 -0
- package/cjs/utils/lru-set.test.js.map +1 -0
- package/cjs/utils/peer-utils.js +5 -1
- package/cjs/utils/peer-utils.js.map +1 -1
- package/cjs/utils/peer-utils.test.d.ts +1 -0
- package/cjs/utils/peer-utils.test.js +122 -0
- package/cjs/utils/peer-utils.test.js.map +1 -0
- package/cjs/utils/platform/crypto.js +2 -2
- package/cjs/utils/platform/crypto.js.map +1 -1
- package/cjs/utils/platform/crypto.web.js +2 -2
- package/cjs/utils/platform/crypto.web.js.map +1 -1
- package/cjs/utils/sorted-array.test.d.ts +1 -0
- package/cjs/utils/sorted-array.test.js +66 -0
- package/cjs/utils/sorted-array.test.js.map +1 -0
- package/cjs/utils/string-session.js +4 -2
- package/cjs/utils/string-session.js.map +1 -1
- package/cjs/utils/string-session.test.d.ts +1 -0
- package/cjs/utils/string-session.test.js +106 -0
- package/cjs/utils/string-session.test.js.map +1 -0
- package/cjs/utils/tl-json.test.d.ts +1 -0
- package/cjs/utils/tl-json.test.js +83 -0
- package/cjs/utils/tl-json.test.js.map +1 -0
- package/cjs/utils/type-assertions.test.d.ts +1 -0
- package/cjs/utils/type-assertions.test.js +67 -0
- package/cjs/utils/type-assertions.test.js.map +1 -0
- package/esm/base-client.js +4 -1
- package/esm/base-client.js.map +1 -1
- package/esm/network/auth-key.d.ts +3 -3
- package/esm/network/auth-key.js +13 -13
- package/esm/network/auth-key.js.map +1 -1
- package/esm/network/auth-key.test.d.ts +1 -0
- package/esm/network/auth-key.test.js +106 -0
- package/esm/network/auth-key.test.js.map +1 -0
- package/esm/network/authorization.js +64 -59
- package/esm/network/authorization.js.map +1 -1
- package/esm/network/config-manager.js +2 -1
- package/esm/network/config-manager.js.map +1 -1
- package/esm/network/config-manager.test.d.ts +1 -0
- package/esm/network/config-manager.test.js +168 -0
- package/esm/network/config-manager.test.js.map +1 -0
- package/esm/network/mtproto-session.d.ts +2 -2
- package/esm/network/mtproto-session.js +2 -2
- package/esm/network/mtproto-session.js.map +1 -1
- package/esm/network/multi-session-connection.d.ts +1 -1
- package/esm/network/multi-session-connection.js +2 -2
- package/esm/network/multi-session-connection.js.map +1 -1
- package/esm/network/network-manager.d.ts +1 -0
- package/esm/network/network-manager.js +21 -27
- package/esm/network/network-manager.js.map +1 -1
- package/esm/network/persistent-connection.test.d.ts +1 -0
- package/esm/network/persistent-connection.test.js +155 -0
- package/esm/network/persistent-connection.test.js.map +1 -0
- package/esm/network/session-connection.d.ts +2 -1
- package/esm/network/session-connection.js +53 -39
- package/esm/network/session-connection.js.map +1 -1
- package/esm/network/transports/intermediate.d.ts +3 -0
- package/esm/network/transports/intermediate.js +6 -4
- package/esm/network/transports/intermediate.js.map +1 -1
- package/esm/network/transports/intermediate.test.d.ts +1 -0
- package/esm/network/transports/intermediate.test.js +84 -0
- package/esm/network/transports/intermediate.test.js.map +1 -0
- package/esm/network/transports/obfuscated.js +16 -20
- package/esm/network/transports/obfuscated.js.map +1 -1
- package/esm/network/transports/obfuscated.test.d.ts +1 -0
- package/esm/network/transports/obfuscated.test.js +129 -0
- package/esm/network/transports/obfuscated.test.js.map +1 -0
- package/esm/network/transports/tcp.js +1 -1
- package/esm/network/transports/tcp.js.map +1 -1
- package/esm/network/transports/tcp.test.d.ts +1 -0
- package/esm/network/transports/tcp.test.js +95 -0
- package/esm/network/transports/tcp.test.js.map +1 -0
- package/esm/network/transports/websocket.test.d.ts +1 -0
- package/esm/network/transports/websocket.test.js +89 -0
- package/esm/network/transports/websocket.test.js.map +1 -0
- package/esm/storage/abstract.d.ts +23 -2
- package/esm/storage/abstract.js.map +1 -1
- package/esm/storage/json.js +8 -9
- package/esm/storage/json.js.map +1 -1
- package/esm/storage/json.test.d.ts +1 -0
- package/esm/storage/json.test.js +35 -0
- package/esm/storage/json.test.js.map +1 -0
- package/esm/storage/localstorage.js +5 -2
- package/esm/storage/localstorage.js.map +1 -1
- package/esm/storage/localstorage.test.d.ts +1 -0
- package/esm/storage/localstorage.test.js +21 -0
- package/esm/storage/localstorage.test.js.map +1 -0
- package/esm/storage/memory.d.ts +7 -8
- package/esm/storage/memory.js +7 -7
- package/esm/storage/memory.js.map +1 -1
- package/esm/storage/memory.test.d.ts +1 -0
- package/esm/storage/memory.test.js +45 -0
- package/esm/storage/memory.test.js.map +1 -0
- package/esm/utils/async-lock.test.d.ts +1 -0
- package/esm/utils/async-lock.test.js +23 -0
- package/esm/utils/async-lock.test.js.map +1 -0
- package/esm/utils/bigint-utils.d.ts +18 -11
- package/esm/utils/bigint-utils.js +142 -44
- package/esm/utils/bigint-utils.js.map +1 -1
- package/esm/utils/bigint-utils.test.d.ts +1 -0
- package/esm/utils/bigint-utils.test.js +148 -0
- package/esm/utils/bigint-utils.test.js.map +1 -0
- package/esm/utils/buffer-utils.d.ts +7 -1
- package/esm/utils/buffer-utils.js +14 -1
- package/esm/utils/buffer-utils.js.map +1 -1
- package/esm/utils/buffer-utils.test.d.ts +1 -0
- package/esm/utils/buffer-utils.test.js +67 -0
- package/esm/utils/buffer-utils.test.js.map +1 -0
- package/esm/utils/condition-variable.test.d.ts +1 -0
- package/esm/utils/condition-variable.test.js +25 -0
- package/esm/utils/condition-variable.test.js.map +1 -0
- package/esm/utils/controllable-promise.test.d.ts +1 -0
- package/esm/utils/controllable-promise.test.js +15 -0
- package/esm/utils/controllable-promise.test.js.map +1 -0
- package/esm/utils/crypto/abstract.d.ts +16 -9
- package/esm/utils/crypto/abstract.js +6 -9
- package/esm/utils/crypto/abstract.js.map +1 -1
- package/esm/utils/crypto/factorization.d.ts +2 -1
- package/esm/utils/crypto/factorization.js +29 -34
- package/esm/utils/crypto/factorization.js.map +1 -1
- package/esm/utils/crypto/index.d.ts +4 -0
- package/esm/utils/crypto/index.js +4 -0
- package/esm/utils/crypto/index.js.map +1 -1
- package/esm/utils/crypto/keys.d.ts +2 -2
- package/esm/utils/crypto/keys.js +4 -4
- package/esm/utils/crypto/keys.js.map +1 -1
- package/esm/utils/crypto/keys.test.d.ts +1 -0
- package/esm/utils/crypto/keys.test.js +38 -0
- package/esm/utils/crypto/keys.test.js.map +1 -0
- package/esm/utils/crypto/miller-rabin.d.ts +2 -2
- package/esm/utils/crypto/miller-rabin.js +21 -20
- package/esm/utils/crypto/miller-rabin.js.map +1 -1
- package/esm/utils/crypto/miller-rabin.test.d.ts +1 -0
- package/esm/utils/crypto/miller-rabin.test.js +58 -0
- package/esm/utils/crypto/miller-rabin.test.js.map +1 -0
- package/esm/utils/crypto/mtproto.d.ts +3 -3
- package/esm/utils/crypto/mtproto.js +12 -12
- package/esm/utils/crypto/mtproto.js.map +1 -1
- package/esm/utils/crypto/mtproto.test.d.ts +1 -0
- package/esm/utils/crypto/mtproto.test.js +45 -0
- package/esm/utils/crypto/mtproto.test.js.map +1 -0
- package/esm/utils/crypto/node.d.ts +21 -0
- package/esm/utils/crypto/node.js +69 -0
- package/esm/utils/crypto/node.js.map +1 -0
- package/esm/utils/crypto/node.test.d.ts +1 -0
- package/esm/utils/crypto/node.test.js +11 -0
- package/esm/utils/crypto/node.test.js.map +1 -0
- package/esm/utils/crypto/password.js +24 -32
- package/esm/utils/crypto/password.js.map +1 -1
- package/esm/utils/crypto/password.test.d.ts +1 -0
- package/esm/utils/crypto/password.test.js +90 -0
- package/esm/utils/crypto/password.test.js.map +1 -0
- package/esm/utils/crypto/utils.test.d.ts +1 -0
- package/esm/utils/crypto/utils.test.js +47 -0
- package/esm/utils/crypto/utils.test.js.map +1 -0
- package/esm/utils/crypto/wasm.d.ts +22 -0
- package/esm/utils/crypto/wasm.js +37 -0
- package/esm/utils/crypto/wasm.js.map +1 -0
- package/esm/utils/crypto/web.d.ts +11 -0
- package/esm/utils/crypto/web.js +36 -0
- package/esm/utils/crypto/web.js.map +1 -0
- package/esm/utils/crypto/web.test.d.ts +1 -0
- package/esm/utils/crypto/web.test.js +15 -0
- package/esm/utils/crypto/web.test.js.map +1 -0
- package/esm/utils/deque.d.ts +1 -1
- package/esm/utils/deque.js +9 -3
- package/esm/utils/deque.js.map +1 -1
- package/esm/utils/deque.test.d.ts +1 -0
- package/esm/utils/deque.test.js +126 -0
- package/esm/utils/deque.test.js.map +1 -0
- package/esm/utils/function-utils.d.ts +4 -1
- package/esm/utils/function-utils.js +8 -1
- package/esm/utils/function-utils.js.map +1 -1
- package/esm/utils/function-utils.test.d.ts +1 -0
- package/esm/utils/function-utils.test.js +21 -0
- package/esm/utils/function-utils.test.js.map +1 -0
- package/esm/utils/index.d.ts +0 -1
- package/esm/utils/index.js +0 -1
- package/esm/utils/index.js.map +1 -1
- package/esm/utils/linked-list.test.d.ts +1 -0
- package/esm/utils/linked-list.test.js +34 -0
- package/esm/utils/linked-list.test.js.map +1 -0
- package/esm/utils/links/bots.test.d.ts +1 -0
- package/esm/utils/links/bots.test.js +150 -0
- package/esm/utils/links/bots.test.js.map +1 -0
- package/esm/utils/links/chat.test.d.ts +1 -0
- package/esm/utils/links/chat.test.js +82 -0
- package/esm/utils/links/chat.test.js.map +1 -0
- package/esm/utils/links/misc.test.d.ts +1 -0
- package/esm/utils/links/misc.test.js +151 -0
- package/esm/utils/links/misc.test.js.map +1 -0
- package/esm/utils/links/proxy.test.d.ts +1 -0
- package/esm/utils/links/proxy.test.js +72 -0
- package/esm/utils/links/proxy.test.js.map +1 -0
- package/esm/utils/links/user.test.d.ts +1 -0
- package/esm/utils/links/user.test.js +61 -0
- package/esm/utils/links/user.test.js.map +1 -0
- package/esm/utils/logger.d.ts +0 -1
- package/esm/utils/logger.js +3 -4
- package/esm/utils/logger.js.map +1 -1
- package/esm/utils/logger.test.d.ts +1 -0
- package/esm/utils/logger.test.js +120 -0
- package/esm/utils/logger.test.js.map +1 -0
- package/esm/utils/long-utils.test.d.ts +1 -0
- package/esm/utils/long-utils.test.js +153 -0
- package/esm/utils/long-utils.test.js.map +1 -0
- package/esm/utils/lru-map.d.ts +1 -0
- package/esm/utils/lru-map.js +6 -0
- package/esm/utils/lru-map.js.map +1 -1
- package/esm/utils/lru-map.test.d.ts +1 -0
- package/esm/utils/lru-map.test.js +94 -0
- package/esm/utils/lru-map.test.js.map +1 -0
- package/esm/utils/lru-set.test.d.ts +1 -0
- package/esm/utils/lru-set.test.js +72 -0
- package/esm/utils/lru-set.test.js.map +1 -0
- package/esm/utils/peer-utils.js +5 -1
- package/esm/utils/peer-utils.js.map +1 -1
- package/esm/utils/peer-utils.test.d.ts +1 -0
- package/esm/utils/peer-utils.test.js +117 -0
- package/esm/utils/peer-utils.test.js.map +1 -0
- package/esm/utils/platform/crypto.js +1 -1
- package/esm/utils/platform/crypto.js.map +1 -1
- package/esm/utils/platform/crypto.web.js +2 -2
- package/esm/utils/platform/crypto.web.js.map +1 -1
- package/esm/utils/sorted-array.test.d.ts +1 -0
- package/esm/utils/sorted-array.test.js +64 -0
- package/esm/utils/sorted-array.test.js.map +1 -0
- package/esm/utils/string-session.js +4 -2
- package/esm/utils/string-session.js.map +1 -1
- package/esm/utils/string-session.test.d.ts +1 -0
- package/esm/utils/string-session.test.js +104 -0
- package/esm/utils/string-session.test.js.map +1 -0
- package/esm/utils/tl-json.test.d.ts +1 -0
- package/esm/utils/tl-json.test.js +81 -0
- package/esm/utils/tl-json.test.js.map +1 -0
- package/esm/utils/type-assertions.test.d.ts +1 -0
- package/esm/utils/type-assertions.test.js +65 -0
- package/esm/utils/type-assertions.test.js.map +1 -0
- package/package.json +4 -5
- package/cjs/utils/crypto/common.d.ts +0 -12
- package/cjs/utils/crypto/common.js +0 -54
- package/cjs/utils/crypto/common.js.map +0 -1
- package/cjs/utils/crypto/node-crypto.d.ts +0 -10
- package/cjs/utils/crypto/node-crypto.js +0 -46
- package/cjs/utils/crypto/node-crypto.js.map +0 -1
- package/cjs/utils/crypto/subtle.d.ts +0 -12
- package/cjs/utils/crypto/subtle.js +0 -86
- package/cjs/utils/crypto/subtle.js.map +0 -1
- package/cjs/utils/flood-control.d.ts +0 -14
- package/cjs/utils/flood-control.js +0 -65
- package/cjs/utils/flood-control.js.map +0 -1
- package/cjs/utils/platform/random.d.ts +0 -1
- package/cjs/utils/platform/random.js +0 -7
- package/cjs/utils/platform/random.js.map +0 -1
- package/cjs/utils/platform/random.web.d.ts +0 -1
- package/cjs/utils/platform/random.web.js +0 -10
- package/cjs/utils/platform/random.web.js.map +0 -1
- package/esm/utils/crypto/common.d.ts +0 -12
- package/esm/utils/crypto/common.js +0 -50
- package/esm/utils/crypto/common.js.map +0 -1
- package/esm/utils/crypto/node-crypto.d.ts +0 -10
- package/esm/utils/crypto/node-crypto.js +0 -42
- package/esm/utils/crypto/node-crypto.js.map +0 -1
- package/esm/utils/crypto/subtle.d.ts +0 -12
- package/esm/utils/crypto/subtle.js +0 -59
- package/esm/utils/crypto/subtle.js.map +0 -1
- package/esm/utils/flood-control.d.ts +0 -14
- package/esm/utils/flood-control.js +0 -61
- package/esm/utils/flood-control.js.map +0 -1
- package/esm/utils/platform/random.d.ts +0 -1
- package/esm/utils/platform/random.js +0 -4
- package/esm/utils/platform/random.js.map +0 -1
- package/esm/utils/platform/random.web.d.ts +0 -1
- package/esm/utils/platform/random.web.js +0 -6
- package/esm/utils/platform/random.web.js.map +0 -1
|
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.doAuthorization = void 0;
|
|
7
|
-
const big_integer_1 = __importDefault(require("big-integer"));
|
|
8
7
|
const long_1 = __importDefault(require("long"));
|
|
9
8
|
const tl_1 = require("@mtcute/tl");
|
|
10
9
|
const tl_runtime_1 = require("@mtcute/tl-runtime");
|
|
@@ -18,25 +17,28 @@ const index_js_2 = require("../utils/index.js");
|
|
|
18
17
|
const type_assertions_js_1 = require("../utils/type-assertions.js");
|
|
19
18
|
// Heavily based on code from https://github.com/LonamiWebs/Telethon/blob/master/telethon/network/authenticator.py
|
|
20
19
|
// see https://core.telegram.org/mtproto/security_guidelines
|
|
21
|
-
const DH_SAFETY_RANGE =
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
|
|
20
|
+
// const DH_SAFETY_RANGE = bigInt[2].pow(2048 - 64)
|
|
21
|
+
const DH_SAFETY_RANGE = 2n ** (2048n - 64n);
|
|
22
|
+
const KNOWN_DH_PRIME =
|
|
23
|
+
// eslint-disable-next-line max-len
|
|
24
|
+
0xc71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5bn;
|
|
25
|
+
const TWO_POW_2047 = 2n ** 2047n;
|
|
26
|
+
const TWO_POW_2048 = 2n ** 2048n;
|
|
25
27
|
const checkedPrimesCache = [];
|
|
26
|
-
function checkDhPrime(log, dhPrime, g) {
|
|
27
|
-
if (KNOWN_DH_PRIME
|
|
28
|
+
function checkDhPrime(crypto, log, dhPrime, g) {
|
|
29
|
+
if (KNOWN_DH_PRIME === dhPrime) {
|
|
28
30
|
log.debug('server is using known dh prime, skipping validation');
|
|
29
31
|
return;
|
|
30
32
|
}
|
|
31
|
-
let checkedPrime = checkedPrimesCache.find((x) => x.prime
|
|
33
|
+
let checkedPrime = checkedPrimesCache.find((x) => x.prime === dhPrime);
|
|
32
34
|
if (!checkedPrime) {
|
|
33
|
-
if (dhPrime
|
|
35
|
+
if (dhPrime <= TWO_POW_2047 || dhPrime >= TWO_POW_2048) {
|
|
34
36
|
throw new index_js_1.MtSecurityError('Step 3: dh_prime is not in the 2048-bit range');
|
|
35
37
|
}
|
|
36
|
-
if (!(0, miller_rabin_js_1.millerRabin)(dhPrime)) {
|
|
38
|
+
if (!(0, miller_rabin_js_1.millerRabin)(crypto, dhPrime)) {
|
|
37
39
|
throw new index_js_1.MtSecurityError('Step 3: dh_prime is not prime');
|
|
38
40
|
}
|
|
39
|
-
if (!(0, miller_rabin_js_1.millerRabin)(dhPrime
|
|
41
|
+
if (!(0, miller_rabin_js_1.millerRabin)(crypto, (dhPrime - 1n) / 2n)) {
|
|
40
42
|
throw new index_js_1.MtSecurityError('Step 3: dh_prime is not a safe prime - (dh_prime-1)/2 is not prime');
|
|
41
43
|
}
|
|
42
44
|
log.debug('dh_prime is probably prime');
|
|
@@ -56,34 +58,34 @@ function checkDhPrime(log, dhPrime, g) {
|
|
|
56
58
|
}
|
|
57
59
|
switch (g) {
|
|
58
60
|
case 2:
|
|
59
|
-
if (dhPrime
|
|
61
|
+
if (dhPrime % 8n !== 7n) {
|
|
60
62
|
throw new index_js_1.MtSecurityError('Step 3: ivalid g - dh_prime mod 8 != 7');
|
|
61
63
|
}
|
|
62
64
|
break;
|
|
63
65
|
case 3:
|
|
64
|
-
if (dhPrime
|
|
66
|
+
if (dhPrime % 3n !== 2n) {
|
|
65
67
|
throw new index_js_1.MtSecurityError('Step 3: ivalid g - dh_prime mod 3 != 2');
|
|
66
68
|
}
|
|
67
69
|
break;
|
|
68
70
|
case 4:
|
|
69
71
|
break;
|
|
70
72
|
case 5: {
|
|
71
|
-
const mod = dhPrime
|
|
72
|
-
if (mod
|
|
73
|
+
const mod = dhPrime % 5n;
|
|
74
|
+
if (mod !== 1n && mod !== 4n) {
|
|
73
75
|
throw new index_js_1.MtSecurityError('Step 3: ivalid g - dh_prime mod 5 != 1 && dh_prime mod 5 != 4');
|
|
74
76
|
}
|
|
75
77
|
break;
|
|
76
78
|
}
|
|
77
79
|
case 6: {
|
|
78
|
-
const mod = dhPrime
|
|
79
|
-
if (mod
|
|
80
|
+
const mod = dhPrime % 24n;
|
|
81
|
+
if (mod !== 19n && mod !== 23n) {
|
|
80
82
|
throw new index_js_1.MtSecurityError('Step 3: ivalid g - dh_prime mod 24 != 19 && dh_prime mod 24 != 23');
|
|
81
83
|
}
|
|
82
84
|
break;
|
|
83
85
|
}
|
|
84
86
|
case 7: {
|
|
85
|
-
const mod = dhPrime
|
|
86
|
-
if (mod
|
|
87
|
+
const mod = dhPrime % 7n;
|
|
88
|
+
if (mod !== 3n && mod !== 5n && mod !== 6n) {
|
|
87
89
|
throw new index_js_1.MtSecurityError('Step 3: ivalid g - dh_prime mod 7 != 3 && dh_prime mod 7 != 5 && dh_prime mod 7 != 6');
|
|
88
90
|
}
|
|
89
91
|
break;
|
|
@@ -94,41 +96,44 @@ function checkDhPrime(log, dhPrime, g) {
|
|
|
94
96
|
checkedPrime.generators.push(g);
|
|
95
97
|
log.debug('g = %d is safe to use with dh_prime', g);
|
|
96
98
|
}
|
|
97
|
-
|
|
99
|
+
function rsaPad(data, crypto, key) {
|
|
98
100
|
// since Summer 2021, they use "version of RSA with a variant of OAEP+ padding explained below"
|
|
99
|
-
const keyModulus = (
|
|
100
|
-
const keyExponent = (
|
|
101
|
+
const keyModulus = BigInt(`0x${key.modulus}`);
|
|
102
|
+
const keyExponent = BigInt(`0x${key.exponent}`);
|
|
101
103
|
if (data.length > 144) {
|
|
102
104
|
throw new index_js_1.MtArgumentError('Failed to pad: too big data');
|
|
103
105
|
}
|
|
104
|
-
|
|
106
|
+
const dataPadded = new Uint8Array(192);
|
|
107
|
+
dataPadded.set(data, 0);
|
|
108
|
+
crypto.randomFill(dataPadded.subarray(data.length));
|
|
109
|
+
data = dataPadded;
|
|
105
110
|
for (;;) {
|
|
106
111
|
const aesIv = new Uint8Array(32);
|
|
107
|
-
const aesKey =
|
|
108
|
-
const dataWithHash = (0, buffer_utils_js_1.concatBuffers)([data,
|
|
112
|
+
const aesKey = crypto.randomBytes(32);
|
|
113
|
+
const dataWithHash = (0, buffer_utils_js_1.concatBuffers)([data, crypto.sha256((0, buffer_utils_js_1.concatBuffers)([aesKey, data]))]);
|
|
109
114
|
// we only need to reverse the data
|
|
110
115
|
dataWithHash.subarray(0, 192).reverse();
|
|
111
|
-
const aes =
|
|
112
|
-
const encrypted =
|
|
113
|
-
const encryptedHash =
|
|
116
|
+
const aes = crypto.createAesIge(aesKey, aesIv);
|
|
117
|
+
const encrypted = aes.encrypt(dataWithHash);
|
|
118
|
+
const encryptedHash = crypto.sha256(encrypted);
|
|
114
119
|
(0, utils_js_1.xorBufferInPlace)(aesKey, encryptedHash);
|
|
115
120
|
const decryptedData = (0, buffer_utils_js_1.concatBuffers)([aesKey, encrypted]);
|
|
116
121
|
const decryptedDataBigint = (0, index_js_2.bufferToBigInt)(decryptedData);
|
|
117
|
-
if (decryptedDataBigint
|
|
122
|
+
if (decryptedDataBigint >= keyModulus) {
|
|
118
123
|
continue;
|
|
119
124
|
}
|
|
120
|
-
const encryptedBigint =
|
|
125
|
+
const encryptedBigint = (0, index_js_2.bigIntModPow)(decryptedDataBigint, keyExponent, keyModulus);
|
|
121
126
|
return (0, index_js_2.bigIntToBuffer)(encryptedBigint, 256);
|
|
122
127
|
}
|
|
123
128
|
}
|
|
124
|
-
|
|
129
|
+
function rsaEncrypt(data, crypto, key) {
|
|
125
130
|
const toEncrypt = (0, buffer_utils_js_1.concatBuffers)([
|
|
126
|
-
|
|
131
|
+
crypto.sha1(data),
|
|
127
132
|
data,
|
|
128
133
|
// sha1 is always 20 bytes, so we're left with 255 - 20 - x padding
|
|
129
|
-
|
|
134
|
+
crypto.randomBytes(235 - data.length),
|
|
130
135
|
]);
|
|
131
|
-
const encryptedBigInt = (0, index_js_2.
|
|
136
|
+
const encryptedBigInt = (0, index_js_2.bigIntModPow)((0, index_js_2.bufferToBigInt)(toEncrypt), BigInt(`0x${key.exponent}`), BigInt(`0x${key.modulus}`));
|
|
132
137
|
return (0, index_js_2.bigIntToBuffer)(encryptedBigInt);
|
|
133
138
|
}
|
|
134
139
|
/**
|
|
@@ -160,7 +165,7 @@ async function doAuthorization(connection, crypto, expiresIn) {
|
|
|
160
165
|
}
|
|
161
166
|
if (expiresIn)
|
|
162
167
|
log.prefix = '[PFS] ';
|
|
163
|
-
const nonce =
|
|
168
|
+
const nonce = crypto.randomBytes(16);
|
|
164
169
|
// Step 1: PQ request
|
|
165
170
|
log.debug('starting PQ handshake (temp = %b), nonce = %h', expiresIn, nonce);
|
|
166
171
|
await sendPlainMessage({ _: 'mt_req_pq_multi', nonce });
|
|
@@ -179,7 +184,7 @@ async function doAuthorization(connection, crypto, expiresIn) {
|
|
|
179
184
|
log.debug('found server key, fp = %s, old = %s', publicKey.fingerprint, publicKey.old);
|
|
180
185
|
const [p, q] = await crypto.factorizePQ(resPq.pq);
|
|
181
186
|
log.debug('factorized PQ: PQ = %h, P = %h, Q = %h', resPq.pq, p, q);
|
|
182
|
-
const newNonce =
|
|
187
|
+
const newNonce = crypto.randomBytes(32);
|
|
183
188
|
let dcId = connection.params.dc.id;
|
|
184
189
|
if (connection.params.testMode)
|
|
185
190
|
dcId += 10000;
|
|
@@ -198,8 +203,8 @@ async function doAuthorization(connection, crypto, expiresIn) {
|
|
|
198
203
|
};
|
|
199
204
|
const pqInnerData = tl_runtime_1.TlBinaryWriter.serializeObject(writerMap, _pqInnerData);
|
|
200
205
|
const encryptedData = publicKey.old ?
|
|
201
|
-
|
|
202
|
-
|
|
206
|
+
rsaEncrypt(pqInnerData, crypto, publicKey) :
|
|
207
|
+
rsaPad(pqInnerData, crypto, publicKey);
|
|
203
208
|
log.debug('requesting DH params');
|
|
204
209
|
await sendPlainMessage({
|
|
205
210
|
_: 'mt_req_DH_params',
|
|
@@ -223,13 +228,13 @@ async function doAuthorization(connection, crypto, expiresIn) {
|
|
|
223
228
|
throw new index_js_1.MtSecurityError('Step 2: AES block size is invalid');
|
|
224
229
|
}
|
|
225
230
|
// Step 3: complete DH exchange
|
|
226
|
-
const [key, iv] =
|
|
227
|
-
const ige =
|
|
228
|
-
const plainTextAnswer =
|
|
231
|
+
const [key, iv] = (0, mtproto_js_1.generateKeyAndIvFromNonce)(crypto, resPq.serverNonce, newNonce);
|
|
232
|
+
const ige = crypto.createAesIge(key, iv);
|
|
233
|
+
const plainTextAnswer = ige.decrypt(serverDhParams.encryptedAnswer);
|
|
229
234
|
const innerDataHash = plainTextAnswer.subarray(0, 20);
|
|
230
235
|
const serverDhInnerReader = new tl_runtime_1.TlBinaryReader(readerMap, plainTextAnswer, 20);
|
|
231
236
|
const serverDhInner = serverDhInnerReader.object();
|
|
232
|
-
if (!(0, buffer_utils_js_1.buffersEqual)(innerDataHash,
|
|
237
|
+
if (!(0, buffer_utils_js_1.buffersEqual)(innerDataHash, crypto.sha1(plainTextAnswer.subarray(20, serverDhInnerReader.pos)))) {
|
|
233
238
|
throw new index_js_1.MtSecurityError('Step 3: invalid inner data hash');
|
|
234
239
|
}
|
|
235
240
|
(0, type_assertions_js_1.mtpAssertTypeIs)('auth step 3', serverDhInner, 'mt_server_DH_inner_data');
|
|
@@ -241,30 +246,30 @@ async function doAuthorization(connection, crypto, expiresIn) {
|
|
|
241
246
|
}
|
|
242
247
|
const dhPrime = (0, index_js_2.bufferToBigInt)(serverDhInner.dhPrime);
|
|
243
248
|
const timeOffset = Math.floor(Date.now() / 1000) - serverDhInner.serverTime;
|
|
244
|
-
const g = (
|
|
249
|
+
const g = BigInt(serverDhInner.g);
|
|
245
250
|
const gA = (0, index_js_2.bufferToBigInt)(serverDhInner.gA);
|
|
246
|
-
checkDhPrime(log, dhPrime, serverDhInner.g);
|
|
251
|
+
checkDhPrime(crypto, log, dhPrime, serverDhInner.g);
|
|
247
252
|
let retryId = long_1.default.ZERO;
|
|
248
253
|
const serverSalt = (0, utils_js_1.xorBuffer)(newNonce.subarray(0, 8), resPq.serverNonce.subarray(0, 8));
|
|
249
254
|
for (;;) {
|
|
250
|
-
const b = (0, index_js_2.bufferToBigInt)(
|
|
251
|
-
const gB =
|
|
252
|
-
const authKey = (0, index_js_2.bigIntToBuffer)(
|
|
253
|
-
const authKeyAuxHash =
|
|
255
|
+
const b = (0, index_js_2.bufferToBigInt)(crypto.randomBytes(256));
|
|
256
|
+
const gB = (0, index_js_2.bigIntModPow)(g, b, dhPrime);
|
|
257
|
+
const authKey = (0, index_js_2.bigIntToBuffer)((0, index_js_2.bigIntModPow)(gA, b, dhPrime));
|
|
258
|
+
const authKeyAuxHash = crypto.sha1(authKey).subarray(0, 8);
|
|
254
259
|
// validate DH params
|
|
255
|
-
if (g
|
|
260
|
+
if (g <= 1 || g >= dhPrime - 1n) {
|
|
256
261
|
throw new index_js_1.MtSecurityError('g is not within (1, dh_prime - 1)');
|
|
257
262
|
}
|
|
258
|
-
if (gA
|
|
263
|
+
if (gA <= 1 || gA >= dhPrime - 1n) {
|
|
259
264
|
throw new index_js_1.MtSecurityError('g_a is not within (1, dh_prime - 1)');
|
|
260
265
|
}
|
|
261
|
-
if (gB
|
|
266
|
+
if (gB <= 1 || gB >= dhPrime - 1n) {
|
|
262
267
|
throw new index_js_1.MtSecurityError('g_b is not within (1, dh_prime - 1)');
|
|
263
268
|
}
|
|
264
|
-
if (gA
|
|
269
|
+
if (gA <= DH_SAFETY_RANGE || gA >= dhPrime - DH_SAFETY_RANGE) {
|
|
265
270
|
throw new index_js_1.MtSecurityError('g_a is not within (2^{2048-64}, dh_prime - 2^{2048-64})');
|
|
266
271
|
}
|
|
267
|
-
if (gB
|
|
272
|
+
if (gB <= DH_SAFETY_RANGE || gB >= dhPrime - DH_SAFETY_RANGE) {
|
|
268
273
|
throw new index_js_1.MtSecurityError('g_b is not within (2^{2048-64}, dh_prime - 2^{2048-64})');
|
|
269
274
|
}
|
|
270
275
|
const gB_ = (0, index_js_2.bigIntToBuffer)(gB, 0, false);
|
|
@@ -283,11 +288,11 @@ async function doAuthorization(connection, crypto, expiresIn) {
|
|
|
283
288
|
const clientDhInnerWriter = tl_runtime_1.TlBinaryWriter.alloc(writerMap, innerLength);
|
|
284
289
|
clientDhInnerWriter.pos = 20;
|
|
285
290
|
clientDhInnerWriter.object(clientDhInner);
|
|
286
|
-
const clientDhInnerHash =
|
|
291
|
+
const clientDhInnerHash = crypto.sha1(clientDhInnerWriter.uint8View.subarray(20, clientDhInnerWriter.pos));
|
|
287
292
|
clientDhInnerWriter.pos = 0;
|
|
288
293
|
clientDhInnerWriter.raw(clientDhInnerHash);
|
|
289
294
|
log.debug('sending client DH (timeOffset = %d)', timeOffset);
|
|
290
|
-
const clientDhEncrypted =
|
|
295
|
+
const clientDhEncrypted = ige.encrypt(clientDhInnerWriter.uint8View);
|
|
291
296
|
await sendPlainMessage({
|
|
292
297
|
_: 'mt_set_client_DH_params',
|
|
293
298
|
nonce,
|
|
@@ -310,7 +315,7 @@ async function doAuthorization(connection, crypto, expiresIn) {
|
|
|
310
315
|
throw new index_js_1.MtTypeAssertionError('auth step 4', '!mt_dh_gen_fail', dhGen._);
|
|
311
316
|
}
|
|
312
317
|
if (dhGen._ === 'mt_dh_gen_retry') {
|
|
313
|
-
const expectedHash =
|
|
318
|
+
const expectedHash = crypto.sha1((0, buffer_utils_js_1.concatBuffers)([newNonce, new Uint8Array([2]), authKeyAuxHash]));
|
|
314
319
|
if (!(0, buffer_utils_js_1.buffersEqual)(expectedHash.subarray(4, 20), dhGen.newNonceHash2)) {
|
|
315
320
|
throw Error('Step 4: invalid retry nonce hash from server');
|
|
316
321
|
}
|
|
@@ -319,7 +324,7 @@ async function doAuthorization(connection, crypto, expiresIn) {
|
|
|
319
324
|
}
|
|
320
325
|
if (dhGen._ !== 'mt_dh_gen_ok')
|
|
321
326
|
throw new Error(); // unreachable
|
|
322
|
-
const expectedHash =
|
|
327
|
+
const expectedHash = crypto.sha1((0, buffer_utils_js_1.concatBuffers)([newNonce, new Uint8Array([1]), authKeyAuxHash]));
|
|
323
328
|
if (!(0, buffer_utils_js_1.buffersEqual)(expectedHash.subarray(4, 20), dhGen.newNonceHash1)) {
|
|
324
329
|
throw Error('Step 4: invalid nonce hash from server');
|
|
325
330
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorization.js","sourceRoot":"","sources":["../../../src/network/authorization.ts"],"names":[],"mappings":"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","sourcesContent":["import bigInt from 'big-integer'\nimport Long from 'long'\n\nimport { mtp } from '@mtcute/tl'\nimport { TlPublicKey } from '@mtcute/tl/binary/rsa-keys.js'\nimport { TlBinaryReader, TlBinaryWriter, TlSerializationCounter } from '@mtcute/tl-runtime'\n\nimport { MtArgumentError, MtSecurityError, MtTypeAssertionError } from '../types/index.js'\nimport { buffersEqual, concatBuffers, dataViewFromBuffer, randomBytes } from '../utils/buffer-utils.js'\nimport { findKeyByFingerprints } from '../utils/crypto/keys.js'\nimport { millerRabin } from '../utils/crypto/miller-rabin.js'\nimport { generateKeyAndIvFromNonce } from '../utils/crypto/mtproto.js'\nimport { xorBuffer, xorBufferInPlace } from '../utils/crypto/utils.js'\nimport { bigIntToBuffer, bufferToBigInt, ICryptoProvider, Logger } from '../utils/index.js'\nimport { mtpAssertTypeIs } from '../utils/type-assertions.js'\nimport { SessionConnection } from './session-connection.js'\n\n// Heavily based on code from https://github.com/LonamiWebs/Telethon/blob/master/telethon/network/authenticator.py\n\n// see https://core.telegram.org/mtproto/security_guidelines\nconst DH_SAFETY_RANGE = bigInt[2].pow(2048 - 64)\nconst KNOWN_DH_PRIME = bigInt(\n 'C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5B',\n 16,\n)\nconst TWO_POW_2047 = bigInt[2].pow(2047)\nconst TWO_POW_2048 = bigInt[2].pow(2048)\n\ninterface CheckedPrime {\n prime: bigInt.BigInteger\n generators: number[]\n}\nconst checkedPrimesCache: CheckedPrime[] = []\n\nfunction checkDhPrime(log: Logger, dhPrime: bigInt.BigInteger, g: number) {\n if (KNOWN_DH_PRIME.eq(dhPrime)) {\n log.debug('server is using known dh prime, skipping validation')\n\n return\n }\n\n let checkedPrime = checkedPrimesCache.find((x) => x.prime.eq(dhPrime))\n\n if (!checkedPrime) {\n if (dhPrime.lesserOrEquals(TWO_POW_2047) || dhPrime.greaterOrEquals(TWO_POW_2048)) {\n throw new MtSecurityError('Step 3: dh_prime is not in the 2048-bit range')\n }\n\n if (!millerRabin(dhPrime)) {\n throw new MtSecurityError('Step 3: dh_prime is not prime')\n }\n if (!millerRabin(dhPrime.minus(1).divide(2))) {\n throw new MtSecurityError('Step 3: dh_prime is not a safe prime - (dh_prime-1)/2 is not prime')\n }\n\n log.debug('dh_prime is probably prime')\n\n checkedPrime = {\n prime: dhPrime,\n generators: [],\n }\n checkedPrimesCache.push(checkedPrime)\n } else {\n log.debug('dh_prime is probably prime (cached)')\n }\n\n const generatorChecked = checkedPrime.generators.includes(g)\n\n if (generatorChecked) {\n log.debug('g = %d is already checked for dh_prime', g)\n\n return\n }\n\n switch (g) {\n case 2:\n if (dhPrime.mod(8).notEquals(7)) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 8 != 7')\n }\n break\n case 3:\n if (dhPrime.mod(3).notEquals(2)) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 3 != 2')\n }\n break\n case 4:\n break\n case 5: {\n const mod = dhPrime.mod(5)\n\n if (mod.notEquals(1) && mod.notEquals(4)) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 5 != 1 && dh_prime mod 5 != 4')\n }\n break\n }\n case 6: {\n const mod = dhPrime.mod(24)\n\n if (mod.notEquals(19) && mod.notEquals(23)) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 24 != 19 && dh_prime mod 24 != 23')\n }\n break\n }\n case 7: {\n const mod = dhPrime.mod(7)\n\n if (mod.notEquals(3) && mod.notEquals(5) && mod.notEquals(6)) {\n throw new MtSecurityError(\n 'Step 3: ivalid g - dh_prime mod 7 != 3 && dh_prime mod 7 != 5 && dh_prime mod 7 != 6',\n )\n }\n break\n }\n default:\n throw new MtSecurityError(`Step 3: ivalid g - unknown g = ${g}`)\n }\n\n checkedPrime.generators.push(g)\n\n log.debug('g = %d is safe to use with dh_prime', g)\n}\n\nasync function rsaPad(data: Uint8Array, crypto: ICryptoProvider, key: TlPublicKey): Promise<Uint8Array> {\n // since Summer 2021, they use \"version of RSA with a variant of OAEP+ padding explained below\"\n\n const keyModulus = bigInt(key.modulus, 16)\n const keyExponent = bigInt(key.exponent, 16)\n\n if (data.length > 144) {\n throw new MtArgumentError('Failed to pad: too big data')\n }\n\n data = concatBuffers([data, randomBytes(192 - data.length)])\n\n for (;;) {\n const aesIv = new Uint8Array(32)\n\n const aesKey = randomBytes(32)\n\n const dataWithHash = concatBuffers([data, await crypto.sha256(concatBuffers([aesKey, data]))])\n // we only need to reverse the data\n dataWithHash.subarray(0, 192).reverse()\n\n const aes = await crypto.createAesIge(aesKey, aesIv)\n const encrypted = await aes.encrypt(dataWithHash)\n const encryptedHash = await crypto.sha256(encrypted)\n\n xorBufferInPlace(aesKey, encryptedHash)\n const decryptedData = concatBuffers([aesKey, encrypted])\n\n const decryptedDataBigint = bufferToBigInt(decryptedData)\n\n if (decryptedDataBigint.geq(keyModulus)) {\n continue\n }\n\n const encryptedBigint = decryptedDataBigint.modPow(keyExponent, keyModulus)\n\n return bigIntToBuffer(encryptedBigint, 256)\n }\n}\n\nasync function rsaEncrypt(data: Uint8Array, crypto: ICryptoProvider, key: TlPublicKey): Promise<Uint8Array> {\n const toEncrypt = concatBuffers([\n await crypto.sha1(data),\n data,\n // sha1 is always 20 bytes, so we're left with 255 - 20 - x padding\n randomBytes(235 - data.length),\n ])\n\n const encryptedBigInt = bufferToBigInt(toEncrypt).modPow(bigInt(key.exponent, 16), bigInt(key.modulus, 16))\n\n return bigIntToBuffer(encryptedBigInt)\n}\n\n/**\n * Execute authorization flow on `connection` using `crypto`.\n *\n * @returns tuple: [authKey, serverSalt, timeOffset]\n */\nexport async function doAuthorization(\n connection: SessionConnection,\n crypto: ICryptoProvider,\n expiresIn?: number,\n): Promise<[Uint8Array, Long, number]> {\n // eslint-disable-next-line dot-notation\n const session = connection['_session']\n const readerMap = session._readerMap\n const writerMap = session._writerMap\n const log = connection.log.create('auth')\n\n function sendPlainMessage(message: mtp.TlObject): Promise<void> {\n const length = TlSerializationCounter.countNeededBytes(writerMap, message)\n const writer = TlBinaryWriter.alloc(writerMap, length + 20) // 20 bytes for mtproto header\n\n const messageId = session.getMessageId()\n\n log.verbose('[PLAIN] >>> %j', message)\n writer.long(Long.ZERO)\n writer.long(messageId)\n writer.uint(length)\n writer.object(message)\n\n return connection.send(writer.result())\n }\n\n async function readNext(): Promise<mtp.TlObject> {\n const res = TlBinaryReader.deserializeObject<mtp.TlObject>(\n readerMap,\n await connection.waitForUnencryptedMessage(),\n 20, // skip mtproto header\n )\n\n log.verbose('[PLAIN] <<< %j', res)\n\n return res\n }\n\n if (expiresIn) log.prefix = '[PFS] '\n\n const nonce = randomBytes(16)\n // Step 1: PQ request\n log.debug('starting PQ handshake (temp = %b), nonce = %h', expiresIn, nonce)\n\n await sendPlainMessage({ _: 'mt_req_pq_multi', nonce })\n const resPq = await readNext()\n\n mtpAssertTypeIs('auth step 1', resPq, 'mt_resPQ')\n\n if (!buffersEqual(resPq.nonce, nonce)) {\n throw new MtSecurityError('Step 1: invalid nonce from server')\n }\n\n const serverKeys = resPq.serverPublicKeyFingerprints.map((it) => it.toUnsigned().toString(16))\n log.debug('received PQ, keys: %j', serverKeys)\n\n // Step 2: DH exchange\n const publicKey = findKeyByFingerprints(serverKeys)\n\n if (!publicKey) {\n throw new MtSecurityError(\n 'Step 2: Could not find server public key with any of these fingerprints: ' + serverKeys.join(', '),\n )\n }\n log.debug('found server key, fp = %s, old = %s', publicKey.fingerprint, publicKey.old)\n\n const [p, q] = await crypto.factorizePQ(resPq.pq)\n log.debug('factorized PQ: PQ = %h, P = %h, Q = %h', resPq.pq, p, q)\n\n const newNonce = randomBytes(32)\n\n let dcId = connection.params.dc.id\n if (connection.params.testMode) dcId += 10000\n if (connection.params.dc.mediaOnly) dcId = -dcId\n\n const _pqInnerData: mtp.TypeP_Q_inner_data = {\n _: expiresIn ? 'mt_p_q_inner_data_temp_dc' : 'mt_p_q_inner_data_dc',\n pq: resPq.pq,\n p,\n q,\n nonce,\n newNonce,\n serverNonce: resPq.serverNonce,\n dc: dcId,\n expiresIn: expiresIn!, // whatever\n }\n const pqInnerData = TlBinaryWriter.serializeObject(writerMap, _pqInnerData)\n\n const encryptedData = publicKey.old ?\n await rsaEncrypt(pqInnerData, crypto, publicKey) :\n await rsaPad(pqInnerData, crypto, publicKey)\n\n log.debug('requesting DH params')\n\n await sendPlainMessage({\n _: 'mt_req_DH_params',\n nonce,\n serverNonce: resPq.serverNonce,\n p,\n q,\n publicKeyFingerprint: Long.fromString(publicKey.fingerprint, true, 16),\n encryptedData,\n })\n const serverDhParams = await readNext()\n\n mtpAssertTypeIs('auth step 2', serverDhParams, 'mt_server_DH_params_ok')\n\n if (!buffersEqual(serverDhParams.nonce, nonce)) {\n throw new MtSecurityError('Step 2: invalid nonce from server')\n }\n if (!buffersEqual(serverDhParams.serverNonce, resPq.serverNonce)) {\n throw new MtSecurityError('Step 2: invalid server nonce from server')\n }\n\n log.debug('server DH ok')\n\n if (serverDhParams.encryptedAnswer.length % 16 !== 0) {\n throw new MtSecurityError('Step 2: AES block size is invalid')\n }\n\n // Step 3: complete DH exchange\n const [key, iv] = await generateKeyAndIvFromNonce(crypto, resPq.serverNonce, newNonce)\n const ige = await crypto.createAesIge(key, iv)\n\n const plainTextAnswer = await ige.decrypt(serverDhParams.encryptedAnswer)\n const innerDataHash = plainTextAnswer.subarray(0, 20)\n const serverDhInnerReader = new TlBinaryReader(readerMap, plainTextAnswer, 20)\n const serverDhInner = serverDhInnerReader.object() as mtp.TlObject\n\n if (!buffersEqual(innerDataHash, await crypto.sha1(plainTextAnswer.subarray(20, serverDhInnerReader.pos)))) {\n throw new MtSecurityError('Step 3: invalid inner data hash')\n }\n\n mtpAssertTypeIs('auth step 3', serverDhInner, 'mt_server_DH_inner_data')\n\n if (!buffersEqual(serverDhInner.nonce, nonce)) {\n throw Error('Step 3: invalid nonce from server')\n }\n if (!buffersEqual(serverDhInner.serverNonce, resPq.serverNonce)) {\n throw Error('Step 3: invalid server nonce from server')\n }\n\n const dhPrime = bufferToBigInt(serverDhInner.dhPrime)\n const timeOffset = Math.floor(Date.now() / 1000) - serverDhInner.serverTime\n\n const g = bigInt(serverDhInner.g)\n const gA = bufferToBigInt(serverDhInner.gA)\n\n checkDhPrime(log, dhPrime, serverDhInner.g)\n\n let retryId = Long.ZERO\n const serverSalt = xorBuffer(newNonce.subarray(0, 8), resPq.serverNonce.subarray(0, 8))\n\n for (;;) {\n const b = bufferToBigInt(randomBytes(256))\n const gB = g.modPow(b, dhPrime)\n\n const authKey = bigIntToBuffer(gA.modPow(b, dhPrime))\n const authKeyAuxHash = (await crypto.sha1(authKey)).subarray(0, 8)\n\n // validate DH params\n if (g.lesserOrEquals(1) || g.greaterOrEquals(dhPrime.minus(bigInt.one))) {\n throw new MtSecurityError('g is not within (1, dh_prime - 1)')\n }\n if (gA.lesserOrEquals(1) || gA.greaterOrEquals(dhPrime.minus(bigInt.one))) {\n throw new MtSecurityError('g_a is not within (1, dh_prime - 1)')\n }\n if (gB.lesserOrEquals(1) || gB.greaterOrEquals(dhPrime.minus(bigInt.one))) {\n throw new MtSecurityError('g_b is not within (1, dh_prime - 1)')\n }\n\n if (gA.lt(DH_SAFETY_RANGE) || gA.gt(dhPrime.minus(DH_SAFETY_RANGE))) {\n throw new MtSecurityError('g_a is not within (2^{2048-64}, dh_prime - 2^{2048-64})')\n }\n if (gB.lt(DH_SAFETY_RANGE) || gB.gt(dhPrime.minus(DH_SAFETY_RANGE))) {\n throw new MtSecurityError('g_b is not within (2^{2048-64}, dh_prime - 2^{2048-64})')\n }\n\n const gB_ = bigIntToBuffer(gB, 0, false)\n\n // Step 4: send client DH\n const clientDhInner: mtp.RawMt_client_DH_inner_data = {\n _: 'mt_client_DH_inner_data',\n nonce,\n serverNonce: resPq.serverNonce,\n retryId,\n gB: gB_,\n }\n let innerLength = TlSerializationCounter.countNeededBytes(writerMap, clientDhInner) + 20 // for hash\n const innerPaddingLength = innerLength % 16\n if (innerPaddingLength > 0) innerLength += 16 - innerPaddingLength\n\n const clientDhInnerWriter = TlBinaryWriter.alloc(writerMap, innerLength)\n clientDhInnerWriter.pos = 20\n clientDhInnerWriter.object(clientDhInner)\n const clientDhInnerHash = await crypto.sha1(clientDhInnerWriter.uint8View.subarray(20, clientDhInnerWriter.pos))\n clientDhInnerWriter.pos = 0\n clientDhInnerWriter.raw(clientDhInnerHash)\n\n log.debug('sending client DH (timeOffset = %d)', timeOffset)\n\n const clientDhEncrypted = await ige.encrypt(clientDhInnerWriter.uint8View)\n await sendPlainMessage({\n _: 'mt_set_client_DH_params',\n nonce,\n serverNonce: resPq.serverNonce,\n encryptedData: clientDhEncrypted,\n })\n\n const dhGen = await readNext()\n\n if (!mtp.isAnySet_client_DH_params_answer(dhGen)) {\n throw new MtTypeAssertionError('auth step 4', 'set_client_DH_params_answer', dhGen._)\n }\n\n if (!buffersEqual(dhGen.nonce, nonce)) {\n throw Error('Step 4: invalid nonce from server')\n }\n if (!buffersEqual(dhGen.serverNonce, resPq.serverNonce)) {\n throw Error('Step 4: invalid server nonce from server')\n }\n\n log.debug('DH result: %s', dhGen._)\n\n if (dhGen._ === 'mt_dh_gen_fail') {\n // in theory i would be supposed to calculate newNonceHash, but why, we are failing anyway\n throw new MtTypeAssertionError('auth step 4', '!mt_dh_gen_fail', dhGen._)\n }\n\n if (dhGen._ === 'mt_dh_gen_retry') {\n const expectedHash = await crypto.sha1(concatBuffers([newNonce, new Uint8Array([2]), authKeyAuxHash]))\n\n if (!buffersEqual(expectedHash.subarray(4, 20), dhGen.newNonceHash2)) {\n throw Error('Step 4: invalid retry nonce hash from server')\n }\n retryId = Long.fromBytesLE(authKeyAuxHash as unknown as number[])\n continue\n }\n\n if (dhGen._ !== 'mt_dh_gen_ok') throw new Error() // unreachable\n\n const expectedHash = await crypto.sha1(concatBuffers([newNonce, new Uint8Array([1]), authKeyAuxHash]))\n\n if (!buffersEqual(expectedHash.subarray(4, 20), dhGen.newNonceHash1)) {\n throw Error('Step 4: invalid nonce hash from server')\n }\n\n log.info('authorization successful')\n\n const dv = dataViewFromBuffer(serverSalt)\n\n return [authKey, new Long(dv.getInt32(0, true), dv.getInt32(4, true)), timeOffset]\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"authorization.js","sourceRoot":"","sources":["../../../src/network/authorization.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\n\nimport { mtp } from '@mtcute/tl'\nimport { TlPublicKey } from '@mtcute/tl/binary/rsa-keys.js'\nimport { TlBinaryReader, TlBinaryWriter, TlSerializationCounter } from '@mtcute/tl-runtime'\n\nimport { MtArgumentError, MtSecurityError, MtTypeAssertionError } from '../types/index.js'\nimport { buffersEqual, concatBuffers, dataViewFromBuffer } from '../utils/buffer-utils.js'\nimport { findKeyByFingerprints } from '../utils/crypto/keys.js'\nimport { millerRabin } from '../utils/crypto/miller-rabin.js'\nimport { generateKeyAndIvFromNonce } from '../utils/crypto/mtproto.js'\nimport { xorBuffer, xorBufferInPlace } from '../utils/crypto/utils.js'\nimport { bigIntModPow, bigIntToBuffer, bufferToBigInt, ICryptoProvider, Logger } from '../utils/index.js'\nimport { mtpAssertTypeIs } from '../utils/type-assertions.js'\nimport { SessionConnection } from './session-connection.js'\n\n// Heavily based on code from https://github.com/LonamiWebs/Telethon/blob/master/telethon/network/authenticator.py\n\n// see https://core.telegram.org/mtproto/security_guidelines\n// const DH_SAFETY_RANGE = bigInt[2].pow(2048 - 64)\nconst DH_SAFETY_RANGE = 2n ** (2048n - 64n)\nconst KNOWN_DH_PRIME =\n // eslint-disable-next-line max-len\n 0xc71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5bn\nconst TWO_POW_2047 = 2n ** 2047n\nconst TWO_POW_2048 = 2n ** 2048n\n\ninterface CheckedPrime {\n prime: bigint\n generators: number[]\n}\n\nconst checkedPrimesCache: CheckedPrime[] = []\n\nfunction checkDhPrime(crypto: ICryptoProvider, log: Logger, dhPrime: bigint, g: number) {\n if (KNOWN_DH_PRIME === dhPrime) {\n log.debug('server is using known dh prime, skipping validation')\n\n return\n }\n\n let checkedPrime = checkedPrimesCache.find((x) => x.prime === dhPrime)\n\n if (!checkedPrime) {\n if (dhPrime <= TWO_POW_2047 || dhPrime >= TWO_POW_2048) {\n throw new MtSecurityError('Step 3: dh_prime is not in the 2048-bit range')\n }\n\n if (!millerRabin(crypto, dhPrime)) {\n throw new MtSecurityError('Step 3: dh_prime is not prime')\n }\n if (!millerRabin(crypto, (dhPrime - 1n) / 2n)) {\n throw new MtSecurityError('Step 3: dh_prime is not a safe prime - (dh_prime-1)/2 is not prime')\n }\n\n log.debug('dh_prime is probably prime')\n\n checkedPrime = {\n prime: dhPrime,\n generators: [],\n }\n checkedPrimesCache.push(checkedPrime)\n } else {\n log.debug('dh_prime is probably prime (cached)')\n }\n\n const generatorChecked = checkedPrime.generators.includes(g)\n\n if (generatorChecked) {\n log.debug('g = %d is already checked for dh_prime', g)\n\n return\n }\n\n switch (g) {\n case 2:\n if (dhPrime % 8n !== 7n) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 8 != 7')\n }\n break\n case 3:\n if (dhPrime % 3n !== 2n) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 3 != 2')\n }\n break\n case 4:\n break\n case 5: {\n const mod = dhPrime % 5n\n\n if (mod !== 1n && mod !== 4n) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 5 != 1 && dh_prime mod 5 != 4')\n }\n break\n }\n case 6: {\n const mod = dhPrime % 24n\n\n if (mod !== 19n && mod !== 23n) {\n throw new MtSecurityError('Step 3: ivalid g - dh_prime mod 24 != 19 && dh_prime mod 24 != 23')\n }\n break\n }\n case 7: {\n const mod = dhPrime % 7n\n\n if (mod !== 3n && mod !== 5n && mod !== 6n) {\n throw new MtSecurityError(\n 'Step 3: ivalid g - dh_prime mod 7 != 3 && dh_prime mod 7 != 5 && dh_prime mod 7 != 6',\n )\n }\n break\n }\n default:\n throw new MtSecurityError(`Step 3: ivalid g - unknown g = ${g}`)\n }\n\n checkedPrime.generators.push(g)\n\n log.debug('g = %d is safe to use with dh_prime', g)\n}\n\nfunction rsaPad(data: Uint8Array, crypto: ICryptoProvider, key: TlPublicKey): Uint8Array {\n // since Summer 2021, they use \"version of RSA with a variant of OAEP+ padding explained below\"\n\n const keyModulus = BigInt(`0x${key.modulus}`)\n const keyExponent = BigInt(`0x${key.exponent}`)\n\n if (data.length > 144) {\n throw new MtArgumentError('Failed to pad: too big data')\n }\n\n const dataPadded = new Uint8Array(192)\n dataPadded.set(data, 0)\n crypto.randomFill(dataPadded.subarray(data.length))\n data = dataPadded\n\n for (;;) {\n const aesIv = new Uint8Array(32)\n\n const aesKey = crypto.randomBytes(32)\n\n const dataWithHash = concatBuffers([data, crypto.sha256(concatBuffers([aesKey, data]))])\n // we only need to reverse the data\n dataWithHash.subarray(0, 192).reverse()\n\n const aes = crypto.createAesIge(aesKey, aesIv)\n const encrypted = aes.encrypt(dataWithHash)\n const encryptedHash = crypto.sha256(encrypted)\n\n xorBufferInPlace(aesKey, encryptedHash)\n const decryptedData = concatBuffers([aesKey, encrypted])\n\n const decryptedDataBigint = bufferToBigInt(decryptedData)\n\n if (decryptedDataBigint >= keyModulus) {\n continue\n }\n\n const encryptedBigint = bigIntModPow(decryptedDataBigint, keyExponent, keyModulus)\n\n return bigIntToBuffer(encryptedBigint, 256)\n }\n}\n\nfunction rsaEncrypt(data: Uint8Array, crypto: ICryptoProvider, key: TlPublicKey): Uint8Array {\n const toEncrypt = concatBuffers([\n crypto.sha1(data),\n data,\n // sha1 is always 20 bytes, so we're left with 255 - 20 - x padding\n crypto.randomBytes(235 - data.length),\n ])\n\n const encryptedBigInt = bigIntModPow(\n bufferToBigInt(toEncrypt),\n BigInt(`0x${key.exponent}`),\n BigInt(`0x${key.modulus}`),\n )\n\n return bigIntToBuffer(encryptedBigInt)\n}\n\n/**\n * Execute authorization flow on `connection` using `crypto`.\n *\n * @returns tuple: [authKey, serverSalt, timeOffset]\n */\nexport async function doAuthorization(\n connection: SessionConnection,\n crypto: ICryptoProvider,\n expiresIn?: number,\n): Promise<[Uint8Array, Long, number]> {\n // eslint-disable-next-line dot-notation\n const session = connection['_session']\n const readerMap = session._readerMap\n const writerMap = session._writerMap\n const log = connection.log.create('auth')\n\n function sendPlainMessage(message: mtp.TlObject): Promise<void> {\n const length = TlSerializationCounter.countNeededBytes(writerMap, message)\n const writer = TlBinaryWriter.alloc(writerMap, length + 20) // 20 bytes for mtproto header\n\n const messageId = session.getMessageId()\n\n log.verbose('[PLAIN] >>> %j', message)\n writer.long(Long.ZERO)\n writer.long(messageId)\n writer.uint(length)\n writer.object(message)\n\n return connection.send(writer.result())\n }\n\n async function readNext(): Promise<mtp.TlObject> {\n const res = TlBinaryReader.deserializeObject<mtp.TlObject>(\n readerMap,\n await connection.waitForUnencryptedMessage(),\n 20, // skip mtproto header\n )\n\n log.verbose('[PLAIN] <<< %j', res)\n\n return res\n }\n\n if (expiresIn) log.prefix = '[PFS] '\n\n const nonce = crypto.randomBytes(16)\n // Step 1: PQ request\n log.debug('starting PQ handshake (temp = %b), nonce = %h', expiresIn, nonce)\n\n await sendPlainMessage({ _: 'mt_req_pq_multi', nonce })\n const resPq = await readNext()\n\n mtpAssertTypeIs('auth step 1', resPq, 'mt_resPQ')\n\n if (!buffersEqual(resPq.nonce, nonce)) {\n throw new MtSecurityError('Step 1: invalid nonce from server')\n }\n\n const serverKeys = resPq.serverPublicKeyFingerprints.map((it) => it.toUnsigned().toString(16))\n log.debug('received PQ, keys: %j', serverKeys)\n\n // Step 2: DH exchange\n const publicKey = findKeyByFingerprints(serverKeys)\n\n if (!publicKey) {\n throw new MtSecurityError(\n 'Step 2: Could not find server public key with any of these fingerprints: ' + serverKeys.join(', '),\n )\n }\n log.debug('found server key, fp = %s, old = %s', publicKey.fingerprint, publicKey.old)\n\n const [p, q] = await crypto.factorizePQ(resPq.pq)\n log.debug('factorized PQ: PQ = %h, P = %h, Q = %h', resPq.pq, p, q)\n\n const newNonce = crypto.randomBytes(32)\n\n let dcId = connection.params.dc.id\n if (connection.params.testMode) dcId += 10000\n if (connection.params.dc.mediaOnly) dcId = -dcId\n\n const _pqInnerData: mtp.TypeP_Q_inner_data = {\n _: expiresIn ? 'mt_p_q_inner_data_temp_dc' : 'mt_p_q_inner_data_dc',\n pq: resPq.pq,\n p,\n q,\n nonce,\n newNonce,\n serverNonce: resPq.serverNonce,\n dc: dcId,\n expiresIn: expiresIn!, // whatever\n }\n const pqInnerData = TlBinaryWriter.serializeObject(writerMap, _pqInnerData)\n\n const encryptedData = publicKey.old ?\n rsaEncrypt(pqInnerData, crypto, publicKey) :\n rsaPad(pqInnerData, crypto, publicKey)\n\n log.debug('requesting DH params')\n\n await sendPlainMessage({\n _: 'mt_req_DH_params',\n nonce,\n serverNonce: resPq.serverNonce,\n p,\n q,\n publicKeyFingerprint: Long.fromString(publicKey.fingerprint, true, 16),\n encryptedData,\n })\n const serverDhParams = await readNext()\n\n mtpAssertTypeIs('auth step 2', serverDhParams, 'mt_server_DH_params_ok')\n\n if (!buffersEqual(serverDhParams.nonce, nonce)) {\n throw new MtSecurityError('Step 2: invalid nonce from server')\n }\n if (!buffersEqual(serverDhParams.serverNonce, resPq.serverNonce)) {\n throw new MtSecurityError('Step 2: invalid server nonce from server')\n }\n\n log.debug('server DH ok')\n\n if (serverDhParams.encryptedAnswer.length % 16 !== 0) {\n throw new MtSecurityError('Step 2: AES block size is invalid')\n }\n\n // Step 3: complete DH exchange\n const [key, iv] = generateKeyAndIvFromNonce(crypto, resPq.serverNonce, newNonce)\n const ige = crypto.createAesIge(key, iv)\n\n const plainTextAnswer = ige.decrypt(serverDhParams.encryptedAnswer)\n const innerDataHash = plainTextAnswer.subarray(0, 20)\n const serverDhInnerReader = new TlBinaryReader(readerMap, plainTextAnswer, 20)\n const serverDhInner = serverDhInnerReader.object() as mtp.TlObject\n\n if (!buffersEqual(innerDataHash, crypto.sha1(plainTextAnswer.subarray(20, serverDhInnerReader.pos)))) {\n throw new MtSecurityError('Step 3: invalid inner data hash')\n }\n\n mtpAssertTypeIs('auth step 3', serverDhInner, 'mt_server_DH_inner_data')\n\n if (!buffersEqual(serverDhInner.nonce, nonce)) {\n throw Error('Step 3: invalid nonce from server')\n }\n if (!buffersEqual(serverDhInner.serverNonce, resPq.serverNonce)) {\n throw Error('Step 3: invalid server nonce from server')\n }\n\n const dhPrime = bufferToBigInt(serverDhInner.dhPrime)\n const timeOffset = Math.floor(Date.now() / 1000) - serverDhInner.serverTime\n\n const g = BigInt(serverDhInner.g)\n const gA = bufferToBigInt(serverDhInner.gA)\n\n checkDhPrime(crypto, log, dhPrime, serverDhInner.g)\n\n let retryId = Long.ZERO\n const serverSalt = xorBuffer(newNonce.subarray(0, 8), resPq.serverNonce.subarray(0, 8))\n\n for (;;) {\n const b = bufferToBigInt(crypto.randomBytes(256))\n const gB = bigIntModPow(g, b, dhPrime)\n\n const authKey = bigIntToBuffer(bigIntModPow(gA, b, dhPrime))\n const authKeyAuxHash = crypto.sha1(authKey).subarray(0, 8)\n\n // validate DH params\n if (g <= 1 || g >= dhPrime - 1n) {\n throw new MtSecurityError('g is not within (1, dh_prime - 1)')\n }\n if (gA <= 1 || gA >= dhPrime - 1n) {\n throw new MtSecurityError('g_a is not within (1, dh_prime - 1)')\n }\n if (gB <= 1 || gB >= dhPrime - 1n) {\n throw new MtSecurityError('g_b is not within (1, dh_prime - 1)')\n }\n\n if (gA <= DH_SAFETY_RANGE || gA >= dhPrime - DH_SAFETY_RANGE) {\n throw new MtSecurityError('g_a is not within (2^{2048-64}, dh_prime - 2^{2048-64})')\n }\n if (gB <= DH_SAFETY_RANGE || gB >= dhPrime - DH_SAFETY_RANGE) {\n throw new MtSecurityError('g_b is not within (2^{2048-64}, dh_prime - 2^{2048-64})')\n }\n\n const gB_ = bigIntToBuffer(gB, 0, false)\n\n // Step 4: send client DH\n const clientDhInner: mtp.RawMt_client_DH_inner_data = {\n _: 'mt_client_DH_inner_data',\n nonce,\n serverNonce: resPq.serverNonce,\n retryId,\n gB: gB_,\n }\n let innerLength = TlSerializationCounter.countNeededBytes(writerMap, clientDhInner) + 20 // for hash\n const innerPaddingLength = innerLength % 16\n if (innerPaddingLength > 0) innerLength += 16 - innerPaddingLength\n\n const clientDhInnerWriter = TlBinaryWriter.alloc(writerMap, innerLength)\n clientDhInnerWriter.pos = 20\n clientDhInnerWriter.object(clientDhInner)\n const clientDhInnerHash = crypto.sha1(clientDhInnerWriter.uint8View.subarray(20, clientDhInnerWriter.pos))\n clientDhInnerWriter.pos = 0\n clientDhInnerWriter.raw(clientDhInnerHash)\n\n log.debug('sending client DH (timeOffset = %d)', timeOffset)\n\n const clientDhEncrypted = ige.encrypt(clientDhInnerWriter.uint8View)\n await sendPlainMessage({\n _: 'mt_set_client_DH_params',\n nonce,\n serverNonce: resPq.serverNonce,\n encryptedData: clientDhEncrypted,\n })\n\n const dhGen = await readNext()\n\n if (!mtp.isAnySet_client_DH_params_answer(dhGen)) {\n throw new MtTypeAssertionError('auth step 4', 'set_client_DH_params_answer', dhGen._)\n }\n\n if (!buffersEqual(dhGen.nonce, nonce)) {\n throw Error('Step 4: invalid nonce from server')\n }\n if (!buffersEqual(dhGen.serverNonce, resPq.serverNonce)) {\n throw Error('Step 4: invalid server nonce from server')\n }\n\n log.debug('DH result: %s', dhGen._)\n\n if (dhGen._ === 'mt_dh_gen_fail') {\n // in theory i would be supposed to calculate newNonceHash, but why, we are failing anyway\n throw new MtTypeAssertionError('auth step 4', '!mt_dh_gen_fail', dhGen._)\n }\n\n if (dhGen._ === 'mt_dh_gen_retry') {\n const expectedHash = crypto.sha1(concatBuffers([newNonce, new Uint8Array([2]), authKeyAuxHash]))\n\n if (!buffersEqual(expectedHash.subarray(4, 20), dhGen.newNonceHash2)) {\n throw Error('Step 4: invalid retry nonce hash from server')\n }\n retryId = Long.fromBytesLE(authKeyAuxHash as unknown as number[])\n continue\n }\n\n if (dhGen._ !== 'mt_dh_gen_ok') throw new Error() // unreachable\n\n const expectedHash = crypto.sha1(concatBuffers([newNonce, new Uint8Array([1]), authKeyAuxHash]))\n\n if (!buffersEqual(expectedHash.subarray(4, 20), dhGen.newNonceHash1)) {\n throw Error('Step 4: invalid nonce hash from server')\n }\n\n log.info('authorization successful')\n\n const dv = dataViewFromBuffer(serverSalt)\n\n return [authKey, new Long(dv.getInt32(0, true), dv.getInt32(4, true)), timeOffset]\n }\n}\n"]}
|
|
@@ -14,7 +14,7 @@ class ConfigManager {
|
|
|
14
14
|
this._listeners = [];
|
|
15
15
|
}
|
|
16
16
|
get isStale() {
|
|
17
|
-
return !this._config || this._config.expires
|
|
17
|
+
return !this._config || this._config.expires <= Date.now() / 1000;
|
|
18
18
|
}
|
|
19
19
|
update(force = false) {
|
|
20
20
|
if (!force && !this.isStale)
|
|
@@ -24,6 +24,7 @@ class ConfigManager {
|
|
|
24
24
|
return (this._updatingPromise = this._update().then((config) => {
|
|
25
25
|
if (this._destroyed)
|
|
26
26
|
return;
|
|
27
|
+
this._updatingPromise = undefined;
|
|
27
28
|
this.setConfig(config);
|
|
28
29
|
}));
|
|
29
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/network/config-manager.ts"],"names":[],"mappings":";;;AAEA;;;;;GAKG;AACH,MAAa,aAAa;IACtB,YAAoB,OAAoC;QAApC,YAAO,GAAP,OAAO,CAA6B;QAEhD,eAAU,GAAG,KAAK,CAAA;QAOlB,eAAU,GAAuC,EAAE,CAAA;IATA,CAAC;IAW5D,IAAI,OAAO;QACP,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/network/config-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\n/**\n * Config manager is responsible for keeping\n * the current server configuration up-to-date\n * and providing methods to find the best DC\n * option for the current session.\n */\nexport class ConfigManager {\n constructor(private _update: () => Promise<tl.RawConfig>) {}\n\n private _destroyed = false\n private _config?: tl.RawConfig\n private _cdnConfig?: tl.RawCdnConfig\n\n private _updateTimeout?: NodeJS.Timeout\n private _updatingPromise?: Promise<void>\n\n private _listeners: ((config: tl.RawConfig) => void)[] = []\n\n get isStale(): boolean {\n return !this._config || this._config.expires <= Date.now() / 1000\n }\n\n update(force = false): Promise<void> {\n if (!force && !this.isStale) return Promise.resolve()\n if (this._updatingPromise) return this._updatingPromise\n\n return (this._updatingPromise = this._update().then((config) => {\n if (this._destroyed) return\n this._updatingPromise = undefined\n\n this.setConfig(config)\n }))\n }\n\n setConfig(config: tl.RawConfig): void {\n this._config = config\n\n if (this._updateTimeout) clearTimeout(this._updateTimeout)\n this._updateTimeout = setTimeout(\n () => void this.update().catch(() => {}),\n (config.expires - Date.now() / 1000) * 1000,\n )\n\n for (const cb of this._listeners) cb(config)\n }\n\n onConfigUpdate(cb: (config: tl.RawConfig) => void): void {\n this._listeners.push(cb)\n }\n\n offConfigUpdate(cb: (config: tl.RawConfig) => void): void {\n const idx = this._listeners.indexOf(cb)\n if (idx >= 0) this._listeners.splice(idx, 1)\n }\n\n getNow(): tl.RawConfig | undefined {\n return this._config\n }\n\n async get(): Promise<tl.RawConfig> {\n if (this.isStale) await this.update()\n\n return this._config!\n }\n\n destroy(): void {\n if (this._updateTimeout) clearTimeout(this._updateTimeout)\n this._listeners.length = 0\n this._destroyed = true\n }\n\n async findOption(params: {\n dcId: number\n allowIpv6?: boolean\n preferIpv6?: boolean\n allowMedia?: boolean\n preferMedia?: boolean\n cdn?: boolean\n }): Promise<tl.RawDcOption | undefined> {\n if (this.isStale) await this.update()\n\n const options = this._config!.dcOptions.filter((opt) => {\n if (opt.tcpoOnly) return false // unsupported\n if (opt.ipv6 && !params.allowIpv6) return false\n if (opt.mediaOnly && !params.allowMedia) return false\n if (opt.cdn && !params.cdn) return false\n\n return opt.id === params.dcId\n })\n\n if (params.preferMedia && params.preferIpv6) {\n const r = options.find((opt) => opt.mediaOnly && opt.ipv6)\n if (r) return r\n }\n\n if (params.preferMedia) {\n const r = options.find((opt) => opt.mediaOnly)\n if (r) return r\n }\n\n if (params.preferIpv6) {\n const r = options.find((opt) => opt.ipv6)\n if (r) return r\n }\n\n return options[0]\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|