From ac719e929dbf2bf138c957148237e1c408e8dacc Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Fri, 7 Aug 2026 16:17:38 -0400 Subject: [PATCH 1/4] Align LZMA behavior with Simplicity Commander --- pygbl/compression.py | 53 +++- tests/files/skyconnect_bootloader.out | Bin 0 -> 302964 bytes .../files/skyconnect_bootloader_commander.gbl | Bin 0 -> 11652 bytes .../files/skyconnect_bootloader_metadata.json | 1 + tests/test_commander_cli.py | 270 ++++++++++++++++++ tests/test_compression.py | 29 ++ 6 files changed, 347 insertions(+), 6 deletions(-) create mode 100755 tests/files/skyconnect_bootloader.out create mode 100644 tests/files/skyconnect_bootloader_commander.gbl create mode 100644 tests/files/skyconnect_bootloader_metadata.json create mode 100644 tests/test_commander_cli.py diff --git a/pygbl/compression.py b/pygbl/compression.py index a7300be..61da8e4 100644 --- a/pygbl/compression.py +++ b/pygbl/compression.py @@ -2,7 +2,7 @@ import lzma -from pygbl.types import MissingDependencyError +from pygbl.types import MissingDependencyError, ValidationError try: import lz4.block @@ -11,14 +11,14 @@ else: HAVE_LZ4 = True -# The Gecko bootloader's LZMA decoder is memory constrained. Its probability model needs -# `4 KiB + 1.5 KiB * (1 << (lc + lp))` of RAM and its dictionary buffer is statically -# sized, so images cannot use the LZMA defaults of lc=3, lp=0 and a large dictionary. -# `commander` emits lc=1, lp=1, pb=2 with an 8 KiB dictionary. LZMA_LC = 1 LZMA_LP = 1 LZMA_PB = 2 LZMA_DICT_SIZE = 8192 +LZMA_MAX_LC_PLUS_LP = 2 +LZMA_MAX_DICT_SIZE = 8192 +LZMA_NICE_LEN = 32 +LZMA_DEPTH = 32 LZMA_PROPS_SIZE = 5 LZMA_SIZE_FIELD_SIZE = 8 @@ -35,7 +35,21 @@ def lzma_filters( lp: int = LZMA_LP, pb: int = LZMA_PB, dict_size: int = LZMA_DICT_SIZE, + nice_len: int = LZMA_NICE_LEN, + depth: int = LZMA_DEPTH, ) -> list[dict[str, int]]: + # The device rejects an image it cannot allocate buffers for, so catch it here + # rather than at flash time. + if lc + lp > LZMA_MAX_LC_PLUS_LP: + raise ValueError( + f"lc + lp must be at most {LZMA_MAX_LC_PLUS_LP}, got {lc} + {lp}" + ) + + if dict_size > LZMA_MAX_DICT_SIZE: + raise ValueError( + f"dict_size must be at most {LZMA_MAX_DICT_SIZE}, got {dict_size}" + ) + return [ { "id": lzma.FILTER_LZMA1, @@ -43,10 +57,30 @@ def lzma_filters( "lp": lp, "pb": pb, "dict_size": dict_size, + "mode": lzma.MODE_NORMAL, + "mf": lzma.MF_BT4, + "nice_len": nice_len, + "depth": depth, } ] +def ends_with_end_marker(container: bytes) -> bool: + """Check that an `.lzma` container's stream terminates with an end marker.""" + # `eof` alone is not enough: the decompressor stops at the declared size and never + # looks for the marker. Declaring the size unknown again forces it to rely on one. + probe = ( + container[:LZMA_PROPS_SIZE] + + b"\xff" * LZMA_SIZE_FIELD_SIZE + + container[LZMA_HEADER_SIZE:] + ) + + decompressor = lzma.LZMADecompressor(format=lzma.FORMAT_ALONE) + decompressor.decompress(probe) + + return decompressor.eof + + def lzma_compress(data: bytes, **kwargs: int) -> bytes: """Compress into the `.lzma` container that the Gecko bootloader expects.""" compressed = lzma.compress( @@ -55,12 +89,19 @@ def lzma_compress(data: bytes, **kwargs: int) -> bytes: # Python writes an unknown-size marker into the 8 byte size field. The bootloader # skips the field entirely, but `commander` writes the real size, so we match it. - return ( + container = ( compressed[:LZMA_PROPS_SIZE] + len(data).to_bytes(LZMA_SIZE_FIELD_SIZE, "little") + compressed[LZMA_HEADER_SIZE:] ) + # The bootloader requires `LZMA_STATUS_FINISHED_WITH_MARK` and fails the update + # otherwise, after having already flashed past the end of the payload. + if not ends_with_end_marker(container): + raise ValidationError("LZMA stream does not end with an end marker") + + return container + def lzma_decompress(data: bytes) -> bytes: return lzma.decompress(data, format=lzma.FORMAT_ALONE) diff --git a/tests/files/skyconnect_bootloader.out b/tests/files/skyconnect_bootloader.out new file mode 100755 index 0000000000000000000000000000000000000000..e6df9c252444616905c9b539e289eea8a105d948 GIT binary patch literal 302964 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

Qk^bHCtEpL0>0%bSq$|&T8vKz%7 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 literal 0 HcmV?d00001 diff --git a/tests/files/skyconnect_bootloader_commander.gbl b/tests/files/skyconnect_bootloader_commander.gbl new file mode 100644 index 0000000000000000000000000000000000000000..1156bef7241e92971323c666fdb07e0aef5a4a67 GIT binary patch literal 11652 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 literal 0 HcmV?d00001 diff --git a/tests/files/skyconnect_bootloader_metadata.json b/tests/files/skyconnect_bootloader_metadata.json new file mode 100644 index 0000000..6fbe52c --- /dev/null +++ b/tests/files/skyconnect_bootloader_metadata.json @@ -0,0 +1 @@ +{"baudrate": 115200, "fw_type": "gecko-bootloader", "fw_variant": null, "gecko_bootloader_version": "3.2.0", "metadata_version": 2, "sdk_version": "2026.6.1"} \ No newline at end of file diff --git a/tests/test_commander_cli.py b/tests/test_commander_cli.py new file mode 100644 index 0000000..5926574 --- /dev/null +++ b/tests/test_commander_cli.py @@ -0,0 +1,270 @@ +"""Test against `commander`.""" + +from __future__ import annotations + +import functools +import pathlib +import shutil +import subprocess +import tempfile + +import pytest + +import pygbl +from pygbl import ( + GBL3Compression, + GBL3End, + GBL3Image, + GBL3ProgLZ4, + GBL3ProgLZMA, + read_encryption_key, +) +from pygbl.compression import ( + LZMA_HEADER_SIZE, + LZMA_MAX_DICT_SIZE, + LZMA_MAX_LC_PLUS_LP, + LZMA_PROPS_SIZE, + ends_with_end_marker, + lzma_compress, + lzma_decompress, +) + +FILES = pathlib.Path(__file__).parent / "files" +COMMANDER = shutil.which("commander") or "" + +# The two ELF segments of the ZWA-2 controller, our only committed LZMA reference +ZWA2 = "zwa2_controller" +SMALL_ADDRESS = 0x08006000 +LARGE_ADDRESS = 0x08006180 +COMMANDER_LZMA_LENGTHS = {SMALL_ADDRESS: 134, LARGE_ADDRESS: 147238} +OUR_LZMA_LENGTHS = {SMALL_ADDRESS: 134, LARGE_ADDRESS: 147237} + +IMAGES = sorted( + elf.name.removesuffix(".out") + for elf in FILES.glob("*.out") + if (FILES / f"{elf.name.removesuffix('.out')}_metadata.json").exists() +) + +if not COMMANDER: + pytest.skip("`commander` is not installed", allow_module_level=True) + +CASES = [(base, algorithm) for base in IMAGES for algorithm in (None, *GBL3Compression)] +STORED = [base for base in IMAGES if (FILES / f"{base}_commander.gbl").exists()] + + +def case_id(case: tuple[str, GBL3Compression | None]) -> str: + base, algorithm = case + + return f"{base}-{algorithm.value if algorithm else 'none'}" + + +def vendor_keys(base: str) -> tuple[pathlib.Path, pathlib.Path] | None: + """The encryption and signing keys for an image, if the corpus ships them.""" + prefix = base.split("_", maxsplit=1)[0] + encrypt = FILES / f"{prefix}_vendor_encrypt.key" + sign = FILES / f"{prefix}_vendor_sign.key" + + return (encrypt, sign) if encrypt.exists() and sign.exists() else None + + +def build_ours(base: str, algorithm: GBL3Compression | None) -> GBL3Image: + is_bootloader = "bootloader" in base + builder = ( + pygbl.build_bootloader_gbl3 if is_bootloader else pygbl.build_application_gbl3 + ) + + with (FILES / f"{base}.out").open("rb") as elf_file: + image = builder( + elf_file, metadata=(FILES / f"{base}_metadata.json").read_bytes() + ) + + return image if algorithm is None else image.compress(algorithm) + + +@functools.cache +def stored(base: str) -> GBL3Image: + """The committed `commander` output for an image, decrypted.""" + image = GBL3Image.from_bytes((FILES / f"{base}_commander.gbl").read_bytes()) + keys = vendor_keys(base) + + return ( + image + if keys is None + else image.decrypt(read_encryption_key(keys[0].read_text())) + ) + + +@functools.cache +def build(base: str, algorithm: GBL3Compression | None) -> tuple[GBL3Image, GBL3Image]: + """Build `base` with us and with `commander`, returning both decrypted.""" + keys = vendor_keys(base) + + with tempfile.TemporaryDirectory() as directory: + output = pathlib.Path(directory) / f"{base}.gbl" + + # fmt: off + command = [ + COMMANDER, + "gbl", "create", str(output), + "--bootloader" if "bootloader" in base else "--app", + str(FILES / f"{base}.out"), + "--metadata", str(FILES / f"{base}_metadata.json"), + ] + # fmt: on + + if algorithm is not None: + command += ["--compress", algorithm.value] + + if keys is not None: + command += ["--encrypt", str(keys[0]), "--sign", str(keys[1])] + + subprocess.run(command, check=True, capture_output=True) + theirs = GBL3Image.from_bytes(output.read_bytes()) + + if keys is not None: + theirs = theirs.decrypt(read_encryption_key(keys[0].read_text())) + + return build_ours(base, algorithm), theirs + + +def lzma_tag(image: GBL3Image, address: int) -> GBL3ProgLZMA: + return next(t for t in image.get_tags(GBL3ProgLZMA) if t.address == address) + + +# Against the committed reference images + + +@pytest.mark.parametrize("base", STORED) +def test_stored_reference_is_reproduced(base: str) -> None: + """Every committed reference is uncompressed but ZWA-2, and those match exactly.""" + reference = stored(base) + + if any(isinstance(t, (GBL3ProgLZMA, GBL3ProgLZ4)) for t in reference.tags): + pytest.skip("reference is compressed") + + assert build_ours(base, None).tags == reference.tags + + +def test_stored_lzma_props_match() -> None: + """The props bytes are what the device reads to size its decoder buffers.""" + for tag in stored(ZWA2).get_tags(GBL3ProgLZMA): + ours = lzma_compress(lzma_decompress(tag.data)) + + assert ( + ours[:LZMA_PROPS_SIZE] + == tag.data[:LZMA_PROPS_SIZE] + == bytes.fromhex("6400200000") + ) + assert ( + ours[LZMA_PROPS_SIZE:LZMA_HEADER_SIZE] + == tag.data[LZMA_PROPS_SIZE:LZMA_HEADER_SIZE] + ) + + +def test_stored_lzma_lengths_are_stable() -> None: + """Pins the encoder parameters: any change to them moves these lengths.""" + tags = stored(ZWA2).get_tags(GBL3ProgLZMA) + + assert {t.address: len(t.data) for t in tags} == COMMANDER_LZMA_LENGTHS + assert { + t.address: len(lzma_compress(lzma_decompress(t.data))) for t in tags + } == OUR_LZMA_LENGTHS + + +def test_stored_small_lzma_tag_is_byte_identical() -> None: + tag = lzma_tag(stored(ZWA2), SMALL_ADDRESS) + + assert lzma_compress(lzma_decompress(tag.data)) == tag.data + + +def test_stored_large_lzma_tag_differs_only_in_encoder_vintage() -> None: + """`commander` links an LZMA SDK 16.04 era encoder that liblzma cannot reproduce.""" + tag = lzma_tag(stored(ZWA2), LARGE_ADDRESS) + ours = lzma_compress(lzma_decompress(tag.data)) + + # The two streams share a 4016 byte prefix, covering 6206 bytes of payload, and are + # unrelated after that. The single byte is where two entirely different encodings + # happen to land for this payload, not a localised difference. + assert ours != tag.data + assert len(ours) - len(tag.data) == -1 + + +@pytest.mark.parametrize("path", sorted(FILES.glob("*.gbl")), ids=lambda p: p.name) +def test_real_images_respect_the_bootloader_limits(path: pathlib.Path) -> None: + """Every LZMA tag in the wild fits the decoder's 10 KiB probs and 8 KiB dictionary.""" + image = pygbl.parse_firmware_image(path.read_bytes()) + + if not isinstance(image, GBL3Image) or not image.get_tags(GBL3ProgLZMA): + pytest.skip("no LZMA tags") + + for tag in image.get_tags(GBL3ProgLZMA): + props = tag.data[0] + + assert props % 9 + (props // 9) % 5 <= LZMA_MAX_LC_PLUS_LP + assert ( + int.from_bytes(tag.data[1:LZMA_PROPS_SIZE], "little") <= LZMA_MAX_DICT_SIZE + ) + + +# Against a live `commander` + + +@pytest.mark.parametrize("case", CASES, ids=case_id) +def test_images_without_compressed_tags_are_byte_identical( + case: tuple[str, GBL3Compression | None], +) -> None: + """Uncompressed images and bootloaders reproduce `commander` exactly.""" + ours, theirs = build(*case) + + if any(isinstance(t, (GBL3ProgLZMA, GBL3ProgLZ4)) for t in ours.tags): + pytest.skip("image has compressed tags") + + assert ours.serialize(block_size=4) == theirs.serialize() + + +@pytest.mark.parametrize("case", CASES, ids=case_id) +def test_only_a_compressed_payload_and_its_crc_may_differ( + case: tuple[str, GBL3Compression | None], +) -> None: + """Everything else `commander` writes is reproduced exactly.""" + ours, theirs = build(*case) + + differing = [type(a) for a, b in zip(ours.tags, theirs.tags, strict=True) if a != b] + + assert differing in ( + [], + [GBL3ProgLZMA, GBL3End], + [GBL3ProgLZ4, GBL3End], + ) + + +@pytest.mark.parametrize("case", CASES, ids=case_id) +def test_decompressing_both_gives_the_same_image( + case: tuple[str, GBL3Compression | None], +) -> None: + """What reaches flash is identical even where the compressed bytes are not.""" + ours, theirs = build(*case) + + # Compared by tag, since `commander` pads the file itself and we do not + assert ours.decompress().tags == theirs.decompress().tags + + +@pytest.mark.parametrize("case", CASES, ids=case_id) +def test_lzma_props_match(case: tuple[str, GBL3Compression | None]) -> None: + """The props bytes are what the device reads to size its decoder buffers.""" + ours, theirs = build(*case) + + assert [t.data[:LZMA_PROPS_SIZE] for t in ours.get_tags(GBL3ProgLZMA)] == [ + t.data[:LZMA_PROPS_SIZE] for t in theirs.get_tags(GBL3ProgLZMA) + ] + + +@pytest.mark.parametrize("case", CASES, ids=case_id) +def test_both_encoders_write_lzma_end_markers( + case: tuple[str, GBL3Compression | None], +) -> None: + """The bootloader rejects a stream that does not finish with one.""" + ours, theirs = build(*case) + + for image in (ours, theirs): + assert all(ends_with_end_marker(t.data) for t in image.get_tags(GBL3ProgLZMA)) diff --git a/tests/test_compression.py b/tests/test_compression.py index d286d6a..b6c58a3 100644 --- a/tests/test_compression.py +++ b/tests/test_compression.py @@ -20,6 +20,7 @@ LZMA_DICT_SIZE, LZMA_HEADER_SIZE, LZMA_PROPS_SIZE, + ends_with_end_marker, lz4_compress, lz4_decompress, lzma_compress, @@ -68,6 +69,34 @@ def test_lzma_records_the_uncompressed_size() -> None: assert size == len(PAYLOAD) +@pytest.mark.parametrize("size", [0, 1, 15, 368, 1384, 20000]) +def test_lzma_writes_an_end_marker(size: int) -> None: + """The bootloader fails the update without one, after flashing past the payload.""" + data = bytes((i * 7) % 251 for i in range(size)) + + assert ends_with_end_marker(lzma_compress(data)) + + +def test_end_marker_check_rejects_a_truncated_stream() -> None: + compressed = lzma_compress(PAYLOAD) + + assert not ends_with_end_marker(compressed[:-1]) + + +@pytest.mark.parametrize(("lc", "lp"), [(3, 0), (1, 2), (2, 1), (0, 3)]) +def test_lzma_rejects_an_oversized_probability_model(lc: int, lp: int) -> None: + """The decoder has 10 KiB for the model, which caps `lc + lp` at 2.""" + with pytest.raises(ValueError, match="lc \\+ lp"): + lzma_compress(PAYLOAD, lc=lc, lp=lp) + + +@pytest.mark.parametrize("dict_size", [16384, 65536, 1 << 20]) +def test_lzma_rejects_an_oversized_dictionary(dict_size: int) -> None: + """The decoder has a statically sized 8 KiB dictionary buffer.""" + with pytest.raises(ValueError, match="dict_size"): + lzma_compress(PAYLOAD, dict_size=dict_size) + + @pytest.mark.parametrize("size", [1, 15, 368, 1384, 20000]) def test_lzma_roundtrip(size: int) -> None: data = bytes((i * 7) % 251 for i in range(size)) From ad8a58c0b7dae9fe8e8d8f7398d02c7190bab9f6 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Fri, 7 Aug 2026 16:19:59 -0400 Subject: [PATCH 2/4] Drop `trailing_data` and instead return it in `deserialize` --- pygbl/__init__.py | 2 ++ pygbl/ebl.py | 30 +++++++++++----------- pygbl/gbl3.py | 47 ++++++++++++++++++----------------- pygbl/gbl4.py | 13 +++++++--- tests/test_corpus.py | 19 +++++++++----- tests/test_ebl.py | 32 ++++++++++++++---------- tests/test_gbl.py | 59 +++++++++++++++++++++++++++++--------------- 7 files changed, 121 insertions(+), 81 deletions(-) diff --git a/pygbl/__init__.py b/pygbl/__init__.py index b04486c..5176535 100644 --- a/pygbl/__init__.py +++ b/pygbl/__init__.py @@ -30,6 +30,7 @@ read_loadable_segments, ) from pygbl.gbl3 import ( + GBL3_BLOCK_SIZE, GBL3_MAGIC, BootloaderVersion, GBL3ApplicationInfo, @@ -122,6 +123,7 @@ def parse_firmware_image(data: bytes, *, validate: bool = True) -> FirmwareImage __all__ = [ "EBL_BLOCK_SIZE", "EBL_MAGIC", + "GBL3_BLOCK_SIZE", "GBL3_MAGIC", "VALID_CRC32", "BootloaderVersion", diff --git a/pygbl/ebl.py b/pygbl/ebl.py index ec3f32e..f28734a 100644 --- a/pygbl/ebl.py +++ b/pygbl/ebl.py @@ -219,14 +219,9 @@ def serialize_tag(tag: EBLTagBase) -> bytes: class EBLImage: tags: list[EBLTagBase] - # Bytes following the end tag: the padding that aligns the image to a 64 byte - # boundary, and for some vendors an entire second firmware payload appended after - # it. Outside of the CRC and preserved verbatim so that images round-trip - # byte-for-byte. - trailing_data: bytes = b"" - @classmethod - def from_bytes(cls, data: bytes, *, validate: bool = True) -> EBLImage: + def deserialize(cls, data: bytes, *, validate: bool = True) -> tuple[Self, bytes]: + """Parse an image, returning it and whatever followed its end tag.""" data = bytes(data) tags: list[EBLTagBase] = [] offset = 0 @@ -253,21 +248,26 @@ def from_bytes(cls, data: bytes, *, validate: bool = True) -> EBLImage: if tag_id == EBLTagId.END: break - image = cls(tags=tags, trailing_data=data[offset:]) + image = cls(tags=tags) if validate: image.validate() - return image + return image, data[offset:] + + @classmethod + def from_bytes(cls, data: bytes, *, validate: bool = True) -> Self: + """Parse an image, discarding anything that followed its end tag.""" + return cls.deserialize(data, validate=validate)[0] def serialize_tags(self) -> bytes: """Serialize only the tag region, which is what the CRC covers.""" return b"".join(serialize_tag(t) for t in self.tags) - def serialize(self, *, block_size: int = 1, padding: bytes = b"\xff") -> bytes: - return pad_to_multiple( - self.serialize_tags() + self.trailing_data, block_size, padding - ) + def serialize( + self, *, block_size: int = EBL_BLOCK_SIZE, padding: bytes = b"\xff" + ) -> bytes: + return pad_to_multiple(self.serialize_tags(), block_size, padding) def validate(self) -> None: if not self.tags: @@ -308,9 +308,7 @@ def regenerate_crc(self) -> EBLImage: placeholder = type(self)(tags=[*tags, EBLEnd(crc=0)]) crc = zlib.crc32(placeholder.serialize_tags()[:-4]) & 0xFFFFFFFF - return type(self)( - tags=[*tags, EBLEnd(crc=crc)], trailing_data=self.trailing_data - ) + return type(self)(tags=[*tags, EBLEnd(crc=crc)]) def _parse_tag(tag_id: int, payload: bytes) -> EBLTagBase: diff --git a/pygbl/gbl3.py b/pygbl/gbl3.py index fc5ccd6..1830974 100644 --- a/pygbl/gbl3.py +++ b/pygbl/gbl3.py @@ -29,6 +29,9 @@ GBL3_MAGIC = b"\xeb\x17\xa6\x03" +# `commander` pads its output up to a word boundary with 0xFF +GBL3_BLOCK_SIZE = 4 + class GBL3TagId(enum.IntEnum): """GBL tag identifiers, as decoded from the little-endian 32-bit value on the wire.""" @@ -678,30 +681,36 @@ def parse_tag_stream( class GBL3Image: tags: list[GBL3TagBase] - # Bytes following the end tag. Real-world images pad with `0xFF` or `0x00`, and some - # vendors append an entire second firmware payload. It is outside of the CRC and is - # preserved verbatim so that images round-trip byte-for-byte. - trailing_data: bytes = b"" - @classmethod - def from_bytes(cls, data: bytes, *, validate: bool = True) -> GBL3Image: + def deserialize(cls, data: bytes, *, validate: bool = True) -> tuple[Self, bytes]: + """Parse an image, returning it and whatever followed its end tag. + + Real-world files carry `commander`'s word padding, vendor junk or even a second + firmware payload after the end tag. None of it is covered by the CRC, so what to + do with it is the caller's decision. + """ data = bytes(data) tags, offset = parse_tag_stream(data, stop_at_end=True) - image = cls(tags=tags, trailing_data=data[offset:]) + image = cls(tags=tags) if validate: image.validate() - return image + return image, data[offset:] + + @classmethod + def from_bytes(cls, data: bytes, *, validate: bool = True) -> Self: + """Parse an image, discarding anything that followed its end tag.""" + return cls.deserialize(data, validate=validate)[0] def serialize_tags(self) -> bytes: """Serialize only the tag region, which is what the CRC covers.""" return b"".join(serialize_tag(t) for t in self.tags) - def serialize(self, *, block_size: int = 1, padding: bytes = b"\xff") -> bytes: - return pad_to_multiple( - self.serialize_tags() + self.trailing_data, block_size, padding - ) + def serialize( + self, *, block_size: int = GBL3_BLOCK_SIZE, padding: bytes = b"\xff" + ) -> bytes: + return pad_to_multiple(self.serialize_tags(), block_size, padding) def validate(self) -> None: if not self.tags: @@ -748,9 +757,7 @@ def regenerate_crc(self) -> GBL3Image: placeholder = type(self)(tags=[*tags, GBL3End(crc=0)]) crc = zlib.crc32(placeholder.serialize_tags()[:-4]) & 0xFFFFFFFF - return type(self)( - tags=[*tags, GBL3End(crc=crc)], trailing_data=self.trailing_data - ) + return type(self)(tags=[*tags, GBL3End(crc=crc)]) def signing_digest(self) -> bytes: """The SHA-256 digest an ECDSA signature covers. @@ -783,9 +790,7 @@ def sign(self, private_key: ec.EllipticCurvePrivateKey) -> GBL3Image: unsigned = type(self)(tags=tags) r, s = sign_digest(private_key, unsigned.signing_digest()) - return type(self)( - tags=[*tags, GBL3Signature(r=r, s=s)], trailing_data=self.trailing_data - ).regenerate_crc() + return type(self)(tags=[*tags, GBL3Signature(r=r, s=s)]).regenerate_crc() def verify_signature(self, public_key: ec.EllipticCurvePublicKey) -> bool: signature = self.find_first_tag(GBL3Signature) @@ -836,7 +841,6 @@ def encrypt(self, key: bytes, *, nonce: bytes | None = None) -> GBL3Image: GBL3EncryptionInitAesCcm(msg_len=len(ciphertext), nonce=nonce), *encrypted, ], - trailing_data=self.trailing_data, ).regenerate_crc() def decrypt(self, key: bytes) -> GBL3Image: @@ -863,7 +867,6 @@ def decrypt(self, key: bytes) -> GBL3Image: ), *tags, ], - trailing_data=self.trailing_data, ).regenerate_crc() def compress(self, algorithm: GBL3Compression) -> GBL3Image: @@ -877,7 +880,7 @@ def compress(self, algorithm: GBL3Compression) -> GBL3Image: else: tags.append(tag) - return type(self)(tags=tags, trailing_data=self.trailing_data).regenerate_crc() + return type(self)(tags=tags).regenerate_crc() def decompress(self) -> GBL3Image: """Return a copy with every compressed program data tag expanded.""" @@ -895,7 +898,7 @@ def decompress(self) -> GBL3Image: else: tags.append(tag) - return type(self)(tags=tags, trailing_data=self.trailing_data).regenerate_crc() + return type(self)(tags=tags).regenerate_crc() def is_combined_bootloader_app(self) -> bool: app_info = self.find_first_tag(GBL3ApplicationInfo) diff --git a/pygbl/gbl4.py b/pygbl/gbl4.py index 345b255..1ce15aa 100644 --- a/pygbl/gbl4.py +++ b/pygbl/gbl4.py @@ -506,10 +506,10 @@ class GBL4Image: """A GBLv4 file: one root tag, plus anything following it.""" root: GBL4Root - trailing_data: bytes = b"" @classmethod - def from_bytes(cls, data: bytes) -> GBL4Image: + def deserialize(cls, data: bytes) -> tuple[Self, bytes]: + """Parse an image, returning it and whatever followed the root tag.""" data = bytes(data) if not data.startswith(GBL4_MAGIC): @@ -524,10 +524,15 @@ def from_bytes(cls, data: bytes) -> GBL4Image: f" got {len(data) - 8}" ) - return cls(root=GBL4Root.from_payload(data[8:end]), trailing_data=data[end:]) + return cls(root=GBL4Root.from_payload(data[8:end])), data[end:] + + @classmethod + def from_bytes(cls, data: bytes) -> Self: + """Parse an image, discarding anything that followed the root tag.""" + return cls.deserialize(data)[0] def serialize(self) -> bytes: - return serialize_tag(self.root) + self.trailing_data + return serialize_tag(self.root) def get_tags(self, tag_type: type[T]) -> list[T]: """Every tag of a type, at any depth.""" diff --git a/tests/test_corpus.py b/tests/test_corpus.py index f4fc3a7..0343727 100644 --- a/tests/test_corpus.py +++ b/tests/test_corpus.py @@ -27,10 +27,14 @@ def image_id(path: pathlib.Path) -> str: @pytest.mark.parametrize("path", IMAGES, ids=image_id) def test_roundtrip_exact(path: pathlib.Path) -> None: + """Tags plus whatever followed them reproduce the file byte-for-byte.""" data = path.read_bytes() - image = parse_firmware_image(data) + parsed = parse_firmware_image(data) + assert isinstance(parsed, (GBL3Image, EBLImage)) + + image, trailing = type(parsed).deserialize(data) - assert image.serialize() == data + assert image.serialize(block_size=1) + trailing == data @pytest.mark.parametrize("path", IMAGES, ids=image_id) @@ -59,18 +63,21 @@ def test_regenerate_crc_is_stable(path: pathlib.Path) -> None: image = parse_firmware_image(data) assert isinstance(image, (GBL3Image, EBLImage)) + image, trailing = type(image).deserialize(data) + assert image.regenerate_crc() == image - assert image.regenerate_crc().serialize() == data + assert image.regenerate_crc().serialize(block_size=1) + trailing == data @pytest.mark.parametrize("path", IMAGES, ids=image_id) -def test_block_padding_preserves_trailing_data(path: pathlib.Path) -> None: +def test_block_padding_extends_the_tag_region(path: pathlib.Path) -> None: data = path.read_bytes() image = parse_firmware_image(data) assert isinstance(image, (GBL3Image, EBLImage)) + unpadded = image.serialize(block_size=1) padded = image.serialize(block_size=128) - assert padded.startswith(data) + assert padded.startswith(unpadded) assert len(padded) % 128 == 0 - assert padded[len(data) :].strip(b"\xff") == b"" + assert padded[len(unpadded) :].strip(b"\xff") == b"" diff --git a/tests/test_ebl.py b/tests/test_ebl.py index 7b85549..7fc8937 100644 --- a/tests/test_ebl.py +++ b/tests/test_ebl.py @@ -30,8 +30,8 @@ ) -def build(*tags: EBLTagBase, trailing_data: bytes = b"") -> EBLImage: - return EBLImage(tags=[HEADER, *tags], trailing_data=trailing_data).regenerate_crc() +def build(*tags: EBLTagBase) -> EBLImage: + return EBLImage(tags=[HEADER, *tags]).regenerate_crc() def test_build_and_reparse() -> None: @@ -72,7 +72,8 @@ def test_header_fields_are_big_endian() -> None: def test_end_tag_crc_is_little_endian() -> None: """Every other EBL field is big-endian, but the end tag's CRC is not.""" image = build(EBLEraseProgram(address=0, data=b"\x00" * 8)) - data = image.serialize() + # Unpadded, so the last bytes are the CRC itself rather than block padding + data = image.serialize(block_size=1) crc = image.get_first_tag(EBLEnd).crc assert data[-4:] == crc.to_bytes(4, "little") @@ -104,23 +105,25 @@ def test_program_and_eraseprogram_are_distinct_tags() -> None: @pytest.mark.parametrize( "trailing", [b"", b"\xff" * 20, b"\x00" * 8, b"vendor payload"] ) -def test_trailing_data_roundtrips(trailing: bytes) -> None: - image = build(EBLEraseProgram(address=0, data=b"\x01"), trailing_data=trailing) - data = image.serialize() +def test_deserialize_hands_back_trailing_data(trailing: bytes) -> None: + image = build(EBLEraseProgram(address=0, data=b"\x01")) + data = image.serialize(block_size=1) + trailing - assert data.endswith(trailing) - assert EBLImage.from_bytes(data) == image - assert EBLImage.from_bytes(data).trailing_data == trailing + parsed, rest = EBLImage.deserialize(data) + + assert parsed == image + assert rest == trailing + assert parsed.serialize(block_size=1) + rest == data def test_unaligned_image_is_accepted() -> None: """Real images append vendor payloads that break 64 byte alignment.""" - image = build(EBLEraseProgram(address=0, data=b"\x01"), trailing_data=b"\xa5" * 3) - data = image.serialize() + image = build(EBLEraseProgram(address=0, data=b"\x01")) + data = image.serialize(block_size=1) + b"\xa5" * 3 assert len(data) % EBL_BLOCK_SIZE != 0 - EBLImage.from_bytes(data).validate() + EBLImage.deserialize(data)[0].validate() def test_block_padding_to_ebl_alignment() -> None: @@ -141,7 +144,10 @@ def test_unknown_tag_is_preserved() -> None: def test_bad_crc_rejected() -> None: - data = bytearray(build(EBLEraseProgram(address=0, data=b"\x01")).serialize()) + # Unpadded, so the last byte is the CRC itself rather than block padding + data = bytearray( + build(EBLEraseProgram(address=0, data=b"\x01")).serialize(block_size=1) + ) data[-1] ^= 0xFF with pytest.raises(ValidationError, match="CRC-32 is invalid"): diff --git a/tests/test_gbl.py b/tests/test_gbl.py index cc1a001..5e502d7 100644 --- a/tests/test_gbl.py +++ b/tests/test_gbl.py @@ -5,6 +5,7 @@ import pytest from pygbl import ( + GBL3_BLOCK_SIZE, VALID_CRC32, BootloaderVersion, GBL3ApplicationInfo, @@ -29,13 +30,8 @@ PRODUCT_ID = bytes(range(16)) -def build( - *tags: GBL3TagBase, trailing_data: bytes = b"", type: GBL3Type = GBL3Type.NONE -) -> GBL3Image: - return GBL3Image( - tags=[GBL3Header(version=3, type=type), *tags], - trailing_data=trailing_data, - ).regenerate_crc() +def build(*tags: GBL3TagBase, type: GBL3Type = GBL3Type.NONE) -> GBL3Image: + return GBL3Image(tags=[GBL3Header(version=3, type=type), *tags]).regenerate_crc() def app_info(app_type: GBL3ApplicationType) -> GBL3ApplicationInfo: @@ -127,37 +123,60 @@ def test_unknown_header_flags_are_preserved() -> None: @pytest.mark.parametrize( - "trailing", [b"", b"\xff", b"\xff\xff\xff", b"\x00\x00", b"vendor payload"] + "trailing", [b"", b"\xff", b"\x00\x00", b"vendor payload", b"\xff" * 64] ) -def test_trailing_data_roundtrips(trailing: bytes) -> None: - image = build(GBL3Metadata(metadata=b"{}"), trailing_data=trailing) - data = image.serialize() +def test_deserialize_hands_back_trailing_data(trailing: bytes) -> None: + """Anything after the end tag is the caller's to keep or drop.""" + image = build(GBL3Metadata(metadata=b"{}")) + data = image.serialize(block_size=1) + trailing + + parsed, rest = GBL3Image.deserialize(data) + + assert parsed == image + assert rest == trailing + assert parsed.serialize(block_size=1) + rest == data + + +def test_from_bytes_discards_trailing_data() -> None: + image = build(GBL3Metadata(metadata=b"{}")) + data = image.serialize(block_size=1) + b"vendor payload" - assert data.endswith(trailing) assert GBL3Image.from_bytes(data) == image - assert GBL3Image.from_bytes(data).trailing_data == trailing + + +def test_serialize_pads_to_a_word_boundary() -> None: + """`commander` does this, and nothing downstream needs the padding back.""" + data = build(GBL3Metadata(metadata=b"{}")).serialize() + _, rest = GBL3Image.deserialize(data) + + assert len(data) % GBL3_BLOCK_SIZE == 0 + assert set(rest) <= {0xFF} + assert len(rest) < GBL3_BLOCK_SIZE def test_trailing_data_is_outside_the_crc() -> None: - tags = [GBL3Header(version=3, type=GBL3Type.NONE), GBL3Metadata(metadata=b"{}")] - without = GBL3Image(tags=tags).regenerate_crc() - with_trailing = GBL3Image(tags=tags, trailing_data=b"\xff" * 64).regenerate_crc() + image = build(GBL3Metadata(metadata=b"{}")) + data = image.serialize(block_size=1) + + parsed, rest = GBL3Image.deserialize(data + b"\xee" * 64) - assert without.get_first_tag(GBL3End) == with_trailing.get_first_tag(GBL3End) - with_trailing.validate() + assert rest == b"\xee" * 64 + assert parsed.get_first_tag(GBL3End) == image.get_first_tag(GBL3End) + parsed.validate() def test_block_size_padding() -> None: image = build(GBL3EraseProg(address=0, data=b"\x00" * 3)) assert len(image.serialize(block_size=128)) % 128 == 0 - assert image.serialize(block_size=128).startswith(image.serialize()) + assert image.serialize(block_size=128).startswith(image.serialize(block_size=1)) assert image.serialize(block_size=128).endswith(b"\xff") assert image.serialize(block_size=128, padding=b"\x00").endswith(b"\x00") def test_bad_crc_rejected() -> None: - data = bytearray(build(GBL3Metadata(metadata=b"{}")).serialize()) + # Unpadded, so the last byte is the CRC itself rather than word padding + data = bytearray(build(GBL3Metadata(metadata=b"{}")).serialize(block_size=1)) data[-1] ^= 0xFF with pytest.raises(ValidationError, match="CRC-32 is invalid"): From 241b0ad7faec8e320eec6d77d3f7502495d326e7 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Fri, 7 Aug 2026 16:46:33 -0400 Subject: [PATCH 3/4] Add Simplicity Commander to CI --- .github/workflows/ci.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eac9105..a98827b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -130,6 +130,22 @@ jobs: - name: Set up uv run: | curl -LsSf https://astral.sh/uv/install.sh | sh + - name: Cache Simplicity Commander + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 + with: + path: ~/commander + key: 1-${{ runner.os }}-commander-1.24.1 + - name: Install Simplicity Commander + run: | + sudo apt-get update + sudo apt-get install -y --no-install-recommends libgl1 libglib2.0-0t64 + if [ ! -x "$HOME/commander/commander" ]; then + curl -sSfL -o /tmp/commander.tar.bz \ + https://updates.silabs.com/studio/v6/updates/update_site/archives/commander/1.24.1/Commander_linux_x86_64_1v24p1b1980.tar.bz + echo "3ba24eeaeb560e9db306a4d070e2bbe40b456701b4b87c53643a93ab1101b2c4 /tmp/commander.tar.bz" | sha256sum -c + tar -xjf /tmp/commander.tar.bz -C "$HOME" + fi + echo "$HOME/commander" >> "$GITHUB_PATH" - name: Register Python problem matcher run: | echo "::add-matcher::.github/workflows/matchers/python.json" From 2cbba44131118996dbf63b4c6fa3bb074f02179e Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Fri, 7 Aug 2026 17:11:06 -0400 Subject: [PATCH 4/4] Clean up README --- README.md | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 03f5bbd..0830ae2 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,8 @@ A parser for the EBL and GBL (v3 and v4) firmware image formats used by the [Silicon Labs Gecko bootloader](https://www.silabs.com/documents/public/user-guides/ug489-gecko-bootloader-user-guide-gsdk-4.pdf). -Images are parsed into structured tags, and round-trip byte-for-byte: anything the -library reads it can write back unchanged, including the trailing data that some vendors -append after the end tag. +Images are parsed into structured tags and round-trip byte-for-byte, with anything +following the end tag handed back separately rather than folded into the image. ## Installation @@ -41,8 +40,15 @@ for tag in image.tags: print(image.get_first_tag(GBL3ApplicationInfo).version) print(image.get_metadata()) # opaque bytes, the schema is vendor defined +``` + +`serialize` pads up to a word boundary, as `commander` does. `parse_firmware_image` +discards anything after the end tag; `deserialize` hands it back: + +```python +image, trailing = GBL3Image.deserialize(data) -assert image.serialize() == data +assert image.serialize(block_size=1) + trailing == data ``` Modify an image. Tags are frozen dataclasses, so `dataclasses.replace` works, and @@ -73,9 +79,12 @@ private_key = load_pem_private_key( key = bytes.fromhex("7F8FE53979B31BC556FCB131AFF42414") sealed = image.compress(GBL3Compression.LZMA).encrypt(key).sign(private_key) -pathlib.Path("signed.gbl").write_bytes(sealed.serialize(block_size=4)) +pathlib.Path("signed.gbl").write_bytes(sealed.serialize()) ``` +The bootloader decompresses into fixed buffers, so `compress` uses the only LZMA +parameters it can accept. Overriding them past what it can allocate raises `ValueError`. + And unwrap it again: ```python @@ -100,21 +109,18 @@ with open("bootloader.out", "rb") as f: bootloader = build_bootloader_gbl3(f) ``` -Both reproduce `commander gbl create` byte-for-byte. Bootloader payloads carry a CRC32 -of themselves, which `build_bootloader_gbl3` appends for you. - ## GBLv4 Series 3 parts use GBLv4, a different format that nests tags inside a signed manifest -and can bundle several updates in one file. `parse_firmware_image` recognizes it by its -magic and returns a `GBL4Image`, which round-trips byte-for-byte like the rest: +and can bundle several updates in one file. ```python from pygbl import GBL4Image, GBL4MemorySectionInfo, GBL4UpdateMemorySection -image = parse_firmware_image(pathlib.Path("light-simg301.gbl4").read_bytes()) -assert isinstance(image, GBL4Image) -assert image.serialize() == data +data = pathlib.Path("light-simg301.gbl4").read_bytes() +image, trailing = GBL4Image.deserialize(data) + +assert image.serialize() + trailing == data # `get_tags` searches the whole tree, at any depth for update in image.get_tags(GBL4UpdateMemorySection):