From 11cb171e1ae92a547ea1cdbcf8e13b1ef5bcc115 Mon Sep 17 00:00:00 2001 From: Andrew Kozlik Date: Wed, 11 May 2022 10:46:51 +0200 Subject: [PATCH] fix(tools): Strip old header in firmware_hash.py. --- tools/firmware_hash.py | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/tools/firmware_hash.py b/tools/firmware_hash.py index 96fa288e1..b38b7131b 100755 --- a/tools/firmware_hash.py +++ b/tools/firmware_hash.py @@ -6,24 +6,42 @@ from hashlib import blake2s FILE_T1 = "legacy/firmware/trezor.bin" FILE_T2 = "core/build/firmware/firmware.bin" +T1_HEADER_MAGIC_OLD = b"TRZR" +T1_HEADER_OLD_SIZE = 256 +T2_HEADER_MAGIC_VENDOR = b"TRZV" + SIZE_T1 = (7 * 128 + 64) * 1024 SIZE_T2 = 13 * 128 * 1024 -for filename, size in ((FILE_T1, SIZE_T1), (FILE_T2, SIZE_T2)): +if len(sys.argv) > 2: + filenames = sys.argv[2:] +elif len(sys.argv) == 2: + filenames = (FILE_T1, FILE_T2) +else: + print(f"Usage: {sys.argv[0]} HEX_CHALLENGE [FILE]...") + print(f" HEX_CHALLENGE: a 0-32 byte challenge in hexadecimal") + exit(1) + + +for filename in filenames: try: data = open(filename, "rb").read() except FileNotFoundError: print(f"{filename} not found") continue - if len(data) > size: - raise ValueError(filename, "too big") - data = data + b"\xff" * (size - len(data)) - - if len(sys.argv) > 1: - challenge = bytes.fromhex(sys.argv[1]) - firmware_hash = blake2s(data, key=challenge).hexdigest() + offset = 0 + if data[:4] == T2_HEADER_MAGIC_VENDOR: + size = SIZE_T2 else: - firmware_hash = blake2s(data).hexdigest() + size = SIZE_T1 + if data[:4] == T1_HEADER_MAGIC_OLD: + offset = T1_HEADER_OLD_SIZE + + if len(data) - offset > size: + raise ValueError(filename, "too big") + data = data[offset:] + b"\xff" * (size - len(data) + offset) + challenge = bytes.fromhex(sys.argv[1]) + firmware_hash = blake2s(data, key=challenge).hexdigest() print(f"{filename}: {firmware_hash}")