-
release(v4.2.1): fix concurrent-ratchet desync via OutboundQueue waiter cursor
released this
2026-05-04 22:58:26 +02:00 | 17 commits to main since this releasePull-mode httpClient + drainer + parallel RPCs against the same peer
deteriorated after ~10s withDecryptionError. Two bugs combined:-
OutboundQueue.enqueuewokedrainwaiters with asince=0
snapshot, replaying already-processed events into
Shade.acceptTransferEnvelope→manager.decrypttwice. The
duplicate consumed an already-used skipped key and corrupted the
Double Ratchet receive chain. -
ratchetDecryptthen propagated the corruption: a same-DH
message behind the chain with no cached skipped key fell through
tokdfChainKeyon the ahead state and rewoundchain.counter,
permanently desyncing the chain.
Fix
OutboundQueueto honor each waiter'ssince, and harden
ratchetDecryptso any future duplicate fails cleanly without
mutating state. Adds regression coverage at all three layers.Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
Downloads
-