From 76536d911437cc11ad375db71b49adda9b1408c4 Mon Sep 17 00:00:00 2001 From: JohnE Date: Sun, 14 Aug 2016 13:09:37 -0700 Subject: [PATCH] MIL: milstone! public key added to image in PEM format --- DEV | 7 ++ data_exif | 208 --------------------------------------------- libs/crypto_pub.py | 22 +++++ libs/img_exif.py | 44 ++++++++++ libs/toolbox.py | 30 +++++++ picseal.py | 26 +++++- 6 files changed, 126 insertions(+), 211 deletions(-) delete mode 100644 data_exif create mode 100644 libs/crypto_pub.py create mode 100644 libs/img_exif.py create mode 100644 libs/toolbox.py diff --git a/DEV b/DEV index 9954049..fc38ce7 100644 --- a/DEV +++ b/DEV @@ -29,3 +29,10 @@ picseal.write_pub(FILE_HANDLE) # ADD PIN?? picseal.write_priv(FILE_HANDLE) +[ seal ] +sha-512,public-key + + +[[ ]] +libexiv2-14 (= 0.25-2.1), libc6 (>= 2.14), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 5.2) + diff --git a/data_exif b/data_exif deleted file mode 100644 index 8005e33..0000000 --- a/data_exif +++ /dev/null @@ -1,208 +0,0 @@ -Exif.Image.Make Ascii 6 Canon -Exif.Image.Model Ascii 13 Canon EOS 6D -Exif.Image.XResolution Rational 1 300 -Exif.Image.YResolution Rational 1 300 -Exif.Image.ResolutionUnit Short 1 inch -Exif.Image.Software Ascii 43 Adobe Photoshop Camera Raw 9.5 (Macintosh) -Exif.Image.DateTime Ascii 20 2016:07:18 04:42:31 -Exif.Image.ExifTag Long 1 222 -Exif.Photo.ExposureTime Rational 1 1/15 s -Exif.Photo.FNumber Rational 1 F2.8 -Exif.Photo.ExposureProgram Short 1 Manual -Exif.Photo.ISOSpeedRatings Short 1 800 -Exif.Photo.SensitivityType Short 1 2 -Exif.Photo.RecommendedExposureIndex Long 1 800 -Exif.Photo.ExifVersion Undefined 4 2.30 -Exif.Photo.DateTimeOriginal Ascii 20 2016:07:17 20:57:01 -Exif.Photo.DateTimeDigitized Ascii 20 2016:07:17 20:57:01 -Exif.Photo.ShutterSpeedValue SRational 1 1/15 s -Exif.Photo.ApertureValue Rational 1 F2.8 -Exif.Photo.ExposureBiasValue SRational 1 0 EV -Exif.Photo.MaxApertureValue Rational 1 F2.8 -Exif.Photo.MeteringMode Short 1 Multi-segment -Exif.Photo.Flash Short 1 No, compulsory -Exif.Photo.FocalLength Rational 1 14.0 mm -Exif.Photo.SubSecTimeOriginal Ascii 3 13 -Exif.Photo.SubSecTimeDigitized Ascii 3 13 -Exif.Photo.ColorSpace Short 1 Uncalibrated -Exif.Photo.FocalPlaneXResolution Rational 1 1520 -Exif.Photo.FocalPlaneYResolution Rational 1 1520 -Exif.Photo.FocalPlaneResolutionUnit Short 1 cm -Exif.Photo.CustomRendered Short 1 Normal process -Exif.Photo.ExposureMode Short 1 Manual -Exif.Photo.WhiteBalance Short 1 Manual -Exif.Photo.SceneCaptureType Short 1 Standard -Exif.Photo.BodySerialNumber Ascii 13 422052001752 -Exif.Photo.LensSpecification Rational 4 14/1 14/1 0/0 0/0 -Exif.Photo.LensModel Ascii 5 14mm -Exif.Photo.LensSerialNumber Ascii 11 0000000000 -Exif.Image.GPSTag Long 1 764 -Exif.GPSInfo.GPSVersionID Byte 4 2.3.0.0 -Exif.GPSInfo.GPSLatitudeRef Ascii 2 North -Exif.GPSInfo.GPSLatitude Rational 3 28deg 29.17330' -Exif.GPSInfo.GPSLongitudeRef Ascii 2 West -Exif.GPSInfo.GPSLongitude Rational 3 80deg 32.60570' -Exif.GPSInfo.GPSAltitudeRef Byte 1 Above sea level -Exif.GPSInfo.GPSAltitude Rational 1 25.6 m -Exif.GPSInfo.GPSTimeStamp Rational 3 04:56:53.0 -Exif.GPSInfo.GPSSatellites Ascii 3 11 -Exif.GPSInfo.GPSStatus Ascii 2 Measurement in progress -Exif.GPSInfo.GPSMeasureMode Ascii 2 Three-dimensional measurement -Exif.GPSInfo.GPSDOP Rational 1 500/10 -Exif.GPSInfo.GPSMapDatum Ascii 7 WGS-84 -Exif.GPSInfo.GPSDateStamp Ascii 11 2016:07:18 -Exif.Thumbnail.Compression Short 1 JPEG (old-style) -Exif.Thumbnail.XResolution Rational 1 72 -Exif.Thumbnail.YResolution Rational 1 72 -Exif.Thumbnail.ResolutionUnit Short 1 inch -Exif.Thumbnail.JPEGInterchangeFormat Long 1 1140 -Exif.Thumbnail.JPEGInterchangeFormatLength Long 1 3794 -Iptc.Envelope.CharacterSet String 3 %G -Iptc.Application2.RecordVersion Short 1 4 -Iptc.Application2.DateCreated Date 8 2016-07-17 -Iptc.Application2.TimeCreated Time 11 20:57:01+00:00 -Iptc.Application2.DigitizationDate Date 8 2016-07-17 -Iptc.Application2.DigitizationTime Time 11 20:57:01+00:00 -Xmp.xmp.ModifyDate XmpText 25 2016-07-18T04:42:31-04:00 -Xmp.xmp.CreateDate XmpText 22 2016-07-17T20:57:01.13 -Xmp.xmp.CreatorTool XmpText 42 Adobe Photoshop Camera Raw 9.5 (Macintosh) -Xmp.xmp.MetadataDate XmpText 25 2016-07-18T04:42:31-04:00 -Xmp.aux.SerialNumber XmpText 12 422052001752 -Xmp.aux.LensInfo XmpText 17 14/1 14/1 0/0 0/0 -Xmp.aux.Lens XmpText 4 14mm -Xmp.aux.LensID XmpText 3 103 -Xmp.aux.LensSerialNumber XmpText 10 0000000000 -Xmp.aux.ImageNumber XmpText 1 0 -Xmp.aux.FlashCompensation XmpText 3 0/1 -Xmp.aux.Firmware XmpText 5 1.1.6 -Xmp.photoshop.DateCreated XmpText 22 2016-07-17T20:57:01.13 -Xmp.xmpMM.DocumentID XmpText 44 xmp.did:fcba4f4f-fc67-4b11-9198-9013f6449440 -Xmp.xmpMM.OriginalDocumentID XmpText 32 79913BA83AD75143B10BADE9E67D02D4 -Xmp.xmpMM.InstanceID XmpText 44 xmp.iid:fcba4f4f-fc67-4b11-9198-9013f6449440 -Xmp.xmpMM.History XmpText 0 type="Seq" -Xmp.xmpMM.History[1] XmpText 0 type="Struct" -Xmp.xmpMM.History[1]/stEvt:action XmpText 7 derived -Xmp.xmpMM.History[1]/stEvt:parameters XmpText 69 converted from image/x-canon-cr2 to image/jpeg, saved to new location -Xmp.xmpMM.History[2] XmpText 0 type="Struct" -Xmp.xmpMM.History[2]/stEvt:action XmpText 5 saved -Xmp.xmpMM.History[2]/stEvt:instanceID XmpText 44 xmp.iid:fcba4f4f-fc67-4b11-9198-9013f6449440 -Xmp.xmpMM.History[2]/stEvt:when XmpText 25 2016-07-18T04:42:31-04:00 -Xmp.xmpMM.History[2]/stEvt:softwareAgent XmpText 42 Adobe Photoshop Camera Raw 9.5 (Macintosh) -Xmp.xmpMM.History[2]/stEvt:changed XmpText 1 / -Xmp.xmpMM.DerivedFrom XmpText 0 type="Struct" -Xmp.xmpMM.DerivedFrom/stRef:documentID XmpText 32 79913BA83AD75143B10BADE9E67D02D4 -Xmp.xmpMM.DerivedFrom/stRef:originalDocumentID XmpText 32 79913BA83AD75143B10BADE9E67D02D4 -Xmp.dc.format XmpText 10 image/jpeg -Xmp.crs.RawFileName XmpText 12 IMG_9367.CR2 -Xmp.crs.Version XmpText 3 9.5 -Xmp.crs.ProcessVersion XmpText 3 6.7 -Xmp.crs.WhiteBalance XmpText 7 As Shot -Xmp.crs.AutoWhiteVersion XmpText 9 134348800 -Xmp.crs.Temperature XmpText 4 4000 -Xmp.crs.Tint XmpText 3 +33 -Xmp.crs.Saturation XmpText 1 0 -Xmp.crs.Sharpness XmpText 2 25 -Xmp.crs.LuminanceSmoothing XmpText 1 0 -Xmp.crs.ColorNoiseReduction XmpText 2 25 -Xmp.crs.VignetteAmount XmpText 1 0 -Xmp.crs.ShadowTint XmpText 1 0 -Xmp.crs.RedHue XmpText 1 0 -Xmp.crs.RedSaturation XmpText 1 0 -Xmp.crs.GreenHue XmpText 1 0 -Xmp.crs.GreenSaturation XmpText 1 0 -Xmp.crs.BlueHue XmpText 1 0 -Xmp.crs.BlueSaturation XmpText 1 0 -Xmp.crs.Vibrance XmpText 1 0 -Xmp.crs.HueAdjustmentRed XmpText 1 0 -Xmp.crs.HueAdjustmentOrange XmpText 1 0 -Xmp.crs.HueAdjustmentYellow XmpText 1 0 -Xmp.crs.HueAdjustmentGreen XmpText 1 0 -Xmp.crs.HueAdjustmentAqua XmpText 1 0 -Xmp.crs.HueAdjustmentBlue XmpText 1 0 -Xmp.crs.HueAdjustmentPurple XmpText 1 0 -Xmp.crs.HueAdjustmentMagenta XmpText 1 0 -Xmp.crs.SaturationAdjustmentRed XmpText 1 0 -Xmp.crs.SaturationAdjustmentOrange XmpText 1 0 -Xmp.crs.SaturationAdjustmentYellow XmpText 1 0 -Xmp.crs.SaturationAdjustmentGreen XmpText 1 0 -Xmp.crs.SaturationAdjustmentAqua XmpText 1 0 -Xmp.crs.SaturationAdjustmentBlue XmpText 1 0 -Xmp.crs.SaturationAdjustmentPurple XmpText 1 0 -Xmp.crs.SaturationAdjustmentMagenta XmpText 1 0 -Xmp.crs.LuminanceAdjustmentRed XmpText 1 0 -Xmp.crs.LuminanceAdjustmentOrange XmpText 1 0 -Xmp.crs.LuminanceAdjustmentYellow XmpText 1 0 -Xmp.crs.LuminanceAdjustmentGreen XmpText 1 0 -Xmp.crs.LuminanceAdjustmentAqua XmpText 1 0 -Xmp.crs.LuminanceAdjustmentBlue XmpText 1 0 -Xmp.crs.LuminanceAdjustmentPurple XmpText 1 0 -Xmp.crs.LuminanceAdjustmentMagenta XmpText 1 0 -Xmp.crs.SplitToningShadowHue XmpText 1 0 -Xmp.crs.SplitToningShadowSaturation XmpText 1 0 -Xmp.crs.SplitToningHighlightHue XmpText 1 0 -Xmp.crs.SplitToningHighlightSaturation XmpText 1 0 -Xmp.crs.SplitToningBalance XmpText 1 0 -Xmp.crs.ParametricShadows XmpText 1 0 -Xmp.crs.ParametricDarks XmpText 1 0 -Xmp.crs.ParametricLights XmpText 1 0 -Xmp.crs.ParametricHighlights XmpText 1 0 -Xmp.crs.ParametricShadowSplit XmpText 2 25 -Xmp.crs.ParametricMidtoneSplit XmpText 2 50 -Xmp.crs.ParametricHighlightSplit XmpText 2 75 -Xmp.crs.SharpenRadius XmpText 4 +1.0 -Xmp.crs.SharpenDetail XmpText 2 25 -Xmp.crs.SharpenEdgeMasking XmpText 1 0 -Xmp.crs.PostCropVignetteAmount XmpText 1 0 -Xmp.crs.GrainAmount XmpText 1 0 -Xmp.crs.ColorNoiseReductionDetail XmpText 2 50 -Xmp.crs.ColorNoiseReductionSmoothness XmpText 2 50 -Xmp.crs.LensProfileEnable XmpText 1 0 -Xmp.crs.LensManualDistortionAmount XmpText 1 0 -Xmp.crs.PerspectiveVertical XmpText 1 0 -Xmp.crs.PerspectiveHorizontal XmpText 1 0 -Xmp.crs.PerspectiveRotate XmpText 3 0.0 -Xmp.crs.PerspectiveScale XmpText 3 100 -Xmp.crs.PerspectiveAspect XmpText 1 0 -Xmp.crs.PerspectiveUpright XmpText 1 0 -Xmp.crs.AutoLateralCA XmpText 1 0 -Xmp.crs.Exposure2012 XmpText 4 0.00 -Xmp.crs.Contrast2012 XmpText 3 +20 -Xmp.crs.Highlights2012 XmpText 3 -50 -Xmp.crs.Shadows2012 XmpText 1 0 -Xmp.crs.Whites2012 XmpText 1 0 -Xmp.crs.Blacks2012 XmpText 1 0 -Xmp.crs.Clarity2012 XmpText 3 +20 -Xmp.crs.DefringePurpleAmount XmpText 1 0 -Xmp.crs.DefringePurpleHueLo XmpText 2 30 -Xmp.crs.DefringePurpleHueHi XmpText 2 70 -Xmp.crs.DefringeGreenAmount XmpText 1 0 -Xmp.crs.DefringeGreenHueLo XmpText 2 40 -Xmp.crs.DefringeGreenHueHi XmpText 2 60 -Xmp.crs.Dehaze XmpText 1 0 -Xmp.crs.ToneMapStrength XmpText 1 0 -Xmp.crs.ConvertToGrayscale XmpText 5 False -Xmp.crs.ToneCurveName XmpText 15 Medium Contrast -Xmp.crs.ToneCurveName2012 XmpText 6 Linear -Xmp.crs.CameraProfile XmpText 14 Adobe Standard -Xmp.crs.CameraProfileDigest XmpText 32 98BA1AFA1155D0472068BB57D3655975 -Xmp.crs.LensProfileSetup XmpText 12 LensDefaults -Xmp.crs.HasSettings XmpText 4 True -Xmp.crs.CropTop XmpText 7 0.09756 -Xmp.crs.CropLeft XmpText 8 0.087145 -Xmp.crs.CropBottom XmpText 8 0.921691 -Xmp.crs.CropRight XmpText 8 0.926215 -Xmp.crs.CropAngle XmpText 9 -0.473392 -Xmp.crs.CropConstrainToWarp XmpText 1 1 -Xmp.crs.CropWidth XmpText 1 2 -Xmp.crs.CropHeight XmpText 1 3 -Xmp.crs.CropUnit XmpText 1 3 -Xmp.crs.HasCrop XmpText 4 True -Xmp.crs.AlreadyApplied XmpText 4 True -Xmp.crs.ToneCurve XmpSeq 6 0, 0, 32, 22, 64, 56, 128, 128, 192, 196, 255, 255 -Xmp.crs.ToneCurveRed XmpSeq 2 0, 0, 255, 255 -Xmp.crs.ToneCurveGreen XmpSeq 2 0, 0, 255, 255 -Xmp.crs.ToneCurveBlue XmpSeq 2 0, 0, 255, 255 -Xmp.crs.ToneCurvePV2012 XmpSeq 2 0, 0, 255, 255 -Xmp.crs.ToneCurvePV2012Red XmpSeq 2 0, 0, 255, 255 -Xmp.crs.ToneCurvePV2012Green XmpSeq 2 0, 0, 255, 255 -Xmp.crs.ToneCurvePV2012Blue XmpSeq 2 0, 0, 255, 255 diff --git a/libs/crypto_pub.py b/libs/crypto_pub.py new file mode 100644 index 0000000..83f9318 --- /dev/null +++ b/libs/crypto_pub.py @@ -0,0 +1,22 @@ +# +# +# +import logging +from Crypto.PublicKey import RSA + +class PubKey: + + keyData = None + + def __init__(self): + logging.info("Generating public keys...") + self.keyData = RSA.generate(4096) + + + def genNewKey(self): + logging.info("Generating public keys...") + self.keyData = RSA.generate(4096) + + # + def getKeyPEM(self): + return self.keyData.exportKey('PEM') diff --git a/libs/img_exif.py b/libs/img_exif.py new file mode 100644 index 0000000..064e72a --- /dev/null +++ b/libs/img_exif.py @@ -0,0 +1,44 @@ +# +# +# +import logging +import gi +gi.require_version('GExiv2', '0.10') +from gi.repository import GExiv2 + +class ImgExif: + + # + def __init__(self): + self.exif = None + self.img_fn = None + self.img_loaded = False + + # + def useImg(self, img_fn): + result = False + try: + self.exif = GExiv2.Metadata() + ret = self.exif.open_path(img_fn) + if (ret): + result = True + self.img_loaded = True + except Exception as ex: + logging.error(ex) + raise + self.img_fn = img_fn + + # + def appendKey(self, key): + logging.info('Adding key to metadata...') + self.exif.set_comment(str(key.getKeyPEM())) + + # + def extractKey(self): + pemData = self.exif.get_comment() + + + def saveFile(self): + logging.info("Saving image as {}...".format(self.img_fn)) + self.exif.save_file(self.img_fn) + diff --git a/libs/toolbox.py b/libs/toolbox.py new file mode 100644 index 0000000..51c56ef --- /dev/null +++ b/libs/toolbox.py @@ -0,0 +1,30 @@ +# +# +# +import time +import re + +# +class Toolbox: + + # + @staticmethod + def getTimestampStr(): + timestr = '000' + try: + timestr = time.strftime('%Y-%m-%d_%H%M%S', time.localtime(time.time())) + except: + pass + return timestr + + # + @staticmethod + def parseFilenameIncExt(fqfilepath): + print("filename=={}".format(fqfilepath)) + #regex = re.escape('([\w-_]+)([.\w-_]*)$)') + results = re.search(r'([\w_-]+)([.\w_-]*)$', fqfilepath) + if len(results.group(1)) != 0: + filename = results.group(1) + if len(results.group(2)) != 0: + ext = results.group(2) + return (filename, ext) diff --git a/picseal.py b/picseal.py index 3c8ad44..44e1e52 100644 --- a/picseal.py +++ b/picseal.py @@ -4,13 +4,32 @@ import os import argparse import logging -from subprocess import Popen, PIPE, check_call - +from shutil import copyfile +#from subprocess import Popen, PIPE, check_call +from libs.crypto_pub import PubKey +from libs.img_exif import ImgExif +from libs.toolbox import Toolbox def main(): parseArgs() +def processImage(image_fn): + img = ImgExif() + img.useImg(image_fn) + key = PubKey() + img.appendKey(key) + img.saveFile() + + +def copyImage(image_fn): + basename = os.path.basename(image_fn) + (filename, ext) = Toolbox.parseFilenameIncExt(basename) + newFileName = filename + '_' + Toolbox.getTimestampStr() + ext + copyfile(image_fn, newFileName) + return newFileName + + def parseArgs(): print("***** ***** ***** *****") print(" ** Pic * Seal ** ") @@ -33,7 +52,8 @@ def parseArgs(): logging.basicConfig(level=logging.CRITICAL) if (args.image): - pass + newImg = copyImage(args.image) + processImage(newImg) else: print('Create PicSeal images') print(' picseal.py -i ')