zapo-js 0.1.2 → 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 (630) hide show
  1. package/README.md +16 -4
  2. package/dist/appstate/WaAppStateCrypto.js +50 -42
  3. package/dist/appstate/WaAppStateSyncClient.js +215 -133
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +9 -7
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +55 -57
  8. package/dist/auth/credentials-flow.js +195 -0
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingFlow.js +39 -32
  11. package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +35 -17
  12. package/dist/client/WaClient.js +338 -174
  13. package/dist/client/WaClientFactory.js +399 -66
  14. package/dist/client/connection/WaConnectionManager.js +23 -11
  15. package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
  16. package/dist/client/coordinators/WaBusinessCoordinator.js +232 -0
  17. package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +34 -8
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +341 -118
  21. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  22. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  23. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  24. package/dist/client/coordinators/WaProfileCoordinator.js +214 -0
  25. package/dist/client/coordinators/WaRetryCoordinator.js +184 -30
  26. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  27. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +184 -0
  28. package/dist/client/dirty.js +41 -21
  29. package/dist/client/events/abprops.js +43 -0
  30. package/dist/client/events/devices.js +72 -0
  31. package/dist/client/events/group.js +3 -11
  32. package/dist/client/events/identity.js +22 -0
  33. package/dist/client/events/privacy-token.js +38 -0
  34. package/dist/client/events/registration.js +42 -0
  35. package/dist/client/history-sync.js +50 -9
  36. package/dist/client/incoming.js +74 -7
  37. package/dist/client/mailbox.js +40 -23
  38. package/dist/client/media.js +243 -0
  39. package/dist/client/messages.js +245 -92
  40. package/dist/client/messaging/fanout.js +21 -11
  41. package/dist/client/messaging/participants.js +6 -4
  42. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  43. package/dist/client/tokens/cs-token.js +50 -0
  44. package/dist/client/tokens/tc-token.js +25 -0
  45. package/dist/crypto/core/index.js +5 -2
  46. package/dist/crypto/core/keys.js +4 -4
  47. package/dist/crypto/core/nonce.js +2 -0
  48. package/dist/crypto/core/primitives.js +0 -8
  49. package/dist/crypto/core/random.js +24 -8
  50. package/dist/crypto/core/xeddsa.js +57 -0
  51. package/dist/crypto/curves/X25519.js +43 -6
  52. package/dist/crypto/curves/constants.js +2 -1
  53. package/dist/crypto/index.js +3 -0
  54. package/dist/crypto/math/constants.js +13 -36
  55. package/dist/crypto/math/edwards.js +171 -44
  56. package/dist/crypto/math/fe.js +706 -0
  57. package/dist/crypto/math/mod.js +10 -3
  58. package/dist/esm/appstate/WaAppStateCrypto.js +40 -32
  59. package/dist/esm/appstate/WaAppStateSyncClient.js +206 -124
  60. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  61. package/dist/esm/appstate/index.js +2 -2
  62. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
  63. package/dist/esm/appstate/utils.js +2 -5
  64. package/dist/esm/auth/WaAuthClient.js +52 -54
  65. package/dist/esm/auth/credentials-flow.js +190 -0
  66. package/dist/esm/auth/index.js +0 -2
  67. package/dist/esm/auth/pairing/WaPairingFlow.js +39 -32
  68. package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +26 -10
  69. package/dist/esm/client/WaClient.js +339 -175
  70. package/dist/esm/client/WaClientFactory.js +401 -68
  71. package/dist/esm/client/connection/WaConnectionManager.js +23 -11
  72. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
  73. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +229 -0
  74. package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
  75. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  76. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +36 -10
  77. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +337 -114
  78. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  79. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  80. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  81. package/dist/esm/client/coordinators/WaProfileCoordinator.js +211 -0
  82. package/dist/esm/client/coordinators/WaRetryCoordinator.js +186 -32
  83. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  84. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +180 -0
  85. package/dist/esm/client/dirty.js +41 -21
  86. package/dist/esm/client/events/abprops.js +40 -0
  87. package/dist/esm/client/events/devices.js +68 -0
  88. package/dist/esm/client/events/group.js +3 -11
  89. package/dist/esm/client/events/identity.js +19 -0
  90. package/dist/esm/client/events/privacy-token.js +35 -0
  91. package/dist/esm/client/events/registration.js +39 -0
  92. package/dist/esm/client/history-sync.js +50 -9
  93. package/dist/esm/client/incoming.js +74 -8
  94. package/dist/esm/client/mailbox.js +40 -23
  95. package/dist/esm/client/media.js +234 -0
  96. package/dist/esm/client/messages.js +244 -91
  97. package/dist/esm/client/messaging/fanout.js +22 -12
  98. package/dist/esm/client/messaging/participants.js +6 -4
  99. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  100. package/dist/esm/client/tokens/cs-token.js +46 -0
  101. package/dist/esm/client/tokens/tc-token.js +18 -0
  102. package/dist/esm/crypto/core/index.js +3 -2
  103. package/dist/esm/crypto/core/keys.js +1 -1
  104. package/dist/esm/crypto/core/nonce.js +2 -0
  105. package/dist/esm/crypto/core/primitives.js +0 -7
  106. package/dist/esm/crypto/core/random.js +23 -7
  107. package/dist/esm/crypto/core/xeddsa.js +53 -0
  108. package/dist/esm/crypto/curves/X25519.js +45 -8
  109. package/dist/esm/crypto/curves/constants.js +1 -0
  110. package/dist/esm/crypto/index.js +1 -0
  111. package/dist/esm/crypto/math/constants.js +12 -35
  112. package/dist/esm/crypto/math/edwards.js +174 -47
  113. package/dist/esm/crypto/math/fe.js +691 -0
  114. package/dist/esm/crypto/math/mod.js +10 -1
  115. package/dist/esm/index.js +1 -1
  116. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  117. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  118. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  119. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  120. package/dist/esm/infra/perf/StoreLock.js +80 -0
  121. package/dist/esm/media/WaMediaCrypto.js +332 -55
  122. package/dist/esm/media/WaMediaTransferClient.js +69 -220
  123. package/dist/esm/media/constants.js +4 -1
  124. package/dist/esm/media/processor.js +1 -0
  125. package/dist/esm/message/WaMessageClient.js +26 -19
  126. package/dist/esm/message/addon-crypto.js +130 -3
  127. package/dist/esm/message/content.js +206 -14
  128. package/dist/esm/message/icdc.js +76 -0
  129. package/dist/esm/message/incoming.js +38 -24
  130. package/dist/esm/message/phash.js +35 -13
  131. package/dist/esm/message/reporting-token.js +17 -30
  132. package/dist/esm/message/use-case-secret.js +1 -1
  133. package/dist/esm/protocol/abprops.js +159 -0
  134. package/dist/esm/protocol/appstate.js +9 -40
  135. package/dist/esm/protocol/browser.js +24 -18
  136. package/dist/esm/protocol/constants.js +8 -4
  137. package/dist/esm/protocol/defaults.js +6 -0
  138. package/dist/esm/protocol/email.js +30 -0
  139. package/dist/esm/protocol/index.js +1 -2
  140. package/dist/esm/protocol/jid.js +142 -39
  141. package/dist/esm/protocol/message.js +61 -1
  142. package/dist/esm/protocol/nodes.js +8 -2
  143. package/dist/esm/protocol/notification.js +9 -1
  144. package/dist/esm/protocol/privacy-token.js +17 -0
  145. package/dist/esm/protocol/privacy.js +55 -0
  146. package/dist/esm/protocol/stream.js +26 -1
  147. package/dist/esm/retry/codec.js +216 -0
  148. package/dist/esm/retry/constants.js +1 -1
  149. package/dist/esm/retry/index.js +2 -2
  150. package/dist/esm/retry/parse.js +50 -30
  151. package/dist/esm/retry/reason.js +1 -1
  152. package/dist/esm/retry/replay.js +11 -7
  153. package/dist/esm/retry/tracker.js +50 -12
  154. package/dist/esm/signal/api/SignalDeviceSyncApi.js +52 -32
  155. package/dist/esm/signal/api/SignalDigestSyncApi.js +21 -15
  156. package/dist/esm/signal/api/SignalIdentitySyncApi.js +30 -15
  157. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +19 -8
  158. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  159. package/dist/esm/signal/api/SignalSessionSyncApi.js +17 -8
  160. package/dist/esm/signal/api/result-map.js +10 -0
  161. package/dist/esm/signal/constants.js +0 -4
  162. package/dist/esm/signal/crypto/WaAdvSignature.js +5 -45
  163. package/dist/esm/signal/crypto/constants.js +0 -4
  164. package/dist/esm/signal/{store/sqlite.js → encoding.js} +40 -29
  165. package/dist/esm/signal/group/SenderKeyChain.js +3 -3
  166. package/dist/esm/signal/group/SenderKeyCodec.js +8 -8
  167. package/dist/esm/signal/group/SenderKeyManager.js +131 -109
  168. package/dist/esm/signal/index.js +1 -0
  169. package/dist/esm/signal/registration/keygen.js +8 -5
  170. package/dist/esm/signal/registration/utils.js +3 -2
  171. package/dist/esm/signal/session/SignalProtocol.js +158 -81
  172. package/dist/esm/signal/session/SignalRatchet.js +21 -10
  173. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  174. package/dist/esm/signal/session/SignalSession.js +11 -9
  175. package/dist/esm/signal/session/resolver.js +140 -105
  176. package/dist/esm/store/contracts/identity.store.js +1 -0
  177. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  178. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  179. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  180. package/dist/esm/store/contracts/session.store.js +1 -0
  181. package/dist/esm/store/createStore.js +143 -193
  182. package/dist/esm/store/index.js +5 -10
  183. package/dist/esm/store/locks/appstate.lock.js +26 -0
  184. package/dist/esm/store/locks/auth.lock.js +15 -0
  185. package/dist/esm/store/locks/contact.lock.js +20 -0
  186. package/dist/esm/store/locks/device-list.lock.js +20 -0
  187. package/dist/esm/store/locks/identity.lock.js +16 -0
  188. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  189. package/dist/esm/store/locks/message.lock.js +21 -0
  190. package/dist/esm/store/locks/participants.lock.js +20 -0
  191. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  192. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  193. package/dist/esm/store/locks/retry.lock.js +29 -0
  194. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  195. package/dist/esm/store/locks/session.lock.js +19 -0
  196. package/dist/esm/store/locks/signal.lock.js +39 -0
  197. package/dist/esm/store/locks/thread.lock.js +21 -0
  198. package/dist/esm/store/noop.store.js +21 -1
  199. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  200. package/dist/esm/store/providers/memory/device-list.store.js +13 -5
  201. package/dist/esm/store/providers/memory/identity.store.js +31 -0
  202. package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
  203. package/dist/esm/store/providers/memory/participants.store.js +3 -0
  204. package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
  205. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  206. package/dist/esm/store/providers/memory/retry.store.js +99 -10
  207. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  208. package/dist/esm/store/providers/memory/session.store.js +45 -0
  209. package/dist/esm/store/providers/memory/signal.store.js +1 -147
  210. package/dist/esm/transport/WaComms.js +7 -4
  211. package/dist/esm/transport/WaWebSocket.js +9 -7
  212. package/dist/esm/transport/binary/constants.js +0 -30
  213. package/dist/esm/transport/binary/decoder.js +4 -4
  214. package/dist/esm/transport/binary/encoder.js +8 -15
  215. package/dist/esm/transport/binary/index.js +0 -1
  216. package/dist/esm/transport/index.js +6 -0
  217. package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
  218. package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
  219. package/dist/esm/transport/node/WaNodeOrchestrator.js +37 -22
  220. package/dist/esm/transport/node/builders/abprops.js +20 -0
  221. package/dist/esm/transport/node/builders/business.js +129 -0
  222. package/dist/esm/transport/node/builders/device.js +11 -0
  223. package/dist/esm/transport/node/builders/email.js +65 -0
  224. package/dist/esm/transport/node/builders/global.js +370 -0
  225. package/dist/esm/transport/node/builders/message.js +63 -239
  226. package/dist/esm/transport/node/builders/offline.js +14 -0
  227. package/dist/esm/transport/node/builders/pairing.js +0 -24
  228. package/dist/esm/transport/node/builders/prekeys.js +37 -40
  229. package/dist/esm/transport/node/builders/presence.js +13 -0
  230. package/dist/esm/transport/node/builders/privacy-token.js +37 -0
  231. package/dist/esm/transport/node/builders/privacy.js +48 -0
  232. package/dist/esm/transport/node/builders/profile.js +70 -0
  233. package/dist/esm/transport/node/builders/retry.js +11 -23
  234. package/dist/esm/transport/node/builders/usync.js +6 -2
  235. package/dist/esm/transport/node/helpers.js +43 -1
  236. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  237. package/dist/esm/transport/node/mex/client.js +83 -0
  238. package/dist/esm/transport/node/mex/persist-ids.js +10 -0
  239. package/dist/esm/transport/node/usync.js +3 -33
  240. package/dist/esm/transport/node/xml.js +35 -14
  241. package/dist/esm/transport/noise/WaClientPayload.js +24 -19
  242. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  243. package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
  244. package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
  245. package/dist/esm/transport/noise/WaNoiseSession.js +76 -34
  246. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  247. package/dist/esm/transport/stream/parse.js +8 -4
  248. package/dist/esm/util/bytes.js +22 -18
  249. package/dist/esm/util/index.js +5 -0
  250. package/dist/esm/util/primitives.js +3 -2
  251. package/dist/index.js +7 -1
  252. package/dist/infra/perf/BackgroundQueue.js +482 -0
  253. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  254. package/dist/infra/perf/PromiseDedup.js +24 -0
  255. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  256. package/dist/infra/perf/StoreLock.js +84 -0
  257. package/dist/media/WaMediaCrypto.js +328 -51
  258. package/dist/media/WaMediaTransferClient.js +72 -253
  259. package/dist/media/constants.js +5 -2
  260. package/dist/media/processor.js +2 -0
  261. package/dist/message/WaMessageClient.js +26 -19
  262. package/dist/message/addon-crypto.js +131 -0
  263. package/dist/message/content.js +211 -14
  264. package/dist/message/icdc.js +81 -0
  265. package/dist/message/incoming.js +38 -24
  266. package/dist/message/phash.js +35 -13
  267. package/dist/message/reporting-token.js +16 -30
  268. package/dist/message/use-case-secret.js +1 -1
  269. package/dist/protocol/abprops.js +163 -0
  270. package/dist/protocol/appstate.js +10 -41
  271. package/dist/protocol/browser.js +25 -18
  272. package/dist/protocol/constants.js +33 -2
  273. package/dist/protocol/defaults.js +6 -0
  274. package/dist/protocol/email.js +33 -0
  275. package/dist/protocol/index.js +8 -5
  276. package/dist/protocol/jid.js +149 -39
  277. package/dist/protocol/message.js +62 -2
  278. package/dist/protocol/nodes.js +8 -2
  279. package/dist/protocol/notification.js +10 -2
  280. package/dist/protocol/privacy-token.js +20 -0
  281. package/dist/protocol/privacy.js +58 -0
  282. package/dist/protocol/stream.js +27 -2
  283. package/dist/retry/codec.js +220 -0
  284. package/dist/retry/constants.js +1 -1
  285. package/dist/retry/index.js +5 -5
  286. package/dist/retry/parse.js +51 -30
  287. package/dist/retry/reason.js +1 -1
  288. package/dist/retry/replay.js +10 -6
  289. package/dist/retry/tracker.js +50 -12
  290. package/dist/signal/api/SignalDeviceSyncApi.js +51 -31
  291. package/dist/signal/api/SignalDigestSyncApi.js +21 -15
  292. package/dist/signal/api/SignalIdentitySyncApi.js +29 -14
  293. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  294. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  295. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  296. package/dist/signal/api/result-map.js +13 -0
  297. package/dist/signal/constants.js +1 -5
  298. package/dist/signal/crypto/WaAdvSignature.js +2 -44
  299. package/dist/signal/crypto/constants.js +1 -5
  300. package/dist/signal/{store/sqlite.js → encoding.js} +41 -25
  301. package/dist/signal/group/SenderKeyChain.js +2 -2
  302. package/dist/signal/group/SenderKeyCodec.js +8 -8
  303. package/dist/signal/group/SenderKeyManager.js +130 -108
  304. package/dist/signal/index.js +13 -1
  305. package/dist/signal/registration/keygen.js +7 -4
  306. package/dist/signal/registration/utils.js +3 -2
  307. package/dist/signal/session/SignalProtocol.js +158 -81
  308. package/dist/signal/session/SignalRatchet.js +19 -8
  309. package/dist/signal/session/SignalSerializer.js +5 -6
  310. package/dist/signal/session/SignalSession.js +11 -9
  311. package/dist/signal/session/resolver.js +138 -103
  312. package/dist/store/contracts/identity.store.js +2 -0
  313. package/dist/store/contracts/message-secret.store.js +2 -0
  314. package/dist/store/contracts/pre-key.store.js +2 -0
  315. package/dist/store/contracts/privacy-token.store.js +2 -0
  316. package/dist/store/contracts/session.store.js +2 -0
  317. package/dist/store/createStore.js +142 -192
  318. package/dist/store/index.js +23 -33
  319. package/dist/store/locks/appstate.lock.js +29 -0
  320. package/dist/store/locks/auth.lock.js +18 -0
  321. package/dist/store/locks/contact.lock.js +23 -0
  322. package/dist/store/locks/device-list.lock.js +23 -0
  323. package/dist/store/locks/identity.lock.js +19 -0
  324. package/dist/store/locks/message-secret.lock.js +20 -0
  325. package/dist/store/locks/message.lock.js +24 -0
  326. package/dist/store/locks/participants.lock.js +23 -0
  327. package/dist/store/locks/pre-key.lock.js +30 -0
  328. package/dist/store/locks/privacy-token.lock.js +21 -0
  329. package/dist/store/locks/retry.lock.js +32 -0
  330. package/dist/store/locks/sender-key.lock.js +55 -0
  331. package/dist/store/locks/session.lock.js +22 -0
  332. package/dist/store/locks/signal.lock.js +42 -0
  333. package/dist/store/locks/thread.lock.js +24 -0
  334. package/dist/store/noop.store.js +22 -2
  335. package/dist/store/providers/memory/appstate.store.js +22 -24
  336. package/dist/store/providers/memory/device-list.store.js +13 -5
  337. package/dist/store/providers/memory/identity.store.js +35 -0
  338. package/dist/store/providers/memory/message-secret.store.js +85 -0
  339. package/dist/store/providers/memory/participants.store.js +3 -0
  340. package/dist/store/providers/memory/pre-key.store.js +101 -0
  341. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  342. package/dist/store/providers/memory/retry.store.js +98 -9
  343. package/dist/store/providers/memory/sender-key.store.js +6 -1
  344. package/dist/store/providers/memory/session.store.js +49 -0
  345. package/dist/store/providers/memory/signal.store.js +1 -147
  346. package/dist/transport/WaComms.js +7 -4
  347. package/dist/transport/WaWebSocket.js +9 -7
  348. package/dist/transport/binary/constants.js +1 -31
  349. package/dist/transport/binary/decoder.js +4 -4
  350. package/dist/transport/binary/encoder.js +8 -15
  351. package/dist/transport/binary/index.js +0 -4
  352. package/dist/transport/index.js +17 -1
  353. package/dist/transport/keepalive/WaKeepAlive.js +17 -8
  354. package/dist/transport/node/WaMobileTcpSocket.js +118 -0
  355. package/dist/transport/node/WaNodeOrchestrator.js +36 -21
  356. package/dist/transport/node/builders/abprops.js +23 -0
  357. package/dist/transport/node/builders/business.js +137 -0
  358. package/dist/transport/node/builders/device.js +14 -0
  359. package/dist/transport/node/builders/email.js +72 -0
  360. package/dist/transport/node/builders/global.js +375 -0
  361. package/dist/transport/node/builders/message.js +64 -245
  362. package/dist/transport/node/builders/offline.js +17 -0
  363. package/dist/transport/node/builders/pairing.js +0 -26
  364. package/dist/transport/node/builders/prekeys.js +36 -39
  365. package/dist/transport/node/builders/presence.js +16 -0
  366. package/dist/transport/node/builders/privacy-token.js +42 -0
  367. package/dist/transport/node/builders/privacy.js +55 -0
  368. package/dist/transport/node/builders/profile.js +78 -0
  369. package/dist/transport/node/builders/retry.js +10 -22
  370. package/dist/transport/node/builders/usync.js +6 -2
  371. package/dist/transport/node/helpers.js +46 -1
  372. package/dist/transport/node/mex/argo-decoder.js +189 -0
  373. package/dist/transport/node/mex/client.js +86 -0
  374. package/dist/transport/node/mex/persist-ids.js +13 -0
  375. package/dist/transport/node/usync.js +2 -32
  376. package/dist/transport/node/xml.js +35 -14
  377. package/dist/transport/noise/WaClientPayload.js +26 -21
  378. package/dist/transport/noise/WaFrameCodec.js +1 -1
  379. package/dist/transport/noise/WaMobileClientPayload.js +56 -0
  380. package/dist/transport/noise/WaNoiseCert.js +8 -26
  381. package/dist/transport/noise/WaNoiseSession.js +75 -33
  382. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  383. package/dist/transport/stream/parse.js +7 -3
  384. package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
  385. package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
  386. package/dist/types/appstate/encoding.d.ts +7 -0
  387. package/dist/types/appstate/index.d.ts +3 -3
  388. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
  389. package/dist/types/appstate/types.d.ts +1 -1
  390. package/dist/types/appstate/utils.d.ts +0 -2
  391. package/dist/types/auth/WaAuthClient.d.ts +9 -3
  392. package/dist/types/auth/credentials-flow.d.ts +20 -0
  393. package/dist/types/auth/index.d.ts +0 -2
  394. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  395. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
  396. package/dist/types/auth/types.d.ts +41 -0
  397. package/dist/types/client/WaClient.d.ts +44 -18
  398. package/dist/types/client/WaClientFactory.d.ts +22 -8
  399. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  400. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  401. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  402. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
  403. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +9 -2
  404. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -2
  405. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  406. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +16 -1
  407. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  408. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +38 -0
  409. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +12 -0
  410. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  411. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +55 -0
  412. package/dist/types/client/dirty.d.ts +3 -1
  413. package/dist/types/client/events/abprops.d.ts +14 -0
  414. package/dist/types/client/events/devices.d.ts +20 -0
  415. package/dist/types/client/events/identity.d.ts +9 -0
  416. package/dist/types/client/events/privacy-token.d.ts +7 -0
  417. package/dist/types/client/events/registration.d.ts +17 -0
  418. package/dist/types/client/history-sync.d.ts +9 -6
  419. package/dist/types/client/incoming.d.ts +9 -2
  420. package/dist/types/client/index.d.ts +1 -1
  421. package/dist/types/client/mailbox.d.ts +5 -5
  422. package/dist/types/client/media.d.ts +31 -0
  423. package/dist/types/client/messages.d.ts +3 -2
  424. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  425. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  426. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  427. package/dist/types/client/types.d.ts +151 -4
  428. package/dist/types/crypto/core/index.d.ts +3 -2
  429. package/dist/types/crypto/core/nonce.d.ts +2 -0
  430. package/dist/types/crypto/core/primitives.d.ts +1 -2
  431. package/dist/types/crypto/core/random.d.ts +2 -1
  432. package/dist/types/crypto/core/xeddsa.d.ts +2 -0
  433. package/dist/types/crypto/curves/constants.d.ts +1 -0
  434. package/dist/types/crypto/index.d.ts +2 -0
  435. package/dist/types/crypto/math/constants.d.ts +4 -2
  436. package/dist/types/crypto/math/fe.d.ts +30 -0
  437. package/dist/types/crypto/math/mod.d.ts +0 -2
  438. package/dist/types/crypto/math/types.d.ts +11 -4
  439. package/dist/types/index.d.ts +6 -3
  440. package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
  441. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  442. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  443. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  444. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  445. package/dist/types/infra/perf/StoreLock.d.ts +11 -0
  446. package/dist/types/media/WaMediaCrypto.d.ts +16 -6
  447. package/dist/types/media/WaMediaTransferClient.d.ts +6 -23
  448. package/dist/types/media/constants.d.ts +3 -1
  449. package/dist/types/media/index.d.ts +2 -1
  450. package/dist/types/media/processor.d.ts +28 -0
  451. package/dist/types/media/types.d.ts +19 -5
  452. package/dist/types/message/addon-crypto.d.ts +34 -3
  453. package/dist/types/message/content.d.ts +11 -1
  454. package/dist/types/message/icdc.d.ts +13 -0
  455. package/dist/types/message/reporting-token.d.ts +0 -1
  456. package/dist/types/message/types.d.ts +42 -11
  457. package/dist/types/protocol/abprops.d.ts +142 -0
  458. package/dist/types/protocol/appstate.d.ts +0 -11
  459. package/dist/types/protocol/browser.d.ts +1 -0
  460. package/dist/types/protocol/constants.d.ts +12 -4
  461. package/dist/types/protocol/defaults.d.ts +6 -0
  462. package/dist/types/protocol/email.d.ts +32 -0
  463. package/dist/types/protocol/index.d.ts +1 -2
  464. package/dist/types/protocol/jid.d.ts +20 -2
  465. package/dist/types/protocol/message.d.ts +60 -0
  466. package/dist/types/protocol/nodes.d.ts +6 -0
  467. package/dist/types/protocol/notification.d.ts +8 -0
  468. package/dist/types/protocol/privacy-token.d.ts +17 -0
  469. package/dist/types/protocol/privacy.d.ts +75 -0
  470. package/dist/types/protocol/stream.d.ts +31 -0
  471. package/dist/types/retry/codec.d.ts +3 -0
  472. package/dist/types/retry/index.d.ts +3 -3
  473. package/dist/types/retry/parse.d.ts +5 -2
  474. package/dist/types/retry/reason.d.ts +1 -1
  475. package/dist/types/retry/tracker.d.ts +1 -0
  476. package/dist/types/retry/types.d.ts +6 -1
  477. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  478. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +9 -0
  479. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +5 -3
  480. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  481. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  482. package/dist/types/signal/api/result-map.d.ts +1 -0
  483. package/dist/types/signal/constants.d.ts +0 -3
  484. package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
  485. package/dist/types/signal/crypto/constants.d.ts +0 -1
  486. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +9 -3
  487. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  488. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -7
  489. package/dist/types/signal/index.d.ts +2 -0
  490. package/dist/types/signal/registration/utils.d.ts +2 -1
  491. package/dist/types/signal/session/SignalProtocol.d.ts +21 -6
  492. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  493. package/dist/types/signal/session/resolver.d.ts +11 -4
  494. package/dist/types/signal/types.d.ts +16 -4
  495. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  496. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  497. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  498. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  499. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  500. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  501. package/dist/types/store/contracts/session.store.d.ts +14 -0
  502. package/dist/types/store/contracts/signal.store.d.ts +1 -27
  503. package/dist/types/store/createStore.d.ts +1 -1
  504. package/dist/types/store/index.d.ts +12 -12
  505. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  506. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  507. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  508. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  509. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  510. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  511. package/dist/types/store/locks/message.lock.d.ts +3 -0
  512. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  513. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  514. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  515. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  516. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  517. package/dist/types/store/locks/session.lock.d.ts +3 -0
  518. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  519. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  520. package/dist/types/store/noop.store.d.ts +4 -0
  521. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  522. package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
  523. package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
  524. package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
  525. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  526. package/dist/types/store/providers/memory/retry.store.d.ts +15 -1
  527. package/dist/types/store/providers/memory/session.store.d.ts +21 -0
  528. package/dist/types/store/providers/memory/signal.store.d.ts +2 -43
  529. package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
  530. package/dist/types/store/types.d.ts +69 -61
  531. package/dist/types/transport/WaWebSocket.d.ts +1 -1
  532. package/dist/types/transport/binary/constants.d.ts +0 -30
  533. package/dist/types/transport/binary/index.d.ts +0 -1
  534. package/dist/types/transport/index.d.ts +8 -1
  535. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
  536. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
  537. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +9 -6
  538. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  539. package/dist/types/transport/node/builders/business.d.ts +29 -0
  540. package/dist/types/transport/node/builders/device.d.ts +2 -0
  541. package/dist/types/transport/node/builders/email.d.ts +11 -0
  542. package/dist/types/transport/node/builders/global.d.ts +102 -0
  543. package/dist/types/transport/node/builders/message.d.ts +8 -7
  544. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  545. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  546. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  547. package/dist/types/transport/node/builders/presence.d.ts +6 -0
  548. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  549. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  550. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  551. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  552. package/dist/types/transport/node/helpers.d.ts +8 -0
  553. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  554. package/dist/types/transport/node/mex/client.d.ts +18 -0
  555. package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
  556. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
  557. package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
  558. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  559. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  560. package/dist/types/transport/types.d.ts +8 -0
  561. package/dist/types/util/bytes.d.ts +1 -1
  562. package/dist/types/util/index.d.ts +5 -0
  563. package/dist/types/util/primitives.d.ts +0 -1
  564. package/dist/util/bytes.js +22 -18
  565. package/dist/util/index.js +23 -0
  566. package/dist/util/primitives.js +2 -2
  567. package/package.json +34 -10
  568. package/proto/index.js +1 -1
  569. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  570. package/dist/auth/pairing/constants.js +0 -5
  571. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  572. package/dist/crypto/core/constants.js +0 -4
  573. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  574. package/dist/esm/auth/pairing/constants.js +0 -2
  575. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  576. package/dist/esm/crypto/core/constants.js +0 -1
  577. package/dist/esm/retry/outbound.js +0 -82
  578. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  579. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  580. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  581. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  582. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  583. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  584. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  585. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  586. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  587. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  588. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  589. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  590. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  591. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  592. package/dist/esm/transport/node/builders/index.js +0 -8
  593. package/dist/retry/outbound.js +0 -87
  594. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  595. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  596. package/dist/store/providers/sqlite/auth.store.js +0 -180
  597. package/dist/store/providers/sqlite/connection.js +0 -281
  598. package/dist/store/providers/sqlite/contact.store.js +0 -78
  599. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  600. package/dist/store/providers/sqlite/message.store.js +0 -136
  601. package/dist/store/providers/sqlite/migrations.js +0 -350
  602. package/dist/store/providers/sqlite/participants.store.js +0 -81
  603. package/dist/store/providers/sqlite/retry.store.js +0 -145
  604. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  605. package/dist/store/providers/sqlite/signal.store.js +0 -439
  606. package/dist/store/providers/sqlite/table-names.js +0 -113
  607. package/dist/store/providers/sqlite/thread.store.js +0 -89
  608. package/dist/transport/node/builders/index.js +0 -42
  609. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  610. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  611. package/dist/types/auth/pairing/constants.d.ts +0 -2
  612. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  613. package/dist/types/crypto/core/constants.d.ts +0 -1
  614. package/dist/types/retry/outbound.d.ts +0 -4
  615. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  616. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  617. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  618. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  619. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  620. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  621. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  622. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  623. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  624. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  625. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  626. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  627. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  628. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
  629. package/dist/types/transport/node/builders/index.d.ts +0 -8
  630. /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
@@ -1,16 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ADV_PREFIX_HOSTED_DEVICE_SIGNATURE = exports.ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE = exports.ADV_PREFIX_DEVICE_SIGNATURE = exports.ADV_PREFIX_ACCOUNT_SIGNATURE = void 0;
4
- exports.verifySignalSignature = verifySignalSignature;
5
- exports.signSignalMessage = signSignalMessage;
6
4
  exports.verifyDeviceIdentityAccountSignature = verifyDeviceIdentityAccountSignature;
7
5
  exports.generateDeviceSignature = generateDeviceSignature;
8
6
  exports.computeAdvIdentityHmac = computeAdvIdentityHmac;
9
7
  const _crypto_1 = require("../../crypto/index.js");
10
- const X25519_1 = require("../../crypto/curves/X25519");
11
- const edwards_1 = require("../../crypto/math/edwards");
12
- const le_1 = require("../../crypto/math/le");
13
- const mod_1 = require("../../crypto/math/mod");
14
8
  const constants_1 = require("../crypto/constants");
15
9
  const bytes_1 = require("../../util/bytes");
16
10
  var constants_2 = require("../crypto/constants");
@@ -18,51 +12,15 @@ Object.defineProperty(exports, "ADV_PREFIX_ACCOUNT_SIGNATURE", { enumerable: tru
18
12
  Object.defineProperty(exports, "ADV_PREFIX_DEVICE_SIGNATURE", { enumerable: true, get: function () { return constants_2.ADV_PREFIX_DEVICE_SIGNATURE; } });
19
13
  Object.defineProperty(exports, "ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE", { enumerable: true, get: function () { return constants_2.ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE; } });
20
14
  Object.defineProperty(exports, "ADV_PREFIX_HOSTED_DEVICE_SIGNATURE", { enumerable: true, get: function () { return constants_2.ADV_PREFIX_HOSTED_DEVICE_SIGNATURE; } });
21
- async function verifySignalSignature(publicKey, message, signature) {
22
- if (!(0, bytes_1.assertByteLength)(signature, 64, 'invalid signal signature length', false)) {
23
- return false;
24
- }
25
- if ((signature[63] & 0x60) !== 0) {
26
- return false;
27
- }
28
- const signalSignature = new Uint8Array(signature);
29
- const signBit = signalSignature[63] & 0x80;
30
- signalSignature[63] &= 0x7f;
31
- const curvePublic = (0, _crypto_1.toRawPubKey)(publicKey);
32
- const edPublic = (0, X25519_1.montgomeryToEdwardsPublic)(curvePublic, signBit);
33
- return (0, _crypto_1.ed25519VerifyRaw)(edPublic, signalSignature, message);
34
- }
35
- async function signSignalMessage(privateKey, message) {
36
- (0, bytes_1.assertByteLength)(privateKey, 32, `invalid curve25519 private key length ${privateKey.length}`);
37
- const clampedPrivateKey = (0, X25519_1.clampCurvePrivateKeyInPlace)(privateKey);
38
- const privateScalar = (0, le_1.bytesToBigIntLE)(clampedPrivateKey);
39
- const encodedPublic = (0, edwards_1.encodeExtendedPoint)((0, edwards_1.scalarMultBase)(privateScalar));
40
- const pubKeySignBit = encodedPublic[31] & 0x80;
41
- const randomSuffix = await (0, _crypto_1.randomBytesAsync)(64);
42
- const hashInput = (0, bytes_1.concatBytes)([
43
- constants_1.SIGNAL_PREFIX_SIGNATURE_RANDOM,
44
- clampedPrivateKey,
45
- message,
46
- randomSuffix
47
- ]);
48
- const r = (0, mod_1.modGroup)((0, le_1.bytesToBigIntLE)(await (0, _crypto_1.sha512)(hashInput)));
49
- const encodedR = (0, edwards_1.encodeExtendedPoint)((0, edwards_1.scalarMultBase)(r));
50
- const hInput = (0, bytes_1.concatBytes)([encodedR, encodedPublic, message]);
51
- const h = (0, mod_1.modGroup)((0, le_1.bytesToBigIntLE)(await (0, _crypto_1.sha512)(hInput)));
52
- const s = (0, mod_1.modGroup)(r + h * privateScalar);
53
- const encodedS = (0, le_1.bigIntToBytesLE)(s, 32);
54
- encodedS[31] = (encodedS[31] & 0x7f) | pubKeySignBit;
55
- return (0, bytes_1.concatBytes)([encodedR, encodedS]);
56
- }
57
15
  async function verifyDeviceIdentityAccountSignature(details, accountSignature, identityPublicKey, accountSignatureKey, isHosted = false) {
58
16
  const prefix = isHosted ? constants_1.ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE : constants_1.ADV_PREFIX_ACCOUNT_SIGNATURE;
59
17
  const message = (0, bytes_1.concatBytes)([prefix, details, identityPublicKey]);
60
- return verifySignalSignature(accountSignatureKey, message, accountSignature);
18
+ return (0, _crypto_1.xeddsaVerify)((0, _crypto_1.toRawPubKey)(accountSignatureKey), message, accountSignature);
61
19
  }
62
20
  async function generateDeviceSignature(details, identityKeyPair, accountSignatureKey, isHosted = false) {
63
21
  const prefix = isHosted ? constants_1.ADV_PREFIX_HOSTED_DEVICE_SIGNATURE : constants_1.ADV_PREFIX_DEVICE_SIGNATURE;
64
22
  const message = (0, bytes_1.concatBytes)([prefix, details, identityKeyPair.pubKey, accountSignatureKey]);
65
- return signSignalMessage(identityKeyPair.privKey, message);
23
+ return (0, _crypto_1.xeddsaSign)(identityKeyPair.privKey, message);
66
24
  }
67
25
  async function computeAdvIdentityHmac(secretKey, details) {
68
26
  const key = await (0, _crypto_1.importHmacKey)(secretKey);
@@ -1,10 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ADV_PREFIX_HOSTED_DEVICE_SIGNATURE = exports.ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE = exports.ADV_PREFIX_DEVICE_SIGNATURE = exports.ADV_PREFIX_ACCOUNT_SIGNATURE = exports.SIGNAL_PREFIX_SIGNATURE_RANDOM = void 0;
4
- exports.SIGNAL_PREFIX_SIGNATURE_RANDOM = new Uint8Array([
5
- 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
7
- ]);
3
+ exports.ADV_PREFIX_HOSTED_DEVICE_SIGNATURE = exports.ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE = exports.ADV_PREFIX_DEVICE_SIGNATURE = exports.ADV_PREFIX_ACCOUNT_SIGNATURE = void 0;
8
4
  exports.ADV_PREFIX_ACCOUNT_SIGNATURE = new Uint8Array([6, 0]);
9
5
  exports.ADV_PREFIX_DEVICE_SIGNATURE = new Uint8Array([6, 1]);
10
6
  exports.ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE = new Uint8Array([6, 5]);
@@ -5,17 +5,22 @@ exports.decodeSignalAddressFromRow = decodeSignalAddressFromRow;
5
5
  exports.decodeSignalRegistrationRow = decodeSignalRegistrationRow;
6
6
  exports.decodeSignalPreKeyRow = decodeSignalPreKeyRow;
7
7
  exports.decodeSignalSignedPreKeyRow = decodeSignalSignedPreKeyRow;
8
+ exports.encodeSignalSessionSnapshot = encodeSignalSessionSnapshot;
9
+ exports.encodeSignalRecvChain = encodeSignalRecvChain;
10
+ exports.decodeSignalMessageKey = decodeSignalMessageKey;
11
+ exports.decodeSignalRecvChain = decodeSignalRecvChain;
12
+ exports.decodeSignalSessionSnapshot = decodeSignalSessionSnapshot;
8
13
  exports.encodeSignalSessionRecord = encodeSignalSessionRecord;
9
14
  exports.decodeSignalSessionRecord = decodeSignalSessionRecord;
10
15
  exports.encodeSenderKeyRecord = encodeSenderKeyRecord;
11
16
  exports.decodeSenderKeyRecord = decodeSenderKeyRecord;
12
17
  exports.decodeSenderKeyDistributionRow = decodeSenderKeyDistributionRow;
13
- exports.decodeSqliteCount = decodeSqliteCount;
18
+ exports.decodeStoreCount = decodeStoreCount;
14
19
  exports.decodeSignalRemoteIdentity = decodeSignalRemoteIdentity;
15
- const _proto_1 = require("../../proto.js");
16
- const constants_1 = require("../../protocol/constants");
17
- const bytes_1 = require("../../util/bytes");
18
- const coercion_1 = require("../../util/coercion");
20
+ const _proto_1 = require("../proto.js");
21
+ const constants_1 = require("../protocol/constants");
22
+ const bytes_1 = require("../util/bytes");
23
+ const coercion_1 = require("../util/coercion");
19
24
  function toSignalAddressParts(address) {
20
25
  return {
21
26
  user: address.user,
@@ -70,7 +75,7 @@ function encodeSignalSessionSnapshot(session) {
70
75
  rootKey: session.rootKey,
71
76
  previousCounter: session.prevSendChainHighestIndex,
72
77
  senderChain: encodeSignalSendChain(session.sendChain),
73
- receiverChains: session.recvChains.map((chain) => encodeSignalRecvChain(chain)),
78
+ receiverChains: session.recvChains,
74
79
  pendingPreKey: session.initialExchangeInfo
75
80
  ? {
76
81
  preKeyId: session.initialExchangeInfo.remoteOneTimeId ?? undefined,
@@ -99,12 +104,7 @@ function encodeSignalRecvChain(chain) {
99
104
  index: chain.nextMsgIndex,
100
105
  key: chain.chainKey
101
106
  },
102
- messageKeys: (chain.unusedMsgKeys ?? []).map((messageKey) => ({
103
- index: messageKey.index,
104
- cipherKey: messageKey.cipherKey,
105
- macKey: messageKey.macKey,
106
- iv: messageKey.iv
107
- }))
107
+ messageKeys: chain.unusedMsgKeys
108
108
  };
109
109
  }
110
110
  function decodeSignalMessageKey(messageKey, field) {
@@ -134,7 +134,7 @@ function decodeSignalRecvChain(chain, field) {
134
134
  ratchetPubKey,
135
135
  nextMsgIndex: (0, coercion_1.asNumber)(chainKey.index, `${field}.chainKey.index`),
136
136
  chainKey: chainKeyBytes,
137
- unusedMsgKeys: (chain.messageKeys ?? []).map((messageKey, index) => decodeSignalMessageKey(messageKey, `${field}.messageKeys[${index}]`))
137
+ unusedMsgKeys: chain.messageKeys ?? []
138
138
  };
139
139
  }
140
140
  function decodeSignalSendChain(chain, field) {
@@ -193,7 +193,7 @@ function decodeSignalSessionSnapshot(session, field) {
193
193
  },
194
194
  rootKey,
195
195
  sendChain: decodeSignalSendChain(senderChain, `${field}.senderChain`),
196
- recvChains: (session.receiverChains ?? []).map((chain, index) => decodeSignalRecvChain(chain, `${field}.receiverChains[${index}]`)),
196
+ recvChains: session.receiverChains ?? [],
197
197
  initialExchangeInfo: pendingPreKey
198
198
  ? {
199
199
  remoteOneTimeId: (0, coercion_1.asOptionalNumber)(pendingPreKey.preKeyId, `${field}.pendingPreKey.preKeyId`) ??
@@ -209,7 +209,7 @@ function decodeSignalSessionSnapshot(session, field) {
209
209
  function encodeSignalSessionRecord(record) {
210
210
  return _proto_1.proto.RecordStructure.encode({
211
211
  currentSession: encodeSignalSessionSnapshot(record),
212
- previousSessions: record.prevSessions.map((session) => encodeSignalSessionSnapshot(session))
212
+ previousSessions: record.prevSessions
213
213
  }).finish();
214
214
  }
215
215
  function decodeSignalSessionRecord(raw) {
@@ -220,7 +220,7 @@ function decodeSignalSessionRecord(raw) {
220
220
  const current = decodeSignalSessionSnapshot(decoded.currentSession, 'signal_sessions.currentSession');
221
221
  return {
222
222
  ...current,
223
- prevSessions: (decoded.previousSessions ?? []).map((session, index) => decodeSignalSessionSnapshot(session, `signal_sessions.previousSessions[${index}]`))
223
+ prevSessions: decoded.previousSessions ?? []
224
224
  };
225
225
  }
226
226
  function encodeSenderKeyRecord(record) {
@@ -236,10 +236,18 @@ function encodeSenderKeyRecord(record) {
236
236
  public: record.signingPublicKey,
237
237
  private: record.signingPrivateKey
238
238
  },
239
- senderMessageKeys: (record.unusedMessageKeys ?? []).map((messageKey) => ({
240
- iteration: messageKey.iteration,
241
- seed: messageKey.seed
242
- }))
239
+ senderMessageKeys: (() => {
240
+ const src = record.unusedMessageKeys ?? [];
241
+ const arr = new Array(src.length);
242
+ for (let i = 0; i < src.length; i += 1) {
243
+ const messageKey = src[i];
244
+ arr[i] = {
245
+ iteration: messageKey.iteration,
246
+ seed: messageKey.seed
247
+ };
248
+ }
249
+ return arr;
250
+ })()
243
251
  }
244
252
  ]
245
253
  }).finish();
@@ -259,10 +267,18 @@ function decodeSenderKeyState(state, field) {
259
267
  signingPrivateKey: state.senderSigningKey.private !== null && state.senderSigningKey.private !== undefined
260
268
  ? (0, coercion_1.asBytes)(state.senderSigningKey.private, `${field}.senderSigningKey.private`)
261
269
  : undefined,
262
- unusedMessageKeys: (state.senderMessageKeys ?? []).map((messageKey, index) => ({
263
- iteration: (0, coercion_1.asNumber)(messageKey.iteration, `${field}.senderMessageKeys[${index}].iteration`),
264
- seed: (0, coercion_1.asBytes)(messageKey.seed, `${field}.senderMessageKeys[${index}].seed`)
265
- }))
270
+ unusedMessageKeys: (() => {
271
+ const src = state.senderMessageKeys ?? [];
272
+ const arr = new Array(src.length);
273
+ for (let i = 0; i < src.length; i += 1) {
274
+ const messageKey = src[i];
275
+ arr[i] = {
276
+ iteration: (0, coercion_1.asNumber)(messageKey.iteration, `${field}.senderMessageKeys[${i}].iteration`),
277
+ seed: (0, coercion_1.asBytes)(messageKey.seed, `${field}.senderMessageKeys[${i}].seed`)
278
+ };
279
+ }
280
+ return arr;
281
+ })()
266
282
  };
267
283
  }
268
284
  function decodeSenderKeyRecord(raw, groupId, sender) {
@@ -295,7 +311,7 @@ function decodeSenderKeyDistributionRow(row) {
295
311
  timestampMs: (0, coercion_1.asNumber)(row.timestamp_ms, 'sender_key_distribution.timestamp_ms')
296
312
  };
297
313
  }
298
- function decodeSqliteCount(row, field) {
314
+ function decodeStoreCount(row, field) {
299
315
  return row ? (0, coercion_1.asNumber)(row.count, field) : 0;
300
316
  }
301
317
  function decodeSignalRemoteIdentity(raw) {
@@ -5,9 +5,9 @@ exports.deriveSenderKeyMsgKey = deriveSenderKeyMsgKey;
5
5
  const _crypto_1 = require("../../crypto/index.js");
6
6
  const constants_1 = require("../constants");
7
7
  const bytes_1 = require("../../util/bytes");
8
- async function selectMessageKey(senderKey, targetIteration) {
8
+ async function selectMessageKey(senderKey, targetIteration, futureMessagesMax) {
9
9
  const delta = targetIteration - senderKey.iteration;
10
- if (delta > constants_1.SENDER_KEY_FUTURE_MESSAGES_MAX) {
10
+ if (delta > (futureMessagesMax ?? constants_1.SENDER_KEY_FUTURE_MESSAGES_MAX)) {
11
11
  throw new Error('sender key message is too far in future');
12
12
  }
13
13
  const currentUnused = senderKey.unusedMessageKeys ?? [];
@@ -4,10 +4,11 @@ exports.parseDistributionPayload = parseDistributionPayload;
4
4
  exports.parseSenderKeyMessage = parseSenderKeyMessage;
5
5
  const _crypto_1 = require("../../crypto/index.js");
6
6
  const _proto_1 = require("../../proto.js");
7
- const constants_1 = require("../constants");
7
+ const constants_1 = require("../api/constants");
8
+ const constants_2 = require("../constants");
8
9
  const bytes_1 = require("../../util/bytes");
9
10
  function parseDistributionPayload(payload) {
10
- const body = (0, _crypto_1.readVersionedContent)(payload, constants_1.SIGNAL_GROUP_VERSION, 0);
11
+ const body = (0, _crypto_1.readVersionedContent)(payload, constants_2.SIGNAL_GROUP_VERSION, 0);
11
12
  const decoded = _proto_1.proto.SenderKeyDistributionMessage.decode(body);
12
13
  if (decoded.id === null ||
13
14
  decoded.id === undefined ||
@@ -19,17 +20,16 @@ function parseDistributionPayload(payload) {
19
20
  decoded.signingKey === undefined) {
20
21
  throw new Error('invalid sender key distribution message');
21
22
  }
22
- const chainKey = (0, bytes_1.toBytesView)(decoded.chainKey);
23
- (0, bytes_1.assertByteLength)(chainKey, 32, 'sender key distribution chainKey must be 32 bytes');
23
+ (0, bytes_1.assertByteLength)(decoded.chainKey, 32, 'sender key distribution chainKey must be 32 bytes');
24
24
  return {
25
25
  keyId: decoded.id,
26
26
  iteration: decoded.iteration,
27
- chainKey,
28
- signingPublicKey: (0, _crypto_1.toSerializedPubKey)((0, bytes_1.toBytesView)(decoded.signingKey))
27
+ chainKey: decoded.chainKey,
28
+ signingPublicKey: (0, _crypto_1.toSerializedPubKey)(decoded.signingKey)
29
29
  };
30
30
  }
31
31
  function parseSenderKeyMessage(versionContentMac) {
32
- const body = (0, _crypto_1.readVersionedContent)(versionContentMac, constants_1.SIGNAL_GROUP_VERSION, constants_1.SIGNATURE_SIZE);
32
+ const body = (0, _crypto_1.readVersionedContent)(versionContentMac, constants_2.SIGNAL_GROUP_VERSION, constants_1.SIGNAL_SIGNATURE_LENGTH);
33
33
  const decoded = _proto_1.proto.SenderKeyMessage.decode(body);
34
34
  if (decoded.id === null ||
35
35
  decoded.id === undefined ||
@@ -42,7 +42,7 @@ function parseSenderKeyMessage(versionContentMac) {
42
42
  return {
43
43
  keyId: decoded.id,
44
44
  iteration: decoded.iteration,
45
- ciphertext: (0, bytes_1.toBytesView)(decoded.ciphertext),
45
+ ciphertext: decoded.ciphertext,
46
46
  versionContentMac
47
47
  };
48
48
  }
@@ -2,9 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SenderKeyManager = void 0;
4
4
  const _crypto_1 = require("../../crypto/index.js");
5
+ const StoreLock_1 = require("../../infra/perf/StoreLock");
5
6
  const _proto_1 = require("../../proto.js");
6
- const constants_1 = require("../constants");
7
- const WaAdvSignature_1 = require("../crypto/WaAdvSignature");
7
+ const jid_1 = require("../../protocol/jid");
8
+ const constants_1 = require("../api/constants");
9
+ const constants_2 = require("../constants");
8
10
  const SenderKeyChain_1 = require("../group/SenderKeyChain");
9
11
  const SenderKeyCodec_1 = require("../group/SenderKeyCodec");
10
12
  const bytes_1 = require("../../util/bytes");
@@ -26,144 +28,161 @@ async function aesCbcDecryptFromSeed(seed, ciphertext) {
26
28
  return (0, _crypto_1.aesCbcDecrypt)(await (0, _crypto_1.importAesCbcKey)(keyBytes), iv, ciphertext);
27
29
  }
28
30
  class SenderKeyManager {
29
- constructor(store) {
31
+ constructor(store, options) {
32
+ this.senderLock = new StoreLock_1.StoreLock();
30
33
  this.store = store;
34
+ this.getFutureMessagesMax = options?.getFutureMessagesMax;
35
+ this.skipSignatureVerification = options?.skipSignatureVerification === true;
31
36
  }
32
- async createSenderKeyDistributionMessage(groupId, sender) {
33
- const senderKey = await this.ensureSenderKey(groupId, sender);
34
- const distributionProto = _proto_1.proto.SenderKeyDistributionMessage.encode({
35
- id: senderKey.keyId,
36
- iteration: senderKey.iteration,
37
- chainKey: senderKey.chainKey,
38
- signingKey: senderKey.signingPublicKey
39
- }).finish();
40
- const payload = (0, _crypto_1.prependVersion)(distributionProto, constants_1.SIGNAL_GROUP_VERSION);
41
- await this.store.upsertSenderKeyDistribution({
42
- groupId,
43
- sender,
44
- keyId: senderKey.keyId,
45
- timestampMs: Date.now()
37
+ async prepareGroupEncryption(groupId, sender, plaintext) {
38
+ return this.runWithSenderLock(groupId, sender, async () => {
39
+ const senderKey = await this.ensureSenderKeyInternal(groupId, sender);
40
+ if (!senderKey.signingPrivateKey) {
41
+ throw new Error('sender private signing key is missing');
42
+ }
43
+ const derived = await (0, SenderKeyChain_1.deriveSenderKeyMsgKey)(senderKey.iteration, senderKey.chainKey);
44
+ await this.store.upsertSenderKey({
45
+ ...senderKey,
46
+ chainKey: derived.nextChainKey,
47
+ iteration: derived.messageKey.iteration + 1
48
+ });
49
+ const distributionProto = _proto_1.proto.SenderKeyDistributionMessage.encode({
50
+ id: senderKey.keyId,
51
+ iteration: senderKey.iteration,
52
+ chainKey: senderKey.chainKey,
53
+ signingKey: senderKey.signingPublicKey
54
+ }).finish();
55
+ const distributionMessage = {
56
+ groupId,
57
+ axolotlSenderKeyDistributionMessage: (0, _crypto_1.prependVersion)(distributionProto, constants_2.SIGNAL_GROUP_VERSION)
58
+ };
59
+ const messagePayload = await aesCbcEncryptFromSeed(derived.messageKey.seed, plaintext);
60
+ const senderKeyMessage = _proto_1.proto.SenderKeyMessage.encode({
61
+ id: senderKey.keyId,
62
+ iteration: derived.messageKey.iteration,
63
+ ciphertext: messagePayload
64
+ }).finish();
65
+ const versionedContent = (0, _crypto_1.prependVersion)(senderKeyMessage, constants_2.SIGNAL_GROUP_VERSION);
66
+ const signature = await (0, _crypto_1.xeddsaSign)(senderKey.signingPrivateKey, versionedContent);
67
+ if (signature.length !== constants_1.SIGNAL_SIGNATURE_LENGTH) {
68
+ throw new Error(`invalid sender key signature length ${signature.length}`);
69
+ }
70
+ const ciphertext = {
71
+ groupId,
72
+ sender,
73
+ keyId: senderKey.keyId,
74
+ iteration: derived.messageKey.iteration,
75
+ ciphertext: (0, bytes_1.concatBytes)([versionedContent, signature])
76
+ };
77
+ await this.store.upsertSenderKeyDistribution({
78
+ groupId,
79
+ sender,
80
+ keyId: senderKey.keyId,
81
+ timestampMs: Date.now()
82
+ });
83
+ return {
84
+ distributionMessage,
85
+ ciphertext,
86
+ keyId: senderKey.keyId
87
+ };
46
88
  });
47
- return {
48
- groupId,
49
- axolotlSenderKeyDistributionMessage: payload
50
- };
51
89
  }
52
- async filterParticipantsNeedingDistribution(groupId, sender, participants) {
90
+ async filterParticipantsNeedingDistribution(groupId, senderKeyId, participants) {
53
91
  if (participants.length === 0) {
54
92
  return [];
55
93
  }
56
- const senderKey = await this.ensureSenderKey(groupId, sender);
57
94
  const distributed = await this.store.getDeviceSenderKeyDistributions(groupId, participants);
58
- return participants.filter((_, index) => {
95
+ const pendingParticipants = new Array(participants.length);
96
+ let pendingCount = 0;
97
+ for (let index = 0; index < participants.length; index += 1) {
59
98
  const record = distributed[index];
60
- return !record || record.keyId !== senderKey.keyId;
61
- });
99
+ if (!record || record.keyId !== senderKeyId) {
100
+ pendingParticipants[pendingCount] = participants[index];
101
+ pendingCount += 1;
102
+ }
103
+ }
104
+ pendingParticipants.length = pendingCount;
105
+ return pendingParticipants;
62
106
  }
63
- async markSenderKeyDistributed(groupId, sender, participants) {
107
+ async markSenderKeyDistributed(groupId, senderKeyId, participants) {
64
108
  if (participants.length === 0) {
65
109
  return;
66
110
  }
67
- const senderKey = await this.ensureSenderKey(groupId, sender);
68
111
  const timestampMs = Date.now();
69
112
  const distributions = new Array(participants.length);
70
113
  for (let index = 0; index < participants.length; index += 1) {
71
114
  distributions[index] = {
72
115
  groupId,
73
116
  sender: participants[index],
74
- keyId: senderKey.keyId,
117
+ keyId: senderKeyId,
75
118
  timestampMs
76
119
  };
77
120
  }
78
121
  await this.store.upsertSenderKeyDistributions(distributions);
79
122
  }
80
123
  async processSenderKeyDistributionPayload(groupId, sender, payload) {
81
- if (groupId.length === 0) {
82
- throw new Error('sender key distribution missing groupId');
83
- }
84
- const parsed = (0, SenderKeyCodec_1.parseDistributionPayload)(payload);
85
- const record = {
86
- groupId,
87
- sender,
88
- keyId: parsed.keyId,
89
- iteration: parsed.iteration,
90
- chainKey: parsed.chainKey,
91
- signingPublicKey: parsed.signingPublicKey,
92
- unusedMessageKeys: []
93
- };
94
- await Promise.all([
95
- this.store.upsertSenderKey(record),
96
- this.store.upsertSenderKeyDistribution({
124
+ return this.runWithSenderLock(groupId, sender, async () => {
125
+ if (groupId.length === 0) {
126
+ throw new Error('sender key distribution missing groupId');
127
+ }
128
+ const parsed = (0, SenderKeyCodec_1.parseDistributionPayload)(payload);
129
+ const record = {
97
130
  groupId,
98
131
  sender,
99
132
  keyId: parsed.keyId,
100
- timestampMs: Date.now()
101
- })
102
- ]);
103
- return record;
104
- }
105
- async encryptGroupMessage(groupId, sender, plaintext) {
106
- const senderKey = await this.ensureSenderKey(groupId, sender);
107
- if (!senderKey.signingPrivateKey) {
108
- throw new Error('sender private signing key is missing');
109
- }
110
- const derived = await (0, SenderKeyChain_1.deriveSenderKeyMsgKey)(senderKey.iteration, senderKey.chainKey);
111
- const messagePayload = await aesCbcEncryptFromSeed(derived.messageKey.seed, plaintext);
112
- const senderKeyMessage = _proto_1.proto.SenderKeyMessage.encode({
113
- id: senderKey.keyId,
114
- iteration: derived.messageKey.iteration,
115
- ciphertext: messagePayload
116
- }).finish();
117
- const versionedContent = (0, _crypto_1.prependVersion)(senderKeyMessage, constants_1.SIGNAL_GROUP_VERSION);
118
- const signature = await (0, WaAdvSignature_1.signSignalMessage)(senderKey.signingPrivateKey, versionedContent);
119
- if (signature.length !== constants_1.SIGNATURE_SIZE) {
120
- throw new Error(`invalid sender key signature length ${signature.length}`);
121
- }
122
- const ciphertext = (0, bytes_1.concatBytes)([versionedContent, signature]);
123
- await this.store.upsertSenderKey({
124
- ...senderKey,
125
- chainKey: derived.nextChainKey,
126
- iteration: derived.messageKey.iteration + 1
133
+ iteration: parsed.iteration,
134
+ chainKey: parsed.chainKey,
135
+ signingPublicKey: parsed.signingPublicKey,
136
+ unusedMessageKeys: []
137
+ };
138
+ await Promise.all([
139
+ this.store.upsertSenderKey(record),
140
+ this.store.upsertSenderKeyDistribution({
141
+ groupId,
142
+ sender,
143
+ keyId: parsed.keyId,
144
+ timestampMs: Date.now()
145
+ })
146
+ ]);
147
+ return record;
127
148
  });
128
- return {
129
- groupId,
130
- sender,
131
- keyId: senderKey.keyId,
132
- iteration: derived.messageKey.iteration,
133
- ciphertext
134
- };
135
149
  }
136
150
  async decryptGroupMessage(payload) {
137
- const parsed = (0, SenderKeyCodec_1.parseSenderKeyMessage)(payload.ciphertext);
138
- const senderKey = await this.store.getDeviceSenderKey(payload.groupId, payload.sender);
139
- if (!senderKey) {
140
- throw new Error('missing sender key');
141
- }
142
- if (senderKey.keyId !== parsed.keyId) {
143
- throw new Error('sender key id mismatch');
144
- }
145
- if (payload.keyId !== undefined &&
146
- payload.keyId !== null &&
147
- parsed.keyId !== payload.keyId) {
148
- throw new Error('sender key id mismatch');
149
- }
150
- if (payload.iteration !== undefined &&
151
- payload.iteration !== null &&
152
- parsed.iteration !== payload.iteration) {
153
- throw new Error('sender key iteration mismatch');
154
- }
155
- const signedContent = parsed.versionContentMac.subarray(0, parsed.versionContentMac.length - constants_1.SIGNATURE_SIZE);
156
- const signature = parsed.versionContentMac.subarray(parsed.versionContentMac.length - constants_1.SIGNATURE_SIZE);
157
- const validSignature = await (0, WaAdvSignature_1.verifySignalSignature)(senderKey.signingPublicKey, signedContent, signature);
158
- if (!validSignature) {
159
- throw new Error('invalid sender key signature');
160
- }
161
- const selected = await (0, SenderKeyChain_1.selectMessageKey)(senderKey, parsed.iteration);
162
- const plaintext = await aesCbcDecryptFromSeed(selected.messageKey.seed, parsed.ciphertext);
163
- await this.store.upsertSenderKey(selected.updatedRecord);
164
- return plaintext;
151
+ return this.runWithSenderLock(payload.groupId, payload.sender, async () => {
152
+ const parsed = (0, SenderKeyCodec_1.parseSenderKeyMessage)(payload.ciphertext);
153
+ const senderKey = await this.store.getDeviceSenderKey(payload.groupId, payload.sender);
154
+ if (!senderKey) {
155
+ throw new Error('missing sender key');
156
+ }
157
+ if (senderKey.keyId !== parsed.keyId) {
158
+ throw new Error('sender key id mismatch');
159
+ }
160
+ if (payload.keyId !== undefined &&
161
+ payload.keyId !== null &&
162
+ parsed.keyId !== payload.keyId) {
163
+ throw new Error('sender key id mismatch');
164
+ }
165
+ if (payload.iteration !== undefined &&
166
+ payload.iteration !== null &&
167
+ parsed.iteration !== payload.iteration) {
168
+ throw new Error('sender key iteration mismatch');
169
+ }
170
+ if (!this.skipSignatureVerification) {
171
+ const signedContent = parsed.versionContentMac.subarray(0, parsed.versionContentMac.length - constants_1.SIGNAL_SIGNATURE_LENGTH);
172
+ const signature = parsed.versionContentMac.subarray(parsed.versionContentMac.length - constants_1.SIGNAL_SIGNATURE_LENGTH);
173
+ const validSignature = await (0, _crypto_1.xeddsaVerify)((0, _crypto_1.toRawPubKey)(senderKey.signingPublicKey), signedContent, signature);
174
+ if (!validSignature) {
175
+ throw new Error('invalid sender key signature');
176
+ }
177
+ }
178
+ const selected = await (0, SenderKeyChain_1.selectMessageKey)(senderKey, parsed.iteration, this.getFutureMessagesMax?.());
179
+ // Keep decrypt + persist ordered: failed decrypt must not advance sender-key state.
180
+ const plaintext = await aesCbcDecryptFromSeed(selected.messageKey.seed, parsed.ciphertext);
181
+ await this.store.upsertSenderKey(selected.updatedRecord);
182
+ return plaintext;
183
+ });
165
184
  }
166
- async ensureSenderKey(groupId, sender) {
185
+ async ensureSenderKeyInternal(groupId, sender) {
167
186
  const existing = await this.store.getDeviceSenderKey(groupId, sender);
168
187
  if (existing) {
169
188
  return existing;
@@ -186,5 +205,8 @@ class SenderKeyManager {
186
205
  await this.store.upsertSenderKey(created);
187
206
  return created;
188
207
  }
208
+ runWithSenderLock(groupId, sender, task) {
209
+ return this.senderLock.run(`senderKey:${groupId}:${(0, jid_1.signalAddressKey)(sender)}`, task);
210
+ }
189
211
  }
190
212
  exports.SenderKeyManager = SenderKeyManager;
@@ -1,6 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createSignalSessionResolver = exports.SignalProtocol = exports.createAndStoreInitialKeys = exports.SenderKeyManager = exports.SignalSessionSyncApi = exports.SignalRotateKeyApi = exports.SignalMissingPreKeysSyncApi = exports.SignalIdentitySyncApi = exports.SignalDeviceSyncApi = exports.SignalDigestSyncApi = exports.parsePreKeyUploadFailure = exports.buildPreKeyUploadIq = exports.generateSignedPreKey = exports.generateRegistrationInfo = exports.generateRegistrationId = exports.generatePreKeyPair = void 0;
3
+ exports.createSignalSessionResolver = exports.SignalProtocol = exports.createAndStoreInitialKeys = exports.SenderKeyManager = exports.SignalSessionSyncApi = exports.SignalRotateKeyApi = exports.SignalMissingPreKeysSyncApi = exports.SignalIdentitySyncApi = exports.SignalDeviceSyncApi = exports.SignalDigestSyncApi = exports.parsePreKeyUploadFailure = exports.buildPreKeyUploadIq = exports.generateSignedPreKey = exports.generateRegistrationInfo = exports.generateRegistrationId = exports.generatePreKeyPair = exports.toSignalAddressParts = exports.encodeSignalSessionRecord = exports.encodeSenderKeyRecord = exports.decodeStoreCount = exports.decodeSenderKeyRecord = exports.decodeSenderKeyDistributionRow = exports.decodeSignalSignedPreKeyRow = exports.decodeSignalSessionRecord = exports.decodeSignalRemoteIdentity = exports.decodeSignalRegistrationRow = exports.decodeSignalPreKeyRow = void 0;
4
+ var encoding_1 = require("./encoding");
5
+ Object.defineProperty(exports, "decodeSignalPreKeyRow", { enumerable: true, get: function () { return encoding_1.decodeSignalPreKeyRow; } });
6
+ Object.defineProperty(exports, "decodeSignalRegistrationRow", { enumerable: true, get: function () { return encoding_1.decodeSignalRegistrationRow; } });
7
+ Object.defineProperty(exports, "decodeSignalRemoteIdentity", { enumerable: true, get: function () { return encoding_1.decodeSignalRemoteIdentity; } });
8
+ Object.defineProperty(exports, "decodeSignalSessionRecord", { enumerable: true, get: function () { return encoding_1.decodeSignalSessionRecord; } });
9
+ Object.defineProperty(exports, "decodeSignalSignedPreKeyRow", { enumerable: true, get: function () { return encoding_1.decodeSignalSignedPreKeyRow; } });
10
+ Object.defineProperty(exports, "decodeSenderKeyDistributionRow", { enumerable: true, get: function () { return encoding_1.decodeSenderKeyDistributionRow; } });
11
+ Object.defineProperty(exports, "decodeSenderKeyRecord", { enumerable: true, get: function () { return encoding_1.decodeSenderKeyRecord; } });
12
+ Object.defineProperty(exports, "decodeStoreCount", { enumerable: true, get: function () { return encoding_1.decodeStoreCount; } });
13
+ Object.defineProperty(exports, "encodeSenderKeyRecord", { enumerable: true, get: function () { return encoding_1.encodeSenderKeyRecord; } });
14
+ Object.defineProperty(exports, "encodeSignalSessionRecord", { enumerable: true, get: function () { return encoding_1.encodeSignalSessionRecord; } });
15
+ Object.defineProperty(exports, "toSignalAddressParts", { enumerable: true, get: function () { return encoding_1.toSignalAddressParts; } });
4
16
  var keygen_1 = require("./registration/keygen");
5
17
  Object.defineProperty(exports, "generatePreKeyPair", { enumerable: true, get: function () { return keygen_1.generatePreKeyPair; } });
6
18
  Object.defineProperty(exports, "generateRegistrationId", { enumerable: true, get: function () { return keygen_1.generateRegistrationId; } });
@@ -7,11 +7,14 @@ exports.generateRegistrationId = generateRegistrationId;
7
7
  const _crypto_1 = require("../../crypto/index.js");
8
8
  const keys_1 = require("../../crypto/core/keys");
9
9
  const X25519_1 = require("../../crypto/curves/X25519");
10
- const WaAdvSignature_1 = require("../crypto/WaAdvSignature");
11
10
  async function generateRegistrationInfo() {
11
+ const [registrationId, identityKeyPair] = await Promise.all([
12
+ generateRegistrationId(),
13
+ X25519_1.X25519.generateKeyPair()
14
+ ]);
12
15
  return {
13
- registrationId: await generateRegistrationId(),
14
- identityKeyPair: await X25519_1.X25519.generateKeyPair()
16
+ registrationId,
17
+ identityKeyPair
15
18
  };
16
19
  }
17
20
  async function generatePreKeyPair(keyId) {
@@ -24,7 +27,7 @@ async function generatePreKeyPair(keyId) {
24
27
  async function generateSignedPreKey(keyId, signingPrivateKey) {
25
28
  const keyPair = await X25519_1.X25519.generateKeyPair();
26
29
  const serializedPubKey = (0, keys_1.toSerializedPubKey)(keyPair.pubKey);
27
- const signature = await (0, WaAdvSignature_1.signSignalMessage)(signingPrivateKey, serializedPubKey);
30
+ const signature = await (0, _crypto_1.xeddsaSign)(signingPrivateKey, serializedPubKey);
28
31
  return {
29
32
  keyId,
30
33
  keyPair,
@@ -2,15 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createAndStoreInitialKeys = createAndStoreInitialKeys;
4
4
  const keygen_1 = require("../registration/keygen");
5
- async function createAndStoreInitialKeys(store) {
5
+ async function createAndStoreInitialKeys(store, preKeyStore) {
6
6
  const [registrationInfo, firstPreKey] = await Promise.all([
7
7
  (0, keygen_1.generateRegistrationInfo)(),
8
8
  (0, keygen_1.generatePreKeyPair)(1)
9
9
  ]);
10
10
  const signedPreKey = await (0, keygen_1.generateSignedPreKey)(1, registrationInfo.identityKeyPair.privKey);
11
+ // Keep writes ordered so partial commit failures don't leave split registration bootstrap state.
11
12
  await store.setRegistrationInfo(registrationInfo);
12
13
  await store.setSignedPreKey(signedPreKey);
13
- await store.getOrGenSinglePreKey(async () => firstPreKey);
14
+ await preKeyStore.getOrGenSinglePreKey(async () => firstPreKey);
14
15
  return {
15
16
  registrationInfo,
16
17
  signedPreKey,