tests/test_firmware.py
2.6 KB · 72 lines · python Raw
1 """Tests for FirmwareImage / FirmwareMetadata / SignedFirmware."""
2
3 from __future__ import annotations
4
5 from pqc_bootloader.firmware import (
6 FirmwareImage,
7 FirmwareMetadata,
8 SignedFirmware,
9 TargetDevice,
10 )
11
12
13 def test_hash_bytes_deterministic() -> None:
14 data = b"hello firmware"
15 assert FirmwareImage.hash_bytes(data) == FirmwareImage.hash_bytes(data)
16 assert len(FirmwareImage.hash_bytes(data)) == 64 # SHA3-256 hex
17
18
19 def test_image_hash_changes_with_content(sample_metadata: FirmwareMetadata) -> None:
20 a = FirmwareImage.from_bytes(sample_metadata, b"content-A")
21 b = FirmwareImage.from_bytes(sample_metadata, b"content-B")
22 assert a.image_hash != b.image_hash
23
24
25 def test_from_bytes_populates_fields(
26 sample_metadata: FirmwareMetadata, sample_firmware_bytes: bytes
27 ) -> None:
28 fw = FirmwareImage.from_bytes(sample_metadata, sample_firmware_bytes)
29 assert fw.image_size == len(sample_firmware_bytes)
30 assert fw.image_hash == FirmwareImage.hash_bytes(sample_firmware_bytes)
31 assert fw.image_bytes == sample_firmware_bytes
32 assert fw.metadata.name == sample_metadata.name
33
34
35 def test_signed_firmware_roundtrip(sample_firmware: FirmwareImage) -> None:
36 sf = SignedFirmware(
37 firmware=sample_firmware,
38 manufacturer_key_id="kid" + "0" * 61,
39 signer_did="did:pqaid:deadbeef",
40 algorithm="ML-DSA-65",
41 signature="ab" * 32,
42 public_key="cd" * 32,
43 signed_at="2026-04-20T00:00:00Z",
44 )
45
46 # with image
47 d_with = sf.to_dict(include_image=True)
48 assert "image_base64" in d_with["firmware"]
49 restored = SignedFirmware.from_dict(d_with)
50 assert restored.firmware.image_bytes == sample_firmware.image_bytes
51 assert restored.firmware.image_hash == sample_firmware.image_hash
52 assert restored.signer_did == sf.signer_did
53 assert restored.firmware.metadata.target == TargetDevice.AI_INFERENCE_APPLIANCE
54
55 # without image
56 d_without = sf.to_dict(include_image=False)
57 assert "image_base64" not in d_without["firmware"]
58 restored2 = SignedFirmware.from_dict(d_without)
59 assert restored2.firmware.image_bytes == b""
60 assert restored2.firmware.image_hash == sample_firmware.image_hash
61
62
63 def test_canonical_manifest_bytes_deterministic(sample_firmware: FirmwareImage) -> None:
64 a = sample_firmware.canonical_manifest_bytes()
65 b = sample_firmware.canonical_manifest_bytes()
66 assert a == b
67 # changing the image should change the manifest (via image_hash)
68 modified = FirmwareImage.from_bytes(
69 sample_firmware.metadata, sample_firmware.image_bytes + b"\x00"
70 )
71 assert modified.canonical_manifest_bytes() != a
72