"""Kuenstliche ninstrip-OTA-Abbilder: Nutzdaten + 512-Byte-NINL-Anhaenger. Der Aufbau folgt ninstrip-firmware/tools/mkimage.py. Die Tests bauen sich ihre Abbilder selbst, statt echte Firmware-Dateien mitzuschleppen. Anders als bei ninlight liegen die Nutzdaten unverpackt vor: ein ESP32-Abbild ist nicht gzip-verpackt, die einkompilierte SSID steht als Zeichenkette drin. """ from __future__ import annotations import hashlib CONTENT_WITH_SSID = b"\x00boot\x00ninIOT\x00ninstrip\x00" CONTENT_WITHOUT_SSID = b"\x00boot\x00ninstrip\x00" def build_image( device_type: str = "ninstrip-k1y", version: str = "0.1.0-47-g71a57", *, payload: bytes = CONTENT_WITH_SSID, magic: bytes = b"NINL", fmt: int = 1, corrupt_hash: bool = False, ) -> bytes: trailer = bytearray(b"\xff" * 512) trailer[0:4] = magic trailer[4] = fmt trailer[5:21] = device_type.encode().ljust(16, b"\x00") trailer[21:37] = version.encode().ljust(16, b"\x00") trailer[37:69] = bytes(32) if corrupt_hash else hashlib.sha256(payload).digest() return payload + bytes(trailer)