def loadFirmwareFile(self): # self.__fileGetHeader() self._loadFirmwareHeader() # self.__fileGetImage() self.fwImage = self._read(self.imageLength) if len(self.fwImage) != self.imageLength: raise Exception("Didn't read whole image.") imageSha1 = sha1(struct.pack("B"*self.imageLength, *self.fwImage)).digest() if imageSha1 != self.imageSHA1: if DEBUG: print "Calculated SHA-1 for firmware file:", hexWithoutQuotes(struct.unpack("B"*len(imageSha1), imageSha1)) if DEBUG: print "Provided SHA-1 from firmware file:", hexWithoutQuotes(struct.unpack("B"*len(self.imageSHA1), self.imageSHA1)) raise Exception("SHA-1s don't match.")
def _loadFirmwareHeader(self): headerBytes = self._read(128) if DEBUG: print "Header: ", hexWithoutQuotes(headerBytes) if len(headerBytes) != 128: raise Exception("Didn't read all of the header") # Bytes 0-3: 0x4C4A4658 if headerBytes[:4] != [0x4C, 0x4A, 0x46, 0x58]: raise Exception("Error in header's header") # Bytes 4-7: Intended device fwid = parseInt(headerBytes[4:8]) self.intendedDevice = self.getIntendedDeviceFromFWID(fwid) if DEBUG: print "Intended device: ", fwid, self.intendedDevice #Bytes 8-11: Contained version (reserved, reserved, H, L) self.providedVersion = float("%s.%02d" % (headerBytes[10], headerBytes[11])) if DEBUG: print "Provides FW:", self.providedVersion #Bytes 12-15: Required upgrader version (reserved, reserved, H, L) #Bytes 16-17: Image number version #Bytes 18-19: # of images version #Bytes 20-23: Start of next image version #Bytes 24-27: Length of this image version self.imageLength = parseInt(headerBytes[24:28]) if DEBUG: print "Image length: ", self.imageLength #Bytes 28-31: Image offset self.imageOffset = parseInt(headerBytes[28:32]) if DEBUG: print "Image offset: ", self.imageLength #Bytes 32-35: Number of bytes to include in the SHA. #Bytes 36-95: Reserved #Bytes 96-115: SHA-1 of firmware image self.imageSHA1 = struct.pack("B"*len(headerBytes[96:116]), *headerBytes[96:116]) if DEBUG: print "SHA-1: " , repr(self.imageSHA1) #Bytes 116-123: Reserved #Bytes 124-127: Header checksum headerString = struct.pack("B"*124, *headerBytes[:124]) sha1Hash = sha1(headerString).digest() if DEBUG: print "SHA-1 of the Header in hex:", hexWithoutQuotes(struct.unpack("B"*len(sha1Hash), sha1Hash))