picseal_pub/libs/jpg_bin_w.py

93 lines
2.0 KiB
Python

#
#
#
from libs.jpg_bin import JpgBin
class JpgBinWrite:
#
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 app marker
self.fhw.write(JpgBin.app15_marker)
# write picseal marker
self.fhw.write(JpgBin.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(JpgBin.soi_marker))
#
def __writeJpgFooter(self):
self.fhw.write(bytes(JpgBin.eof_marker))