# # # class JpgBinWrite: soi_marker = b'\xff\xd8' eof_marker = b'\xff\xd9' picseal_marker = b'\xff\xef' # picseal_marker = b'\xff\xe0' # def __init__(self, jpg_in, jpg_out): self.fhr = jpg_in self.fhw = jpg_out # # input is the Crypto Sig class # def writeJpgPicSealPub(self, crypto_sig, fp): self.__writeJpgHeader() self.__writeJpgPicSeal(crypto_sig, crypto_sig.getPubKeyDER()) self.__writeJpgImg(fp) # # input is the Crypto Sig class # def writeJpgPicSealPvt(self, crypto_sig, fp): self.__writeJpgHeader() self.__writeJpgPicSeal(crypto_sig, crypto_sig.getPvtKeyDER()) self.__writeJpgImg(fp) # def __writeJpgPicSeal(self, crypto_sig, keyder): # must include 2 bytes of length too size = 2 size += len(crypto_sig.hash_data) size += len(keyder) # write picseal marker self.fhw.write(JpgBinWrite.picseal_marker) # write the size of picseal record self.fhw.write(size.to_bytes(2, byteorder='big')) # write hash of image self.fhw.write(crypto_sig.hash_data) # write the public key self.fhw.write(keyder) # def __writeJpgImg(self, fp): self.__writeJpgMetadata(fp.markers_meta) self.__writeJpgImgData(fp.markers_img) self.__writeJpgFooter() self.fhw.flush() self.fhw.close() # # array of the marker information # def __writeJpgMetadata(self, markers): for marker in markers: self.fhr.seek(marker.fpos) data = self.fhr.read(marker.len) self.fhw.write(data) self.fhw.flush() # # array of the marker information # def __writeJpgImgData(self, markers): for marker in markers: # most of the image data is sequential cpos = self.fhr.tell() if (marker.fpos != cpos): self.fhr.seek(marker.fpos) data = self.fhr.read(marker.len) self.fhw.write(data) self.fhw.flush() # def __writeJpgHeader(self): self.fhw.write(bytes(JpgBinWrite.soi_marker)) # def __writeJpgFooter(self): self.fhw.write(bytes(JpgBinWrite.eof_marker))