@mtcute/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +8 -0
- package/README.md +26 -0
- package/cjs/base-client.d.ts +297 -0
- package/cjs/base-client.js +324 -0
- package/cjs/base-client.js.map +1 -0
- package/cjs/index.d.ts +10 -0
- package/cjs/index.js +30 -0
- package/cjs/index.js.map +1 -0
- package/cjs/network/auth-key.d.ts +21 -0
- package/cjs/network/auth-key.js +101 -0
- package/cjs/network/auth-key.js.map +1 -0
- package/cjs/network/authorization.d.ts +9 -0
- package/cjs/network/authorization.js +332 -0
- package/cjs/network/authorization.js.map +1 -0
- package/cjs/network/config-manager.d.ts +33 -0
- package/cjs/network/config-manager.js +93 -0
- package/cjs/network/config-manager.js.map +1 -0
- package/cjs/network/index.d.ts +4 -0
- package/cjs/network/index.js +20 -0
- package/cjs/network/index.js.map +1 -0
- package/cjs/network/mtproto-session.d.ts +116 -0
- package/cjs/network/mtproto-session.js +209 -0
- package/cjs/network/mtproto-session.js.map +1 -0
- package/cjs/network/multi-session-connection.d.ts +33 -0
- package/cjs/network/multi-session-connection.js +243 -0
- package/cjs/network/multi-session-connection.js.map +1 -0
- package/cjs/network/network-manager.d.ts +190 -0
- package/cjs/network/network-manager.js +547 -0
- package/cjs/network/network-manager.js.map +1 -0
- package/cjs/network/persistent-connection.d.ts +51 -0
- package/cjs/network/persistent-connection.js +173 -0
- package/cjs/network/persistent-connection.js.map +1 -0
- package/cjs/network/reconnection.d.ts +11 -0
- package/cjs/network/reconnection.js +18 -0
- package/cjs/network/reconnection.js.map +1 -0
- package/cjs/network/session-connection.d.ts +72 -0
- package/cjs/network/session-connection.js +1363 -0
- package/cjs/network/session-connection.js.map +1 -0
- package/cjs/network/transports/abstract.d.ts +99 -0
- package/cjs/network/transports/abstract.js +38 -0
- package/cjs/network/transports/abstract.js.map +1 -0
- package/cjs/network/transports/index.d.ts +8 -0
- package/cjs/network/transports/index.js +26 -0
- package/cjs/network/transports/index.js.map +1 -0
- package/cjs/network/transports/intermediate.d.ts +20 -0
- package/cjs/network/transports/intermediate.js +67 -0
- package/cjs/network/transports/intermediate.js.map +1 -0
- package/cjs/network/transports/obfuscated.d.ts +18 -0
- package/cjs/network/transports/obfuscated.js +83 -0
- package/cjs/network/transports/obfuscated.js.map +1 -0
- package/cjs/network/transports/streamed.d.ts +24 -0
- package/cjs/network/transports/streamed.js +32 -0
- package/cjs/network/transports/streamed.js.map +1 -0
- package/cjs/network/transports/tcp.d.ts +33 -0
- package/cjs/network/transports/tcp.js +130 -0
- package/cjs/network/transports/tcp.js.map +1 -0
- package/cjs/network/transports/websocket.d.ts +47 -0
- package/cjs/network/transports/websocket.js +124 -0
- package/cjs/network/transports/websocket.js.map +1 -0
- package/cjs/network/transports/wrapped.d.ts +11 -0
- package/cjs/network/transports/wrapped.js +26 -0
- package/cjs/network/transports/wrapped.js.map +1 -0
- package/cjs/package.json +3 -0
- package/cjs/storage/abstract.d.ts +174 -0
- package/cjs/storage/abstract.js +3 -0
- package/cjs/storage/abstract.js.map +1 -0
- package/cjs/storage/index.d.ts +5 -0
- package/cjs/storage/index.js +22 -0
- package/cjs/storage/index.js.map +1 -0
- package/cjs/storage/json-file.d.ts +31 -0
- package/cjs/storage/json-file.js +90 -0
- package/cjs/storage/json-file.js.map +1 -0
- package/cjs/storage/json.d.ts +9 -0
- package/cjs/storage/json.js +65 -0
- package/cjs/storage/json.js.map +1 -0
- package/cjs/storage/localstorage.d.ts +7 -0
- package/cjs/storage/localstorage.js +25 -0
- package/cjs/storage/localstorage.js.map +1 -0
- package/cjs/storage/memory.d.ts +98 -0
- package/cjs/storage/memory.js +299 -0
- package/cjs/storage/memory.js.map +1 -0
- package/cjs/types/errors.d.ts +53 -0
- package/cjs/types/errors.js +58 -0
- package/cjs/types/errors.js.map +1 -0
- package/cjs/types/index.d.ts +3 -0
- package/cjs/types/index.js +20 -0
- package/cjs/types/index.js.map +1 -0
- package/cjs/types/peers.d.ts +4 -0
- package/cjs/types/peers.js +3 -0
- package/cjs/types/peers.js.map +1 -0
- package/cjs/types/utils.d.ts +6 -0
- package/cjs/types/utils.js +9 -0
- package/cjs/types/utils.js.map +1 -0
- package/cjs/utils/async-lock.d.ts +10 -0
- package/cjs/utils/async-lock.js +43 -0
- package/cjs/utils/async-lock.js.map +1 -0
- package/cjs/utils/bigint-utils.d.ts +40 -0
- package/cjs/utils/bigint-utils.js +104 -0
- package/cjs/utils/bigint-utils.js.map +1 -0
- package/cjs/utils/binary/asn1-parser.d.ts +17 -0
- package/cjs/utils/binary/asn1-parser.js +121 -0
- package/cjs/utils/binary/asn1-parser.js.map +1 -0
- package/cjs/utils/buffer-utils.d.ts +21 -0
- package/cjs/utils/buffer-utils.js +63 -0
- package/cjs/utils/buffer-utils.js.map +1 -0
- package/cjs/utils/condition-variable.d.ts +9 -0
- package/cjs/utils/condition-variable.js +28 -0
- package/cjs/utils/condition-variable.js.map +1 -0
- package/cjs/utils/controllable-promise.d.ts +16 -0
- package/cjs/utils/controllable-promise.js +25 -0
- package/cjs/utils/controllable-promise.js.map +1 -0
- package/cjs/utils/crypto/abstract.d.ts +23 -0
- package/cjs/utils/crypto/abstract.js +19 -0
- package/cjs/utils/crypto/abstract.js.map +1 -0
- package/cjs/utils/crypto/common.d.ts +12 -0
- package/cjs/utils/crypto/common.js +54 -0
- package/cjs/utils/crypto/common.js.map +1 -0
- package/cjs/utils/crypto/factorization.d.ts +5 -0
- package/cjs/utils/crypto/factorization.js +69 -0
- package/cjs/utils/crypto/factorization.js.map +1 -0
- package/cjs/utils/crypto/index.d.ts +5 -0
- package/cjs/utils/crypto/index.js +23 -0
- package/cjs/utils/crypto/index.js.map +1 -0
- package/cjs/utils/crypto/keys.d.ts +27 -0
- package/cjs/utils/crypto/keys.js +70 -0
- package/cjs/utils/crypto/keys.js.map +1 -0
- package/cjs/utils/crypto/miller-rabin.d.ts +2 -0
- package/cjs/utils/crypto/miller-rabin.js +44 -0
- package/cjs/utils/crypto/miller-rabin.js.map +1 -0
- package/cjs/utils/crypto/mtproto.d.ts +31 -0
- package/cjs/utils/crypto/mtproto.js +66 -0
- package/cjs/utils/crypto/mtproto.js.map +1 -0
- package/cjs/utils/crypto/node-crypto.d.ts +10 -0
- package/cjs/utils/crypto/node-crypto.js +46 -0
- package/cjs/utils/crypto/node-crypto.js.map +1 -0
- package/cjs/utils/crypto/password.d.ts +29 -0
- package/cjs/utils/crypto/password.js +106 -0
- package/cjs/utils/crypto/password.js.map +1 -0
- package/cjs/utils/crypto/subtle.d.ts +12 -0
- package/cjs/utils/crypto/subtle.js +86 -0
- package/cjs/utils/crypto/subtle.js.map +1 -0
- package/cjs/utils/crypto/utils.d.ts +14 -0
- package/cjs/utils/crypto/utils.js +30 -0
- package/cjs/utils/crypto/utils.js.map +1 -0
- package/cjs/utils/default-dcs.d.ts +7 -0
- package/cjs/utils/default-dcs.js +76 -0
- package/cjs/utils/default-dcs.js.map +1 -0
- package/cjs/utils/deque.d.ts +29 -0
- package/cjs/utils/deque.js +210 -0
- package/cjs/utils/deque.js.map +1 -0
- package/cjs/utils/early-timer.d.ts +42 -0
- package/cjs/utils/early-timer.js +79 -0
- package/cjs/utils/early-timer.js.map +1 -0
- package/cjs/utils/flood-control.d.ts +14 -0
- package/cjs/utils/flood-control.js +65 -0
- package/cjs/utils/flood-control.js.map +1 -0
- package/cjs/utils/function-utils.d.ts +13 -0
- package/cjs/utils/function-utils.js +30 -0
- package/cjs/utils/function-utils.js.map +1 -0
- package/cjs/utils/index.d.ts +24 -0
- package/cjs/utils/index.js +41 -0
- package/cjs/utils/index.js.map +1 -0
- package/cjs/utils/linked-list.d.ts +21 -0
- package/cjs/utils/linked-list.js +73 -0
- package/cjs/utils/linked-list.js.map +1 -0
- package/cjs/utils/links/bots.d.ts +71 -0
- package/cjs/utils/links/bots.js +259 -0
- package/cjs/utils/links/bots.js.map +1 -0
- package/cjs/utils/links/bundle.d.ts +7 -0
- package/cjs/utils/links/bundle.js +24 -0
- package/cjs/utils/links/bundle.js.map +1 -0
- package/cjs/utils/links/calls.d.ts +16 -0
- package/cjs/utils/links/calls.js +59 -0
- package/cjs/utils/links/calls.js.map +1 -0
- package/cjs/utils/links/chat.d.ts +46 -0
- package/cjs/utils/links/chat.js +160 -0
- package/cjs/utils/links/chat.js.map +1 -0
- package/cjs/utils/links/common.d.ts +31 -0
- package/cjs/utils/links/common.js +60 -0
- package/cjs/utils/links/common.js.map +1 -0
- package/cjs/utils/links/index.d.ts +2 -0
- package/cjs/utils/links/index.js +29 -0
- package/cjs/utils/links/index.js.map +1 -0
- package/cjs/utils/links/misc.d.ts +19 -0
- package/cjs/utils/links/misc.js +77 -0
- package/cjs/utils/links/misc.js.map +1 -0
- package/cjs/utils/links/proxy.d.ts +17 -0
- package/cjs/utils/links/proxy.js +61 -0
- package/cjs/utils/links/proxy.js.map +1 -0
- package/cjs/utils/links/stickers.d.ts +9 -0
- package/cjs/utils/links/stickers.js +28 -0
- package/cjs/utils/links/stickers.js.map +1 -0
- package/cjs/utils/links/user.d.ts +27 -0
- package/cjs/utils/links/user.js +81 -0
- package/cjs/utils/links/user.js.map +1 -0
- package/cjs/utils/logger.d.ts +54 -0
- package/cjs/utils/logger.js +158 -0
- package/cjs/utils/logger.js.map +1 -0
- package/cjs/utils/long-utils.d.ts +75 -0
- package/cjs/utils/long-utils.js +161 -0
- package/cjs/utils/long-utils.js.map +1 -0
- package/cjs/utils/lru-map.d.ts +21 -0
- package/cjs/utils/lru-map.js +107 -0
- package/cjs/utils/lru-map.js.map +1 -0
- package/cjs/utils/lru-set.d.ts +22 -0
- package/cjs/utils/lru-set.js +48 -0
- package/cjs/utils/lru-set.js.map +1 -0
- package/cjs/utils/misc-utils.d.ts +7 -0
- package/cjs/utils/misc-utils.js +15 -0
- package/cjs/utils/misc-utils.js.map +1 -0
- package/cjs/utils/peer-utils.d.ts +35 -0
- package/cjs/utils/peer-utils.js +188 -0
- package/cjs/utils/peer-utils.js.map +1 -0
- package/cjs/utils/platform/crypto.d.ts +1 -0
- package/cjs/utils/platform/crypto.js +8 -0
- package/cjs/utils/platform/crypto.js.map +1 -0
- package/cjs/utils/platform/crypto.web.d.ts +1 -0
- package/cjs/utils/platform/crypto.web.js +14 -0
- package/cjs/utils/platform/crypto.web.js.map +1 -0
- package/cjs/utils/platform/error-reporting.d.ts +3 -0
- package/cjs/utils/platform/error-reporting.js +22 -0
- package/cjs/utils/platform/error-reporting.js.map +1 -0
- package/cjs/utils/platform/logging.d.ts +1 -0
- package/cjs/utils/platform/logging.js +35 -0
- package/cjs/utils/platform/logging.js.map +1 -0
- package/cjs/utils/platform/logging.web.d.ts +1 -0
- package/cjs/utils/platform/logging.web.js +35 -0
- package/cjs/utils/platform/logging.web.js.map +1 -0
- package/cjs/utils/platform/random.d.ts +1 -0
- package/cjs/utils/platform/random.js +7 -0
- package/cjs/utils/platform/random.js.map +1 -0
- package/cjs/utils/platform/random.web.d.ts +1 -0
- package/cjs/utils/platform/random.web.js +10 -0
- package/cjs/utils/platform/random.web.js.map +1 -0
- package/cjs/utils/platform/transport.d.ts +1 -0
- package/cjs/utils/platform/transport.js +8 -0
- package/cjs/utils/platform/transport.js.map +1 -0
- package/cjs/utils/platform/transport.web.d.ts +1 -0
- package/cjs/utils/platform/transport.web.js +15 -0
- package/cjs/utils/platform/transport.web.js.map +1 -0
- package/cjs/utils/sorted-array.d.ts +17 -0
- package/cjs/utils/sorted-array.js +83 -0
- package/cjs/utils/sorted-array.js.map +1 -0
- package/cjs/utils/string-session.d.ts +11 -0
- package/cjs/utils/string-session.js +73 -0
- package/cjs/utils/string-session.js.map +1 -0
- package/cjs/utils/tl-json.d.ts +13 -0
- package/cjs/utils/tl-json.js +62 -0
- package/cjs/utils/tl-json.js.map +1 -0
- package/cjs/utils/type-assertions.d.ts +37 -0
- package/cjs/utils/type-assertions.js +70 -0
- package/cjs/utils/type-assertions.js.map +1 -0
- package/esm/base-client.d.ts +297 -0
- package/esm/base-client.js +317 -0
- package/esm/base-client.js.map +1 -0
- package/esm/index.d.ts +10 -0
- package/esm/index.js +11 -0
- package/esm/index.js.map +1 -0
- package/esm/network/auth-key.d.ts +21 -0
- package/esm/network/auth-key.js +97 -0
- package/esm/network/auth-key.js.map +1 -0
- package/esm/network/authorization.d.ts +9 -0
- package/esm/network/authorization.js +325 -0
- package/esm/network/authorization.js.map +1 -0
- package/esm/network/config-manager.d.ts +33 -0
- package/esm/network/config-manager.js +89 -0
- package/esm/network/config-manager.js.map +1 -0
- package/esm/network/index.d.ts +4 -0
- package/esm/network/index.js +4 -0
- package/esm/network/index.js.map +1 -0
- package/esm/network/mtproto-session.d.ts +116 -0
- package/esm/network/mtproto-session.js +202 -0
- package/esm/network/mtproto-session.js.map +1 -0
- package/esm/network/multi-session-connection.d.ts +33 -0
- package/esm/network/multi-session-connection.js +236 -0
- package/esm/network/multi-session-connection.js.map +1 -0
- package/esm/network/network-manager.d.ts +190 -0
- package/esm/network/network-manager.js +542 -0
- package/esm/network/network-manager.js.map +1 -0
- package/esm/network/persistent-connection.d.ts +51 -0
- package/esm/network/persistent-connection.js +166 -0
- package/esm/network/persistent-connection.js.map +1 -0
- package/esm/network/reconnection.d.ts +11 -0
- package/esm/network/reconnection.js +14 -0
- package/esm/network/reconnection.js.map +1 -0
- package/esm/network/session-connection.d.ts +72 -0
- package/esm/network/session-connection.js +1356 -0
- package/esm/network/session-connection.js.map +1 -0
- package/esm/network/transports/abstract.d.ts +99 -0
- package/esm/network/transports/abstract.js +34 -0
- package/esm/network/transports/abstract.js.map +1 -0
- package/esm/network/transports/index.d.ts +8 -0
- package/esm/network/transports/index.js +9 -0
- package/esm/network/transports/index.js.map +1 -0
- package/esm/network/transports/intermediate.d.ts +20 -0
- package/esm/network/transports/intermediate.js +62 -0
- package/esm/network/transports/intermediate.js.map +1 -0
- package/esm/network/transports/obfuscated.d.ts +18 -0
- package/esm/network/transports/obfuscated.js +79 -0
- package/esm/network/transports/obfuscated.js.map +1 -0
- package/esm/network/transports/streamed.d.ts +24 -0
- package/esm/network/transports/streamed.js +25 -0
- package/esm/network/transports/streamed.js.map +1 -0
- package/esm/network/transports/tcp.d.ts +33 -0
- package/esm/network/transports/tcp.js +122 -0
- package/esm/network/transports/tcp.js.map +1 -0
- package/esm/network/transports/websocket.d.ts +47 -0
- package/esm/network/transports/websocket.js +116 -0
- package/esm/network/transports/websocket.js.map +1 -0
- package/esm/network/transports/wrapped.d.ts +11 -0
- package/esm/network/transports/wrapped.js +19 -0
- package/esm/network/transports/wrapped.js.map +1 -0
- package/esm/storage/abstract.d.ts +174 -0
- package/esm/storage/abstract.js +2 -0
- package/esm/storage/abstract.js.map +1 -0
- package/esm/storage/index.d.ts +5 -0
- package/esm/storage/index.js +6 -0
- package/esm/storage/index.js.map +1 -0
- package/esm/storage/json-file.d.ts +31 -0
- package/esm/storage/json-file.js +63 -0
- package/esm/storage/json-file.js.map +1 -0
- package/esm/storage/json.d.ts +9 -0
- package/esm/storage/json.js +61 -0
- package/esm/storage/json.js.map +1 -0
- package/esm/storage/localstorage.d.ts +7 -0
- package/esm/storage/localstorage.js +21 -0
- package/esm/storage/localstorage.js.map +1 -0
- package/esm/storage/memory.d.ts +98 -0
- package/esm/storage/memory.js +295 -0
- package/esm/storage/memory.js.map +1 -0
- package/esm/types/errors.d.ts +53 -0
- package/esm/types/errors.js +49 -0
- package/esm/types/errors.js.map +1 -0
- package/esm/types/index.d.ts +3 -0
- package/esm/types/index.js +4 -0
- package/esm/types/index.js.map +1 -0
- package/esm/types/peers.d.ts +4 -0
- package/esm/types/peers.js +2 -0
- package/esm/types/peers.js.map +1 -0
- package/esm/types/utils.d.ts +6 -0
- package/esm/types/utils.js +5 -0
- package/esm/types/utils.js.map +1 -0
- package/esm/utils/async-lock.d.ts +10 -0
- package/esm/utils/async-lock.js +39 -0
- package/esm/utils/async-lock.js.map +1 -0
- package/esm/utils/bigint-utils.d.ts +40 -0
- package/esm/utils/bigint-utils.js +92 -0
- package/esm/utils/bigint-utils.js.map +1 -0
- package/esm/utils/binary/asn1-parser.d.ts +17 -0
- package/esm/utils/binary/asn1-parser.js +116 -0
- package/esm/utils/binary/asn1-parser.js.map +1 -0
- package/esm/utils/buffer-utils.d.ts +21 -0
- package/esm/utils/buffer-utils.js +55 -0
- package/esm/utils/buffer-utils.js.map +1 -0
- package/esm/utils/condition-variable.d.ts +9 -0
- package/esm/utils/condition-variable.js +24 -0
- package/esm/utils/condition-variable.js.map +1 -0
- package/esm/utils/controllable-promise.d.ts +16 -0
- package/esm/utils/controllable-promise.js +20 -0
- package/esm/utils/controllable-promise.js.map +1 -0
- package/esm/utils/crypto/abstract.d.ts +23 -0
- package/esm/utils/crypto/abstract.js +15 -0
- package/esm/utils/crypto/abstract.js.map +1 -0
- package/esm/utils/crypto/common.d.ts +12 -0
- package/esm/utils/crypto/common.js +50 -0
- package/esm/utils/crypto/common.js.map +1 -0
- package/esm/utils/crypto/factorization.d.ts +5 -0
- package/esm/utils/crypto/factorization.js +62 -0
- package/esm/utils/crypto/factorization.js.map +1 -0
- package/esm/utils/crypto/index.d.ts +5 -0
- package/esm/utils/crypto/index.js +6 -0
- package/esm/utils/crypto/index.js.map +1 -0
- package/esm/utils/crypto/keys.d.ts +27 -0
- package/esm/utils/crypto/keys.js +64 -0
- package/esm/utils/crypto/keys.js.map +1 -0
- package/esm/utils/crypto/miller-rabin.d.ts +2 -0
- package/esm/utils/crypto/miller-rabin.js +37 -0
- package/esm/utils/crypto/miller-rabin.js.map +1 -0
- package/esm/utils/crypto/mtproto.d.ts +31 -0
- package/esm/utils/crypto/mtproto.js +60 -0
- package/esm/utils/crypto/mtproto.js.map +1 -0
- package/esm/utils/crypto/node-crypto.d.ts +10 -0
- package/esm/utils/crypto/node-crypto.js +42 -0
- package/esm/utils/crypto/node-crypto.js.map +1 -0
- package/esm/utils/crypto/password.d.ts +29 -0
- package/esm/utils/crypto/password.js +97 -0
- package/esm/utils/crypto/password.js.map +1 -0
- package/esm/utils/crypto/subtle.d.ts +12 -0
- package/esm/utils/crypto/subtle.js +59 -0
- package/esm/utils/crypto/subtle.js.map +1 -0
- package/esm/utils/crypto/utils.d.ts +14 -0
- package/esm/utils/crypto/utils.js +25 -0
- package/esm/utils/crypto/utils.js.map +1 -0
- package/esm/utils/default-dcs.d.ts +7 -0
- package/esm/utils/default-dcs.js +73 -0
- package/esm/utils/default-dcs.js.map +1 -0
- package/esm/utils/deque.d.ts +29 -0
- package/esm/utils/deque.js +206 -0
- package/esm/utils/deque.js.map +1 -0
- package/esm/utils/early-timer.d.ts +42 -0
- package/esm/utils/early-timer.js +75 -0
- package/esm/utils/early-timer.js.map +1 -0
- package/esm/utils/flood-control.d.ts +14 -0
- package/esm/utils/flood-control.js +61 -0
- package/esm/utils/flood-control.js.map +1 -0
- package/esm/utils/function-utils.d.ts +13 -0
- package/esm/utils/function-utils.js +26 -0
- package/esm/utils/function-utils.js.map +1 -0
- package/esm/utils/index.d.ts +24 -0
- package/esm/utils/index.js +25 -0
- package/esm/utils/index.js.map +1 -0
- package/esm/utils/linked-list.d.ts +21 -0
- package/esm/utils/linked-list.js +69 -0
- package/esm/utils/linked-list.js.map +1 -0
- package/esm/utils/links/bots.d.ts +71 -0
- package/esm/utils/links/bots.js +256 -0
- package/esm/utils/links/bots.js.map +1 -0
- package/esm/utils/links/bundle.d.ts +7 -0
- package/esm/utils/links/bundle.js +8 -0
- package/esm/utils/links/bundle.js.map +1 -0
- package/esm/utils/links/calls.d.ts +16 -0
- package/esm/utils/links/calls.js +56 -0
- package/esm/utils/links/calls.js.map +1 -0
- package/esm/utils/links/chat.d.ts +46 -0
- package/esm/utils/links/chat.js +157 -0
- package/esm/utils/links/chat.js.map +1 -0
- package/esm/utils/links/common.d.ts +31 -0
- package/esm/utils/links/common.js +56 -0
- package/esm/utils/links/common.js.map +1 -0
- package/esm/utils/links/index.d.ts +2 -0
- package/esm/utils/links/index.js +3 -0
- package/esm/utils/links/index.js.map +1 -0
- package/esm/utils/links/misc.d.ts +19 -0
- package/esm/utils/links/misc.js +74 -0
- package/esm/utils/links/misc.js.map +1 -0
- package/esm/utils/links/proxy.d.ts +17 -0
- package/esm/utils/links/proxy.js +58 -0
- package/esm/utils/links/proxy.js.map +1 -0
- package/esm/utils/links/stickers.d.ts +9 -0
- package/esm/utils/links/stickers.js +25 -0
- package/esm/utils/links/stickers.js.map +1 -0
- package/esm/utils/links/user.d.ts +27 -0
- package/esm/utils/links/user.js +78 -0
- package/esm/utils/links/user.js.map +1 -0
- package/esm/utils/logger.d.ts +54 -0
- package/esm/utils/logger.js +154 -0
- package/esm/utils/logger.js.map +1 -0
- package/esm/utils/long-utils.d.ts +75 -0
- package/esm/utils/long-utils.js +148 -0
- package/esm/utils/long-utils.js.map +1 -0
- package/esm/utils/lru-map.d.ts +21 -0
- package/esm/utils/lru-map.js +103 -0
- package/esm/utils/lru-map.js.map +1 -0
- package/esm/utils/lru-set.d.ts +22 -0
- package/esm/utils/lru-set.js +44 -0
- package/esm/utils/lru-set.js.map +1 -0
- package/esm/utils/misc-utils.d.ts +7 -0
- package/esm/utils/misc-utils.js +10 -0
- package/esm/utils/misc-utils.js.map +1 -0
- package/esm/utils/peer-utils.d.ts +35 -0
- package/esm/utils/peer-utils.js +179 -0
- package/esm/utils/peer-utils.js.map +1 -0
- package/esm/utils/platform/crypto.d.ts +1 -0
- package/esm/utils/platform/crypto.js +4 -0
- package/esm/utils/platform/crypto.js.map +1 -0
- package/esm/utils/platform/crypto.web.d.ts +1 -0
- package/esm/utils/platform/crypto.web.js +10 -0
- package/esm/utils/platform/crypto.web.js.map +1 -0
- package/esm/utils/platform/error-reporting.d.ts +3 -0
- package/esm/utils/platform/error-reporting.js +18 -0
- package/esm/utils/platform/error-reporting.js.map +1 -0
- package/esm/utils/platform/logging.d.ts +1 -0
- package/esm/utils/platform/logging.js +32 -0
- package/esm/utils/platform/logging.js.map +1 -0
- package/esm/utils/platform/logging.web.d.ts +1 -0
- package/esm/utils/platform/logging.web.js +31 -0
- package/esm/utils/platform/logging.web.js.map +1 -0
- package/esm/utils/platform/random.d.ts +1 -0
- package/esm/utils/platform/random.js +4 -0
- package/esm/utils/platform/random.js.map +1 -0
- package/esm/utils/platform/random.web.d.ts +1 -0
- package/esm/utils/platform/random.web.js +6 -0
- package/esm/utils/platform/random.web.js.map +1 -0
- package/esm/utils/platform/transport.d.ts +1 -0
- package/esm/utils/platform/transport.js +4 -0
- package/esm/utils/platform/transport.js.map +1 -0
- package/esm/utils/platform/transport.web.d.ts +1 -0
- package/esm/utils/platform/transport.web.js +12 -0
- package/esm/utils/platform/transport.web.js.map +1 -0
- package/esm/utils/sorted-array.d.ts +17 -0
- package/esm/utils/sorted-array.js +79 -0
- package/esm/utils/sorted-array.js.map +1 -0
- package/esm/utils/string-session.d.ts +11 -0
- package/esm/utils/string-session.js +68 -0
- package/esm/utils/string-session.js.map +1 -0
- package/esm/utils/tl-json.d.ts +13 -0
- package/esm/utils/tl-json.js +57 -0
- package/esm/utils/tl-json.js.map +1 -0
- package/esm/utils/type-assertions.d.ts +37 -0
- package/esm/utils/type-assertions.js +61 -0
- package/esm/utils/type-assertions.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './abstract.js';
|
|
2
|
+
export * from './keys.js';
|
|
3
|
+
export * from './password.js';
|
|
4
|
+
import { _defaultCryptoProviderFactory } from '../platform/crypto.js';
|
|
5
|
+
export const defaultCryptoProviderFactory = _defaultCryptoProviderFactory;
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/crypto/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAE7B,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAA;AAGrE,MAAM,CAAC,MAAM,4BAA4B,GAA0B,6BAA6B,CAAA","sourcesContent":["export * from './abstract.js'\nexport * from './keys.js'\nexport * from './password.js'\n\nimport { _defaultCryptoProviderFactory } from '../platform/crypto.js'\nimport { CryptoProviderFactory } from './abstract.js'\n\nexport const defaultCryptoProviderFactory: CryptoProviderFactory = _defaultCryptoProviderFactory\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import Long from 'long';
|
|
2
|
+
import { TlPublicKey } from '@mtcute/tl/binary/rsa-keys.js';
|
|
3
|
+
import { ICryptoProvider } from './abstract.js';
|
|
4
|
+
/**
|
|
5
|
+
* Parse PEM-encoded RSA public key information into modulus and exponent
|
|
6
|
+
* and compute its fingerprint as defined by MTProto.
|
|
7
|
+
*
|
|
8
|
+
* @param crypto Crypto provider
|
|
9
|
+
* @param key PEM-encoded RSA public key
|
|
10
|
+
* @param old Whether this is an "old" key
|
|
11
|
+
*/
|
|
12
|
+
export declare function parsePublicKey(crypto: ICryptoProvider, key: string, old?: boolean): Promise<TlPublicKey>;
|
|
13
|
+
/**
|
|
14
|
+
* Add public key to the global index.
|
|
15
|
+
*
|
|
16
|
+
* @param crypto Crypto provider
|
|
17
|
+
* @param key PEM-encoded RSA public key
|
|
18
|
+
* @param old Whether this is an "old" key
|
|
19
|
+
*/
|
|
20
|
+
export declare function addPublicKey(crypto: ICryptoProvider, key: string, old?: boolean): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Get public key by its fingerprint.
|
|
23
|
+
*
|
|
24
|
+
* @param fingerprints Fingerprints to match. The first one to match is returned.
|
|
25
|
+
* @param allowOld Whether to allow "old" keys
|
|
26
|
+
*/
|
|
27
|
+
export declare function findKeyByFingerprints(fingerprints: (string | Long)[], allowOld?: boolean): TlPublicKey | null;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { __publicKeyIndex as keysIndex } from '@mtcute/tl/binary/rsa-keys.js';
|
|
2
|
+
import { hexEncode, TlBinaryWriter } from '@mtcute/tl-runtime';
|
|
3
|
+
import { parseAsn1, parsePemContents } from '../binary/asn1-parser.js';
|
|
4
|
+
/**
|
|
5
|
+
* Parse PEM-encoded RSA public key information into modulus and exponent
|
|
6
|
+
* and compute its fingerprint as defined by MTProto.
|
|
7
|
+
*
|
|
8
|
+
* @param crypto Crypto provider
|
|
9
|
+
* @param key PEM-encoded RSA public key
|
|
10
|
+
* @param old Whether this is an "old" key
|
|
11
|
+
*/
|
|
12
|
+
export async function parsePublicKey(crypto, key, old = false) {
|
|
13
|
+
const asn1 = parseAsn1(parsePemContents(key));
|
|
14
|
+
const modulus = asn1.children?.[0].value;
|
|
15
|
+
const exponent = asn1.children?.[1].value;
|
|
16
|
+
if (!modulus || !exponent)
|
|
17
|
+
throw new Error('Invalid public key');
|
|
18
|
+
const writer = TlBinaryWriter.manual(512);
|
|
19
|
+
// they are actually smaller, about 270 bytes, but idc :D
|
|
20
|
+
writer.bytes(modulus);
|
|
21
|
+
writer.bytes(exponent);
|
|
22
|
+
const data = writer.result();
|
|
23
|
+
const sha = await crypto.sha1(data);
|
|
24
|
+
const fp = hexEncode(sha.slice(-8).reverse());
|
|
25
|
+
return {
|
|
26
|
+
modulus: hexEncode(modulus),
|
|
27
|
+
exponent: hexEncode(exponent),
|
|
28
|
+
fingerprint: fp,
|
|
29
|
+
old,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Add public key to the global index.
|
|
34
|
+
*
|
|
35
|
+
* @param crypto Crypto provider
|
|
36
|
+
* @param key PEM-encoded RSA public key
|
|
37
|
+
* @param old Whether this is an "old" key
|
|
38
|
+
*/
|
|
39
|
+
export async function addPublicKey(crypto, key, old = false) {
|
|
40
|
+
const parsed = await parsePublicKey(crypto, key, old);
|
|
41
|
+
keysIndex[parsed.fingerprint] = parsed;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get public key by its fingerprint.
|
|
45
|
+
*
|
|
46
|
+
* @param fingerprints Fingerprints to match. The first one to match is returned.
|
|
47
|
+
* @param allowOld Whether to allow "old" keys
|
|
48
|
+
*/
|
|
49
|
+
export function findKeyByFingerprints(fingerprints, allowOld = false) {
|
|
50
|
+
for (let fp of fingerprints) {
|
|
51
|
+
if (typeof fp !== 'string') {
|
|
52
|
+
fp = fp.toUnsigned().toString(16);
|
|
53
|
+
}
|
|
54
|
+
if (fp in keysIndex) {
|
|
55
|
+
if (keysIndex[fp].old && !allowOld)
|
|
56
|
+
continue;
|
|
57
|
+
return keysIndex[fp];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (!allowOld)
|
|
61
|
+
return findKeyByFingerprints(fingerprints, true);
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import bigInt from 'big-integer';
|
|
2
|
+
import { randomBigIntBits, twoMultiplicity } from '../bigint-utils.js';
|
|
3
|
+
export function millerRabin(n, rounds = 20) {
|
|
4
|
+
// 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())
|
|
8
|
+
return false;
|
|
9
|
+
const nBits = n.bitLength().toJSNumber();
|
|
10
|
+
const nSub = n.minus(1);
|
|
11
|
+
const r = twoMultiplicity(nSub);
|
|
12
|
+
const d = nSub.shiftRight(r);
|
|
13
|
+
for (let i = 0; i < rounds; i++) {
|
|
14
|
+
let base;
|
|
15
|
+
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))
|
|
20
|
+
continue;
|
|
21
|
+
let i = bigInt.zero;
|
|
22
|
+
let y;
|
|
23
|
+
while (i.lt(r)) {
|
|
24
|
+
y = x.modPow(bigInt[2], n);
|
|
25
|
+
if (x.eq(bigInt.one))
|
|
26
|
+
return false;
|
|
27
|
+
if (x.eq(nSub))
|
|
28
|
+
break;
|
|
29
|
+
i = i.plus(bigInt.one);
|
|
30
|
+
x = y;
|
|
31
|
+
}
|
|
32
|
+
if (i.eq(r))
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=miller-rabin.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ICryptoProvider, IEncryptionScheme } from './abstract.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate AES key and IV from nonces as defined by MTProto.
|
|
4
|
+
* Used in authorization flow.
|
|
5
|
+
*
|
|
6
|
+
* @param crypto Crypto provider
|
|
7
|
+
* @param serverNonce Server nonce
|
|
8
|
+
* @param newNonce New nonce
|
|
9
|
+
* @returns Tuple: `[key, iv]`
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateKeyAndIvFromNonce(crypto: ICryptoProvider, serverNonce: Uint8Array, newNonce: Uint8Array): Promise<[Uint8Array, Uint8Array]>;
|
|
12
|
+
/**
|
|
13
|
+
* Create AES IGE instance for message (given auth key and message key)
|
|
14
|
+
* as defined by MTProto v2.
|
|
15
|
+
*
|
|
16
|
+
* @param crypto Crypto provider
|
|
17
|
+
* @param authKey Authorization key
|
|
18
|
+
* @param messageKey Message key
|
|
19
|
+
* @param client Whether this is a client to server message
|
|
20
|
+
*/
|
|
21
|
+
export declare function createAesIgeForMessage(crypto: ICryptoProvider, authKey: Uint8Array, messageKey: Uint8Array, client: boolean): Promise<IEncryptionScheme>;
|
|
22
|
+
/**
|
|
23
|
+
* Create AES IGE instance for file (given auth key and message key)
|
|
24
|
+
* as defined by MTProto v1.
|
|
25
|
+
*
|
|
26
|
+
* @param crypto Crypto provider
|
|
27
|
+
* @param authKey Authorization key
|
|
28
|
+
* @param messageKey Message key
|
|
29
|
+
* @param client Whether this is a client to server message
|
|
30
|
+
*/
|
|
31
|
+
export declare function createAesIgeForMessageOld(crypto: ICryptoProvider, authKey: Uint8Array, messageKey: Uint8Array, client: boolean): Promise<IEncryptionScheme>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { concatBuffers } from '../buffer-utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate AES key and IV from nonces as defined by MTProto.
|
|
4
|
+
* Used in authorization flow.
|
|
5
|
+
*
|
|
6
|
+
* @param crypto Crypto provider
|
|
7
|
+
* @param serverNonce Server nonce
|
|
8
|
+
* @param newNonce New nonce
|
|
9
|
+
* @returns Tuple: `[key, iv]`
|
|
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]));
|
|
15
|
+
const key = concatBuffers([hash1, hash2.subarray(0, 12)]);
|
|
16
|
+
const iv = concatBuffers([hash2.subarray(12, 20), hash3, newNonce.subarray(0, 4)]);
|
|
17
|
+
return [key, iv];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create AES IGE instance for message (given auth key and message key)
|
|
21
|
+
* as defined by MTProto v2.
|
|
22
|
+
*
|
|
23
|
+
* @param crypto Crypto provider
|
|
24
|
+
* @param authKey Authorization key
|
|
25
|
+
* @param messageKey Message key
|
|
26
|
+
* @param client Whether this is a client to server message
|
|
27
|
+
*/
|
|
28
|
+
export async function createAesIgeForMessage(crypto, authKey, messageKey, client) {
|
|
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]));
|
|
32
|
+
const key = concatBuffers([sha256a.subarray(0, 8), sha256b.subarray(8, 24), sha256a.subarray(24, 32)]);
|
|
33
|
+
const iv = concatBuffers([sha256b.subarray(0, 8), sha256a.subarray(8, 24), sha256b.subarray(24, 32)]);
|
|
34
|
+
return crypto.createAesIge(key, iv);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create AES IGE instance for file (given auth key and message key)
|
|
38
|
+
* as defined by MTProto v1.
|
|
39
|
+
*
|
|
40
|
+
* @param crypto Crypto provider
|
|
41
|
+
* @param authKey Authorization key
|
|
42
|
+
* @param messageKey Message key
|
|
43
|
+
* @param client Whether this is a client to server message
|
|
44
|
+
*/
|
|
45
|
+
export async function createAesIgeForMessageOld(crypto, authKey, messageKey, client) {
|
|
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)]));
|
|
51
|
+
const key = concatBuffers([sha1a.subarray(0, 8), sha1b.subarray(8, 20), sha1c.subarray(4, 16)]);
|
|
52
|
+
const iv = concatBuffers([
|
|
53
|
+
sha1a.subarray(8, 20),
|
|
54
|
+
sha1b.subarray(0, 8),
|
|
55
|
+
sha1c.subarray(16, 20),
|
|
56
|
+
sha1d.subarray(0, 8),
|
|
57
|
+
]);
|
|
58
|
+
return crypto.createAesIge(key, iv);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=mtproto.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { MaybeAsync } from '../../types/index.js';
|
|
2
|
+
import { BaseCryptoProvider, ICryptoProvider, IEncryptionScheme } from './abstract.js';
|
|
3
|
+
export declare class NodeCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {
|
|
4
|
+
createAesCtr(key: Uint8Array, iv: Uint8Array, encrypt: boolean): IEncryptionScheme;
|
|
5
|
+
createAesEcb(key: Uint8Array): IEncryptionScheme;
|
|
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): MaybeAsync<Uint8Array>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// eslint-disable-next-line no-restricted-imports
|
|
2
|
+
import { createCipheriv, createDecipheriv, createHash, createHmac, pbkdf2 } from 'crypto';
|
|
3
|
+
import { concatBuffers } from '../buffer-utils.js';
|
|
4
|
+
import { BaseCryptoProvider } from './abstract.js';
|
|
5
|
+
export class NodeCryptoProvider extends BaseCryptoProvider {
|
|
6
|
+
createAesCtr(key, iv, encrypt) {
|
|
7
|
+
const cipher = (encrypt ? createCipheriv : createDecipheriv)(`aes-${key.length * 8}-ctr`, key, iv);
|
|
8
|
+
const update = (data) => cipher.update(data);
|
|
9
|
+
return {
|
|
10
|
+
encrypt: update,
|
|
11
|
+
decrypt: update,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
createAesEcb(key) {
|
|
15
|
+
const methodName = `aes-${key.length * 8}-ecb`;
|
|
16
|
+
return {
|
|
17
|
+
encrypt(data) {
|
|
18
|
+
const cipher = createCipheriv(methodName, key, null);
|
|
19
|
+
cipher.setAutoPadding(false);
|
|
20
|
+
return concatBuffers([cipher.update(data), cipher.final()]);
|
|
21
|
+
},
|
|
22
|
+
decrypt(data) {
|
|
23
|
+
const cipher = createDecipheriv(methodName, key, null);
|
|
24
|
+
cipher.setAutoPadding(false);
|
|
25
|
+
return concatBuffers([cipher.update(data), cipher.final()]);
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
pbkdf2(password, salt, iterations, keylen = 64, algo = 'sha512') {
|
|
30
|
+
return new Promise((resolve, reject) => pbkdf2(password, salt, iterations, keylen, algo, (err, buf) => err !== null ? reject(err) : resolve(buf)));
|
|
31
|
+
}
|
|
32
|
+
sha1(data) {
|
|
33
|
+
return createHash('sha1').update(data).digest();
|
|
34
|
+
}
|
|
35
|
+
sha256(data) {
|
|
36
|
+
return createHash('sha256').update(data).digest();
|
|
37
|
+
}
|
|
38
|
+
hmacSha256(data, key) {
|
|
39
|
+
return createHmac('sha256', key).update(data).digest();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=node-crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-crypto.js","sourceRoot":"","sources":["../../../../src/utils/crypto/node-crypto.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAGzF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAsC,MAAM,eAAe,CAAA;AAEtF,MAAM,OAAO,kBAAmB,SAAQ,kBAAkB;IACtD,YAAY,CAAC,GAAe,EAAE,EAAc,EAAE,OAAgB;QAC1D,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QAElG,MAAM,MAAM,GAAG,CAAC,IAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAExD,OAAO;YACH,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,MAAM;SAClB,CAAA;IACL,CAAC;IAED,YAAY,CAAC,GAAe;QACxB,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,CAAA;QAE9C,OAAO;YACH,OAAO,CAAC,IAAgB;gBACpB,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;gBACpD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;gBAE5B,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAC/D,CAAC;YACD,OAAO,CAAC,IAAgB;gBACpB,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;gBACtD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;gBAE5B,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAC/D,CAAC;SACJ,CAAA;IACL,CAAC;IAED,MAAM,CACF,QAAoB,EACpB,IAAgB,EAChB,UAAkB,EAClB,MAAM,GAAG,EAAE,EACX,IAAI,GAAG,QAAQ;QAEf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CACnC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAiB,EAAE,GAAe,EAAE,EAAE,CACpF,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAC5C,CACJ,CAAA;IACL,CAAC;IAED,IAAI,CAAC,IAAgB;QACjB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAA;IACnD,CAAC;IAED,MAAM,CAAC,IAAgB;QACnB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAA;IACrD,CAAC;IAED,UAAU,CAAC,IAAgB,EAAE,GAAe;QACxC,OAAO,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAA;IAC1D,CAAC;CACJ","sourcesContent":["// eslint-disable-next-line no-restricted-imports\nimport { createCipheriv, createDecipheriv, createHash, createHmac, pbkdf2 } from 'crypto'\n\nimport { MaybeAsync } from '../../types/index.js'\nimport { concatBuffers } from '../buffer-utils.js'\nimport { BaseCryptoProvider, ICryptoProvider, IEncryptionScheme } from './abstract.js'\n\nexport class NodeCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {\n createAesCtr(key: Uint8Array, iv: Uint8Array, encrypt: boolean): IEncryptionScheme {\n const cipher = (encrypt ? createCipheriv : createDecipheriv)(`aes-${key.length * 8}-ctr`, key, iv)\n\n const update = (data: Uint8Array) => cipher.update(data)\n\n return {\n encrypt: update,\n decrypt: update,\n }\n }\n\n createAesEcb(key: Uint8Array): IEncryptionScheme {\n const methodName = `aes-${key.length * 8}-ecb`\n\n return {\n encrypt(data: Uint8Array) {\n const cipher = createCipheriv(methodName, key, null)\n cipher.setAutoPadding(false)\n\n return concatBuffers([cipher.update(data), cipher.final()])\n },\n decrypt(data: Uint8Array) {\n const cipher = createDecipheriv(methodName, key, null)\n cipher.setAutoPadding(false)\n\n return concatBuffers([cipher.update(data), cipher.final()])\n },\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): MaybeAsync<Uint8Array> {\n return createHmac('sha256', key).update(data).digest()\n }\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { tl } from '@mtcute/tl';
|
|
2
|
+
import { ICryptoProvider } from './abstract.js';
|
|
3
|
+
/**
|
|
4
|
+
* Compute password hash as defined by MTProto.
|
|
5
|
+
*
|
|
6
|
+
* See https://core.telegram.org/api/srp#checking-the-password-with-srp
|
|
7
|
+
*
|
|
8
|
+
* @param crypto Crypto provider
|
|
9
|
+
* @param password Password
|
|
10
|
+
* @param salt1 Salt 1
|
|
11
|
+
* @param salt2 Salt 2
|
|
12
|
+
*/
|
|
13
|
+
export declare function computePasswordHash(crypto: ICryptoProvider, password: Uint8Array, salt1: Uint8Array, salt2: Uint8Array): Promise<Uint8Array>;
|
|
14
|
+
/**
|
|
15
|
+
* Compute new password SRP hash as defined by MTProto.
|
|
16
|
+
*
|
|
17
|
+
* @param crypto Crypto provider
|
|
18
|
+
* @param algo KDF algorithm
|
|
19
|
+
* @param password Password
|
|
20
|
+
*/
|
|
21
|
+
export declare function computeNewPasswordHash(crypto: ICryptoProvider, algo: tl.RawPasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow, password: string): Promise<Uint8Array>;
|
|
22
|
+
/**
|
|
23
|
+
* Compute SRP check parameters for 2fa password as defined by MTProto.
|
|
24
|
+
*
|
|
25
|
+
* @param crypto Crypto provider
|
|
26
|
+
* @param request SRP request
|
|
27
|
+
* @param password 2fa password
|
|
28
|
+
*/
|
|
29
|
+
export declare function computeSrpParams(crypto: ICryptoProvider, request: tl.account.RawPassword, password: string): Promise<tl.RawInputCheckPasswordSRP>;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import bigInt from 'big-integer';
|
|
2
|
+
import { utf8EncodeToBuffer } from '@mtcute/tl-runtime';
|
|
3
|
+
import { MtSecurityError, MtUnsupportedError } from '../../types/errors.js';
|
|
4
|
+
import { bigIntToBuffer, bufferToBigInt } from '../bigint-utils.js';
|
|
5
|
+
import { concatBuffers, randomBytes } from '../buffer-utils.js';
|
|
6
|
+
import { xorBuffer } from './utils.js';
|
|
7
|
+
/**
|
|
8
|
+
* Compute password hash as defined by MTProto.
|
|
9
|
+
*
|
|
10
|
+
* See https://core.telegram.org/api/srp#checking-the-password-with-srp
|
|
11
|
+
*
|
|
12
|
+
* @param crypto Crypto provider
|
|
13
|
+
* @param password Password
|
|
14
|
+
* @param salt1 Salt 1
|
|
15
|
+
* @param salt2 Salt 2
|
|
16
|
+
*/
|
|
17
|
+
export async function computePasswordHash(crypto, password, salt1, salt2) {
|
|
18
|
+
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);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Compute new password SRP hash as defined by MTProto.
|
|
24
|
+
*
|
|
25
|
+
* @param crypto Crypto provider
|
|
26
|
+
* @param algo KDF algorithm
|
|
27
|
+
* @param password Password
|
|
28
|
+
*/
|
|
29
|
+
export async function computeNewPasswordHash(crypto, algo, password) {
|
|
30
|
+
algo.salt1 = concatBuffers([algo.salt1, randomBytes(32)]);
|
|
31
|
+
const _x = await computePasswordHash(crypto, utf8EncodeToBuffer(password), algo.salt1, algo.salt2);
|
|
32
|
+
const g = bigInt(algo.g);
|
|
33
|
+
const p = bufferToBigInt(algo.p);
|
|
34
|
+
const x = bufferToBigInt(_x);
|
|
35
|
+
return bigIntToBuffer(g.modPow(x, p), 256);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Compute SRP check parameters for 2fa password as defined by MTProto.
|
|
39
|
+
*
|
|
40
|
+
* @param crypto Crypto provider
|
|
41
|
+
* @param request SRP request
|
|
42
|
+
* @param password 2fa password
|
|
43
|
+
*/
|
|
44
|
+
export async function computeSrpParams(crypto, request, password) {
|
|
45
|
+
// nice naming thx durov
|
|
46
|
+
if (!request.currentAlgo ||
|
|
47
|
+
request.currentAlgo._ !== 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow') {
|
|
48
|
+
throw new MtUnsupportedError(`Unknown algo ${request.currentAlgo?._}`);
|
|
49
|
+
}
|
|
50
|
+
const algo = request.currentAlgo;
|
|
51
|
+
// here and after: underscored variables are buffers, non-underscored are bigInts
|
|
52
|
+
if (!request.srpB) {
|
|
53
|
+
throw new MtSecurityError('SRP_B is not present in the request');
|
|
54
|
+
}
|
|
55
|
+
if (!request.srpId) {
|
|
56
|
+
throw new MtSecurityError('SRP_ID is not present in the request');
|
|
57
|
+
}
|
|
58
|
+
const g = bigInt(algo.g);
|
|
59
|
+
const _g = bigIntToBuffer(g, 256);
|
|
60
|
+
const p = bufferToBigInt(algo.p);
|
|
61
|
+
const gB = bufferToBigInt(request.srpB);
|
|
62
|
+
const a = bufferToBigInt(randomBytes(256));
|
|
63
|
+
const gA = g.modPow(a, p);
|
|
64
|
+
const _gA = bigIntToBuffer(gA, 256);
|
|
65
|
+
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
|
+
]);
|
|
72
|
+
const k = bufferToBigInt(_k);
|
|
73
|
+
const u = bufferToBigInt(_u);
|
|
74
|
+
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
|
+
]));
|
|
90
|
+
return {
|
|
91
|
+
_: 'inputCheckPasswordSRP',
|
|
92
|
+
srpId: request.srpId,
|
|
93
|
+
A: _gA,
|
|
94
|
+
M1: _M1,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=password.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { MaybeAsync } from '../../index.js';
|
|
2
|
+
import { BaseCryptoProvider, ICryptoProvider, IEncryptionScheme } from './abstract.js';
|
|
3
|
+
export declare class SubtleCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {
|
|
4
|
+
readonly subtle: SubtleCrypto;
|
|
5
|
+
constructor(subtle: SubtleCrypto);
|
|
6
|
+
sha1(data: Uint8Array): MaybeAsync<Uint8Array>;
|
|
7
|
+
sha256(data: Uint8Array): MaybeAsync<Uint8Array>;
|
|
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
|
+
createAesCtr(key: Uint8Array, iv: Uint8Array): IEncryptionScheme;
|
|
11
|
+
createAesEcb(key: Uint8Array): IEncryptionScheme;
|
|
12
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { BaseCryptoProvider } from './abstract.js';
|
|
2
|
+
import AES_, { CTR } from '@cryptography/aes';
|
|
3
|
+
const AES = 'default' in AES_ ? AES_.default : AES_;
|
|
4
|
+
const ALGO_TO_SUBTLE = {
|
|
5
|
+
sha256: 'SHA-256',
|
|
6
|
+
sha1: 'SHA-1',
|
|
7
|
+
sha512: 'SHA-512',
|
|
8
|
+
};
|
|
9
|
+
function wordsToBytes(words) {
|
|
10
|
+
const o = new Uint8Array(words.byteLength);
|
|
11
|
+
const len = words.length * 4;
|
|
12
|
+
for (let i = 0; i < len; ++i) {
|
|
13
|
+
o[i] = ((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);
|
|
14
|
+
}
|
|
15
|
+
return o;
|
|
16
|
+
}
|
|
17
|
+
export class SubtleCryptoProvider extends BaseCryptoProvider {
|
|
18
|
+
constructor(subtle) {
|
|
19
|
+
super();
|
|
20
|
+
this.subtle = subtle;
|
|
21
|
+
}
|
|
22
|
+
sha1(data) {
|
|
23
|
+
return this.subtle.digest('SHA-1', data).then((result) => new Uint8Array(result));
|
|
24
|
+
}
|
|
25
|
+
sha256(data) {
|
|
26
|
+
return this.subtle.digest('SHA-256', data).then((result) => new Uint8Array(result));
|
|
27
|
+
}
|
|
28
|
+
async pbkdf2(password, salt, iterations, keylen, algo) {
|
|
29
|
+
const keyMaterial = await this.subtle.importKey('raw', password, 'PBKDF2', false, ['deriveBits']);
|
|
30
|
+
return this.subtle
|
|
31
|
+
.deriveBits({
|
|
32
|
+
name: 'PBKDF2',
|
|
33
|
+
salt,
|
|
34
|
+
iterations,
|
|
35
|
+
hash: algo ? ALGO_TO_SUBTLE[algo] : 'SHA-512',
|
|
36
|
+
}, keyMaterial, (keylen || 64) * 8)
|
|
37
|
+
.then((result) => new Uint8Array(result));
|
|
38
|
+
}
|
|
39
|
+
async hmacSha256(data, key) {
|
|
40
|
+
const keyMaterial = await this.subtle.importKey('raw', key, { name: 'HMAC', hash: { name: 'SHA-256' } }, false, ['sign']);
|
|
41
|
+
const res = await this.subtle.sign({ name: 'HMAC' }, keyMaterial, data);
|
|
42
|
+
return new Uint8Array(res);
|
|
43
|
+
}
|
|
44
|
+
createAesCtr(key, iv) {
|
|
45
|
+
const aes = new CTR(key, iv);
|
|
46
|
+
return {
|
|
47
|
+
encrypt: (data) => wordsToBytes(aes.encrypt(data)),
|
|
48
|
+
decrypt: (data) => wordsToBytes(aes.decrypt(data)),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
createAesEcb(key) {
|
|
52
|
+
const aes = new AES(key);
|
|
53
|
+
return {
|
|
54
|
+
encrypt: (data) => wordsToBytes(aes.encrypt(data)),
|
|
55
|
+
decrypt: (data) => wordsToBytes(aes.decrypt(data)),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=subtle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subtle.js","sourceRoot":"","sources":["../../../../src/utils/crypto/subtle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAsC,MAAM,eAAe,CAAA;AAEtF,OAAO,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAK7C,MAAM,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAY,CAAA;AAE3D,MAAM,cAAc,GAA2B;IAC3C,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,OAAO;IACb,MAAM,EAAE,SAAS;CACpB,CAAA;AAED,SAAS,YAAY,CAAC,KAAkB;IACpC,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAE1C,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE;QAC1B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;KAC1D;IAED,OAAO,CAAC,CAAA;AACZ,CAAC;AAED,MAAM,OAAO,oBAAqB,SAAQ,kBAAkB;IACxD,YACa,MAAoB;QAE7B,KAAK,EAAE,CAAA;QAFE,WAAM,GAAN,MAAM,CAAc;IAGjC,CAAC;IAED,IAAI,CAAC,IAAgB;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;IACrF,CAAC;IAED,MAAM,CAAC,IAAgB;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;IACvF,CAAC;IAED,KAAK,CAAC,MAAM,CACR,QAAoB,EACpB,IAAgB,EAChB,UAAkB,EAClB,MAA2B,EAC3B,IAAyB;QAEzB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;QAEjG,OAAO,IAAI,CAAC,MAAM;aACb,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,SAAS,CAC3C,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,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;QAEvE,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;IAC9B,CAAC;IAED,YAAY,CAAC,GAAe,EAAE,EAAc;QACxC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAE5B,OAAO;YACH,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SACrD,CAAA;IACL,CAAC;IAED,YAAY,CAAC,GAAe;QACxB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QAExB,OAAO;YACH,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SACrD,CAAA;IACL,CAAC;CACJ","sourcesContent":["import { MaybeAsync } from '../../index.js'\nimport { BaseCryptoProvider, ICryptoProvider, IEncryptionScheme } from './abstract.js'\n\nimport AES_, { CTR } from '@cryptography/aes'\n\n// fucking weird flex with es modules.\n// i hate default imports please for the love of god never use them\ntype AES_ = typeof AES_.default\nconst AES = 'default' in AES_ ? AES_.default : AES_ as AES_\n\nconst ALGO_TO_SUBTLE: Record<string, string> = {\n sha256: 'SHA-256',\n sha1: 'SHA-1',\n sha512: 'SHA-512',\n}\n\nfunction wordsToBytes(words: Uint32Array): Uint8Array {\n const o = new Uint8Array(words.byteLength)\n\n const len = words.length * 4\n\n for (let i = 0; i < len; ++i) {\n o[i] = ((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)\n }\n\n return o\n}\n\nexport class SubtleCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {\n constructor(\n readonly subtle: SubtleCrypto,\n ) {\n super()\n }\n\n sha1(data: Uint8Array): MaybeAsync<Uint8Array> {\n return this.subtle.digest('SHA-1', data).then((result) => new Uint8Array(result))\n }\n\n sha256(data: Uint8Array): MaybeAsync<Uint8Array> {\n return this.subtle.digest('SHA-256', data).then((result) => new Uint8Array(result))\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.subtle.importKey('raw', password, 'PBKDF2', false, ['deriveBits'])\n\n return this.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.subtle.importKey(\n 'raw',\n key,\n { name: 'HMAC', hash: { name: 'SHA-256' } },\n false,\n ['sign'],\n )\n\n const res = await this.subtle.sign({ name: 'HMAC' }, keyMaterial, data)\n\n return new Uint8Array(res)\n }\n\n createAesCtr(key: Uint8Array, iv: Uint8Array): IEncryptionScheme {\n const aes = new CTR(key, iv)\n\n return {\n encrypt: (data) => wordsToBytes(aes.encrypt(data)),\n decrypt: (data) => wordsToBytes(aes.decrypt(data)),\n }\n }\n\n createAesEcb(key: Uint8Array): IEncryptionScheme {\n const aes = new AES(key)\n\n return {\n encrypt: (data) => wordsToBytes(aes.encrypt(data)),\n decrypt: (data) => wordsToBytes(aes.decrypt(data)),\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perform XOR operation on two buffers and return the new buffer
|
|
3
|
+
*
|
|
4
|
+
* @param data Buffer to XOR
|
|
5
|
+
* @param key Key to XOR with
|
|
6
|
+
*/
|
|
7
|
+
export declare function xorBuffer(data: Uint8Array, key: Uint8Array): Uint8Array;
|
|
8
|
+
/**
|
|
9
|
+
* Perform XOR operation on two buffers in-place
|
|
10
|
+
*
|
|
11
|
+
* @param data Buffer to XOR
|
|
12
|
+
* @param key Key to XOR with
|
|
13
|
+
*/
|
|
14
|
+
export declare function xorBufferInPlace(data: Uint8Array, key: Uint8Array): void;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perform XOR operation on two buffers and return the new buffer
|
|
3
|
+
*
|
|
4
|
+
* @param data Buffer to XOR
|
|
5
|
+
* @param key Key to XOR with
|
|
6
|
+
*/
|
|
7
|
+
export function xorBuffer(data, key) {
|
|
8
|
+
const ret = new Uint8Array(data.length);
|
|
9
|
+
for (let i = 0; i < data.length; i++) {
|
|
10
|
+
ret[i] = data[i] ^ key[i];
|
|
11
|
+
}
|
|
12
|
+
return ret;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Perform XOR operation on two buffers in-place
|
|
16
|
+
*
|
|
17
|
+
* @param data Buffer to XOR
|
|
18
|
+
* @param key Key to XOR with
|
|
19
|
+
*/
|
|
20
|
+
export function xorBufferInPlace(data, key) {
|
|
21
|
+
for (let i = 0; i < data.length; i++) {
|
|
22
|
+
data[i] ^= key[i];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/utils/crypto/utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,IAAgB,EAAE,GAAe;IACvD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAClC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;KAC5B;IAED,OAAO,GAAG,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAgB,EAAE,GAAe;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAClC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;KACpB;AACL,CAAC","sourcesContent":["/**\n * Perform XOR operation on two buffers and return the new buffer\n *\n * @param data Buffer to XOR\n * @param key Key to XOR with\n */\nexport function xorBuffer(data: Uint8Array, key: Uint8Array): Uint8Array {\n const ret = new Uint8Array(data.length)\n\n for (let i = 0; i < data.length; i++) {\n ret[i] = data[i] ^ key[i]\n }\n\n return ret\n}\n\n/**\n * Perform XOR operation on two buffers in-place\n *\n * @param data Buffer to XOR\n * @param key Key to XOR with\n */\nexport function xorBufferInPlace(data: Uint8Array, key: Uint8Array): void {\n for (let i = 0; i < data.length; i++) {\n data[i] ^= key[i]\n }\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ITelegramStorage } from '../storage/abstract.js';
|
|
2
|
+
export declare const defaultDcs: {
|
|
3
|
+
readonly defaultTestDc: ITelegramStorage.DcOptions;
|
|
4
|
+
readonly defaultTestIpv6Dc: ITelegramStorage.DcOptions;
|
|
5
|
+
readonly defaultProductionDc: ITelegramStorage.DcOptions;
|
|
6
|
+
readonly defaultProductionIpv6Dc: ITelegramStorage.DcOptions;
|
|
7
|
+
};
|