diff --git a/libs/crypto_sig.py b/libs/crypto_sig.py index 62410f6..67ad44c 100644 --- a/libs/crypto_sig.py +++ b/libs/crypto_sig.py @@ -15,7 +15,6 @@ class Signature: self.sig_data = None self.hash_data = None self.hh = SHA512.new() - self.genKeys() # def genSig(self): diff --git a/libs/jpg_bin.py b/libs/jpg_bin.py index 8c3325a..ac50acb 100644 --- a/libs/jpg_bin.py +++ b/libs/jpg_bin.py @@ -154,7 +154,7 @@ class JpgBin: seek = False if (seek): - (rec_len,) = self.__calcSeekBytes() + (rec_len, prev_buf) = self.__calcSeekBytes() logging.info("length=={}".format(str(rec_len))) # @@ -259,26 +259,32 @@ class JpgBin: return pos # - def __getBuf(self, buf_size): - - + def __getBuf(self): + new_buf = None + (rec_len, prev_buf) = self.__calcSeekBytes() + if (prev_buf): + remain_bytes = rec_len - len(prev_buf) + new_buf = prev_buf.join(self.data_buf[:remain_bytes]) + pass + else: + new_buf = self.data_buf[(self.data_idx-rec_len):self.data_idx] + return new_buf # # [app_rec_header:2|len:2|picseal_header:7] # def __processPicSeal(self): - self.picseal = JpgPicSeal() rec_hdr = 4 ps_hdr_size = rec_hdr+len(JpgPicSeal.picseal_marker) remain_buf = self.data_len-(self.data_idx+ps_hdr_size) if (remain_buf > ps_hdr_size): + self.picseal = JpgPicSeal() if (self.picseal.isPicSeal(self.data_buf[self.data_idx+rec_hdr:self.data_idx+ps_hdr_size])): # # calculate size, check buffer, maybe read more bytes from file # - - print("*** *** GOT HERE MOFO *** ***") - self.picseal.deserialize(buf) + buf = self.__getBuf() + retval = self.picseal.deserialize(buf) return True return False diff --git a/libs/jpg_picseal.py b/libs/jpg_picseal.py index a38bdd9..813382a 100644 --- a/libs/jpg_picseal.py +++ b/libs/jpg_picseal.py @@ -5,22 +5,29 @@ # Has: JPG fingerprint # # Big-endian -# Pub: [picseal:7|type:1|sig:512|pubkey:550] -# Pvt: [picseal:7|type:1|sig:512|pvtkey:2347] +# Pub: [app15:2|size:2|'picseal':7|type:1|sig:512|pubkey:550] +# Pvt: [app15:2|size:2|'picseal':7|type:1|sig:512|pvtkey:2347] # import struct import logging from Crypto.PublicKey import RSA +from libs.crypto_sig import Signature + class JpgPicSeal: app15_marker = b'\xff\xef' # ascii code for "picseal" picseal_marker = b'\x70\x69\x63\x73\x65\x61\x6C' + pub_marker = b'\x01' + pvt_marker = b'\x02' def __init__(self, sig=None): - self.sig = sig + if (sig): + self.sig = sig + else: + self.sig = Signature() self.sig_data = None @@ -34,22 +41,31 @@ class JpgPicSeal: return False # - def deserialize(self, fhr): + # [size:2|picseal:7|type:1|sig:512|key:550] == 1072 + # + def deserialize(self, buf): + retval = False + # read type 0x01 is public key, 0x02 private key - buf = fhr.read(1) - pubpvt = struct.unpack('>B', buf) - self.sig_data = fhr.read(512) - if (pubpvt == b'\x01'): - #pub - buf = fhr.read(550) - self.sig.importPubKey(buf) - else: - #pvt - buf = fhr.read(2347) - self.sig.importPvtKey(buf) - + try: + if (buf[9] == ord(JpgPicSeal.pub_marker)): + self.sig.importPubKey(buf[522:]) + print("*** *** ***") + print("*** Public Key Import Sucessful") + print("*** *** ***") + else: + self.sig.importPvtKey(buf[522:]) + print("*** *** ***") + print("*** Private Key Import Sucessful") + print("*** *** ***") + retval = True + except Exception as ex: + logging.debug(ex) + + return retval + # def readPub(self): pass @@ -69,27 +85,24 @@ class JpgPicSeal: # input is the Crypto Sig class # def writePub(self, fhw): - self.__writeData(fhw, self.sig.sig_data, self.sig.getPubKeyDER(), b'\x01') + self.__writeData(fhw, self.sig.sig_data, self.sig.getPubKeyDER(), JpgPicSeal.pub_marker) # # input is the Crypto Sig class # def writePvt(self, fhw): - self.__writeData(fhw, self.sig.sig_data, self.sig.getPvtKeyDER(), b'\x02') + self.__writeData(fhw, self.sig.sig_data, self.sig.getPvtKeyDER(), JpgPicSeal.pvt_marker) # def __writeData(self, fhw, sig_data, keyder, pubpvt): - # must include 2 bytes of length too - size = 2 + # must include 2 bytes for length too, plus 1 for the key type + size = 3 size += len(JpgPicSeal.picseal_marker) size += len(sig_data) size += len(keyder) - logging.debug("picseal marker length: {}".format(str(len(JpgPicSeal.picseal_marker)))) - logging.debug("hash size: {}".format(str(len(sig_data)))) - logging.debug("key size: {}".format(str(len(keyder)))) - + logging.debug("3+{}+{}+{}=={} | picseal, sig, key".format(str(len(JpgPicSeal.picseal_marker)), str(len(sig_data)), str(len(keyder)), str(size) )) # # write header # write app marker @@ -102,8 +115,8 @@ class JpgPicSeal: # write picseal marker fhw.write(JpgPicSeal.picseal_marker) fhw.write(pubpvt) - # write hash of image + # write signature of image fhw.write(sig_data) - # write the public key data + # write the key data fhw.write(keyder) diff --git a/libs/jpg_proc.py b/libs/jpg_proc.py index c399fed..8ec8de8 100644 --- a/libs/jpg_proc.py +++ b/libs/jpg_proc.py @@ -44,8 +44,11 @@ class JpgProc: self.sig = Signature() img_hash = self.jpg.genHash(self.sig.hh) self.sig.hash_data = img_hash + self.sig.genKeys() self.sig.genSig() - #logging.info("img_hash-size=={}, img_hash=={}".format(len(img_hash), img_hash)) + logging.debug("*** Public Key:\n{}\n\n".format(self.sig.getPubKeyDER().hex())) + logging.debug("*** Private Key:\n{}".format(self.sig.getPvtKeyDER().hex())) + # def writePicSealJpg(self, fname=None):