summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2022-01-31 17:26:47 +1100
committerDamien George <damien@micropython.org>2022-01-31 18:49:08 +1100
commit60e05ae84ec08c06e3f9d9051339811641479a94 (patch)
tree664dfd4efe2a13426eb9687407a1cc39ac69f3ff
parentca1914fb474dd7a2a6e94ba835cea45b0bcd742b (diff)
stm32/mboot: Compute and check CRC32 of dfu file in fwupdate.py.
Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--ports/stm32/mboot/fwupdate.py15
1 files changed, 13 insertions, 2 deletions
diff --git a/ports/stm32/mboot/fwupdate.py b/ports/stm32/mboot/fwupdate.py
index 8a366dae2..3b8dc51e1 100644
--- a/ports/stm32/mboot/fwupdate.py
+++ b/ports/stm32/mboot/fwupdate.py
@@ -27,6 +27,8 @@ def check_mem_contains(addr, buf):
def dfu_read(filename):
+ from binascii import crc32
+
f = open(filename, "rb")
hdr = f.read(3)
@@ -39,23 +41,28 @@ def dfu_read(filename):
print("Invalid firmware", filename)
return None
+ crc = 0
elems = []
hdr = f.read(11)
+ crc = crc32(hdr, crc)
sig, ver, size, num_targ = struct.unpack("<5sBIB", hdr)
file_offset = 11
for i in range(num_targ):
hdr = f.read(274)
+ crc = crc32(hdr, crc)
sig, alt, has_name, name, t_size, num_elem = struct.unpack("<6sBi255sII", hdr)
file_offset += 274
file_offset_t = file_offset
for j in range(num_elem):
hdr = f.read(8)
+ crc = crc32(hdr, crc)
addr, e_size = struct.unpack("<II", hdr)
data = f.read(e_size)
+ crc = crc32(data, crc)
elems.append((addr, data))
file_offset += 8 + e_size
@@ -68,8 +75,14 @@ def dfu_read(filename):
return None
hdr = f.read(16)
+ crc = crc32(hdr[:-4], crc)
hdr = struct.unpack("<HHHH3sBI", hdr)
+ crc = ~crc & 0xFFFFFFFF
+ if crc != hdr[-1]:
+ print("CRC failed", crc, hdr[-1])
+ return None
+
return elems
@@ -180,8 +193,6 @@ def update_mboot(filename):
if mboot_addr != 0x08000000:
assert 0
- # TODO: Validate firmware in a simple way
-
print("Found Mboot data with size %u." % len(mboot_fw))
chk = check_mem_contains(mboot_addr, mboot_fw)