diff --git a/gcksum.py b/gcksum.py index f25d97c..efad1cd 100644 --- a/gcksum.py +++ b/gcksum.py @@ -1,39 +1,31 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from binascii import hexlify -from struct import unpack +from grmn import ChkSum import sys FILE = sys.argv[1] +BLOCKSIZE = 4 * 1024 -print("Opening {}".format(FILE)) +print("Reading {} ".format(FILE), end="") -csum_pre = 0 -csum = 0 -last_byte = 0xff +csum = ChkSum() with open(FILE, "rb") as f: while True: - block = f.read(1024) - for c in block: - csum_pre = csum - csum += c - csum &= 0xff - last_byte = c - if len(block) < 1024: - print("End reached.") + block = f.read(BLOCKSIZE) + csum.add(block) + print(".", end="", flush=True) + if len(block) < BLOCKSIZE: + print(" done.") break + f.close() -print("Sum of all bytes: {:02x}".format(csum)) -if csum == 0: - print("CHECKSUM VALID.") +print("Sum of all bytes: {:02x}".format(csum.get_sum())) +print("Last byte: {:02x}".format(csum.get_last_byte())) +if csum.is_valid(): + print("☑ CHECKSUM VALID.") else: - print("CHECKSUM INVALID!!! (Or GCD or other type.)") - -#print("Sum without last: {:02x}".format(csum_pre)) - -expected_cksum = ( 0x100 - csum_pre ) & 0xff - -print("Expected last byte: {:02x}".format(expected_cksum)) -print("Actual last byte: {:02x}".format(last_byte)) + print("☒ CHECKSUM INVALID!!! (Or GCD or other type.)") + expected_cksum = csum.get_expected() + print("Expected last byte: {:02x}".format(expected_cksum)) diff --git a/grmn/__init__.py b/grmn/__init__.py new file mode 100644 index 0000000..bd62d33 --- /dev/null +++ b/grmn/__init__.py @@ -0,0 +1,4 @@ +"""Library for firmware reading/writing.""" + +#from .gcd import * +from .chksum import * diff --git a/grmn/chksum.py b/grmn/chksum.py new file mode 100644 index 0000000..db1c468 --- /dev/null +++ b/grmn/chksum.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +class ChkSum: + + def __init__(self): + self.chksum = 0 + self.chksum_without_last = 0 + self.last_byte = 0xff + + def add(self, data): + for c in data[:-1]: + self.chksum += c + self.chksum_without_last = self.chksum + self.chksum_without_last &= 0xff + self.last_byte = data[-1] + self.chksum += self.last_byte + self.chksum &= 0xff + + def get(self): + remainder = ( 0x100 - self.chksum ) & 0xff + return remainder + + def get_sum(self): + return self.chksum + + def is_valid(self): + return (self.chksum == 0) + + def get_expected(self): + expected = ( 0x100 - self.chksum_without_last ) & 0xff + return expected + + def get_last_byte(self): + return self.last_byte