zapo-js 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -7
- package/dist/appstate/WaAppStateCrypto.js +18 -25
- package/dist/appstate/WaAppStateSyncClient.js +181 -114
- package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
- package/dist/appstate/constants.js +4 -3
- package/dist/appstate/utils.js +10 -30
- package/dist/auth/WaAuthClient.js +48 -55
- package/dist/auth/flow/WaAuthCredentialsFlow.js +21 -14
- package/dist/auth/index.js +1 -3
- package/dist/auth/pairing/WaPairingFlow.js +21 -23
- package/dist/auth/pairing/WaQrFlow.js +37 -24
- package/dist/client/WaClient.js +103 -276
- package/dist/client/WaClientFactory.js +227 -110
- package/dist/client/connection/WaConnectionManager.js +292 -0
- package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
- package/dist/client/connection/WaReceiptQueue.js +51 -0
- package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
- package/dist/client/coordinators/WaGroupCoordinator.js +27 -17
- package/dist/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
- package/dist/client/coordinators/WaMessageDispatchCoordinator.js +231 -686
- package/dist/client/coordinators/WaRetryCoordinator.js +70 -37
- package/dist/client/dirty.js +35 -29
- package/dist/client/events/chat.js +4 -3
- package/dist/client/events/group.js +59 -36
- package/dist/client/history-sync.js +53 -63
- package/dist/client/incoming.js +23 -20
- package/dist/client/mailbox.js +8 -8
- package/dist/client/messages.js +4 -4
- package/dist/client/messaging/fanout.js +189 -0
- package/dist/client/messaging/key-protocol.js +130 -0
- package/dist/client/messaging/participants.js +191 -0
- package/dist/crypto/core/hkdf.js +3 -8
- package/dist/crypto/core/index.js +1 -4
- package/dist/crypto/core/keys.js +2 -3
- package/dist/crypto/core/primitives.js +12 -15
- package/dist/crypto/core/random.js +7 -26
- package/dist/crypto/curves/Ed25519.js +7 -8
- package/dist/crypto/curves/X25519.js +13 -16
- package/dist/crypto/index.js +0 -5
- package/dist/esm/appstate/WaAppStateCrypto.js +6 -13
- package/dist/esm/appstate/WaAppStateSyncClient.js +174 -107
- package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
- package/dist/esm/appstate/constants.js +3 -2
- package/dist/esm/appstate/utils.js +8 -27
- package/dist/esm/auth/WaAuthClient.js +48 -55
- package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +21 -14
- package/dist/esm/auth/index.js +0 -1
- package/dist/esm/auth/pairing/WaPairingFlow.js +14 -16
- package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
- package/dist/esm/client/WaClient.js +103 -276
- package/dist/esm/client/WaClientFactory.js +227 -110
- package/dist/esm/client/connection/WaConnectionManager.js +288 -0
- package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
- package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
- package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
- package/dist/esm/client/coordinators/WaGroupCoordinator.js +20 -10
- package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
- package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +232 -687
- package/dist/esm/client/coordinators/WaRetryCoordinator.js +71 -38
- package/dist/esm/client/dirty.js +30 -24
- package/dist/esm/client/events/chat.js +4 -3
- package/dist/esm/client/events/group.js +50 -28
- package/dist/esm/client/history-sync.js +50 -60
- package/dist/esm/client/incoming.js +23 -20
- package/dist/esm/client/mailbox.js +8 -8
- package/dist/esm/client/messages.js +1 -1
- package/dist/esm/client/messaging/fanout.js +186 -0
- package/dist/esm/client/messaging/key-protocol.js +127 -0
- package/dist/esm/client/messaging/participants.js +188 -0
- package/dist/esm/crypto/core/hkdf.js +3 -8
- package/dist/esm/crypto/core/index.js +0 -1
- package/dist/esm/crypto/core/keys.js +2 -3
- package/dist/esm/crypto/core/primitives.js +12 -15
- package/dist/esm/crypto/core/random.js +6 -25
- package/dist/esm/crypto/curves/Ed25519.js +4 -5
- package/dist/esm/crypto/curves/X25519.js +10 -13
- package/dist/esm/crypto/index.js +0 -2
- package/dist/esm/infra/log/ConsoleLogger.js +18 -17
- package/dist/esm/infra/log/PinoLogger.js +15 -9
- package/dist/esm/infra/log/types.js +11 -1
- package/dist/esm/infra/perf/BoundedTaskQueue.js +13 -17
- package/dist/esm/media/WaMediaCrypto.js +2 -4
- package/dist/esm/media/WaMediaTransferClient.js +226 -58
- package/dist/esm/media/conn.js +10 -6
- package/dist/esm/media/constants.js +4 -1
- package/dist/esm/message/WaMessageClient.js +4 -13
- package/dist/esm/message/ack.js +6 -6
- package/dist/esm/message/addon-crypto.js +59 -0
- package/dist/esm/message/incoming.js +106 -111
- package/dist/esm/message/index.js +2 -0
- package/dist/esm/message/reporting-token.js +438 -0
- package/dist/esm/message/use-case-secret.js +49 -0
- package/dist/esm/protocol/appstate.js +58 -0
- package/dist/esm/protocol/constants.js +2 -1
- package/dist/esm/protocol/index.js +2 -10
- package/dist/esm/protocol/jid.js +63 -51
- package/dist/esm/protocol/media.js +3 -3
- package/dist/esm/protocol/nodes.js +2 -0
- package/dist/esm/protocol/usync.js +11 -0
- package/dist/esm/retry/index.js +1 -0
- package/dist/esm/retry/outbound.js +4 -5
- package/dist/esm/retry/parse.js +58 -76
- package/dist/esm/retry/replay.js +48 -49
- package/dist/esm/retry/tracker.js +56 -0
- package/dist/esm/signal/api/SignalDeviceSyncApi.js +249 -82
- package/dist/esm/signal/api/SignalDigestSyncApi.js +6 -1
- package/dist/esm/signal/api/SignalIdentitySyncApi.js +49 -34
- package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +70 -62
- package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -30
- package/dist/esm/signal/crypto/WaAdvSignature.js +3 -5
- package/dist/esm/signal/group/SenderKeyChain.js +28 -23
- package/dist/esm/signal/group/SenderKeyCodec.js +2 -4
- package/dist/esm/signal/group/SenderKeyManager.js +26 -16
- package/dist/esm/signal/index.js +1 -0
- package/dist/esm/signal/session/SignalProtocol.js +49 -14
- package/dist/esm/signal/session/SignalRatchet.js +24 -15
- package/dist/esm/signal/session/SignalSession.js +14 -9
- package/dist/esm/signal/session/resolver.js +186 -0
- package/dist/esm/signal/store/sqlite.js +16 -37
- package/dist/esm/store/createStore.js +16 -18
- package/dist/esm/store/noop.store.js +3 -6
- package/dist/esm/store/providers/memory/appstate.store.js +30 -6
- package/dist/esm/store/providers/memory/contact.store.js +5 -0
- package/dist/esm/store/providers/memory/device-list.store.js +3 -30
- package/dist/esm/store/providers/memory/message.store.js +11 -5
- package/dist/esm/store/providers/memory/participants.store.js +1 -8
- package/dist/esm/store/providers/memory/sender-key.store.js +5 -7
- package/dist/esm/store/providers/memory/signal.store.js +13 -1
- package/dist/esm/store/providers/memory/thread.store.js +5 -0
- package/dist/esm/store/providers/sqlite/appstate.store.js +82 -1
- package/dist/esm/store/providers/sqlite/connection.js +18 -13
- package/dist/esm/store/providers/sqlite/contact.store.js +31 -18
- package/dist/esm/store/providers/sqlite/device-list.store.js +7 -35
- package/dist/esm/store/providers/sqlite/message.store.js +45 -32
- package/dist/esm/store/providers/sqlite/migrations.js +1 -1
- package/dist/esm/store/providers/sqlite/participants.store.js +1 -9
- package/dist/esm/store/providers/sqlite/retry.store.js +8 -11
- package/dist/esm/store/providers/sqlite/sender-key.store.js +25 -30
- package/dist/esm/store/providers/sqlite/signal.store.js +104 -22
- package/dist/esm/store/providers/sqlite/table-names.js +107 -0
- package/dist/esm/store/providers/sqlite/thread.store.js +35 -22
- package/dist/esm/transport/WaComms.js +25 -23
- package/dist/esm/transport/WaWebSocket.js +115 -12
- package/dist/esm/transport/binary/decoder.js +4 -4
- package/dist/esm/transport/binary/encoder.js +12 -4
- package/dist/esm/transport/index.js +1 -0
- package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
- package/dist/esm/transport/node/WaNodeOrchestrator.js +2 -4
- package/dist/esm/transport/node/WaNodeTransport.js +0 -3
- package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
- package/dist/esm/transport/node/builders/index.js +2 -1
- package/dist/esm/transport/node/builders/message.js +9 -0
- package/dist/esm/transport/node/builders/pairing.js +4 -5
- package/dist/esm/transport/node/builders/usync.js +41 -0
- package/dist/esm/transport/node/helpers.js +107 -5
- package/dist/esm/transport/node/usync.js +35 -0
- package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
- package/dist/esm/transport/noise/WaNoiseCert.js +3 -6
- package/dist/esm/transport/noise/WaNoiseSession.js +17 -10
- package/dist/esm/transport/proxy.js +27 -0
- package/dist/esm/transport/stream/parse.js +13 -48
- package/dist/esm/util/bytes.js +50 -32
- package/dist/esm/util/coercion.js +6 -14
- package/dist/esm/util/primitives.js +39 -14
- package/dist/infra/log/ConsoleLogger.js +18 -17
- package/dist/infra/log/PinoLogger.js +15 -9
- package/dist/infra/log/types.js +12 -0
- package/dist/infra/perf/BoundedTaskQueue.js +13 -17
- package/dist/media/WaMediaCrypto.js +1 -3
- package/dist/media/WaMediaTransferClient.js +259 -58
- package/dist/media/conn.js +10 -6
- package/dist/media/constants.js +4 -1
- package/dist/message/WaMessageClient.js +5 -14
- package/dist/message/ack.js +6 -6
- package/dist/message/addon-crypto.js +65 -0
- package/dist/message/incoming.js +104 -109
- package/dist/message/index.js +2 -0
- package/dist/message/reporting-token.js +443 -0
- package/dist/message/use-case-secret.js +55 -0
- package/dist/protocol/appstate.js +59 -1
- package/dist/protocol/constants.js +7 -1
- package/dist/protocol/index.js +20 -42
- package/dist/protocol/jid.js +64 -51
- package/dist/protocol/media.js +3 -3
- package/dist/protocol/nodes.js +2 -0
- package/dist/protocol/usync.js +14 -0
- package/dist/retry/index.js +3 -1
- package/dist/retry/outbound.js +6 -7
- package/dist/retry/parse.js +57 -75
- package/dist/retry/replay.js +46 -47
- package/dist/retry/tracker.js +59 -0
- package/dist/signal/api/SignalDeviceSyncApi.js +247 -80
- package/dist/signal/api/SignalDigestSyncApi.js +6 -1
- package/dist/signal/api/SignalIdentitySyncApi.js +49 -34
- package/dist/signal/api/SignalMissingPreKeysSyncApi.js +67 -59
- package/dist/signal/api/SignalSessionSyncApi.js +23 -30
- package/dist/signal/crypto/WaAdvSignature.js +2 -4
- package/dist/signal/group/SenderKeyChain.js +27 -22
- package/dist/signal/group/SenderKeyCodec.js +1 -3
- package/dist/signal/group/SenderKeyManager.js +26 -16
- package/dist/signal/index.js +3 -1
- package/dist/signal/session/SignalProtocol.js +49 -14
- package/dist/signal/session/SignalRatchet.js +24 -15
- package/dist/signal/session/SignalSession.js +14 -9
- package/dist/signal/session/resolver.js +189 -0
- package/dist/signal/store/sqlite.js +16 -37
- package/dist/store/createStore.js +16 -18
- package/dist/store/noop.store.js +3 -6
- package/dist/store/providers/memory/appstate.store.js +28 -4
- package/dist/store/providers/memory/contact.store.js +5 -0
- package/dist/store/providers/memory/device-list.store.js +3 -30
- package/dist/store/providers/memory/message.store.js +11 -5
- package/dist/store/providers/memory/participants.store.js +1 -8
- package/dist/store/providers/memory/sender-key.store.js +8 -10
- package/dist/store/providers/memory/signal.store.js +21 -9
- package/dist/store/providers/memory/thread.store.js +5 -0
- package/dist/store/providers/sqlite/appstate.store.js +81 -0
- package/dist/store/providers/sqlite/connection.js +18 -13
- package/dist/store/providers/sqlite/contact.store.js +31 -18
- package/dist/store/providers/sqlite/device-list.store.js +7 -35
- package/dist/store/providers/sqlite/message.store.js +45 -32
- package/dist/store/providers/sqlite/migrations.js +1 -1
- package/dist/store/providers/sqlite/participants.store.js +1 -9
- package/dist/store/providers/sqlite/retry.store.js +8 -11
- package/dist/store/providers/sqlite/sender-key.store.js +24 -29
- package/dist/store/providers/sqlite/signal.store.js +105 -23
- package/dist/store/providers/sqlite/table-names.js +113 -0
- package/dist/store/providers/sqlite/thread.store.js +35 -22
- package/dist/transport/WaComms.js +27 -25
- package/dist/transport/WaWebSocket.js +148 -12
- package/dist/transport/binary/decoder.js +4 -4
- package/dist/transport/binary/encoder.js +12 -4
- package/dist/transport/index.js +7 -1
- package/dist/transport/keepalive/WaKeepAlive.js +1 -7
- package/dist/transport/node/WaNodeOrchestrator.js +2 -4
- package/dist/transport/node/WaNodeTransport.js +0 -3
- package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
- package/dist/transport/node/builders/index.js +12 -9
- package/dist/transport/node/builders/message.js +9 -0
- package/dist/transport/node/builders/pairing.js +4 -5
- package/dist/transport/node/builders/usync.js +45 -0
- package/dist/transport/node/helpers.js +112 -4
- package/dist/transport/node/usync.js +38 -0
- package/dist/transport/noise/WaFrameCodec.js +47 -32
- package/dist/transport/noise/WaNoiseCert.js +5 -8
- package/dist/transport/noise/WaNoiseSession.js +17 -10
- package/dist/transport/proxy.js +34 -0
- package/dist/transport/stream/parse.js +17 -53
- package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
- package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
- package/dist/types/appstate/constants.d.ts +1 -0
- package/dist/types/appstate/store/sqlite.d.ts +4 -18
- package/dist/types/appstate/utils.d.ts +0 -1
- package/dist/types/auth/WaAuthClient.d.ts +10 -12
- package/dist/types/auth/index.d.ts +0 -2
- package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
- package/dist/types/auth/types.d.ts +6 -9
- package/dist/types/client/WaClient.d.ts +27 -25
- package/dist/types/client/WaClientFactory.d.ts +22 -23
- package/dist/types/client/connection/WaConnectionManager.d.ts +64 -0
- package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
- package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
- package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
- package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +0 -1
- package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +18 -41
- package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +2 -0
- package/dist/types/client/dirty.d.ts +1 -0
- package/dist/types/client/events/group.d.ts +2 -1
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/messaging/fanout.d.ts +14 -0
- package/dist/types/client/messaging/key-protocol.d.ts +18 -0
- package/dist/types/client/messaging/participants.d.ts +13 -0
- package/dist/types/client/types.d.ts +24 -1
- package/dist/types/crypto/core/hkdf.d.ts +0 -6
- package/dist/types/crypto/core/index.d.ts +0 -1
- package/dist/types/crypto/core/random.d.ts +1 -7
- package/dist/types/crypto/index.d.ts +0 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
- package/dist/types/infra/log/PinoLogger.d.ts +1 -1
- package/dist/types/infra/log/types.d.ts +1 -0
- package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
- package/dist/types/media/WaMediaTransferClient.d.ts +13 -3
- package/dist/types/media/types.d.ts +5 -0
- package/dist/types/message/addon-crypto.d.ts +25 -0
- package/dist/types/message/index.d.ts +2 -0
- package/dist/types/message/reporting-token.d.ts +19 -0
- package/dist/types/message/use-case-secret.d.ts +20 -0
- package/dist/types/protocol/appstate.d.ts +58 -0
- package/dist/types/protocol/constants.d.ts +2 -1
- package/dist/types/protocol/index.d.ts +2 -10
- package/dist/types/protocol/jid.d.ts +3 -3
- package/dist/types/protocol/nodes.d.ts +2 -0
- package/dist/types/protocol/usync.d.ts +11 -0
- package/dist/types/retry/index.d.ts +1 -0
- package/dist/types/retry/replay.d.ts +0 -4
- package/dist/types/retry/tracker.d.ts +19 -0
- package/dist/types/retry/types.d.ts +4 -3
- package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +13 -1
- package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
- package/dist/types/signal/index.d.ts +1 -0
- package/dist/types/signal/session/SignalProtocol.d.ts +9 -0
- package/dist/types/signal/session/resolver.d.ts +17 -0
- package/dist/types/store/contracts/appstate.store.d.ts +3 -0
- package/dist/types/store/contracts/contact.store.d.ts +1 -0
- package/dist/types/store/contracts/device-list.store.d.ts +0 -3
- package/dist/types/store/contracts/message.store.d.ts +1 -0
- package/dist/types/store/contracts/participants.store.d.ts +0 -1
- package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
- package/dist/types/store/contracts/signal.store.d.ts +6 -0
- package/dist/types/store/contracts/thread.store.d.ts +1 -0
- package/dist/types/store/index.d.ts +1 -1
- package/dist/types/store/providers/memory/appstate.store.d.ts +2 -0
- package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
- package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
- package/dist/types/store/providers/memory/message.store.d.ts +1 -0
- package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
- package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
- package/dist/types/store/providers/memory/signal.store.d.ts +6 -0
- package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
- package/dist/types/store/providers/sqlite/appstate.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/contact.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -3
- package/dist/types/store/providers/sqlite/message.store.d.ts +2 -0
- package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -1
- package/dist/types/store/providers/sqlite/signal.store.d.ts +7 -0
- package/dist/types/store/providers/sqlite/table-names.d.ts +5 -0
- package/dist/types/store/providers/sqlite/thread.store.d.ts +2 -0
- package/dist/types/store/types.d.ts +3 -0
- package/dist/types/transport/WaWebSocket.d.ts +3 -0
- package/dist/types/transport/index.d.ts +2 -1
- package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
- package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
- package/dist/types/transport/node/builders/group.d.ts +4 -6
- package/dist/types/transport/node/builders/index.d.ts +2 -1
- package/dist/types/transport/node/builders/message.d.ts +14 -25
- package/dist/types/transport/node/builders/retry.d.ts +2 -4
- package/dist/types/transport/node/builders/usync.d.ts +21 -0
- package/dist/types/transport/node/helpers.d.ts +8 -0
- package/dist/types/transport/node/usync.d.ts +2 -0
- package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
- package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
- package/dist/types/transport/proxy.d.ts +6 -0
- package/dist/types/transport/stream/parse.d.ts +0 -1
- package/dist/types/transport/types.d.ts +18 -1
- package/dist/types/util/bytes.d.ts +5 -0
- package/dist/types/util/primitives.d.ts +3 -0
- package/dist/util/bytes.js +55 -33
- package/dist/util/coercion.js +6 -14
- package/dist/util/primitives.js +42 -14
- package/package.json +27 -9
- package/proto/index.d.ts +1090 -1048
- package/proto/index.js +1 -1
- package/scripts/check-node-version.cjs +0 -1
- package/dist/crypto/core/encoding.js +0 -29
- package/dist/esm/crypto/core/encoding.js +0 -25
- package/dist/esm/util/base64.js +0 -18
- package/dist/esm/util/signal-address.js +0 -5
- package/dist/types/crypto/core/encoding.d.ts +0 -11
- package/dist/types/util/base64.d.ts +0 -4
- package/dist/types/util/signal-address.d.ts +0 -2
- package/dist/util/base64.js +0 -24
- package/dist/util/signal-address.js +0 -8
- /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SERIALIZED_PUB_KEY_PREFIX } from '../core/constants.js';
|
|
2
|
+
import { assertByteLength } from '../../util/bytes.js';
|
|
2
3
|
/**
|
|
3
4
|
* Converts a 32-byte raw public key to 33-byte serialized format (with 0x05 prefix)
|
|
4
5
|
*/
|
|
@@ -9,9 +10,7 @@ export function toSerializedPubKey(key) {
|
|
|
9
10
|
}
|
|
10
11
|
return key;
|
|
11
12
|
}
|
|
12
|
-
|
|
13
|
-
throw new Error(`invalid signal public key length ${key.length}`);
|
|
14
|
-
}
|
|
13
|
+
assertByteLength(key, 32, `invalid signal public key length ${key.length}`);
|
|
15
14
|
const out = new Uint8Array(33);
|
|
16
15
|
out[0] = SERIALIZED_PUB_KEY_PREFIX;
|
|
17
16
|
out.set(key, 1);
|
|
@@ -3,17 +3,20 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { createHash, webcrypto } from 'node:crypto';
|
|
5
5
|
import { EMPTY_BYTES, toBytesView } from '../../util/bytes.js';
|
|
6
|
+
async function digestBytes(algorithm, value) {
|
|
7
|
+
return toBytesView(await webcrypto.subtle.digest(algorithm, value));
|
|
8
|
+
}
|
|
6
9
|
// ============================================
|
|
7
10
|
// Hash functions
|
|
8
11
|
// ============================================
|
|
9
12
|
export async function sha256(value) {
|
|
10
|
-
return
|
|
13
|
+
return digestBytes('SHA-256', value);
|
|
11
14
|
}
|
|
12
15
|
export async function sha1(value) {
|
|
13
|
-
return
|
|
16
|
+
return digestBytes('SHA-1', value);
|
|
14
17
|
}
|
|
15
18
|
export async function sha512(value) {
|
|
16
|
-
return
|
|
19
|
+
return digestBytes('SHA-512', value);
|
|
17
20
|
}
|
|
18
21
|
export function md5Bytes(input) {
|
|
19
22
|
return toBytesView(createHash('md5').update(input).digest());
|
|
@@ -25,12 +28,10 @@ export async function importAesGcmKey(raw, usages) {
|
|
|
25
28
|
return webcrypto.subtle.importKey('raw', raw, 'AES-GCM', false, usages);
|
|
26
29
|
}
|
|
27
30
|
export async function aesGcmEncrypt(key, nonce, plaintext, aad = EMPTY_BYTES) {
|
|
28
|
-
|
|
29
|
-
return toBytesView(result);
|
|
31
|
+
return toBytesView(await webcrypto.subtle.encrypt({ name: 'AES-GCM', iv: nonce, additionalData: aad }, key, plaintext));
|
|
30
32
|
}
|
|
31
33
|
export async function aesGcmDecrypt(key, nonce, ciphertext, aad = EMPTY_BYTES) {
|
|
32
|
-
|
|
33
|
-
return toBytesView(result);
|
|
34
|
+
return toBytesView(await webcrypto.subtle.decrypt({ name: 'AES-GCM', iv: nonce, additionalData: aad }, key, ciphertext));
|
|
34
35
|
}
|
|
35
36
|
// ============================================
|
|
36
37
|
// AES-CBC (for Signal protocol)
|
|
@@ -42,12 +43,10 @@ export async function importAesCbcKey(keyBytes) {
|
|
|
42
43
|
]);
|
|
43
44
|
}
|
|
44
45
|
export async function aesCbcEncrypt(key, iv, plaintext) {
|
|
45
|
-
|
|
46
|
-
return toBytesView(result);
|
|
46
|
+
return toBytesView(await webcrypto.subtle.encrypt({ name: 'AES-CBC', iv }, key, plaintext));
|
|
47
47
|
}
|
|
48
48
|
export async function aesCbcDecrypt(key, iv, ciphertext) {
|
|
49
|
-
|
|
50
|
-
return toBytesView(result);
|
|
49
|
+
return toBytesView(await webcrypto.subtle.decrypt({ name: 'AES-CBC', iv }, key, ciphertext));
|
|
51
50
|
}
|
|
52
51
|
// ============================================
|
|
53
52
|
// HMAC-SHA256 (for Signal protocol)
|
|
@@ -86,12 +85,10 @@ export async function pbkdf2DeriveAesCtrKey(password, salt, iterations) {
|
|
|
86
85
|
// AES-CTR (for pairing code crypto)
|
|
87
86
|
// ============================================
|
|
88
87
|
export async function aesCtrEncrypt(key, counter, plaintext) {
|
|
89
|
-
|
|
90
|
-
return toBytesView(result);
|
|
88
|
+
return toBytesView(await webcrypto.subtle.encrypt({ name: 'AES-CTR', counter, length: 64 }, key, plaintext));
|
|
91
89
|
}
|
|
92
90
|
export async function aesCtrDecrypt(key, counter, ciphertext) {
|
|
93
|
-
|
|
94
|
-
return toBytesView(result);
|
|
91
|
+
return toBytesView(await webcrypto.subtle.decrypt({ name: 'AES-CTR', counter, length: 64 }, key, ciphertext));
|
|
95
92
|
}
|
|
96
93
|
// ============================================
|
|
97
94
|
// Ed25519 raw verify (for Signal variant sigs)
|
|
@@ -1,28 +1,9 @@
|
|
|
1
1
|
import { randomBytes, randomInt } from 'node:crypto';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
2
3
|
import { toBytesView } from '../../util/bytes.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
return new Promise((resolve, reject) => {
|
|
8
|
-
randomBytes(size, (error, buffer) => {
|
|
9
|
-
if (error)
|
|
10
|
-
reject(error);
|
|
11
|
-
else
|
|
12
|
-
resolve(toBytesView(buffer));
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Generates a cryptographically secure random integer in the range [min, max)
|
|
18
|
-
*/
|
|
19
|
-
export function randomIntAsync(min, max) {
|
|
20
|
-
return new Promise((resolve, reject) => {
|
|
21
|
-
randomInt(min, max, (error, value) => {
|
|
22
|
-
if (error)
|
|
23
|
-
reject(error);
|
|
24
|
-
else
|
|
25
|
-
resolve(value);
|
|
26
|
-
});
|
|
27
|
-
});
|
|
4
|
+
const randomBytesAsyncImpl = promisify(randomBytes);
|
|
5
|
+
const randomIntAsyncImpl = promisify(randomInt);
|
|
6
|
+
export async function randomBytesAsync(size) {
|
|
7
|
+
return toBytesView(await randomBytesAsyncImpl(size));
|
|
28
8
|
}
|
|
9
|
+
export const randomIntAsync = randomIntAsyncImpl;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { webcrypto } from 'node:crypto';
|
|
2
|
-
import { assert32, decodeBase64Url } from '../core/encoding.js';
|
|
3
2
|
import { ED25519_PKCS8_PREFIX } from '../curves/constants.js';
|
|
4
3
|
import { pkcs8FromRawPrivate } from '../curves/types.js';
|
|
5
|
-
import { toBytesView } from '../../util/bytes.js';
|
|
4
|
+
import { assertByteLength, decodeBase64Url, toBytesView } from '../../util/bytes.js';
|
|
6
5
|
export class Ed25519 {
|
|
7
6
|
static async generateKeyPair() {
|
|
8
7
|
const keys = (await webcrypto.subtle.generateKey({ name: 'Ed25519' }, true, [
|
|
@@ -16,7 +15,7 @@ export class Ed25519 {
|
|
|
16
15
|
};
|
|
17
16
|
}
|
|
18
17
|
static async keyPairFromPrivateKey(privKey) {
|
|
19
|
-
|
|
18
|
+
assertByteLength(privKey, 32, 'ed25519 private key must be 32 bytes');
|
|
20
19
|
const privateKey = await webcrypto.subtle.importKey('pkcs8', pkcs8FromRawPrivate(ED25519_PKCS8_PREFIX, privKey), { name: 'Ed25519' }, true, ['sign']);
|
|
21
20
|
const privateJwk = await webcrypto.subtle.exportKey('jwk', privateKey);
|
|
22
21
|
return {
|
|
@@ -25,13 +24,13 @@ export class Ed25519 {
|
|
|
25
24
|
};
|
|
26
25
|
}
|
|
27
26
|
static async sign(message, privKey) {
|
|
28
|
-
|
|
27
|
+
assertByteLength(privKey, 32, 'ed25519 private key must be 32 bytes');
|
|
29
28
|
const privateKey = await webcrypto.subtle.importKey('pkcs8', pkcs8FromRawPrivate(ED25519_PKCS8_PREFIX, privKey), { name: 'Ed25519' }, false, ['sign']);
|
|
30
29
|
const signature = await webcrypto.subtle.sign('Ed25519', privateKey, message);
|
|
31
30
|
return toBytesView(signature);
|
|
32
31
|
}
|
|
33
32
|
static async verify(message, signature, pubKey) {
|
|
34
|
-
|
|
33
|
+
assertByteLength(pubKey, 32, 'ed25519 public key must be 32 bytes');
|
|
35
34
|
const publicKey = await webcrypto.subtle.importKey('raw', pubKey, { name: 'Ed25519' }, false, ['verify']);
|
|
36
35
|
return webcrypto.subtle.verify('Ed25519', publicKey, signature, message);
|
|
37
36
|
}
|
|
@@ -1,23 +1,18 @@
|
|
|
1
1
|
import { webcrypto } from 'node:crypto';
|
|
2
|
-
import { assert32, decodeBase64Url } from '../core/encoding.js';
|
|
3
2
|
import { X25519_PKCS8_PREFIX } from '../curves/constants.js';
|
|
4
3
|
import { pkcs8FromRawPrivate } from '../curves/types.js';
|
|
5
4
|
import { bigIntToBytesLE, bytesToBigIntLE } from '../math/le.js';
|
|
6
5
|
import { FIELD_P, mod, modInv } from '../math/mod.js';
|
|
7
|
-
import { toBytesView } from '../../util/bytes.js';
|
|
6
|
+
import { assertByteLength, decodeBase64Url, toBytesView } from '../../util/bytes.js';
|
|
8
7
|
export function clampCurvePrivateKeyInPlace(privateKey) {
|
|
9
|
-
|
|
10
|
-
throw new Error(`invalid curve25519 private key length ${privateKey.length}`);
|
|
11
|
-
}
|
|
8
|
+
assertByteLength(privateKey, 32, `invalid curve25519 private key length ${privateKey.length}`);
|
|
12
9
|
privateKey[0] &= 248;
|
|
13
10
|
privateKey[31] &= 127;
|
|
14
11
|
privateKey[31] |= 64;
|
|
15
12
|
return privateKey;
|
|
16
13
|
}
|
|
17
14
|
export function montgomeryToEdwardsPublic(curvePublicKey, signBit) {
|
|
18
|
-
|
|
19
|
-
throw new Error(`invalid curve25519 public key length ${curvePublicKey.length}`);
|
|
20
|
-
}
|
|
15
|
+
assertByteLength(curvePublicKey, 32, `invalid curve25519 public key length ${curvePublicKey.length}`);
|
|
21
16
|
const x = bytesToBigIntLE(curvePublicKey);
|
|
22
17
|
if (x === FIELD_P - 1n) {
|
|
23
18
|
throw new Error('invalid curve25519 low-order public key');
|
|
@@ -39,7 +34,7 @@ export class X25519 {
|
|
|
39
34
|
};
|
|
40
35
|
}
|
|
41
36
|
static async keyPairFromPrivateKey(privKey) {
|
|
42
|
-
|
|
37
|
+
assertByteLength(privKey, 32, 'x25519 private key must be 32 bytes');
|
|
43
38
|
const privateKey = await webcrypto.subtle.importKey('pkcs8', pkcs8FromRawPrivate(X25519_PKCS8_PREFIX, privKey), { name: 'X25519' }, true, ['deriveBits']);
|
|
44
39
|
const privateJwk = await webcrypto.subtle.exportKey('jwk', privateKey);
|
|
45
40
|
return {
|
|
@@ -48,10 +43,12 @@ export class X25519 {
|
|
|
48
43
|
};
|
|
49
44
|
}
|
|
50
45
|
static async scalarMult(privKey, pubKey) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const privateKey = await
|
|
54
|
-
|
|
46
|
+
assertByteLength(privKey, 32, 'x25519 private key must be 32 bytes');
|
|
47
|
+
assertByteLength(pubKey, 32, 'x25519 public key must be 32 bytes');
|
|
48
|
+
const [privateKey, publicKey] = await Promise.all([
|
|
49
|
+
webcrypto.subtle.importKey('pkcs8', pkcs8FromRawPrivate(X25519_PKCS8_PREFIX, privKey), { name: 'X25519' }, false, ['deriveBits']),
|
|
50
|
+
webcrypto.subtle.importKey('raw', pubKey, { name: 'X25519' }, false, [])
|
|
51
|
+
]);
|
|
55
52
|
const sharedBits = await webcrypto.subtle.deriveBits({ name: 'X25519', public: publicKey }, privateKey, 256);
|
|
56
53
|
return toBytesView(sharedBits);
|
|
57
54
|
}
|
package/dist/esm/crypto/index.js
CHANGED
|
@@ -5,36 +5,37 @@ const LOG_LEVEL_PRIORITY = {
|
|
|
5
5
|
warn: 40,
|
|
6
6
|
error: 50
|
|
7
7
|
};
|
|
8
|
+
const CONSOLE_WRITERS = {
|
|
9
|
+
trace: console.debug,
|
|
10
|
+
debug: console.debug,
|
|
11
|
+
info: console.info,
|
|
12
|
+
warn: console.warn,
|
|
13
|
+
error: console.error
|
|
14
|
+
};
|
|
8
15
|
export class ConsoleLogger {
|
|
9
16
|
constructor(level = 'info') {
|
|
10
17
|
this.level = level;
|
|
18
|
+
this.minLevelPriority = LOG_LEVEL_PRIORITY[level];
|
|
11
19
|
}
|
|
12
20
|
trace(message, context) {
|
|
13
|
-
|
|
14
|
-
console.debug(message, context);
|
|
15
|
-
}
|
|
21
|
+
this.write('trace', message, context);
|
|
16
22
|
}
|
|
17
23
|
debug(message, context) {
|
|
18
|
-
|
|
19
|
-
console.debug(message, context);
|
|
20
|
-
}
|
|
24
|
+
this.write('debug', message, context);
|
|
21
25
|
}
|
|
22
26
|
info(message, context) {
|
|
23
|
-
|
|
24
|
-
console.info(message, context);
|
|
25
|
-
}
|
|
27
|
+
this.write('info', message, context);
|
|
26
28
|
}
|
|
27
29
|
warn(message, context) {
|
|
28
|
-
|
|
29
|
-
console.warn(message, context);
|
|
30
|
-
}
|
|
30
|
+
this.write('warn', message, context);
|
|
31
31
|
}
|
|
32
32
|
error(message, context) {
|
|
33
|
-
|
|
34
|
-
console.error(message, context);
|
|
35
|
-
}
|
|
33
|
+
this.write('error', message, context);
|
|
36
34
|
}
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
write(level, message, context) {
|
|
36
|
+
if (LOG_LEVEL_PRIORITY[level] < this.minLevelPriority) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
CONSOLE_WRITERS[level](message, context);
|
|
39
40
|
}
|
|
40
41
|
}
|
|
@@ -23,26 +23,32 @@ export class PinoLogger {
|
|
|
23
23
|
this.logger.level = level;
|
|
24
24
|
}
|
|
25
25
|
trace(message, context) {
|
|
26
|
-
this.
|
|
26
|
+
this.write('trace', message, context);
|
|
27
27
|
}
|
|
28
28
|
debug(message, context) {
|
|
29
|
-
this.
|
|
29
|
+
this.write('debug', message, context);
|
|
30
30
|
}
|
|
31
31
|
info(message, context) {
|
|
32
|
-
this.
|
|
32
|
+
this.write('info', message, context);
|
|
33
33
|
}
|
|
34
34
|
warn(message, context) {
|
|
35
|
-
this.
|
|
35
|
+
this.write('warn', message, context);
|
|
36
36
|
}
|
|
37
37
|
error(message, context) {
|
|
38
|
-
this.
|
|
38
|
+
this.write('error', message, context);
|
|
39
39
|
}
|
|
40
|
-
|
|
41
|
-
if (
|
|
42
|
-
this.logger[
|
|
40
|
+
write(level, message, context) {
|
|
41
|
+
if (context === null || context === undefined) {
|
|
42
|
+
this.logger[level](message);
|
|
43
43
|
return;
|
|
44
44
|
}
|
|
45
|
-
|
|
45
|
+
for (const key in context) {
|
|
46
|
+
if (Object.prototype.hasOwnProperty.call(context, key)) {
|
|
47
|
+
this.logger[level](context, message);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
this.logger[level](message);
|
|
46
52
|
}
|
|
47
53
|
}
|
|
48
54
|
export async function createPinoLogger(options = {}) {
|
|
@@ -7,6 +7,16 @@ export class BoundedTaskQueueFullError extends Error {
|
|
|
7
7
|
}
|
|
8
8
|
export class BoundedTaskQueue {
|
|
9
9
|
constructor(maxQueueSize = 256, maxConcurrency = 1) {
|
|
10
|
+
this.settleTask = () => {
|
|
11
|
+
this.running--;
|
|
12
|
+
if (this.head >= 1024 && this.head * 2 >= this.queue.length) {
|
|
13
|
+
const remaining = this.queue.length - this.head;
|
|
14
|
+
this.queue.copyWithin(0, this.head);
|
|
15
|
+
this.queue.length = remaining;
|
|
16
|
+
this.head = 0;
|
|
17
|
+
}
|
|
18
|
+
this.drain();
|
|
19
|
+
};
|
|
10
20
|
if (maxQueueSize <= 0) {
|
|
11
21
|
throw new Error('maxQueueSize must be > 0');
|
|
12
22
|
}
|
|
@@ -25,8 +35,8 @@ export class BoundedTaskQueue {
|
|
|
25
35
|
}
|
|
26
36
|
return new Promise((resolve, reject) => {
|
|
27
37
|
this.queue.push({
|
|
28
|
-
task,
|
|
29
|
-
resolve:
|
|
38
|
+
task: task,
|
|
39
|
+
resolve: resolve,
|
|
30
40
|
reject
|
|
31
41
|
});
|
|
32
42
|
this.drain();
|
|
@@ -42,21 +52,7 @@ export class BoundedTaskQueue {
|
|
|
42
52
|
while (this.running < this.maxConcurrency && this.head < this.queue.length) {
|
|
43
53
|
const item = this.queue[this.head++];
|
|
44
54
|
this.running++;
|
|
45
|
-
item.task()
|
|
46
|
-
.then(item.resolve)
|
|
47
|
-
.catch(item.reject)
|
|
48
|
-
.finally(() => {
|
|
49
|
-
this.running--;
|
|
50
|
-
this.compactIfNeeded();
|
|
51
|
-
this.drain();
|
|
52
|
-
});
|
|
55
|
+
void item.task().then(item.resolve, item.reject).finally(this.settleTask);
|
|
53
56
|
}
|
|
54
57
|
}
|
|
55
|
-
compactIfNeeded() {
|
|
56
|
-
if (this.head < 1024 || this.head * 2 < this.queue.length) {
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
this.queue.splice(0, this.head);
|
|
60
|
-
this.head = 0;
|
|
61
|
-
}
|
|
62
58
|
}
|
|
@@ -6,16 +6,14 @@ import { aesCbcDecrypt, aesCbcEncrypt, hmacSign, importAesCbcKey, importHmacKey,
|
|
|
6
6
|
import { randomBytesAsync } from '../crypto/core/random.js';
|
|
7
7
|
import { ENC_KEY_END, ENC_KEY_START, HMAC_TRUNCATED_SIZE, IV_SIZE, MAC_KEY_END, MAC_KEY_START, MEDIA_HKDF_SIZE } from './constants.js';
|
|
8
8
|
import { WA_APP_STATE_KEY_TYPES, getWaMediaHkdfInfo } from '../protocol/constants.js';
|
|
9
|
-
import { concatBytes, EMPTY_BYTES, readAllBytes, toChunkBytes, toBytesView, uint8Equal, uint8TimingSafeEqual } from '../util/bytes.js';
|
|
9
|
+
import { assertByteLength, concatBytes, EMPTY_BYTES, readAllBytes, toChunkBytes, toBytesView, uint8Equal, uint8TimingSafeEqual } from '../util/bytes.js';
|
|
10
10
|
import { toError } from '../util/primitives.js';
|
|
11
11
|
export class WaMediaCrypto {
|
|
12
12
|
static async generateMediaKey() {
|
|
13
13
|
return randomBytesAsync(32);
|
|
14
14
|
}
|
|
15
15
|
static async deriveKeys(mediaType, mediaKey) {
|
|
16
|
-
|
|
17
|
-
throw new Error(`invalid media key length ${mediaKey.byteLength}, expected 32`);
|
|
18
|
-
}
|
|
16
|
+
assertByteLength(mediaKey, 32, `invalid media key length ${mediaKey.byteLength}, expected 32`);
|
|
19
17
|
const info = mediaTypeToHkdfInfo(mediaType);
|
|
20
18
|
const expanded = await hkdf(mediaKey, null, info, MEDIA_HKDF_SIZE);
|
|
21
19
|
return {
|