收到 M3 → M1 → M2 时, 用 chain_index + 跳过 MK 缓存正确解密 · 同链乱序 vs 跨棘轮乱序
不熟悉以下底层概念? 这里是 30 秒回顾。
解密前必须先校验 MAC, 失败立即丢弃且不暴露错误细节 (防侧信道)。这是抗篡改的关键。
verify_mac() → if fail: discard
u64 计数器, 标识消息在当前 ChainKey 序列中的位置, 从 0 开始递增。每次推进一格 ChainKey 时 +1。
pub chain_index: u64
防止恶意客户端发 idx=10⁹ 触发 OOM。libsignal 默认 1000, vodozemac/Olm 默认 ~40 (可调)。
const MAX_SKIPPED: u32 = 1000;
键 = (ratchet_key, chain_index), 值 = MessageKey。命中即用 + 立即清除。一般用 HashMap + 容量上限。
HashMap<(PubKey, u64), MessageKey>