Add CRC-16/X-25 transport-frame verification to SML decoder#15
Draft
Copilot wants to merge 1 commit into
Draft
Conversation
Agent-Logs-Url: https://github.com/jsphuebner/esp-egycounter/sessions/2f3e659e-c131-4d2c-b0ea-d4300da688c5 Co-authored-by: jsphuebner <3882041+jsphuebner@users.noreply.github.com>
Copilot created this pull request from a session on behalf of
jsphuebner
May 1, 2026 16:06
View session
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.
The SML decoder accepted any structurally plausible telegram without verifying its integrity. This adds CRC-16/X-25 checking at the transport layer, matching the algorithm used by sml2mqtt/smllib.
Changes
SML_CRC16_TABLE[256]— 256-entry lookup table (reflected poly 0x8408), identical tosmllib/crc/x25.pysmlCrc16(buf, len)— CRC-16/X-25 (init=0xFFFF, xorout=0xFFFF) over an arbitrary byte rangedecodeSml()updated:startPosat the start of the1B1B1B1B 01010101header1B1B1B1B 1A PP CRC_LO CRC_HI)buf[startPos .. endEscape+5](through the padding byte) and returnsfalseon mismatchThe CRC is stored little-endian in the end escape: