zapo-js 0.2.0 → 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.
- package/README.md +7 -3
- package/dist/appstate/WaAppStateCrypto.js +49 -41
- package/dist/appstate/WaAppStateSyncClient.js +79 -42
- package/dist/appstate/index.js +2 -2
- package/dist/auth/WaAuthClient.js +20 -11
- package/dist/auth/{flow/WaAuthCredentialsFlow.js → credentials-flow.js} +83 -18
- package/dist/auth/pairing/WaPairingFlow.js +26 -29
- package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +29 -13
- package/dist/client/WaClient.js +115 -75
- package/dist/client/WaClientFactory.js +113 -30
- package/dist/client/connection/WaConnectionManager.js +4 -1
- package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
- package/dist/client/coordinators/WaBusinessCoordinator.js +3 -12
- package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +33 -8
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +55 -25
- package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
- package/dist/client/coordinators/WaPassiveTasksCoordinator.js +38 -20
- package/dist/client/coordinators/WaProfileCoordinator.js +3 -1
- package/dist/client/coordinators/WaRetryCoordinator.js +11 -9
- package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +22 -4
- package/dist/client/dirty.js +1 -1
- package/dist/client/events/abprops.js +43 -0
- package/dist/client/events/privacy-token.js +1 -2
- package/dist/client/events/registration.js +42 -0
- package/dist/client/incoming.js +37 -0
- package/dist/client/mailbox.js +17 -1
- package/dist/client/media.js +243 -0
- package/dist/client/messages.js +163 -86
- package/dist/crypto/core/index.js +4 -1
- package/dist/crypto/core/random.js +3 -9
- package/dist/crypto/core/xeddsa.js +57 -0
- package/dist/crypto/curves/X25519.js +18 -0
- package/dist/crypto/curves/constants.js +2 -1
- package/dist/esm/appstate/WaAppStateCrypto.js +39 -31
- package/dist/esm/appstate/WaAppStateSyncClient.js +68 -31
- package/dist/esm/appstate/index.js +1 -1
- package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
- package/dist/esm/auth/WaAuthClient.js +17 -8
- package/dist/esm/auth/{flow/WaAuthCredentialsFlow.js → credentials-flow.js} +83 -18
- package/dist/esm/auth/pairing/WaPairingFlow.js +25 -28
- package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +20 -6
- package/dist/esm/client/WaClient.js +116 -76
- package/dist/esm/client/WaClientFactory.js +114 -31
- package/dist/esm/client/connection/WaConnectionManager.js +4 -1
- package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
- package/dist/esm/client/coordinators/WaBusinessCoordinator.js +4 -13
- package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +35 -10
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +47 -17
- package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
- package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +38 -20
- package/dist/esm/client/coordinators/WaProfileCoordinator.js +3 -1
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +11 -9
- package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +24 -6
- package/dist/esm/client/dirty.js +1 -1
- package/dist/esm/client/events/abprops.js +40 -0
- package/dist/esm/client/events/privacy-token.js +1 -2
- package/dist/esm/client/events/registration.js +39 -0
- package/dist/esm/client/incoming.js +36 -0
- package/dist/esm/client/mailbox.js +17 -1
- package/dist/esm/client/media.js +234 -0
- package/dist/esm/client/messages.js +162 -85
- package/dist/esm/crypto/core/index.js +1 -0
- package/dist/esm/crypto/core/random.js +2 -7
- package/dist/esm/crypto/core/xeddsa.js +53 -0
- package/dist/esm/crypto/curves/X25519.js +20 -2
- package/dist/esm/crypto/curves/constants.js +1 -0
- package/dist/esm/infra/perf/StoreLock.js +7 -4
- package/dist/esm/media/WaMediaCrypto.js +257 -62
- package/dist/esm/media/WaMediaTransferClient.js +47 -190
- package/dist/esm/media/constants.js +2 -0
- package/dist/esm/media/processor.js +1 -0
- package/dist/esm/message/addon-crypto.js +130 -3
- package/dist/esm/message/content.js +12 -6
- package/dist/esm/message/icdc.js +8 -8
- package/dist/esm/message/incoming.js +14 -12
- package/dist/esm/message/phash.js +32 -12
- package/dist/esm/message/reporting-token.js +3 -3
- package/dist/esm/message/use-case-secret.js +1 -1
- package/dist/esm/protocol/abprops.js +159 -0
- package/dist/esm/protocol/browser.js +14 -0
- package/dist/esm/protocol/constants.js +3 -1
- package/dist/esm/protocol/email.js +30 -0
- package/dist/esm/protocol/jid.js +44 -10
- package/dist/esm/protocol/nodes.js +6 -2
- package/dist/esm/protocol/notification.js +7 -1
- package/dist/esm/retry/reason.js +1 -1
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +5 -2
- package/dist/esm/signal/api/SignalDigestSyncApi.js +8 -6
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +4 -4
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +1 -1
- package/dist/esm/signal/api/SignalSessionSyncApi.js +1 -1
- package/dist/esm/signal/crypto/WaAdvSignature.js +5 -51
- package/dist/esm/signal/crypto/constants.js +0 -4
- package/dist/esm/signal/encoding.js +11 -54
- package/dist/esm/signal/group/SenderKeyChain.js +3 -3
- package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
- package/dist/esm/signal/group/SenderKeyManager.js +13 -10
- package/dist/esm/signal/registration/keygen.js +2 -3
- package/dist/esm/signal/registration/utils.js +2 -2
- package/dist/esm/signal/session/SignalProtocol.js +18 -17
- package/dist/esm/signal/session/SignalRatchet.js +21 -10
- package/dist/esm/signal/session/SignalSerializer.js +5 -6
- package/dist/esm/signal/session/SignalSession.js +11 -9
- package/dist/esm/signal/session/resolver.js +6 -6
- package/dist/esm/store/contracts/identity.store.js +1 -0
- package/dist/esm/store/contracts/message-secret.store.js +1 -0
- package/dist/esm/store/contracts/pre-key.store.js +1 -0
- package/dist/esm/store/contracts/session.store.js +1 -0
- package/dist/esm/store/createStore.js +48 -12
- package/dist/esm/store/index.js +4 -0
- package/dist/esm/store/locks/identity.lock.js +16 -0
- package/dist/esm/store/locks/message-secret.lock.js +17 -0
- package/dist/esm/store/locks/pre-key.lock.js +27 -0
- package/dist/esm/store/locks/session.lock.js +19 -0
- package/dist/esm/store/locks/signal.lock.js +0 -24
- package/dist/esm/store/noop.store.js +20 -0
- package/dist/esm/store/providers/memory/device-list.store.js +3 -0
- package/dist/esm/store/providers/memory/identity.store.js +31 -0
- package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
- package/dist/esm/store/providers/memory/participants.store.js +3 -0
- package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
- package/dist/esm/store/providers/memory/retry.store.js +25 -11
- package/dist/esm/store/providers/memory/session.store.js +45 -0
- package/dist/esm/store/providers/memory/signal.store.js +1 -164
- package/dist/esm/transport/WaComms.js +4 -3
- package/dist/esm/transport/WaWebSocket.js +9 -1
- package/dist/esm/transport/index.js +6 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
- package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
- package/dist/esm/transport/node/WaNodeOrchestrator.js +17 -8
- package/dist/esm/transport/node/builders/abprops.js +20 -0
- package/dist/esm/transport/node/builders/device.js +11 -0
- package/dist/esm/transport/node/builders/email.js +65 -0
- package/dist/esm/transport/node/builders/offline.js +14 -0
- package/dist/esm/transport/node/builders/prekeys.js +37 -40
- package/dist/esm/transport/node/builders/presence.js +13 -0
- package/dist/esm/transport/node/builders/privacy-token.js +19 -23
- package/dist/esm/transport/node/builders/retry.js +1 -1
- package/dist/esm/transport/node/helpers.js +24 -0
- package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
- package/dist/esm/transport/node/mex/client.js +83 -0
- package/dist/esm/transport/node/mex/persist-ids.js +10 -0
- package/dist/esm/transport/noise/WaClientPayload.js +15 -10
- package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
- package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
- package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
- package/dist/esm/transport/noise/WaNoiseSession.js +12 -11
- package/dist/infra/perf/StoreLock.js +7 -4
- package/dist/media/WaMediaCrypto.js +253 -58
- package/dist/media/WaMediaTransferClient.js +50 -223
- package/dist/media/constants.js +3 -1
- package/dist/media/processor.js +2 -0
- package/dist/message/addon-crypto.js +131 -0
- package/dist/message/content.js +13 -5
- package/dist/message/icdc.js +8 -8
- package/dist/message/incoming.js +14 -12
- package/dist/message/phash.js +32 -12
- package/dist/message/reporting-token.js +2 -2
- package/dist/message/use-case-secret.js +1 -1
- package/dist/protocol/abprops.js +163 -0
- package/dist/protocol/browser.js +15 -0
- package/dist/protocol/constants.js +14 -2
- package/dist/protocol/email.js +33 -0
- package/dist/protocol/jid.js +45 -10
- package/dist/protocol/nodes.js +6 -2
- package/dist/protocol/notification.js +8 -2
- package/dist/retry/reason.js +1 -1
- package/dist/signal/api/SignalDeviceSyncApi.js +5 -2
- package/dist/signal/api/SignalDigestSyncApi.js +8 -6
- package/dist/signal/api/SignalIdentitySyncApi.js +4 -4
- package/dist/signal/crypto/WaAdvSignature.js +2 -50
- package/dist/signal/crypto/constants.js +1 -5
- package/dist/signal/encoding.js +11 -49
- package/dist/signal/group/SenderKeyChain.js +2 -2
- package/dist/signal/group/SenderKeyCodec.js +4 -5
- package/dist/signal/group/SenderKeyManager.js +12 -9
- package/dist/signal/registration/keygen.js +1 -2
- package/dist/signal/registration/utils.js +2 -2
- package/dist/signal/session/SignalProtocol.js +18 -17
- package/dist/signal/session/SignalRatchet.js +19 -8
- package/dist/signal/session/SignalSerializer.js +5 -6
- package/dist/signal/session/SignalSession.js +11 -9
- package/dist/signal/session/resolver.js +6 -6
- package/dist/store/contracts/identity.store.js +2 -0
- package/dist/store/contracts/message-secret.store.js +2 -0
- package/dist/store/contracts/pre-key.store.js +2 -0
- package/dist/store/contracts/session.store.js +2 -0
- package/dist/store/createStore.js +47 -11
- package/dist/store/index.js +9 -1
- package/dist/store/locks/identity.lock.js +19 -0
- package/dist/store/locks/message-secret.lock.js +20 -0
- package/dist/store/locks/pre-key.lock.js +30 -0
- package/dist/store/locks/session.lock.js +22 -0
- package/dist/store/locks/signal.lock.js +0 -24
- package/dist/store/noop.store.js +21 -1
- package/dist/store/providers/memory/device-list.store.js +3 -0
- package/dist/store/providers/memory/identity.store.js +35 -0
- package/dist/store/providers/memory/message-secret.store.js +85 -0
- package/dist/store/providers/memory/participants.store.js +3 -0
- package/dist/store/providers/memory/pre-key.store.js +101 -0
- package/dist/store/providers/memory/retry.store.js +24 -10
- package/dist/store/providers/memory/session.store.js +49 -0
- package/dist/store/providers/memory/signal.store.js +1 -164
- package/dist/transport/WaComms.js +4 -3
- package/dist/transport/WaWebSocket.js +9 -1
- package/dist/transport/index.js +17 -1
- package/dist/transport/keepalive/WaKeepAlive.js +17 -8
- package/dist/transport/node/WaMobileTcpSocket.js +118 -0
- package/dist/transport/node/WaNodeOrchestrator.js +16 -7
- package/dist/transport/node/builders/abprops.js +23 -0
- package/dist/transport/node/builders/device.js +14 -0
- package/dist/transport/node/builders/email.js +72 -0
- package/dist/transport/node/builders/offline.js +17 -0
- package/dist/transport/node/builders/prekeys.js +36 -39
- package/dist/transport/node/builders/presence.js +16 -0
- package/dist/transport/node/builders/privacy-token.js +18 -22
- package/dist/transport/node/builders/retry.js +1 -1
- package/dist/transport/node/helpers.js +26 -0
- package/dist/transport/node/mex/argo-decoder.js +189 -0
- package/dist/transport/node/mex/client.js +86 -0
- package/dist/transport/node/mex/persist-ids.js +13 -0
- package/dist/transport/noise/WaClientPayload.js +14 -9
- package/dist/transport/noise/WaFrameCodec.js +1 -1
- package/dist/transport/noise/WaMobileClientPayload.js +56 -0
- package/dist/transport/noise/WaNoiseCert.js +8 -26
- package/dist/transport/noise/WaNoiseSession.js +11 -10
- package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
- package/dist/types/appstate/index.d.ts +1 -1
- package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
- package/dist/types/appstate/types.d.ts +1 -1
- package/dist/types/auth/WaAuthClient.d.ts +9 -3
- package/dist/types/auth/credentials-flow.d.ts +20 -0
- package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
- package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
- package/dist/types/auth/types.d.ts +40 -0
- package/dist/types/client/WaClient.d.ts +19 -8
- package/dist/types/client/WaClientFactory.d.ts +10 -4
- package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
- package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +1 -1
- package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +6 -1
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +15 -2
- package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
- package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +13 -2
- package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +1 -1
- package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +4 -2
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
- package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +11 -1
- package/dist/types/client/dirty.d.ts +3 -1
- package/dist/types/client/events/abprops.d.ts +14 -0
- package/dist/types/client/events/registration.d.ts +17 -0
- package/dist/types/client/incoming.d.ts +6 -1
- package/dist/types/client/mailbox.d.ts +2 -0
- package/dist/types/client/media.d.ts +31 -0
- package/dist/types/client/messages.d.ts +2 -0
- package/dist/types/client/persistence/WriteBehindPersistence.d.ts +1 -1
- package/dist/types/client/types.d.ts +100 -1
- package/dist/types/crypto/core/index.d.ts +1 -0
- package/dist/types/crypto/core/primitives.d.ts +1 -1
- package/dist/types/crypto/core/random.d.ts +1 -1
- package/dist/types/crypto/core/xeddsa.d.ts +2 -0
- package/dist/types/crypto/curves/constants.d.ts +1 -0
- package/dist/types/crypto/index.d.ts +1 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
- package/dist/types/infra/log/PinoLogger.d.ts +1 -1
- package/dist/types/infra/perf/StoreLock.d.ts +1 -0
- package/dist/types/media/WaMediaCrypto.d.ts +15 -6
- package/dist/types/media/WaMediaTransferClient.d.ts +3 -11
- package/dist/types/media/constants.d.ts +2 -0
- package/dist/types/media/index.d.ts +1 -0
- package/dist/types/media/processor.d.ts +28 -0
- package/dist/types/media/types.d.ts +9 -3
- package/dist/types/message/addon-crypto.d.ts +34 -3
- package/dist/types/message/content.d.ts +3 -1
- package/dist/types/message/icdc.d.ts +4 -4
- package/dist/types/message/types.d.ts +16 -24
- package/dist/types/protocol/abprops.d.ts +142 -0
- package/dist/types/protocol/browser.d.ts +1 -0
- package/dist/types/protocol/constants.d.ts +5 -1
- package/dist/types/protocol/email.d.ts +32 -0
- package/dist/types/protocol/jid.d.ts +1 -0
- package/dist/types/protocol/nodes.d.ts +4 -0
- package/dist/types/protocol/notification.d.ts +6 -0
- package/dist/types/protocol/stream.d.ts +1 -0
- package/dist/types/retry/reason.d.ts +1 -1
- package/dist/types/signal/api/SignalDigestSyncApi.d.ts +3 -0
- package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +3 -3
- package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
- package/dist/types/signal/crypto/constants.d.ts +0 -1
- package/dist/types/signal/encoding.d.ts +7 -1
- package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
- package/dist/types/signal/group/SenderKeyManager.d.ts +7 -2
- package/dist/types/signal/registration/utils.d.ts +2 -1
- package/dist/types/signal/session/SignalProtocol.d.ts +11 -2
- package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
- package/dist/types/signal/session/resolver.d.ts +4 -2
- package/dist/types/signal/types.d.ts +16 -4
- package/dist/types/store/contracts/identity.store.d.ts +11 -0
- package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
- package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
- package/dist/types/store/contracts/session.store.d.ts +14 -0
- package/dist/types/store/contracts/signal.store.d.ts +1 -34
- package/dist/types/store/index.d.ts +9 -1
- package/dist/types/store/locks/identity.lock.d.ts +3 -0
- package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
- package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
- package/dist/types/store/locks/session.lock.d.ts +3 -0
- package/dist/types/store/noop.store.d.ts +4 -0
- package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
- package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
- package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
- package/dist/types/store/providers/memory/retry.store.d.ts +7 -1
- package/dist/types/store/providers/memory/session.store.d.ts +21 -0
- package/dist/types/store/providers/memory/signal.store.d.ts +3 -45
- package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
- package/dist/types/store/types.d.ts +21 -1
- package/dist/types/transport/WaWebSocket.d.ts +1 -0
- package/dist/types/transport/index.d.ts +8 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
- package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
- package/dist/types/transport/node/WaNodeOrchestrator.d.ts +6 -2
- package/dist/types/transport/node/builders/abprops.d.ts +5 -0
- package/dist/types/transport/node/builders/device.d.ts +2 -0
- package/dist/types/transport/node/builders/email.d.ts +11 -0
- package/dist/types/transport/node/builders/offline.d.ts +2 -0
- package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
- package/dist/types/transport/node/builders/presence.d.ts +6 -0
- package/dist/types/transport/node/helpers.d.ts +3 -0
- package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
- package/dist/types/transport/node/mex/client.d.ts +18 -0
- package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
- package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
- package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
- package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
- package/dist/types/transport/types.d.ts +8 -0
- package/package.json +6 -4
- package/dist/auth/pairing/constants.js +0 -5
- package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
- package/dist/esm/auth/pairing/constants.js +0 -2
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
- package/dist/esm/transport/node/builders/index.js +0 -11
- package/dist/transport/node/builders/index.js +0 -51
- package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
- package/dist/types/auth/pairing/constants.d.ts +0 -2
- package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
- package/dist/types/transport/node/builders/index.d.ts +0 -11
- /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.isMexArgoDecoderAvailable = isMexArgoDecoderAvailable;
|
|
37
|
+
exports.decodeMexArgoResponse = decodeMexArgoResponse;
|
|
38
|
+
const bytes_1 = require("../../../util/bytes");
|
|
39
|
+
let cachedArgo;
|
|
40
|
+
async function loadArgo() {
|
|
41
|
+
if (cachedArgo !== undefined)
|
|
42
|
+
return cachedArgo;
|
|
43
|
+
try {
|
|
44
|
+
cachedArgo = (await Promise.resolve().then(() => __importStar(require('argo-codec'))));
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
cachedArgo = null;
|
|
48
|
+
}
|
|
49
|
+
return cachedArgo;
|
|
50
|
+
}
|
|
51
|
+
async function isMexArgoDecoderAvailable() {
|
|
52
|
+
return (await loadArgo()) !== null;
|
|
53
|
+
}
|
|
54
|
+
const LABEL_NULL = -1;
|
|
55
|
+
const LABEL_ABSENT = -2;
|
|
56
|
+
const BACKREF_BASE = -4;
|
|
57
|
+
const DESC_NULL = -1;
|
|
58
|
+
const DESC_FALSE = 0;
|
|
59
|
+
const DESC_TRUE = 1;
|
|
60
|
+
const DESC_OBJECT = 2;
|
|
61
|
+
const DESC_LIST = 3;
|
|
62
|
+
const DESC_STRING = 4;
|
|
63
|
+
const DESC_BYTES = 5;
|
|
64
|
+
const DESC_INT = 6;
|
|
65
|
+
const DESC_FLOAT = 7;
|
|
66
|
+
const FLAG_INLINE_EVERYTHING = 1 << 0;
|
|
67
|
+
const FLAG_HAS_USER_FLAGS = 1 << 6;
|
|
68
|
+
async function decodeMexArgoResponse(bytes) {
|
|
69
|
+
const argo = await loadArgo();
|
|
70
|
+
if (!argo)
|
|
71
|
+
throw new Error('argo-codec not installed');
|
|
72
|
+
const r = new argo.Reader(bytes);
|
|
73
|
+
const flags = r.bitset();
|
|
74
|
+
const inline = (flags & FLAG_INLINE_EVERYTHING) !== 0;
|
|
75
|
+
if (flags & FLAG_HAS_USER_FLAGS)
|
|
76
|
+
r.bitset();
|
|
77
|
+
const segments = [];
|
|
78
|
+
if (!inline) {
|
|
79
|
+
while (r.pos < r.end) {
|
|
80
|
+
const len = r.label();
|
|
81
|
+
segments.push(new argo.Reader(r.bytes(len)));
|
|
82
|
+
}
|
|
83
|
+
if (segments.length === 0)
|
|
84
|
+
throw new Error('mex argo: missing core segment');
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
segments.push(r);
|
|
88
|
+
}
|
|
89
|
+
const core = segments[segments.length - 1];
|
|
90
|
+
const blocks = inline ? new Map() : indexBlocks(segments.slice(0, -1));
|
|
91
|
+
const ctx = { core, blocks, stringSeen: [] };
|
|
92
|
+
const data = readDesc(ctx);
|
|
93
|
+
const errors = [];
|
|
94
|
+
if (core.pos < core.end) {
|
|
95
|
+
const errCount = core.label();
|
|
96
|
+
for (let i = 0; i < errCount; i++)
|
|
97
|
+
errors.push(readError(ctx));
|
|
98
|
+
}
|
|
99
|
+
return { data, errors };
|
|
100
|
+
}
|
|
101
|
+
function indexBlocks(slices) {
|
|
102
|
+
const m = new Map();
|
|
103
|
+
const keys = ['String', 'Int', 'Float', 'Bytes'];
|
|
104
|
+
for (let i = 0; i < slices.length && i < keys.length; i++)
|
|
105
|
+
m.set(keys[i], slices[i]);
|
|
106
|
+
return m;
|
|
107
|
+
}
|
|
108
|
+
function getBlock(ctx, key) {
|
|
109
|
+
const b = ctx.blocks.get(key);
|
|
110
|
+
if (!b)
|
|
111
|
+
throw new Error(`mex argo: block '${key}' missing`);
|
|
112
|
+
return b;
|
|
113
|
+
}
|
|
114
|
+
function readStringFromBlock(ctx) {
|
|
115
|
+
const lab = ctx.core.label();
|
|
116
|
+
if (lab < BACKREF_BASE + 1) {
|
|
117
|
+
const idx = -lab + BACKREF_BASE;
|
|
118
|
+
return ctx.stringSeen[idx];
|
|
119
|
+
}
|
|
120
|
+
const block = getBlock(ctx, 'String');
|
|
121
|
+
const s = bytes_1.TEXT_DECODER.decode(block.bytes(lab));
|
|
122
|
+
ctx.stringSeen.push(s);
|
|
123
|
+
return s;
|
|
124
|
+
}
|
|
125
|
+
function readDesc(ctx) {
|
|
126
|
+
const m = ctx.core.label();
|
|
127
|
+
switch (m) {
|
|
128
|
+
case DESC_NULL:
|
|
129
|
+
return null;
|
|
130
|
+
case DESC_FALSE:
|
|
131
|
+
return false;
|
|
132
|
+
case DESC_TRUE:
|
|
133
|
+
return true;
|
|
134
|
+
case DESC_STRING:
|
|
135
|
+
return readStringFromBlock(ctx);
|
|
136
|
+
case DESC_INT:
|
|
137
|
+
return getBlock(ctx, 'Int').label();
|
|
138
|
+
case DESC_FLOAT:
|
|
139
|
+
throw new Error('mex argo: DESC_FLOAT not implemented');
|
|
140
|
+
case DESC_BYTES:
|
|
141
|
+
throw new Error('mex argo: DESC_BYTES not implemented');
|
|
142
|
+
case DESC_LIST: {
|
|
143
|
+
const n = ctx.core.label();
|
|
144
|
+
const out = [];
|
|
145
|
+
for (let i = 0; i < n; i++)
|
|
146
|
+
out.push(readDesc(ctx));
|
|
147
|
+
return out;
|
|
148
|
+
}
|
|
149
|
+
case DESC_OBJECT: {
|
|
150
|
+
const n = ctx.core.label();
|
|
151
|
+
const out = {};
|
|
152
|
+
for (let i = 0; i < n; i++) {
|
|
153
|
+
const key = readStringFromBlock(ctx);
|
|
154
|
+
out[key] = readDesc(ctx);
|
|
155
|
+
}
|
|
156
|
+
return out;
|
|
157
|
+
}
|
|
158
|
+
default:
|
|
159
|
+
throw new Error(`mex argo: unknown DESC marker ${m}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function readError(ctx) {
|
|
163
|
+
const message = readStringFromBlock(ctx);
|
|
164
|
+
skipOptional(ctx); // location — never observed in MEX errors so far
|
|
165
|
+
const path = readPath(ctx);
|
|
166
|
+
const extensions = readOptionalDesc(ctx);
|
|
167
|
+
return { message, path, extensions };
|
|
168
|
+
}
|
|
169
|
+
function skipOptional(ctx) {
|
|
170
|
+
const lab = ctx.core.label();
|
|
171
|
+
if (lab !== LABEL_ABSENT && lab !== LABEL_NULL) {
|
|
172
|
+
// Present but not yet structurally decoded; would need a typed inner read here.
|
|
173
|
+
// For locations specifically we have no observed sample; bail loudly if hit.
|
|
174
|
+
throw new Error(`mex argo: unexpected optional present (lab=${lab}); add support`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function readPath(ctx) {
|
|
178
|
+
const lab = ctx.core.label();
|
|
179
|
+
if (lab === LABEL_ABSENT || lab === LABEL_NULL)
|
|
180
|
+
return null;
|
|
181
|
+
return lab;
|
|
182
|
+
}
|
|
183
|
+
function readOptionalDesc(ctx) {
|
|
184
|
+
const lab = ctx.core.label();
|
|
185
|
+
if (lab === LABEL_ABSENT || lab === LABEL_NULL)
|
|
186
|
+
return null;
|
|
187
|
+
const v = readDesc(ctx);
|
|
188
|
+
return typeof v === 'object' && v !== null ? v : null;
|
|
189
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.dispatchMexQuery = dispatchMexQuery;
|
|
4
|
+
const constants_1 = require("../../../protocol/constants");
|
|
5
|
+
const helpers_1 = require("../../node/helpers");
|
|
6
|
+
const argo_decoder_1 = require("../../node/mex/argo-decoder");
|
|
7
|
+
const query_1 = require("../../node/query");
|
|
8
|
+
const bytes_1 = require("../../../util/bytes");
|
|
9
|
+
const primitives_1 = require("../../../util/primitives");
|
|
10
|
+
const MEX_DEFAULT_TIMEOUT_MS = 32000;
|
|
11
|
+
async function dispatchMexQuery(socket, args) {
|
|
12
|
+
const body = JSON.stringify({
|
|
13
|
+
queryId: args.clientDocId,
|
|
14
|
+
variables: args.variables
|
|
15
|
+
});
|
|
16
|
+
const node = {
|
|
17
|
+
tag: constants_1.WA_NODE_TAGS.IQ,
|
|
18
|
+
attrs: {
|
|
19
|
+
...(args.iqId ? { id: args.iqId } : {}),
|
|
20
|
+
to: constants_1.WA_DEFAULTS.HOST_DOMAIN,
|
|
21
|
+
type: constants_1.WA_IQ_TYPES.GET,
|
|
22
|
+
xmlns: constants_1.WA_XMLNS.MEX
|
|
23
|
+
},
|
|
24
|
+
content: [
|
|
25
|
+
{
|
|
26
|
+
tag: 'query',
|
|
27
|
+
attrs: { query_id: args.docId },
|
|
28
|
+
content: body
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
};
|
|
32
|
+
const response = await socket.query(node, args.timeoutMs ?? MEX_DEFAULT_TIMEOUT_MS);
|
|
33
|
+
(0, query_1.assertIqResult)(response, `mex/${args.opName}`);
|
|
34
|
+
const data = await parseMexResultPayload(response, args.opName);
|
|
35
|
+
return { raw: response, data };
|
|
36
|
+
}
|
|
37
|
+
async function parseMexResultPayload(node, opName) {
|
|
38
|
+
const result = (0, helpers_1.findNodeChild)(node, 'result');
|
|
39
|
+
if (!result) {
|
|
40
|
+
throw new Error(`mex/${opName} response missing <result>`);
|
|
41
|
+
}
|
|
42
|
+
const format = result.attrs.format ?? 'json';
|
|
43
|
+
const rawBytes = (0, helpers_1.decodeNodeContentUtf8OrBytes)(result.content, `mex/${opName}/result`);
|
|
44
|
+
if (format === 'argo') {
|
|
45
|
+
if (!(await (0, argo_decoder_1.isMexArgoDecoderAvailable)())) {
|
|
46
|
+
throw new Error(`mex/${opName} argo response received but 'argo-codec' not installed; ${rawBytes.length}B; ` +
|
|
47
|
+
`strings: ${extractVisibleStrings(rawBytes)}`);
|
|
48
|
+
}
|
|
49
|
+
let decoded;
|
|
50
|
+
try {
|
|
51
|
+
decoded = await (0, argo_decoder_1.decodeMexArgoResponse)(rawBytes);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
throw new Error(`mex/${opName} argo decode failed: ${(0, primitives_1.toError)(error).message}; ` +
|
|
55
|
+
`${rawBytes.length}B; strings: ${extractVisibleStrings(rawBytes)}`);
|
|
56
|
+
}
|
|
57
|
+
if (decoded.errors.length > 0) {
|
|
58
|
+
const summary = decoded.errors
|
|
59
|
+
.map((e) => {
|
|
60
|
+
const code = e.extensions?.error_code ?? e.extensions?.code ?? '?';
|
|
61
|
+
const sev = e.extensions?.severity;
|
|
62
|
+
return `${code}${sev ? `/${String(sev)}` : ''}: ${e.message} @${e.path ?? ''}`;
|
|
63
|
+
})
|
|
64
|
+
.join('; ');
|
|
65
|
+
throw new Error(`mex/${opName} errors: ${summary}`);
|
|
66
|
+
}
|
|
67
|
+
return decoded.data;
|
|
68
|
+
}
|
|
69
|
+
return extractGraphQlData(JSON.parse(bytes_1.TEXT_DECODER.decode(rawBytes)), opName);
|
|
70
|
+
}
|
|
71
|
+
function extractVisibleStrings(bytes) {
|
|
72
|
+
return bytes_1.TEXT_DECODER.decode(bytes)
|
|
73
|
+
.replace(/[\x00-\x1f\x7f-\xff]+/g, ' ')
|
|
74
|
+
.replace(/\s+/g, ' ')
|
|
75
|
+
.trim();
|
|
76
|
+
}
|
|
77
|
+
function extractGraphQlData(payload, opName) {
|
|
78
|
+
const json = (payload ?? {});
|
|
79
|
+
if (json.errors && json.errors.length > 0) {
|
|
80
|
+
const summary = json.errors
|
|
81
|
+
.map((e) => `${e.extensions?.error_code ?? '?'}: ${e.message ?? '?'} @${(e.path ?? []).join('.')}`)
|
|
82
|
+
.join('; ');
|
|
83
|
+
throw new Error(`mex/${opName} errors: ${summary}`);
|
|
84
|
+
}
|
|
85
|
+
return json.data ?? null;
|
|
86
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WA_MEX_PERSIST_IDS = void 0;
|
|
4
|
+
exports.WA_MEX_PERSIST_IDS = Object.freeze({
|
|
5
|
+
WWWGetCertificates: Object.freeze({
|
|
6
|
+
docId: '25094190163544446',
|
|
7
|
+
clientDocId: '16428758503015954638431529919'
|
|
8
|
+
}),
|
|
9
|
+
WWWCreateUser: Object.freeze({
|
|
10
|
+
docId: '8548056818544135',
|
|
11
|
+
clientDocId: '25777518041400352865446016972'
|
|
12
|
+
})
|
|
13
|
+
});
|
|
@@ -19,13 +19,20 @@ function parseVersion(versionBase) {
|
|
|
19
19
|
}
|
|
20
20
|
return { primary, secondary, tertiary };
|
|
21
21
|
}
|
|
22
|
+
let cachedLocale = null;
|
|
22
23
|
function resolveLocale() {
|
|
24
|
+
// The first `Intl.DateTimeFormat()` call triggers V8's lazy ICU init
|
|
25
|
+
// (tens of ms). The process locale does not change at runtime, so
|
|
26
|
+
// memoize after the first resolve.
|
|
27
|
+
if (cachedLocale !== null)
|
|
28
|
+
return cachedLocale;
|
|
23
29
|
const locale = Intl.DateTimeFormat().resolvedOptions().locale || 'en-US';
|
|
24
30
|
const [language = 'en', country = 'US'] = locale.split('-');
|
|
25
|
-
|
|
31
|
+
cachedLocale = Object.freeze({
|
|
26
32
|
lg: language.toLowerCase(),
|
|
27
33
|
lc: country.toUpperCase()
|
|
28
|
-
};
|
|
34
|
+
});
|
|
35
|
+
return cachedLocale;
|
|
29
36
|
}
|
|
30
37
|
function defaultWebSubPlatform() {
|
|
31
38
|
return _proto_1.proto.ClientPayload.WebInfo.WebSubPlatform.WEB_BROWSER;
|
|
@@ -148,16 +155,14 @@ function buildRegistrationPayload(config) {
|
|
|
148
155
|
const version = parseVersion(versionBase);
|
|
149
156
|
const common = buildCommonPayload(config, version);
|
|
150
157
|
const devicePairingData = {
|
|
151
|
-
buildHash: config.buildHash
|
|
152
|
-
deviceProps: config.deviceProps
|
|
153
|
-
? (0, bytes_1.toBytesView)(config.deviceProps)
|
|
154
|
-
: defaultDeviceProps(versionBase, config, version),
|
|
158
|
+
buildHash: config.buildHash ?? (0, primitives_1.md5Bytes)(versionBase),
|
|
159
|
+
deviceProps: config.deviceProps ?? defaultDeviceProps(versionBase, config, version),
|
|
155
160
|
eRegid: (0, bytes_1.intToBytes)(4, registrationId),
|
|
156
161
|
eKeytype: (0, bytes_1.intToBytes)(1, 5),
|
|
157
|
-
eIdent:
|
|
162
|
+
eIdent: config.registrationInfo.identityKeyPair.pubKey,
|
|
158
163
|
eSkeyId: (0, bytes_1.intToBytes)(3, signedPreKeyId),
|
|
159
|
-
eSkeyVal:
|
|
160
|
-
eSkeySig:
|
|
164
|
+
eSkeyVal: config.signedPreKey.keyPair.pubKey,
|
|
165
|
+
eSkeySig: config.signedPreKey.signature
|
|
161
166
|
};
|
|
162
167
|
return _proto_1.proto.ClientPayload.encode({
|
|
163
168
|
...common,
|
|
@@ -14,7 +14,7 @@ class WaFrameCodec {
|
|
|
14
14
|
if (maxFrameLength >= 1 << 24) {
|
|
15
15
|
throw new Error('maxFrameLength must be lower than protocol limit (16777216)');
|
|
16
16
|
}
|
|
17
|
-
this.introFrame = introFrame && introFrame.length > 0 ?
|
|
17
|
+
this.introFrame = introFrame && introFrame.length > 0 ? introFrame : null;
|
|
18
18
|
this.maxFrameLength = maxFrameLength;
|
|
19
19
|
this.introSent = false;
|
|
20
20
|
this.buffered = bytes_1.EMPTY_BYTES;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildMobileLoginPayload = buildMobileLoginPayload;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const _proto_1 = require("../../proto.js");
|
|
6
|
+
function parseAppVersion(version) {
|
|
7
|
+
const parts = version.split('.');
|
|
8
|
+
const at = (i) => {
|
|
9
|
+
const n = Number(parts[i]);
|
|
10
|
+
return Number.isFinite(n) ? n : undefined;
|
|
11
|
+
};
|
|
12
|
+
return {
|
|
13
|
+
primary: at(0) ?? 2,
|
|
14
|
+
secondary: at(1) ?? 0,
|
|
15
|
+
tertiary: at(2) ?? 0,
|
|
16
|
+
quaternary: at(3)
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function buildMobileLoginPayload(config) {
|
|
20
|
+
if (!Number.isSafeInteger(config.username) || config.username <= 0) {
|
|
21
|
+
throw new Error('mobile login payload requires a valid numeric username');
|
|
22
|
+
}
|
|
23
|
+
const info = config.deviceInfo;
|
|
24
|
+
const version = parseAppVersion(info.appVersion);
|
|
25
|
+
const userAgent = {
|
|
26
|
+
platform: _proto_1.proto.ClientPayload.UserAgent.Platform.ANDROID,
|
|
27
|
+
releaseChannel: _proto_1.proto.ClientPayload.UserAgent.ReleaseChannel.RELEASE,
|
|
28
|
+
appVersion: version,
|
|
29
|
+
mcc: info.mcc ?? '000',
|
|
30
|
+
mnc: info.mnc ?? '000',
|
|
31
|
+
osVersion: info.osVersion,
|
|
32
|
+
manufacturer: info.manufacturer,
|
|
33
|
+
device: info.device,
|
|
34
|
+
osBuildNumber: info.osBuildNumber,
|
|
35
|
+
phoneId: info.phoneId ?? (0, node_crypto_1.randomUUID)(),
|
|
36
|
+
localeLanguageIso6391: info.localeLanguageIso6391 ?? 'en',
|
|
37
|
+
localeCountryIso31661Alpha2: info.localeCountryIso31661Alpha2 ?? 'US',
|
|
38
|
+
deviceType: _proto_1.proto.ClientPayload.UserAgent.DeviceType.PHONE,
|
|
39
|
+
deviceBoard: info.deviceBoard,
|
|
40
|
+
deviceModelType: info.deviceModelType
|
|
41
|
+
};
|
|
42
|
+
return _proto_1.proto.ClientPayload.encode({
|
|
43
|
+
passive: config.passive === true,
|
|
44
|
+
pull: config.pull ?? true,
|
|
45
|
+
product: _proto_1.proto.ClientPayload.Product.WHATSAPP,
|
|
46
|
+
connectType: config.connectType ?? _proto_1.proto.ClientPayload.ConnectType.CELLULAR_UNKNOWN,
|
|
47
|
+
connectReason: config.connectReason ?? _proto_1.proto.ClientPayload.ConnectReason.USER_ACTIVATED,
|
|
48
|
+
userAgent,
|
|
49
|
+
username: config.username,
|
|
50
|
+
device: config.device ?? 0,
|
|
51
|
+
lidDbMigrated: config.lidDbMigrated === true,
|
|
52
|
+
pushName: config.pushName,
|
|
53
|
+
yearClass: config.yearClass,
|
|
54
|
+
memClass: config.memClass
|
|
55
|
+
}).finish();
|
|
56
|
+
}
|
|
@@ -2,26 +2,14 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.verifyNoiseCertificateChain = verifyNoiseCertificateChain;
|
|
4
4
|
const _crypto_1 = require("../../crypto/index.js");
|
|
5
|
-
const X25519_1 = require("../../crypto/curves/X25519");
|
|
6
5
|
const _proto_1 = require("../../proto.js");
|
|
7
6
|
const constants_1 = require("../noise/constants");
|
|
8
7
|
const bytes_1 = require("../../util/bytes");
|
|
9
8
|
const primitives_1 = require("../../util/primitives");
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
const signature = new Uint8Array(signatureInput);
|
|
16
|
-
const lastByte = signature[63];
|
|
17
|
-
if ((lastByte & 0x60) !== 0) {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
const signBit = lastByte & 0x80;
|
|
21
|
-
signature[63] = lastByte & 0x7f;
|
|
22
|
-
const edwardsPublicKey = (0, X25519_1.montgomeryToEdwardsPublic)(publicKey.subarray(1), signBit);
|
|
23
|
-
return _crypto_1.Ed25519.verify(message, signature, edwardsPublicKey);
|
|
24
|
-
}
|
|
9
|
+
const PRODUCTION_ROOT_CA = {
|
|
10
|
+
publicKey: (0, bytes_1.hexToBytes)(constants_1.ROOT_CA_PUBLIC_KEY_HEX),
|
|
11
|
+
serial: constants_1.ROOT_CA_SERIAL
|
|
12
|
+
};
|
|
25
13
|
function parseNoiseCertificate(certificate) {
|
|
26
14
|
if (!certificate) {
|
|
27
15
|
throw new Error('missing noise certificate');
|
|
@@ -41,21 +29,16 @@ function parseNoiseCertificate(certificate) {
|
|
|
41
29
|
signature: signatureBytes
|
|
42
30
|
};
|
|
43
31
|
}
|
|
44
|
-
function
|
|
45
|
-
const raw = (0, bytes_1.hexToBytes)(constants_1.ROOT_CA_PUBLIC_KEY_HEX);
|
|
46
|
-
return (0, _crypto_1.toSerializedPubKey)(raw);
|
|
47
|
-
}
|
|
48
|
-
async function verifyNoiseCertificateChain(certificateChain, serverStatic) {
|
|
32
|
+
async function verifyNoiseCertificateChain(certificateChain, serverStatic, rootCa = PRODUCTION_ROOT_CA) {
|
|
49
33
|
const chain = _proto_1.proto.CertChain.decode(certificateChain);
|
|
50
34
|
if (!chain.leaf || !chain.intermediate) {
|
|
51
35
|
throw new Error('noise certificate chain is missing leaf/intermediate');
|
|
52
36
|
}
|
|
53
37
|
const intermediate = parseNoiseCertificate(chain.intermediate);
|
|
54
|
-
if (intermediate.issuerSerial !==
|
|
38
|
+
if (intermediate.issuerSerial !== rootCa.serial) {
|
|
55
39
|
throw new Error('intermediate certificate issuer mismatch');
|
|
56
40
|
}
|
|
57
|
-
const
|
|
58
|
-
const validIntermediate = await verifySignalVariant(rootKey, intermediate.details, intermediate.signature);
|
|
41
|
+
const validIntermediate = await (0, _crypto_1.xeddsaVerify)(rootCa.publicKey, intermediate.details, intermediate.signature);
|
|
59
42
|
if (!validIntermediate) {
|
|
60
43
|
throw new Error('intermediate certificate signature is invalid');
|
|
61
44
|
}
|
|
@@ -63,8 +46,7 @@ async function verifyNoiseCertificateChain(certificateChain, serverStatic) {
|
|
|
63
46
|
if (leaf.issuerSerial !== intermediate.serial) {
|
|
64
47
|
throw new Error('leaf certificate issuer mismatch');
|
|
65
48
|
}
|
|
66
|
-
const
|
|
67
|
-
const validLeaf = await verifySignalVariant(intermediatePublicSerialized, leaf.details, leaf.signature);
|
|
49
|
+
const validLeaf = await (0, _crypto_1.xeddsaVerify)(intermediate.key, leaf.details, leaf.signature);
|
|
68
50
|
if (!validLeaf) {
|
|
69
51
|
throw new Error('leaf certificate signature is invalid');
|
|
70
52
|
}
|
|
@@ -16,7 +16,7 @@ function resolvePayload(payload) {
|
|
|
16
16
|
if (payload instanceof Uint8Array) {
|
|
17
17
|
return Promise.resolve(payload);
|
|
18
18
|
}
|
|
19
|
-
return Promise.resolve(payload())
|
|
19
|
+
return Promise.resolve(payload());
|
|
20
20
|
}
|
|
21
21
|
async function resolveHandshakePayload(config) {
|
|
22
22
|
if (config.isRegistered) {
|
|
@@ -61,6 +61,7 @@ class WaNoiseSession {
|
|
|
61
61
|
this.closedError = null;
|
|
62
62
|
this.noiseSocket = null;
|
|
63
63
|
this.serverStaticKey = null;
|
|
64
|
+
this.trustedRootCa = undefined;
|
|
64
65
|
this.handshakeFrameTimeoutMs = constants_1.WA_DEFAULTS.CONNECT_TIMEOUT_MS;
|
|
65
66
|
this.sendWire = sendWire;
|
|
66
67
|
this.logger = logger;
|
|
@@ -71,9 +72,7 @@ class WaNoiseSession {
|
|
|
71
72
|
isRegistered: config.isRegistered,
|
|
72
73
|
hasServerStaticKey: !!config.serverStaticKey
|
|
73
74
|
});
|
|
74
|
-
const protocolHeader = config.protocolHeader
|
|
75
|
-
? (0, bytes_1.toBytesView)(config.protocolHeader)
|
|
76
|
-
: constants_2.WA_PROTO_HEADER;
|
|
75
|
+
const protocolHeader = config.protocolHeader ?? constants_2.WA_PROTO_HEADER;
|
|
77
76
|
const introFrame = config.routingInfo && config.routingInfo.length > 0
|
|
78
77
|
? (0, bytes_1.concatBytes)([buildRoutingInfoPrefix(config.routingInfo), protocolHeader])
|
|
79
78
|
: protocolHeader;
|
|
@@ -83,6 +82,7 @@ class WaNoiseSession {
|
|
|
83
82
|
resolveHandshakePayload(config)
|
|
84
83
|
]);
|
|
85
84
|
const verifyCertificates = config.verifyCertificateChain !== false;
|
|
85
|
+
this.trustedRootCa = config.trustedRootCa;
|
|
86
86
|
if (config.serverStaticKey && config.serverStaticKey.length === 32) {
|
|
87
87
|
this.logger.info('noise session attempting resume handshake (IK)');
|
|
88
88
|
this.noiseSocket = await this.resumeHandshake(config.serverStaticKey, config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
|
|
@@ -184,6 +184,7 @@ class WaNoiseSession {
|
|
|
184
184
|
this.closedError = null;
|
|
185
185
|
this.noiseSocket = null;
|
|
186
186
|
this.serverStaticKey = null;
|
|
187
|
+
this.trustedRootCa = undefined;
|
|
187
188
|
this.writeChain = Promise.resolve();
|
|
188
189
|
this.readChain = Promise.resolve();
|
|
189
190
|
}
|
|
@@ -247,7 +248,7 @@ class WaNoiseSession {
|
|
|
247
248
|
if (!serverHello.payload) {
|
|
248
249
|
throw new Error('noise resume handshake missing certificate payload');
|
|
249
250
|
}
|
|
250
|
-
const serverEphemeral =
|
|
251
|
+
const serverEphemeral = serverHello.ephemeral;
|
|
251
252
|
await handshake.authenticate(serverEphemeral);
|
|
252
253
|
const [dh1, dh2] = await Promise.all([
|
|
253
254
|
_crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral),
|
|
@@ -255,7 +256,7 @@ class WaNoiseSession {
|
|
|
255
256
|
]);
|
|
256
257
|
await handshake.mixIntoKey(dh1);
|
|
257
258
|
await handshake.mixIntoKey(dh2);
|
|
258
|
-
await handshake.decrypt(
|
|
259
|
+
await handshake.decrypt(serverHello.payload);
|
|
259
260
|
this.serverStaticKey = serverStaticKey;
|
|
260
261
|
this.logger.info('noise resume handshake successful without fallback');
|
|
261
262
|
return { socket: await handshake.finish(), serverHelloFrame: null };
|
|
@@ -273,14 +274,14 @@ class WaNoiseSession {
|
|
|
273
274
|
if (!serverHello?.ephemeral || !serverHello.static || !serverHello.payload) {
|
|
274
275
|
throw new Error('noise full handshake missing server hello fields');
|
|
275
276
|
}
|
|
276
|
-
const serverEphemeral =
|
|
277
|
+
const serverEphemeral = serverHello.ephemeral;
|
|
277
278
|
await handshake.authenticate(serverEphemeral);
|
|
278
279
|
await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
|
|
279
|
-
const serverStatic = await handshake.decrypt(
|
|
280
|
+
const serverStatic = await handshake.decrypt(serverHello.static);
|
|
280
281
|
await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStatic));
|
|
281
|
-
const certificate = await handshake.decrypt(
|
|
282
|
+
const certificate = await handshake.decrypt(serverHello.payload);
|
|
282
283
|
if (verifyCertificates) {
|
|
283
|
-
await (0, WaNoiseCert_1.verifyNoiseCertificateChain)(certificate, serverStatic);
|
|
284
|
+
await (0, WaNoiseCert_1.verifyNoiseCertificateChain)(certificate, serverStatic, this.trustedRootCa);
|
|
284
285
|
this.logger.trace('noise certificate chain verified');
|
|
285
286
|
}
|
|
286
287
|
this.serverStaticKey = serverStatic;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type CryptoKey } from '../crypto/core/primitives';
|
|
2
|
+
import { type Proto } from '..';
|
|
2
3
|
interface WaAppStateDerivedKeys {
|
|
3
|
-
readonly
|
|
4
|
-
readonly
|
|
5
|
-
readonly
|
|
6
|
-
readonly
|
|
7
|
-
readonly
|
|
4
|
+
readonly indexHmacKey: CryptoKey;
|
|
5
|
+
readonly valueEncryptionAesKey: CryptoKey;
|
|
6
|
+
readonly valueMacHmacKey: CryptoKey;
|
|
7
|
+
readonly snapshotMacHmacKey: CryptoKey;
|
|
8
|
+
readonly patchMacHmacKey: CryptoKey;
|
|
8
9
|
}
|
|
9
10
|
interface WaAppStateEncryptedMutation {
|
|
10
11
|
readonly indexMac: Uint8Array;
|
|
@@ -21,10 +22,12 @@ interface WaAppStateDecryptedMutation {
|
|
|
21
22
|
export declare class WaAppStateCrypto {
|
|
22
23
|
private readonly derivedKeysCache;
|
|
23
24
|
private readonly derivedKeysCacheMaxSize;
|
|
24
|
-
|
|
25
|
+
private readonly skipMacVerification;
|
|
26
|
+
constructor(derivedKeysCacheMaxSize?: number, skipMacVerification?: boolean);
|
|
27
|
+
get isMacVerificationSkipped(): boolean;
|
|
25
28
|
clearCache(): void;
|
|
26
29
|
deriveKeys(keyData: Uint8Array): Promise<WaAppStateDerivedKeys>;
|
|
27
|
-
generateIndexMac(
|
|
30
|
+
generateIndexMac(indexHmacKey: CryptoKey, indexBytes: Uint8Array): Promise<Uint8Array>;
|
|
28
31
|
encryptMutation(args: {
|
|
29
32
|
readonly operation: number;
|
|
30
33
|
readonly keyId: Uint8Array;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { AppStateCollectionName, WaAppStateMissingKeysEvent,
|
|
1
|
+
import type { AppStateCollectionName, WaAppStateMissingKeysEvent, WaAppStateStoreData, WaAppStateSyncKey, WaAppStateSyncOptions, WaAppStateSyncResult } from './types';
|
|
2
2
|
import type { Logger } from '../infra/log/types';
|
|
3
|
-
import type
|
|
3
|
+
import { type Proto } from '..';
|
|
4
4
|
import type { WaAppStateStore } from '../store/contracts/appstate.store';
|
|
5
5
|
import type { BinaryNode } from '../transport/types';
|
|
6
6
|
interface WaAppStateSyncClientOptions {
|
|
@@ -11,6 +11,8 @@ interface WaAppStateSyncClientOptions {
|
|
|
11
11
|
readonly hostDomain?: string;
|
|
12
12
|
readonly defaultTimeoutMs?: number;
|
|
13
13
|
readonly onMissingKeys?: (event: WaAppStateMissingKeysEvent) => Promise<void>;
|
|
14
|
+
readonly skipMacVerification?: boolean;
|
|
15
|
+
readonly mobilePrimary?: boolean;
|
|
14
16
|
}
|
|
15
17
|
export declare class WaAppStateMissingKeyError extends Error {
|
|
16
18
|
readonly keyId: Uint8Array | null;
|
|
@@ -26,10 +28,12 @@ export declare class WaAppStateSyncClient {
|
|
|
26
28
|
private readonly defaultTimeoutMs;
|
|
27
29
|
private readonly onMissingKeys?;
|
|
28
30
|
private readonly crypto;
|
|
31
|
+
private readonly mobilePrimary;
|
|
29
32
|
private syncContext;
|
|
30
33
|
private syncPromise;
|
|
31
34
|
constructor(options: WaAppStateSyncClientOptions);
|
|
32
35
|
exportState(): Promise<WaAppStateStoreData>;
|
|
36
|
+
ensureInitialSyncKey(): Promise<WaAppStateSyncKey>;
|
|
33
37
|
importSyncKeys(keys: readonly WaAppStateSyncKey[]): Promise<number>;
|
|
34
38
|
importSyncKeyShare(share: Proto.Message.IAppStateSyncKeyShare): Promise<number>;
|
|
35
39
|
sync(options?: WaAppStateSyncOptions): Promise<WaAppStateSyncResult>;
|
|
@@ -3,5 +3,5 @@ export type { AppStateCollectionName, WaAppStateStoreData, WaAppStateSyncKey, Wa
|
|
|
3
3
|
export { encodeAppStateFingerprint, decodeAppStateFingerprint, decodeAppStateCollections, decodeAppStateSyncKeys } from './encoding';
|
|
4
4
|
export * from './utils';
|
|
5
5
|
export { WaAppStateCrypto } from './WaAppStateCrypto';
|
|
6
|
-
export { parseSyncResponse } from './
|
|
6
|
+
export { parseSyncResponse } from './response-parser';
|
|
7
7
|
export { WaAppStateSyncClient } from './WaAppStateSyncClient';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AppStateCollectionName, AppStateCollectionState } from './types';
|
|
2
|
-
import type
|
|
2
|
+
import { type Proto } from '..';
|
|
3
3
|
import type { BinaryNode } from '../transport/types';
|
|
4
4
|
export interface CollectionResponsePayload {
|
|
5
5
|
readonly collection: AppStateCollectionName;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Proto } from '..';
|
|
2
|
-
import type {
|
|
2
|
+
import type { WA_APP_STATE_COLLECTION_STATES, WA_APP_STATE_COLLECTIONS } from '../protocol/constants';
|
|
3
3
|
export type AppStateCollectionName = (typeof WA_APP_STATE_COLLECTIONS)[keyof typeof WA_APP_STATE_COLLECTIONS];
|
|
4
4
|
export type AppStateCollectionState = (typeof WA_APP_STATE_COLLECTION_STATES)[keyof typeof WA_APP_STATE_COLLECTION_STATES];
|
|
5
5
|
export interface WaAppStateSyncKey {
|