NEW: reads picseal jpg file, imports crypto keys, does not import signature, does not verify

This commit is contained in:
JohnE 2016-12-06 12:32:07 -08:00
parent 5fe92beedb
commit 5edd399c82
4 changed files with 57 additions and 36 deletions

View File

@ -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):

View File

@ -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

View File

@ -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):
self.sig = sig if (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: self.sig.importPvtKey(buf[522:])
#pvt print("*** *** ***")
buf = fhr.read(2347) print("*** Private Key Import Sucessful")
self.sig.importPvtKey(buf) 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)

View File

@ -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):