feat: firmware fingerprinting and Meshtastic 2.8/2.8.1 support - #128
Open
mesh-taiwan wants to merge 1 commit into
Open
mesh-taiwan wants to merge 1 commit into
mesh-taiwan wants to merge 1 commit into
Conversation
mesh-taiwan
force-pushed
the
feat/firmware-fingerprint
branch
3 times, most recently
from
September 24, 2026 05:18
c283ab8 to
c688f9f
Compare
- Decrypt AES-CCM (use_aead) channels from firmware 2.8.1, tried before AES-CTR
- Estimate each node's firmware from on-air traits (public key, relay_node,
is_unmessagable, CLIENT_BASE, CRC32-derived node id, XEdDSA signature,
AEAD / PAGING_APP / soil-water telemetry); MapReport versions shown verbatim
- Link node ids re-keyed by 2.8 through the MAC in NodeInfo ("Same Device")
- Show it on the node page, /nodes and the hover card; dashboard card with a
Firmware / Hardware toggle (version ladder or hardware models, "Show all")
- Capture daemon accumulates evidence into node_fingerprint (flushed by the
main loop) and backfills history once on first start
(fingerprint_backfill_days, default 30)
- Bump meshtastic to 2.7.11 (protobufs 2.8.0: xeddsa fields, hardware models
up to 144) and name node_info hardware models stored as UNKNOWN_<n>
- Fix get_node_details for nodes without packets; store MeshPacket.channel
in channel_index (was always NULL)
mesh-taiwan
force-pushed
the
feat/firmware-fingerprint
branch
from
September 24, 2026 05:44
c688f9f to
c3cf7a9
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Firmware 2.8 derives node numbers from the public key and signs packets; 2.8.1 lets channels switch to AES-CCM. This keeps Malla working through both and, from the same on-air traits, estimates every node's firmware.
What changes
/nodescolumn and the hover card. Traits → lower bound:public_key2.5+ ·relay_nodeon own packets 2.6+ ·is_unmessagable2.6.8+ ·CLIENT_BASE2.7.8+ · CRC32-derived id or XEdDSA signature 2.8+ · AEAD,PAGING_APP, soil-water telemetry 2.8.1+ · MapReport = exact version./api/firmware-distribution,/api/hardware-distribution, 5-minute cache).node_fingerprint(deltas flushed by the main loop once a minute) and backfills history once on first start (fingerprint_backfill_days, default 30, marker inmalla_meta). Newer columns are added withALTER TABLE.node_inforows stored asUNKNOWN_<n>while the old protobufs did not know the model are renamed at startup.get_node_detailsfor nodes without packets (sqlite3.Row.get);channel_indexwas always NULL.Review guide
fingerprint.py: pure rules + wire-format scanners (no DB).mqtt_capture.py: CCM decrypt, hooks, flush, startup rename.fingerprint_backfill.py: CLI and first-start run. Web:repositories.py,node_routes.py,api_routes.py, three templates.uv.lock: the dependency bump.CryptoEngine.cpp. No AEAD traffic exists yet, so CCM is covered by round-trip vectors only.Tests
60+ new unit/integration tests (CCM round trip and tag rejection, scanners, every tier, upsert and migration, capture hooks, backfill, hardware rename, routes and both distribution APIs). Full suite green: unit, integration, e2e.