From 2c161238c7cec4bbeedf27d10426fbcfbb1614a8 Mon Sep 17 00:00:00 2001 From: DeFiDude <59237470+DeFiDude@users.noreply.github.com> Date: Tue, 17 Mar 2026 18:11:35 -0600 Subject: [PATCH] Fix messageId hash to exclude signature, matching Python/Rust MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit messageId was computed as SHA256(dest+src+sig+payload) but Python/Rust compute SHA256(dest+src+payload) — skipping the 64-byte signature. This caused message ID mismatches across implementations, breaking deduplication and propagation node lookups. --- src/reticulum/LXMFMessage.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/reticulum/LXMFMessage.cpp b/src/reticulum/LXMFMessage.cpp index cd04c92..7863ed3 100644 --- a/src/reticulum/LXMFMessage.cpp +++ b/src/reticulum/LXMFMessage.cpp @@ -155,8 +155,14 @@ bool LXMFMessage::unpackFull(const uint8_t* data, size_t len, LXMFMessage& msg) if (!mpReadString(content, contentLen, pos, msg.content)) return false; if (arrLen >= 4 && pos < contentLen) { mpSkipValue(content, contentLen, pos); } - RNS::Bytes fullPayload(data, len); - msg.messageId = RNS::Identity::full_hash(fullPayload); + // messageId = SHA256(dest + src + packed_content), matching Python/Rust + // (skip signature at bytes 32..96) + std::vector hashInput; + hashInput.reserve(32 + (len - 96)); + hashInput.insert(hashInput.end(), data, data + 32); // dest_hash + src_hash + hashInput.insert(hashInput.end(), data + 96, data + len); // packed_content + RNS::Bytes hashable(hashInput.data(), hashInput.size()); + msg.messageId = RNS::Identity::full_hash(hashable); msg.incoming = true; msg.status = LXMFStatus::DELIVERED; return true;