#!/usr/bin/env python3 """Parse and verify DA14585 firmware image header (Dialog SUOTA/multi-image format). Image header layout (64 bytes): +0x00 u8[2] magic 0x70 0x51 ('pQ' LE word 0x5170) = IMAGE_VALID +0x02 u8[2] signature version/application id (here 0xAA 0x01) +0x04 u32 code_size size of code region (= file_size - 64) +0x08 u32 crc32 CRC over code region +0x0C 52B reserved 0xFF """ import struct, sys, zlib, binascii IMG = "/mnt/documents/Works/Eink/qianbian/app/firmware-PP_da14585_4.2_CH.img" def crc32_mpeg(data, init=0xFFFFFFFF, xorout=0, poly=0x04C11DB7): crc = init for b in data: crc ^= b << 24 for _ in range(8): crc = ((crc << 1) ^ poly) & 0xFFFFFFFF if (crc & 0x80000000) else (crc << 1) & 0xFFFFFFFF return crc ^ xorout def main(): data = open(IMG, "rb").read() print(f"file size: {len(data)} (0x{len(data):x})") magic = data[0:2] sig = data[2:4] code_size, crc_hdr = struct.unpack_from("