NEW: reads picseal jpg file, imports crypto keys, does not import signature, does not verify
This commit is contained in:
parent
5fe92beedb
commit
5edd399c82
|
@ -15,7 +15,6 @@ class Signature:
|
||||||
self.sig_data = None
|
self.sig_data = None
|
||||||
self.hash_data = None
|
self.hash_data = None
|
||||||
self.hh = SHA512.new()
|
self.hh = SHA512.new()
|
||||||
self.genKeys()
|
|
||||||
|
|
||||||
#
|
#
|
||||||
def genSig(self):
|
def genSig(self):
|
||||||
|
|
|
@ -154,7 +154,7 @@ class JpgBin:
|
||||||
seek = False
|
seek = False
|
||||||
|
|
||||||
if (seek):
|
if (seek):
|
||||||
(rec_len,) = self.__calcSeekBytes()
|
(rec_len, prev_buf) = self.__calcSeekBytes()
|
||||||
logging.info("length=={}".format(str(rec_len)))
|
logging.info("length=={}".format(str(rec_len)))
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -259,26 +259,32 @@ class JpgBin:
|
||||||
return pos
|
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]
|
# [app_rec_header:2|len:2|picseal_header:7]
|
||||||
#
|
#
|
||||||
def __processPicSeal(self):
|
def __processPicSeal(self):
|
||||||
self.picseal = JpgPicSeal()
|
|
||||||
rec_hdr = 4
|
rec_hdr = 4
|
||||||
ps_hdr_size = rec_hdr+len(JpgPicSeal.picseal_marker)
|
ps_hdr_size = rec_hdr+len(JpgPicSeal.picseal_marker)
|
||||||
remain_buf = self.data_len-(self.data_idx+ps_hdr_size)
|
remain_buf = self.data_len-(self.data_idx+ps_hdr_size)
|
||||||
if (remain_buf > 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])):
|
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
|
# calculate size, check buffer, maybe read more bytes from file
|
||||||
#
|
#
|
||||||
|
buf = self.__getBuf()
|
||||||
print("*** *** GOT HERE MOFO *** ***")
|
retval = self.picseal.deserialize(buf)
|
||||||
self.picseal.deserialize(buf)
|
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -5,22 +5,29 @@
|
||||||
# Has: JPG fingerprint
|
# Has: JPG fingerprint
|
||||||
#
|
#
|
||||||
# Big-endian
|
# Big-endian
|
||||||
# Pub: [picseal:7|type:1|sig:512|pubkey:550]
|
# Pub: [app15:2|size:2|'picseal':7|type:1|sig:512|pubkey:550]
|
||||||
# Pvt: [picseal:7|type:1|sig:512|pvtkey:2347]
|
# Pvt: [app15:2|size:2|'picseal':7|type:1|sig:512|pvtkey:2347]
|
||||||
#
|
#
|
||||||
import struct
|
import struct
|
||||||
import logging
|
import logging
|
||||||
from Crypto.PublicKey import RSA
|
from Crypto.PublicKey import RSA
|
||||||
|
from libs.crypto_sig import Signature
|
||||||
|
|
||||||
|
|
||||||
class JpgPicSeal:
|
class JpgPicSeal:
|
||||||
|
|
||||||
app15_marker = b'\xff\xef'
|
app15_marker = b'\xff\xef'
|
||||||
# ascii code for "picseal"
|
# ascii code for "picseal"
|
||||||
picseal_marker = b'\x70\x69\x63\x73\x65\x61\x6C'
|
picseal_marker = b'\x70\x69\x63\x73\x65\x61\x6C'
|
||||||
|
pub_marker = b'\x01'
|
||||||
|
pvt_marker = b'\x02'
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, sig=None):
|
def __init__(self, sig=None):
|
||||||
|
if (sig):
|
||||||
self.sig = sig
|
self.sig = sig
|
||||||
|
else:
|
||||||
|
self.sig = Signature()
|
||||||
self.sig_data = None
|
self.sig_data = None
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,22 +41,31 @@ class JpgPicSeal:
|
||||||
return False
|
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
|
# read type 0x01 is public key, 0x02 private key
|
||||||
buf = fhr.read(1)
|
try:
|
||||||
pubpvt = struct.unpack('>B', buf)
|
if (buf[9] == ord(JpgPicSeal.pub_marker)):
|
||||||
self.sig_data = fhr.read(512)
|
self.sig.importPubKey(buf[522:])
|
||||||
if (pubpvt == b'\x01'):
|
print("*** *** ***")
|
||||||
#pub
|
print("*** Public Key Import Sucessful")
|
||||||
buf = fhr.read(550)
|
print("*** *** ***")
|
||||||
self.sig.importPubKey(buf)
|
|
||||||
else:
|
else:
|
||||||
#pvt
|
self.sig.importPvtKey(buf[522:])
|
||||||
buf = fhr.read(2347)
|
print("*** *** ***")
|
||||||
self.sig.importPvtKey(buf)
|
print("*** Private Key Import Sucessful")
|
||||||
|
print("*** *** ***")
|
||||||
|
retval = True
|
||||||
|
except Exception as ex:
|
||||||
|
logging.debug(ex)
|
||||||
|
|
||||||
|
return retval
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
def readPub(self):
|
def readPub(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -69,27 +85,24 @@ class JpgPicSeal:
|
||||||
# input is the Crypto Sig class
|
# input is the Crypto Sig class
|
||||||
#
|
#
|
||||||
def writePub(self, fhw):
|
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
|
# input is the Crypto Sig class
|
||||||
#
|
#
|
||||||
def writePvt(self, fhw):
|
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):
|
def __writeData(self, fhw, sig_data, keyder, pubpvt):
|
||||||
# must include 2 bytes of length too
|
# must include 2 bytes for length too, plus 1 for the key type
|
||||||
size = 2
|
size = 3
|
||||||
size += len(JpgPicSeal.picseal_marker)
|
size += len(JpgPicSeal.picseal_marker)
|
||||||
size += len(sig_data)
|
size += len(sig_data)
|
||||||
size += len(keyder)
|
size += len(keyder)
|
||||||
|
|
||||||
logging.debug("picseal marker length: {}".format(str(len(JpgPicSeal.picseal_marker))))
|
logging.debug("3+{}+{}+{}=={} | picseal, sig, key".format(str(len(JpgPicSeal.picseal_marker)), str(len(sig_data)), str(len(keyder)), str(size) ))
|
||||||
logging.debug("hash size: {}".format(str(len(sig_data))))
|
|
||||||
logging.debug("key size: {}".format(str(len(keyder))))
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# write header
|
# write header
|
||||||
# write app marker
|
# write app marker
|
||||||
|
@ -102,8 +115,8 @@ class JpgPicSeal:
|
||||||
# write picseal marker
|
# write picseal marker
|
||||||
fhw.write(JpgPicSeal.picseal_marker)
|
fhw.write(JpgPicSeal.picseal_marker)
|
||||||
fhw.write(pubpvt)
|
fhw.write(pubpvt)
|
||||||
# write hash of image
|
# write signature of image
|
||||||
fhw.write(sig_data)
|
fhw.write(sig_data)
|
||||||
# write the public key data
|
# write the key data
|
||||||
fhw.write(keyder)
|
fhw.write(keyder)
|
||||||
|
|
||||||
|
|
|
@ -44,8 +44,11 @@ class JpgProc:
|
||||||
self.sig = Signature()
|
self.sig = Signature()
|
||||||
img_hash = self.jpg.genHash(self.sig.hh)
|
img_hash = self.jpg.genHash(self.sig.hh)
|
||||||
self.sig.hash_data = img_hash
|
self.sig.hash_data = img_hash
|
||||||
|
self.sig.genKeys()
|
||||||
self.sig.genSig()
|
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):
|
def writePicSealJpg(self, fname=None):
|
||||||
|
|
Loading…
Reference in New Issue