From cf75de650f8543d2bd30b9bf3d23218257e17955 Mon Sep 17 00:00:00 2001
From: Andrew Engelbrecht <sudoman@ninthfloor.org>
Date: Mon, 20 Jul 2015 20:01:30 -0400
Subject: [PATCH] added the beginnings of detached sig verification

also added some test cases.
---
 edward                  | 34 +++++++++++++++++++++++++++++++++-
 tests/gpg-flatten-3.eml | 23 +++++++++++++++++++++++
 tests/gpg-flatten-3.out |  8 ++++++++
 tests/gpg-flatten-4.eml | 41 +++++++++++++++++++++++++++++++++++++++++
 tests/gpg-flatten-4.out | 26 ++++++++++++++++++++++++++
 5 files changed, 131 insertions(+), 1 deletion(-)
 create mode 100644 tests/gpg-flatten-3.eml
 create mode 100644 tests/gpg-flatten-3.out
 create mode 100644 tests/gpg-flatten-4.eml
 create mode 100644 tests/gpg-flatten-4.out

diff --git a/edward b/edward
index e83a0f1..b5a548e 100755
--- a/edward
+++ b/edward
@@ -122,20 +122,29 @@ def email_decode_flatten (email_text, gpgme_ctx, from_decryption):
         elif content_type == "application/pgp-keys":
             fingerprints += add_gpg_keys(payload, gpgme_ctx)
 
+        # this is ugly. it needs work.
         elif content_type == "text/plain":
             if from_decryption == True:
                 body += payload + "\n"
 
                 fingerprints += add_gpg_keys(payload, gpgme_ctx)
 
+                plaintext, more_fps = verify_clear_signature(payload, gpgme_ctx)
+                fingerprints += more_fps
+
             else:
                 plaintext, more_fps = decrypt_text(payload, gpgme_ctx)
-
                 body += plaintext
                 fingerprints += more_fps
 
                 fingerprints += add_gpg_keys(payload, gpgme_ctx)
 
+                plaintext, more_fps = verify_clear_signature(payload, gpgme_ctx)
+                fingerprints += more_fps
+                body += plaintext
+
+
+
     return body, fingerprints
 
 
@@ -223,6 +232,29 @@ def decrypt_text (gpg_text, gpgme_ctx):
     return body, fingerprints
 
 
+def verify_clear_signature (text, gpgme_ctx):
+
+    sig_blocks = scan_and_grab(text,
+                               '-----BEGIN PGP SIGNED MESSAGE-----',
+                               '-----END PGP SIGNATURE-----')
+
+    fingerprints = []
+    plaintext = ""
+
+    for sig_block in sig_blocks:
+        msg_fp = io.BytesIO(sig_block.encode('utf-8'))
+        ptxt_fp = io.BytesIO()
+
+        result = gpgme_ctx.verify(msg_fp, None, ptxt_fp)
+
+        plaintext += ptxt_fp.getvalue().decode('utf-8')
+        fingerprint = result[0].fpr
+
+        fingerprints += [fingerprint]
+
+    return plaintext, fingerprints
+
+
 def scan_and_grab (text, start_text, end_text):
 
     matches = re.search('(' + start_text + '.*' + end_text + ')',
diff --git a/tests/gpg-flatten-3.eml b/tests/gpg-flatten-3.eml
new file mode 100644
index 0000000..d6409ee
--- /dev/null
+++ b/tests/gpg-flatten-3.eml
@@ -0,0 +1,23 @@
+From: No One <noone@localhost>
+To: No One <noone@localhost>
+Subject: =?UTF-8?B?44GT44KT44Gr44Gh44Gv44CB44GK5YWD5rCX44Gn44GZ44GL77yf?=
+
+
+DO YOU READ ME CAPTAIN??!!1 o_O
+
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+hi, i didn't encrypt this part. is that a mistake?
+
+bye!
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1
+
+iJwEAQECAAYFAlWthWEACgkQsT5tL2pPbuhyWgQApzhIt4EM4FrqCibNI7ZS1V73
+yhml95bw5PXq2fB7wU2I4pkM30T2kpMxdtfHdPXHQSzvuo27IhrUOH7CUtvj0f23
+CllwAGoUmwmdXOLeVvgjwyPzSVAdWLO8/231fS1M8J42v8GV6w78hmq+/Cck2oQE
+p4/91AVSikY7bwMrGpU=
+=Tavv
+-----END PGP SIGNATURE-----
diff --git a/tests/gpg-flatten-3.out b/tests/gpg-flatten-3.out
new file mode 100644
index 0000000..b77846c
--- /dev/null
+++ b/tests/gpg-flatten-3.out
@@ -0,0 +1,8 @@
+thanks for the message!
+
+
+> hi, i didn't encrypt this part. is that a mistake?
+> 
+> bye!
+> 
+> 
diff --git a/tests/gpg-flatten-4.eml b/tests/gpg-flatten-4.eml
new file mode 100644
index 0000000..baaca45
--- /dev/null
+++ b/tests/gpg-flatten-4.eml
@@ -0,0 +1,41 @@
+From: No One <noone@localhost>
+To: No One <noone@localhost>
+Subject: =?UTF-8?B?44GT44KT44Gr44Gh44Gv44CB44GK5YWD5rCX44Gn44GZ44GL77yf?=
+
+DO YOU READ ME CAPTAIN??!!1 o_O
+
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+hi, i didn't encrypt this part. is that a mistake?
+
+bye!
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1
+
+iJwEAQECAAYFAlWthWEACgkQsT5tL2pPbuhyWgQApzhIt4EM4FrqCibNI7ZS1V73
+yhml95bw5PXq2fB7wU2I4pkM30T2kpMxdtfHdPXHQSzvuo27IhrUOH7CUtvj0f23
+CllwAGoUmwmdXOLeVvgjwyPzSVAdWLO8/231fS1M8J42v8GV6w78hmq+/Cck2oQE
+p4/91AVSikY7bwMrGpU=
+=Tavv
+-----END PGP SIGNATURE-----
+
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1
+
+hIwDWouAYlp2iv8BBADAXsI9Y/miNCVnseKDNZVil3VK3SUbJ4DYoVDVcymcStUw
++bmk3XSk5hqap3CfSKdSvdnxSmaKzYOdpv03kiRtK2gjnakcKxk4pGz85UM5t8ZZ
+3estj/Ca40kvSHZAYelgC1W8JshDOyOrS93acfUgJxKQMdxhGRjVAW1YbQWFyNLA
+3QEJJeg6obNktEbhXCSlupZFAKJQgdAPDOWYgNeFnTkS4MttM+G0ABx/o8JjeIl5
+wYDucFBDHXSuld9RBzQ1QLOUhB8BOkCq6XFgwaaTKTBT7SQ19n0G8RpZmJ/BX5Ok
+msi9nlRm9z6Irjtx9bDudzUfpCzO/YeYBN1J/1o3pw8f/otzOMfRHBStkdo0V9i5
+9JS77QRkSnM4hVrZuvfplYa5iRftdYehLMaMk7k9gOY+B5WEMdgV9ZWRrWOXmqTK
+NyB1fIWgKNEqCgZnBFPS6Es6kUXUNnFvsvFMPg5WXx+HBJ3YqhNzsdVegagxjE9F
+wi7qHlcHbRGFv7Zz+BsiPQ3M3tQgwBAd1c/d/6CIdZDArvsTZiSdkszpfeziVj2p
+ZKhWUBUIpqP59MMlftD19EFTtJm8mpc/gBH074nEwzXdLFKg08Vb5fH2zMRo37w4
+HZzUHFJaj8VMIjQPRXqD6ELclHJbO7ASTyh8S+v9Iv+t4PpJXn8odwAm08bd//e9
+Ch/H9RAlS/22W4KlpZdIvwz7JmwVE9T4Xq1e22Df
+=Sn5u
+-----END PGP MESSAGE-----
+
diff --git a/tests/gpg-flatten-4.out b/tests/gpg-flatten-4.out
new file mode 100644
index 0000000..214b734
--- /dev/null
+++ b/tests/gpg-flatten-4.out
@@ -0,0 +1,26 @@
+thanks for the message!
+
+
+> -----BEGIN PGP SIGNED MESSAGE-----
+> Hash: SHA1
+> 
+> hello again!!!!
+> 
+> i think i'll try this encryption thing and paste this in.
+> 
+> let's see how it works!
+> -----BEGIN PGP SIGNATURE-----
+> Version: GnuPG v1
+> 
+> iJwEAQECAAYFAlWthW0ACgkQsT5tL2pPbuh5DQQAnkjHaeOoOKICD0o7ne5hp1TD
+> 7l7A2TszHerbk7SLSC3W5PV9PV8frj4NxyFUe6n1x2hYiIqJqxjctB2+7oV12Z1w
+> l3IYtYwjLk1Rqc+iHTb+S2+1XycXoTesRcK5f1bZIIl50RUpx4hLZVbIYyA6CoyE
+> ldPslQXK+wrNm3mkspY=
+> =+Jmq
+> -----END PGP SIGNATURE-----
+> 
+> hi, i didn't encrypt this part. is that a mistake?
+> 
+> bye!
+> 
+> 
-- 
2.25.1