@zapo-js/fake-server 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/README.md +176 -0
  2. package/dist/api/AppStateSyncManager.d.ts +27 -0
  3. package/dist/api/AppStateSyncManager.d.ts.map +1 -0
  4. package/dist/api/AppStateSyncManager.js +151 -0
  5. package/dist/api/AppStateSyncManager.js.map +1 -0
  6. package/dist/api/FakePairingDriver.d.ts +27 -0
  7. package/dist/api/FakePairingDriver.d.ts.map +1 -0
  8. package/dist/api/FakePairingDriver.js +36 -0
  9. package/dist/api/FakePairingDriver.js.map +1 -0
  10. package/dist/api/FakePeer.d.ts +143 -0
  11. package/dist/api/FakePeer.d.ts.map +1 -0
  12. package/dist/api/FakePeer.js +408 -0
  13. package/dist/api/FakePeer.js.map +1 -0
  14. package/dist/api/FakeWaServer.d.ts +167 -0
  15. package/dist/api/FakeWaServer.d.ts.map +1 -0
  16. package/dist/api/FakeWaServer.js +652 -0
  17. package/dist/api/FakeWaServer.js.map +1 -0
  18. package/dist/api/PreKeyDispenser.d.ts +23 -0
  19. package/dist/api/PreKeyDispenser.d.ts.map +1 -0
  20. package/dist/api/PreKeyDispenser.js +98 -0
  21. package/dist/api/PreKeyDispenser.js.map +1 -0
  22. package/dist/api/Scenario.d.ts +24 -0
  23. package/dist/api/Scenario.d.ts.map +1 -0
  24. package/dist/api/Scenario.js +38 -0
  25. package/dist/api/Scenario.js.map +1 -0
  26. package/dist/api/ServerRegistries.d.ts +110 -0
  27. package/dist/api/ServerRegistries.d.ts.map +1 -0
  28. package/dist/api/ServerRegistries.js +268 -0
  29. package/dist/api/ServerRegistries.js.map +1 -0
  30. package/dist/api/iq-handlers.d.ts +47 -0
  31. package/dist/api/iq-handlers.d.ts.map +1 -0
  32. package/dist/api/iq-handlers.js +498 -0
  33. package/dist/api/iq-handlers.js.map +1 -0
  34. package/dist/cli.d.ts +4 -0
  35. package/dist/cli.d.ts.map +1 -0
  36. package/dist/cli.js +249 -0
  37. package/dist/cli.js.map +1 -0
  38. package/dist/index.d.ts +51 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +74 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/infra/WaFakeConnection.d.ts +23 -0
  43. package/dist/infra/WaFakeConnection.d.ts.map +1 -0
  44. package/dist/infra/WaFakeConnection.js +54 -0
  45. package/dist/infra/WaFakeConnection.js.map +1 -0
  46. package/dist/infra/WaFakeConnectionPipeline.d.ts +51 -0
  47. package/dist/infra/WaFakeConnectionPipeline.d.ts.map +1 -0
  48. package/dist/infra/WaFakeConnectionPipeline.js +224 -0
  49. package/dist/infra/WaFakeConnectionPipeline.js.map +1 -0
  50. package/dist/infra/WaFakeFrameSocket.d.ts +29 -0
  51. package/dist/infra/WaFakeFrameSocket.d.ts.map +1 -0
  52. package/dist/infra/WaFakeFrameSocket.js +122 -0
  53. package/dist/infra/WaFakeFrameSocket.js.map +1 -0
  54. package/dist/infra/WaFakeMediaHttpsServer.d.ts +16 -0
  55. package/dist/infra/WaFakeMediaHttpsServer.d.ts.map +1 -0
  56. package/dist/infra/WaFakeMediaHttpsServer.js +131 -0
  57. package/dist/infra/WaFakeMediaHttpsServer.js.map +1 -0
  58. package/dist/infra/WaFakeNoiseHandshake.d.ts +23 -0
  59. package/dist/infra/WaFakeNoiseHandshake.d.ts.map +1 -0
  60. package/dist/infra/WaFakeNoiseHandshake.js +76 -0
  61. package/dist/infra/WaFakeNoiseHandshake.js.map +1 -0
  62. package/dist/infra/WaFakeTransport.d.ts +15 -0
  63. package/dist/infra/WaFakeTransport.d.ts.map +1 -0
  64. package/dist/infra/WaFakeTransport.js +34 -0
  65. package/dist/infra/WaFakeTransport.js.map +1 -0
  66. package/dist/infra/WaFakeWsServer.d.ts +29 -0
  67. package/dist/infra/WaFakeWsServer.d.ts.map +1 -0
  68. package/dist/infra/WaFakeWsServer.js +101 -0
  69. package/dist/infra/WaFakeWsServer.js.map +1 -0
  70. package/dist/protocol/auth/cert-chain.d.ts +18 -0
  71. package/dist/protocol/auth/cert-chain.d.ts.map +1 -0
  72. package/dist/protocol/auth/cert-chain.js +44 -0
  73. package/dist/protocol/auth/cert-chain.js.map +1 -0
  74. package/dist/protocol/auth/client-payload-validate.d.ts +21 -0
  75. package/dist/protocol/auth/client-payload-validate.d.ts.map +1 -0
  76. package/dist/protocol/auth/client-payload-validate.js +61 -0
  77. package/dist/protocol/auth/client-payload-validate.js.map +1 -0
  78. package/dist/protocol/auth/fake-primary-device.d.ts +19 -0
  79. package/dist/protocol/auth/fake-primary-device.d.ts.map +1 -0
  80. package/dist/protocol/auth/fake-primary-device.js +53 -0
  81. package/dist/protocol/auth/fake-primary-device.js.map +1 -0
  82. package/dist/protocol/auth/pair-device.d.ts +26 -0
  83. package/dist/protocol/auth/pair-device.d.ts.map +1 -0
  84. package/dist/protocol/auth/pair-device.js +104 -0
  85. package/dist/protocol/auth/pair-device.js.map +1 -0
  86. package/dist/protocol/auth/success-node.d.ts +15 -0
  87. package/dist/protocol/auth/success-node.d.ts.map +1 -0
  88. package/dist/protocol/auth/success-node.js +30 -0
  89. package/dist/protocol/auth/success-node.js.map +1 -0
  90. package/dist/protocol/iq/abprops.d.ts +14 -0
  91. package/dist/protocol/iq/abprops.d.ts.map +1 -0
  92. package/dist/protocol/iq/abprops.js +34 -0
  93. package/dist/protocol/iq/abprops.js.map +1 -0
  94. package/dist/protocol/iq/appstate-sync.d.ts +38 -0
  95. package/dist/protocol/iq/appstate-sync.d.ts.map +1 -0
  96. package/dist/protocol/iq/appstate-sync.js +154 -0
  97. package/dist/protocol/iq/appstate-sync.js.map +1 -0
  98. package/dist/protocol/iq/business.d.ts +13 -0
  99. package/dist/protocol/iq/business.d.ts.map +1 -0
  100. package/dist/protocol/iq/business.js +64 -0
  101. package/dist/protocol/iq/business.js.map +1 -0
  102. package/dist/protocol/iq/dirty-bits.d.ts +8 -0
  103. package/dist/protocol/iq/dirty-bits.d.ts.map +1 -0
  104. package/dist/protocol/iq/dirty-bits.js +23 -0
  105. package/dist/protocol/iq/dirty-bits.js.map +1 -0
  106. package/dist/protocol/iq/group-ops.d.ts +34 -0
  107. package/dist/protocol/iq/group-ops.d.ts.map +1 -0
  108. package/dist/protocol/iq/group-ops.js +164 -0
  109. package/dist/protocol/iq/group-ops.js.map +1 -0
  110. package/dist/protocol/iq/newsletter.d.ts +4 -0
  111. package/dist/protocol/iq/newsletter.d.ts.map +1 -0
  112. package/dist/protocol/iq/newsletter.js +18 -0
  113. package/dist/protocol/iq/newsletter.js.map +1 -0
  114. package/dist/protocol/iq/prekey-fetch.d.ts +18 -0
  115. package/dist/protocol/iq/prekey-fetch.d.ts.map +1 -0
  116. package/dist/protocol/iq/prekey-fetch.js +92 -0
  117. package/dist/protocol/iq/prekey-fetch.js.map +1 -0
  118. package/dist/protocol/iq/privacy-token.d.ts +9 -0
  119. package/dist/protocol/iq/privacy-token.d.ts.map +1 -0
  120. package/dist/protocol/iq/privacy-token.js +30 -0
  121. package/dist/protocol/iq/privacy-token.js.map +1 -0
  122. package/dist/protocol/iq/privacy.d.ts +22 -0
  123. package/dist/protocol/iq/privacy.d.ts.map +1 -0
  124. package/dist/protocol/iq/privacy.js +133 -0
  125. package/dist/protocol/iq/privacy.js.map +1 -0
  126. package/dist/protocol/iq/profile.d.ts +22 -0
  127. package/dist/protocol/iq/profile.d.ts.map +1 -0
  128. package/dist/protocol/iq/profile.js +80 -0
  129. package/dist/protocol/iq/profile.js.map +1 -0
  130. package/dist/protocol/iq/router.d.ts +39 -0
  131. package/dist/protocol/iq/router.d.ts.map +1 -0
  132. package/dist/protocol/iq/router.js +118 -0
  133. package/dist/protocol/iq/router.js.map +1 -0
  134. package/dist/protocol/iq/usync.d.ts +8 -0
  135. package/dist/protocol/iq/usync.d.ts.map +1 -0
  136. package/dist/protocol/iq/usync.js +68 -0
  137. package/dist/protocol/iq/usync.js.map +1 -0
  138. package/dist/protocol/push/app-state-key-share.d.ts +17 -0
  139. package/dist/protocol/push/app-state-key-share.d.ts.map +1 -0
  140. package/dist/protocol/push/app-state-key-share.js +30 -0
  141. package/dist/protocol/push/app-state-key-share.js.map +1 -0
  142. package/dist/protocol/push/call-failure.d.ts +16 -0
  143. package/dist/protocol/push/call-failure.d.ts.map +1 -0
  144. package/dist/protocol/push/call-failure.js +32 -0
  145. package/dist/protocol/push/call-failure.js.map +1 -0
  146. package/dist/protocol/push/chatstate.d.ts +15 -0
  147. package/dist/protocol/push/chatstate.d.ts.map +1 -0
  148. package/dist/protocol/push/chatstate.js +27 -0
  149. package/dist/protocol/push/chatstate.js.map +1 -0
  150. package/dist/protocol/push/error-stanza.d.ts +8 -0
  151. package/dist/protocol/push/error-stanza.d.ts.map +1 -0
  152. package/dist/protocol/push/error-stanza.js +17 -0
  153. package/dist/protocol/push/error-stanza.js.map +1 -0
  154. package/dist/protocol/push/history-sync.d.ts +46 -0
  155. package/dist/protocol/push/history-sync.d.ts.map +1 -0
  156. package/dist/protocol/push/history-sync.js +117 -0
  157. package/dist/protocol/push/history-sync.js.map +1 -0
  158. package/dist/protocol/push/message.d.ts +21 -0
  159. package/dist/protocol/push/message.d.ts.map +1 -0
  160. package/dist/protocol/push/message.js +42 -0
  161. package/dist/protocol/push/message.js.map +1 -0
  162. package/dist/protocol/push/notification.d.ts +21 -0
  163. package/dist/protocol/push/notification.d.ts.map +1 -0
  164. package/dist/protocol/push/notification.js +34 -0
  165. package/dist/protocol/push/notification.js.map +1 -0
  166. package/dist/protocol/push/presence.d.ts +11 -0
  167. package/dist/protocol/push/presence.d.ts.map +1 -0
  168. package/dist/protocol/push/presence.js +18 -0
  169. package/dist/protocol/push/presence.js.map +1 -0
  170. package/dist/protocol/push/receipt.d.ts +14 -0
  171. package/dist/protocol/push/receipt.d.ts.map +1 -0
  172. package/dist/protocol/push/receipt.js +25 -0
  173. package/dist/protocol/push/receipt.js.map +1 -0
  174. package/dist/protocol/signal/fake-app-state-crypto.d.ts +49 -0
  175. package/dist/protocol/signal/fake-app-state-crypto.d.ts.map +1 -0
  176. package/dist/protocol/signal/fake-app-state-crypto.js +202 -0
  177. package/dist/protocol/signal/fake-app-state-crypto.js.map +1 -0
  178. package/dist/protocol/signal/fake-peer-double-ratchet.d.ts +38 -0
  179. package/dist/protocol/signal/fake-peer-double-ratchet.d.ts.map +1 -0
  180. package/dist/protocol/signal/fake-peer-double-ratchet.js +408 -0
  181. package/dist/protocol/signal/fake-peer-double-ratchet.js.map +1 -0
  182. package/dist/protocol/signal/fake-peer-group-recv-session.d.ts +10 -0
  183. package/dist/protocol/signal/fake-peer-group-recv-session.d.ts.map +1 -0
  184. package/dist/protocol/signal/fake-peer-group-recv-session.js +129 -0
  185. package/dist/protocol/signal/fake-peer-group-recv-session.js.map +1 -0
  186. package/dist/protocol/signal/fake-peer-identity.d.ts +7 -0
  187. package/dist/protocol/signal/fake-peer-identity.d.ts.map +1 -0
  188. package/dist/protocol/signal/fake-peer-identity.js +12 -0
  189. package/dist/protocol/signal/fake-peer-identity.js.map +1 -0
  190. package/dist/protocol/signal/fake-peer-key-bundle.d.ts +24 -0
  191. package/dist/protocol/signal/fake-peer-key-bundle.d.ts.map +1 -0
  192. package/dist/protocol/signal/fake-peer-key-bundle.js +29 -0
  193. package/dist/protocol/signal/fake-peer-key-bundle.js.map +1 -0
  194. package/dist/protocol/signal/fake-peer-recv-session.d.ts +60 -0
  195. package/dist/protocol/signal/fake-peer-recv-session.d.ts.map +1 -0
  196. package/dist/protocol/signal/fake-peer-recv-session.js +284 -0
  197. package/dist/protocol/signal/fake-peer-recv-session.js.map +1 -0
  198. package/dist/protocol/signal/fake-peer-session.d.ts +87 -0
  199. package/dist/protocol/signal/fake-peer-session.d.ts.map +1 -0
  200. package/dist/protocol/signal/fake-peer-session.js +207 -0
  201. package/dist/protocol/signal/fake-peer-session.js.map +1 -0
  202. package/dist/protocol/signal/fake-sender-key.d.ts +15 -0
  203. package/dist/protocol/signal/fake-sender-key.d.ts.map +1 -0
  204. package/dist/protocol/signal/fake-sender-key.js +91 -0
  205. package/dist/protocol/signal/fake-sender-key.js.map +1 -0
  206. package/dist/protocol/signal/prekey-upload.d.ts +22 -0
  207. package/dist/protocol/signal/prekey-upload.d.ts.map +1 -0
  208. package/dist/protocol/signal/prekey-upload.js +113 -0
  209. package/dist/protocol/signal/prekey-upload.js.map +1 -0
  210. package/dist/protocol/stream/stream-error.d.ts +8 -0
  211. package/dist/protocol/stream/stream-error.d.ts.map +1 -0
  212. package/dist/protocol/stream/stream-error.js +64 -0
  213. package/dist/protocol/stream/stream-error.js.map +1 -0
  214. package/dist/state/fake-app-state-collection.d.ts +35 -0
  215. package/dist/state/fake-app-state-collection.d.ts.map +1 -0
  216. package/dist/state/fake-app-state-collection.js +139 -0
  217. package/dist/state/fake-app-state-collection.js.map +1 -0
  218. package/dist/state/fake-media-store.d.ts +35 -0
  219. package/dist/state/fake-media-store.d.ts.map +1 -0
  220. package/dist/state/fake-media-store.js +57 -0
  221. package/dist/state/fake-media-store.js.map +1 -0
  222. package/dist/transport/codec.d.ts +10 -0
  223. package/dist/transport/codec.d.ts.map +1 -0
  224. package/dist/transport/codec.js +17 -0
  225. package/dist/transport/codec.js.map +1 -0
  226. package/dist/transport/crypto.d.ts +11 -0
  227. package/dist/transport/crypto.d.ts.map +1 -0
  228. package/dist/transport/crypto.js +36 -0
  229. package/dist/transport/crypto.js.map +1 -0
  230. package/dist/transport/index.d.ts +4 -0
  231. package/dist/transport/index.d.ts.map +1 -0
  232. package/dist/transport/index.js +20 -0
  233. package/dist/transport/index.js.map +1 -0
  234. package/dist/transport/protos.d.ts +10 -0
  235. package/dist/transport/protos.d.ts.map +1 -0
  236. package/dist/transport/protos.js +13 -0
  237. package/dist/transport/protos.js.map +1 -0
  238. package/package.json +43 -0
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ /** Responder-side Noise handshake primitives for fake server pipelines. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.WaFakeNoiseHandshake = void 0;
5
+ const crypto_1 = require("../transport/crypto");
6
+ const EMPTY = new Uint8Array(0);
7
+ class WaFakeNoiseHandshake {
8
+ constructor() {
9
+ this.hash = EMPTY;
10
+ this.chainingKey = EMPTY;
11
+ this.cipherKey = null;
12
+ this.nonceCounter = 0;
13
+ }
14
+ async start(name, prologue) {
15
+ const initialHash = name.byteLength === 32 ? name : await (0, crypto_1.sha256)(name);
16
+ this.hash = initialHash;
17
+ this.chainingKey = initialHash;
18
+ this.cipherKey = await (0, crypto_1.importAesGcmKey)(initialHash, ['encrypt', 'decrypt']);
19
+ this.nonceCounter = 0;
20
+ await this.authenticate(prologue);
21
+ }
22
+ async authenticate(data) {
23
+ const concatenated = new Uint8Array(this.hash.byteLength + data.byteLength);
24
+ concatenated.set(this.hash, 0);
25
+ concatenated.set(data, this.hash.byteLength);
26
+ this.hash = await (0, crypto_1.sha256)(concatenated);
27
+ }
28
+ async mixIntoKey(input) {
29
+ const [nextChainingKey, nextCipherMaterial] = await (0, crypto_1.hkdfSplit)(input, this.chainingKey, '');
30
+ this.chainingKey = nextChainingKey;
31
+ this.cipherKey = await (0, crypto_1.importAesGcmKey)(nextCipherMaterial, ['encrypt', 'decrypt']);
32
+ this.nonceCounter = 0;
33
+ }
34
+ async encrypt(plaintext) {
35
+ if (!this.cipherKey) {
36
+ throw new Error('noise handshake encrypt called before key was derived');
37
+ }
38
+ const iv = this.buildNonceIv();
39
+ this.nonceCounter += 1;
40
+ const ciphertext = await (0, crypto_1.aesGcmEncrypt)(this.cipherKey, iv, plaintext, this.hash);
41
+ await this.authenticate(ciphertext);
42
+ return ciphertext;
43
+ }
44
+ async decrypt(ciphertext) {
45
+ if (!this.cipherKey) {
46
+ throw new Error('noise handshake decrypt called before key was derived');
47
+ }
48
+ const iv = this.buildNonceIv();
49
+ this.nonceCounter += 1;
50
+ const plaintext = await (0, crypto_1.aesGcmDecrypt)(this.cipherKey, iv, ciphertext, this.hash);
51
+ await this.authenticate(ciphertext);
52
+ return plaintext;
53
+ }
54
+ /** Derives transport keys (`first -> recv`, `second -> send` for responder role). */
55
+ async finish() {
56
+ const [first, second] = await (0, crypto_1.hkdfSplit)(EMPTY, this.chainingKey, '');
57
+ const [recvKey, sendKey] = await Promise.all([
58
+ (0, crypto_1.importAesGcmKey)(first, ['decrypt']),
59
+ (0, crypto_1.importAesGcmKey)(second, ['encrypt'])
60
+ ]);
61
+ return {
62
+ recvKey,
63
+ sendKey,
64
+ recvKeyBytes: first,
65
+ sendKeyBytes: second
66
+ };
67
+ }
68
+ buildNonceIv() {
69
+ const iv = new Uint8Array(12);
70
+ const view = new DataView(iv.buffer);
71
+ view.setUint32(8, this.nonceCounter, false);
72
+ return iv;
73
+ }
74
+ }
75
+ exports.WaFakeNoiseHandshake = WaFakeNoiseHandshake;
76
+ //# sourceMappingURL=WaFakeNoiseHandshake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaFakeNoiseHandshake.js","sourceRoot":"","sources":["../../src/infra/WaFakeNoiseHandshake.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /** Post-handshake Noise transport (AES-GCM with direction-specific counters). */
2
+ import { type CryptoKey } from '../transport/crypto';
3
+ export declare class WaFakeTransport {
4
+ private readonly recvKey;
5
+ private readonly sendKey;
6
+ private sendCounter;
7
+ private recvCounter;
8
+ constructor(keys: {
9
+ readonly recvKey: CryptoKey;
10
+ readonly sendKey: CryptoKey;
11
+ });
12
+ encryptFrame(plaintext: Uint8Array): Promise<Uint8Array>;
13
+ decryptFrame(ciphertext: Uint8Array): Promise<Uint8Array>;
14
+ }
15
+ //# sourceMappingURL=WaFakeTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaFakeTransport.d.ts","sourceRoot":"","sources":["../../src/infra/WaFakeTransport.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAElF,qBAAa,eAAe;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,WAAW,CAAI;gBAEJ,IAAI,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;KAAE;IAKxE,YAAY,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAMxD,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;CAKzE"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ /** Post-handshake Noise transport (AES-GCM with direction-specific counters). */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.WaFakeTransport = void 0;
5
+ const crypto_1 = require("../transport/crypto");
6
+ class WaFakeTransport {
7
+ constructor(keys) {
8
+ this.sendCounter = 0;
9
+ this.recvCounter = 0;
10
+ this.recvKey = keys.recvKey;
11
+ this.sendKey = keys.sendKey;
12
+ }
13
+ async encryptFrame(plaintext) {
14
+ const nonce = buildAesGcmNonce(this.sendCounter);
15
+ this.sendCounter += 1;
16
+ return (0, crypto_1.aesGcmEncrypt)(this.sendKey, nonce, plaintext);
17
+ }
18
+ async decryptFrame(ciphertext) {
19
+ const nonce = buildAesGcmNonce(this.recvCounter);
20
+ this.recvCounter += 1;
21
+ return (0, crypto_1.aesGcmDecrypt)(this.recvKey, nonce, ciphertext);
22
+ }
23
+ }
24
+ exports.WaFakeTransport = WaFakeTransport;
25
+ function buildAesGcmNonce(counter) {
26
+ if (counter > 0xffffffff) {
27
+ throw new Error('noise transport nonce counter overflow');
28
+ }
29
+ const nonce = new Uint8Array(12);
30
+ const view = new DataView(nonce.buffer);
31
+ view.setUint32(8, counter, false);
32
+ return nonce;
33
+ }
34
+ //# sourceMappingURL=WaFakeTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaFakeTransport.js","sourceRoot":"","sources":["../../src/infra/WaFakeTransport.ts"],"names":[],"mappings":";AAAA,iFAAiF;;;AAEjF,gDAAkF;AAElF,MAAa,eAAe;IAMxB,YAAmB,IAAkE;QAH7E,gBAAW,GAAG,CAAC,CAAA;QACf,gBAAW,GAAG,CAAC,CAAA;QAGnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAC/B,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,SAAqB;QAC3C,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAChD,IAAI,CAAC,WAAW,IAAI,CAAC,CAAA;QACrB,OAAO,IAAA,sBAAa,EAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;IACxD,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,UAAsB;QAC5C,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAChD,IAAI,CAAC,WAAW,IAAI,CAAC,CAAA;QACrB,OAAO,IAAA,sBAAa,EAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;IACzD,CAAC;CACJ;AAtBD,0CAsBC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACrC,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAC7D,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAChC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACvC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;IACjC,OAAO,KAAK,CAAA;AAChB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type IncomingMessage, type ServerResponse } from 'node:http';
2
+ import { WaFakeConnection } from './WaFakeConnection';
3
+ export type WaFakeHttpRequestHandler = (req: IncomingMessage, res: ServerResponse) => void | Promise<void>;
4
+ export interface WaFakeWsServerOptions {
5
+ readonly host?: string;
6
+ readonly port?: number;
7
+ readonly path?: string;
8
+ }
9
+ export interface WaFakeWsServerListenInfo {
10
+ readonly host: string;
11
+ readonly port: number;
12
+ readonly path: string;
13
+ readonly url: string;
14
+ }
15
+ export type WaFakeWsServerConnectionListener = (connection: WaFakeConnection) => void;
16
+ export declare class WaFakeWsServer {
17
+ private readonly options;
18
+ private httpServer;
19
+ private wsServer;
20
+ private connectionListener;
21
+ private httpRequestHandler;
22
+ private nextConnectionId;
23
+ constructor(options?: WaFakeWsServerOptions);
24
+ onConnection(listener: WaFakeWsServerConnectionListener): void;
25
+ setHttpRequestHandler(handler: WaFakeHttpRequestHandler | null): void;
26
+ listen(): Promise<WaFakeWsServerListenInfo>;
27
+ close(): Promise<void>;
28
+ }
29
+ //# sourceMappingURL=WaFakeWsServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaFakeWsServer.d.ts","sourceRoot":"","sources":["../../src/infra/WaFakeWsServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,eAAe,EAAe,KAAK,cAAc,EAAE,MAAM,WAAW,CAAA;AAKhG,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,MAAM,MAAM,wBAAwB,GAAG,CACnC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,KAClB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAEzB,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,wBAAwB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,MAAM,gCAAgC,GAAG,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAA;AAErF,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,kBAAkB,CAAgD;IAC1E,OAAO,CAAC,kBAAkB,CAAwC;IAClE,OAAO,CAAC,gBAAgB,CAAI;gBAET,OAAO,GAAE,qBAA0B;IAQ/C,YAAY,CAAC,QAAQ,EAAE,gCAAgC,GAAG,IAAI;IAI9D,qBAAqB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,GAAG,IAAI;IAI/D,MAAM,IAAI,OAAO,CAAC,wBAAwB,CAAC;IA4D3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAkBtC"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WaFakeWsServer = void 0;
4
+ const node_http_1 = require("node:http");
5
+ const ws_1 = require("ws");
6
+ const WaFakeConnection_1 = require("./WaFakeConnection");
7
+ class WaFakeWsServer {
8
+ constructor(options = {}) {
9
+ this.httpServer = null;
10
+ this.wsServer = null;
11
+ this.connectionListener = null;
12
+ this.httpRequestHandler = null;
13
+ this.nextConnectionId = 0;
14
+ this.options = {
15
+ host: options.host ?? '127.0.0.1',
16
+ port: options.port ?? 0,
17
+ path: options.path ?? '/ws/chat'
18
+ };
19
+ }
20
+ onConnection(listener) {
21
+ this.connectionListener = listener;
22
+ }
23
+ setHttpRequestHandler(handler) {
24
+ this.httpRequestHandler = handler;
25
+ }
26
+ async listen() {
27
+ if (this.httpServer) {
28
+ throw new Error('fake ws server is already listening');
29
+ }
30
+ const httpServer = (0, node_http_1.createServer)(async (req, res) => {
31
+ const handler = this.httpRequestHandler;
32
+ if (!handler) {
33
+ res.statusCode = 404;
34
+ res.end();
35
+ return;
36
+ }
37
+ try {
38
+ await Promise.resolve(handler(req, res)).catch((error) => {
39
+ if (!res.headersSent) {
40
+ res.statusCode = 500;
41
+ }
42
+ res.end(error instanceof Error ? error.message : String(error));
43
+ });
44
+ }
45
+ catch (error) {
46
+ if (!res.headersSent) {
47
+ res.statusCode = 500;
48
+ }
49
+ res.end(error instanceof Error ? error.message : String(error));
50
+ }
51
+ });
52
+ const wsServer = new ws_1.WebSocketServer({ server: httpServer, path: this.options.path });
53
+ wsServer.on('connection', (socket) => {
54
+ const id = `c${this.nextConnectionId++}`;
55
+ const connection = new WaFakeConnection_1.WaFakeConnection(id, socket);
56
+ this.connectionListener?.(connection);
57
+ });
58
+ await new Promise((resolve, reject) => {
59
+ const onError = (error) => {
60
+ httpServer.off('listening', onListening);
61
+ reject(error);
62
+ };
63
+ const onListening = () => {
64
+ httpServer.off('error', onError);
65
+ resolve();
66
+ };
67
+ httpServer.once('error', onError);
68
+ httpServer.once('listening', onListening);
69
+ httpServer.listen(this.options.port, this.options.host);
70
+ });
71
+ this.httpServer = httpServer;
72
+ this.wsServer = wsServer;
73
+ const address = httpServer.address();
74
+ return {
75
+ host: address.address,
76
+ port: address.port,
77
+ path: this.options.path,
78
+ url: `ws://${address.address}:${address.port}${this.options.path}`
79
+ };
80
+ }
81
+ async close() {
82
+ const wsServer = this.wsServer;
83
+ const httpServer = this.httpServer;
84
+ if (!wsServer || !httpServer) {
85
+ return;
86
+ }
87
+ for (const client of wsServer.clients) {
88
+ client.terminate();
89
+ }
90
+ await new Promise((resolve, reject) => {
91
+ wsServer.close((error) => (error ? reject(error) : resolve()));
92
+ });
93
+ await new Promise((resolve, reject) => {
94
+ httpServer.close((error) => (error ? reject(error) : resolve()));
95
+ });
96
+ this.wsServer = null;
97
+ this.httpServer = null;
98
+ }
99
+ }
100
+ exports.WaFakeWsServer = WaFakeWsServer;
101
+ //# sourceMappingURL=WaFakeWsServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaFakeWsServer.js","sourceRoot":"","sources":["../../src/infra/WaFakeWsServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /** Fake noise certificate chain generator for handshake tests. */
2
+ export interface FakeNoiseRootCa {
3
+ readonly publicKey: Uint8Array;
4
+ readonly serial: number;
5
+ readonly privateKey: Uint8Array;
6
+ }
7
+ export interface FakeCertChainResult {
8
+ readonly encoded: Uint8Array;
9
+ }
10
+ export interface BuildFakeCertChainInput {
11
+ readonly root: FakeNoiseRootCa;
12
+ readonly leafKey: Uint8Array;
13
+ readonly intermediateSerial?: number;
14
+ readonly leafSerial?: number;
15
+ }
16
+ export declare function generateFakeNoiseRootCa(): Promise<FakeNoiseRootCa>;
17
+ export declare function buildFakeCertChain(input: BuildFakeCertChainInput): Promise<FakeCertChainResult>;
18
+ //# sourceMappingURL=cert-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cert-chain.d.ts","sourceRoot":"","sources":["../../../src/protocol/auth/cert-chain.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAKlE,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAA;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;CAClC;AAED,MAAM,WAAW,mBAAmB;IAChC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACpC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;IAC5B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,eAAe,CAAC,CAOxE;AAED,wBAAsB,kBAAkB,CACpC,KAAK,EAAE,uBAAuB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CAgC9B"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /** Fake noise certificate chain generator for handshake tests. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateFakeNoiseRootCa = generateFakeNoiseRootCa;
5
+ exports.buildFakeCertChain = buildFakeCertChain;
6
+ const crypto_1 = require("../../transport/crypto");
7
+ const protos_1 = require("../../transport/protos");
8
+ async function generateFakeNoiseRootCa() {
9
+ const keyPair = await crypto_1.X25519.generateKeyPair();
10
+ return {
11
+ publicKey: keyPair.pubKey,
12
+ privateKey: keyPair.privKey,
13
+ serial: 0
14
+ };
15
+ }
16
+ async function buildFakeCertChain(input) {
17
+ const intermediateSerial = input.intermediateSerial ?? 1;
18
+ const leafSerial = input.leafSerial ?? 2;
19
+ const intermediateKeyPair = await crypto_1.X25519.generateKeyPair();
20
+ const intermediateDetails = protos_1.proto.CertChain.NoiseCertificate.Details.encode({
21
+ serial: intermediateSerial,
22
+ issuerSerial: input.root.serial,
23
+ key: intermediateKeyPair.pubKey
24
+ }).finish();
25
+ const intermediateSignature = await (0, crypto_1.xeddsaSign)(input.root.privateKey, intermediateDetails);
26
+ const leafDetails = protos_1.proto.CertChain.NoiseCertificate.Details.encode({
27
+ serial: leafSerial,
28
+ issuerSerial: intermediateSerial,
29
+ key: input.leafKey
30
+ }).finish();
31
+ const leafSignature = await (0, crypto_1.xeddsaSign)(intermediateKeyPair.privKey, leafDetails);
32
+ const encoded = protos_1.proto.CertChain.encode({
33
+ intermediate: {
34
+ details: intermediateDetails,
35
+ signature: intermediateSignature
36
+ },
37
+ leaf: {
38
+ details: leafDetails,
39
+ signature: leafSignature
40
+ }
41
+ }).finish();
42
+ return { encoded };
43
+ }
44
+ //# sourceMappingURL=cert-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cert-chain.js","sourceRoot":"","sources":["../../../src/protocol/auth/cert-chain.ts"],"names":[],"mappings":";AAAA,kEAAkE;;AAsBlE,0DAOC;AAED,gDAkCC;AA/DD,mDAA2D;AAC3D,mDAA8C;AAmBvC,KAAK,UAAU,uBAAuB;IACzC,MAAM,OAAO,GAAG,MAAM,eAAM,CAAC,eAAe,EAAE,CAAA;IAC9C,OAAO;QACH,SAAS,EAAE,OAAO,CAAC,MAAM;QACzB,UAAU,EAAE,OAAO,CAAC,OAAO;QAC3B,MAAM,EAAE,CAAC;KACZ,CAAA;AACL,CAAC;AAEM,KAAK,UAAU,kBAAkB,CACpC,KAA8B;IAE9B,MAAM,kBAAkB,GAAG,KAAK,CAAC,kBAAkB,IAAI,CAAC,CAAA;IACxD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,CAAC,CAAA;IAExC,MAAM,mBAAmB,GAAG,MAAM,eAAM,CAAC,eAAe,EAAE,CAAA;IAE1D,MAAM,mBAAmB,GAAG,cAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;QACxE,MAAM,EAAE,kBAAkB;QAC1B,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;QAC/B,GAAG,EAAE,mBAAmB,CAAC,MAAM;KAClC,CAAC,CAAC,MAAM,EAAE,CAAA;IACX,MAAM,qBAAqB,GAAG,MAAM,IAAA,mBAAU,EAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAA;IAE1F,MAAM,WAAW,GAAG,cAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;QAChE,MAAM,EAAE,UAAU;QAClB,YAAY,EAAE,kBAAkB;QAChC,GAAG,EAAE,KAAK,CAAC,OAAO;KACrB,CAAC,CAAC,MAAM,EAAE,CAAA;IACX,MAAM,aAAa,GAAG,MAAM,IAAA,mBAAU,EAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAEhF,MAAM,OAAO,GAAG,cAAK,CAAC,SAAS,CAAC,MAAM,CAAC;QACnC,YAAY,EAAE;YACV,OAAO,EAAE,mBAAmB;YAC5B,SAAS,EAAE,qBAAqB;SACnC;QACD,IAAI,EAAE;YACF,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,aAAa;SAC3B;KACJ,CAAC,CAAC,MAAM,EAAE,CAAA;IAEX,OAAO,EAAE,OAAO,EAAE,CAAA;AACtB,CAAC"}
@@ -0,0 +1,21 @@
1
+ /** ClientPayload parser/validator (registration vs login flavors). */
2
+ import { type Proto } from '../../transport/protos';
3
+ export interface RegistrationPayload {
4
+ readonly kind: 'registration';
5
+ readonly raw: Proto.IClientPayload;
6
+ readonly devicePairingData: NonNullable<Proto.IClientPayload['devicePairingData']>;
7
+ }
8
+ export interface LoginPayload {
9
+ readonly kind: 'login';
10
+ readonly raw: Proto.IClientPayload;
11
+ readonly username: string;
12
+ readonly device: number;
13
+ readonly loginCounter: number;
14
+ }
15
+ export type ParsedClientPayload = RegistrationPayload | LoginPayload;
16
+ export declare class ClientPayloadValidationError extends Error {
17
+ readonly code: string;
18
+ constructor(code: string, message: string);
19
+ }
20
+ export declare function parseClientPayload(bytes: Uint8Array): ParsedClientPayload;
21
+ //# sourceMappingURL=client-payload-validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-payload-validate.d.ts","sourceRoot":"","sources":["../../../src/protocol/auth/client-payload-validate.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,EAAS,KAAK,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAE1D,MAAM,WAAW,mBAAmB;IAChC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,cAAc,CAAA;IAClC,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,CAAA;CACrF;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,cAAc,CAAA;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAChC;AAED,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,GAAG,YAAY,CAAA;AAEpE,qBAAa,4BAA6B,SAAQ,KAAK;IACnD,SAAgB,IAAI,EAAE,MAAM,CAAA;gBACT,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAKnD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,mBAAmB,CAmCzE"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /** ClientPayload parser/validator (registration vs login flavors). */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ClientPayloadValidationError = void 0;
5
+ exports.parseClientPayload = parseClientPayload;
6
+ const protos_1 = require("../../transport/protos");
7
+ class ClientPayloadValidationError extends Error {
8
+ constructor(code, message) {
9
+ super(message);
10
+ this.name = 'ClientPayloadValidationError';
11
+ this.code = code;
12
+ }
13
+ }
14
+ exports.ClientPayloadValidationError = ClientPayloadValidationError;
15
+ function parseClientPayload(bytes) {
16
+ let raw;
17
+ try {
18
+ raw = protos_1.proto.ClientPayload.decode(bytes);
19
+ }
20
+ catch (error) {
21
+ throw new ClientPayloadValidationError('invalid_proto', `failed to decode ClientPayload: ${error.message}`);
22
+ }
23
+ const devicePairingData = raw.devicePairingData;
24
+ if (devicePairingData) {
25
+ validateRegistrationFields(devicePairingData);
26
+ return {
27
+ kind: 'registration',
28
+ raw,
29
+ devicePairingData
30
+ };
31
+ }
32
+ if (raw.username === undefined || raw.username === null) {
33
+ throw new ClientPayloadValidationError('missing_username', 'login ClientPayload is missing the username field');
34
+ }
35
+ return {
36
+ kind: 'login',
37
+ raw,
38
+ username: String(raw.username),
39
+ device: typeof raw.device === 'number' ? raw.device : 0,
40
+ loginCounter: typeof raw.lc === 'number' ? raw.lc : 0
41
+ };
42
+ }
43
+ function validateRegistrationFields(devicePairingData) {
44
+ const required = [
45
+ ['eIdent', 'identity public key'],
46
+ ['eRegid', 'registration id'],
47
+ ['eKeytype', 'key type marker'],
48
+ ['eSkeyId', 'signed pre-key id'],
49
+ ['eSkeyVal', 'signed pre-key public'],
50
+ ['eSkeySig', 'signed pre-key signature'],
51
+ ['buildHash', 'client build hash'],
52
+ ['deviceProps', 'device properties']
53
+ ];
54
+ for (const [field, label] of required) {
55
+ const value = devicePairingData[field];
56
+ if (value === undefined || value === null) {
57
+ throw new ClientPayloadValidationError('missing_field', `registration ClientPayload missing ${label} (devicePairingData.${String(field)})`);
58
+ }
59
+ }
60
+ }
61
+ //# sourceMappingURL=client-payload-validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-payload-validate.js","sourceRoot":"","sources":["../../../src/protocol/auth/client-payload-validate.ts"],"names":[],"mappings":";AAAA,sEAAsE;;;AA6BtE,gDAmCC;AA9DD,mDAA0D;AAkB1D,MAAa,4BAA6B,SAAQ,KAAK;IAEnD,YAAmB,IAAY,EAAE,OAAe;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAA;QAC1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IACpB,CAAC;CACJ;AAPD,oEAOC;AAED,SAAgB,kBAAkB,CAAC,KAAiB;IAChD,IAAI,GAAyB,CAAA;IAC7B,IAAI,CAAC;QACD,GAAG,GAAG,cAAK,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,4BAA4B,CAClC,eAAe,EACf,mCAAoC,KAAe,CAAC,OAAO,EAAE,CAChE,CAAA;IACL,CAAC;IAED,MAAM,iBAAiB,GAAG,GAAG,CAAC,iBAAiB,CAAA;IAC/C,IAAI,iBAAiB,EAAE,CAAC;QACpB,0BAA0B,CAAC,iBAAiB,CAAC,CAAA;QAC7C,OAAO;YACH,IAAI,EAAE,cAAc;YACpB,GAAG;YACH,iBAAiB;SACpB,CAAA;IACL,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtD,MAAM,IAAI,4BAA4B,CAClC,kBAAkB,EAClB,mDAAmD,CACtD,CAAA;IACL,CAAC;IAED,OAAO;QACH,IAAI,EAAE,OAAO;QACb,GAAG;QACH,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC9B,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,YAAY,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KACxD,CAAA;AACL,CAAC;AAED,SAAS,0BAA0B,CAC/B,iBAAyE;IAEzE,MAAM,QAAQ,GAAqE;QAC/E,CAAC,QAAQ,EAAE,qBAAqB,CAAC;QACjC,CAAC,QAAQ,EAAE,iBAAiB,CAAC;QAC7B,CAAC,UAAU,EAAE,iBAAiB,CAAC;QAC/B,CAAC,SAAS,EAAE,mBAAmB,CAAC;QAChC,CAAC,UAAU,EAAE,uBAAuB,CAAC;QACrC,CAAC,UAAU,EAAE,0BAA0B,CAAC;QACxC,CAAC,WAAW,EAAE,mBAAmB,CAAC;QAClC,CAAC,aAAa,EAAE,mBAAmB,CAAC;KACvC,CAAA;IACD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;QACtC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,4BAA4B,CAClC,eAAe,EACf,sCAAsC,KAAK,uBAAuB,MAAM,CAAC,KAAK,CAAC,GAAG,CACrF,CAAA;QACL,CAAC;IACL,CAAC;AACL,CAAC"}
@@ -0,0 +1,19 @@
1
+ /** Fake primary-device identity/signature helpers for pairing. */
2
+ import { type SignalKeyPair } from '../../transport/crypto';
3
+ export interface FakePrimaryDevice {
4
+ readonly identityKeyPair: SignalKeyPair;
5
+ }
6
+ export declare function generateFakePrimaryDevice(): Promise<FakePrimaryDevice>;
7
+ export interface BuildAdvIdentityInput {
8
+ readonly primary: FakePrimaryDevice;
9
+ readonly advSecretKey: Uint8Array;
10
+ readonly companionIdentityPublicKey: Uint8Array;
11
+ readonly companionDeviceId: number;
12
+ readonly timestampSeconds?: number;
13
+ readonly keyIndex?: number;
14
+ }
15
+ export interface BuildAdvIdentityResult {
16
+ readonly deviceIdentityBytes: Uint8Array;
17
+ }
18
+ export declare function buildAdvSignedDeviceIdentity(input: BuildAdvIdentityInput): Promise<BuildAdvIdentityResult>;
19
+ //# sourceMappingURL=fake-primary-device.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-primary-device.d.ts","sourceRoot":"","sources":["../../../src/protocol/auth/fake-primary-device.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,OAAO,EAGH,KAAK,aAAa,EAGrB,MAAM,wBAAwB,CAAA;AAK/B,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAA;CAC1C;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAI5E;AAED,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;IACnC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAA;IACjC,QAAQ,CAAC,0BAA0B,EAAE,UAAU,CAAA;IAC/C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,mBAAmB,EAAE,UAAU,CAAA;CAC3C;AAED,wBAAsB,4BAA4B,CAC9C,KAAK,EAAE,qBAAqB,GAC7B,OAAO,CAAC,sBAAsB,CAAC,CA+BjC"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /** Fake primary-device identity/signature helpers for pairing. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateFakePrimaryDevice = generateFakePrimaryDevice;
5
+ exports.buildAdvSignedDeviceIdentity = buildAdvSignedDeviceIdentity;
6
+ const crypto_1 = require("../../transport/crypto");
7
+ const protos_1 = require("../../transport/protos");
8
+ const ADV_PREFIX_ACCOUNT_SIGNATURE = new Uint8Array([0x06, 0x00]);
9
+ async function generateFakePrimaryDevice() {
10
+ return {
11
+ identityKeyPair: await crypto_1.X25519.generateKeyPair()
12
+ };
13
+ }
14
+ async function buildAdvSignedDeviceIdentity(input) {
15
+ const advDeviceIdentity = protos_1.proto.ADVDeviceIdentity.encode({
16
+ rawId: input.companionDeviceId,
17
+ timestamp: input.timestampSeconds ?? Math.floor(Date.now() / 1000),
18
+ keyIndex: input.keyIndex ?? 0
19
+ }).finish();
20
+ // Sign exactly: prefix || details || companionIdentityPublicKey.
21
+ const accountSignatureKey = input.primary.identityKeyPair.pubKey;
22
+ const messageToSign = concatBytes([
23
+ ADV_PREFIX_ACCOUNT_SIGNATURE,
24
+ advDeviceIdentity,
25
+ input.companionIdentityPublicKey
26
+ ]);
27
+ const accountSignature = await (0, crypto_1.xeddsaSign)(input.primary.identityKeyPair.privKey, messageToSign);
28
+ const signedIdentity = protos_1.proto.ADVSignedDeviceIdentity.encode({
29
+ details: advDeviceIdentity,
30
+ accountSignatureKey,
31
+ accountSignature
32
+ }).finish();
33
+ const hmacKey = await (0, crypto_1.importHmacKey)(input.advSecretKey);
34
+ const hmac = await (0, crypto_1.hmacSign)(hmacKey, signedIdentity);
35
+ const wrapped = protos_1.proto.ADVSignedDeviceIdentityHMAC.encode({
36
+ details: signedIdentity,
37
+ hmac
38
+ }).finish();
39
+ return { deviceIdentityBytes: wrapped };
40
+ }
41
+ function concatBytes(parts) {
42
+ let total = 0;
43
+ for (const p of parts)
44
+ total += p.byteLength;
45
+ const out = new Uint8Array(total);
46
+ let offset = 0;
47
+ for (const p of parts) {
48
+ out.set(p, offset);
49
+ offset += p.byteLength;
50
+ }
51
+ return out;
52
+ }
53
+ //# sourceMappingURL=fake-primary-device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-primary-device.js","sourceRoot":"","sources":["../../../src/protocol/auth/fake-primary-device.ts"],"names":[],"mappings":";AAAA,kEAAkE;;AAiBlE,8DAIC;AAeD,oEAiCC;AAnED,mDAM+B;AAC/B,mDAA8C;AAE9C,MAAM,4BAA4B,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;AAM1D,KAAK,UAAU,yBAAyB;IAC3C,OAAO;QACH,eAAe,EAAE,MAAM,eAAM,CAAC,eAAe,EAAE;KAClD,CAAA;AACL,CAAC;AAeM,KAAK,UAAU,4BAA4B,CAC9C,KAA4B;IAE5B,MAAM,iBAAiB,GAAG,cAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC;QACrD,KAAK,EAAE,KAAK,CAAC,iBAAiB;QAC9B,SAAS,EAAE,KAAK,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAK,CAAC;QACnE,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC;KAChC,CAAC,CAAC,MAAM,EAAE,CAAA;IAEX,iEAAiE;IACjE,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAA;IAChE,MAAM,aAAa,GAAG,WAAW,CAAC;QAC9B,4BAA4B;QAC5B,iBAAiB;QACjB,KAAK,CAAC,0BAA0B;KACnC,CAAC,CAAA;IACF,MAAM,gBAAgB,GAAG,MAAM,IAAA,mBAAU,EAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAE/F,MAAM,cAAc,GAAG,cAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC;QACxD,OAAO,EAAE,iBAAiB;QAC1B,mBAAmB;QACnB,gBAAgB;KACnB,CAAC,CAAC,MAAM,EAAE,CAAA;IAEX,MAAM,OAAO,GAAG,MAAM,IAAA,sBAAa,EAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IACvD,MAAM,IAAI,GAAG,MAAM,IAAA,iBAAQ,EAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IAEpD,MAAM,OAAO,GAAG,cAAK,CAAC,2BAA2B,CAAC,MAAM,CAAC;QACrD,OAAO,EAAE,cAAc;QACvB,IAAI;KACP,CAAC,CAAC,MAAM,EAAE,CAAA;IAEX,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAA;AAC3C,CAAC;AAED,SAAS,WAAW,CAAC,KAA4B;IAC7C,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,KAAK,IAAI,CAAC,CAAC,UAAU,CAAA;IAC5C,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;IACjC,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACpB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QAClB,MAAM,IAAI,CAAC,CAAC,UAAU,CAAA;IAC1B,CAAC;IACD,OAAO,GAAG,CAAA;AACd,CAAC"}
@@ -0,0 +1,26 @@
1
+ /** Pairing IQ builders/parsers (source: `WAWebHandlePairDevice*`, `/wa-web`). */
2
+ import type { BinaryNode } from '../../transport/codec';
3
+ export interface BuildPairDeviceIqInput {
4
+ readonly id?: string;
5
+ readonly refs: readonly Uint8Array[];
6
+ }
7
+ export declare function buildPairDeviceIq(input: BuildPairDeviceIqInput): BinaryNode;
8
+ export interface BuildPairSuccessIqInput {
9
+ readonly id?: string;
10
+ readonly deviceJid: string;
11
+ readonly deviceLid?: string;
12
+ readonly platform: string;
13
+ readonly deviceIdentityBytes: Uint8Array;
14
+ readonly bizName?: string;
15
+ }
16
+ export declare function buildPairSuccessIq(input: BuildPairSuccessIqInput): BinaryNode;
17
+ /** Parses `auth_qr`: `ref,noisePub,identityPub,advSecret,platform`. */
18
+ export interface ParsedPairingQr {
19
+ readonly ref: string;
20
+ readonly noisePublicKey: Uint8Array;
21
+ readonly identityPublicKey: Uint8Array;
22
+ readonly advSecretKey: Uint8Array;
23
+ readonly platform: string;
24
+ }
25
+ export declare function parsePairingQrString(qr: string): ParsedPairingQr;
26
+ //# sourceMappingURL=pair-device.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pair-device.d.ts","sourceRoot":"","sources":["../../../src/protocol/auth/pair-device.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEvD,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,UAAU,EAAE,CAAA;CACvC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,UAAU,CAwB3E;AAED,MAAM,WAAW,uBAAuB;IACpC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,mBAAmB,EAAE,UAAU,CAAA;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,UAAU,CAyC7E;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,cAAc,EAAE,UAAU,CAAA;IACnC,QAAQ,CAAC,iBAAiB,EAAE,UAAU,CAAA;IACtC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAA;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC5B;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,CAiBhE"}