Skip to content

Instantly share code, notes, and snippets.

@extempore
Created November 21, 2014 19:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save extempore/b374fc9793643bb7563f to your computer and use it in GitHub Desktop.
Save extempore/b374fc9793643bb7563f to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
import re
from StringIO import StringIO
from subprocess import Popen, PIPE
sig_rx = re.compile('(-----BEGIN PGP SIGNATURE-----.+?-----END PGP SIGNATURE-----)', re.DOTALL)
def extract_signature(s):
match = sig_rx.search(s)
if match:
return match.group(1)
return None
enarmor_rx = re.compile(r'-----BEGIN PGP ARMORED FILE-----.*?\n\n(.+?)-----END PGP ARMORED FILE-----', re.DOTALL)
def enarmor(sig):
args = ['gpg', '--enarmor', '--no-emit-version', '--no-comments']
p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
out, err = p.communicate(sig)
match = enarmor_rx.search(out.replace('\r\n','\n').replace('\r','\n'))
if match:
new_sig = match.group(1)
m = '-----BEGIN PGP SIGNATURE-----\n\n{0}-----END PGP SIGNATURE-----'
return m.format(new_sig)
return None
def dearmor(sig):
args = ['gpg', '--dearmor']
p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
out, err = p.communicate(sig)
return out
def replace_sig(msg, new_sig):
new_msg = sig_rx.sub(new_sig, msg)
return new_msg
def gpgsplit(s):
args = ['gpgsplit', '--no-split']
p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
out, err = p.communicate(s)
return (out,err)
def combine(files):
bin_sigs = []
for f in files:
msg = f.read()
sig = extract_signature(msg)
if not sig:
raise Exception('no signature found')
bin_sig = dearmor(sig)
if not bin_sig:
raise Exception('dearmor failed')
bin_sigs.append(bin_sig)
combined_sig = enarmor(''.join(bin_sigs))
combined_msg = replace_sig(msg, combined_sig)
return combined_msg
if __name__ == '__main__':
deed1 = open('deed1.asc')
deed2 = open('deed2.asc')
msg = combine([deed1,deed2])
print msg
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment