@mtcute/core 0.1.1 → 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/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/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/network-manager.js +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.js +3 -2
- package/cjs/network/session-connection.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 +1 -1
- 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/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.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.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.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.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/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.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.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.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.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/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.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.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/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.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.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.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/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.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/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/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/network-manager.js +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.js +3 -2
- package/esm/network/session-connection.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 +1 -1
- 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/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.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.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.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.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/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.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.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.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.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/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.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.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/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.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.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.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/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.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 +2 -2
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const index_js_1 = require("./index.js");
|
|
5
|
+
const miller_rabin_js_1 = require("./miller-rabin.js");
|
|
6
|
+
(0, vitest_1.describe)('miller-rabin test', function () {
|
|
7
|
+
// miller-rabin factorization relies on RNG, so we should use a real random number generator
|
|
8
|
+
const c = (0, index_js_1.defaultCryptoProviderFactory)();
|
|
9
|
+
const testMillerRabin = (n, isPrime) => {
|
|
10
|
+
(0, vitest_1.expect)((0, miller_rabin_js_1.millerRabin)(c, BigInt(n))).eq(isPrime);
|
|
11
|
+
};
|
|
12
|
+
(0, vitest_1.it)('should correctly label small primes as probable primes', () => {
|
|
13
|
+
const smallOddPrimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31];
|
|
14
|
+
for (const prime of smallOddPrimes) {
|
|
15
|
+
testMillerRabin(prime, true);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
(0, vitest_1.it)('should correctly label small odd composite numbers as composite', () => {
|
|
19
|
+
const smallOddPrimes = [9, 15, 21, 25, 27, 33, 35];
|
|
20
|
+
for (const prime of smallOddPrimes) {
|
|
21
|
+
testMillerRabin(prime, false);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
// primes are generated using `openssl prime -generate -bits <bits>`
|
|
25
|
+
(0, vitest_1.it)('should work for 512-bit numbers', () => {
|
|
26
|
+
testMillerRabin('8411445470921866378538628788380866906358949375899610911537071281076627385046125382763689993349183284546479522400013151510610266158235924343045768103605519', true);
|
|
27
|
+
testMillerRabin('11167561990563990242158096122232207092938761092751537312016255867850441858086589598418467012717458858604863547175649456433632887622140170743409535470973399', true);
|
|
28
|
+
testMillerRabin('11006717791910450367418249787526506184731090161438431250022510598653874155081488487035840577645711578911087148186160668569071839053453201592321650008610329', true);
|
|
29
|
+
testMillerRabin('12224330340162812215033324917156282302617911690617664923428569636370785775561435789211091021550357876767050350997458404009005800772805534351607294516706177', true);
|
|
30
|
+
// above numbers but -2 (not prime)
|
|
31
|
+
testMillerRabin('8411445470921866378538628788380866906358949375899610911537071281076627385046125382763689993349183284546479522400013151510610266158235924343045768103605517', false);
|
|
32
|
+
testMillerRabin('11167561990563990242158096122232207092938761092751537312016255867850441858086589598418467012717458858604863547175649456433632887622140170743409535470973397', false);
|
|
33
|
+
testMillerRabin('11006717791910450367418249787526506184731090161438431250022510598653874155081488487035840577645711578911087148186160668569071839053453201592321650008610327', false);
|
|
34
|
+
testMillerRabin('12224330340162812215033324917156282302617911690617664923428569636370785775561435789211091021550357876767050350997458404009005800772805534351607294516706175', false);
|
|
35
|
+
});
|
|
36
|
+
(0, vitest_1.it)('should work for 1024-bit numbers', () => {
|
|
37
|
+
testMillerRabin('94163180970530844245052892199633535954736903357996153321496979115367320260897793334681106861766748541439161886270777106456088209508872459550450259737267142959061663564218457086654112219462515165219295402175541003899136060178102898376369981338103600856012709228116661479275753497725541132207243717937379815409', true);
|
|
38
|
+
testMillerRabin('97324962433497727515811278760066576725849776656602017497363465683978397629803148191267105308901733336070351381654371470561376353774017284623969415330564867697353080030917333974193741719718950105404732792050882127213356260415251087867407489400712288570880407613514781891914135956778687719588061176455381937003', true);
|
|
39
|
+
testMillerRabin('92511311413226091818378551616231701579277597795073142338527410334932345968554993390789667936819230228388142960299649466238701015865565141753710450319875546944139442823075990348978746055937500467483161699883905850192191164043687791185635729923497381849380102040768674652775240505782671289535260164547714030567', true);
|
|
40
|
+
testMillerRabin('98801756216479639848708157708947504990501845258427605711852570166662700681215707617225664134994147912417941920327932092748574265476658124536672887141144222716123085451749764522435906007567360583062117498919471220566974634924384147341592903939264267901029640119196259026154529723870788246284629644039137378253', true);
|
|
41
|
+
// above numbers but -2 (not prime)
|
|
42
|
+
testMillerRabin('94163180970530844245052892199633535954736903357996153321496979115367320260897793334681106861766748541439161886270777106456088209508872459550450259737267142959061663564218457086654112219462515165219295402175541003899136060178102898376369981338103600856012709228116661479275753497725541132207243717937379815407', false);
|
|
43
|
+
testMillerRabin('97324962433497727515811278760066576725849776656602017497363465683978397629803148191267105308901733336070351381654371470561376353774017284623969415330564867697353080030917333974193741719718950105404732792050882127213356260415251087867407489400712288570880407613514781891914135956778687719588061176455381937001', false);
|
|
44
|
+
testMillerRabin('92511311413226091818378551616231701579277597795073142338527410334932345968554993390789667936819230228388142960299649466238701015865565141753710450319875546944139442823075990348978746055937500467483161699883905850192191164043687791185635729923497381849380102040768674652775240505782671289535260164547714030565', false);
|
|
45
|
+
testMillerRabin('98801756216479639848708157708947504990501845258427605711852570166662700681215707617225664134994147912417941920327932092748574265476658124536672887141144222716123085451749764522435906007567360583062117498919471220566974634924384147341592903939264267901029640119196259026154529723870788246284629644039137378251', false);
|
|
46
|
+
});
|
|
47
|
+
(0, vitest_1.it)('should work for 2048-bit numbers', () => {
|
|
48
|
+
testMillerRabin('28608382334358769588283288249494859626901014972463291352091976543138105382282108662849885913053034513852843449409838151123568984617793641641937583673207501643041336002587032201383537626393235736734494131431069043382068545865505150651648610506542819001961332454611129372758714288168807328523359776577571626967649079147416191592855529888846889532625386469236278694936872628305052827422772792103722178298844645210242389265273407924858034431614414896134561928996888883994953322861399988094086562513898527391555490352156627307769278185444897960555995383228897584818577375695810423475039211516849716140051437120083274285367', true);
|
|
49
|
+
testMillerRabin('30244022694659482453371920976249272809817388822378671144866806600284132009663832003348737406289715119965835410140834733465553787513841966120831322372642881643693711233087233983267648392814127424201572290931937482043046169402667397610783447368703776842799852222745601531140231486417855517072392416789672922529566643118973930252809010605519948446055538976582290902060054788109497630796585770940656002892943575479533099350429655210881833493066716819282707441553612603960556051122162329171373373251909387401572866056121964608595895425640834764028568120995397759283490218181167000161310959711677055741632674632758727382743', true);
|
|
50
|
+
testMillerRabin('30560953105766401423987964658775999222308579908395527900931049506803845883459894704297458477118152899910620180302473409631442956208933061650967001020981432894530064472547770442696756724169958362395601360296775798187903794894866967342028337982275745956538015473621792510615113531964380246815875830970404687926061637030085629909804357717955251735074071072456074274947993921828878633638119117086342305530526661796817095624933200483138188878398983149622639425550360394901699701985050966685840649129419227936413574227792077082510807968104733387734970009620450108276446659342203263759999068046251645984039420643003580284779', true);
|
|
51
|
+
// above numbers but -2 (not prime)
|
|
52
|
+
testMillerRabin('28608382334358769588283288249494859626901014972463291352091976543138105382282108662849885913053034513852843449409838151123568984617793641641937583673207501643041336002587032201383537626393235736734494131431069043382068545865505150651648610506542819001961332454611129372758714288168807328523359776577571626967649079147416191592855529888846889532625386469236278694936872628305052827422772792103722178298844645210242389265273407924858034431614414896134561928996888883994953322861399988094086562513898527391555490352156627307769278185444897960555995383228897584818577375695810423475039211516849716140051437120083274285365', false);
|
|
53
|
+
testMillerRabin('30244022694659482453371920976249272809817388822378671144866806600284132009663832003348737406289715119965835410140834733465553787513841966120831322372642881643693711233087233983267648392814127424201572290931937482043046169402667397610783447368703776842799852222745601531140231486417855517072392416789672922529566643118973930252809010605519948446055538976582290902060054788109497630796585770940656002892943575479533099350429655210881833493066716819282707441553612603960556051122162329171373373251909387401572866056121964608595895425640834764028568120995397759283490218181167000161310959711677055741632674632758727382741', false);
|
|
54
|
+
testMillerRabin('30560953105766401423987964658775999222308579908395527900931049506803845883459894704297458477118152899910620180302473409631442956208933061650967001020981432894530064472547770442696756724169958362395601360296775798187903794894866967342028337982275745956538015473621792510615113531964380246815875830970404687926061637030085629909804357717955251735074071072456074274947993921828878633638119117086342305530526661796817095624933200483138188878398983149622639425550360394901699701985050966685840649129419227936413574227792077082510807968104733387734970009620450108276446659342203263759999068046251645984039420643003580284777', false);
|
|
55
|
+
// dh_prime used by telegram, as seen in https://core.telegram.org/mtproto/security_guidelines
|
|
56
|
+
const telegramDhPrime = 'C7 1C AE B9 C6 B1 C9 04 8E 6C 52 2F 70 F1 3F 73 98 0D 40 23 8E 3E 21 C1 49 34 D0 37 56 3D 93 0F 48 19 8A 0A A7 C1 40 58 22 94 93 D2 25 30 F4 DB FA 33 6F 6E 0A C9 25 13 95 43 AE D4 4C CE 7C 37 20 FD 51 F6 94 58 70 5A C6 8C D4 FE 6B 6B 13 AB DC 97 46 51 29 69 32 84 54 F1 8F AF 8C 59 5F 64 24 77 FE 96 BB 2A 94 1D 5B CD 1D 4A C8 CC 49 88 07 08 FA 9B 37 8E 3C 4F 3A 90 60 BE E6 7C F9 A4 A4 A6 95 81 10 51 90 7E 16 27 53 B5 6B 0F 6B 41 0D BA 74 D8 A8 4B 2A 14 B3 14 4E 0E F1 28 47 54 FD 17 ED 95 0D 59 65 B4 B9 DD 46 58 2D B1 17 8D 16 9C 6B C4 65 B0 D6 FF 9C A3 92 8F EF 5B 9A E4 E4 18 FC 15 E8 3E BE A0 F8 7F A9 FF 5E ED 70 05 0D ED 28 49 F4 7B F9 59 D9 56 85 0C E9 29 85 1F 0D 81 15 F6 35 B1 05 EE 2E 4E 15 D0 4B 24 54 BF 6F 4F AD F0 34 B1 04 03 11 9C D8 E3 B9 2F CC 5B';
|
|
57
|
+
testMillerRabin(BigInt('0x' + telegramDhPrime.replace(/ /g, '')), true);
|
|
58
|
+
});
|
|
59
|
+
}, { timeout: 10000 }); // since miller-rabin factorization relies on RNG, it may take a while (or may not!)
|
|
60
|
+
//# sourceMappingURL=miller-rabin.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"miller-rabin.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/miller-rabin.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { defaultCryptoProviderFactory } from './index.js'\nimport { millerRabin } from './miller-rabin.js'\n\ndescribe(\n 'miller-rabin test',\n function () {\n // miller-rabin factorization relies on RNG, so we should use a real random number generator\n const c = defaultCryptoProviderFactory()\n\n const testMillerRabin = (n: number | string | bigint, isPrime: boolean) => {\n expect(millerRabin(c, BigInt(n))).eq(isPrime)\n }\n\n it('should correctly label small primes as probable primes', () => {\n const smallOddPrimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]\n\n for (const prime of smallOddPrimes) {\n testMillerRabin(prime, true)\n }\n })\n\n it('should correctly label small odd composite numbers as composite', () => {\n const smallOddPrimes = [9, 15, 21, 25, 27, 33, 35]\n\n for (const prime of smallOddPrimes) {\n testMillerRabin(prime, false)\n }\n })\n\n // primes are generated using `openssl prime -generate -bits <bits>`\n\n it('should work for 512-bit numbers', () => {\n testMillerRabin(\n '8411445470921866378538628788380866906358949375899610911537071281076627385046125382763689993349183284546479522400013151510610266158235924343045768103605519',\n true,\n )\n testMillerRabin(\n '11167561990563990242158096122232207092938761092751537312016255867850441858086589598418467012717458858604863547175649456433632887622140170743409535470973399',\n true,\n )\n testMillerRabin(\n '11006717791910450367418249787526506184731090161438431250022510598653874155081488487035840577645711578911087148186160668569071839053453201592321650008610329',\n true,\n )\n testMillerRabin(\n '12224330340162812215033324917156282302617911690617664923428569636370785775561435789211091021550357876767050350997458404009005800772805534351607294516706177',\n true,\n )\n\n // above numbers but -2 (not prime)\n testMillerRabin(\n '8411445470921866378538628788380866906358949375899610911537071281076627385046125382763689993349183284546479522400013151510610266158235924343045768103605517',\n false,\n )\n testMillerRabin(\n '11167561990563990242158096122232207092938761092751537312016255867850441858086589598418467012717458858604863547175649456433632887622140170743409535470973397',\n false,\n )\n testMillerRabin(\n '11006717791910450367418249787526506184731090161438431250022510598653874155081488487035840577645711578911087148186160668569071839053453201592321650008610327',\n false,\n )\n testMillerRabin(\n '12224330340162812215033324917156282302617911690617664923428569636370785775561435789211091021550357876767050350997458404009005800772805534351607294516706175',\n false,\n )\n })\n\n it('should work for 1024-bit numbers', () => {\n testMillerRabin(\n '94163180970530844245052892199633535954736903357996153321496979115367320260897793334681106861766748541439161886270777106456088209508872459550450259737267142959061663564218457086654112219462515165219295402175541003899136060178102898376369981338103600856012709228116661479275753497725541132207243717937379815409',\n true,\n )\n testMillerRabin(\n '97324962433497727515811278760066576725849776656602017497363465683978397629803148191267105308901733336070351381654371470561376353774017284623969415330564867697353080030917333974193741719718950105404732792050882127213356260415251087867407489400712288570880407613514781891914135956778687719588061176455381937003',\n true,\n )\n testMillerRabin(\n '92511311413226091818378551616231701579277597795073142338527410334932345968554993390789667936819230228388142960299649466238701015865565141753710450319875546944139442823075990348978746055937500467483161699883905850192191164043687791185635729923497381849380102040768674652775240505782671289535260164547714030567',\n true,\n )\n testMillerRabin(\n '98801756216479639848708157708947504990501845258427605711852570166662700681215707617225664134994147912417941920327932092748574265476658124536672887141144222716123085451749764522435906007567360583062117498919471220566974634924384147341592903939264267901029640119196259026154529723870788246284629644039137378253',\n true,\n )\n\n // above numbers but -2 (not prime)\n testMillerRabin(\n '94163180970530844245052892199633535954736903357996153321496979115367320260897793334681106861766748541439161886270777106456088209508872459550450259737267142959061663564218457086654112219462515165219295402175541003899136060178102898376369981338103600856012709228116661479275753497725541132207243717937379815407',\n false,\n )\n testMillerRabin(\n '97324962433497727515811278760066576725849776656602017497363465683978397629803148191267105308901733336070351381654371470561376353774017284623969415330564867697353080030917333974193741719718950105404732792050882127213356260415251087867407489400712288570880407613514781891914135956778687719588061176455381937001',\n false,\n )\n testMillerRabin(\n '92511311413226091818378551616231701579277597795073142338527410334932345968554993390789667936819230228388142960299649466238701015865565141753710450319875546944139442823075990348978746055937500467483161699883905850192191164043687791185635729923497381849380102040768674652775240505782671289535260164547714030565',\n false,\n )\n testMillerRabin(\n '98801756216479639848708157708947504990501845258427605711852570166662700681215707617225664134994147912417941920327932092748574265476658124536672887141144222716123085451749764522435906007567360583062117498919471220566974634924384147341592903939264267901029640119196259026154529723870788246284629644039137378251',\n false,\n )\n })\n\n it('should work for 2048-bit numbers', () => {\n testMillerRabin(\n '28608382334358769588283288249494859626901014972463291352091976543138105382282108662849885913053034513852843449409838151123568984617793641641937583673207501643041336002587032201383537626393235736734494131431069043382068545865505150651648610506542819001961332454611129372758714288168807328523359776577571626967649079147416191592855529888846889532625386469236278694936872628305052827422772792103722178298844645210242389265273407924858034431614414896134561928996888883994953322861399988094086562513898527391555490352156627307769278185444897960555995383228897584818577375695810423475039211516849716140051437120083274285367',\n true,\n )\n testMillerRabin(\n '30244022694659482453371920976249272809817388822378671144866806600284132009663832003348737406289715119965835410140834733465553787513841966120831322372642881643693711233087233983267648392814127424201572290931937482043046169402667397610783447368703776842799852222745601531140231486417855517072392416789672922529566643118973930252809010605519948446055538976582290902060054788109497630796585770940656002892943575479533099350429655210881833493066716819282707441553612603960556051122162329171373373251909387401572866056121964608595895425640834764028568120995397759283490218181167000161310959711677055741632674632758727382743',\n true,\n )\n testMillerRabin(\n '30560953105766401423987964658775999222308579908395527900931049506803845883459894704297458477118152899910620180302473409631442956208933061650967001020981432894530064472547770442696756724169958362395601360296775798187903794894866967342028337982275745956538015473621792510615113531964380246815875830970404687926061637030085629909804357717955251735074071072456074274947993921828878633638119117086342305530526661796817095624933200483138188878398983149622639425550360394901699701985050966685840649129419227936413574227792077082510807968104733387734970009620450108276446659342203263759999068046251645984039420643003580284779',\n true,\n )\n\n // above numbers but -2 (not prime)\n testMillerRabin(\n '28608382334358769588283288249494859626901014972463291352091976543138105382282108662849885913053034513852843449409838151123568984617793641641937583673207501643041336002587032201383537626393235736734494131431069043382068545865505150651648610506542819001961332454611129372758714288168807328523359776577571626967649079147416191592855529888846889532625386469236278694936872628305052827422772792103722178298844645210242389265273407924858034431614414896134561928996888883994953322861399988094086562513898527391555490352156627307769278185444897960555995383228897584818577375695810423475039211516849716140051437120083274285365',\n false,\n )\n testMillerRabin(\n '30244022694659482453371920976249272809817388822378671144866806600284132009663832003348737406289715119965835410140834733465553787513841966120831322372642881643693711233087233983267648392814127424201572290931937482043046169402667397610783447368703776842799852222745601531140231486417855517072392416789672922529566643118973930252809010605519948446055538976582290902060054788109497630796585770940656002892943575479533099350429655210881833493066716819282707441553612603960556051122162329171373373251909387401572866056121964608595895425640834764028568120995397759283490218181167000161310959711677055741632674632758727382741',\n false,\n )\n testMillerRabin(\n '30560953105766401423987964658775999222308579908395527900931049506803845883459894704297458477118152899910620180302473409631442956208933061650967001020981432894530064472547770442696756724169958362395601360296775798187903794894866967342028337982275745956538015473621792510615113531964380246815875830970404687926061637030085629909804357717955251735074071072456074274947993921828878633638119117086342305530526661796817095624933200483138188878398983149622639425550360394901699701985050966685840649129419227936413574227792077082510807968104733387734970009620450108276446659342203263759999068046251645984039420643003580284777',\n false,\n )\n\n // dh_prime used by telegram, as seen in https://core.telegram.org/mtproto/security_guidelines\n const telegramDhPrime =\n 'C7 1C AE B9 C6 B1 C9 04 8E 6C 52 2F 70 F1 3F 73 98 0D 40 23 8E 3E 21 C1 49 34 D0 37 56 3D 93 0F 48 19 8A 0A A7 C1 40 58 22 94 93 D2 25 30 F4 DB FA 33 6F 6E 0A C9 25 13 95 43 AE D4 4C CE 7C 37 20 FD 51 F6 94 58 70 5A C6 8C D4 FE 6B 6B 13 AB DC 97 46 51 29 69 32 84 54 F1 8F AF 8C 59 5F 64 24 77 FE 96 BB 2A 94 1D 5B CD 1D 4A C8 CC 49 88 07 08 FA 9B 37 8E 3C 4F 3A 90 60 BE E6 7C F9 A4 A4 A6 95 81 10 51 90 7E 16 27 53 B5 6B 0F 6B 41 0D BA 74 D8 A8 4B 2A 14 B3 14 4E 0E F1 28 47 54 FD 17 ED 95 0D 59 65 B4 B9 DD 46 58 2D B1 17 8D 16 9C 6B C4 65 B0 D6 FF 9C A3 92 8F EF 5B 9A E4 E4 18 FC 15 E8 3E BE A0 F8 7F A9 FF 5E ED 70 05 0D ED 28 49 F4 7B F9 59 D9 56 85 0C E9 29 85 1F 0D 81 15 F6 35 B1 05 EE 2E 4E 15 D0 4B 24 54 BF 6F 4F AD F0 34 B1 04 03 11 9C D8 E3 B9 2F CC 5B'\n testMillerRabin(BigInt('0x' + telegramDhPrime.replace(/ /g, '')), true)\n })\n },\n { timeout: 10000 },\n) // since miller-rabin factorization relies on RNG, it may take a while (or may not!)\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable no-restricted-globals */
|
|
4
|
+
const vitest_1 = require("vitest");
|
|
5
|
+
const mtproto_js_1 = require("./mtproto.js");
|
|
6
|
+
const node_js_1 = require("./node.js");
|
|
7
|
+
const authKey = Buffer.alloc(2048 / 8, Buffer.from('98cb29c6ffa89e79da695a54f572e6cb101e81c688b63a4bf73c3622dec230e0', 'hex'));
|
|
8
|
+
const messageKey = Buffer.from('25d701f2a29205526757825a99eb2d32');
|
|
9
|
+
(0, vitest_1.describe)('mtproto 2.0', () => {
|
|
10
|
+
(0, vitest_1.it)('should correctly derive message key and iv for client', () => {
|
|
11
|
+
const crypto = new node_js_1.NodeCryptoProvider();
|
|
12
|
+
const spy = vitest_1.vi.spyOn(crypto, 'createAesIge');
|
|
13
|
+
(0, mtproto_js_1.createAesIgeForMessage)(crypto, authKey, messageKey, true);
|
|
14
|
+
(0, vitest_1.expect)(spy).toHaveBeenCalledWith(Buffer.from('7acac59ab48cd370e478daf6c64545ab9f32d5c9197f25febe052110f61875ca', 'hex'), Buffer.from('2746ccc19fc260c08f3d2696389f415392103dbcc3a8bf69da9394c3c3d95bd3', 'hex'));
|
|
15
|
+
});
|
|
16
|
+
(0, vitest_1.it)('should correctly derive message key and iv for server', () => {
|
|
17
|
+
const crypto = new node_js_1.NodeCryptoProvider();
|
|
18
|
+
const spy = vitest_1.vi.spyOn(crypto, 'createAesIge');
|
|
19
|
+
(0, mtproto_js_1.createAesIgeForMessage)(crypto, authKey, messageKey, false);
|
|
20
|
+
(0, vitest_1.expect)(spy).toHaveBeenCalledWith(Buffer.from('c7cf179e7ebab144ba87de05415db4157d2fc66df4790b2fd405a6c8cbe4c0b3', 'hex'), Buffer.from('0916a7bd9880eacd4eeb868577a4c6a50e76fca4ac5c1bcfbafe3b9f76ccd806', 'hex'));
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
(0, vitest_1.describe)('mtproto 1.0', () => {
|
|
24
|
+
(0, vitest_1.it)('should correctly derive message key and iv for client', () => {
|
|
25
|
+
const crypto = new node_js_1.NodeCryptoProvider();
|
|
26
|
+
const spy = vitest_1.vi.spyOn(crypto, 'createAesIge');
|
|
27
|
+
(0, mtproto_js_1.createAesIgeForMessageOld)(crypto, authKey, messageKey, true);
|
|
28
|
+
(0, vitest_1.expect)(spy).toHaveBeenCalledWith(Buffer.from('aad61cb5b7be5e8435174d74665f8a978e85806d0970ad4958642ca49e3c8834', 'hex'), Buffer.from('4065736fe6586e94aad9f024062f1b9988e8a44e2aff4e11aad61cb5b7be5e84', 'hex'));
|
|
29
|
+
});
|
|
30
|
+
(0, vitest_1.it)('should correctly derive message key and iv for server', () => {
|
|
31
|
+
const crypto = new node_js_1.NodeCryptoProvider();
|
|
32
|
+
const spy = vitest_1.vi.spyOn(crypto, 'createAesIge');
|
|
33
|
+
(0, mtproto_js_1.createAesIgeForMessageOld)(crypto, authKey, messageKey, false);
|
|
34
|
+
(0, vitest_1.expect)(spy).toHaveBeenCalledWith(Buffer.from('d57682a17105e43b92bc5025ea80e88ef708240fc19450dfe072a8760f9534da', 'hex'), Buffer.from('07addff7beeb7705ef3a9d5090bd73c992d57291bb8a7079d57682a17105e43b', 'hex'));
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
(0, vitest_1.describe)('mtproto key/iv from nonce', () => {
|
|
38
|
+
(0, vitest_1.it)('should correctly derive message key and iv for given nonces', () => {
|
|
39
|
+
const crypto = new node_js_1.NodeCryptoProvider();
|
|
40
|
+
const res = (0, mtproto_js_1.generateKeyAndIvFromNonce)(crypto, Buffer.from('8af24c551836e5ed7002f5857e6e71b2', 'hex'), Buffer.from('3bf48b2d3152f383d82d1f2b32ac7fb5', 'hex'));
|
|
41
|
+
(0, vitest_1.expect)(res).to.eql([
|
|
42
|
+
Buffer.from('b0b5ffeadff0249fa6292f5ae0351556fd6619ba5dd4809601669292456d3e5a', 'hex'),
|
|
43
|
+
Buffer.from('13fef5bfd8c46b12dfd1753013b86cc012e1ce8ed6f8ecdd7bf36f3a3bf48b2d', 'hex'),
|
|
44
|
+
]);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=mtproto.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mtproto.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/mtproto.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { describe, expect, it, vi } from 'vitest'\n\nimport { createAesIgeForMessage, createAesIgeForMessageOld, generateKeyAndIvFromNonce } from './mtproto.js'\nimport { NodeCryptoProvider } from './node.js'\n\nconst authKey = Buffer.alloc(\n 2048 / 8,\n Buffer.from('98cb29c6ffa89e79da695a54f572e6cb101e81c688b63a4bf73c3622dec230e0', 'hex'),\n)\nconst messageKey = Buffer.from('25d701f2a29205526757825a99eb2d32')\n\ndescribe('mtproto 2.0', () => {\n it('should correctly derive message key and iv for client', () => {\n const crypto = new NodeCryptoProvider()\n const spy = vi.spyOn(crypto, 'createAesIge')\n\n createAesIgeForMessage(crypto, authKey, messageKey, true)\n\n expect(spy).toHaveBeenCalledWith(\n Buffer.from('7acac59ab48cd370e478daf6c64545ab9f32d5c9197f25febe052110f61875ca', 'hex'),\n Buffer.from('2746ccc19fc260c08f3d2696389f415392103dbcc3a8bf69da9394c3c3d95bd3', 'hex'),\n )\n })\n\n it('should correctly derive message key and iv for server', () => {\n const crypto = new NodeCryptoProvider()\n const spy = vi.spyOn(crypto, 'createAesIge')\n\n createAesIgeForMessage(crypto, authKey, messageKey, false)\n\n expect(spy).toHaveBeenCalledWith(\n Buffer.from('c7cf179e7ebab144ba87de05415db4157d2fc66df4790b2fd405a6c8cbe4c0b3', 'hex'),\n Buffer.from('0916a7bd9880eacd4eeb868577a4c6a50e76fca4ac5c1bcfbafe3b9f76ccd806', 'hex'),\n )\n })\n})\n\ndescribe('mtproto 1.0', () => {\n it('should correctly derive message key and iv for client', () => {\n const crypto = new NodeCryptoProvider()\n const spy = vi.spyOn(crypto, 'createAesIge')\n\n createAesIgeForMessageOld(crypto, authKey, messageKey, true)\n\n expect(spy).toHaveBeenCalledWith(\n Buffer.from('aad61cb5b7be5e8435174d74665f8a978e85806d0970ad4958642ca49e3c8834', 'hex'),\n Buffer.from('4065736fe6586e94aad9f024062f1b9988e8a44e2aff4e11aad61cb5b7be5e84', 'hex'),\n )\n })\n\n it('should correctly derive message key and iv for server', () => {\n const crypto = new NodeCryptoProvider()\n const spy = vi.spyOn(crypto, 'createAesIge')\n\n createAesIgeForMessageOld(crypto, authKey, messageKey, false)\n\n expect(spy).toHaveBeenCalledWith(\n Buffer.from('d57682a17105e43b92bc5025ea80e88ef708240fc19450dfe072a8760f9534da', 'hex'),\n Buffer.from('07addff7beeb7705ef3a9d5090bd73c992d57291bb8a7079d57682a17105e43b', 'hex'),\n )\n })\n})\n\ndescribe('mtproto key/iv from nonce', () => {\n it('should correctly derive message key and iv for given nonces', () => {\n const crypto = new NodeCryptoProvider()\n\n const res = generateKeyAndIvFromNonce(\n crypto,\n Buffer.from('8af24c551836e5ed7002f5857e6e71b2', 'hex'),\n Buffer.from('3bf48b2d3152f383d82d1f2b32ac7fb5', 'hex'),\n )\n\n expect(res).to.eql([\n Buffer.from('b0b5ffeadff0249fa6292f5ae0351556fd6619ba5dd4809601669292456d3e5a', 'hex'),\n Buffer.from('13fef5bfd8c46b12dfd1753013b86cc012e1ce8ed6f8ecdd7bf36f3a3bf48b2d', 'hex'),\n ])\n })\n})\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const test_1 = require("@mtcute/test");
|
|
5
|
+
const node_js_1 = require("./node.js");
|
|
6
|
+
(0, vitest_1.describe)('NodeCryptoProvider', () => {
|
|
7
|
+
if (typeof process === 'undefined') {
|
|
8
|
+
console.warn('Skipping NodeCryptoProvider tests');
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
(0, test_1.testCryptoProvider)(new node_js_1.NodeCryptoProvider());
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=node.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/node.test.ts"],"names":[],"mappings":";;AAAA,mCAAiC;AAEjC,uCAAiD;AAEjD,uCAA8C;AAE9C,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAChC,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE;QAChC,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;QAEjD,OAAM;KACT;IAED,IAAA,yBAAkB,EAAC,IAAI,4BAAkB,EAAE,CAAC,CAAA;AAChD,CAAC,CAAC,CAAA","sourcesContent":["import { describe } from 'vitest'\n\nimport { testCryptoProvider } from '@mtcute/test'\n\nimport { NodeCryptoProvider } from './node.js'\n\ndescribe('NodeCryptoProvider', () => {\n if (typeof process === 'undefined') {\n console.warn('Skipping NodeCryptoProvider tests')\n\n return\n }\n\n testCryptoProvider(new NodeCryptoProvider())\n})\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const long_1 = __importDefault(require("long"));
|
|
7
|
+
const vitest_1 = require("vitest");
|
|
8
|
+
const test_1 = require("@mtcute/test");
|
|
9
|
+
const tl_runtime_1 = require("@mtcute/tl-runtime");
|
|
10
|
+
const index_js_1 = require("./index.js");
|
|
11
|
+
// a real-world request from an account with "qwe123" password
|
|
12
|
+
const fakeAlgo = {
|
|
13
|
+
_: 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow',
|
|
14
|
+
salt1: (0, tl_runtime_1.hexDecodeToBuffer)('9b3accc457c0d5288e8cff31eb21094048bc11902f6614dbb9afb839ee7641c37619537d8ebe749e'),
|
|
15
|
+
salt2: (0, tl_runtime_1.hexDecodeToBuffer)('6c619bb0786dc4ed1bf211d23f6e4065'),
|
|
16
|
+
g: 3,
|
|
17
|
+
p: (0, tl_runtime_1.hexDecodeToBuffer)('c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f' +
|
|
18
|
+
'48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c37' +
|
|
19
|
+
'20fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f64' +
|
|
20
|
+
'2477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4' +
|
|
21
|
+
'a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754' +
|
|
22
|
+
'fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4' +
|
|
23
|
+
'e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f' +
|
|
24
|
+
'0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b'),
|
|
25
|
+
};
|
|
26
|
+
const fakeRequest = {
|
|
27
|
+
_: 'account.password',
|
|
28
|
+
hasRecovery: false,
|
|
29
|
+
hasSecureValues: false,
|
|
30
|
+
hasPassword: true,
|
|
31
|
+
currentAlgo: fakeAlgo,
|
|
32
|
+
srpB: (0, tl_runtime_1.hexDecodeToBuffer)('1476a7b5991d7f028bbee33b3455cad3f2cd0eb3737409fcce92fa7d4cd5c733' +
|
|
33
|
+
'ec6d2cb3454e587d4c17eda2fd7ef9a57327215f38292cc8bd5dc77d3e1d31cd' +
|
|
34
|
+
'dae2652f8347c4b0093f7c78242f70e6cc13137ee7acc257a49855a63113db8f' +
|
|
35
|
+
'163992b9101551f3b6f7eb5d196cee3647c359553b1bcbe82ba8933c0fb1ac35' +
|
|
36
|
+
'0243c535b8e634613e1f626ba8a6d141ef957c859e71a117b557c0298bfbb107' +
|
|
37
|
+
'c91f71f5b4275fded58289aa1e87c612f44b7aa0b5e0de7def4458f58db80019' +
|
|
38
|
+
'd2e7b181eb66dc270374af2d160dd0c53edd677b2701694d71ea8718c49df6a9' +
|
|
39
|
+
'dbe2cbae051ffc1986336cd26f11a8ab426dfe0813d7b3f4eedf4e34182ccc3a'),
|
|
40
|
+
srpId: long_1.default.fromBits(-2046015018, 875006452),
|
|
41
|
+
newAlgo: {
|
|
42
|
+
_: 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow',
|
|
43
|
+
salt1: (0, tl_runtime_1.hexDecodeToBuffer)('9b3accc457c0d528'),
|
|
44
|
+
salt2: (0, tl_runtime_1.hexDecodeToBuffer)('6c619bb0786dc4ed1bf211d23f6e4065'),
|
|
45
|
+
g: 3,
|
|
46
|
+
p: (0, tl_runtime_1.hexDecodeToBuffer)('c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f' +
|
|
47
|
+
'48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c37' +
|
|
48
|
+
'20fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f64' +
|
|
49
|
+
'2477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4' +
|
|
50
|
+
'a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754' +
|
|
51
|
+
'fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4' +
|
|
52
|
+
'e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f' +
|
|
53
|
+
'0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b'),
|
|
54
|
+
},
|
|
55
|
+
newSecureAlgo: {
|
|
56
|
+
_: 'securePasswordKdfAlgoPBKDF2HMACSHA512iter100000',
|
|
57
|
+
salt: (0, tl_runtime_1.hexDecodeToBuffer)('fdd59abc0bffb24d'),
|
|
58
|
+
},
|
|
59
|
+
secureRandom: new Uint8Array(), // unused
|
|
60
|
+
};
|
|
61
|
+
const password = 'qwe123';
|
|
62
|
+
(0, vitest_1.describe)('SRP', () => {
|
|
63
|
+
(0, vitest_1.it)('should correctly compute password hash as defined by MTProto', async () => {
|
|
64
|
+
const crypto = await (0, test_1.defaultTestCryptoProvider)();
|
|
65
|
+
const hash = await (0, index_js_1.computePasswordHash)(crypto, (0, tl_runtime_1.utf8EncodeToBuffer)(password), fakeAlgo.salt1, fakeAlgo.salt2);
|
|
66
|
+
(0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(hash)).toEqual('750f1fe282965e63ce17b98427b35549fb864465211840f6a7c1f2fb657cc33b');
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.it)('should correctly compute new password hash as defined by MTProto', async () => {
|
|
69
|
+
const crypto = await (0, test_1.defaultTestCryptoProvider)();
|
|
70
|
+
const hash = await (0, index_js_1.computeNewPasswordHash)(crypto, fakeAlgo, '123qwe');
|
|
71
|
+
(0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(hash)).toEqual('2540539ceeffd4543cd845bf319b8392e6b17bf7cf26bafcf6282ce9ae795368' +
|
|
72
|
+
'4ff49469c2863b17e6d65ddb16ae6f60bc07cc254c00e5ba389292f6cea0b3aa' +
|
|
73
|
+
'c459d1d08984d65319df8c5d124042169bbe2ab8c0c93bc7178827f2ea84e7c3' +
|
|
74
|
+
'a4f2660099fb6a4c38984c914283d3015278369521a4b81ecf927669b8c89746' +
|
|
75
|
+
'ef49ec7b019af7f3addc746362f298d96409bef4677b9c3d8e5b5afe7a44c0bc' +
|
|
76
|
+
'130ebc7a79b5d5980966d88d3d9eba511b101b0703abd86df7410cd120edad12' +
|
|
77
|
+
'2a7a3ccad92d906dbf6f43bba13555bafb626b45551275f3626a4ae26a14908d' +
|
|
78
|
+
'38d640680e501f52bd08a0e3ff9d9185eebdae890c167459449b2c205b3ecde4');
|
|
79
|
+
});
|
|
80
|
+
(0, vitest_1.it)('should correctly compute srp parameters as defined by MTProto', async () => {
|
|
81
|
+
const crypto = await (0, test_1.defaultTestCryptoProvider)();
|
|
82
|
+
const params = await (0, index_js_1.computeSrpParams)(crypto, fakeRequest, password);
|
|
83
|
+
(0, vitest_1.expect)(params.srpId).toEqual(fakeRequest.srpId);
|
|
84
|
+
(0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(params.A)).toEqual('363976f55edb57cc5cc0c4aaca9b7539eff98a43a93fa84be34860d18ac3a80f' +
|
|
85
|
+
'ffd57c4617896ff667677d0552a079eb189d25d147ec96edd4495c946a18652d' +
|
|
86
|
+
'31d78eede40a8b29da340c19b32ccac78f8482406e392102c03d850d1db87223' +
|
|
87
|
+
'2c144bfacadb58856971aafb70ca3aac4efa7f73977ddc50dfc0a2c76c0ac950' +
|
|
88
|
+
'728d58b8480fa89c701703855148fadd885aaf1ca313ae3a3b2942de58a9a6fb' +
|
|
89
|
+
'9e3e65c7ac7a1b7f4e6aa4742b957f81927bd8cc761b76f90229dec34d6f15d3' +
|
|
90
|
+
'4fa454aa69d9219d9c5fa3625f5c6f1ac03892a70aa17269c76cd9bf2949a961' +
|
|
91
|
+
'fad2a71e5fa961824b32db037130c7e9aad4c1e9f02ebc5b832622f98b59597e');
|
|
92
|
+
(0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(params.M1)).toEqual('25a91b21c634ad670a144165a9829192d152e131a716f676abc48cd817f508c6');
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=password.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/password.test.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\nimport { describe, expect, it } from 'vitest'\n\nimport { defaultTestCryptoProvider } from '@mtcute/test'\nimport { tl } from '@mtcute/tl'\nimport { hexDecodeToBuffer, hexEncode, utf8EncodeToBuffer } from '@mtcute/tl-runtime'\n\nimport { computeNewPasswordHash, computePasswordHash, computeSrpParams } from './index.js'\n\n// a real-world request from an account with \"qwe123\" password\nconst fakeAlgo: tl.RawPasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow = {\n _: 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow',\n salt1: hexDecodeToBuffer('9b3accc457c0d5288e8cff31eb21094048bc11902f6614dbb9afb839ee7641c37619537d8ebe749e'),\n salt2: hexDecodeToBuffer('6c619bb0786dc4ed1bf211d23f6e4065'),\n g: 3,\n p: hexDecodeToBuffer(\n 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f' +\n '48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c37' +\n '20fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f64' +\n '2477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4' +\n 'a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754' +\n 'fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4' +\n 'e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f' +\n '0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b',\n ),\n}\nconst fakeRequest: tl.account.RawPassword = {\n _: 'account.password',\n hasRecovery: false,\n hasSecureValues: false,\n hasPassword: true,\n currentAlgo: fakeAlgo,\n srpB: hexDecodeToBuffer(\n '1476a7b5991d7f028bbee33b3455cad3f2cd0eb3737409fcce92fa7d4cd5c733' +\n 'ec6d2cb3454e587d4c17eda2fd7ef9a57327215f38292cc8bd5dc77d3e1d31cd' +\n 'dae2652f8347c4b0093f7c78242f70e6cc13137ee7acc257a49855a63113db8f' +\n '163992b9101551f3b6f7eb5d196cee3647c359553b1bcbe82ba8933c0fb1ac35' +\n '0243c535b8e634613e1f626ba8a6d141ef957c859e71a117b557c0298bfbb107' +\n 'c91f71f5b4275fded58289aa1e87c612f44b7aa0b5e0de7def4458f58db80019' +\n 'd2e7b181eb66dc270374af2d160dd0c53edd677b2701694d71ea8718c49df6a9' +\n 'dbe2cbae051ffc1986336cd26f11a8ab426dfe0813d7b3f4eedf4e34182ccc3a',\n ),\n srpId: Long.fromBits(-2046015018, 875006452),\n newAlgo: {\n _: 'passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow',\n salt1: hexDecodeToBuffer('9b3accc457c0d528'),\n salt2: hexDecodeToBuffer('6c619bb0786dc4ed1bf211d23f6e4065'),\n g: 3,\n p: hexDecodeToBuffer(\n 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f' +\n '48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c37' +\n '20fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f64' +\n '2477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4' +\n 'a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754' +\n 'fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4' +\n 'e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f' +\n '0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b',\n ),\n },\n newSecureAlgo: {\n _: 'securePasswordKdfAlgoPBKDF2HMACSHA512iter100000',\n salt: hexDecodeToBuffer('fdd59abc0bffb24d'),\n },\n secureRandom: new Uint8Array(), // unused\n}\nconst password = 'qwe123'\n\ndescribe('SRP', () => {\n it('should correctly compute password hash as defined by MTProto', async () => {\n const crypto = await defaultTestCryptoProvider()\n const hash = await computePasswordHash(crypto, utf8EncodeToBuffer(password), fakeAlgo.salt1, fakeAlgo.salt2)\n\n expect(hexEncode(hash)).toEqual('750f1fe282965e63ce17b98427b35549fb864465211840f6a7c1f2fb657cc33b')\n })\n\n it('should correctly compute new password hash as defined by MTProto', async () => {\n const crypto = await defaultTestCryptoProvider()\n const hash = await computeNewPasswordHash(crypto, fakeAlgo, '123qwe')\n\n expect(hexEncode(hash)).toEqual(\n '2540539ceeffd4543cd845bf319b8392e6b17bf7cf26bafcf6282ce9ae795368' +\n '4ff49469c2863b17e6d65ddb16ae6f60bc07cc254c00e5ba389292f6cea0b3aa' +\n 'c459d1d08984d65319df8c5d124042169bbe2ab8c0c93bc7178827f2ea84e7c3' +\n 'a4f2660099fb6a4c38984c914283d3015278369521a4b81ecf927669b8c89746' +\n 'ef49ec7b019af7f3addc746362f298d96409bef4677b9c3d8e5b5afe7a44c0bc' +\n '130ebc7a79b5d5980966d88d3d9eba511b101b0703abd86df7410cd120edad12' +\n '2a7a3ccad92d906dbf6f43bba13555bafb626b45551275f3626a4ae26a14908d' +\n '38d640680e501f52bd08a0e3ff9d9185eebdae890c167459449b2c205b3ecde4',\n )\n })\n\n it('should correctly compute srp parameters as defined by MTProto', async () => {\n const crypto = await defaultTestCryptoProvider()\n const params = await computeSrpParams(crypto, fakeRequest, password)\n\n expect(params.srpId).toEqual(fakeRequest.srpId)\n expect(hexEncode(params.A)).toEqual(\n '363976f55edb57cc5cc0c4aaca9b7539eff98a43a93fa84be34860d18ac3a80f' +\n 'ffd57c4617896ff667677d0552a079eb189d25d147ec96edd4495c946a18652d' +\n '31d78eede40a8b29da340c19b32ccac78f8482406e392102c03d850d1db87223' +\n '2c144bfacadb58856971aafb70ca3aac4efa7f73977ddc50dfc0a2c76c0ac950' +\n '728d58b8480fa89c701703855148fadd885aaf1ca313ae3a3b2942de58a9a6fb' +\n '9e3e65c7ac7a1b7f4e6aa4742b957f81927bd8cc761b76f90229dec34d6f15d3' +\n '4fa454aa69d9219d9c5fa3625f5c6f1ac03892a70aa17269c76cd9bf2949a961' +\n 'fad2a71e5fa961824b32db037130c7e9aad4c1e9f02ebc5b832622f98b59597e',\n )\n expect(hexEncode(params.M1)).toEqual('25a91b21c634ad670a144165a9829192d152e131a716f676abc48cd817f508c6')\n })\n})\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const tl_runtime_1 = require("@mtcute/tl-runtime");
|
|
5
|
+
const utils_js_1 = require("./utils.js");
|
|
6
|
+
(0, vitest_1.describe)('xorBuffer', () => {
|
|
7
|
+
(0, vitest_1.it)('should xor buffers without modifying original', () => {
|
|
8
|
+
const data = (0, tl_runtime_1.utf8EncodeToBuffer)('hello');
|
|
9
|
+
const key = (0, tl_runtime_1.utf8EncodeToBuffer)('xor');
|
|
10
|
+
const xored = (0, utils_js_1.xorBuffer)(data, key);
|
|
11
|
+
(0, vitest_1.expect)(data.toString()).eq('hello');
|
|
12
|
+
(0, vitest_1.expect)(key.toString()).eq('xor');
|
|
13
|
+
(0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(xored)).eq('100a1e6c6f');
|
|
14
|
+
});
|
|
15
|
+
(0, vitest_1.it)('should be deterministic', () => {
|
|
16
|
+
const data = (0, tl_runtime_1.utf8EncodeToBuffer)('hello');
|
|
17
|
+
const key = (0, tl_runtime_1.utf8EncodeToBuffer)('xor');
|
|
18
|
+
const xored1 = (0, utils_js_1.xorBuffer)(data, key);
|
|
19
|
+
(0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(xored1)).eq('100a1e6c6f');
|
|
20
|
+
const xored2 = (0, utils_js_1.xorBuffer)(data, key);
|
|
21
|
+
(0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(xored2)).eq('100a1e6c6f');
|
|
22
|
+
});
|
|
23
|
+
(0, vitest_1.it)('second call should decode content', () => {
|
|
24
|
+
const data = (0, tl_runtime_1.utf8EncodeToBuffer)('hello');
|
|
25
|
+
const key = (0, tl_runtime_1.utf8EncodeToBuffer)('xor');
|
|
26
|
+
const xored1 = (0, utils_js_1.xorBuffer)(data, key);
|
|
27
|
+
(0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(xored1)).eq('100a1e6c6f');
|
|
28
|
+
const xored2 = (0, utils_js_1.xorBuffer)(xored1, key);
|
|
29
|
+
(0, vitest_1.expect)((0, tl_runtime_1.utf8Decode)(xored2)).eq('hello');
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
(0, vitest_1.describe)('xorBufferInPlace', () => {
|
|
33
|
+
(0, vitest_1.it)('should xor buffers by modifying original', () => {
|
|
34
|
+
const data = (0, tl_runtime_1.utf8EncodeToBuffer)('hello');
|
|
35
|
+
const key = (0, tl_runtime_1.utf8EncodeToBuffer)('xor');
|
|
36
|
+
(0, utils_js_1.xorBufferInPlace)(data, key);
|
|
37
|
+
(0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(data)).eq('100a1e6c6f');
|
|
38
|
+
(0, vitest_1.expect)(key.toString()).eq('xor');
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.it)('second call should decode content', () => {
|
|
41
|
+
const data = (0, tl_runtime_1.utf8EncodeToBuffer)('hello');
|
|
42
|
+
const key = (0, tl_runtime_1.utf8EncodeToBuffer)('xor');
|
|
43
|
+
(0, utils_js_1.xorBufferInPlace)(data, key);
|
|
44
|
+
(0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(data)).eq('100a1e6c6f');
|
|
45
|
+
(0, utils_js_1.xorBufferInPlace)(data, key);
|
|
46
|
+
(0, vitest_1.expect)(data.toString()).eq('hello');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { hexEncode, utf8Decode, utf8EncodeToBuffer } from '@mtcute/tl-runtime'\n\nimport { xorBuffer, xorBufferInPlace } from './utils.js'\n\ndescribe('xorBuffer', () => {\n it('should xor buffers without modifying original', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n const xored = xorBuffer(data, key)\n expect(data.toString()).eq('hello')\n expect(key.toString()).eq('xor')\n expect(hexEncode(xored)).eq('100a1e6c6f')\n })\n\n it('should be deterministic', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n const xored1 = xorBuffer(data, key)\n expect(hexEncode(xored1)).eq('100a1e6c6f')\n\n const xored2 = xorBuffer(data, key)\n expect(hexEncode(xored2)).eq('100a1e6c6f')\n })\n\n it('second call should decode content', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n const xored1 = xorBuffer(data, key)\n expect(hexEncode(xored1)).eq('100a1e6c6f')\n\n const xored2 = xorBuffer(xored1, key)\n expect(utf8Decode(xored2)).eq('hello')\n })\n})\n\ndescribe('xorBufferInPlace', () => {\n it('should xor buffers by modifying original', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n xorBufferInPlace(data, key)\n expect(hexEncode(data)).eq('100a1e6c6f')\n expect(key.toString()).eq('xor')\n })\n\n it('second call should decode content', () => {\n const data = utf8EncodeToBuffer('hello')\n const key = utf8EncodeToBuffer('xor')\n\n xorBufferInPlace(data, key)\n expect(hexEncode(data)).eq('100a1e6c6f')\n\n xorBufferInPlace(data, key)\n expect(data.toString()).eq('hello')\n })\n})\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const test_1 = require("@mtcute/test");
|
|
5
|
+
const web_js_1 = require("./web.js");
|
|
6
|
+
(0, vitest_1.describe)('WebCryptoProvider', async () => {
|
|
7
|
+
let crypto = globalThis.crypto;
|
|
8
|
+
if (!crypto && typeof process !== 'undefined') {
|
|
9
|
+
crypto = await import('crypto').then((m) => m.webcrypto);
|
|
10
|
+
}
|
|
11
|
+
if (!crypto) {
|
|
12
|
+
console.warn('Skipping WebCryptoProvider tests (no webcrypto)');
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
(0, test_1.testCryptoProvider)(new web_js_1.WebCryptoProvider({ crypto }));
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=web.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.test.js","sourceRoot":"","sources":["../../../../src/utils/crypto/web.test.ts"],"names":[],"mappings":";;AAAA,mCAAiC;AAEjC,uCAAiD;AAEjD,qCAA4C;AAE5C,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;IACrC,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;IAE9B,IAAI,CAAC,MAAM,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE;QAC3C,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAmB,CAAC,CAAA;KACrE;IAED,IAAI,CAAC,MAAM,EAAE;QACT,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;QAE/D,OAAM;KACT;IAED,IAAA,yBAAkB,EAAC,IAAI,0BAAiB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;AACzD,CAAC,CAAC,CAAA","sourcesContent":["import { describe } from 'vitest'\n\nimport { testCryptoProvider } from '@mtcute/test'\n\nimport { WebCryptoProvider } from './web.js'\n\ndescribe('WebCryptoProvider', async () => {\n let crypto = globalThis.crypto\n\n if (!crypto && typeof process !== 'undefined') {\n crypto = await import('crypto').then((m) => m.webcrypto as Crypto)\n }\n\n if (!crypto) {\n console.warn('Skipping WebCryptoProvider tests (no webcrypto)')\n\n return\n }\n\n testCryptoProvider(new WebCryptoProvider({ crypto }))\n})\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const deque_js_1 = require("./deque.js");
|
|
5
|
+
(0, vitest_1.describe)('Deque', () => {
|
|
6
|
+
function setupWrapping() {
|
|
7
|
+
const d = new deque_js_1.Deque(Infinity, /* capacity: */ 8);
|
|
8
|
+
for (let i = 1; i <= 7; i++) {
|
|
9
|
+
d.pushBack(i);
|
|
10
|
+
}
|
|
11
|
+
// [1, 2, 3, 4, 5, 6, 7, _]
|
|
12
|
+
d.popFront();
|
|
13
|
+
d.popFront();
|
|
14
|
+
d.popFront();
|
|
15
|
+
// [_, _, _, 4, 5, 6, 7, _]
|
|
16
|
+
d.pushBack(8);
|
|
17
|
+
d.pushBack(9);
|
|
18
|
+
d.pushBack(10);
|
|
19
|
+
// [9, 10, _, 4, 5, 6, 7, 8]
|
|
20
|
+
return d;
|
|
21
|
+
}
|
|
22
|
+
(0, vitest_1.it)('should push items to the end correctly', () => {
|
|
23
|
+
const d = new deque_js_1.Deque();
|
|
24
|
+
d.pushBack(1);
|
|
25
|
+
d.pushBack(2);
|
|
26
|
+
d.pushBack(3);
|
|
27
|
+
(0, vitest_1.expect)(d.toArray()).eql([1, 2, 3]);
|
|
28
|
+
(0, vitest_1.expect)([...d.iter()]).eql([1, 2, 3]);
|
|
29
|
+
});
|
|
30
|
+
(0, vitest_1.it)('should push items to the start correctly', () => {
|
|
31
|
+
const d = new deque_js_1.Deque();
|
|
32
|
+
d.pushFront(1);
|
|
33
|
+
d.pushFront(2);
|
|
34
|
+
d.pushFront(3);
|
|
35
|
+
(0, vitest_1.expect)(d.toArray()).eql([3, 2, 1]);
|
|
36
|
+
});
|
|
37
|
+
(0, vitest_1.it)('should pop items from the end correctly', () => {
|
|
38
|
+
const d = new deque_js_1.Deque();
|
|
39
|
+
d.pushBack(1);
|
|
40
|
+
d.pushBack(2);
|
|
41
|
+
d.pushBack(3);
|
|
42
|
+
(0, vitest_1.expect)(d.popBack()).eql(3);
|
|
43
|
+
(0, vitest_1.expect)(d.popBack()).eql(2);
|
|
44
|
+
(0, vitest_1.expect)(d.popBack()).eql(1);
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.it)('should pop items from the start correctly', () => {
|
|
47
|
+
const d = new deque_js_1.Deque();
|
|
48
|
+
d.pushFront(1);
|
|
49
|
+
d.pushFront(2);
|
|
50
|
+
d.pushFront(3);
|
|
51
|
+
(0, vitest_1.expect)(d.popFront()).eql(3);
|
|
52
|
+
(0, vitest_1.expect)(d.popFront()).eql(2);
|
|
53
|
+
(0, vitest_1.expect)(d.popFront()).eql(1);
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.it)('should return the correct length', () => {
|
|
56
|
+
const d = new deque_js_1.Deque();
|
|
57
|
+
d.pushBack(1);
|
|
58
|
+
d.pushBack(2);
|
|
59
|
+
d.pushBack(3);
|
|
60
|
+
(0, vitest_1.expect)(d.length).eql(3);
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.it)('accessors should correctly wrap around', () => {
|
|
63
|
+
const d = setupWrapping();
|
|
64
|
+
(0, vitest_1.expect)(d.toArray()).eql([4, 5, 6, 7, 8, 9, 10]);
|
|
65
|
+
(0, vitest_1.expect)([...d.iter()]).eql([4, 5, 6, 7, 8, 9, 10]);
|
|
66
|
+
(0, vitest_1.expect)(d.at(6)).eql(10);
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.it)('should handle maxLength by removing items from the other end', () => {
|
|
69
|
+
const d = new deque_js_1.Deque(4);
|
|
70
|
+
d.pushBack(1);
|
|
71
|
+
d.pushBack(2);
|
|
72
|
+
d.pushBack(3);
|
|
73
|
+
d.pushBack(4);
|
|
74
|
+
d.pushBack(5);
|
|
75
|
+
(0, vitest_1.expect)(d.toArray()).eql([2, 3, 4, 5]);
|
|
76
|
+
d.pushFront(6);
|
|
77
|
+
(0, vitest_1.expect)(d.toArray()).eql([6, 2, 3, 4]);
|
|
78
|
+
});
|
|
79
|
+
(0, vitest_1.it)('should correctly resize', () => {
|
|
80
|
+
const d = new deque_js_1.Deque(Infinity, /* capacity: */ 8);
|
|
81
|
+
for (let i = 0; i <= 16; i++) {
|
|
82
|
+
d.pushBack(i);
|
|
83
|
+
}
|
|
84
|
+
const expected = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
|
|
85
|
+
(0, vitest_1.expect)(d.length).eql(17);
|
|
86
|
+
(0, vitest_1.expect)(d.toArray()).eql(expected);
|
|
87
|
+
(0, vitest_1.expect)([...d.iter()]).eql(expected);
|
|
88
|
+
(0, vitest_1.expect)(d.at(16)).eql(16);
|
|
89
|
+
});
|
|
90
|
+
(0, vitest_1.it)('should correctly remove items', () => {
|
|
91
|
+
const d = new deque_js_1.Deque(Infinity, /* capacity: */ 16);
|
|
92
|
+
d.pushBack(1);
|
|
93
|
+
d.pushBack(2);
|
|
94
|
+
d.pushBack(3);
|
|
95
|
+
d.pushBack(4);
|
|
96
|
+
d.pushBack(5);
|
|
97
|
+
d.remove(1);
|
|
98
|
+
d.remove(4);
|
|
99
|
+
(0, vitest_1.expect)(d.toArray()).eql([2, 3, 5]);
|
|
100
|
+
});
|
|
101
|
+
(0, vitest_1.it)('should correctly remove items by predicate (the first matched)', () => {
|
|
102
|
+
const d = new deque_js_1.Deque(Infinity, /* capacity: */ 4);
|
|
103
|
+
d.pushBack(1);
|
|
104
|
+
d.pushBack(2);
|
|
105
|
+
d.pushBack(3);
|
|
106
|
+
d.pushBack(4);
|
|
107
|
+
d.pushBack(5);
|
|
108
|
+
d.removeBy((it) => it >= 2);
|
|
109
|
+
(0, vitest_1.expect)(d.toArray()).eql([1, 3, 4, 5]);
|
|
110
|
+
});
|
|
111
|
+
(0, vitest_1.it)('should correctly peek at edges', () => {
|
|
112
|
+
const d = new deque_js_1.Deque();
|
|
113
|
+
d.pushBack(1);
|
|
114
|
+
d.pushBack(2);
|
|
115
|
+
(0, vitest_1.expect)(d.peekFront()).eql(1);
|
|
116
|
+
(0, vitest_1.expect)(d.peekBack()).eql(2);
|
|
117
|
+
});
|
|
118
|
+
(0, vitest_1.it)('should correctly clear', () => {
|
|
119
|
+
const d = new deque_js_1.Deque();
|
|
120
|
+
d.pushBack(1);
|
|
121
|
+
d.pushBack(2);
|
|
122
|
+
d.clear();
|
|
123
|
+
(0, vitest_1.expect)(d.length).eql(0);
|
|
124
|
+
(0, vitest_1.expect)(d.toArray()).eql([]);
|
|
125
|
+
(0, vitest_1.expect)([...d.iter()]).eql([]);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
//# sourceMappingURL=deque.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deque.test.js","sourceRoot":"","sources":["../../../src/utils/deque.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { Deque } from './deque.js'\n\ndescribe('Deque', () => {\n function setupWrapping() {\n const d = new Deque<number>(Infinity, /* capacity: */ 8)\n\n for (let i = 1; i <= 7; i++) {\n d.pushBack(i)\n }\n\n // [1, 2, 3, 4, 5, 6, 7, _]\n\n d.popFront()\n d.popFront()\n d.popFront()\n\n // [_, _, _, 4, 5, 6, 7, _]\n\n d.pushBack(8)\n d.pushBack(9)\n d.pushBack(10)\n\n // [9, 10, _, 4, 5, 6, 7, 8]\n return d\n }\n\n it('should push items to the end correctly', () => {\n const d = new Deque<number>()\n\n d.pushBack(1)\n d.pushBack(2)\n d.pushBack(3)\n\n expect(d.toArray()).eql([1, 2, 3])\n expect([...d.iter()]).eql([1, 2, 3])\n })\n\n it('should push items to the start correctly', () => {\n const d = new Deque<number>()\n\n d.pushFront(1)\n d.pushFront(2)\n d.pushFront(3)\n\n expect(d.toArray()).eql([3, 2, 1])\n })\n\n it('should pop items from the end correctly', () => {\n const d = new Deque<number>()\n\n d.pushBack(1)\n d.pushBack(2)\n d.pushBack(3)\n\n expect(d.popBack()).eql(3)\n expect(d.popBack()).eql(2)\n expect(d.popBack()).eql(1)\n })\n\n it('should pop items from the start correctly', () => {\n const d = new Deque<number>()\n\n d.pushFront(1)\n d.pushFront(2)\n d.pushFront(3)\n\n expect(d.popFront()).eql(3)\n expect(d.popFront()).eql(2)\n expect(d.popFront()).eql(1)\n })\n\n it('should return the correct length', () => {\n const d = new Deque<number>()\n\n d.pushBack(1)\n d.pushBack(2)\n d.pushBack(3)\n\n expect(d.length).eql(3)\n })\n\n it('accessors should correctly wrap around', () => {\n const d = setupWrapping()\n\n expect(d.toArray()).eql([4, 5, 6, 7, 8, 9, 10])\n expect([...d.iter()]).eql([4, 5, 6, 7, 8, 9, 10])\n expect(d.at(6)).eql(10)\n })\n\n it('should handle maxLength by removing items from the other end', () => {\n const d = new Deque<number>(4)\n\n d.pushBack(1)\n d.pushBack(2)\n d.pushBack(3)\n d.pushBack(4)\n\n d.pushBack(5)\n expect(d.toArray()).eql([2, 3, 4, 5])\n\n d.pushFront(6)\n expect(d.toArray()).eql([6, 2, 3, 4])\n })\n\n it('should correctly resize', () => {\n const d = new Deque<number>(Infinity, /* capacity: */ 8)\n\n for (let i = 0; i <= 16; i++) {\n d.pushBack(i)\n }\n\n const expected = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]\n\n expect(d.length).eql(17)\n expect(d.toArray()).eql(expected)\n expect([...d.iter()]).eql(expected)\n expect(d.at(16)).eql(16)\n })\n\n it('should correctly remove items', () => {\n const d = new Deque<number>(Infinity, /* capacity: */ 16)\n\n d.pushBack(1)\n d.pushBack(2)\n d.pushBack(3)\n d.pushBack(4)\n d.pushBack(5)\n\n d.remove(1)\n d.remove(4)\n\n expect(d.toArray()).eql([2, 3, 5])\n })\n\n it('should correctly remove items by predicate (the first matched)', () => {\n const d = new Deque<number>(Infinity, /* capacity: */ 4)\n\n d.pushBack(1)\n d.pushBack(2)\n d.pushBack(3)\n d.pushBack(4)\n d.pushBack(5)\n\n d.removeBy((it) => it >= 2)\n\n expect(d.toArray()).eql([1, 3, 4, 5])\n })\n\n it('should correctly peek at edges', () => {\n const d = new Deque<number>()\n\n d.pushBack(1)\n d.pushBack(2)\n\n expect(d.peekFront()).eql(1)\n expect(d.peekBack()).eql(2)\n })\n\n it('should correctly clear', () => {\n const d = new Deque<number>()\n\n d.pushBack(1)\n d.pushBack(2)\n\n d.clear()\n\n expect(d.length).eql(0)\n expect(d.toArray()).eql([])\n expect([...d.iter()]).eql([])\n })\n})\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const condition_variable_js_1 = require("./condition-variable.js");
|
|
5
|
+
const function_utils_js_1 = require("./function-utils.js");
|
|
6
|
+
(0, vitest_1.describe)('throttle', () => {
|
|
7
|
+
(0, vitest_1.it)('should throttle', async () => {
|
|
8
|
+
const cv = new condition_variable_js_1.ConditionVariable();
|
|
9
|
+
let count = 0;
|
|
10
|
+
const func = () => {
|
|
11
|
+
count++;
|
|
12
|
+
cv.notify();
|
|
13
|
+
};
|
|
14
|
+
const throttled = (0, function_utils_js_1.throttle)(func, 10);
|
|
15
|
+
throttled();
|
|
16
|
+
throttled();
|
|
17
|
+
throttled();
|
|
18
|
+
throttled();
|
|
19
|
+
await cv.wait();
|
|
20
|
+
(0, vitest_1.expect)(count).eq(1);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=function-utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function-utils.test.js","sourceRoot":"","sources":["../../../src/utils/function-utils.test.ts"],"names":[],"mappings":";;AAAA,mCAA6C;AAE7C,mEAA2D;AAC3D,2DAA8C;AAE9C,IAAA,iBAAQ,EAAC,UAAU,EAAE,GAAG,EAAE;IACtB,IAAA,WAAE,EAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QAC7B,MAAM,EAAE,GAAG,IAAI,yCAAiB,EAAE,CAAA;QAClC,IAAI,KAAK,GAAG,CAAC,CAAA;QAEb,MAAM,IAAI,GAAG,GAAG,EAAE;YACd,KAAK,EAAE,CAAA;YACP,EAAE,CAAC,MAAM,EAAE,CAAA;QACf,CAAC,CAAA;QAED,MAAM,SAAS,GAAG,IAAA,4BAAQ,EAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QAEpC,SAAS,EAAE,CAAA;QACX,SAAS,EAAE,CAAA;QACX,SAAS,EAAE,CAAA;QACX,SAAS,EAAE,CAAA;QAEX,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;QAEf,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACvB,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { ConditionVariable } from './condition-variable.js'\nimport { throttle } from './function-utils.js'\n\ndescribe('throttle', () => {\n it('should throttle', async () => {\n const cv = new ConditionVariable()\n let count = 0\n\n const func = () => {\n count++\n cv.notify()\n }\n\n const throttled = throttle(func, 10)\n\n throttled()\n throttled()\n throttled()\n throttled()\n\n await cv.wait()\n\n expect(count).eq(1)\n })\n})\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|