92 lines
2.0 KiB
Python
92 lines
2.0 KiB
Python
#
|
|
#
|
|
#
|
|
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))
|